C语言题目及答案

更新时间:2024-03-22 10:51:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第一部分循环题目

大纲:while语句。do—while语句。for语句。循环的嵌套。break语句和continue语句。循环语句程序举例。 一:选择题

1. 下面有关for循环的正确描述是( )

A.for循环只能用于循环次数已经确定的情况 B.for循环是先执行循环体语句,后判定表达式 C.在for循环中,不能用break语句跳出循环体

D.for循环体语句中,可以包含多条语句,但要用花括号括起来 [解答]:D。

2. 对于for(表达式1;;表达式3)可理解为()

A.for(表达式1;1;表达式3) B.for(表达式1:1;表达式3)

C.for(表达式1;表达式1;表达式3) D.for(表达式1;表达式3;表达式3) [解答]:B。

3. 以下正确的描述是()。

A.continue语句的作用是结束整个循环的执行

B.只能在循环体内和switch语句体内使用break语句 C.在循环体内使用break语句或continue语句的作用相同 D.从多层循环嵌套中退出时,只能使用goto语句 [解答]:B。

4. C语言中( )。

A.不能使用do-while语句构成的循环

B.do-while语句构成的循环必须用break语句才能退出

C.do—whiLe语句构成的循环,当while语句中的表达式值为非零时结束循环 D.do—while语句构成的循环,当while语句中的表达式值为零时结束循环 [解答]:D。

5. C语言中while和do-while循环的主要区别是( )

A.do—while的循环体至少无条件执行一次

B.while的循环控制条件比do—while的循环控制条件严格 C.do—while允许从外部转到循环体内 D.do-while的循环体不能是复合语句 [解答]:A。

6. 下面程序段不是死循环的是()。

A.int I=100; B.for ( ; ; );

while(1) { I=I0+1;

if(I>100) break; }

C.int k=0; D.int s=36;

do{++k; } while(s); while(k>=0); --s; [解答]:A。

7. 下面程序的运行结果是( )。

#include void main() { int y=10; do{y--;} while(--y);

printf(\

A.-1 B.1 C.8 D.0 [解答]:D。

8、有以下程序段 int k=0; while(k=1)k++;

while 循环执行的次数是( A)

A) 无限次 B) 有语法错,不能执行 C) 一次也不执行 D) 执行1次

9、在C程序中,与while(m)中表达式m完全等价的是 (B ) A) m==0 B) m!=0 C) m==1 D) m!=1 10、有以下程序,程序运行后的输出结果是(D )。 main()

{ int i=1,sum=0; while(i<=4) sum=sum+i; i=i+1;

printf(“%d\\n”,sum); }

A)4 B)5 C)10 D)死循环 11、执行以下程序段时 x=-1; do { x=x*x; } while(! x);

则下面描述正确的是(A )

A) 循环体将执行一次 B) 循环体将执行两次

C) 循环体将执行无限次 D) 系统将提示有语法错误 12、有以下程序段其输出结果是(C ) int x=3; do

{ printf(\while (!(--x));

A) 1 B) 3 0 C) 1 -2 D) 死循环 13、有如下程序 main(){ int x=23; do {

printf(“%d”,x); x--;

}while(!x); }

该程序的执行结果是(B )

A) 321 B) 23 C) 不输出任何内容 D) 陷入死循环 14、有以下程序段 int n=0,p;

do{scanf(“%d”,&p);n++;}while(p!=12345 &&n<3);

此处do—while循环的结束条件是( D) A) P的值不等于12345并且n的值小于3 B) P的值等于12345并且n的值大于等于3 C) P的值不等于12345或者n的值小于3 D) P的值等于12345或者n的值大于等于3

15、若i为整型变量,则以下循环执行的次数是(B) for(i=2;i= =0;) printf(“%d”,i--); A)无限次 B)0次 C)1次 D)2次

16、执行语句for(i=1;i++<4;)后,变量i的值是(C) A) 3 B) 4 C) 5 D) 不定 17、有以下程序 main() {

int y=9 ;

for( ; y>0 ; y--)

if(y%3==0 ) printf(\}

程序的运行结果是(C)

A) 741 B)963 C)852 D)875421 18、以下程序执行后sum的值是( C) A)15 B)14 C) 不确定 D)0 main()

{ int i , sum;

for(i=1;i<6;i++) sum+=i; printf(“%d\\n”,sum); }

19、有如下程序 main()

{ int i,sum=0;

for(i=1;i<=3;sum++) sum+=i; printf(“%d\\n”,sum); }

该程序的执行结果是(C)

A) 6 B) 3 C) 死循环 D) 0

20、执行语句for(i=3;i>0;i--);i--;后,变量i的值是(C ) A)0 B)10 C)-1 D)1 21、执行下面程序片段的结果是(A )。 int x;

for(x=3;x<6;x++)

printf((x%2)?(“**%d”):(”##%d\\n”),x); A)**3##4 B)##3 **5 **4##5 C)##3**4 D)**3##4 **5 ##5

22、有以下程序,执行后输出的结果是(A )。 main() { int i;

for(i=0;i<3;i++) switch(i)

{ case 1: printf(\ case 2: printf(\ default: printf(\ } }

A) 011122 B) 012 C) 012020 D) 120

23、有以下程序,程序运行后的输出结果是(C )。 main()

{ int k=4,n=0; for( ; n

if(n%3!=0) continue; k--; }

printf(\}

A)1,1 B)2,2 C)3,3 D)4,4

24、设变量已正确定义,则以下能正确计算f = n!的程序段是(D ) A) f=0 ;

for(i=1;i<=n;i++) f*=i; B) f=1;

for(i=1;i

for(i=n;i>1;i++) f*=i; D) f=1;

for(i=n;i>=2;i--) f*=i;

25、执行下面程序片段的结果是(B )。 main() {int a,b;

for(a=1,b=1;a<=100;a++) {

if(b>=20) break; if(b%3= =1) {

b+=3;continue; } b-=5; }

printf(“%d\\n”,a); }

A)7 B)8 C)9 D)10 26、有以下程序 main() {

int i,j; for(i=3;i>=1;i--) { for(j=1;j<=2;j++) printf(\ printf(\ } }

程序的运行结果是(D)

A) 2 3 4 B)4 3 2 C)2 3 D)4 5 3 4 5 5 4 3 3 4 3 4 4 5 2 3 27、有以下程序 main() { int i=5; do {

if(i%3==1) if(i%5==2)

{ printf(\ break; } i++;

} while(i!=0); printf(\}

程序的运行结果是(A)

A) *7 B)*3*5 C)*5 D)*2*6 28.运行下面程序 #include main()

{ int k=0,a=1; while(k<10) { for( ; ;)

{ if((k)==0)/*当循环开始的时候时,k=0,此时和 10 取 3 余 的结果就等于 0,就跳出了 for 循环开始下面的循环*/ break; else k--; } k=k+11; a=a+k; }

printf(“k=%d \\n a=%d\\n”,k,a); }

则输出的结果是()

A 21 32 B 21 33 C 11 12 D 10 11 29.若 i 为整型变量,则以下循环执行的次数是() for(i=2;i==0;)printf(“%d”,i--);

A.无限次 B0次 C1次 D2次 30 以下程序的输出结果是: main() { int a,b;

for(a=1,b=1;a<=100;a++) { if(b>=10) break;

if(b%3==1) {b=b+3; continue;}

} printf(“%d”,a); } A 101 B3 C 4 D 5 二、程序阅读题(共10题) 1、设有以下程序: main() {

int n1,n2;

scanf(“%d”,&n2); while(n2!=0) {

n1=n2; n2=n2/10;

printf(“%d”,n1); } }

