【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.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 添加頁面&…