一.选择题
1. C语言中最简单的数据类型包括____。  答案:  b
a. 整型  实型  逻辑型
b. 整型  实型  字符型
c. 整型  字符型  逻辑型
d. 整型  实型  逻辑型  字符型                   
2. 下面符合要求的位段定义是____。    答案:  b
要求:
1. a有两位  2. b有两位 3. c有两位 4. d有四位
a. struct bitfields1
{
unsigned a, b, c:2;
unsigned d:4;
}
b. struct bitfields2
整型常量合法要求
{
unsigned a:2, b:2;
unsigned c:2, d:4;
}
c. struct bitfields3
{
unsigned a, b, c:6;
unsigned d:4;
}
d. struct bitfields4
{
unsigned a, b:4;
unsigned c, d:6;
}
3.  下面关于枚举类型的说法正确的是_____。答案:b.c.d
a. 可以为枚举元素赋值;
b. 枚举元素可以进行比较;
c. 枚举元素的值可以在类型定义时指定;
d. 枚举元素可以作为常量使用。
4.  下面关于结构类型的说法正确的是____。答案:a.b.d
a. 对于结构变量,可以通过运算符"."或"->",逐个访问其成员;
b. 结构变量和结构变量成员的地址都可以被引用;
c. 如果指针变量p已指向某结构数组,则p+1指向当前元素的下一个成员;
d. 如果指针变量p已经指向一个结构变量(或结构数组),就不能再使之指向结构变量(或结构数组元素)的某一成员。
5.  设有语句char a = '\72';则变量a____。答案:a
a. 包含1个字符
b. 包含2个字符
c. 包含3个字符
d. 说明不合法
6.  下面关于结构类型的说法正确的是_____。答案:b.c.d
a. 结构是一种复合数据类型,其构成元素既只能是基本数据类型(如int、long、float等)的变量;
b. 缺省条件下,编译器为结构的每个成员按其自然对界(alignment)条件分配空间;
c. 结构成员按照它们被声明的顺序在内存中顺序存储;
d. 结构第一个成员的地址和整个结构的地址相同。
7.  下面关于枚举类型的说法正确的是______。答案:a.b.c
a. 枚举值是常量,不能在程序中用赋值语句再对它赋值;
b. 只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量;
c. 把数值直接赋予枚举变量最好用强制类型转换;
d. 枚举元素不是字符常量而是字符串常量。
8.  下面关于联合类型说法正确的是______。答案:d
a. 对联合变量的赋值、使用都只能是对变量的成员进行。
b. 联合变量的成员表示为: 联合变量名.成员名
c. 可以对联合变量作初始化赋值。
d. 一个联合变量,每次只能赋予一个成员值。
9.  合法的长整型常数是_____。答案:a
a. OL      b. 4962710      c. 324562&        d. 216D
10.  在C语言中,  char型数据在内存中
的存储形式是_____。答案:a
a. 补码  b. 反码  c. 原码    d. ASCII码
11.  已知ch是字符型变量,下面不正确的赋值语句是____。答案:a
a. ch='a+b';  b. ch='\0';  c. ch='7'+'9';    d. ch=5+9;
12.  以下选项中不正确的整型常量是_____。答案:c
a. 12L        b. -10      c. 1,900    d. 123U
13.  假设int型变量占两个字节的存储单元,若有定义:
int x[10]={0,2,4};
则数组x在内存中所占字节数为______。  答案:d
a. 3          b. 6          c. 10            d. 20
14.  C语言中能用八进制表示的数据类型为_____。答案:a
a. 字符型、整型                b. 整形、实型
c. 字符型、实型、双精度型      d. 字符型、整型、实型、双精度型
15.  以下只有在使用时才为该类型变量分配内存的存储类说明是____。答案:b
a. auto和static              b. auto和register
c. register和static        d. extern和register
16.  下面四个选项中,均是合法整型常量的选项是____。答案:a
a. 160          b.  0xcdf    c. 01        d.  0x48a
0xffff          01a        986,012        2e5
011              0xe        0668          0x
17. 以下所列的C语言常量中,错误的是_____。答案:b
a. 0xFF  b. 1.2e0.5  c. 2L  d. '\72'
18. 下面关于volatile变量的说法正确的是_______。答案:a.b.c
a. 并行设备的硬件寄存器(如:状态寄存器);
b. 一个中断服务子程序中会访问到的非自动变量(也就是全局变量);
c. 会被几个任务共享的变量;
d. 定时器变量。
19. 设有以下语句:
char a=3, b=6, c;
c = a^b<<2;
则c的二进制值是_____。答案:a
a. 00011011    b. 00010100
c. 00011100    d. 00011000
20. 要求运算数必须是整型或字符型的运算符有_____。答案:b
a.&&    b.&  c.!  d.||
21. 根据以下定义,错误的表达式是_____。答案:d
struct
{
int a;
char b;
} Q, *p = &Q;
a. Q.a    b. (*p).b
c. p->a    d. *p.b
22. 下面关于sizeof操作符使用的说法是____  答案:a.b
a. 当操作数是数组类型时,其结果是数组的总字节数;
b. 当操作数是联合类型时,其结果是其最大字节成员的字节数;
c. 当操作数是结构类型时,其结果是所有成员的总字节数;
d. 当操作数是指针类型时,其结果是所指对象的总字节数。
23. 表达式 !x 等价于_____。答案:a
a. x == 0        b. x == 1      c. x != 0    d. x != 1
24. 对于以下的变量定义,表达式______不符合C语言语法。 答案:b.c.d
struct node
{
int len;
char *pk;
}x = {2, "right"}, *p = &x;
a. p->pk      b. *p.pk        c. *p->pk      d. *x.pk
25. 下面关于位域的说法正确的是_____。 答案:a.c.d
a. 一个位域必须
存储在同一个字节中,不能跨两个字节;
b. 位域可以用任何格式输出;
c. 位域可以无名,无名的位域只用来作填充或调整位置,是不能使用的;
d. 位域的引用方式同一般的结构成员。
26. 算术运算符、赋值运算符和关系运算符的运算优先级按从高到低的顺序依次为_____。答案:c
a. 算术运算、赋值运算、关系运算        b. 关系运算、赋值运算、算术运算
c. 算术运算、关系运算、赋值运算        d. 关系运算、算术运算、赋值运算
27. 表示关系x<=y<=z的c语言表达式为____。答案:a
a. (X<=Y)&&(Y<=Z)        b. (X<=Y)AND(Y<=Z)
c. (X<=Y<=Z)            d. (X<=Y)&(Y<=Z)(139)
28. 设x,y,z,t均为int型变量,则执行以下语句后,t的值为____。答案:c
x=y=z=1;
t=x||y&&z;
a. 不定值        b. 2        c. 1      d. 0
29. 有以下程序:
main()
{
int x=3, y=2, z=1;
printf("%d\n",x/y&~z);
}
  程序运行后的输出结果是____。答案:d
  a. 3        b. 2        c. 1        d. 0
