当前位置:文档之家› 教材习题答案-第2章

教材习题答案-第2章

1.C++中define与const定义常量有什么区别?(1) 编译器处理方式不同define宏是在预处理阶段展开。

const常量是编译运行阶段使用。

(2) 类型和安全检查不同define宏没有类型,不做任何类型检查,仅仅是展开。

const常量有具体的类型,在编译阶段会执行类型检查。

(3) 存储方式不同define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。

const常量会在内存中分配(可以是堆中也可以是栈中)。

(4)作用域define宏展开,没有作用域概念。

const常值变量具有作用域。

2.C++引入了I/O流运算符,与C语言的输入输出有什么区别?(1) I/O流运算符是运算符;C语言的输入输出是函数。

(2) I/O流运算符自动识别类型(多态、重载);C语言的输入输出格式控制非常复杂。

3.简易计算器,从键盘输入两个整数和一个字符(+、-、*、/),分别对两个数进行加、减、乘和除的运算。

如输入:23 123 +;输出计算结果:23+123=146。

要求利用IO流运算符进行输入和输出。

#include<iostream>using namespace std;int main(){int a,b,r;char c;cin>>a>>b>>c;switch(c){case '+':r=a+b;break;case '-':r=a-b;break;case '*':r=a*b;break;case '/':r=a/b;break;}cout<<a<<c<<b<<"="<<r;}4.解决换钱问题:将1元人民币兑换成1、2、5分的人民币,有多少种换法?#include<iostream>using namespace std;int main(){int count=0,one,two,five;for(one=0;one<=100;one++)for(two=0;two<=100;two++)for(five=0;five<=100;five++)if(one+2*two+5*five==100){cout<<"1分:"<<one<<" 2分:"<<two<<" 5分:"<<five<<endl;count++;}cout<<"换法:"<<count<<endl;}5.分别用穷举法和迭代法计算两个整数的最大公约数。

#include<iostream>using namespace std;int main(){int a,b,i;cin>>a>>b;cout<<"穷举法:";for(i=a;i>=1;i--)if(a%i==0 && b%i==0)break;cout<<i<<endl;cout<<"迭代法:";int r;while(r=a%b){a=b;b=r;}cout<<b<<endl;}6.输入一个整型数组,数组元素有正数有负数。

数组中连续的一个或多个整数构成一个子数组。

求所有子数组中元素和值最大的子数组。

例如:3,2,-6,4,7,-3,5,-2 和值最大的子数组为4,7,-3,5#include<iostream>#define N 8using namespace std;int main(){int a[N]={3,2,-6,4,7,-3,5,-2},i,j;int sum;/*当前位置的和*/int max;/*目前为止最大的子数组和*/int left,right;/*子数组的位置*/int t1;/*子数组的临时左位置*//*初始化*/sum=max=a[0];left=right=t1=0;for(i=1;i<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;i<=right;i++)cout<<a[i];return 0;}7.函数重载设计不当会产生二义性问题,二义性主要体现在参数隐式类型转换和默认参数两个方面,举例说明这两方面的问题,你认为该如何解决。

重载函数定义:int max(int a,int b){…}float max(float a,float b){…}调用max(1.2, 3.4) ;出现二义性错误,因为1.2,和3.4均为double类型,不能明确匹配哪一个函数。

因此,函数重载时尽量避免类型转换,最好定义不同函数准确匹配参数类型。

默认参数与函数重载不要同时使用。

8.在主函数中定义2个整型元素a、b,用引用作函数参数,在函数void swap(int & x, int& y)中实现将数据a和b交换存放,并在主函数中输出交换后的结果。

#include<iostream>using namespace std;void swap(int & x, int & y){ int p; p=x; x=y; y=p; }int main( ){int a,b;cin>>a>>b; //输入a,b两变量的值swap(a,b); //直接以变量a和b作为实参调用swap函数cout<<a<<' '<<b; //输出结果return 0;}9.假设一个班级有50名同学,每个同学都报出自己的生日, 每个同学的生日都不相重的概率只有0.0296,如果有100个同学,不相重的概率为3.0725 10-7。

相重复的概率如此之大与我们主观想象不同。

写一个程序,输入同学的人数n,利用统计方法计算出其生日不重复的概率。

然后再用彷真的方法, 利用随机数产生每个同学的生日,计算出生日不重复的概率并与前面的结果进行比较。

学生的生日可以用随机函数rand()产生,调用rand()前首先调用srand(long int *)函数设置种子,以上函数需要包含头文件stdlib.h。

#include<iostream>#include<ctime>#define NUM 50using namespace std;int main(){int i,j;double probability=1;for(i=1;i<=NUM;i++)probability=probability*((365+1-i)/365.0);cout<<"统计方法:"<<probability;//以下为仿真方法int total=100000; //采样次数int duplicateNumber=0;int a[366]={0}; //存放生日,放于a[1]到a[365],值为1。

int temp;srand(time(0));for(i=1;i<=total;i++){for(j=1;j<i&&j<=NUM;j++){temp=rand()%365+1;if(a[temp]){duplicateNumber++;break;}elsea[temp]=1;}for(j=1;j<=365;j++)a[j]=0;}cout<<"仿真方法:"<<(double)(total-duplicateNumber)/total;}10.用new和delete运算符实现动态内存空间管理的方法编写程序。

从键盘输入3 3整型数组的数据,计算并输出所有元素之和、最大值和最小值。

提示:申请空间可以采用两种方法:(1)一次申请二维数组;(2)对二维数组一行一行申请。

#include<iostream>#define M 3#define N 3using namespace std;int main(){int i,j;/****二维方式***///int (*p)[N];//p=new int[M][N];/****一维方式****/int ** p=new int*[M];for(i=0;i<N;i++)p[i]=new int[N];cout<<"输入:"<<endl;for(i=0;i<M;i++)for(j=0;j<N;j++)cin>>p[i][j];cout<<"输出:"<<endl;int sum=0,max=p[0][0],min=p[0][0];for(i=0;i<M;i++)for(j=0;j<N;j++){sum=sum+p[i][j];if(max<p[i][j]) max=p[i][j];if(min>p[i][j]) min=p[i][j];}cout<<"sum="<<sum<<endl;cout<<"max="<<max<<endl;cout<<"min="<<min<<endl;return 0;}。

相关主题