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

news2025/2/4 22:27:33

在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: 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;
else
    cout << 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;
 				else
 				    cout << 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;
            else
                cout << 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.coloradmin.cn/o/2292008.html

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

相关文章

CSS核心

CSS的引入方式 内部样式表是在 html 页面内部写一个 style 标签&#xff0c;在标签内部编写 CSS 代码控制整个 HTML 页面的样式。<style> 标签理论上可以放在 HTML 文档的任何地方&#xff0c;但一般会放在文档的 <head> 标签中。 <style> div { color: r…

013-51单片机红外遥控器模拟控制空调,自动制冷制热定时开关

主要功能是通过红外遥控器模拟控制空调&#xff0c;可以实现根据环境温度制冷和制热&#xff0c;能够通过遥控器设定温度&#xff0c;可以定时开关空调。 1.硬件介绍 硬件是我自己设计的一个通用的51单片机开发平台&#xff0c;可以根据需要自行焊接模块&#xff0c;这是用立创…

CMake项目编译与开源项目目录结构

Cmake 使用简单方便&#xff0c;可以跨平台构建项目编译环境&#xff0c;尤其比直接写makefile简单&#xff0c;可以通过简单的Cmake生成负责的Makefile文件。 如果没有使用cmake进行编译&#xff0c;需要如下命令&#xff1a;&#xff08;以muduo库echo服务器为例&#xff09;…

OPENPPP2 —— VMUX_NET 多路复用原理剖析

在阅读本文之前&#xff0c;必先了解以下几个概念&#xff1a; 1、MUX&#xff08;Multiplexer&#xff09;&#xff1a;合并多个信号到单一通道。 2、DEMUX&#xff08;Demultiplexer&#xff09;&#xff1a;从单一通道分离出多个信号。 3、单一通道&#xff0c;可汇聚多个…

语言月赛 202412【正在联系教练退赛】题解(AC)

》》》点我查看「视频」详解》》》 [语言月赛 202412] 正在联系教练退赛 题目背景 在本题中&#xff0c;我们称一个字符串 y y y 是一个字符串 x x x 的子串&#xff0c;当且仅当从 x x x 的开头和结尾删去若干个&#xff08;可以为 0 0 0 个&#xff09;字符后剩余的字…

【数据结构】_链表经典算法OJ:复杂链表的复制

目录 1. 题目链接及描述 2. 解题思路 3. 程序 1. 题目链接及描述 题目链接&#xff1a;138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;…

python的pre-commit库的使用

在软件开发过程中&#xff0c;保持代码的一致性和高质量是非常重要的。pre-commit 是一个强大的工具&#xff0c;它可以帮助我们在提交代码到版本控制系统&#xff08;如 Git&#xff09;之前自动运行一系列的代码检查和格式化操作。通过这种方式&#xff0c;我们可以确保每次提…

【C语言入门】解锁核心关键字的终极奥秘与实战应用(三)

目录 一、auto 1.1. 作用 1.2. 特性 1.3. 代码示例 二、register 2.1. 作用 2.2. 特性 2.3. 代码示例 三、static 3.1. 修饰局部变量 3.2. 修饰全局变量 3.3. 修饰函数 四、extern 4.1. 作用 4.2. 特性 4.3. 代码示例 五、volatile 5.1. 作用 5.2. 代码示例…

音标-- 02-- 重音 音节 变音

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 国际音标1.重音2.音节3.变音 国际音标 1.重音 2.音节 3.变音

[STM32 标准库]EXTI应用场景 功能框图 寄存器

一、EXTI 外部中断在嵌入式系统中有广泛的应用场景&#xff0c;如按钮开关控制&#xff0c;传感器触发&#xff0c;通信接口中断等。其原理都差不多&#xff0c;STM32会对外部中断引脚的边沿进行检测&#xff0c;若检测到相应的边沿会触发中断&#xff0c;在中断中做出相应的处…

C语言练习【互斥锁、信号量线程同步、条件变量实现生产者消费者模型】

练习1 请使用互斥锁 和 信号量分别实现5个线程之间的同步 互斥锁实现同步 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>…

w190工作流程管理系统设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

linux下ollama更换模型路径

Linux下更换Ollama模型下载路径指南   在使用Ollama进行AI模型管理时&#xff0c;有时需要根据实际需求更改模型文件的存储路径。本文将详细介绍如何在Linux系统中更改Ollama模型的下载路径。 一、关闭Ollama服务   在更改模型路径之前&#xff0c;需要先停止Ollama服务。…

编程题-电话号码的字母组合(中等)

题目&#xff1a; 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 解法一&#xff08;哈希表动态添加&#xff09;&#x…

浅谈《图解HTTP》

感悟 滑至尾页的那一刻&#xff0c;内心突兀的涌来一阵畅快的感觉。如果说从前对互联网只是懵懵懂懂&#xff0c;但此刻却觉得她是如此清晰而可爱的呈现在哪里。 介绍中说&#xff0c;《图解HTTP》适合作为第一本网络协议书。确实&#xff0c;它就像一座桥梁&#xff0c;连接…

架构知识整理与思考(其四)

书接上回 建议&#xff0c;没有看过上一章的可以看一下&#xff0c;上一章“架构知识整理与思考&#xff08;其二&#xff09;” 感觉这都成链表了。 三生万物 软件架构 终于&#xff0c;我们进入了具体的软件架构讨论中。 软件架构是什么&#xff1f;相关定义如下&#xf…

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

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

基于Spring Security 6的OAuth2 系列之八 - 授权服务器--Spring Authrization Server的基本原理

之所以想写这一系列&#xff0c;是因为之前工作过程中使用Spring Security OAuth2搭建了网关和授权服务器&#xff0c;但当时基于spring-boot 2.3.x&#xff0c;其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0&#xff0c;结果一看Spring Security也升级…

算法题(48):反转链表

审题&#xff1a; 需要我们将链表反转并返回头结点地址 思路&#xff1a; 一般在面试中&#xff0c;涉及链表的题会主要考察链表的指向改变&#xff0c;所以一般不会允许我们改变节点val值。 这里是单向链表&#xff0c;如果要把指向反过来则需要同时知道前中后三个节点&#x…

梯度、梯度下降、最小二乘法

在求解机器学习算法的模型参数&#xff0c;即无约束优化问题时&#xff0c;梯度下降是最常采用的方法之一&#xff0c;另一种常用的方法是最小二乘法。 1. 梯度和梯度下降 在微积分里面&#xff0c;对多元函数的参数求∂偏导数&#xff0c;把求得的各个参数的偏导数以向量的形式…