面向对象程序设计C++山师第五章习题答案Word下载.docx
《面向对象程序设计C++山师第五章习题答案Word下载.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计C++山师第五章习题答案Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
a=8,b=5
10、运行该程序输出结果如下所示。
10
11、运行该程序输出结果如下所示。
ff(double):
88.18
ff(int):
97
12、运行该程序输出结果如下所示。
1
12
123
1234
四、按下列要求编程,并上机验证。
1、分析:
该程序有3个函数:
main(),sum()和average()。
主函数main()中包含有如下操作:
输入15个浮点数放在一个数组中,使用循环语句从键盘上输入值,接着分别调用sum()函数求15个浮点数之和,调用average()函数求15个浮点数的平均值,最后将15个浮点数的和值与平均值输出显示。
程序如下:
#include<
iostream.h>
doubles,sum(doubleb[],intn),average(intn);
voidmain()
{
doublea[15];
cout<
<
”Input15doubles:
”;
for(inti=0;
i<
15;
i++)
cin>
>
a[i];
s=sum(a,15);
doubleave=average(15);
”SUM=”<
s<
’,’<
”AVERAGE=”<
ave<
endl;
}
doublesum(doubleb[],intn)
doublesum=0;
sum+=b[i];
returnsum;
doubleaverage(intn)
returns/n;
2、分析:
先将10个int型数从键盘上输入,并放在一个int型数组中。
接着,在数组中将重复的数组元素去掉。
其方法是在比较中发现有重复的就用数组中最末元素替换,同时更新数组元素个数。
最后,将数组中的元素使用排序函数sort()进行排序,并输出显示最后排好序的数组元素。
排序函数sort()是按照“冒泡”排序的算法进行编程的。
程序的内容如下所示。
voidmain()
inta[10],n=10;
voidsort(intb[],intn);
”Input10integer:
n;
for(i=0;
for(intj=i+1;
j<
j++)
if(a[i]==a[j])
a[j]=a[--n];
j--;
sort(a,n);
a[i]<
””;
”\n”;
voidsort(intb[],intn)
for(inti=1;
for(intj=0;
n-i;
if(b[j]<
b[j+1])
intt=b[j];
b[j]=b[j+1];
b[j+1]=t;
3、分析:
该程序将包含一个主函数和两个被调函数:
一个是计算某一年是否是闰年的函数leap(),另一个是计算日期的函数sum_day()。
主函数中,先从键盘上输入某天的年、月、日,存放在相应的变量year,month和day中。
接着,调用sum_day()函数,计算出这一天是该年的第几天,计算时按非闰年计算,即2月份28天。
然后,再判断该年是否是闰年,并且该月是否是大于2月。
如果是闰年,且月份又大于2月,则计算的天数加1。
最后将其结果输出显示。
计算闰年的函数leap()是按照闰年的定义,使用逻辑表达式返回。
闰年时返回1,否则返回0。
指定的每月的总天数的数组进行相加计算,这时2月份按28天计算,将每月天数存放在一个数组中,使该数组的下标与月份数相同。
例如,5月4日,计算天数时如下所示。
days_month[1]+days_month[2]+days_month[3]+days_month[4]+4;
并将这个表式值返回。
程序内容如下所示。
intsum_day(int,int),leap(int);
intyear,month,day;
"
请输入一个日期(yymmdd):
;
year>
month>
day;
intdays=sum_day(month,day);
if(leap(year)&
&
2)
days++;
是这一年的第"
days<
天\n"
intsum_day(intmonth,intday)
{staticintdays_month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
month;
day+=days_month[i];
returnday;
intleap(intyear)
intleap=year%4==0&
year%100!
=0||year%400==0;
returnleap;
当输入为1998年4月7日时,输出信息如下所示。
请输入一个日期(yyyymmdd):
199847
是这一年的第97天。
4、
string.h>
voidfun(char[]);
chars[80];
”请输入一个字符串:
s;
”反序前:
”<
fun(s);
”反序后:
voidfun(charss[])
intn=strlen(ss);
n/2;
charc=ss[i];
ss[i]=ss[n-1-i];
ss[n-1-i]=c;
该程序输出如下信息。
请输入一个字符串:
abcdefgh
输出结果如下所示。
反序前:
反序后:
hgfedcba
5、分析:
由于十六制数的表示中,除了有数字0~9,还有6个字母a,b,c,d,e,f.因此输入十六进制数时,应采用char型,将它存放在一个字符数组中。
然后,调用一个转换函数htoi(),将输入的字符型数组中的十六进制数转换为十进制的。
在转换函数中,应考虑到下述3类不同字符的转换方法:
(1)数字字符‘0’至‘9’;
(2)小写字母‘a’至‘f’;
(3)大写字母‘A’至‘F’。
inthtoi(char);
{
inthtoi(chars[]);
”输入一个十六进制数:
chars1[20]=””;
cin.read(s1,20);
intn=htoi(s1);
”该数转换为十进制数”<
n<
inthtoi(chars[])
intn=0;
s[i]!
=’\0’;
if(s[i]>
=’0’&
s[i]<
=’9’)
n=n*16+s[i]-‘0’;
=’a’&
=’f’)
n=n*16+s[i]-‘a’+10;
=’A’&
=’F’)
n=n*16+s[i]-‘A’+10;
returnn;
}
6、
char*fun1(int);
intfun2();
chars[10];
intnumber;
”输入一个5位的整型数;
number;
”整型数加空格后为:
fun1(number)<
”加空格后字符串长度为:
fun2()<
char*fun1(intn)
inta[5];
a[4]=n%10;
a[3]=n/10%10;
a[2]=n/100%10;
a[1]=n/1000%10;
a[0]=n/10000;
for(inti=0,j=0;
5;
i++,j+=2)
s[j]=char(a[i]+’0’);
s[j+1]=’’;
s[j-1]=’\0’;
returns;
intfun2()
intn=0,i=0;
while(s[i++])
n++;
returnn;
运行该程序显示如下信息:
输入一个5位的整型数:
87654
输出结果如下所示:
整型数加空格后为:
87654
加空格后字符串长度为:
9
7、分析:
首先定义一个char型数组name[5][10]用来存放5个学生的姓名,再定义一个int型数组score[5][4]来存放5个学生的4门功课成绩,再定义一个数组al[5]用来存放用来存放每个学生的总成绩。
该程序将有4个函数组成。
(1)主函数main(),包括所有定义的数组,并赋初值。
先调用求每个学生4门功课的总分的函数all_scor(),通过for循环将每个学生功课总分显示在屏幕上,同时存放在数组al[5]中。
再调用求每个学生4门功课平均成绩的函数aver_scor通过for街环将每个学生功课的平均成绩输出显示在屏幕上。
最后,用计算5个学生中总分最高的函数high_scor(),通过返回最高分,并通过传址调用获得最高分学生下标序号,用来输出该学生的姓名。
(2)算学生的总分函数all_scor(),该函数有一个参数,它是一族数组,返回值为int型变量,即返回该学生4门功课的总分。
(3)算学生平均分函数aver_scor(),该函数有一个数组参数,返回值为double型量。
该函数调用了all_scor函数。
(4)求出最高总分及该总分对应的下标值函数high_scor()。
该函数有两个参数:
一个是数组,另一个是int*型指针。
该函数返回值为int型量。
程序内容如下所示。
intall_scor(inta[]),high_scor(inta[],int*i);
doubleaver_scor(intsc[]);
charname[][10]={“Ma”,”Wang”,”Li”,”Huang”,”Kang”};
intscore[][4]={{89,86,75,90},{91,82,75,80},{78,93,85,80},{90,79,95,85},{68,75,81,83}};
inta1[5];
”每个学生功课的总分:
(a1[i]=all_scor(score[i]))<
””;
”每个学生功课的平均成绩:
'
'
aver_scor(score[i]);
intn=0,high;
high=high_scor(a1,&
n);
”\n学生姓名:
name[n]<
”\t最高分”<
high<
doubleaver_scor(intsc[])
return(double)all_scor(sc)/4;
intall_scor(inta[])
ints=0;
for(intj=0;
4;
s+=a[j];
inthigh_scor(inta[],int*i)
for(intj=1;
if(a[0]<
a[j])
a[0]=a[j];
*i=j;
returna[0];
执行该程序后,输出结果如下所示。
每个学生功的总分:
340 328 336 349 307
每个学生功的平均成绩:
85 82 84 87.25 76.75
学生姓名:
Huang 最高分:
349
8、分析:
首先从键盘上输入一个n位整数(n>
1)。
然后,调用转换函数convert()将n位整数转换成字符串,其长度为n。
转换函数convert()定义为递归函数。
递归条件如下所示。
if((a=n/10)!
=0)
convert(a);
其中,是一个待处理的为整数,是一个型变量。
当是1位整数时,体将不被执行。
当为2位整数时,执行体,这时为1位整数。
依次类推。
intnum;
voidconvert(int);
”输出一个整数:
num;
”输出的字符串是:
convert(num);
’\n’;
voidconvert(intn)
inta;
charc=n%10+’0’;
c;
执行该程序显示如下信息。
输入一个整数:
1357
输出的字符串是:
9、
doubledistance(intxl,intyl,intx2,inty2)
doubles;
s=sprt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
doubledistance(doublexl,doubleyl,doubley2)
s=sprt(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
这里,前一个distance()函数是用来计算两个int型数的点间距离,而后一个distance()函数是用来计算两个double型数的点间距离。
计算两个点间距离公式如下所示。
s=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
math.h>
doubledistance(int,int,int,int),distance(double,double,double,double);
intx1=5,y1=8,x2=12,y2=15;
doublexd1=1.5,yd1=5.2,xd2=3.7,yd2=4.6;
”两个int型数的点间距离:
doubledisi=distance(x1,y1,x2,y2);
disi<
”两个double型数的点间距离:
doubledisd=distance(xd1,yd1,xd2,yd2);
disd<
doubledistance(inta1,intb1,inta2,intb2)
doubles=sqrt((a1-a2)*(a1-a2)+(b1-b2)*(b1-b2));
doubledistance(doublea1,doubleb1,doublea2,doubleb2)
returnsqrt((a1-a2)*(a1-a2)+(b1-b2)*(b1-b2));
10、该程序中三次使用字符串处理函数strcat()将4个已知的字符串连接成一个新的字符串。
chars[][5]={“abcd”,”efgh”,”ijkl”,”mnop”};
strcat(s[0],s[1]);
strcat(s[0],s[2]);
strcat(s[0],s[3]);
s[0]<
11、分析:
该程序将分3个函数来完成此功能。
一个主函数用输出显示n=1,2,3时,上述表达式的值。
主函数的调用函数fun()用来求得各项之和,该函数又调用另一个求立方的函数power()。
intfun(intn=2);
intpower(int,int)
cout<
fun
(1)<
fun
(2)<
fun(3)<
intfun(intn)
intsum=0;
for(inti=1;
=10;
sum+=power(i,n);
returnsum;
intpower(intn1,intn2)
intp=1;
=n1;
p*=n2;
returnp;
运行该程序输出如下结果:
2046
88572
12、分析:
从键盘上入一个偶数n(>
=6),将它表示为i与j之和。
n=i+j;
当i和j都为素数时则为所求。
intprime(int);
intn;
”输出一个大于等于6的偶数:
inti,j;
”两个素数之和的全部可能\n”;
for(i=2;
j=n-i;
if(prime(i)&
prime(j))
”N=”<
’+’<
intprime(intn)
intj=2;
while(n%j!
j++;
if(n==j)
return1;
else
return0;
运行该程序输出下列信息。
输入一个大于等于6的偶数:
126
两个素数之和的所有可能:
N=13+133
N=17+109
N=19+107
N=23+103
N=29+97
N=37+89
N=43+83
N=47+79
N=53+73
N=59+6
13、
char_count(char*s,charletter)
intcount=0;
while(*s)
if(*s++==letter)count++;
return(count);
charstr[100],c;
inputastring:
cin>
str;
"
inputaletter:
thecountis:
char_count(str,c)<
“次”<
14、
intpattern_index(charsubstr[],charstr[])
inti,j,k;
for(i=0;
str[i];
for(j=i,k=0;
(str[j]==substr[k])||(substr[k]=='
?
);
j++,k++)
if(!
substr[k+1])
return(i);
return(0);
char*substring,*string;
intsame;
substring="
gram"
string="
thisprogramreturnindexofsubstring"
same=pattern_index(substring,string);
if(same)
子串起始位置:
same<
else
匹配不成功"