30.有以下程序:
int k=0;
while (k=1) {k++;}
下列说法中正确的是:    答案:B
A.循环一次 B.循环无数次
C.语法错误      D.不循环
二.填空题
1.计算sizeof表达式和strlen表达式的值
char  s1[]=””;
char  s2[]=”Hello World”;
char  *p=s2;
char  *q=NULL;
void  *r=malloc(100);
请计算:
sizeof (s1)=       
sizeof (s2)=       
sizeof (p)=       
sizeof (q)=       
sizeof (r)=     
答案:1  12  4    4    4 
2.
double d=100.25;
int    x=d;
int    *pInt=(int*) &d;
请问以下两个输出语句的结果是否相同?简述原因
cout<<x<<endl;
cout<<*pInt<<endl;
答案:不同,第一个结果为100,x取d的整数部分;而第二个结果*pInt等于d的前4个字节的数值,而不是d的整数部分。
3. 改错
void test()
{
char str[10];
char* str1 = "0123456789";
strcpy(str, str1);
}
答:数组越界char str[11];
4.读程序,写出结果
int main()
{
int a[3];
a[0] = 0;
a[1] = 1;
a[2] = 2;
int *p, *q;
p = a;
q = &a[2];
int c = a[q - p];
printf("value c = %d\n", c++);
printf("value c = %d\n", c);
return 0;
}
答:2,3因为c++,所以先得到2,再输出3.
5.读程序,写出结果
#define STRCPY(a, b)    strcpy(a ## _p, #b)
int main()
{
char var1_p[20];
char var2_p[30];
strcpy(var1_p, "aaaa");
strcpy(var2_p, "bbbb");
STRCPY(var1, var2);
STRCPY(var2, var1);
printf("var1 = %s\n", var1_p);
printf("var2 = %s\n", var2_p);
return 0;
}
答:var1 = var2
var2 = var1
三.编程题
1、有N个人围成一圈,顺序排号,从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。(东软)
#define nmax 50
m
ain()
{
int i,k,m,n,num[nmax],*p;
printf("please input the total of numbers:");
scanf("%d",&n);
p=num;
for(i=0;i<n;i++)
  *(p+i)=i+1;
  i=0;
  k=0;
  m=0;
  while(m<n-1)
  {
    if(*(p+i)!=0) k++;
    if(k==3)
      {
*(p+i)=0;
        k=0;
        m++;
  }
i++;
if(i==n) i=0;
}
while(*p==0) p++;
printf("%d is left\n",*p);
}
2、Write an alternate version of squeeze(s1,s2) that deletes each character in the string s1 that matches any character in the string s2 . (东软)
* Write an alternate version of squeeze(s1,s2) that deletes each
* character in s1 that matches any character in the string s2.
/* squeeze2: delete all characters occurring in s2 from string s1. */
void squeeze2(char s1[], char s2[])
{
int i, j, k;
int instr2 = 0;
for(i = j = 0; s1[i] != '\0'; i++)
{
instr2 = 0;
for(k = 0; s2[k] != '\0' && !instr2; k++)
{
if(s2[k] == s1[i])
{
instr2 = 1;
}
}
if(!instr2)
{
s1[j++] = s1[i];
}
}
s1[j] = '\0';
}
/* test driver */
#include <stdio.h>
#include <string.h>
int main(void)
{
char *leftstr[] =
{
"",
"a",
"antidisestablishmentarianism",
"beautifications",
"characteristically",
"deterministically",
"electroencephalography",
"familiarisation",
"gastrointestinal",
"heterogeneousness",
"incomprehensibility",
"justifications",
"knowledgeable",
"lexicographically",
"microarchitectures",
"nondeterministically",
"organizationally",
"phenomenologically",
"quantifications",
"representationally",
"straightforwardness",
"telecommunications",
"uncontrollability",
"vulnerabilities",
"wholeheartedly",
"xylophonically", /* if there is such a word :-) */
"youthfulness",
"zoologically"
};
char *rightstr[] =
{
"",
"a",
"the",
"quick",
"brown",
"dog",
"jumps",
"over",
"lazy",
"fox",
"get",
"rid",
"of",
"windows",
"and",
"install",
"linux"
};
char buffer[32];
size_t numlefts = sizeof leftstr / sizeof leftstr[0];
size_t numrights = sizeof rightstr / sizeof rightstr[0];
size_t left = 0;
size_t right = 0;
for(left = 0; left < numlefts; left++)
{
for(right = 0; right < numrights; right++)
{
strcpy(buffer, leftstr[left]);
squeeze2(buffer, rightstr[right]);
printf("[%s] - [%s] = [%s]\n", leftstr[left], rightstr[right], buffer);
}
}
return 0;
}
3.编写字符串反转函数:strrev.要求时间和空间效率都尽量高.
(测试用例:输入"abcd",输出应为"dcba")
函数原型为:
char* strrev(char* dest, char* src);
提示:dest和src可能是同一个字符串.
void StrReverse( char *dest, char* sour )
{
//dest = sour
+ strlen(sour) -1;
dest = sour;
while(*dest){dest++;}
dest--;
while ( sour < dest )
{
/
/*sour ^= *dest;
//*dest ^= *sour;
//*sour++ ^= *dest--;
char temp = *sour;
*sour++ = *dest;
*dest-- = temp;
}
}
int main( void )
{
char str[]="I Love The Girl";
StrReverse(str,str);
puts(str);
system("PAUSE");   
return 0;
}
4.不用除法(即不能使用"/"号)和库函数,计算285 / 16的商和余数, 要求效率尽量高.
main()
{    int m = 285;
int n = 16;
int shan  = 0;
int yushu = 0;
while ( m>0 )
{
m = m-n;
shan ++;
}
if ( m<0 )
{
shan--;
yushu = m+n;
}
printf ("285/16=%d*%d+%d",n,shan,yushu);
}
5.编写将字符串转换成整数的函数atoi,只处理输入字符串仅由0-9,'-','+',和空格的情况.
函数原型为:
int atoi(char* str);
提示:如果字符串不能构成一整数,可以直接返回0.但是对于以空格开始的字符串应特殊处理.
答:
int atoi(char* str)
{
int nRet = 0;
bool negtive = false;
// 处理数字前有多个空格的情况,处理整个字符串无数字的情况,处理带+号与带负号的情况
while ((*str <'0' && *str>'9' && *str!='\0')||*str=='+'||*str=='-'||*str==' ')
{
if (*str==' ')
{
str++;
}
else if (*str=='-')
{
str++;
negtive = true;
break;
}
}
// 使用一个while循环求出数字,如果数字间含有其它特殊字符,跳出循环,并返回0
while (*str!='\0')
{
if ((*str>='0'&&*str<='9'))
{
nRet *= 10;
nRet += *str - '0';
}
else
{
return 0;
}
str++;
}
//  处理负数
if (negtive)
nRet = 0 - nRet;
return nRet;
}
6、一个学生的信息是:姓名,学号,性别,年龄等信息,用一个链表,把这些学生信息连在一起, 给出一个age, 在些链表中删除学生年龄等于age的学生信息。(华为)
#include "stdio.h"
#include "conio.h"
struct stu{
char name[20];
char sex;
int no;
int age;
struct stu * next;
}*linklist;
struct stu *creatlist(int n)
{
int i;
//h为头结点,p为前一结点,s为当前结点
struct stu *h,*p,*s;
h = (struct stu *)malloc(sizeof(struct stu));
h->next = NULL;
p=h;
for(i=0;i<n;i++)
s = (struct stu *)malloc(sizeof(struct stu));
p->next = s;
printf("Please input the information of the student: name sex no age \n");
scanf("%s %c %d %d",s->name,&s->sex,&s->no,&s->age);
s->next = NULL;
p = s;
}
printf("Create successful!");
return(h);
}
void del
etelist(struct stu *s,int a)
{
struct stu *p;
while(s->age!=a)
{
p = s;
s = s->next;
}
if(s==NULL)
printf("The record is not exist.");
else
{
p->next = s->next;
printf("Delete successful!");
}
}
void display(struct stu *s)
{
s = s->next;
while(s!=NULL)
{
printf("%s %c %d %d\n",s->name,s->sex,s->no,s->age);
s = s->next;
}
}
int main()
{
struct stu *s;
int n,age;
printf("Please input the length of seqlist:\n");
scanf("%d",&n);
s = creatlist(n);
display(s);
printf("Please input the age:\n");
scanf("%d",&age);
deletelist(s,age);
display(s);
return 0;
}
7、实现一个函数,把一个字符串中的字符从小写转为大写。(华为)
#include "stdio.h"
#include "conio.h"
void uppers(char *s,char *us)
{
for(;*s!='\0';s++,us++)
{
if(*s>='a'&&*s<='z')
*us = *s-32;
else
*us = *s;
}
*us = '\0';
}
int main()
{
char *s,*us;
char ss[20];
printf("Please input a string:\n");
scanf("%s",ss);
s = ss;
uppers(s,us);
printf("The result is:\n%s\n",us);
getch();
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。