C++ Primer第五版_第一章习题答案

2023-05-16

文章目录

      • 题目概览
        • 1.1 编译器文档
        • 1.2 错误标识
        • 1.3 Hello, World
        • 1.4 两数相乘
        • 1.5 独立语句
        • 1.6 程序合法性
        • 1.7 不正确的嵌套注释
        • 1.8 语句合法性
        • 1.9 50到100的整数相加
        • 1.10 递减顺序打印10到0之间的整数
        • 1.11 指定范围内的所有整数
        • 1.12 sum的终值
        • 1.13 for循环
        • 1.14 for循环 VS while循环
        • 1.15 编译器生成的错误信息
        • 1.16 cin读取一组数
        • 1.17 输入重复值
        • 1.18 输入全部相等的值
        • 1.20 读取一组书籍的销售记录
        • 1.21 两个ISBN相同的对象
        • 1.22 多个相同ISBN的对象
        • 1.23 统计每个ISBN销售记录
        • 1.25 书店程序

题目概览

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

1.1 编译器文档

参考:GCC and File Extensions

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

1.2 错误标识

参考:Exit Codes With Special Meanings

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

1.3 Hello, World

#include <iostream>

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

	return 0;
}

练习1.4:我们的程序使用加法运算符+来将两个数相加。编写程序使用乘法运算符*,来打印两个数的积。

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:我们将所有输出操作放在一条很长的语句中。重写程序,将每个运算对象的打印操作放在一条独立的语句中。

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;

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

1.6 程序合法性

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

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

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

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

1.8 语句合法性

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

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

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

1.9 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之间的整数。

1.10 递减顺序打印10到0之间的整数

#include <iostream>

int main()
{
        int i = 10;

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

        return 0;
}

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

1.11 指定范围内的所有整数

#include <iostream>

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

    if (nSmall > nBig) {
        int nTmp = nSmall;
        nSmall = nBig;
        nBig = nTmp;
    }

    while (nSmall <= nBig) {
        std::cout << nSmall << " ";
        ++nSmall;
    }
    std::cout << std::endl;

    return 0;
}

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

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

1.12 sum的终值

求从-100加到100的和,最终值为0。

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

1.13 for循环

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

#include <iostream>

Ex1.11:
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循环,两种形式的优缺点各是什么?

1.14 for循环 VS while循环

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

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

1.15 编译器生成的错误信息

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

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

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

1.17 输入重复值

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

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

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

1.20 读取一组书籍的销售记录

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

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

    return 0;
}

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

1.21 两个ISBN相同的对象

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

int main()
{
    Sales_item item1,item2;
    std::cin >> item1 >> item2;
    std::cout << item1 + item2 <<std::endl;
    
    return 0;
}

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

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

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

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 的记录应该聚在一起。

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

1.25 书店程序