程序运行后,如果从键盘上输入1298;则输出结果为 8921 。 2、以下程序的输出结果是 5 。 main() {int s,i;

for(s=0,i=1;i<3;i++,s+=i);

printf(\ }

3、阅读下面程序,程序的结果是 2,1,0 。 main() {int i=7;

for(i=2;i>0;i--)

printf(”%d,”,i); printf(”%d”,i);}

4、阅读下面程序,程序的结果是 14,4 。 main()

{ int i,j,m=0;

for(i=2;i<=10;i+=4) for(j=3;j<=4;j++) {m++;i++;}

printf(\,%d\

5、阅读下面程序,程序的结果是 1978 。 main()

{int j,a=2,n=4; long s=0,t=0; for(j=0;j

for(j=1;j

printf(”%d”,s); }

6、以下程序运行后的输出结果是 0918273645 main() {

char c1,c2;

for(c1='0',c2='9';c1

7、以下程序的输出结果是 5 。 main() {

int s,i;

for(s=0,i=1;i<3;i++,s+=i); printf(\}

8、执行以下程序后,输出'#'号的个数是 6 。 main() { int i,j;

for(i=1; i<5; i++)

for(j=2; j<=i; j++) putchar('#'); }

9、以下程序的输出结果是 x=4 main()

{ int i,j,x=0;

for(i=1;i<2;i++) { x++;

for(j=0;j<=3;j++ ) { if(j%2) continue; x++;}

x++;}

printf(“x=%d\\n”,x);} 三、 程序填空题

1、以下程序的功能是计算:m=1-2+3-4+…+9-10,并输出结果。请填空。 main( )

{ int m=0,f=1,i,n; scanf(“%d”,&n); for(i=1; i<=n; i++) { m+=i*f;

f= -f ; }

printf(“m=%d”,m) }

2、以下程序的功能是计算s=1+1/2!+1/3 ! +1/4 !+…+1/n! ,请填空。 main( ) {

double s=0.0,fac=1.0; int i; int n;

scanf(“%d”,&n); for(i=1,i<=n;i++)

{ fac=fac * 1.0/i ; s=s+fac; }

printf(“s=%lf”,s); }

3、以下程序的功能是计算:s=1+12+123+1234+12345。请填空。 main()

{ int t=0,s=0,i;

for( i=1; i<=5; i++)

{ t=i+ t*10 ; s=s+t; } printf(\}

4、要使以下程序段输出10个整数,请填入一个整数。 for(i=0;i<= 18 ;printf(“%d\\n”,i+=2)); 5、以下函数的功能是:求x的y次方,请填空。 double fun( double x, int y) { int i; double z;

for(i=1, z=x; i

6、以下程序的功能是根据以下近似公式求π值: (π*π)/6=1+1/(2*2)+1/(3*3)+..+1/(n*n)

现在请你在下面的函数中填空,完成求π的功能。 main(){

double s=0.0; long i,n; scanf(“%ld”,&n);

for(i=1;i<=n;i++) s=s+ 1.0/(i*i) ; printf(“%lf”,sqrt(6*s)); }

7、以下用来输出两整数M和N之间的所有素数(质数),请填空,使程序能正确运行。 #define M 4 #define N 30 main() {

int i, j, k, s=0;

for(i=M; i<= N ; i++) { for(j=2; j< i ; j++) if(i%j== 0 ) break; if(j>=i) { printf(\ s=s+1;

if( s%5==0 ) printf(\

}

}

printf(\ }

8、以下程序实现:从键盘输入一位整数,计算其各位数字之和。比如输入整数31421,则打印结果为11。请填空。 main(){ int i,sum=0,a; scanf(\ while(i>0){ a= i ; sum+=a; i= i/10 ; } printf(\}

9、以下程序实现:计算1~10之间(不含10)的奇数之和以及偶数之和 main() {

int a,b,i; a=b=0;

for(i=0;i<10;i+=2) {

a= a+i ; b= b+i+1 ; }

printf(\偶数为:%d,奇数和为:%d\\n\}

10、以下程序的功能是:输出100以内(不含100)能被3整除且个位数为6的所有整数,请填空。 main() {

int i,j;

for(i=0; i<10 ;i++) { j=i*10+6;

if( j%3==0 ) continue; printf(“%d ”,j); } }

四、编程题

1.根据公式Π2/6≈1/12+1/22+1/32+?+1/n2,求Π的近似值,直到最后一项的值小于10的负六次方为止。

[解答]:

#include main( )

{ long i=1;

double pi=0;

while(I*I<=10e+6) { pi=pi+1.0/(i*i); i++; }

pi=sqrt(6.0*pi);

printf(“pi=.6f\\n”,pi); }

2. 编写程序输出下面图形 * *** ***** ******* ***** *** *

#include void main() { int i,j,m,n;

for(i=0;i<3;i++) /显示总共有几行符号 { for(m=2;m>=i;m--)

printf(\输入相应的空格数,使每一行的符号相应相应的减少 for(n=6;n>5-i*2;n--)

printf(\输入相应的*个数 printf(\

} for(j=0;j<4;j++) //显示总共有几行符号 { for(m=1;m<=j;m++)

printf(\输入相应的空格数,使每一行的符号的减少 for(n=0;n<7-j*2;n++)

printf(\输入相应的*个数 printf(\ } } /

3、求出用数字0至9可以组成多少个没有重复的三位偶数。

[解答]: #include main()

{ int n,i,j,k; n=0;

for(i=1;i<=9;i++)

if( k=0;k<=8; k+=2) if(k!=i)

for(j=0;j<=9;j++) if(j!=i&&j!=k) n++;

printf(“n=%d\\n”,n); }

第二部分 数组

一维数组的定义和引用;二维数组的定义和使用;字符数组。

一 选择题

1. 以下关于数组的描述正确的是( )。

A. 数组的大小是固定的,但可以有不同的类型的数组元素 B. 数组的大小是可变的,但所有数组元素的类型必须相同 C. 数组的大小是固定的,所有数组元素的类型必须相同 D. 数组的大小是可变的,可以有不同的类型的数组元素 2. 以下对一维整型数组a的正确说明是( )。

A.int a(10); B. int n=10,a[n]; C.int n; D. #define SIZE 10 scanf(\

int a[n];

3. 在C语言中,引用数组元素时,其数组下标的数据类型允许是( )。

A. 整型常量 B. 整型表达式

C. 整型常量或整型表达式 D. 任何类型的表达式

4. 以下对一维数组m进行正确初始化的是( )。

A. int m[10]=(0,0,0,0) ; B. int m[10]={ }; C. int m[ ]={0}; D. int m[10]={10*2}; 5. 若有定义:int bb[ 8];。则以下表达式中不能代表数组元bb[1]的地址的是( )。 A. &bb[0]+1 B. &bb[1] C. &bb[0]++ D. bb+1

6. 假定int类型变量占用两个字节,其有定义:int x[10]={0,2,4};,则数组x在内存中所占字节数是

( )。 A. 3 B. 6 C. 10

D. 20

7. 若有以下说明: 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'] D. a['d'-c] 8. 以下程序段给数组所有的元素输入数据,请选择正确答案填入( )。 #include

main() {

int a[10],i=0;

while(i<10) scanf(\┇ }

A. a+(i++) B. &a[i+1] C. a+i D. &a[++i] 9. 执行下面的程序段后,变量k中的值为( )。 int k=3, s[2]; s[0]=k; k=s[1]*10;

A. 不定值 B. 33 C. 30 D. 10 10. 若说明:int a[2][3]; 则对a数组元素的正确引用是( ) 。

10

A. a(1,2) B. a[1,3] C. a[1>2][!1] D. a[2][0] 11. 若有定义:int b[3][4]={0};则下述正确的是( ) 。

A. 此定义语句不正确 B. 没有元素可得初值0 C. 数组b中各元素均为0

D. 数组b中各元素可得初值但值不一定为0 12. 若有以下数组定义,其中不正确的是( ) 。

A. int a[2][3];

B int b[][3]={0,1,2,3}; C. int c[100][100]={0};

D. int d[3][]={{1,2},{1,2,3},{1,2,3,4}};

13. 若有以下的定义:int t[5][4];能正确引用t数组的表达式是( )。

A. t[2][4] B. t[5][0] C. t[0][0] D. t[0,0] 14. 在定义int m[ ][3]={1,2,3,4,5,6};后,m[1][0]的值是( )。

A. 4 B. 1 C. 2 D. 5 15. 在定义int n[5][6]后第10个元素是( )。

A. n[2][5] B. n[2][4] C. n[1][3] D. n[1][4] 16. 若二维数组c有m列,则计算任一元素c[i][j]在数组中的位置的公式为( )。

(假设c[0][0]位于数组的第一个位置)

A. i*m+j B. j*m+i C. i*m+j-1 D. i*m+j+1 17. 若有以下定义语句,则表达式“x[1][1]*x[2][2]”的值是( )。

float x[3][3]={{1.0,2.0,3.0},{4.0,5.0,6.0}};

A. 0.0 B. 4.0 C. 5.0 D. 6.0 18. 以下程序运行后,输出结果是 ( )。

main() {

int a[4][4]={{1,3,5},{2,4,6},{3,5,7}};

printf(\}

A. 0650 B. 1470 C. 5430 D. 输出值不定 19. 若定义如下变量和数组:

int i;

int 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 C. 3 5 7 D. 3 6 9 20. 下述对C语言字符数组的描述中错误的是( )。

A. 字符数组可以存放字符串

B. 字符数组中的字符串可以整体输入、输出

C. 可以在赋值语句中通过赋值运算符\对字符数组整体赋值 D. 不可以用关系运算符对字符数组中的字符串进行比较 21. 下述对C语言字符数组的描述中正确的是 ( )。

A. 任何一维数组的名称都是该数组存储单元的开始地址,且其每个元素按照顺序连续占存储空间 B. 一维数组的元素在引用时其下标大小没有限制 C. 任何一个一维数组的元素,可以根据内存的情况按照其先后顺序以连续或非连续的方式占用存储空间

D. 一维数组的第一个元素是其下标为1的元素

11

22. 不能把字符串:Hello!赋给数组b的语句是( )。

A. char str[10]= {'H', 'e', 'l', 'l', 'o', '! '}; B. char str[10];str=\

C. char str[10];strcpy(str,\D. char str[10]=\23. 合法的数组定义是( )。

A. int a[]=\ B. int a[5]={0,1,2,3,4,5}; C. int s=\ D. char a[]={0,1,2,3,4,5}; 24. 下列语句中,不正确的是( )。

A. static char a[2]={1,2}; B. static char a[2]={ '1', '2'}; C. static char a[2]={ '1', '2', '3'}; D. static char a[2]={ '1'}; 25. 若给出以下定义:

char x[ ]=\

char y[ ]={'a','b','c','d','e','f','g'}; 则正确的叙述为( )。

A. 数组x和数组y等价 B. 数组x和数组y的长度相同 C. 数组x的长度大于数组y的长度 D. 数组x的长度小于数组y的长度 26. 若有数组定义: char array [ ]=\则数组 array所占的空间为( )。

A. 4个字节 B. 5个字节 C. 6个字节 D. 7个字节 27. 若有定义和语句:

char s[10];s=\则结果是(以下└┘代表空格)( )。

A. 输出abcd B. 输出a C. 输出abcd└┘└┘└┘└┘ D. 编译不通过 28. 下面程序运行后,输出结果是( )。

main() {

char ch[7]={ \int i,s=0;

for(i=0;ch[i]>= '0'&&ch[i]<= '9';i+=2) s=10*s+ch[i]- '0'; printf(\}

A. 12ba56 B. 6521 C. 6 D. 62

29. 运行下面的程序,如果从键盘上输入:123<空格>456<空格>789<回车>,输出结果是( )。

A. 123,456,789 B. 1,456,789 C. 1,23,456,789 D. 1,23,456 main() {

char s[100]; int c, i;

scanf(\ printf(\ }

30. 运行下面的程序,如果从键盘上输入: ab<回车> c <回车> def<回车>

则输出结果为( )。

12

A. a B. a C. ab D. abcdef b b c c c d d d e f

#include #define N 6 main()

{

char c[N];

int i=0;

for( ;i

printf(\ }

31. 运行下面的程序,如果从键盘上输入:ABC时,输出的结果是( )。

#include main() {

char ss[10]=\strcat(ss, \

gets(ss);printf(\ }

A. ABC B. ABC9 C. 123456ABC D. ABC456789 32. 判断两个字符串是否相等,正确的表达方式是( )。

A. while(s1==s2) B. while(s1=s2)

C. while(strcmp(s1,s2)==0) D. while(strcmp(s1,s2)=0) 33. 若有以下程序片段:

char str[ ]=\printf(\

上面程序片段的输出结果是 ( )。

A. 3 B. 4 C. 6 D. 12 34. 若有以下程序段,输出结果是( )。

char s[ ]=\printf (\

A. 9 B. 12 C. 13 D. 14 35. 设有static char str[ ]=\

则执行printf(\后的输出结果为 ( )。

A. 5 B. 7 C. 12 D. 14 36. 以下程序运行后,输出结果是( )。

main() {

char cf[3][5]={\printf(\}

13

A. \B. \二 填空题

1. C语言中,数组元素的下标下限为 ________。 对于一维数组的定义“类型说明符 数组名[常量表达式]”,其中常量表达式可以包括 和 ,不能包含 。

2. C程序在执行过程中,不检查数组下标是否________。 在C语言中,引用数组只能通过 数组元素来实现,而不能通过整体引用 来实现。

3. 在定义时对数组的每一个元素赋值叫数组的________;C语言规定,只有________存储类型和________存储类型的数组才可定义时赋值。如果要使一个内部数组在定义时每个元素初始化值为0,但不进行逐个赋值,将其说明成 存储类型即可。在C语言中,二维数组中元素排列的顺序是 。 对与数组a[m][n]来说,使用数组的某个元素时,行下标的最大值是 ,列下标的最大值是 。在C语言中,将字符串作

为 处理。在C语言中,数组的首地址是 。

4. 下面程序的运行结果是________。

#define N 5 main() {

int a[N]={1,2,3,4,5},i,temp; for(i=0;i

{temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp;} printf(\

for(i=0;i

5. 以下程序以每一行输出4个数据的形式输出a数组。

#include main() {

int a[20],i;

for(i=0;i<20;i++) scanf(\【1】); for(i=0;i<20;i++)

{if ( 【2】 ) 【3】 ; printf(\}

printf(\}

6. 以下程序分别在a数组和b数组中放入an+1和bn+1个由小到大的有序数,程序把两个数组中的数按

由小到大的顺序归并到c数组中。 #include main() {

int a[10]={1,2,5,8,9,10}, an=5,b[10]={1,3,4,8,12,18},bn=5; int i,j,k,c[20],max=9999; a[an+1]=b[bn+1]=max; i=j=k=0;

while((a[i]!=max)||(b[j]!=max))

if(a[i]

for(i=0;i

14

}

7. 以下程序的功能是:从键盘上输入若干个学生的成绩,计算出平均成绩,并输出低于平均分的学生成

绩,用输入负数结束输入。请填空。 main( )

{

float x[1000], sum=0.0, ave, a; int n=0, i;

printf(\:\\n\;scanf(\,&a); while(a>=0.0&& n<1000)

{ sum+=【1】 ; x[n]= 【2】 ; n++; scanf(\,&a); }

ave=【3】 ;

printf(\:\\n\; printf(\,ave);

for (i=0;i

if ( 【4】 ) printf (\ }

8. 以下程序把一个整数转换成二进制数,所得二进制数的每一位放在一维数组中,输出此二进制数。注

意:二进制数的最低位在数组的第一个元素中。 #include main() {

int b[16],x,k,r,i;

printf(\printf(\k=-1; do

{r=x% 【1】 ; b[++k]=r; x/= 【2】 ; }

while(x>=1);

for(i=k; 【3】 ;i--)

printf(\}

9. 输入10个整数,用选择法排序后按从小到大的次序输出。

#define N 10 main( ) {

int i,j,min,temp,a[N]; for(i=0;i

scanf(\【1】); printf(\

for(i=0; 【2】; i++)

{min=i;

for(j=i;j

if(a[min]>a[j]) 【3】 ;

15

temp=a[i]; a[i]=a[min]; a[min]=temp; }

for (i=0;i

printf(\

printf(\}

10. 以下程序运行结果是 ________.

#include main() {

int a[3][3]={1,2,3,4,5,6,7,8,9},i,s1=0,s2=1; for(i=0;i<=2;i++) { s1=s1+ a[i][i];

s2=s2*a[i][i];};

printf(\ }

11. 以下程序的运行结果是________.

main() {

int i, j,a[3][3]; for(i=0;i<3;i++) {for(j=0;j<3;j++)

{if(i==3) a[i][j]=a[i-1][a[i-1][j]]+1; else a[i][j]=j; printf(\}

printf(\

} }

12. 阅读下列程序:

#include main() {

int i, j, row, column,m;

static int array[3][3]={{100,200,300},{28,72,-30},{-850,2,6}}; m=array[0][0];

for (i=0; i<3; i++) for (j=0; j<3; j++)

if (array[i][j]

{ m=array[i][j]; row=i; column=j;}

printf(\}

上述程序的输出结果是 ________。

13. 若想通过以下输入语句使a中存放字符串1234,b中存放字符5,则输入数据的形式应该是________。 : .

char a[10],b;

16

scanf(\ : .

14. 以下程序段的输出结果是________。

main() {

char b[]=\ b[5]=0;

printf(\}

15. 若有以下程序段,若先后输入:

English? Good?

则其运行结果是________。 main() {

char c1[60],c2[3]; int i=0,j=0; scanf(\ scanf(\

while(c1[i]!= '\\0') i++;

while(c2[j]!= '\\0') c1[i++]=c2[j++]; c1[i]= '\\0';

printf(\}

16. 从键盘输入由5个字符组成的单词,判断此单词是不是hello,并显示结果。

#include main() {

static char str[ ]={‘h’,’e’,’l’,’l’,’o’}; char str1[5];

【1】 ;

for(i=0;i<5;i++) 【2】 ; flag=0;

for(i=0;i<5;i++)

if 【3】 {flag=1; break;}

if(flag) printf(\else printf(\}

17. 以下程序的功能是:将字符数组a中下标值为偶数的元素从小到大排列,其它元素不变。请填空。 #include #include main()

{

char a[]=\ int i, j, k; k=strlen(a);

17

for(i=0; i<=k-2; i+=2) for(j=i+2; j<=k; 【1】) if( 【2】 )

{ t=a[i]; a[i]=a[j]; a[j]=t; } puts(a); printf(\ }

18. 以下程序用来对从键盘上输入的两个字符串进行比较,然后输出两个字符串中第一个不相同字符的

ASCII码之差。例如:输入的两个字符串分别为abcdef和abceef,则输出为-1。请填空。 #include main( ) {

char str1[100],str2[100],c; int i,s;

printf(\ printf(\ i=0;

while((strl[i]==str2[i]&&(str1[i]!= 【1】)) i++; s= 【2】 ;

printf(\ }

则程序的输出结果是 ________。

19. 下面程序段完成功能是:输出两个字符串中对应字符相等的字符。请填空。

char x[ ]= \char y[ ]= \int i=0;

while (x[i]!= 【1】 &&y[i]!= 【2】 ) { if (x[i]==y[i]) printf(\【3】); else i++; }

20. 下面程序完成功能是:计算一个字符串中子串出现的次数。 #include main()

{

int i ,j, k,count;

char str1[20],str2[20]; printf(\gets(str1);

printf(\gets(str2); 【1】;

for(i=0;str1[i];i++)

for(j=i,k=0;str1[j]==str2[k];j++,k++) if ( 【2】 ) count++;

printf(\

18

}

21. 下面程序完成以下功能:从键盘输入一行字符,统计其中有多少个单词,单词之间用空格分隔。

#include main() {

char s[81];

int i , c, num=0,word=0;

【1】;

for(i=0;(c=s[i])!=’\\0’;i++) if(c==32) 【2】;

else if (word==0) {word=1; 【3】;}

printf(\}

22. 下面程序完成功能是:判定用户输入的正整数是否为“回文数”,所谓“回文数”是指正读反读都相同

的数。请填空。 #include main() {

int buffer[10], i,k,flag; long number ,n;

printf(\scanf(\k=0;

n=number; do

{ 【1】 ; k=k+1; n=n/10;

}while (n!=0);

flag=1;

for( i=0;i<=(k-1)/2;i++) if ( 【2】 ) flag=0; if(flag)

printf(\

else printf(\

}

三、程序设计题

1.用起泡法对10个数排序。

2某班 50名学生的三种成绩表如下: 课程一 课程二 课程三 … … …

试编一个程序,输入这 50 名学生的三科成绩,计算并输出每科成绩的平均分。

3 编一个程序,利用数组求费波那契(Fibonacci)序列:1,1,2,3,5,8,?。请按每行 5 个数的格式输出前 20 项。序列满足关系式:F[n]=F[n-1]+F[n-2]。

4求一个 4*4 矩阵对角线上的最小值,矩阵的值在程序运行时,由用户输入。

19

答案及部分解析

一.选择题答案

1. C 2. D 3. C 4. C 5. C 6. D 7. D 8. A 9. A 10. C 11. C

12. D 13. C 14. A 15. C 16. D 17. A 18. A 19. C 20. C 21. A

22. B 23. D 24. C 25. C 26. C 27. D 28. C 29. D 30. C 31. A 32. C 33. C 34. A 35. A 36. B

二.填空题答案

1. 答案:0 常量 符号常量 变量 2. 答案:越界 逐个引用 整个数组

3. 答案:初始化 静态 外部 静态(static)按行存放,即在内存中先存放第一行的元素,再存放第

二行的元素 m-1,n-1 字符数组 数组的名称 4. 答案:5 4 3 2 1 5. 答案:【1】&a[i] 【2】i%4==0 【3】printf(\6. 答案:【1】a[i] 【2】i++或++i 【3】b[j] 【4】j++或++j 7. 答案:【1】a 【2】a 【3】sum/n 【4】x[i]=0 9. 答案:【1】&a[i] 【2】i

11. 答案:0 1 2 0 1 2 0 1 2 12. 答案:-850,2,0

13. 答案:a=1234 b=5 A或a=1234b=5 14. 答案:Hello

15. 答案:EnglishGood

16. 答案: 【1】 int i,flag 【2】 str[i]=getchar( ) 【3】 str1[i]!=str[i] 17. 答案:【1】 j+=2 【2】 a[i]>a[j] 18. 答案:【1】 '\\0'或0 【2】 strl[i]-str2[i] 19. 答案:【1】 '\\0' 【2】 '\\0' 【3】 x[i++] 20. 答案:【1】 count=0 【2】!str2[k+1] 21. 答案:【1】 gets(s) 【2】 word=0 【3】 num++ 22. 答案:【1】 buffer[k]=n 【2】 buffer[i]!=buffer[k-1-i] 三 程序设计题

1. #include main( )

{int i,j,m,a[11]; for(i=1;i<=10;i++)

scanf(“%d”,&a[i]); for( i=1;i<=9;i++)

for(j=1;j<=10-i;j++) if(a[j]>a[j+1])

{ m=a[j]; a[j]=a[j+1];

20

a[j+1]=m; } for(i=1;i<=10;i++) printf(“%d ”,a[i]);} 2、

#define N 50 #define M 3 void main() { float score[N][M]; int i,j; for(i=0;i

} }

printf(“stuID subject1 subject2 subject3\\n”); for(i=0;i

void main() {

int f[20]={1,1}; int i;

for(i=2;i<20;i++)

f[i]=f[i-1]+f[i-2]; for(i=0;i<20;i++)

{if(i%5==0) printf(“\\n”); printf(“]”,f[i]); } } 4、

void main() { int d[4][4],i,j,min; for(i=0;i<4,i++) for(j=0;j<4;j++) scanf(“%d”,&d[i][j]); min=d[0][0];

21

for(i=0;i<4;i++) { if(d[i][i]

}

C语言函数练习题

一、选择题

1. 一个完整的C源程序是【 】。

A)要由一个主函数或一个以上的非主函数构成

B)由一个且仅由一个主函数和零个以上的非主函数构成 C)要由一个主函数和一个以上的非主函数构成 D)由一个且只有一个主函数或多个非主函数构成 2. 以下关于函数的叙述中正确的是【 】。

A)C语言程序将从源程序中第一个函数开始执行

B)可以在程序中由用户指定任意一个函数作为主函数,程序将从此开始执行 C)C语言规定必须用main作为主函数名,程序将从此开始执行,在此结束 D)main可作为用户标识符,用以定义任意一个函数 3. 以下关于函数的叙述中不正确的是【 】。

A)C程序是函数的集合,包括标准库函数和用户自定义函数 B)在C语言程序中,被调用的函数必须在main函数中定义 C)在C语言程序中,函数的定义不能嵌套 D)在C语言程序中,函数的调用可以嵌套 4. 在一个C程序中,【 】。

A)main函数必须出现在所有函数之前 B)main函数可以在任何地方出现

C)main函数必须出现在所有函数之后 D)main函数必须出现在固定位置

5. 若在C语言中未说明函数的类型,则系统默认该函数的数据类型是【 】 A)float B)long C)int D)double 6. 以下关于函数叙述中,错误的是【 】。

A)函数未被调用时,系统将不为形参分配内存单元

B)实参与形参的个数应相等,且实参与形参的类型必须对应一致 C)当形参是变量时,实参可以是常量、变量或表达式 D)形参可以是常量、变量或表达式

7. C程序中各函数之间可以通过多种方式传递数据,下列不能用于实现数据传递的方式是【 】。 A)参数的形实结合 B)函数返回值 C)全局变量

D)同名的局部变量

8. 若函数调用时参数为基本数据类型的变量,以下叙述正确的是【 】。

22

A)实参与其对应的形参共占存储单元

B)只有当实参与其对应的形参同名时才共占存储单元 C)实参与对应的形参分别占用不同的存储单元

D)实参将数据传递给形参后,立即释放原先占用的存储单元

9. 函数调用时,当实参和形参都是简单变量时,他们之间数据传递的过程是【 】。 A)实参将其地址传递给形参,并释放原先占用的存储单元

B)实参将其地址传递给形参,调用结束时形参再将其地址回传给实参 C)实参将其值传递给形参,调用结束时形参再将其值回传给实参 D)实参将其值传递给形参,调用结束时形参并不将其值回传给实参

10. 若函数调用时的实参为变量时,以下关于函数形参和实参的叙述中正确的是【 】。 A)函数的实参和其对应的形参共占同一存储单元 B)形参只是形式上的存在,不占用具体存储单元 C)同名的实参和形参占同一存储单元

D)函数的形参和实参分别占用不同的存储单元

11. 若用数组名作为函数调用的实参,则传递给形参的是 【 】。

A) 数组的首地址 B) 数组的第一个元素的值 C) 数组中全部元素的值 D) 数组元素的个数

12. 若函数调用时,用数组名作为函数的参数,以下叙述中正确的是【 】。 A)实参与其对应的形参共用同一段存储空间 B)实参与其对应的形参占用相同的存储空间

C)实参将其地址传递给形参,同时形参也会将该地址传递给实参 D)实参将其地址传递给形参,等同实现了参数之间的双向值的传递

13. 如果一个函数位于C程序文件的上部,在该函数体内说明语句后的复合语句中定义了一个变量,则该

变量【 】。

A)为全局变量,在本程序文件范围内有效 B)为局部变量,只在该函数内有效

C)为局部变量,只在该复合语句中有效 D)定义无效,为非法变量

14. C语言中函数返回值的类型是由【 】决定。 A)return语句中的表达式类型 B)调用函数的主调函数类型 C)调用函数时临时

D)定义函数时所指定的函数类型

15. 若在一个C源程序文件中定义了一个允许其他源文件引用的实型外部变量a,则在另一文件中可使用的

引用说明是【 】。

A)extern static float a; B)float a; C)extern auto float a; D)extern float a; 16. 定义一个void型函数意味着调用该函数时,函数【 】 A)通过return返回一个用户所希望的函数值 B)返回一个系统默认值 C)没有返回值

D)返回一个不确定的值

17. 若定义函数float *fun( ),则函数fun的返回值为【 】。 A)一个实数 B)一个指向实型变量的指针 C)一个指向实型函数的指针 D)一个实型函数的入口地址 18. C语言规定,程序中各函数之间【 】。 A)既允许直接递归调用也允许间接递归调用 B)不允许直接递归调用也不允许间接递归调用

23

C)允许直接递归调用不允许间接递归调用 D)不允许直接递归调用允许间接递归调用 19. 若程序中定义函数

