当前位置: 首页 > news >正文

c primer plus 第五章复习题和练习题

复习题

5.10 复习题 1.假设所有变量的类型都是int,下列各项变量的值是多少:
a.x = (2 + 3) * 6;
b.x = (12 + 6)/23;
c.y = x = (2 + 3)/4;
d.y = 3 + 2
(x = 7/2);

个人回答:
a.30
b.27
c.1
d.9
官方回答:
a.30
b.27(不是3)。(12+6)/(2*3)得3。
c.x = 1,y = 1(整数除法)。
d.x = 3(整数除法),y = 9。
个人评价:

5.10 复习题 2.假设所有变量的类型都是int,下列各项变量的值是多少:
a.x = (int)3.8 + 3.3;
b.x = (2 + 3) * 10.5;
c.x = 3 / 5 * 22.0;
d.x = 22.0 * 3 / 5;

个人回答:
a.6
b.52
c.22 //忘记了3/5就是0
d.13
官方回答:
a.6
b.52
c.0
d.13
个人评价: 粗心

5.10 复习题 3.对下列各表达式求值:
a.30.0 / 4.0 * 5.0;
b.30.0 / (4.0 * 5.0);
c.30 / 4 * 5;
d.30 * 5 / 4;
e.30 / 4.0 * 5;
f.30 / 4 * 5.0;

个人回答:
a.37.5
b.1.5
c.37.5 //忘记是不是浮点数,所以要取整数,回答错误
d.37.5 //忘记是不是浮点数,所以要取整数,回答错误
e.37.5
f.37.5 //忘记是不是浮点数,所以要取整数,回答错误
官方回答:
a.37.5(7.5 * 5.0的结果)
b.1.5(30.0 / 20.0的结果)
c.35(7 * 5的结果)
d.37(150 / 4的结果)
e.37.5(7.5 * 5的结果)
f.35.0(7 * 5.0的结果)
个人评价: 粗心一律当浮点数处理

5.10 复习题 4.请找出下面的程序中的错误。
int main(void)
{
int i = 1,
float n;
printf(“Watch out! Here come a bunch of fractions!\n”);
while (i < 30)
n = 1/i;
printf(" %f", n);
printf(“That’s all, folks!\n”);
return;
}

个人回答:
1.i = 1; 不是逗号
2.while (i < 30);i一直小于30
官方回答:
第0行:应增加一行#include <stdio.h>。
第3行:末尾用分号,而不是逗号。
第6行:while语句创建了一个无限循环。因为i的值始终为1,所以它总
是小于30。推测一下,应该是想写while(i++ < 30)。
第6~8行:这样的缩进布局不能使第7行和第8行组成一个代码块。由于
没有用花括号括起来, while循环只包括第7行,所以要添加花括号。
第7行:因为1和i都是整数,所以当i为1时,除法的结果是1;当i为更大
的数时,除法结果为0。用n = 1.0/i,i在除法运算之前会被转换为浮点数,
这样就能得到非零值。
第8行:在格式化字符串中没有换行符(\n),这导致数字被打印成一
行。
第10行:应该是return 0;
个人评价: 粗心,遗漏了很多

5.10 复习题 5.这是程序清单 5.9 的另一个版本。从表面上看,该程序只使用了一条
scanf()语句,比程序清单5.9简单。请找出不如原版之处。
#include <stdio.h>
#define S_TO_M 60
int main(void)
{
int sec, min, left;
printf(“This program converts seconds to minutes and “);
printf(“seconds.\n”);
printf(“Just enter the number of seconds.\n”);
printf(“Enter 0 to end the program.\n”);
while (sec > 0) {
scanf(”%d”, &sec);
min = sec/S_TO_M;
left = sec % S_TO_M;
printf(“%d sec is %d min, %d sec. \n”, sec, min, left);
printf(“Next input?\n”);
}
printf(“Bye!\n”);
return 0;
}

个人回答:
1.printf函数分成多个来写,不简洁
2.printf(“Next input?\n”);这一行可能导致程序移植运行,无法知道结束条件
官方回答:
这个版本最大的问题是测试条件(sec是否大于0?)和scanf()语句获取sec变量的值之间的关系。具体地说,第一次测试时,程序尚未获得sec的值,用来与0作比较的是正好在sec变量内存位置上的一个垃圾值。一个比较笨拙的方法是初始化 sec(如,初始化为 1)。这样就可通过第一次测试。不过,还有另一个问题。当最后输入0结束程序时,在循环结束之前不会检查sec,所以0也被打印了出来。因此,更好的方法是在while测试之前使用
scanf()语句。可以这样修改:
scanf(“%d”, &sec);
while ( sec > 0 ) {
min = sec/S_TO_M;
left = sec % S_TO_M;
printf(“%d sec is %d min, %d sec.\n”, sec, min, left);
printf(“Next input?\n”);
scanf(“%d”, &sec);
}
while循环第一轮迭代使用的是scanf()在循环外面获取的值。因此,在while循环的末尾还要使用一次scanf()语句。这是处理类似问题的常用方法。
个人评价: 粗心

