2023年面向对象程序设计C山师习题答案资料.doc
第五章习题答案一、选择填空 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 <iostream.h>double s, sum(double b,int n),average(int n);void main( )double a15;cout<<”Input 15 doubles:”;for(int i=0;i<15;i+)cin>>ai;s=sum(a,15);double ave=average(15);cout<<”SUM=”<<s<<,<<”AVERAGE=”<<ave<<endl;double sum(double b,int n)double sum=0;for(int i=0;i<15;i+)sum+=bi;return sum;double average(int n)return s/n; 2、分析:先将10个int型数从键盘上输入,并放在一个int型数组中。接着,在数组中将反复的数组元素去掉。其方法是在比较中发现有反复的就用数组中最末元素替换,同时更新数组元素个数。最后,将数组中的元素使用排序函数sort()进行排序,并输出显示最后排好序的数组元素。排序函数sort()是按照“冒泡”排序的算法进行编程的。程序的内容如下所示。#include <iostream.h>void main()int a10,n=10;void sort(int b ,int n);cout<<”Input 10integer:”;for(int i=0;i<n;i+)cin>>ai;for(i=0;i<n;i+)for(int j=i+1;j<n;j+)if(ai=aj)aj=a- -n;j-;sort(a,n);for(i=0;i<n;i+)cout<<ai<<”;cout<<”n”;void sort(int b ,int n)for(int i=1;i<n;i+) for(int j=0;j<n-i;j+)if(bj<bj+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 <iostream.h>int sum_day(int,int),leap(int);void main()int year,month,day;cout<<"请输入一个日期(yy mm dd):"cin>>year>>month>>day;int days=sum_day(month,day);if(leap(year)&&month>2)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;i<month;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 <iostream.h>#include <string.h>void fun(char);void main( )char s80;cout<<”请输入一个字符串:”;cin>>s;cout<<”反序前:”<<s<<endl;fun(s);cout<<”反序后:”<<s<<endl;void fun(char ss)int n=strlen(ss);for(int i=0;i<n/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 <iostream.h>int htoi(char);void main( ) int htoi(chars ); cout<<”输入一个十六进制数:”;char s120=” ”;cin.read(s1,20);cout<<endl;int n=htoi(s1);cout<<”该数转换为十进制数”<<n<<endl;int htoi(char s )int n=0; for(int i=0;si!=0;i+) if(si>=0&&si<=9) n=n*16+si-0; if(si>=a&&si<=f) n=n*16+si-a+10; if(si>=A&&si<=F) n=n*16+si-A+10;return n; 6、#include <iostream.h>char *fun1(int);int fun2( );char s10;void main( )int number;cout<<”输入一个5位的整型数;”;cin>>number;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;i<5;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 <iostream.h>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;i<5;i+)cout<<(a1i=all_scor(scorei)<<” ”;cout<<” 每个学生功课的平均成绩:”;for(i=0;i<5;i+)cout<<' '<<aver_scor(scorei);int n=0,high;high=high_scor(a1,&n);cout<<”n学生姓名:”<<namen<<”t最高分” <<high<<endl;double aver_scor(int sc)return (double)all_scor(sc)/4;int all_scor(int a)int s=0;for(int j=0;j<4;j+)s+=aj;return s;int high_scor(int a,int *i)for(int j=1;j<5;j+)if(a0<aj)a0=aj;*i=j;return a0;执行该程序后,输出结果如下所示。每个学生功的总分:340328336349307每个学生功的平均成绩:85828487.2576.75学生姓名:Huang 最高分:3498、分析:一方面从键盘上输入一个n位整数(n>1)。然后,调用转换函数convert()将n位整数转换成字符串,其长度为n。转换函数convert()定义为递归函数。递归条件如下所示。if(a=n/10)!=0)convert(a);其中,是一个待解决的为整数,是一个型变量。当是1位整数时,体将不被执行。当为2位整数时,执行体,这时为1位整数。依次类推。程序内容如下所示。#include <iostream.h>void main()int num;void convert(int);cout<<”输出一个整数:”;cin>>num;cout<<”输出的字符串是:”;convert(num);cout<< n;void convert(int n) int a;if(a=n/10)!=0)convert(a);char c=n%10+0;cout<<c;执行该程序显示如下信息。输入一个整数: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 <iostream.h>#include <math.h>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);cout<<disi<<endl;cout<<”两个 double型数的点间距离:”;double disd=distance(xd1,yd1,xd2,yd2);cout<<disd<<endl;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 <iostream.h>#include <string.h>char s 5=“abcd”,”efgh”,”ijkl”,”mnop”;void main( )strcat(s0,s1);strcat(s0,s2);strcat(s0,s3);cout<<s0<<endl;11、分析:该程序将分3个函数来完毕此功能。一个主函数用输出显示n=1,2,3时,上述表达式的值。主函数的调用函数fun()用来求得各项之和,该函数又调用另一个求立方的函数power()。程序内容如下所示。#include <iostream.h>int fun(int n=2);int power(int ,int)void main() cout<<fun(1)<<endl; cout<<fun(2)<<endl; cout<<fun(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<=n1;i+)p*=n2; return p;运营该程序输出如下结果:1020468857212、分析:从键盘上入一个偶数n(>=6),将它表达为i与j之和。n=i+j;当i和j都为素数时则为所求。程序内容如下所示。#include <iostream.h>int prime(int);void main( )int prime(int);int n;cout<<”输出一个大于等于6的偶数:”;cin>>n;int i,j;cout<<”两个素数之和的所有也许n ”;for(i=2;i<n;i+)j=n-i;if(prime(i)&&prime(j)cout<<”N=”<<i<<+<<j<<endl;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 <iostream.h>char_count(char *s,char letter)int count=0;while(*s)if(*s+=letter)count+;return (count); void main()char str100,c;cout<<"input a string:"cin>>str;cout<< "input a letter:"cin>>c;cout<<"the count is:"<<char_count(str,c)<< “次”<<endl;14、#include <iostream.h>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<<"子串起始位置:"<<same<<endl; else cout<<"匹配不成功"<<endl;