《C++程序设计基础(第4版)(上)习题解答2.docx》由会员分享,可在线阅读,更多相关《C++程序设计基础(第4版)(上)习题解答2.docx(138页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C+程序设计基础(第4版)(上)习题与解答第1章基本数据与表达式1.1选择题1 . 个最简单的C+程序,可以只有一个(C)。(A)库函数(B)自定义函数(C) main函数 (D)空函数2 .用C+语言编写的源程序要成为目标程序必须要经过(D)。(A)解释(B)汇编(C)编辑(D)编译3 . CH程序中的简单语句必须以(B)结束。(A)冒号(B)分号(C)空格(D)花括号4 .假设有说明int a=0; double x=5.16;,则在以下语句中,(C)属于编译错误。(A) x=a/x;(B) x=x/a;(C) a=a%x;(D) x=x*a;5 .执行C+程序时出现的“溢出”错误属于(C
2、)错误。(A)编译 (B)连接 (C)运行 (D)逻辑6 .在下列选项中,全部都是CH关键字的选项为(C)。(A) while IF Static(B) break char go(C) sizeof case extern(D) switch float integer7 .按C卄标识符的语法规定,合法的标识符是(A)。(A) _abc(B) new(C) n(D) age8,在C卄语句中,两个标识符之间(A)不能作为C+的分隔符。(A)数字(B) ;(C) :(D) +9 .下列正确的进制整型常量表示是(B)。(A) OaO(B) 015(C) 080(D) 0x1010 .下列错误的十六
3、进制整型常量表示是(C)。(A) 0x11(B) Oxaf(C) Oxg(D) Oxlf11,在下列选项中,全部都合法的浮点型数据的选项为(B)。(B) -le3.515.2e-4(B) 12.34-le+50.1E-12(C) 0.2e-2-12345.e-5(D) 5.0e (1+4)0.18e+212 .在下列选项中,正确的字符常量为(D)。(A) a(B) name(C) a(D) MOI13 .在下列选项中,(D)不能交换变量a和b的值。(B) a=a+b; b=a-b; a=a-b;(D) a=b; b=a;(A) t=b; b=a; a=t;(C) t=a; a=b; b=t;1
4、4 .关于下列语句,叙述错误的是(A)。int i=10, *p=&i;(A) p的值为!0(B) p指向整型变量i(C) *p表示变量i的值(D) p的值是变量i的地址15 .有以下变量说明,下面不正确的赋值语句是(B)。int a=5, b=10, c; int *pl = &a, *p2 = &b;(A) *p2 = b;(B)pl =a;c = *pl *(*p2);(C) p2 = pl;(D)16.有以下变量说明,下面正确的语句是(B)。int a=10, b; int &pa=a, &pb=b;(A) &pb = a;(B) pb = pa;(C)pb =&pa;(D) *pb
5、=叩a;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(B) 3 和 5(C)5和3(D)5和518.在下列运算符屮,(D)优先级最髙。(A) =(B) =19.在下列运算符屮,(D)优先级最低。(A) !(B) &(C)(C) +!=(D)(D) *?:20.已知inti=l,j=2;,则表达式i+j的值为(C)。(A) 1(B) 2(C)3(D)421.已知inti=l,j=2;,则表达式+i+j的值为(D)。(A) 1(B) 2(C)3(D)422.在下列表达
6、式选项中,(C)是正确。(A) +(a+)(B) a+b(C)a+b(D)a+-H-+b23.已知 int i=0,jl,k=2;,则逻辑表达式-j&+k(A) 0(B) 1(C)的值为(B)o2(D)324.执行下列语句后,x的值是(D), y的值是()。int x, y;x=y=l; +x | -H-y;(A)不确定(B) 0(C)1(D)225.设x为整型变量,不能正确表达数学关系lx5的C+逻辑表达式是(A)。(A) lx5(B) x=2|x=3|x=4(C) lx & x5(D) ! (x=5)26 .已知intx=5;执行下列语句后,x的值为(C)。x+=x-=x*x;(A) 25
7、(B) 40(C) -40(D) 2027 .设inta=l, b=2, c=3, d=4;则以下条件表达式的值为(A)。ab?a:cd?c:d(A) 1(B) 2(C) 3(D) 428 .以下逗号表达式的值为(D)。(x=4*5, x*5), x+25(A) 25(B) 20(C) 100(D) 451.2 根据下列数学表达式写出C+算术表达式【解答】1. 1/(1 + 1/(1 + l/(x + y)2. x*(x*(x*(a*x + b) + c) + d) + e3. log( 1 + pow( fabs( ( a + b )/( a - b ), 10)4. sqrt( 1 + 3
8、.14159/2 * cos( 48 * 3.14159/180 )5. l/tan( ( 1 - x*x )/( 1 + x*x)或者 cos( ( 1 - x*x )/( 1 + x*x ) )/sin( ( 1 - x*x )/( 1 + x*x )6. Iogl0(a*a + a*b + b*b)1.3 用逻辑表达式表示下列条件1. i被,整除2. “是小于正整数的偶数3. lr y其中有一个小于z5 . y任一 100,10,并且y210,1006 .坐标点Q,y)落在以(10,20)为圆心,以35为半径的圆内7 .三条边小人和c构成三角形8 .年份Year能被4整除,但不能被100
9、整除,或者能被400整除 【解答】1. i%j = 02. (nk) & (n%2 = 0)3. l=x & x104. xz|y=-100 & y=10 & y=100 )6. sqrt(pow(x-10),2) + pow(y-20),2)c & b+ca & c+ab8. (year%4 = 0) & (year%100!=0)|(year%400=0)1.4阅读下列程序,写出运行结果#includc using namespace std;int main()int a = 1, b = 2;bool x, y;cout(a-H-)+(-H-b) endl;cout a % b end
10、l;x = !ab;y = a & b;cout x endl;cout y endl;【解答】42012.#include using namespace std;int main()(int x,y,z,x = y = z = 1;f = -x | y- & z-H-;cout ”x = H x endl;cout ”y = H y endl;cout z = M z endl;cout nf = f endl;|【解答】x=0y=0z=2f=l3.#include #includeusing namespace std;int main()int a=123;int &ra=a;int
11、*pa=&a;coutsctw( 5 )decasctw( 5 )octrasctw( 5)hcx*pacndl;【解答】123 173 7b1.5思考题1 .什么是数据类型?变量的类型定义有什么作用?【解答】数据类型是对数据的抽象。类型相同的数据有相同的表示形式、存储格式以及相关的操作。定义 个变量时,计算机根据变量的类型分配存储空间,并以该类型解释存放的数据。2 .普通数据类型变量和指针类型变量的定义、存储和使用方式有何区别?请编写个程序验证之。【解答】变量类型定义存储使用方式数据类型标识符数据值通过名访问即直接访问対变量内容操作指针类型”标识符地址值通过指针变量的地址值间址访问对象验证程
12、序:#includeusing namespace std;int main() int a,b,c;coutHa,b,c=cinabc;对普通数据类型变量赋值int *pa=&a,*pb=&b,*pc=&c;用变量地址值初始化指针变量coutHa,b,c= ,aH, ,bu, ,cendl; /名访问,输出a,b,c的值 coutMpa,pb,pc= HpaM, Hpb, Hpcendl; 输出指针变量的地址值 间址访问,输出pa,pb,pc指向的变量的赋值 coutM*pa,#pb,*pc= H*paM, ,*pb, H*pcendl;3 .什么是数据对象的引用?对象的引用和对象的指针有什
13、么区别?请用个验证程序说明之。【解答】引用是为数据对象定义别名。引用与指针有以下几点区别:(1)引用名不是内存变量,而指针变量要开辟内存空间。2)引用名需要在变量定义与变量名绑定,并且不能重定义;指针变量可以在程序中赋给不同的地址 值,改变指向。(3)程序中用变量名和引用名访问对象的形式和效果样:指针变量通过间址访问对象。 验证程序:#includeusing namespace std;int main () int a;cout,a=H;cina;int ra=a;int *pa=&a;coutMa 的值:Haendl;couta 的地址:&aendl;coutra 的值:raendl;c
14、outra 的地址:&raendl;coutpa所指向的变量的值:*paendl;coutpa 的地址:paendl;I4 .数据对象在C+中有儿种不同的访问方式?请编写一个程序验证之。【解答】数据对象在C+中的访问方式有:名访问,引用(别名)访问,问址访问。 验证程序:#includeusing namespace std; int main() int a;coutHa=,*;cina;a=a+5;名访问cout&aendl;输出变量地址cout*(&a)endl;地址访问,输出变量值int *pa=&a;说明指针变量,指向变量acout*paendl;间址访问,输出变量值int &ra=
15、a;/ra是a的引用coutraendl;引用访问,输出变量a的值5.为了约束对数据对象的值进行只读操作,C+采用什么方式?请进行简要归纳。【解答】约束数据对象只读形式如下:约束对象说明形式标识常量const类型常量标识符=常量表达式;指针常量类型 const指针;指向常量的指针const类型指针;或者类型const 指针;指向常量的指针常量const类型* const指针;或者类型const const指针;常引用const类型&引用名=対象名;6.什么是表达式?表达式值的类型由什么因素决定?使用不同运算符连接以下3个变量,请写出5 个以上获得值为true的表达式。int a=l, b=2;
16、 double x=0.5;【解答】发达式是由数据和运算符,按求值规则,表达个值的式子。表达式值的类型的决定因素为操作数的类型。(1)如果运算符左右操作数类型相同,运算结果也是相同类型。(2)如果运算符左右操作数类型不同,首先把类型较低(存储要求,示数能力较低)的数据转换成类 型较高的数据,然后运算。(3)赋值表达式的类型由被赋值变量的类型决定。当把一个表达式的值赋给个变量时,系统首先强 制把运算值转换成变量的类型,然后执行写操作。6个值等于true的表达式:(1) ba& ax(2) (a+b)!=x(3) a|(b+x)(4) a=(b*x)(5) a-bx(6) (a/x=b)7.阅读以
17、下程序,分析下面语句序列中每个字符“*和“&”的含义,并写出输出结果。#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=,aunb=,b,n*p=,*p,n*q=,*q Hnra=,ra,n*rt=,*rtendl;【解答】字符“*”和“&”的意义见程序中添加的注释。#include using namespace std;int main()(int a=10, b=20;int
18、*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,n*p=,#p,n*q=,*q ,nra=,ran*rt=M*rtendl;程序输出结果为:a=200b=30*p=200q=30ra=200*rt=301.6编程题1.输入一个3位整数,将它反向输出。【解答】#include using
19、 namespace std; int main() int cout please input x:; cin x; i = x/IOO; j=x/10%10; k = x%10; cout k j i endl;|2.输入平面上某点横坐标x和纵坐标y,若该点位于图1.11所示的方块区域内,则输出1:否则,输 出00【解答】/include ZJusing namespace std; int main()|.1Fdouble x,y,b;|cout please input x,y:; cin x y;图1.11方形区域b = (-2=x ) & ( x=2 ) & (-2=y) & (
20、y=2 ); cout b endl; ) 3.输入3个整数,求出其中最小数(要求使用条件表达式). 【解答】 #include using namespace std; int main() ( int b,c,temp,min; cout please input a,b,c:; cin a b c; temp = ( ab ) ? a:b; min = (temp= 0 ) if(x = O)y = O; else y = -1;(C) if( x = 0 ) if(xO)y = -l; else y = 0;在下列选项中,使i的值变成1else y = 1;3.假设i=2,执行下列语句
21、后i的值为(B)。(B) iR x=y ) i+;(D) if( !x)i-H-;x0(B) y = -l;ifl; x != 0 )if( x 0 ) y = 1;else y = 0(D) y = -l;if( x = 0 ) if(xO)y = -l; else y = 0;switch( i)case 1 : i -H-;case 2 : i ;case 3 : + i; break;case 4 : i;default: i -H-;(A) 1(B) 2(C) 3(D) 44.已知inti=O, x=0;,在下面while语句执行时循环次数为(D)while( !x & i 3 )
22、x+; i+; (A) 4(B) 3(C) 2(D) 15 .已知inti=3;,在下面do_while语句执行时的循环次数为(B)。doj i; coutiendl;(while ( i!= 1 );(A) 1(B) 2(C) 3(D)无限6 .下面fbr语句执行时的循环次数为(B)。int i,j;fbr( i=0,j=5;i=j;) coutij ndl; i+; j-; (A) 0(B) 5(C) 10(D)无限7 .以下程序段形成死循环的是(B)。(A) int x; fbr( x=0; x=0 );(C) int a=5; whilc( a ) a;(D) int i=3; fbr
23、(; i; i -);2.2阅读下列程序,写出运行结果#includcusing namespace std;int main()int a,b,c,d,x;a = c = 0; b = 1; d = 20;ia)d = d-10;else氓!b).!c)x= 15;else x = 25;cout d endl;【解答】20L#includeusing namespace std;int main()int a = 0, b = 1;switch( a)case 0:switch( b )(case 0 : cout,a=,a,* b=*bendl; break;case 1 : cout,
24、a=,an b=*bendl; break;case 1:a-H-; b+; cout,a=,a,* b=*bendl;【解答】a= 0 b= 1a= 1 b= 2using namespace std;int main()inti= 1;while( i=10)if( +i % 3 != 1 )continue;elsecout i endl;【解答】4710 #includeusing namespace std;int main()inti = 0,j = 5;do(if j 一;if (i3 ) break; while (j0);cout i= i cndl ,j=H j cndl;
25、【解答】i=4j=l#includeusing namespace std;int main()int ij;fbr( i=l,j=5; ij; i+ )j-; )couti,t,j end 1;【解答】33using namespace std; int main()int i, s = 0;fbr( i=0; i5; i-H-) switch( i) |case 0: s += i; break;case 1: s += i; break; case 2: s += i; break;default: s += 2;coutMs=Msend 1;【解答】s= 77.#includc usi
26、ng namespace std;int main()(int i, j, x = 0;fbr( i=0; i=3; i-H-)|X+;for(j=0;j=90,B-(90,80,C-(80,70 ,D-(70,60E-60#includeusing namespace std;int main() char gd;coutHEnter the grade:;cingd;直到输入有效等级,否则程序不继续运行while(!(gd=A, & gd=,a, & gd=90,B-(90,80,C-(80,70 ,D70,60E-60#includeusing namespace std;int mai
27、n() char gd;coutMEnter the grade:;cingd;直到输入有效等级,否则程序不继续运行whilc(!(gd-A1 & gd-a, & gd-e*) coutlnvalid grade! Please retry:;cingd;switch(gd) case A:case a: coutMnScored 90-100!nM;break;case B: case V: coutnnScored 80-89!nH;break;case C: case c:coutwnScored 70-79!n,;break;case *D: case ,d,:cout,nScored
28、 60-69!nn;break;case E: case ,e,:coutnScore under 60!nM;break;default:coutHUnexpect error!n”;防止意外错误2 .什么叫做循环控制?归纳比较C+语言中各种循环控制语句的语法、循环条件和循环结束条件的表 示形式及执行流程。循环控制是在特定的条件下,程序重复执行一些特定动作。语句while语句_语法while(表达式)循环体;循环条件:表达式值为非0(真)循环结束条件:表达式值为0(假)执行流程,h】le语句的执行流程使用场合程序中常用于根据条件执行 操作而不需关心循环次数的情况。先判断形式循环,条件不成立
29、时不进入循环体。do-while 语句do循环体while(表达式);循环条件:表达式值为非0(真)循环结束条件:表达式值为0(假)do_whi 1 e语句执行流程程序中常用于根据条件执行 操作而不需关心循环次数。后判断形式循环,至少执行1 次循环体。般情况,while语句和dowhile语句可以互换使用。fbr语句fbr(表达式1;表达式2;表达式3) 循环体;(1)表达式1称为初始化表达式,不是 循环体执行部分。(2)表达式3称为后置表达式,作为循 环体的最后个执行表达式。(3)循环条件:表达式2值为非。(真)循环结束条件:表达式2值为 (假)1表达式1表达式2二:1 true 循环体表达
30、式3fals 一for语句称为步长循环语句, 通常用于确定循环次数的情况。由于语句的3个表达式均可以 缺省,也可以用于条件循环,即循 环次数不确定的情况。Ior语句的执行流程3 .根据个实际问题,用不同的循环语句编程,分析其优缺点。【解答】略。4 .用if语句和goto语句组织循环,改写上面第3题编写的程序,并分析在什么情况下可以适当使用 goto语句。【解答】在不破坏程序基本流程控制的情况下,可以适当使用goto语句实现从语句结构内部向外的必要跳转, 即按特定条件结束结构语句块的执行。程序略。5 .有以下程序,希望判断两个输入的整数是否相等。程序通过编译,但不能达到预期结果。请分析程 序能够
31、通过CH编译而不能得到期望结果的原因。#includcusing namespace std;int main()(int a,b;coutMa: H; cina;coutHb:cinb;ifl; a=b)coutvva等于vvbv vendl;elsecout av v” 不等于vendl;运行程序,输入a的值为4, b的值为9,显示结果如下:a: 4b:99等于9【解答】在if语句的判断表达式(a=b)中,赋值号”应该是逻辑等。”。从语法上,C卄的if语句把a=b这个 赋值表达式视为逻辑表达式,没有编译错误。a=b的值决定于b。若b的输入值不等于0, if语句的判断表 达式作为逻辑真(tm
32、e),否则作为逻辑假(回se)。所以,题目中输入b的值虽然不等于a,但表达式a=b 为逻辑true,执行了 if语句的第1个分支。2.4编程题1 .输入某学生成绩,若成绩在85分以上,则输出、ery good”;若成绩在6085分之间,则输出“good”; 若成绩低于60分,则输出“no good”。【解答】#includcusing namespace std;int main()double score;cout please input score:,;cin score;if ( score=85 ) cout *Very good!*;else if( score=60 ) cout
33、 Good!*; else cout*No good!;)2 .输入3个整数,按从小到大的顺序输出它们的值。【解答】#includeusing namespace std;int main()int a, b, c, t;cout*a, b, c=;cin a b c;if(ab) t=a; a=b; b=t; if(ac) t=a; a=c; c=t; iRbc) t=b; b=c; c=t; cout a *t* b *t* c endl;)3 .输入三角形的3条边,判别它们能否形成三角形,若能,则判断是等边、等腰三角形,还是一般 三角形。【解答】#includeusing namespa
34、ce 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 ”等边三角形! H endl;else if ( a = b | a = c | b = c)cout ”等腰三角形! ” endl;else cout ”一般三角形!” endl;elsecout ”不能形成三角形! H endl;)4,输入百分制成绩,并把它转换成五级分制,转换公式为:A (优秀)90100,zARE1x B (良好)80-89 grade (级别)
35、=1C (中等)7079D (合格)669【解答】#includeusing namespace std;int main()(double score; char grade;cout ”score=;cin score;if ( score = 0 & score = 100 )(switch (int( score ) /10 )case10:case9:grade -a; break;case8:grade =V; break;case7:grade =七;break;case6:grade=rd; break;case5:case4:case3:case2:case1:case0:g
36、rade=七;break;elsecout vv”数据输入错误! VV endl;goto end;cout grade endl;end:分号不能省5 .编程模拟剪刀、石头和布游戏.游戏规则为:剪刀剪纸,石头砸剪刀,布包石头。玩游戏者从键 盘输入s (表示剪刀)或r (表示石头)或p (表示布),要求两个游戏者交替输入,计算机给出输赢的信息.【解答】#includeusing namespace std;int main()(char first,second;cout First input( s,r or pcin first;cout *Second input( s,r or pci
37、n 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! cndl; goto end;)case r:switch (second)case s: cout Rock crushes scissor. endl; goto end;case r: cout Rock tics rock. cndl; goto end;case *p: cout Rock is wrapped by paper.