float myadd(float a, float b) { return a+b;}

并将其放在调用语句之后,则在调用之前应对该函数进行说明。以下说明中错误的是【 】。 A)float myadd( float a,b);

B)float myadd(float b, float a); C)float myadd(float, float); D)float myadd(float a, float b);

20. 关于以下fun函数的功能叙述中,正确的是【 】。

int fun(char *s) {

char *t=s; while(*t++) ; t--;

return(t-s); }

A) 求字符串s的长度 B) 比较两个串的大小 C) 将串s复制到串t D) 求字符串s所占字节数

21. 下面程序段运行后的输出结果是【 】 (假设程序运行时输入5,3回车) int a, b;

void swap( ) {

int t;

t=a; a=b; b=t; }

main() {

scanf(\

swap( ); printf (\ }

A) a=5,b=3 B) a=3,b=5 C)5,3 D)3,5

22. 以下程序运行后的输出结果是【 】。

fun(int a, int b) {

if(a>b) return a; else return b; }

main() {

int x=3,y=8,z=6,r; r=fun(fun(x,y),2*z); printf(\} A) 3 B) 6 C) 8 D) 12

23. 以下程序的运行结果是【 】。

void f(int a, int b)

24

{ int t;

t=a; a=b; b=t; }

main() {

int x=1, y=3, z=2; if(x>y) f(x,y);

else if(y>z) f(x,z); else f(x,z);

printf(\}

A) 1,2,3 B) 3,1,2 C) 1,3,2 D) 2,3,1

