【C++】P5734 【深基6.例6】文字处理软件


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯题目描述
  • 💯题目描述
    • 输入格式
    • 输出格式
    • 示例输入与输出
      • 输入:
      • 输出:
  • 💯我的做法
    • 操作1:在文档末尾插入字符串
    • 操作2:截取字符串
    • 操作3:在指定位置插入字符串
    • 操作4:查找子串位置
    • 完整代码:
  • 💯老师的做法
    • 主要差异
    • 代码:
  • 💯对比分析
    • 相同点:
    • 差异点:
  • 💯扩展与优化
  • 💯小结


在这里插入图片描述


💯前言

  • 在本次编程练习中,我们的目标是设计并实现一款文字处理软件。题目要求我们通过一系列字符串操作,模拟文字处理过程。这些操作包括字符串的拼接、截取、插入和查找,操作的结果需及时输出。这类问题不仅考察了我们对 C++ 中字符串操作的掌握,也考察了如何根据不同需求选择合适的数据结构和算法。通过这篇文章,我们将详细分析题目中的要求、我的实现方法、老师的实现方式,并进行对比,最终扩展和总结整个思路。
    C++ 参考手册
    在这里插入图片描述

💯题目描述

以下是题目原文,要求根据输入的操作来处理文档内容,并输出结果:

💯题目描述

P5734 【深基6.例6】文字处理软件
在这里插入图片描述

你需要开发一款文字处理软件。最开始时输入一个字符串作为初始文档。可以认为文档开头是第 0 个字符。需要支持以下操作:

  • 1 str:后接插入,在文档后面插入字符串 str,并输出文档的字符串;
  • 2 a b:截取文档部分,只保留文档中从第 a 个字符起 b 个字符,并输出文档的字符串;
  • 3 a str:插入片段,在文档中第 a 个字符前面插入字符串 str,并输出文档的字符串;
  • 4 str:查找子串,查找字符串 str 在文档中最先的位置并输出;如果找不到输出 -1

为了简化问题,规定初始的文档和每次操作中的 str 都不含有空格或换行。最多会有 q 次操作。

输入格式

第一行输入一个正整数 q,表示操作次数。

第二行输入一个字符串 str,表示最开始的字符串。

第三行开始,往下 q 行,每行表示一个操作,操作如题目描述所示。

输出格式

一共输出 q 行。

对于每个操作 1,2,3,根据操作的要求输出一个字符串。

对于操作 4,根据操作的要求输出一个整数。

示例输入与输出

输入:

4
ILove
1 Luogu
2 5 5
3 3 guGugu
4 gu

输出:

ILoveLuogu
Luogu
LuoguGugugu
3

💯我的做法

在我自己的实现中,我依赖了 C++ 中标准库提供的 string 类型,它使得字符串操作变得非常简单。主要操作如下:

操作1:在文档末尾插入字符串

我选择了使用 += 运算符来将字符串拼接到文档末尾,代码如下:

s += str;

这样实现可以将新字符串 str 添加到当前文档 s 的末尾,符合题目的要求。

操作2:截取字符串

对于操作2,我使用了 substr(a, b) 函数来截取文档中的一部分。substr 函数接受两个参数,a 为起始位置,b 为截取长度。根据题目要求,我们需要将起始位置从 1-based 转换为 0-based,因此在调用 substr 时,将 a - 1 作为起始位置:

s = s.substr(a - 1, b);

操作3:在指定位置插入字符串

为了在指定位置插入字符串,我使用了 insert(a, str) 方法。这个方法会将字符串 str 插入到当前字符串 s 的第 a 个位置:

s.insert(a - 1, str);

注意这里的 a - 1 是因为题目给定的是 1-based 索引,而 C++ 的字符串操作是基于 0-based 索引的。

操作4:查找子串位置

对于操作4,我使用了 find(str) 函数来查找子串 str 在文档中最早出现的位置。如果没有找到该子串,find 函数会返回 string::npos,表示未找到:

