您的当前位置:首页正文

C++04737 第3章 课后练习题 完整答案

2020-11-17 来源:星星旅游
第三章

一、单项选择题

1. 声明abc的函数原型,该函数返回double型数据,需要传递一个double型和一个char型参数的。 2.inline

3.对象、对象指针、引用

4.函数func返回字符型引用,并且需要传递一个char型和一个int型参数。 5.int *fun(char,int&);

二、单项选择题

1.A;使用了const限制改变。

2.C;函数重载的参数个数和数据类型可相同也可以不相同,返回值也可相同可不相同。只是函数重载的依据是参数个数和数据类型的不同。 3.C;参考课本P61,当形参有两个时,使用C的格式。

三、改错题

1.下面程序错在何处? template T fun(T x) {

T y;

y = x*x - T; // 错误,T是类型,不是变量,不能参加运算; return y; }

2.找出下面程序中的错误之并改正之。

#include //C++标准中没有iostream.h头文件 template

Type max(T x, y) // x的类型和template中的不一样,并且y没有类型。 {

return (x>y) ? (x) : (y); }

修改如下:

#include template Type max(Type x, Type y) { return (x>y) ? (x) : (y); }

3. 找出下面程序中的错误之并改正之。

函数change 的参数定义成了常量,只能使用参数,而无权修改他。 #include #include using namespace std;

void change(const string& s)

//函数change 的参数定义成了常量,只能使用参数,而无权修改他。 { s = s + \"pig!\"; }

