习题与解答
第1章 基本数据与表达式
1.1 选择题
1.一个最简单的C++程序,可以只有一个( C )。 (A)库函数 (A)解释 (A)冒号
(B)自定义函数 (B)汇编 (B)分号 (B)x=x/a;
(C)main函数
(C)编辑 (C)空格
(D)空函数
(D)编译 (D)花括号
2.用C++语言编写的源程序要成为目标程序必须要经过( D )。 3.C++程序中的简单语句必须以( B )结束。
4.假设有说明 int a=0; double x=5.16;,则在以下语句中,( C )属于编译错误。 (A)x=a/x;
(C)a=a%x;
(D)x=xa; (D)逻辑
5.执行C++程序时出现的―溢出‖错误属于( C )错误。 (A)编译
(B)连接
(C)运行
6.在下列选项中,全部都是C++关键字的选项为( C )。 (A)while IF Static (C)sizeof case extern
(B)break char go (D)switch float integer
7.按C++标识符的语法规定,合法的标识符是( A )。
(A)_abc (B)new (C)π (D)\"age\" 8.在C++语句中,两个标识符之间( A )不能作为C++的分隔符。 ..(A)数字 (A)0a0 (A)0x11
(B);
(C):
(D)+ (D)0x10 (D)0x1f
9.下列正确的八进制整型常量表示是( B )。
(B)015 (B)0xaf
(C)080 (C)0xg
10.下列错误的十六进制整型常量表示是( C )。
11.在下列选项中,全部都合法的浮点型数据的选项为( B )。 (A)1e3.5 15. 2e4
(B)12.34 1e+5 0.1E12 (D)5.0e(1+4) 0.1 8e+2
(D)'\\101'
(C)0.2e2 12345. e5
12.在下列选项中,正确的字符常量为( D )。 (A)\"a\" (B)'name' (C)a 13.在下列选项中,( D )不能交换变量a和b的值。 ..(A)t=b; b=a; a=t; (C)t=a; a=b; b=t;
(B)a=a+b; b=a-b; a=a–b; (D)a=b; b=a;
14.关于下列语句,叙述错误的是( A )。
int i=10, p=&i; (A)p的值为10
(B)p指向整型变量i
(C)p表示变量i的值 (D)p的值是变量i的地址 15.有以下变量说明,下面不正确的赋值语句是( B )。 ...int a=5, b=10, c; int p1 = &a, p2 = &b; (A)p2 = b; (C)p2 = p1;
(B)p1 = a; (D)c = p1 (p2);
16.有以下变量说明,下面正确的语句是( B )。 int a=10, b; int &pa=a, &pb=b; (A)&pb = a; (B)pb = pa;
(C)pb = &pa;
(D)pb = pa;
17.执行下面语句序列后,a和b的值分别为( B )。
int a=5, b=3, t; int &ra=a; int &rb=b; t=ra; ra=rb; rb=t; (A)3和3 (A)<=
(B)3和5
(C)5和3
(C)+
(D)5和5
(D)
18.在下列运算符中,( D )优先级最高。
(B)=
19.在下列运算符中,( D )优先级最低。 (A)! (A)1 (A)1
(B)&& (B)2 (B)2
(C)!= (C)3 (C)3
(D)? : (D)4 (D)4
20.已知int i=1, j=2;,则表达式 i+++j 的值为( C )。 21.已知int i=1, j=2;,则表达式 ++i+j 的值为( D )。 22.在下列表达式选项中,( C )是正确。 (A)++(a++) (A)0
(B)a++b (B)1
(C)a+++b (C)2
(D)a++++b
(D)3
23.已知 int i=0, j=1, k=2;,则逻辑表达式 ++i|| j&&++k 的值为( B )。 24.执行下列语句后,x的值是( D ),y的值是( )。
int x, y;
x=y=1; ++x || ++y; (A)不确定 (B)0 (C)1 (D)2 25.设x为整型变量,不能正确表达数学关系 1<x<5 的C++逻辑表达式是( A )。 ..(A)1< x <5
(B)x==2||x==3||x==4
(D)! (x<=1)&&! (x>=5)
(C)1 (B)40 (C)–40 (D)20 27.设 int a=1, b=2, c=3, d=4;,则以下条件表达式的值为( A )。 a(B)2 (C)3 (D)4 28.以下逗号表达式的值为( D )。 (x=45, x5), x+25 (A)25 (B)20 (C)100 (D)45 1.2 根据下列数学表达式写出C++算术表达式 11111xy1. 2.x{x[x(ax+b)+c]+d}+e 10ab 3.ln1ab4.1cos48° 21x222 5.cot1x2 6.lg(a+ab+b) 【解答】 1. 1/(1 + 1/(1 + 1/(x + y))) 2. x * ( x * ( x * ( a * x + b ) + c ) + d ) + e 3. log( 1 + pow( fabs( ( a + b )/( a – b ) ),10) 4. sqrt( 1 + 3.14159/2 * cos( 48 * 3.14159/180 ) ) 5. 1/tan( ( 1 - x*x )/( 1 + x*x)) 或者 cos( ( 1 - x*x )/( 1 + x*x ) )/sin( ( 1 - x*x )/( 1 + x*x ) ) 6. log10( a * a + a * b + b * b ) 1.3 用逻辑表达式表示下列条件 1.i 被j整除 3.1≤x<10 2.n是小于正整数k的偶数 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整除 【解答】 1. i%j == 0 2.(n 8. (year%4 == 0) && (year%100!=0)||(year%400==0) 1.4 阅读下列程序,写出运行结果 1. #include 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; } 【解答】 4 2 0 1 2. #include 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; } 【解答】 x=0 y=0 z=2 f=1 3. #include int a=123; int &ra=a; int pa=&a; cout< 1.5 思考题 1.什么是数据类型?变量的类型定义有什么作用? 【解答】 数据―类型‖是对数据的抽象。类型相同的数据有相同的表示形式、存储格式以及相关的操作。定义一个变量时,计算机根据变量的类型分配存储空间,并以该类型解释存放的数据。 2.普通数据类型变量和指针类型变量的定义、存储和使用方式有何区别?请编写一个程序验证之。 【解答】 变量类型 数据 指针 定义 类型 标识符 类型 * 标识符 存储 数据值 地址值 使用方式 通过名访问即直接访问对变量内容操作 通过指针变量的地址值间址访问对象 验证程序: #include //对普通数据类型变量赋值 //用变量地址值初始化指针变量 /名访问,输出a,b,c的值 int *pa=&a,*pb=&b,*pc=&c; cout<<\"a,b,c= \"<cout<<\"pa,pb,pc= \"< 3.什么是数据对象的引用?对象的引用和对象的指针有什么区别?请用一个验证程序说明之。 【解答】 引用是为数据对象定义别名。引用与指针有以下几点区别: (1)引用名不是内存变量,而指针变量要开辟内存空间。 (2)引用名需要在变量定义与变量名绑定,并且不能重定义;指针变量可以在程序中赋给不同的地址值,改变指向。 (3)程序中用变量名和引用名访问对象的形式和效果一样;指针变量通过间址访问对象。 验证程序: #include cout<<\"a的值:\"<cout<<\"a的地址:\"<<&a< 4.数据对象在C++中有几种不同的访问方式?请编写一个程序验证之。 【解答】 数据对象在C++中的访问方式有:名访问,引用(别名)访问,间址访问。 验证程序: #include //引用访问,输出变量a的值 } 5.为了约束对数据对象的值进行只读操作,C++采用什么方式?请进行简要归纳。 【解答】 约束数据对象只读形式如下: 约束对象 标识常量 指针常量 指向常量的指针 指向常量的指针常量 常引用 说明形式 const 类型 常量标识符=常量表达式; 类型 * const 指针; const 类型 * 指针; 或者 类型 const * 指针; const 类型 * const 指针; 或者 类型 const * const 指针; const 类型 & 引用名 = 对象名; 6.什么是表达式?表达式值的类型由什么因素决定?使用不同运算符连接以下3个变量,请写出5个以上获得值为true的表达式。 int a=1, b=2; double x=0.5; 【解答】 表达式是由数据和运算符,按求值规则,表达一个值的式子。 表达式值的类型的决定因素为操作数的类型。 (1)如果运算符左右操作数类型相同,运算结果也是相同类型。 (2)如果运算符左右操作数类型不同,首先把类型较低(存储要求,示数能力较低)的数据转换成类型较高的数据,然后运算。 (3)赋值表达式的类型由被赋值变量的类型决定。当把一个表达式的值赋给一个变量时,系统首先强制把运算值转换成变量的类型,然后执行写操作。 6个值等于true的表达式: (1)b>a && a>x (4)a==(b*x) (2)(a+b)!=x (5)a-b 7.阅读以下程序,分析下面语句序列中每一个字符―‖和―&‖的含义,并写出输出结果。 #include 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=\"<字符―*‖和―&‖的意义见程序中添加的注释。 #include int a=10, b=20; int *p = &a, *q = &b; *p = *p * *q; int & ra = a; ra=a; int * & rt = q; *rt = 30; //―*‖是指针类型说明符,―&‖是引用说明符 //―*‖是间址访问符 //―*‖是指针类型说明符,―&‖是取址运算符 //第1、2、4个―*‖是间址访问符,第3个―*‖算术乘运算符 //―&‖是引用说明符 //输出语句中的―*‖是间址访问符 cout<<\"a=\"<<<\"\\nra=\"< a=200 b=30 *p=200 *q=30 ra=200 *rt=30 1.6 编程题 1.输入一个3位整数,将它反向输出。 【解答】 #include cout << \"please input x:\"; cin >> x; i = x/100; j = x/10 %10; k = x%10; cout << k << j << i << endl; } 2.输入平面上某点横坐标x和纵坐标y,若该点位于图1.11所示的方块区域内,则输出1;否则,输出0。 【解答】 #include double x,y,b; cout << \"please input x,y:\"; cin >> x >> y; b = ( -2<=x ) && ( x<=2 ) && ( -2<=y ) && ( y<=2 ); cout << b << endl; } 3.输入3个整数,求出其中最小数(要求使用条件表达式)。 【解答】 #include int a,b,c,temp,min; cout << \"please input a,b,c:\"; cin >> a >> b >> c; temp = ( a图1.11 方形区域 第2章 程序控制结构 2.1 选择题 1.已知 int i=0, x=1, y=0;,在下列选项中,使i的值变成1的语句是( C )。 (A)if( x&&y ) i++; (B)if( x==y ) i++; (C)if( x||y ) i++; (D)if( !x ) i++; 1x02.设有函数关系为y=0x0,下列选项中,能正确表示上述关系的是( C 1x0(A) y = 1; (B) y = -1; if( x >= 0 ) if( x != 0 ) if( x == 0 ) y = 0; if( x > 0 ) y = 1; else y = -1; else y = 0 (C) if( x <= 0 ) (D) y = -1; if( x < 0 ) y = -1; if( x <= 0 ) else y = 0; if( x < 0 ) y = -1; else y = 1; else y = 0; 3.假设i=2,执行下列语句后i的值为( B )。 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 4.已知int i=0,x=0;,在下面while语句执行时循环次数为( D )。 while( !x && i< 3 ) { x++; i++; } (A)4 (B)3 (C)2 (D)1 5.已知int i=3;,在下面do_while 语句执行时的循环次数为( B )。 do{ i--; cout<(B)2 (C)3 (D)无限 6.下面for语句执行时的循环次数为( B )。 int i, j; for ( i=0, j=5;i=j; ) { cout<(C)10 (D)无限 7.以下程序段形成死循环的是( B )。 (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 -- ); 2.2 阅读下列程序,写出运行结果 1. #include 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; } 【解答】 20 2. #include int a = 0, b = 1; switch( a ) { case 0: switch( b ) { case 0 : cout<<\"a=\"<a++; b++; cout<<\"a=\"<} 【解答】 a= 0 b= 1 a= 1 b= 2 3. #include using namespace std; int main() { int i = 1; while( i<=10 ) { if( ++i % 3 != 1 ) continue; else cout << i << endl; } } 【解答】 4 7 10 4. #include int i = 0, j = 5; do { i++; j--; if ( i>3 ) break; } while ( j>0 ); cout << \"i=\" << i << endl << \"j=\" << j << endl; } 【解答】 i= 4 j= 1 5. #include int i,j; for( i=1, j=5; i #include 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=\"< #include 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; } 【解答】 x= 16 2.3 思考题 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 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\"; } 程序(2) //此程序用switch输出等级对应的分数段 //A->=90,B-(90,80],C-(80,70] ,D-(70,60],,E-<60 #include cout<<\"Enter the grade:\"; cin>>gd; //直到输入有效等级,否则程序不继续运行 while(!((gd>='A' && gd<='E')||(gd>='a' && gd<='e'))) { cout<<\"Invalid grade! Please retry:\"; cin>>gd; } 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\"; //防止意外错误 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 int a,b; cout<<\"a: \"; cin>>a; cout<<\"b: \"; cin>>b; if( a=b ) cout<cout<} 运行程序,输入a的值为4,b的值为9,显示结果如下: a: 4 b: 9 9等于9 【解答】 在if语句的判断表达式(a=b)中,赋值号―=‖应该是逻辑等―==‖。从语法上,C++的if语句把a=b这个赋值表达式视为逻辑表达式,没有编译错误。a=b的值决定于b。若b的输入值不等于0,if语句的判断表达式作为逻辑真(true),否则作为逻辑假(false)。所以,题目中输入b的值虽然不等于a,但表达式a=b为逻辑true,执行了if语句的第1个分支。 2.4 编程题 1.输入某学生成绩,若成绩在85分以上,则输出―very good‖;若成绩在60~85分之间,则输出―good‖;若成绩低于60分,则输出―no good‖。 【解答】 #include double score; } cout << \"please input score:\"; cin >> score; if ( score>=85 ) cout << \"Very good!\" ; else if ( score>=60 ) cout << \"Good!\"; else cout << \"No good!\"; 2.输入3个整数,按从小到大的顺序输出它们的值。 【解答】 #include 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 << '\'<< b << '\' << c << endl; } 3.输入三角形的3条边,判别它们能否形成三角形,若能,则判断是等边、等腰三角形,还是一般三角形。 【解答】 #include 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 ) else cout << \"一般三角形!\" << endl; cout << \"等腰三角形!\" << endl; } else cout << \"不能形成三角形!\" << endl ; } 4.输入百分制成绩,并把它转换成五级分制,转换公式为: A(优秀) 90~100 B(良好) 80~89 C(中等) 70~79 D(合格) 60~69 grade(级别)= 【解答】 #include 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: ; //分号不能省 } 5.编程模拟剪刀、石头和布游戏。游戏规则为:剪刀剪纸,石头砸剪刀,布包石头。玩游戏者从键盘输入s(表示剪刀)或r(表示石头)或p(表示布),要求两个游戏者交替输入,计算机给出输赢的信息。 【解答】 #include 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: ; } 6.输入一个整数,输出该整数的所有素数因子。例如,输入120,输出为2、2、2、3和5。 【解答】 #include int m,i = 2; cout << \"please input m:\"; cin >> m; while( i<=m ) if( m % i == 0 ) { cout << i << \ m = m / i; } else i++; } 7.使用迭代公式xn1(xna/xn)/2(n0,1,2;x0a/2)编程求某一正整数a的平方根。 【解答】 #include 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; } 8.已知x=0, 10, 20, …, 180,求sinx,cosx和tanx的值。 【解答】 #include 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 = i*10*pi/180; using namespace std; y1 = sin( x ); y2 = cos(x); y3 = y1/y2; cout << setw(2) << i << setw(15) << y1 << setw(15) << y2 << setw(15) << y3 << endl; } } 9.在100~200之间找出满足用3除余2,用5除余3和用7除余2的所有整数。 【解答】 #include for( i=100; i<=200; i++ ) { if ( ( i % 3 == 2) && ( i % 5 == 3 ) && ( i % 7 == 2 ) ) cout << i << endl; } } 10.求100~999之间的水仙花数。所谓水仙花数,是指一个3位数,它的每位数字的立方之和等于该数。例如,因为153=1+5+3,所以153为水仙花数。 【解答】 #include int i,a,b,c; for( i=100; i<=999; i++ ) { a = i/100; b = ( i-a*100 ) / 10; c = i - a*100 - b*10; if ( i == a*a*a + b*b*b + c*c*c ) cout << i < 11.求1000以内的所有完数。所谓完数,是指一个数恰好等于它的所有因子之和。例如,因为6=1+2+3,所以6为完数。 【解答】 #include 333{ int i,j,s; for( i=1; i<=1000; i++ ) { s = 0; for( j=1; j12.编写程序显示由符号组成的三角形图案。例如,程序运行后, 屏幕显示: 用户输入: 屏幕显示: 用户输入: 则输出如下图案: 【解答】 #include cout<<\"How many lines ?\\n\"; cin>>n; cout<<\"What character ?\\n\"; 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; } } 13.已知XYZ+YZZ=532,其中X,Y和Z为数字,编写程序求出X,Y和Z的值。 【解答】 #include How many lines ? 5 What character ? int x,y,z,i; for( x=1; x<=9; x++ ) for( y=1; y<=9; y++ ) for( z=0; z<=9; z++ ) { i = 100*x + 10*y + z + 100*y + 10*z + z; if ( i == 532 ) cout<<\"x=\"< 第3章 函数 3.1 选择题 1.以下正确的函数原型为( D )。 (A)f1( int x; int y ); (B)void f1( x, y ); (D)void f1( int, int ); (B)int a = 15; fun2( a3 ); (D)fun2( 256 ); (C)void f1( int x, y ); (A)int a = 21; fun2( a ); 2.有函数原型 void fun2( int );,在下列选项中,不正确的调用是( C )。 (C)int b = 100; fun2( &b ); 3.有函数原型 void fun3( int );,在下列选项中,正确的调用是( C )。 (A)double x = 2.17; fun3( &x ); (B)int a = 15; fun3( a3.14 ); (C)int b = 100; fun3( &b ); (A)int a = 2.17; fun4( &a ); (C)int b = 100; fun4( b ); 5.有声明 void fun5( int & ); int a, int p = &a; 在下列选项中,正确的调用是( B )。 (A)fun5(&a); 6.有声明 int fun6( int ); int (pf)(int) = fun6; 在下列选项中,正确的调用是( C )。 (A)int a=15; int n=fun6(&a); (C)cout<<(pf)( 256 ); (B)int a = 15; cout<<(&pf)(a); (D)cout << pf( 256 ); (B)函数不执行任何操作 (D)函数不能修改实际参数的值 (C)局部变量 (D)函数调用 (B)fun5(p); (C)fun5(a); (D)fun5(p); (D)fun3( 256 ); (B)int a = 15; fun4( a3.14 ); (D)fun4( 256 ); 4.有函数原型 void fun4( int & );,在下列选项中,正确的调用是( C )。 7.在VC中,若定义一个函数的返回类型为void,则以下叙述正确的是( C )。 (A)函数返回值需要强类型转换 (C)函数本身没有返回值 (A)全局常量 8.函数参数的默认值不允许为( C )。 (B)直接常量 9.使用重载函数编程序的目的是( A )。 (A)使用相同的函数名调用功能相似的函数 (B)共享程序代码 (C)提高程序的运行速度 (D)节省存储空间 10.在下列的描述中,( B )是错误的。 (A)使用全局变量可以从被调用函数中获取多个操作结果 (B)局部变量可以初始化,若不初始化,则系统默认它的值为0 (C)当函数调用完后,静态局部变量的值不会消失 (D)全局变量若不初始化,则系统默认它的值为0 11.在下列选项中,( C )具有文件作用域。 (A)语句标号 (B)局部变量 (C)全局变量 (D)静态变量 3.2 阅读下列程序,写出运行结果 1. #include 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 ); } 【解答】 3 4 5 2. #include 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<10 15 20 30 10 11 12 4 12 12 3 4 3. #include int x, y, z; func( 5, 6, &x ); func( 7, x, &y ); func( x, y, &z ); cout << x << \} void func( int a, int b, int c ) { b += a; c = b - a; } 【解答】 6, 6, 6 4. #include int x=0, y=1, z=2; func( 1, 2, x ); func( x + y, y, y ); func( z, x + y, z ); cout << x << \} void func( int a, int b, int &c ) { b += a; c = b - a; } 【解答】 2, 1, 3 5. #include { 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; } 【解答】 *t1=20,*t2=25,*rt=20 *p=20,*q=25 6. #include 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; } 【解答】 15 7. #include int f; if( n == 1 ) f = 10; else f = age( n-1 ) + 2; return f; } int main() { cout << \"age : \" << age( 5 ) << endl; } 【解答】 age:18 8. #include 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; } 【解答】 12 4 9. #include int m = 1, n = 2, f; f = sub( m, n ); cout << a << '\' << f << endl; f = sub( m, n ); cout << a << '\' << f << endl; } int sub( int c, int d ) { static int m = 2, n = 5; cout << m << '\' << n << '\' << endl; a = ++ a; c = m ++; d = n ++; return c + d; } 【解答】 2 2 3 3 5 7 6 9 3.3 思考题 1.函数的作用是什么?如何定义函数?什么是函数原型? 【解答】 函数的两个重要作用: (1)任务划分,把一个复杂任务划分为若干小任务,便于分工处理和验证程序正确性;(2)软件重用,把一些功能相同或相近的程序段,独立编写成函数,让应用程序随时调用,而不需要编写雷同的代码。 函数的定义形式: 类型 函数名 ( [ 形式参数表 ] ) { 语句序列 } 函数原型是函数声明,告诉编译器函数的接口信息:函数名、返回数据类型、接收的参数个数、参数类型和参数顺序,编译器根据函数原型检查函数调用的正确性。 2.什么是函数值的返回类型?什么是函数的类型?如何通过指向函数的指针调用一个已经定义的函数?编写一个验证程序进行说明。 【解答】 (1)函数的返回类型是函数返回的表达式的值得类型; (2)函数类型是指函数的接口,包括函数的参数定义和返回类型; (3)若有 或 functionType functionName; //functionType是已经定义的函数类型 functionType *functionPointer=functionName; (*functionPointer)(argumentList); functionPointer(argumentList); //定义函数指针并获取函数地址 则可以通过函数指针调用函数: 其中argumentList是实际参数表。 验证程序: #include typedef int myfunc(int,int); myfunc f,*fp; int a=10,b=6; fp=f; cout<<\"Using f(a):\"< cout<<\"Using fp(a):\"< 3. 什么是形式参数?什么是实际参数?C++函数参数有什么不同的传递方式?编写一个验证程序进行说明。 【解答】 参数是调用函数与被调用函数之间交换数据的通道。函数定义首部的参数称为形式参数,调用函数时使用的参数称为实际参数。C++有三种参数传递机制:值传递(值调用);指针传递(地址调用);引用传递(引用调用)。 验证程序: #include funcA(a);cout<<\"a=\"<a=1 a=21 a=51 //传值参数,实际参数值不变 //指针参数,形式参数通过间址修改实际参数 //引用参数,形式参数通过别名方式修改实际参数 cout<<\"Using (*fp)(a):\"<<(*fp)(a,b)< 【解答】 C++首先计算表达式的值,然后把该值赋给函数返回类型的匿名对象,通过这个对象,把数值带回调用点,继续执行后续代码。 当函数返回指针类型时,返回的地址值所指对象不能是局部变量。因为局部变量在函数运行结束后会被销毁,返回这个指针是毫无意义的。 返回引用的对象不能是局部变量,也不能返回表达式。算术表达式的值被储存在匿名空间中,函数运行结束后会被销毁,返回这个变量的引用也是无意义的。 5.变量的生存期和变量作用域有什么区别?请举例说明。 【解答】 变量的生存期是指程序运行后,变量占有内存的时间;变量作用域指的是指变量声明之后,在程序正文中有效的那部分区域。 例如,定义函数: void count() { static int n=0; //…… } 该函数中n被定义为static变量,生存期是整个程序运行时期;但作用域只在count函数中。 6.静态局部变量有什么特点?编写一个应用程序,说明静态局部变量的作用。 【解答】 静态局部变量的生存期是全程的,作用域是局部的。程序开始执行时就分配和初始化存储空间(默认初始化值为0)。定义静态局部变量的函数退出时,系统保持其存储空间和数值。下次调用这个函数时,static变量还是上次退出函数时的值。直至整个程序运行结束,系统才收回存储空间。 程序略。 7.在一个语句块中能否访问一个外层的同名局部变量?能否访问一个同名的全局变量? 如果可以,应该如何访问?编写一个验证程序进行说明。 【解答】 一个语句块中不能访问外层的同名局部变量。可以访问一个同名的全局变量。 验证程序: #include int a=1; { int a=2; } cout<<\"Main a is \"<8.有函数原型 //输出外层局部变量a cout<<\"Global a is \"<<::a< //输出内层局部变量a cout<<\"Local a is \"<//外层局部变量a //全局变量a 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 int a = 1 ; f( a ); cout<<\"a=\"<void f ( int&n ) { a++; n++; } 产生编译错误:error C2065: ―a‖: 未声明的标识符 9.有以下程序: #include int a=1; else int a=0; cout<<\"a=\"<} 编译错误为:error C2065: 'a' : undeclared identifier,指示语句行 cout<<\"a=\"<变量a没有定义。请分析原因,并进行修改。 【解答】 //错误,直接使用a //正确 if-else语句中分别出现变量a的说明语句,是作用域为if分支和else分支的两个变量。在if-else语句之后,这两个变量都是没有定义的,因此出现编译错误。正确的程序是: #include cout<<\"a=\"<10.有函数原型 double function(int,double); 函数function的返回值类型是什么?函数的类型是什么?使用typedef定义函数的类型。 有函数调用语句 x=function(10,(2 (0.314+5)); 其中的括号―()‖与函数原型中括号有什么语义区别? 【解答】 函数function的返回值类型是double 函数类型是: double (int,double) 可以定义为: 表达式运算。 11.请分析以下各语句的意义。 int fun(); int (pf)(); fun(); pf = fun; pf(); 【解答】 int * fun() ; int * (*pf)(); fun() ; pf = fun ; pf() ; //函数原型声明。fun是返回int*类型,没有参数的函数 //声明指针变量。pf是指向函数的指针,函数类型为int*() //调用函数语句 //向指针变量赋值。函数指针pf指向函数fun //用指针变量间址调用函数 typedef double funType (int,double); 函数调用function(10,(2*(0.314+5)) 中,外层括号表示调用函数匹配的实际参数表,里面的两层括号是 3.4 编程题 sh(1xsh)etet1.已知 y,其中,sh为双曲正弦函数,即sh(t)。编写一个程序,输入x的 sh2xshx32值,求y的值。 【解答】 #include using namespace std; double sh( double t ); int main() { double x,y; cout << \"x=\"; cin >> x; y = sh( 1+sh(x) )/( sh( 2*x )+sh( 3*x ) ); cout << \"y=\" << y << endl; } double sh( double t ) { return ( exp( t )-exp( -t ) )/2; } 2.输入m、n和p的值,求s = 【解答】 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; 12m13231525p5n3的值。注意判断运算中的溢出。 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 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=\" < double u,v; if ( x>y ) { u = x; v = y; } else { u = y; v = x; }; if ( z>u ) u = z; if ( z 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 4.用线性同余法生成随机数序列的公式为: rk = ( multiplier × rk1 + increment ) % modulus 序列中的每一个数rk都可以由它的前一个数rk1计算出来。例如,如果有: rk = ( 25 173 × rk1 + 13 849 ) % 65 536 则可以产生65 536个各不相同的整型随机数。设计一个函数作随机数生成器,生成1位或2位数的随机数。 利用这个随机数生成器,编写一个小学生学习四则运算的练习程序,要求: 可以进行难度选择,一级难度只用1位数,二级难度用2位数; 可以选择运算类型,包括加、减、乘、除等; 可以给出错误提示; 可以统计成绩。 【解答】 #include 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 ( aif ( 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 } 5.已知勒让德多项式为: 1p)n(xx((2n1)pn1(x)(n1)pn2(x))/n编写程序,从键盘输入x和n的值,使用递归函数求pn(x)的值。 【解答】 #include cout << \"please input x and n:\"; cin >> x >> n; cout << \"p(\" << x << \} 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; n0n1n1 } } 6.把以下程序中的print()函数改写为等价的递归函数。 #include for( int i = 1; i <= w; i ++ ) { for( int j = 1; j <= i; j ++ ) cout << i << \" \"; cout << endl; } } int main() { print( 5 ); } 程序运行结果: 1 2 2 3 3 3 4 4 4 4 5 5 5 5 5 【解答】 #include void main() { print( 5 ); { print( w-1 ); for( i=1; i<=w; i++ ) cout << w << \" \"; cout << endl; } } n1h(f(a)f(b))hf(aih),其中,h = ( ba ) / n,n为积7.已知用梯形法求积分的公式为:Tn2i1分区间的等分数,编程求如下积分的值。要求:把求积分公式编写成一个函数,并使用函数指针作为形式 参数。调用该函数时,给出不同的被积函数作为实际参数求不同的积分。 ① 01x2dx ② 1#include 1421xdx ③ 22sinxdx0 【解答】 #include return 4 / ( 1 + x*x ); } double f2( double x ) { return sqrt( 1 + x*x ); } 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.编写一个程序,包含三个重载的display函数和一个主函数。要求:第一个函数输出double值,前面用字符串―a double:‖引导;第二个函数输出一个int值,前面用字符串―a int:‖引导;第三个函数输出一个char字符值,前面用字符串―a char:‖引导;在主函数中,分别用double、int和char型变量作为实参调用display函数。 【解答】 #include { 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 ); } 9.使用重载函数编程序分别把两个数和三个数从大到小排列。 【解答】 #include sort( 5.6, 79 ); sort( 0.5, 30.8, 5.9 ); } void sort(double x,double y) { if ( x>y ) cout << x << '\' << y << endl; else cout << y << '\' << x << endl; } void sort( double x,double y,double z ) { double t; if( y n10.给定求组合数公式为:Cmm!n,编一程序,输入m和n的值,求Cm的值。注意优化算 n!(mn)!法,降低溢出可能。要求:主函数调用以下函数求组合数: int Fabricate( int m, int n ); Fabricate函数内需调用Multi函数: int Multi( int m, int n ); 和Multi函数的定义。 【解答】 n 分析计算公式Cm n//返回Cm的值 // 返回 m(m1)…n 程序由4个文件组成。头文件用于存放函数原型,作为调用接口;其他3个cpp文件分别是main、Fabricate m!得到: n!(mn)!m!/(n!*(m-n)!)=(m*(m-1)*…*(m-n+1)*(m-n)!)/ (n!*(m-n)!) =(m*(m-1)*…*(m-n+1)/ (n!) 因此可以避免求较大数据m的阶乘,减少溢出的可能性。 //Fabricate.h #ifndef FABRICATE_H #define FABRICATE_H int Fabricate( int m,int n ); int Multi( int m, int n ); #endif //main.cpp #include cout << \"input m and n:\"; cin >> m >> n; cout << \"Fabricate(\" << m << \} //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.以下对一维数组 a 的定义正确的是( C )。 (A)int n = 5, a[n]; (B)int a(5); (D)int n; cin>>n; int a[n]; (B)int a[] = { 0, 1, 2 }; (C)const int N = 5; int a[N]; (A)int a[3] = { 0, 1, 2, 3 }; 2.下列数组定义语句中,不合法的是( A )。 (C)int a[3] = { 0, 1, 2 }; (D)int a[3] = { 0 }; 3.已知 int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, p = a;,不能表示数组 a 中元素的式子是( C )。 ..(A)a (B)p (B)(++p) (C)a (D)a[ pa ] 4.已知 int a[] = { 0,2,4,6,8,10 }, p = a+1; 其值等于0的表达式是( D )。 (A) (p++) (C)(p) (D)(p) 5.以下不能对二维数组a进行正确初始化的语句是( C )。 (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 }; 6.已知int a[][3] = { { 0, 1 }, { 2, 3, 4 }, { 5, 6 }, { 7 } }; 则 a[2][1]的值是( C )。 (A)0 (B)2 (C)6 (D)7 7.已知int a[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 不能表示数组元素a[2][1]的地址是( B )。 (A)&a[2][1] (A)t (B)(a[2]+1) (C)a[2]+1 (B)一个地址值 (C)java (D)(a+2)+1 (D)javac++ 8.已知char a[]={ \"fortran\,则 cout<(B)数组的第一个元素值 (D)数组元素的个数 10.设有char s1=\"ABCDE\s2=\"ABCDE\s3=s1;,下列表达式中值等于true的是( D )。 (A)strcmp(s1,s2) (B)strcmp(s1,s3)==1 (C)strcmp(s2,s3)==-1(D)strcmp(s1,s3) ==0 11.设char s1, s2;分别指向两个字符串,可以判断字符串s1和s2是否相等的表达式为( D )。 (A)s1=s2 (B)strlen(s1,s2) (D)strcmp(s1,s2)==0 (B)strcmp(s1,s2)==0 (D)strcmp(s2,s1)>0 (C)strcpy(s1,s2)==0 (A)strcmp(s1,s2)<0 (C)strcmp(s1,s2)>0 12.设char s1, s2;分别指向两个字符串,可以判断字符串s1是否大于字符串s2的表达式为( C )。 4.2 阅读下列程序,写出运行结果 1. #include 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 << '\' << \"average = \" << average << endl; } 【解答】 conut = 5 average = 5 2.} 【解答】 s= 7 7.