《C++ Primer Plus》(第6版)第17章编程练习

news2024/10/6 10:40:59

《C++ Primer Plus》(第6版)第17章编程练习

  • 《C++ Primer Plus》(第6版)第17章编程练习
    • 1. 计算输入流中第一个\$之前的字符数目
    • 2. 将键盘输入(直到模拟的文件尾)复制到通过命令行指定的文件中
    • 3. 将一个文件复制到另一个文件中
    • 4. 拼接两个输入文件中对应的行,将结果写入到输出文件中
    • 5. Mat和Pat的朋友的姓名清单
    • 6. 使用标准C++ I/O、文件I/O完成第14章的编程练习5
    • 7. 编写函数

《C++ Primer Plus》(第6版)第17章编程练习

1. 计算输入流中第一个$之前的字符数目

编写一个程序计算输入流中第一个$之前的字符数目,并将$留在输入流中。

程序:

#include <iostream>
#include <cstdlib>

int main()
{
    using std::cin;
    using std::cout;
    using std::endl;
    using std::exit;

    char ch;
    int count = 0;

    while (cin.peek() != '$')
    {
        cin.get(ch);
        count++;
        cout << ch;
    }
    cout << "\nThere are " << count << " characters before first '$'\n";
    if (!cin.eof())
    {
        cin.get(ch);
        cout << ch << " is the next input character\n";
    }
    else
    {
        cout << "End of file reached.\n";
        exit(EXIT_FAILURE);
    }

    system("pause");
    return 0;
}

运行结果:

在这里插入图片描述

2. 将键盘输入(直到模拟的文件尾)复制到通过命令行指定的文件中

编写一个程序,将键盘输入(直到模拟的文件尾)复制到通过命令行指定的文件中。

程序:

#include <iostream>
#include <fstream>
#include <cstdlib>

int main(int argc, char *argv[])
{
    using namespace std;

    if (argc == 1)
    {
        cerr << "Usage: " << argv[0] << " filename\n";
        exit(EXIT_FAILURE);
    }
    ofstream fout;
    fout.open(argv[1]);
    if (!fout.is_open())
    {
        cerr << "Can't open file " << argv[1] << endl;
        exit(EXIT_FAILURE);
    }
    char ch;
    while (cin.get(ch) && ch != EOF)
        fout << ch;
    fout.close();

    return 0;
}

运行结果:

在这里插入图片描述

在这里插入图片描述

3. 将一个文件复制到另一个文件中

编写一个程序,将一个文件复制到另一个文件中。让程序通过命令行获取文件名。如果文件无法打开,程序将指出这一点。

程序:

#include <iostream>
#include <fstream>
#include <cstdlib>

int main(int argc, char *argv[])
{
    using namespace std;

    if (argc < 3)
    {
        cerr << "Usage: " << argv[0] << " source target\n";
        exit(EXIT_FAILURE);
    }
    ifstream fin;
    fin.open(argv[1]);
    if (!fin.is_open())
    {
        cerr << "Can't open file " << argv[1] << endl;
        exit(EXIT_FAILURE);
    }
    ofstream fout;
    fout.open(argv[2]);
    if (!fout.is_open())
    {
        cerr << "Can't open file " << argv[2] << endl;
        exit(EXIT_FAILURE);
    }
    char ch;
    while (fin.get(ch) && ch != EOF)
        fout << ch;
    fin.clear();
    fin.close();
    fout.clear();
    fout.close();

    return 0;
}

运行结果:

在这里插入图片描述

运行程序后:

在这里插入图片描述

4. 拼接两个输入文件中对应的行,将结果写入到输出文件中

编写一个程序,它打开两个文本文件进行输入,打开一个文本文件进行输出。该程序将两个输入文件中对应的行拼接起来,并用空格分隔,然后将结果写入到输出文件中。如果一个文件比另一个短,则将较长文件中余下的几行直接复制到输出文件中。例如,假设第一个输入文件的内容如下:

eggs kites donuts
balloons hammers
stones

而第二个输入文件的内容如下:

zero lassitude
finance drama

则得到的文件的内容将如下:

eggs kites donuts zero lassitude
balloons hammers finance drama
stones

程序:

#include <iostream>
#include <fstream>
#include <cstdlib>