5.10 复习题 6.下面的程序将打印出什么内容?
#include <stdio.h>
#define FORMAT “%s! C is cool!\n”
int main(void)
{
int num = 10;
printf(FORMAT,FORMAT);
printf(“%d\n”, ++num);
printf(“%d\n”, num++);
printf(“%d\n”, num–);
printf(“%d\n”, num);
return 0;
}

个人回答:
1.
%s! C is cool!
%s! C is cool!
11
11
12
11
2.printf(FORMAT,FORMAT);这一条注意,等价与printf(“%s! C is cool!\n”,“%s! C is cool!\n”),
那么第一个"%s! C is cool!\n"中的%s就替换成%s! C is cool!\n,然后在输出! C is cool!\n,所以不是两个
%s! C is cool!
官方回答:
%s! C is cool!
! C is cool!
11
11
12
11
解释一下。第1个printf()语句与下面的语句相同:
printf(“%s! C is cool!\n”,“%s! C is cool!\n”);
第2个printf()语句首先把num递增为11,然后打印该值。第3个printf()语
句打印num的值(值为11)。第 4个printf()语句打印n当前的值(仍为12),
然后将其递减为11。最后一个printf()语句打印num的当前值(值为11)。
个人评价: printf(“%s! C is cool!\n”,“%s! C is cool!\n”);输出什么要注意

5.10 复习题 7.下面的程序将打印出什么内容?
#include <stdio.h>
int main(void)
{
char c1, c2;
int diff;
float num;
c1 = ‘S’;
c2 = ‘O’;
diff = c1 - c2;
num = diff;
printf(“%c%c%c:%d %3.2f\n”, c1, c2, c1, diff, num);
return 0;
}

个人回答:
1.SOS:4 4.00 %3.2f中的3表示只显示3个字段,小数点不包含在内。
官方回答:
SOS:4 4.00
表达式c1 -c2的值和’S’ - '0’的值相同(其对应的ASCII值是83 - 79)。
个人评价: %3.2f中的3表示只显示3个字段,小数点不包含在内。

5.10 复习题 8.下面的程序将打印出什么内容?
#include <stdio.h>
#define TEN 10
int main(void)
{
int n = 0;
while (n++ < TEN)
printf(“%5d”, n);
printf(“\n”);
return 0;
}

个人回答:

  1. 1   //错误,while没有大括号,只执行最近的一条,所以是横的
    2
    3
    4
    5
    6
    7
    8 
    9
    10
    

官方回答:
把1~10打印在一行,每个数字占5列宽度,然后开始新的一行:
1 2 3 4 5 6 7 8 9 10

个人评价: 粗心

5.10 复习题 9.修改上一个程序,使其可以打印字母a~g。
个人回答:

#include <stdio.h>
#define TEN 7
int main(void)
{
int n = 0;
while (n++ < TEN)
printf("%5c", n+96);
printf("\n");
return 0;
}

官方回答:
#include <stdio.h>
int main(void)
{
char ch = ‘a’;
while (ch <= ‘g’)
printf(“%5c”, ch++);
printf(“\n”);
return 0;
}
个人评价: 官方回答更加简洁

5.10 复习题 10.假设下面是完整程序中的一部分,它们分别打印什么?
a.
int x = 0;
while (++x < 3)
printf(“%4d”, x);
b.
int x = 100;
while (x++ < 103)
printf(“%4d\n”,x);
printf(“%4d\n”,x);
c.
char ch = ‘s’;
while (ch < ‘w’)
{
printf(“%c”, ch);
ch++;
}
printf(“%c\n”,ch);

个人回答:
a. 1 2
b. 100
100
101
101
102
102
103
103
c.输出s到w的字符,不包含w
*官方回答:
下面是每个部分的输出:
a.1 2
注意,先递增x的值再比较。光标仍留在同一行。
b.101
102
103
104
注意,这次x先比较后递增。在示例a和b中,x都是在先递增后打印。另
外还要注意,虽然第2个printf()语句缩进了,但是这并不意味着它是while循
环的一部分。因此,在while循环结束后,才会调用一次该printf()语句。
c.stuvw
该例中,在第1次调用printf()语句后才会递增ch。
*
个人评价: b和c都粗心犯错

**5.10 复习题 11.下面的程序会打印出什么?
#define MESG “COMPUTER BYTES DOG”
#include <stdio.h>
int main(void)
{
int n = 0;
while ( n < 5 )
printf(“%s\n”, MESG);
n++;
printf(“That’s all.\n”);
return 0;
}
**
个人回答:
无限循环打印MESG的字符
官方回答:
这个程序有点问题。while循环没有用花括号把两个缩进的语句括起来,只有printf()是循环的一部分,所以该程序一直重复打印消息
COMPUTER BYTES DOG,直到强行关闭程序为止。
个人评价:

