谭浩强C语言程序设计基础课后题答案_第1页
谭浩强C语言程序设计基础课后题答案_第2页
谭浩强C语言程序设计基础课后题答案_第3页
谭浩强C语言程序设计基础课后题答案_第4页
谭浩强C语言程序设计基础课后题答案_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

1、课后题答案第一章 程序设计基本概念习题分析与解答11 【参考答案】 .EXE12 【参考答案】 1 .C 2 .OBJ 3 .EXE13 【参考答案】 1 顺序结构 2 选择结构 3 循环结构第二章 C程序设计的初步知识习题分析与解答一、 选择题21 【参考答案】 B)22 【参考答案】 D)23 【参考答案】 B)24 【参考答案】 A)25 参考答案】 C)26 【参考答案】 A)27 【参考答案】 B)28 【参考答案】 B)29 【参考答案】 D)210 【参考答案】 C)211 【参考答案】 B)212 【参考答案】 B)213 【参考答案】 A)二、 填空题214 【参考答案】 1

2、 11 2 12215 【参考答案】 1 4.2 2 4.2216 【参考答案】 1 2 3 定义 4 执行217 【参考答案】 1 关键字 2 用户标识符218 【参考答案】 1 int 2 float 3 double219 【参考答案】 float a1=10, a2=10;或float a1=1, a2=1;(系统将自动把1转换为10)220 【参考答案】 存储单元221 【参考答案】 3.5222 【参考答案】 1 a*b/c 2 a/c*b 3 b/c*a223 【参考答案】 把10赋给变量s224 【参考答案】 1 位 2 0或1225 【参考答案】 1 8 2 127 3 -1

3、28 4 11111111226 【参考答案】 1 32767 2 -32768 3 1111111111111111227 【参考答案】 1 十 2 八 3 十六三、 上机改错题228 【分析与解答】 第1行的错误:(1) include是一个程序行,因此在此行的最后不应当有分号(;)。(2) include程序行中后面的stdio.h是一个文件名,按规定,文件名应当放在一对双引号( )内,或放在一对尖括号(< >)内。第2行的错误:(1) main()是主函数的起始行,不是语句,因此最后不应当有分号(;)。(2) 在同一行上的/ * main function * / 显然是注

4、释;C语言规定:注释由/*开头,由*/结束,但在*号和/之间不得插入任何空格,而在此处“/ *”和“/ *”之间存在空格,因此,/ * main function * /的写法式是错误的,而应写成:/* main function */。第3行的错误:(1) 在主函数的起始行main()的后面是函数体,函数体由左花括号()开始。但在函数体的第一行:float的前面缺少了左花括号()。(2) 在同一行上的/* /*r is radius*/, /* s is area of circular*/ */ 显然是注释;C语言规定:注释由/*开头,由*/结束,并且开头的/*将去找最近的*/去配对,因此

5、在/* /*r is radius*/中,第一个/*与最后的那个*/配上了对,结果紧跟在后面的那个逗号(,)落在了注释的外面,而构成了一个多余符号,为此,在编译时将报告“语法错”。第6行的错误:(1) printf(%f KG-*3n,s)应当是一条输出语句,但在最后缺少了一个分号。(2) printf(%f KG-*3n,s);是程序的最后一条语句,程序应当结束;但缺少了程序体结束所需的右花括号();此右花括号可以放在printf(%f KG-*3n,s);的后面,也可以放在printf(%f KG-*3n,s);的下一行上。227 【分析与解答】第1行的错误:在include行中的文件名应

6、该是stdio.h,而不是stdio.a。第2行的错误:在main的后面缺少一对圆括号。第4行的错误:在c=40的后面缺少分号。第6行的错误:在printf(%f KG-*3n,v)的后面缺少分号。 都市闲人 2006-1-6 10:17 全国计算机等级考试二级教程C语言程序设计习题分析与解答(二) 第三章 顺序结构习题分析与解答一、选择题 (单选题)3.1 【参考答案】 C)3.2 【参考答案】 C)3.3 【参考答案】 D)3.4 【参考答案】 C)3.5 【参考答案】 D)3.6 【参考答案】 B)3.7 【参考答案】 C)3.8 【参考答案】 C)3.9 【参考答案】 A)3.10 【

