

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、全国计算机等级考试二级教程C 语言程序设计习题分析与解答 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 11215 【参考答案】
2、1 4.2216 【参考答案】 1 2 122 4.22 3 定义4 执行217 【参考答案】 1 关键字 2 用户标识符218 【参考答案】 1 int2 float3 double219 【参考答案】 float a1=1.0, a2=1.0;或 float a1=1, a2=1;(系统将自动把 1 转换为 1.0)220 【参考答案】 存储单元221 【参考答案】 3.5222 【参考答案】 1 a*b/c223 【参考答案】 把 10 赋给变量 s224 【参考答案】 1 位2 a/c*b3 b/c*a2 1 位二进制数据(0或 1)225 【参考答案】 1 8 2127 301111
3、111 4-128 5 10000000226 【参考答案】 1 32767 2 -32768 3 1000000000000000227 【参考答案】 1 十 2 八 3 十六三、上机改错题228 【分析与解答】第 1 行的错误:(1) include是一个程序行,因此在此行的最后不应当有分号(;)。1第 2 行的错误:(1) main()是主函数的起始行,不是语句,因此最后不应当有分号。(2) 在同一行上的/ * main function * / 显然是注释;C 语言规定:注释由开头,由*/*号和/ * / * main function * 的写法是错误的,而应写成:/* main f
4、unction */。第 3 行的错误:(1) 在主函数的起始行 的后面是函数体,函数体由左花括号(开始。但在函数体的第一行:float的前面缺少了左花括号。(2) 在同一行上的/* /*r is radius*/, /* s is area of circular*/ */ 显然是注释;C 将去找最近的*/* /*r is 中,第一个/*与 radius后的那个*/落在了注释的外面,而构成了/* s is area of circular*/ */中第一个*/就结束了注释,第一个就成了多余的了。第 6 行的错误:(1) %f ,s)应当是一条输出语句,但在最后缺少了一个分号。(2) %f ,
5、s);右花括号();此右花括号可以放在 printf(%f ,s);的后面,也可以放在 %f ,s);的下一行上。227 【分析与解答】第 2 行的错误:在 main的后面缺少一对圆括号。第 4 行的错误:在 c=4.0的后面缺少分号。第 6 行的错误:在 %f 的后面缺少分号。 一、选择题 单选题)3.1 【参考答案】3.2 【参考答案】3.3 【参考答案】3.4 【参考答案】3.5 【参考答案】3.6 【参考答案】3.7 【参考答案】3.8 【参考答案】3.9 【参考答案】3.10 【参考答案】3.11 【参考答案】3.12 【参考答案】3.13 【参考答案】3.14 【参考答案】3.15
6、 【参考答案】3.16 【参考答案】3.17 【参考答案】3.18 【参考答案】3.19 【参考答案】3.20 【参考答案】C)C)D)C)D)B)C)D)A)B)C)D)D)A)C)C)C)把 D的答案修改为:scanf(“%8f”,&c);C)B)2二、填空题3.21 【参考答案】(1)-200,2500(2)i=-200,j=2500(3) i=-200j=25003.22 【参考答案】3.23 【参考答案】3.24 【参考答案】3.25 【参考答案】1 12 2 0 3 01 一条语句 2 分号或;)分号;)1100 25.81 1.892342 100 25.81 1.89234 3
7、100 25.81 1.892343.26 【参考答案】3.27 【参考答案】3.28 【参考答案】三、编程题和改错题3.29 【分析与解答】x=127, x= 127, x= 177,x=x=127, x=127 , x=127 ,x= 000127, x=%06da=513.789215,a= 513.79,a= 513.78921500,a= 513.789215007f, x= 127(1) 主函数名 main后应有一对圆括号。(2) 第三行的 printf语句用以提示输入,但是原样输出的字符串没有用双引号括起来;另外,printf 格式串中最后不应该有换行符。因为输入项 、b、c 从
8、定义和计算结果来看都是 double 类型,因此,第四行 scanf 语句格式串中的格式说明不应当用%d而应当用;且每一个变量之前应该加地址运算符。第七行的 printf语句中应当把%d都改成%lf或%f样输出的字符;因为下一个 printf 的输出从新的一行开始,因此在本输出语句的格式串的最后应当加换行符。(5) 第八行的 printf 语句中应当把格式串整理合并放在输出项的前面,输出项放在后面,%d都改成%lf或%f;中间的n删去。请同学们自己写出修改后的程序,并上机调试。3.30 【分析与解答】(1) 分析:可用算术式 56060 把分钟换算成小时和分钟,商数就是小时数,余数就是分钟数。
9、(2) 确定变量的名字和定义变量的类型:在程序中把小时数放在变量 h 中,把分钟数放在变量 m中。这两个变量的类型可以是整型本题中采用整型,也可以是实型。(3) 确定所用算法:求 56060 的商数,在 C 语言中可以用整除的算法,语句是 。求余数可用求余运算符 560%60 mm=560%60;(4) 设计输出格式。若输出的形式定为:小时分钟,则按此形式设计输出语句。(5) 把以上内容放在主函数的一对花括号中。(6) 编写程序如下:main()int h, m;h=560/60;m=560%60;3The result: %3d : %3d, h,m);运行结果是:The result:9
10、: 203.31 【分析与解答】(1) a存放 1500 b 存放 350 q r存放余数,所有变量应定义成 int类型。(2) 设计输入语句从终端输入 1500 和 350;在输入语句之前,应当设计一个输出语句,用以提示输入。(3) 可用整除求商数,结果放在变量 q 中。可用求余运算符求两数之余数,结果放在变量 r中。(4) 设计输出语句。输出 、b、q、。(5) 把以上内容放在主函数的一对花括号中。本题的程序与 3.30 相似,请大家参考上题并根据本题的解释自己编程,并上机调试。3.32 【分析与解答】(1) 定义 4 个双精度变量 、b、c 和 ,变量 、b、c 分别存放读入的 3 个双
11、精度数,ave存放它们的平均值。(2) 设计输入语句,以及在此之前用于提示输入的(printf)语句。(3) 设计求平均值的算法,把所求得的平均值放入变量 ave中。(4) 设计把变量 ave中的数,从小数点后第二位数进行四舍五入的算法。现举例说明:若 ave中的数为 123.4644,为了保留此值小数点后一位,可用表达式:(int)(123.4644*10)/10.0;依次推算,为了保留此值小数点后二位,可用表达式: (int)(123.4644*100)/100.0;其他依此类推。(5) 若要求对小数点后第二位数进行四舍五入,则可对原数加 0.05 后再进行以上运算。如要求 保 留 123
12、.4644 小 数 点 后 一 位 且 对 第 二 位 数 进 行 四 舍 五 入 , 可 用 表 达 式 :(int)(123.467+0.05)*10)/10.0 10.0 而不能用整数 10除了;若要求保留 123.4644 小数点后两 位且对第三 位数进行四舍 五入,可用表 达式:;其他依此类推。(6) 设计输出语句。输出 、b、c和 。(7) 把以上内容放在主函数的一对花括号中。(8) 编写程序如下:main()double a,b,c,ave;Enter a ,b ,c : );, &a, &b, &c );ave=(a+b+c)/3;ave=%f, ave);用以比较四舍五入前后
13、的数据*/ave=(int)(ave+0.05)*10)/10.0;上句也可写成 ave=(int)(ave*10+0.5)/10.0;*/a=%f, b=%f, c=%f, ave=%f, a,b,c,ave);3.33 【分析与解答】(1) 关于对变量中的数进行交换的算法请参考 3.7 题中的解释和教程中有关的例题。(2) 定义 4 个整型变量 bc和 ,变量bc分别存放读入的 3 个整数,t用作临时存储单元。4(3) 设计输入语句,以及在此之前用于提示输入的(printf)语句。(4) 输出 、b、c中的值,以便于比较。(5) 交换的步骤如下: 把 c中的值赋给 。 把 b 中的值赋给
14、。 把 a中的值赋给 b。 把 t中的值赋给 。经过以上步骤,已按要求进行了交换。(6) 输出 、b、c中的值。(7) 编写程序如下:main()int a, b, c, t;Enter a, b, c );%d%d%d,&a,&b,&c);(1) a=%d,b=%d,c=%d,a,b ,c);t=c; c=b; b=a; a=t;(2) a=%d,b=%d,c=%d,a,b,c); 一、选择题4.1 【参考答案】4.2 【参考答案】4.3 【参考答案】4.4 【参考答案】4.5 【参考答案】4.6 【参考答案】4.7 【参考答案】4.8 【参考答案】4.9 【参考答案】4.10 【参考答案】
15、二、填空题A)B)A)D)C)A)B)C)D)D)【参考答案】4.12【参考答案】4.13【参考答案】4.14【参考答案】1 非零 2 零、1|JB1|1逻辑非)2、小于、大于、小于等于、大于等于)3、等于、不等)4&(逻辑与) 5JB1|JB1|(逻辑或。4.15【参考答案】!4.16【参考答案】 1 a=b 或 2 JB1|xJB1|44.17【参考答案】4.18【参考答案】4.19【参考答案】4.20【参考答案】11 xm0)JB1|JB1|(m1=m0&d1=d0) age=y1-y0;else age=y1-y0-1;读者可以参考以上语句写出程序,也可以根据分析写出与此形式不同的语句
16、和程序。4.23【分析与解答】(1) 若输入的整数 a是奇数,输出:odd number,是偶数输出:even number。(2) 若一个 a是偶数,它就能被 2 除尽,即 ,输出 even number;若是奇数,它就不能被 2 除尽,即 KG-*2=0,输出 odd 。读者可以参考以上给出的算法,写出相应的 C 语句,并编写出完整的程序。4.24 【分析与解答】本题的主要算法是从 3 个数中找出最大的那个数。假定始终把最大的数放在变量 max中。(1) 假定 a中的数最大,把 a赋给 。(2) 用 b 去和 max比较,若 b 大于 ,则把 b 赋给 max;若不大于 max,则什么也不
17、做。(3) 用 c去和 max比较,若 c大于 max,则把 c赋给 ;若不大于 max,则什么也不做。(4) 经过以上操作,max中已放入了 、b、c三个数中的最大数,输出 max即可。读者可以参考以上给出的算法,写出相应的 C 语句,并编写出完整的程序。4.25 【分析与解答】(1) 本题已给出了非常明确的条件,只要写出正确的条件判断语句就可基本完成程序的编写。(2) 由给出的函数可知,只有 x 的值在规定的范围内时,才求出 y 的值,因此程序应当对输入的 x进行判断,若超过范围就不求 y的值。(3) 现以使用 ifCD#*2else语句为例写出程序供参考。main()int x,y;En
18、ter x : ); scanf(, &x);if(x-5&x10)if(x=0) y=x-1;6else if(x0 ) y=x+1;else if(x-5) y=x;x=%d , x,y);*END*); 一、选择题 单选题)5.1 【参考答案】5.2 【参考答案】5.3 【参考答案】5.4 【参考答案】5.5 【参考答案】5.6 【参考答案】5.7 【参考答案】5.8 【参考答案】5.9 【参考答案】5.10【参考答案】二、填空题D)C)B)C)C)B)D)A)D)D)5.11 【参考答案】5.12 【参考答案】5.13 【参考答案】5.14 【参考答案】5.15 【参考答案】5.16
19、【参考答案】三、编程题1 5 2 4 3 6程序段无限循环,没有输出结果-1111 d=1.0 2 k+ 3 k=0 2 xamin5.17【分析与解答】(1) 本题的基本算法是求累加值。累加项的值有规律的递增,每一项的绝对值比前一项增 2,因此可以利用循环的控制变量的递增来得到累加项的绝对值。例如:for( i=1; i=1e-4 )t=t/i;e+=t;i+;(6) 请读者自己对变量做出正确的定义,设计输出语句,完善程序;也可以参考此程序段,按照自己的思路独立地完成程序。(7) e的值应当是:2.71828。(8) 根据以上分析,读者已不难用 for循环来实现求 e值的计算。(9) 注意:
20、在完成此程序时,不要对分母中的阶乘值进行单独计算,因为的值已超过 long类型的最大值,更无法求到 。5.19【分析与解答】(1) 从 1880 年至 2000 年的年数可用一个 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
21、 ,y);n+;if(n%5=0) printf(); n=0; (6) 请读者自己对变量做出正确的定义并赋初值,完善程序;也可以参考此程序段,按照自己的思路独立地完成程序。从 1880 年至 2000 年有 30 个闰年。5.20【分析与解答】(1) 不难理解利用以下的 for循环可以在一行上连续输出 n个*号:for(i=1; i=n; i+) printf(*););若 n的值是 6,则连续输出 6 个*号。(2) 以上图形是在各行上输出数目不等的*号,只是*号的数目依次有规律地变化。在上半部分各行依次是 1、3、5、7 个,因此可以用以下的程序段来实现这样的输出:for(k=1;k=7
22、;k+,k+)for(i=1;i=1;k-,k-)for(i=1;i=k; *););以上程序段从第一列起输出的结果如下:*现在我们已完成了在每行输出指定数目的*号。(3) 输出结果与题目要求不同,它们的区别是:按题目每一行之前有不同的空格,而这里则是所有的行都在第一列上开始输出*号;所以接着就应当解决这一问题。(4) 分析题目要求,每行第一个*号位置的缩进是有规律的,假定中间这一行第一个 *号位置是在第一列,则可看出,第一至第三行的缩进分别是 3、2、1 个空格;而图形下半部的缩进数则刚好相反。这可在以上循环中添加输出连续空格的 for 循环来实现,对于上半部程序如下:b=3;for(k=1
23、;k=7;k+,k+)for(j=1;j=b; );b-;for(i=1;i=k; *););(5) 请读者在理解以上给出的示例的基础上,自己添加下半部空格的输出。 一、选择题6.1【参考答案】6.2【参考答案】6.3【参考答案】6.4【参考答案】6.5【参考答案】6.6【参考答案】6.7【参考答案】6.8【参考答案】6.9【参考答案】6.10【参考答案】【参考答案】二、填空题B)D)A)A)B)D)D)B)A)A)C)96.12【参考答案】6.13【参考答案】6.14【参考答案】6.15【参考答案】6.16【参考答案】或: 10A20B-11ctype.h010A 20B 30C 40D30
24、C40D6.17【参考答案】或: 7.29101.29AB6.18【参考答案】A 7.29B 101.2986.19【参考答案】A7.29 101.298ABBC三、编程题6.20【分析与解答】(1) 最后用回车结束输入,字符也只能一个一ch已定义为charwhile(ch!KG-*2=)ch=getchar();ch=getchar();当读入的是一个回车符时,循环就结束。循环体内的“”符号表示需要在循环体内完成的其他操作。(2) 在循环内要求进行的操作之一是:输出每个字符以及与之对应的 ASCII 代码值。因此可用以下语句来实现。%c : %d ,ch,ch);(3) 3 对字符和与之对应
25、的 ASCII代码值。若 n 已定义为 int型变量,则可用来作计数器;使 n 的初值为 0,每输出一次,n 的值增 1,当 n的值为 3 的整数倍时,额外输出一个换行符。例如:n+;);(4) 把(2)和中给出的语句放在循环体内,并按要求给出正确的定义和初值,就可完成题目所要求的操作。(5) 也可以在 whilewhile(ch=getchar()!KG-*2=。这时,循环内、外的“ch=getchar();”语句应当去掉。6.21【分析与解答】(1) 一行字符的读入,请参照题 和(5)中的解释。循环体内的“”符号表示需要在循环体内完成的其他操作。ch=getchar();while(ch!
26、KG-*2=)10ch=getchar();(2) 在本题中循环体内需要把读入的所有数字字符转换成一个整数。若用变量 n 来存放这个整数,为了保证有效的存放,应当把它定义成 long类型。(3) 要把输入的一串数字字符转换成一个整数,首先需要判断当前读入的字符是否是数字字符,若不是则什么也不做;若是,则进行以下操作: 0; ,在这里d 是一个整型变量; 把 d 中的一位数归并到 n 的低位中,这可用语句“”来实现。这里所述的操作可由以下语句来完成:09) d=ch-0; n=n*10+d; if语句后一对括号中的判断表达式可以调用字符函数 isdigit来实现:if( isdigit(ch)
27、) 0; n=n*10+d; if子句的两个语句可以合并成:0。(4) 把中的语句放入循环中:ch=getchar();while(ch!KG-*2=)0&ch=9) n=n*10+ ch-0;ch=getchar();(5) 请自己写出定义语句并赋初值。注意,最后输出 n时,应当使用格式说明,而不能使用。6.22【分析与解答】(1) 行数的统计可通过统计输入的符的个数来完成。(2) 统计的过程应当放在一个 while 循环体中;判断循环是否进行的条件可以用:(ch=getchar()=EOF)。若用整型变量 n 作为计数器对符进行统计,只要读入的字符是,则 n增 1。如:while(ch=g
28、etchar()!KG-*2=EOF)n+;(3) EOF是在 stdio.h中预定义了的标识符,在 TURBO C 的环境下,键入 Ctrl+Z(即按住键盘上的 Ctrl键,同时按字母 Z键后,敲 Enter键,即输入了 。6.23【分析与解答】(1) 本题要求的操作同样可在 while循环中完成:) (2) 若用整型变量 n n增 1。如: & )n+;(3) 在退出循环后,输出 n的值。(4) 请自己完善程序。6.24【分析与解答】(1) 若图案的行数输入到变量 L中。(2) 按要求 L决定了图形的行数,因此可通过循环来实现 L行的输出:for(i=1; i=L; i+)11 循环体中的
29、“”号,代表输出 L行的操作。(3) 假定 ch中存放了一个字符,我们知道,通过以下循环可以在一行上输出 n个字符:for(j=1; j=n; j+)putchar(ch););注意,在循环后 语句不可少,它用以换行。(4) 或行号为 1 时输出字符,行数为 2 时输出字母 若输出的字母放在变量 ch 中,行号取决于外循环的控制变量+i-1 i为 1 时 ch中被赋予字母 ,当 i为 2 时 ch中被赋予了字母 ,其他依此类推。因此,在此表达式后,利用中的循环就解决了各行上输出的字母。(5) 按要求每行输出的字母的个数不同,第二行输出 3 个字母,第三行输出 5 个字母,第四行输出 7 个字母
30、中 for循环体的执行次数取决于 n 的值,也就是说 n 的值决定了每行输出字母的个数。其实,n的值与行号有着密切的关系:,当 i为 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=+i-1;n=2*i-1;for(j=1; j=i; k-)putchar( );把此循环放在 i控制的循环体内、输出每行字符的循环之前即可。(8) 请读者自己补充有关的 include行、语句和变量的定义
31、,以完成整个程序。注意,如果有能力可在某些地方作些简化。 一、选择题7.1 【参考答案】7.2 【参考答案】7.3 【参考答案】7.4【参考答案】7.5【参考答案】C)C)B)C)A)127.6【参考答案】7.7【参考答案】二、填空题D)A)7.8【参考答案】7.9【参考答案】7.10【参考答案】【参考答案】7.12【参考答案】7.13【参考答案】三、程序调试和编程题7.14 【分析与解答】12或 9.000000)41 n=1 2 s1 =y 2 z*x1 1 2 s*i 3 0 4 f(k)(1) fun函数判断传给形参 n的数是否为素数,若是函数返回 1,否则返回 0。(2) 函数的原意
32、是用变量 yes作为判断 n 是否为素数的标志,是素数,其值为 1,否则为 0。而所给函数的实际流程却不能实现这一功能,例如,若n的值为 15(明显不是素数时,在 for循环中,当 k 的值为 3 时,就会执行 if子句,yes得 0,但 for循环并没有终止,接着 k 为 4时就会执行 else yes得 1最后确定 yes为何值的是 for循环的终止值 ,当 n 为 15 时,k 的值为 n/2等于 7,在循环体内将又一次执行 else子句,使 yes得 1,这时循环结束,函数返回 1。由此可见所给 fun函数不能起到预想的作用。(3) 由上分析可知,对于 n 的值为 15 时而言,问题是
33、在一旦 yes的值为 0,已判断 n 中的值不是素数时,没有及时退出循环,返回0;因此,若在 if子句中添加一条语句:break;就能解决这一问题,把 if语句改写如下:if(n%k=0) yes=0; break; else yes=1;(4) 在所给 fun n的值为 23 时都是素数 n/2的值为 大于 k 中的 2)以不会进入 for循环,而直接执行return语句,细心的读者应该可以发现,这时yes没有赋过yes赋初值 1:int k, yes=1;至此 fun函数能正确运行。(5) 总结:因为一旦 if 语句中的表达式:n%k=0 的值为 即可被某数整除,则可以确定 n不是素数,因
34、此即可返回,不必再执行函数其他部分,if子句可改成:if(n%k=0) yes=0; return yes; else yes=1;也可简化成:if (n%k=0) return 0;else yes=1;又可进一步不用变量 yes,并去掉 ,简化成请参考例 :for( k=2; k=n/2; k+)if(n%k=0) return 0;return 1;7.15【分析与解答】(1) 若用整型变量 c存放余数,则求 a被 b 除后的余数可用表达式:。(2) 本题要求编写函数 mymod用以求 a被 b 除后的余数即:13c=mymod( a,b );(3) 只要把 a%b作为函数值返回即可完成
35、操作请参考例 :int mymod(int a, int b) return a%b; (4) 总结:本题在算法上十分简单,只是要求读者能够掌握编写函数的基本知识。7.16【分析与解答】(1) 1 1;只是累加项的符号交叉变化。因此处理好符号的变化是完成操作的关键之一。(2) 若函数名为 n浮点型,为此函数的首部可以是:double funa( int n )(3) 接着写函数体。累加放在一个 for循环中来完成,若循环控制变量为 k,可利用循环控制变量作为累加项 t的分母,累加值放在 add中:for( k=1; k=n; k+)t=s*1.0/k;add=add+t;此处,s用作符号变量,
36、在 1 和-1 之间交叉变化,乘以1.0/k后,t的值也将按要求变化符号。注意,表达式 1.0/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) 最后注意应当给各变量赋以适当的初值,并返回函数值。(6) 请编写主函数。当传给形参的值为 10 时,函数的返回值应
37、当是:0.645635。(7) 总结:本题的算法并不复杂,但是需要读者掌握编写函数的基本知识。掌握需要传入函。数的参数及其类型,掌握需要返回的值及其类型。在此基础上,其他方面与先前在主函数中编写的程序没有什么区别。7.17 【分析与解答】(1) 此题与 7.18 相似。函数的返回值为浮点型,函数只有一个形参,为整型。(2) 函数的基本算法是累加,只是除第一项外其余各项都用减法;每一项的分子都是1,分母部分为 k 2,k 的值逐项增 1,由 2 变化到 。因此,算法可以用一个循环来实现。(3) 当 m的值为 12 时,函数值应是:0.435023。7.18【分析与解答】(1) 若函数取名为 fu
38、n,按题意,x 作为形参,由调用函数传入,其类型不应当用整型;表达式 x 2-5x+4的值作为函数值返回,函数值的类型应为浮点型。因此,很容易写出函数:double fun( double x ) return x*x-5*x+4; (2) 若在调用函数时,x 和 y2 已正确定义,且 x 已有确定的值,则可用以下函数调用语句得14到 y2的值:y2=fun( x+15 );(3) 同样,若在调用函数时,x 和 y3 已正确定义,且 x 已有确定的值,则可用以下函数调用语句得到 y3的值:y3=fun( sin(x) ); C 语言提供的库函数 sin行:#include(4) 参考(2) 和
39、(3) 应不难写出求 y1的语句,请读者自己完成。(5) 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 y add( x*x,y*y);来求 ;当 、y有确定值时,可以用add( sin(x+y),cos(x+y);来求 sin(x+y)+
40、cos(x+y),这同样可以通过add( sin(add(x,y),cos(add(x,y) );来求得。 一、选择题8.1【参考答案】8.2【参考答案】8.3【参考答案】8.4【参考答案】8.5【参考答案】8.6【参考答案】8.7【参考答案】8.8【参考答案】8.9 【参考答案】8.10【参考答案】【参考答案】8.12【参考答案】二、填空题A)B)B)C)B)B)C)D)B)C)C)C)8.13【参考答案】8.14【参考答案】1107 18.15【参考答案】 char *p, *p=ch, p=&ch; scanf(%c/np,); ch=*p; p=&ch; printf(%c/n,*p)
41、;8.16【参考答案】 *s=*(p+3), *(s-2),50, *s=*(a+1), 2, 10,20,30,40三、编程题8.17【分析与解答】(1) 若函数名为 fun,按题意,函数不返回函数值;函数的形参需要接受传送过来的两个浮点数,因此需要有两个 double类型的形参;另外要把它们的和值与差值,通过形参传送回去,这就要求有两个 double类型的形参指针,接受传送过来的地址,以便通过指针把和值与差值传送给所指的主函数中的变量。因此函数的首部应当是:15void fun(double a, double b, double *p1, double *p2)这里,、b、p1、p2 是
42、自己取的名。(2) 假设把 b 的和值传送给 p1 所指的存储单元,可用语句:*p1=a+b; 把 b 的差值传送给 p2 所指的存储单元,可用语句:*p2=a-b;。(3) 因此函数可写成:void fun(double a,double b,double *p1,double *p2) *p1=a+b; *p2=a-b; (4) 在主函数中,若有定义语句:double ,且 、y已赋值,则调用 fun函数的语句可以是:。(5) return语句就不可能返回两个函数值。要求读者能利用形参指针把要求的值间接地传回调用函数。8.18【参考答案】(1) 若函数名为 maxandmin 3 个数假定
43、为 int类型,并需要通过指针指向主函数中的两个 int单元中。因此函数的首部应当是:void maxandmin(int a,int b,int c,int *pmax,int *pmin)(2) 函数体中需要实现求 3 个数的最大值和最小值的算法,此算法应当在学习第四章时已经掌握可参考例 4.2 和习题 。如果把bc中的最大值暂时放在 max中,把最小值放在min中,可用以下算法找到最大值: 假定 a中的数最大,把 a赋给 max。 用 b 去和 max比较,若 b 大于 max,则把 b 赋给 ;若不大于 max,则什么也不做。 用 c去和 max比较,若 c大于 max,则把 c赋给
44、max;若不大于 ,则什么也不做。 经过以上操作,max中已放入了 、b、c三个数中的最大数。 可模仿以上算法找到最小值:min=a;if(bmin)min=b;if(cmin)min=c;(3) 若最大值已放入 max中,最小值已放入 min 中,则可用以下语句把最大和最小值放入指针 pmax和 pmin 所指的存储单元中:*pmax=max; *pmin=min;(4) 若主函数中已把 3 个数放入 、z中,要求把最大值放入 m中,把最小值放在 n中,则调用语句应当是:(5) 总结:本题要求的算法在第四章应当已掌握,本题的主要目的是要求读者掌握如何通过指针把函数中的多个结果传回主函数。 一
45、、选择题9.1【参考答案】 D)9.2【参考答案】 A)9.3【参考答案】 A)9.4【参考答案】 A)9.5【参考答案】 C)9.6【参考答案】 A)9.7【参考答案】 B)169.8【参考答案】 D)9.9【参考答案】 C)9.10【参考答案】 C)【参考答案】 C)9.12【参考答案】 D)9.13【参考答案】 D)9.14【参考答案】 A)9.15【参考答案】 A)9.16【参考答案】 A)9.17【参考答案】 C)9.18【参考答案】 C)二、填空题9.19【参考答案】 9 09.20【参考答案】 69.21【参考答案】 129.22【参考答案】 39.23【参考答案】 27219.
46、24【参考答案】 -850,2,09.25【参考答案】 1k=p 2k9.26【参考答案】 1 (c=getchar() 2 c-三、上机题9.27【分析与解答】(1) 对于字符的输入可参考教材例 6.3 和习题 9.26 中的 while条件是:等于KG-*3n。(2) 在 while 循环体中,用 if条件来判断是否为数字字符,若是,就使对应的元素增 1;if中的条件表达式可用 C 的库函数:isdigit(ch),这时要在程序前加:#include 行;也可用:chKG-*3=0&chKG-*3=9。(3) 若用 num数组元素来进行统计,当ch0”时,使num0增1、当ch中是数字 “
47、1”时,使 1增 1num的下标表达式可用:ch-0。(4) 注意,在定义数组时,数组的大小应符合使用的要求。在利用数组元素作为计数器时,不要忘记首先应该给数组元素赋 0 值。(5) 总结:通过本题的编程,要求掌握利用数组元素作为计数器的基本算法。9.28【分析与解答】 本题的编程请参考例 9.8。(1) 若有以下 10 个整数:0 1 2 3 4 5 6 7 8 9要求从第 5 个元素依次向前移,则移动之后的数列应该是:0 1 2 4 5 6 7 8 9第 5 个元素不是指下标为 5 4 的那个。(2) 完成移动后,数列中的数据个数减 1。(3) 若进行指定操作的函数名为 ,则函数的首部可如
48、下:void moves(int *a,int n,int *m)这里 a 用以指向一维数组的首地址,n 接受开始移动的元素的位置,m 指向主函数中存放元素个数的变量,因为没有函数值返回,因此函数的类型定义为 。(4) 可用以下 for循环完成指定的移动: ) ;17注意,应当先把第n个元素下标为 移到第 n-1个元素下标为 的位置上,依次从前到后向前移动。(5) 完成移动之后,应使 m所指变量中的值减 1,表示数列中的数据少了一个;这可由于句:来完成。(6) 可设计一个输出函数,在移动前、后调用此函数输出数组中的数据,以便验证操作是否正确。若输出函数名为:,则函数首部可写成:void out
49、arr( int a, int num)形参 a指向待输出的数组,num接受数组中元素的个数。输出操作可由一个 for循环来完成:for(i=0; inum; ) printf();KG-*3n KG-*3n );退出循环后的 printf语句使上面的输出行结束。(7) 在主函数中定义所需的数组和变量。数组中的值可以在主函数中输入,也可定义一个函数用于输入数据。n 的值在主函数中输入,然后调用以上函数。需要注意的是,给 n 输入的值不能是 1,因为第一个元素下标为 再向前移,下标就越界了,同时,n 的值也不可大于10,因为已指定只有 10 个元素。(8) 总结: 次调用,而不应重复地编写代码。
50、虽然该函数中只是一个 for 循环,似乎在主函数中书写两次也不麻烦,但养成良好的模块化程序设计的风格却是十分重要的。 分析以上例子可见,所规定的操作,实际上删除了数列中的第n-1个元素,因此可见删除操作是由移动操作来完成的。9.29【分析与解答】(1) 程序要求定义两个数组以便存放原始数据和从中选出的所有奇数。(2) 若把函数命名为 ,则函数首部可写成:void odds(int *a,int an,int *b,int *bn)形参 a 指向存放原始数据的数组,an 存放此数组中数据的个数;b 指向另一个数组,此数组 bn奇数的个数传回主函数。(3) 在 odds函数中,可通过一个 for循
51、环选出所有的奇数: )if(a%2) jKG-*3+KG-*3+; 在 for循环中逐个引用原始的数组元素,若元素中的值不能被 2 除尽不为 ,则把它放入 b所指的数组中;j用作 b 的下标,每放入一个奇数后,j的值加 1;注意,j的初值应该置 0。(4) 当完成以上操作退出循环时,因为在循环内最后进行了一次 的操作,所以 j 的值就是奇数的个数,最后应当把它赋给*bn,以便通过指针 bn 把奇数的个数传回主函数。(5) 程序需要两次输出数组中元素的值,一次是输出原始数组中的值,一次是输出奇数数组中的值。因此可以使用题 9.28 中的 outarr函数,进行两次调用。(6) 在主函数中应当定义
52、所需的数组和变量,可以在主函数中给数组元素输入数据。(7) 总结:本题的算法很简单,要求读者能够编写独立的模块,并在函数之间熟练地传送数据。9.30【分析与解答】(1) 例 9.9 完成了对整数由小到大的排序,而本题是对字符数组中的元素进行由大到小的排序;两者之间并无大的区别,只是数组的类型不同,字符数组中每个元素存放一个字符,字符的大小依据每个字符的 ASCII码值的大小。18(2) 若函数形参 a 指向主函数中待排序的数组,由大到小的排序只需改变内循环中 if 语句的条件表达式即可:if(ap) p=i;此处 i是内循环的控制变量。(3) 排序前后可以调用一个输出函数,输出原始数据和排序后
53、的数据,可参考习题 9.28 的outarr函数,但注意,这里是对字符数组进行输出。(4) 总结:读者可以参考例 9.9,程序基本相同,但在掌握排序算法的基础上,必须独立完成此程序,不要照抄。9.31【分析与解答】(1) 我们把插入操作命名为函数 ,若待插入的数据放在形参 x中,指针 a指向主函数中的数组,指针 n 指向存放数组中元素的个数变量,因为插入后,数组中的数据会增加。函数的首部如下:void insert(int *a,int x,int *n)(2) 若数组中原有的有序数列按由小到大排列如下,共 12 个数:11 14 17 18 19 20 22 24 26 29 30 33若
54、x中的数为 21,我们立刻知道应插在何处,插入后数列如下,则插入后变成有 13 个数:11 14 17 18 19 20 21 22 24 26 29 30 33因此,对于程序来说应当做以下 4 件事: 能根据待插的数据,按“仍然有序的要求”判断出插入的位置。 把位置腾出来,以便放入插入的数据,但原有的数据不能缺少。 把 x中的数放入腾出来的位置中。 使原有数组中的数据个数增 1。(3) 现在来做第一个步骤:确定插入的位置。用变量 j 来放置该位置在数组中的下标,以下while循环将完成此任务:j=0;while(j*n & KG-*3= j;i-) ai+1;(5) 第三个步骤是把 x放入
55、中:=x;(6) 第四步是使存放数据个数的变量中的数增 1:*n =*n 插入过程到此结束。(7) 可利用习题 9.28 中的 outarr 函数,在插入前和插入后两次输出数组元素,以判断操作是否正确。(8) 请编写主函数,定义所需的数组和变量,给数组输入一组有序数,正确调用函数。(9) 请按题目要求至少对程序运行 3 次,判断程序是否在各种情况下都能得到正确的结果。(10) 9.32【分析与解答】19(1) 若函数名为 ,函数首部如下:void change(int x,int *a, int *n)形参 x 中存放一个待转换的十进制数,指针 a 指向一个一维数组,数组中每一个元素中存放一个
56、 0 或 1 代表一位二进制数,指针变量 n 指向一个整型变量,其中存放在一维数组中二进制位的个数。(2) 函数中定义一个指针变量 ,并把 a所指的数组的首地址赋给它以便保留。把 x每次被 2除后的余数放在 a a x的值除 2;重复此过程,直到 x的值为 0。可用以下的 while循环来进行转换:s=a;while(x) *a=x%2; a +KG-*3+; x=x/2; 退出循环时,已把转换后的二进制数的每一位上的数放入主函数的数组元素中,但是应当注意,在 0中放的是二进制数的最低位,最后放入的是最高位。例如,整数 8 转换成的二进制数为 100,则在 01中存放的是 0,而 2中存放的是
57、 1。(3) 函数中最后用:*n =a-s;把存放在一维数组中二进制位的个数放入 n 所指的变量中。因为 s已指向主函数中数组的第一个元素下标为 ;在循环中,指针 a不断后移,最后指向存放二进制数最高位的元素;所以 a-s 的值就是已存入数据的元素的个数。(4) 在主函数中输入待转换的十进制数,调用 change 函数后输出数组元素中的值,注意,因为在 0中放的是二进制数的最低位,因此输出的顺序应该从 到 09.33【分析与解答】(1) 若函数名为 getone,形参指针 a指向主函数中存放指定数据的数组。函数的首部如下:void getone(int a)(2) 函数中变量 x 用来存放得到
58、的一个随机数,变量 n 用来存放数组中已放入的不同的随机数的个数,变量 i用作下标变量。(3) 所有的工作在一个 while循环中完成:while(n15)当不同的随机数的个数 n的值等于 15 时退出循环。(4) 在以上 while循环中需要进行以下 4 项步骤: 得到一个小于 20 的随机整数。 准备从下标为 0 的元素开始去查找数组中是否有与 x 相同的数,若没有,就把 x中的数加入到数组中放在最后,若有,就什么也不做。 用以下 while循环从头到尾去检查数组中是否有与 x值相同的元素:while(in & x ) ;在两种情况下,退出循环:a. 当 x不等于 时, ,x再去与下一个元
59、素进行比较,当遇到 x等于 时,说明在数组中已经有此数,因此不必再去比较,应当退出循环。b. 当 x不等于 时,i的值不断增 1;当 i的值等于 n时,说明 x已与数组中所有元素都比较过且都不相同,这时也应退出循环。 如果 i的值等于 n时,数组中没有与 x相同的元素,因此需要把新的值放入数组中,可用以下语句来实现:if(i= n) nKG-*3+KG-*3+; 因为已有 的数据 放在下 标为 0 到 n-1 的元素 中,因 此新的数 放在 an中, 然后nKG-*3+ KG-*3+; 即数组中不同数据的个数增 1。(5) 接着重新循环,再去产生一个新的随机数,重复以上过程,直到 n的值等于
60、15 时退出外循环。这时在数组中已放入了 15 个不同的随机整数。20(6) 请在主函数中定义所需的数组和变量。调用 getone 函数后,可在主函数中输出所得的数据。(7) 总结: getone函数的主要部分是查找,没有找到才进行下一步操作。 C 语言提供的库函数 rand( 每调用一次产生一个 0 到 32767 的随机整数,因此 rand()%20将得到一个 0 到 19 的随机整数。9.34【分析与解答】(1) 本题可参考例 。(2) 本题可用 define 命令行定义 N 来代表一个常量参考 2.2.3 节。可定义 4 个独立的函数来实现所要求的操作。第一个函数:void getm(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 全球主要气候带试题与答案
- 2025年-广东省建筑安全员C证考试题库
- 2025年-云南省建筑安全员考试题库附答案
- 2025年-黑龙江省安全员-B证(项目经理)考试题库
- 兽医法规与伦理考题及答案
- 餐饮行业餐饮连锁店高效运营策略方案
- 股份制改革进程报告书
- 人口运动与社会发展试题及答案
- 公共卫生助理医师-《公共卫生助理医师》第一单元模拟试题2
- 《大学生心理健康教育(第2版)》 课件:学会学习 喜欢学习-学习心理
- deepseek的使用技巧与实际应用培训课件
- 十八项核心制度培训课件
- 《深度学习原理》课程教学大纲
- 沪教版数学八年级上册全册教案
- 特殊场所的消防安全知识培训
- 航海英语听力与会话
- 国家电网招聘2025-企业文化复习试题含答案
- 2024年官方兽医牧运通考试题库(含答案)
- 《hpv与宫颈癌》课件
- 【课件】校园安全系列之警惕“死亡游戏”主题班会课件
- 西安交通大学《程序设计思想方法与实践》2021-2022学年期末试卷
评论
0/150
提交评论