BNU4066:VI++ (模拟)

来源:互联网 发布:阿里巴巴农村淘宝网 编辑:程序博客网 时间:2024/06/07 03:00
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

6abcdedoublerotate 4reverseinsert 1 abcdelete 4 3change 7 8

Sample Output

abcdeabcdeeabcdeabcddcbaedcbaedabccbaedcbaedabbaedcbaedabbaedbcae
 
简单模拟题,要注意空串也是能够插入的
 
#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;}