字符统计(课程设计报告)_第1页
字符统计(课程设计报告)_第2页
字符统计(课程设计报告)_第3页
字符统计(课程设计报告)_第4页
字符统计(课程设计报告)_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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时如何换行;对于文本内容的统计,使用循环对已存储的文章进行匹配,大写字母数、小写字母 数、空格数、数字数直接通过比较即可得到,标点符号通过ASCH比较即可得到;对于文本内容的处理,查找部分仍是使用循环对已存储的文章进行匹配, 判断需要查找的字符或者字符串是否与文章中某部分内容相同,如果存在相同 的记录相同的个数及位置并输出个数及位置。删除部分先使用程序的查找功能 对文章中需要删除的字符或者字符串进行查找,

5、然后对其进行删除。插入部分 为通过输入的插入位置(行、歹I)将字符或者字符串插入到文章制定位置。三、概要设计概要设计:程序框架:中南民族大学计算机科学学院计算机科学与技术专业学号:姓名:26文本内容的 输入, CreatWord() ,将文本内 容输入到已 申请的存储 空间中34文章内容统计 菜单,CountWord(), 以菜单形式显 示给用户,对 文章的内容进 行各种方式的 统计文章内容处理菜单, Bmenu(),这部分为一 子菜单,使用了包括SearchWord()、 DeleteWord()、 InsertWord()三个函 数,对文章内容进行 处理退出系统图1简单的文本编辑器主框架两

6、个子菜单:如选择上图中功能3,则有:123-4、5 ,67统计 文本 中大 写字 母个 数统计 文本 中小 写字 母个 数统计 文本 中数 字的 个数统计 文本 中标 点符 号的 个数统计 文本 中空 格的 个数统计 文本 所有 字数返回到主菜单直接退出系统图2字符统计-文本内容统计菜单如选择功能4,则有:* *文章内容处理菜单* * 1、查找文章中的字符或者字符串* * 2 、删除文章中的字符或者字符串* * 3 、向文章中插入字符或者字符串* * 4 、显示当前文章内容* * 5 、返回主菜单* * 6、直接退出系统*图3字符统计-文本内容处理菜单根据以上各图,本程序共设计了11个函数。1

7、、HeadWord()标题函数,即一个输出标题,永远出现在程序的最顶端。2、CreatWord() 文本输入函数,实现上图1菜单功能1,对文本的内容进行 输入;3、PrintWord()当前文本内容输出函数,实现上图1菜单功能2以及图3中功能4,将当前存储在链表中的文本内容输出;4、CountWord()文章内容统计函数,实现上图1菜单功能3,对存储在链表中文 本内容进行统计,包括对文本内容中的大写字母、小写字母、数字、标点符号、空格以及 文章所有字数的个数的统计;图2是对其完整描述;5、SearchWord()文章内容查找函数,实现上图 3菜单功能1中查找部分;6、DeleteWord()文

8、章内容删除函数,实现上图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 ()主函数图4各函数之间的关系四、详细设计#include"stdio.h"#include"malloc.h"#include"

9、;string.h"#include"stdlib.h"#include"conio.h" #define Link_Size 100int NUM,C,N; /定义全局变量,Num用来记录行号,C用来记录子用在主审中 出现的总次数typedef struct listchar data80; /记录一行字符int length; /记录一行字符长度struct list *next; / 后继指针struct list *pre; 前趋指针int row; /记录整篇文章的行数 LinkList;LinkList *head; /定义全局变量

10、*head ,文章首行头指针 void HeadWord()/ system("cls");printf("tt*n");printf("tt*欢迎使用简单的文本编辑器*n");printf("tt*n");LinkList *CreatWord()/文本内容输入函数LinkList *temp;/ 定义 LinkList 指针变量 *temp char ch;/定义文本输入变量chi申请动态存储空间int i,j;/记录文本行数变量j,记录每行字符数变量 head->next=(LinkList *)mal