7、参考答案】 B)3.11 【参考答案】 C)3.12 【参考答案】 D)3.13 【参考答案】 D)3.14 【参考答案】 A)3.15 【参考答案】 C)3.16 【参考答案】 C)3.17 【参考答案】 C)3.18 【参考答案】 D)3.19 【参考答案】 C)3.20 【参考答案】 B)二、 填空题3.21 【参考答案】 (1) -200,2500 (2) i=-200,j=2500(3) i=-200j=25003.22 【参考答案】 1 12 2 0 3 03.23 【参考答案】 1 一条语句 2 分号(或;)3.24 【参考答案】 分号(;)3.25 【参考答案】 1:100 2

8、5.82 1.892342: 100 <回车符>25.82 <回车符>1.89234 <回车符>3:100 <制表符> 25.82 <制表符> 1.892343.26 【参考答案】 x=127, x= 127, x= 177,x= 7f, x= 1273.27 【参考答案】 x=127, x=127 , x=127 ,x= 000127, x=%06d3.28 【参考答案】 a=513.789215,a= 513.79,a= 513.78921500,a= 513.78921500三、 编程题和改错题3.29 【分析与解答】 (1)

9、主函数名main后应有一对圆括号。(2) 变量定义语句中,v的前面缺逗号。(3) 第三行的printf语句用以提示输入,但是原样输出的字符串没有用双引号括起来;另外,从输入的形式看,输入的数据紧跟在提示之后,因此,printf格式串中最后不应该有换行符n。(4) 因为输入项a、b、c从定义和计算结果来看都是double类型,因此,第四行scanf语句格式串中的格式说明不应当用%d而应当用%lf;且每一个变量之前应该加地址运算符&。(5) 第七行的printf语句中应当把%d都改成%lf或%f;按输出要求在格式串中应添加相应的原样输出的字符;因为下一个printf的输出从新的一行开始,因

10、此在本输出语句的格式串的最后应当加换行符n。(6) 第八行的printf语句中应当把格式串整理合并放在输出项的前面,输出项放在后面,%d都改成%lf或%f;中间的n删去。(7) 请读者自己写出修改后的程序,并上机调试。3.30 【分析与解答】 (1) 分析:可用算术式560÷60把分钟换算成小时和分钟,商数就是小时数,余数就是分钟数。(2) 确定变量的名字和定义变量的类型:在程序中把小时数放在变量h中,把分钟数放在变量m中。这两个变量的类型可以是整型(本题中采用整型),也可以是实型。(3) 确定所用算法:求SX()56060SX的商数,在C语言中可以用整除的算法,语句是h=560/6

11、0;。求余数可用求余运算符 %:560%60,其值放入变量m中的语句是:m=560%60;。(4) 设计输出格式。若输出的形式定为:小时:分钟,则按此形式设计输出语句。(5) 把以上内容放在主函数的一对花括号中。(6) 编写程序如下: main() int h, m; h=560/60; m=560%60; printf(The result: %3d : %3dn, h,m); 运行结果是: The result: 9 : 203.31 【分析与解答】 (1) 确定变量的名字和定义变量的类型。若用a存放1500,用b存放350;用q存放商数,用r存放余数,所有变量应定义成int类型。(2)

12、设计输入语句从终端输入1500和350;在输入语句之前,应当设计一个输出语句,用以提示输入。(3) 可用整除求商数,结果放在变量q中。可用求余运算符%求两数之余数,结果放在变量r中。(4) 设计输出语句。输出a、b、q、r。(5) 把以上内容放在主函数的一对花括号中。本题的程序与3.30相似,请读者参考上题并根据本题的解释自己编程,并上机调试。3.32 【分析与解答】 (1) 定义4个双精度变量a、b、c和ave,变量a、b、c分别存放读入的3个双精度数,ave存放它们的平均值。(2) 设计输入语句,以及在此之前用于提示输入的(printf)语句。(3) 设计求平均值的算法,把所求得的平均值放

