第一部分 习 题 解 答 第1章参考答案 一、单项选择题 1.面向过程的程序设计语言是________。 A.机器语言 B.汇编语言 C.高级语言 D.第四代语言 答:C。 2.程序设计一般包含以下4个步骤,其中首先应该完成的是________。 A.设计数据结构和算法 B.建立数学模型 C.编写程序 D.调试运行程序 答:B。 3.以下不属于算法基本特征的是________。 A.有穷性 B.有效性 C.可靠性 D.有一个或多个输出 答:C。 4.下面描述中,正确的是________。 A.结构化程序设计方法是面向过程程序设计的主流 B.算法就是计算方法 C.一个正确的程序就是指程序书写正确 D.计算机语言是编写程序的工具而不是表示算法的工具 答:A。 5.N-S图与传统流程图相比较,其主要优点是________。 A.杜绝了程序的无条件转移 B.具有顺序、选择和循环三种基本结构 C.简单、直观 D.有利于编写程序 答:A。 6.以下说法正确的是________。 A.结构化程序设计是为了解决如何充分发挥硬件的效率 B.结构化程序设计是为充分发挥程序员的个人技巧提供了方法 C.结构化程序设计认为好的程序只能使用顺序,选择和循环等基本程序结构 D.结构化程序设计采用自底向上的方法 答:C。 二、填空题 1.在流程图符号中,判断框中应该填写的是 条件。 2.结构化程序设计是 面向过程编程 应遵循的方法和原则。 3.结构化程序必须用 结构化 程序设计语言来编写。 4.可以被连续执行的一条条指令的集合称为计算机的 程序。 5.算法的 有穷性 特征是指:一个算法必须在执行有限个操作步骤后终止。 6.在三种基本结构中,先执行后判断的结构称为 直到型循环结构。 7.在程序设计中,把解决问题确定的方法和有限的步骤称为 算法。 8.程序设计风格主要影响程序的 可读性。 9.用模块组装起来的程序被称为 模块化结构程序。 10.采用自上而下,逐步求精的设计方法便于 对问题的求解和模块的划分。 三、应用题 1.用传统流程图表示下列算法。 (1)依次将10个数输入,要求将其中最大的数输出。 解:流程图如图1-1所示。 (2)有3个数x,y,z,要求按大小顺序进行输出。 解:流程图如图1-2所示。 (3)求1+1/2+1/3+…+1/100的值。 解:流程图如图1-3所示。 图1-1 第(1)题流程图 图1-2 第(2)题流程图 图1-3 第(3)题流程图 (4)求方程式ax2+bx+c=0的根。 解:流程图如图1-4所示。 图1-4 第(4)题流程图 (5)判断一个整数n能否同时被3和7整除。 解:流程图如图1-5所示。 (6)求某门课全班的平均分。 解:流程图如图1-6所示。 2.用N-S图表示题1中各小题的算法。 解:略。 图1-5 第(5)题流程图 图1-6 第(6)题流程图 第2章参考答案 一、单项选择题 1.以下说法中正确的是________。 A.C语言程序总是从第一个函数开始执行 B.在C语言程序中,要调用的函数必须在main()函数中定义 C.C语言程序总是从main()函数开始执行 D.C语言程序中的main()函数必须放在程序的开始部分 答:C。 2.以下说法正确的是________。 A.C语言编写的程序不用编译即可运行 B.C语言程序第一行必须是main()函数 C.C语言程序行必须以冒号结束 D.C语言适合进行系统程序设计 答:D。 3.编辑程序的功能是________。 A.调试程序 B.建立并修改文件 C.将源程序编译成目标程序 D.命令计算机执行指定操作 答:B。 4.C程序设计语言是________。 A.机器语言 B.只适合编写应用软件的语言 C.高级语言 D.只适合编写系统软件的语言 答:C。 5.以下说法中错误的是________。 A.一个C程序可以由一个或多个函数构成 B.一个C程序必须有而且只能有一个main()函数 C.在计算机上编辑C程序时,每行只能写一条语句 D.主函数是程序启动时唯一的入口 答:C。 6.C程序是由________构成。 A.主程序与子程序 B.主函数与若干子函数 C.一个主函数与一个其他函数 D.主函数与子程序 答:B。 7.一个C程序总是从________开始执行。 A.书写顺序的第一个函数 B.书写顺序的第一条执行语句 C.主函数main() D.不确定 答:C。 8.结构良好的C程序可由________三种基本结构组成。 A.数组、结构、指针 B.结构、指针、函数 C.顺序、选择、循环 D.函数调用、条件控制、循环 答:C。 9.C程序的一个语句________。 A.不得超过80个字符 B.可利用续行标志书写在若干行上 C.必须从第一列开始书写 D.可以书写在若干行上 答:B。 二、填空题 1.C源程序的基本单位是 函数 。 2.一个C源程序中至少应包括一个 main()函数 。 3.在一个C源程序中,注释部分两侧的分界符分别为 /( 和 (/ 。 4.在C语言中,输入操作是由库函数 scanf() 完成的,输出操作是由库函数printf() 完成的。 5.一个C程序的执行是从 main() 函数开始,到 main() 函数结束。 6.C语言函数体由 声明部分 和 执行语句 两部分组成。 7.C语言程序中每个语句和数据声明的最后必须有一个 分号 。 8.一个C语言程序是由一个主程序模块和若干 函数或其他模块 组成。 9.因为源程序是 文本或ASCII 类型的文件,所以它可以用具有文本编辑功能的任何编辑程序完成编辑。 10.程序连接过程是将目标程序、 库函数 或其他目标程序连接装配成可执行文件。 三、应用题 1.上机运行本章的两个例题,熟悉所用系统的上机方法和步骤。 解:略。 2.编写一个C程序,输入a、b、c三个值,输出其中最大者。 解:程序如下。 #include void main() { int a, b, c,big; scanf ("%d,%d,%d",&a,&b,&c); big=max(a,b,c); printf ("max=%d",big); } int max(int x,int y,int z) {int w; if (x>y) w=x; else w=y; if(w=10 or a<=0 B.a>=0|a<=10 C.a>=10 &&a<=0 D.a>=10‖a<=0 答:D。 12.设a、b、c、d、m、n均为int型变量,且a=5、b=6、c=7、d=8、m=2、n=2,则逻辑表达式(m=a>b)&&(n=c>d)运算后,n的值的值为________。 A.0 B.1 C.2 D.3 答:C。 13.已知:char a;int b;float c;double d;执行语句“c=a+b+c+d;”后,变量c的数据类型是 。 A.int B.char C.float D.double 答:C。 14.已知int i,a;执行语句“i=(a=2*3,a*5),a+6;”后,变量i的值是 。 A.6 B.12 C.30 D.36 答:C。 15.已知int i=5;执行语句“i+=++i;”后,i的值是 。 A.10 B.11 C.12 D.A,B,C答案都不对 答:C。 16.设x,y,I,j均为整型变量,且x=10,y=3,则执行“I=x- -; j= - -y;”语句后I和j的值是 。 A.10, 3 B.9, 3 C.9, 2 D.10, 2 答:D。 17.已知:“char c='A';int i=l,j;”执行语句“j=!c&&i++;”则i和j的值是 。 A.1, 1 B.1, 0 C.2, 1 D.2, 0 答:B。 18.已知:“int x=1,y=2,z;”执行:“z=x>y||x&&y;”则z的值为 。 A.1 B.2 C.3 D.4 答:A。 19.为求出s=10!的值,则变量s的类型应当为 。 A.int B.unsigned C.long D.以上3种类型均可 答:C。 20.已知:“int x=1,y;”则y=++x*++x的结果为 。 A.y=9 B.y=6 C.y=l D.表达式是错误的 答:A。 二、填空题 1.字符型数据在计算机中是以 ASCII 形式表示的。 2.双精度型实数的表示范围是 10-308~10308 ,其有效位数是 15~16位 。 3.关系表达式的运算结果是 逻辑 值。 4.表达式的运算对象可以是常数、变量和 函数调用 。 5.C语言中的标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线。 6.已知字母A的ASCII码为65,以下程序的输出结果是 65,89 。 #include main() {char cl='A',C2='Y'; printf("%d,%d\n",c1,C2); } 7.若有定义“int a=10,b=9,c=8;”接着顺序执行下列语句后,变量b中的值是 3 。 c=(a-=(b-5)); c=(a%11)+(b=3); 8.表示“整数x的绝对值大于5”的C语言表达式是 x>5||x<-5 或 abs(x)>5 。 9.以下程序的输出结果是 2,1 。 #include "stdio.h" main() { int a=1, b=2; a=a+b; b=a-b; a=a-b; printf("%d,%d\n", a, b ); } 10.若有定义“int b=7;float a=2.5,c=4.7;”则表达式a+(int)(b/3*(int)(a+c)/2)%4的值为 5.5 。 三、应用题 1.分析下面程序执行后的结果。 main() {int x=10, y=10; printf("%d%d\n", x--, --y); } 解:程序运行结果为109。 2.分析下面程序执行后的结果。 main() {int a=3,b=7; printf("%d\n",a++ + ++b); /*①*/ printf("%d\n",b%a); /*②*/ printf("%d\n",!a>b); /*③*/ printf("%d\n",a+b); /*④*/ printf("%d\n",a&&b); /*⑤*/ } 解:运行结果如下。 11 0 0 12 1 3.分析下列程序,给出运行结果。 #include "stdio.h" main() { int a=10,b=29,c=5,d,e; d=(a+b)/c; e=(a+b)%c; printf("D=%d,E=%d\n",d,e); } 解:运行结果如下。 D=7,E=4 4.写出以下程序运行结果。 main() { char c1='a', c2='b', c3='c', c4='\101', c5='\116'; printf("a%cb%c\tc%c\tabc\n",c1,c2,c3); printf("\t\b%c %c",c4,c5); } 解:运行结果如下。 aabb cc abc A N 5.写出下面表达式运算后a的值,设原来a=12,a为int型。 (1)a+=a (2)a-=a (3)a*=2+3 (4)a/=a+a (5)a%=(n%=2),n的值等于5 (6)a+=a-=a*=a 解:(1)24 (2)0 (3)60 (4)0 (5)0 (6)0 6.写出下面关系式对应的C语言关系表达式或逻辑表达式。 (1)1010且y>10 (3)x>10或y>10 (4)x不等于10 解:(1)a>10 && a<15 (2)x>10 && y>10 (3)x>10 || y>10 (4)x!=10 7.写出下面各逻辑表达式的值,设a=34,b=5,c=6。 (1)a+b>c&&b= =c (2)a || b+c&&b-c (3)!(a>b)&&!c || 1 (4)0&&(x=a)&&(y=b) (5)!(a+b= =c)&&b+c/2 解:(1)0 (2)1 (3)1 (4)0 (5)1 8.将下面语句组进行简写。 (1)int a; int b; (2)x=0; y=0; (3)x=x+y; (4)int x; x=x+1; (5)y=x; --x; 解:(1)int a,b; (2)x=y=0; (3)x+=y; (4)int x; x++; (5)y=x--; 第4章参考答案 一、单项选择题 1.设a=12、b=12345,执行语句printf("%4d,%4d",a,b)的输出结果为________。 A.12,123 B.12,12345 C.12,1234 D.12,123456 答:B。 分析:b的实际位数值超出了规定输出位数时按实际数据输出。 2.若有定义:“int x,y;char a,b,c;”并有以下输入数据(此处代表换行符,U代表 空格): 1U2 AUBUC 则能给x赋整数1,给y赋整数2,给a赋字符A,给b赋字符B,给c赋字符C的正确程序段是________。 A.scanf("x =% d y = % d",&x,&y);a=getchar();b=getchar();c=getchar(); B.scanf("%d %d",&x,&y);a=getchar();b=getchar();c=getchar(); C.scanf("%d %d%c%c%c",&x,&y, &a,&b,&c); D.scanf("%d %d%c%c%c%c%c%c",&x,&y, &a,&a,&b,&b,&c,&c); 答:D。 分析:主要是考查数值型数据与字符型数据混合输入的情况。如果输入格式有%c时输入的空格符、换行符均作为有效字符接收。 3.以下程序的输出结果是________。 #include "stdio.h" main() { int i=010,j=10,k=0x10; printf("%d,%d,%d \n",i,j,k); } A.8,10,16 B.8,10,10 C.10,10,10 D.10,10,16 答:A。 分析:主要考查八进制、十六进制的数据表示形式。 4.以下程序的输出结果是________。 main() { char c1='6', c2='0'; printf("%c,%c,%d\n",c1,c2,c1-c2); } A.因输出格式不合法,输出出错信息 B.6,0,6 C.6,0,7 D.6,0,5 答:B。 分析:字符型数据在计算机中的表示形式是ASCII码,可以当作整数进行计算这 一点。 5.已知“int x=10, y=20, z=30;”以下语句执行后x,y,z的值是________。 if (x>y) z=x; x=y; y=z; A.x=10, y=20, z=30 B.x=20, y=30, z=30 C.x=20, y=30, z=10 D.x=20, y=30, z=20 答:B。 分析:主要是考查if语句的作用范围。如果if语句中的执行语句有多条时要加花括号将它们括起来,否则只对其后的第一条语句起作用。 6.请阅读以下程序: #include main() { float a,b; scanf ("%f",&a); if(a<0.0) b=0.0; else if ((a<5.0) && (a!=2.0)) b=1.0/(a+2.0); else if (a<10.0) b=1.0/a; else b=10.0; printf("%f\n",b); } 若运行时输入2.0<回车>,则上面程序的输出结果是________。 A.0.000000 B.0.500000 C.1.000000 D.0.250000 答:B。 分析:主要考查对if语句以及逻辑运算符的掌握程度。 7.若有以下定义: “float x;int a,b;”则正确的switch语句是________。 A.switch(x) {case 1.0: printf("* \ n"); case 2.0: printf("* * \ n");} B.switch(x) {case 1, 2: printf("* \ n"); case 3: printf("* * \ n");} C.switch(a+b) {case 1:printf("* \ n"); case 1+2: printf("* * \ n");} D.switch(a+b); {case 1:printf("* \ n"); case 2: printf("* * \ n");} 答:C。 分析:switch语句的表达式类型应该为整型、字符型或枚举型。 8.假定所有变量均已正确说明,下列程序段运行后x的值是________。 a=b=c=0;x=35; if(!a)x --; else if(b);if(c) x=3; else x=4; A.3 B.4 C.35 D.34 答:B。 分析:else总是与离它最近的未配对的if语句配对。 9.设ch是char型变量,其值为z,且有下面表达式: ch=(ch>'A'&&ch<='Z')?(ch+32):ch 上面表达式的值是________。 A.A B.a C.Z D.z 答:D。 分析:主要考查条件运算符的作用。 10.下列程序段不是死循环的是________。 A.int i=100; B.int k=0; while(1) do{++k;} while(k>=0); {i=i%100+1; if(i>100)break; } C.for( ; ;); D.int s=36; while(s) --s; 答:D。 分析:要想不出现死循环,则在循环体中必须有使循环趋于结束的语句,如答案D中的“--s;”。 11.有以下程序段: int n=0,p; do{scanf("%d",&p);n++;} while(p!=12345 && n<3); 此处do-while循环的结束条件是________。 A.p的值不等于12345并且n的值小于3 B.p的值等于12345并且n的值大于等于3 C.p的值不等于12345或者n的值小于3 D.p的值等于12345或者n的值大于等于3 答:D。 分析:理解逻辑运算符的含义。 12.设有程序段: t=0; while(printf("* ")) {t++; if (t<3) break; } 下面描述正确的是________。 A.其中循环控制表达式与0等价 B.其中循环控制表达式与'0'等价 C.其中循环控制表达式是不合法的 D.以上说法都不对 答:B。 分析:printf("* ")的值为非0。因为printf()函数的返回值为输出字符的个数。 13.有以下程序: main() {int a=15,b=21,m=0; switch(a%3) {case 0: m++;break; case 1: m++; switch(a%3) {default:m++;break; case 0: m++;break; } } printf("%d\n",m); } 程序运行后的输出结果是________。 A.1 B.2 C.3 D.4 答:A。 分析:break语句的作用。 14.以下程序输出结果是________。 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("x=%d\n",x); } A.x=4 B.x=8 C.x=6 D.x=12 答:B。 分析:考查continue的作用。即结束本次循环,开始新的循环。 15.下面程序是从键盘输入学号,然后输出学号中百位数字是3的学号,输入0时结束循环。请选择填空。 #include main() { long int num; scanf("%ld",&num); do { if( [ 1 ] ) printf("%ld",num); scanf("%ld",&num); }while ( [ 2 ] ); } [1] A.num%100/10==3 B.num/100%10==3 C.num%10/10==3 D.num/10%10==3 [2] A.! num B.num>0==0 C.! num == 0 D.! num ! = 0 答:[1] B,[2] C。 分析:考查如何取整数的个、十、百位数字以及循环结束的条件。 16.下面程序的功能是将从键盘输入的偶数(大于等于4)写成两个素数之和。请选择填空。 #include #include main() { int a,b,c,d; scanf("%d",&a); for(b=3;b<=a/2;b+=2) { for(c=2; c<=sqrt(b); c++) if(b%c==0) break; if(c>sqrt(b)) d= ; else continue; for (c=2; c<=sqrt(d); c++) if(d%c==0) break; if(c>sqrt(d)) printf("%d=%d+%d\n",a,b,d); } } A.a+b B.a-b C.a*b D.a/b 答:B。 分析:在判断第一个素数后,需要判断剩余数是否是素数。 17.运行以下程序后若从键盘上输入:65 4<回车>,则输出结果为________。 main() { int m,n; printf("Enter m,n: ");scanf("%d%d",&m,&n); while(m!=n) { while(m>n) m-=n; while(mn) 循环结束时m的值就是运行结果。 二、填空题 1.执行下面程序中的输出语句后,a的值是 15 。 main() { int a; printf("%d\n",(a=3*5,a*4,a+5)); } 2.下面程序的输出是 103 。 main() { int a=-1, b=4, k; k=(a++<=0) &&(!(b--<=0)); printf("%d %d %d \n",k,a,b); } 3.有以下程序段,请问执行后的输出结果是 1098 。 int n=10; while(n>7) { printf("%d",n--); } 4.有以下程序: #include"stdio.h" main() { char c; while((c=getchar())!='?') putchar(--c); } 程序运行时,若从键盘输入:Y?N?<回车>,则输出结果为 X 。 5.以下程序的输出结果是 8 。 #include 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); } 6.以下程序运行后的输出结果是 17 。 main() { int x=15; while(x>10 && x<50) { x++; if(x/3) {x++;break;} else continue; } printf("%d\n",x); } 7.以下程序根据输入的三角形的三边判断是否能组成三角形,若可以则输出它的面积和三角形的类型。请填空。 #include #include main() { float a,b,c; float s,area; printf("Input a,b,c:"); scanf("%f, %f, %f ",&a,&b,&c); if ( a+b>c &&b+c>a &&c+a>b )/*构成三角形的条件*/ { s=(a+b+c)/2; area=sqrt(s* (s-a) * (s-b) * (s-c)); printf("%f \n",area); if ( a==b && b==c && c==a ) printf("等边三角形"); else if(a==b ||b==c || c==a ) printf("等腰三角形"); else if( a(a+b(b==c(c ||a(a==b(b+c(c || b(b==a(a+c(c ) printf("直角三角形"); else printf("一般三角形"); } else printf("不能组成三角形"); } 8.若有x=1,y=2,z=3,则表达式:((x void main() { int day, x1, x2; day=0; x1=1020; while(x1>0 ) {x2= x1/2-2 ; x1=x2; day++; } printf("day= %d\n",day); } 11.下面程序的功能是从三个红球、五个白球、六个黑球中任意取出八个球,且其中必须有白球,输出所有可能的方案。完成此程序。 #include void main() { int i, j, k; printf("\n red white black \n"); for (i=0; i< =3; i++ ) for ( j=1 ; j<=5; j++) { k=8 - i - j; if ( k<=6 ) printf (" %d,%d, %d\n", i, j , k); } } 三、应用题 1.编程求的值。 解:程序如下。 main () { int n=20,i; double s=0.,k=1.; for(i=1;i<=n;i++) { k=k*i; /*求阶乘*/ s=s+k; /*累加*/ } printf("%26.20e\n",s); } 20 C语言程序设计习题与上机实验指导 19 第一部分 习题解答