错题集一
一、选择题
1.下列程序段执行后s值为( )
int i=1, s=0;
do {
if(!(i%2)) continue;
s += i;
} while(++i<10);
A.1 B.45 C.25 D.以上均不是
2.对于如下说明,则有意义的表达式是( )
int b=3, c=5, d=8, p[3], *a[3]={&b, &c, &d};
A.p=a B.p[0]=a C.p[0]=**a D.a[0]*=2
3.对于以下结构定义:
struct { int x; int y;
} s[10], *p=s, *q=s+1;则表达式(int *)q - (int *)p的值等于( )
A. 1 B. 2 C. 4 D.表达式语法有错
4.下列程序执行后的输出结果是( )
int a=1;
fun(int k)
{ static int a=5;
a+=k;
printf("%d ", a);
return a;
}
void main()
{ int b=3;
printf("%dn", fun(b+fun(a)));
}
A.699 B.669 C.61515 D.6615
5.对于struct node{ char s[10]; int i; } p[4]; 下列哪个赋值是正确的( )
A.p->i=2 B.p[0].s="abc" C.p[0]->i=2 D.p->s='a'
6.已知某函数内有声明:int a[3][3], (*ptr)[3]=a, *p=a; ,则能正确引用数组元素a[1][2]的是( )
A.*(++ptr)[2] B.*(++p+2) C.*(*++ptr+2) D.*(*++a+2)
7.若程序中有如下函数定义:
void fun(int p[10], int n)
{ int j;
for(j=0; j }且主函数中有声明:int a, b[10];,则主函数中对fun函数的调用正确的是( ) A.a=f(b,1); B.f(b[10],1); C.f(a,1); D.f(&a,1) 8. 若有以下定义和语句: int s[4][5], (*ps)[5]; ps=s;则对s数组元素的正确引用形式是( ) A.ps+1 B.*(ps+3) C.ps[0][2] D.*(ps+1)+3 9. 下列程序执行后的输出结果是( ) #define max(x) x*(x-1) void main() { int a=1, b=2; printf(“%dn”, max(1+a+b)); } A.6 B.8 C.10 D.12 10. 对于struct node { char s[10]; int i; }p[4]; 下列不正确的赋值是( ) A.p[0].i=2 B.p[0].s=“abc” C.p->i=2 D.*(p->s)='a' 11.下列程序执行后的输出结果是( ) #include "stdio.h" void main() { int a[6], i; for(i=1; i<6; i++) { a[i]=9*(i-2+4*(i>3)%5); printf("%2d", a[i]); } } A.-9 0 9 5 4 3 6 B.-18 -9 0 9 54 C.-9 0 95463 D.-9095463 12.对于以下递归函数f,调用f(4),其返回值为( ) int f(int n) { if(n) return f(n-2)+n; else return n; } A.6 B. 4 C. 0 D. 无限递归 13.对于如下说明,则有意义的正确表达式是( ) int *p[3], a[3]; A.p=a B.p[0]=a[0] C.p[0]=a D.p[0]*=2 14. 对于以下结构定义,++p->str中的++加在( ) struct { int len; char *str; } *p; A.指针str上 B.指针p上 C.str指的内容上 D.以上均不是 15. 若有以下说明: int w[3][4] = {{0,1}, {2,4}, {5,8}}; int (*p)[4] = w;则数值为 4的表达式是( )。 A) *w[1]+1 B) p++,*(p+1) C) w[2][2] D) p[1][1] 16. 以下程序运行后,输出结果是( ) #include int main( ) { int y=18, i=0, j, a[8]; do { a[i]=y%2; i++; y=y/2; } while(y>=1); for(j=i-1; j>=0; j--) printf("%d", a[j]); printf("n") return 0; } A)10000 B)10010 C)00110 D)10100 17. 以下程序的输出结果是( )。 #include int main(){ int a=2,c=5; printf("a=%%d,b=%%dn", a, c);return 0;} A) a=%2,b=%5 B) a=2,b=5 C) a=%%d,b=%%d D) a=%d,b=%d 18. 设有以下定义: int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12}; int (*prt)[3]=a, *p=a[0]; 则下列能够正确表示数组元素 a[1][2]的表达式是( ) A) *((*prt+1)[2]) B) *(*(p+5)) C) (*prt+1)+2 D) *(*(a+1)+2) 19. 若有定义: float w; int num; char s; 则合法的switch语句是_______。 A. switch(w) { case 1.0: printf("*n"); case 2.0: printf("**n"); } B. switch(num); { case 1 printf("*n"); case 2 printf("**n"); } C.switch(s) { case 'a': printf("*n"); case 'b': printf("**n"); default: printf("n");} D. switch(num+1) { case 1: printf("*n"); case 1: printf("**n");default: printf("n"); } 20. 设有语句:int x[]={0,1,2,3,4,5,6,7,8,9}, *p=x+5; while(*p++<7); 则语句 printf("%d",*p--);的输出结果为_______。 A. 出错 B. x[7]的地址 C. 7 D. 8 21. 已知函数原型int f(int)和int g(int)。下列语句中,正确调用函数的语句是 A. int f(3); B. f( int g(3) ); C. int g( f(3) ); D. p=f( g(3) +1 ); 22. 设有变量定义:char st[]="computer"; int i=0; char *s=st; 当执行完语句:while(*s++!= 'u') i++; 之后,则_______。 A. i的值为5,*s的值为't' B. i的值为5,*s的值为'u' C. i的值为4,*s的值为't' D. i的值为4,*s的值为'u' 23. 若有变量定义int x=567;则执行语句printf(“%-6d”,x);后,输出的结果是_____。(0代表空格) A. 567000 B. 056700 C. 005670 D. 000567 24. 设有以下语句: struct st{ int n; struct st *next; }; struct st a[3]={5, &a[1], 7, &a[2], 9, ' ' }, *p; p=&a[0]; 则以下输出值为 6 的是( )。 A.printf("%dn",p++->n); B.printf("%dn",p->n++); C.printf("%dn",(*p).n++); D.printf("%dn",++p->n); 25.若有以下说明和语: struct student { int age; int num; }; struct student stu[3]={{1001,20},{1002,19},{1003,21}}; struct student *p; p=stu; 则下面表达式中的值为 1002 的是( )。 A.(p++)->num B.(++p)->age C.(*p).num D.(*p++).age 26. 设有如下程序段,则 vu.a 的值为( )。 union u { int a; int b; float c; } vu; vu.a=1; vu.b=2; vu.c=3; A.1 B.2 C.3 D.A、B、C 都不是 27. 若已经定义“typedef struct stu{ int a, b; } student;”,则下列叙述中正确的是 A.stu 是结构体变量 B.student 是结构体变量 C.student 是结构体类型名 D.a 和 b 是结构体型变量 28. 下列关于结构体的说法错误的是( ) A.结构体是由用户自定义的一种结构类型 B.结构体中可设定若干个不同数据类型的成员 C.结构体中成员的数据类型可以是另一个已定义的结构 D.在定义结构时,可以为成员设置默认值 29. 当顺利执行了文件关闭操作时,fclose()函数的返回值是( ) A.1 B.TURE C.0 D.-1 30. 若 fp 是指向某文件的指针,且已指到该文件的末尾,则 C 语言函数 feof()的返回非0值. 31.fscanf 函数的正确调用形式是( )。 A. fscanf (文件指针, 格式字符串, 输出列表); B. fscanf (格式字符串, 输出列表, 文件指针); C. fscanf (格式字符串, 文件指针, 输出列表); D. fscanf (文件指针, 格式字符串, 输入列表); 32. fseek()函数用来移动文件的位置指针,它的调用形式是( )。 A. fseek(文件指针,位移量,起始点) B. fseek(文件指针,位移方向,位移量) C. fseek(位移方向,位移量,文件指针) D. fseek(文件指针,起始点,位移量) 33. 若调用 fputc()函数输出字符成功,则其返回值是( )。 A.1 B.EOF C.输出的字符 D.0 34.如果要将存放在双精度型数组 x[10]中的 10 个数据写到文件指针所指向的文件中, 正确的语句是( ) A. for(i=0;i<10;i++) fputc(x[i],fp); B.for(i=0;i<10;i++) fputc(&x[i],fp); C.for(i=0;i<10;i++) fwrite(&x[i],8,1,fp); D.fwrite(fp,8,10,x); 35.若要用 fopen()函数打开一个二进制文件,该文件要既能读也能写,当文件不存在时新建文件,则文件打开方式应是( ) A."ab+" B."rb+" C."wb+" D."ab" 36.调用 ferror()函数检测文件是否出错时,若文件没有出错,则 ferror()函数的返回值是( ) A.TURE B.-1 C.1 D.0 37.下面与函数 fseek(fp,0L,SEEK_SET)有相同作用的是( )。 A. rewind(fp) B.ftell(fp) C.fgetc(fp) D.feof(fp) 38.若已定义“int a[]={1,2,3,4},*p=a;” 则下面表达式中值不等于 2的是( A.*(a+1) B.*(p+1) C.*(++a) D.*(++p) 39.执行以下程序后,y 的值是( ) #include int main ( ) { int a[]={2,4,6,8,10}; int y=1,x,*p; p=&a[1]; for(x=0;x<3;x++) y+=*(p+x); printf("%dn",y); } A.17 B.18 C.19 D.20 40. 若有说明“int i, j=7, *p=&i;”,则与 i=j; 等价的语句是( ) A.i= *p B.*p=*&j C.i=&j D.i=**p; 41. 下面程序段的输出结果是( ) char str[]="ABC",*p=str; printf("%dn",*(p+3)); A.67 B.0 C.字符'C'的地址 D.字符'C 42. 下面程序段中,for 循环的执行次数是( )。 char *s="ta 18bc"; for( ;*s!=' ';s++) printf("*"); A.9 B.5 C.6 D.7 43.下面程序的输出结果是( )。 char *s="I’m a boy!"; s+=2; printf("%d", s); A.m a boy! B.字符'm' C.字符'm'的地址 D.字符'm'的 ASCII 码值 44. 对于如下说明,正确的赋值是( ) int c, *s, a[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; A.s=a[2]; B.c=a; C.s=&a[2]; D.c=&a[2]; 45.若已定义 char str[10],*s=str;则下面的表达式中能够表示 str[1] 地址的是 A.s++ B.++str C.&s[0]+1 D.&s+1 46.以下scanf函数调用语句中对结构体变量成员的不正确引用是( ) { }pup[5],*p=pup; A.scanf("%s",pup[0].name); B.scanf("%d",&pup[0].age); C.scanf("%dT",&(p->sex)); D.scanf("%d",p->age); 47.有以下程序段,当输入为 happy!时,程序运行后输出结果是( )。 char str[14]={"I am "}; strcat(str, "sad!"); scanf("%s",str); printf("%s",str); A.I am sad! B.happy! C.I am happy! D.happy!sad! 48. 下面程序的输出结果是( )。 #include #include int main(){char p[20]={'a','b','c','d'},q[]="abc",r[]="abcde"; strcat(p,r); strcpy(p+strlen(q), q); printf("%dn",strlen(p)); return 0;} A.9 B.6 C.11 D.7 49. 有定义语句:char s[10];,若要从键盘给 s 数组中输入若干个字符,错误的输入语句是( )。 A.gets(&s[0]); B.fgets(s, 10, stdin); C.gets(s); D.scanf("%s", s[0]); 50. 以下不正确的说法是( )。 A.静态变量的初值是在编译时指定的 B.静态变量如果没有指定初值,则其初值为 0 C.局部变量如果没有指定初值,则其初值不确定 D.函数中的静态变量在函数每次调用时,都会重新设置初值 51. 设整型变量 a=1,b=2,m=0,n=0,k=0,执行语句 k=(n=b>a)||(m=a
A.0,0 B.0,1 C.1,0 D.1,1 52.已知 int a=4, b=6, c=8;,执行语句 if(a>b)c=a; a=b; b=c;后,a, b, c 的值是 A.a=4, b=6, c=8 B.a=6, b=8, c=8 C.a=6, b=4, c=8 D.a=6, b=8, c=4 53. 下列程序段的输出结果是( ) int a=1, b=2, c=3; if(a++==1&&(++b==3||c++==3)) printf("%d %d %dn", a, b, c); A.1 2 3 B.2 3 4 C.2 2 3 D.2 3 3 54. 循环语句 for(x=0,y=0; (y!=123)||(x<4); x++); 循环执行( )。 A.无限次 B.不确定次 C.4 次 D.3 次 55. 若变量已正确定义,以下不能统计出一行中输入字符个数(不包含回车符)的程序段是 ( ) A.n=0; while( ch=getchar( )!='n' ) n++; B.n=0; while(getchar( )!='n' ) n++; C.for(n=0; getchar( )!='n'; n++) ; D.n=0; for(ch=getchar( ); ch!='n' ; n++) ; 二、填空题 1.写出语句 printf ("%d, %o, %x", 0x12, 12, 012); 的输出结果 2.写出下列程序段的输出结果 int k ; char *s ="ABC"; for( k=10; k != 0; k-- ) ; printf ( "%d", k ); while( *s++ ) putchar( *s ); 3. 用下列for循环将大写字母逆序输出(即从Z到A),其语句应为:for(i=0; i<26; i++) 4.用typedef定义一个长度为10的整型数组类型NUM的语句是 。 5. 写出下列程序段的输出结果 。 #define F(x) x - 2 #define D(x) x*F(x) printf("%d, %d", D(3), D(D(3))) ; 6. 写出下列程序的输出结果 。 #include "stdio.h" void fun(int k) { static int a; printf("%2d", a); a += k; } void main() { int k; for (k=1; k<=3; k++) fun(k); } 7.写出下列程序的输出结果 。 #include long fib(int g) { switch(g) { case 0: return(0); case 1: case 2: return(2); } printf("g=%d,", g); return fib(g-1) + fib(g-2); } void main() { long k; k = fib(4); printf("k=%ldn", k);} 8.将输入的n个字符串连接成1个字符串,然后输出该字符串。 #include #include void main() { char str[10][20], string[200]; int k, n; scanf("%d", &n); for (k=0; k gets(str[k]); (1) for (k=1; k (2) puts(string); } 9.写出下列程序的输出结果 。 #include "stdio.h" void main() { int k, j, m, n, a[6][6], b[6]; m=3, n=2; for(k=0; k for(j=0; j a[k][j] = k*n+j+1; for(k=0; k { b[k] = 0; for(j=0; j b[k] += a[k][j]; } for(k=0; k printf("%3d", b[k]); } 10. 函数 findbook 的功能是 :在有 n 个元 素的数组 s 中查 找名 为 a 的书,若找到,函数返回数组下标,否则,函数 返回 - 1 , 请填空。 struct data { int i; char name[20]; double price; } book[100]; int findbook(struct data s[], int n, char a[]) { int i; for(i=0;i if( ) return i; return } 11.下列程 序的 行 结果 为______ #include struct st{ int a;float b; char *c;}; int main(){ struct st x={19,99.4,"zhang"}; struct st *px=&x; printf("%d%.1f,%sn",x.a,x.b,x.c); printf("%d%.1f,%sn",px->a,(*px).b, px->c); printf("%c,%sn",*px->c-1,&px->c[1]); } 12. 若有定 义: int a[12]={1,2,3,4,5,6,7,8,9,10,11,12},*p[4],i; for(i=0;i<4;i++) p[i]=&a[i*3]; 则*(*(p+1)+2)的值为 ,*p[2]的值为 。若数组的首地址为0x2000,则 p[1]指向的地址为 (假设每个 int 型数据占 4 个字节)。 13.以下程 序运 行时 输出 结果是 。 #include int sub(int *s) { int t=0; *s+=1; t+=*s; return t; } int main() { int i; for(i=1; i<4; i++) printf("%4d", sub(&i)); return 0; } 14. 下列程序的运行结果为 #include int func(int a,int b) { static int m=1,i=2; i+=m+1; m=i+a+b; return(m); } int main() { int k=3,m=1,p; p=func(k,m); printf("%d,", p); p=func(k,m); printf("%dn", p); return 0; } 15.在switch语句中出现break语句的功能是 三、读程序写结果题 1. 下列程序执行后的输出是 。 #include "stdio.h" int fun(int n) { static int a=3; int t=0; if(n%2) { static int a=5; t+=a++; } else { static int a=7; t+=++a; } return t+=a++; } void main() { int i, s=0; for(i=0; i<3; i++) s+=fun(i); printf("s=%dn", s); } 2. 下列程序执行后的输出是 。 #include int x=1,b=2; int fun(int *x) { static int y; y=(y+5)%4; *x=*x+y; return(*x); } void main( ) { int a=10,b=20; while(b) { x=x*10; b=(b+fun(&a))/x; } printf("%dn",a); } 3. 写出以下程序的输出结果 。 #include void f(int y, int *x) { y=y+*x; *x=*x+y; } void main( ) { int x=2, y=4; f(y, &x); printf(“x=%d, y=%dn”, x, y); } 4. 下列程序执行后的输出是 。 #include #include void main( ) { char s[]="Thanks everyone."; strcat(strcpy(s,"Good,")+3,"Bye!"); printf("%d %d %sn", strlen(s), sizeof(s), s); } 5.下列程序执行后的输出是 。 #include void swap(int **p1, int **p2) { int *t; t=*p1; *p1=*p2; *p2=t; } void main( ) { int a=5,b=8,*p=&a,*q=&b; swap(&p, &q); printf("%d,%d,%d,%dn", a, b, *p, *q); } 6.下面程 序的 运行 结果 是 #include int fun(int *t, int n) { int m; if(n==1) return t[0]; else if(n>=2) { m=fun(t, n-1) + t[n-1]; return m; } } int main(){ int a[]={11,4,6,3,8,2,3,5,9,2}; printf("%dn", fun(a,10)); return 0; } 7.下 列 程 序 的 运 行 结 果 是 : #include int main(void) { int p[8]={11,12,13,14,15,16,17,18},i=0,j=0; while(i++<7) if(p[i]%2) j+=p[i]; printf("j=%dn",j); } 8. 下面程序是检查矩阵是否对称,请填空 #define N 4 void main() { int a[N][N]={1,2,3,4,2,2,5,6,3,5,3,7,4,6,7,4}; int i, j, found=0; for(i=0; i for(j=0; ; j++) if(a[i][j] != a[j][i]) { break; } if(found) printf("No"); else printf("Yes"); 9. 运行如下程序的输出结果为: #include int main(){ int i, s, t, r, a[8]= {5, 8, l, 3, 9, 6, 2, 7}; s = t = r = 0; for (i=0; i<8; i++) switch (a[i]%4) { case 0: s+=a[i]; break; case 1: t+=a[i]; break; default: r+=a[i]; break; } printf("ns=%d t=%d r=%d", s, t, r); return 0; } 10. 运行如下程序时,若输入:8 5 8 1 13 7 1 5 9,则程序的输出结果为 #include int main( ) { int i, n, a[8], max, p; scanf("%d", &n); for(i=0; i max=a[0]; p=0; for(i=1; i<n; i++) if(a[i]>max){ max=a[i]; p=i; } printf("nmax=a[%d]=%d", p ,max); return 0; } 11. 下面程序的输出结果是 #include #include int main(void) { char ch[]="abc",x[3][4]; int i; for(i=0;i<3;i++) strcpy(x[i],ch); for(i=0;i<3;i++) printf("%s",&x[i][i]); } 12. 下面程序的功能是:把一个整数插到由小到大排列的数列中,插入后仍然保持由小到大的顺序,请填空。 #include int main(void) { int a[11], number, i, j, temp1, temp2; printf("输入从小到大的数组n"); for (i=0;i<10;i++) scanf("%d", &a[i]); printf("插入的数据:"); scanf("%d",&number); if (number>a[9] ) a[10]= ; else for (i=0;i<10;i++) if ( ) { for (j=10; j>=i;j--) ; a[i]=number; } for (i=0;i<11;i++) printf("a[%d]=%dn", i, a[i] ); } 13. 下列程序的运行结果为 #include #define N 10 int merge(int a[],int b[],int c[],int m[][N+1]) { int i=0, j, k; while((k=m[0][i])!=2) { j=m[1][i]; if(k==0) c[i]=a[j]; else c[i]=b[j]; i++; } return i; } int main() { int a[N]={1, 3, 5}; int b[N]={2, 4, 6}; int i, n, c[2*N]; int m[2][N+1]={ {0, 1, 0, 1, 0, 1, 2},{0, 0, 1, 2, 2, 1, -1} }; n=merge(a, b, c, m); printf("%dn", n); for(i=0; i { printf("%d",c[i]); if((i+1)%3==0) printf("n"); } return 0; 14. 下面程序的功能:输出 100 以内能被 3 整除且个位数为 6 的所有正整数。将程序补充完整,填在空内。 #include void main() { int i, j; for(i=0; ; i++) { j=i*10+6; if( ) continue; printf("%d", j); } 参考答案: 一、选择题 1-5CCBCA 6-10CDCBB 11-15CACAD 16-20BDDCD 21-25DCADB 26-30DCDCB 31-35DACCC 36-40DACCB 41-45BCCCC 46-50DBBDD 51-55CBDAD 二、填空题 1:18,14,a 2:0BC 3:putchar(’Z’-i) 4:typedef int NUM[10]; 5:7,-13 6:0 13 7:g=4,g=3,k=6 8:strcmp(string,str[0]) strcat(string,str[k]) 9:37 11 10:strcmp(s[i].name,a)==0 -1 11:1999,4,zhang 1999,4,zhang Y,hang 12:6 7 13:2 4 14:8,17 15:从当前分支跳出switch 三、程序阅读题 1:s=34 2:13 3:x=8,y=4 4:9 17 Good,Bye! 5:5,8,8,5 6:53 7:45 8:i 11:abcbcc 12:number number
13:6 123 654 14:i<10 j%3!=0
struct pupil
char name[20];
int age
int sex;