13、入变量ave中。(4) 设计把变量ave中的数,从小数点后第二位数进行四舍五入的算法。现举例说明:若ave中的数为123.4644,为了保留此值小数点后一位,可用表达式:(int)(123.4644*10)/10.0;依次推算,为了保留此值小数点后二位,可用表达式:(int)(123.4644*100)/100.0;其他依此类推。(5) 若要求对小数点后第二位数进行四舍五入,则可对原数加0.05后再进行以上运算。如要求保留123.4644小数点后一位且对第二位数进行四舍五入,可用表达式:(int)(123.467+0.05)*10)/10.0。注意:分母一定要用实数10.0而不能用整数10,否

14、则就变成整除了;若要求保留123.4644小数点后两位且对第三位数进行四舍五入,可用表达式:(int)(123.467+0.005)*100)/100.0;其他依此类推。(6) 设计输出语句。输出a、b、c和ave。(7) 把以上内容放在主函数的一对花括号中。(8) 编写程序如下:main() double a,b,c,ave;printf(Enter a ,b ,c : );scanf(%lf%lf%lf, &a, &b, &c );ave=(a+b+c)/3;printf(ave=%fn, ave); /*用以比较四舍五入前后的数据*/ave=(int)(ave+0

15、.05)*10)/10.0;printf(a=%f, b=%f, c=%f, ave=%fn, a,b,c,ave); 3.33 【分析与解答】 (1) 关于对变量中的数进行交换的算法请参考3.7题中的解释和教程中有关的例题。(2) 定义4个整型变量a、b、c和t,变量a、b、c分别存放读入的3个整数,t用作临时存储单元。(3) 设计输入语句,以及在此之前用于提示输入的(printf)语句。(4) 输出a、b、c中的值,以便于比较。(5) 交换的步骤如下: 把c中的值赋给t。 把b中的值赋给c。 把a中的值赋给b。 把t中的值赋给a。经过以上步骤,已按要求进行了交换。(6) 输出a、b、c中的

16、值。(7) 编写程序如下:main() int a, b, c, t;printf(Enter a, b, c :n);scanf(%d%d%d,&a,&b,&c);printf(1) a=%d,b=%d,c=%dn,a,b ,c);t=c; c=b; b=a; a=t;printf(2) a=%d,b=%d,c=%dn,a,b,c); 都市闲人 2006-1-6 10:17 第四章 选择结构习题分析与解答一、 选择题4.1 【参考答案】 A)4.2 【参考答案】 B)4.3 【参考答案】 A)4.4 【参考答案】 D)4.5 【参考答案】 C)4.6 【参考答案】 A

17、)4.7 【参考答案】 B)4.8 【参考答案】 C)4.9 【参考答案】 D)4.10 【参考答案】 D)二、 填空题4.11【参考答案】 1 非零 2 零4.12【参考答案】 <、>、<=、>=、=、!KG-*2=4.13 【参考答案】 1 ! 2 && 3 JB>1|JB>1|4.14【参考答案】 1:!KG-*2(逻辑非) 2:<、>、<=、>=(小于、大于、小于等于、大于等于) 3:=、!KG-*2=(等于、不等) 4:&&(逻辑与) 5:JB>1|JB>1|(逻辑或)。 4.15

18、 【参考答案】 !4.16 【参考答案】 1 a=b 或 a<c2 JB>1|xJB>1|>44.17 【参考答案】 14.18 【参考答案】 1 x<=0 2 14.19 【参考答案】 1 3 2 2 3 24.20 【参考答案】 *#三、 编程题4.21 【分析与解答】 相关内容请参考教程4.2节和4.4节。(1) 改写如下:switch(a/10) default : m=5; break;case 0 : case 1 : case 2 : m=1; break;case 3 : m=2; break;case 4 : m=3; break;case 5

19、: m=4; break; ; (2) 本题中对a的判断条件有一定的规律可寻;关键是,在switch语句后的表达式中利用了a/10,从而简化了case标号。4.22 【分析与解答】 编写本题的程序,首先要解决如何计算学生当前的年龄(设存放实足年龄的变量是age)。(1) 如果当前的月份大于生日的月份,则学生的实足年龄age=y1-y0。(2) 如果当前的月份等于生日的月份,就要看日数,当前的日数大于或等于生日的日数,则学生的实足年龄age=y1-y0。(3) 如果不满足以上的条件,就可断定当前的日期没有超过生日日期,就是说学生的年龄应当是age=y1-y0-1。以上3条,用C语言可以描述如下:

