C/C++程序设计(第二版)
张树粹主编_清华大学出版社
1-9章课后习题解析(修正错误版)
第一章P42页
一、选择:1.A 2.A 3.D 4.A 5.C 6.B 7. A
二、填空
1. .C .CPP .OBJ .EXE
2. 主函数 或main函数
3. #include 5. { } 函数声明 函数执行 不能 void 三、分析理解 1. 解答:C语言程序主要由函数组成,一般包括预处理命令、函数、全局变量声明等等。 2. 解答: 函数由函数首部和函数体组成。函数首部规定函数的返回值类型、函数名、函数的形参及类型;函数体包括用于实现功能的可执行语句,由{}括起。 3. 解答:基本的C语言语句由简单语句、复合语句、赋值语句、流程控制语句、非限定性转向语句等。 4. 解答:合法的一般标识符有: name,Int,File_name, DATA 5. 解答:源程序需要经过编译程序编译转换成二进制程序,即:目标代码文件,再通过连接程序将目标文件盒其他目标文件及系统所提供的库函数等进行连接生成可执行程序。 6. 解答:两种:单行注释用//. 多行注释采用/* 和*/。 7. 解答:(此题注释和程序效果不一致需修改)。源程序如图1-1所示: 图1-1 ex1-7源程序 运行结果如下图1-2所示: 图1-2 ex1-7 运行结果 分析: setprecison单独使用时用来输出实数的有效数字,若和fixed联用,则用来输出实数小数点后的数字位数。 (2)-33.7801 //setprecision(0)表示根据当前默认输出精度输出实数。默认精度:实数输出6位有效数字。 (4) 122.1 //为num1输出4位有效数字(当实际数据位数大于所设置精度,则四舍五入) 8. 解答:源程序如下图1-3所示: 图1-3 ex1-8源程序 运行结果如下图所示: 图1-4 ex1-8 运行结果 第二章P 67页 一、选择 1、B 2、B 3、A 4、B 5、C 二、填空 1、 x>20 && x<30 ||x<-100 2、 x>y 或者 a>b 3、 1 4、 auto、extern、static、register 5、 函数内部 6、 int、float、double 7、 2,1 6、A 7、 8、C 9、D 10、 B D 8、 为最右边表达式的值 9、 7 10、 前缀:先自增(自减)后使用;后缀:先使用后自增(自减) 11、 右结合性(自右向左) 12、 变量的数据类型、存储类型、变量名称 13、 是否整除 14、 全局变量,静态局部变量,静态局部变量 15、 const,初始值和数据类型 三、阅读程序 1、解答:输出结果是2,1 2、解答:输出结果是6,8,6,7 3、解答:输出结果是n=1 4、解答:输出结果是x=7,a=3,b=7 5、解答:输出结果是n=-4 6、解答:输出结果是0 7、解答:输出结果是21474837,-21474838 8、解答:输出结果是 2 3 1 2 (各数据均占8列) 四、编程 1、“china”译成密码问题。 这里分别采用getchar/putchar 、cin/cout、scanf/printf三种方法实现。 【方法一】getchar/putchar 【源程序】如下图2-1所示: 图2-1 图2-2 【运行结果】 【方法二】cin/cout 【源程序】如下图2-3所示: 图2-3 【运行结果】同上图2-2 【方法三】scanf/printf 实现 【源程序】 如图2-4所示: 图2-4 【运行结果】正常数据键入结果同上图2-2,当用户按如下形式键入,也能得到正确结果: 图2-5 【分析】 若采用 scanf(\"%c%c%c%c%c\各 格式串中格式符%c前没有空格分隔,则按照上图2-5形式输入,空格将会作为有效字符存入变量中。运行结果将不正确,如下图2-6所示。 图2-6 2、华氏温度与摄氏温度转换问题。 【源程序】 图2-7 【运行结果】 第三章 程序控制结构P97页 一、选择 1、D 2、B 3、B 4、C A 二、阅读程序 1、解答:输出结果是120 2、解答:输出结果是s=63 3、解答:输出结果是: 0 1 图2-8 、C 6、D 7、A 8、B 9、C 10、5 2 3 4 the loop break out. 4、解答:输出结果是freight=5880000 5、解答:输出结果是 sum=1 sum=3 sum=9 sum=33 三、程序填空 1、i++ i < 10 2、i< 100 i %3 != 0 3、x >= 0 x < min 4、i++ 2*i-1 endl 5、i=1 j<=i j*i 四、编程 1、判断输入的一个字符是否为0~9之间的阿拉伯数字。 【方法一】使用cin输入单个字符 【源程序1】 能完成除空白字符外的字符判断,但对空白字符作为非阿拉伯数字(空格、制表符、换行、回车)无法处理。 图3-1 【运行结果】 图3-2(a) 图3-2(b) 图3-2(c) 图3-2(d) 【分析】此程序默认跳过空白符处理字符,用户一开始输入空白符,会认为程序还没读入有效字符,将一直等待用户键入有效字符为止(如图3-2(c)所示),若用户连续读入空白符,程序将陷入无限循环(如图3-2(d)所示)。 【方法二】采用cin结合操纵符noskipws实现(空白符作为有效字符读入) 【源程序2】程序能完成包括空白字符(空格、制表符、换行、回车)在内的所有字符判断 图3-3 【运行结果】非空白字符的运行效果同上(图3_2(a),图3_2(b)),图3_4、图3_5展示空白字符的运行效果: 图3_4 把图3_3中注释中的cout语句恢复,观察非数字字符的ASCII码,效果如下: 图3_5 【方法三】采用cin成员函数get实现,(空白符作为有效字符读入) 【源程序3】 图3-6 【运行结果】 各种情况运行结果均与方法二效果相同。 【方法四】采用getchar/putchar函数完成单个字符的输入输出(空白符也作为有效字符读入) 【程序段】 ch = getchar(); putchar(ch); if ( ch>=’0’ && ch <= ‘9’) printf(“ is a digit between 0 and 9!\\n”; else printf(“ is a NOT digit”; 【方法五】采用scanf/printf函数结合%c完成单个字符的输入输出(空白符也作为有效字符读入) 【程序段】 scanf(“%c”,&ch); printf(“%c”,ch); if ( ch>=’0’ && ch <= ‘9’) printf(“ is a digit between 0 and 9!\\n”; else printf(“ is a NOT digit”; 2、有一个函数,根据x值计算出y的值。 【方法】 采用多分支选择结构处理分段函数的计算问题。 【源程序】 图3-7 【运行结果】 图3-8 3.输入一个英文字母,如果该字母是大写字母则输出:“这是一个英文大写字母,朋友再见!”;如果是小写英文字母则输出:“这是一个小写字母,朋友再见!”。要求使用getchar函数输入字符,使用条件运算符编写输出语句。 【方法】 字母的判断主要通过ASCII码段规律来完成,如果不要条件运算符,采用双分支选择结构if-else也可以完成。 【源程序】 图3-9 【运行结果】 图3-10 4、打印100~999之间所有的水仙花数。水仙花数是一个3位数,其各位数的立方和等于该数本身。 【方法1】 采用穷举法,设变量num保存100~999之间的数。百位、十位、个位分别为k2,k1,k0,则需满足条件num == k2*k2*k2 + k1*k1*k1+k0*k0*k0,则为水仙花数。 【源程序1】 图3-11 【运行结果】 图3-12 【方法2】 设百位、十位、个位分别为k2,k1,k0,根据各位基数的取值范围穷举所有三位数的可能排列,(k2:1~9,k1:0~9,k0:0~9)找出符合条件的三位数,即: k2 * 100 + k1 * 10 + k0 == k2 * k2 * k2 + k1 * k1 * k1 + k0 * k0 * k0 【源程序】 图3-13 【运行结果】 图3-14 5.输入4个整数,要求按由小到大的顺序输出。 【方法】 通过两两比较,将最小数交换到前面。 【源程序】 图3-15 【运行结果】 图3-16 6.编写程序,按下列公式计算e的值(精度为1*10-6)。 【方法】 这是一个累加算法的典型实例。e=e+k,由于累加次数未知,只要将加数k分解达到要求精度为止,以此作为循环条件,较常用while循环或do-while循环结构。 【源程序】 图3-17 【运行结果】 图3-18 7.输出能被11整除且不含有重复数字的所有3位数,并统计其个数。 【方法】 设num为100~999之间的3位数,将其拆分出百位、十位、各位用k2、k1、k0表示,count为计数器,通过循环查找满足条件的数。 【源程序】 图3-19 【运行结果】 图3-20 8.每个苹果0.8元,第一天买2个苹果,从第二天开始,每天买的苹果数是前一天的2倍,直到当天购买的苹果个数超过100个,问每天平均花多少钱。 【方法】 这是一个迭代算法的典型实例。注意找出规律。 【源程序】 图3-21 【运行结果】 图3-22 第4章 数组P123页 一、单项选择题 1. A 2. D 3. A 4. B 5. A 6. D 7. B 8. B 9. B 10. A 二、填空题 1、3 2、19 3、a[1][0] 4、98 5、7 6、ABCDE 7、12 8、2244 23 三、阅读程序题 1、19 2、,8,5,2 3、10010 4、6521 5、-9是第6个元素 四、程序填空题 1、a[i] min=a[i] 2、b[i]!=’\\0’ a[i] i++ 3、a[i]!=’\\0’ s[j]=s[i] i++ 五、编程题 1、统计N个学生的成绩并输出低于平均分的人数(N=10)。 【方法】先求出N个学生的平均成绩,然后再找出平均分的人数。 【源程序】 图4-1 【运行结果】 图4-2 第五章 函数P155页 一、单项选择题 1、C 2、B 3、A 4、B 5、C 6、C 7、二、填空题 1. main 2. 地址传递 3. 2 、B D 8 4. 局部静态 5. 从定义处开始到函数结束 6. 1 7. 类型不相同或个数不同 8. 小 三、阅读程序题 1. 15 2. MAX=99 3. 30 25 4. 8 17 5. 136 四、程序填空题 1.x[i++] 2.x 3.k sizeof(str)-2或strlen(str)-1 4.fac/i 5.a[i]==b[i] 五、编程题 1、编写函数,其功能是求3个整数的最大值和最小值。 [源程序]: [运行结果]: 第六章 指针P1页 一、单项选择题 1、D 2、A 3、D 4、D 5、B 6、A 7、B 8、D 二、填空题 1. 60 2. t[1][2] 3. 9876 876 4. 6 10 三、阅读程序题 1. 60 2. 20 3. f 4. 24 5. 3 5 5 3 四、程序填空题 1.!(s[i]>=’0’ && s[i]<=’9’) ‘\\0’ 2.p=i 五、编程题 1、编写函数,将一维数组中的元素由大到小排序。 [源程序]: [运行结果]: 第七章 构造数据类型 一、选择题 1、B 2、D 3、D 4、B 5、B 6、A 7、A 8、C 二、填空题 1、99 2、p->no=1001 或(*p).no=1001 3、共用体类型成员v、浮点型数据t成员、双精度ave成员。 4、5 5、4 三、阅读程序题 1、此程序的功能是以一个成员做关键字(name成员),在一批结构体数据中查找信息,根据查找情况相应输出。 运行结果: 输入:李方 输出:李方找到了,很高兴为您服务,再见! 输入:张艳燕 输出:张艳燕不再这里,下次再合作,再见! 2、fun函数的功能是输出参数指针所指结构体变量的name成员值。 运行结果:Zhao 3、共用体变量中在每一瞬时只能存放其中一种成员。能够访问的是共用体变量中最后一次被赋值的成员。 运行结果:1000 4、运行结果为0 四、程序填空题 1、score &stu 2、struct comp x.re+y.re x.im+y.im 3、s[k].name s[k].total s[min].total 4、p<=person+2 q->age q->name 五、编程题 1、编写统计选票的程序。设有3个候选人,有10人参加选举,每个选举人只能输入一个候选人的姓名,要求输出各个候选人的得票数。 答: #include #include using namespace std; struct person { char name[20]; int count; }leader[3]={\"Li\ int main() { int i,j; char leader_name[20]; for(i=1;i<=10;i++) { cin>> leader_name; for(j=0;j<3;j++) if(strcmp(leader_name,leader[j].name)==0)leader[j].count++; } for(i=0;i<3;i++) cout< 运行结果: 第八章 文件 一、选择题 1、B 2、D 3、C 4、D 5、A 6、D 7、C 8、B 二、阅读程序题 此程序调用函数fc来完成将文件中的第一个#之前的字符读取出来并显示在屏幕上。其操作顺序是:先在屏幕上上输出文件a1.txt中的#之前的字符,紧接着再输出a2.txt中的#之前的字符。 运行结 第九章 编译预处理 一、选择题 1、C 2、D 3、C 4、D 5、D 二、填空题 1、9 2、2 3、z=0 4、5 5、4 三、编程题 1、定义一个带参的两个参数的值互换(输入两个参数作为使用宏时的实参,输出已交换后后的两个值)。 答: #include using namespace std; #define S(x,y) int t; t=x;x=y;y=t; int main() { int a,b; cin >> a>> b; S(a,b); cout <<\"a=\" << a <<\ } 运行结果: 2、给出年份year,定义一个宏,以判定该年份是否闰年。 源程序: #include using namespace std; #define LEAP_YEAR(y) (y%4==0&&y%100!=0||y%400==0) int main() { int year; cin >> year; if(LEAP_YEAR(year)) cout << year <<\"is a leap year\"<< endl; else cout << year <<\"is NOT a leap year\"<< endl; return 0; } 运行结果: 果:121314252627 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igbc.cn 版权所有 湘ICP备2023023988号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务