news 2026/6/11 7:26:55

第10章 模板与泛型编程 编程题#1:字符串操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第10章 模板与泛型编程 编程题#1:字符串操作

编程题 #1:字符串操作

给定nnn个字符串(从111开始编号),每个字符串中的字符位置从000开始编号,长度为1∼5001\sim 5001500,现有如下若干操作:

  • copy N X L:取出第NNN个字符串第XXX个字符开始的长度为L的字符串。
  • add S1 S2:判断S1S_1S1S2S_2S2是否为0∼999990\sim 99999099999之间的整数,若是则将其转化为整数做加法,若不是,则作字符串加法,返回的值为一字符串。
  • find S N:在第NNN个字符串中从左开始找寻SSS字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。
  • rfind S N:在第NNN个字符串中从右开始找寻SSS字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。
  • insert S N X:在第NNN个字符串的第XXX个字符位置中插入SSS字符串。
  • reset S N:将第NNN个字符串变为SSS
  • print N:打印输出第NNN个字符串。
  • printall:打印输出所有字符串。
  • over:结束操作。
    其中NNNXXXLLL可由findrfind操作表达式构成,SSSS1S_1S1S2S_2S2可由copyadd操作表达式构成。

输入

第一行为一个整数nnnnnn1∼201\sim 20120之间)

接下来nnn行为nnn个字符串,字符串不包含空格及操作命令等。

接下来若干行为一系列操作,直到over结束。

输出

根据操作提示输出对应字符串。

样例输入

3 329strjvc Opadfk48 Ifjoqwoqejr insert copy 1 find 2 1 2 2 2 print 2 reset add copy 1 find 3 1 3 copy 2 find 2 2 2 3 print 3 insert a 3 2 printall over

样例输出

Op29adfk48 358 329strjvc Op29adfk48 35a8

提示:推荐使用string类中的相关操作函数。


Solution

采用类似于表达式求值的方式解析输入即可。

