




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 全国计算机等级考试二级教程语言程序设计 # 习题分析与解答第一章程序设计基本概念习题分析与解答11【参考答案】.EXE12【参考答案】1.C2.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.224.2
2、216【参考答案】123定义4执行217【参考答案】1关键字2用户标识符218【参考答案】1int2float3double219【参考答案】floata1=1.0,a2=1.0;或floata1=1,a2=1;(系统将自动把1转换为1.0)220【参考答案】存储单元221【参考答案】3.5222【参考答案】1a*b/c2a/c*b3b/c*a223【参考答案】把10赋给变量s224【参考答案】1位21位二进制数据(0或1)225【参考答案】1821273011111114-128510000000226【参考答案】1327672-3276831000000000000000227【参考答案】
3、1十2八3十六三、上机改错题228【分析与解答】第1行的错误:(1)include是一个程序行,因此在此行的最后不应当有分号(;)。第2行的错误:(1)main()是主函数的起始行,不是语句,因此最后不应当有分号(;)。在同一行上的/*mainfunction*/显然是注释;C语言规定:注释由/*开头,由*/结束,但在*号和/之间不得插入任何空格,而在此处“/*”和“*/”之间存在空格,因此,/*mainfunction*/的写法是错误的,而应写成:/*mainfunction*/。第3行的错误:(1)在主函数的起始行main()的后面是函数体,函数体由左花括号(开始。但在函数体的第一行:fl
4、oat的前面缺少了左花括号(。(2)在同一行上的/*/*risradius*/,/*sisareaofcircular*/*/显然是注释;C语言规定:注释由/*开头,由*/结束,并且开头的/*将去找最近的*/去配对,因此在/*/*risradius*/中,第一个/*与radius后的那个*/配上了对,结果紧跟在后面的那个逗号(,)落在了注释的外面,而构成了一个多余符号,为此,在编译时将报告“语法错”。/*sisareaofcircular*/*/中第一个*/就结束了注释,第一个*/就成了多余的了。第6行的错误:(1)printf(fn,s)应当是一条输出语句,但在最后缺少了一个分号。print
5、f(%fn,s);是程序的最后一条语句,程序应当结束;但缺少了程序体结束所需的右花括号();此右花括号可以放在printf(%fn,s);的后面,也可以放在printf(%fn,s);的下一行上。227【分析与解答】第2行的错误:在main的后面缺少一对圆括号。第4行的错误:在c=4.0的后面缺少分号。第6行的错误:在printf(%fn,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【参考答
6、案】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)把D的答案修改为:scanf(“8f”,&c);3.19【参考答案】C)3.20【参考答案】B)二、填空题3.21【参考答案】(3)i=-200j=25003.22【参考答案】3.23【参考答案】3.24【参考答案】3.25【参考答案】1:10025.812:100(1)-200,2500(2)i=-200,j=250011220301.89234一条语句2分号(或;)分号
7、(;)25.811.892343:10025.811.89234【参考答案】x=127,x=127,x=177,x=7f,x=127【参考答案】x=127,x=127,x=127,x=000127,x=%06d【参考答案】a=513.789215,a=513.79,a=513.78921500,a=513.78921500三、编程题和改错题3.29【分析与解答】(1)主函数名main后应有一对圆括号。第三行的printf语句用以提示输入,但是原样输出的字符串没有用双引号括起来;另外,从输入的形式看,输入的数据紧跟在提示之后,因此,printf格式串中最后不应该有换行符一n。因为输入项a、b、c
8、从定义和计算结果来看都是double类型,因此,第四行scanf语句格式串中的格式说明不应当用d而应当用厲且每一个变量之前应该加地址运算符&。第七行的printf语句中应当把%d都改成%lf或按输出要求在格式串中应添加相应的原样输出的字符;因为下一个printf的输出从新的一行开始,因此在本输出语句的格式串的最后应当加换行符n。第八行的printf语句中应当把格式串整理合并放在输出项的前面,输出项放在后面,%d都改成%lf或2中间的n删去。请同学们自己写出修改后的程序,并上机调试。3.30【分析与解答】分析:可用算术式560三60把分钟换算成小时和分钟,商数就是小时数,余数就是分钟数。确定变量
9、的名字和定义变量的类型:在程序中把小时数放在变量h中,把分钟数放在变量m中。这两个变量的类型可以是整型(本题中采用整型),也可以是实型。确定所用算法:求560三60的商数,在C语言中可以用整除的算法,语句是h=560/60;。求余数可用求余运算符%:560%60,其值放入变量m中的语句是:m=560%60;。(4)设计输出格式。若输出的形式定为:小时:分钟,则按此形式设计输出语句。把以上内容放在主函数的一对花括号中。编写程序如下:main()inth,m;h=560/60;m=560%60;printf(Theresult:%3d:%3dn,h,m);运行结果是:Theresult:9:20【
10、分析与解答】确定变量的名字和定义变量的类型。若用a存放1500,用b存放350;用q存放商数,用r存放余数,所有变量应定义成int类型。设计输入语句从终端输入1500和350;在输入语句之前,应当设计一个输出语句,用以提示输入。可用整除求商数,结果放在变量q中。可用求余运算符求两数之余数,结果放在变量r中。设计输出语句。输出a、b、q、r。把以上内容放在主函数的一对花括号中。本题的程序与3.30相似,请大家参考上题并根据本题的解释自己编程,并上机调试。【分析与解答】(1)定义4个双精度变量a、b、c和ave,变量a、b、c分别存放读入的3个双精度数,ave存放它们的平均值。设计输入语句,以及在
11、此之前用于提示输入的(printf)语句。设计求平均值的算法,把所求得的平均值放入变量ave中。设计把变量ave中的数,从小数点后第二位数进行四舍五入的算法。现举例说明:若ave中的数为123.4644,为了保留此值小数点后一位,可用表达式:(int)(123.4644*10)/10.0;依次推算,为了保留此值小数点后二位,可用表达式:(int)(123.4644*100)/100.0;其他依此类推。若要求对小数点后第二位数进行四舍五入,则可对原数加0.05后再进行以上运算。如要求保留123.4644小数点后一位且对第二位数进行四舍五入,可用表达式:(int)(123.467+0.05)*10
12、)/10.0。注意:分母一定要用实数10.0而不能用整数10,否则就变成整除了;若要求保留123.4644小数点后两位且对第三位数进行四舍五入,可用表达式:(int)(123.467+0.005)*100)/100.0;其他依此类推。设计输出语句。输出a、b、c和ave。把以上内容放在主函数的一对花括号中。编写程序如下:main()doublea,b,c,ave;printf(Entera,b,c:);scanf(“lf%lf%lf,&a,&b,&c);ave=(a+b+c)/3;printf(ave=%fn,ave);/*用以比较四舍五入前后的数据*/ave=(int)(ave+0.05)*
13、10)/10.0;/*上句也可写成ave=(int)(ave*10+0.5)/10.0;*/printf(a=%f,b=%f,c=%f,ave=%fn,a,b,c,ave);【分析与解答】关于对变量中的数进行交换的算法请参考3.7题中的解释和教程中有关的例题。定义4个整型变量a、b、c和t,变量a、b、c分别存放读入的3个整数,t用作临时存储单元。(3)设计输入语句,以及在此之前用于提示输入的(printf)语句。输出a、b、c中的值,以便于比较。交换的步骤如下:把c中的值赋给t。把b中的值赋给c。把a中的值赋给b。把t中的值赋给a。经过以上步骤,已按要求进行了交换。输出a、b、c中的值。编写
14、程序如下:main()inta,b,c,t;printf(Entera,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);第四章选择结构习题分析与解答一、选择题4.1【参考答案】A)4.2【参考答案】B)4.3【参考答案】A)4.4【参考答案】D)4.5【参考答案】C)4.6【参考答案】A)4.7【参考答案】B)4.8【参考答案】C)4.9【参考答案】D)4.10【参考答案】D)二、填空题4.11【参考答案】1非零2零4.12
15、【参考答案】、=、=、!KG-*2=4.13【参考答案】1!2&3JB1|JB1|4.14【参考答案】1:!KG-*2(逻辑非)2:、=(小于、大于、小于等于、大于等于)3:=、!KG-*2=(等于、不等)4:&(逻辑与)5:JB1IJB1I(逻辑或)。4.15【参考答案】!4.16【参考答案】1a=b或a1|xJB1|44.17【参考答案】14.18【参考答案】1xm0)JB1|JB1|(m1=m0&d1=d0)age=y1-y0;elseage=y1-y0-1;读者可以参考以上语句写出程序,也可以根据分析写出与此形式不同的语句和程序。4.23【分析与解答】(1)若输入的整数a是奇数,输出:
16、oddnumber,是偶数输出:evennumber。若一个a是偶数,它就能被2除尽,即a%2=0,输出evennumber;若是奇数,它就不能被2除尽,即a%2!KG-*2=0,输出oddnumber。读者可以参考以上给出的算法,写出相应的C语句,并编写出完整的程序。【分析与解答】本题的主要算法是从3个数中找出最大的那个数。假定始终把最大的数放在变量max中。(1)假定a中的数最大,把a赋给max。用b去和max比较,若b大于max,则把b赋给max;若不大于max,则什么也不做。用c去和max比较,若c大于max,则把c赋给max;若不大于max,则什么也不做。经过以上操作,max中已放入
17、了a、b、c三个数中的最大数,输出max即可。读者可以参考以上给出的算法,写出相应的C语句,并编写出完整的程序。【分析与解答】本题已给出了非常明确的条件,只要写出正确的条件判断语句就可基本完成程序的编写。由给出的函数可知,只有x的值在规定的范围内时,才求出y的值,因此程序应当对输入的x进行判断,若超过范围就不求y的值。现以使用ifCD#*2else语句为例写出程序供参考。main()intx,y;printf(Enterx:);scanf(“d,&x);if(x-5&x10)if(x=0)y=x-1;elseif(x0)y=x+1;elseif(x-5)y=x;printf(x=%dy=%dn
18、,x,y);printf(*END*nn);循环结构习题分析与解答第五章一、选择题(单选题)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【参考答案】1524365.12【参考答案】程序段无限循环,没有输出结果5.13【参考答案】-15.14【参考答案】115.15【参考答案】1d=1.02k+3k=02xamin三、编程题5.17【分析与解答】本题的基本算法是求累加值。累加项的值有规律的递增,每一项的
19、绝对值比前一项增2,因此可以利用循环的控制变量的递增来得到累加项的绝对值。例如:for(i=1;i=1e-4)t=t/i;e+=t;i+;请读者自己对变量做出正确的定义,设计输出语句,完善程序;也可以参考此程序段,按照自己的思路独立地完成程序。e的值应当是:2.71828。根据以上分析,读者已不难用for循环来实现求e值的计算。注意:在完成此程序时,不要对分母中的阶乘值进行单独计算,因为17!的值已超过long类型的最大值,更无法求到50!。5.19【分析与解答】从1880年至2000年的年数可用一个for循环来取得。对每一年,用以上指定的条件来进行判断,若满足条件即为闰年,进行输出。按输出的
20、要求,需要设一个变量用于统计一行中输出的个数,若在一行上已连续输出了5个年数,就需输出一个换行符,使下一个输出项在新的一行上开始;若用变量n来做此统计,则当表达式n%5=0时就应输出一个换行符,同时使n重新置0值。若变量y代表年数,讦语句的逻辑表达式可以写成如下:(y%4=0&y%100!=0JB1|JB1|y%400=0)以下程序段供参考:for(y=1880;y1|JB1|y%400=0)printf(“d,y);n+;if(n%5=0)printf(n);n=0;请读者自己对变量做出正确的定义并赋初值,完善程序;也可以参考此程序段,按照自己的思路独立地完成程序。从1880年至2000年有
21、30个闰年。5.20【分析与解答】不难理解利用以下的for循环可以在一行上连续输出n个*号:for(i=1;i=n;i+)printf(“*“);printf(n);若n的值是6,则连续输出6个*号。以上图形是在各行上输出数目不等的*号,只是*号的数目依次有规律地变化。在上半部分各行依次是1、3、5、7个,因此可以用以下的程序段来实现这样的输出:for(k=1;k=7;k+,k+)for(i=1;i=1;k-,k-)for(i=1;i=k;i+)printf(*);printf(n);以上程序段从第一列起输出的结果如下:*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*
22、现在我们已完成了在每行输出指定数目的*号。输出结果与题目要求不同,它们的区别是:按题目每一行之前有不同的空格,而这里则是所有的行都在第一列上开始输出*号;所以接着就应当解决这一问题。分析题目要求,每行第一个*号位置的缩进是有规律的,假定中间这一行第一个*号位置是在第一列,则可看出,第一至第三行的缩进分别是3、2、1个空格;而图形下半部的缩进数则刚好相反。这可在以上循环中添加输出连续空格的for循环来实现,对于上半部程序如下: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);请读
23、者在理解以上给出的示例的基础上,自己添加下半部空格的输出。第六章字符型数据习题分析与解答一、选择题6.1【参考答案】6.2【参考答案】B)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【参考答案】6.13【参考答案】6.14【参考答案】6.15【参考答案】6.16【参考答案】或:10A20B30C40D6.17【参考答案】或:7.29101.29AB6.18【参考答案】-11ctype.h010A20B30C40D7.
24、29101.298ABA7.29B101.2986.19【参考答案】ABC三、编程题6.20【分析与解答】在进行字符输入时,即使一次输入了一行字符(最后用回车结束输入),字符也只能一个一个地读入。若ch已定义为char型变量,可以用以下的程序段来完成操作:ch=getchar();while(ch!KG-*2=nz)ch=getchar();当读入的是一个回车符时,循环就结束。循环体内的“”符号表示需要在循环体内完成的其他操作。在循环内要求进行的操作之一是:输出每个字符以及与之对应的ASCII代码值。因此可用以下语句来实现。printf(%c:%d,ch,ch);在循环内要求进行的另一个操作是
25、:每行只能输出3对字符和与之对应的ASCII代码值。若n已定义为int型变量,则可用来作计数器;使n的初值为0,每输出一次,n的值增1,当n的值为3的整数倍时,额外输出一个换行符。例如:n+;if(n%3=0)putchar(nz);把(2)和(3)中给出的语句放在循环体内,并按要求给出正确的定义和初值,就可完成题目所要求的操作。也可以在while后的一对括号中来完成字符的读入,如while(ch=getchar()!KG-*2=n)。这时,循环内、外的“ch=getchar();”语句应当去掉。6.21【分析与解答】一行字符的读入,请参照题6.20(1)和(5)中的解释。循环体内的“”符号表
26、示需要在循环体内完成的其他操作。ch=getchar();while(ch!KG-*2=nz)ch=getchar();在本题中循环体内需要把读入的所有数字字符转换成一个整数。若用变量n来存放这个整数,为了保证有效的存放,应当把它定义成long类型。要把输入的一串数字字符转换成一个整数,首先需要判断当前读入的字符是否是数字字符,若不是则什么也不做;若是,则进行以下操作:把当前读入的一个字符转换成一个一位整数,这可由语句“d=ch-0,;”来实现,在这里d是-一个整型变量;把d中的一位数归并到n的低位中,这可用语句“n=n*10+d;”来实现。这里所述的操作可由以下语句来完成:if(ch=0,&
27、chv=9,)d=ch-z0,;n=n*10+d;if语句后一对括号中的判断表达式可以调用字符函数isdigit来实现:if(isdigit(ch)d=ch-,0,;n=n*10+d;if子句的两个语句可以合并成:n=n*10+ch-,0,;。把(3)中的语句放入循环中:ch=getchar();while(ch!KG-*2=,n,)if(ch=,0,&ch=a&ch=z)n+;在退出循环后,输出n的值。请自己完善程序。6.24【分析与解答】若图案的行数输入到变量L中。按要求L决定了图形的行数,因此可通过循环来实现L行的输出:for(i=1;i=L;i+)循环体中的“”号,代表输出L行的操作。
28、假定ch中存放了一个字符,我们知道,通过以下循环可以在一行上输出n个字符:for(j=1;j=n;j+)putchar(ch);putchar(/nz);注意,在循环后putchar(nz);语句不可少,它用以换行。现在应当解决如何按要求给出每行输出的字符。由图分析,行数(或行号)为1时输出字符A,行数为2时输出字母B若输出的字母放在变量ch中,行号取决于外循环的控制变量i,则输出的字母和行号的关系可用表达式:ch=A+i-l来表示。当i为1时ch中被赋予字母A,当i为2时ch中被赋予了字母B,其他依此类推。因此,在此表达式后,利用(3)中的循环就解决了各行上输出的字母。按要求每行输出的字母的
29、个数不同,第二行输出3个字母,第三行输出5个字母,第四行输出7个字母中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的值。总结以上分析,我们可得到以下的程序段:for(i=1;i=L;i+)ch=A+i-1;n=2*i-1;for(j=1;j=i;k-)putchar();把此循环放在i控制的循环体内、输出每行字符的循环之前即可。请读者自己补充有关的include行、语句和变量的定义
30、,以完成整个程序。注意,如果有能力可在某些地方作些简化。第七章函数习题分析与解答一、选择题7.1【参考答案】C)7.2【参考答案】C)7.3【参考答案】B)7.4【参考答案】C)7.5【参考答案】A)TOC o 1-5 h z7.6【参考答案】D)7.7【参考答案】A)二、填空题7.8【参考答案】129.0(或9.000000)7.10【参考答案】47.11【参考答案】1n=12s7.12【参考答案】1=y2z*x7.13【参考答案】112s*i30三、程序调试和编程题7.14【分析与解答】7.9【参考答案】(1)fun函数判断传给形参n的数是否为素数,若是函数返回1,否则返回0。4f(k)函
31、数的原意是用变量yes作为判断n是否为素数的标志,是素数,其值为1,否则为0。而所给函数的实际流程却不能实现这一功能,例如,若n的值为15(明显不是素数)时,在for循环中,当k的值为3时,就会执行讦子句,yes得0,但for循环并没有终止,接着k为4时就会执行else子句,又使yes得1,由此可见此程序段并不能准确地判断一个数是否为素数;最后确定yes为何值的是for循环的终止值n/2,当n为15时,k的值为n/2等于7,在循环体内将又一次执行else子句,使yes得1,这时循环结束,函数返回1。由此可见所给fun函数不能起到预想的作用。由上分析可知,对于n的值为15时而言,问题是在一旦ye
32、s的值为0,已判断n中的值不是素数时,没有及时退出循环,返回0;因此,若在讦子句中添加一条语句:break;就能解决这一问题,把讦语句改写如下:if(n%k=0)yes=0;break;elseyes=1;在所给fun函数中,当n的值为2、3时(都是素数),因为n/2的值为1(大于k中的2),所以不会进入for循环,而直接执行return语句,细心的读者应该可以发现,这时yes没有赋过值,也就是说,返回的是一个不确定的值,这将会导致错误;因此,应当在定义语句中给yes赋初值1:intk,yes=1;至此fun函数能正确运行。总结:因为一旦讦语句中的表达式:n%k=0的值为1(即可被某数整除),
33、则可以确定n不是素数,因此即可返回,不必再执行函数其他部分,if子句可改成:if(n%k=0)yes=0;returnyes;elseyes=1;也可简化成:if(n%k=0)return0;elseyes=1;又可进一步不用变量yes,并去掉else,简化成(请参考例7.4):for(k=2;k=n/2;k+)if(n%k=0)return0;return1;7.15【分析与解答】若用整型变量c存放余数,则求a被b除后的余数可用表达式:c=a%b。本题要求编写函数mymod用以求a被b除后的余数即:c=mymod(a,b);只要把a%b作为函数值返回即可完成操作(请参考例7.1):intmy
34、mod(inta,intb)returna%b;总结:本题在算法上十分简单,只是要求读者能够掌握编写函数的基本知识。7.16【分析与解答】本题所要采用的算法是累加。分析可见,所有累加项的分子都是1,而分母部分逐项增1;只是累加项的符号交叉变化。因此处理好符号的变化是完成操作的关键之一。若函数名为funa,传送到函数的参数是整型值,假定形参命名为n;函数的返回值应当是浮点型,为此函数的首部可以是:doublefuna(intn)接着写函数体。累加放在一个for循环中来完成,若循环控制变量为k,可利用循环控制变量作为累加项t的分母,累加值放在add中:for(k=1;k=n;k+)t=s*1.0/
35、k;add=add+t;此处,s用作符号变量,在1和-1之间交叉变化,乘以1.0/k后,t的值也将按要求变化符号。注意,表达式1.0/k不可以写成1/k,因为每一项的绝对值必定是小于1的小数。现在需要确定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;最后注意应当给各变量赋以适当的初值,并返回函数值。请编写主
36、函数。当传给形参的值为10时,函数的返回值应当是:0.645635。总结:本题的算法并不复杂,但是需要读者掌握编写函数的基本知识。掌握需要传入函。数的参数及其类型,掌握需要返回的值及其类型。在此基础上,其他方面与先前在主函数中编写的程序没有什么区别。7.17【分析与解答】此题与7.18相似。函数的返回值为浮点型,函数只有一个形参,为整型。函数的基本算法是累加,只是除第一项外其余各项都用减法;每一项的分子都是1,分母部分为k2,k的值逐项增1,由2变化到m。因此,算法可以用一个循环来实现。当m的值为12时,函数值应是:0.435023。7.18【分析与解答】若函数取名为fun,按题意,x作为形参
37、,由调用函数传入,其类型不应当用整型;表达式x?2-5x+4的值作为函数值返回,函数值的类型应为浮点型。因此,很容易写出函数:doublefun(doublex)returnx*x-5*x+4;若在调用函数时,x和y2已正确定义,且x已有确定的值,则可用以下函数调用语句得到y2的值:y2=fun(x+15);同样,若在调用函数时,x和y3已正确定义,且x已有确定的值,则可用以下函数调用语句得到y3的值:y3=fun(sin(x);注意,因为在程序中调用了C语言提供的库函数sin,因此应当在程序的最前面包含以下命令行:#includemath.h参考(2)和应不难写出求y1的语句,请读者自己完成
38、。y1的值应是:-2.0。当x的值为5时,y2的值应是:304.0。当x的值为0.5时,y3的值应是:1.832721。总结:本题已给出了函数需要求值的表达式,读者只需确定函数的类型和形参的类型,就可以写出函数,就像例7.1中求两数之和的函数一样简单。在给定了函数之后,调用函数时,函数的实参应当是一个与形参类型一致的任意合法的表达式。例如,可以是常量、算术表达式,也可以是函数等。就像例7.1中求两数之和的add函数一样,可以用add(3,4);来求3+4;当x、y有确定值时,可以用add(x*x,y*y);来求x2+y2;当x、y有确定值时,可以用add(sin(x+y),cos(x+y);来
39、求sin(x+y)+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.11【参考答案】8.12【参考答案】二、填空题8.13【参考答案】8.14【参考答案】8.15【参考答案】8.16【参考答案】三、编程题A)B)B)C)B)B)C)D)B)C)C)C)11071char*p,*p=ch,p=&ch;scanf(“%c/n”p,
40、);ch=*p;p=&ch;printf“(%c/n”,*p);*s=*(p+3),*(s-2),50,*s=*(a+1),2,10,20,30,408.17【分析与解答】若函数名为fun,按题意,函数不返回函数值;函数的形参需要接受传送过来的两个浮点数,因此需要有两个double类型的形参;另外要把它们的和值与差值,通过形参传送回去,这就要求有两个double类型的形参指针,接受传送过来的地址,以便通过指针把和值与差值传送给所指的主函数中的变量。因此函数的首部应当是:voidfun(doublea,doubleb,double*p1,double*p2)这里,a、b、pl、p2是自己取的名。
41、假设把a、b的和值传送给pl所指的存储单元,可用语句:*p1=a+b;把a、b的差值传送给p2所指的存储单元,可用语句:*p2=a-b;。因此函数可写成:voidfun(doublea,doubleb,double*p1,double*p2)*p1=a+b;*p2=a-b;在主函数中,若有定义语句:doublex,y,z1,z2;,且x、y已赋值,则调用fun函数的语句可以是:fun(x,y,&z1,&z2);。总结:本题所要求的算法极简单,但它要求有两个值返回,用return语句就不可能返回两个函数值。要求读者能利用形参指针把要求的值间接地传回调用函数。8.18【参考答案】若函数名为maxa
42、ndmin,按题意,函数不返回函数值;函数将接受3个数(假定为int类型),并需要通过指针指向主函数中的两个int型变量,以便把最大值和最小值放入指针所指的存储单元中。因此函数的首部应当是:voidmaxandmin(inta,intb,intc,int*pmax,int*pmin)函数体中需要实现求3个数的最大值和最小值的算法,此算法应当在学习第四章时已经掌握(可参考例4.2和习题4.24)。如果把a、b、c中的最大值暂时放在max中,把最小值放在min中,可用以下算法找到最大值:假定a中的数最大,把a赋给max。用b去和max比较,若b大于max,则把b赋给max;若不大于max,则什么也
43、不做。用c去和max比较,若c大于max,则把c赋给max;若不大于max,则什么也不做。经过以上操作,max中已放入了a、b、c三个数中的最大数。可模仿以上算法找到最小值:min=a;if(bmin)min=b;if(c行;也可用:chKG-*3=z0Z&chKG-*3=9。若用num数组元素来进行统计,当ch中是数字“0”时,使num0增1、当ch中是数字“1”时,使num1增1num的下标表达式可用:ch-0。注意,在定义数组时,数组的大小应符合使用的要求。在利用数组元素作为计数器时,不要忘记首先应该给数组元素赋0值。总结:通过本题的编程,要求掌握利用数组元素作为计数器的基本算法。9.2
44、8【分析与解答】本题的编程请参考例9.8。(1)若有以下10个整数:0123456789要求从第5个元素依次向前移,则移动之后的数列应该是:012456789第5个元素不是指下标为5的元素,而是指排列的顺序,对此数列而言是指数值为4的那个完成移动后,数列中的数据个数减1。若进行指定操作的函数名为moves,则函数的首部可如下:voidmoves(int*a,intn,int*m)这里a用以指向一维数组的首地址,n接受开始移动的元素的位置,m指向主函数中存放元素个数的变量,因为没有函数值返回,因此函数的类型定义为void。可用以下for循环完成指定的移动:for(i=n-1;iv*m;iKG-*
45、3+KG-*3+)ai-1=ai;注意,应当先把第n个元素(下标为n-1)移到第n-1个元素(下标为n-2)的位置上,依次从前到后向前移动。完成移动之后,应使m所指变量中的值减1,表示数列中的数据少了一个;这可由于句:*m=*m-l;来完成。可设计一个输出函数,在移动前、后调用此函数输出数组中的数据,以便验证操作是否正确。若输出函数名为:outarr,则函数首部可写成:voidoutarr(inta,intnum)形参a指向待输出的数组,num接受数组中元素的个数。输出操作可由一个for循环来完成:for(i=0;ivnum;iKG-*3+KG-*3+)printf(“d,ai);printf
46、(KG-*3nKG-*3n);退出循环后的printf语句使上面的输出行结束。在主函数中定义所需的数组和变量。数组中的值可以在主函数中输入,也可定义一个函数用于输入数据。n的值在主函数中输入,然后调用以上函数。需要注意的是,给n输入的值不能是1,因为第一个元素(下标为0)再向前移,下标就越界了,同时,n的值也不可大于10,因为已指定只有10个元素。总结:对于需要进行多次的操作,如本程序中输出数组元素中的值,应当编写一个独立的函数多次调用,而不应重复地编写代码。虽然该函数中只是一个for循环,似乎在主函数中书写两次也不麻烦,但养成良好的模块化程序设计的风格却是十分重要的。分析以上例子可见,所规定
47、的操作,实际上删除了数列中的第n-1个元素,因此可见删除操作是由移动操作来完成的。9.29【分析与解答】程序要求定义两个数组以便存放原始数据和从中选出的所有奇数。若把函数命名为oods,则函数首部可写成:voidodds(int*a,intan,int*b,int*bn)形参a指向存放原始数据的数组,an存放此数组中数据的个数;b指向另一个数组,此数组中将存放将选出的所有奇数,指针bn指向存放奇数个数的存储单元,因为将通过此指针,把奇数的个数传回主函数。在odds函数中,可通过一个for循环选出所有的奇数:for(i=0;ian;iKG-*3+KG-*3+)if(ai%2)bj=ai;jKG-
48、*3+KG-*3+;在for循环中逐个引用原始的数组元素,若元素中的值不能被2除尽(不为0),则把它放入b所指的数组中;j用作b的下标,每放入一个奇数后,j的值加1;注意,j的初值应该置0。当完成以上操作退出循环时,因为在循环内最后进行了一次jKG-*3+KG-*3+的操作,所以j的值就是奇数的个数,最后应当把它赋给*bn,以便通过指针bn把奇数的个数传回主函数。程序需要两次输出数组中元素的值,一次是输出原始数组中的值,一次是输出奇数数组中的值。因此可以使用题9.28中的outarr函数,进行两次调用。在主函数中应当定义所需的数组和变量,可以在主函数中给数组元素输入数据。总结:本题的算法很简单,要求读者能够编写独立的模块,并在函数之间熟练地传送数据。9.30【分析与解答】例9.9完成了对整数由小到大的排序,而本题是对字符数组中的元素进行由大到小的排序;两者之间并无大的区别,只是数组的类型不同,字符数组中每个元素存放一个字符,字符的大小依据每个字符的ASCII码值的大小。若函数形参a指向主函数中待排序的数组,由大到小的排序只需改变内循环中if语句的条件表达式即可:if(apai)p=i;此处i是内循环的控制变量。排序前后可以调用一个输出函数,输出原始数据和排序后的数据,可参考习题9.28的outarr函数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025安徽省安全员《A证》考试题库及答案
- 九龙坡楼顶防水施工方案
- 辽宁节能环氧漆施工方案
- 2025年江苏省安全员C证考试(专职安全员)题库及答案
- 2025重庆市安全员C证考试(专职安全员)题库及答案
- 三年级口算题库大全1000道
- 产品定价合同范本
- 劳务队合同范本
- 保险公司司机合同范本
- 医疗设备开发采购合同范本
- 2.2算法的概念及其描述课件人教中图版高中信息技术必修1
- 新苏教版科学六年级下册全册教案(含反思)
- 高速公路桥头跳车判别和处治
- 勃利县大四站镇侵蚀沟治理工程施工组织设计
- 汽车电子技术专业人才培养方案样本
- 血栓风险评估及个体化干预(遗传性易栓症风险基因检测)
- 血透患者的健康宣教课件
- 医院舆情应对处置预案
- 普通高中历史课程标准(2022年版2023年修订)解读
- 《统计学原理贾俊平》课件
- 2024电力储能电站钠离子电池技术条件
评论
0/150
提交评论