练习题答案
目录
|——1.1节练习
|——1.2节练习
|——1.3节练习
|——1.4节练习
|——1.5节练习
|——1.6节练习
1.1节练习
练习1.1:查阅你使用的编译器的文档,确定它所使用的文件命名约定。编译并运行第2页的main程序。
解答:
使用的是g++ 5.4.0。
文件命名约定如下
file.c C源文件
file.h C头文件(预处理文件)
file.i 预处理后的C源文件
file.C C++源文件
file.cc C++源文件
file.cxx C++源文件
file.m Objective-C源文件
file.s 汇编语言文件
file.o 目标文件
a.out 连接的输出文件
编译运行第二页程序后无输出,使用echo $?
输出0。
练习1.2:改写程序,让他返回-1。返回值-1通常被当作程序错误的标识。重新编译并运行你的程序,观察你的系统如何处理main返回的错误标识。
解答:
改写程序后,重新编译后运行无输出,使用echo $?
输出255
1.2节练习
练习1.3:编写程序,在标准输出上打印Hello, World。
解答:
#include <iostream>
int main()
{
std::cout<<"Hello, World";
return 0;
}
练习1.4:我们的程序使用加法运算符+来将两个数相加。编写程序使用乘法运算符*,来打印两个数的积。
解答:
#include <iostream>
int main()
{
std::cout << "Enter two numbers:" << std::endl;
int v1 = 0, v2 = 0;
std::cin >> v1 >> v2;
std::cout << "The product of " << v1 <<" and " << v2
<< " is " << v1 * v2 << std::endl;
return 0;
}
练习1.5:我们将所有输出操作放在一条很长的语句中。重写程序,将每个运算对象的打印操作放在一条独立的语句中。
解答:
#include <iostream>
int main()
{
std::cout << "Enter two numbers:" << std::endl;
int v1 = 0, v2 = 0;
std::cin >> v1 >> v2;
/*
* std::cout << "The product of " << v1 <<" and " << v2
* << " is " << v1 * v2 << std::endl;
*/
std::cout << "The product of ";
std::cout << v1;
std::cout << " and ";
std::cout << v2;
std::cout << " is ";
std::cout << v1 * v2;
std::cout << std::endl;
return 0;
}
练习1.6:解释下面程序片段是否合法。
std::cout << "The sum of " << v1;
<< " and " << v2;
<< " is " << v1 + v2 << std::endl;
如果程序是合法的,它输出什么?如果程序不合法,原因何在?应该如何修正?
解答:
程序不合法。语法错误,原因在于每条语句以分号结束,将v1和v2后面的分号去掉即可。1.3节练习
练习1.7:编译一个包含不正确的嵌套注释的程序,观察编译器返回的错误信息。
解答:
/*
嵌套注释 /* */
*/
int main()
{
return 0;
}
练习1.8:指出下列哪些输出语句是合法的(如果有的话):
std::cout << "/*";
std::cout << "*/";
std::cout << /* "*/" */
std::cout << /* "*/" /* "/*" */;
解答:
预测 实际
std::cout << "/*"; 错 对
std::cout << "*/"; 对 对
std::cout << /* "*/" */; 错 错
std::cout << /* "*/" /* "/*" */; 错 对
第三条语句改写成
// 加两个/*
std::cout << /* */ "*/" /* */;
// 或者增加一个引号
std::cout << /* "*/" */";
1.4.1节练习
练习1.9:编写程序,使用while循环将50到100的整数相加。
解答:
int main()
{
int sum = 0;
int n = 50;
while (n <= 100) {
sum += n;
n++;
}
return 0;
}
练习1.10:除了++运算符将运算对象的值加1之外,还有一个递减运算符(--)实现将值减1。编写程序,使用递减运算符在循环中按递减顺序打印10到0之间的整数。
解答:
#include <iostream>
int main()
{
int n = 10;
while (n >= 0) {
std::cout << n << std::endl;
n--;
}
return 0;
}
练习1.11:编写程序,提示用户输入两个整数,打印这两个整数所指定范围内的所有整数。
解答:
#include <iostream>
int main()
{
int low, high;
std::cout << "Enter two numbers:" << std::endl;
std::cin >> low >> high;
if (low > high) {
int temp = low;
low = high;
high = temp;
}
while (low <= high) {
std::cout << low << std::endl;
low++;
}
return 0;
}
1.4.2节练习
练习1.12:下面的for循环完成了什么功能?sum的终值是多少?
int sum = 0;
for (int i = -100; i <= 100; ++i)
sum += i;
解答:
功能为完成从-100到100的累加和,sum的终值是0。.
练习1.13:使用for循环重做1.4.1节的所有练习。
解答:
// 1.9
int main
{
int sum = 0;
for (int i = 50; i <= 100; ++i) {
sum += i;
}
return 0;
}
// 1.10
#include <iostream>
int main
{
for (int i = 10; i >= 0; --i) {
std::cout << i << std::endl;
}
return 0;
}
// 1.11
#include <iostream>
int main()
{
std::cout << "Enter two numbers:" << std::endl;
int low, high;
std::cin >> low >> high;
if (low > high) {
int temp = low;
low = high;
high = temp;
}
for (; low <= high; ++low) {
std::cout << low << std::endl;
}
return 0;
}
练习1.14:对比for循环和while循环,两种形式的优缺点各是什么?
解答:
练习1.15:编写程序,包含第14页“再探编译”中讨论的常见错误。熟悉编译器生成的错误信息。
1.4.3节练习
练习1.16:编写程序,从cin读取一组数,输出其和。
解答:
#include <iostream>
int main()
{
int num;
int sum = 0;
while (std::cin >> num) { // 检测std::cin的状态
sum += num;
}
std::cout << sum << std::endl;
return 0;
}
从键盘输入文件结束符:
1.在
Windows
中,输入文件结束符的方法为Ctrl+Z
,然后按Enter
或Return
键。
2.在Unix
包括Mac OS X
系统中,文件结束符输入是用Ctrl+D
。
1.4.4节练习
练习1.17:如果输入的所有值都是相等的,本节程序会输出什么?如果没有重复值,输出又会怎样?
解答:
程序正确运行。如图:
注意:如果输入不同的数据,程序立马有输出,如果输入全相同的数据,则需要遇到文件结束符才输出。
练习1.18:编译并运行本节程序,给它输入全相等的值。再次运行程序,输入没有重复的值。
解答:
#include <iostream>
int main()
{
int currVal = 0, val = 0;
if (std::cin >> currVal) {
int cnt = 1;
while (std::cin >> val) {
if (currVal == val) {
cnt++;
} else {
std::cout << currVal << " occurs "
<< cnt << " times" << std::endl;
cnt = 1;
currVal = val;
}
}
std::cout << currVal << " occurs "
<< cnt << " times" << std::endl;
} else {
std::cerr << "No data?!" << std::endl;
return -1;
}
return 0;
}
练习1.19:已完成,1.4.1节练习1.10所编写的代码可以处理这种情况。点击跳转
1.5.1节练习
网站内下面有个
Downloads
可以根据自己使用的编译器下载源码。
练习1.20:在网站www.informit.com/title/03217…上,第1章的代码目录中包含了头文件Sales_item.h
。将它拷贝到你自己的工作目录中。用它编写一个程序,读取一组书籍销售记录,将每条记录打印到标准输出流上。
解答:
使用g++编译需要使用参数 -std=c++11 指定C++标准,否则会报错。
cp [option] source dest
将文件从source复制到dest。
#include <iostream>
#include "Sales_item.h"
int main()
{
Sales_item book;
std::cin >> book;
std::cout << book << std::endl;
return 0;
}
使用文件重定向
通过读取文件进行输入,而非键盘,通过输出到文件而非显示屏上。
$ ./prog < inputfile > outputfile
>
表示重定向标准输出流,如果是文件,它会覆盖原有文件的内容。
>>
也表示重定位标准输出流,不会覆盖原有文件内容而是在原有文件内容后添加新内容。
练习1.21:编写程序,读取两个ISBN相同的Sales_item
对象,输出它们的和。
解答:
#include <iostream>
#include "Sales_item.h"
int main()
{
Sales_item book1, book2;
std::cin >> book1 >> book2;
if (book1.isbn() == book2.isbn()) {
std::cout << book1 + book2 << std::endl;
} else {
std::cerr << "Different ISBN" << std::endl;
}
return 0;
}
练习1.22:编写程序,读取多个具有相同ISBN的销售记录,输出所有记录的和。
解答:
输入必须具有相同的ISBN的销售记录。
#include <iostream>
#include "Sales_item.h"
int main()
{
Sales_item total; // 保存下一条交易记录的变量
// 读入第一条记录,并确保有数据可以处理
if (std::cin >> total) {
Sales_item trans; // 保存和的变量
// 读入并处理剩余交易记录
while (std::cin >> trans) {
total += trans;
}
// 所有记录处理完毕,开始写入
std::cout << total << std::endl;
} else {
// 没有输入!
std::cerr << "No data?!" << std::endl;
return -1; // 表示程序运行失败
}
return 0;
}
1.5.2节练习
练习1.23:编写程序,读取多条销售记录,并统计每个ISBN(每本书)有几条销售记录。
解答:
#include <iostream>
#include "Sales_item.h"
int main()
{
Sales_item total; // 保存下一条交易记录的变量
// 读入第一条记录,并确保有数据可以处理
if (std::cin >> total) {
Sales_item trans; // 保存和的变量
// 读入并处理剩余交易记录
while (std::cin >> trans) {
// 如果我们仍在处理同一ISBN的书
if (total.isbn() == trans.isbn()) {
total += trans; // 更新总销售额
} else {
// 打印前一本书的结果
std::cout << total << std::endl;
total = trans;
}
}
// 所有记录处理完毕,打印最后一本书结果
std::cout << total << std::endl;
} else {
// 没有输入!
std::cerr << "No data?!" << std::endl;
return -1; // 表示程序运行失败
}
return 0;
}
练习1.24:输入表示多个ISBN的多条销售记录来测试上一个程序,每个ISBN程序的记录应该聚在一起。
解答:
input为输入文件,output为输出文件。1.6节练习
练习1.25:借助网站上的Sales_item.h
头文件,编译并运行本节给出的书店程序。
解答:
书店程序和练习1.23 相同,运行结果如练习1.24 。
核心知识点总结
(1)每个C++程序都包含一个或多个函数,其中一个必须命名为main。操作系统通过调用main来运行C++程序。
(2)在大多数系统中,main 的返回值被用来指示状态。返回值为0表明成功,非0的返回值的含义由系统定义,通常用来指出错误类型
(3)类型是程序设计最基本的概念之一。一种类型不仅定义了数据元素的内容,还定义了这类数据上可以进行的运算。
(4)iostream
库包括两个基础类型istream
和ostream
,分别表示输入流和输出流。一个流就是一个字符序列,是从IO设备读出或写入设备的。“流”想要表达的是,随着时间的推移,字符是顺序生成或顺序消耗的。cin
是istream
的对象,cout
和cerr
和clog
是ostream
的对象。
用面向对象的思想来看,类型可以看成就是类类型,即istream
和ostream
是两个类,而cin
和cout
等是类的实例对象。
(5)当使用一个流对象作为条件时,其效果时检测流的状态。如果流是有效的,即流未遇到错误,那么检测成功。当遇到文件结束符(end-of-file),或遇到一个无效输入时,流对象的状态会变为无效。处于无效状态的对象会使条件变为假。
英语术语学习环节
只挑选我认为重要的、常见的!
参数(实参):argument
赋值:assignment
内置类型:built-in-type
类:class
注释:comment
花括号:curly brace
数据结构:data structure
文件结束符:end-of-file(EOF)
表达式:expression
函数:function
初始化:initialize
标准库:standard library
操作符:manipulator
命名空间:namespace
语句:statement
运算符:operator
变量:variable
字符串常量:string literal
刑参:parameter
觉得有用的大佬点个赞呗!让我继续坚持做下去。