在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: 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.pswp.cn/web/67869.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/67869.shtml
英文地址,请注明出处:http://en.pswp.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; 可以通过加计数器或者标记…

二分/双指针/单调栈队列专题

1.4924. 矩阵 - AcWing题库 一开始打表找规律以为是右上角向左下角递增,但当n很大的时候就不对了,因此我们得去观察 i * i 100000 * (i - j) j * j i * j 这个式子,我们关心的是这个式子的单调性因此我们可以分别将i和j看作常数来对式子进行求导,可以得到 f(i) 2 * i 10…

Shell $0

个人博客地址&#xff1a;Shell $0 | 一张假钞的真实世界 我们已经知道在Shell中$0表示Shell脚本的文件名&#xff0c;但在有脚本调用的情形中&#xff0c;子脚本中的$0会是什么值呢&#xff1f;我们通过下面的实例来看。 已测试系统列表&#xff1a; Mac OS X EI Capitan 1…

商品列表及商品详情展示

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

[ VS Code 插件开发 ] 使用 Task ( 任务 ) 代替 createTerminal (终端) 来执行命令

VSCode 官方自己的插件就是这样执行命令的. 使用体验 比 默认的终端 好太多了. 重用终端, Shell 集成 , 按任意键关闭, 任务是否成功, 左侧命令操作 (菜单中功能很多) 等 import * as vscode from vscode; // 执行的命令 let command_str "npm run dev" // 工作目…

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

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

Python处理数据库:MySQL与SQLite详解

Python处理数据库&#xff1a;MySQL与SQLite详解 在数据处理和存储方面&#xff0c;数据库扮演着至关重要的角色。Python提供了多种与数据库交互的方式&#xff0c;其中pymysql库用于连接和操作MySQL数据库&#xff0c;而SQLite则是一种轻量级的嵌入式数据库&#xff0c;Pytho…

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

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

ubuntuCUDA安装

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

Selenium 使用指南:从入门到精通

Selenium 使用指南&#xff1a;从入门到精通 Selenium 是一个用于自动化 Web 浏览器操作的强大工具&#xff0c;广泛应用于自动化测试和 Web 数据爬取中。本文将带你从入门到精通地掌握 Selenium&#xff0c;涵盖其基本操作、常用用法以及一个完整的图片爬取示例。 1. 环境配…

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

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

利用matlab寻找矩阵中最大值及其位置

目录 一、问题描述1.1 max函数用法1.2 MATLAB中 : : :的作用1.3 ind2sub函数用法 二、实现方法2.1 方法一&#xff1a;max和find2.2 方法二&#xff1a;max和ind2sub2.3 方法对比 三、参考文献 一、问题描述 matlab中求最大值可使用函数max&#xff0c;对于一维向量&#xff0…

PyTorch数据建模

回归分析 import torch import numpy as np import pandas as pd from torch.utils.data import DataLoader,TensorDataset import time strat = time.perf_counter()

机试题——字符匹配

题目描述 给你一个字符串数组&#xff08;每个字符串均由小写字母组成&#xff09;和一个字符规律&#xff08;由小写字母和 . 和 * 组成&#xff09;&#xff0c;识别数组中哪些字符串可以匹配到字符规律上。 . 匹配任意单个字符。* 匹配零个或多个前面的那一个元素。 所谓…

《 C++ 点滴漫谈: 二十五 》空指针,隐秘而危险的杀手:程序崩溃的真凶就在你眼前!

摘要 本博客全面解析了 C 中指针与空值的相关知识&#xff0c;从基础概念到现代 C 的改进展开&#xff0c;涵盖了空指针的定义、表示方式、使用场景以及常见注意事项。同时&#xff0c;深入探讨了 nullptr 的引入及智能指针在提升代码安全性和简化内存管理方面的优势。通过实际…

git push到远程仓库时无法推送大文件

一、错误 remote: Error: Deny by project hooks setting ‘default’: size of the file ‘scientific_calculator’, is 164 MiB, which has exceeded the limited size (100 MiB) in commit ‘4c91b7e3a04b8034892414d649860bf12416b614’. 二、原因 本地提交过大文件&am…

掌握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>里的…

Windows图形界面(GUI)-QT-C/C++ - QT Tab Widget

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 一、概述 1.1 什么是 QTabWidget&#xff1f; 1.2 使用场景 二、常见样式 2.1 选项卡式界面 2.2 动态添加和删除选项卡 2.3 自定义选项卡标题和图标 三、属性设置 3.1 添加页面&…