编程题#4: 字符串操作(C++程序设计第9周)

描述

给定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结束。

输出

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

样例输入

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类中的相关操作函数。
这道题跟第7周的一道题是同一道题。

源码

#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <cstdlib>//atoi字符串转整数的函数
#include <cstring>//memset函数头文件
#include <cstdio>//sprintf函数头文件
using namespace std;

vector<string> strGiven;//存储被给的字符串
queue<string> strCommand;//存储命令字符串
char* strItoa = new char[101];//存储将整数转换的字符串,并作返回值使用

void strStorage(const char* ch);//将输入的一行数据分为若干个命令参数,并存入队列当中
bool strProcess();//开始处理一行命令,注意开头的命令只可能是“insert”“reset”“print”“printall”和“over”
string commandOp();//递归算法处理一行中的命令组合
string nyCopy(int n, int x, int l);//copy N X L:取出第N个字符串第X个字符开始的长度为L的字符串
string nyAdd(string s1, string s2);//add S1 S2:判断S1,S2是否为0-99999之间的整数,若是则将其转化为整数做加法,若不是,则作字符串加法,返回的值为一字符串
int nyFind(int n, string s);//find S N:在第N个字符串中从左开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。
int nyRFind(int n, string s);//rfind S N:在第N个字符串中从右开始找寻S字符串,返回其第一次出现的位置,若没有找到,返回字符串的长度。
void nyInsert(int n, int x, string s);//在第N个字符串的第X个字符位置中插入S字符串
void nyReset(int n, string s);//将第N个字符串变为S
void nyPrint(int n);//打印输出第N个字符串
void nyPrintAll();//打印输出所有字符串