#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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ Primer第五版_第一章习题答案 的相关文章

  • scanf在c语言中的作用是什么?

    scanf 函数 scanf 是C语言中的一个输入函数 与printf函数一样 xff0c 都被声明在头文件stdio h里 xff0c 因此在使用scanf函数时要加上 include xff08 在有一些实现中 xff0c printf
  • C语言中字符串的结束标志是什么

    C语言中字符串的结束标志是 39 0 39 C语言中没有专门的字符串变量 xff0c 通常用一个字符数组来存放一个字符串 xff0c 字符串总是以 39 0 39 作为结束符 39 0 39 就是8位的00000000 xff0c 因为字符
  • Linux驱动开发(十八)---网络(网卡)驱动学习

    前文回顾 Linux驱动开发 xff08 一 xff09 环境搭建与hello world Linux驱动开发 xff08 二 xff09 驱动与设备的分离设计 Linux驱动开发 xff08 三 xff09 设备树 Linux驱动开发 x
  • c语言源文件经过编译后生成文件的后缀是什么?

    c语言源文件经过编译后 xff0c 生成文件的后缀是 obj C语言源文件后缀名是 c xff0c 编译生成的文件后缀名是 obj xff0c 连接后可执行文件的后缀名是 exe C语言创建程序的步骤 xff1a 编辑 xff1a 就是创建
  • C语言strcmp函数用法

    C语言strcmp函数用法 strcmp函数语法为 int strcmp char str1 char str2 xff0c 其作用是比较字符串str1和str2是否相同 xff0c 如果相同则返回0 xff0c 如果不同 xff0c 前者
  • C++ 空指针和野指针

    点击蓝字 关注我们 来源于网络 xff0c 侵删 1 空指针 指针变量指向内存中编号为0的空间为空指针 空指针指向的内存空间是不可以访问的 代码 xff1a include lt iostream gt using namespace st
  • 如何用C++实现动态放烟花(附源码)

    点击蓝字 关注我们 来源于网络 xff0c 侵删 一 前言 C 43 43 实现的放烟花程序 用到了EGE图形库 xff0c 没有的需要自行安装 可调项 xff1a 背景图和背景音乐 粒子模糊度 亮度以及上升速度的参数 实现的动态烟花非常好
  • C语言内存泄漏问题及其检视方法

    点击蓝字 关注我们 来源于网络 xff0c 侵删 通过介绍内存泄漏问题原理及检视方法 xff0c 希望后续能够从编码检视环节就杜绝内存泄漏导致的网上问题发生 本文通过介绍内存泄漏问题原理及检视方法 xff0c 希望后续能够从编码检视环节就杜
  • C语言进阶之 回调函数详解

    点击蓝字 关注我们 因公众号更改推送规则 xff0c 请点 在看 并加 星标 第一时间获取精彩技术分享 来源于网络 xff0c 侵删 在讲回调函数之前 xff0c 我们需要了解函数指针 我们都知道 xff0c C语言的灵魂是指针 xff0c
  • C语言和C++的区别和联系,大多数人都说错了

    点击蓝字 关注我们 因公众号更改推送规则 xff0c 请点 在看 并加 星标 第一时间获取精彩技术分享 来源于网络 xff0c 侵删 C语言和C 43 43 到底是什么关系 xff1f 首先C 43 43 和C语言本来就是两种不同的编程语言
  • 深入理解C语言中的malloc,malloc() 与 free() 原理图解

    点击蓝字 关注我们 因公众号更改推送规则 xff0c 请点 在看 并加 星标 第一时间获取精彩技术分享 来源于网络 xff0c 侵删 本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程 本文不过度关注细节 xff0c 因此只是
  • C语言项目:灰度处理技术

    Hello xff0c 今天给大家带来的是一个比较简单的图形处理技术 灰度处理技术 那么到底什么是灰度处理技术呢 xff1f 简单来说 xff0c 所谓的灰度处理技术就是把一张彩色的图片变成一张灰色的图片 如下图所示 xff0c 左边是原图
  • React Native重启APP

    有时会用到APP重启操作 xff0c 比如更新代码或者特殊情况的用户注销 0 62及以上版本 只重启JS部分 import DevSettings from 39 react native 39 DevSettings reload 详细请
  • 树莓派3 Ubuntu系统 SD卡或U盘启动

    之前先用SD卡装过Ubuntu系统后 xff0c 用着用着SD卡满了 xff0c 就拿了个U盘来重装一遍 xff0c 发现U盘按照SD卡那样的流程安装之后 xff0c 树莓派配置成可以U盘启动 xff0c 再修改刻录好的U盘里的两个文件就可
  • 手把手教你安装黑苹果之openCore-0.6.3 EFI制作全过程,非常详细

    文章目录 前言一 EFI是什么 xff1f 二 获取EFI1 Hackintosh黑苹果长期维护机型整理清单2 搜索efi 二 自制EFI1 OC Gen X图形化一键自动生成EFI 推荐 2 手动下载EFI所需要的文件下载哪些文件下载op
  • OpenCore 启动菜单界面美化增加gui界面

    前言 OpenCore 默认启动界面是类似于命令行一样的黑乎乎的界面 习惯了clover华丽的启动界面的小伙伴可能不适应了 甚至我之前以为OpenCore启动界面就是这样的不能变呢 xff1f 第一次看到感觉还是clover讨喜 其实Ope
  • secoclient全版本下载分享

    前言 工作需要使用 secoclient xff0c 同事们大多都用 Windows环境 客户提供的客户端也是Windows版本的 这就让使用Mac几个同事难受啦 用Windows虚拟机 xff1f 根据我的经验 xff0c 一般的VPN客
  • Centos升级ruby

    CentOS7 安装的ruby默认版本是 xff1a ruby v span class token punctuation span 11 43 53 span class token punctuation span ruby 2 0
  • Windows 11下载

    Windows 11是微软于2021年推出的Windows NT系列操作系统 xff0c 为Windows 10的后继者 正式版本于2021年10月5日发行 xff0c 并开放给符合条件的Windows 10设备通过Windows Upda
  • docker容器安装图形桌面

    文章目录 视频教程版本信息创建一个CONTAINERubuntu官方国内源docker镜像unminimize中文环境设置中文环境 安装安装TigerVNC Server安装 xfce4精简版本 配置设置vnc密码 vnc xstartup

