版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、全国计算机等级考试二级教程C语言程序设计习题分析与详细解答第一章 程序设计基本概念习题分析与解答11【参考答案】EXE12【参考答案】1.C 2.OBJ3 .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【参考答案】111212215【参考答案】14.22
2、4.2216【参考答案】12 3 定义 4 执行217【参考答案】1关键字2用户标识符218【参考答案】1int2float3 double219【参考答案】float a1=1.0, a2=1.0?或 floata1=1, a2=1;(系统将自动把 1 转换为1.0)220【参考答案】存储单元221【参考答案】3.5222【参考答案】1a*b/c2 a/c*b3 b/c*a223【参考答案】把 10 赋给变量s224【参考答案】1位21 位二进制数据 (0 或 1)225【参考答案】18 2127 301111111 4 -128 5 10000000226【参考答案】132767 2 -3
3、276831000000000000000227【参考答案】1十 2 八3十六三、上机改错题228【分析与解答】第 1 行的错误:(1) include 是一个程序行,因此在此行的最后不应当有分号 (;)第 2 行的错误:(1)main() 是主函数的起始行,不是语句,因此最后不应当有分号 (;) 。(2)在同一行上的 / * main function * / 显然是注释; C 语言规定:注释由 /* 开头, 由*/ 结束,但在 *号和/ 之间不得插入任何空格,而在此处“ / * ”和“* / ”之间存在空格, 因此, / * main function * / 的写法是错误的,而应写成:
4、/* main function */ 。 第 3 行的错误:(1)在主函数的起始行 main() 的后面是函数体,函数体由左花括号 ( 开始。但在函数体的 第一行: float 的前面缺少了左花括号 ( 。(2)在同一行上的 /* /*r is radius*/, /* s is area of circular*/ */ 显然是注释; C 语言规定:注释由 /* 开头,由*/ 结束,并且开头的 /* 将去找最近的 */ 去配对,因此在 /* /*r is radius*/中,第一个/*与radius后的那个*/配上了对,结果紧跟在后面的那个逗号(,)落在 了注释的外面,而构成了一个多余符号
5、,为此,在编译时将报告“语法错”。/* s is area ofcircular*/ */ 中第一个*/ 就结束了注释,第一个 */就成了多余的了。第 6 行的错误:printf( %f n,s)应当是一条输出语句,但在最后缺少了一个分号。printf( %f n ,s);是程序的最后一条语句,程序应当结束;但缺少了程序体结束所 需的右花括号();此右花括号可以放在printf( %f n ,s);的后面,也可以放在printf( %f n ,s);的下一行上。2 27 【分析与解答】第2行的错误:在main的后面缺少一对圆括号。第 4 行的错误:在 c=4.0 的后面缺少分号。第6行的错误:
6、在printf( %f n ,v)的后面缺少分号。第三章 顺序结构习题分析与解答3.1【参考答案】C)3.2【参考答案】C)3.3【参考答案】D)3.4【参考答案】C)3.5【参考答案】D)3.6【参考答案】B)3.7【参考答案】C)3.8【参考答案】D)3.9【参考答案】A)3.10【参考答案】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)、选择题 ( 单选题 )把D的答案修改为:seanf( “
7、8f,&c);、填空题3.21 【参考答案】3.22【参考答案】1 12 2 0 3 03.23【参考答案】1一条语句2 分号(或;3.24【参考答案】分号(;)3.25【参考答案】1:100 25.811.892342:100 )(1)-200,2500(2)i=-200,j=2500(3) i=-200j=250025.81 1.89234 3 :100 25.81 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 【参考
8、答案】 a=513.789215,a= 513.79,a= 513.78921500,a= 513.78921500 三、编程题和改错题3.29 【分析与解答】(1) 主函数名 main 后应有一对圆括号。(2) 第三行的 printf 语句用以提示输入, 但是原样输出的字符串没有用双引号括起来; 另外, 从输入的形式看,输入的数据紧跟在提示之后,因此, printf 格式串中最后不应该有换行符 n。(3) 因为输入项 a、b、 c 从定义和计算结果来看都是 double 类型,因此,第四行 scanf 语句 格式串中的格式说明不应当用 4而应当用lf ;且每一个变量之前应该加地址运算符 &
9、第七行的printf 语句中应当把d都改成%lf或匕按输出要求在格式串中应添加相应的 原样输出的字符; 因为下一个 printf 的输出从新的一行开始, 因此在本输出语句的格式串的 最后应当加换行符一一 n。(5) 第八行的 printf 语句中应当把格式串整理合并放在输出项的前面, 输出项放在后面, %d 都改成%lf或七中间的 n删去。(6) 请同学们自己写出修改后的程序,并上机调试。3.30 【分析与解答】(1) 分析:可用算术式560十60把分钟换算成小时和分钟,商数就是小时数,余数就是分钟 数。(2) 确定变量的名字和定义变量的类型:在程序中把小时数放在变量 h 中,把分钟数放在变
10、量m中。这两个变量的类型可以是整型(本题中采用整型),也可以是实型。 确定所用算法:求560-60的商数,在C语言中可以用整除的算法,语句是 h=560/60;。 求余数可用求余运算符 %: 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
11、【分析与解答】(1) 确定变量的名字和定义变量的类型。若用a存放1500,用b存放350;用q存放商数,用 r 存放余数,所有变量应定义成 int 类型。(2) 设计输入语句从终端输入 1500 和 350;在输入语句之前,应当设计一个输出语句,用以 提示输入。(3) 可用整除求商数,结果放在变量 q 中。可用求余运算符 %求两数之余数,结果放在变量 r 中。(4) 设计输出语句。输出 a、b、q、r 。(5) 把以上内容放在主函数的一对花括号中。本题的程序与 3.30 相似,请大家参考上题并根据本题的解释自己编程,并上机调试。3.32 【分析与解答】(1) 定义4个双精度变量a、b、c和av
12、e,变量a、b、c分别存放读入的3个双精度数,ave 存放它们的平均值。(2) 设计输入语句,以及在此之前用于提示输入的 (printf) 语句。(3) 设计求平均值的算法,把所求得的平均值放入变量 ave 中。(4) 设计把变量ave中的数,从小数点后第二位数进行四舍五入的算法。 现举例说明:若ave中的数为 123.4644,为了保留此值小数点后一位,可用表达式: (int)(123.4644*10)/10.0;依次推算,为了保留此值小数点后二位,可用表达式: (int)(123.4644*100)/100.0 ;其他依 此类推。(5) 若要求对小数点后第二位数进行四舍五入, 则可对原数加
13、 0.05 后再进行以上运算。 如要 求保 留 123.4644 小 数 点 后 一 位且 对 第二 位 数 进 行四 舍 五 入 , 可用 表 达式: (int)(123.467+0.05)*10)/10.0 。注意:分母一定要用实数 10.0 而不能用整数 10,否则就 变成整除了;若要求保留 123.4644 小数点后两位且对第三位数进行四舍五入,可用表达式: (int)(123.467+0.005)*100)/100.0 ;其他依此类推。(6) 设计输出语句。输出 a、 b、 c 和 ave。(7) 把以上内容放在主函数的一对花括号中。(8) 编写程序如下:main() double
14、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.05)*10)/10.0;/* 上句也可写成 ave=(int)(ave*10+0.5)/10.0;*/printf( a=%f, b=%f, c=%f, ave=%f n , a,b,c,ave);3.33 【分析与解答】(1) 关于对变量中的数进行交换的算法请参考 3.7 题中的解释和教程中有关的例题。 定义4个整型变量
15、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 中的值。(7) 编写程序如下:main() int a, b, c, t;printf( Enter a, b, c :n);seanf(” d%d%d,&a,&b,&c);printf( (1) a=%d,b=%d
16、,c=%dn ,a,b ,c); t=c; c=b; b=a; a=t;printf( (2) a=%d,b=%d,c=%dn ,a,b,c);第四章 选择结构习题分析与解答一、选择题4.1【参考答案】A)4.2【参考答案】A)4.3【参考答案】A)4.4【参考答案】D)4.5【参考答案】C)4.6【参考答案】A)4.7【参考答案】B)4.8【参考答案】C)4.9【参考答案】D)4.10【参考答案】A)、填空题4.114.124.134.14231 非零 2 零 、=、 = =、 !KG-*2=1 ! 2 & 1 :!KG-*2( =(小于、大于、小于等于、 =、!KG-*2=( 等于、不等
17、)参考答案】参考答案】参考答案】 参考答案】 、 、=、 3 JB1|JB1| 逻辑非)4: & (逻辑与)5:JB1|JB1|(逻辑或)。4.15【参考答案】!4.16【参考答案】1 a=b 或 a1|xJB1|44.17【参考答案】14.18【参考答案】1 xm0)JB1|JB1|(m1=m0&d1=d0) age=y1-y0;else age=y1-y0-1; 读者可以参考以上语句写出程序,也可以根据分析写出与此形式不同的语句和程序。4.23 【分析与解答】(1) 若输入的整数 a 是奇数,输出 :odd number ,是偶数输出: even number。 若一个a是偶数,它就能被2
18、除尽,即a%2=0输出even number;若是奇数,它就不能被2除尽,即a%2!KG-*2=0,输出odd number。读者可以参考以上给出的算法,写出相应的C语句,并编写出完整的程序。4.24 【分析与解答】本题的主要算法是从3个数中找出最大的那个数。假定始终把最大的数放在变量max中。(1) 假定 a 中的数最大,把 a 赋给 max。 用b去和max比较,若b大于max则把b赋给max若不大于max则什么也不做。 用c去和max比较,若c大于max则把c赋给max若不大于max则什么也不做。 经过以上操作,max中已放入了 a、b、c三个数中的最大数,输出 max即可。读者可以参考
19、以上给出的算法,写出相应的C语句,并编写出完整的程序。4.25 【分析与解答】(1) 本题已给出了非常明确的条件, 只要写出正确的条件判断语句就可基本完成程序的编写。(2) 由给出的函数可知,只有x的值在规定的范围内时,才求出 y的值,因此程序应当对输 入的x进行判断,若超过范围就不求y的值。(3) 现以使用 ifCD#*2else 语句为例写出程序供参考。main() int x,y;printf( Enter x : ); scanf( %d , &x);if(x-5&x10)if(x=0) y=x-1;else if(x0 ) y=x+1;else if(x-5) y=x;printf(
20、 x=%d y=%dn , x,y);printf( *end* n n);第五章循环结构习题分析与解答一、选择题(单选题)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 52 43 65.12【参考答案】程序段无限循环,没有输出结果5.13【参考答案】-15.14【参考答案】115.15【参考答案】1 d=1.0 2 k+ 3 k=02 xamin二、编程题5.17【分析与解答】(1)
21、 本题的基本算法是求累加值。累加项的值有规律的递增,每一项的绝对值比前一项增2,因此可以利用循环的控制变量的递增来得到累加项的绝对值。例如:for( i=1; i=1e-4 ) t=t/i;e+=t;i+;(6) 请读者自己对变量做出正确的定义,设计输出语句,完善程序;也可以参考此程序段, 按照自己的思路独立地完成程序。e 的值应当是:2.71828。(8) 根据以上分析,读者已不难用for循环来实现求e值的计算。(9) 注意:在完成此程序时,不要对分母中的阶乘值进行单独计算,因为17!的值已超过long 类型的最大值,更无法求到 50!。5.19【分析与解答】(1) 从1880年至2000年
22、的年数可用一个for循环来取得。(2) 对每一年,用以上指定的条件来进行判断,若满足条件即为闰年,进行输出。(3) 按输出的要求,需要设一个变量用于统计一行中输出的个数,若在一行上已连续输出了5个年数,就需输出一个换行符,使下一个输出项在新的一行上开始;若用变量n来做此统计,则当表达式n%5=0寸就应输出一个换行符,同时使 n重新置0值。(4) 若变量y代表年数,if语句的逻辑表达式可以写成如下:(y%4=0 & y%100!=0JB1|JB1|y%400=0)(5) 以下程序段供参考:for ( y=1880; y1|JB1|y%400=0) printf( %d ,y);n+;if(n %
23、5=0) printf( n); n=0; (6) 请读者自己对变量做出正确的定义并赋初值,完善程序;也可以参考此程序段,按照自 己的思路独立地完成程序。从 1880年至2000年有30个闰年。5.20【分析与解答】(1) 不难理解利用以下的for循环可以在一行上连续输出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
24、(i=1;i=1;k-,k-)for(i=1;i=k; i+)printf( *);printf( n); 以上程序段从第一列起输出的结果如下:* *现在我们已完成了在每行输出指定数目的 *号。(3) 输出结果与题目要求不同,它们的区别是:按题目每一行之前有不同的空格,而这里则 是所有的行都在第一列上开始输出 * 号;所以接着就应当解决这一问题。(4) 分析题目要求,每行第一个 *号位置的缩进是有规律的,假定中间这一行第一个*号位置是在第一列,则可看出,第一至第三行的缩进分别是3、 2、 1 个空格;而图形下半部的缩进数则刚好相反。这可在以上循环中添加输出连续空格的 for 循环来实现,对于上
25、半部程序如 下:b=3; for(k=1;k=7;k+,k+)for(j=1;j=b; j+)printf();b-;for(i=1;i=k; i+)printf(*);printf( n );(5) 请读者在理解以上给出的示例的基础上,自己添加下半部空格的输出。第六章 字符型数据习题分析与解答一、选择题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)二、填空题6.12【参考答案】-16.13【参
26、考答案】16.14【参考答案】ctype.h6.15【参考答案】06.16【参考答案】10A 20B 30C 40D或: 10A20B30C40D6.17【参考答案】7.29 101.298AB或: 7.29101.29AB6.18【参考答案】A 7.29B 101.2986.19【参考答案】ABC三、编程题6.20 【分析与解答】(1) 在进行字符输入时,即使一次输入了一行字符 (最后用回车结束输入 ) ,字符也只能一个 一个地读入。 若 ch 已定义为 char 型变量,可以用以下的程序段来完成操作: ch=getchar();while(ch!KG-*2= n) ch=getchar()
27、;当读入的是一个回车符时,循环就结束。循环体内的“”符号表示需要在循环体内完成 的其他操作。(2) 在循环内要求进行的操作之一是:输出每个字符以及与之对应的 ASCII 代码值。因此可 用以下语句来实现。printf( %c : %d ,ch,ch);(3) 在循环内要求进行的另一个操作是: 每行只能输出 3对字符和与之对应的 ASCII 代码值。 若n已定义为int型变量,则可用来作计数器;使 n的初值为0,每输出一次,n的值增1, 当 n 的值为 3的整数倍时,额外输出一个换行符。例如:n+;if(n%3=0)putchar( n );(4) 把(2) 和(3) 中给出的语句放在循环体内,
28、并按要求给出正确的定义和初值,就可完成题 目所要求的操作。(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) 在本题中循环体内需要把读入的所有数字字符转换成一个整数。若用变量 n 来存放这
29、个 整数,为了保证有效的存放,应当把它定义成 long 类型。(3) 要把输入的一串数字字符转换成一个整数,首先需要判断当前读入的字符是否是数字字 符,若不是则什么也不做;若是,则进行以下操作: 把当前读入的一个字符转换成一个一位整数,这可由语句“ d=ch- O; ”来实现,在这 里 d 是一个整型变量; 把 d 中的一位数归并到 n 的低位中,这可用语句“ n=n*1O+d; ”来实现。这里所述的操作 可由以下语句来完成:if(ch= O &ch= O &ch= a & ch= z )n+;(3) 在退出循环后,输出n的值。(4) 请自己完善程序。6 . 24 【分析与解答】(1) 若图案
30、的行数输入到变量 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) 现在应当解决如何按要求给出每行输出的字符。由图分析,行数(或行号)为 1时输出字符A,行数为2时输出字母B若输出的字母放在变量ch中,行号取决于外循环的控制变量i,则输出的字母和行号的关系可
31、用表达式: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为1时n的值是1、 当i的2时n的值是3、当i的3时n的值是5、当i的4时n的值是7。因此在(3)中for 循环之前可用此表达式求出 n 的值。(6) 总结以上分析,我们可得
32、到以下的程序段:for(i=1; i=L; i+) ch= A +i-1;n=2*i-1;for(j=1; j=i; k-)putchar();把此循环放在 i 控制的循环体内、输出每行字符的循环之前即可。(8) 请读者自己补充有关的 include 行、语句和变量的定义,以完成整个程序。注意,如果 有能力可在某些地方作些简化。第七章 函数习题分析与解答一、选择题7.1 【参考答案】C)7.2 【参考答案】C)7.3【参考答案】B)7.4【参考答案】C)7.5【参考答案】A)7.6【参考答案】D)7.7【参考答案】A)二、填空题7.8【参考答案】127.9【参考答案】9.0( 或 9.0000
33、00)7.10【参考答案】47.11【参考答案】1 n=12 s7.12【参考答案】1 =y2 z*x7.13【参考答案】1 12 s*i3 04 f(k)三、程序调试和编程题7.14 【分析与解答】fun函数判断传给形参n的数是否为素数,若是函数返回1,否则返回0。(2)函数的原意是用变量yes作为判断n是否为素数的标志,是素数,其值为 1,否则为0。 而所给函数的实际流程却不能实现这一功能,例如,若n的值为15(明显不是素数)时,在for循环中,当k的值为3时,就会执行if子句,yes得0,但for循环并没有终止,接着k为 4 时就会执行 else 子句,又使 yes 得 1,由此可见此程
34、序段并不能准确地判断一个数是否为 素数;最后确定yes为何值的是for循环的终止值n/2,当n为15时,k的值为n/2等于7, 在循环体内将又一次执行 else 子句,使 yes 得 1,这时循环结束,函数返回 1。由此可见所 给 fun 函数不能起到预想的作用。 由上分析可知,对于n的值为15时而言,问题是在一旦yes的值为0,已判断n中的值 不是素数时,没有及时退出循环,返回 0;因此,若在 if 子句中添加一条语句: break; 就能 解决这一问题,把 if 语句改写如下:if(n%k=0) yes=0; break; else yes=1;(4) 在所给fun函数中,当n的值为2、3
35、时(都是素数),因为n/2的值为1(大于k中的2), 所以不会进入 for 循环,而直接执行 return 语句,细心的读者应该可以发现,这时 yes 没有 赋过值,也就是说,返回的是一个不确定的值,这将会导致错误;因此,应当在定义语句中 给 yes 赋初值 1: int k , yes=1;至此 fun 函数能正确运行。 总结:因为一旦if语句中的表达式:n%k=0的值为1(即可被某数整除),则可以确定n 不是素数,因此即可返回,不必再执行函数其他部分, if 子句可改成:if(n%k=0) yes=0; return yes; else yes=1;也可简化成:if (n%k=0) ret
36、urn 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 本题要求编写函数 mymoc用以求a被b除后的余数即:c=mymod( a,b ); 只要把a%bf乍为函数值返回即可完成操作(请参考例7.1):int mymod(i nt a, int b) return a%b; (4) 总结:本题在算法上十分简单,只是要求读者能够掌握编写函数的基本知识。7.
37、16【分析与解答】(1) 本题所要采用的算法是累加。分析可见,所有累加项的分子都是1,而分母部分逐项增1; 只是累加项的符号交叉变化。因此处理好符号的变化是完成操作的关键之一。 若函数名为funa,传送到函数的参数是整型值,假定形参命名为n;函数的返回值应当是浮点型,为此函数的首部可以是:double funa( int n )(3) 接着写函数体。累加放在一个for循环中来完成,若循环控制变量为k,可利用循环控制变量作为累加项t的分母,累加值放在add中:for( k=1; k=n; k+) t=s*1.O/k;add=add+t;此处,s用作符号变量,在1和-1之间交叉变化,乘以1.0/k
38、后,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*1.0/k;add=add+t;(5) 最后注意应当给各变量赋以适当的初值,并返回函数值。 请编写主函数。当传给形参的值为 10时,函数的返回值应当
39、是:0.645635。(7) 总结:本题的算法并不复杂,但是需要读者掌握编写函数的基本知识。掌握需要传入函。 数的参数及其类型,掌握需要返回的值及其类型。在此基础上,其他方面与先前在主函数中 编写的程序没有什么区别。7.17【分析与解答】(1) 此题与7.18相似。函数的返回值为浮点型,函数只有一个形参,为整型。(2) 函数的基本算法是累加,只是除第一项外其余各项都用减法;每一项的分子都是1,分母部分为k 2, k的值逐项增1,由2变化到m因此,算法可以用一个循环来实现。 当m的值为12时,函数值应是:0.435023。7.18【分析与解答】(1)若函数取名为fun,按题意,x作为形参,由调用
40、函数传入,其类型不应当用整型;表达 式x 2-5X+4的值作为函数值返回,函数值的类型应为浮点型。因此,很容易写出函数:double fun( double x ) return x*x-5*x+4; 若在调用函数时,x和y2已正确定义,且x已有确定的值,则可用以下函数调用语句得到 y2 的值: y2=fun( x+15 ); 同样,若在调用函数时,x和y3已正确定义,且x已有确定的值,则可用以下函数调用 语句得到 y3 的值: y3=fun( sin(x) );注意,因为在程序中调用了C语言提供的库函数sin,因此应当在程序的最前面包含以下命令行:#inelude math.h (4) 参考
41、(2) 和(3) 应不难写出求 y1 的语句,请读者自己完成。y1的值应是:-2.0。当x的值为5时,y2的值应是:304.0。当x的值为0.5时,y3的 值应是: 1.832721 。(6) 总结: 本题已给出了函数需要求值的表达式, 读者只需确定函数的类型和形参的类型, 就可以写 出函数,就像例 7.1 中求两数之和的函数一样简单。 在给定了函数之后,调用函数时,函数的实参应当是一个与形参类型一致的任意合法的表达式。例如, 可以是常量、算术表达式, 也可以是函数等。就像例 7.1 中求两数之和的 add 函数一样,可以用add( 3,4 ); 来求3+4;当x、y有确定值时,可以用add(
42、 x*x,y*y); 来求 x2+y2;当 x、y 有确定值时,可以用 add( sin(x+y),cos(x+y);来求 sin(x+y)+cos(x+y),这同样可以通过 add( sin(add(x,y),cos(add(x,y) );来求得。第八章 指针习题分析与解答一、选择题8.1 【参考答案】A)8.2【参考答案】B)8.3【参考答案】B)8.4【参考答案】C)8.5【参考答案】B)8.6【参考答案】B)8.7【参考答案】C)8.8【参考答案】D)8.9【参考答案】B)8.10【参考答案】C)8.11【参考答案】C)8.12二、【参考答案】 填空题C)8.13【参考答案】1108.
43、 1 4 【参考答案】 7 18.15 【 参 考 答 案】 char *p, *p=ch, p=&ch; scanf( “%c/n”p,);ch=*p; p=&ch;printf( “%c/n”,*p);8. 1 6 【参考答案】 *s=*(p+3), *(s-2),50, *s=*(a+1), 2, 10,20,30,40三、编程题8. 1 7 【分析与解答】(1) 若函数名为 fun ,按题意,函数不返回函数值;函数的形参需要接受传送过来的两个浮 点数,因此需要有两个 double 类型的形参;另外要把它们的和值与差值, 通过形参传送回去, 这就要求有两个 double 类型的形参指针, 接受传送过来的地址, 以便通过指针把和值与差值 传送给所指的主函数中的变量。因此函数的首部应当是:void fun(double a, double b, double *p1, double *p2)这里, a、 b、p1、p2 是自己取的名。(2) 假设把 a、 b 的和值传送给 p1 所指的存储单元,可用语句: *p1=a+b; 把 a、b 的差值传 送给 p2 所指的存储单元,可用语句: *p2=a-b; 。(3)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 药品集中采购监督制度
- 蔬菜采购质量把控制度
- 书采购意向公示制度
- 大宗设备采购制度
- 中药采购配送制度
- 试验检测规范采购制度
- 书馆办公用品采购制度
- 中国石油采购制度
- 红酒采购制度管理规定
- 采购索证索票制度
- 新疆神火煤电有限公司电解铝大修渣无害化处理综合利用项目环评报告
- GB/T 45554-2025种猪生产性能测定技术规范
- 单兵战术动作低姿匍匐前进教案
- 2025新人教版七年级下册英语 Unit 8知识点梳理及语法讲义(答案版)
- 水库安全管理培训
- 工程劳务外包合同范本大全
- 统编版语文四年级下册 第一单元基础过关卷(试题)
- 自考《13180操作系统》考前强化练习试题库及答案
- 人工智能芯片设计 课件 周巍 第4-7章-人工智能与深度学习 -人工智能芯片架构设计
- 医院患者安全与防范措施管理规章制度
- DB34∕T 3463-2019 钢筋桁架楼承板系统应用技术规程
评论
0/150
提交评论