20、 if(m1>m0)JB>1|JB>1|(m1=m0&&d1>=d0) age=y1-y0; else age=y1-y0-1;读者可以参考以上语句写出程序,也可以根据分析写出与此形式不同的语句和程序。4.23【分析与解答】 (1) 若输入的整数a是奇数,输出:odd number,是偶数输出:even number。(2) 若一个a是偶数,它就能被2除尽,即a%2=0,输出even number;若是奇数,它就不能被2除尽,即a%2!KG-*2=0,输出odd number。读者可以参考以上给出的算法,写出相应的C语句,并编写出完整的程序。4.24 【

21、分析与解答】 本题的主要算法是从3个数中找出最大的那个数。假定始终把最大的数放在变量max中。(1) 假定a中的数最大,把a赋给max。(2) 用b去和max比较,若b大于max,则把b赋给max;若不大于max,则什么也不做。(3) 用c去和max比较,若c大于max,则把c赋给max;若不大于max,则什么也不做。(4) 经过以上操作,max中已放入了a、b、c三个数中的最大数,输出max即可。读者可以参考以上给出的算法,写出相应的C语句,并编写出完整的程序。4.25 【分析与解答】 (1) 本题已给出了非常明确的条件,只要写出正确的条件判断语句就可基本完成程序的编写。(2) 由给出的函数

22、可知,只有x的值在规定的范围内时,才求出y的值,因此程序应当对输入的x进行判断,若超过范围就不求y的值。(3) 现以使用ifCD#*2else语句为例写出程序供参考。 main() int x,y;printf(Enter x : ); scanf(%d, &x);if(x>-5&&x<10) if(x=0) y=x-1;else if(x<10 && x>0 ) y=x+1;else if(x<0 && x>-5) y=x;printf(x=%d y=%dn, x,y); printf(*END*nn

23、); 都市闲人 2006-1-6 10:18 第五章 循环结构习题分析与解答一、 选择题 (单选题)5.1【参考答案】 D)5.2【参考答案】 C)5.3 【参考答案】 B)5.4 【参考答案】 C)5.5 【参考答案】 C)5.6 【参考答案】 B)5.7 【参考答案】 D)5.8【参考答案】 A)5.9 【参考答案】 D)5.10【参考答案】 D)二、 填空题5.11 【参考答案】 1 5 2 4 3 65.12【参考答案】 程序段无限循环,没有输出结果5.13 【参考答案】 -15.14【参考答案】 115.15【参考答案】 1 d=1.0 2 k+ 3 k<=n5.16 【参考答

24、案】 1 x>=0 2 x<amin三、 编程题5.17【分析与解答】 (1) 本题的基本算法是求累加值。累加项的值有规律的递增,每一项的绝对值比前一项增2,因此可以利用循环的控制变量的递增来得到累加项的绝对值。例如: for( i=1; i<=101; i+=2 )(2) 按所给的算式可以看到,累加项的符号是在交叉改变的,为此应当在循环体内设置一个变量,使它的符号按此规律交叉改变,这可用:s=-s;来实现,s的初值为1;当s的值为1时,赋值后s中新的值为-1,当s的值为-1时,赋值后s中新的值为1。用s去乘累加项,将使累加项的符号也随之有规律地改变。(3) 若累加和放在变量

25、sum中,累加项放在变量t中,按照以上叙述,for循环体内的语句可以设计如下: s=-s; t=s*i; sum=sum+t;(4) sum的值是51。(5) 请读者自己对变量做出正确的定义并赋初值,设计输出语句,完善程序。5.18 【分析与解答】 (1) 本题的基本算法是求累加值。累加项的分子部分都是1;分母的值有规律的递增,依次为1!、2!、n!,即,若第i-1项的累加项为t(i-1),则第i项的累加项是 t( i-1)*i,在程序中可用表达式:t=t/i(i从1变化到n)来表示。(2) 根据以上分析,若用变量t来存放累加项,当i的值从1变化到n时,可用以下语句来实现累加: t=t/i;