int main(int argc, char *argv[])
{
    using namespace std;

    if (argc < 4)
    {
        cerr << "Usage: " << argv[0] << " source1 source2 target\n";
        exit(EXIT_FAILURE);
    }
    ifstream fin1;
    fin1.open(argv[1]);
    if (!fin1.is_open())
    {
        cerr << "Can't open file " << argv[1] << endl;
        exit(EXIT_FAILURE);
    }
    ifstream fin2;
    fin2.open(argv[2]);
    if (!fin2.is_open())
    {
        cerr << "Can't open file " << argv[2] << endl;
        exit(EXIT_FAILURE);
    }
    ofstream fout;
    fout.open(argv[3]);
    if (!fout.is_open())
    {
        cerr << "Can't open file " << argv[3] << endl;
        exit(EXIT_FAILURE);
    }
    char ch;
    while (!fin1.eof() || !fin2.eof())
    {
        if (!fin1.eof())
        {
            while (fin1.get(ch) && ch != '\n')
                fout << ch;
            fout << ' ';
        }
        if (!fin2.eof())
        {
            while (fin2.get(ch) && ch != '\n')
                fout << ch;
        }
        fout << '\n';
    }
    fin1.clear();
    fin2.clear();
    fout.clear();
    fin1.close();
    fin2.close();
    fout.close();

    return 0;
}

运行结果:

在这里插入图片描述

在这里插入图片描述

运行程序后:

在这里插入图片描述

5. Mat和Pat的朋友的姓名清单

Mat和Pat想邀请他们的朋友来参加派对,就像第16章中的编程练习8那样,但现在他们希望程序使用文件。他们请您编写一个完成下述任务的程序。

  • 从文本文件mat.dat中读取Mat朋友的姓名清单,其中每行为一个朋友。姓名将被存储在容器,然后按顺序显示出来。
  • 从文本文件pat.dat中读取Pat朋友的姓名清单,其中每行为一个朋友。姓名将被存储在容器中,然后按顺序显示出来。
  • 合并两个清单,删除重复的条目,并将结果保存在文件matnpat.dat中,其中每行为一个朋友。

程序:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <list>
#include <string>
#include <algorithm>
using std::list;
using std::string;

void show(list<string>);

int main()
{
    using std::cerr;
    using std::cin;
    using std::cout;
    using std::endl;
    using std::exit;
    using std::ifstream;
    using std::ios_base;
    using std::ofstream;

    list<string> mat, pat, final;
    ifstream fmat("mat.dat", ios_base::in);
    if (!fmat.is_open())
    {
        cerr << "Can't open file mat.dat\n";
        exit(EXIT_FAILURE);
    }
    ifstream fpat("pat.dat", ios_base::in);
    if (!fpat.is_open())
    {
        cerr << "Can't open file pat.dat\n";
        exit(EXIT_FAILURE);
    }
    ofstream fout("matnpat.dat", ios_base::out);
    if (!fout.is_open())
    {
        cerr << "Can't open file matnpat.dat\n";
        exit(EXIT_FAILURE);
    }
    string name;
    while (!fmat.eof())
    {
        getline(fmat, name);
        mat.push_back(name);
    }
    while (!fpat.eof())
    {
        getline(fpat, name);
        pat.push_back(name);
    }
    mat.sort();
    cout << "Mat's friend:\n";
    show(mat);
    pat.sort();
    cout << "Pat's friend:\n";
    show(pat);
    final.merge(mat);
    final.merge(pat);
    final.sort();
    final.unique();
    for (list<string>::iterator it = final.begin(); it != final.end(); it++)
        fout << (*it) << endl;
    cout << "Merge mat and pat's friends and delete the duplicate parts:\n";
    show(final);

    return 0;
}

void show(list<string> ls)
{
    using std::cout;
    using std::endl;

    for (list<string>::iterator it = ls.begin(); it != ls.end(); it++)
        cout << (*it) << endl;
    cout << endl;
}

运行结果:

C:\Users\81228\Documents\Program\VScode C++ Program\chapter17\17.5>17.5
Mat's friend:
Denial Defoe
Helen Keller
Hemingway
Jane Austen

Pat's friend:
Hemingway
Mark Twain
Shakespeare
Sherlock Holmes

Merge mat and pat's friends and delete the duplicate parts:
Denial Defoe
Helen Keller
Hemingway
Jane Austen
Mark Twain
Shakespeare
Sherlock Holmes


C:\Users\81228\Documents\Program\VScode C++ Program\chapter17\17.5>

在这里插入图片描述

6. 使用标准C++ I/O、文件I/O完成第14章的编程练习5

考虑14章的编程练习5中的类定义。如果还没有完成这个练习,请现在就做,然后完成下面的任务。

