据结构
课程设计报告姓 名
__刘 娟__
班 级 10(17) 学 号 10418710 指导教师 李 永 盐城师范学院 信息科学与技术学院
算法与数
书
问题描述: 设计一个简单的文本编辑器,使其具有通常编辑器(如Notepad) 具备的功能。 设计的软、硬件环境: Windows xp Microsoft Visual Studio 6.0 ADT(数据结构与算法)设计与功能模块: 该文本编辑器使用的数据结构为单链表操作。 该链表操作有3部分: Pre Temp Next 另有全局变量*head,作为文章的头指针。 故创建了以下结构体: typedef struct _list { char data[80]; int length; //记录一行字符 //记录一行字符长度 struct _list *next; // 后继指针 struct _list *pre; //前趋指针 int row; }LinkList; 在文章内容创建部分中使用线性表的链式存储,并使用全局变量对文本的各种信息进行存储; 文章的内容统计、删除、查找、插入都采用链表操作完成。 本程序在菜单中使用了大量的do while 语句。 //记录整篇文章的行数
1
主菜单: 1. CreatWord() 文本输入函数,实现菜单功能1,对文本的内容进行输入; 2. PrintWord() 当前文本内容输出函数,实现菜单功能2,将当前存储在链表中的文本内容输出; 3. CountWord() 文章内容统计函数,实现菜单功能3,对存储在链表中文本内容进 行统计,包括对文本内容中的大写字母、小写字母、数字、标点符号、空格以及文章所有字 数的个数的统计;图2是对其完整描述;
2
子菜单3:
3
子菜单4:
4
程序输入与结果输出: 主菜单: 子菜单1: 子菜单3: 5
子菜单4: 6
实验结果分析及收获: 通过这次实训,增加了我学习软件技术的兴趣,虽然还不明确软件技术包含的具体内容,但从C语言这门课程开始,已发现程序设计的乐趣,在学习C++语言的过程中也学到了许多计算机应用基础知识,对计算机的机体也有了一个大体的了解。 通过实际操作,学会C++语言程序编程的基本步骤、基本方法,开发了自己的逻辑思维能力,培养了分析问题、解决问题的能力。深刻体会到“没有做不到的,只有想不到的”,“团结就是力量”,“实践是检验真理的标准”,“不耻下问”„„的寓意。 正文 宋体 小四 行间距固定值22磅 图表中的文本为宋体 5号 行间距固定值12磅 7
附录(源程序清单) #include\"stdio.h\" #include\"malloc.h\" #include\"string.h\" #include\"iostream.h\" #include\"stdlib.h\" #include\"conio.h\" #define Link_Size 100 int NUM,C,N; typedef struct list { char data[80]; int length; struct list *next; struct list *pre; int row; } LinkList; LinkList *head; void HeadWord() { // system(\"cls\"); printf(\"\\****************************************************\\n\"); printf(\"\\**** 欢迎使用简单的文本编辑器 ****\\n\"); printf(\"\\****************************************************\\n\"); } LinkList *CreatWord() { LinkList *temp; char ch; int i,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 8 { 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\"); return temp; } void PrintWord() { int i,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=p->next; } } void CountWord() { LinkList *temp; char ch; int i,j,t; int WORD=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++; else if((ch>='a')&&(ch<='z')) word++; 9 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==59||ch==63) {punct++;} } sum=WORD+word+num; } while(1) { printf(\"\\n\"); HeadWord(); printf(\"\\****************************************************\\n\"); printf(\"\\**** 文章内容统计菜单 ****\\n\"); printf(\"\\****************************************************\\n\"); printf(\"\\**** 1、文章中大写字母的个数 ****\\n\"); printf(\"\\**** 2、文章中小写字母的个数 ****\\n\"); printf(\"\\**** 3、文章中数字的个数 ****\\n\"); printf(\"\\**** 4、文章中标点符号的个数 ****\\n\"); printf(\"\\**** 5、文章中空格的个数 ****\\n\"); printf(\"\\**** 6、文章中所有字数 ****\\n\"); printf(\"\\**** 7、退出返回主菜单 ****\\n\"); printf(\"\\**** 8、直接退出本系统 ****\\n\"); printf(\"\\****************************************************\\n\"); printf(\"\\请选择需统计项目:\"); scanf(\"%d\ switch(t) { case 1: system(\"cls\"); HeadWord(); printf(\"\\n\\文章中大写字母的个数:%d\\n\ printf(\"按回车键继续·····\"); getchar(); getchar(); system(\"cls\"); break; case 2: system(\"cls\"); HeadWord(); printf(\"\\n\\文章中小写字母的个数:%d\\n\ printf(\"按回车键继续·····\"); getchar(); getchar(); system(\"cls\"); break; case 3: system(\"cls\"); HeadWord(); printf(\"\\n\\文章中数字的个数:%d\\n\ printf(\"按回车键继续·····\"); getchar(); getchar(); system(\"cls\"); break; case 4: system(\"cls\"); HeadWord(); 10 printf(\"\\n\\文章中标点符号的个数:%d\\n\ printf(\"按回车键继续·····\"); getchar(); getchar(); system(\"cls\"); break; case 5: system(\"cls\"); HeadWord(); printf(\"\\n\\文章中空格的个数:%d\\n\ printf(\"按回车键继续·····\"); getchar(); getchar(); system(\"cls\"); break; case 6: system(\"cls\"); HeadWord(); printf(\"\\n\\文章中所有字数:%d\\n\ printf(\"按回车键继续·····\"); getchar(); getchar(); system(\"cls\"); break; } if(t==7) {system(\"cls\"); break;} if(t==8) exit(0); } } void SearchWord(char *str1,LinkList* temp) { char Data[20] ; int i,j,k=0,sum=0; int l=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++; else if(Data[k]!='\\0') { j=j-k; k=0; } if(Data[k]=='\\0') { sum++; j=j-k+1; printf(\"\\第%d次出现在第%d行第%d列\\n\ 11 l++; k=0; continue;} } temp=temp->next; } printf(\"\\\字符串总共出现次数为:%d\\n\\n\ C=sum; N=i*80+j; } void DeleteWord(char *str2) { char Data[20]; LinkList *temp,*term; int i,j,k,m,y,num; strcpy(Data,str2); for(y=0;y LinkList * InsertWord(LinkList *temp) { char Data[20]; int h,l; printf(\"\\n\\请输入要插入的字符或字符串:\"); getchar(); gets(Data); printf(\"\\n\\当前文章内容为:\"); PrintWord(); printf(\"\\n\\请输入要插入的行:\"); scanf(\"%d\ printf(\"\\n\\请输入要插入的列:\"); scanf(\"%d\ int i=(h-1)*80+l; LinkList *a; int n=strlen(Data); int m ; int insertRow=i/80+1; int row=temp->row; int j; 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 } return temp; } void Bmenu(LinkList *temp) { char str1[20]; char str2[20]; int a; do { HeadWord(); printf(\"\\n\\****************************************************\\n\"); printf(\"\\**** 文章内容处理菜单 ****\\n\"); printf(\"\\****************************************************\\n\"); printf(\"\\**** 1、查找文章中的字符或者字符串 ****\\n\"); printf(\"\\**** 2、删除文章中的字符或者字符串 ****\\n\"); printf(\"\\**** 3、向文章中插入字符或者字符串 ****\\n\"); printf(\"\\**** 4、显示当前文章内容 ****\\n\"); printf(\"\\**** 5、返回主菜单 ****\\n\"); printf(\"\\**** 6、直接退出系统 ****\\n\"); printf(\"\\****************************************************\\n\"); printf(\"\\ 请选择:\"); scanf(\"%d\ switch(a) { case 1: system(\"cls\"); HeadWord(); printf(\"\\\请输入您需要查找的字符或字符串:\"); getchar(); gets(str1); SearchWord(str1,temp); printf(\"按回车键继续·····\"); getchar(); getchar(); system(\"cls\"); break; case 2: system(\"cls\"); HeadWord(); printf(\"\\\请输入您需要删除的字符或字符串:\"); getchar(); gets(str2); SearchWord(str2,temp); DeleteWord(str2); printf(\"\\\删除 %s 后的文章为:\ PrintWord(); printf(\"按回车键继续·····\"); getchar(); getchar(); system(\"cls\"); break; case 3: system(\"cls\"); HeadWord(); InsertWord(temp); printf(\"\\\插入字符或字符串后文章为:\"); 14 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 menu(LinkList *temp) { int t; do{ HeadWord(); printf(\"\\n\"); printf(\"\\****************************************************\\n\"); printf(\"\\ 主菜单 \\n\"); printf(\"\\****************************************************\\n\"); printf(\"\\**** 1、文章内容输入 ****\\n\"); printf(\"\\**** 2、显示当前文章内容 ****\\n\"); printf(\"\\**** 3、进入文章内容统计菜单 ****\\n\"); printf(\"\\**** 4、进入文章内容处理菜单 ****\\n\"); printf(\"\\**** 5、退出文本编辑器 ****\\n\"); printf(\"\\****************************************************\\n\"); printf(\"\\****************************************************\\n\"); printf(\" \\ 请选择:\"); scanf(\"%d\ if((t>6)&&(t<1)) { printf(\"对不起,无此功能,请输入正确的功能序号!\\n\"); } else switch(t) { case 1: 15 system(\"cls\"); HeadWord(); temp=CreatWord(); break; case 2: system(\"cls\"); PrintWord(); printf(\"\\n\"); printf(\"按回车键继续·····\"); getchar(); getchar(); system(\"cls\"); break; case 3: system(\"cls\"); CountWord(); break; case 4: system(\"cls\"); Bmenu(temp); break; } if(t==5) break; }while(1); } void main() { head=(LinkList *)malloc(sizeof(LinkList)); LinkList *temp; menu(temp); } 成 绩 教师签名 日 期 16 因篇幅问题不能全部显示,请点此查看更多更全内容