#include<iostream>#include<string>#include<vector>#include<queue>#include<cstdlib>//atoi字符串转整数的函数#include<cstring>//memset函数头文件#include<cstdio>//sprintf函数头文件usingnamespacestd;vector<string>strGiven;//存储被给的字符串queue<string>strCommand;//存储命令字符串char*strItoa=newchar[101];//存储将整数转换的字符串,并作返回值使用voidstrStorage(constchar*ch);//将输入的一行数据分为若干个命令参数,并存入队列当中boolstrProcess();//开始处理一行命令,注意开头的命令只可能是“insert”“reset”“print”“printall”和“over”stringcommandOp();//递归算法处理一行中的命令组合stringnyCopy(intn,intx,intl);//copy N X L:取出第N个字符串第X个字符开始的长度为L的字符串stringnyAdd(string s1,string s2);//add S1 S2:判断S1,S2是否为0-99999之间的整数,若是则将其转化为整数做加法,若不是,则作字符串加法,返回的值为一字符串intnyFind(intn,string s);//find S N:在第N个字符串中从左开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。intnyRFind(intn,string s);//rfind S N:在第N个字符串中从右开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。voidnyInsert(intn,intx,string s);//在第N个字符串的第X个字符位置中插入S字符串voidnyReset(intn,string s);//将第N个字符串变为SvoidnyPrint(intn);//打印输出第N个字符串voidnyPrintAll();//打印输出所有字符串intmain(){intn;cin>>n;for(inti=0;i<n;i++){string str;cin>>str;strGiven.push_back(str);}cin.get();char*ch=newchar[501];while(1){cin.getline(ch,500,'\n');strStorage(ch);intt=strProcess();if(t==false){break;}}deletech;deletestrItoa;return0;}/* 将输入的一行数据分为若干个命令参数,并存入队列当中 */voidstrStorage(constchar*ch){string str;for(inti=0;ch[i]!='\0';i++){if(ch[i]!=' '){str.push_back(ch[i]);}else{strCommand.push(str);str.clear();}}//记录最后一个字符串strCommand.push(str);}/* 开始处理一行命令,注意开头的命令只可能是“insert”“reset”“print”“printall”和“over” 遇到"over"时返回false,程序结束 */boolstrProcess(){string str=strCommand.front();strCommand.pop();if(str=="insert"){string s=commandOp();intn=atoi(commandOp().c_str());intx=atoi(commandOp().c_str());nyInsert(n,x,s);}elseif(str=="reset"){string s=commandOp();intn=atoi(commandOp().c_str());nyReset(n,s);}elseif(str=="print"){intn=atoi(commandOp().c_str());nyPrint(n);}elseif(str=="printall"){nyPrintAll();}elseif(str=="over"){returnfalse;}returntrue;}/* 递归算法处理一行中的命令组合 */stringcommandOp(){string str=strCommand.front();strCommand.pop();if(str=="copy"){intn=atoi(commandOp().c_str());intx=atoi(commandOp().c_str());intl=atoi(commandOp().c_str());returnnyCopy(n,x,l);}elseif(str=="add"){string s1=commandOp();string s2=commandOp();returnnyAdd(s1,s2);}elseif(str=="find"){string s=commandOp();intn=atoi(commandOp().c_str());sprintf(strItoa,"%d",nyFind(n,s));returnstrItoa;}elseif(str=="rfind"){string s=commandOp();intn=atoi(commandOp().c_str());sprintf(strItoa,"%d",nyRFind(n,s));returnstrItoa;}else//参数{returnstr;}}/* copy函数 */stringnyCopy(intn,intx,intl){string str=strGiven.at(n-1);returnstr.substr(x,l);}/* add函数 */stringnyAdd(string s1,string s2){//判断字符串里是否全为数字//因为83s经过atoi后会变为83for(inti=0;i<s1.size();i++){if(s1.at(i)<'0'||s1.at(i)>'9'){returns1+s2;}}for(inti=0;i<s2.size();i++){if(s2.at(i)<'0'||s2.at(i)>'9'){returns1+s2;}}//若全为数字,判断是否在0和99999之间longa=atoi(s1.c_str());longb=atoi(s2.c_str());if(a>=0&&a<=99999&&b>=0&&b<=99999){longc=a+b;sprintf(strItoa,"%d",c);returnstrItoa;}else{returns1+s2;}}/* find函数 */intnyFind(intn,string s){intpos=strGiven.at(n-1).find(s);if(pos==string::npos){returns.size();}else{returnpos;}}/* rfind函数 */intnyRFind(intn,string s){intpos=strGiven.at(n-1).rfind(s);if(pos==string::npos){returns.size();}else{returnpos;}}/* insert函数 */voidnyInsert(intn,intx,string s){strGiven.at(n-1).insert(x,s);}/* reset函数 */voidnyReset(intn,string s){strGiven.at(n-1).swap(s);}/* print函数 */voidnyPrint(intn){cout<<strGiven.at(n-1)<<endl;}/* printall函数 */voidnyPrintAll(){for(unsignedinti=0;i<strGiven.size();i++){cout<<strGiven.at(i)<<endl;}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 7:22:54

终极Windows更新修复方案:LegacyUpdate让老旧系统重获新生

终极Windows更新修复方案&#xff1a;LegacyUpdate让老旧系统重获新生 【免费下载链接】LegacyUpdate Get back online, activate, and install updates on your legacy Windows PC 项目地址: https://gitcode.com/gh_mirrors/le/LegacyUpdate 还在为Windows XP、Vista、…

作者头像 李华
网站建设 2026/6/11 7:20:43

RabbitMQ 从零到实战:概念、配置与 Spring Boot 集成指南

RabbitMQ 从零到实战&#xff1a;概念、配置与 Spring Boot 集成指南 一、RabbitMQ 核心概念 1.1 AMQP 模型中的角色 Producer(生产者)││ 发送消息▼ Exchange(交换机) ──── Binding(绑定规则) ──── Queue(队列)││ 消费消息▼Consumer(消费者)角色说明Producer消息…

作者头像 李华
网站建设 2026/6/11 7:17:56

GanttProject深度解析:如何用开源架构实现企业级项目管理

GanttProject深度解析&#xff1a;如何用开源架构实现企业级项目管理 【免费下载链接】ganttproject Official GanttProject repository. 项目地址: https://gitcode.com/gh_mirrors/ga/ganttproject 项目定位与技术特色 GanttProject是一款基于Java开发的开源桌面项目…

作者头像 李华
网站建设 2026/6/11 7:17:55

Unity编辑器内快速打包资源为.unity3d文件的即用型工具集

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;Unity开发者可直接将BeastHelper.cs、exportresource.js和automatedexportresources.js三个脚本放入Assets/Editor目录&#xff0c;无需编译或配置&#xff0c;立即在编辑器菜单中看到导出选项。支持选中单个资…

作者头像 李华