C语言程序设计何欣铭、颜晖第2版课后习题答案.doc_第1页
C语言程序设计何欣铭、颜晖第2版课后习题答案.doc_第2页
C语言程序设计何欣铭、颜晖第2版课后习题答案.doc_第3页
C语言程序设计何欣铭、颜晖第2版课后习题答案.doc_第4页
C语言程序设计何欣铭、颜晖第2版课后习题答案.doc_第5页
已阅读5页,还剩106页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

39 C语言程序的调试、运行步骤修改程序,观察语法错误、逻辑错误及改正方法。语法错误:可以删除一个分号,使编开始编辑源程序.c / .cpp编译目标程序.obj连接可执行程序.exe运行结果译出现错误提示,改正之,再编译。类比写文章有错别字。逻 辑 错 误 : 将sum=sum+i改 为sum=sum-i,编译、连接、运行,发现语法错误1.3 习题参考答案连接错误运行错误运行结果不符合题目要求。找出错误(调试),改正之,再编译、连接、运行,看结果。类比写文章词不达意。1对 C语言来说,下列标识符中哪些是合法的,哪些是不合法的? total_debugLarge&all,Conter1,begin_解答:Large&Tall不合法,其余都合法。 2改写本章 1.4 节中的流程图 1.2,求 1100 中能被 6 整除的所有整数的和。解答:sum = 0i = 1假i = 100?真真sum = sum + ii能被6整除?i = i + 1打印 sum假图 1.1“求 1100 中能被 6 整除的所有整数的和”的流程图113改写本章 1.4 节中的程序,求 1100 中能被 6 整除的所有整数的和,并在编程环境中验证该程序的运行结果。解答:#includeintmain(vid)inti,sum=0;for(i=1;i=100i+)if(i%6=0)sum=sum+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 函数的概念C语言中有两种类型函数标准库函数自定义函数函数可以做到一次定义、多次调用使用自定义函数的程序框架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 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 * *n *n); return 0; 18 2-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(fahr-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(%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 3 2-8 编写程序,输入华氏温度,输出对应的摄氏温度,计算公式同例 2-3。解答:#include int main(void) int celsius, fahr; 19 scanf(%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, average); return 0; 2-10 编写程序,输入 x,计算并输出下列分段函数 f(x)的值(保留 3 位小数)。1y =f x( ) = xx0解答:0x = 0#include int main(void) double x, y; scanf(%lf, &x); if(x != 0) y = 1 / x; else y = 0; printf(f(%.2f) = %.3fn, x, y); return 0; 2-11 编写程序,输入 x,计算并输出下列分段函数 f(x)的值(保留 2 位小数),请调用 sqrt函数求平方根,调用 pow 函数求幂。 + +51xxx0y =f x( )= 2xxx 0解答:#include 20 #include int main(void) double x, y; scanf(%lf, &x); if(x = 0) y = sqrt(x); else y = 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, upper; 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; n12-13 编写程序,输入一个正整数 n,求 i=1解答:#include int main(void) int i, n; double sum; scanf(%d, &n); sum = 0; for(i = 1; i = n; i+) sum = sum + 1.0 / i; printf(sum = %.6fn, sum); i。21 return 0; 2-14 编写程序,输入一个正整数 n,计算1+ + +1 1. 的前 n 项之和。3 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; 2-15 编写程序,输入一个正整数 n,计算1- + -1 11 +1-1+ . 的前 n项之和。4 7 10 13 16解答:#include int main(void) int flag, i, n, denominator; 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.h 22 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 = 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!,函数类型是 double。解答:#include int main(void) 23 int 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 个不同元素中取出 m 个元素(mn)的组合数。编写程序,输入 2 个正整数 m 和 n(mn),计算并输出组合数。要求定义和调用函数 fact(n)计算 n!,函数类型是 double。mCn=解答:!(n!-)!#include stdio.h double 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 product; product = 1; for(i = 1;i = n; i+) 24 product = 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 * %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(void) double cost, e; scanf(%d, &repeat); scanf(%lf, &e); if(e = 50) cost = 0.53 * e; else cost = 0.53 * 50 + (e - 50) * 0.58; printf(cost = %.2fn, cost); return 0; 3编写程序,输入实数 x 和正整数 n,计算 xn,不允许调用 pow 函数求幂。解答:#include int main(void) 25 int i, n; double mypow, x; scanf(%lf%d, &x, &n); mypow = 1; for(i = 1; i = n; i+) mypow = mypow * x; printf(%.2fn, mypow); return 0; n(i2+1)4编写程序,输入两个正整数 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; i。5编写程序,输入一个正整数 n,计算解答:#include 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; 1 - + - + -2 3 4 56 + .3 5 7 9 11的前 n项之和。26 printf(sum = %.3fn, sum); return 0; 6某客户为购房办理商业贷款,选择了按月等额本息还款法,计算公式如下,在贷款本金(loan)和月利率(rate)一定的情况下,住房贷款的月还款额(money)取决于还款月数(month)。客户打算在 530 年的范围内选择还清贷款的年限,想得到一张“还款年限月还款额表”以供参考。编写程序,输入贷款本金 loan 和月利率 rate,输出“还款年限月还款额表”,还款年限的范围是 530 年,输出时分别精确到年和元。rate+ rate)monthmoney loan解答:(1(1+ rate)month-1#include #include int main(void) int year; double loan, money, mypow, rate; scanf (%lf%lf, &loan, &rate); printf( year moneyn); for(year = 5; year = 30; year+) mypow = pow(1+rate, 12 * year ); money = loan * rate * mypow /( mypow - 1); printf(year=%d money=%.0fn, year, money); return 0; n 2i7编写程序,输入一个正整数 n,求 i=1,可以调用 pow 函数求幂。解答:#include #include int main(void) int i, n; double sum; scanf(%d, &n); sum = 0; for(i = 1; i = n; i+) sum = sum + pow(2, i); printf(sum = %.0fn, sum); 27 return 0; ne = i !8编写程序,输入一个正整数 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; double product; product=1; for(i = 1; i = n; i+) product = product * i; return product; 2.4 实验指导教材参考答案2.4.1 基本数据处理一、调试示例:略二、改错题:略三、编程题i=0。要求定义和调用函数 fact(n)计算 n!,函数类1求华氏温度 150F 对应的摄氏温度。计算公式如下,其中:c 表示摄氏温度,f 表示华氏温度。5532c = - f9928 45 46 改变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) y = x + 1; if (x 1) y = x + 1; else;else y = x + 2;else y = x + 2;本章总结若要改变 else 正常的配对规则,一般采用两种方法:采用,构造一个复合语句。增加空的 else 语句;归纳总结本章的各个重要知识点。分支结构:if-else语句else if正确理解if语句和switch语句的执行机制;掌握各类关系表达式、逻辑表达式的运用;分支结构: switch语句 能合理运用分支语句熟练编写case后为常量表达式break的使用数据类型:char型运算符与表达式逻辑运算符、关系运算符逻辑表达式分支结构类的程序;分支结构程序的综合设计3.3 练习与习题参考答案3.3.1 练习参考答案练习 3-1 例 3-4 中使用 else-if 语句求解多分段函数,为了检查 else-if 语句的三个分支是否正确,已经设计了三组测试用例,请问还需要增加测试用例吗?为什么?如果要增加,请给出具体的测试用例并运行程序。解答:最好再增加两组测试用例,因为尚未对分段函数参数的边界值进行测试。可再给出 x=0和 x=15 时的两种情况。练习 3-2输入一个整数 x,计算并输出下列分段函数 sign(x) 的值。- 1, x 0y= sign(x) =,x=解答:#include int main(void) int x, y; 01,0x 0 printf(Enter x: ); scanf(%d,&x); if(x0) 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 average = %.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+; else other+; printf(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); else printf(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,输出 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: printf(%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 次时,用户可以选择退出。当用户输入编号 14,显示相应水果的单价(保留两位小数);输入 0,退出查询;输入其他编号,显示价格为 0。1 apples 2 pears 3 oranges 4 grapes 0 Exit 解答:#include int main(void) int ri; int choice; float price;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论