size_t pos = s.find(str);
if (pos == string::npos)cout << -1 << endl;
elsecout << pos << endl;

完整代码:

#include <iostream>
#include <string>
using namespace std;int main()
{int n;cin >> n;string s;cin >> s;while(n--){int m;cin >> m;switch(m){case 1:{string s2;cin >> s2;s += s2;cout << s << endl;break;}case 2:{int a, b;cin >> a >> b;s = s.substr(a, b);cout << s << endl;break;}case 3:{int a;string s2;cin >> a >> s2;s.insert(a, s2);cout << s << endl;break;}case 4:{string s2;cin >>  s2;size_t idex = s.find(s2);if(idex == string::npos)cout << -1 << endl;elsecout << idex << endl;break;}}}return 0;
}

💯老师的做法

老师的做法和我类似,核心思路没有变化,采用了 C++ 标准库的 string 类型及其内置的操作函数。具体代码如下:

主要差异

  1. 变量初始化

    • 老师在代码开始时就预定义了变量 a, b, 和 str,而我的做法是在每个操作中根据需要动态定义这些变量。
    • 老师的代码将变量定义放在了 while 循环外部,而我的做法将这些变量放在了每个 switch 语句内,确保了在每个操作中只定义所需变量。
  2. 使用 switch 语句

    • 老师使用了 switch 语句来处理不同的操作,明确区分了不同的操作类型。这种方式在处理多个互斥操作时非常清晰,且便于扩展。
  3. 查找操作

    • 在查找子串的部分,老师也使用了 find 函数,并且处理了找不到子串时返回 -1 的逻辑,和我的做法相同。

代码:

#include <iostream>
#include <string>
using namespace std;int main()
{int q = 0;cin >> q;string s;cin >> s;int a, b;string str;while (q--){int m = 0;cin >> m;switch (m){case 1:cin >> str;s += str;cout << s << endl;break;case 2:cin >> a >> b;s = s.substr(a, b);cout << s << endl;break;case 3:cin >> a >> str;s.insert(a, str);cout << s << endl;break;case 4:cin >> str;size_t pos = s.find(str);if (pos == string::npos)cout << -1 << endl;elsecout << pos << endl;break;}}return 0;
}

💯对比分析

相同点:

  1. 操作逻辑

    • 两种实现都处理了 4 种操作,分别是插入、截取、插入指定位置、查找子串。
    • 都使用了 string 类型的操作函数,如 +=, substr, insert, 和 find 来执行字符串操作。
  2. 输入输出

    • 输入格式一致,读取 q 次操作并执行,每次执行后输出对应结果。

差异点:

  1. 变量定义

    • 我的做法在每个操作前定义变量,使得每次操作只在需要的时候初始化变量。老师则将变量统一提前定义,这在一些情况下可能更清晰,尤其是在处理较为复杂的逻辑时。
  2. 代码结构

    • 我选择了将每个操作的代码放在 switch 语句的各个分支中,老师则将更多的内容放在 switch 外部,尤其是变量的定义和初始化。

💯扩展与优化

  1. 优化字符串拼接

    • 在频繁拼接字符串的情况下,+= 运算符可能会有性能问题,尤其是当字符串较长时。为了提高效率,可以使用 stringstreamvector<char> 来减少内存重分配带来的开销。
  2. 边界检查

    • 对于操作 2 和操作 3,程序没有进行充分的边界检查。如果 ab 超出了文档长度范围,应当做适当的处理。比如,在执行 substr(a, b) 时,可以检查 a + b 是否超过字符串的最大长度。
  3. 容错性

    • 对于查找子串操作,可以加入更多的异常处理机制,例如对输入的子串进行合法性校验,防止空串或无效字符导致异常。

💯小结

