教材习题答案-第2章Word格式文档下载.doc
《教材习题答案-第2章Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《教材习题答案-第2章Word格式文档下载.doc(6页珍藏版)》请在冰豆网上搜索。
iostream>
usingnamespacestd;
intmain()
{
inta,b,r;
charc;
cin>
>
a>
b>
c;
switch(c)
{
case'
+'
:
r=a+b;
break;
case'
-'
r=a-b;
*'
r=a*b;
/'
r=a/b;
}
cout<
<
a<
c<
b<
"
="
r;
}
4.解决换钱问题:
将1元人民币兑换成1、2、5分的人民币,有多少种换法?
intcount=0,one,two,five;
for(one=0;
one<
=100;
one++)
for(two=0;
two<
two++)
for(five=0;
five<
five++)
if(one+2*two+5*five==100)
{
cout<
1分:
2分:
5分:
endl;
count++;
}
换法:
count<
5.分别用穷举法和迭代法计算两个整数的最大公约数。
inta,b,i;
b;
穷举法:
;
for(i=a;
i>
=1;
i--)
if(a%i==0&
&
b%i==0)
break;
i<
迭代法:
intr;
while(r=a%b)
a=b;
b=r;
6.输入一个整型数组,数组元素有正数有负数。
数组中连续的一个或多个整数构成一个子数组。
求所有子数组中元素和值最大的子数组。
例如:
3,2,-6,4,7,-3,5,-2和值最大的子数组为4,7,-3,5
#defineN8
inta[N]={3,2,-6,4,7,-3,5,-2},i,j;
intsum;
/*当前位置的和*/
intmax;
/*目前为止最大的子数组和*/
intleft,right;
/*子数组的位置*/
intt1;
/*子数组的临时左位置*/
/*初始化*/
sum=max=a[0];
left=right=t1=0;
for(i=1;
N;
i++)
{
sum+=a[i];
if(sum<
0)
{
sum=0;
/*如果和为负了,就应该重新计算*/
t1=i+1;
/*t1也从下一个位置开始*/
continue;
}
if(sum>
max)
{/*如果当前和比原先的最大值还大*/
max=sum;
/*最大值等于当前值*/
left=t1;
/*左右区间也要调成相应的*/
right=i;
}
for(i=left;
=right;
i++)
cout<
a[i];
return0;
7.函数重载设计不当会产生二义性问题,二义性主要体现在参数隐式类型转换和默认参数两个方面,举例说明这两方面的问题,你认为该如何解决。
重载函数定义:
intmax(inta,intb){…}
floatmax(floata,floatb){…}
调用max(1.2,3.4)
出现二义性错误,因为1.2,和3.4均为double类型,不能明确匹配哪一个函数。
因此,函数重载时尽量避免类型转换,最好定义不同函数准确匹配参数类型。
默认参数与函数重载不要同时使用。
8.在主函数中定义2个整型元素a、b,用引用作函数参数,在函数voidswap(int&
x,int&
y)中实现将数据a和b交换存放,并在主函数中输出交换后的结果。
voidswap(int&
y)
{intp;
p=x;
x=y;
y=p;
}
intmain()
inta,b;
cin>
//输入a,b两变量的值
swap(a,b);
//直接以变量a和b作为实参调用swap函数
cout<
'
'
//输出结果
return0;
9.假设一个班级有50名同学,每个同学都报出自己的生日,每个同学的生日都不相重的概率只有0.0296,如果有100个同学,不相重的概率为3.0725´
10-7。
相重复的概率如此之大与我们主观想象不同。
写一个程序,输入同学的人数n,利用统计方法计算出其生日不重复的概率。
然后再用彷真的方法,利用随机数产生每个同学的生日,计算出生日不重复的概率并与前面的结果进行比较。
学生的生日可以用随机函数rand()产生,调用rand()前首先调用srand(longint*)函数设置种子,以上函数需要包含头文件stdlib.h。
ctime>
#defineNUM50
inti,j;
doubleprobability=1;
for(i=1;
=NUM;
probability=probability*((365+1-i)/365.0);
统计方法:
probability;
//以下为仿真方法
inttotal=100000;
//采样次数
intduplicateNumber=0;
inta[366]={0};
//存放生日,放于a[1]到a[365],值为1。
inttemp;
srand(time(0));
=total;
for(j=1;
j<
i&
j++)
{
temp=rand()%365+1;
if(a[temp])
{
duplicateNumber++;
}
else
a[temp]=1;
}
=365;
a[j]=0;
仿真方法:
(double)(total-duplicateNumber)/total;
10.用new和delete运算符实现动态内存空间管理的方法编写程序。
从键盘输入3´
3整型数组的数据,计算并输出所有元素之和、最大值和最小值。
提示:
申请空间可以采用两种方法:
(1)一次申请二维数组;
(2)对二维数组一行一行申请。
#defineM3
#defineN3
inti,j;
/****二维方式***/
//int(*p)[N];
//p=newint[M][N];
/****一维方式****/
int**p=newint*[M];
for(i=0;
p[i]=newint[N];
cout<
输入:
M;
for(j=0;
cin>
p[i][j];
输出:
intsum=0,max=p[0][0],min=p[0][0];
{
sum=sum+p[i][j];
if(max<
p[i][j])max=p[i][j];
if(min>
p[i][j])min=p[i][j];
}
sum="
sum<
max="
max<
min="
min<