24. 以下程序运行后的输出结果为【 】。 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 C) 8,7,7 D) 8,7,8

25. 以下程序的正确运行结果是【 】。

#inclued main() {

int k=4,m=1,p; p=func(k,m); printf(“%d”,p); p=func(k,m); printf(“%d\\n”,p); }

func(int a,int b) {

static int m=0,i=2; i+=m+1; m=i+a+b; return (m); }

A)8,17 B)8,16 C)8,20 D)8,8

26. 以下程序的功能是计算函数F(x,y,z)=(x+z)/(y-z)+(y+2×z)/(x-2×z)的值,请将程序补充完整。#include float f(float x,float y)

25

{

float value; value= 【1】; return value; }

main() {

float x,y,z,sum;

scanf(\ sum=f(x+z,y-z)+f(【2】); printf(\}

【1】A) x/y B) x/z C) (x+z)/(y-z) D) x+z/y-z 【2】A) y+2z,x-2z B) y+z,x-z C) x+z,y-z D) y+z*z,x-2*z

27. 以下程序的功能是根据输入的字母,在屏幕上显示出字符数组中首字符与其相同的字符串,若不存在,

则显示“No find,good bye!”,请将程序补充完整。 #include char PriStr(char ch1) {

int i=0,j=0;

static char *ch2[]={\are you\\to meet you\new\ \is

fine\ while(i++<6)

if(ch1==【1】 ) {

puts(【2】); j=1; }

return j; }