本次文字处理软件题目考察了 C++ 中字符串的基本操作,特别是如何通过不同的方式处理字符串的拼接、截取、插入和查找。通过两种实现方法的对比,我们不仅看到了不同的实现方式,也发现了每种方法的优缺点。在实际编码中,我们可以根据具体情况选择合适的方式来实现。通过这些操作,我们能够更深入地理解 C++ 字符串的操作特性,并提升自己的编程能力。


在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

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

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

相关文章

后盾人JS -- 原型

没有原型的对象 也有没有原型的对象 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…

洛谷 P1130 红牌 C语言

题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌。获得红牌的过程是相当复杂&#xff0c;一共包括 N 个步骤。每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件。为了加快进程&#xff0c;每一步政府都派了 M 个工作人员来检查材料。不幸的是&…

【线程】基于环形队列的生产者消费者模型

1 环形队列 环形队列采用数组来模拟&#xff0c;用取模运算来模拟环状特性。 1.如何判断环形队列为空或者为满? 当环形队列为空时&#xff0c;头和尾都指向同一个位置。当环形队列为满时&#xff0c;头和尾也都指向同一个位置。 因此&#xff0c; 可以通过加计数器或者标记…

商品列表及商品详情展示

前言 本文将展示一段结合 HTML、CSS 和 JavaScript 的代码&#xff0c;实现了一个简单的商品展示页面及商品详情&#xff0c;涵盖数据获取、渲染、搜索及排序等功能。 效果展示 点击不同的商品会展示对应的商品详情。 代码部分 代码总体实现 <!DOCTYPE html> <htm…

大模型综述一镜到底(全文八万字) ——《Large Language Models: A Survey》

论文链接&#xff1a;https://arxiv.org/abs/2402.06196 摘要&#xff1a;自2022年11月ChatGPT发布以来&#xff0c;大语言模型&#xff08;LLMs&#xff09;因其在广泛的自然语言任务上的强大性能而备受关注。正如缩放定律所预测的那样&#xff0c;大语言模型通过在大量文本数…

【C++】B2124 判断字符串是否为回文

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述输入格式&#xff1a;输出格式&#xff1a;样例&#xff1a; &#x1f4af;方法一&#xff1a;我的第一种做法思路代码实现解析 &#x1f4af;方法二&#xff1a;我…

ubuntuCUDA安装

系列文章目录 移动硬盘制作Ubuntu系统盘 前言 根据前篇“移动硬盘制作Ubuntu系统盘”安装系统后&#xff0c;还不能够使用显卡。 如果需要使用显卡&#xff0c;还需要进行相关驱动的安装&#xff08;如使用的为Nvidia显卡&#xff0c;就需要安装相关的Nvidia显卡驱动&#xff…

Sqoop导入MySQL中含有回车换行符的数据

个人博客地址&#xff1a;Sqoop导入MySQL中含有回车换行符的数据 MySQL中的数据如下图&#xff1a; 检查HDFS上的目标文件内容可以看出&#xff0c;回车换行符位置的数据被截断了&#xff0c;导致数据列错位。 Sqoop提供了配置参数&#xff0c;在导入时丢弃掉数据的分隔符&…

掌握API和控制点(从Java到JNI接口)_36 JNI开发与NDK 04

4、 *.so的入口函数&#xff1a;JNI_OnLoad() VM (virtual machine)的角色 Java代码在VM上执行。在执行Java代码的过程中&#xff0c;如果Java需要与本地代码(*.so)沟通时&#xff0c; VM就会把*.so視为插件<Tn>而加载到VM里。然后让Java函数呼叫到这插件<Tn>里的…

[MRCTF2020]Ez_bypass1(md5绕过)

[MRCTF2020]Ez_bypass1(md5绕过) ​​ 这道题就是要绕过md5强类型比较&#xff0c;但是本身又不相等&#xff1a; md5无法处理数组&#xff0c;如果传入的是数组进行md5加密&#xff0c;会直接放回NULL&#xff0c;两个NuLL相比较会等于true&#xff1b; 所以?id[]1&gg…