编写一个程序,它使用标准C++ I/O、文件I/O以及14章的编程练习5中定义的employee、manager、fink和highfink类型的数据。该程序应包含程序清单17.17中的代码行,即允许用户将新数据添加到文件中。该程序首次被运行时,将要求用户输入数据,然后显示所有的数据,并将这些信息保存到一个文件中。当该程序再次被运行时,将首先读取并显示文件中的数据,然后让用户添加数据,并显示所有的数据。差别之一是,应通过一个指向employee类型的指针数组来处理数据。这样,指针可以指向employee对象,也可以指向从employee派生出来的其他三种对象中的任何一种。使数组较小有助于检查程序,例如,您可能将数组限定为最多包含10个元素:

const int MAX = 10; // no more than 10 objects
...
employee * pc[MAX];

为通过键盘输入,程序应使用一个菜单,让用户选择要创建的对象类型。菜单将使用一个switch,以便使用new来创建指定类型的对象,并将它的地址赋给pc数组中的一个指针。然后该对象可以使用虚函数setall( )来提示用户输入相应的数据:

pc[i]->setall(); // invokes function corresponding to type of object

为将数据保存到文件中,应设计一个虚函数writeall( ):

for (i = 0; i < index; i++)
	pc[i]->writeall(fout);// fout ofstream connected to output file

注意:对于这个练习,应使用文本I/O,而不是二进制I/O(遗憾的是,虚对象包含指向虚函数指针表的指针,而write( )将把这种信息复制到文件中。使用read( )读取文件的内容,以填充对象时,函数指针值将为乱码,这将扰乱虚函数的行为)。可使用换行符将字段分隔开,这样在输入时将很容易识别各个字段。也可以使用二进制I/O,但不能将对象作为一个整体写入,而应该提供分别对每个类成员应用write( )和read( )的类方法。这样,程序将只把所需的数据保存到文件中。

比较难处理的部分是使用文件恢复数据。问题在于:程序如何才能知道接下来要恢复的项目是employee对象、manager对象、fink对象还是highfink对象?一种方法是,在对象的数据写入文件时,在数据前面加上一个指示对象类型的整数。这样,在文件输入时,程序便可以读取该整数,并使用switch语句创建一个适当的对象来接收数据:

enum classkind{Employee, Manager, Fink, Highfink}; // in class header
...
    int classtype;