main() {

char ch;

printf(\ ch=getchar(); ch=PriStr(ch); if(ch==【3】)

puts(\}

【1】A)ch2[i][0] B)ch2[i-1][0] C)*ch2[i] D) *ch2[i-1][0] 【2】A)ch2[i] B)*ch2[i] C)*ch2[i-1] D) ch2[i-1] 【3】A)?0? B)?48? C) 0 D) 30

28. 以下程序是将输入的一个整数反序打印出来,例如输入1234,则输出4321,输入-1234,则输出-4321。

请将程序补充完整。

void printopp(long int n) { int i=0; if(n==0) return ;

26

else

while(n) {

if(【1】) printf(\ else printf(\ i++; 【2】; } }

main() {

long int n;

scanf(\ printopp(n); printf(\}

【1】A)n<0&&i==0 B)n<0||i==0 C)n>0&&i==0 D)n>0||i==0 【2】A)n%=10 B)n%=(-10) C)n/=10 D)n/=)-10)

29. 下面的程序用递归定义的方法实现求菲波拉契数列1、1、2、3、5、8、13、21……第7项的值fib(7),

菲波拉契数列第1项和第2项的值都是1。请将程序补充完整。

#include long fib(【1】) {

switch(g) {

case 0: return 0; case 1:

case 2: return 1; }

return (【2】); }

main() { long k; k=fib(7);

printf(\}

【1】A)g B)k C)long int g D)int k 【2】A)fib(7) B)fib(g) C)fib(k) D)fib(g-1)+fib(g-2) 30.有以下程序

int fun(int n) {

if(n==1) return 1;

else return(n+fun(n-1)); }

main() { int x;

27

scanf(\ x=fun(x);

printf(\}

程序执行时,若输入10,程序的输出结果是【 】。 A)55 B)54 C)65 D)45

31. 下面是一个计算1至m的阶乘并依次输出的程序。程序中应填入的正确选项是【 】。

#include double result=1; factorial( int j) {

result=result*j; return; }

main() {

int m,i=0,x;

printf(\ scanf(\ for(;i++

x=factorial(i);

printf(\【 】 ); } }

A)i,factorial(i) B)i,x C)j,x D)i,result

32. 以下程序的功能是求任意两个整数a和b的最大公约数,并予以显示。请将程序补充完整。

#include #include

