C++复印练习答案解析(阶段测试一和二的答案).doc_第1页
C++复印练习答案解析(阶段测试一和二的答案).doc_第2页
C++复印练习答案解析(阶段测试一和二的答案).doc_第3页
C++复印练习答案解析(阶段测试一和二的答案).doc_第4页
C++复印练习答案解析(阶段测试一和二的答案).doc_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C+复印练习详细答案解析时间:2016年4月11日阶段测试11、选B A选项:OxFF 是十六进制数,其中Ox表示的是十六进制的意思,该数字是c语言常量 B选项:1.2e0.5 是科学记数法,但是在c语言中要正确要求e的后边必须是整数,所以B选项错误,并且e的前边必须有数字,像 e7 这种表示方法是错误的 C选项:2L是c语言中的常量,其中L代表的是2属于long型的数值 D选项:72 是字符型常量的一种特殊情况,是根据其中的ASCII码来对应的 拓展总结:C语言中的常量总结常亮:在程序运行过程中,值不会改变的量称为常量。我们知道变量有什么整形,实型,字符型那常量有哪些类别,这些常量是什么形式的、长什么样的呢?总的来说,常量有一下几种类别:一.整型常量,也就是整常数。二.实型常量。三.字符型常量。四.字符串常量,注意字符串常量和字符型常量是不一样的。一.整型常量整型常量可以用三种样子:1.十进制整数。如356,-120,0。2.八进制整数。八进制形式的常量都以0开头,如0123,也就是十进制的83;-011,也就是十进制的-9。3.十六进制整数。十六进制的常量都是以0x开头,如0x123,就是十进制的291。4.等等其他进制数二.实型常量实型常量有两种样子:1.十进制小数形式。注意:0.0也是实型常量。2.指数形式。 比如123000,用科学计数法表示为1.2310的5次方,用C语言表示就是1.23e5或1.23E5,注意e或E前面必须要有数字,而且e或E后面的数字一定要是整数。三.字符型常量字符型常量都是用括起来的,其表现形式可以有两种:1.一般形式。一个字符用括起来,注意只能有一个字符。2.特殊形式。特殊形式都是以开头,它们在屏幕上不会直接显示出来,而是根据其特定的功能来显示的,这些特殊字符常量有:n 换行,相当于敲一下回车。t 跳到下一个tab位置,相当于按一下键盘上的tab键。b 退格,相当于按一下backspace。r 使光标回到本行开头。f 换页,光标移到到下页开头。 输出字符,也就是在屏幕上显示一个字符。 输出字符,也就是在屏幕上显示一个字符。 输出字符,也就是在屏幕上显示一个字符。ddd 1位到3位八进制数表示的字符。 例如:使用376,则在屏幕上显示一个黑色的方块。 xhh 1位到2位十六进制数表示的字符。注意x不能丢了。四.字符串常量字符串常量与字符常量不同的地方是,字符串常量是用把字符串括起来,所以a和a是不一样的,而且系统会在字符串常量的末尾自动加一个字符串结束标志(0)。2、选D A选项:VAR 不是c语言中的关键字,A错 B选项:cher不是c语言中的关键字,注区别于char,char是字符型,是c语言中的关键字,B错 C选项:integer是一个类(类后边会讲),不是c语言中的关键字,C错 D选项:是c语言中的关键字,多出现于switch语句中,表示缺省、默认的意思 拓展总结: C语言中的关键字总共有32个:auto :声明自动变量 short :声明短整型变量或函数 int: 声明整型变量或函数long :声明长整型变量或函数 float:声明浮点型变量或函数 double :声明双精度变量或函数 char :声明字符型变量或函数 struct:声明结构体变量或函数 union:声明共用数据类型 enum :声明枚举类型 typedef:用以给数据类型取别名 const :声明只读变量 unsigned:声明无符号类型变量或函数 signed:声明有符号类型变量或函数 extern:声明变量是在其他文件正声明 register:声明寄存器变量 static :声明静态变量 volatile:说明变量在程序执行中可被隐含地改变 void :声明函数无返回值或无参数,声明无类型指针 if:条件语句 else :条件语句否定分支(与 if 连用) switch :用于开关语句 case:开关语句分支 for:一种循环语句 do :循环语句的循环体 while :循环语句的循环条件 goto:无条件跳转语句 continue:结束当前循环,开始下一轮循环 break:跳出当前循环 default:开关语句中的“其他”分支 sizeof:计算数据类型长度 return :子程序返回语句(可以带参数,也可不带参数)循环条件 3、选A 对于这道题,首先要明白 *(乘) /(除) 的优先级一样,并且自左而右结合 A选项:x/y*z 等价于 (x/y)*z 与题目不符 B选项:可以表示 C选项:可以表示 D选项:x/y/z 等价于 (x/y)/z 可以表示注意:要求对各个运算符的优先级以及结合方向熟悉4、选C 本题表达式 a+=a-=a*a 是进行两次对a赋值,表达式等价于: a+=(a-=(a*a) 也等价于以下分句: int a = 3; a-=a*a; (等价于a = a-(a*a) a += a (等价于a = a + a) 即先算a-a*a即3-3*3 = (-6),再将最终结果赋给a,因此此时a等于-6。 再在a等于-6的基础上再算a=a+a即最终a=(-6)+(-6) 得-12 因此选C 5、选C 本题要注意的是c语言中规定运算最少的法则,即不做没有用的运算 也就是说对于 逻辑或 和 逻辑与 运算来讲,需要看左边表达式的真假再来判断右边表达式是否执行 对于逻辑或(|)运算来说,当|左边的表达式为真时,|右边的表达式就不再执行,否则一定执行右边的表达式 对于逻辑与(&)运算来说,当&左边的表达式为假时,|右边的表达式就不再执行,否则一定执行右边的表达式 本题中 x=y=3; t=+x|+y; 首先系统先执行 x=y=3; 语句,接着自左往右执行 t=+x|+y; 系统发现 +x 值为 4,是真(非零即真),并且 是逻辑或的判断运算,所以 | 右边的 +y 就不再执行,直接跳过,因此y的值并没有改变,依然是3 因此选C 6、选B 自增分成两种:前缀自增和后缀自增 前缀自增: 类似 +n 这种将符号放在变量名的前边,这时候运行的是先对n自加,再执行表达式 例如:int n = 9;if (+n10); 是先给n加上1,此时n等于10;再执行表达式做判断,也就是 n = 10 10 不成立 后缀自增: 类似 n+ 这种将符号放在变量名的后边,这时候先运行表达式,整个表达式运行完之后n再自加1 也就是说在这整个语句没有运行完之前,n 还是原来的值,并没有自增加1 例如:(本题就是这种情况)int n = 9;if (n+10); 是先判断 n = 9 10; 等整个表达式执行完之后n再自加1,也就是说在if语句下边只有出现n,那么n的值就是 10 7、选D A选项:第一行switch(a+b); 中的分号错误,此处不能有分号,A错 B选项:含有两个 case 3:错,B错 C选项:switch a 中 a 没有用括号括起来,C错 D选项:正确,default 语句可以放在花括号中的任何位置8、选A while 循环语句中的判断表达式为真,就执行循环体,否则退出循环 本题的 while (k=1); 语句中的判断表达式 k = 1 是将1赋给k,k的值为1,判断表达式永远为真,循环就会一直执行,因此程序会陷入死循环 如果将本题的程序中的 k = 1 改成 k = 1,那么程序还是会陷入死循环,因为程序中的循环体是 k+ ,没有能够改变判断表达式的条件如果将本题的程序中的 k = 1 改成 k = 1,并且将 k+ 改成 k-,那么程序就会执行一次之后终止9、选B 本题程序的功能是求-1到5的和,结果是 -1 + 1 + 2 + 3 + 4 + 5 = 14 注意sum 的初始值是 -1 而不是 0 10、选C 分析见以下注释部分# include using namespace std;void main()int x = 3;docout (x=-2) endl;while (!(-x); /当执行到该语句时,x的值先自减等于-3,再判断while中的表达式,根据非零即真, / 是零为假来判断是否执行循环体,-3不是零,所以(-x)为真,!(-x)为假, / 即判断表达式为假循环终止 /如果将!号去掉,将陷入死循环11、2,1 本题属于简单的赋值运算题,注意的请看注释# include using namespace std;void main()int a = 1, b = 2;a = a + b; /执行完该语句后 a 的值为 3b = a - b; / 该语句中 a 的值为3,b的值为2,执行完该语句后b的值为1a = a - b; / 该语句中 = 号右边的 a 的值为3,b的值为1,执行完该语句后 a 的值为2cout a , b endl; /该语句中,也可以写成 , , 另外输出a和b时按照最后a和b的值输出的12、6.6 # include using namespace std;void main()int a = 9, b = 2; /定义两个整型变量a和b,并且初始化 float x = , y = 1.1, z; /定义三个浮点型变量x,y,z,并且将x和y初始化z = a/2 + b*x/y + 1/2; /*1、 整型变量做除法,如果商的实际值含有小数点,也只能保存商的整数部分,而将小数部分去掉a是整型变量,那么a/2的值是4,而不是4.5,同理1/2的值是0;而不是0.52、 b*x/y 等价于 (b*x)/y 如果运算中含有混合运算,那么低级的将自动转向高级的类型,例如b*x/y中b是整型,x和y是浮点型,那么b*x结果是浮点型, 同理b*x/y的结果也是浮点型,所以b*x/y的值为(2x)/1.13、 综合以上,z = a/2 + b*x/y + 1/2 = 4 + (2x)/1.1 + 0 = 16算得 x = 6.6 */cout z (3+5, 6+8) 的值为14 2 (a = 3*5, a*4) 的值为60 3 # include int main(void) int x, y, z; x = y = 1; z = x+, y+, +y; cout x endl y endl z endl; return 0; 以上程序输出的结果为;2 3 1 2、本题程序中的cout (+x, y+) z+2; 其中逗号表达式的值与x无关,只与y有关,y+是后自增,因此逗号表达式 的值为3,z+2的值为3;因此输出33 故选D 15、选D 在C语言表达式中用 | 表示逻辑或 用 & 表示逻辑与 用 ! 表示非 16、选A 解析见注释# include int main(void)int x = 1, a = 0, b = 0;switch (x) /第7行 执行完这一条语句之后直接跳到第11行执行case1语句,并从case1开始一直执行到 /return 0; 结束程序case 0:b+;/该语句不会被执行case 1:a+; / 第11行case 2: a+;b+;cout a= a , b= b endl;return 0; 最终a+被执行两次,一次在case1中执行,另一次在case2中执行b+被执行1次,在case2中执行因此最后的结果是: a = 2,b = 1故选A 17、选C 解析见注释# include using namespace std;void main()float x = 2.0, y; /定义浮点型变量if (x0.0) /x = 2.0 不小 0.0 因此不执行该if语句的y = 0.0;语句y = 0.0;else if (x10) /x = 2.0 10,成立,执行,并且下边的else语句不再执行y = 1.0/x; / 因此 y = 1.0/2.0 y为浮点型变量,y的值为0.5elsey = 1.0;cout y endl; 18、选C if else 嵌套有一个原则,称作就近原则,就是在没有使用花括号的情况下,如果多个if else出现,那么if 和 else 的匹配问题就要遵循就近原则,就是else和离它最近的if相匹配 因此本题的代码等价于这样写:# include using namespace std;void main()int a = 2, b = -1, c = 2;if (ab)if (b0)c = 0;else c+;cout c endl;认为本题的程序等价于一下的程序是错误的:# include using namespace std;void main()int a = 2, b = -1, c = 2;if (ab)if (b0)c = 0;else c+;cout c endl;如果认为是这样,那么就很容易误选成D而导致错误19、选C 本题中执行第一次循环之后,i 的值为1,但是循环体中没有让i的值改变的语句,也就是说i的值从执行循环之后就一直是1,i3也就永远成立,改变的值只是sum的值,所以一直循环,即陷入死循环 故选C 20、选B 见注释# include using namespace std;void main()int x = 23;docout x- 当n = 9,96成立,执行循环体, n- n = 8 输出8 2 n = 8,86成立,执行循环体, n- n = 7 输出7 3 n = 7,76成立,执行循环体, n- n = 6 输出6 4 n = 6,66不成立,退出循环, 因此输出的结果是:876 故选B 22、第一个空;i=9 或 i10 第二个空:j%3 或 j%3!=0 注意: 第一个空不能习惯性地填 i100 或 i=99,因为for循环体当中,有j = i*10 + 6; 将会超出100的范围,显然是错误的 第二个空的功能是将不能被3整除的数直接跳过,直接进行下一趟循环,直到循环终止 23、填 b = i + 1 首先对于b来说,只进行过定义,没有初始化,因此,所填的空一定是关于b的初始化,否则下边c+=b语句就会出错,再结合输出流中的奇数之和时c减去11,这11恰好是循环次数,也就是说循环一次,奇数的和多1,因此所要填的空一定和i相关,因此推出要填 b = i + 1 24、选C 默认情况下,if语句,for语句,while 语句都只能控制一个循环语句,若想要控制多个循环语句,必须用花括号将循环体括起来,形成复合语句。 本题中第二个for语句属于第一个for的循环体,if语句有属于第二个for语句的真语句, m=1;也属于if条件语句的真语句,也就是说从第二个for语句到m=1语句都是第一个for的循环体,但是n+不是任何一个for语句或if条件语句的真语句,即n+是第一个for语句的下一个语句,因此不管第一个for语句、第二个for语句、if语句怎么样执行,都与n+无关,最终n+语句必然执行,因此输出的n一定是1 故选C 阶段测试21、选B 对于本题中的func(expl, exp2),(expl, exp2)中,(expl, exp2)和 (expl, exp2)都是逗号表达式,逗号表达式的 最终值是一个,也就是说(expl, exp2)和 (expl, exp2)的最终结果是两个值,因此实参是两个! 2、选C 要读懂本题,要了解一下几个内容: 1)、本函数执行的顺序(简称程序流程): 大致地讲,本程序先从main函数入口开始执行程序,就是从 void main()进入程序,再执行int x = 6, y = 7, z = 8, r; 这一句,接下来当然是执行r = func(x-, y+, x+y), z-);这一句,当执行完这一句后,程序不再在主函数中继续往下执行,而是直接跳到被调函数去执行,也就是直接跳去int func(int a, int b) 中去执行,等执行完被调函数后,程序再回到主函数中接着执行,也就是说主函数既是函数的入口,也是函数的出口。 2)、自增自减在函数调用中作实参: 自增自减在函数中作实参,如果是前自增,那么在执行完整句表达式之前就已经将自增的值发送到相对应的形参了 举例:# include using namespace std;int func(int a, int b)int c;c = a + b;return c;void main(void) int x = 6, y = 7, r;r = func(-x, -y); /执行完 -x 之前,已经将 (x-1)的值发送给形参a了,即已经将 5 发送给a了 /同样,在执行完-y之前,已经将 (y-1) 的值发送给形参b了,即已经将 6发送给形参b了cout r endl; 因此,本例子最终输出的结果是 11如果是后自增(或者后自减),那么发送给相对应形参的值是自增或自减之前的值,即原来变量的值,执行完整句表达式之后,变量再进行自增或自减 举例:# include using namespace std;int func(int a, int b)int c;c = a + b;return c;void main(void) int x = 6, y = 7, r;r = func(x-, y-);/执行完 x- 之前,已经将x原来的值发送给形参a了,/ 即已经将 6 发送给a了,执行之后x的只变成5/同样,在执行完y-之前,已经将 y 原来的值发送给形参b了,/即已经将 7 发送给形参b了执行完之后y的值变成6cout r endl;因此,本例子输出的结果是:13 3)、逗号表达式的运算: 逗号表达式的运算过程; 从左往右逐个计算表达式,并且逗号表达式作为一个整体,其值为最后一个表达式的值 逗号表达式的优先级: 在所有运算符中的优先级别最低 本题的说明: 运行到 r = func (x-, y+, x+y), z-) 语句时,程序对(x-, y+, x+y)的执行顺序是从左往右执行,即先执行x-,执行完之后,x的值由原来的6变成5,一再执行y+,执行完之后y的值为8,再执行x+y,完了整个逗号表达式的值以x+y的值作为最终值,即(x-, y+, x+y) 的最终值为 (5 + 8)得13,并将13发送给形参a,再将z原来的值8发送给形参b,再执行z-,接下来就是执行剩下的语句,直到程序结束。因此,最终输出的结果是:21 故选C 3、选A 解析见注释以及下边# include using namespace std;double f(int n)int i;double s;s = 1.0;for (i=1; i=n; i+)s += 1.0/i; /注意 1.0/i 得到的结果是浮点型数据 s += 1.0/i等价于s = s+ (1.0/i)return s;void main() int i, m = 3;double a = 0.0;for (i=0; im; i+) /再本程序中 im 等于 i3, 循环作3次a += f(i); /调用f()函数 a += f(i)等价于a = a + f(i)cout i = 0 im 成立 a = a + f(i) 之后函数跳到被调函数去执行: i(被调函数的), s = 1.0 n = i(主调函数的i) = 01) i(被调函数的i) = 1 1 i = 1 1m(m为3) 成立 a = a + f(i) 之后函数跳到被调函数去执行: i(被调函数的), s = 1.0 n = i(主调函数的i) = 11) i(被调函数的i) = 1 1=1 成立 循环执行 s = s + 1.0/i = 1.0 + 1.0/1 = 2.0 i(被调函数的i) = 2 2) i = 2 2=1 不成立 循环退出 向主调函数返回 s 即返回2.0 程序的执行回到main函数中a = 1.0 + 2.0 = 3.0(其中2.0这个值是由被调函数第二次返回的)i = 2. .一直如此执行下去,直到程序结束,最终结果是 5.5故选A 4、12 看完并理解以下程序注释,就能推出程序的运行结果# include using namespace std;unsigned fun6(unsigned num) /fun6 是该函数的名,unsigned是说明该函数是无符号整型类型unsigned k = 1;do k *= num%10; /k *= num%10 等价于 k = k*(num%10) %表示取余运算num /= 10; / num /= 10 等价于 num = num / 10 / 表示除法运算while (num); / while (num) 的含义是当num不为零时,执行循环体,为零时退出循环/*do . while 的复习:do 语句序列;while(判断表达式); do . while 循环的执行流程是:先执行 语句序列 ,再对 判断表达式 进行判断,判断表达式 为真,执行语句序列,判断表达式为假,退出循环。*/return k; / 向主调函数即main函数返回k,并结束本函数void main() unsigned n = 26; / unsigned 是整型变量中的一种,整型变量有四种: / 基本整型(int) 短整型(short int) 长整型(long int) 无符号型(unsigned)cout fun6(n) 连定义带赋值: 例如:int x; int * p = &i; 2定义之后再赋值: 例如:int x; int * p; p = &i; A选项:正确,是定义之后再赋值 B选项:错误,指针变量只能存放地址,不能和普通变量相互赋值,也不能将某个数值赋给指针变量 C选项:错误,定义之后再赋值中的指针变量不能带有*号 D选项:错误 6、选B 函数执行到sub(10, 5, &a); 时将 10 发送给形参x,将5发送给形参y,将a的地址发送给指针变量z,之后指针变量z指向变量a单元, void sub(int x, int y, int *z)函数中 *z 等价于 变量a,执行*z = y - x;等价于 a = y - x;所以a变量的值为 -5接下来执行sub(7, a, &b) 将 7 发送给形参x,将a的值即 -5 发送给形参y,将b的地址发送给指针变量z,之后指针变量z指向变量b单元, void sub(int x, int y, int *z)函数中 *z 等价于 变量b,执行*z = y - x;等价于 b = y - x;所以b变量的值为 (-5 - 7)等于 -12再接下来执行sub(a, b, &c) 将 a的值即 -5 发送给形参x,将b的值即 -12 发送给形参y,将c的地址发送给指针变量z,之后指针变量z指向变量c单元, void sub(int x, int y, int *z)函数中 *z 等价于 变量c,执行*z = y - x;等价于 执行 c = y - x;所以b变量的值为 (-12 - (-5)等于 -7 综上所述,程序运行的最终结果是:-5,-12,-7 故选B 7、选C# include using namespace std;void main()int k = 2, m = 4, n = 6, *pk = &k, *pm = &m, *p;/指针变量pk指向k,pm指向m*(p=&n) = *pk * (*pm); /倒数第二个*号是乘号cout n endl; 程序说明: 指针变量pk指向k,pm指向m,因此*pk就是变量k,*pm就是变量m 即 *pm 等价于 m *pk 等价于 k 又因为 p = &n 所以 *(p=&n) 等价于 变量n 所以 *(p=&n) = *pk * (*pm); 等价于 n = k*m; 所以 n = 2 * 4 = 8 所以选C 8、选D 因为 int a = 25; 所以变量a的值为25 又通过执行 prtv(&a) 调用函数,将a的地址发送给形参x,因此指针变量x指向a 又因为 cout +*x; 其中的*x等价于变量a,所以 cout +*x; 等价于 cout 在计算机中,任何一个存储单元都是有地址的,普通存储单元有地址,指针 型存储单元也有地址 2 int * k; 中的变量k称作指向指针的指针,简单地讲,就是变量k是一个 指针变量,并且这个变量k是用来存放另一个指针变量的地址 题目中因为a=&b,所以a存放的是b的地址,也就是说a指向b,而指向指针的指针变量k又存放指针变量a的地址,因此k指向b,因此*k等价于a,*k等价于*a也就等价于a因此 cout *k; 等价于 cout a; 因此输出结果是:100 故选B 10、选C 主函数中的 float x = 2.0, y = 3.0, *px = &x, *py = &y; 中 *px = &x, *py = &y 知道指针变量px指向x,py执行y; 通过函数调用 fun(px, py); 将x的地址,y的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论