11、loc(sizeof(LinkList);/ head->pre=NULL;/首行头指针的前驱指针为空temp=head->next;/ 首行指针temp->pre=NULL; /首行指针的前驱指针也为空temp->length=0;/定义没输入字符时文章长度为 0for(i=0;i<80;i+)temp->datai='0'/初始化为字符串结束标志,防止出现乱码printf("开始创建文本,请输入文章(输入#号结束):n");for(j=0;j<Link_Size;j+)/ 控制一页.for(i=0;i<80

12、;i+)/ 控制一行ch=getchar();接收输入字符temp->datai=ch; 给 temp 指向的行赋值temp->length+;行中字符长度加1if(ch='#')NUM寸break; /文章结束时,Num来记录整个文章的行数if(ch='#')temp->length=i;temp->next=NULL;break;temp->next=(LinkList *)malloc(sizeof(LinkList) ;/在字符输入的过程中,如果在单行输入的字符超过了 80个字符,则需要以下操作,输入字符数大于80,重新分配

13、空间建立下一行temp->next->pre=temp;/ 给 temp 的前驱指针赋值temp=temp->next;/ temp 指向当前行for(i=0;i<80;i+)temp->datai='0'/将下一行初始化为字符串结束标志,防止出现乱码temp->row=NUM+1;/记录整个文章的行数system("cls");return temp;/记录整个文章的行数 void PrintWord()/当前文本输出函数int i,j;定义文本行数变量j,每行字符数iLinkList *p;/定义指针变量p=head-

14、>next;/将指针p指向链表表头system("cls");HeadWord();printf("n当前文章的内容是:");for(j=0;j<=NUM&&p!=NULL;j+) for(i=0;(i<80)&&(p->datai)!='#'i+)/ 利用循环输出链表中信息printf("%c”,p->datai);p=p->next;void CountWord()文本内容统计函数LinkList *temp; 定义指针变量 tempchar ch;int

15、i,j,t;/定义记录文本行数变量j,每行字符数iint 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;(i<80)&&(temp->datai)!='#'i+)ch=temp->datai;if(ch>='A')&&(ch<='Z')WORD+;

16、else if(ch>='a')&&(ch<='z') word+;else if(ch>='0')&&(ch<='9') num+;else if(ch='') space+;elseif(ch=3311ch=3411ch=3911ch=4411ch=4611ch=5811ch=5911ch=63)punct+;sum=WORD+word+num;/利用循环对链表中信息进行匹配判断,将大写字母数、小写字母数、空格数、数字数、标点数和总字数统计出来:while

17、(1) printf("n"); HeadWord();printf("tt*n");printf("tt*文章内容统计菜单*n");printf("tt*n");printf("tt*1、文章中大写字母的个数*n");printf("tt*2、文章中小写字母的个数*n");printf("tt*3、文章中数字的个数*n");printf("tt*4、文章中标点符号的个数*n");printf("tt*5、文章中空格的个数*n

18、");printf("tt*6、文章中所有字数*n");printf("tt*7、退出返回主菜单*n");printf("tt*8、直接退出本系统*n");printf("tt*n");printf("tt请选择需统计项目:");scanf("%d",&t);switch(t)case 1:system("cls");HeadWord();printf("ntt文章中大写字母的个数:dn",WORD);printf(&

19、quot;接回车键继续");getchar();getchar();system("cls");break;case 2:system("cls");HeadWord();printf("ntt文章中小写字母的个数:%dn",word);printf("接回车键继续");getchar();getchar();system("cls");break;case 3:system("cls");HeadWord();printf("ntt 文章中数字的个数:%

20、dn",num);printf("接回车键继续");getchar();getchar();system("cls");break;case 4:system("cls");HeadWord();printf("ntt文章中标点符号的个数:%dn",punct);printf("接回车键继续");getchar();getchar();system("cls");break;case 5:system("cls");HeadWord();prin

21、tf("ntt 文章中空格的个数:dn",space);printf("接回车键继续");getchar();getchar();system("cls");break;case 6:system("cls");HeadWord();printf("ntt 文章中所有字数:%dn",sum);printf("接回车键继续");getchar();getchar();system("cls");break;if(t=7)system("cls&qu

22、ot;); break;if(t=8) exit(0);void SearchWord(char *stU,LinkList* temp)/文本内容查找函数char Data20 ; /定义一个数组,用来记录需要查找的字符内容int i,j,k=0,sum=0;/定义定义文本行数变量j,每行字符数i,记录字符出现的 次数变量int l=1;temp=head->next; /对形参中定义的指针变量进行操作,使其指向链表表头strcpy(Data,str1); /使用VC+中的拷贝函数,将形参中 strl的值赋给Datafor(i=0;i<=NUM;i+)for(j=0;j<8

23、0;j+)if(temp->dataj)=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 歹八n",l,i+1,j+1);I+;k=0;continue;temp=temp->next; / 指向下一行printf("ttt字符串总共出现次数为:%dn

24、n",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;y<C;y+) /使用循环进行删除操作num=80;k=0,m=0;temp=head;for(i=0;i<=NUM;i+)term=t

25、emp;temp=temp->next;for(j=0;j<80;j+) if(temp->dataj)=Datak) k+;else if(Datak!='0') j=j-k;k=0; if(Datak='0') num=j;break;if(num<80) break;for(;i<=NUM;i+)for(;j<80;j+)if(j+1<k) term->data80-k+num=temp->dataj+1;"/删除的字符串不在最后一行,将下一行的字符 (由temp指向)前移到前行elsetem

26、p->dataj-k+1=temp->dataj+1; / 当要删 除的字符串在最后一行只要将最后一行的字符前移term=temp;temp=temp->next;j=0;"/在使用循环,从查找到的字符或者字符串开始进行删除,在一 行删除完毕之后,转至下一行进行删除。LinkList * InsertWord(LinkList *temp)文本内容插入函数char Data20;/定义需要插入的字符或者字符串的输入数组int h,l;/定义需要插入的字符或者字符串的插入的行和列printf("ntt请输入要插入的字符或字符串:");getchar

27、();gets(Data);printf("ntt当前文章内容为:");PrintWord();printf("ntt请输入要插入的行:");scanf("%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

28、->row; /将全局变量记录的行数赋值给 rowint j;if(insertRow=row) 判断插入位置是否在最后一行for(m=temp->length-1;m>=(i%80)&&n>0;m-)temp->datam+n=temp->datam;将最后一行插入位置后面的所有字符向后移n位for(m=(i%80),j=0;m<n+(i%80);m+,j+)temp->datam=Dataj; 将要插入的字符或者字符串赋值到要插入的位置else/如果插入的位置不再最后一行int r=0;for(int p=insertRow;

29、 p<row;p+)if(p = insertRow) r=0;elser=n;for(m=temp->length-1-r;m>=0&&n>0;m-)temp->datam+n=temp->datam;将最后一行整体后移 na=temp;/p指向前一行temp = temp->pre; /temp 指向前一位temp->length = 80;for(m = temp->length-n,j=0;m<temp->length;m+,j+) a->dataj=temp->datam; 将前一行后 n

30、个字符移到下一行的前n个字符位置for(m=temp->length-n-1;m>=(i%80);m-)temp->datam+n=temp->datam;/ 插入行位置后的字符后移n位for(m=(i%80),j=0;m<(i%80)+n;m+,j+)temp->datam =Dataj; /将要插入的字符赋值到插入的位return temp; void Bmenu(LinkList *temp)/ char str120;char str220;int a;doHeadWord();/是将一标题输出在 DOS节面的最上端printf("ntt*

31、n");printf("tt*文章内容处理菜单*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");pri

32、ntf("tt*n");printf("tt 请选择:");scanf("%d",&a);switch(a)case 1:system("cls");HeadWord();printf("ttt请输入您需要查找的字符或字符串:");getchar();gets(strl);SearchWord(str1,temp);printf("接回车键继续");getchar();getchar();system("cls");break;case 2:sys

33、tem("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("cls");HeadWo

34、rd();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("

35、cls"); break;if(a=6) exit(0);while(1);void AboutWord()显示作者信息printf("nnttn");printf("tt*n");printf("tt*本系统由10级自动化(3)班胡鸿制作,欢迎使用 *n");printf("tt*n");printf("n");void menu(LinkList *temp) int t;doHeadWord(); printf("n");*n");主菜单printf

36、("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 printf("tt printf("tt*n");*n");printf("tt*n");p

37、rintf("tt* 注:第一次运行本程序时请选择1号功定printf("tt*n");*n");printf(" tt 请选择:"); scanf("%d",&t);if(t>6)&&(t<1)printf("对不起,无此功能,请输入正确的功能序号!n");else switch(t) case 1: system("cls"); HeadWord(); temp=CreatWord(); break; case 2:system(&qu

38、ot;cls");PrintWord();printf("n"); printf("接回车键继续");getchar(); getchar(); system("cls"); break; case 3:system("cls"); CountWord(); break; case 4:system("cls"); Bmenu(temp); break; case 5:system("cls");HeadWord();AboutWord(); printf(&quo

39、t;接回车键继续");getchar(); getchar(); system("cls"); break; if(t=6) break; while(1); void main() head=(LinkList *)malloc(sizeof(LinkList); LinkList *temp; menu(temp);五、调试分析1、上机调试过程中遇到的问题及解决方法:a)由于本程序的操作大部分都为经常使用的查找、删除、插入,基本的算 法及代码都可以通过查找资料得到,故没有出现多大的问题。错误主要 是在于删除及插入等子函数中复杂操作过程中出现的小问题。b)删除及

40、插入过程中需要在子函数中定义一个数组变量,用来存储输入的 信息,然后用来与链表中的信息进行比较以达到删除或者插入。另为达 到将输入的信息赋值给子函数中定义的数组,特使用了C+中的strcpy()函数。c)为了将程序界面更加的完美,做了 3个菜单,还写了一个子函数专门将 标题显示在程序最上端。清屏函数使用 system ( “cls”)。2、时间,空间性能分析:本算法的空间复杂度很低,只需要文本的行数(N11) *80+L (最后一行字 符数)的数组存放结果,因此空间复杂度为 O(N)。但是本算法的时间复杂度比 较高,由于输出函数、查找函数算法时间复杂度均为O (N),但是删除函数、插入函数算法的时间复杂度较高。但是,我暂时还未想到时间复杂度更小的算 法,因此在这里我无法对该算法进行优化。六、测试结果测试文章:With the rapid development of scie

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论