26、e+=t;(3) 为了实现累加过程,以上语句应当放在循环内,循环控制变量从1变化到n。(4) 若用for循环,按题目要求已指定n的值是50。若用while循环,并没有指定n的值,但已指定了循环结束的条件,当t的值小于10-4结束循环。(5) 现例示用while循环来求e值的部分程序:i=1; e=1.0; t=1.0;while( t>=1e-4 ) t=t/i;e+=t;i+; (6) 请读者自己对变量做出正确的定义,设计输出语句,完善程序;也可以参考此程序段,按照自己的思路独立地完成程序。(7) e的值应当是:2.71828。(8) 根据以上分析,读者已不难用for循环来实现求e值的

27、计算。(9) 注意:在完成此程序时,不要对分母中的阶乘值进行单独计算,因为17!的值已超过long类型的最大值,更无法求到50!。5.19【分析与解答】 (1) 从1880年至2000年的年数可用一个for循环来取得。(2) 对每一年,用以上指定的条件来进行判断,若满足条件即为闰年,进行输出。(3) 按输出的要求,需要设一个变量用于统计一行中输出的个数,若在一行上已连续输出了5个年数,就需输出一个换行符,使下一个输出项在新的一行上开始;若用变量n来做此统计,则当表达式n%5=0时就应输出一个换行符,同时使n重新置0值。(4) 若变量y代表年数,if语句的逻辑表达式可以写成如下: (y%4=0

28、&& y%100!=0JB>1|JB>1|y%400=0)(5) 以下程序段供参考: for ( y=1880; y<=2000; y+ )if(y%4=0 && y%100!KG-*2=0JB>1|JB>1|y%400=0) printf(%d ,y);n+;if(n%5=0) printf(n); n=0; (6) 请读者自己对变量做出正确的定义并赋初值,完善程序;也可以参考此程序段,按照自己的思路独立地完成程序。从1880年至2000年有30个闰年。5.20 【分析与解答】 (1) 不难理解利用以下的for循环可以在一行上连续

29、输出n个*号: for(i=1; i<=n; i+) printf(*); printf(n);若n的值是6,则连续输出6个*号。(2) 以上图形是在各行上输出数目不等的*号,只是*号的数目依次有规律地变化。在上半部分各行依次是1、3、5、7个,因此可以用以下的程序段来实现这样的输出: for(k=1;k<=7;k+,k+) for(i=1;i<=k; i+)printf(*);printf(n); 在下半部依次是5、3、1个;因此可以用以下的程序段来实现这样的输出: for(k=5;k>=1;k-,k-) for(i=1;i<=k; i+)printf(*);p

30、rintf(n); 以上程序段从第一列起输出的结果如下:* 现在我们已完成了在每行输出指定数目的*号。(3) 输出结果与题目要求不同,它们的区别是:按题目每一行之前有不同的空格,而这里则是所有的行都在第一列上开始输出*号;所以接着就应当解决这一问题。(4) 分析题目要求,每行第一个*号位置的缩进是有规律的,假定中间这一行第一个*号位置是在第一列,则可看出,第一至第三行的缩进分别是3、2、1个空格;而图形下半部的缩进数则刚好相反。这可在以上循环中添加输出连续空格的for循环来实现,对于上半部程序如下: b=3;for(k=1;k<=7;k+,k+) for(j=1;j<=b; j+)

31、printf( );b-;for(i=1;i<=k; i+)printf(*);printf(n); (5) 请读者在理解以上给出的示例的基础上,自己添加下半部空格的输出。 都市闲人 2006-1-6 10:19 全国计算机等级考试二级教程C语言程序设计习题分析与解答(三)第六章 字符型数据习题分析与解答一、 选择题 6.1【参考答案】 B)6.2【参考答案】 D)6.3【参考答案】 A)6.4【参考答案】 A)6.5【参考答案】 B)6.6【参考答案】 D)6.7【参考答案】 D)6.8【参考答案】 B)6.9【参考答案】 A)6.10【参考答案】 A)6.11【参考答案】 C)二、

