BNU4066:VI++ (模拟)

VI编辑器是Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器。 

不过HK总是觉着VI用着不舒服,所以他想做一个自己的编辑器,命名为VI++。 

它使用命令的方式执行操作。每个操作命令按照操作名或者操作名+操作参数的形式给出。 

HK要实现的操作有以下一些。 

  1. insert i A        把字符串A加到下标i的位置。例如,原来的串为abc,insert 2 bc后就变成了abbcc。 
  2. double           把原字符串复制一遍加到串尾。例如,原来的串为abc,double后就变成了abcabc。 
  3. delete i j         删除字符串下标为i到下标j之间的字符(包括i和j)。例如,原来的串为abc,delete 2 2后就变成了ab。
  4. change i j       把在字符串中下标为i和下标为j的字符交换,字符串的下标是从0开始的。例如,原来的串为abcd,change 0 2 后就变成了cbad。 
  5. reverse           把字符串反转。例如,原串为abc,reverse后就变成了cba。 
  6. rotate k          把字符串旋转k次。一次旋转定义为把首字母取出后放到字符串最后一位。例如,对abcde执行rotate 1 后就变成了bcdea,对abcde执行rotate 2后就变成了cdeab,以此类推。 

对于每一个操作,应该输出其执行后的字符串。 

当然,一个好的编辑器应该是可以识别和提示错误的。 

如果有以下的情况的时候会出现提示错误: 

  1. 空串的时候执行double,delete,change,reverse,rotate; 
  2. 执行insert k A时候,k小于0或者k大于串的长度; 
  3. 当执行change,delete操作的时候,不存在对应下标的字符。如字符串为abcd时,执行change 1 4,由于字符串中没有下标为4的字符,故出现错误。 

出现错误的时候,只在屏幕上输出error,对原串不执行操作。 

所有下标从0开始。 

Input

输入数据第1行为操作数N(1<=N<=30),代表了后面有N个对字符串的操作。 
第2行为初始字符串(可以包含空格并可能为空串)。 
第3行到N+2行,每一行都有一个字符串,代表相应的操作,包含操作名和操作参数(如果有),每个操作字符串保证格式合法。 
初始字符串和中间过程的字符串长度都不会超过100。 
每个操作中如果含有字符串参数,则一定不含空格。 

Output

在每一个操作后输出对应操作的结果或者错误提示信息。

Sample Input

6
abcde
double
rotate 4
reverse
insert 1 abc
delete 4 3
change 7 8

Sample Output

abcdeabcde
eabcdeabcd
dcbaedcbae
dabccbaedcbae
dabbaedcbae
dabbaedbcae
 
简单模拟题,要注意空串也是能够插入的
 
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

char str[1000],work[1000],add[1000];

void Insert(int pos)
{
    int i,len,len1;
    len = strlen(add);
    len1 = strlen(str);
    for(i = len1-1;i>=pos;i--)
    str[i+len] = str[i];
    for(i = pos;i<pos+len;i++)
    str[i] = add[i-pos];
    str[len1+len] = '\0';
    printf("%s\n",str);
}

void Double()
{
    int len = strlen(str),i;
    for(i = len;i<len*2;i++)
    str[i] = str[i-len];
    str[len*2] = '\0';
    printf("%s\n",str);
}

void Delete(int from,int to)
{
    int i,len = to-from+1;
    int l = strlen(str);
    for(i = from;i<l;i++)
    {
        str[i] = str[i+len];
    }
    str[l-len] = '\0';
    printf("%s\n",str);
}

void Change(int i,int j)
{
    char t;
    t = str[i];
    str[i] = str[j];
    str[j] = t;
    printf("%s\n",str);
}

void Reverse()
{
    int len = strlen(str),i;
    char t;
    for(i = 0;i<len/2;i++)
    {
        t = str[i];
        str[i] = str[len-1-i];
        str[len-1-i] = t;
    }
    printf("%s\n",str);
}

void Rotate(int k)
{
    int len = strlen(str),i;
 //   k = k%len;
    while(k--)
    {
        char t = str[0];
        for(i = 1;i<len;i++)
        str[i-1] = str[i];
        str[len-1] = t;
    }
    printf("%s\n",str);
}

int main()
{
    int T,len;
    while(~scanf("%d%*c",&T))
    {
        gets(str);
        while(T--)
        {
            len = strlen(str);
            scanf("%s",work);
            if(!strcmp(work,"insert"))
            {
                int pos;
                scanf("%d%*c",&pos);
                gets(add);
                if(pos<0 || pos>len)
                {
                    printf("error\n");
                    continue;
                }
                Insert(pos);
            }
            else if(!strcmp(work,"double"))
            {
                if(!len)
                {
                    printf("error\n");
                    continue;
                }
                Double();
            }
            else if(!strcmp(work,"delete"))
            {
                int from,to,t;
                scanf("%d%d",&from,&to);
                if(from>to)
                {
                    t = from;
                    from = to;
                    to = t;
                }
                if(!len || from<0 || from>=len || to<0 || to>=len)
                {
                    printf("error\n");
                    continue;
                }
                Delete(from,to);
            }
            else if(!strcmp(work,"change"))
            {
                int from,to,t;
                scanf("%d%d",&from,&to);
                if(from>to)
                {
                    t = from;
                    from = to;
                    to = t;
                }
                if(!len || from<0 || from>=len || to<0 || to>=len)
                {
                    printf("error\n");
                    continue;
                }
                Change(from,to);
            }
            else if(!strcmp(work,"reverse"))
            {
                if(!len)
                {
                    printf("error\n");
                    continue;
                }
                Reverse();
            }
            else if(!strcmp(work,"rotate"))
            {
                int k;
                scanf("%d",&k);
                if(!len)
                {
                    printf("error\n");
                    continue;
                }
                Rotate(k);
            }
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值