long codivisor(long n1,long n2) { long t;

while( n2!=0 )

{【1】; n1=n2; n2=t;} return (【2】); }

main() {

long a,b,x;

printf(\ scanf(\ x=codivisor(a,b);

printf(\}

【1】A)t=n1/n2 B)t=n1%n2 C)t=n2%n1 D)t=n2/n1 【2】A)labs(n1) B)labs(a) C)labs(b) D)labs(n2)

33. 以下程序的功能是计算并显示一个指定行数的杨辉三角形(形状如下),请将程序补充完整。1

28

1 1 1 1 1 1 2 3 4 5

1 3 1 6 4 1 10 10 5

1

程序:

#include #define N 15

void yanghui(int b[][N], int n) {

int i,j;

for(i=0; 【1】; i++) {

b[i][0]=1; b[i][i]=1; }

for(【2】;++i<=n;) for(j=1;j

for(j=0;j<=i;j++)

printf(\ printf(\ } }

main() {

int a[N][N]={0},n;

printf(\ scanf(\ printf(\ yanghui(a,n); }

【1】A)i

34. 下面的程序用来将一个十进制正整数转化成八进制数,例如输入一个正整数25,则输出31,请将程序

补充完整。

#include main() {

int i=0,j=0,a,b[10]={0};

printf(\ scanf(\ sub(a,b); for(;i<10;i++) {

29

if(【1】) j++;

if(j!=0) printf(\ } }

sub(int c, int d[]) {

int e, i=9; while(c!=0) {

e=c%8; d[i]=e; 【2】; i--; }

return; }

【1】A)b[i]<0 B)b[i-1]!=0 C)b[i]<=0 D)b[i]!=0 【2】A)c=sub(c/8) B)c=c%8 C)c=c/8 D)c=e%8

35. 函数bisearch 的作用是应用折半查找法从存有N个整数的升序数组a中对关键字key进行查找。请将

程序补充完整。

#include #define N 15

bisearch(int a[N], int key) {

int low=0, high=N-1, mid; while(【1】) {

mid=(low+high)/2; if(key

if(key>a[mid]) low=mid+1; else

return mid; }

return 【3】 ; }

main() {

int b[N],n,I,j;

printf(\ for(i=0;i

printf(\ scanf(\; }

printf(\

30

scanf(\ j=bisearch(b,n); if(j<-5)

printf(\?t find %d\\n\ else

printf(\}

【1】A)low

36. 如果程序及其运行结果显示如下,请将程序补充完整。

2 10 4 6 1 5 2 3 2 4 7 8 5 1 3 2 The value is 15. 程序:

#include func(【1】) {

int 【2】,j;

for(j=0;j<4;j++) {

b[3][j]=2*b[0][j]; printf(\ b[3][j]=0; }

printf(\ for(j=0;j<4;j++)

if(b[i][j]<5&&b[i][2]>5) k+=b[i][j]; return k; }

main() {

static int a[4][4]={ 【3】}; int i,j,k;

k=func(a,9); for(i=0;i<4;i++) {

for(j=0;j<4;j++) if(a[i][j]!=0)

printf(\ if(a[i][4]!=0) printf(\ }

printf(\

31

}

【1】A)int b[4][],k B)int b[][4],k C)int b[4,4],int k D)int b[][4],int k 【2】A)i=0 B)i=1 C)i=2 D)i=3

【3】A) {1,5,2,3},{2,4,7,8},{5,1,3,2} B){2,10,4,6},{1,5,2,3},{2,4,7,8},{5,1,3,2} C) {1,5,2,3},{2,4,7,8},{5,1,2,3} D){2,10,4,6},{1,5,2,3},{2,4,7,8},{5,1,2,3}

37. 以下程序的功能是用二分法求方程f(x)=x41+x3+1=0在区间(-1.0,-0.5)中的一个实根,并要求绝对

误差不超过0.001。二分法的基本思想是:假设在区间(a,b)中f(a)与f(b)异号,先取区间的中点m,如果f(m)与f(a)异号,则取新的解区间为(a,m),否则取新的解区间为(m,b)。不断对解区间对分,直到解区间已经小于给定的误差时,取该区间的中点作为解的近似值。请将程序补充完整。 #include #include float f(float x) {

return (pow(x,41)+pow(x,3)+1); }

float solv(float a,float b) {

float m; m=(a+b)/2;

while(f(m)*f(b)!=0) {

if(【1】) a=m; else b=m; if(【2】) break; m=(a+b)/2; }

return m; }

main() {

float r;

r=solv(-1.0,-0.5);

printf(\【3】); }

【1】A)f(m)*f(b)<0 B)f(m)*f(b)>=0 C)f(m)*f(b)<=0 D)f(m)*f(b)>0 【2】A)b-a<0.001 B)fabs(a-b)<0.001 C)ABS(a-b)<0.001 D)a-b<0.001 【3】A)f(r) B)f(m) C) r D)m

38. 以下程序是选出能被3整除且至少有一位是5的所有三位正整数k(个位为a0,十位为a1,百位为a2),打

印出所有这样的数及其个数。请将程序补充完整。

#include sub(int m,int n) {

int a0,a1,a2; a2=【1】; a1=【2】;

32

a0=m;

if(m%3==0 && (a2==5||a1==5||a0==5)) {

printf(“%d”,m); n++; }

return n; }

main() {

int m=0,k;

for(k=105;k<=995;k++) m=sub(【3】); printf(\}

【1】A) m/10 B) m C) m/100 D) m0

【2】A) (m-a2*10)/10 B) m/10-a2*10 C) m-a2*10 D) m0-m 【3】A) k,m B) m,k C) k,n D) n,k

39. 以下程序可计算10名学生1门课成绩的平均分,要求使用无返回值函数实现。请将程序补充完整。 #include

void average(float array[10]) { int i=0;

while(【1】)

array[0]+=【2】; array[i-1]=array[0]/10; }

main() {

float score[10]; int i;

printf(\ for(i=0;i<10;i++)

scanf(\ average(score);

printf(\【3】 ); }

【1】A)i<=10 B)i++<10 C)++i<10 D)i<10 【2】A)array[i-1] B)array[i] C)array[i--] D)array[i++] 【3】A)score[8] B)score[0] C)array[8] D)score[9]

40. 以下程序用于输入不超过N个数的整数序列(用-1作为输入结束标志),然后统计出从M1至M2各

数在序列中出现的次数并显示输出。请将程序补充完整。

#include #define N 100 #define M1 3 #define M2 7 main() {

int a[N],c[M2-M1+1]={0},i,n=0,x=0;

33

printf(\ while(x!=-1) {

scanf(\ a[n]=x; n++; }

f(a,c,n);

printf(\ for(i=0;i<=M2-M1;i++)

printf(“%d:%d\\n”, 【1】); printf(\}

f(【2】) {

int i;

for(i=0;i

if(a[i]>=M1 && a[i]<=M2) 【3】; }

【1】A)M1+i:c[M1+i] B)M1+i+1:c[i]

C)M1+i:c[i] D)i:c[M1+i]

【2】A)f(a[],c[],n) B)f(int a[],int c[],int n)

C)f(a,c,n) D)f(int a[N],c[M2-M1+1],n) 【3】A)c[a[i]]++ B)c[a[i]-M2]++

C)a[c[i]]++ D)c[a[i]-M1]++

二.读程序写结果

1.

fun(int x,int y,int z) {

z =x*x+y*y; }