32、填空题6.12【参考答案】 -16.13【参考答案】 16.14【参考答案】 ctype.h6.15【参考答案】 06.16【参考答案】 10A 20B 30C 40D<CR>或: 10A<CR> 20B<CR> 30C<CR> 40D<CR> 6.17【参考答案】 7.29 101.298AB<CR>或: 7.29<CR> 101.29AB<CR> 6.18【参考答案】 三、 编程题6.20【分析与解答】 (1) 在进行字符输入时,即使一次输入了一行字符(最后用回车结束输入),字符也只能一个一个地

33、读入。若ch已定义为char型变量,可以用以下的程序段来完成操作: ch=getchar();while(ch!KG-*2=n) ch=getchar(); 当读入的是一个回车符时,循环就结束。循环体内的“”符号表示需要在循环体内完成的其他操作。(2) 在循环内要求进行的操作之一是:输出每个字符以及与之对应的ASCII代码值。因此可用以下语句来实现。printf(%c : %d ,ch,ch);(3) 在循环内要求进行的另一个操作是:每行只能输出3对字符和与之对应的ASCII代码值。若n已定义为int型变量,则可用来作计数器;使n的初值为0,每输出一次,n的值增1,当n的值为3的整数倍时,额外

34、输出一个换行符。例如:n+;if(n%3=0)putchar(n);(4) 把(2)和(3)中给出的语句放在循环体内,并按要求给出正确的定义和初值,就可完成题目所要求的操作。(5) 也可以在while后的一对括号中来完成字符的读入,如while(ch=getchar()!KG-*2=n)。这时,循环内、外的“ch=getchar();”语句应当去掉。6.21【分析与解答】 (1) 一行字符的读入,请参照题6.20(1)和(5)中的解释。循环体内的“”符号表示需要在循环体内完成的其他操作。 ch=getchar();while(ch!KG-*2=n) ch=getchar(); (2) 在本题中

35、循环体内需要把读入的所有数字字符转换成一个整数。若用变量n来存放这个整数,为了保证有效的存放,应当把它定义成long类型。(3) 要把输入的一串数字字符转换成一个整数,首先需要判断当前读入的字符是否是数字字符,若不是则什么也不做;若是,则进行以下操作: 把当前读入的一个字符转换成一个一位整数,这可由语句“d=ch-0; ”来实现,在这里d是一个整型变量; 把d中的一位数归并到n的低位中,这可用语句“n=n*10+d;”来实现。这里所述的操作可由以下语句来完成: if(ch>=0&&ch<=9) d=ch-0; n=n*10+d; if语句后一对括号中的判断表达式可以

36、调用字符函数isdigit来实现: if( isdigit(ch) ) d=ch-0; n=n*10+d; if子句的两个语句可以合并成:n=n*10+ch-0;。(4) 把(3)中的语句放入循环中:ch=getchar();while(ch!KG-*2=n) if(ch>=0&&ch<=9) n=n*10+ ch-0; ch=getchar(); (5) 请自己写出定义语句并赋初值。注意,最后输出n时,应当使用格式说明%ld,而不能使用%d。6.22【分析与解答】 (1) 行数的统计可通过统计输入的n符的个数来完成。(2) 统计的过程应当放在一个while循环体中

37、;判断循环是否进行的条件可以用:(ch=getchar()=EOF)。若用整型变量n作为计数器对n符进行统计,只要读入的字符是n,则n增1。如: while(ch=getchar()!KG-*2=EOF)if(ch=n)n+; (3) EOF是在stdio.h中预定义了的标识符,在TURBO C的环境下,键入Ctrl+Z(即按住键盘上的Ctrl键,同时按字母Z键)后,敲Enter键,即输入了EOF。6.23【分析与解答】 (1) 本题要求的操作同样可在while循环中完成: while(ch=getchar()!=n) (2) 若用整型变量n作为计数器对小写字母进行统计,只要读入的字符是小写字

38、母,则n增1。如: if(ch>=a && ch<=z)n+;(3) 在退出循环后,输出n的值。(4) 请自己完善程序。6.24【分析与解答】 (1) 若图案的行数输入到变量L中。(2) 按要求L决定了图形的行数,因此可通过循环来实现L行的输出: for(i=1; i<=L; i+) 循环体中的“”号,代表输出L行的操作。(3) 假定ch中存放了一个字符,我们知道,通过以下循环可以在一行上输出n个字符: for(j=1; j<=n; j+)putchar(ch); putchar(n);注意,在循环后putchar(n);语句不可少,它用以换行。(4)

