数据结构作业:1204
题目如下:
1204. edit
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操作分别用一个过程来处理(将代码分作一个个过程可以极大提高逻辑性和可读性,请各位务必养成此习惯)。
代码:
- #include<iostream>
- #include<cstring>
- using namespace std;
- char text[110][2010],c,Tmp[110],u[2010];
- int num1=0,num2=0,num3=0,order_flag=1,L=0;
- void quit(){for(int i=0;i<L;i++){cout<<text[i]<<endl;}}
- void list(int num1,int num2){for(int i=(num1-1);i<=(num2-1);i++){cout<<text[i]<<endl;}}
- void ins(int num1,int num2,char *tmp){
- for(int i=(strlen(text[num1-1])-1);i>=(num2-1);i--){text[num1-1][i+strlen(tmp)]=text[num1-1][i];}
- for(int i=0;i<strlen(tmp);i++){text[num1-1][i+num2-1]=tmp[i];}
- }
- void del(int num1,int num2,int num3){
- int R=strlen(text[num1-1]);
- 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];}
- for(int i=0;i<num3;i++){text[num1-1][R-1-i]=NULL;}
- }
- int main()
- {
- for(int i=0;i<110;i++){cin.getline(text[i],2000);L++;if(strcmp(text[i],"******")==0){L--;break;}}
- while(true)
- {
- cin>>Tmp;
- if(strcmp(Tmp,"list")==0)
- {
- cin>>num1>>num2;
- if(num1>num2||num1<1||num2<1||num2>L||num1>L)//(num1<1||num2<1||num1>L||num2>L||num1>num2)
- {
- cout<<"Error!"<<endl;
- }else
- {
- list(num1,num2);
- }
- }
- else if(strcmp(Tmp,"ins")==0)
- {
- char tmp[100];
- cin>>num1>>num2;
- c=cin.get();cin.getline(tmp,100);
- 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)
- {
- cout<<"Error!"<<endl;
- }else
- {
- ins(num1,num2,tmp);
- }
- }
- else if(strcmp(Tmp,"del")==0)
- {
- cin>>num1>>num2>>num3;
- 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)
- {
- cout<<"Error!"<<endl;
- }else
- {
- del(num1,num2,num3);
- }
- }
- else if(strcmp(Tmp,"quit")==0)
- {
- break;
- }
- }
- quit();
- return 0;
- }
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 对于删除或添加操作,要注意修改后的数组长度发生变化。