C++Primer第五版 习题答案 第一章 开始getting started

练习1.1

查阅你使用的编译器文档,确定它所使用的文件命名约定。编译并运行第2页的main程序。

我使用g++,一般将C++程序命名为.cpp。
g++ -o main main.cpp

$ g++ -o main main.cpp 
$ ls
main  main.cpp

参考:
GCC and File Extensions

练习1.2

改写程序,让它返回-1。返回值-1通常被当作程序错误的标识。重新编译并运行你的程序,观察你的系统如何处理main返回的错误标识。

将返回值改为-1后得到:

$ echo $?
255

参考:
Exit Codes With Special Meanings

练习1.3

编写程序,在标准输出上打印 Hello, World。

#include <iostream>

int main()
{
	std::cout << "Hello,World" << std::endl;

	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 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 ";
    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;

如果程序是合法的,它的输出是什么?如果程序不合法,原因何在?应该如何修正?

非法,修改为:

std::cout << "The sum of " << v1
          << " and " << v2
          << " is " << v1 + v2 << std::endl;

练习1.7

编译一个包含不正确的嵌套注释的程序,观察编译器返回的错误信息。

$ g++ -o ex07 ex07.cpp 
ex07.cpp: In function ‘int main()’:
ex07.cpp:5:3: error: expected primary-expression before ‘/’ token
  */
   ^
ex07.cpp:6:2: error: expected primary-expression before ‘return’
  return 0;
  ^
ex07.cpp:6:2: error: expected ‘;’ before ‘return’

练习1.8

指出下列哪些输出语句是合法的(如果有的话):

std::cout << "/*";
std::cout << "*/";
std::cout << /* "*/" */;
std::cout << /* "*/" /* "/*" */;

预测编译这些语句会产生什么样的结果,实际编译这些语句来验证你的答案(编写一个小程序,每次将上述一条语句作为其主体),改正每个编译错误。

第三行非法,第三行改为:

	std::cout << /* "*/" */";

练习1.9

编写程序,使用while循环将50到100的整数相加。

#include <iostream>

int main()
{
	int i = 50 ,sum = 0;

	while(i <= 100)
	{
		sum += i;
		++i;
	}
	std::cout << sum << std::endl;

	return 0;
}

练习1.10

除了++运算符将运算对象的值增加1之外,还有一个递减运算符(–)实现将值减少1。编写程序,使用递减运算符在循环中按递减顺序打印出10到0之间的整数。

#include <iostream>

int main()
{
        int i = 10;

        while(i >= 0)
        {
                std::cout << i << std::endl;
                --i;
        }

        return 0;
}

练习1.11

编写程序,提示用户输入两个整数,打印出这两个整数所指定的范围内的所有整数。

#include <iostream>

int main()
{
    int small = 0, big = 0;
    std::cout << "please input two integers:";
    std::cin >> small >> big;

    if (small > big) {
        int tmp = small;
        small = big;
        big = tmp;
    }

    while (small <= big) {
        std::cout << small << " ";
        ++small;
    }
    std::cout << std::endl;

    return 0;
}

练习1.12

下面的for循环完成了什么功能?sum的终值是多少?

int sum = 0;
for (int i = -100; i <= 100; ++i)
  sum += i;

求从-100加到100的和,最终值为0。
测试代码如下:

#include <iostream>

int main()
{
    int sum = 0;
    for(int i = -100;i <= 100; i++ )
    {
        sum += i;
        std::cout << i << std::endl;
    }
    std::cout << sum << std::endl;

    return 0;
}

练习1.13

使用for循环重做1.4.1节中的所有练习(第11页)。

Ex1.9:

#include <iostream>

int main()
{
    int sum = 0;
    for (int i = 50; i <= 100; ++i) sum += i;
    std::cout << "the sum is: " << sum << std::endl;

    return 0;
}

Ex1.10:

#include <iostream>

int main()
{
    for (int i = 10; i >= 0; --i)
        std::cout << i << std::endl;
    return 0;
}

Ex1.11:

#include <iostream>

int main()
{
    std::cout << "please input two integers:\n";
    int small = 0, big = 0;
    std::cin >> small >> big;

    if (small > big)
    {
        int tmp = small;
        small = big;
        big = tmp;
    }

    for (int i = small; i != big; ++i)
        std::cout << i << std::endl;

    return 0;
}

练习1.14

对比for循环和while循环,两种形式的优缺点各是什么?

已知迭代次数时,使用for循环比较简洁;不知道迭代次数时使用while。
参考:
A similar question on Stack Overflow

练习1.15

编写程序,包含第14页“再探编译”中讨论的常见错误。熟悉编译器生成的错误信息。

请自行尝试。

练习1.16

编写程序,从cin读取一组数,输出其和。

#include <iostream>

int main()
{
    int sum = 0, value = 0;
    while(std::cin >> value)
    {
        sum += value;
    }
    std::cout << sum << std::endl;
    return 0;
}

数字输入完成后,Ctrl+d结束输入。

练习1.17

如果输入的所有值都是相等的,本节的程序会输出什么?如果没有重复值,输出又会是怎样的?

如果输入的所有值都是相等的,Ctrl+d后,才有输出统计的个数;如果没有重复输出,输入与前个不同的数即打印一行,Ctrl+d后,才输出最后一行统计的个数。

练习1.18

编译并运行本节的程序,给它输入全都相等的值。再次运行程序,输入没有重复的值。

$ ./ex17 
1 1 1 1 1 
1 occurs 5 times
$ ./ex17 
1 2 3 4 5 
1 occurs 1 times
2 occurs 1 times
3 occurs 1 times
4 occurs 1 times
5 occurs 1 times

练习1.19

修改你为1.4.1节练习1.11(第11页)所编写的程序(打印一个范围内的数),使其能处理用户输入的第一个数比第二个数小的情况。

见1.11。

练习1.20

在网站http://www.informit.com/title/032174113 上,第1章的代码目录包含了头文件 Sales_item.h。将它拷贝到你自己的工作目录中。用它编写一个程序,读取一组书籍销售记录,将每条记录打印到标准输出上。

#include <iostream>
#include "Sales_item.h"

int main()
{
    Sales_item item;
    std::cin >> item;
    std::cout << item <<std::endl;

    return 0;
}

测试:

$ ./ex20 
2-01 2 20
2-01 2 40 20

练习1.21

编写程序,读取两个 ISBN 相同的 Sales_item 对象,输出他们的和。

#include <iostream>
#include "Sales_item.h"

int main()
{
    Sales_item item1,item2;
    std::cin >> item1 >> item2;
    std::cout << item1 + item2 <<std::endl;
    
    return 0;
}
$ ./ex21
1-01 2 100
1-01 3 100
1-01 5 500 100

练习1.22

编写程序,读取多个具有相同 ISBN 的销售记录,输出所有记录的和。

#include <iostream>
#include "Sales_item.h"

int main()
{
    Sales_item item,sum_item;
    std::cin >> sum_item;
    while(std::cin >> item)
    {
    	sum_item += item;
    }
    std::cout << sum_item << std::endl;
    
    return 0;
}

测试:

$ ./ex22
1-01 2 100
1-01 2 100
1-01 3 100
1-01 7 700 100

需要初始化sum_item:
std::cin >> sum_item;

练习1.23

编写程序,读取多条销售记录,并统计每个 ISBN(每本书)有几条销售记录。

#include <iostream>
#include "Sales_item.h"

int main()
{
    Sales_item currItem, valItem;
    if (std::cin >> currItem) {
        int cnt = 1;
        while (std::cin >> valItem) {
            if (valItem.isbn() == currItem.isbn())
                ++cnt;
            else {
                std::cout << currItem << " occurs " << cnt << " times "
                          << std::endl;
                currItem = valItem;
                cnt = 1;
            }
        }

        std::cout << currItem << " occurs " << cnt << " times " << std::endl;
    }
    return 0;
}

练习1.24

输入表示多个 ISBN 的多条销售记录来测试上一个程序,每个 ISBN 的记录应该聚在一起。

测试:

$ ./ex23
1-01 2 100
1-01 3 100
1-01 1 100
1-02 1 150
1-01 2 200 100 occurs 3 times 

练习1.25

借助网站上的 Sales_item.h 头文件,编译并运行本节给出的书店程序。

#include <iostream>
#include "Sales_item.h"

int main() 
{
    Sales_item total; // variable to hold data for the next transaction

    // read the first transaction and ensure that there are data to process
    if (std::cin >> total) {
		Sales_item trans; // variable to hold the running sum
        // read and process the remaining transactions
        while (std::cin >> trans) {
			// if we're still processing the same book
            if (total.isbn() == trans.isbn()) 
                total += trans; // update the running total 
            else {              
		        // print results for the previous book 
                std::cout << total << std::endl;  
                total = trans;  // total now refers to the next book
            }
		}
        std::cout << total << std::endl; // print the last transaction
    } else {
        // no input! warn the user
        std::cerr << "No data?!" << std::endl;
        return -1;  // indicate failure
    }

    return 0;
}

测试:

$ ./ex25 
1-01 2 100
1-01 3 100
1-01 1 100
1-02 1 150
1-01 6 600 100
1-02 1 150 150

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340