39、现在应当解决如何按要求给出每行输出的字符。由图分析,行数(或行号)为1时输出字符A,行数为2时输出字母B若输出的字母放在变量ch中,行号取决于外循环的控制变量i,则输出的字母和行号的关系可用表达式:ch=A+i-1来表示。当i为1时ch中被赋予字母A,当i为2时ch中被赋予了字母B,其他依此类推。因此,在此表达式后,利用(3)中的循环就解决了各行上输出的字母。(5) 按要求每行输出的字母的个数不同,第二行输出3个字母,第三行输出5个字母,第四行输出7个字母(3)中for循环体的执行次数取决于n的值,也就是说n的值决定了每行输出字母的个数。其实,n的值与行号有着密切的关系:n=2*i-1,当i为

40、1时n的值是1、当i的2时n的值是3、当i的3时n的值是5、当i的4时n的值是7。因此在(3) 中for循环之前可用此表达式求出n的值。(6) 总结以上分析,我们可得到以下的程序段:for(i=1; i<=L; i+) ch=A+i-1;n=2*i-1;for(j=1; j<=n; j+)putchar(ch);putchar(n); 若所用的变量都已正确定义,通过输入L的值为5,则程序段在第一列起有以下的输出结果: A BBB CCCCC DDDDDDD EEEEEEEEE和题目的要求比较已趋接近,不同的是在每行没有适当的缩进。(7) 现在来解决每行的缩进问题。由题中给出的图形可

41、知,若指定输出5行,第一行缩进5个空格,第二行则缩进4个空格,第三行则缩进3个空格,第四行则缩进2个空格,第五行则缩进1个空格。这同样可以由以下的for循环来实现: for(k=L; k>=i; k-)putchar( );把此循环放在i控制的循环体内、输出每行字符的循环之前即可。(8) 请读者自己补充有关的include行、语句和变量的定义,以完成整个程序。注意,如果有能力可在某些地方作些简化。 都市闲人 2006-1-6 10:19 第七章 函数习题分析与解答一、 选择题7.1 【参考答案】 C)7.2 【参考答案】 C)7.3 【参考答案】 B)7.4【参考答案】 C)7.5【参考

42、答案】 A)7.6【参考答案】 D)7.7【参考答案】 A)二、 填空题7.8【参考答案】 127.9【参考答案】 9.0(或9.000000)7.10【参考答案】 47.11【参考答案】 1 n=1 2 s7.12【参考答案】 1 <=y 2 z*x7.13【参考答案】 1 1 2 s*i 3 0 4 f(k)三、 程序调试和编程题7.14 【分析与解答】 (1) fun函数判断传给形参n的数是否为素数,若是函数返回1,否则返回0。(2) 函数的原意是用变量yes作为判断n是否为素数的标志,是素数,其值为1,否则为0。而所给函数的实际流程却不能实现这一功能,例如,若n的值为15(明显不

43、是素数)时,在for循环中,当k的值为3时,就会执行if子句,yes得0,但for循环并没有终止,接着k为4时就会执行else子句,又使yes得1,由此可见此程序段并不能准确地判断一个数是否为素数;最后确定yes为何值的是for循环的终止值n/2,当n为15时,k的值为n/2等于7,在循环体内将又一次执行else子句,使yes得1,这时循环结束,函数返回1。由此可见所给fun函数不能起到预想的作用。(3) 由上分析可知,对于n的值为15时而言,问题是在一旦yes的值为0,已判断n中的值不是素数时,没有及时退出循环,返回0;因此,若在if子句中添加一条语句:break;就能解决这一问题,把if语

44、句改写如下: if(n%k=0) yes=0; break; else yes=1;(4) 在所给fun函数中,当n的值为2、3时(都是素数),因为n/2的值为1(大于k中的2),所以不会进入for循环,而直接执行return语句,细心的读者应该可以发现,这时yes没有赋过值,也就是说,返回的是一个不确定的值,这将会导致错误;因此,应当在定义语句中给yes赋初值1: int k, yes=1;至此fun函数能正确运行。(5) 总结:因为一旦if语句中的表达式:n%k=0的值为1(即可被某数整除),则可以确定n不是素数,因此即可返回,不必再执行函数其他部分,if子句可改成: if(n%k=0)