main ( ) {

int a=31; fun (6,3,a); printf (\}

2.

int f( ) {

static int i=0; int s=1; s+=i; i++; return s; }

34

main() {

int i,a=0;

for(i=0;i<5;i++) a+=f();

printf(\}

3. 运行程序时,若从键盘输入asd af aa z67(回车),分析以下程序的输出结果。

#include int fun(char *str) {

int i,j=0;

for(i=0;str[i]!=??;i++) if(str[i]!=??)

str[j++]=str[i]; str[j]=??; }

main() {

char str[81]; int n;

printf(\ gets(str); fun(str);

printf(\}

4.

void swap(int *p1,int *p2) {

int *t;

t=p1,p1=p2,p2=t;

printf(\}

main() {

int x=10,y=20; swap(&x,&y);

printf(\}

5.

#include

void fun(int *s, int m, int n) {

int t;

while(m

{t=s[m]; s[m]=s[n]; s[n]=t; m++; n--;}

35

}

main() {

Int a[5]={1,2,3,4,5},k; fun(a,0,4);

for(k=0;k<5;k++) printf(\ \}

6.

int fun(char s[]) {

int n=0;

while(*s<='9'&&*s>='0') {

n=10*n+*s-'0'; s++; }

return(n); }

main() {

char s[10]={'6','1','*','4','*','9','*','0','*'}; printf(\}

7.

#include Int fun(int x) {

int y;

if(x==0||x==1) return(3); y=x*x-fun(x-2) return y; }

main() {

int x,y;

x=fun(3); y=fun(4);

printf(\}

8.

fun(int n,int *s) {

int f1, f2;

if(n==1 || n==2) *s=1;

36

else {

fun(n-1, &f1); fun(n-2, &f2); *s=f1+f2; } }

main() {

int x;

fun(6,&x);

printf(\}

三、填空题

1. 以下程序实现了计算x的n次方,请将程序填写完整。

float power(float x,int n) { int i;

float t=1;

for(i=1;i<=n;i++) t=t*x; 【1】; }

main( )

{ float x,y; int n; scanf(\ y=power(x,n); printf(\}

2. 以下程序实现了求两个数的最大公约数,请将程序填写完整。

int divisor(int a,int b) { int r; r=a%b;

while(【2】)

{ a=b;b=r;r=a%b;} return b; }

void main() { int a,b,d,t;

scanf(\if (a

{ t=a; a=b; b=t; } d=divisor(a,b);

printf(\}

3. 以下函数my_cmp( )的功能是比较字符串s和t的大小,当s等于t时返回0,否则返回s和t的第一

37

个不同字符的ASCII码差值,即s>t时返回正值,s

my_cmp(char *s,char *t) {

while(*s == *t) {

if (【3】) return 0; ++s; ++t; }

return 【4】; }

4. 以下程序的功能是:删去一维数组中所有相同的数,使之只剩一个。数组中的数已按由小到大的顺序排列,

函数返回删除后数组中数据的个数。请将程序填写完整。

例如,若一维数组中的数据是: 2 2 2 3 4 4 5 6 6 6 6 7 7 8 9 9 10 10 10 删除后,数组中的内容应该是: 2 3 4 5 6 7 8 9 10。

#include #define N 80

int fun(int a[], int n) { int i,j=1;

for(i=1;i

main( ) {

int a[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10},i,n=19; printf(\ for(i=0;i

printf(\ for(i=0; i

四、编程题

1. 请用自定义函数的形式编程实现,求s=m!+n!+k!,m、n、k从键盘输入(值均小于7)。 2. 请用自定义函数的形式编程实现求10名学生1门课程成绩的平均分。

3. 请编写两个自定义函数,分别实现求两个整数的最大公约数和最小公倍数,并用主函数调用这两个函

数,输出结果(两个整数由键盘输入得到)。 4. 已知二阶Fibonacci数列: 0 Fib(n) 若n=0 1 若n=1 Fib(n-1)+Fib(n-2) 其他情况

请编写一个递归函数,实现求Fib(n)。

38

参考答案

一、选择题

1. B 2. 11. A 12. 21. A 22. C 3. B A 13. C D 23. C 4. B 5. 14. D 15. 24. B 25. C 6. D 7. D 8. C 9. D 10. D D 16. C 17. B 18. A 19. A 20. A A 26.【1】A 26.【2】D 27.【1】B 27.【2】D 27.【3】C 28.【1】D 28.【2】C 30. A 31. D 32.【1】B 32.【2】A 33.【3】A 34.【1】D 34.【2】C 35.【1】C 36.【1】D 36.【2】B 36.【3】A 37.【1】A 38.【1】C 38.【2】B 38.【3】A 39.【1】C 40.【1】C 40.【2】B

40.【3】D

二、读程序写结果:

1. 31

2. 15

3. asd af aa z67 4. *p1=20,*p2=10 x=10,y=20

5. 5 4 3 2 1 6. 61 7. 6,15 8.

8

三、填空题

1.【1】 return t 2.【2】 r!=0

3.【3】 *s == ?\\0? 【4】 *s-*t 4.【5】 != 【6】 j

四、编程题

1.

#include long fun(int x) { long y=1; while(x>0) { y*=x; x--; } return(y); }

main() { int m,n,k;

printf(\scanf(\

printf(\}

2.

#include #define N 10

29.【1】C 33.【1】C 35.【2】A 37.【2】B 39.【2】B 29.【2】D 33.【2】B 35.【3】B 37.【3】A 39.【3】A 39

float average(float array[]) { int i=0; float s=0;

for(i=0;i

main()

{ float score[N],i; float ave;

printf(\ for(i=0;i

scanf(\ ave=average(score);

printf(\} 3.

#include int divisor(int a,int b) { int r; while((r=a%b)!=0) { a=b; b=r; } return b; }

int multiple(int a,int b) { int d; d=divisor(a,b); return a*b/d; }

void main() { int a,b,c,d; printf(\ \ scanf(\ c=divisor(a,b); d=multiple(a,b); printf(\} 4.

#include int fib(int n) { int p; if(n==0) p=0; else if(n==1) p=1; else p=fib(n-1)+fib(n-2);

40

return p; }

void main() { int n; printf(\ \ scanf(\ printf(\}

一、选择题

1. 变量的指针,其含义是指该变量的_________. a)值 b)地址 c)名 d)一个标志

2.若有语句int *point,a=4;和point=&a;下面均代表地址的一组选项是_____.

a)a,point,*&a b)&*a,&a,*point c)*&point,*point,&a d)&a,&*point ,point

3.若有说明;int *p,m=5,n;以下正确的程序段的是________. a)p=&n; b)p=&n;

scanf(\ scanf(\ c)scanf(\ d)p=&n; *p=n; *p=m;

4. 以下程序中调用scanf函数给变量a输入数值的方法是错误的,其错误原因是________. main() {

int *p,*q,a,b; p=&a;

printf(“input a:”); scanf(“%d”,*p); ?? }

a)*p表示的是指针变量p的地址

b)*p表示的是变量a的值,而不是变量a的地址 c)*p表示的是指针变量p的值 d)*p只能用来说明p是一个指针变量

5. 已有变量定义和函数调用语句:int a=25; print_value(&a); 下面函数的正确输出结果是________.

void print_value(int *x) { printf(“%d\\n”,++*x);}

a)23 b)24 c)25 d)26

41

6.若有说明:long *p,a;则不能通过scanf语句正确给输入项读入数据的程序段是 A) *p=&a; scanf(\,p);

B) p=(long *)malloc(8); scanf(\,p); C) scanf(\,p=&a); D) scanf(\,&a);

7.有以下程序

#include main()

{ int m=1,n=2,*p=&m,*q=&n,*r; r=p;p=q;q=r;

printf(\}

程序运行后的输出结果是 A)1,2,1,2 C)2,1,2,1

8. 有以下程序

main()

{ int a=1, b=3, c=5;

int *p1=&a, *p2=&b, *p=&c; *p =*p1*(*p2); printf(\}

执行后的输出结果是 A)1

9. 有以下程序

main()

{ int a,k=4,m=4,*p1=&k,*p2=&m;

a=p1==&m; printf(\}

程序运行后的输出结果是() A)4

10. 在16位编译系统上,若有定义int a[]={10,20,30}, *p=&a;,当执行p++;后,下列说法错误的是()

A)p向高地址移了一个字节 C)p向高地址移了两个字节

42

B)1,2,2,1 D)2,1,1,2

B)2 C)3 D)4

B)1 C)0 D)运行时出错,无定值

B)p向高地址移了一个存储单元 D)p与a+1等价

11.有以下程序段

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 C)8 D)9

12.若有以下定义,则对a数组元素的正确引用是_________. int a[5],*p=a;

a)*&a[5] b)a+2 c)*(p+5) d)*(a+2)

13.若有以下定义,则p+5表示_______.

int a[10],*p=a;

a)元素a[5]的地址 b)元素a[5]的值 c)元素a[6]的地址 d)元素a[6]的值