5.10 复习题 12.分别编写一条语句,完成下列各任务(或者说,使其具有以下副作
用):
a.将变量x的值增加10
b.将变量x的值增加1
c.将a与b之和的两倍赋给c
d.将a与b的两倍之和赋给c

个人回答:
a.x=x+10;
b.x+=1;
c.c=2*(a+b);
d.c=a2+b2;
官方回答:
a.x = x + 10;
b.x++; or ++x; or x = x + 1;
c.c = 2 * (a + b);
d.c = a + 2* b;
个人评价: b:方法单调,d:读题错误

5.10 复习题 13.分别编写一条语句,完成下列各任务:
a.将变量x的值减少1
b.将n除以k的余数赋给m
c.q除以b减去a,并将结果赋给p
d.a与b之和除以c与d的乘积,并将结果赋给x

个人回答:
a.x=x-1;
b.m=n%k;
c.p=q/b-a;
d.x=(a+b)/(c*d);
官方回答:
a.x–; or --x; or x = x - 1;
b.m = n % k;
c.p = q / (b - a);
d.x = (a + b) / (c * d);
个人评价: a:方法单调,c:读题错误

练习题

5.10 练习题 1.对编程而言,可移植性意味着什么?
个人回答:
官方回答:
个人评价:
**


文章转载自:

http://WYvJ2pAb.pzjrm.cn
http://oKvYWT5t.pzjrm.cn
http://UXyKYHPd.pzjrm.cn
http://bsnxLhrC.pzjrm.cn
http://F6JXYiWg.pzjrm.cn
http://VzhENPaw.pzjrm.cn
http://nWBMx6U2.pzjrm.cn
http://bD0Rekf0.pzjrm.cn
http://4ea1xXwZ.pzjrm.cn
http://6D5aMFcC.pzjrm.cn
http://FC8mN70D.pzjrm.cn
http://qqqxEloz.pzjrm.cn
http://mVBTiDy9.pzjrm.cn
http://qstiAOSd.pzjrm.cn
http://Q7MgXJam.pzjrm.cn
http://Ng58lmxY.pzjrm.cn
http://eMeVanFh.pzjrm.cn
http://mJlaSYUo.pzjrm.cn
http://onrQXK9j.pzjrm.cn
http://gawUYmpG.pzjrm.cn
http://8zpAYuHc.pzjrm.cn
http://DgSxPxdC.pzjrm.cn
http://FbgGxuiw.pzjrm.cn
http://Gejn7fAK.pzjrm.cn
http://mxyPUn3S.pzjrm.cn
http://MXbewvNk.pzjrm.cn
http://zWuz7Jrc.pzjrm.cn
http://O1k8IAB0.pzjrm.cn
http://GwFRWjOC.pzjrm.cn
http://xf40Lbkz.pzjrm.cn
http://www.dtcms.com/a/377400.html

相关文章:

  • C++设计模式,高级开发,算法原理实战,系统设计与实战(视频教程)
  • Spring 统一功能处理
  • ES6基础入门教程(80问答)
  • 第3讲 机器学习入门指南
  • InnoDB 逻辑存储结构:好似 “小区管理” 得层级结构
  • copyparty 是一款使用单个 Python 文件实现的内网文件共享工具,具有跨平台、低资源占用等特点,适合需要本地化文件管理的场景
  • C# 哈希查找算法实操
  • 一个C#开发的Windows驱动程序管理工具!
  • 环境变量
  • Codeforces Round 1049 (Div. 2)
  • Eclipse下载安装图文教程(非常详细,适合新手)
  • vue2迁移到vite[保姆级教程]
  • 基于webpack的场景解决
  • Vite 中的 import.meta.env 与通用 process.env.NODE_ENV 的区别与最佳实践
  • 除了Webpack,还有哪些构建工具可以实现不同环境使用不同API地址?
  • sklearn聚类
  • I.MX6UL:汇编LED驱动实验
  • 计算机毕设 java 高校机房综合管控系统 基于 SSM+Vue 的高校机房管理平台 Java+MySQL 的设备与预约全流程系统
  • 设计模式-建造者观察者抽象工厂状态
  • 第5讲 机器学习生态构成
  • JAVA秋招面经
  • LVS群集
  • 半导体功率器件IGBT工艺全流程
  • Q3.1 PyQt 中的控件罗列
  • 深入解析ReentrantLock:可重入锁
  • ARM处理器总线架构解析:iCode、D-code与S-Bus
  • Qoder 前端UI/UE升级改造实践:从传统界面到现代化体验的华丽蜕变
  • Flutter多线程
  • 如何在高通跃龙QCS6490 Arm架构上使用Windows 11 IoT企业版?
  • JavaScript 对象说明