《C语言程序设计(何欣铭、颜晖_第2版)课后习题答案.docx》由会员分享,可在线阅读,更多相关《C语言程序设计(何欣铭、颜晖_第2版)课后习题答案.docx(106页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、39C语言程序的调试、运行步骤修改程序,观察语法错误、逻辑错误及改正方法。 语法错误:可以删除一个分号,使编编辑编译连接运行译出现错误提示,改正之,再编译。类比写文章有错别字。开始源程序.c / .cpp语法错误目标程序.obj连接错误可执行程序.exe运行错误结果 逻 辑 错 误 : 将 sum=sum+i 改 为sum=sum-i,编译、连接、运行,发现运行结果不符合题目要求。找出错误(调试),改正之,再编译、连接、运行,看结果。类比写文章词不达意。1.3 习题参考答案1对 C语言来说,下列标识符中哪些是合法的,哪些是不合法的?total,_debug,Large&Tall,Counter
2、1,begin_解答:Large&Tall不合法,其余都合法。2改写本章 1.4 节中的流程图 1.2,求 1100 中能被 6 整除的所有整数的和。解答:sum = 0i = 1真i = 100?真假假i能被6整除?sum = sum + ii = i + 1打印 sum图 1.1 “求 1100 中能被 6 整除的所有整数的和”的流程图113改写本章 1.4 节中的程序,求 1100 中能被 6 整除的所有整数的和,并在编程环境中验证该程序的运行结果。解答:#includeintmain(void)inti,sum=0;for(i=1;i=100;i+)if(i%6= 0) sum=sum
3、+i;printf(%d,sum);return0;运行结果:8164对于给定的整数 n(n1),请设计一个流程图判别 n 是否为一个素数(只能被 1 和自己整除的整数),并分析该流程图中哪些是顺序结构、哪些是分支结构与循环结构。解答: 在流程图中,分支结构和循环结构如图 1.2 所示,自上而下的 2 个实线框和 2 个虚线组成了顺序结构。输入ni = 2假in/2?假假打印n不是素数循环结构分支结构#include int main(void )printf( An);printf(A An);printf( An);return 0;1462函数的概念n C语言中有两种类型函数简单总结本节
4、内容。使学生了解自定义函数编程结构,能够模仿编程即可。标准库函数自定义函数n 函数可以做到一次定义、多次调用n 使用自定义函数的程序框架double fact(int n);int main(void)/* 声明自定义函数,以分号结束 */result = fact(i);/* 调用自定义函数fact(i)计算i! */* 定义求 n! 的函数 */2.3 练习与习题参考答案2.3.1 练习参考答案2-1 编写程序,在屏幕上显示一个短句“Programming in C is fun!”。解答:#include int main(void)printf(Programming in C is
5、fun!n);return 0;2-2 下列语句的运行结果是什么?与例 2-2 的运行结果有何不同?为什么?printf(Programming is fun. And Programming in C is even more fun!n);解答:运行结果:Programming is fun. And Programming in C is even more fun!例 2-2 的运行结果分 2 行显示。原因在于,例 2-2 中在每条输出语句的结尾都采用了n换行。2-3 编写程序,在屏幕上显示如下图案。*解答:int main(void)printf(* * * *n * * *n *
6、*n*n);return 0;182-4 编写程序,求华氏温度 150F 对应的摄氏温度(计算公式同例 2-3)。解答:#include int main(void)int celsius, fahr;fahr = 150;celsius = 5 * (fahr 32) / 9;printf(fahr = %d, celsius = %dn, fahr, celsius);return 0;2-5 算 术 表 达 式 5*(fahr-32)/9 能 改 写 成 5(fahr-32)/9 吗 ? 为 什 么 ? 如 果 将 其 改 写 为5/9*(fahr-32),会影响运算结果吗?解答:5(f
7、ahr-32)/9 不是合法的 C 表达式,因为不能省略运算符*;5/9*(fahr-32)的值为 0。2-6 一个物体从 100 米的高空自由落下,编写程序,求它在前 3 秒内下落的垂直距离。设重力加速度为 10m/s2。解答:#include int main(void)double height;height = 0.5 * 10 * 3 * 3;printf(height = %.2fn, height);return 0;2-7 输入提示和输入语句的顺序应该如何安排?例 2-5 中,scanf(%d%d%lf, &money, &year,&rate) 能 改 写 为 scanf(%
8、d%lf%d, &money, &year, &rate) 吗 ? 为 什 么 ? 能 改 写 为scanf(%d%lf%d, &money, &rate, &year) 吗?如果可以,其对应的输入数据是什么?解答:输入提示在前,输入语句在后。不能改写为 scanf(%d%lf%d, &money, &year, &rate),因为%lf 与整型变量 money 不匹配,%d 与浮点型变量 rate 不匹配。与 scanf(%d%lf%d, &money, &rate, &year)对应的输入数据为:1000 0.025 32-8 编写程序,输入华氏温度,输出对应的摄氏温度,计算公式同例 2-
9、3。解答:#include int main(void)int celsius, fahr;19scanf(%d, &fahr);celsius = 5 * (fahr - 32) / 9;printf(celsius = %dn, celsius);return 0;2-9 编写程序,输入 3 个整数,计算并输出它们的平均值。解答:#include int main(void)int a, b, c;double average;scanf(%d%d%d, &a, &b, &c);average = (a + b + c) * 1.0 / 3;printf(average = %.2fn,
10、average);return 0;2-10 编写程序,输入 x,计算并输出下列分段函数 f(x)的值(保留 3 位小数)。 1y = f ( x) = x 0x 0x = 0解答:#include int main(void)double x, y;scanf(%lf, &x);if(x != 0)y = 1 / x;elsey = 0;printf(f(%.2f) = %.3fn, x, y);return 0;2-11 编写程序,输入 x,计算并输出下列分段函数 f(x)的值(保留 2 位小数),请调用 sqrt函数求平方根,调用 pow 函数求幂。x 0y = f (x) = x解答:
11、#include 20x + 2x + 5 1x x 0#include int main(void)double x, y;scanf(%lf, &x);if(x = 0)y = sqrt(x);elsey = pow(x,5) + 2 * x + 1 / x;printf(f(%.2f) = %.2fn, x, y);return 0;2-12 编写程序,输入 2 个整数 lower 和 upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是lower, upper,每次增加 2F,计算公式同例 2-7。解答:#include int main(void)int lower, upp
12、er;double celsius, fahr;scanf(%d%d, &lower, &upper);printf(fahr celsiusn);for(fahr = lower; fahr = upper; fahr = fahr + 2)celsius = 5 * (fahr - 32.0)/9 ;printf(%3.0f %6.1fn, fahr, celsius);return 0;n2-13 编写程序,输入一个正整数 n,求 i =1 。解答:#include int main(void)int i, n;double sum;scanf(%d, &n);sum = 0;for(i
13、 = 1; i = n; i+)sum = sum + 1.0 / i;printf(sum = %.6fn, sum);211ireturn 0;1 13 5解答:#include int main(void)int i, n;double sum;scanf(%d, &n);sum = 0;for(i = 1; i = n; i+)sum = sum + 1.0/(2*i-1);printf(sum = %.6fn, sum);return 0;1 1 1 1 14 7 10 13 16解答:#include int main(void)int flag, i, n, denominato
14、r;double item, sum;scanf(%d, &n);sum = 0;flag = 1;denominator = 1;for(i = 1; i = n; i+)item = flag * 1.0 / denominator;sum = sum + item;flag = -flag;denominator = denominator + 3;printf(sum = %.3fn, sum);return 0;2-16 编写程序,输入两个正整数 m 和 n,计算 m! + n!。解答:#include stdio.h222-14 编写程序,输入一个正整数 n,计算1 .+ + +
15、的前 n 项之和。2-15 编写程序,输入一个正整数 n,计算1 .- + - + - + 的前 n 项之和。int main(void)int i, m, n;double fm, fn;scanf(%d%d, &m, &n);fm = 1;for(i = 1; i = m; i+)fm = fm * i;fn = 1;for (i = 1; i = n; i+)fn = fn * i;printf(%d! + %d! = %.0fn, m, n, fm+fn);return 0;2-17 执行下列程序段后,sum 的值是。for (i = 1; i = 10; i+)sum = 0;sum
16、 = sum + i;解答:sum 的值是 10。2-18 输入一个正整数 n,生成一张 3 的乘方表,输出 30 到 3n 的值,可以调用幂函数计算 3的乘方。解答:#include #include int main(void)int i, n;double mypow;scanf(%d, &n);for(i = 0; i = n; i+)mypow = pow(3, i);printf(pow(3,%d) = %.0fn, i, mypow);return 0;2-19 输入一个正整数 n,生成一张阶乘表,输出 1!到 n!的值。要求定义和调用函数 fact(n)计算 n!,函数类型是
17、double。解答:#include int main(void)23int i, n;double myfact;double fact(int n);scanf(%d, &n);for(i = 1; i = n; i+)myfact = fact(i);printf(%d! = %.0fn, i, myfact);return 0;double fact(int n)int i;double product;product = 1;for(i = 1;i = n; i+)product = product * i;return product;2-20 根据下列公式可以算出从 n 个不同元
18、素中取出 m 个元素(mn)的组合数。编写程序,输入 2 个正整数 m 和 n(mn),计算并输出组合数。要求定义和调用函数 fact(n)计算 n!,函数类型是 double。Cnm =n!m!(n - m)!解答:#include stdio.hdouble fact(int n);int main(void)int m, n;double s;scanf(%d%d, &m, &n);s = fact(n)/(fact(m) * fact(n-m);printf(result = %.0fn, s);return 0;double fact(int n)int i;double produ
19、ct;product = 1;for(i = 1;i = n; i+)24product = product * i;return product;2.3.2 习题参考答案1编写程序,输入两个整数 num1 和 num2,计算并输出它们的和、差、积、商与余数。解答:#include int main(void)int num1, num2;scanf(%d%d, &num1, &num2);printf(%d + %d = %dn, num1, num2, num1+num2);printf(%d - %d = %dn, num1, num2, num1-num2);printf(%d * %
20、d = %dn, num1, num2, num1*num2);printf(%d / %d = %dn, num1, num2, num1/num2);printf(%d % %d = %dn, num1, num2, num1%num2);return 0;2为了倡导居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分两个“阶梯”:月用电量 50 千瓦时以内的,电价为 0.53 元/千瓦时;超过 50 千瓦时的用电量,电价上调 0.05 元/千瓦时。编写程序,输入用户的月用电量(千瓦时),计算并输出该用户应支付的电费(元)。解答:#include int main(vo
21、id)double cost, e;scanf(%d, &repeat);scanf(%lf, &e);if(e = 50)cost = 0.53 * e;elsecost = 0.53 * 50 + (e - 50) * 0.58;printf(cost = %.2fn, cost);return 0;3编写程序,输入实数 x 和正整数 n,计算 xn,不允许调用 pow 函数求幂。解答:#include int main(void)25int i, n;double mypow, x;scanf(%lf%d, &x, &n);mypow = 1;for(i = 1; i = n; i+)m
22、ypow = mypow * x;printf(%.2fn, mypow);return 0;n4编写程序,输入两个正整数 m 和 n,求 i =m解答:#include int main(void)int i, m, n;double sum;scanf(%d%d, &m, &n);sum = 0;for(i = m; i = n; i+)sum = sum + i * i + 1.0 / i;printf(sum = %.6fn, sum);return 0;21i 。5编写程序,输入一个正整数 n,计算1 -2 3 4 5 63 5 7 9 11的前 n 项之和。解答:#include
23、int main(void)int flag, i, n;double item, sum;scanf(%d, &n);sum = 0;flag = 1;for(i = 1; i = n; i+)item = flag * 1.0 * i / (2 * i - 1);sum = sum + item;flag = -flag;26 (i+ )+ - + - + .printf(sum = %.3fn, sum);return 0;6某客户为购房办理商业贷款,选择了按月等额本息还款法,计算公式如下,在贷款本金(loan)和月利率(rate)一定的情况下,住房贷款的月还款额(money)取决于还款
24、月数(month)。客户打算在 530 年的范围内选择还清贷款的年限,想得到一张“还款年限月还款额表”以供参考。编写程序,输入贷款本金 loan 和月利率 rate,输出“还款年限月还款额表”,还款年限的范围是 530 年,输出时分别精确到年和元。money = loan rate(1 + rate)month(1 + rate)month - 1解答:#include #include int main(void)int year;double loan, money, mypow, rate;scanf (%lf%lf, &loan, &rate);printf(yearmoneyn);f
25、or(year = 5; year = 30; year+)mypow = pow(1+rate, 12 * year );money = loan * rate * mypow /( mypow - 1);printf(year=%dreturn 0;money=%.0fn, year, money);7编写程序,输入一个正整数 n,求ni =1i,可以调用 pow 函数求幂。解答:#include #include int main(void)int i, n;double sum;scanf(%d, &n);sum = 0;for(i = 1; i = n; i+)sum = sum +
26、 pow(2, i);printf(sum = %.0fn, sum);27 2return 0;8编写程序,输入一个正整数 n,求ni = 0。要求定义和调用函数 fact(n)计算 n!,函数类型是 double。解答:#include int main(void)int i, n;double sum;double fact(int n);scanf(%d, &n);sum = 0;for(i = 0; i = n; i+)sum = sum + fact(i);printf(sum = %.0fn, sum);return 0;double fact(int n)int i;doubl
27、e product;product=1;for(i = 1; i = n; i+)product = product * i;return product;2.4 实验指导教材参考答案2.4.1 基本数据处理一、调试示例:略二、改错题:略三、编程题1求华氏温度 150F 对应的摄氏温度。计算公式如下,其中:c 表示摄氏温度,f 表示华氏温度。c =5 59 928e = i! f - 323.3 练习与习题参考答案3.3.1 练习参考答案练习 3-1 例 3-4 中使用 else-if 语句求解多分段函数,为了检查 else-if 语句的三个分支是否正确,已经设计了三组测试用例,请问还需要增加
28、测试用例吗?为什么?如果要增加,请给出具体的测试用例并运行程序。解答:最好再增加两组测试用例,因为尚未对分段函数参数的边界值进行测试。可再给出 x=0和 x=15 时的两种情况。练习 3-2 输入一个整数 x,计算并输出下列分段函数 sign(x) 的值。- 1, x 0解答:#include int main(void)int x, y;45改变else 和 if 的配对例3-12 改写下列 if 语句,使 else 和第1个 if 配对。if (x 2)if (x 1) y = x + 1;else y = x + 2;每条语句的执行条件?if (x 2) if (x 2)if (x 1)
29、 y = x + 1; if (x 0) y=1;else if (x=0) y=0;else y=-1;printf(sign( %d ) = %dn,x,y);return 0;练习 3-3 输入一个正整数 n,再输入 n 个学生的成绩,计算平均成绩,并统计所有及格学生的人数。解答:# include int main(void)int count, i, n;double grade, total;printf(Enter n: );scanf(%d, &n);total = 0;count = 0;for(i = 1; i = 60) count+;printf(Grade avera
30、ge = %.2fn, total / n);printf(Number of pass = %dn, count);return 0;练习 3-4 输入 15 个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。解答:#include int main(void)int i;int blank, digit, letter, other;char c;blank = digit = letter = other = 0;for(i=1;i=a & c =A & c =0 & c = 9)digit+;else if(c= |c=n)blank+;elseother+;printf
31、(letter=%d,blank=%d,digit=%d,other=%dn, letter, blank, digit, other);return 0;练习 3-5输入一个年份 year,判断该年是否为闰年。判断闰年的条件是:能被 4 整除但不能被 100 整除,或者能被 400 整除。解答:# include int main(void)int year;printf(Enter year: );scanf(%d, &year);if( (year % 4 = 0 & year % 100 != 0 ) | year % 400 = 0)printf(It is a leap yearn
32、);elseprintf(It is not a leap yearn );return 0;练习 3-6 在例 3-8 程序中,如果把 switch 语句中所有的 break 都去掉,运行结果会改变吗?如果有变化,输出什么?为什么?解答:如果去掉所有的 break 语句,运行结果会改变,输出 price = 0.0 ,因为不管 choice 值与其中某个常量表达式相等,当去掉 break 语句时,其后的所有语句段都将运行,故每次都将执行到 price=0.0 语句为止。练习 3-7 输入五级制成绩(AE),输出相应的百分制成绩(0100)区间,要求使用 switch语句。例如,输入 A,输出
33、 90100。五级制成绩对应的百分制成绩区间为:A(90-100)、B(80-89)、C(70-79)、D(60-69)和 E(0-59)。解答:#include int main(void)char ch;printf(Input Grade: );ch = getchar();switch(ch)case A: printf(%c 对应的百分制区间是 90-100n,ch); break;case B: printf(%c 对应的百分制区间是 80-89n,ch); break;case C: printf(%c 对应的百分制区间是 70-79n,ch); break;case D: pr
34、intf(%c 对应的百分制区间是 60-69n,ch); break;case E: printf(%c 对应的百分制区间是 0-59n,ch); break;default: printf(Invalid inputn);return 0;练习 3-8 查询水果的单价。有 4 种水果,苹果(apples)、梨(pears)、桔子(oranges)和葡萄(grapes),单价分别是 3.00 元/公斤,2.50 元/公斤,4.10 元/公斤和 10.20 元/公斤。在屏幕上显示以下菜单(编号和选项),用户可以连续查询水果的单价,当查询次数超过 5 次时,自动退出查询;不到 5 次时,用户可以
35、选择退出。当用户输入编号 14,显示相应水果的单价(保留两位小数);输入 0,退出查询;输入其他编号,显示价格为 0。1 apples2 pears3 oranges4 grapes0 Exit解答:#include int main(void)int ri;int choice;float price;for(ri=1; ri=5; ri+)printf(1 applesn);printf(2 pearsn);printf(3 orangesn);printf(4 grapesn);printf(0 Exitn);scanf(%d, &choice);if(choice=0)break;else switch(choice)case 1: price=3.00; break;case 2: price=2.50; break;case 3: price=4.10; break;case 4: price=10.20; break;default: price=0;printf(price=%0.2fn, price);return 0;练习 3-9 请读者重新编写例 3-4 的程序,要求使用嵌套的 if - else 语句,并上机运行。解答:#inclu
限制150内