SJTU OJ.1204

数据结构作业:1204

题目如下:

Description

题目具体描述如下。

Input Format

输入文件一开始包含若干行,用于表示文本内容。最后一行以单独的“******”结束。

接下来包括若干条子命令, 如下:

list:list n1 n2,仅此格式合法,一个合法的list指令表示输出n1到n2这n2-n1+1行。

ins:ins i j str,仅此格式合法,表示从i行第j个位置起插入str这个字符串,具体可以看样例,每次加入字符串长度小于100,注意可以加在行末,此时j为行的长度加1。

del:del i j num,仅此格式合法,表示从i行第j个位置起删除num个字符,数据保证不会删除整行。

quit:quit,退出程序,并且将所有修改后的字符串输出。

每行包含一条子命令。

Output Format

对于每一条子命令,若其不合法,则输入"Error!"并换行(不含"")。

对于一个合法的list指令,输出n2-n1+1行字符串。

对于quit指令,输出全部修改后的字符串。

Sample Input

Hello everyone.
I hope you can have a good time during our Data Structure Class.
Enjoy typing .
******
list 1 1
ins 1 154 s                            解释:it's too large for the 1st row.(这不是输入文件的内容!)
ins 4 1 s                              解释:it's too large for the line.(这不是输入文件的内容!)
ins 2 73 9                             解释:also it's invalid.(这不是输入文件的内容!)
del -1 1 2
ins 3 14 by yourself
list 2 3
quit

Sample Output

Hello everyone.
Error!
Error!
Error!
Error!
I hope you can have a good time during our Data Structure Class.
Enjoy typing by yourself.
Hello everyone.
I hope you can have a good time during our Data Structure Class.
Enjoy typing by yourself.

Limits

1.quit保证在且只在最后一行出现。

2.输入格式保证合法(注意,内容可能不合法)。

3.对于一条不合法的子命令,不进行任何文件编辑操作。

4.保证文本不超过100行,每行内容始终不超过2000个字符。

5.保证对于每次del操作,不会删除整行字符。

6.对于ins的列号i,表示在第i个字符之前插入数值。

7.对于del的列号i,表示从第i个字符开始删除。

*8.不合法内容包括:

1)行号or列号的索引超出范围。

2) 删除字符超过该行剩余字符。

9.约定各操作之间(比如ins int int string)用一个空格隔开 数据保证没有多于空格。

10.推荐将list,ins,del操作分别用一个过程来处理(将代码分作一个个过程可以极大提高逻辑性和可读性,请各位务必养成此习惯)。

代码:

  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. char text[110][2010],c,Tmp[110],u[2010];
  5. int num1=0,num2=0,num3=0,order_flag=1,L=0;
  6. void quit(){for(int i=0;i<L;i++){cout<<text[i]<<endl;}}
  7. void list(int num1,int num2){for(int i=(num1-1);i<=(num2-1);i++){cout<<text[i]<<endl;}}
  8. void ins(int num1,int num2,char *tmp){
  9. for(int i=(strlen(text[num1-1])-1);i>=(num2-1);i--){text[num1-1][i+strlen(tmp)]=text[num1-1][i];}
  10. for(int i=0;i<strlen(tmp);i++){text[num1-1][i+num2-1]=tmp[i];}
  11. }
  12. void del(int num1,int num2,int num3){
  13. int R=strlen(text[num1-1]);
  14. for(int i=0;i<(strlen(text[num1-1])-num3-num2+1);i++){text[num1-1][i+num2-1]=text[num1-1][i+num3+num2-1];}
  15. for(int i=0;i<num3;i++){text[num1-1][R-1-i]=NULL;}
  16. }
  17. int main()
  18. {
  19. for(int i=0;i<110;i++){cin.getline(text[i],2000);L++;if(strcmp(text[i],"******")==0){L--;break;}}
  20. while(true)
  21. {
  22. cin>>Tmp;
  23. if(strcmp(Tmp,"list")==0)
  24. {
  25. cin>>num1>>num2;
  26. if(num1>num2||num1<1||num2<1||num2>L||num1>L)//(num1<1||num2<1||num1>L||num2>L||num1>num2)
  27. {
  28. cout<<"Error!"<<endl;
  29. }else
  30. {
  31. list(num1,num2);
  32. }
  33. }
  34. else if(strcmp(Tmp,"ins")==0)
  35. {
  36. char tmp[100];
  37. cin>>num1>>num2;
  38. c=cin.get();cin.getline(tmp,100);
  39. if(num1<1||num2<1||num1>L||(num2>(strlen(text[num1-1])+1)))//(num1>L||(strlen(text[num1-1])+1)<num2||num1<1||num2<1)
  40. {
  41. cout<<"Error!"<<endl;
  42. }else
  43. {
  44. ins(num1,num2,tmp);
  45. }
  46. }
  47. else if(strcmp(Tmp,"del")==0)
  48. {
  49. cin>>num1>>num2>>num3;
  50. if(num1<1||num2<1||num1>L||num2>strlen(text[num1-1])||(num2+num3)>(strlen(text[num1-1])+1))//(num1>L||num2>strlen(text[num1-1])||(strlen(text[num1-1])<(num2+num3-1))||num3>=strlen(text[num1-1])||num1<1||num2<1||num3<0)
  51. {
  52. cout<<"Error!"<<endl;
  53. }else
  54. {
  55. del(num1,num2,num3);
  56. }
  57. }
  58. else if(strcmp(Tmp,"quit")==0)
  59. {
  60. break;
  61. }
  62. }
  63. quit();
  64. return 0;
  65. }
心得:

1 写这道题时老师要求用类,但我没用,明天试着用链表写。

2 cout操作可以直接用于整行输出。例:char text[100][100];cout<<text[0]<<endl;是合法的。

3 cin操作可以直接输入字符串。例:char text[100];cin>>text;是合法的。

4 cin.get()用于获取一个字符,cin.getline()用于获取当前行所有剩余字符,包括空格。

5 一定要注意数组下标越界问题,例:text[num1][num2]均不能超过原定数组范围,所以在判断下表时应该把对num1、num2的限制写在前面

if(num1>L||num2>L||num1<0||num2<0||text[num1][num2]……||)

6 对于删除或添加操作,要注意修改后的数组长度发生变化。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值