




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课 程 设 计 报 告课程名称 数据结构 课题名称 txt文本编辑器 专 业 通信工程 班 级 学 号 姓 名 指导老师 张鏖烽 彭祯 黄哲 2015年 7 月 5 日湖南工程学院课 程 设 计 任 务 书课程名称 数据结构 课 题 txt文本编辑器 专业班级 学生姓名 学 号 指导老师 张鏖烽 彭祯 黄哲 审 批 张鏖烽 任务书下达日期 2015 年 6 月 29 日任 务 完成日期 2015 年 7 月 5 日目录需求分析41.问题描述:42,基本要求:43.输入形式:54.输出形式:55.测试数据:5概要设计51结构体的定义:52主程序流程图63各函数调用6详细设计71定义单链表72全局
2、变量的定义73函数伪码74各函数调用关系图15调试分析161调试过程中遇到的问题162算法时空分析163经验与体会17用户使用说明17测试结果17附录22课程设计评分表34需求分析1.问题描述:编制一个可实现txt文件编辑系统的程序;输入一个文本,其可统计文本中总字数、英文字母数、空格数等;查找、替换某个字符串;插入删除某个字符串。2,基本要求:统计:统计文本中总字数、英文字母的数量;查找:查找某个字符串出现的次数以及位置;替换:将文本中的某个字符串全部替换为另一个字符串。插入:在某个位置i插入一个字符串;删除:在某个位置i开始删除连续j个字符。3.输入形式:数字,大小写英文字母,空格,标点符
3、号4.输出形式:分行输出字符即文本内容,输出文本英文字母的数量和总字数,输出某一字符串被替换后的文本内容,输出某一字符串被删除后的文本内容,输出插入某一字符串后的文本内容。5.测试数据:从存储器中读取一个txt文件(或以自己的程序文件为例),输出每次操作之后的结果。概要设计1结构体的定义:typedef struct list char data60;/规定一行字不得大于60,大于则换行int line;/输入文章的总行书 int length;/一行字符的实际长度 struct list *next; struct list *pre; LinkList;2主程序流程图主页选择 Bookin
4、函数用于输入文本统计页面Display函数,文本显示文本内容的处理退出英文字母数总字数DeleteReplaceDisplay主页退出Search3各函数调用 (1)Bookin() 文本输入函数(2)Display()文本显示函数(3)Search() 查找函数(4)Statistic() 统计英文字母个数和总字数(5)Delete() 删除函数(6)Resplace() 替换函数(7)Insert () 插入函数(8)Bmenu() 分菜单函数(9) menu() 主菜单函数(10)main() 主函数详细设计1定义单链表 typedef struct listchar data60;/规
5、定一行字不得大于60,大于则换行int line;/输入文章的总行书 int length;/一行字符的实际长度 struct list *next;struct list *pre; LinkList;2全局变量的定义LinkList *h; /定义文章首行的头指针3函数伪码Bookin() 文本输入函数LinkList *temp;/ 定义指针变量*temp,类型LinkListchar ch;int i,j;/定义输入变量ch,变量i变量j分别表示行数和每行字符数;h->next=(LinkList *)malloc(sizeof(LinkList);/申请存储空间h->pr
6、e=NULL;/ 首行头指针的前驱指针为空temp=h->next;/ 首行指针temp->pre=NULL;/ 首行指针的前驱指针也为空temp->length=0;/文章长度初始值为0for(i=0;i<60;i+)temp->datai='0'printf("请输入文章(输入#结束):n");/初始化为字符串结束标志 for(j=0;j<Link_Size;j+)/控制一页 for(i=0;i<60;i+)/控制一行 ch=getchar();/接收输入的字符给ch temp->datai=ch;/ 给t
7、emp指向的行赋值 temp->length+;/行的字符长度加1 if(ch='#') LINE=j; break;/文章结束时,LINE整个文章的行数 if(ch='#') temp->length=i; temp->next=NULL; break; temp->next=(LinkList *)malloc(sizeof(LinkList) ; /若换行,重新分配空间建立下一行 temp->next->pre=temp;/ 给temp的前驱指针赋值 temp=temp->next; /temp指向目前这一行 fo
8、r(i=0;i<60;i+) temp->datai='0'temp->line=LINE+1;/计算整个文章的行数 Display()显示文章内容 int i,j; /定义变量j,i分别为行数和每行字符数 LinkList *p;/ 定义指针变量p=h->next;/指针p指向链表表头 printf("n目前文章的内容:"); for(j=0;j<=LINE&&p!=NULL;j+)/利用循环输出链表中信息即文本内容 for(i=0;(i<60)&&(p->datai)!='
9、#'i+) printf("%c",p->datai); p=p->next;Statistic()统计字数函数 LinkList *temp;/ 定义指针变量temp char ch; int i,j,t; /定义变量j,i分别为行数和每行字符数 int WORD=0,word=0,space=0,num=0, sum1=0,sum2=0; /定义变量大写字母数、小写字母数、空格数、数字数、英文字母数和总字数 temp=h->next;/指针temp指向链表表头 for(j=0;j<=LINE;j+)/利用循环对链表中信息进行判断 for(
10、i=0;(i<60)&&(temp->datai)!='#'i+) ch=temp->datai; if(ch>='A')&&(ch<='Z') WORD+;/记录大写字母数 else if(ch>='a')&&(ch<='z') word+;/记录小写字母数 else if(ch>='0')&&(ch<='9') num+;/记录数字数 else if(ch=
11、9; ')/记录空格数 space+; sum1=WORD+word;/英文字母数 sum2=WORD+word+num +spcace+punct;/文本总字数Search( )查找函数 char Data30 ;/ 定义一个数组,表示需要查找的字符内容 int i,j,k=0,sum=0;/ 定义定义变量j,i,sum表示字母出现次数 int l=1; temp=h->next;/使指针变量指向链表表头 strcpy(Data,str1);/ 将形参中str1的值赋给Data for(i=0;i<=LINE;i+) for(j=0;j<60;j+) if(temp
12、->dataj)=Datak) k+;/将输入的查找字符与文本比较,找到第一个相同的字符 else if(Datak!='0') j=j-k; k=0; /从主串第j-k个位置重新查找 if(Datak='0') sum+; j=j-k+1; printf("tt第%d次出现在第%d行第%d列n",l,i+1,j+1); l+;/此字符出现的次数加1 k=0; continue; temp=temp->next; /指向下一行Delete()删除函数 char Data30; /定义一个数组用来存放需要删除的字符或字符串 Link
13、List *temp,*te; /定义指针变量:LinkList *temp,*te int i,j,k,m,y,num;/定义整形变量用来控制行数、字符数 strcpy(Data,str2); /使用copy函数讲形参中需要删除的字符或字符串赋值给已定义的数组 for(y=0;y<C;y+) /使用循环查找到需要删除字符或者字符串的字符数以及字符或者字符串的位置,以便于删除 num=60;k=0,m=0; temp=h; for(i=0;i<=LINE;i+) /查找匹配的字符或字符串 te=temp; temp=temp->next; for(j=0;j<60;j+
14、) if(temp->dataj)=Datak) k+; else if(Datak!='0') j=j-k;k=0; if(Datak='0') num=j;break; if(num<60) break; for(;i<=LINE;i+) for(;j<60;j+) if(j+1<k) te->data60-k+num=temp->dataj+1;/ 删除的字符串不在最后一行,将由temp指向的那行前移到前行 elsetemp->dataj-k+1=temp->dataj+1;/ 当要删除的字符串在最后一
15、行只要将最后一行的字符前移 te=temp; temp=temp->next;j=0;/在使用循环,从查找到的字符或者字符串开始一行一行的进行删除Insert()插入函数 char Data30; /定义需要插入的字符或者字符串的输入数组 int h,l;/定义需要插入的字符或者字符串的插入的行和列 printf("ntt请输入要插入的字符或字符串:"); getchar(); gets(Data); printf("ntt当前文章内容为:"); Display(); printf("ntt请输入要插入的行:"); scanf(
16、"%d",&h); printf("ntt请输入要插入的列:"); scanf("%d",&l); int i=(h-1)*60+l;/ 定义一个整形变量,确定插入位置 LinkList *a; /定义一指针变量 int n=strlen(Data); int m ; int insertLine=i/60+1;/ 确定插入位置的行数 int line=temp->line;/ 将全局变量记录的行数赋值给line int j; if(insertLine=line)/ 判断插入位置是否在最后一行for(m=tem
17、p->length-1;m>=(i%60)&&n>0;m-) temp->datam+n=temp->datam;/将最后一行插入位置后面的所有字符向后移n位for(m=(i%60),j=0;m<n+(i%60);m+,j+)temp->datam=Dataj; /将要插入的字符或者字符串赋值到要插入的位置 else/如果插入的位置不再最后一行int r=0;for(int p=insertLine; p<line;p+)if(p = insertLine) r=0; elser=n;for(m=temp->length-1
18、-r;m>=0&&n>0;m-)temp->datam+n=temp->datam;/ 将最后一行整体后移n位a=temp;temp = temp->pre;temp->length = 60;for(m = temp->length-n,j=0;m<temp->length;m+,j+)a->dataj=temp->datam; /将前一行后n个字符移到下一行的前n个字符位置for(m=temp->length-n-1;m>=(i%60);m-) temp->datam+n=temp->
19、datam; /插入行位置后的字符后移n位for(m=(i%60),j=0;m<(i%60)+n;m+,j+) temp->datam =Dataj;/将要插入的字符赋值到插入的位置; Replace()替换函数 char Data30; /定义需要替换的字符或者字符串的输入数组 int h,l;/定义需要替换的字符或者字符串的替换的行和列 printf("ntt请输入要替换的字符或字符串:"); getchar(); gets(Data); printf("ntt当前文章内容为:"); Display(); printf("ntt
20、请输入要替换的行:"); scanf("%d",&h); printf("ntt请输入要替换的列:"); scanf("%d",&l); int i=(h-1)*60+l;/ 定义一个整形变量,确定需替换位置 LinkList *a; /定义一指针变量 int n=strlen(Data); int m ; int ReplaceLine=i/60+1;/ 确定替换位置的行数 int line=temp->line;/ 将全局变量记录的行数赋值给line int j; if(ReplaceLine=li
21、ne)/ 判断替换位置是否在最后一行for(m=(i%60),j=0;m<n+(i%60);m+,j+)temp->datam=Dataj; /将要替换的字符或者字符串赋值到要替换的位置 else/如果替换的位置不再最后一行int r=0;for(int p=ReplaceLine; p<line;p+)if(p = ReplaceLine) r=0; elser=n;for(m=(i%60),j=0;m<(i%60)+n;m+,j+) temp->datam =Dataj;/将要替换的字符赋值到替换的位置4各函数调用关系图Main() Menu()Bookin(
22、)Display()Statistic()Search()Replace()Insert()Delete()调试分析1调试过程中遇到的问题由于首先没设置数组最大值,导致数组不能正确输入,后来定义了#define maxsize 100才解决这个问题开始统计中没有考虑空格和标点符号导致统计不正确插入时根本找不着插入位置。后来设置了头指针和指针变量2算法时空分析本算法的空间复杂度为O(N)。输出函数、查找函数算法时间复杂度均为O(N),其他函数的时间复杂度较高3经验与体会通过这次充实的课程设计,我们的上机实践没有像这次课程设计一样做一个完整的程序来实现txt编辑器的功能。因此,
23、这次课程设计锻炼了我的实践能力,在课程设计的过程,我遇到了许多问题,多亏老师和同学的帮助。 虽然结果十分重要,但是过程更加宝贵。总体来说,课程设计锻炼了我的动手能力,相对加强了对课本知识的应用。 用户使用说明进入主页后选择你想要的功能。如果是第一次运行则需要选择1号功能输入文本,输入后若是想查看输入的文本则选择2,若是想退出系统则选择5;若是想统计英文字母数字和总数字则选择3。若是想查找,删除,插入,替换字符或者字符串则选择4即可。进入统计和处理分菜单后则可选择你想要的功能号,按照提示进行操作。测试结果进入主页,选择1号功能输入文本本:显示输入的文本内容:选择3号功能,进入文本内容统
24、计页面:选择想要统计的内容,比如选择1号统计大写字母的个数,Hello 2015!的大写字母有1个:小写字母有4个:总字数有11个,包括英文字母5个,标点符号1个,空格符号1个,数字4个:退出统计界面,返回主菜单:查找字符串2015:删除字符串2015:插入字符串2014:用字符串good替换Hell:退出系统:附录#include"stdio.h"#include"malloc.h"#include"string.h"#include"iostream.h"#include"stdlib.h"
25、#include"conio.h"#define Link_Size 100typedef struct list char data60; /规定一行字不得大于60,大于则换行int line; /输入文章的总行书 int length; /一行字符的实际长度 struct list *next; struct list *pre; LinkList;LinkList *h;int LINE,C,N;LinkList *Bookin() LinkList *temp; / 定义指针变量*temp,类型LinkList char ch; int i,j; h->nex
26、t=(LinkList *)malloc(sizeof(LinkList); /申请存储空间 h->pre=NULL;/ 首行头指针的前驱指针为空 temp=h->next; / 首行指针 temp->pre=NULL;/ 首行指针的前驱指针也为空 temp->length=0; for(i=0;i<60;i+) temp->datai='0' printf("请输入文章(输入#号结束):n"); for(j=0;j<Link_Size;j+) /控制一页 for(i=0;i<60;i+) /控制一行 ch=g
27、etchar(); temp->datai=ch;/ 给temp指向的行赋值 temp->length+; if(ch='#') LINE=j; /文章结束时,LINE整个文章的行数 break; if(ch='#') temp->length=i; temp->next=NULL; break; temp->next=(LinkList *)malloc(sizeof(LinkList) ; /若换行,重新分配空间建立下一行 temp->next->pre=temp; / 给temp的前驱指针赋值 temp=temp-
28、>next; /temp指向目前这一行 for(i=0;i<60;i+) temp->datai='0' temp->line=LINE+1; /计算整个文章的行数 return temp;void Display()int i,j;LinkList *p;p=h->next; /指针p指向链表表头printf("n目前文章的内容:");for(j=0;j<=LINE&&p!=NULL;j+) /利用循环输出链表中信息即文本内容for(i=0;(i<60)&&(p->datai)
29、!='#'i+)printf("%c",p->datai);p=p->next;void Statistic() LinkList *temp; / 定义指针变量temp char ch; int i,j,t; int WORD=0,word=0,space=0,num=0,punct=0,sum1=0,sum2=0; temp=h->next; /指针temp指向链表表头 for(j=0;j<=LINE;j+)/利用循环对链表中信息进行判断 for(i=0;(i<60)&&(temp->datai)!=&
30、#39;#'i+) ch=temp->datai; if(ch>='A')&&(ch<='Z') WORD+; else if(ch>='a')&&(ch<='z') word+; else if(ch>='0')&&(ch<='9') num+; else if(ch=' ') space+; else if(ch=33|ch=34|ch=39|ch=44|ch=46|ch=58|ch
31、=59|ch=63) punct+; sum1=WORD+word; sum2=WORD+word+num+space+punct; while(1) printf("n"); printf("tt* 文本内容统计 *n"); printf("n"); printf("tt* 1、文本中大写字母的个数 *n"); printf("tt* 2、文本中小写字母的个数 *n"); printf("tt* 3、文本中英文字母的个数 *n"); printf("tt* 4、文
32、本中数字的个数 *n"); printf("tt* 5、文本中所有字数 *n"); printf("tt* 6、返回主菜单 *n"); printf("tt* 7、直接退出本系统 *n"); printf("tt请选择选项:"); scanf("%d",&t); switch(t) case 1: printf("ntt文本中大写字母的个数:%dn",WORD); printf("按回车键继续····
33、3;");getchar();/接受回车键被接收输出 getchar(); break; case 2: printf("ntt文本中小写字母的个数:%dn",word); printf("按回车键继续·····");getchar(); getchar();break; case 3: printf("ntt文本中英文字母的个数:%dn",sum1); printf("按回车键继续·····");getc
34、har();getchar();break; case 4: printf("ntt文本中数字的个数:%dn",num); printf("按回车键继续·····");getchar(); getchar();break; case 5: printf("ntt文本中所有字数:%dn",sum2); printf("按回车键继续·····");getchar();getchar(); break; if(t=6) b
35、reak; if(t=7) exit(0); void Search(char *str1,LinkList* temp) char Data30 ; / 定义一个数组,表示需要查找的字符内容 int i,j,k=0,sum=0; ;/ 定义定义变量j,i,sum表示字母出现次数int l=1; temp=h->next; strcpy(Data,str1); for(i=0;i<=LINE;i+) for(j=0;j<60;j+) if(temp->dataj)=Datak) k+;/将输入的查找字符与文本比较,找到第一个相同的字符 else if(Datak!=
36、39;0')j=j-k; /从主串第j-k个位置重新查找k=0; if(Datak='0') sum+;j=j-k+1;printf("tt第%d次出现在第%d行第%d列n",l,i+1,j+1);l+;k=0;continue; temp=temp->next; printf("ttt字符串总共出现次数为:%dnn",sum); C=sum;N=i*60+j; void Delete(char *str2) char Data30; /定义一个数组用来存放需要删除的字符或字符串 LinkList *temp,*te; in
37、t i,j,k,m,y,num; /定义整形变量用来控制行数、字符数 strcpy(Data,str2); for(y=0;y<C;y+) /使用循环查找到需要删除字符或者字符串的字符数以及字符或者字符串的位置,以便于删除 num=60;k=0,m=0; temp=h; for(i=0;i<=LINE;i+) /查找匹配的字符或字符串 te=temp; temp=temp->next; for(j=0;j<60;j+) if(temp->dataj)=Datak) k+; else if(Datak!='0') j=j-k;k=0; if(Data
38、k='0') num=j;break; if(num<60) break; for(;i<=LINE;i+) for(;j<60;j+) if(j+1<k) te->data60-k+num=temp->dataj+1; / 删除的字符串不在最后一行,将由temp指向的那行前移到前行 elsetemp->dataj-k+1=temp->dataj+1; te=temp; temp=temp->next; j=0; LinkList * Replace(LinkList *temp) char Data30; int h,l;
39、 printf("ntt请输入想要替换的字符或字符串:");getchar();gets(Data);printf("ntt请输入要替换的行:");scanf("%d",&h);printf("ntt请输入要替换的列:");scanf("%d",&l); int i=(h-1)*60+l; / 定义一个整形变量,确定位置 LinkList *a; /定义一指针变量int n=strlen(Data);int m ;int replaceLine=i/60+1; / 确定位置的行数
40、int line=temp->line; / 将全局变量记录的行数赋值给lineint j;if(replaceLine=line) / 判断插入位置是否在最后一行for(m=(i%60),j=0;m<n+(i%60);m+,j+)temp->datam=Dataj;/将要替换的字符或者字符串赋值到要替换的位置 elseint r=0;for(int p=replaceLine; p<line;p+)if(p = replaceLine) r=0; elser=n;for(m=(i%60),j=0;m<(i%60)+n;m+,j+) temp->datam
41、=Dataj;return temp;LinkList * Insert(LinkList *temp) char Data30;/同上replace函数 int h,l; printf("ntt请输入要插入的字符或字符串:");getchar();gets(Data);printf("ntt当前文章内容为:");Display();printf("ntt请输入要插入的行:");scanf("%d",&h);printf("ntt请输入要插入的列:");scanf("%d&qu
42、ot;,&l); int i=(h-1)*60+l;LinkList *a;int n=strlen(Data);int m ;int insertLine=i/60+1;int line=temp->line;int j;if(insertLine=line)for(m=temp->length-1;m>=(i%60)&&n>0;m-)temp->datam+n=temp->datam;/将最后一行插入位置后面的所有字符向后移n位for(m=(i%60),j=0;m<n+(i%60);m+,j+)temp->datam=
43、Dataj; /将要插入的字符或者字符串赋值到要插入的位置 else/如果插入的位置不再最后一行int r=0;for(int p=insertLine; p<line;p+)if(p = insertLine) r=0; elser=n;for(m=temp->length-1-r;m>=0&&n>0;m-)temp->datam+n=temp->datam; / 将最后一行整体后移n位a=temp;temp = temp->pre;temp->length = 60;for(m = temp->length-n,j=0;
44、m<temp->length;m+,j+)a->dataj=temp->datam; /将前一行后n个字符移到下一行的前n个字符位置for(m=temp->length-n-1;m>=(i%60);m-) temp->datam+n=temp->datam;for(m=(i%60),j=0;m<(i%60)+n;m+,j+) temp->datam =Dataj; /将要插入的字符赋值到插入的位置return temp;void Bmenu(LinkList *temp) char str130;char str230;int a;d
45、o printf("n");printf("tt* 文本内容处理 *n");printf("tt* 1、查找文本中的字符或者字符串 *n");printf("tt* 2、删除文本中的字符或者字符串 *n");printf("tt* 3、插入字符或者字符串 *n");printf("tt* 4、替换字符或者字符串 *n");printf("tt* 5、显示目前文本内容 *n");printf("tt* 6、返回主菜单 *n");printf("tt* 7、直接退出系统 *n");printf("tt 请选择选项:");scanf("%d",&a);switch(a)case 1: printf("ttt请输入要查找的字符或字符串:"); getchar(); gets(str1); Search(str1,temp); printf("按回车键继续·····"
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 深入解析食品质检员考试试题及答案
- ug考试题目及答案大全
- 检视2024年统计学考试解题案例题目及答案
- 动力系统与底盘调节试题及答案
- 二手车评估师考试中的判断逻辑和2024年试题答案
- 2025年小学语文考前必读试题及答案
- 审视2024年汽车维修工考试的发展历史与试题及答案
- 2024年汽车维修工前沿技术探讨试题及答案
- 古代文学史细节考察试题及答案
- 2024-2025学年河南省驻马店新蔡一高高一下学期2月月考地理试题及答案
- 2023多囊卵巢综合征诊治路径专家共识(最全版)
- 垃圾清运重点难点和解决措施
- TSDPIA 05-2022 宠物猫砂通用技术规范
- GA 1813-2022水利系统反恐怖防范要求
- 铸铁闸门安装评定表
- GB/T 12747.1-2004标称电压1kV及以下交流电力系统用自愈式并联电容器第1部分:总则-性能、试验和定额-安全要求-安装和运行导则
- GB 8537-2018食品安全国家标准饮用天然矿泉水
- 政治学基础课件全部终稿
- 中国医科大学22秋学期《病理学(本科)》实践考试试题参考资料
- 四年级英语下册 Unit6 PartA教案 闽教版
- 一年级下册音乐教案第三单元 唱歌 咏鹅|人教版
评论
0/150
提交评论