14.设已有定义: int a[10]={15,12,7,31,47,20,16,28,13,19},*p; 下列语句中正确的是() A) for(p=a;a<(p+10);a++); B) for(p=a;p<(a+10);p++); C) for(p=a,a=a+10;p

15.有以下程序段 #include int main()

{ int x[] = {10, 20, 30}; int *px = x;

printf(\ printf(\ px = x;

printf(\ printf(\ px = x;

printf(\ printf(\ px = x;

printf(\ printf(\ return 0; }

程序运行后的输出结果是( ) A)11,11,11,12,12,20,20,20 B)20,10,11,10,11,10,11,10

C)11,11,11,12,12,13,20,20 D)20,10,11,20,11,12,20,20

16.设有如下定义: int arr[]={6,7,8,9,10}; int *ptr; ptr=arr;

*(ptr+2)+=2;

43

printf (\则程序段的输出结果为

A)8,10 B)6,8 C)7,9 D)6,10

17.若有定义:int a[]={2,4,6,8,10,12},*p=a;则*(p+1)的值是______. *(a+5)的值是_________.

18.若有以下说明和语句,int c[4][5],(*p)[5];p=c;能正确引用c数组元素的是______. A) p+1 B) *(p+3) C) *(p+1)+3 D) *(p[0]+2))

19.若有定义:int a[2][3],则对a数组的第i行j列元素地址的正确引用为______. a)*(a[i]+j) b)(a+i) c)*(a+j) d)a[i]+j

20.若有以下定义:int a[2][3]={2,4,6,8,10,12};则a[1][0]的值是_____. *(*(a+1)+0)的值是________.

21.有以下定义 char a[10],*b=a;

不能给数组a输入字符串的语句是()

A)gets(a) B)gets(a[0]) C)gets(&a[0]); D)gets(b);

22.下面程序段的运行结果是_________. char *s=\ s+=2;printf(\

a)cde b)字符'c' c)字符'c'的地址 d)无确定的输出结果

23.以下程序段中,不能正确赋字符串(编译时系统会提示错误)的是() A) char s[10]=\

C) char s[10];s=\

24.设已有定义: char *st=\下列程序段中正确的是() A) char a[11], *p; strcpy(p=a+1,&st[4]); B) char a[11]; strcpy(++a, st); C) char a[11]; strcpy(a, st);

D) char a[], *p; strcpy(p=&a[1],st+2);

25.有以下程序 main() {

char a[]=\char *p1,*p2; int i;

44

p1=a;p2=b; for(i=0;i<7;i++) if(*(p1+i)==*(p2+i)) printf(\}

输出结果是()

A)gm B)rg C)or D)ga

26.设p1和p2是指向同一个字符串的指针变量,c为字符变量,则以下不能正确执行的赋值语句是________.

a)c=*p1+*p2; b)p2=c c)p1=p2 d)c=*p1*(*p2);

27.以下正确的程序段是_________.

a)char str[20]; b)char *p;

scanf(\ scanf(\

c)char str[20]; d)char str[20],*p=str; scanf(\ scanf(\

28.若有说明语句

char a[]=\ char *p=\

则以下不正确的叙述是________.

a)a+1表示的是字符t的地址

b)p指向另外的字符串时,字符串的长度不受限制 c)p变量中存放的地址值可以改变 d)a中只能存放10个字符

29.下面程序的运行结果是_______. #include #include main()

{ char *s1=\

char *s2=\ s1+=2;s2+=2;

printf(\ }

a)正数 b)负数 c)零 d)不确定的值

30.有以下程序 void f(int *x,int *y) { int t;

t=*x;*x=*y;*y=t;

45

}

main() {

int a[8]={1,2,3,4,5,6,7,8},i,*p,*q; p=a;q=&a[7];

while(*p!=*q){f(p,q);p++;q--;} for(i=0;i<8;i++) printf(\ }

程序运行后的输出结果是______。

A)8,2,3,4,5,6,7,1, B)5,6,7,8,1,2,3,4, C)1,2,3,4,5,6,7,8, D)8,7,6,5,4,3,2,1,

31. 已定义以下函数 fun (int *p) { return *p; } 该函数的返回值是

A) 不确定的值 B) 形参p中存放的值

C) 形参p所指存储单元中的值 D) 形参p的地址值

32. 有以下程序 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 C) 18 D) 16

33.若有以下函数首部 int fun(double x[10], int *n)

则下面针对此函数的函数声明语句中正确的是 A)int fun(double x, int *n); B)int fun(double , int ); C)int fun(double *x, int n); D)int fun(double *, int *);

34.有以下程序 void sum(int *a) { a[0]=a[1];} main( )

{ int aa[10]={1,2,3,4,5,6,7,8,9,10},i;

46

for(i=2;i>=0;i--) sum(&aa[i]); printf(\}

执行后的输出结果是()

A)4 B)3 C)2 D)1

35.下段代码的运行结果是: int main() {

char a;

char *str=&a; strcpy(str,\printf(str); return 0; }

A)hello B)null C)h D)发生异常

36.下段程序的运行结果是 : void main() {

char *p,*q;

char str[]=\q = p = str; p++; print(q); print(p); }

void print(char *s) {

printf(“%s”,s); }

A)H e

B)Hello,World ello,World C)Hello,World Hello,World D)ello,World ell,World

37.有以下程序 void fun(char *c,int d) {

*c=*c+1; d=d+1;

printf(\}

void main() {

char a='A',b='a'; fun(&b,a);

printf(\

47

}

程序运行后的输出结果是______。

A) B,a,B,a B) a,B,a,B C) A,b,A,b D) b,B,A,b

38、下面选项属于函数指针的是:

A、(int*)p(int, int) B、int *p(int, int) C、两者都是 D、两者都不是

39、若有函数max(a,b),并且已使函数指针变量p指向函数max,当调用该函数时,正确的调用方法是_______.

A)(*p)max(a,b); B)*pmax(a,b); C) (*p)(a,b); D) *p(a,b);

40、下面几个选项中的代码能通过编译的是 : A)int* fun() { int s[3]={1,3,4};; return s; }

int main() { int * result; result = fun(); for(int i =0;i<3;i++) printf(\ return 0; }

B)int& fun() { int s[3]={1,3,4};; return s; }

int main() { int * result; result = fun(); for(int i =0;i<3;i++) printf(\ return 0; }

C)int* fun() { int s[3]={1,3,4};; return &s; }

int main()

48

{ int * result; result = fun(); for(int i =0;i<3;i++) printf(\ return 0; }

D)int& fun() { int s[3]={1,3,4};; return &s; }

int main() { int * result; result = fun(); for(int i =0;i<3;i++) printf(\ return 0; }

41、下列选项中声明了一个指针数组的是: A)int *p[2]; B)int (*p)[2]; C)typedef int* intPtr; intPtr p[2]; D)A和B E)A和C F)B和C

42、下面代码能通过编译的是: A)int main() { int a[3]={1,2,3}; int *b[3]={&a[1],&a[2],&a[3]}; int **p = b; return 0; }

B)int main() { int a[3]={1,2,3}; int *b[3]={a[1],a[2],a[3]}; int **p = b; return 0; }

C)int main() { int a[3]={1,2,3}; int *b[3]={&a[1],&a[2],&a[3]};

49

int *p = b; return 0; }

D)int main() { int a[3]={1,2,3}; int *b[3]={&a[1],&a[2],&a[3]}; int *p = &b; return 0; }

43、对于语句int *pa[5];下列描述中正确的是_______.

A) pa是一个指向数组的指针,所指向的数组是5个int型元素 B) pa是一个指向某数组中第5个元素的指针,该元素是int型变量 C) pa [5]表示某个元素的第5个元素的值

D) pa是一个具有5个元素的指针数组,每个元素是一个int型指针

44、若有以下定义,且0≤i<4,则不正确的赋值语句是_______. int b[4][6], *p, *q[4];

A) q[i] = b[i]; B) p = b;

C) p = b[i] D) q[i] = &b[0][0];

45、若要对a进行++运算,则a应具有下面说明_______. A) int a[3][2]; B) char *a[ ] = {“12”,”ab”}; C) char (*a)[3]; D) int b[10], *a = b;

46、若有以下说明语句:

char *language[ ] = {“FORTRAN”,”BASIC”,??PASCAL”,??JAVA”,”C”}; char **q;

q = language + 2;

则语句printf(“%o\\n”, *q) 输出的是_______. A) language[2]元素的地址; B)字符串PASCAL

C) language[2]元素的值,它是字符串PASCAL的首地址 D)格式说明不正确,无法得到确定的输出

47、若有以下程序: void main() {

char *a[3] = {\ char **ptr = a;

printf(\ %s\}

这段程序的输出是() A) I l B) o o C)o love D) I love

50

本文来源:https://www.bwwdw.com/article/6988.html

Top