习题1 C语言基础知识
一、选择题
1.一个C程序由若干个C函数组成,各个函数在文件中的位置为 。 A.任意
B.第一个函数必须是主函数,其他函数任意 C.必须完全按照顺序排列
D.其他函数必须在前,主函数必须在最后 2.下列4个叙述中,正确的是 。 A.C程序中的所有字母都必须小写
B.C程序中的关键字必须小写,其他标识符不区分大小写 C.C程序中的所有字母都不区分大小写 D.C语言中的所有关键字必须小写 3.下列4个叙述中,错误的是 。
A.一个C源程序必须有且只有一个主函数 B.一个C源程序可以含零个或多个子函数 C.在C源程序中注释说明必须位于语句之后 D.C源程序的基本结构是函数
4.下面属于C语言关键字的是 。 A.int B.typedef C.enum D.union 5.以下叙述不正确的是 。 A.分号是C语句的必要组成部分 B.C程序的注释可以写在语句的后面 C.函数是C程序的基本单位
D.主函数的名字不一定用main表示
6.C语言中允许的基本数据类型包括 。 A.整型、实型、逻辑型 B.整型、实型、字符型 C.整型、字符型、逻辑型
D.整型、实型、逻辑型、字符型
7.C语言中能用八进制表示的数据类型为 。 A.字符型、整型 B.整型、实型 C.字符型、实型、双精度型 D.字符型、整型、实型、双精度型 8.下列属于C语言合法字符常数的是 。 A.'\\97' B.\ C.'\\t' D.\9.在C语言中,5种基本数据类型的存储空间长度的排列顺序为 A.char A.0L B.4962710 C.0412765 D.0xa34b7fe 11.若有以下定义语句char c1='b', c2='e'; printf(\则输出结果是 。 A.2,M B.3,E C.2,E D.输出项与相应的格式控制不一致,输出结果不确定 12.以下赋值语句合法的是 。 A.x=y=100 B.d??; C.x+y D.c=int(a+b) 13.设变量t为int型,下列选项中不正确的赋值语句是 。 A.++t; B.n1=(n2=(n3=0)); C.k=i==m; D.a=b+c=1; 14.在以下一组运算符中,优先级最高的是 。 A.≤ B.== C.% D.&& 15.下列能正确表示a≥10或a≤0的关系表达式是 。 A.a≥10 or a≤0 B.a≥10 | a≤0 C.a≥10 || a≤0 D.a≥10 && a≤0 16.下列只有当整数x为奇数时,才是逻辑“真”的表达式是 。 A.x%2==0 B.!(x%2==0) C.(x-x/2*2)==0 D.!(x%2) 17.设a为整型变量,不能正确表达数学关系10 A.1010 && a<15 D.!(a≤10)&&!(a≥15) 18.已知x=43,ch='A',y=0;则表达式(x≥y&&ch<'B'&&!y)的值是 。 A.0 B.语法错 C.1 D.假 19.表达式17%4/8的值为 。 A.0 B.1 C.2 D.3 20.语句printf(\?2));的输出结果是 。 A.无输出 B.结果不确定 C.?1 D.1 二、填空题 1.若有以下定义语句:int u=010,v=0x10,w=10; printf(\则输出结果是 。 2.下面程序的输出结果是 。 main() {unsigned a=32768; printf(\ 3.下面程序的输出结果是 。 main() {int k=11; printf(\ 4.若有以下定义语句:int a=5; printf(\则输出结果是 。 5.设x为int型变量,执行以下语句:x=10; x+=x?=x?x;,则x的值为 。 6.若定义x和y为double型变量,则表达式x=1, y=x+3/2的值是 。 7.若t为double型变量,表达式t=1, t+5, t++的值是 。 8.表达式10!=9的值是 。 9.设x,y,z和t均为int型变量,执行以下语句:x=y=z=1; t=++x||++y&&++z; 后t的值为 。 10.若a=1,b=2,c=3,d=4,则表达式a int a=2,b=3; printf(a>b? \***a=%d\:\###b=%d\,a,b); 12.假定w,x,y,z和m均为int型变量,下面程序执行后m的值为 。 w=1;x=2;y=3;z=4; m=(w m=(m 13.语句printf(\?hi\\?y\\\\\\bou\\n\的输出结果是 。 14.以下程序的输出结果是 。 main() {unsigned short a=65536; int b; printf(\ 15.若有定义int a=10,b=9,c=8; 接着顺序执行下列语句后,变量b的值为 。 c=(a-=b-5); c=(a)+(b=3); 16.设x和y均为int型变量,且x=1,y=2,则表达式1.0+x/y的值为 。 17.语句x++;、++x;、x=x+1;和x=1+x;执行后都使变量x的值增1,请写出一条同一功能的赋值语句(不得与列举相同) 。 18.表示“整数x的绝对值大于5”时值为“真”的C语言表达式是 。 19.设y是int型变量,请写出判断y为奇数的关系表达式 。 20.若定义int a=25,b=14,c=19;以下语句的执行结果是 。 a++<=25&&b --<=2&&c++<=18?printf(\%d,b=%d,c=%d\\n\ 21.设有以下定义,并赋予了确定的值:char w; int x; float y; double z;则表达式w*x+z?y所求得值的数据类型为 。 22.设有int =11;表达式x++*1/3的值为 。 23.设定义int x=1,y=1; 则表达式(!x||y??)的值是 。 24.若有以下程序段,int c1=1,c2=2,c3; c3=1.0/c2*c1; 执行后,变量c3的值为 。 25.下列程序的输出结果是16.00,请将程序填写完整。 main() {int a=9,b=2; float x= ,y=1.1,z; z=a/2+b*x/y+1/2; printf(\ 26.设x和y均为int型变量,且x=10和y=3,则以下语句的输出结果是 。 printf(\ 27.下列程序的输出结果是 。 main() {int a=-1,b=4; k=(++a<0)&&!(b--<-0); printf(\ 28.下列程序的输出结果是 。 main() {double d=3.2;int x,y; x=1.2;y=(x+3.8)/5.0; printf(\ 29.下列程序的输出结果是 。 main() {double d;float f;long l;int j; j=f=l=d=20/3; printf(\ 30.下列程序的输出结果是 。 main() {int a=1,b=2; a+=b;b=a-b;a-=b; printf(\ 习题2 顺序结构 一、选择题 1.下面程序的输出结果是 。 main() { int k=11; printf(\} A.k=11,k=12,k=13 C.k=11,k=013,k=oXb 2.以下合法的C语言赋值语句是 。 A.a=b=58 B.k=int(a+b); 3.以下程序的输出结果是 。 main() { int x=10,y=3; printf(\} B.k=11,k=13,k=13 D.k=11,k=13,k=b C.a=58,b=58 D.?i; A.0 B.1 C.3 D.不确定 4.若变量已正确说明为int类型,要给a、b、c输入数据,以下正确的输入语句是 。 A.read (a,b,c); B.scanf(\C.scanf(\ D.scanf(\5.执行下面程序段后,c3中的值是 。 int c1=1,c2=2,c3; c3=c1/c2; A.0 B.1/2 C.0.5 6.若执行以下程序段,其输出结果是 。 int a=0,b=0,c=0; c=(a-=a-5),(a=b,b+3); printf(\ D.1 A.3,0,?10 B.0,0,5 7.以下程序段的输出结果是 。 float a=57.666; printf(\ C.?10,3,?10 D.3,0,3 A.*0000057.66* C.*0000057.67* 8.若有以下说明和语句: int a=5 a++; B.* 57.66* D.* 57.67* 此处表达式a++的值是 。 A.7 B.6 9.若有以下语句: C.5 D.4 char c1='b',c2='e'; printf(\ 则输出结果是 。 A.2,M B.3,E C.2,e 10.以下程序的输出结果是 。 main() { int x=10,y=10; printf(\} D.输出结果不确定 A.10 10 B.9 9 C.9 10 D.10 9 11.在C语言中,如果下面的变量都是int类型,则输出结果是 。 sum=pad=5; pAd=sum++,pAd++,++pAd; printf(\ A.7 B.6 12.以下程序的输出结果是 。 #include int i=010,j=10; printf(\} C.5 D.4 A.11,10 B.9,10 13.以下程序的输出结果是 。 int i=65536 printf(\ C.010,9 D.10,9 A.65535 B.0 C.有语法错误,无输出结果 D.1 14.已知字符A的ASCII码为十进制的65,下面程序的输出结果是 。 main() { char ch1,ch2; ch1='A'+'5'-'3'; ch2='A'+'6'-'3'; printf(\} A.67,D B.B,C 15.若有以下语句: 则输出结果是 。 A.abcd B.a 1 2 C.C,D D.不确定的值 char s[10]; s=\; C.adcb D.编译不能通过 16.若有定义:int x,y; char a,b,c; 并输入以下数据(此处 则能给X赋整数值1,给Y赋数2,给a赋字符A,给b赋字符B,给c赋字符C的正确程序段是 。 A.scanf(\ B.scanf(\C.scanf(\ D.scanf(\ 17.两次运行下面的程序,如果从键盘上分别输入6和4,则输出结果是 。 main() { int x; scanf(\ if(x++>5) printf(\else printf(\} A.7和5 B.6和3 C.7和4 D.6和4 18.若执行下面的程序,从键盘输入3和4,则输出结果是 。 main() { int a,b,s; scanf(\s=a; if (a s=s*s; printf(\} A.14 B.16 C.18 D.20 19.设i是int型变量,f是float型变量,用下面的语句给这两个变量输入值: scanf(\ 为了将100和765.12分别赋给i和f,则正确的输入为 。 A.100<空格>765.12<回车> C.100<回车>765.12<回车> 20.以下程序的输出结果是 。 #include printf(\} B.i=100,f=765.12<回车> D.x=100<回车>,y=765.12<回车> A.不确定 B.0 C.–1 D.1 二、填空题 1.复合语句在语法上被认为是 ,空语句的形式是 。 2.\表示如果串长 m,则在m列范围内,字符串向 靠, 补空格。 3.如果想输出字符“%”,则应该在“格式控制”字符串中用 表示。 4.printf函数的“格式控制”包括两部分,分别是 和 。 5.符号“&”是 运算符,&a是指 。 6.putchar函数的作用是 。 7.复合语句是由一对 括起来的若干语句组成的。 8.goto语句的主要用途是 和 。 9.getchar 函数的作用是 。 10.将for(表达式1;表达式2;表达式3); 改写为等价的while语句为 。 11.语句标号由标识符表示,由 、 和 组成。第一个字符必须是字母或下划线。 12.函数中的“格式控制”后面应当是 ,而不是 。 13.while语句的特点是 ,do?while语句的特点是 。 14.分析下面的程序: main() { int x,y; x=16;y=(x++)+x; printf(\x=15;printf(\x=20;y=x--+x;printf(\x=13;printf(\} 程序的输出结果是 。 15.下列程序的输出结果是 。 #include \main() { char b[]=\ char *chp=&b[7]; while(--chp>&b[0]) putchar(*chp); putchar('\\n'); } 三、编程题 1.编写程序,输入两个整数:1 500和350,输出它们的商和余数。 2.编写程序,读入3个整数赋给a、b、c,然后交换它们中的数,将a中原来的值赋给b,b中原来的值赋给c,c中原来的值赋给a,且输出改变的a、b、c的值。 3.输入两个整型变量a、b的值,输出a+b、a-b、a*b、a/b、(float)a/b、a%b的结果,要求连同算式一起输出,每个算式占一行。 例如,a等于10,b等于5,则a+b的结果输出为: 10+5=15 4.输入一个非负数,计算以这个数为半径的圆周长和面积。 5.输入任意一个3位数,将其各位数字反序输出(例如,输入123,输出321)。 6.输入任意大小的3个整数,判断其中是否有两个奇数一个偶数。若是,则输出“YES”,不是,则输出“NOT”(要求用条件表达式进行判断,不使用if语句) 7.求前驱字符和后继字符。输入一个字符,找出它的前驱字符和后继字符,并按ASCII码值,从大到小的顺序输出这3个字符及其对应的ASCII码值。 习题3 选择结构和循环结构 一、选择题 1.有以下程序: main() { int i; for(i=0;i<3;i++) switch(i) { case 1:printf(\case 2:printf(\default:printf(\} } 执行后输出的结果是 。 A.011122 B.012 2.有以下程序: C.012020 D.120 main() { int i=1,j=1,k=2; if((j++||k++)&&i++) printf(\} 执行后输出的结果是 。 A.1,1,2 3.有以下程序: B.2,2,1 C.2,2,2 D.2,2,3 main() { int a=5,b=4,c=3,d=2; if(a>b>c) printf(\else if((c-1>=d)==1) printf(\else printf(\} 执行后,输出结果是 。 A.2 C.4 4.有以下程序: main() { int i=0,s=0; do { if(i%2) { i++;continue;} i++; s+=i; } while(i<7); printf(\} B.3 D.编译时有错,无结果 执行后的输出结果是 。 A.16 B.12 5.以下程序的输出结果是 。 C.28 D.21 main() { int a=5,b=4,c=6,d; printf(\} A.5 B.4 C.6 6.以下程序中,while循环的循环次数是 。 main() { int i=0; while(i<10) { if(i<1) continue; if(i==5) break; i++; } } D.不确定 A.1 C.6 7.以下程序的输出结果是 。 main() { int a=0,i; for(i=1;i<5;i++) { switch(i) { case 0: case 3:a+=2; case 1: case 2:a+=3; default:a+=5; B.10 D.死循环,不能确定次数 } } printf(\} A.31 B.13 8.以下程序的输出结果是 。 main() { int a=4,b=5,c=0,d; d=!a&&!b||!c; printf(\} C.10 D.20 A.1 B.0 9.以下程序的输出结果是 。 #include { int i=0,a=0; while(i<20) { for( ; ; ) { if((i)==0) break; else i--; } i+=11;a+=i; } printh(\} C.非0的数 D.?1 A.21 B.32 10.阅读以下程序: 。 main() { int x; scanf(\ if(x--<5) printf(\else printf(\} C.33 D.11 程序运行后,如果从键盘上输入5,则输出结果是 。 A.3 B.4 C.5 11.假定w、x、y、z、m均为int型变量,有如下程序段: w=1;x=2;y=3;z=4; m=(w D.6 则该程序运行后,m的值是 。 A.4 B.3 12.以下程序的输出结果是 。 main() { int a,b; for(a=1,b=1; a<=100;a++) { if(b>=10) break; if(b%3==1) { b+=3;continue;} } printf(\} C.2 D.1 A.101 B.6 C.5 D.4 13.若执行以下程序时,从键盘上输入9,则输出的结果是 。 main() { int n; scanf (\ if(n++<10) printf(\ else printf(\} A.11 B.10 14.有以下程序段: int k=0 while(k=1) k++; C.9 D.8 while 循环执行的次数是 。 A.无限次 B.有语法错误,不能执行 C.一次也不执行 D.执行1次 15.以下程序执行后,sum的值是 。 main() { int i,sum; for(i=1;i<6;i++) sum+=i; printf(\} A.15 B.14 16.有以下程序段: int x=3 do { printf(\while(!(--x)); C.不确定 D.0 其输出结果是 。 A.1 B.3 0 C.1 ?2 D.死循环 17.若变量c为char类型,能正确判断出c为小写字母的表达式是 。 A.'a'<=c<= 'z' B.(c>= 'a')||(c<= 'z') C.('a'<=C)and ('z'>=c) D.(c>= 'a')&&(c<= 'z') 18.以下程序的输出结果是 。 main() { int x=0.5;char z='a'; printf(\ A.0 B.1 19.以下程序的输出结果是 。 main() { int x=10,y=10,i; for(i=0;x>8;y=i ) printf(\} C.2 D.3 A.10 1 9 2 B.9 8 7 6 20.以下程序的输出结果是 。 main() { int i; for(i=1;i<=6;i++) {if(i%2) {printf(\ printf(\ C.10 9 9 0 D.10 10 9 0 } printf(\} A.#*#*#* B.##### 21.以下程序的输出结果是 。 C.***** D.*#*#* main() { int i; for(i='A';i<='I';i++)printf(\ printf(\} A.编译不通过,无输出 C.acegi 22.以下程序输出结果是 。 main () { int m=5; if (m>5 print(\else printf(\”,m--); } B.aceg D.abcdefghi A.7 B.6 C.5 D.4 23.运行以下程序后,如果从键盘上输入china#后回车,则输出结果为 。 #include { int v1=0,v2=0; char ch; while ((ch=getchar())!='#') switch (ch) {case 'a': case 'h': default:v1++; case '0':v2++; } printf(\} A.2,0 B.5,0 24.设有如下定义: int a=1,b=2,c=3,d=4,m=2,n=2; C.5,5 D.2,5 则执行表达式(m=a>b)&&(n=c>d)后,n的值为 。 A.1 B.2 C.3 25.以下程序的输出结果是 。 main() { int i,j,x=0; for(i=0;i<2;i++) {x++; for(j=0;j<3;j++) { if(j%2) continue; x++;} x++; } printf(\ D.0 A.x=4 B.x=8 C.x=6 D.x=12 26.设x和y均为int型变量,则执行下的循环后,y值为 。 for(y=1,x=1;y<=50;y++) {if(x==10)}break; if(x%2==1) {x+=5;continue;} x-=3; } A.2 B.4 C.6 D.8 27.假定a和b为int型变量,则执行以下语句后b的值为 。 a=1;b=10; do {b-=a;a++;} while(b--<0); A.9 B.?2 C.?1 D.8 28.设j为int型变量,则下面for循环语句的执行结果是 。 For (j=10;j>3;j--) { if(j%3) j--; --j;--j; printf(\,j); } A.6 3 B.7 4 29.以下程序的输出结果是 。 C.6 2 D.7 3 main() { int x,i; for(i=1;i<=50;i++) {x=i; if(x%2==0) { x++;if(x%3==0) { x++;if(x%7==0) { x++;printf(\ } } A.28 B.27 C.42 D.26 30.假定所有变量均已正确说明,下列程序段运行后x的值是 。 a=b=c=0;x=35; if(!a)x--; else if(b);if(c)x=3; else x=4; A.34 二、填空题 1.若有以下程序: B.4 C.35 D.3 main() { int p,a=5; if(p=a!=0) printf(\else printf(\} 执行后,输出结果是 。 2.若有以下程序: main() { int a=4,b=3,c=5,t=0; if(a printf(\} 执行后,输出结果是 。 3.以下程序运行后的输出结果是 。 main() { int a=1,b=3,c=5; if(c=a+b) printf(\ else printf(\} 4.以下程序运行后的输出结果是 。 main( ) { int i,m=0,n=0,k=0; for(i=9;i<=11;i++) switch(i/10) { case 0: m++;n++;break; case 10:n++;break; default:k++;n++; } printf(\ } 5.执行以下程序后,输出'#'号的个数是 。 #include for(i=1;i<5;i++) for(j=2;j<=i;j++) putchar('#'); } 6.若从键盘输入58,则以下程序输出的结果是 。 main() { int a; scanf(\ if(a>50) printf(\ if(a>40) printf(\ if(a>30) printf(\} 7.以下程序输出的结果是 。 main() { int a=5,b=4,c=3,d; d=(a>b>c); printf(\} 8.以下程序的输出结果是 。 main() { int s,i; for(s=0,i=1;i<3;i++,s+=i); printf(\} 9.以下程序运行后的输出结果是 。 main() { int i=10,j=0; do { j=j+i;i--; }while(i>2); printf(\} 10.设有以下程序: main() { int n1,n2; scanf(\ while(n2!=0) { n1=n2; n2=n2/10; printf(\} } 程序运行后,如果从键盘上输入1298,则输出结果为 。 11.下列程序段的输出结果是 。 int n='c'; switch(n++) { default:printf(\ case 'a':case 'A':case 'b': case 'B':printf(\case 'c':case 'C':printf(\case 'd':case 'D':printf(\} 12.下面程序输出结果是 。 main() { int x=1,y=0,a=0,b=0; switch(x) {case 1: switch(y) {case 0:a++;break; case 1:b++;break; } case 2: a++;b++;break; } printf(\} 13.程序执行后的输出结果是 。 main( ) { int x=0,y=5,z=3; while(z-->0&&++x<5) y=y-1; printf(\} 14.若有int i=5, j=10;则执行完以下语句后,j的值为 。 switch (i){ case 4:j++; case 5:j--; case 6:j++; case 7:j-=2; default: ; } 15.有以下程序: main() { int n=0,m=1,x=2; if(!n) x-=1; if(m) x-=2; if(x) x-=3; printf (\} 执行后的输出结果是 。 16.执行以下程序后的输出结果是 。 main() { int a=5,b=4,c=3,d=2; if(a>b>c) printf(\ else if((c-1>=d)==1) printf(\ else printf(\ } 17.当a=1,b=3,c=5,d=4时,执行完下面的一段程序后x的值是 。 if(a if(c if(a if(b 18.下列程序段的输出结果是 。 int k,s; for(k=0,s=0;k<10;k++) if (s>k) break; else s+=k; printf(\ 19.输入c2470f ?<回车>后,下列程序的输出结果是 。 #include { char ch;long number=0; while((ch=getchar())<'0'||ch>'6'); while(ch!='?'&&ch>='0'&&ch<='6') { number=number*7+ch-'0'; printf(\ ch=getchar(); } } 20.输入4<回车>后,下列程序的输出结果是 。 #include { int j,k,n; float f,s; scanf(\%d”,&n); s=0; f=1; for(k=1;k<=n;k++) { for(j=1;j printf(\%.0f#”,s); } } 21.下面程序的功能是:输出100以内能被3整除且个位数为6的所有整数,请填空。 #include { int i,j; for(i=0; ;i++) { j=i*10+6; if( ) continue; printf(\ } } 22.下面程序的功能是求1!+2!+3!+4!+5!,请填空。 main( ) { int i,j,f,sum=0; for(i=1;i<=5;i++) { f=1; for(j=1; ;j++) ; sum=sum+f; } printf(\} 23.以下程序可判断输入的一个整数是否能被3或7整除,若能整除,输出“yes”,否则输出“no”,请填空。 #include printf(\ scanf(\ if printf(\ else printf(\} 24.以下程序将从读入的整数数据中,统计大于零的整数个数和小于零的整数个数。用输入零来结束输入,程序中用i统计大于零的个数,用变量j统计小于零的整数,请填空。 main() { int n,i,j; printf(\ i=j=0; scanf (\ while { if (n>0) i++; if (n<0) j++; ; } printf(\} 25.如果一个数各位数的立方和等于它本身,则这样的数称为水仙花数,求100~999中所有的水仙花数,请填空。 main() { int i,a,b,c; for(i=100;i<=999;i++) { a=i/100; b= ; c=i; if( ) printf(\ } } 26.输入一个正整数n,计算并输出s前n项的和,请填空。 S=1-1/2+1/3-1/4+1/5-1/6+… #include { int k,flag,n;float s; flag=1;s=0; scanf(\ for (k=1;k<=n;k++){ s=s+ ; ; } printf(\ } 27.输出下列图形,请填空。 1 2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9 3 4 5 6 7 8 9 4 5 6 7 8 9 5 6 7 8 9 6 7 8 9 7 8 9 8 9 9 main() int i,j; for(i=1;i<= ;i++) {for(j= ;j<=9;j++)printf(\ printf(\ 28.下面程序的功能是:从键盘上输入若干学生的成绩,统计并输出最高成绩和最低成绩,最后当输入负数时结束输入,请填空。 main() { float x,amax,amin; scanf(\ amax=x; amin=x; while( ) { if(x>amax) amax=x; if(x printf(\ } 29.下面程序的功能是计算1~10之间的奇数之和与偶数之和,请填空。 main( ) int a,b,c,i; a=c=0; for( i=0;i<=10;i+=2) { a+=2; ; c+=b; } printf(\偶数之和:%d\\n\ printf(\奇数之和:%d\\n\ 30.以下程序用“辗转相除法”求出两个正整数的最大公约数,请填空。若两个数分别放在m和n中,求最大公约数的算法如下: (1)将两数中最大的放在m中,小的放在n中。 (2)求出m被n除后的余数r。 (3)若余数为0则执行步骤(7);否则执行步骤(4)。 (4)将除数作为新的被除数;将余数作为新的除数。 (5)求出新的余数r。 (6)重复步骤(3)~(5)。 (7)输出n,n即为最大公约数。 main() { int r,m,n,t; printf(\ scanf(\ printf(\ if(m {t=m;m=n;n=t;} r= ; while ( ) {m=n;n=r;r= ;} printf(\} 三、编程题 1.求出100~300内所有百位和个位相加能被3整除的数。 2.编程求S=1/1!+1/2!+1/3!+... +1/n!直到1/n!≤ 1e?6 3.编写程序实现用一元人民币换成一分、两分、五分的硬币共50枚。 4.编写程序,输出从公元1000年~2000年所有闰年的年号。判断闰年的条件是: (1)公元年数如能被4整除,而不能被100整除,则是闰年。 (2)公元年数能被400整除也是闰年。 5.输入一个4位数,求各位数字的平方和。 例如:输入1234,输出30。 6.写出满足不等式1+1/2+1/3+1/4+...+1/N>15最小的N值,并输出各项之和s的值。 7.铁路托运行李规定:行李重不超过50公斤的,托运费按每公斤0.15元计费;如超过50公斤,超过部分每公斤加收0.10元。编写程序完成自动计费工作。 8.相邻两个奇数都为素数的一对数叫双胞胎素数,输出100~200之间的所有双胞胎素数。 9.输入一串字符以“#”结束,如果它是大写字母转换为小写字母输出,如果是小写字母转换为大写字母输出。如果不是字母,则照原样输出。 10.输入一个4位数,要求将它的千位、百位、十位、个位上的数字按由小到大排列,输出一个新数。 例如,输入4287 则输出为 2478。 11.输入两门课的成绩,如果两门成绩都在60分以上。则输出“it is pass.”,只要有一门低于60分就输出“it is not pass.”如果输入的任何一门成绩不在0~100范围内则输出“it is error.”(要求用switch语句来编程)。 12.求任一数字所有因子的组合(仅限两个因子),且不可重复输出。 例如,15=1*15,15=3*5,而15=5*3,15=15*1就不用输出。 13.从键盘输入几个数,以0作为结束标志,判断其正负,并求其平方和。 14.编写一个译码程序,将一个英语句子译成数字代码。译码规则是以数字1代替字母a,数字2代替字母b,??,26代替字母z,以数字27代替字母A,数字28代替字母B,??,42代替字母Z,如遇空格则打印一个星号“*”,英文句子以“.”结束。 15.求所有个位、十位、百位数字能组成一个三角形3边的3位数(注意:三角形任意两边之和大于第三边)。 习题4 函 数 一、选择题 1.建立函数的目的之一是 。 A.提高程序的执行效率 B.提高程序的可读性 C.减少程序的篇幅 D.减少程序文件所占内存 2.以下正确的说法是 。 A.用户若需调用标准函数,调用前必须重新定义 B.用户可以重新定义标准库函数,若如此,该函数将失去原有含义 C.系统根本不允许用户重新定义标准函数 D.用户若需要调用标准库函数,调用前不必使用预编译命令将该函数所在文件包 括到用户源文件中,系统自动去调用 3.在C语言中,以下说法正确的是 。 A.普通实参和与其对应的形参各占用独立的存储单元 B.实参和与其对应的形参共占用一个存储单元 C.只有当实参和与其对应的形参同名时才共占用存储单元 D.形参是虚拟的,不占用存储单元 4.若调用一个函数,且此函数中没有return语句,则关于该函数正确的说法是 。 A.没有返回值 B.返回若干个系统默认值 C.能返回一个用户所希望的函数值 D.返回一个不确定的值 5.在C语言中以下不正确的说法是 。 A.实参可以是常量、变量、或表达式 B.形参可以是常量、变量或表达式 C.实参可以为任意类型 D.形参应与其对应的实参类型一致 6.以下程序有语法性错误,有关错误原因的正确说法是 。 main() { int G=5,k; void prt_char(); … k=prt_char(G); … } A.语句void prt_char();有错,它是函数调用语句,不能用void说明 B.变量名不能使用大写字母 C.函数说明和函数调用语句之间有矛盾 D.函数名不能使用下划线 7.有关函数调用,以下错误的描述是 。 A.出现在执行语句中 B.出现在一个表达式中 C.作为一个函数的实参 D.作为一个函数的形参 8.以下正确的说法是 。 A.函数的定义可以嵌套,但函数的调用不可以嵌套 B.函数的定义不可以嵌套,但函数的调用可嵌套 C.函数的定义和调用均不可以嵌套 D.函数的定义和调用均可以嵌套 9.若使用一维数组名作函数实参,则以下正确的说法是 。 A.必须在主调函数中说明此数组的大小 B.实参数组类型与形参数组类型可以不匹配 C.在被调用函数中,不需要考虑形参数组的大小 D.实参数组名与形参数组名必须一致 10.如果在一个函数中的复合语句中定义了一个变量,则有关该变量说法正确的是 。 A.只在该复合语句中有效 B.在该函数中有效 C.在本程序范围中均有效 D.为非法变量 二、填空题 1.折半查找法的思路是:先确定待查元素的范围,将其分成两半,然后测试位于中间点元素的值,如果该待查元素的值大于中间点元素,就缩小待查范围,只测试中点之后的元素;反之,测试中点之前的元素,测试方法同前。函数binary的作用是应用折半查找法从存有10个整数的a数组中对关键字m进行查找,若找到,返回其下标值;反之,返回-1。请填空。 binary(int a[10],int m) { int low=0,high=9,mid; while(low<=high) { mid=(low+high)/2; if(m else if(m return(-1); } 2.以下程序的运行结果是 。 #define MAX 10 int a[MAX],i; main() { printf(\ sub2() {int a[MAX],i,max; max=5; for(i=0;i sub1() { for(i=0;i sub3(int a[ ]) {int i; for(i=0;i 3.下面程序的运行结果是 。 void num() { extern int x,y; int a=15,b=10; x=a-b; y=a+b; } int x,y; main() {int a=7,b=5; x=a+b; y=a-b; num(); printf(\} 4.以下程序的运行结果是 。 main() { int a=2,i; for(i=0;i<3;i++) printf(\} f(int a) { int b=0;static int c=3; b++;c++; return(a+b+c) ; } 5.如果输入的值是-125,以下程序的运行结果是 。 #include { int n; scanf(\ printf(\ if(n<0) printf(\-\; n=fabs(n); fun(n); } fun(int n) { int k,r; for(k=2;k<=sqrt(n);k++) {r=n%k; while(r==0) {printf(\ n=n/k; if(n>1) printf(\ r=n%k; } } if(n!=1) printf(\} 6.以下程序的运行结果是 。 main() {increment(); increment(); increment(); } increment() { int x=0; x+=1; printf(\ } 7.以下check函数功能是对value中的值进行四舍五入计算,若计算后的值与ponse值相等,则显示“well done”,否则显示计算后的值。已有函数调用语句check(ponse,value);请填空。 void check(int ponse,float value) { int val; val= ; printf(\计算后的值:%d\ if( ) printf(\ else printf(\} 8.若输入一个整数10,以下程序的运行结果为 。 main() {int a,e[10],c,i=0; scanf(\ while(a!=0) {c=sub(a); a=a/2; e[i]=c; i++; } for(;i>0;i--) printf(\} sub(int a) { int c; c=a%2; return c; } 9.已有函数pow,现要求取消变量i后pow函数的功能不变,请填空。 修改前的pow函数: pow(int x, int y) {int i,j=1; for(i=1;i<=y;++i) j=j*x; return(j); } 修改后的pow函数: pow(int x, int y) { int j; for( ; ; ) j=j*x; return(j);} 10.以下程序的功能是求3个数的最小公倍数,请填空。 max(int x, int y, int z) {if (x>y &&x.>z) return(x); else if( ) return(y); else return(z); } main() { int x1,x2,x3,i=1,j,x0; printf(\ scanf(\ x0=max(x1,x2,x3); while(1) {j=x0*i; if( ) break; i=i+1; } printf(\ } 11.以下程序的运行结果是 。 main() {int x=2,y=3,z=0; printf(\ add(x,y,z); printf(\ } add(int x,int y,int z) {z=x+y; x=x*x; y=y*y; printf(\ } 12.下面函数pi的功能是:根据以下公式,返回满足精度(0.0005)要求的π值,请填空。 π/2=1+1/3+1/3*2/5+1/3*2/5*3/7+1/3*2/5*3/7*4/9+… double pi(double eps) { double s,t; int n; for( ;t>eps;n++) {s+=t; t=n*t/(2*n+1); } return( );} main() { double x; scanf(\ printf(\\neps=%lf, π=%lf\ 13.下面程序运行结果是 。 long fib( int g) { switch(g) {case 0: return 0; case 1:case 2: return 1;} return(fib(g-1)+fib(g-2)); } main() {long k; k=fib(7); printf(\ 14.以下程序的运行结果 。 f(int a[ ]) { int i=0; while(a[i]<=10) {printf(\ i++;} } main() { int a[]={1,5,10,9,11,7}; f(a+1); } 15.以下程序的运行结果为 。 main() { int a[3][3]={1,3,5,7,9,11,13,15,17},sum; sum=func(a); printf(\ } func(int a[][3]) {int i,j,sum=0; for(i=0;i<3;i++) for(j=0;j<3;j++) {a[i][j]=i+j; if(i= =j) sum=sum+a[i][j]; } return(sum); } 16.已定义一个含有30个元素的数组,函数fav1的功能是按顺序分别赋予各元素从2开始的偶数,函数fav2按顺序每5个元素求一个平均值,并将该值存放在数组w中,请填空。 #define SIZE 30 fav1(float s[ ]) { int k,i; for(k=2,i=0;i fav2(float s[ ],float w[ ]) {float sum;int k,i; sum=0.0; for(k=0,i=0;i if((i+1)%5==0) { w[k]=sum/5; ; k++; } } } main() {float s[SIZE],w[SIZE/5],sum; int i,k; fav1(s); fav2(s,w); } 17.函数del的作用是删除有序数组a中的指定元素x,已有调用语句n=del(a,n,x);其中实参n为删除前数组元素的个数,请填空。 del(int a[ ],int n,int x) {int p,i; p=0; while(x>=a[p]&&p return n; } 18.函数swap(int x, int y)可完成对x和y值的交换。在运行调用函数中的如下语句后,a[0]和a[1]的值分别为 ,原因是 。 a[0]=1;a[1]=2; swap(a[0],a[1]); 19.以下程序的运行结果为 。 main() {int a=1,b=2,c=3; ++a; c+=++b; {int b=4,c; c=b*3; a+=c; printf(\ a+=c; printf(\ } printf(\ } 20.以下程序的运行结果为 。 int k=1; main() { int i=4; fun(i); printf(\ } fun(int m) { m+=k;k+=m; {char k=’B’; printf(\’A’); } printf(\} 21.以下程序的运行结果是 。 int x1=30,x2=40; main() { int x3=10,x4=20; sub(x3,x4); sub(x2,x1); printf(\} sub(int x,int y) {x1=x;x=y;y=x1;} 22.以下程序运的行结果是 。 int a=5;int b=7; main() { int a=4,b=5,c; c=plus(a,b); printf(\} plus(int x,int y) { int z; z=x+y; return(z);} 23.以下程序的运行结果是 。 int a=3,b=5; max(a,b) {int c; c=a>b?a:b; return(c); } main() { int a=8; printf(\ 24.以下程序的运行结果是 。 int n=1; main() { static int x=5; int y; y=n; printf(\ func(); printf(\ func(); } func( ) { static int x=4; int y=10; x=x+2; n=n+10; y=y+n; printf(\} 25.以下程序的运行结果是 。 main() {increment(); increment(); increment(); } increment() { static int x=0; x+=1; printf(\} 26.以下程序的运行结果是 。 main( ) { incx( ); incy( ); incx( ); incy( ); incx( ); incy( ); } incx( ) { int x=0; printf(\incy( ) { static int y=0; printf(\} 27.编写程序输出下列图形: * *** ***** ******* ***** *** * 请完成填空。 void a(int i) {int j,k; for(j=0;j<=7-i;j++) printf(\; for(k=0;k< ;k++) printf(\ printf(\} main() {int j; for(j=0;j<3;j++) ; for(j=3;j>=0;j--) ; } 三、编程题 1.已有变量定义和函数调用语句:int x=57; isprime(x);函数isprime用来判断一个整型数是否为素数,若是素数,函数返回1,否则返回0。试编写isprime函数。 2.编写程序,将字符串中的第m个字符开始的全部字符复制成另一个字符串。要求在主函数中输入字符串及m的值并输出复制结果,在被调用函数中完成复制。 3.从键盘输入一个字符串,然后按要求输出一个新字符串,新串是在原串中,每两个字符之间插入一个空格,如原串为abcd,则新串为abcd。要求在函数insert中完成新串的产生,并在函数中完成所有相应的输入和输出。 4.设有一数列,包含10个数,已按升序排好。现要求编一程序,它能够把从指定位置开始的n个数按降序重新排列并输出新的完整数列。进行降序处理时要求使用函数。 5.编写程序,统计从键盘输入的命令行中第二个函数所包含的英文字符个数。 6.编写程序,将字符串computer赋给一个字符数组,然后从第一个字母开始间隔地输出该串。 7.有10个字符串,在每个字符串中,找出最大字符按一一对应的顺序放入一维数组a中,即第i个字符串中的最大字符放入a[i]中,输出每个字符串中的最大字符,要求用函数实现。 8.把两个已按升序排列的数组合并成一个升序数组,要求用函数实现。 9.下列程序功能是应用下面的近似公式计算e的n次方。函数f1用来计算每项分子的值,函数f2用来计算每项分母的值,试编写两个函数。 ex =1+x+x 2/2!+x 3/3!+?(前两项的和) float f2(int n) { } float f1(int x, int n) { } main( ) {float exp=1.0; int n,x; scanf(\ printf(\ exp=exp+x; for(n=2;n<=19;n++) exp=exp+f1(x,n)/f2(n); printf(\} 10.设计一个程序,在主函数中实现从键盘输入一个大写英文字母。在自定义函数中要求顺序打印出3个相邻的字母,指定的字母在中间。如指定的字母为Z,则打印YZA;若为A,则打印ZAB。 11.有一数列,该数列的第1、2项分别为0和1,以后每个奇数编号的项是前两项和的绝对值,偶数编号的项是前两项的差的绝对值。生成的20个数存在一维数组x中,并按每行4项的形式输出。试编程。 12.从键盘输入若干整数,其值在0~4的范围内,用-1作为输入结束的标志,统计整数的个数。通过函数实现。 13.从键盘输入两个字符串a和b,要求不用strcat把b中的前5个字符连接到a中,如果b的长度小于5,则把b的所有元素都连接到a中。试编程。 习题5 编译预处理 一、选择题 1.宏定义#define PI 31.14159中,宏名PI代替 。 A.单精度 B.双精度 C.常量 2.设有以下宏定义: #define N 3 #define Y(n) ((N+1)*n) D.字符串 执行语句z=2*(N+Y(5+1));后,z的值为 。 A.出错 B.42 C.48 3.以下说法正确的是 。 A.#define和printf都是C语句 B.#define 是C语句,而printf不是 C.printf是C语句,但#define不是 D.#define 和printf都不是C语句 4.宏定义的宏展开是在 阶段完成的。 A.第一遍编译 B.第二遍编译 C.程序执行 D.预编译 5.编译预处理命令以 结尾。 A.; B.. C.\\ 二、填空题 1.程序中有定义: #define S(r) r/r int a=4,b=3,area; D.54 D.回车 则表达式area=S(a+b)的值为 。 2.若有以下宏定义: #define STR \#define A 97 已知字符a的ASCII码值为97,则语句printf(STR,A,A+2);的输出结果为 。 3.以下程序的输出结果是 。 #define M(x,y,z) x*y+z main() {int a=1,b=2,c=3; printf(\ 4.下列程序执行后的输出结果是 。 #define MA(x) x*(x-1) main() { int a=1,b=2; pirntf(\ 5.C语言中,宏定义的有效范围从定义处开始,到本源程序结束处中止。但可以用 来提前解除宏定义的作用。 习题6 数 组 一、选择题 1.若有以下语句: int a[12]={1,2,3,4,5,6,7,8,9,10,11,12}; char c='a',d,g; 则数值为4的表达式是 。 A.a[g-c] B.a[4] C.a[?d?-?c?] 2.假设int型变量占两个字节的存储单元,若有定义: int x[10]={0,2,4}; D.a[?d?-c] 则数组x在内存中所占字节数为 。 A.3 B.6 3.下列合法的数组定义是 。 A.int a[]=\ C.char a=\ 4.若给出以下语句: C.10 D.20 B.int a[5]={0,1,2,3,4,5}; D.char a[]={0,1,2,3,4,5}; char x[]=\ char y[]={'a','b','c','d','e','f','g'}; 则正确的叙述为 。 A.数组x和数组y等价 C.数组x的长度大于数组y的长度 5.若定义如下变量和数组 。 int j; int x[3][3]={1,2,3,4,5,6,7,8,9}; B.数组x和数组y的长度相同 D.数组y的长度大于数组x的长度 则下面语句的输出结果是 。 For (j=0;j<3;j++) printf(\ A.1 5 9 B.1 4 7 6.下列程序运行后的输出结果是 。 main() {int n[3],t,j,k; for(t=0;t<3;t++) n[t]=0; k=2; for(t=0;t printf(\ C.3 5 7 D.3 6 9 A.2 7.有以下程序: main() B.1 C.0 D.3 { int p[7]={11,13,14,15,16,17,18}, i=0,k=0; while(i<7 && p[i]%2) { k =k+ p[i]; i++; } printf(\} 执行后的输出结果是 。 A.58 B.56 C.45 D.24 8.以下能正确定义数组并正确赋初值的语句是 。 A.int N=5,b[N][N]; B.int a[1][2]={{1},{3}}; C.int c[2][]= {{1,2},{3,4}}; D.int d[3][2]={{1,2},{34}}; 9.有以下程序: main() {int m[][3]={1,4,7,2,5,8,3,6,9}; int i,j,k=2; for(i=0; i<3; i++) {printf(\} 执行后的输出结果是 。 A.4 5 6 B.2 5 8 C.3 6 9 D.7 8 9 10.以下能正确定义一维数组的选项是 。 A.int num[]; B.#define N 100 int num[N]; C.int num[0..100]; D.int N=100; int num[N]; 11.下列选项中正确的语句是 。 A.char s[8]; s={\ B.char *s; s={\C.char s[8]; s=\ D.char *s; s=\12.有以下程序 。 int a[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],b; b=p[5]; b中的值是 。 A.5 B.6 13.有以下程序: C.8 D.9 main( ) {char a[]=\printf(\} 执行后的输出结果是 。 A.7 7 B.8 8 14.有以下程序: C.8 10 D.10 10 void swap1(int c[]) { int t; t=c[0];c[0]=c[1];c[1]=t; } void swap2(int c0,int c1) { int t; t=c0;c0=c1;c1=t;} main( ) { int a[2]={3,5},b[2]={3,5}; swap1(a); swap2(b[0],b[1]); printf(\} 其输出结果是 。 A.5 3 5 3 B.5 3 3 5 15.有以下程序: C.3 5 3 5 D.3 5 5 3 int f(int b[][4]) { int i,j,s=0; for(j=0;j<4;j++) {i=j; if(i>2) i=3-j; s+=b[i][j]; } return s; } main( ) { int a[4][4]={{1,2,3,4},{0,2,4,5},{3,6,9,12},{3,2,1,0}}; printf(\} 执行后的输出结果是 。 A.12 B.11 16.有以下程序: C.18 D.16 void sort(int a[],int n) { int i,j,t; for(i=0;i if(a[i] main() { int aa[10]={1,2,3,4,5,6,7,8,9,10},i; sort(aa,10); for(i=0;i<10;i++) printf(\ printf(\} 其输出结果是 。 A.1,2,3,4,5,6,7,8,9,10 C.9,2,7,4,5,6,3,8,1,10 17.有以下程序: B.10,9,8,7,6,5,4,3,2,1 D.1,10,3,8,5,6,7,4,9,2 void f(int a[],int i,int j) { int t; if(i {t=a[i];a[i]=a[j];a[j]=t; f(a,i+1,j-1); } } main( ) { int i,aa[5]={1,2,3,4,5}; f(aa,0,4); for(i=0;i<5;i++) printf(\} 执行后的输出结果是 。 A.5,4,3,2,1, B.5,2,3,4,1, 18.以下程序的输出结果是 。 C.1,2,3,4,5, D.1,2,3,4,5, main() { char ch[3][5]={\ printf(\ } A.\ B.\ 19.以下程序的输出结果是 。 C.\ D.\ main() { int b[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=1; for(i=0;i<3;i++) for(j=i;j<=i;j++) t=t+b[i][b[j][j]]; printf(\} A.3 20.有以下程序: B.4 C.1 D.9 main() {int aa[4][4]={{1,2,3,4},{5,6,7,8},{3,9,10,2},{4,2,9,6}}; int i,s=0; for(i=0;i<4;i++) s+=aa[i][1]; printf(\} 程序运行后的输出结果是 。 A.11 B.19 21.有以下语句: C.13 D.20 char s[10],s=\ 则运行结果是 。 A.abcd B.a C.ab cd 22.不能把字符串“Hello!”赋给数组b的语句是 。 A.char b[10]={'H','e','l','l','o','!'}; C.char b[10]; strcpy(b,\ 23.若有以下程序: char str[]=\printf(\ D.编译不通过 B.char b[10];b=\D.char b[10]=\ 该程序段的输出结果是 。 A.3 B.4 C.6 24.函数调用strcat(strcpy(str1,str2),str3)的功能是 。 A.将串str1复制到串str2中后在连接到串str3之后 B.将串str1连接到串str2之后再复制到串str3之后 C.将串str2复制到串str1中后再将串str3连接到串str1之后 D.将串str2连接到串str1中后再将串str1复制到串str3中 25.下列程序的输出结果是 。 main() { char ch[7]={ \ int j,s=0; for(j=0;ch[j]>= '0'&&ch[j]<= '9';j+=2) s=10*s+ch[j]- '0'; printf(\ } D.12 A.12ba56 B.66521 C.6 D.62 26.设已定义char s[]=\则字符串s所占的字节数是 。 A.19 B.18 C.15 D.14 27.设已定义char c[8]=\和int j则下面的输出函数调用中错误的是 。 A.printf(\ B.for(j=0;j<8;j++) printf(\C.puts(c); D.for(j=0;j<8;j++) puts(c[j]); 28.设已定义char a[10]和 int j,则下面输入函数调用中错误的是 。 A.scanf(\ B.for(j=0;j<9;j++) scanf(\C.gets(a); D.for(j=0;j<9;j++) scanf(\29.设已定义char x[8]和int j,为了给该数组赋值,下面语句中正确的是 。 A.x[8]=\ B.x=\C.x[]=\ D.for(j=0;j<7;j++) x[i]=getchar(); 30.有如下程序: main() {int n[5]={0,0,0},j,k=2; for(j=0;j 该程序的输出结果是 。 A.不确定的值 C.1 二、填空题 1.若有以下程序: B.2 D.0 main() { int a[4][4]={{1,2,-3,-4},{0,-12,-13,14},{-21,23,0,-24},{-31,32,-33,0}}; int i, j, s=0; for (i=0; i<4; i++) { for (j=0; j<4; j++) { if (a[i][j] < 0) continue; if (a[i][j] == 0) break; s += a[i][j];} } printf(\} 执行后输出结果是 。 2.以下程序运行后的输出结果是 。 main() { int i,n[]={0,0,0,0,0}; for(i=1;i<=4;i++) { n[i]=n[i-1]*2+1; printf(\ } } 3.以下程序运行后的输出结果是 。 main() { int i,j,a[][3]={1,2,3,4,5,6,7,8,9}; for(i=0;i<3;i++) for(j=i+1;j<3;j++) a[j][i]=0; for(i=0;i<3;i++) { for(j=0;j<3;j++) printf(\printf(\} } 4.下面rotate函数的功能是将n行n列的矩阵A转置为A’,例如: 当A?1 2 3 4 则A’?1 5 9 13 5 6 7 8 2 6 10 14 9 10 11 12 3 7 11 15 13 14 15 16 4 8 12 16 请填空。 #define N 4 void rotate(int a[][N]) { int i,j,t; for(i=0;i for(____________;j _______________; a[j][i]=t; } } 5.以下程序的输出结果是 。 main() { char s[]=\ s[3]= '\\0'; printf(\} 6.以下程序的输出结果是 。 main() { int i, a[10]; for(i=9;i>=0;i--) a[i]=10-i; printf(\} 7.以下程序的输出结果是 。 main() { int a[4][4]={{1,3,5},{2,4,6},{3,5,7}}; printf(\) 8.以下程序的输出结果是 。 main() { char st[20]= \ printf(%d %d \\n\} 9.若有定义语句:char s[100],d[100]; int j=0, i=0;,且s中已赋字符串,请填空以实现字符串拷贝(注:不得使用逗号表达式)。 while([i]){ d[j]= ;j++;} d[j]=0; 10.以下程序的输出结果是 。 f(int b[],int m,int n) { int i,s=0; for(i=m;i<=n;i++) s=s+b[i]; return s; ) main() { int x,a[]={1,2,3,4,5,6,7,8,9}; x=f(a,3,7); printf(\} 11.以下程序的输出结果是 。 main() { char w[][10]={ \ for(k=1;k<3;k++) printf(\ 12.下列程序的输出结果是 。 #include { char arr[2][4]; strcpy(arr, \ arr[0][3]= '&'; printf(\ 13.若想通过以下输入语句使a中存放字符串“1234”,b中存放字符“5”,则输入数据的形式应该是 。 char a[10],b; scanf(\ 14.下列程序段的输出结果是 。 main() { char b[]=\ b[5]=0; printf(\ 15.以下程序的输出结果是 。 main() { int j,k,a[10],p[3]; k=5; for(j=0;j<10;j++) a[j]=j; for(j=0;j<3;j++) p[j]=a[j*(j+1)]; for(j=0;j<3;j++) k+=p[j]*2; printf(\} 16.以下程序运行后,输出结果是 。 main() { int y=18,t=0,j,a[8]; do { a[t]=y%2;t++; y=y/2; }while(y>=1); for(j=t-1;j>=0;j--) printf(\ printf(\} 三、编程题 1.求出某数组a[5][5]每行元素的平均值。 main() { int a[5][5],j,t; float s=0.0,adv[5]; for(j=0;j<5;j++) for(t=0;t<5;t++) scanf(\ for(j=0;j<5;j++) {for(t=0;t<5;t++) s=s+a[j][t]; adv[j]=s/4.0;} for(j=0;j<5;j++) printf(\} 2.将二维数组c[3][4]转换成以为数组[12]。 main() { int c[3][4],b[12],j,t,k=0; for(j=0;j<3;j++) for(t=0;t<4;t++) scanf(\ for(j=0;j<3;j++) for(t=0;t<4;t++) b[k++]=c[j][t]; for(j=0;j<12;j++) printf(\ 3.计算一个3×3矩阵的主对角线的元素之和sum。 main() { int i,sum=0; int a[3][3]={{-1,2,3},{6,7,-8}, {9,11,20}}; for (i=0; i<=2; i++) sum=sum+a[i][i]; printf(\} 4.将两个字符串连接起来(不用strcat)。 main() { char s1[20], s2[20]; int i=0, j; gets(s1); gets(s2); while( s1[i]!= '\\0') i++; for(j=0;str[j]!= '\\0';j++) { s1[i]=s2[j]; i++;} s1[i]= '\\0'; puts(s1); puts(s2); } 习题7 指 针 一、选择题 1.有以下程序: void fun(char *a, char *b) { a=b; (*a)++; } main() { char c1='A',c2='a',*p1,*p2; p1=&c1; p2=&c2; fun(p1,p2); printf(\} 程序运行后的输出结果是 。 A.Ab B.aa 2.有以下程序: #include { printf(\ C.Aa D.Bb 程序运行后的输出结果是 。 A.0 C.?1 3.已定义以下函数: fun(int *p) { return *p; } B.1 D.NULL没定义,出错 该函数的返回值是 。 A.不确定的值 B.形参p中存放的值 C.形参p所指存储单元中的值 D.形参p的地址值 4.若有定义:int *p[3];,则以下叙述中正确的是 。 A.定义了一个基类型为int的指针变量p,该变量具有3个指针 B.定义了一个指针数组p,该数组含有3个元素,每个元素都是基类型为int的指针 C.定义了一个名为*p的整型数组,该数组含有3个int类型元素 D.定义了一个可指向一维数组的指针变量p,所指一维数组应具有3个int类型元素 5.以下程序中函数scmp的功能是:返回形参指针s1和s2所指字符串中较小字符串的首地址。 #include char *scmp(char *s1, char *s2) { if(strcmp(s1,s2)<0) return(s1); else return(s2); } main() { int i; char string[20], str[3][20]; for(i=0;i<3;i++) gets(str[i]); strcpy(string,scmp(str[0],str[1])); /*库函数strcpy对字符串进行复制*/ strcpy(string,scmp(string,str[2])); printf(\} 若运行时依次输入:abcd、abba和abc三个字符串,则输出结果为 。 A.abcd B.abba C.abc D.abca 6.有以下程序段: main() { int a=5, *b, **c; c=&b; b=&a; … } 程序在执行了c=&b;b=&a;语句后,表达式**c的值是 。 A.变量a的地址 B.变量b中的值 C.变量a中的值 D.变量b的地址 7.有以下程序: #include { char str[ ][20]={\printf(\} 程序运行后的输出结果是 。 A.0 B.5 8.已定义以下函数: C.7 D.20 fun(char *p2, char *p1) { while((*p2=*p1)!='\\0'){ p1++;p2++; } } 函数的功能是 。 A.将p1所指字符串复制到p2所指内存空间 B.将p1所指字符串的地址赋给指针p2 C.对p1和p2两个指针所指字符串进行比较 D.检查p1和p2两个指针所指字符串中是否有'\\0' 9.有以下程序: main() { int a[3][3],*p,i; p=&a[0][0]; for(i=0;i<9;i++) p[i]=i+1; printf(\} 程序运行后的输出结果是 。 A.3 B.6 10.有以下程序: C.9 D.2 main() { int p[7]={11,13,14,15,16,17,18},i=0,k=0; while(i<7&&*(p+i)%2) {k=k+*(p+i); i++;} printf(\} 执行后的输出结果是 。 A.58 B.56 11.有以下程序: C.45 D.24 main() { char a,b,c,*d; a='\\'; b='\\xbc'; c='\\0xab'; d=\ printf(\} 编译时会出现的错误是 。 A.程序中只有a='\\';语句不正确 B.b='\\xbc';语句不正确 C.d=\语句不正确 D.a='\\';和 c='\\0xab';语句都不正确 12.若有以下定义,则对a数组元素的正确引用是 。 A.*&a[5] B.a+2 C.*(p+5) D.*(a+2) 13.有以下程序: int *f(int *x,int *y) { if(*x<*y) return x; else return y; } main() { int a=7,b=8,*p,*q,*r; p=&a; q=&b; r=f(p,q); printf(\} 执行后的输出结果是 。 A.7,8,8 B.7,8,7 14.有以下程序: C.8,7,7 D.8,7,8 main() { char *s[]={\p=s[1]; printf(\} 执行后的输出结果是 。 A.n,two B.t,one C.w,one 15.有以下程序: D.o,two main() { int x[8]={8,7,6,5,0,0}, *s; s=x+3; printf(\} 执行后的输出结果是 。 A.随机值 B.0 C.5 D.6 16.以下函数的功能是:通过键盘输入数据,为数组中的所有元素赋值。 #define N 10 void arrin(int x[N]) { int i=0; while(i scanf(\} 在横线处应填入的是 。 A.x+i B.&x[i+1] 17.有以下程序: C.x+(i++. D.&x[++i] main() { char *s=\ printf(\} 执行后的输出结果是 。 A.赋初值的字符串有错 C.5,2 18.阅读以下函数: B.6,7 D.6,2 fun(char *sl,char *s2) { int i=0; while(sl[i]==s2[i]&&s2[i]!='\\0') i++; return(sl[i]=='\\0'&&s2[i]=='\\0'); } 此函数的功能是 。 A.将s2所指字符串赋给s1 B.比较s1和s2所指字符串的大小,若s1比s2的大,函数值为1,否则函数值为0 C.比较s1和s2所指字符串是否相等,若相等,函数值为1,否则函数值为0 D.比较s1和s2所指字符串的长度,若s1比s2的长,函数值为1,否则函数值为 0 19.有以下程序: main() { char str[ ]=\while(*ps) ps++; for(ps--;ps-str>=0;ps--) puts(ps);} 执行后的输出结果是 。 A.yz<回车>xyz C.z<回车>yz<回车>xyz 20.有以下程序: B.z<回车>yz D.x<回车>xy<回车>xyz main() { int a[][3]={{1,2,3},{4,5,0}},(*pa)[3],i; pa=a; for(i=0;i<3;i++) if(i<2) pa[1][i]=pa[1][i]-1; else pa[1][i]=1; printf(\} 执行后的输出结果是 。 A.7 B.6 C.8 21.有以下程序: void fun(int *a,int i,int j) { int t; if (i { t=a[i];a[i]=a[j];a[j]=t; fun(a,++i,--j); } } main() { int a[]={1,2,3,4,5,6},i; fun(a,0,5); for(i=0;i<6;i++) printf(\} 执行后的输出结果是 。 A.6 5 4 3 2 1 B.4 3 2 1 5 6 C.4 5 6 1 2 3 22.有以下程序: main(int argc,char *argv[]) { int n,i=0; while(argv[1][i]!='\\0') { n=fun(); i++;} printf(\ } int fun() { static int s=0; s+=1; return s; } 假设程序编译、连接后生成可执行文件exam.exe,若键入以下命令exam 123〈回车〉 则运行结果为 。 A.6 B.8 C.3 23.下列程序的输出结果是 。 main() { char a[10]={9,8,7,6,5,4,3,2,1,0},*p=a+5; printf(\} A.非法 B.a[4]的地址 C.5 24.下列程序的运行结果是 。 void fun(int *a, int *b) { int *k; k=a; a=b; b=k; } main() { int a=3, b=6, *x=&a, *y=&b; D.无确定值 D.1 2 3 4 5 6 D.4 D.3 fun(x,y); printf(\} A.6 3 B.3 6 25.下面程序的输出结果是 。 C.编译出错 D.0 0 main() { int a[ ]={1,2,3,4,5,6,7,8,9,0},*p; p=a; printf(\} A.0 B.1 26.以下程序的输出结果是 。 C.10 D.9 main() { int i, x[3][3]={1,2,3,4,5,6,7,8,9}; for(i=0;i<3;i++) printf(\} A.1,5,9 B.1,4,7 27.以下程序的输出结果是 。 C.3,5,7 D.3,6,9 main() { int a[3][3]={ {1,2},{3,4},{5,6} },i,j,s=0; for(i=1;i<3;i++) for(j=0;j<=i;j++)s+=a[i][j]; printf(\} A.18 B.19 C.20 D.21 28.若有语句:int i, j=2,*p=&i;,则能完成i=j赋值功能的语句是 。 A.i=*p; B.*p=*&j; C.i=&j; D.i=**p; 29.以下定义语句中,错误的是 。 A.int a[]={1,2}; B.char *a[3]; C.char s[10]=\ D.int n=5,a[n]; 30.以下程序的输出结果是 。 char cchar(char ch) { if(ch>='A'&&ch<='Z') ch=ch-'A'+'a'; return ch; } main() { char s[]=\while(*p) { *p=cchar(*p); p++; } printf(\} A.abc+ABC=DEFdef C.abcaABCDEFdef 31.以下程序的输出结果是 。 char s[]=\printf (\ B.abc+abc=defdef D.abcabcdefdef A.9 B.12 C.13 32.以下程序调用findmax函数返回数组中的最大值。 findmax(int *a,int n) D.14 { int *p,*s; for(p=a,s=a; p-a main() { int x[5]={12,21,13,6,18}; printf(\} 在横线处应填入的是 。 A.p>s B.*p>*s 33.以下程序的输出结果是 。 C.a[p]>a[s] D.p-a>p-s main() { char cf[3][5]={\printf(\} A.\ B.\ C.\ D.\34.以下不能正确进行字符串赋初值的语句是 。 A.char str[5]=\ B.char str[]=\C.char *str=\ D.char str[5]={'g','o','o','d'}; 35.以下程序的输出结果是 。 f(int *b , int m, int n) { int i,s=0; for(i=m;i main() { int x,a[]={1,2,3,4,5,6,7,8,9}; x=f(a,3,7); printf(\} A.10 B.18 36.若有以下定义和语句: int s[4][5],(*ps)[5]; ps=s; C.8 D.15 则对s数组元素的正确引用形式是 。 A.ps+1 B.*(ps+3) C.ps[0][2] 37.以下程序的输出结果是 。 #include { char b1[8]=\while (--pb>=b1) strcpy(b2,pb); printf(\} D.*(ps+1)+3 A.8 B.3 C.1 D.7 38.若有说明:int n=2,*p=&n,*q=p;,则以下非法的赋值语句是 。 A.p=q; B.*p=*q; C.n=*q; D.p=n; 39.有以下程序: void fun(char *c,int d) { *c=*c+1;d=d+1; printf(\} main() { char a='A',b='a'; fun(&b,a); printf(\} 程序运行后的输出结果是 。 A.B,a,B,a C.A,b,A,b 40.有以下程序: B.a,B,a,B D.b,B,A,b main() { char a[]={'a','b','c','d','e','f','g','h','\\0'}; int i,j; i=sizeof(a); j=strlen(a); printf(\} 程序运行后的输出结果是 。 A.9,9 B.8,9 C.1,8 D.9,8 41.以下程序中的reverse函数的功能是将a所指数组中的内容进行逆置。 void reverse(int a[],int n) { int i,t; for(i=0;i {t=a[i];a[i]=a[n-1-i];a[n-1-i]=t;} } main() { int b[10]={1,2,3,4,5,6,7,8,9,10}; int i,s=0; reverse(b,8); for(i=6;i<10;i++) s+=b[i]; printf(\} 程序运行后的输出结果是 。 A.22 B.10 42.有以下程序: C.34 D.30 main() { int aa[4][4]={{1,2,3,4},{5,6,7,8},{3,9,10,2},{4,2,9,6}}; int i,s=0; for(i=0;i<4;i++) s+=aa[i][1]; printf(\} 程序运行后的输出结果是 。 A.11 B.19 43.有以下程序: #include { char *p=\printf(\} C.13 D.20 程序运行后的输出结果是 。 A.12 B.15 44.有以下程序: C.6 D.5 #include main(int argc,char *argv[]) { int i,len=0; for(i=1;i 程序编译连接后生成的可执行文件是ex1.exe。 若运行时输入带参数的命令行是: ex1 abcd efg 10<回车> 则运行的结果是 。 A.22 B.17 45.有以下程序: C.12 D.9 int fa(int x) { return x*x; } int fb(int x) { return x*x*x; } int f(int (*f1)(),int (*f2)(),int x) { return f2(x)-f1(x); } main() { int i; i=f(fa,fb,2); printf(\} 程序运行后的输出结果是 。 A.-4 B.1 46.有以下程序: C.4 D.8 void ss(char *s,char t) { while(*s) { if(*s==t) *s=t-'a'+'A'; s++; } } main() { char str1[100]=\ss(str1,c); printf(\} 程序运行后的输出结果是 。 A.ABCDDEFEDBD C.abcAAfefAbA 47.有以下程序: B.abcDDfefDbD D.Abcddfefdbd #include main() { char *p,*q; p=(char *)malloc(sizeof(char)*20); q=p; scanf(\} 若从键盘输入:abc def<回车>,则输出结果是 。 A.def def B.abc def C.abc d D.d d 48.以下程序中函数f的功能是将n个字符串,按由大到小的顺序进行排序。 #include void f(char (*p) [10], int n) { char t[20]; int i,j; for(i=0;i if(strcmp(p[i],p[j])<0) { strcpy(t,p[i]);strcpy(p[i],p[j]);strcpy(p[j],t);} } main() { char p[][10]={\f(p,5); printf(\} 程序运行后的输出结果是 。 A.6 B.4 C.5 二、填空题 1.以下程序运行后的输出结果是 。 D.3 main() { int i,j,a[ ][3]={1,2,3,4,5,6,7,8,9}; for(i=0;i<3;i++) for(j=i+1;j<3;j++) *(*(a+j)+i)=0; for(i=0;i<3;i++) { for(j=0;j<3;j++) printf(\printf(\ } } 2.以下程序运行后输入:3,abcde<回车>,则输出结果是 。 #include for(i=n-1;i>0;i--) str[i]=str[i-1]; str[0]=temp; } main() { char s[50]; int n, i, z; scanf(\z=strlen(s); for(i=1; i<=n; i++) move(s, z); printf(\} 3.有以下程序,若输入的字符串是:abc123edf456gh,则执行程序后输出 。 #include { char s[80], d[80]; int i,j; gets(s); for(i=j=0;*(s+i)!='\\0';i++) if(*(s+i)>='0' && *(s+i)<='9' ) { *(d+j)= *(s+i); j++; } *(d+j)='\\0'; puts(d); } 4.若有以下程序: main() { int a[4][4]={{1,2,-3,-4},{0,-12,-13,14} ,{-21,23,0,-24},{-31,32,-33,0}}; int i,j,s=0; for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(*(*(a+i)+j)<0) continue; if(*(*(a+i)+j ==0) break; s+=*(*(a+i)+j; printf(\} } } 执行后的输出结果是 。 5.以下函数的功能是删除字符串s中的所有数字字符,请填空。 viod dele(char *s) { int n=0,i; for(i=0;s[i];i++) if( ) s[n++]=s[i]; s[n]= ; } 6.设函数findbig已定义为求3个数中的最大值。以下程序将利用函数指针调用findbig函数,请填空。 main() { int findbig(int,int,int); int (*f)(),x,y,z,big; f= ; scanf(\big=(*f)(x,y,z); printf(\} 7.以下程序通过函数指针p调用函数fun,请在填空栏内,写出定义变量p的语句。 void fun(int *x,int y) { … } main() { int a=10,b=20; ; /定义变p */ p=fun; p(&a,&b); … } 8.下列程序的输出结果是 。 void fun(int *n) { while( (*n)--); printf(\} main() { int a=100; fun(&a); } 9.以下程序的输出结果是 。 main() { int arr[ ]={30,25,20,15,10,5}, *p=arr; p++; printf(\} 10.以下程序中,主函数调用了LineMax函数,实现在N行M列的二维数组中,找出每一行上的最大值,请填空。 #define N 3 #define M 4 void LineMax(int (*x)[M]) { int i,j,p; for(i=0; i for(j=1; j if(x[i][p] printf(\} } main() { int x[N][M]={1,5,7,4,2,6,4,3,8,2,3,1}; } 11.设有以下程序: main() { int a, b, k=4, m=6, *p1=&k, *p2=&m; a=pl==&m; b=(*p1)/(*p2)+7; printf(\printf(\} 执行该程序后,a的值为 ,b的值为 。 12.若已定义int a[10], i;,以下fun函数的功能是:在第一个循环中给前10个数组元素依次赋1、2、3、4、5、6、7、8、9、10;在第二个循环中使a数组前10个元素中的值对称折叠,变成1、2、3、4、5、5、4、3、2、1,请填空。 fun( int a[ ]) { int i; for(i=1; i<=10; i++) *(a+i-1) = ; for(i=0; i<5; i++) =*(a+i); } 13.以下程序运行后的输出结果是 。 main() { char s[ ]=\ for ( p=s ; p 14.以下程序的输出结果是 。 main() { int b[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=0; for(i=0;i<3;i++) for(j=0;j<=i;j++) t=t+* (* (b+i)+ b[j][j]) }; printf(\} 15.以下程序的输出结果是 。 main() { char *p=\long *q; q=(long*)p; q++; r=(char*)q; printf(\} 16.以下程序的输出结果是 。 main() { char s[]=\s[3]='\\0'; printf(\} 17.以下程序的输出结果是 。。 main() { int x=0; sub(&x,8,1); printf(\} sub(int *a,int n,int k) { if(k<=n) sub(a,n/2,2*k); *a+=k; } 18.以下程序中,select函数的功能是:在N行M列的二维数组中,选出一个最大值作为函数值返回,并通过形参传回此最大值所在的行下标,请填空。 #define N 3 #define M 3 select(int a[N][M],int *n) { int i,j,row=1,colum=1; for(i=0;i if(a[i][j]>a[row][colum]){row=i;colum=j;} *n= ; return ; } main() { int a[N][M]={9,11,23,6,1,15,9,17,20},max, n; max=select(a,&n); printf(\} 19.mystrlen函数的功能是计算str所指字符串的长度,并作为函数值返回,请填空。 int mystrlen(char *str) { int i; for(i=0; *(str+i)!= ;i++); return( ); } 20.下面程序的运行结果是 。 void swap(int *a,int *B) { int *t; t=a;a=b;b=t; } main() { int x=3,y=5,*p=&x,*q=&y; swap(p,q); printf(\} 21.设有定义int n,*k=&n;以下语句将利用指针变量k读写变量n中的内容,请将语句补充完整。 scanf(\printf(\ 22.fun函数的功能是:首先对a所指的N行N列的矩阵,找出各行中的最大的数,再求这N个最大值中的最小的那个数作为函数值返回,请填空。 #include int fun(int(*a)[N]) { int row,col,max,min; for(row=0;row {for(max=a[row][0],col=1;col else if( ) min=max; } return min; } 23.函数sstrcmp()的功能是对两个字符串进行比较。当s所指字符串和t所指字符相等时,返回值为0;当s所指字符串大于t所指字符串时,返回值大于0;当s所指字符串小于t所指字符串时,返回值小于0(功能等同于库函数strcmp),请填空。 #include int sstrcmp(char *s,char *t) { while(*s&&*t&&*s== ) {s++;t++; } return ; } 24.下面程序的运行结果是 。 char a[]=”123456789”,*p; int i=0; p=a; while(*p) { if(i%2==0) * p='#'; p++; i++; } } puts(a); 25.下面程序的运行结果是 。 char a[]=\int s=0; for(p=a;*p!= '\\0';p++) s=10*s+*p-'0'; printf(\ 26.若有定义int a[3][5],i,j;(且0<=i<3,0<=j<5),则a[i][j]的地址可用以下几种形式表示: (1)&a[i][j] (2)a[i]+j (3) +j (4)&a[0][0]+ (5)a[0]+ 27.若有定义char *language[ ]={\则language[2]的值是 。 28.若有定义int (*p)[4],则p是一个指向 的指针。 29.若有定义char *string=\,则*(string+2)的值为 。 30.下面程序段中,for循环的执行次数为 。 char *s=\for(;*s!= '\\0';s++) printf(\ 31.下面程序段的运行结果是 。 char str[]=\printf(\ 32.若有语句:int a[4]={0,1,2,3},*p; p=&a[1];则++(*p)的值是 。 33.若有定义int a[2][3]={2,4,6,8,10,12};则*(a[1]+2)的值是 ,*(&a[0][0]+5)的值是 。 34.下面程序的运行结果是 。 #include \fun(char *s) { char *p=s; while(*p) p++; return(p-s);} main() {char *a=\int i; i=fun(a); printf(\} 35.下面程序的功能是比较两个字符串是否相等,若相等则返回1,否则返回0,请填空。 #include \fun(char *s,char *t) { int i=0; while( && ) i++; if (s[i]== '\\0'&&t[i]== '\\0') return 1; else return 0; } main() { char a[20], b[20]; int i; gets(a); gets(b); i=fun(a,b); printf(\} 三、编程题(用指针实现) 1.编写程序,输入3个字符串,按从小到大的顺序排列并输出。 2.编写程序,输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符的个数。 3.编写程序,将任意一个字符串从第一个字符开始间隔地输出该串。例如,字符串是abcdef,那么输出ace。 4.编写一个函数,求一个字符串的长度(不能调用strlen函数)。 5.编写程序,将一个长度不超过4个的数字字符串转换成一个整数。如字符串是 “3248”,则转换的整数是3248。