void main() { string str(\"it is a \"); change(str); cout << str << endl; }

修改如下:

#include #include using namespace std; void change(string& s)

//函数change 的参数定义成了常量,只能使用参数,而无权修改他。 { s = s + \"pig!\"; }

void main() { string str(\"it is a \"); change(str); cout << str << endl; }

四、编程题

1.编写一个求方程ax2 + bx + c = 0的根 的程序,用3个函数分别求当b2-4ac大于零、等于零、和小于零时的方程的根。要求从主函数输入a,b,c的值并输出结果。

#include #include //使用数学求根函数sqrt(),需要包含头文件cmath

using namespace std;

void equation_1 (int a, int b, int c) { double x1, x2, temp; temp = b*b - 4 * a * c; x1 = (-b + sqrt(temp) ) / (2 * a * 1.0); //分母乘以1.0是为了保证分母的结果位double型 x2 = (-b - sqrt(temp) ) / (2 * a * 1.0); cout<<\"两个不相等的实根\"<< endl; cout<<\"x1 = \"<< x1<<\}

void equation_2 (int a, int b, int c) { double x1, x2, temp; temp = b*b - 4 * a * c; x1 = (-b + sqrt(temp) ) / (2 * a * 1.0); x2 = x1; cout<<\"两个相等的实根\"<< endl; cout<<\"x1 = \"<< x1<<\ }

void equation_3 (int a, int b, int c) { double temp, real1, real2, image1, image2; temp = - (b*b - 4 * a * c); real1 = -b / (2 * a *1.0); real2 = real1; image1 = sqrt(temp); image2 = - image1; cout<<\"两个虚根\"<< endl; cout<<\"x1 = \"<< real1<<\" + \"<< image1<<\"j\"<< endl; cout<<\"x2 = \"<< real2<<\" - \"<< -image2<<\"j\"<< endl; //加了两个减号,显示更清晰 }

void main() { int a, b, c; double temp; cout<<\"输入a,b,c的值\"<< endl; //从主函数输入a、b、c cin>>a>>b>>c; cout<<\"方程为:\"<< a<<\"x*x+\"<< b<<\"x+\"<< c<<\" = 0\"<< endl; temp = b*b - 4 * a * c; if(temp > 0) //使用if选择语句进行判断选择

equation_1 (a, b, c); if(temp == 0) equation_2 (a, b, c); if(temp < 0) equation_3 (a, b, c); }

运行结果:

2.定义函数up(ch),如字符变量ch是小写字母就转换成大写字母并通过up返回,否则字符ch不改变。要求在短小而完全的程序中显示这个程序是怎样被调用的。

#include < iostream > #include < string > using namespace std; char up (char c) { return (c >= 97 && c <= 122) ? (c - 32) : c;

//小写字母的ASCII码从97-122,大写从65-90,小写转大写码值减32 }

void main() { int i=0; string str = \"Welcome\"; while(str[i] != '\\0') //字符串未到末尾则调用up函数 cout<< up(str[i++]); cout<< endl; }

运行结果:

3.编写主程序条用带实数r和整数n两个参数的函数并输出r的n次幂。 #include < iostream > using namespace std;

double power(double r, int n) {

int i;

double result = 1.0; for(i=0; iresult = result * r; //计算r的n次幂 return result; }

void main() {

double r; int n;

cout<<\"r = \"; cin>>r;

cout<<\"n = \"; cin>>n;

cout<< r<<\"的\"<< n<<\"次幂是:\"<< power(r,n)<< endl; //调用函数 }

运行结果:

4.编写有字符型参数C和整形参数N的函数,让他们显示出由字符C组成的三角形。其方式为第1行有1个字符C,第2行有2个字符C ,等等。 #include < iostream > using namespace std;

void print_triangle(char c, int n) {

int i, j;

for(i=0; i< n; i++) //使用双重for循环输出三角形 {

for(j=0; j<=i; j++) {

cout<< c; }

cout<< endl; } }

void main() {

char C; int N;

cout << \"请输入一个字符:\"; cin >> C;

cout << \"请输入行数:\"; cin >> N;

print_triangle(C,N); //调用打印三角形函数 }

运行结果:

5.编写一个ieqiu字符串长度的函数,strlen(),再用strlen()函数编写一个函数revers(s)的倒序递归程序,使字符串s逆序。 #include < iostream > #include < string > using namespace std;

int strlen(string str) //传递对象参数,求字符串长度 { int len = 0; while(str[len] != '\\0') { len++; } return len; }

void revers(string& str1) //传递引用参数,将字符串倒序 { char c; int j, len;

len=strlen(str1); j=len/2-1; while(j>=0) { c = str1[j];

str1[j] = str1[len-j-1]; str1[len-j-1] = c; j--; } str1[len]='\\0'; }

void main()

{ string str = \"Welcome\"; cout<< str <<\"----的长度:\"<< strlen(str)<< endl; cout<< \"倒序前字符串:\" << str << endl; //倒序前 revers(str);// cout<< \"倒序前字符串:\" << str<< endl; //倒序后 }

运行结果:

6.用函数模板实现3个数值中按最小值到最大值排序的程序。 #include using namespace std; template void sort(T a, T b, T c) { T temp; if(a>b) { temp = a; a = b; b = temp; } if(a>c) { temp = a; a = c; c = temp; } if(b>c) { temp = b; b = c; c = temp; } cout << \"由小到大排序是:\" << a << \" \" << b << \" \" << c << endl; }

void main() { int a, b, c;

double e, f, g; cout << \"请输入三个整数:\"; cin >> a >> b >> c; sort(a,b,c); cout << \"请输入三个浮点数:\"; cin >> e >> f >> g; sort(e,f,g); }

运行结果:

7.利用函数模板设计一个求数组元素总和的函数,并检验之。 #include < iostream > using namespace std;

template //定义求和函数模板 T sum(T b[], int n) {

T s = 0;

for(int i=0; ivoid main() {

int a[5]={5,8,1,3,4};

int s = sum(a,5); //调用求和函数 cout << \"数组的和为:\" << s <运行结果:

8.重载上题中的函数模板,使他能够进行两个数组的求和。 #include < iostream > using namespace std;

template //定义一个数组求和函数模板sum T sum(T a[], int n) {

T s = 0; for(int i=0; itemplate //定义两个求和函数模板sum T sum(T a1[], int n1, T a2[], int n2) { T s = 0; s = sum(a1,n1) + sum(a2,n2); //重载第一个sum return s; }

void main() { int a1[5]={5,8,1,3,4}; int a2[8]={1,2,3,4,5,2,3,6}; int s1 = sum(a1,5); //自动重载第一个sum函数 int s2 = sum(a2,8); //自动重载第一个sum函数 int s3 = sum(a1,5,a2,8); //自动重载第二个sum函数 cout << \"数组a1的和为:\" << s1 <运行结果:

因篇幅问题不能全部显示,请点此查看更多更全内容