搜档网
当前位置:搜档网 › 数据结构 简易文本编辑器

数据结构 简易文本编辑器

数据结构  简易文本编辑器
数据结构  简易文本编辑器

题目:

【2】.简易文本编辑器

要求:

1) 具有图形菜单界面;

2) 查找,替换(等长,不等长),插入(插串,文本块的插入)、块移动(行块,列块移动),删除

3) 可正确存盘、取盘;

4) 正确显示总行数。

1需求分析

一个简易文本编辑器应该具有图形菜单界面,包括查找,替换(等长,不等长),插入(插串,文本块的插入)、块移动(行块,列块移动),删除文本信息等功能并可正确存盘、取盘,正确显示总行数。

2概要设计

为实现数据的有序存储,该编辑器应该用顺序表来存储输入的信息。顺序表是数据结构中线性表的一种,它是用一块地址连续的存储空间依次存储线性表的元素。其特点为:在顺序表上逻辑关系相邻的俩个元素在物理位置上也相邻;在顺序表上可以随即存取表中的元素。在编辑器的主界面中应有如下提示信息:

⑴清空以前的文本信息:将用数组存的数据内容全部置为0;

⑵显示当前文本信息:遍历用数组存入的信息,并输入到外部显示器上;

⑶编辑信息:定义一个结构体,并在结构体中定义一个字符型的一维数组和一个整

型变量,这个整型变量用于记录一维数组中存入数据的个数;

⑷替换文本信息:首先在数组中查找要被替换的信息,如果找到该信息,提示输入

要替换的信息内容,否则提示未找到要被替换的信息;

⑸插入文本信息:首先在数组中查找要插入点,如果找到该插入点,提示输入插入

信息,确认插入信息后,提示选择向前插入信息还是向后插入信息,如果未找到插入点,显示未找到要插入的位置;

⑹移动文本信息:首先在数组中查找要移动的信息,如果找到该信息,提示是进行

列移动还是进行行移动,否则提示未找到要移动的信息;

⑺删除文本信息:首先在数组中查找要删除的信息,如果找到该信息,提示是否确

认删除该信息,通过确认来删除信息,如果未找到要删除的信息,提示未找到该信息;

⑻退出编辑器:显示感谢使用该软件并退出。

3 详细设计

void menu();

void shuru(char text[]);

void bc(char text[]);

void dakai(char text[]);

void dayin(char text[]);

void chazhao(char text[],int l);

void tihan(char text[],int l);

int strindex(char text[],char t[],int i2,int l);

void shanchu(char p[],int l);

void cs(char text[]);

void charu(char text[],int l);

void tuichu(int status);

char text[MAX]=""; //文本编辑域

char name[20]=""; //文件保存的位置

int status=0; //显示是否保存过的状态

int ntext; //文本编辑的位置

4用户使用说明

⑴清空以前的文本信息:将用数组存的数据内容全部置为0;

⑵显示当前文本信息:遍历用数组存入的信息,并输入到外部显示器上;

⑶编辑信息:定义一个结构体,并在结构体中定义一个字符型的一维数组和一个整

型变量,这个整型变量用于记录一维数组中存入数据的个数;

⑷替换文本信息:首先在数组中查找要被替换的信息,如果找到该信息,提示输入

要替换的信息内容,否则提示未找到要被替换的信息;

⑸插入文本信息:首先在数组中查找要插入点,如果找到该插入点,提示输入插入

信息,确认插入信息后,提示选择向前插入信息还是向后插入信息,如果未找到插入点,显示未找到要插入的位置;

⑹移动文本信息:首先在数组中查找要移动的信息,如果找到该信息,提示是进行

列移动还是进行行移动,否则提示未找到要移动的信息;

⑺删除文本信息:首先在数组中查找要删除的信息,如果找到该信息,提示是否确

认删除该信息,通过确认来删除信息,如果未找到要删除的信息,提示未找到该信息;

⑻退出编辑器:显示感谢使用该软件并退出。

5调试分析/测试结果

文本编辑器主界面

主界面功能,如图2—2所示。

图2—2 文本编辑器主界面

系统功能

⑴输入文本信息功能,如图2—3所示。

图2—3 输入界面

⑵查找文本信息,如图2—4所示。

图2—4查到功能界面

⑶显示文本信息,如图2—5。

图2—5

{4}删除操作,如图2--6

图2—6 (删除123)功能{5}插入操作如图2—7所示。

图2—7 (在789前插入123)界面{6}替换文本内容,如图2—8所示。

图2—8 (替换456为abc)的内容

6心得体会

程序的运行结果与理论推导结果完全吻合,即该算法与程序设计满足课程设计要求。该程序的主要优点是简单易懂,不存在理解上的障碍,也很自然地能想到这种解法。

