资源描述
第五章习题答案一、选择填空 1、A 2、D 3、B 4、D 5、D 6、C 7、C 8、D 9、C 10、A 11、B 12、C 13、A 14、D 15、C二、判断下列描述的正确性,对者划,错者划。 1、 2、 3、 4、 5、 6、 7、 8、 9、 10、 11、 12、 13、 14、 15、 16、 17、 18、 19、 20、三、分析下列程序的输出结果。1、运行该程序输出如下结果。5811142、运行该程序输出如下结果。253、该程序输出如下结果。10+2+1=1320+2+2=2430+2+3=3540+2+4=464、运行该程序的输出结果如下所示。6,115、运行该程序输出如下结果。5!+4!+3!+2!+1!=1536、运行该程序输出如下结果。6,6,67、运行该程序输出如下结果。sum 1=13sum 2=18sum 3=238、运行该程序输出如下结果。7209、运行该程序输出如下结果:a=5,b=8a=8,b=510、运行该程序输出结果如下所示。1011、运行该程序输出结果如下所示。ff(double):88.18ff(int):9712、运行该程序输出结果如下所示。1121231234四、按下列要求编程,并上机验证。1、分析:该程序有3个函数:main(),sum()和average()。主函数main()中包含有如下操作:输入15个浮点数放在一个数组中,使用循环语句从键盘上输入值,接着分别调用sum()函数求15个浮点数之和,调用average()函数求15个浮点数的平均值,最后将15个浮点数的和值与平均值输出显示。程序如下:#include double s, sum(double b,int n),average(int n);void main( )double a15;cout”Input 15 doubles:”;for(int i=0;iai;s=sum(a,15);double ave=average(15);cout”SUM=”s,”AVERAGE=”aveendl;double sum(double b,int n)double sum=0;for(int i=0;i15;i+)sum+=bi;return sum;double average(int n)return s/n; 2、分析:先将10个int型数从键盘上输入,并放在一个int型数组中。接着,在数组中将重复的数组元素去掉。其方法是在比较中发现有重复的就用数组中最末元素替换,同时更新数组元素个数。最后,将数组中的元素使用排序函数sort()进行排序,并输出显示最后排好序的数组元素。排序函数sort()是按照“冒泡”排序的算法进行编程的。程序的内容如下所示。#include void main()int a10,n=10;void sort(int b ,int n);cout”Input 10integer:”;for(int i=0;iai;for(i=0;in;i+)for(int j=i+1;jn;j+)if(ai=aj)aj=a- -n;j-;sort(a,n);for(i=0;in;i+)coutai”;cout”n”;void sort(int b ,int n)for(int i=1;in;i+) for(int j=0;jn-i;j+)if(bjbj+1)int t=bj;bj=bj+1;bj+1=t;3、分析:该程序将包含一个主函数和两个被调函数:一个是计算某一年是否是闰年的函数leap(),另一个是计算日期的函数sum_day()。主函数中,先从键盘上输入某天的年、月、日,存放在相应的变量year,month和day中。接着,调用sum_day()函数,计算出这一天是该年的第几天,计算时按非闰年计算,即2月份28天。然后,再判断该年是否是闰年,并且该月是否是大于2月。如果是闰年,且月份又大于2月,则计算的天数加1。最后将其结果输出显示。计算闰年的函数 leap()是按照闰年的定义,使用逻辑表达式返回。闰年时返回1,否则返回0。指定的每月的总天数的数组进行相加计算,这时2月份按28天计算,将每月天数存放在一个数组中,使该数组的下标与月份数相同。例如,5月4日,计算天数时如下所示。days_month1+days_month2+days_month3+days_month4+4;并将这个表式值返回。程序内容如下所示。#include int sum_day(int,int),leap(int);void main()int year,month,day;coutyearmonthday;int days=sum_day(month,day);if(leap(year)&month2)days+;cout是这一年的第days天n;int sum_day(int month,int day) static int days_month13=0,31,28,31,30,31,30,31,31,30,31,30,31;for(int i=1;imonth;i+)day+=days_monthi;return day;int leap(int year)int leap=year%4=0&year%100!=0|year%400=0;return leap;当输入为1998年4月7日时,输出信息如下所示。请输入一个日期(yyyy mm dd):1998 4 7是这一年的第97天。4、#include #include void fun(char);void main( )char s80;couts;cout”反序前:”sendl;fun(s);cout”反序后:”sendl;void fun(char ss)int n=strlen(ss);for(int i=0;in/2;i+)char c=ssi;ssi=ssn-1-i;ssn-1-i=c;该程序输出如下信息。请输入一个字符串:abcdefgh输出结果如下所示。反序前:abcdefgh反序后:hgfedcba5、分析:由于十六制数的表示中,除了有数字09,还有6个字母a,b,c,d,e,f.因此输入十六进制数时,应采用char型,将它存放在一个字符数组中。然后,调用一个转换函数htoi(),将输入的字符型数组中的十六进制数转换为十进制的。在转换函数中,应考虑到下述3类不同字符的转换方法:(1)数字字符0至9;(2)小写字母a至f;(3)大写字母A至F。程序内容如下所示。#include int htoi(char);void main( ) int htoi(chars ); cout”输入一个十六进制数:”;char s120=” ”;cin.read(s1,20);coutendl;int n=htoi(s1);cout”该数转换为十进制数”n=0&si=a&si=A&si=F) n=n*16+si-A+10;return n; 6、#include char *fun1(int);int fun2( );char s10;void main( )int number;coutnumber;cout”整型数加空格后为:”fun1(number)endl;cout”加空格后字符串长度为:”fun2()endl;char *fun1(int n)int a5;a4=n%10;a3=n/10%10;a2=n/100%10;a1=n/1000%10;a0=n/10000;for(int i=0,j=0;i5;i+,j+=2)sj=char(ai+0);sj+1= ;sj-1=0;return s;int fun2() int n=0,i=0; while(si+) n+; return n;运行该程序显示如下信息:输入一个5位的整型数:87654输出结果如下所示:整型数加空格后为:8 7 6 5 4加空格后字符串长度为:97、分析:首先定义一个char型数组name5 10用来存放5个学生的姓名,再定义一个int型数组score5 4来存放5个学生的4门功课成绩,再定义一个数组al5用来存放用来存放每个学生的总成绩。该程序将有4个函数组成。(1)主函数main(),包括所有定义的数组,并赋初值。先调用求每个学生4门功课的总分的函数all_scor(),通过for循环将每个学生功课总分显示在屏幕上,同时存放在数组al5中。再调用求每个学生4门功课平均成绩的函数aver_scor通过for街环将每个学生功课的平均成绩输出显示在屏幕上。最后,用计算5个学生中总分最高的函数high_scor(),通过返回最高分,并通过传址调用获得最高分学生下标序号,用来输出该学生的姓名。(2)算学生的总分函数all_scor( ),该函数有一个参数,它是一族数组,返回值为int型变量,即返回该学生4门功课的总分。(3)算学生平均分函数aver_scor(),该函数有一个数组参数,返回值为double型量。该函数调用了all_scor函数。(4)求出最高总分及该总分对应的下标值函数high_scor()。该函数有两个参数:一个是数组,另一个是int*型指针。该函数返回值为int型量。程序内容如下所示。#include int all_scor(int a),high_scor(int a,int *i);double aver_scor(int sc);void main( )char name 10=“Ma”,”Wang”,”Li”,”Huang”,”Kang”;int score4=89,86,75,90,91,82,75,80,78,93,85,80,90,79,95,85,68,75,81,83;int a15;cout”每个学生功课的总分:”;for(int i=0;i5;i+)cout(a1i=all_scor(scorei)” ”;cout” 每个学生功课的平均成绩:”;for(i=0;i5;i+)cout aver_scor(scorei);int n=0,high;high=high_scor(a1,&n);cout”n学生姓名:”namen”t最高分” highendl;double aver_scor(int sc)return (double)all_scor(sc)/4;int all_scor(int a)int s=0;for(int j=0;j4;j+)s+=aj;return s;int high_scor(int a,int *i)for(int j=1;j5;j+)if(a01)。然后,调用转换函数convert()将n位整数转换成字符串,其长度为n。转换函数convert()定义为递归函数。递归条件如下所示。if(a=n/10)!=0)convert(a);其中,是一个待处理的为整数,是一个型变量。当是1位整数时,体将不被执行。当为2位整数时,执行体,这时为1位整数。依次类推。程序内容如下所示。#include void main()int num;void convert(int);coutnum;cout”输出的字符串是:”;convert(num);cout n;void convert(int n) int a;if(a=n/10)!=0)convert(a);char c=n%10+0;coutc;执行该程序显示如下信息。输入一个整数:1357输出的字符串是:13579、double distance(int xl,int yl,int x2,int y2)double s;s=sprt(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);return s;double distance(double xl,double yl,double y2) double s;s=sprt(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);return s; 这里,前一个distance()函数是用来计算两个 int型数的点间距离,而后一个distance()函数是用来计算两个double型数的点间距离。计算两个点间距离公式如下所示。s=sqrt(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)程序内容如下所示。#include #include void main( )double distance(int ,int,int,int),distance(double, double, double, double);int x1=5,y1=8,x2=12,y2=15;double xd1=1.5,yd1=5.2,xd2=3.7,yd2=4.6;cout”两个int型数的点间距离:”;double disi=distance(x1,y1,x2,y2);coutdisiendl;cout”两个 double型数的点间距离:”;double disd=distance(xd1,yd1,xd2,yd2);coutdisdendl;double distance(int a1,int b1,int a2,int b2 )double s=sqrt(a1-a2)*(a1-a2)+(b1-b2)*(b1-b2);return s;double distance(double a1, double b1,double a2, double b2)return sqrt(a1-a2)*(a1-a2)+(b1-b2)*(b1-b2);10、该程序中三次使用字符串处理函数strcat()将4个已知的字符串连接成一个新的字符串。程序内容如下所示。#include #include char s 5=“abcd”,”efgh”,”ijkl”,”mnop”;void main( )strcat(s0,s1);strcat(s0,s2);strcat(s0,s3);couts0endl;11、分析:该程序将分3个函数来完成此功能。一个主函数用输出显示n=1,2,3时,上述表达式的值。主函数的调用函数fun()用来求得各项之和,该函数又调用另一个求立方的函数power()。程序内容如下所示。#include int fun(int n=2);int power(int ,int)void main() coutfun(1)endl; coutfun(2)endl; coutfun(3)endl;int fun(int n) int sum=0; for(int i=1;i=10;i+)sum+=power(i,n); return sum;int power(int n1,int n2) int p=1; for(int i=1;i=6),将它表示为i与j之和。n=i+j;当i和j都为素数时则为所求。程序内容如下所示。#include int prime(int);void main( )int prime(int);int n;coutn;int i,j;cout”两个素数之和的全部可能n ”;for(i=2;in;i+)j=n-i;if(prime(i)&prime(j)cout”N=”i+jendl;int prime(int n)int j=2;while(n%j!=0)j+;if(n=j)return 1;elsereturn 0;运行该程序输出下列信息。 输入一个大于等于6的偶数:126输出结果如下所示。两个素数之和的所有可能:N=13+133N=17+109N=19+107N=23+103N=29+97N=37+89N=43+83N=47+79N=53+73N=59+613、#include char_count(char *s,char letter)int count=0;while(*s)if(*s+=letter)count+;return (count); void main()char str100,c;coutstr;coutc;coutthe count is:char_count(str,c) “次”endl;14、#include int pattern_index(char substr,char str) int i,j,k; for(i=0;stri;i+)for(j=i,k=0;(strj=substrk)|(substrk=?);j+,k+) if(!substrk+1) return(i); return(0);void main() char *substring,*string; int same; substring=?gram; string=this program return index of substring; same=pattern_index(substring ,string); if (same) cout子串起始位置:sameendl; else cout匹配不成功endl;
展开阅读全文