第2部分
C语言程序设计习题与解答
题解1 绪论
1.1 习题
一、选择题
1.一个完整的可运行的C源程序中(B )。
A.可以有一个或多个主函数B.必须有且仅有一个主函数
C.可以没有主函数D.必须有主函数和其他函数
2.构成C语言源程序的基本单位是(D )。
A.子程序B.过程C.文本D.函数
3.某C程序由一个主函数main( )和一个自定义函数max( )组成,则该程序( D )。
A.总是从max( )函数开始执行B.写在前面的函数先开始执行
C.写在后面的函数先开始执行D.总是从main( )函数开始执行
4.C语言规定,一个C源程序的主函数名必须为(C )。
A.program B.include C.main D.function
5.下列说法正确的是(C)。
A.在书写C语言源程序时,每个语句以逗号结束
B.注释时,'/'和'*'号间可以有空格
C.无论注释内容的多少,在对程序编译时都被忽略
D.C程序每行只能写一个语句
6.C语言源程序文件的后缀是( C ),经过Compile后,生成文件的后缀是( A ),经过Build后,生成文
件的后缀是(B)。
A..obj B..exe C..c D..doc
7.Visual C++ 6.0 IDE的编辑窗口的主要功能是(A ),输出窗口的主要功能是(D ),调试器(Debug)的主要功能是(C)。
A.建立并修改程序B.将C源程序编译成目标程序
C.跟踪分析程序的执行D.显示编译结果信息(如语法错误等)
8.在Visual C++ 6.0开发环境下,C程序按工程(project)进行组织,每个工程可包括(D)C/CPP源文件,但只能有( A )main 函数。
A.1个B.2个
C.3个D.1个以上(含1个)
9.调试程序时,如果某个语句后少了一个分号,调试时会提示错误,这种情况一般称之为(A )。而某个“计算2的平方”的程序
在调试时没有提示出错,而且成功执行并计算出了结果,只是结果等于5,这种情况一般称之为(D)。
A.语法错误B.正常情况
C.编译器出错D.逻辑设计错误
二、简答题
1.如何使用注释语句?使用注释有何好处?
2.C程序对书写格式有何要求?规定书写格式有何好处?符号名包括模块名、常量名、标号名、子程序名等。这些名字应该能反映它所代表的实际东西,具有一定的意义,使其能够见名知义,有助于对程序功能的理解
3.简述C程序上机调试的一般步骤?编辑,编译,连接,运行
4.简述C程序从.c源文件到.exe可执行文件的生成过程?
第一步是预处理,包括语法检查等工作。
gcc -P abc.c
第二步由源程序生产汇编语言代码。
gcc -S abc.c
会生成abc.s文件,这个文件里就是汇编代码。
第三步编译器生成目标代码,一个源文件生成一个目标代码。
gcc -c abc.c
会生成abc.o
第四步连接器从目标代码生成可执行文件。
gcc abc.o
题解2 基本数据类型与运算符
2.1 习题
一、选择题
1.C语言中最基本的非空数据类型包括( D )。
A.整型、浮点型、无值型B.整型、字符型、无值型
C.整型、浮点型、字符型D.整型、浮点型、双精度型、字符型
2.C语言中运算对象必须是整型的运算符是( A )。
A.% B./ C.= D.〈= 3.若已定义x和y为int类型,则执行了语句x=1;y=x+3/2;后y的值是( B )。
A.1 B.2C.2.0 D.2.5 4.若有以下程序段:
int a=1,b=2,c;
c=1.0/b*a;
则执行后,c中的值是( A )。
A.0 B.0.5 C.1 D.2 5.能正确表示逻辑关系:"a≥10或a≤0"的C语言表达式是( D )。
A.a>=10 or a<=0 B.a>=0|a<=10
C.a>=10 && a<=0 D.a>=10‖a<=0
6.下列字符序列中,不可用作C语言标识符的是( B )。
A.xds426 B.No.1 C._ok D.zwd 7.在printf( )函数中,反斜杠字符'\'表示为( D )。
A.\' B.\0 C.\n D.\\ 8.设先有定义:
int a=10;
则表达式a+=a *=a的值为( D )。
A.10 B.100 C.1000 D.200 9.设先有定义:
int a=10;
则表达式(++a)+(a --)的值为( C )。
A.20 B.21 C.22 D.19 10.有如下程序:
#include
main( )
{
int y=3,x=3,z=1;
printf("%d %d\n",(++x,y++),z+2);
}
运行该程序的输出结果是( D )。
A.3 4 B.4 2 C.4 3 D.3 3 11.假定x、y、z、m均为int型变量,有如下程序段:
x=2; y=3; z=1;
m=(y m=(z 则该程序运行后,m的值是( C )。 A.4 B.3 C.2 D.1 12.以下选项中合法的字符常量是( B )。 A."B" B.'\010' C.68 D.D 13.设x=3,y=4,z=5,则表达式((x+y)>z)&&(y==z)&&x||y+z&&y+z的值为( B ) A.0 B.1 C.2 D.3 ((x+y)>z)&&(y==z)&&x||(y+z)&&(y+z)=1&&0&&3||9&&9=0||1=1 14.如果a=1,b=2,c=3,d=4,则条件表达式a A.1 B.2 C.3 D.4 15.设int m=1,n=2; 则m++==n的结果是( A )。 A.0 B.1 C.2 D.3 二、填空题 1.表达式10/3的结果是 3 ;10%3的结果是 1 。 2.执行语句:int a=12;a+=a-=a*a;后的值是-264 。 3.以下语句的输出结果是-1 。 short b=65535; printf("%d",b); 4.以下程序的执行结果是X=3,a=2,b=2 。 #include main( ) { int a,b,x; x=(a=3,b=a--); printf("x=%d,a=%d,b=%d\n",x,a,b); } 5.以下程序的执行结果是0 。 #include main( ) { float f1,f2,f3,f4; int m1,m2; f1=f2=f3=f4=2; m1=m2=1; printf("%d\n",(m1=f1>=f2)&&(m2=f3 } 6.以下程序的执行结果是n=1 。 #include main( ) { float f=13.8; int n; n=(int)f%3; printf("n=%d\n",n); } 三、简答题 2.简述转义字符的用途并举实例加以说明。 题解3 控制结构 3.1 习题 一、选择题 1.结构化程序模块不具有的特征是( B )。 A.只有一个入口和一个出口 B.要尽量多使用goto语句 C.一般有顺序、选择和循环3种基本结构 D.程序中不能有死循环 2.C语言中,逻辑“真”等价于( C )。 A.整数1 B.整数0 C.非0数D.TRUE 3.以下4条语句中,有语法错误的是( D )。 A.if (a>b) m=a; B.if (a C.if ((a=b)>=0) m=a; D.if ((a=b;)>=0) m=a; 4.若i,j均为整型变量,则以下循环*( C )。 for (i=0,j=2; j=1; i++,j--) printf("%5d, %d\n", i, j); A.循环体只执行一次B.循环体执行二次 C.是无限循环D.循环条件不合法 5.以下程序段,执行结果为( A )。 a=1; do {a=a*a; } while(!a); A.循环体只执行一次B.循环体执行二次 C.是无限循环D.循环条件不合法 6.C语言中while与do-while语句的主要区别是( A )。 A.do-while的循环体至少无条件执行一次 B.do-while允许从外部跳到循环体内 C.while的循环体至少无条件执行一次 D.while的循环控制条件比do-while的严格 7.语句while (!a);中条件等价于( D )。 A.a!=0 B.~a C.a==1 D.a==0 8.以下程序的运行结果为( D )。 #include main( ) { int i=1,sum=0; while(i<=100) sum+=i; i++; printf("1+2+3+...+99+100=%d", sum); } A.5050 B.1 C.0 D.程序陷入死循环9.以下程序的运行结果为( A )。 #include main( ) { int sum,pad; sum=pad=5; pad=sum++; pad++; ++pad; printf("%d\n", pad); } A.7 B.6 C.5 D.4 10.以下程序的运行结果为( D )。 #include main( ) { int a=2,b=10; printf("a=%%d,b=%%d\n", a,b); } A.a=%2,b=%10 B.a=2,b=10 C.a=%%d,b=%%d D.a=%d,b=%d 11.为了避免嵌套的if-else语句的二义性,C语言规定else总是( C )。 A.与缩排位置相同的if组成配对关系 B.与在其之前未配对的if组成配对关系 C.与在其之前未配对的最近的if组成配对关系 D.与同一行上的if组成配对关系 12.对于for (表达式1; ;表达式3)可理解为( B )。 A.for (表达式1; 0 ;表达式3) B.for (表达式1; 1 ;表达式3) C.for (表达式1;表达式1;表达式3) D.for (表达式1;表达式3;表达式3) 二、程序填空 1.下面程序的功能是计算n!。 #include main ( ) { int i, n; long p; printf ( "Please input a number:\n" ); scanf ("%d", &n); p= 1 ; for (i=2; i<=n; i++) p*=i或p=p*i ; printf("n!=%ld", p); } 2.下面程序的功能是:从键盘上输入若干学生的成绩,统计并输出最高和最低成绩,当输入负数时结束输入。 #include main ( ) { float score, max, min; printf ( "Please input one score:\n" ); scanf ("%f", &score); max=min=score; while ( score>=0 ) { if (score>max) max=score; if ( score printf ( "Please input another score:\n" ); scanf ("%f", &score); } printf("\nThe max score is %f\nThe min score is %f", max, min); } 3.下面程序的功能是:计算y=的值。要求从键盘上输入x的值,精度控制在0.00001内。 #include #include main ( ) { float x , y=0, fz=-1, fm=-1, temp=1; printf ( "Please input the value of x:\n" ); scanf ("%f", &x); while ( abs(temp)>0.00001 ) { fz= 【6】-fz*x ; fm=fm+2; temp=fz/fm; y+=temp; } printf("\ny= %f", y); } 4.下面的程序完成两个数的四则运算。用户输入一个实现两个数的四则运算的表达式,程序采用switch语句对其运算进行判定后执行相应的运算并给出结果。 #include main( ) { float x,y; char op; printf("Please input Expression:"); scanf("%f%c%f",&x,&op,&y); 【7】switch (op) { case '+': printf("%g%c%g=%g\n", 【8】x,op,y,x+y); 【9】break ; case '-': printf("%g%c%g=%g\n",x,op,y,x-y); break; case '*': printf("%g%c%g=%g\n",x,op,y,x*y); break; case '/': if ( 【10】(y>=-1e-6)&&(y<=1e-6) ) printf("Division Error!\n"); else printf("%g%c%g=%g\n",x,op,y,x/y); break; default:printf("Expression Error!\n"); } } 题解4 函数 4.1 习题 一、选择题 1.C语言中函数形参的缺省存储类型是( B )。 A.静态(static)B.自动(auto) C.寄存器(register)D.外部(extern) 2.函数调用语句function((exp1,exp2), 18)中含有的实参个数为( C )。 A.0 B.1 C.2 D.3 3.下面函数返回值的类型是( D )。 square(float x) { return x*x; } A.与参数x的类型相同B.是void型 C.无法确定D.是int型 4.C语言规定,程序中各函数之间( D )。 A.不允许直接递归调用,也不允许间接递归调用 B.允许直接递归调用,但不允许间接递归调用 C.不允许直接递归调用,但允许间接递归调用 D.既允许直接递归调用,也允许间接递归调用 5.一个函数返回值的类型取决于( C )。 A.return语句中表达式的类型B.调用函数时临时指定 C.定义函数时指定或缺省的函数类型D.调用该函数的主调函数的类型 6.下面叙述中,错误的是( C )。 A.函数的定义不能嵌套,但函数调用可以嵌套 B.为了提高可读性,编写程序时应该适当使用注释 C.变量定义时若省去了存储类型,系统将默认其为静态型变量 D.函数中定义的局部变量的作用域在函数内部 7.在一个源程序文件中定义的全局变量的有效范围为( C )。 A.一个C程序的所有源程序文件B.该源程序文件的全部范围 C.从定义处开始到该源程序文件结束D.函数内全部范围 8.某函数在定义时未指明函数返回值类型,且函数中没有return语句,现若调用该函数,则正确的说法是( D )。 A.没有返回值B.返回一个用户所希望的值 C.返回一个系统默认值D.返回一个不确定的值 9.函数swap(int x, int y)可实现对x和y值的交换。在执行如下定义及调用语句后,a和b的值分别为( B )。 int a=10, b=20; swap (a,b ); A.10和10 B.10和20C.20和10 D.20和20 10.下面错误的叙述是( D )。 A.在某源程序不同函数中可以使用相同名字的变量 B.函数中的形式参数是局部变量 C.在函数内定义的变量只在本函数范围内有效 D.在函数内的复合语句中定义的变量在本函数范围内有效 二、程序填空 1.求s=1!+2!+3!+…+10!之和。 程序如下: #include long int factorial(int n) { int k=1; long int p=1; for(k=1; k<=n; k++) 【1】p=p*k; ; return p; } main( ) { int n; float sum=0; for(n=1;n<=10;n++) 【2】sum=sum+factorial(n); ; printf("%6.3f\n",sum); } 2.以下函数用以求x的y次方。 double fun (double x, int y) { int i; double m=1; for ( i=1; i 【3】<=y或 m= 【4】m*x ; return m; } 三、阅读程序并写出运行结果 1.下面程序运行的结果是_____2,4,,6,8________: #include #define MAX_COUNT 4 void fun( ); main( ) { int n; for(n=1; n<=MAX_COUNT; n++) fun( ); } void fun( ) { static int k; k=k+2; printf ("%d,", k); } 4.下面程序运行的结果是___8,17______: #include int fun(int x, int y) { static int m=0, n=2; n+=m+1; m=n+x+y; return m; } main( ) { int j=4, m=1, k; k=fun(j, m); printf ("%d,", k); k=fun(j,m); printf("%d\n", k); } 题解5 数组 5.1 习题 一、选择题 1.在下列数组定义、初始化或赋值语句中,正确的是( C )。 A.int a[8]; a[8]=100; B.int x[5]={1,2,3,4,5,6}; C.int x[ ]={1,2,3,4,5,6}; D.int n=8; int score[n]; 2.若已有定义:int i, a[100]; 则下列语句中不正确的是( C )。 A.for ( i=0; i<100; i++ ) a[i]=i; B.for ( i=0; i<100; i++ ) scanf ( "%d", &a[i] ); C.scanf ("%d", &a); D.for ( i=0; i<100; i++ ) scanf ( "%d", a+i ); 3.与定义char c[ ]={"GOOD"}; 不等价的是( C )。 A.char c[ ]={ 'G', 'O', 'O', 'D', '\0'}; B.char c[ ]="GOOD"; C.char c[4]={"GOOD"}; D.char c[5]={ 'G', 'O', 'O', 'D', '\0'}; 4.若已有定义:char c[8]={"GOOD"}; 则下列语句中不正确的是( D )。 A.puts (c); B.for ( i =0; c[i]!= '\0'; i ++ ) printf ("%c", c[i]); C.printf ("%s", c); D.for ( i =0; c[i]!= '\0'; i ++ ) putchar ( c ); 5.若定义a[ ][3]={0,1,2,3,4,5,6,7}; ,则a数组中行的大小是( B )。 A.2 B.3 C.4 D.无确定值 6.以下程序的运行结果是( B )。 #include void f ( int b[ ] ) { int i=0; while(b[i]<=10) { b[i]+=2; i++; } } main( ) { int i, a[ ]={ 1, 5,10, 9,13, 7}; f (a+1); for(i=0; i<6; i++) printf("%4d ", a[i]); } A.2 7 12 11 13 9 B.1 7 12 11 13 7 C.1 7 12 11 13 9 D.1 7 12 9 13 7 7.若执行以下程序段,其运行结果是( D )。 char c[ ]={'a', 'b', '\0', 'c', '\0'}; printf ( "%s\n", c ); A.ab c B.'a''b' C.abc D.ab 8.数组名作为参数传递给函数,作为实际参数的数组名被处理为( D )。 A.该数组长度B.该数组元素个数 C.该函数中各元素的值D.该数组的首地址 9.执行下面的程序段后,变量k中的值为( D )。 int k=3, s[2]={1}; s[0]=k; k=s[1]*10; A.不定值B.33 C.30 D.0 10.在定义 int a[5][4]; 之后;对a的引用正确的是( C )。 A.a[2][4] B.a[5][0] C.a[0][0] D.a[0,0] 11.当接受用户输入的含空格的字符串时,应使用函数( B )。 A.scanf( ) B.gets( ) C.getchar( ) D.getc( ) 二、程序填空 1.以下程序用来检查二维数组是否对称(即对所有i,j都有a[i][j]=a[j][i])。 #include main ( ) { int a[4][4]={1,2,3,4, 2,2,5,6, 3,5,3,7, 8,6,7,4}; int i, j, found=0; for ( j=0; j<4; j++ ) { for (i=0; i<4; i++ ) if ( 【1】【1】a[i][j]!=a[j][i] ) { found= 【2】1 ; break; } if (found) break; } if (found) printf ("不对称\n"); else printf("对称\n"); 2.以下程序是用来输入5个整数,并存放在数组中,找出最大数与最小数所在的下标位置,并把两者对调,然后输出调整后的5个数。 #include main ( ) { int a[5], t, i, maxi, mini; for ( i=0; i<5; i++ ) scanf ( "%d", &a[i] ); mini=maxi= 【3】0; for ( i=1; i<5; i++ ) { if( 【4】a[mini]>a[i] ) mini=i; if ( a[i]>a[maxi] ) 【5】maxi=i ; } printf ( "最小数的位置是:%3d\n", mini ); printf ( "最大数的位置是:%3d\n", maxi ); t=a[maxi]; 【6】a[maxi]=a[mini] ; a[mini]=t; printf ( "调整后的数为: " ); for ( i=0; i<5; i++ ) printf ( "%d ", a[i] ); printf ("\n"); } 3.给定一3 x 4的矩阵,求出其中的最大元素值,及其所在的行列号: main( ) { int i,j,row=0,colum=0,max; static int a[3][4]={{1,2,3,4},{9,8,7,6},{10,-10,-4,4}}; 【7】max=a[0][0] ; for(i=0;i<=2;i++) for(j=0;j<=3;j++) { 【8】if (a[i][j]>max) ; 【9】{max=a[i][j]; row=i;colum=j;} ; } printf("max=%d,row=%d,colum=%d",max,row,colum); } 4.下述函数用于确定给定字符串的长度,请完成程序。 strlen ( char s[ ] ) { int i=0; while ( 【10】s[i]!= '\0' return ( 【11】i ); } 5.以下程序的功能是从键盘上输入若干个字符(以回车键作为结束)组成一个字符数组,然后输出该字符数组中的字符串,请填空。 #include main ( ) { char str[81]; int i; for ( i=0; i<80; i++ ) { str[i]=getchar( ); if (str[i]== '\n') break; } str[i]= '\0'; 【12】i=0 ; while ( str[i]!= '\0' ) putchar( 【13】str[i++] ); } 三、阅读程序并写出运行结果 1.写出下列程序的运行结果并分析。 #include main( ) { static int a[4][5]={{1,2,3,4,0},{2,2,0,0,0},{3,4,5,0,0},{6,0,0,0,0}}; int j,k; for (j=0;j<4;j++) { for(k=0;k<5;k++) { if (a[j][k]==0) break; printf(" %d",a[j][k]); } } printf("\n"); } 2.写出下列程序的运行结果并分析。 #include main ( ) { int a[6][6],i,j; for (i=1 ;i<6 ; i++) for ( j=1;j<6;j++) a[i][j]= i*j; for (i=1 ;i<6 ; i++) { for ( j=1;j<6;j++) printf( " %-4d " ,a[i][j] ) ; printf("\n"); } } 3.写出下列程序的运行结果并分析。 #include main ( ) { int a[ ]={1,2,3,4},i,j,s=0; j=1; for ( i=3;i<=0;i-- ) { s=s+a[i]*j; j=j*10; } printf("s=%d\n",s); } 4.写出下列程序的运行结果并分析。 #include main( ) { int a[]={0,2,5,8,12,15,23,35,60,65}; int x=15,i,n=10,m; i=n/2+1; m=n/2; while(m!=0) {