随机推荐

  • ubuntu官方国内源

    背景 之前我一直在使用中科大的源 xff0c 还是挺快的 一直也没有感觉有什么问题 直到最近在折腾vnc xff0c 发现中科大的源有一些包会404 xff0c 安装不了 而我在vmware中的正好是默认的cn archive ubuntu
  • mame新版ROM下载网站推荐

    网站地址 https www retroroms info index php 中文插件安装 浏览器插件 https www tampermonkey net UP主自己写的脚本 已经失效 https gitee com lxyoucan
  • RuoYi若依打包发布与部署

    上一节我们已经讲过了如果搭建开发环境 xff0c 那么如果代码写完了 xff0c 如何打包发布 部署到生产环境呢 xff1f RuoYi开发实战 搭建开发环境 https blog csdn net lxyoucan article det
  • vscode设置Prettier为默认格式化插件

    1 目的 xff1a ctrl 43 s保存 xff0c 自动格式化文档 2 所需插件Prettier 3 操作步骤 先打开vscode软件 xff0c 左下角点击设置 gt 打开设置 gt 在右上方有一个搜索框 先设定自动保存文件 xff
  • ASUS X415安装系统找不到硬盘解决办法

    同事让我帮忙安装系统 xff0c 笔记本电脑型号是ASUS X415 原本以为是手到擒来的事情 xff0c 结果我在上面还是消耗了不少时间 现象 老毛桃PE 无法识别到硬盘 微PE可以识别到硬盘 xff0c 但是系统安装以后 xff0c 无
  • archlinux中navicat无法使用fcitx5输入法

    现象 archlinux中navicat无法使用fcitx5输入法 而我在ubuntu中使用navicat调用fcitx输入法是可以正常使用的 在网上搜索了很久 xff0c 这方面的文章比较少 而我的其他程序输入法又是正常的 解决办法 参考
  • JetBrains Gateway IDEA远程开发

    为什么进行远程开发 xff1f 无论身处何处数秒内连接至远程环境 充分利用远程计算机的强大功能 在任何笔记本电脑上都可以轻松工作 xff0c 无论其性能如何 借助远程计算机的计算资源 xff0c 充分利用最大规模的数据集和代码库 在远程服务
  • ubuntu 22.04安装nvm

    执行安装脚本 span class token function sudo span span class token function apt span span class token function install span spa
  • 手推DNN,CNN池化层,卷积层反向传播

    反向传播算法是神经网络中用来学习的算法 xff0c 从网络的输出一直往输出方向计算梯度来更新网络参数 xff0c 达到学习的目的 xff0c 而因为其传播方向与网络的推理方向相反 xff0c 因此成为反向传播 神经网络有很多种 xff0c
  • 软件架构概念和面向服务的架构

    摘要 软件架构作为软件开发过程的一个重要组成部分 xff0c 有着各种各样的方法和路线图 xff0c 它们都有一些共同的原则 基于架构的方法作为控制系统构建和演化复杂性的一种手段得到了推广 引言 在计算机历史中 xff0c 软件变得越来越复
  • 初识强化学习,什么是强化学习?

    相信很多人都听过 机器学习 和 深度学习 但是听过 强化学习 的人可能没有那么多 那么 什么是强化学习呢 强化学习是机器学习的一个子领域 它可以随着时间的推移自动学习到最优的策略 在我们不断变化的纷繁复杂的世界里 从更广的角度来看 即使是单
  • 强化学习形式与关系

    在强化学习中有这么几个术语 智能体 Agent 环境 Environment 动作 Action 奖励 Reward 状态 State 有些地方称作观察 Observation 奖励 Reward 在强化学习中 奖励是一个标量 它是从环境中
  • 多层网络和反向传播笔记

    在我之前的博客中讲到了感知器 xff08 感知器 xff09 xff0c 它是用于线性可分模式分类的最简单的神经网络模型 xff0c 单个感知器只能表示线性的决策面 xff0c 而反向传播算法所学习的多层网络能够表示种类繁多的非线性曲面 对
  • 在Kaggle手写数字数据集上使用Spark MLlib的朴素贝叶斯模型进行手写数字识别

    昨天我在Kaggle上下载了一份用于手写数字识别的数据集 xff0c 想通过最近学习到的一些方法来训练一个模型进行手写数字识别 这些数据集是从28 28像素大小的手写数字灰度图像中得来 xff0c 其中训练数据第一个元素是具体的手写数字 x
  • Ros使用自定义数据通讯无法收到消息的分析和解决

    nbsp 在实际的开发中 和别的模块定义了自定义的 数据类型 比如 userMsg msg文件 Header header int32 nState string strImageName string strYamlName 报错和原因
  • 在Kaggle手写数字数据集上使用Spark MLlib的RandomForest进行手写数字识别

    昨天我使用Spark MLlib的朴素贝叶斯进行手写数字识别 xff0c 准确率在0 83左右 xff0c 今天使用了RandomForest来训练模型 xff0c 并进行了参数调优 首先来说说RandomForest 训练分类器时使用到的
  • 遇见AI,从Java到数据挖掘。

    在上小学的时候就听说过AI xff0c 人工智能 xff0c 那个时候我对人工智能的感受都来自于各类影视作品 xff0c 类人的外表 xff0c 能听说读写 xff0c 有情感 xff0c 会思考 所以那个时候的我将人工智能想象成和人类相似
  • PyTorch模型保存与加载

    torch save xff1a 保存序列化的对象到磁盘 xff0c 使用了Python的pickle进行序列化 xff0c 模型 张量 所有对象的字典 torch load xff1a 使用了pickle的unpacking将pickle
  • ROS和ROS2.0到底该用哪个呢?

    很多朋友经常问ROS1 0 下文简称ROS 和ROS2 0我到底该学习 使用哪个呢 欢迎拍砖讨论 但若是因此对您的项目或产品造成了损失 本人不负任何责任 我先给出个人的观点 再说明其中原因 对于大众学习者 普通开发者 机器人算法开发者 在2
  • C++ Primer第五版_第一章习题答案

    文章目录 题目概览1 1 编译器文档1 2 错误标识1 3 Hello World1 4 两数相乘1 5 独立语句1 6 程序合法性1 7 不正确的嵌套注释1 8 语句合法性1 9 50到100的整数相加1 10 递减顺序打印10到0之间的