资源描述
第五章习题答案
一、 选择填空
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、 运行该程序输出如下结果。
5
8
11
14
2、 运行该程序输出如下结果。
25
3、 该程序输出如下结果。
10+2+1=13
20+2+2=24
30+2+3=35
40+2+4=46
4、 运行该程序的输出结果如下所示。
6, 11
5、 运行该程序输出如下结果。
5! +4! +3! +2! +1! =153
6、 运行该程序输出如下结果。
6,6,6
7、 运行该程序输出如下结果。
sum 1=13
sum 2=18
sum 3=23
8、 运行该程序输出如下结果。
720
9、 运行该程序输出如下结果:
a=5,b=8
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>
double s, sum(double b[],int n),average(int n);
void main( )
{
double a[15];
cout<<”Input 15 doubles:”;
for(int i=0;i<15;i++)
cin>>a[i];
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+=b[i];
return sum;
}
double average(int n)
{
return s/n;
}
2、 分析: 先将10个int型数从键盘上输入, 并放在一个int型数组中。接着, 在数组中将重复的数组元素去掉。其方法是在比较中发现有重复的就用数组中最末元素替换, 同时更新数组元素个数。最后, 将数组中的元素使用排序函数sort()进行排序, 并输出显示最后排好序的数组元素。
排序函数sort()是按照”冒泡”排序的算法进行编程的。
程序的内容如下所示。
#include <iostream.h>
void main()
{
int a[10],n=10;
void sort(int b[ ],int n);
cout<<”Input 10integer:”;
for(int i=0;i<n;i++)
cin>>a[i];
for(i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
if(a[i]==a[j])
{
a[j]=a[- -n];
j--;
}
}
sort(a,n);
for(i=0;i<n;i++)
cout<<a[i]<<””;
cout<<”\n”;
}
void sort(int b[ ],int n)
{
for(int i=1;i<n;i++)
for(int j=0;j<n-i;j++)
if(b[j]<b[j+1])
{
int t=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;并将这个表式值返回。
程序内容如下所示。
#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_month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
for(int i=1;i<month;i++)
day+=days_month[i];
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 s[80];
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=ss[i];
ss[i]=ss[n-1-i];
ss[n-1-i]=c;
}
}
该程序输出如下信息。
请输入一个字符串: abcdefgh
输出结果如下所示。
反序前: abcdefgh
反序后: hgfedcba
5、 分析: 由于十六制数的表示中, 除了有数字0~9, 还有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 s1[20]=” ”;
cin.read(s1,20);
cout<<endl;
int n=htoi(s1);
cout<<”该数转换为十进制数”<<n<<endl;
}
int htoi(char s[ ])
{
int n=0;
for(int i=0;s[i]!=’\0’;i++)
{
if(s[i]>=’0’&&s[i]<=’9’)
n=n*16+s[i]-‘0’;
if(s[i]>=’a’&&s[i]<=’f’)
n=n*16+s[i]-‘a’+10;
if(s[i]>=’A’&&s[i]<=’F’)
n=n*16+s[i]-‘A’+10;
}
return n;
}
6、
#include <iostream.h>
char *fun1(int);
int fun2( );
char s[10];
void main( )
{
int number;
cout<<”输入一个5位的整型数;”;
cin>>number;
cout<<”整型数加空格后为:”<<fun1(number)<<endl;
cout<<”加空格后字符串长度为:”<<fun2()<<endl;
}
char *fun1(int n)
{
int a[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(int i=0,j=0;i<5;i++,j+=2)
{
s[j]=char(a[i]+’0’);
s[j+1]=’ ’;
}
s[j-1]=’\0’;
return s;
}
int fun2()
{
int n=0,i=0;
while(s[i++])
n++;
return n;
}
运行该程序显示如下信息:
输入一个5位的整型数: 87654
输出结果如下所示:
整型数加空格后为: 8 7 6 5 4
加空格后字符串长度为: 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型量。
程序内容如下所示。
#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 score[][4]={{89,86,75,90},{91,82,75,80},{78,93,85,80},{90,79,95,85},{68,75,81,83}};
int a1[5];
cout<<”每个学生功课的总分:”;
for(int i=0;i<5;i++)
cout<<(a1[i]=all_scor(score[i]))<<” ”;
cout<<” 每个学生功课的平均成绩:”;
for(i=0;i<5;i++)
cout<<' '<<aver_scor(score[i]);
int n=0,high;
high=high_scor(a1,&n);
cout<<”\n学生姓名:”<<name[n]<<”\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+=a[j];
return s;
}
int high_scor(int a[],int *i)
{
for(int j=1;j<5;j++)
if(a[0]<a[j])
{
a[0]=a[j];
*i=j;
}
return a[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位整数。依次类推。
程序内容如下所示。
#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
输出的字符串是: 1357
9、
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(s[0],s[1]);
strcat(s[0],s[2]);
strcat(s[0],s[3]);
cout<<s[0]<<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;
}
运行该程序输出如下结果:
10
2046
88572
12、 分析: 从键盘上入一个偶数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;
else
return 0;
}
运行该程序输出下列信息。
输入一个大于等于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、
#include <iostream.h>
char_count(char *s,char letter)
{
int count=0;
while(*s)
if(*s++==letter) count++;
return (count);
}
void main()
{
char str[100],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;str[i];i++)
for(j=i,k=0;(str[j]==substr[k])||(substr[k]=='?');j++,k++)
if(!substr[k+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;
}
展开阅读全文