90,【6】攻防世界 WEB Web_php_unserialize

进入靶场 进入靶场 <?php // 定义一个名为 Demo 的类 class Demo { // 定义一个私有属性 $file&#xff0c;默认值为 index.phpprivate $file index.php;// 构造函数&#xff0c;当创建类的实例时会自动调用// 接收一个参数 $file&#xff0c;用于初始化对象的 $file 属…

Jenkins安装部署(以及常见报错解决方案),jdk版本控制器sdkman

目录 零、环境介绍 一、Jenkins安装 1、插件安装以及更换插件源 2、修改jenkins时区 二、sdkman安装&#xff08;可选&#xff09; 1、sdkman常用方法 2、sdkman常用方法演示 2.1、查看可用的jdk 2.2、下载jdk并切换版本 三、jenkins报错解决 1、下载sdkman后systemc…

c语言练习题【数据类型、递归、双向链表快速排序】

练习1&#xff1a;数据类型 请写出以下几个数据的数据类型 整数 a a 的地址 存放a的数组 b 存放a的地址的数组 b的地址 c的地址 指向 printf 函数的指针 d 存放 d的数组 整数 a 的类型 数据类型是 int a 的地址 数据类型是 int*&#xff08;指向 int 类型的指针&#xff09; …

联想拯救者Y9000P IRX8 2023 (82WK) 原厂Win11 家庭中文版系统 带一键还原功能 安装教程

安装完重建winre一键还原功能&#xff0c;和电脑出厂时的系统状态一模一样。自动机型专用软件&#xff0c;全部驱动&#xff0c;主题壁纸&#xff0c;自动激活&#xff0c;oem信息等。将电脑系统完全恢复到出厂时状态。 支持机型 (MTM) : 82WK 系统版本&#xff1a;Windows 1…

深入解析“legit”的地道用法——从俚语到正式表达:Sam Altman用来形容DeepSeek: legit invigorating(真的令人振奋)

深入解析“legit”的地道用法——从俚语到正式表达 一、引言 在社交媒体、科技圈甚至日常对话中&#xff0c;我们经常会看到或听到“legit”这个词。比如最近 Sam Altman 在 X&#xff08;原 Twitter&#xff09;上发的一条帖子中写道&#xff1a; we will obviously deliver …

Vue 图片引用方式详解:静态资源与动态路径访问

目录 前言1. 引用 public/ 目录2. assets/ 目录3. 远程服务器4. Vue Router 动态访问5. 总结6. 扩展&#xff08;图片不显示&#xff09; 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 在 Vue 开发中&#x…

DeepSeek-R1 本地部署教程(超简版)

文章目录 一、DeepSeek相关网站二、DeepSeek-R1硬件要求三、本地部署DeepSeek-R11. 安装Ollama1.1 Windows1.2 Linux1.3 macOS 2. 下载和运行DeepSeek模型3. 列出本地已下载的模型 四、Ollama命令大全五、常见问题解决附&#xff1a;DeepSeek模型资源 一、DeepSeek相关网站 官…

JVM运行时数据区域-附面试题

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域 有各自的用途&#xff0c;以及创建和销毁的时间&#xff0c;有的区域随着虚拟机进程的启动而一直存在&#xff0c;有些区域则是 依赖用户线程的启动和结束而建立和销毁。 1. 程序计…

2月3日星期一今日早报简报微语报早读

2月3日星期一&#xff0c;农历正月初六&#xff0c;早报#微语早读。 1、多个景区发布公告&#xff1a;售票数量已达上限&#xff0c;请游客合理安排行程&#xff1b; 2、2025春节档总票房破70亿&#xff0c;《哪吒之魔童闹海》破31亿&#xff1b; 3、美宣布对中国商品加征10…

C++ Primer 标准库vector

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…