数据结构与算法简单的文本编辑器.docx
- 文档编号:10860366
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:32
- 大小:664.77KB
数据结构与算法简单的文本编辑器.docx
《数据结构与算法简单的文本编辑器.docx》由会员分享,可在线阅读,更多相关《数据结构与算法简单的文本编辑器.docx(32页珍藏版)》请在冰豆网上搜索。
数据结构与算法简单的文本编辑器
计算机科学与技术系
课程设计报告
2008~2009学年第二学期
《
课程
数据结构与算法
课程设计名称
简单的文本编辑器
学生姓名
学号
专业班级
:
指导教师
2009年6月
题目:
简单的文本编辑器
1、题目及要求
名称:
简单的文本编辑器
(
内容:
输入一页文字,程序可以统计出文字、数字、空格的个数。
静态存储一页文章,每行最多不超过80个字符,共N行。
要求:
(1)分别统计出其中英文字母数和空格数及整篇文章总字数;
(2)统计某一字符串在文章中出现的次数,并输出该次数;
(3)删除某一字符或者子串,并将后面的字符前移。
(4)插入某一字符或者子串。
(5)查找某一字符或者子串。
存储结构使用线性表,分别用几个子函数实现相应的功能;输入数据的形式和范围:
可以输入大写、小写的英文字母、任何数字及标点符号。
输出形式:
(1)分行输出用户输入的各行字符;
(2)分4行输出"全部字母数"、"数字个数"、"空格个数"、"文章总字数"
(
(3)输出删除某一字符串后的文章。
通过题目及其要求可知,本程序应实现以下功能:
(1)文章内容的输入:
包括字母、标点符号、数字等;
(2)文章内容的统计:
包括文章中大写字母、小写字母、数字、标点符号、空格以
及文章所有字数的个数的统计;
(3)文章内容的处理:
包括对文章内容的查找、删除以及对指定位置进行插入操作,
其中在查找的过程中统计出该字符或字符串在文章中出现的次数;
1、问题分析
本程序是对一段英文文章的内容进行处理,存储方式采用链式存储,没有文件操作,故本程序对其文本内容的所有操作都是在链表中进行的。
对于文本的输入,采用头插法将文本信息存储到链表已申请好的存储空间中,在此部分设计中最大的问题在于输入文章过程中输入的字符数大于80时如何换行;对于文本内容的统计,使用循环对已存储的文章进行匹配,大写字母数、小写字母数、空格数、数字数直接通过比较即可得到,标点符号通过ASCⅡ比较即可得到;对于文本内容的处理,查找部分仍是使用循环对已存储的文章进行匹配,判断需要查找的字符或者字符串是否与文章中某部分内容相同,如果存在相同的记录相同的个数及位置并输出个数及位置。
删除部分先使用程序的查找功能对文章中需要删除的字符或者字符串进行查找,然后对其进行删除。
插入部分为通过输入的插入位置(行、列)将字符或者字符串插入到文章制定位置。
}
一、数据结构选择和概要设计
数据结构选择:
本程序是对输入的文字进行操作,故使用的数据结构为单链表操作。
根据第一部分的问题分析有该链表操作有3部分:
Pre
Temp
Next
另有全局变量*head,作为文章的头指针。
故创建了以下结构体:
typedefstruct_list
{chardata[80];
sum=0;
a、对形参中定义的指针变量进行操作,使其指向链表表头:
temp=head->next;
b、使用VC++中的拷贝函数,将形参中str1的值赋给Data:
strcpy(Data,str1);
c、利用循环进行查找操作,核心算法为:
if((temp->data[j])==Data[k])
(
k++;That is the Art of Life. You can learn slowly, and sometimes painfully, by just waiting for life to happen to you. Or you can choose to accelerate your growth and intentionally devour life and all it offers. You are the artist that paints your future with the brush of today.
运行程序后:
图5程序主菜单
按照注先选择1号功能有:
图6文本输入
输入完文字后退回到主菜单,然后选择2号功能有:
图7当前文本输出
[
返回后回到主菜单,然后选择3号功能进入文本内容统计菜单有:
图8文章内容统计菜单
选择1-6号功能有:
;
图9统计各功能显示结果
如果选择7回到主菜单,选择8直接退出程序。
回到主菜单后选择4号功能有:
图10文章内容处理菜单
选择1后有:
图11文本查找结果
(
选择2后有:
图12文章删除结果
选择3后有:
图13文章插入结果
全部结束后按5回主菜单,按6直接退出程序。
回主菜单后选择5有:
]
图14关于界面
回主菜单选择6后退出本程序。
六、用户使用说明
本程序是在VC++中编写,程序运行环境:
DOS
根据程序的提示即可完成文本编辑器的各项功能。
七、参考文献
~
1].王昆仑、李红。
《数据结构与算法》。
北京:
中国铁道出版社。
八、附录:
#include""
#include""
#include""
#include""
#include""
¥
#include""
#defineLink_Size100
intNUM,C,N;
typedefstructlist
{
chardata[80];
intlength;
、
structlist*next;
structlist*pre;
introw;
}LinkList;
LinkList*head;
voidHeadWord()
{
//system("cls");
(
printf("\t\t****************************************************\n");
printf("\t\t****欢迎使用简单的文本编辑器****\n");
printf("\t\t****************************************************\n");
}
LinkList*CreatWord()
{
LinkList*temp;
、
charch;
inti,j;
head->next=(LinkList*)malloc(sizeof(LinkList));
head->pre=NULL;
temp=head->next;
temp->pre=NULL;
temp->length=0;
for(i=0;i<80;i++)
/
temp->data[i]='\0';
printf("开始创建文本,请输入文章(输入#号结束):
\n");
for(j=0;j { for(i=0;i<80;i++) { ch=getchar(); temp->data[i]=ch; temp->length++; ' if(ch=='#') { NUM=j; break; } } if(ch=='#') { temp->length=i; temp->next=NULL; ! break; } temp->next=(LinkList*)malloc(sizeof(LinkList)); temp->next->pre=temp; temp=temp->next; for(i=0;i<80;i++) temp->data[i]='\0'; } temp->row=NUM+1; 】 system("cls"); returntemp; } voidPrintWord() { inti,j; LinkList*p; p=head->next; ; system("cls"); HeadWord(); printf("\n当前文章的内容是: "); for(j=0;j<=NUM&&p! =NULL;j++) { for(i=0;(i<80)&&(p->data[i])! ='#';i++) { printf("%c",p->data[i]); } p=p->next; — } } voidCountWord() { LinkList*temp; charch; inti,j,t; intWORD=0,word=0,space=0,num=0,punct=0,sum=0; ^ temp=head->next; for(j=0;j<=NUM;j++) { for(i=0;(i<80)&&(temp->data[i])! ='#';i++) { ch=temp->data[i]; if((ch>='A')&&(ch<='Z')) WORD++; elseif((ch>='a')&&(ch<='z')) word++; ¥ elseif((ch>='0')&&(ch<='9')) num++; elseif(ch=='') space++; elseif(ch==33||ch==34||ch==39||ch==44||ch==46||ch==58||ch==59||ch==63) {punct++;} } sum=WORD+word+num; } while (1) · { printf("\n"); HeadWord(); printf("\t\t****************************************************\n"); printf("\t\t****文章内容统计菜单****\n"); printf("\t\t****************************************************\n"); printf("\t\t****1、文章中大写字母的个数****\n"); printf("\t\t****2、文章中小写字母的个数****\n"); printf("\t\t****3、文章中数字的个数****\n"); printf("\t\t****4、文章中标点符号的个数****\n"); \ printf("\t\t****5、文章中空格的个数****\n"); printf("\t\t****6、文章中所有字数****\n"); printf("\t\t****7、退出返回主菜单****\n"); printf("\t\t****8、直接退出本系统****\n"); printf("\t\t****************************************************\n"); printf("\t\t请选择需统计项目: "); scanf("%d",&t); switch(t) { case1: } system("cls"); HeadWord(); printf("\n\t\t文章中大写字母的个数: %d\n",WORD); printf("按回车键继续·····"); getchar(); getchar(); system("cls"); break; case2: system("cls"); ( HeadWord(); printf("\n\t\t文章中小写字母的个数: %d\n",word); printf("按回车键继续·····"); getchar(); getchar(); system("cls"); break; case3: system("cls"); HeadWord(); ( printf("\n\t\t文章中数字的个数: %d\n",num); printf("按回车键继续·····"); getchar(); getchar(); system("cls"); break; case4: system("cls"); HeadWord(); printf("\n\t\t文章中标点符号的个数: %d\n",punct); ' printf("按回车键继续·····"); getchar(); getchar(); system("cls"); break; case5: system("cls"); HeadWord(); printf("\n\t\t文章中空格的个数: %d\n",space); printf("按回车键继续·····"); ( getchar(); getchar(); system("cls"); break; case6: system("cls"); HeadWord(); printf("\n\t\t文章中所有字数: %d\n",sum); printf("按回车键继续·····"); getchar(); ; getchar(); system("cls"); break; } if(t==7) {system("cls");break;} if(t==8)exit(0); } { } voidSearchWord(char*str1,LinkList*temp) { charData[20]; inti,j,k=0,sum=0; intl=1; ( temp=head->next; strcpy(Data,str1); for(i=0;i<=NUM;i++) { for(j=0;j<80;j++) { if((temp->data[j])==Data[k])k++; elseif(Data[k]! ='\0') { > j=j-k; k=0; } if(Data[k]=='\0') { sum++; j=j-k+1; printf("\t\t第%d次出现在第%d行第%d列\n",l,i+1,j+1); l++; ~ k=0; continue;} } temp=temp->next; } printf("\t\t\t字符串总共出现次数为: %d\n\n",sum); C=sum; N=i*80+j; } % voidDeleteWord(char*str2) {charData[20]; LinkList*temp,*term; inti,j,k,m,y,num; strcpy(Data,str2); for(y=0;y { ' num=80; k=0,m=0; temp=head; for(i=0;i<=NUM;i++) { term=temp; temp=temp->next; for(j=0;j<80;j++) { if((temp->data[j])==Data[k])k++; ~ elseif(Data[k]! ='\0'){j=j-k;k=0;} if(Data[k]=='\0') { num=j; break; } } if(num<80)break; } for(;i<=NUM;i++) : { for(;j<80;j++) { if(j+1 { term->data[80-k+num]=temp->data[j+1]; } else temp->data[j-k+1]=temp->data[j+1]; } term=temp; temp=temp->next; j=0; } } } LinkList*InsertWord(LinkList*temp) { { charData[20]; inth,l; printf("\n\t\t请输入要插入的字符或字符串: "); getchar(); gets(Data); printf("\n\t\t当前文章内容为: "); PrintWord(); ( printf("\n\t\t请输入要插入的行: "); scanf("%d",&h); printf("\n\t\t请输入要插入的列: "); scanf("%d",&l); inti=(h-1)*80+l; LinkList*a; intn=strlen(Data); \ intm; intinsertRow=i/80+1; introw=temp->row; intj; if(insertRow==row) { for(m=temp->length-1;m>=(i%80)&&n>0;m--) temp->data[m+n]=temp->data[m]; for(m=(i%80),j=0;m { $ temp->data[m]=Data[j]; } } else { intr=0; for(intp=insertRow;p { if(p==insertRow) r=0; } else r=n; for(m=temp->length-1-r;m>=0&&n>0;m--) temp->data[m+n]=temp->data[m]; a=temp; temp=temp->pre; temp->length=80; for(m=temp->length-n,j=0;m a->data[j]=temp->data[m]; ~ } for(m=temp->length-n-1;m>=(i%80);m--) temp->data[m+n]=temp->data[m]; for(m=(i%80),j=0;m<(i%80)+n;m++,j++) temp->data[m]=Data[j]; } returntemp; } | voidBmenu(LinkList*temp) { charstr1[20]; charstr2[20]; inta; do { HeadWord(); printf("\n\t\t****************************************************\n"); printf("\t\t****文章内容处理菜单****\n"); : printf("\t\t****************************************************\n"); printf("\t\t****1、查找文章中的字符或者字符串****\n"); printf("\t\t****2、删除文章中的字符或者字符串****\n"); printf("\t\t****3、向文章中插入字符或者字符串****\n"); printf("\t\t****4、显示当前文章内容****\n"); printf("\t\t****5、返回主菜单****\n"); printf("\t\t****6、直接退出系统****\n"); printf("\t\t****************************************************\n"); printf("\t\t请选择: "); scanf("%d",&a); @ switch(a) { case1: system("cls"); HeadWord(); printf("\t\t\t请输入您需要查找的字符或字符串: "); getchar(); gets(str1); SearchWord(str1,temp); $ printf("按回车键继续·····"); getchar(); getchar(); system("cls"); break; case2: system("cls"); HeadWord(); printf("\t\t\t请输入您需要删除的字符或字符串: "); getchar(); 、 gets(str2); SearchWord(str2,temp); DeleteWord(str2); printf("\t\t\t删除%s后的文章为: ",str2); PrintWord(); printf("按回车键继续·····"); getchar(); getchar(); system("cls"); break; · case3: system("cls"); HeadWord(); InsertWord(temp); printf("\t\t\t插入字符或字符串后文章为: "); PrintWord(); printf("按回车键继续·····"); getchar(); getchar(); system("cls"); { break; case4: system("cls"); HeadWord(); PrintWord(); printf("按回车键继续·····"); getchar(); getchar(); system("cls"); break; < } if(a==5) { system("cls"); break; } if(a==6)exit(0); }while (1); } > voidAboutWord() { printf("\n\n\t\t关于\n"); printf("\t\t**************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 简单 文本 编辑器
![提示](https://static.bdocx.com/images/bang_tan.gif)