C++ prime5th 练习题答案第一章

1,202 阅读9分钟

练习题答案

目录

|——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,然后按EnterReturn键。
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库包括两个基础类型istreamostream,分别表示输入流和输出流。一个流就是一个字符序列,是从IO设备读出或写入设备的。“流”想要表达的是,随着时间的推移,字符是顺序生成或顺序消耗的。cinistream的对象,coutcerrclogostream的对象。

用面向对象的思想来看,类型可以看成就是类类型,即istreamostream是两个类,而cincout等是类的实例对象。

(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

觉得有用的大佬点个赞呗!让我继续坚持做下去。