程序设计基础(C语言)第3版习题及答案.docx
第1章C语言概述【习题1-1简述C语言的特点。答:C语言的特点:C语言简洁、紧凑、使用灵活、方便;运算符丰富;数据结构丰富; C是结构式语言;C语法限制不太严格,程序设计自由度大;C语言允许直接访问物理地址; c语言程序生成代码质量高;C语言适用范围大,可移植性好。【习题2】简述上机调试运行C程序的操作步骤。答:上机运行C语言程序的操作步骤为:启动Visual C+6. Of建立工程f创建源程序文件f输入(编辑)源程序内容一保存源程序文件一编译源程序文件一连接目标程序一执行程序一开始另一个程序。【习题1-3上机运行本章的3个例题。答:略。【习题4】请从以下的4个选项中选择一个正确答案。(1) A (2) A (3) C (4) B【习题1-5】参照本章例题,编写一个C语言程序,输出以下信息:Nice to meet you!编写程序如下:#include<stdio. h>void main ()(printf (''*n");printf (*Nice to meet you!nz,);printf ("*ri");第2章基本数据类型和运算符【习题2T】上机编辑并调试本章所有例题。答:略。【习题2-2】下面哪些是合法的常量?200.501213e5.1 E-58e45.0x6amn'"OK""a"''012'"a/b"''答:合法的常量有:200.50128e45.0x6a合法的常量有:"OK""a"''012'"a/b"''【习题2-3】下面的变量名中哪些是合法的?A&b abcl23 abc% AbC a_b_cint _abc 123abc ab?ca be a*bc ' a be答:合法的变量名有:abc 123 AbC a_b_c _abc【习题2-4】指出下面的变量定义哪些是正确的,哪些是不正确的,为什么?(Dint i, j;(2)f loat a, b;(3)int a, b; float a, b;(4)float a, int b;(5)char ' a"答:错误,因为关键字Int应该全为小写字母正确错,因为同一变量在程序的同一处不应该声明为不同的数据类型错,因为不同类型的变量要分别声明,其间应使用分号,而不是逗号错,a'表示字符常量,不能用作变量名【习题2-5】把下列数学式子写成C语言表达式。(1)(2)3.26ex+l (a+b)432五十士里3sin(x)mm2(4)27rr+nr2+cos(450 )(5)loan(l + ra/e)"w,rt-l对应的C语言表达式分别为:(1)(2)(3)(4)(5)3.26*exp(x)+l.0/3*pow(a+b,4)2*sqrt(x)+(a+b)/(3*sin(x)g*ml*m2/(r*r)2*3.14*r+3.14*r*r+cos(3.14/180*45)1oan*rate*pow(1+ rate, month)/(pow(1+rate, month)-1)【习题2-6】C语言中为什么要引入转义字符?答:在字符集中,有一类字符具有这样的特性:当从键盘上输入这个字符时,显示器上就可以显示这个字符,即输入什么就显示什么。这类字符称为可显示字符,如a、b、$等。但另一类字符却没有这种特性。它们或者在键盘上找不到对应的一个键,或者当按键以后不能显示键面上的字符,为了解决这一问题,在C语言中引入了转义字符。【习题2-7】逻辑表达式的值是什么?只能用1和。才能表示真值和假值吗?答:逻辑表达式的值是一个逻辑量“真”或者“假”,不是只有用1表示真值,用0表示假值,在判断一个量为真假时,常以。表示假,以非。表示真。【习题2-8对于表达式(l+2)*(y=3),可以肯定(1+2)先计算,而(y=3)后计算吗?答:不能。【习题2-9"&&”和“II ”严格地执行运算符优先级的规则吗?它的规则是什么?答:逻辑运算符不按照规定的优先级计算。在逻辑表达式的求值过程中,如果从“&&”或“ II ”左边的运算对象部分已经能够确定整个逻辑发达式的值,则不再求右边运算对象的值,这样做提高了运算速度。具体地说:若“&&”的左运算对象值为0,则不再对右运算对象求值,因整个式子的结果必定为0若“II ”的左运算对象值为非0,则不再对右运算对象求值,因整个式子的结果必定为1。以上所说的这种运算的规则是C对逻辑运算的特殊处理规则。它严格地执行从左到右运算的规则,不受运算符优先级所影响。【习题2-10】字符常量和字符串常量有什么区别?答:字符常量和字符串常量的区别:从形式上看,字符常量使用单引号,而字符串常量使用双引号。从内部存储来看,编译程序在每个字符串的尾部自动加上了一个空字符NULL(即''0')作为字符串的结束标志,而字符常量则不存在这种情况。【习题2-11将下面语句组进行简写。(Dint i;int j; x=0;y=0;(3)x=x+y;(4)int x, y;x=y-(y/10)*10;(5)int x;x=x+l;(6)y=x;-x;对应的简写语句分别为:(1) int a, b;(2) x=y=0;(3) x+=y;(4) int x, y;x=y%10;(5) int x;x+;或 x+=l;或+x;(6) y=x-;【习题2-12写出下面程序运行后的结果。程序运行结果:2,3程序运行结果:y=5.000000程序运行结果:chl=65, ch2=97B,b(4)程序运行结果:0,48程序运行结果:0221(6)程序运行结果: a, A,32,32程序运行结果:01,60,15,15(8)程序运行结果:2,2,11,2,10,2,2-1,2,2程序运行结果:324(10)程序运行结果:323,343,4,40第3章顺序和选择结构程序设计【习题3-1】请从以下的4个选项中选择1个正确答案。1 .结构化程序设计的三种基本结构是()oA.函数结构、判断结构、选择结构B.平行结构、嵌套结构、函数结构C.顺序结构、选择结构、循环结构 D.判断结构、嵌套结构、循环结构【正确答案】C2 . putchar()函数可以向终端输出一个()。A.整型变量表达式值B.实型变量值C.字符串D.字符或字符型变量值【正确答案】D3 .若已定义double y;拟从键盘输入一个值赋给变量y,则正确的函数调用是()。A. scanf ("%d",&y);C. scanf (“%lf”,&y);【正确答案】C4.若有以下定义:float x; int a,A. switch(x) case 1.0:printf C*n*); case 2: printf("*n")C. switch(a+b) case 1: printf("*n"); case 2: printf("*n");B. scanf( "7.2f",&y);D. scanf ( “ld”,&y):b;则正确的switch语句是()。8. switch(x) case 1, 2:printf("*n"); case 3:printf("*n");)D. switch(ab); case 1:printf("*n"); case 2:printf("*n");)组成配对关系【正确答案】C5.为了避免嵌套的if-else语句的二义性,C语言规定else总是与(A.缩排位置相同的ifB.在其之前未配对的ifC.在其之前尚未配对的最近的if D.同一行上的if【正确答案】B【习题3-2】 if语句有那3种形式,请分别画出每种形式的执行流程图。【参考答案】(1)顺序结构(2)选择结构(3)循环结构(当型循环)循环结构(直到型循环)【习题3-3】下面哪些语句是合法的?(1) if (a=b)printf ("Hello");(2) if(a=b)printf (*Hello*)(3) if(a=b)printf (*Hello*)elseprintf("Goodbye");(4) if a=bprintf CHello*);【正确答案】(1)合法。(2)不合法。(3)不合法。(4)不合法。【习题3-4】读程序写结果。(1)从键盘输入58#include<stdio. h>void main()(int a;scanf&a);if (a>50) printf("A=%d", a);if(a>40) printf("B=%d", a); if(a>30) printf("C=%d", a);答案:A=58 B=58 C=58(2)#include<stdio. h>void main()(int x=10, y=20, t=0;if(x=y) t=x;x=y;y=t;printf (*%d,%d n”, x, y);答案:20(3)#include<stdio. h>void main()(int p, a=5;if(p=a!=0)printf("%dn", p);elseprintf ("%dn”, p+2);答案:1(4)#include<stdio. h> void main()(int a=4, b3, c=5, t0 jif (a<b)t=a;a=b;b=t;if (a<c)t=a;a=c;c=t;printf ("%d %d %dn”, a, b, c);)答案:534(5)#include<stdio. h>void main()(int i, m=0, n=0, k=0;for(i=9;i<=ll;i+) switch(i/10) case 0: m+; n+; break; case 10: n+;break; default: k+;n+;printf (*%d %d %dn*, m, n, k);)答案:132(6)#include<stdio. h>void main()int n=0, m=l, x=2;if(!n) x-=l;if(m) x-=2;if(x) x-=3;printf("%dn", x);答案:-4(7)#include<stdio. h>void main()(int x=l, 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("%d %dn”, a, b);)答案:21(8)#include<stdio. h>void main()int a=3, b=4, c=5, t=99;if(b<a&&a<c)t=a;a=c;c=t;if(a<c&&b<c)t=b;b=a;a=t; printf (/z%d %d %dn*, a, b, c);)答案:435(9)#include<stdio. h>void main()(int n='c'switch(n+) default: printf("error");break;case 'a':case 'A': case ' b':case ' B': printf ("good"); break;case ' c':case 'C':printf("pass");case ' d' :case ' D' :printf("warn");答案:passwarn【习题3-5有如下if条件语句:if(a<b) if(c<d)x=l;else if(a<c)if(b<d)x=2;else x=3; else if(c<d)x=4;else x=5;试按缩进对齐的格式将以上语句改写为结构更清晰的等效if语句,并在每个条件表达 式之后用逻辑表达式注释所满足的条件。【正确答案】if(a<b)(if(c<d) x=l;else if(a<c) if(b<d) x=2;else x=3;)else if(c<d) x=4;elsex=5;/*a<b*/*(a<b)&&(c<d)*/* (a<b)&&(a<c)*/*(a<b)&&(a<c)&&(b<d)*/*(a<b)&&(a<c)&&(b>=d)*/(a>=b)&&(c<d) */* (a>=b)&&(c>=d)*/【习题3-6】有两个程序段:(1) if(a<b)(2) if(a<b)if(c=d) x=l;else x=2;if(c=d)x=l;else x=2;它们所表示的逻辑关系是下列所示关系中的哪一个? r 1 a<b 且 c=d 厂1 a<b且c=d2 a2b 且 cKdX= YJ 2 a<b 且 cKda<b 且 c=da2ba<b 且 c=dcWd答案:(1)所表示的是3,(2)所表示的是2【习题3-7】写一程序,从键盘上输入1年份year (4位十进制数),判断其是否闰年。闰年的条件是:能被4整除、但不能被100整除,或者能被400整除。程序如下:/*c3_7. c*/#include "stdio. h"void mainO(int year;scanf("%d”, feyear);if(year%400=0|(year%4=0&&year%100!=0) printf (/z%d is a leap yearn/z, year);else printf ("%d is not a leap yearn'z, year);)【习题3-8】设计一个程序,从键盘输入3个整数,按由小到大的顺序输出。程序如下:/*c3_8. c*/#include<stdio. h>void main()(int a, b, c;if(a>b)t=a; a=b; b=t; if(a<c)t=a; a=c; c=t;printf("%d %d %drT, a, b, c);)【习题3-9】编程序计算下面的函数:e77-!0<x<ly=3|x|+23Wx<4I sin(x2)当x取其他值时程序如下:/*c39. c*/include <stdio. h>ttinclude <math. h>void main()(float x, y;printf ("输入 x:");scanf&x);if(x>0&&x<l)/*若 OVxVl*/y=exp(sqrt(x)T;else if (x>=3&&x<=4)/*若3WxW4*/y=fabs(x)+2;else/*若 xN10*/y=sin(x*x);printfIf, y=%.2fn”, x, y);【习题3-10编程序计算下面的分段函数:输入x值,求下列相应y值。-1(x<l)y= y 2x+l (IWxWlO)I 3x+2(x10)分析:对于分段函数,往往采用多路分支选择语句实现。程序如下:/c3_10. c*/#include <stdio. h> void main()( int x, y;printf ("输入 x:");scanf&x);if(x<l)/*若 x<l*/(y=x;printf (*x=%3d, y=x=%dn”, x, y);)else if(x<=10)/*若 IWxWlO*/ y=2*x+l; printf("x或3d, y=2*x+l=%dn”, x, y);)else/*若 x210*/y=3*x+2; printf("x或3d, y=3*x+2=%dn”, x, y):)【习题3-11】输入一个整数m,判断它能否被3、13、17整除,如果能被三个数之一整除,则输出它能被整除的信息,否则输出m不能被3、13、17整除的信息。试编写该程序。程序如下:/*c3_ll. c*/#include <stdio. h> void main()int m;scanf ("%d",&m);if(m%3=0| ni%13=0|m%17=0)printf( wcan be divided!w ;elseprintf( acan not be divided!M ;【习题3-12若一个学生是某校的学生,且是男生,则输出“male”;若是女生,则输出“female":若不是某校的学生,则输出“No”。试编写该程序并画出流程图。程序如下:/*c3_12. c*/#include <stdio. h> void main()(int school, sex;scanf ("%d,&school,&sex);if(school=l)(if(sex=l)printf("male");elseprintf( afemalew );)elseprintf ("No");【习题3-13】某产品的国内销售价为80箱以下,每箱350元,超过80箱,超过部分每箱优惠20元;国外销售价为1000箱以下,每箱900元,超过1000箱,超过部分每箱优惠15元。试编写计算销售额的程序。程序如下:/*c3_13. c*/#include <stdio. h>void main()(float money;int national, count;printf("Input national or external:");scanf (d*, fenational);printf("Input count of product:");scanf&count);if (national)/*国内销售*/if(count<=80)money=count*350.0; elsemoney=count*350.0-(count-80.0)*20.0;else/*国外销售*/if( count<=1000) money=count*900.0; elsemoney=count*900.0-(count-1000.0)*15.0;printf("total=%f”, money);【习题3-14】电文加密的算法是:将字母A变成字母G, a变成g, B变成H, b变成h,依此类推,并且U变成A, V变成B等。从键盘输入一个电文字符,输出其相应的密码。程序如下:/*c3_14. c*/#include<stdio. h>void mainO (char chr;char password;chr=getchar ();password=chr+6;if(chr<=90)(if(password>90)password=(password%91);elsepassword=password%91;) else if (password>=123) password"(password%123)+'a'elsepassword=password%l23;)printf ("The character's password is %c”, password);)【习题3-15】企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5祝20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3祝60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?程序如下:/*c3_15. c*/ttinclude <stdio. h>main()(long int i;int bonusl, bonus2, bonus4, bonus6, bonuslO, bonus;scanf C%ld/Z,&i);bonusl=100000*0.1;bonus2=bonus1+100000*0.75;bonus4=bonus2+100000*0.5;bonus6=bonus4+100000*0.3;bonus10=bonus6+400000*0.15;if(i<=100000)bonus=i*0.1;金*/else if(i<=200000) bonus=bonusl+(i-100000)*0.075;金*/else if (i<=400000) bonus=bonus2+(1-200000)*0.05;金*/else if(i<=600000) bonus=bonus4+(i-400000)*0.03;金*/else if(i<=1000000) bonus=bonus6+(i-600000)*0.015;的奖金*/elsebonus=bonus10+(i-1000000)*0.01;金*/printf("bonus=%d”, bonus);/*利润为10万元时的奖金*/*利润为20万元时的奖金*/*利润为40万元时的奖金*/*利润为60万元时的奖金*/*利润为100万元时的奖金*/*利润在10万元以内按0. 1提成奖/*利润在10万至20万元时的奖/*利润在20万至40万元时的奖/*利润在40万至60万元时的奖/*利润在60万元至100万元时/*利润在100万元以上时的奖第4章循环结构程序设计【习题4-1】分析下面程序的结果:(1)程序运行结果:k=12(2)程序运行结果:*#(3)程序运行结果:0(4)程序运行结果:k=0(5)程序运行结果:m=l【习题4-2】假设全班有30个学生,编写一个程序,连续输入30个学生的计算机考试成绩,并计算出全班学生的计算机平均成绩。程序如下:/*c4_2. c*/include <stdio. h>void main()float sum=0.0, ave=0.0, score;int i;for(i=0;i<30;i+)(scanf (飞f n”,&score);sum+=score;)ave=sum/i;printf (''Average is %fn”, sum);ave;【习题4-3】编程求1!+3!+5!+7!+19!的值。程序如下:/*c4_3. c*/ttinclude <stdio. h>void main()float sum=0.0;int i,j=l;for(i=l;i<20;i+)(j*=i;if(i%2=0) continue;sum+=j;printf ("sum=%en”, sum);【习题4-4】打印出所有的水仙花数。所谓水仙花数是指一个三位数,其各位数字的立方和等于该数字本身,如xyz=x'+y'+z)程序如下:/*c4_4. c*/#include <stdio. h>void main()int x, y, z;printf ("水仙花数有:");for(x=l;x<=9;x+)for(y=0;y<=9;y+)for (z=0;z<=9;z+)i f(x*100+y*10+z=x*x*x+y*y*y+z*z*z)printfC%-5d", x*100+y*10+z);【习题4-5】分别用三种循环控制语句编写程序,求下面和式的值。100 s=Ln! n=l方法一:利用for循环实现程序如下:/*c4_5a. c*/#include <stdio.h>void main()(int s=0, i;for(i=l;i<=100;i+)s+=i;printf ("s=%dn”, s);)方法二:利用while循环实现程序如下:/*c4_5b. c*/include <stdio. h>void main()int s=0, i=l;while(i<=100)s+=i;i+;)printf ("s=%dn', s);)方法三:利用do-while循环实现程序如下:/*c4_5c. c*/4include <stdio. h>void main ()(int s=0,i=l;do(s+=i;i+;while(i<=100)printf("s二%dn', s);【习题4-6】将从键盘输入的一对数,由小到大排序输出。当输入一对相等数时结束循环。程序如下:/*c4_6. c*/#include <stdio. h>void main()(int a, b, t;scanf("%d,%d",&a,&b);while(a!=b)if(a>b)(t 二a; a二b; b二 t;)printf ("%d,%dn”, a, b);scanf ("%d,%d",&a,&b);习题4-7从键盘输入的一组字符中统计出大写字母的个数m和小写字母的个数n,并输出m、n中的较大者。程序如下:/*c4_7. c*/include <stdio. h> void main()int m=0, n=0;char c;whi le (c=getchar ()!='n')(if (c>'A'&&c<='Z') m+;if (c>=,a'&&c<=' z') n+;printf (,zm=%d, n=%d, max=%dn,z, m, n, m<n?n:m);【习题4-8】输入n个数,求其最大数、最小数和平均值。程序如下:/*c4_8. c*/#include <stdio. h>void main()(int n, i, max, min, a;float s;scanf ("%d,%d”,&n,&a);s=max=min=a;for(i=l;i<n;i+)scanf&a);s+=a;if(max<a) max=a;if(min>a) min=a;)printf (z,Max=%d, Min=%d, avg=%f”, max, min, s/n);)【习题4-9输出显示自然数1100之间的全部素数。程序如下:/*c4_9. c*/#include <stdio. h>#include <math. h>void main()(int n, i, j,1=0;for (n=2;n<=100;n+)i=sqrt(n);for(j=2;j<=i;j+)if(!(n%j)break;if(j>=i+l)if(l<5)|printf ("知t", n);1+;)elseprintf(*%dn*, n);1=0;【习题4-10】一个数如果恰好等于它的因子之和,就把它称为“完数”。例如,28的因子为1、2、4、7、14,而28=1+2+4+7+14,因此28是“完数”。编程序找出10000以内的所有“完数”并输出其因子。程序如下:/*c4_10. c*/#include <stdio. h>void main ()(int m, s, i;for(m=2;m<l0000;m+)(s=0;for(i=l;i<m;i+)if(m%i)=0) s=s+i;if(s=m)(printf("%d, its factors are”,m);for(i=l;i<m;i+)if(m%i=0) printf(*%d ", i);printf("n");【习题4-11求算式xyz+yzz=888中的x、y、z的值(其中xyz和yzz分别表示一个三位数)。程序如下:/*c4_ll. c*/include <stdio. h> void main()(int x,y,z,i,result=888;for(x=l;x<10;x+)for (y=l;y<10;y+)for (z=0;z<10;z+)(i=100*x+10*y+z+100*y+10*z+z;if(i=result)printf("x=%d, y=%d, z=%dn”, x, y, z);【习题4T2】已知鸡兔共有30只,脚共有90只,编程计算鸡兔各有多少只。程序如下:/*c4_12. c*/ttinclude <stdio. h>void main()(int x, y;for(x=0;x<=30;x+)y=30-x;if(2*x+y*4)=90) printf(*%d,%dn", x, y);【习题4-13】猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃了一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半多一个。知道第十天早上想再吃时,只剩下一个桃子了。求第一天一共摘了多少个桃子?分析:前一天桃子数是后一天桃子数的2倍加2个。程序如下:/*c4_13. c*/#include <stdio. h>void main()(int x,i;x=l;for(i=9;i>=l;i-)x=2*(x+1);【习题4-14编写程序,找出1-99之间的全部同构数。(同构数的定义:出现在平方数的右边。例如:5是25右边的数,25是625右边的数,5和25都是同构数)程序如下:/*c4_14. c*/#include <stdio. h>void main ()(int i;for (i=l;i<100;i+)if(i*i%10=i| i*i%100=i) printf("%3d”, i);【习题4T5使用嵌套循环输出下列图形:*程序如下:/*c4_15. c*/include <stdio. h>void main ()int i, j;for(i=0;i<=3;i+)(for(j=0;j<=5;j+)if (i=0| j=01| i=31| j=5)printf (");elseprintf("");printf("n");)【习题4-16使用循环嵌套输出下列图形:程序如下:/*c4_16. c*/#include <stdio. h> void main()int i, j, k;for(i=0;i<=3;i+)(for(k=l;k=i;k+) printf(* ");for(j=0;j<=4;j+) printf("*");printf("n");Ai是外循环变量用于控制行数*/*k是内循环变量用于控制每行的空格数*/*j是内循环变量用于控制每行中星号的个数*/【习题4-17编写一程序,根据用户输入的不同的边长,输出其菱形。例如,边长为3的菱形为:*程序如下:/*c4_17. c*/ttinclude <stdio. h>void main()(int a, i, j, k;printf(,zplease enter the number");scanf&a);for(i=0;i<=a-l;i+)for(j=0;j<=a-2-i;j+) printf C ");for(k=0;k<=2*i;k+) printf("*); printf("n");)for(i=0;i<=a-2;i+)for(j=0;j<=i;j+) printf(*");for(k=0;k<=2*a-4-2*i;k+) printf('*"); printf('n");(习题4-18编程实现从键盘输入若干学号,然后输出学号中十位数字是9的学号(输入0时结束循环)。程序如下:/*c4_18. c*/#include <stdio. h>void main ()(long int num;scanf&num);do(if(num/10%10=9) printfnum);scanf&num);while(num!=0);【习题479】假设x, y是整数,编程求/的最后3位数,要求x、y从键盘输入。程序如下:/*c4_19. c*/#include<stdio. h>void main()(int i, x, y;long last=l;printf("Input x and y:");scanf (*%d,%d",&x,&y);for(i=l;i<=y;i+)last=last*x%1000;printf(*The last 3 digits:%ldn*, last);【习题4-20编程实现将从键盘输入的偶数写成两个素数之和。程序如下:/*c4_