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

news/2024/4/26 6:04:45/文章来源:https://blog.csdn.net/ProgramNovice/article/details/130351540

《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 AustenPat's friend:
Hemingway
Mark Twain
Shakespeare
Sherlock HolmesMerge mat and pat's friends and delete the duplicate parts:
Denial Defoe
Helen Keller
Hemingway
Jane Austen
Mark Twain
Shakespeare
Sherlock HolmesC:\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 dataswitch(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 stringscout << "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 fileofstream fout("strings.dat", ios_base::out | ios_base::binary);for_each(vostr.begin(), vostr.end(), Store(fout));fout.close();// recover file contentsvector<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.luyixian.cn/news_show_103076.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【难学易用c++ 之 继承】

目录&#xff1a; 前言一、继承的概念及定义&#xff08;一&#xff09;概念&#xff08;二&#xff09;继承定义继承关系和访问限定符继承基类成员访问方式的变化 二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员七…

如何使用阿里云短信服务实现登录页面,手机验证码登录?

1&#xff1a;个人如何使用阿里云短信服务&#xff1f; 2022如何使用个人阿里云短信服务&#xff1f;_linxiMY的博客-CSDN博客添加完成之后&#xff0c;等待审核&#xff01;一般2个小时就会出来审核结果了&#xff0c;这里我因为注册申请时填写规则有误&#xff0c;足足审核了…

pytest 学习三(前置后置操作)

pytest测试框架_pytest框架-CSDN博客 一、常用的操作 一、setup/teardown 每个用例之前、之后执行 二、setup_class/teardown_class 在每个类之前、之后执行一次 二、pytest.fixture 设置前置后置操作范围 pytest.fixture(scope"",params,autouse,ids,name) 其中 sc…

JavaScript模块化开发

目录&#xff1a; 1 认识模块化开发 2 CommonJS和Node 3 require函数解析 4 AMD和CMD&#xff08;了解&#xff09; 5 ESModule用法详解 6 ESModule运行原理 模块化不是两个不同的js文件直接导入到某个页面中的&#xff0c;因为这两个文件只要有相同的变量或函数&#xf…

R基础函数概览(一)

rep 函数形式&#xff1a;rep(x, time , length , each ,) 参数说明&#xff1a; x&#xff1a;代表的是你要进行复制的对象&#xff0c;可以是一个向量或者是一个因子。 times&#xff1a;代表的是复制的次数&#xff0c;只能为正数。负数以及NA值都会为错误值。复制是指的…

云原生(docker+k8s+阿里云)-Docker

Gitee-Kubernetes学习 kubectl备忘清单 k8s官方文档-task [云原生-kubectl命令详解] ingress详解 ingress官方文档 云原生-语雀-架构师第一课 从Docker到Kubernetes进阶-社区 云计算学习路线-阿里云大学 如上图&#xff0c;服务器有公网ip和私网ip&#xff0c;公网ip是外部访问…

Ubuntu20.04使用多卡训练HyperNetwork模型和LoRA模型全流程及疑难问题解决方案

目录 一. LoRA模型多卡训练1.1 安装xformer等库1.2 设置路径1.3 多卡训练 二. LoRA模型多卡训练疑难报错解决方案多卡训练报错 软硬件配置&#xff1a; CPU: AMD 5800 8core 16Thread GPU: NVIDIA RTX 3090 *1 NVIDIA TITAN RTX *1 OS: Ubuntu20.04 一. LoRA模型多卡训练 1.1 …

一篇终结synchronized

一&#xff1a;基本原理 Java对象在内存中由两部分组成 &#xff1a; 1 是成员变量 2 是对象头&#xff0c;以32位虚拟机介绍&#xff1a;此时对象头是64位&#xff0c;即8字节 其中32个字节代表 mark word 另外32个字节代表klass word分别是什么意思呢&#xff1f; 1 klass …

写题总结1

先把自己写完的总结一下&#xff1a; 题目一&#xff1a; 猫儿园的告示牌上贴着 ab 大小的矩形广告纸。猫猫对广告不感兴趣&#xff0c;她想知道能否用 cd 的矩形白纸完全覆盖这个广告。猫猫可以对白纸进行平移、旋转&#xff0c;但不能折叠或撕开等。如果可以完全覆盖输出 YE…

滴水逆向3期笔记与作业——01汇编

防止OneNote丢失。 海哥牛逼。 01汇编笔记 01进制进制定义10-2进制转换八进制 02数据宽度/逻辑运算数据宽度与存储逻辑运算计算机做加法的本质作业 03通用寄存器_内存读写通用寄存器表通用寄存器图内存读写计算机操作系统位数意义 04内存地址_堆栈寻址公式PUSH指令POP指令作业 …

【IAR工程】STM8S基于ST标准库读取DHT11数据

【IAR工程】STM8S基于ST标准库读取DHT11数据 ✨申明&#xff1a;本文章仅发表在CSDN网站&#xff0c;任何其他网站&#xff0c;未注明来源&#xff0c;见此内容均为盗链和爬取&#xff0c;请多多尊重和支持原创!&#x1f341;对于文中所提供的相关资源链接将作不定期更换。&…

4月有8本SCIE期刊被剔除(附MDPI/Frontiers/Hindawi最新在检期刊)

2023年4月SCI、SSCI期刊目录更新 2023年4月18日&#xff0c;科睿唯安更新了WOS期刊目录&#xff0c;继上次3月WOS期刊目录剔除50本SCIE&SSCI期刊之后&#xff0c;此次4月更新又有8本SCIE期刊发生变动&#xff0c;其中有4本期刊被踢出SCIE数据库&#xff0c;4本期刊更改了名…

流程图拖拽视觉编程--概述

一般的机器视觉平台采用纯代码的编程方式&#xff0c;如opencv、halcon&#xff0c;使用门槛高、难度大、定制性强、开发周期长&#xff0c;因此迫切需要一个低代码开发的视觉应用平台。AOI缺陷检测的对象往往缺陷种类多&#xff0c;将常用的图像处理算子封装成图形节点,如抓直…

Android 系统架构大图

android的系统架构和其操作系统一样&#xff0c;采用了分层的架构。从架构图看&#xff0c;android分为四个层&#xff0c;从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux核心层。 1.应用程序 Android会同一系列核心应用程序包一起发布&#xff0c;该应用…

确定因果随机森林的树木数量 the number of trees

前言 推断因果性和分析异质性是统计学家在处理混杂任务中的圣杯。传统且主流的方法有:倾向性评分、分层分享、比例风险模型等。新的方法也有很多,代表就是:因果随机森林。这种算法,浅看难度一般,深入探索发现坑还是很多的。这篇博客不对算法做深入探讨,仅仅是我在阅读文…

Nautilus Chain :基于模块化架构的Layer3正在走向成熟

Nautilus Chain 是一个基于 Eclipse 和 Celestia 构建的模块化 Layer3 链。作为定位在 Layer0 的链基建概念&#xff0c;Eclipse 和 Celestia 为面向未来的区块链扩容技术提供了一套开发工具和基础框架。尽管这种前沿技术过去一直处于概念验证阶段&#xff0c;尚未推出适用于大…

Java并发(三)----创建线程的三种方式及查看进程线程

一、直接使用 Thread // 创建线程对象 Thread t new Thread() {public void run() {// 要执行的任务} }; // 启动线程 t.start(); 例如&#xff1a; // 构造方法的参数是给线程指定名字&#xff0c;推荐 Thread t1 new Thread("t1") {Override// run 方法内实现…

手把手教你PXE高效网络装机、Kickstart无人值守安装(详细版)

目录 一、部署PXE远程安装服务1.1PXE定义1.2PXE服务优点1.3搭建网络体系前提条件1.4 搭建PXE远程安装服务器 二. 实验2.1 服务器操作2.2 安装启动TFTP服务并修改TFTP服务的配置文件2.3 安装并启用DHCP服务2.4 准备linux内核&#xff0c;初始化镜像文件2.5 准备PXE引导程序2.6 安…

22、Tweak原理及部分逆向防护

一、Tweak原理 1.1 Tweak产物.dylib 执行make命令时,在 .theos的隐藏目录中,编译出obj/debug目录,包含 arm64、arm64e两种架构,同时生成readbadges.dylib动态库 在arm64、arm64e目录下,有各自架构的readbadges.dylib,而debug目录下的readbadges.dylib,是一个胖二进制文件 fi…

【Java-01】深入浅出匿名对象 , 继承 , 抽象类

主要内容 面向对象回顾 匿名对象介绍 面向对象特征 - 继承 抽象类的使用 模板设计模式 1 面向对象回顾 面向对象的核心思想是什么 ? 用代码来模拟现实生活中的事物 , 比如学生类表示学生事物 , 对象表示的就是具体的学生 , 有了类就可以描述万千世界所有的事物了 现有的…