while((fin >> classtype).get(ch)){ // newline separates int from data
    switch(classtype) {
        case Employee : pc[i] = new employee;
            : break;

然后便可以使用指针调用虚函数getall()来读取信息:

pc[i++]->getall();

程序:

在这里插入代码片

运行结果:

7. 编写函数

下面是某个程序的部分代码。该程序将键盘输入读取到一个由string对象组成的vector中,将字符串内容(而不是string对象)存储到一个文件中,然后该文件的内容复制到另一个由string对象组成的vector中。

int main()
{
    using namespace std;
    vector<string> vostr;
    string temp;
    // acquire strings
    cout << "Enter strings (empty line to quit):\n";
    while (getline(cin,temp) && temp[0] != '\0')
        vostr.push_back(temp);
    cout << "Here is your input.\n";
    for_each(vostr.begin(), vostr.end(), ShowStr);
    // store in a file
    ofstream fout("strings.dat", ios_base::out | ios_base::binary);
    for_each(vostr.begin(), vostr.end(), Store(fout));
    fout.close();
    // recover file contents
    vector<string> vistr;
    ifstream fin("strings.dat", ios_base::in | ios_base::binary);
    if (!fin.is_open())
    {
        cerr << "Could not open file for input.\n";
        exit(EXIT_FAILURE);
    }
    GetStrs(fin, vistr);
    cout << "\nHere are the strings read from the file:\n";
    for_each(vistr.begin(), vistr.end(), ShowStr);
    
    return 0;
}

该程序以二进制格式打开文件,并想使用read( )和write( )来完成I/O。余下的工作如下所述。

  • 编写函数void ShowStr(const string &),它显示一个string对象,并在显示完后换行。

  • 编写函数符Store,它将字符串信息写入到文件中。Store的构造函数应接受一个指定ifstream对象的参数,而重载的operator( )(const string &)应指出要写入到文件中的字符串。一种可行的计划是,首先将字符串的长度写入到文件中,然后将字符串的内容写入到文件中。例如,如果len存储了字符串的长度,可以这样做:

os.write((char *)&len, sizeof(std::size_t)); // store length
os.write(s.data(), len); // store characters

成员函数data( )返回一个指针,该指针指向一个其中存储了字符串中字符的数组。它类似于成员函数c_str( ),只是后者在数组末尾加上了一个空字符。

  • 编写函数GetStrs( ),它根据文件恢复信息。该函数可以使用read( )来获得字符串的长度,然后使用一个循环从文件中读取相应数量的字符,并将它们附加到一个原来为空的临时string末尾。由于string的数据是私有的,因此必须使用string类的方法来将数据存储到string对象中,而不能直接存储。

程序:

在这里插入代码片

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/457679.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

完全免费的基于区块链和 IPFS 的去中心化博客平台

一、前言 xLog是一个基于Crossbell区块链的博客解决方案&#xff0c;专注于Web3数据由用户掌控。Crossbell是一个基于Web3技术的去中心化博客平台&#xff0c;用户可以在该平台上发布文章并进行交流和创作。社区提供多种交流平台和有奖创作活动。 xLog是基于 Crossbell 区块链…

【AI回复】“我问它,你对五一调休怎么看”

前言 马上就要到五一啦&#xff0c;放假打算去哪里玩呢&#xff1f; “我肯定是宅在家里写博客啊” 最近五一调休在某博上引起大家的共鸣&#xff0c;看了评论那叫一个惨不忍睹哇。 因为我比较对AI感兴趣&#xff0c;所以想看看它是怎么看待调休的。 首先&#xff0c;在百度…

【UE】简易的水材质

引擎版本&#xff1a;4.26 效果 步骤 1. 创建一个材质&#xff0c;命名为“M_Water” 2. 打开“M_Water”&#xff0c;将混合模式设为半透明&#xff0c; 光照模式设为表面半透明体积&#xff0c;在这种模式下我们可以使用金属度、粗糙度等接口 3. 创建一个4维常量节点&…

Android 基于NumberPicker自定义弹出窗口Dialog整合日期选择器

Android实现把年月选择器放到AlertDialog中_左眼看成爱的博客-CSDN博客 Android使用NumberPicker实现年月滚动选择器_左眼看成爱的博客-CSDN博客 前面两篇文章我们分别讲了 1&#xff0c;如何用NumberPicker实现年月选择器 2&#xff0c;如何把1中的用NumberPicker实现的年…

基于DE2-115平台实现VGA显示器的显示实验

目录 什么是VGA协议VGA显示原理VGA时序图VGA参数图实验记录准备PLLROM取模代码data_drive.vkey_debounce.vvga_drive.vvga_top.v 实验现象 什么是VGA协议 这一部分摘录自野火的征途Pro《FPGA Verilog开发实战指南——基于Altera EP4CE10》2021.7.10&#xff08;上&#xff09;…

ctfshow web入门phpcve web311-315

1.web311 通过抓包发现php版本时为PHP/7.1.33dev 漏洞cve2019-11043 远程代码执行漏洞 利用条件&#xff1a; nginx配置了fastcgi_split_path_info 受影响系统&#xff1a; PHP 5.6-7.x&#xff0c;Nginx>0.7.31 下载工具进行利用 需要安装go环境 yum install golang -y …

一文技术解析ART虚拟机method tracing

一、method tracing介绍 概述 这个是谷歌提供的对java的函数级trace工具&#xff0c;和systrace只支持打点不同&#xff0c;method tracing能支持到函数&#xff0c;看到具体的函数执行时间&#xff0c;准确的分析出来执行的时间短板。 1.生成trace的方式 sampling方式&…

【数据结构初阶】第七节.树和二叉树的性质

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 一、树 1.1 树的概念 1.2 树的结点分类 1.3 结点之间的关系 1.4 树的存储结构 1.5 其他相关概念 二、 二叉树 2.1 二叉树的概念 2.2 特殊的二叉树 2.3 二叉树的性质 2.4…

快速上线chatGPT软件

ChatGPT是一个由OpenAI开发的自然语言处理模型&#xff0c;您无法将其直接上线。但是&#xff0c;如果您想要在您的应用程序中集成对话系统或聊天机器人&#xff0c;您可以探索以下步骤&#xff1a; 选择开发工具&#xff1a;选择一个适合您的编程语言和平台的开发工具&…

C++ [STL之string的使用]

本文已收录至《C语言和高级数据结构》专栏&#xff01; 作者&#xff1a;ARMCSKGT 文章目录 前言正文编码basic_string类说明basic_string实例成员关于string string类模块构造函数空间大小相关字符串长度及容量大小清空字符串和空串查询字符串大小和容量设置 访问与遍历头尾元…

探索【Stable-Diffusion WEBUI】的插件:界面与中文翻译

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;主题&#xff08;kitchen Theme&#xff09;&#xff08;二&#xff09;对照翻译&#xff08;Bilingual Localization&#xff09;&#xff08;三&#xff09;自行翻译&#xff08;四&#xff09;提示词翻译…

前端02:CSS选择器等基础知识

CSS基础选择器、设置字体样式、文本样式、CSS的三种引入方式、能使用Chrome调试工具调试样式 HTML专注做结构呈现&#xff0c;样式交给CSS&#xff0c;即结构&#xff08;HTML&#xff09;和样式CSS相分离 CSS主要由量分布构成&#xff0c;选择器以及一条或多条声明 选择器&…

华为OD机试真题(Java),喊7的次数重排(100%通过+复盘思路)

一、题目描述 喊7是一个传统的聚会游戏&#xff0c;N个人围成一圈&#xff0c;按顺时针从1到N编号。 编号为1的人从1开始喊数&#xff0c;下一个人喊的数字为上一个人的数字加1&#xff0c;但是当将要喊出来的数字是7的倍数或者数字本身含有7的话&#xff0c;不能把这个数字直…

ML之DR:基于鸢尾花(Iris)数据集利用多种降维算法(PCA/TSVD/LDA/TSNE)实现数据降维并进行二维和三维动态可视化应用案例

ML之DR&#xff1a;基于鸢尾花(Iris)数据集利用多种降维算法(PCA/TSVD/LDA/TSNE)实现数据降维并进行二维和三维动态可视化应用案例 目录 基于鸢尾花(Iris)数据集利用多种降维算法(PCA/TSVD/LDA/TSNE)实现数据降维并进行二维和三维动态可视化应用案例 # 1、定义数据集 # 2、数…

华为OD机试真题(Java),密码验证合格程序(100%通过+复盘思路)

一、题目描述 密码要求: 长度超过8位包括大小写字母.数字.其它符号,以上四种至少三种不能有长度大于2的包含公共元素的子串重复 &#xff08;注&#xff1a;其他符号不含空格或换行&#xff09; 二、输入描述 一组字符串。 三、输出描述 如果符合要求输出&#xff1a;OK&…

Oxygen Content Fusion carck

Oxygen Content Fusion carck 输入法支持改进-对非拉丁语言输入法编辑器(IME)的支持在稳定性和性能方面得到了改进。 文件比较工具中环绕差异的精确显示-文件比较工具现在可以更好地识别和显示环绕编辑产生的差异。例如&#xff0c;当一段文本标记有标记时&#xff0c;它会识别…

pytorch深度学习框架CUDA版本环境安装记录——牛刀杀鸡——解一个非线性方程组

目录 一、前言二、安装步骤step1. 安装显卡驱动step2. 安装cudastep3. 安装cuDNNstep4. 安装pytorch环境 三、用pytorch解个非线性方程组 一、前言 在深度学习界pytorch框架用得人越来越多&#xff0c;无论是CV机器视觉、NLP还是自然语言处理&#xff0c;目前主流的大的模型如…

Matlab-报错griddedInterpolant解决方法分享

Yiinterp1 (x,Y,xi) interp1函数的用法&#xff1a; yiinterp1 (x,Y,xi)&#xff1a;返回插值向量yi&#xff0c;每一元素对应于参量xi&#xff0c;同时由向量X与Y的内插值决定。 1.问题产生 用matlab做网格数据插值时遇到的问题 报错截图收录 2.分析原因 根据报错可知&#x…

胜叔说SI_PI_EMC

第一课 分享的目的 书籍推荐 第二课 什么是理论分析 仿真不是目的&#xff0c;仿真是验证理论分析的方法 测试不是目的&#xff0c;测试是验证理论分析的方法 第三课 信号完整性简介 小型化、高功率、高密度 传输线理论&#xff1a;传输线是由 信号路径和返回路径共同组…

【Spring Cloud】Sleuth+Zipkin全链路日志追踪接入实战

文章目录 一、背景链路追踪介绍为什么需要链路追踪?那该如何解决呢&#xff1f; 二、常见的链路追踪技术有下面这些&#xff1a;三、Sleuth3.1、Sleuth&#xff08;读作/sluːθ/&#xff09;介绍3.2、相关术语3.3、Sleuth入门 四、多线程传递traceId1.问题2.解决方案3. 业务组…