** 标准模板库 STL-2 编程题#4: 字符串操作(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
来源:互联网 发布:淘宝智能旺铺多少钱 编辑:程序博客网 时间:2024/05/17 09:20
编程题#4: 字符串操作
来源: POJ (http://cxsjsxmooc.openjudge.cn/test/U/)
注意: 总时间限制: 1000ms 内存限制: 65536kB
描述
给定n个字符串(从1开始编号),每个字符串中的字符位置从0开始编号,长度为1-500,现有如下若干操作:
copy N X L:取出第N个字符串第X个字符开始的长度为L的字符串。
add S1 S2:判断S1,S2是否为0-99999之间的整数,若是则将其转化为整数做加法,若不是,则作字符串加法,返回的值为一字符串。
find S N:在第N个字符串中从左开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。
rfind S N:在第N个字符串中从右开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。
insert S N X:在第N个字符串的第X个字符位置中插入S字符串。
reset S N:将第N个字符串变为S。
print N:打印输出第N个字符串。
printall:打印输出所有字符串。
over:结束操作。
其中N,X,L可由find与rfind操作表达式构成,S,S1,S2可由copy与add操作表达式构成。
输入
第一行为一个整数n(n在1-20之间)
接下来n行为n个字符串,字符串不包含空格及操作命令等。
接下来若干行为一系列操作,直到over结束。
输出
根据操作提示输出对应字符串。
样例输入
3329strjvcOpadfk48Ifjoqwoqejrinsert copy 1 find 2 1 2 2 2print 2reset add copy 1 find 3 1 3 copy 2 find 2 2 2 3print 3insert a 3 2printallover
样例输出
Op29adfk48358329strjvcOp29adfk4835a8
提示
推荐使用string类中的相关操作函数。
程序解答:
/**********************给定n个字符串(从1开始编号),每个字符串中的字符位置从0开始编号,长度为1-500,现有如下若干操作:copy N X L:取出第N个字符串第X个字符开始的长度为L的字符串。add S1 S2:判断S1,S2是否为0-99999之间的整数,若是则将其转化为整数做加法,若不是,则作字符串加法,返回的值为一字符串。find S N:在第N个字符串中从左开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。rfind S N:在第N个字符串中从右开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。insert S N X:在第N个字符串的第X个字符位置中插入S字符串。reset S N:将第N个字符串变为S。print N:打印输出第N个字符串。printall:打印输出所有字符串。over:结束操作。其中N,X,L可由find与rfind操作表达式构成,S,S1,S2可由copy与add操作表达式构成。***********************//**********************解题心得S1 S2可能大于99999N X L 可能小于0使用构造函数主要是受到大牛的影响 本来直接调用函数就行了…… 看起来比较高级,但其实有点麻烦**********************/#include <iostream>#include <string>//#include <stdio.h>//#include <stdlib.h>using namespace std;string str[22];string commend;int N;inline string MyCopy(); // copy N X L:取出第N个字符串第X个字符开始的长度为L的字符串。inline string MyAdd(); // add S1 S2:判断S1,S2是否为0-99999之间的整数,若是则将其转化为整数做加法,若不是,则作字符串加法,返回的值为一字符串。inline int MyFind(); // find S N:在第N个字符串中从左开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。inline int MyRfind(); // rfind S N:在第N个字符串中从右开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。inline void MyInsert(); // insert S N X:在第N个字符串的第X个字符位置中插入S字符串。inline void MyReset(); // reset S N:将第N个字符串变为S。struct GETS{ GETS(string &s) // 递归获得真正的s串 { cin >> s; if (s == "copy") s = MyCopy(); else if (s == "add") s = MyAdd(); }};struct GETINT{ string Commend; GETINT(int &n) // 递归获得真正的int n { cin >> Commend; if (Commend == "find") n = MyFind(); else if (Commend == "rfind") n = MyRfind(); else n = atoi(Commend.c_str()); }};struct GETSTRING{ GETSTRING(int &m, string &s) // 递归获得真正的s串 并判断其是否为整数 { GETS Gets(s); int i = 0; for (m = 0; i<s.length(); i++) if ((s.at(i) >= '0') && (s.at(i) <= '9')) m = m * 10 + s.at(i) - '0'; else break; if ((i != s.length()) || (m>99999)) m = -1; }};int wmain(){ cin >> N; for (int i = 0; i<N; i++) cin >> str[i + 1]; while (cin >> commend) { if (commend == "over") break; switch (commend.at(1)) { case 'n': MyInsert(); break; case 'e': MyReset(); break; case 'r': if (commend == "print") { int n; cin >> n; cout << str[n] << endl; } else { for (int j = 1; j <= N; j++) cout << str[j] << endl; } break; } } return 0;}inline string MyCopy(){ int n, x, l; GETINT getintn(n); GETINT getintx(x); GETINT getintl(l); return (str[n].substr(x, l));}inline string MyAdd() // add S1 S2:判断S1,S2是否为0-99999之间的整数,若是则将其转化为整数做加法,若不是,则作字符串加法,返回的值为一字符串。{ string s1, s2; int m = -1, n = -1; GETSTRING getstringms1(m, s1); GETSTRING getstringns2(n, s2); if ((m == -1) || (n == -1)) return (s1 + s2); else { m += n; char chars[8]; //_itoa(m, chars, 10); _itoa_s(m, chars, 10); //sprintf(m, chars, 10); return string(chars); }}inline int MyFind() // find S N:在第N个字符串中从左开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回 ?? 哪个 ?? 字符串的长度。{ string s; int n, value; cin >> s; GETINT getintn(n); value = str[n].find(s); if (value == string::npos) value = str[n].length(); return value;}inline int MyRfind() // rfind S N:在第N个字符串中从右开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。{ string s; int n, value; cin >> s; GETINT getintn(n); value = str[n].rfind(s); if (value == string::npos) value = str[n].length(); return value;}inline void MyInsert() // insert S N X:在第N个字符串的第X个字符位置中插入S字符串。{ string s; int n, x; GETS Gets(s); GETINT getintn(n); GETINT getintx(x); str[n].insert(x, s);}inline void MyReset() // reset S N:将第N个字符串变为S。{ string s; int n; GETS Gets(s); GETINT getintn(n); str[n].assign(s);}
本文转载自:
http://bailian.openjudge.cn/topic/3534/
https://www.cnblogs.com/dagon/p/4780217.html
- ** 标准模板库 STL-2 编程题#4: 字符串操作(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 标准模板库 STL-1 编程题#2 List(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- ** 文件操作与模板 编程题#4: 字符串操作(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- * 文件操作与模板 编程题#1(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 标准模板库 STL-2 编程题#1(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;vector(sort)中重载 <)
- 文件操作与模板 编程题#2: 实数的输出格式(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 文件操作与模板 编程题#3: 整数的输出格式(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- * 期末考试 编程题#4:计算整数平方和(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 类和对象 编程题#2(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 标准模板库 STL-2 编程题#3:Set(Coursera 程序设计与算法 专项课程3 C++程序设计;执行输入的命令和数据)
- * 标准模板库 STL-2 编程题#2(Coursera 程序设计与算法 专项课程3 C++程序设计;自定义迭代器 CMyistream_iterator)
- * 继承与派生 编程题#1(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 类和对象 编程题#3(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 类和对象 编程题#1(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 期末考试 编程题#1:输出200(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 期末考试 编程题#6:MyString(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 标准模板库 STL-2 编程题#5: 热血格斗场(Coursera 程序设计与算法 专项课程3;函数用法:lower_bound, equal_range)
- 标准模板库 STL-2 编程题#6: priority queue(Coursera 程序设计与算法 专项课程3;容器中自定义排序顺序 MyCompare,判断质数)
- Array()数组操作
- 深入理解JavaScript的执行机制(同步和异步)
- MySQL Group Replication 安装配置
- 日有所思。
- 有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和
- ** 标准模板库 STL-2 编程题#4: 字符串操作(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)
- 机器学习中正则化项L1和L2的直观理解
- Hibernate映射(二)
- 在linux系统下格式化移动硬盘的操作
- Ubuntu_网络
- 初学Linux-linux下的文件目录,常用命令
- hdu-2855 Fibonacci Check-up
- python 数组操作
- STM32实现循环移位