题目:
【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;