通过数据结构的课程设计使我们对所学知识有了更好的理解,也增强了大家的动手能力。同时也发现了自己的很多不足之处,对知识的应用能力很是欠缺,应用软件的能力及编程水平与课程要求更是存在很大的差距。

7程序

#include

#include

#include

#include

#define MAX 10000

#define _CRT_SECURE_NO_DEPRECA TE //在vs中取消warning的警告

void menu();

void shuru(char text[]);

void bc(char text[]);

void dakai(char text[]);

void dayin(char text[]);

void chazhao(char text[],int l);

void tihan(char text[],int l);

int strindex(char text[],char t[],int i2,int l);

void shanchu(char p[],int l);

void cs(char text[]);

void charu(char text[],int l);

void tuichu(int status);

char text[MAX]=""; //文本编辑域

char name[20]=""; //文件保存的位置

int status=0; //显示是否保存过的状态

int ntext; //文本编辑的位置

void dakai(char text[])

{

system("cls");

FILE *fp;

char pd,ch;

char name[30];

int i=0;

printf("输入A:确定打开文件(未保存的数据将会丢失) M:返回主菜单");

fflush(stdin);

pd=getchar();

if (pd=='A'||pd=='a')

{

printf("请输入要打开文件名字(例如c:\\a.txt)");

scanf("%s",name);

while ((fp=fopen(name,"r"))==NULL)

{

printf("\n打开文件失败,请重新输入要打开的文件名:");

scanf("%s",name);

}

cs(text);

while(!feof(fp))

{

ch=fgetc(fp);

text[i]=ch;

i++;

}

text[i]='\0';

ntext=i;

fclose(fp);

printf("\n文件读取成功\n文件内容为\n");

dayin(text);

}

if (pd=='M'||pd=='m')

menu();

}

void bc(char text[])

