概述
习题与解答
C++程序设计基础(第5版)(上)
习题与解答
第1章练习题
同步练习1.1
一、选择题
1.一个最简单的C++程序,可以只有一个( )。
(A)库函数 (B)自定义函数 (C)main函数 (D)空函数
2.函数名是( ),用于识别和调用函数。
(A)关键字 (B)标识符 (C)常数 (D)语句
3.用C++语言编写的源程序要成为目标程序必须要经过( )。
(A)解释 (B)汇编 (C)编辑 (D)编译
4.C++程序中的简单语句必须以( )结束。
(A)冒号 (B)分号 (C)空格 (D)花括号
5.程序中把表达式“a+0.5”写为“a*0.5”,是( )错误。
(A)编译 (B)连接 (C)运行 (D)逻辑
【解答】 C B D B D
二、程序练习
用一个简单问题,练习程序的书写格式。
(1)问题
输入一个摄氏温度值,转换输出华氏温度值。转换公式为:
式中,F是华氏温度值,C是摄氏温度值。想一想,应该如何正确把转换公式写成C++表达式。
(2)分析
首先,分析本问题需要的数据表示和数据处理。
数据: 摄氏温度C,华氏温度F。
处理: 输入C;
计算F;
输出C和F。
然后,逐步细化:① 说明变量C和F;② 显示提示输入摄氏温度值的信息;③ 从键盘输入C的值;④ 通过转换公式计算F的值;⑤ 以清晰的说明输出C和F。
(3)编写代码
简单程序语法格式:
程序与外部连接表示
主函数
程序中需要连接系统的输入/输出流类库。使用VC 2010,要用宏指令包含头文件,使用标准名空间的using语句。主函数定义包括函数头和函数体。
程序框架:
#include
using namespace std;
int main()
{
//语句序列
}
根据以上分析写出一个完整的程序,并在集成开发环境编译执行。运行结果如下:
请输入摄氏温度 C:
26.5
摄氏温度 C=26.5
华氏温度 F=79.7
【解答】
#include
using namespace std;
int main()
{
double C,F;
cout<<“请输入摄氏温度 C:n”;
cin>>C;
F=(9.0/5)*C+32;
cout<< “摄氏温度 C=” <<C<<endl;
cout<< “华氏温度 F=” <<F<<endl;
}
想一想
把程序中的语句
F=(9.0/5)*C+32;
改为
F=(9/5)*C+32;
测试一下,程序计算结果将会有什么错误?想想为什么?
同步练习1.2
1.在下列选项中,全部都是C++关键字的选项为( )。
(A)while IF Static (B)break char go
(C)sizeof case extern (D)switch float integer
2.按C++标识符的语法规定,合法的标识符是( )。
(A)_abc (B)new (C)π (D)“age”
3.在C++语句中,两个标识符之间( )不能作为C++的分隔符。
(A)数字 (B); (C): (D)+
4.可以用于命名变量的标识符是( )。
(A)3x (B)const (C)name_2 (D)a.com
5.说明变量a是整型变量的正确语句是( )。
(A)int a; (B)inta; (C)Int a; (D)INTa;
【解答】 C A A C A
同步练习1.3
一、选择题
1.下列正确的八进制整型常量表示是( )。
(A)0a0 (B)015 (C)080 (D)0x10
2.下列错误的十六进制整型常量表示是( )。
(A)0x11 (B)0xaf (C)0xg (D)0x1f
3.在下列选项中,全部都合法的浮点型数据的选项为( )。
(A)-1e3.5 15. 2e-4 (B)12.34 -1e+5 0.1E-12
(C)0.2e-2 -12345. e-5 (D)5.0e(1+4) 0.1 8e+2
4.在下列选项中,正确的字符常量为( )。
(A)“a” (B)‘name’ (C)a (D)’101’
5.下列选项中,结果等于false的是( )。
(A)1<3 (B)1=3 (C)1==3 (D)1!=3
【解答】 B C B D C
二、程序练习
sizeof运算可以求一个数据或数据类型所要求的字节数。例如:
sizeof(int) 结果为4
sizeof(3.14) 结果为8
编写程序,显示以下数据类型要求的字节数:
char short int int long int double long double
【解答】
#include
using namespace std;
int main()
{
cout<<“sizeof(char)=”<<sizeof(char)<<endl;
cout<<“sizeof(short int)=”<<sizeof(short int)<<endl;
cout<<“sizeof(int)=”<<sizeof(int)<<endl;
cout<<“sizeof(long int)=”<<sizeof(long int)<<endl;
cout<<“sizeof(double)=”<<sizeof(double)<<endl;
cout<<“sizeof(long double)=”<<sizeof(long double)<<endl;
}
同步练习1.4
一、选择题
1.在下列语句选项中,( )不能交换变量a和b的值。
(A)t=b; b=a; a=t; (B)a=a+b; b=a-b; a=a–b;
(C)t=a; a=b; b=t; (D)a=b; b=a;
2.关于下列语句,叙述错误的是( )。
int i=10, p=&i;
(A)p的值为10 (B)p指向整型变量i
(C)p表示变量i的值 (D)p的值是变量i的地址
3.有以下变量说明,下面不正确的赋值语句是( )。
int a=5, b=10, c; int p1 = &a, p2 = &b;
(A)p2 = b; (B)p1 = a;
(C)p2 = p1; (D)c = p1 (p2);
4.有以下变量说明,下面正确的语句是( )。
int a=10, b; int &pa=a, &pb=b;
(A)&pb = a; (B)pb = pa; (C)pb = &pa; (D)pb = pa;
5.执行下面语句序列后,a和b的值分别为( )。
int a=5, b=3, t;
int &ra=a;
int &rb=b;
t=ra; ra=rb; rb=t;
(A)3和3 (B)3和5 (C)5和3 (D)5和5
【解答】 D A B B B
二、程序练习
阅读以下程序,分析下面语句序列中每个字符“”和“&”的含义,并写出输出结果。
#include
using namespace std;
int main()
{ int a=10, b=20;
int *p=&a, *q=&b;
*p =p *q;
int & ra = a;
ra=a;
int *& rt = q;
rt = 30;
cout<<“a=”<<a<<"nb="<<b<<"np="<<p<<"nq="<<q
<<"nra="<<ra<<"nrt="<<*rt<<endl;
}
【解答】
int main()
{
int a=10, b=20;
int p = &a, q = &b; //为指针类型说明符,&是取址运算符
p = p q; //第1、2、4个为间址运算符,第3个是算数乘运算符
int & ra = a; //&是引用说明符
ra=a;
int & rt = q; //*指针说明符,&引用说明符
rt = 30; //间址运算符
//字符串中的是字符,其他是间址运算符
cout<<“a=”<<a<<"nb="<<b<<"np="<<p<<"nq="<<q
<<"nra="<<ra<<"nrt="<<rt<<endl;
}
程序运行结果:
同步练习1.5
一、选择题
1.假设有说明 int a=0; double x=5.16; 则在以下语句中,( )属于编译错误。
(A)x=a/x; (B)x=x/a; (C)a=a%x; (D)x=xa;
2.在下列运算符中,( )优先级最高。
(A)<= (B)= (C)+ (D)
3.在下列运算符中,( )优先级最低。
(A)! (B)&& (C)!= (D)? :
4.已知 int i=1, j=2; 则表达式 i+++j 的值为( )。
(A)1 (B)2 (C)3 (D)4
5.已知 int i=1, j=2; 则表达式 ++i+j 的值为( )。
(A)1 (B)2 (C)3 (D)4
6.在下列表达式选项中,( )是正确。
(A)++(a++) (B)a++b (C)a+++b (D)a++++b
7.已知 int i=0, j=1, k=2; 则逻辑表达式 ++i || --j && ++k 的值为( )。
(A)0 (B)1 (C)2 (D)3
8.执行下列语句后,x和y的值是( )。
int x, y;
x = y = 1; ++x || ++y;
(A)1和1 (B)1和2 (C)2和1 (D)2和2
9.设x为整型变量,不能正确表达数学关系 1<x<5 的C++逻辑表达式是( )。
(A)1< x <5 (B)x2||x3||x==4
(C)1<x && x<5 (D)!(x<=1) && !(x>=5)
10.已知 int x=5; 执行下列语句后,x的值为( )。
x += x -= x x;
(A)25 (B)40 (C)–40 (D)20
11.设 int a=1, b=2, c=3, d=4; 则以下条件表达式的值为( )。
a < b ? a : c < d ? c : d
(A)1 (B)2 (C)3 (D)4
12.以下逗号表达式的值为( )。
( x=45, x5 ), x+25
(A)25 (B)20 (C)100 (D)45
【解答】 C D D C D C B C A C A D
二、书写表达式
1.根据算术式写C++算术表达式。
(1) (2)x{x[x(ax+b)+c]+d}+e (3)ln
(4) (5)cot (6)lg(a2+ab+b2)
【解答】
- 1/(1 + 1/(1 + 1/(x + y)))
- x * ( x * ( x * ( a * x + b ) + c ) + d ) + e
- log( 1 + pow( fabs( ( a + b )/( a – b ) ),10)
- sqrt( 1 + 3.14159/2 * cos( 48 * 3.14159/180 ) )
- 1/tan( ( 1 - xx )/( 1 + xx))
或者 cos( ( 1 - xx )/( 1 + xx ) )/sin( ( 1 - xx )/( 1 + xx ) ) - log10( a * a + a * b + b * b )
2.书写描述以下条件成立的C++逻辑表达式。
(1)i被j整除 (2)n是小于k的偶数
(3)1≤x<10 (4)x、y其中有一个小于z
(5)y[–100,–10],并且y[10,100]
(6)坐标点(x, y)落在以(10, 20)为圆心,以35为半径的圆内
(7)三条边a、b和c构成三角形
(8)年份Year能被4整除,但不能被100整除,或者能被400整除
【解答】
- i%j == 0 2. (n<k)&&(n%2 == 0)
- 1<=x && x<10 4. x<z||y<z
- !( y>=-100 && y<=-10 ) && !( y>=10 && y<=100 )
- sqrt(pow((x-10),2) + pow((y-20),2))< 35
- a+b>c && b+c>a && c+a>b
- (year%4 == 0) && (year%100!=0)||(year%400==0)
三、程序练习
1.阅读下列程序,写出运行结果。
#include
using namespace std;
int main()
{ int a = 1, b = 2;
bool x, y;
cout << (a++)+(++b) << endl;
cout << a % b << endl;
x = !a>b;
y = a-- && b;
cout << x << endl;
cout << y << endl;
}
【解答】
2.阅读下列程序,写出运行结果。
#include
using namespace std;
int main()
{ int x,y,z,f;
x = y = z = 1;
f = --x || y-- && z++;
cout << "x = " << x << endl;
cout << "y = " << y << endl;
cout << "z = " << z << endl;
cout << "f = " << f << endl;
}
【解答】
3.编写一个程序。要求从键盘输入4个小于100的正整数,并打印输出它们的和、平均值、乘积、最小值和最大值。整数的平均值不一定是整数,注意程序中应做什么处理。
【解答】
#include
using namespace std;
int main()
{
int a,b,c,d ,sum ,pro,min,max;
double ave;
cout<<“Input four different integers(<100):”;
cin >>a>>b>>c>>d;
sum = a+b+c+d;
ave = sum/4.0;
pro = abc*d;
max = a>b ? ( a>c ?( a>d ? a : d)? c>d ? c : d ) ) :(b>c ?(b>d ? b : d ):(c>d ? c :d ));
min = a<b ? ( a<c ?( a<d ? a : d)? c<d ? c : d ) ) :(b<c ?(b<d ? b : d ):(c<d ? c :d ));
cout<<"Sum is "<<sum<<endl;
cout<<"Average is "<<ave<<endl;
cout<<"Product is "<<pro<<endl;
cout<<"Smallest is "<<min<<endl;
cout<<"Largest is "<<max<<endl;
system(“pause”);
}
同步练习1.6
一、选择题
1.控制台程序中需要使用cin和cout输出/输入,因此include指令包含的头文件是( )。
(A)cmanth (B)conio.h (C)iostream (D)iomanip
2.使用标准命名空间的语句是( )。
(A)using namespace std; (B)using namespace iostream;
(C)include std; (D)include iostream;
3.有语句 double x, y; 以下正确的输入语句是( )。
(A)cin<<x, y; (B)cin<<x+y; (C)cin<<x<<y<<endl; (D)cin<<x<<y;
4.有语句 int a=1, b=2; 以下正确的输出语句是( )。
(A)cout<<a=a+b<<endl; (B)cout<b?a:b<<endl;
(C)cout<<(hex)a+b; (D)cout<<&a<<endl<<a<<endl;
5.以输出宽度为8输出变量x值的语句是( )。
(A)cout<<setw(8)<<x<<endl; (B)cout<<oct<<x<<endl;
(C)cout<<setprecision(8)<<x<<endl; (D)cout<<setfill(8)<<x<<endl;
【解答】 C A D D A
二、程序练习
1.阅读程序,写运行结果。
#include
#include
using namespace std;
int main()
{ int a=123;
int &ra=a;
int *pa=&a;
cout<<setw(5)<<dec<<a<<setw(5)<<oct<<ra<<setw(5)<<hex<<*pa<<endl;
}
【解答】
2.编写一个程序,计算0~10整数的平方和立方,然后用制表符整齐格式显示数值表。
【解答】
#include
using namespace std;
int main()
{
cout<<“integer”<<’t’<<“square”<<’t’<<“cube”<<endl;
int a = 0;
cout<<a<<’t’<<aa<<’t’<<aaa<<endl;
++a;
cout<<a<<’t’<<aa<<’t’<<aaa<<endl;
++a;
cout<<a<<’t’<<aa<<’t’<<aaa<<endl;
++a;
cout<<a<<’t’<<aa<<’t’<<aaa<<endl;
++a;
cout<<a<<’t’<<aa<<’t’<<aaa<<endl;
++a;
cout<<a<<’t’<<aa<<’t’<<aaa<<endl;
++a;
cout<<a<<’t’<<aa<<’t’<<aaa<<endl;
++a;
cout<<a<<’t’<<aa<<’t’<<aaa<<endl;
++a;
cout<<a<<’t’<<aa<<’t’<<aaa<<endl;
++a;
cout<<a<<’t’<<aa<<’t’<<aaa<<endl;
++a;
cout<<a<<’t’<<aa<<’t’<<aa*a<<endl;
system(“pause”);
}
想一想
程序中的10个输出操作模式都是相同的,只是每次操作变量a的值增加了1。如何简化这种程序代码呢?
综合练习
一、思考题
1.什么叫数据类型?变量的类型定义有什么作用?
【解答】
数据“类型”是对数据的抽象。类型相同的数据有相同的表示形式、存储格式以及相关的操作。定义一个变量时,计算机根据变量的类型分配存储空间,并以该类型解释存放的数据。
2.普通数据类型变量和指针类型变量的定义、存储、使用方式上有何区别?请编写一个程序验证之。
【解答】
变量类型 定义 存储 使用方式
数据 类型 标识符 数据值 通过名访问即直接访问对变量内容操作
指针 类型 * 标识符 地址值 通过指针变量的地址值间址访问对象
验证程序:
#include
using namespace std;
int main()
{
int a,b,c;
cout<<"a,b,c= ";
cin>>a>>b>>c; //对普通数据类型变量赋值
int *pa=&a,*pb=&b,*pc=&c; //用变量地址值初始化指针变量
cout<<"a,b,c= “<<a<<”, “<<b<<”, "<<c<<endl; //名访问,输出a,b,c的值
cout<<"pa,pb,pc= “<<pa<<”, “<<pb<<”, “<<pc<<endl; //输出指针变量的地址值
//间址访问,输出pa,pb,pc指向的变量的赋值
cout<<”*pa,*pb,*pc= “<<*pa<<”, “<<*pb<<”, "<<*pc<<endl;
}
3.什么叫数据对象的引用?对象的引用和对象的指针有什么区别?请用一个验证程序说明之。
【解答】
引用是为数据对象定义别名。引用与指针有以下几点区别:
(1)引用名不是内存变量,而指针变量要开辟内存空间。
(2)引用名需要在变量定义与变量名绑定,并且不能重定义;指针变量可以在程序中赋给不同的地址值,改变指向。
(3)程序中用变量名和引用名访问对象的形式和效果一样;指针变量通过间址访问对象。
验证程序:
#include
using namespace std;
int main ()
{
int a;
cout<<“a=”;
cin>>a;
int ra=a;
int *pa=&a;
cout<<“a的值:”<<a<<endl;
cout<<“a的地址:”<<&a<<endl;
cout<<“ra的值:”<<ra<<endl;
cout<<“ra的地址:”<<&ra<<endl;
cout<<“pa所指向的变量的值:”<<pa<<endl;
cout<<“pa的地址:”<<pa<<endl;
}
4.数据对象在C++中有什么不同的访问方式?请编写一个程序验证之。
【解答】
数据对象在C++中的访问方式有:名访问,引用(别名)访问,间址访问。
验证程序:
#include
using namespace std;
int main()
{
int a;
cout<<“a=”;
cin>>a;
a=a+5; //名访问
cout<<&a<<endl; //输出变量地址
cout<<(&a)<<endl; //地址访问,输出变量值
int *pa=&a; //说明指针变量,指向变量a
cout<<pa<<endl; //间址访问,输出变量值
int &ra=a; //ra是a的引用
cout<<ra<<endl; //引用访问,输出变量a的值
}
5.为了约束对数据对象的值做只读操作,C++采用什么方式?请给出简要归纳。
【解答】
约束数据对象只读形式如下:
约束对象 说明形式
标识常量 const 类型 常量标识符=常量表达式;
指针常量 类型 * const 指针;
指向常量的指针 const 类型 * 指针; 或者 类型 const * 指针;
指向常量的指针常量 const 类型 * const 指针; 或者 类型 const * const 指针;
常引用 const 类型 & 引用名 = 对象名;
6.什么叫表达式?表达式值的类型由什么因素决定?使用不同运算符连接以下三个变量,请写出5个以上运算结果值等于true的表达式。
int a=1, b=2; double x=0.5;
【解答】
表达式是由数据和运算符,按求值规则,表达一个值的式子。
表达式值的类型的决定因素为操作数的类型。
(1)如果运算符左右操作数类型相同,运算结果也是相同类型。
(2)如果运算符左右操作数类型不同,首先把类型较低(存储要求,示数能力较低)的数据转换成类型较高的数据,然后运算。
(3)赋值表达式的类型由被赋值变量的类型决定。当把一个表达式的值赋给一个变量时,系统首先强制把运算值转换成变量的类型,然后执行写操作。
6个值等于true的表达式:
(1)b>a && a>x (2)(a+b)!=x (3)a||(b+x)
(4)a==(bx) (5)a-b<x (6)(a/x==b)
二、程序设计
1.输入平面上某点横坐标x和纵坐标y,若该点在如图1.11所示的方块区域内,则输出true;否则,输出false。
【解答】
#include
using namespace std;
int main()
{
double x,y;
bool b;
cout << “please input x, y:n”;
cin >> x >> y;
b = ( -2<=x ) && ( x<=2 ) && ( -2<=y ) && ( y<=2 );
if(b)
cout<<“true”<<endl;
else
cout <<“false”<< endl;
}
2.输入三个整数,求出其中最小数(要求使用条件表达式)。
【解答】
#include
using namespace std;
int main()
{
int a,b,c,temp,min;
cout << “please input a,b,c:”;
cin >> a >> b >> c;
temp = ( a<b ) ? a:b;
min = ( temp<c ) ? temp:c;
cout << “min=” << min << endl;
}
3.编写一个程序。要求输入一个5位正整数,然后分解出它的每位数字,并将这些数字按间隔2个空格的逆序形式打印输出。例如,用户输入42339,则程序输出如下结果:
9 3 3 2 4
【解答】
#include
using namespace std;
int main()
{
int t;
cout<<"Input one integer for 5 bit: “;
cin>>t;
cout<<t%10<<” “<<t/10%10<<” “<<t/100%10<<” “<<t/1000%10
<<” "<<t/10000<<endl;
}
第2章练习题
同步练习2.1
一、选择题
1.已知 int i=0, x=1, y=0; 在下列选项中,使i的值变成1的语句是( )。
(A)if( x&&y ) i++; (B)if( x==y ) i++;
(C)if( x||y ) i++; (D)if( !x ) i++;
2.已知 int i=0, x=1, y=0; 在下列选项中,使i的值变成1的语句是( )。
(A)if( x ) {if(y) i=1; else i=0; } (B)if( x ) {if(y) i=1; } else i=0;
(C)if( x ) i=0; else { if(y) i=1; } (D)if( x ) i=1; else {if(y) i=0; }
3.设有函数关系为y=,在下列选项中,能正确表示上述关系的是( )。
(A)y = 1;
if( x >= 0 )
if( x == 0 ) y = 0;
else y = -1; (B)y = -1;
if( x != 0 )
if( x > 0 ) y = 1;
else y = 0
(C)if( x <= 0 )
if( x < 0 ) y = -1;
else y = 0;
else y = 1; (D)y = -1;
if( x <= 0 )
if( x < 0 ) y = -1;
else y = 0;
4.设i=2,执行下列语句后i的值为( )。
switch( i )
{ case 1 : i ++;
case 2 : i --;
case 3 : ++ i; break;
case 4 : – i;
default : i ++;
}
(A)1 (B)2 (C)3 (D)4
5.执行下列语句后,输出显示为( )。
char ch=‘A’;
switch( ch )
{ case ‘A’ : ch++;
case ‘B’ : ch++;
case ‘C’ : ch++;
}
cout<<ch<<endl;
(A)A (B)B (C)C (D)D
【解答】 C D C B D
二、程序练习
1.阅读程序,写出运行结果。
#include
using namespace std;
int main()
{ int a,b,c,d,x;
a = c = 0; b = 1; d = 20;
if( a )
d = d-10;
else
if( !b )
if( !c )
x = 15;
else x = 25;
cout << d << endl;
}
【解答】
2.阅读程序,写出运行结果。
#include
using namespace std;
int main()
{ int a = 0, b = 1;
switch( a )
{ case 0:
switch( b )
{ case 0 : cout<<“a=”<<a<<" b="<<b<<endl; break;
case 1 : cout<<“a=”<<a<<" b="<<b<<endl; break;
}
case 1:
a++; b++; cout<<“a=”<<a<<" b="<<b<<endl;
}
}
【解答】
3.输入一个正整数,使用if语句,判断它的奇偶性。
【解答】
#include
using namespace std;
int main()
{
int a ;
cout << “请输入一个正整数:” ;
cin >> a ;
if ( a%2 )
cout << “这是一个奇数!” << endl;
else
cout << “这是一个偶数!” << endl ;
}
4.输入三角形的三条边,判别它们能否形成三角形,若能,则判断是等边、等腰、还是一般三角形。
【解答】
#include
using namespace std;
int main()
{
double a, b, c ;
cout << "a, b, c = " ;
cin >> a >> b >> c ;
if ( a+b > c && b+c > a && c+a > b )
{
if ( a == b && b == c )
cout << “等边三角形!” << endl;
else
if ( a == b || a == c || b == c )
cout << “等腰三角形!” << endl;
else
cout << “一般三角形!” << endl;
}
else
cout << “不能形成三角形!” << endl ;
}
5.用case语句代替if语句,修改第3题的程序,判断输入正整数的奇偶性。
【解答】
#include
using namespace std;
int main()
{
int a ;
cout << “请输入一个正整数:” ;
cin >> a ;
switch ( a%2)
{
case 1: cout << “这是一个奇数!” << endl; break;
case 0: cout << “这是一个偶数!” << endl ;
}
}
6.输入百分制成绩,并把它转换成五级分制,并显示转换结果。要求用case语句编程。转换公式为:
想一想,若用if语句进行成绩判断,本程序应该如何改写?请你试一试。
【解答】
#include
using namespace std;
int main()
{
double score; char grade;
cout << “score=”;
cin >> score;
if ( score >= 0 && score <= 100 )
{
switch ( int( score ) /10 )
{ case 10:
case 9: grade = ‘a’; break;
case 8: grade = ‘b’; break;
case 7: grade = ‘c’; break;
case 6: grade = ‘d’; break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0: grade = ‘e’; break;
}
}
else
{
cout <<“数据输入错误!”<< endl;
goto end;
}
cout << grade << endl;
end: ; //分号不能省
}
同步练习2.2
一、选择题
1.已知 int i=0,x=0; 在下面while语句执行时循环次数为( )。
while( !x && i< 3 ) { x++; i++; }
(A)4 (B)3 (C)2 (D)1
2.已知 int i=3; 在下面do-while语句执行时的循环次数为( )。
do { i–; cout<<i<<endl; }while( i!= 1);
(A)1 (B)2 (C)3 (D)无限
3.下面for语句执行时的循环次数为( )。
int i, j;
for ( i=0, j=5; i=j; )
{ cout<<i<<j<< ndl; i++; j–; }
(A)0 (B)5 (C)10 (D)无限
4.以下程序段形成死循环的是( )。
(A)int x; for( x=0; x<3; ) { x++; };
(B)int k = 0; do { ++k; } while( k>=0 );
(C)int a=5; while( a ) { a–; };
(D)int i=3; for(; i; i – );
5.执行以下程序段后,x的值是( )。
int i, j, x = 0;
for( i=0; i<=3; i++ )
{ x++;
for( j=0; j<=3; j++ )
{ if( j ) continue;
x++;
}
}
(A)8 (B)12 (C)14 (D)16
【解答】 D B B B A
二、程序练习
1.阅读程序,写出运行结果。
(1)
#include
using namespace std;
int main()
{
int i = 1;
while( i<=10 )
{ if( ++i % 3 != 1 )
continue;
else
cout << i << endl;
}
}
【解答】
(2)
#include
using namespace std;
int main()
{ int i = 0, j = 5;
do
{ i++; j–;
if ( i>3 ) break;
} while ( j>0 );
cout << “i=” << i << endl << “j=” << j << endl;
}
【解答】
(3)
#include
using namespace std;
int main()
{ int i, j;
for( i=1, j=5; i<j; i++ )
j–;
cout<<i<<’t’<<j<<endl;
}
【解答】
(4)
#include
using namespace std;
int main()
{ int i, s = 0;
for( i=0; i<5; i++ )
switch( i )
{ case 0: s += i; break;
case 1: s += i; break;
case 2: s += i; break;
default: s += 2;
}
cout<<“s=”<<s<<endl;
}
【解答】
(5)
#include
using namespace std;
int main()
{ int i, j, x = 0;
for( i=0; i<=3; i++ )
{ x++;
for( j=0; j<=3; j++ )
{ if( j % 2 )
continue;
x++;
}
x++;
}
cout << “x=” << x << endl;
}
【解答】
-
修改同步练习2.1程序练习第4题中判断三角形的程序,使其可以完成多次测试。程序要求用户应答,若输入Y或y,程序可以继续运行,若输入N或n,程序结束运行。要求分别用while语句构造循环和用do-while语句构造循环编写程序。
【解答-1】
#include
using namespace std;
int main()
{
double a, b, c ;
char answer;
while(1)
{
cout<<“测试三角形吗?”;
cin>>answer;
if(answer==‘Y’||answer==‘y’)
{
cout << "a, b, c = " ;
cin >> a >> b >> c ;
if ( a+b > c && b+c > a && c+a > b )
{
if ( a == b && b == c )
cout << “等边三角形!” << endl;
else
if ( a == b || a == c || b == c )
cout << “等腰三角形!” << endl;
else
cout << “一般三角形!” << endl;
}
else
cout << “不能形成三角形!” << endl ;
}
else
{
cout<<“测试结束!”;
return 0;
}
}
}
【解答-2】
#include
using namespace std;
int main()
{
double a, b, c ;
char answer;
do
{
cout<<“测试三角形吗?”;
cin>>answer;
if(answer==‘Y’||answer==‘y’)
{
cout << "a, b, c = " ;
cin >> a >> b >> c ;
if ( a+b > c && b+c > a && c+a > b )
{
if ( a == b && b == c )
cout << “等边三角形!” << endl;
else
if ( a == b || a == c || b == c )
cout << “等腰三角形!” << endl;
else
cout << “一般三角形!” << endl;
}
else
cout << “不能形成三角形!” << endl ;
}
else
{
cout<<“测试结束!”;
}
}while(answer==‘Y’||answer==‘y’);
} -
编写程序,计算0到10整数的平方和立方,然后用制表符整齐格式显示数值表。
【解答】
#include
using namespace std;
int main()
{
cout<<“integer”<<’t’<<“square”<<’t’<<“cube”<<endl;
int a = 0;
for( a=1; a<=10; a++)
{
cout<<a<<’t’<<aa<<’t’<<aa*a<<endl;
}
} -
编写程序,显示由符号组成的三角形图案。要求程序运行后由用户应答。输出星号三角形的程序运行效果如下:
How many lines? 5
What character? *
*
【解答】
#include
using namespace std;
int main()
{
int i, j, k, n;
char ch;
cout<<“How many lines ?t”;
cin>>n;
cout<<“What character ?t”;
cin>>ch;
for( i=1; i<=n; i++ )
{
for( k=1; k<=n-i; k++ ) cout << " ";
for( j=1; j<=2*i-1; j++ ) cout << ch ;
cout << endl;
}
}
- 编写程序,在100~200之间找出满足用3除余2,用5除余3和用7除余2的所有整数。
【解答】
#include
using namespace std;
int main()
{
int i;
for( i=100; i<=200; i++ )
{
if ( ( i % 3 == 2) && ( i % 5 == 3 ) && ( i % 7 == 2 ) )
cout << i << endl;
}
}
同步练习2.3
一、选择题
1.有“if<逻辑表达式><语句>;”,当整型变量a和b的值都不等于0时执行<语句>,则逻辑表达式是( )。
(A)a&b (B)a&&b (C)a!=b (D)a-b!=0
2.有“if<逻辑表达式><语句>;”,当整型变量a、b的值相等时执行<语句>,则逻辑表达式是( )。
(A)a=b (B)a!=b (C)a-b (D)!(a-b)
3.有语句
for( int i=1; i<=10; i++)
if(!(i%3)) cout<<i<< " ";
输出结果是( )。
(A)1 2 3 (B)1 2 4 5 (C)3 6 9 (D)4 5 6
4.有语句
int i=5, sum=0;
while(i–) { sum+=i%2; }
循环结束后,sum的值等于( )。
(A)2 (B)3 (C)4 (D)5
5.有语句
int a=5, b=1;
while(a-b) { a–; b++; }
循环体执行的次数是( )。
(A)1 (B)2 (C)3 (D)4
【解答】 B D C A B
二、程序练习
设计程序,从键盘输入一系列数据,直到按Ctrl+Z组合键结束输入,然后显示输入的非0数据的个数及这些数据之和。
【解答】
#include
using namespace std;
int main()
{
int n=0, k, sum=0;
cout<<“input data, end in Ctrl-Z:n”;
while(cin>>k)
{
if( k )
{
n++;
sum+=k;
}
}
cout<<"n = “<<n<<”nsum = "<<sum<<endl;
}
同步练习2.4
一、选择题
1.以下程序段输出结果是( )。
int i,n=0;
for(i=0; i<10; i++)
{ if( i%3 ) break;
n++;
}
cout<<n<<endl;
(A)1 (B)2 (C)3 (D)4
2.以下程序段输出结果是( )。
int i,n=0;
for(i=0; i<10; i++)
{ if( i%3 ) continue;
n++;
}
cout<<n<<endl;
(A)1 (B)2 (C)3 (D)4
3.以下程序段输出结果是( )。
int i,n=0;
for(i=0; i<10; i++)
{ if( i>2 ) goto out;
n++;
}
out: cout<<n<<endl;
(A)1 (B)2 (C)3 (D)4
【解答】 A D C
二、程序练习
编写程序,输出小于结果50000正整数的阶乘值。想一想,若用while(1) { }构造循环,循环条件是什么?有什么方法可以结束循环?
【解答】
#include
using namespace std;
void main()
{
int i=1, n=1;
cout<<“ntn!n”;
while(1)
{
n*=i;
if(n<50000)
{
cout<<i<<’t’<<n<<endl;
i++;
}
else return;
}
}
综合练习
一、思考题
1.C++语言中有什么形式的选择控制语句?归纳它们的语法形式、应用场合。根据一个实际问题使用不同的条件语句编程。
【解答】
语句 使用方式 使用场合
if语句 if(表达式)语句1;
else 语句2; 需要对给定的条件进行判断,并根据判断的结果选择不同的操作。
适用于复杂的条件表达式判断。
switch 语句 switch(表达式)
{ case 常量表达式1: 语句1;
case 常量表达式2: 语句2;
……
case 常量表达式n; 语句n;
[default : 语句n+1;]
} 根据整型表达式的不同值决定程序分支的情况。
适用于判断表达式简单,需要多个分支处理的情况。
演示程序:
程序(1)
//此程序用if输出等级对应的分数段
//A->=90, B-(90,80], C-(80,70] , D-(70,60], E-<60
#include
using namespace std;
int main()
{ char gd;
cout<<“Enter the grade:”;
cin>>gd;
//直到输入有效等级,否则程序不继续运行
while(!((gd>=‘A’ && gd<=‘E’)||(gd>=‘a’ && gd<=‘e’)))
{ cout<<“Invalid grade! Please retry:”;
cin>>gd;
}
if(gd==‘A’||gd==‘a’) cout<<"nScored 90-100!n";
else if(gd==‘B’||gd==‘b’) cout<<"nScored 80-89!n";
else if(gd==‘C’||gd==‘c’) cout<<"nScored 70-79!n";
else if(gd==‘D’||gd==‘d’) cout<<"nScored 60-69!n";
else if(gd==‘E’||gd==‘e’) cout<<"nScore under 60!n";
else cout<<“Unexpect error!n”; //防止意外错误
}
程序(2)
//此程序用switch输出等级对应的分数段
//A->=90,B-(90,80],C-(80,70] ,D-(70,60],E-<60
#include
using namespace std;
int main()
{ char gd;
cout<<“Enter the grade:”;
cin>>gd;
//直到输入有效等级,否则程序不继续运行
while(!((gd>=‘A’ && gd<=‘E’)||(gd>=‘a’ && gd<=‘e’)))
{ cout<<“Invalid grade! Please retry:”;
cin>>gd;
}
switch(gd)
{ case ‘A’:
case ‘a’: cout<<"nScored 90-100!n";break;
case ‘B’:
case ‘b’: cout<<"nScored 80-89!n";break;
case ‘C’:
case ‘c’:cout<<"nScored 70-79!n";break;
case ‘D’:
case ‘d’:cout<<"nScored 60-69!n";break;
case ‘E’:
case ‘e’:cout<<"nScore under 60!n";break;
default:cout<<“Unexpect error!n”;//防止意外错误
}
}
2.什么叫作循环控制?归纳比较C++语言中各种循环控制语句的语法、循环条件和循环结束条件的表示形式及执行流程。
【解答】
循环控制是在特定的条件下,程序重复执行一些特定动作。
语句 语法 执行流程 使用场合
while语句 while(表达式)
循环体;
循环条件:表达式值为非0(真)
循环结束条件:表达式值为0(假) 程序中常用于根据条件执行操作而不需关心循环次数的情况。
先判断形式循环,条件不成立时不进入循环体。
do-while语句 do
循环体
while(表达式);
循环条件:表达式值为非0(真)
循环结束条件:表达式值为0(假) 程序中常用于根据条件执行操作而不需关心循环次数。
后判断形式循环,至少执行1次循环体。
一般情况,while语句和do while语句可以互换使用。
for 语句 for([表达式1];[表达式2];[表达式3])
循环体;
(1)表达式1称为初始化表达式,不是循环体执行部分。
(2)表达式3称为后置表达式,作为循环体的最后一个执行表达式。
(3)循环条件:表达式2值为非0(真)
循环结束条件:表达式2值为0(假)
for语句称为步长循环语句,通常用于确定循环次数的情况。
由于语句的3个表达式均可以缺省,也可以用于条件循环,即循环次数不确定的情况。
3.根据一个实际问题,用不同的循环语句编程,分析其优缺点。
【解答】
略。
4.用if语句和goto语句组织循环,改写第3题的程序,并分析在什么情况下可以适当使用goto语句。
【解答】
在不破坏程序基本流程控制的情况下,可以适当使用goto语句实现从语句结构内部向外的必要跳转,即按特定条件结束结构语句块的执行。
程序略。
5.有以下程序,希望判断两个输入的整数是否相等。程序可以编译通过,但不能达到预期结果。请分析程序能够通过C++编译而不能得到期望结果的原因。
#include
using namespace std;
int main()
{ int a,b;
cout<<"a: "; cin>>a;
cout<<"b: "; cin>>b;
if( a=b ) cout<<a<<“等于”<<b<<endl;
else cout<<a<<“不等于”<<b<<endl;
}
【解答】
在if语句的判断表达式(a=b)中,赋值号“=”应该是逻辑等“==”。从语法上,C++的if语句把a=b这个赋值表达式视为逻辑表达式,没有编译错误。a=b的值决定于b。若b的输入值不等于0,if语句的判断表达式作为逻辑真(true),否则作为逻辑假(false)。所以,题目中输入b的值虽然不等于a,但表达式a=b为逻辑true,执行了if语句的第1个分支。
二、程序设计
1.输入三个整数,按从小到大的顺序输出它们的值。
【解答】
#include
using namespace std;
int main()
{
int a, b, c, t;
cout << “a, b, c=”;
cin >> a >> b >> c;
if(a>b) { t=a; a=b; b=t; }
if(a>c) { t=a; a=c; c=t; }
if(b>c) { t=b; b=c; c=t; }
cout<< a << ‘t’<< b << ‘t’ << c << endl;
}
2.编程模拟剪刀、石头和布游戏。游戏规则为:剪刀剪纸,石头砸剪刀,布包石头。玩游戏者从键盘输入s(表示剪刀)或r(表示石头)或p(表示布),要求两个游戏者交替输入,计算机给出输赢的信息。
【解答】
#include
using namespace std;
int main()
{
char first,second;
cout << “First input( s,r or p ):”;
cin >> first;
cout << “Second input( s,r or p ):”;
cin >> second;
switch ( first )
{
case ‘s’:
switch ( second )
{
case ‘s’: cout << “Scissor ties scissor.” << endl; goto end;
case ‘r’: cout << “Scissor is crushed by rock.” << endl; goto end;
case ‘p’: cout << “Scissor cuts paper.” << endl; goto end;
default : cout << “second input error!” << endl ; goto end;
}
case ‘r’:
switch ( second )
{
case ‘s’: cout << “Rock crushes scissor.” << endl; goto end;
case ‘r’: cout << “Rock ties rock.” << endl; goto end;
case ‘p’: cout << “Rock is wrapped by paper.” << endl; goto end;
default : cout << “second input error!” << endl; goto end;
}
case ‘p’:
switch ( second )
{
case ‘s’: cout << “Paper is cut by scissor.” << endl; goto end;
case ‘r’: cout << “Paper wraps the rock.” << endl; goto end;
case ‘p’: cout << “Paper ties paper.” << endl; goto end;
default : cout << “second input error!” << endl; goto end;
}
default : cout << “First input error!” << endl; goto end;
}
end: ;
}
3.编写一个程序,输出一张表,内容是1~256范围内每个十进制数对应的二进制数、八进制数和十六进制数形式。第1行是标题,用制表符整齐格式(根据输出情况调整)显示数值表。提示,八进制数和十六进制数可以直接输出。
decimal binary octal hexadecimal
1 1 1 1
2 10 2 2
3 11 3 3
……
【解答】
#include
#include
using namespace std;
int main()
{
int i,k,t,m;
cout<<“decimalt binarytoctalthexadecimaln”;
for(i=1; i<=256; i++)
{
cout<<dec<<i<<"t";
t=i;
m=0; //标志,判断是否输出1
for(k=256; k>=1; k/=2) //从最高位开始处理
{
if(t>=k)
{
cout<<1; //填写1
t=t-k; //等待处理的剩余数
m=1; //记录输出了最高位的1
}
else
if(m) cout<<0; //如果已经输出1,就输出有效的0
}
if(i<128) cout<<’t’; //格式调整
cout<<"t"<<oct<<i<<"t"<<hex<<i<<endl;
}
}
4.输入一个整数,输出该整数的所有素数因子。例如,输入120,输出为2、2、2、3和5。
【解答】
#include
using namespace std;
int main()
{
int m,i = 2;
cout << “please input m:”;
cin >> m;
while( i<=m )
if( m % i == 0 )
{
cout << i << “,”;
m = m / i;
}
else i++;
}
5.使用迭代公式编程求某个正整数a的平方根。
【解答】
#include
#include
using namespace std;
int main()
{
const double eps = 1e-8;
double a,x0,x;
cout << “please input a:”;
cin >> a;
x0 = a / 2;
x = ( x0 + a/x0 )/2;
while( fabs( x-x0 )>eps )
{
x0 = x; x =( x0 + a/x0 )/2;
}
cout << x << endl;
}
6.已知x=0, 10, 20, …, 180,求sinx、cosx和tanx的值。
【解答】
#include
#include
#include
using namespace std;
int main()
{
const double pi = 3.14159265;
int i;
double x,y1,y2,y3;
cout << setw(2) << “x” << setw(15) << “sin(x)” << setw(15)
<< “cos(x)” << setw(15) << “tg(x)” << endl;
for( i=0; i<=18; i++ )
{
x = i10pi/180;
y1 = sin( x );
y2 = cos(x);
y3 = y1/y2;
cout << setw(2) << i << setw(15) << y1 << setw(15)
<< y2 << setw(15) << y3 << endl;
}
}
7.求100~999之间的水仙花数。所谓水仙花数,是指一个三位数,它的每位数字的立方之和等于该数。例如,因为153=1+5+3,所以153为水仙花数。
【解答】
#include
using namespace std;
int main()
{
int i,a,b,c;
for( i=100; i<=999; i++ )
{
a = i/100;
b = ( i-a100 ) / 10;
c = i - a100 - b10;
if ( i == aaa + bbb + cc*c )
cout << i <<endl;
}
}
8.求1000以内的所有完数。所谓完数,是指一个数恰好等于它的所有因子之和。例如,因为6=1+2+3,所以6为完数。
【解答】
#include
using namespace std;
int main()
{
int i,j,s;
for( i=1; i<=1000; i++ )
{
s = 0;
for( j=1; j<i; j++ )
if ( i % j == 0 ) s = s + j;
if ( i == s ) cout << i << endl;
}
}
9.编写一个程序,它能够读入一个正方形的边长(1~20),然后打印一个由星号和空格组成的空心正方形。例如,程序读入边长是5,则输出的空心正方形为:
【解答】
#include
using namespace std;
int main()
{
int i, j, n;
cout<<"input n = “;
cin>>n;
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
if(i1||in||j1||jn)
cout<<”* “;
else cout<<” ";
cout<<endl;
}
}
10.已知XYZ+YZZ=532,其中X,Y和Z为数字,编写程序求出X、Y和Z的值。
【解答】
#include
using namespace std;
int main()
{
int x,y,z,i;
for( x=1; x<=9; x++ )
for( y=1; y<=9; y++ )
for( z=0; z<=9; z++ )
{
i = 100x + 10y + z + 100y + 10z + z;
if ( i == 532 )
cout<<“x=”<<x<<’t’<<“y=”<<y<<’t’<<“z=”<<z<<endl;
}
}
11.编写一个简单加密程序。输入一个6位整数的明码,按以下方法加密:首先,将每位数字替换成它与7相加之和再用10求模的结果;然后逆置;最后输出密码。再编写程序,把这个密码还原成明码。若输入错误,则显示错误信息后退出程序。
例如,输入原码数据n为:200911,则显示密码n1为:886779,解密后的原码n2为:200911。
注:密码n1不一定是6位整数,但明码n和n2是相等的6位整数。
【解答】
#include
using namespace std;
int main()
{
int i,n,n1=0,n2=0,t=0;
cout<<“输入一个6位整数:”;
cin>>n;
if(n>999999||n<100000)
{
cout<<“输入错误,退出程序。n”;
return 0;
}
//加密
for(i=1; i<=6; i++)
{
n1*=10;
t=n%10;
n1+=(t+7)%10;
n=(n-t)/10;
}
cout<<“加密:”<<n1<<endl;
//解密
for(i=1; i<=6; i++)
{
n2*=10;
t=n1%10;
if(t>=7)
n2+=t-7;
else
n2+=t+10-7;
n1=(n1-t)/10;
}
cout<<“解密:”<<n2<<endl;
}
第3章练习题
同步练习3.1
一、选择题
1.以下正确的函数原型为( )。
(A)fun1( int x; int y ); (B)void fun1( x, y );
(C)void fun1( int x, y ); (D)void fun1( int, int );
2. 有函数原型 int f2(int, int); 以下正确的调用语句是( )。
(A)int a=fun2(1); (B)cout<<fun2(3,4);
(C)int a=fun2(1)+fun(2); (D)cout<<fun2(3+4);
3.有函数原型 void f3(double); 以下正确的调用语句是( )。
(A)double a=fun3(0.15); (B)fun3(0.34);
(C)double a=fun3(0.1)+f3(0.2); (D)cout<<fun3(3.4);
4.以下正确的函数定义是( )。
(A)int fun4(int a, int b) { return a+b; } (B)void fun4(int a, int b) { return a+b; }
(C)int fun4(int a, int b) { fun4 = a+b; } (D)void fun4(int a, int b){ fun4 = a+b; }
5.以下正确的函数定义是( )。
(A)void fun5();{ cout<<“Call f5n”;} (B)void fun5() { return f5;}
(C)void fun5() { cout<<“Call f5n”;} (D)void fun5() { return 5;}
【解答】 D B B A C
二、程序练习
1.阅读程序,写出运行结果。
#include
using namespace std;
#include
int f( int );
int main()
{ int i;
for( i = 0; i < 3; i ++ )
cout << f( i ) << endl;
}
int f( int a )
{ int b = 0, c = 1;
b++; c++;
return int( a + pow( double(b), 2 ) + c );
}
【解答】
2.函数floor可以将一个数值近似到指定的十进制数位。以下语句:
y=floor(x10+0.5)/10;
将把x的值近似到“十分之一位”,即小数点右边的第一位。编写程序,定义4个近似值的函数如下:
(1)roundToIntnger(number) //求近似整数
(2)roundToTenths(number) //求近似到十分之一位
(3)roundToHundreths(number) //求近似到百分之一位
(4)roundToThousandths(number) //求近似到千分之一位
每当程序读入一个数据,程序应能够输出原始值,近似整数值,近似到十分之一位的值,近似到百分之一位的值,近似到千分之一位的值。(提示:floor函数包含在cmath头文件中。)
【解答】
#include
#include
using namespace std;
int roundToIntnger(double number)
{
return int(floor(number+0.5));
}
double roundToTenths(double number)
{
return floor(number10+0.5)/10;
}
double roundToHundreths(double number)
{
return floor(number100+0.5)/100;
}
double roundToThousandths(double number)
{
return floor(number1000+0.5)/1000;
}
int main()
{
double x;
cout<<"Please input a number (until Ctrl-z): “;
while(cin>>x)
{
cout<<x<<”tRound to intnger is : “<<roundToIntnger(x)<<endl
<<”tRound to tenths is : “<<roundToTenths(x)<<endl
<<”tRound to hundreths is : “<<roundToHundreths(x)<<endl
<<”tRound to thousandths is : "<<roundToThousandths(x)<<endl;
cout<<"Please input a number (until Ctrl-z): ";
}
}
3.想一想,上述程序中定义的4个函数有什么相似之处?可以通过参数识别精度要求,把它们编写成一个函数吗?
【解答】
#include
#include
using namespace std;
double round(double number, int app)
{
return floor(number*app+0.5)/app;
}
int main()
{
double x;
cout<<"Please input a number (until Ctrl-z): “;
while(cin>>x)
{
cout<<x<<”tRound to intnger is : “<<round(x,1)<<endl
<<”tRound to tenths is : “<<round(x,10)<<endl
<<”tRound to hundreths is : “<<round(x,100)<<endl
<<”tRound to thousandths is : "<<round(x,1000)<<endl;
cout<<"Please input a number (until Ctrl-z): ";
}
}
同步练习3.2
一、选择题
1.有函数原型 void fun6( int ); 在下列选项中,不正确的调用是( )。
(A)int a = 21; fun6( a ); (B)int a = 15; fun6( a3 );
(C)int b = 100; fun6( &b ); (D)fun6( 256 );
2.有函数原型 void fun7( int * ); 在下列选项中,正确的调用是( )。
(A)double x = 2.17; fun7( &x ); (B)int a = 15; fun7( a3.14 );
(C)int b = 100; fun7( &b ); (D)fun7( 256 );
3.有函数原型 void fun8( int & ); 在下列选项中,正确的调用是( )。
(A)int a = 2.17; fun8( &a ); (B)int a = 15; fun8( a*3.14 );
(C)int b = 100; fun8( b ); (D)fun8( 256 );
4.有以下声明,在下列选项中,正确的调用是( )。
void fun9( int * & ); int a, int *p = &a;
(A)fun9(&a); (B)fun9§; (C)fun9(*a); (D)fun9(*p);
5.以下正确的函数定义是( )。
(A)int * fun10(double x){ return x; } (B)int * fun10(double x){ return &x; }
(C)int * fun10(int a){ return *a; } (D)int * fun10(int a){ return &a; }
6.函数参数的默认值不允许为( )。
(A)全局常量 (B)直接常量 (C)局部变量 (D)函数调用
【解答】 C C C B D C
二、程序练习
1.阅读程序,写出运行结果。
#include
using namespace std;
void func(int a, int b, int c = 3, int d = 4 );
int main()
{ func( 10, 15, 20, 30 );
func( 10, 11, 12 );
func( 12, 12 );
}
void func( int a, int b, int c, int d )
{ cout<<a<<’t’<<b<<’t’<<c<<’t’<<d<< endl; }
【解答】
2.阅读程序,写出运行结果。
#include
using namespace std;
void func( int, int, int * );
int main()
{ int x, y, z;
func( 5, 6, &x );
func( 7, x, &y );
func( x, y, &z );
cout << x << “,” << y << ", "<< z << endl;
}
void func( int a, int b, int *c )
{ b += a; *c = b - a; }
【解答】
3.阅读程序,写出运行结果。
#include
using namespace std;
void func( int, int, int & );
int main()
{ int x=0, y=1, z=2;
func( 1, 2, x );
func( x + y, y, y );
func( z, x + y, z );
cout << x << ", " << y << ", "<< z << endl;
}
void func( int a, int b, int &c )
{ b += a; c = b - a; }
【解答】
4.阅读程序,写出运行结果。
#include
using namespace std;
void func( int *, int *, int *& );
int main()
{ int a=10, b=20;
int *p=&a, *q=&b;
func( p, q, p );
cout << “*p=” << *p << “, *q=” << *q << endl;
}
void func( int *t1, int *t2, int *& rt )
{ *t1 += 5; *t2 += 5;
rt = t1;
*rt += 5;
cout << “*t1=” << *t1 << “, *t2=” << *t2<< “, *rt=” << *rt << endl;
}
【解答】
5.编写一个程序,测试三个函数,它们都能够把main函数中的变量count的值增至原来的三倍。这三个函数说明如下:
(a)tripleByValue函数通过值传递count的一份副本,把值增至原来的三倍并返回这一结果。
(b)tripleByReference函数通过引用参数传递count,用别名(即引用参数)把count原来的值增至三倍。
(c)tripleByPointer函数通过指针参数传递count的地址,用间址方式把count原来的值增至三倍。
【解答】
#include
using namespace std;
double tripleByValue(double x)
{ return x3; }
void tripleByReference(double &x)
{ x = x3; }
void tripleByPointer( double *x)
{ *x = *x * 3; }
int main()
{
double count;
cout<<"1, Please input count: ";
cin>>count;
cout<<"tripleByValue: "<<tripleByValue(count)<<endl;
cout<<"2, Please input count: ";
cin>>count;
tripleByReference(count);
cout<<"tripleByReference: "<<count<<endl;
cout<<"3, Please input count: ";
cin>>count;
tripleByPointer(&count);
cout<<"tripleByPointer: "<<count<<endl;
}
同步练习3.3
一、选择题
1.在C++中,一个项目可以包含多个函数,它们之间是( )。
(A)独立定义的 (B)嵌套定义的
(C)根据调用关系定义的 (D)根据调用顺序定义的
2.一个项目中只能有一个的函数是( )。
(A)系统库函数 (B)自定义函数
(C)主函数 (D)在其他文件中定义的函数
3.一个项目中包含三个函数:main、fa和fb函数,它们之间不正确的调用是( )。
(A)在main函数中调用fb函数 (B)在fa函数中调用fb函数
(C)在fa函数中调用fa函数 (D)在fb函数中调用main函数
4.实现函数调用需要( )进行信息管理。
(A)队列 (B)堆栈 (C)数组 (D)参数
5.关于递归调用不正确的描述是( )。
(A)递归调用和嵌套调用都是通过堆栈管理实现的
(B)函数直接或间接调用自己称为递归调用
(C)递归终止条件必须为参数值等于0
(D)递归算法的问题规模必须是逐步缩小的
【解答】 A C D B C
二、程序练习
1.阅读程序,写出运行结果。
#include
using namespace std;
int f2( int, int );
int f1( int a, int b )
{ int c;
a += a; b += b;
c = f2( a+b, b+1 );
return c;
}
int f2( int a, int b )
{ int c;
c = b % 2;
return a + c;
}
int main()
{ int a = 3, b = 4;
cout << f1( a, b ) << endl;
}
【解答】
2.阅读程序,写出运行结果。
#include
using namespace std;
int age( int n )
{ int f;
if( n == 1 )
f = 10;
else
f = age( n-1 ) + 2;
return f;
}
int main()
{ cout << "age : " << age( 5 ) << endl; }
【解答】
3.编写递归函数:
int power(int base, int e);
当它被调用时,返回指数basee的值。设e是大于或等于0的整数。用main函数调用power函数,并显示计算结果。例如,power(3,4)=333*3。
提示:递归算法为
basee = base×basee 当e>1时
base1 = base 当e=1时
base0 = 1 当e=0时
想一想,这个程序可以用循环算法代替递归函数定义吗?请你试一试。
【解答】
#include
using namespace std;
int power( int b, int e ) ;
int main()
{
int b,e;
cout<<"base = ";
cin>>b;
cout<<"exponent = ";
cin>>e;
if(e>=1)
cout<<"power( “<<b<<”, “<<e<<” ) = "<<power( b, e )<<endl;
else
{
cout<<“exponent is error!”;
return 0;
}
}
int power(int b, int e)
{
if(e0)
return 1;
else
if(e1)
return b;
else
return bpower( b, e-1 );
}
同步练习3.4
一、选择题
1.有以下函数定义,该函数的类型是( )。
double fun11 (int ary[], int len)
{ /…*/ }
(A)double fun11 (int ary[], int len) (B)double fun11 (int [], int)
(C)double (int[], int) (D)double
2.有以下说明语句,以下叙述正确的是( )。
typedef double funt (double); funt fun12;
(A)funt和 fun12是类型相同的函数 (B)fun12是funt类型的变量
(C)funt是返回typedef double类型的函数 (D)fun12是funt类型的函数
3.有以下语句,则以下正确的赋值语句是( )。
typedef double funt (double); funt fun13, *pfun;
(A)pfun=fun13; (B)*pfun=fun13; (C)pfun=funt; (D)*pfun=funt;
4.有以下语句,则以下不正确的赋值语句是( )。
typedef double funt (double); funt fun13, fun14, *pfun;
(A)pfun=fun13; (B)pfun=&fun14; (C)pfun=*fun13; (D)fun13=fun14;
5.有以下声明,在下列选项中,正确的调用是( )。
int fun14( int ); int (*pf)(int) = fun14;
(A)int a=15; int n=fun14(&a); (B)int a = 15; cout<<(&pf)(a);
(C)cout<<(*pf)( 256 ); (D)cout << *pf( 256 );
【解答】 C C A D C
二、程序练习
1.阅读程序,写出运行结果。
#include
using namespace std;
int f1( int a, int b )
{ return a + b; }
int f2( int a, int b )
{ return a - b; }
int f3( int(*t )( int, int ), int a, int b )
{ return (*t )( a, b ); }
int main()
{ int (*p )( int, int );
p = f1;
cout << f3( p, 4, 8 ) << endl;
p = f2;
cout << f3( p, 8, 4 ) << endl;
}
【解答】
2.当用户输入三个不相等的整数时,以下程序分别按顺序和逆序输出它们的值。给出main函数,请把程序补充完整。
#include
using namespace std;
int main()
{ int a,b,c;
int t1,t2,t3;
orderFun pf; //说明函数指针
cout<<“请输入三个不相等的整数:”;
cin>>a>>b>>c;
t1=a; t2=b; t3=c;
pf=sequence; //获取函数地址
pf(t1,t2,t3); //调用函数
cout<<“顺序输出:”<<t1<<" “<<t2<<” “<<t3<<endl;
t1=a; t2=b; t3=c;
pf=retrograde; //获取函数地址
pf(t1,t2,t3); //调用函数
cout<<“逆序输出:”<<t1<<” “<<t2<<” "<<t3<<endl;
}
【解答】
#include
using namespace std;
typedef void orderFun (int &, int&,int&);
orderFun sequence, retrograde;
int main()
{
int a,b,c;
int t1,t2,t3;
orderFun pf; //说明函数指针
cout<<“请输入3个不相等的整数:”;
cin>>a>>b>>c;
t1=a; t2=b; t3=c;
pf=sequence; //获取函数地址
pf(t1,t2,t3); //调用函数
cout<<“顺序输出:”<<t1<<" “<<t2<<” “<<t3<<endl;
t1=a; t2=b; t3=c;
pf=retrograde;
pf(t1,t2,t3);
cout<<“逆序输出:”<<t1<<” “<<t2<<” "<<t3<<endl;
}
void sequence (int &x, int &y, int &z)
{
int t;
if( x>y ) { t=x; x=y; y=t; }
if( x>z ) { t=x; x=z; z=t; }
if( y>z ) { t=y; y=z; z=t; }
}
void retrograde (int &x, int &y, int &z)
{
int t;
if( x<y ) { t=x; x=y; y=t; }
if( x<z ) { t=x; x=z; z=t; }
if( y<z ) { t=y; y=z; z=t; }
}
同步练习3.5
一、选择题
1.指定内联函数的关键字是( )。
(A)include (B)inline (C)namespace (D)typedef
2.内联函数的正确定义是( )。
(A)inline int small(); int small() { /…/ }
(B)int small(); inline int small() { /…/ }
(C)int inline small(); int small() { /…/ }
(D)int small(); int inline small() { /…/ }
3.使用重载函数编程序的目的是( )。
(A)使用相同的函数名调用功能相似的函数 (B)共享程序代码
(C)提高程序的运行速度 (D)节省存储空间
4.重载函数要求( )。
(A)函数名不同,函数参数个数相同 (B)函数名不同,函数参数类型相同
(C)函数名相同,函数类型各不相同 (D)函数名相同,函数类型也相同
5.以下正确的重载函数是( )。
(A)int same (int, double); double same (int, double);
(B)int same1 (int, double); int same2 (int, double);
(C)int same (int =0); int same (int);
(D)int same (int, double); int same (int, double, double);
【解答】 B A A C D
二、程序练习
编写一个程序,包含三个重载的display函数和一个主函数。要求:第一个函数输出double值,前面用字符串“a double:”引导;第二个函数输出一个int值,前面用字符串“a int:”引导;第三个函数输出一个char字符值,前面用字符串“a char:”引导;在主函数中,分别用double、int和char型变量作为实参调用display函数。
【解答】
#include
using namespace std;
void display( double d )
{
cout << “a double:” << d << endl;
}
void display( int i )
{
cout << “a int:” << i << endl;
}
void display( char c )
{
cout << “a char:” << c << endl;
}
int main()
{
double d = 1.5; int i = 100; char c = ‘a’;
display( d );
display( i );
display( c );
}
同步练习3.6
一、选择题
1.自动存储变量是指( )。
(A)自动指定存储地址的变量
(B)自动更新数据的变量
(C)在程序块执行时生成,块结束时释放的变量
(D)在项目执行时生成,项目结束时释放的变量
2.在函数中声明的静态变量( )。
(A)在函数体中可见,函数结束调用时释放
(B)在函数体中可见,项目结束调用时释放
(C)在项目中可见,函数结束调用时释放
(D)在项目中可见,项目结束调用时释放
3.语句标号的作用域是( )。
(A)函数 (B)文件 (C)程序块 (D)项目
4.全局变量指的是( )的变量。
(A)在项目所有文件可访问 (B)当前文件的所有代码可访问
(C)任何自动初始化为0 (D)具有文件作用域
5.当局部变量与全局变量同名时,若要在局部块内访问全局变量,使用( )运算符。
(A):: (B): (C). (D)->
【解答】 C B A D A
二、程序练习
1.有以下程序:
#include
using namespace std;
int cube(int t);
int main()
{ int k;
for( k=1; k<10; k++)
cout<<cube(k)<<endl;
}
int cube(int t)
{ return ttt; }
说明下面每个元素的作用域:
(a)main中的变量k;
(b)cube函数中的变量t;
(c)cube的函数原型。
(d)cube的函数原型中的标识符t。
【解答】
(a)块作用域
(b)块作用域
(c)文件作用域
(d)函数原型块作用域
2.阅读程序,写出运行结果。
#include
using namespace std;
int sub( int, int );
int a = 1;
int main()
{ int m = 1, n = 2, f;
f = sub( m, n );
cout << a << ‘t’ << f << endl;
f = sub( m, n );
cout << a << ‘t’ << f << endl;
}
int sub( int c, int d )
{ static int m = 2, n = 5;
cout << m << ‘t’ << n << ‘t’ << endl;
a = ++a; c = m++; d = n++;
return c + d;
}
【解答】
综合练习
一、思考题
1.函数的作用是什么?如何定义函数?什么叫函数原型?
【解答】
函数的两个重要作用:
(1)任务划分,把一个复杂任务划分为若干小任务,便于分工处理和验证程序正确性;(2)软件重用,把一些功能相同或相近的程序段,独立编写成函数,让应用程序随时调用,而不需要编写雷同的代码。
函数的定义形式:
类型 函数名 ( [ 形式参数表 ] )
{
语句序列
}
函数原型是函数声明,告诉编译器函数的接口信息:函数名、返回数据类型、接收的参数个数、参数类型和参数顺序,编译器根据函数原型检查函数调用的正确性。
2.什么叫函数值的返回类型?什么叫函数的类型?如何通过指向函数的指针调用一个已经定义的函数?编写一个验证程序进行说明。
【解答】
(1)函数的返回类型是函数返回的表达式的值得类型;
(2)函数类型是指函数的接口,包括函数的参数定义和返回类型;
(3)若有
functionType functionName; //functionType是已经定义的函数类型
functionType *functionPointer=functionName; //定义函数指针并获取函数地址
则可以通过函数指针调用函数:
(*functionPointer)(argumentList);
或 functionPointer(argumentList);
其中argumentList是实际参数表。
验证程序:
#include
using namespace std;
int main()
{
typedef int myfunc(int,int);
myfunc f,*fp;
int a=10,b=6;
fp=f;
cout<<“Using f(a):”<<f(a,b)<<endl; //函数名调用函数
cout<<“Using fp(a):”<<fp(a,b)<<endl; //函数指针调用函数
cout<<“Using (*fp)(a):”<<(fp)(a,b)<<endl; //函数指针调用函数
return 0;
}
int f(int i,int j)
{
return ij;
}
3.什么叫形式参数?什么叫实际参数?C++函数参数有什么不同的传递方式?编写一个验证程序进行说明。
【解答】
参数是调用函数与被调用函数之间交换数据的通道。函数定义首部的参数称为形式参数,调用函数时使用的参数称为实际参数。C++有三种参数传递机制:值传递(值调用);指针传递(地址调用);引用传递(引用调用)。
验证程序:
#include
using namespace std;
void funcA(int i)
{ i=i+10; }
void funcB(int *j)
{ *j=*j+20; }
void funcC(int &k)
{ k=k+30; }
int main()
{ int a=1;
funcA(a);cout<<“a=”<<a<<endl;
funcB(&a);cout<<“a=”<<a<<endl;
funcC(a);cout<<“a=”<<a<<endl;
}
程序输出:
a=1 //传值参数,实际参数值不变
a=21 //指针参数,形式参数通过间址修改实际参数
a=51 //引用参数,形式参数通过别名方式修改实际参数
4.C++函数通过什么方式传递返回值?当一个函数返回指针类型时,对返回表达式有什么要求?若返回引用类型时,是否可以返回一个算术表达式?为什么?
【解答】
C++首先计算表达式的值,然后把该值赋给函数返回类型的匿名对象,通过这个对象,把数值带回调用点,继续执行后续代码。
当函数返回指针类型时,返回的地址值所指对象不能是局部变量。因为局部变量在函数运行结束后会被销毁,返回这个指针是毫无意义的。
返回引用的对象不能是局部变量,也不能返回表达式。算术表达式的值被储存在匿名空间中,函数运行结束后会被销毁,返回这个变量的引用也是无意义的。
5.变量的生存期和变量作用域有什么区别?请举例说明。
【解答】
变量的生存期是指程序运行后,变量占有内存的时间;变量作用域指的是指变量声明之后,在程序正文中有效的那部分区域。
例如,定义函数:
void count()
{ static int n=0;
//……
}
该函数中n被定义为static变量,生存期是整个程序运行时期;但作用域只在count函数中。
6.静态局部变量有什么特点?编写一个应用程序,说明静态局部变量的作用。
【解答】
静态局部变量的生存期是全程的,作用域是局部的。程序开始执行时就分配和初始化存储空间(默认初始化值为0)。定义静态局部变量的函数退出时,系统保持其存储空间和数值。再次调用这个函数时,static变量还是上次退出函数时的值。直至整个程序运行结束,系统才收回存储空间。
验证程序:
以下程序在函数callfun中定义了静态变量n,记录的函数本身被调用的次数。
#include
using namespace std;
void callfun()
{
static int n=0;
n++;
if(n<=3)
{
cout<<“被调用了”<<n<<“次n”;
callfun();
}
}
int main()
{
callfun();
cout<<“不能再调用了n”;
}
7.在一个语句块中能否访问一个外层的同名局部变量?能否访问一个同名的全局变量?如果可以,应该如何访问?编写一个验证程序进行说明。
【解答】
一个语句块中不能访问外层的同名局部变量。可以访问一个同名的全局变量。
验证程序:
#include
using namespace std;
int a=0; //全局变量a
int main()
{ int a=1; //外层局部变量a
{ int a=2; //内层局部变量a
cout<<"Local a is "<<a<<endl; //输出内层局部变量a
}
cout<<"Main a is "<<a<<endl; //输出外层局部变量a
cout<<"Global a is "<<::a<<endl; //输出全局部变量a
}
8.有函数原型:
void f (int & n) ;
和函数调用:
int a;
//…
f(a);
有人说,因为n是a的引用,在函数f中访问n相当于访问a,所以,可以在f的函数体内直接使用变量名a。这种说法正确吗?为什么?编写一个验证程序。
【解答】
形式参数n的作用域是f函数,实际参数a的作用域是调用f函数的模块(例如main函数),所以在f函数中可见n而不可见a。因此,这种说法不正确。f函数内不能直接使用变量名a,只能通过别名n访问a。
验证程序:
#include
using namespace std;
void f ( int&n );
int main()
{
int a = 1 ;
f( a );
cout<<“a=”<<a<<endl;
}
void f ( int&n )
{
a++; //错误,直接使用a
n++; //正确
}
产生编译错误:error C2065: “a”: 未声明的标识符
9.有函数原型
double function(int,double);
函数function的返回值类型是什么?函数的类型是什么?请用typedef定义函数的类型。
若有函数调用语句
x=function(10,(2*(0.314+5));
其中的括号“()”与函数原型中括号有什么语义区别?
【解答】
函数function的返回值类型是double
函数类型是: double (int,double)
可以定义为: typedef double funType (int,double);
函数调用function(10,(2*(0.314+5)) 中,外层括号表示调用函数匹配的实际参数表,里面的两层括号是表达式运算。
10.请分析以下各语句的意义。
int * fun() ;
int * (pf)() ;
fun() ;
pf = fun ;
pf() ;
【解答】
int * fun() ; //函数原型声明。fun是返回int类型,没有参数的函数
int * (pf)(); //声明指针变量。pf是指向函数的指针,函数类型为int()
fun() ; //调用函数语句
pf = fun ; //向指针变量赋值。函数指针pf指向函数fun
pf() ; //用指针变量间址调用函数
二、程序设计
1.已知,其中,sh为双曲正弦函数,即。编写一个程序,输入x的值,求y的值。
【解答】
#include
#include
using namespace std;
double sh( double t );
int main()
{
double x,y;
cout << “x=”;
cin >> x;
y = sh( 1+sh(x) )/( sh( 2x )+sh( 3x ) );
cout << “y=” << y << endl;
}
double sh( double t )
{
return ( exp( t )-exp( -t ) )/2;
}
2.输入m、n和p的值,求s =的值。注意判断运算中的溢出。
【解答】
#include
using namespace std;
double f( long k,long num );
int main()
{
long m, n, p;
double s, f1, f2, f3;
cout << "m, n, p = ";
cin>>m>>n>>p;
f1=f( 1, m );
f2=f( 3, n );
f3=f( 5, p );
if ( f1&&f2&&f3 )
{
s = ( f1 + f2) /f3;
cout << “s=” << s << endl;
}
else
cout<<“溢出!n”;
}
double f( long k,long num )
{
long i;
double sum=0;
for( i=1; i<=num && sum<2147483647; i++ )
sum = sum + pow( double (i),double (k) );
if (i<=num)
return 0; //溢出时返回
return sum;
}
3.输入a、b和c的值,编写一个程序求这三个数的最大值和最小值。要求:把求最大值和最小值操作分别编写成一个函数,并使用指针或引用作为形式参数把结果返回main函数。
【解答】
(1)使用指针参数
#include
using namespace std;
void fmaxmin( double,double ,double ,double *,double * );
int main()
{
double a,b,c,max,min;
cout << "a,b,c = ";
cin >> a >> b >> c;
fmaxmin( a,b,c,&max,&min );
cout << “max=” << max << endl;
cout << “min=” <<min << endl;
}
void fmaxmin( double x,double y,double z,double *p1,double *p2 )
{
double u,v;
if ( x>y )
{ u = x; v = y; }
else
{ u = y; v = x; };
if ( z>u ) u = z;
if ( z<v ) v = z;
*p1 = u;
*p2 = v;
}
(2)使用引用参数
#include
using namespace std;
void fmaxmin( double,double ,double ,double& ,double& );
int main()
{
double a,b,c,max,min;
cout << “a,b,c=”;
cin >> a >> b >> c;
fmaxmin( a,b,c,max,min );
cout << “max=” << max << endl;
cout << “min=” << min << endl;
}
void fmaxmin( double x,double y,double z,double &p1,double &p2 )
{
double u,v;
if ( x>y )
{ u = x; v = y; }
else
{ u = y; v = x; };
if ( z>u ) u = z;
if ( z<v ) v = z;
p1 = u;
p2 = v;
}
4.用线性同余法生成随机数序列的公式为:
rk = (multiplier rk1 + increment) % modulus
序列中的每个数rk都可以由它的前一个数rk1计算出来。例如,如果有:
rk = (25 173 rk1 + 13 849) % 65 536
则可以产生65 536个各不相同的整型随机数。设计一个函数作为随机数生成器,生成1位或2位的随 机数。
利用这个随机数生成器,编写一个小学生学习四则运算的练习程序,要求:
① 可以进行难度选择,一级难度只用1位数,二级难度用2位数;
② 可以选择运算类型,包括加、减、乘、除等;
③ 给出错误提示;
④ 可以统计成绩。
【解答】
#include
using namespace std;
int Rand(int,int); //生成指定范围的随机数
int main()
{
int w,i,r,t = 0;
char op,answer;
int a,b,d;
while(1) //练习开始
{
cout<<“现在开始?( Y 或 N )n” ;
cin>>answer;
if (answer==‘N’||answer==‘n’) break;
while(1)
{
cout << “请输入难度( 1或2 ):”;
cin >> w;
if ( w != 1 && w != 2 )
cout << “输入难度错误,重新输入!” << endl;
else break ;
}
while(1)
{
cout << "请输入运算类型( +,-,,/ ):" ;
cin >> op;
if ( op != ‘+’ && op != ‘-’ && op != '’ && op != ‘/’ )
cout << “输入运算符错误,重新输入!” << endl;
else
break;
}
//出10道题,每题10分
t=0;
for( i=1; i<=10; i++ )
{
while(1)
{
if( w == 1 )
{ a = Rand(0,10); b = Rand(0,10); }
else
if( w == 2 )
{ a = Rand(10,100); b = Rand(10,100); }
if ( op == ‘-’ )
if ( a<b ) continue ; //使被减数大于减数
if ( op == ‘/’ )
if ( int( a/b ) != (a / b) ) continue; //只做结果为整数的除法
break;
}
cout << a << op << b << ‘=’;
cin >> d;
switch ( op )
{
case ‘+’: r = a + b; break;
case ‘-’: r = a - b; break;
case ‘*’: r = a * b; break;
case ‘/’: r = a / b; break;
}
if ( r == d )
{
cout << “你算对了,加10分!” << endl;
t = t + 10;
}
else
cout << “你算错了!” << endl;
}
cout << “你的成绩是:” << t << “分” << endl;
}
}
int Rand(int m, int n)
{
static int r; //静态变量保留上一个随机数
do
{
r = ( 25173*r + 13849 ) % 65536 ;
} while (r<m||r>=n);
return r;
}
5.已知勒让德多项式为:
编写程序,从键盘输入x和n的值,使用递归函数求pn(x)的值。
【解答】
#include
using namespace std;
double p( double x,int n );
int main()
{
int n;
double x;
cout << “please input x and n:”;
cin >> x >> n;
cout << “p(” << x << “,” << n << “)=” << p( x,n ) <<endl;
}
double p( double x,int n )
{
double t1,t2;
if( n == 0 )
return 1;
else
if( n == 1 )
return x;
else
{
t1 = ( 2*n-1 )*p( x,n-1 );
t2 = ( n-1 )*p( x,n-2 );
return ( t1-t2 )/n;
}
}
6.把以下程序中的print()函数改写为等价的递归函数。
#include
using namespace std;
void print( int w )
{ for( int i = 1 ; i <= w ; i++ )
{ for( int j = 1 ; j <= i ; j++ )
cout << i << " " ;
cout << endl ;
}
}
int main()
{ print( 5 ) ; }
【解答】
#include
using namespace std;
void print(int w)
{
int i;
if( w )
{
print( w-1 );
for( i=1; i<=w; i++ )
cout << w << " ";
cout << endl;
}
}
void main()
{
print( 5 );
}
7.已知用梯形法求积分的公式为:,其中,h = (ba) / n,n为积分区间的等分数,编程求如下积分的值。要求:把求积分公式编写成一个函数,并使用函数指针作为形式参数。调用该函数时,给出不同的被积函数作为实际参数求不同的积分。
① ② ③
【解答】
#include
#include
using namespace std;
double f1( double x )
{
return 4 / ( 1 + xx );
}
double f2( double x )
{
return sqrt( 1 + xx );
}
double f3( double x )
{
return sin( x );
}
double trap( double( *fun )( double x ), double a, double b, long n )
{
double t,h; int i;
t = ( ( *fun )(a) + ( *fun )( b ) ) / 2.0;
h = ( b - a ) / n;
for( i=1; i<=n-1; i++ ) t += ( *fun )( a + i * h );
t *= h;
return t;
}
int main()
{
double t1,t2,t3;
t1 = trap( f1,0,1,10000 );
cout << “t1=” << t1 << endl;
t2 = trap( f2,1,2,10000 );
cout << “t2=” << t2 << endl;
t3 = trap( sin,0,3.14159265/2,10000 );
cout << “t3=” << t3 << endl;
}
8.使用重载函数编程序分别把两个数和三个数从大到小排列。
【解答】
#include
using namespace std;
void sort( double x,double y );
void sort( double x,double y,double z );
int main()
{
sort( 5.6, 79 );
sort( 0.5, 30.8, 5.9 );
}
void sort(double x,double y)
{
if ( x>y )
cout << x << ‘t’ << y << endl;
else
cout << y << ‘t’ << x << endl;
}
void sort( double x,double y,double z )
{
double t;
if( y<z ) { t = y; y = z; z = t; }
if( x<z ) { t = x; x = z; z = t; }
if( x<y ) { t = x; x = y ;y = t; }
cout << x << ‘t’ << y << ‘t’ << z << ‘t’ << endl;
}
9.猜数游戏。玩家想好了一个1~1000之内的整数,由计算机来猜这个数。如果计算机猜出的数比玩家想的数大,则玩家输入1;如果计算机猜出的数比玩家想的数小,则玩家输入1;这个过程一直进行到计算机猜中为止,玩家输入0。
【解答】
using namespace std;
int guess(int k=0);
int main()
{
int answer,t=1;
cout<<“请你想好一个1~1000之内的整数,别告诉我,让我来猜猜!n”;
cout<<“猜中了,请输入0;若猜的数小了,请输入-1;若猜的数大了,请输入1n”;
cout<<“开始猜了……n”;
cout<<“是 “<<guess()<<” 吗?t”;
while(1)
{
cin>>answer;
if(answer==0)
{
cout<<“我猜中啦!只猜了 “<<t<<” 次,很强吧!n”;
break;
}
cout<<“是 “<<guess(answer)<<” 吗?t”;
t++;
}
}
int guess(int k)
{
static int min=1;
static int max=1000;
static int g = 500;
switch(k)
{
case 0: break;
case 1: max=g-1; break;
case -1: min=g+1; break;
default : cout<<“你输入错了,请再输入。n”; return g;
}
if(max<min)
{
cout<<“你耍赖…不跟你玩了!n”;
exit(0);
}
g=(min+max)/2;
return g;
}
10.给定求组合数公式为:,编一程序,输入m和n的值,求的值。注意优化算法,降低溢出可能。要求:主函数调用以下函数求组合数:
int Fabricate(int m, int n); //返回的值
在Fabricate函数内需调用Multi函数:
int Multi(int m, int n); //返回
程序由4个文件组成。头文件用于存放函数原型,作为调用接口;其他三个.cpp文件分别是main、Fabricate和Multi函数的定义。
【解答】
//Fabricate.h
#ifndef FABRICATE_H
#define FABRICATE_H
int Fabricate( int m,int n );
int Multi( int m, int n );
#endif
//main.cpp
#include
using namespace std;
#include “Fabricate.h”
int main()
{
int m ,n;
cout << “input m and n:”;
cin >> m >> n;
cout << “Fabricate(” << m << “,” << n << “)=” << Fabricate( m, n ) << endl;
}
//Fabricate.cpp
#include “Fabricate.h”
int Fabricate( int m, int n )
{
return Multi( m, m-n + 1 ) / Multi( n, 1 );
}
//Multi.cpp
int Multi( int m, int n )
{
int i, t = 1;
for( i=n; i<=m; i++ )
t = t * i;
return t;
}
第4章练习题
同步练习4.1
一、选择题
1.有数组定义 double d[10]; 以下叙述不正确的是( )。
(A)数组d有10个元素 (B)数组d的最后一个元素是d[10]
(C)数组d的第一个元素*d (D)数组d的字节数是sizeof(double)*10
2.以下对一维数组a的定义正确的是( )。
(A)int n = 5, a[n]; (B)int a(5);
(C)const int N = 5; int a[N]; (D)int n; cin>>n; int a[n];
3.下列数组定义语句中,不合法的是( )。
(A)int a[3] = { 0, 1, 2, 3 }; (B)int a[] = { 0, 1, 2 };
(C)int a[3] = { 0, 1, 2 }; (D)int a[3] = { 0 };
4.已知 int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, p = a; 以下不能表示数组 a 中元素的表达式是( )。
(A)a (B)p (C)a (D)a[ p-a ]
5.已知 int a[] = { 0,2,4,6,8,10 }, p = a+1; 其值等于0的表达式是( )。
(A) (p++) (B)(++p) (C)(p–) (D)(–p)
【解答】 B C A C D
二、程序练习
1.阅读程序,写出运行结果。
#include
using namespace std;
int main()
{ int i, count=0, sum=0;
double average;
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for( i=0; i<10; i++ )
{ if( a[i] % 2 == 0 )
continue;
sum += a[ i ];
count++;
}
average = sum/count;
cout << "count = " << count << ‘t’ << "average = " << average << endl;
}
【解答】
2.阅读程序,写出运行结果。
#include
using namespace std;
int main()
{ int a[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int *p = a, sum = 0;
for(; p<a+9; p++ )
if(*p % 2 == 0 )
sum += *p;
cout << "sum = " << sum << endl;
}
【解答】
3.设计一个程序,要求有以下功能:
(1)声明一个长度为10的整型数组;
(2)输入数组元素;
(3)寻找数组中的最大值元素和这个元素的下标;
(4)输出最大值元素的值和它的下标值。
【解答】
#include
#include
using namespace std;
int main()
{
int a[10],max,i,j;
cout<<“请输入10个数:”;
for( i=0;i<10;i++)
{
cin>>a[i];
}
max=0; //记录最大元素的下标
for(j=0;j<10;j++)
{
if(a[j]>=a[max]) //用当前最大元素与遍历元素比较
max=j; //修改最大下标值
}
cout<<“最大值为:”<<a[max]<<endl;
cout<<“它的下标为:”<<max<<endl;
}
同步练习4.2
一、选择题
- 说明一个长度为10的数组,元素类型为整型指针的正确语句是( )。
(A)int *pary[10]; (B)int (*pary)[10]
(C)int *pary(10); (D)int **pary[10] - 有以下语句,则能够输出a+b+c的值的语句是( )。
int a=1, b=2, c=3; int *pary[3]={&a, &b, &c};
(A)cout<<(pary[0]+pary[1]+pary[2]); (B)cout<<(*pary[0]+*pary[1]+*pary[2]);
(C)cout<<(pary[1]+pary[2]+pary[3]); (D)cout<<(*pary[1]+*pary[2]+*pary[3]);
【解答】 A B
二、程序练习
使用以下语句:
const int n=20;
int a[n]; int *pa[n]; int i;
for(i=0; i<n; i++)
a[i]=i+1;
编写完整的程序,通过pa数组修改数组a元素的值,使其元素值自增10,然后通过pa数组遍历a数组,输出全部元素值,要求每行输出10个元素。
【解答】
#include
using namespace std;
int main()
{
const int n=20;
int a[n];
int *pa[n];
int i;
for(i=0; i<n; i++)
{
a[i]=i+1;
pa[i]=a+i; //对指针数组元素赋值
*pa[i]+=10; //数组元素值自增10
cout<<*pa[i]<<" "; //输出数组元素
if((i+1)%10==0) //格式控制
cout<<endl;
}
}
同步练习4.3
一、选择题
1.以下不能对二维数组a进行正确初始化的语句是( )。
(A)int a[2][3] = { 0 };
(B)int a[][3] = { { 0,1 }, { 0 } };
(C)int a[2][3] = { { 0, 1 }, { 2, 3 }, { 4, 5 } };
(D)int a[][3] = { 0, 1, 2, 3, 4, 5 };
2.已知 int a[][3] = { { 0, 1 }, { 2, 3, 4 }, { 5, 6 }, { 7 } }; 则 a[2][1]的值是( )。
(A)0 (B)2 (C)6 (D)7
3.已知 int a[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 以下不能表示数组元素a[2][1]的地址是( )。
(A)&a[2][1] (B)(a[2]+1) (C)a[2]+1 (D)(a+2)+1
4. 有以下说明语句,则正确的赋值语句是( )。
int a[5][5]; int *p, **q;
(A)p=a; (B)p=*a; (C)q=a; (D)q=*a;
5. 有以下说明语句,则正确的赋值语句是( )。
int a[5][5]; int *p, **q;
(A)p=a[0]; (B)p=&a[0]; (C)q=a[0]; (D)q=&a[0][0];
【解答】 C C B B A
二、程序练习
1.阅读程序,写出运行结果。
#include
#include
using namespace std;
const int N = 5;
int main()
{ int a[N][N]={ 0 }, i, j, k;
for( k=1, i=0; i<N; i++ )
for( j=i; j>= 0; j–, k++ )
a[j][i - j ] = k;
for( i=0; i<N; i++ )
{ for( j=0; j<N; j++ )
cout << setw( 3 ) << a[i][j];
cout << endl;
}
}
【解答】
2.以下程序用于输入一个矩阵的元素,并输出指定行的元素。请补充inputAry函数和outputAry函数。
#include
using namespace std;
const int N=5;
int main()
{ int ary[N][N], k;
inputAry(ary, N);
cout<<"输入行号,k = “;
cin>>k;
outputAry(ary, N, k-1);
}
【解答】
#include
using namespace std;
const int N=5;
void inputAry(int ary[N][N], int n );
void outputAry(const int ary[N][N], int n, int line);
int main()
{
int ary[N][N], k;
inputAry(ary, N);
cout<<“输入行号,k = “;
cin>>k;
outputAry(ary, N, k-1);
}
void inputAry(int ary[N][N], int n)
{
cout<<“输入”<<n<<”*”<<n<<“个矩阵元素n”;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
cin>>ary[i][j];
}
void outputAry(const int ary[N][N], int n, int k)
{
for(int i=0; i<n; i++)
cout<<ary[k][i]<<” ";
cout<<endl;
}
同步练习4.4
一、选择题
1.若用数组名作为调用函数的实参,则传递给形参的是( )。
(A)数组存储首地址 (B)数组的第一个元素值
(C)数组中全部元素的值 (D)数组元素的个数
2.有说明语句:int a[10];
及函数:int fun(int x[10], int n) { return sizeof(x); }
则语句 cout<<fun(a,10)<<endl; 的显示结果是( )。
(A)40 (B)10 (C)4 (D)0
3.有以下说明语句,则调用函数的正确语句是( )。
int a[10];
void fun( int * ,int n);
(A)fun(a, 10); (B)fun(a[0], 10); (C)fun(*a, 10); (D)fun(&a, 10);
4.有以下说明语句,则调用函数的正确语句是( )。
int b[4][5];
void fun( int * ,int n);
(A)fun(b, 20); (B)fun(b[0], 20); (C)fun(b[0][0], 20); (D)fun(&b, 20);
5. 有以下说明语句,则调用函数的正确语句是( )。
int x[4][5];
void fun( int y[4][5] , int m, int n);
(A)fun(x, 4,5); (B)fun(*x, 4,5); (C)fun(x[0], 4,5); (D)fun(&x, 4,5);
【解答】 A C A B A
二、程序练习
1.阅读程序,写出运行结果。
#include
using namespace std;
int f(int [],int);
int main()
{ int a[] = { -1, 3, 5, -7, 9, -11 };
cout << f( a, 6 ) << endl;
}
int f( int a[], int size )
{ int i, t=1;
for( i=0; i<size; i ++ )
if( a[i]>0 ) t*= a[i];
return t;
}
【解答】
2.阅读程序,写出运行结果。
#include
using namespace std;
int f( int [][3], int, int );
int main()
{ int a[][3] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
cout << f( a, 3, 3 ) << endl;
}
int f( int a[][3], int row, int col )
{ int i, j, t=1;
for( i=0; i<row; i++ )
for( j=0; j<col; j++ )
{ a[i][j]++;
if( i == j ) t *= a[i][j];
}
return t;
}
【解答】
3.本程序的main函数定义了一个用二维数组m表示的6×6方阵。程序中:
(1)调用setMatrix函数,对方阵元素赋不大于100的随机整数;
(2)调用diagonal函数,依次把m阵的主对角线、次对角线放在数组a中。
请补充定义setMatrix函数和diagonal函数,使其成为完整程序。
#include
#include
#include
using namespace std;
const int N=6;
int main()
{ int m[N][N],a[2N],i,j;
setMatrix( m, NN ); //调用函数,对方阵元素赋不大于100的随机整数
cout<<N<<""<<N<<“方阵:n”;
for( i=0; i<N; i++ ) //输出方阵元素
{ for(j=0;j<N; j++)
cout<<m[i][j]<< ‘t’;
cout<<endl;
}
diagonal( m, a, N ); //调用函数,依次把m阵的主对角线、次对角线放在数组a中
cout<<“对角线元素:n”;
for( i=0; i<2N; i++ ) //输出对角线元素
cout<<a[i]<<" ";
cout<<endl;
}
【解答】
void setMatrix( int matrix[][N],int n ) //matrix是二维数组参数
{ int i,*p; //p是一级指针变量
p=*matrix; //二维数组作降维处理
srand(unsigned(time(0)));
for( i=0; i<n; i++,p++ )
*p= rand()%100; //对数组元素赋随机数
}
void diagonal( int matrix[][N], int *ary, int n)
{ int i;
for (i=0;i<n;i++)
{ ary[i]= matrix[i][i]; //主对角线
ary[i+n]= matrix[i][n-i-1]; //次对角线
}
}
同步练习4.5
一、选择题
- 以下建立动态存储的语句正确的是( )。
(A)int p=new int; (B)int p=new (10);
(C)int *p(10); (D)int *p=new int(10); - 以下建立动态存储的语句正确的是( )。
(A)int p=new int[]; (B)int p=new [10];
(C)int *p=new int[10]; (D)int *p[10]=new int; - 有说明语句,则释放动态数组的正确语句是( )。
int *p=new int[10];
(A)delete []p; (B)delete p[]
(C)delete int[]p (D)delete p int[10] - 有说明语句,则访问动态数组元素的正确语句是( )。
int p=new int[10];
(A)int a=p; (B)int a=&p;
(C)int a=p[1] (D)int a=p[1];
【解答】 D C A C
二、程序练习
1.阅读程序,写出运行结果。
#include
using namespace std;
int main()
{ int *p;
cout << “test1: n” ;
p= new int( 5);
cout<<*p << endl;
p= new int[5];
cout << “test2: n”;
for(int i=0; i<5; i++)
{ (p+i)=i+1;
cout <<(p+i) << “t”;
}
cout<<endl;
}
【解答】
2.阅读程序,写出运行结果。
#include
using namespace std;
void test1( int *a1 )
{ a1 = new int( 5 );
cout << "*a1 = " << *a1 << endl;
}
void test2(int * & a2)
{ a2 = new int( 5 );
cout << "*a2 = " << *a2 << endl;
}
int main()
{ int *p = new int( 1 );
test1( p );
cout << "test1: *p1 = " << *p << endl;
test2( p );
cout << "test2: *p2 = " << *p << endl;
}
【解答】
3.以下程序修改了同步练习4.3程序练习第2题中程序的主函数,请补充inputAry函数和outputAry函数,使程序完成相同的功能。
#include
using namespace std;
int main()
{ int pa, n, k;
cout<<"输入矩阵的阶,n = ";
cin>>n;
pa=new int[nn];
inputAry(pa, n);
cout<<"输入行号,k = ";
cin>>k;
outputAry(pa, n, k-1);
}
【解答】
#include
using namespace std;
void inputAry(int ary, int n );
void outputAry(const int ary, int n, int k);
int main()
{
int pa, n, k;
cout<<"输入矩阵的阶,n = ";
cin>>n;
pa=new int[nn];
inputAry(pa, n);
cout<<"输入行号,k = “;
cin>>k;
outputAry(pa, n, k-1);
}
void inputAry(int ary, int n)
{
cout<<“输入”<<n<<"”<<n<<“个矩阵元素n”;
for(int i=0; i<nn; i++)
cin>>ary[i];
}
void outputAry(const int ary, int n, int k)
{
for(int i=0; i<n; i++)
cout<<ary[nk+i]<<" “;
cout<<endl;
}
同步练习4.6
一、选择题
1.已知 char a[]={ “fortran”, " basic”, “pascal”, “java”, “c++” }; 则 cout<<a[3];的显示结果是( )。
(A)t (B)一个地址值 (C)java (D)javac++
2.设有 char s=“ABCDE”; cout<<(s+1)<<endl; 输出结果是( )。
(A)A (B)B (C)ABCD (D)BCD
3.设有 char s=“ABCDE”; cout<<(s+1)<<endl; 输出结果是( )。
(A)A (B)B (C)ABCD (D)BCDE
4.设有 char s=“ABCDE”; cout<<strlen(s)<<endl; 输出结果是( )。
(A)6 (B)5 (C)4 (D)1
5.设 char s1, s2; 分别指向两个字符串,可以判断字符串s1和s2是否相等的表达式为( )。
(A)s1=s2 (B)s1==s2
(C)strcpy(s1,s2)==0 (D)strcmp(s1,s2)==0
【解答】 C B D B D
二、程序练习
1.阅读程序,写出运行结果。
#include
using namespace std;
int main()
{ char s[] = “abccda”;
int i; char c;
for( i = 1; ( c=s[i] ) != ‘ ’; i++ )
{ switch( c )
{ case ‘a’ : cout << ‘%’; continue;
case ‘b’ : cout << ‘$’; break;
case ‘c’ : cout << ‘*’; break;
case ‘d’ : continue;
}
cout << ‘#’ << endl;
}
}
【解答】
2.阅读程序,写出运行结果。
#include
using namespace std;
int main()
{ char *str[] = { “c++”, “basic”, “pascal” };
char **p; int i;
p = str;
for( i=0; i<3; i++ )
cout << * ( p+i ) << endl;
}
【解答】
3.阅读程序,写出运行结果。
#include
using namespace std;
int main()
{ char s1[] = “Fortran”, s2[] = “Foxpro”;
char *p, *q;
p = s1; q = s2;
while(*p && *q )
{ if (*p == *q )
cout << *p;
p++;
q++;
}
cout << endl;
}
【解答】
4.阅读程序,写出运行结果。
#include
#include
using namespace std;
int main()
{ char str[][10] = { “VB”, “Pascal”, “C++” }, s[10];
strcpy_s( s, ( strcmp( str[0], str[1] ) < 0 ? str[0] : str[1] ) );
if( strcmp( str[2], s ) < 0 )
strcpy_s( s, str[2] );
cout << s << endl;
}
【解答】
5.本程序可以完成对字符串text的插入和删除操作。其中:
insertStr(text,s,n); //在text串的第n个字符后插入s串
deleteStr(text,start,n); //删除text串中从第start 个字符开始,连续n个字符的串
请补充定义insertStr函数和deleteStr函数(不使用标准库函数)。函数不需要考虑字符串的允许长度。
#include
using namespace std;
void insertStr(char *t, char *s,int n);
void deleteStr(char *t, int start, int n);
void main()
{ char text[256]="