《字符统计(课程设计报告)(共22页).doc》由会员分享,可在线阅读,更多相关《字符统计(课程设计报告)(共22页).doc(22页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上字符统计课程设计姓名: 学号:1*64068一 、 目的利用数据结构课程的相关知识完成一个具有一定难度的综合设计题目,利用C/C+语言进行程序设计,并规范地完成课程设计报告。通过课程设计,巩固和加深对线性表、栈、队列、字符串、树、图、查找、排序等理论知识的理解;掌握现实复杂问题的分析建模和解决方法(包括问题描述、系统分析、设计建模、代码实现、结果分析等);提高利用计算机分析解决综合性实际问题的基本能力。具体要求如下:1、 对现实复杂问题中的数据对象特性及组织方法进行分析和研究,设计适当的数据逻辑结构、存贮结构以及相应运算操作,把现实世界问题建模转化为计算机内部表示并进
2、行处理。2、 采取模块化方式进行程序设计,要求程序的功能设计、数据结构设计及整体结构设计合理。学生也可根据自己对题目的理解增加新的功能模块(视情况可另外加分)。3、 系统以菜单界面方式(至少采用文本菜单界面,如能采用图形菜单界面更好)工作,运行界面友好,演示程序以用户和计算机的对话方式进行,利用文件进行数据的提取与存储。4、 程序算法说明清晰,理论分析与计算正确,运行情况良好,实验测试数据无误,容错性强(能对错误输入进行判断控制)。5、 编程风格良好(包括缩进、空行、适当注释、变量名和函数名见名知意,程序容易阅读等);6、 写出规范的课程设计报告,具体要求见相关说明文档。 二 、 需求分析1、
3、课程设计要求1、功能:统计出一篇文档中字符、数字、空格的个数。2、以文件形式存储一篇文章:(1)分别统计出其中英文字母数和空格数及整篇文章总字数;(2)统计某一字符串在文章中出现的次数,并输出该次数;(3)删除某一子串,并将后面的字符前移。3、输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号。4、输出形式:(1)分行输出用户输入的各行字符;(2)分4行输出全部字母数、数字个数、空格个数、文章总字数(3)输出删除某一字符串后的文章;2、问题分析本程序是对一段英文文章的内容进行处理,存储方式采用链式存储,没有文件操作,故本程序对其文本内容的所有操作都是在链表中进行的。对于文本
4、的输入,采用头插法将文本信息存储到链表已申请好的存储空间中,在此部分设计中最大的问题在于输入文章过程中输入的字符数大于80时如何换行;对于文本内容的统计,使用循环对已存储的文章进行匹配,大写字母数、小写字母数、空格数、数字数直接通过比较即可得到,标点符号通过ASC比较即可得到;对于文本内容的处理,查找部分仍是使用循环对已存储的文章进行匹配,判断需要查找的字符或者字符串是否与文章中某部分内容相同,如果存在相同的记录相同的个数及位置并输出个数及位置。删除部分先使用程序的查找功能对文章中需要删除的字符或者字符串进行查找,然后对其进行删除。插入部分为通过输入的插入位置(行、列)将字符或者字符串插入到文
5、章制定位置。三 、 概要设计概要设计:程序框架:* 欢迎使用简单的文本编辑器 * 主菜单 * 1、输入文本内容 * 2、显示当前文本内容 * 3、文本内容统计菜单 * * 4、文本内容处理菜单 * 5、关于 * 6、退出本系统 * 注:第一次使用本系统时请选择1号功能 *判断123456文本内容的输入,CreatWord(),将文本内容输入到已申请的存储空间中显示函数,PrintWord(),将当前文本中内容显示出来文章内容统计菜单,CountWord(),以菜单形式显示给用户,对文章的内容进行各种方式的统计文章内容处理菜单,Bmenu(),这部分为一子菜单,使用了包括SearchWord()
6、、DeleteWord()、InsertWord()三个函数,对文章内容进行处理一个类似与作者信息的代码,AboutWord(),显示作者信息退出系统图1 简单的文本编辑器主框架* 文章内容统计菜单 * 1、文章中大写字母的个数 * 2、文章中小写字母的个数 * 3、文章中数字的个数 * 4、文章中标点符号的个数 * 5、文章中空格的个数 * 6、文章中所有字数 * 7、退出返回主菜单 * 8、直接退出本系统 * *判断统计文本中大写字母个数1统计文本中小写字母个数2统计文本中数字的个数3统计文本中标点符号的个数4统计文本中空格的个数5统计文本所有字数6返回到主菜单7直接退出系统8两个子菜单:
7、如选择上图中功能3,则有:图2 字符统计-文本内容统计菜单如选择功能4,则有:* 文章内容处理菜单 * 1、查找文章中的字符或者字符串 * 2、删除文章中的字符或者字符串 * 3、向文章中插入字符或者字符串 * 4、显示当前文章内容 * 5、返回主菜单 * 6、直接退出系统 *判断123456使用子函数SearchWord(),对存储在链表中的文本进行字符或者字符串查找使用子函数DeleteWord(),对存储在链表中文本进行字符或者字符串的删除使用子函数InsertWord(),对存储在链表中的文本进行字符或者字符串的插入使用函数PrintWord()将当前文本信息显示出来返回到主菜单继续其
8、他菜单结束整个程序图3 字符统计-文本内容处理菜单根据以上各图,本程序共设计了11个函数。1、HeadWord() 标题函数,即一个输出标题,永远出现在程序的最顶端。2、CreatWord() 文本输入函数,实现上图1菜单功能1,对文本的内容进行输入;3、PrintWord() 当前文本内容输出函数,实现上图1菜单功能2以及图3中功能4,将当前存储在链表中的文本内容输出;4、CountWord() 文章内容统计函数,实现上图1菜单功能3,对存储在链表中文本内容进行统计,包括对文本内容中的大写字母、小写字母、数字、标点符号、空格以及文章所有字数的个数的统计;图2是对其完整描述;5、SearchW
9、ord() 文章内容查找函数,实现上图3菜单功能1中查找部分;6、DeleteWord() 文章内容删除函数,实现上图3菜单功能2中删除部分;7、InsertWord() 文章内容插入函数,实现上图3菜单功能3中插入部分;8、Bmenu() 第二子菜单函数,实现上图1菜单功能4,图3是此函数实现的结果,它将5、6、7各子函数集合在此函数中;9、AboutWord() 显示作者信息的函数,实现上图1菜单功能5。10、menu() 主菜单函数,其结果为图1所显示部分,将1、2、3、4、8、9等函数集合。11、main()主函数各函数关系用流程图形式绘制如下:menuCreatWordCountWo
10、rdBmenuSearchWordDeleteWordInsertWordAboutWordPrintWordEndmain图4各函数之间的关系四 、 详细设计#includestdio.h#includemalloc.h#includestring.h#includestdlib.h#includeconio.h#define Link_Size 100int NUM,C,N; /定义全局变量,Num用来记录行号,C用来记录子串在主串中出现的总次数typedef struct list char data80; /记录一行字符 int length; /记录一行字符长度 struct lis
11、t *next; / 后继指针 struct list *pre; /前趋指针 int row; /记录整篇文章的行数 LinkList;LinkList *head; /定义全局变量*head,文章首行头指针void HeadWord()/system(cls); printf(tt*n);printf(tt* 欢迎使用简单的文本编辑器 *n);printf(tt*n);LinkList *CreatWord()/文本内容输入函数 LinkList *temp;/ 定义LinkList指针变量*temp char ch;/ 定义文本输入变量ch int i,j;/ 记录文本行数变量j,记录每
12、行字符数变量i head-next=(LinkList *)malloc(sizeof(LinkList);/ 申请动态存储空间 head-pre=NULL;/ 首行头指针的前驱指针为空 temp=head-next;/ 首行指针 temp-pre=NULL; / 首行指针的前驱指针也为空 temp-length=0;/定义没输入字符时文章长度为0 for(i=0;idatai=0;/ 初始化为字符串结束标志,防止出现乱码printf(开始创建文本,请输入文章(输入#号结束):n);for(j=0;jLink_Size;j+)/ 控制一页 for(i=0;idatai=ch; /给temp指向
13、的行赋值 temp-length+;/行中字符长度加1 if(ch=#) NUM=j; break; /文章结束时,Num来记录整个文章的行数 if(ch=#) temp-length=i; temp-next=NULL; break; temp-next=(LinkList *)malloc(sizeof(LinkList) ;/ 在字符输入的过程中,如果在单行输入的字符超过了80个字符,则需要以下操作,输入字符数大于80,重新分配空间建立下一行 temp-next-pre=temp;/ 给temp的前驱指针赋值 temp=temp-next;/ temp指向当前行 for(i=0;idat
14、ai=0; /将下一行初始化为字符串结束标志,防止出现乱码temp-row=NUM+1;/ 记录整个文章的行数system(cls);return temp;/ 记录整个文章的行数void PrintWord()/当前文本输出函数int i,j;/ 定义文本行数变量j,每行字符数iLinkList *p;/ 定义指针变量p=head-next;/ 将指针p指向链表表头system(cls); HeadWord();printf(n当前文章的内容是:);for(j=0;j=NUM&p!=NULL;j+)for(i=0;(idatai)!=#;i+) /利用循环输出链表中信息printf(%c,p
15、-datai);p=p-next; void CountWord()/文本内容统计函数 LinkList *temp;/ 定义指针变量temp char ch; int i,j,t;/ 定义记录文本行数变量j,每行字符数i int WORD=0,word=0,space=0,num=0,punct=0,sum=0;/ 定义记录文本大写字母数、小写字母数、空格数、数字数、标点数和总字数的变量: temp=head-next;/ 将指针temp指向链表表头 for(j=0;j=NUM;j+) for(i=0;(idatai)!=#;i+) ch=temp-datai; if(ch=A)&(ch=a
16、)&(ch=0)&(chnext; /对形参中定义的指针变量进行操作,使其指向链表表头 strcpy(Data,str1); /使用VC+中的拷贝函数,将形参中str1的值赋给Data for(i=0;i=NUM;i+) for(j=0;jdataj)=Datak) k+;/将输入的查找字符与链表中信息比较,找到第一个相同的字符 else if(Datak!=0)j=j-k;k=0; /从主串第j-k个位置重新查找 if(Datak=0) sum+;/此字符出现的次数加1j=j-k+1; /j记录下该字符串出现的位置printf(tt第%d次出现在第%d行第%d列n,l,i+1,j+1);l+
17、;k=0;continue; temp=temp-next; /指向下一行 printf(ttt字符串总共出现次数为:%dnn,sum); C=sum;N=i*80+j; void DeleteWord(char *str2) /文本内容删除函数 char Data20;/ 定义一个数组用来存储需要删除的字符或者字符串 LinkList *temp,*term; /定义指针变量 int i,j,k,m,y,num;/ 定义整形变量用来控制行数、字符数 strcpy(Data,str2);/ 使用VC+中拷贝函数讲形参中需要删除的字符或字符串赋值给已定义的数组 for(y=0;yC;y+) /使
18、用循环进行删除操作 num=80;k=0,m=0; temp=head; for(i=0;inext; for(j=0;jdataj)=Datak) k+; else if(Datak!=0) j=j-k;k=0; if(Datak=0) num=j;break; if(num80) break; for(;i=NUM;i+) for(;j80;j+) if(j+1data80-k+num=temp-dataj+1; /删除的字符串不在最后一行,将下一行的字符(由temp指向)前移到前行elsetemp-dataj-k+1=temp-dataj+1; /当要删除的字符串在最后一行只要将最后一行
19、的字符前移 term=temp; temp=temp-next; j=0; /在使用循环,从查找到的字符或者字符串开始进行删除,在一行删除完毕之后,转至下一行进行删除。 LinkList * InsertWord(LinkList *temp)/ 文本内容插入函数 char Data20;/ 定义需要插入的字符或者字符串的输入数组 int h,l;/ 定义需要插入的字符或者字符串的插入的行和列 printf(ntt请输入要插入的字符或字符串:);getchar();gets(Data);printf(ntt当前文章内容为:);PrintWord();printf(ntt请输入要插入的行:);s
20、canf(%d,&h);printf(ntt请输入要插入的列:);scanf(%d,&l); int i=(h-1)*80+l; /定义一个整形变量,确定插入的具体位置 LinkList *a;int n=strlen(Data);int m ;int insertRow=i/80+1; /确定插入位置的行数int row=temp-row; /将全局变量记录的行数赋值给rowint j;if(insertRow=row) /判断插入位置是否在最后一行for(m=temp-length-1;m=(i%80)&n0;m-)temp-datam+n=temp-datam; /将最后一行插入位置后面
21、的所有字符向后移n位for(m=(i%80),j=0;mdatam=Dataj; /将要插入的字符或者字符串赋值到要插入的位置 else/如果插入的位置不再最后一行int r=0;for(int p=insertRow; plength-1-r;m=0&n0;m-)temp-datam+n=temp-datam; /将最后一行整体后移n位a=temp;/p指向前一行temp = temp-pre; /temp指向前一位temp-length = 80;for(m = temp-length-n,j=0;mlength;m+,j+)a-dataj=temp-datam; /将前一行后n个字符移到
22、下一行的前n个字符位置for(m=temp-length-n-1;m=(i%80);m-) temp-datam+n=temp-datam;/插入行位置后的字符后移n位for(m=(i%80),j=0;mdatam =Dataj; /将要插入的字符赋值到插入的位置return temp;void Bmenu(LinkList *temp)/ char str120;char str220;int a;doHeadWord();/是将一标题输出在DOS节面的最上端printf(ntt*n);printf(tt* 文章内容处理菜单 *n);printf(tt*n);printf(tt* 1、查找文
23、章中的字符或者字符串 *n);printf(tt* 2、删除文章中的字符或者字符串 *n);printf(tt* 3、向文章中插入字符或者字符串 *n);printf(tt* 4、显示当前文章内容 *n);printf(tt* 5、返回主菜单 *n);printf(tt* 6、直接退出系统 *n);printf(tt*n);printf(tt 请选择:);scanf(%d,&a);switch(a)case 1: system(cls); HeadWord(); printf(ttt请输入您需要查找的字符或字符串:); getchar(); gets(str1); SearchWord(str
24、1,temp); printf(按回车键继续);getchar();getchar();system(cls); break;case 2: system(cls); HeadWord(); printf(ttt请输入您需要删除的字符或字符串:); getchar(); gets(str2); SearchWord(str2,temp); DeleteWord(str2); printf(ttt删除 %s 后的文章为:,str2); PrintWord(); printf(按回车键继续);getchar();getchar();system(cls); break;case 3: system
25、(cls); HeadWord(); InsertWord(temp); printf(ttt插入字符或字符串后文章为:); PrintWord(); printf(按回车键继续);getchar();getchar();system(cls); break;case 4: system(cls); HeadWord(); PrintWord(); printf(按回车键继续);getchar();getchar();system(cls); break;if(a=5) system(cls); break;if(a=6) exit(0); while(1); void AboutWord()/显示作者信息 printf(nntt 关 于 n); printf(tt*n);printf(tt* 本系统由10级自动化(3)班胡鸿制作,欢迎使用 *n); printf(tt*n);printf(n);void menu(LinkList *temp)int t;doHeadWord();printf(n);printf(tt*n);printf(tt*
限制150内