{

system("cls");

FILE *fp;

char pd;

char tmp;

int i;

printf("\n输入【A】保存;任意键返回主菜单不保存\n");

fflush(stdin);

pd=getchar();

if (!(pd=='A'||pd=='a'))

{

menu();

}

else

{

if(name[20]==NULL)

{

printf("\n请输入保存文件名(例如: c:\\a.txt):");

scanf("%s",name);

}

while ((fp=fopen(name,"w+"))==NULL)

{

printf("文件不存在,请重新输入文件名:");

scanf("%s",name);

}

printf("\nA:确定;B:取消:");

while(scanf("%c",&tmp)!=EOF)

{

if (tmp=='A' || tmp=='a')

{

for(i=0;i

fprintf(fp,"%c",text[i]);

fclose(fp);

status=1;

printf("\n文件保存成功\n");

break;

}

if (tmp=='B' || tmp=='b')

{

break;

}

}

}

}

void cs(char text[])

{

int i;

for (i=0;i

{

text[i]='\0';

}

ntext=0;

status=0;

}

int strindex(char text[],char t[],int i2,int l) //查找要操作的数据的位置(模式匹配) {

int i1=l,j=0;

while (i1

{

if (text[i1]==t[j]) //继续匹配下一个字符

{

j++;

i1++;

//主串和子串依次匹配下一个字符

}

else //主串、子串指针回溯重新开始下一次匹配

{

i1=i1-j+1; //主串从下一个位置开始匹配

j=0;

//子串从头开始匹配

}

}

if (j>=i2)

{

return(i1-i2);

} //返回匹配的第一个字符的下标

else

return(-1); //模式匹配不成功

}

void menu()

{

system("cls");

time_t timep;

time (&timep);

printf("%s",ctime(&timep));

printf("\n\n\n\n\n\n\n\n\n\t\t\tWelcom to use our TXT edition system!\n");

printf("\n\n\t\t\t 欢迎您使用文本编辑器软件!\n");

printf("\n\n\n\n\n\n\n\n\npress Enter to continue...\n");

getchar();

loop:

system("cls");

printf("\n\n\n\n\t\t******************简易文本编辑器*****************\n\n");

printf("\t\t\t\t----0.清空内容--\n");

printf("\t\t\t\t----1.打开文件--\n");

if (ntext==0){

printf("\t\t\t\t----2.输入内容--\n");

}

else {

printf("\t\t\t\t----2.继续输入--\n");

}

printf("\t\t\t\t----3.查找------\n");

printf("\t\t\t\t----4.插入------\n");

printf("\t\t\t\t----5.删除------\n");

printf("\t\t\t\t----6.替换------\n");

printf("\t\t\t\t----7.显示内容--\n");

printf("\t\t\t\t----8.保存------\n");

printf("\t\t\t\t----9.退出------\n");

printf("\n\t\t*********************选项************************\n");

printf("\n\t\t\t\t输入选项0-9:");

char n;

fflush(stdin);

n=getchar();

if(n>='0'&&n<='9')

{

switch (n)

{

case '0': cs(text);break;

case '1': dakai(text);break;

case '2': shuru(text);break;

case '3': chazhao(text,0);break;

case '4': charu(text,1);break;

case '5': shanchu(text,0);break;

case '6': tihan(text,0);break;

case '7': dayin(text);break;

case '8': bc(text);break;

case '9': tuichu(status);

default : break;

}

}

else

{

printf("\n输入有误,请重新输入:");

fflush(stdin);

n=getchar();

}

system("pause");

goto loop;

}

void chazhao(char text[],int l)

{

system("cls");

int i,t,a=-1;

char pattern[20],bd,pd;

printf("原文为:\n");

dayin(text);

printf("请输入您要查找的内容");

scanf("%s",pattern);

printf("您查找的内容是:%s\n",pattern);

t=strlen(pattern);

loop:

a=strindex(text,pattern,t,l);

if (a!=-1)

{

l=a+t;

}

int hs=1,ls=0;

for (i=0;i<=a;i++)

{

ls++;

if (text[i]=='\n')

{

hs++;ls=0;

}

}

if (a==-1)

{

printf("查找到结尾没有找到\n输入【R】将重头查找;任意键返回主菜单");

l=0;

fflush(stdin);

pd=getchar();

}

else

{

printf("已经找到在第%d行第%d列,输入【R】继续查找下一处;任意键返回主菜单",hs,ls);

fflush(stdin);

bd=getchar();

if (bd=='R'||bd=='r')

goto loop;

}

if (pd=='R'||pd=='r')

{l=0;chazhao(text,l);}

}

void dayin(char text[])

{

system("cls");

printf("现在文本的内容为:\n");

printf("%s\n",text);

int hs=1,i;

for (i=0;i

{

if (text[i]=='\n')

{

hs++;

}

}

printf("\n文本共有%d行\n",hs);

}

void shuru(char text[])

{

system("cls");

printf("请输入内容(输入@结束输入并返回主菜单):\n");

printf("%s",text);

char c;

int i=ntext,j=ntext;

fflush(stdin);

while ((c=getchar())!='@')

{

text[i]=c;

i++;

ntext=i;

continue;

}

int cout=0,zf=0,h=1,hs=1,zfs=0;

for(;cout

{

zf++;

if(text[cout]=='\n')

{h++;zf--;}

if(text[cout]==' ')

zf--;

}

for(cout=j;cout

{

zfs++;

if(text[cout]=='\n')

{hs++;zfs--;}

if(text[cout]==' ')

zfs--;

}

printf("统计:文本一共有%d个字符,%d行,本次输入了%d个字符,%d行\n",zf,h,zfs,hs);

}

void shanchu(char p[],int l)

{

int i,a=-1,t2=0;

char x[20],px,pd,pdx,c;

system("cls");

printf("%s",p);

printf("\n输入【A】执行查找删除内容;任意键返回主菜单:");

fflush(stdin);

px=getchar();

if (px=='a'||px=='A')

{

printf("\n输入您要删除的内容,以@结束:");

fflush(stdin);

while ((c=getchar())!='@')

{

if (c=='@')

{

break;

}

else

{

x[t2]=c;

t2++;

continue;

}

}

loop:

a=strindex(p,x,t2,l);

int hs=1,ls=0;

for (i=0;i<=a;i++)

{

ls++;

if (p[i]=='\n')

{

hs++; ls=0;

}

}

if (a==-1)

{

printf("已查找结束,您要删除的内容不存在\n输入【R】重新输入要删除的内容;其他键将返回主菜单:");

l=0;

fflush(stdin);

pdx=getchar();

}

else

{

printf("你要删除的内容在第%d行第%d列\n 输入【A】确定删除;输入【B】寻找下个词;其他键将返回主菜单:",hs,ls);

fflush(stdin);

pd=getchar();

l=t2+a;

if (pd=='a'||pd=='A')

{

for(i=a;i

{

p[i]=p[i+t2];

}

ntext=ntext-t2;

printf("删除成功,删除后的内容为:\n%s\n",text);

}

else if (pd=='b'||pd=='B')

goto loop;

}

if(pdx=='r'||pdx=='R')

shanchu(text,l);

}

}

void charu(char text[],int l) //向文本中插入内容

{

system("cls");

int i=0,t=0,t2=0,a=-1,b;

char cr[20]="",pd,x[500],c,d;

printf("\n当前文本信息为:\n");

printf("%s",text);

printf("\n输入您要在哪个内容前插入,以@结束:");

fflush(stdin);

while ((c=getchar())!='@') //用一个数组接收要插入在哪个内容之前

{

if (c=='@')

{

break;

}

else

{

cr[t]=c;

t++;

continue;

}

}

loop:

a=strindex(text,cr,t,l); //查找并返回要插入的位置点

int hs=1,ls=0;

for (b=0;b

{

ls++;

if (text[b]=='\n')

{

hs++;

ls=0;

}

}

if (a==-1)

{

printf("\n查找到结尾没有找到插入点,输入【R】查找其他;按其他键返回菜单:\n");

l=0;

fflush(stdin);

d=getchar();

fflush(stdin);

}

else

{

printf("\n您要插入的位置是第%d行,第%d列之前\n【A】.不是此位置向后继续找插入点\n【B】.在此位置插入\n按其他键返回菜单\n请选择:",hs,ls+1);

fflush(stdin);

pd=getchar();

if (pd=='a'||pd=='A')

{

l=a+t;

goto loop;

}

else if (pd=='b'||pd=='B')

{

printf("\n\n输入您要插入的内容,以@结束:");

fflush(stdin);

while ((c=getchar())!='@')

{

if (c=='@')

{

break;

}

else

{

x[t2]=c;

t2++;

continue;

}

}

for (i=ntext;i>=a;i--)

{

text[i+t2]=text[i];

}

for (i=0;i

{

text[i+a]=x[i];

}

ntext=ntext+t2;

printf("\n当前文本信息为:\n");

for (i=0;i<=ntext-1;i++)

printf("%c",text[i]);

printf("\n文本插入成功\n");

fflush(stdin);

getchar();

}

}

if (d=='r'||d=='R')

{

l=0;

charu(text,l);

}

status=0;

}

void tihan(char p[],int l) //内容替换

{

int t=0,t1=0,i,a,b;

char c,th[20],d,d1,bth[20];

int i2;

system("cls");

printf("\n当前文本信息为:\n");

for (i2=0;i2<=ntext-1;i2++)

printf("%c",p[i2]);

printf("\n输入要被替换的内容,以@结束:");

fflush(stdin);

while ((c=getchar())!='@') //t指替换前内容的长度{

if (c=='@')

{

break;

}

else

{

bth[t]=c;

t++;

continue;

}

}

loop:

a=strindex(p,bth,t,l); //查找要被替换的内容的位置int hs=1,ls=0;

for (b=0;b

{

ls++;

if (p[b]=='\n')

{

hs++;

ls=0;

}

}

if (a==-1)

{

printf("\n查找到结尾没有找到要被替换的内容\n输入【R】查找其他内容,按其他键返回主菜单键\n");

l=0;

d=getchar();

fflush(stdin);

}

else

{

printf("\n\n已经找到要查找的数据在第%d行第%d列\n输入【A】继续向后查找相同内容\n输入其他键将进行替换操作\n请选择:",hs,ls+1);

fflush(stdin);

l=t+a;

char pd;

pd=getchar();

if (pd!='a'&&pd!='A')

{

printf("\n是否要替换该内容?\nA:替换给内容;其他键返回主菜单\n请选择:");

fflush(stdin);

d1=getchar();

if (d1=='a'||d1=='A')

{

printf("\n输入要替换的内容,以@结束:");

fflush(stdin);

while ((c=getchar())!='@') //t1指替换后的内容长度

{

if (c=='@')

{

break;

}

else

{

th[t1]=c;

t1++;

continue;

}

}

if (t==t1) //将要被替换的内容和替换后的内容进行长度比较

{

for (i=0;i

p[i+a]=th[i];

}

else

{

if (t>t1)

{

for (i=0;i

{

p[i+a]=th[i];

}

for (i=a+t1;i

{

p[i]=p[i+t-t1];

}

ntext=ntext+t1-t;

}

else

{

for (i=ntext;i>=a;i--)

{

p[i+t1-t]=p[i];

}

for (i=0;i

{

p[i+a]=th[i];

}

ntext=ntext+t1-t;

}

}

printf("替换成功");

printf("\n当前文本信息为:\n");

for (i2=0;i2<=ntext-1;i2++)

printf("%c",p[i2]);

getchar();

status=0;

}

}

else

goto loop;

}

if(d=='r'||d=='R')

tihan(text,l);

}

void tuichu(int status)

{

char pd;

if(status)

exit(0);

else

printf("还未保存文件,确定退出?(Q.直接退出;Y.保存后退出");

fflush(stdin);

pd=getchar();

if(!(pd=='Q'||pd=='q'))

bc(text);

exit(0);

}

int main()

{

menu();

return (0);

}

相关主题