45、yes=0; return yes; else yes=1;也可简化成: if (n%k=0) return 0; else yes=1;又可进一步不用变量yes,并去掉else,简化成(请参考例7.4): for( k=2; k<=n/2; k+)if(n%k=0) return 0; return 1;7.15【分析与解答】 (1) 若用整型变量c存放余数,则求a被b除后的余数可用表达式: c=a%b。(2) 本题要求编写函数mymod用以求a被b除后的余数即: c=mymod( a,b );(3) 只要把a%b作为函数值返回即可完成操作(请参考例7.1): int mymod(in

46、t a, int b) return a%b; (4) 总结:本题在算法上十分简单,只是要求读者能够掌握编写函数的基本知识。7.16【分析与解答】 (1) 本题所要采用的算法是累加。分析可见,所有累加项的分子都是1,而分母部分逐项增1;只是累加项的符号交叉变化。因此处理好符号的变化是完成操作的关键之一。(2) 若函数名为funa,传送到函数的参数是整型值,假定形参命名为n;函数的返回值应当是浮点型,为此函数的首部可以是: double funa( int n )(3) 接着写函数体。累加放在一个for循环中来完成,若循环控制变量为k,可利用循环控制变量作为累加项t的分母,累加值放在add中:

47、for( k=1; k<=n; k+) t=s*1.0/k;add=add+t; 此处,s用作符号变量,在1和-1之间交叉变化,乘以1.0/k后,t的值也将按要求变化符号。注意,表达式1.0/k不可以写成1/k,因为每一项的绝对值必定是小于1的小数。(4) 现在需要确定s的值。最简单的可用表达式:s=-s来实现(请参考例5.2),若赋值号右边s中的值为-1,则赋值号左边s中的值就得1;若赋值号右边s中的值为1,则赋值号左边s中的值就会得-1;则每循环一次就使s改变了一次符号。当然还可有多种方法。把以上表达式添加到循环体中: for( k=1; k<=n; k+) s=-s;t=s*

48、1.0/k;add=add+t; (5) 最后注意应当给各变量赋以适当的初值,并返回函数值。(6) 请编写主函数。当传给形参的值为10时,函数的返回值应当是:0.645635。(7) 总结:本题的算法并不复杂,但是需要读者掌握编写函数的基本知识。掌握需要传入函。数的参数及其类型,掌握需要返回的值及其类型。在此基础上,其他方面与先前在主函数中编写的程序没有什么区别。7.17 【分析与解答】 (1) 此题与7.18相似。函数的返回值为浮点型,函数只有一个形参,为整型。(2) 函数的基本算法是累加,只是除第一项外其余各项都用减法;每一项的分子都是1,分母部分为k2,k的值逐项增1,由2变化到m。因此

49、,算法可以用一个循环来实现。(3) 当m的值为12时,函数值应是:0.435023。7.18【分析与解答】 (1) 若函数取名为fun,按题意,x作为形参,由调用函数传入,其类型不应当用整型;表达式x2-5x+4的值作为函数值返回,函数值的类型应为浮点型。因此,很容易写出函数: double fun( double x ) return x*x-5*x+4; (2) 若在调用函数时,x和y2已正确定义,且x已有确定的值,则可用以下函数调用语句得到y2的值: y2=fun( x+15 );(3) 同样,若在调用函数时,x和y3已正确定义,且x已有确定的值,则可用以下函数调用语句得到y3的值: y3=fun( sin(x) );注意,因为在程序中调用了C语言提供的库函数sin,因此应当在程序的最前面包含以下命令行: #include math.h(4) 参考(2) 和(3) 应不难写出求y1的语句,请读者自己完成。(5) y1的值应是:-2.0。当x的值为5时,y2的值应是:304.0。当x的值为0.5时,y3的值应是:1.832721。(6) 总结: 本题已给出了函数需要求值的表达式,读者只需确定函数的类型和形参的类型,就可以写出函数,就像例7.1中求两数之和的函

温馨提示

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

评论

0/150

提交评论