int main()
{
    int n;
    cin >> n;

    for (int i = 0; i < n; i++)
    {
        string str;
        cin >> str;
        strGiven.push_back(str);
    }
    cin.get();

    char* ch = new char[501];
    while(1)
    {
        cin.getline(ch, 500, '\n');
        strStorage(ch);
        int t = strProcess();
        if (t == false)
        {
            break;
        }
    }
    delete ch;
    delete strItoa;
    return 0;
}
/*
将输入的一行数据分为若干个命令参数,并存入队列当中
*/
void strStorage(const char* ch)
{
    string str;
    for (int i = 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,程序结束
*/
bool strProcess()
{
    string str = strCommand.front();
    strCommand.pop();
    if (str == "insert")
    {
        string s = commandOp();
        int n = atoi(commandOp().c_str());
        int x = atoi(commandOp().c_str());
        nyInsert(n, x, s);
    }
    else if (str == "reset")
    {
        string s = commandOp();
        int n = atoi(commandOp().c_str());
        nyReset(n, s);
    }
    else if (str == "print")
    {
        int n = atoi(commandOp().c_str());
        nyPrint(n);
    }
    else if (str == "printall")
    {
        nyPrintAll();
    }
    else if (str == "over")
    {
        return false;
    }
    return true;
}
/*
递归算法处理一行中的命令组合
*/
string commandOp()
{
    string str = strCommand.front();
    strCommand.pop();
    if (str == "copy")
    {
        int n = atoi(commandOp().c_str());
        int x = atoi(commandOp().c_str());
        int l = atoi(commandOp().c_str());
        return nyCopy(n, x, l);
    }
    else if (str == "add")
    {
        string s1 = commandOp();
        string s2 = commandOp();
        return nyAdd(s1, s2);
    }
    else if (str == "find")
    {
        string s = commandOp();     
        int n = atoi(commandOp().c_str());
        sprintf(strItoa, "%d", nyFind(n, s));
        return strItoa;
    }
    else if (str == "rfind")
    {
        string s = commandOp();
        int n = atoi(commandOp().c_str());
        sprintf(strItoa, "%d", nyRFind(n, s));
        return strItoa;
    }
    else//参数
    {
        return str;
    }

}
/*
copy函数
*/
string nyCopy(int n, int x, int l)
{
    string str = strGiven.at(n-1);
    return str.substr(x, l);
}
/*
add函数
*/
string nyAdd(string s1, string s2)
{
    //判断字符串里是否全为数字
    //因为83s经过atoi后会变为83
    for (int i = 0; i < s1.size(); i++)
    {
        if (s1.at(i) < '0' || s1.at(i) > '9')
        {
            return s1 + s2;
        }
    }
    for (int i = 0; i < s2.size(); i++)
    {
        if (s2.at(i) < '0' || s2.at(i) > '9')
        {
            return s1 + s2;
        }
    }
    //若全为数字,判断是否在0和99999之间
    long a = atoi(s1.c_str());  
    long b = atoi(s2.c_str());
    if (a >= 0 && a <= 99999 && b >= 0 && b <= 99999)
    {
        long c = a + b;
        sprintf(strItoa, "%d", c);
        return strItoa;
    } 
    else
    {
        return s1 + s2;
    }
}
/*
find函数
*/
int nyFind(int n, string s)
{
    int pos = strGiven.at(n-1).find(s);
    if (pos == string::npos)
    {
        return s.size();
    }
    else
    {
        return pos;
    }
}
/*
rfind函数
*/
int nyRFind(int n, string s)
{
    int pos = strGiven.at(n-1).rfind(s);
    if (pos == string::npos)
    {
        return s.size();
    }
    else
    {
        return pos;
    }
}
/*
insert函数
*/
void nyInsert(int n, int x, string s)
{
    strGiven.at(n-1).insert(x, s);
}
/*
reset函数
*/
void nyReset(int n, string s)
{
    strGiven.at(n-1).swap(s);
}
/*
print函数
*/
void nyPrint(int n)
{
    cout << strGiven.at(n-1) << endl;
}
/*
printall函数
*/
void nyPrintAll()
{
    for (unsigned int i = 0; i < strGiven.size(); i++)
    {
        cout << strGiven.at(i) << endl;
    }

}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
P11.1.1 计算机与编程语言:计算机与编程语言 P21.1.2 计算机和编程语言:计算机的思维方式 P31.2.1 C语言:为什么是C P41.2.2 C语言:简单历史 P51.2.3 C语言 编程软件 P61.3.1 第一个程序:第一个程序 P71.3.3 第一个程序:做点计算 P81.3.4 第一个程序:命令行编译和执行 P92.1.1 变量:第二 P102.1.2 变量:变量定义 P112.1.3 变量:变量赋值与初始化 P122.1.4 变量:变量输入 P132.1.5 变量:常量VS变量 P142.1.6 变量:浮点数 P152.2.1 表达式:表达式 P162.2.2 表达式:运算符优先级 P172.2.3 表达式:交换变量 P182.2.4 表达式:复合赋值和递增递减 P192.2.5 表达式:如何使用PAT系统来做编程练习题 P203.0.1 编程练习解析:PAT再解释 P213.0.1 编程练习解析:第二习题解析 P223.0.3 编程练习解析:0的故事 P233.1 判断:判断的条件 P243.1.1 判断:做判断 P253.1.3 判断:找零计算器 P263.1.4 判断:否则的话 P273.1.5 判断:if语句再探 P283.2.1 分支:嵌套的if-else P293.2.2 分支:级联的if-else if P303.2.3 分支:if-else的常见错误 P313.2.4 分支:多路分支 P324.1.1 循环:循环 P334.1.2 循环:while循环 P344.1.3 循环:do-while循环 P354.2.1 循环应用:循环计算 P364.2.2 循环应用:猜数游戏 P374.2.3 循环应用:算平均数 P384.2.4 循环应用:整数求逆 P395.1.1 第三种循环:for循环 P405.1.2 第三种循环:循环的计算和选择 P415.2.1 循环控制:循环控制 P425.2.2 循环控制:嵌套的循环 P435.2.3 循环控制:从嵌套的循环跳出 P445.3.1 循环应用:前n项求和 P455.3.2 循环应用:整数分解 P465.3.3 循环应用:求最大公约数 P476.0.1 编程练习解析:编程练习解析4-0 P486.0.2 编程练习解析:编程练习解析4-1 P496.0.3 编程练习解析4-2:九九乘法表 P506.0.4 编程练习解析4-3:统计素数求和 P516.0.5 编程练习解析4-4:猜数游戏 P526.0.6 编程练习解析5-0:n项求和 P536.0.7 编程练习解析5-1~5-3 P546.1.1 数据类型:数据类型 P556.1.2 数据类型:整数类型 P566.1.3 数据类型:整数的内部表达 P576.1.4 数据类型:整数的范围 P586.1.5 数据类型:整数的格式化 P596.1.6 数据类型:选择整数类型 P606.1.7 数据类型:浮点类型 P616.1.8 数据类型:浮点的范围与精度 P626.1.9 数据类型:字符类型 P636.1.10 数据类型:逃逸字符 P646.1.11 数据类型:类型转换 P656.2.1 其他运算:逻辑类型 P666.2.2 其他运算:逻辑运算 P676.2.3 其他运算:条件运算与逗号运算 P687.1.1 函数的定义和使用:初见函数 P697.1.2 函数的定义和使用:函数的定义和调用 P707.1.3 函数的定义和使用:从函数返回 P717.2.1 函数的参数和变量:函数原型 P727.2.2 函数的参数和变量:参数传递 P737.2.3 函数的参数和变量:本地变量 P747.2.4 函数的参数和变量:函数庶事 P758.1.1 数组:初试数组 P768.1.2 数组:数组的使用 P778.1.3 数组:数组的例子 P788.2.1 数组运算:数组运算 P798.2.2 数组运算:数组例子 P808.2.3 数组运算:二维数组 P819.1.1 指针:取地址运算 P829.1.2 指针:指针 P839.1.3 指针:指针的使用 P849.1.4 指针:指针与数组 P859.1.5 指针:指针与const P869.2.1 指针运算:指针运算 P879.2.2 指针运算:动态内存分配 P8810.1.1 字符串字符串 P8910.1.2 字符串字符串变量 P9010.1.3 字符串字符串的输入输出 P9110.1.4 字符串字符串数组,以及程序参数 P9210.2.1 字符串函数:单字符输入输出 P9310.2.2 字符串函数:字符串函数strlen P9410.2.3 字符串函数:字符串函数strcmp P9510.2.4 字符串函数:字符串函数strcpy P9610.2.5 字符串函数strcat P9710.2.6 字符串函数:字符串搜索函数 P9811.1.1 枚举:枚举 P9911.2.1 结构:结构类型 P10011.2.2 结构:结构:结构与函数 P10111.2.3 结构:结构的结构 P10211.3.1 联合:类型定义 P10311.3.2 联合:联合 P10412.1.1 全局变量:全局变量 P10512.1.2 全局变量:静态本地变量 P10612.1.3 全局变量:后记 P10712.2.1 编译预处理和宏:宏定义 P10812.2.2 编译预处理和宏:带参数的宏 P10912.3.1 大程序结构:多个源代码文件 P11012.3.2 大程序文件:头文件 P11112.3.3 大程序结构:声明 P11213.1.1 文件:格式化输入输出 P11313.1.2 文件:文件输入输出 P11413.1.3 文件:二进制文件 P11513.2.1 位运算:按位运算 P11613.2.2 位运算:移位运算 P11713.2.3 位运算:位运算例子 P11813.2.4 位运算:位段 P11914.1.1 可变数组:可变数组 P12014.1.2 可变数组:可变数组的数据访问 P12114.1.3 可变数组:可变数组的自动增长 P12214.2.1 链表:可变数组的缺陷 P12314.2.2 链表:链表 P12414.2.3 链表:链表的函数 P12514.2.4 链表:链表的搜索 P12614.2.5 链表:链表的删除 P12714.2.6 链表:链表的清除 P128A0.1 ACLLib入门:ACLLib介绍,看几个小游戏的演示 P129A0.2 ACLLib入门:Win32API简单介绍,太难了,不学了! P130A0.3 ACLLib入门:Dev C++建ACLLib项目,第一个程序跑起来! P131A0.4 ACLLib入门:ACLLib的基本绘图函数
包括C程序设计(第四版)的高清扫描版pdf以及与该书配套的学习辅导一书的pdf。 《C程序设计(第四版)》是由谭浩强教授著、清华大学出版社出版的《C程序设计》是一本公认的学习C语言程序设计的经典教材。根据C语言的发展和计算机教学的需要,作者在《C程序设计(第三版)》的基础上进行了修订。本书按照C语言的新标准C 99进行介绍,所有程序都符合C 99的规定,使编写程序更加规范;对C语言和程序设计的基本概念和要点讲解透彻,全面而深入;按照作者提出的“提出问题—解决问题—归纳分析”三部曲进行教学、组织教材;本书的每个例题都按以下几个步骤展开:提出任务—解题思路—编写程序—运行程序—程序分析—有关说明。符合读者认知规律,容易入门与提高。 本书内容先进,体系合理,概念清晰,讲解详尽,降低台阶,分散难点,例题丰富,深入浅出,文字流畅,通俗易懂,是初学者学习C程序设计的理想教材,可作为高等学校各专业的正式教材,也是一本自学的好教材。本书还配有辅助教材《C程序设计(第四版)学习辅导》。 《C程序设计(第四版)学习辅导.pdf》共分4个部分 第1部分是《C程序设计(第四版)》一书的习题和参考解答,包括了该书各章的全部习题,对全部编程习题都给出了参考解答,共计132个程序; 第2部分是深入学习C程序设计,包括预处理指令、位运算和C程序案例; 第3部分是上机指南,详细介绍了Visual C++ 6.0集成环境下编辑、编译、调试和运行程序的方法; 第4部分是上机实验指导,包括程序的调试与测试、实验的目的与要求,并提供了本课程12个实验。 《C程序设计(第四版)》目录: 第1章 程序设计和C语言 1.1 什么是计算机程序 1.2 什么是计算机语言 1.3 C语言的发展及其特点 1.4 最简单的C语言程序 1.4.1 最简单的C语言程序举例 1.4.2 C语言程序的结构 1.5 运行C程序的步骤与方法 1.6 程序设计的任务 习题 第2章 算法——程序的灵魂 2.1 什么是算法 2.2 简单的算法举例 2.3 算法的特性 2.4 怎样表示一个算法 2.4.1 用自然语言表示算法 2.4.2 用流程图表示算法 2.4.3 三种基本结构和改进的流程图 2.4.4 用N?S流程图表示算法 2.4.5 用伪代码表示算法 2.4.6 用计算机语言表示算法 2.5 结构化程序设计方法 习题 第3章 最简单的C程序设计——顺序程序设计 3.1 顺序程序设计举例 3.2 数据的表形式及其运算 3.2.1 常量和变量 3.2.2 数据类型 3.2.3 整型数据 3.2.4 字符型数据 3.2.5 浮点型数据 3.2.6 怎样确定常量的类型 3.2.7 运算符和表达式 3.3 C语句 3.3.1 C语句的作用和分类 3.3.2 最基本的语句——赋值语句 3.4 数据的输入输出 3.4.1 输入输出举例 3.4.2 有关数据输入输出的概念 3.4.3 用printf函数输出数据 3.4.4 用scanf函数输入数据 3.4.5 字符数据的输入输出 习题 第4章 选择结构程序设计 4.1 选择结构和条件判断 4.2 用if语句实选择结构 4.2.1 用if语句处理选择结构举例 4.2.2 if语句的一般形式 4.3 关系运算符和关系表达式 4.3.1 关系运算符及其优先次序 4.3.2 关系表达式 4.4 逻辑运算符和逻辑表达式 4.4.1 逻辑运算符及其优先次序 4.4.2 逻辑表达式 4.4.3 逻辑型变量 4.5 条件运算符和条件表达式 4.6 选择结构的嵌套 4.7 用switch语句实多分支选择结构 4.8 选择结构程序综合举例 习题 第5章 循环结构程序设计 5.1 为什么需要循环控制 5.2 用while语句实循环 5.3 用do…while语句实循环 5.4 用for语句实循环 5.5 循环的嵌套 5.6 几种循环的比较 5.7 改变循环执行的状态 5.7.1 用break语句提前终止循环 5.7.2 用continue语句提前结束本次循环 5.7.3 break语句和continue语句的区别 5.8 循环程序举例 习题 第6章 利用数组处理批量数据 6.1 怎样定义和引用一维数组 6.1.1 怎样定义一维数组 6.1.2 怎样引用一维数组元素 6.1.3 一维数组的初始化 6.1.4 一维数组程序举例 6.2 怎样定义和引用二维数组 6.2.1 怎样定义二维数组 6.2.2 怎样引用二维数组的元素 6.2.3 二维数组的初始化 6.2.4 二维数组程序举例 6.3 字符数组 6.3.1 怎样定义字符数组 6.3.2 字符数组的初始化 6.3.3 怎样引用字符数组的元素 6.3.4 字符串字符串结束标志 6.3.5 字符数组的输入输出 6.
6折纸的厚度 问题描述 假定有一张充分大的纸,并且可以进行许多次对折。若单张纸的厚度为x,计算经过多少次对折后,折纸的厚度超过珠穆朗玛峰的高度8844.43米(8844430毫米)。 输入 输入数据仅有一行。该行有若干个数据分别表示单纸张的厚度(以毫米为单位),对应每一种情形。 输出 对于每一种情形,直接输出结果,换行。 7 计算和式 问题描述 给定两个正整数a(1≤a≤9)和n(n≥1),计算[a]+[aa]+…+[a…a]的值。例如:a为2,n为5时,则计算2+22+222+2222+22222。 输入 输入数据有若干行。每行有两个整数,分别是a和n,对应每一种情形。 输出 对于每一种情形,直接输出计算结果、换行。 8 乘方计算 问题描述 给定一个unsigned long long型数据$x$,计算$x^2, x^3,\cdots$直到$x^5$或溢出为止。 输入 输入数据有若干行。每行上有一个unsigned long long型整数,对应一种情形。 输出 对于每一种情形,依次输出$x, x^2, x^3, x^4, x^5$的值,不输出计算溢出的数值。数据项之间用逗号、空格分隔。 9 将非负十进制整数各位倒置 问题描述 给定一个非负整数,将其按十进制各位倒置。 输入 输入数据有若干行。每行上有一个非负整数,对应一种情形。 输出 对于每一种情形,直接输出结果,换行。 10 判断同构数 问题描述 给定一个十进制正整数,判断其是否为同构数。所谓同构数是这样的一些数,它出在其平方数的右边,例如5是出在$5^2=25$右边的数,25是出在$25^2=625$右边的数,所以5和25都是同构数。 输入 输入数据有若干行。每行上有一个正整数,对应一种情形。 输出 对于每一种情形,输出Y(表示是同构数)或N(表示不是同构数),换行。 11 兑换钱币 问题描述 对于给定的人民币金额n(分),问有多少种方案将其兑换成1分、2分、5分。 输入 输入数据有若干行。每行上有一个正整数表示以分为单位的人民币金额n,对应一种情形。 输出 对于每一种情形,输出结果、换行。 12 给定5个实数的算术平均值和几何平均值 问题描述 给定5个实数,计算其算术平均值及几何平均值。 输入 输入数据仅有若干行,每行上有5个双精度浮点型数据,对应一种情形。 输出 对于每一种情形,输出算术平均值、逗号、空格、几何平均值、换行(浮点数保留2位小数)。 13 指示灯控制 问题描述 有m(m<100)盏灯排成一排(从1到m按顺序依次编号)。灯的开关均为点触式的(即点一次开、再点一次则关)。有n个人(从1到n依次编号)。第一个人(1号)将灯全部关闭。第二个人(2号)将所有2的倍数编号的灯的开关点一下。第三个人(3号)将所有3的倍数编号的灯的开关点一下。依此类推,当n个人完成其操作后,计算灯亮的数目。 输入 输入数据有若干行。每行上有两个非负整数对应一种情形的m和n。 输出 对于每一种情形,输出计算结果、换行。 14 分类统计字符串各类字符的个数 问题描述 给定一个字符串,统计其空格、数码、大写字母、小写字母的个数。 输入 输入数据有若干行。每一行上有一个字符串长度小于1024字符),对应一种情形。 输出 对于每一种情形,依次输出空格的个数、数码字符的个数、大写字母的个数、小写字母的个数,数据之间用逗号及空格字符分隔,然后换行。 15 态度决定一切 问题描述 将英文26个字母A~Z,或a~z对应到整数1~26,则态度 Attitude 对应的数字之和为100。编程计算给定字符串对应的数字之和(规定非英文字母的字符均对应0)。 输入 输入数据有多行,每行上有一个字符串长度小于1024)对应一种情形。 输出 对于每一种情况,输出结果、换行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值