![数据结构课设——文章编辑_第1页](http://file3.renrendoc.com/fileroot_temp3/2021-12/15/4cb0e6ba-a7de-45c0-bc7b-c48b8baddeab/4cb0e6ba-a7de-45c0-bc7b-c48b8baddeab1.gif)
![数据结构课设——文章编辑_第2页](http://file3.renrendoc.com/fileroot_temp3/2021-12/15/4cb0e6ba-a7de-45c0-bc7b-c48b8baddeab/4cb0e6ba-a7de-45c0-bc7b-c48b8baddeab2.gif)
![数据结构课设——文章编辑_第3页](http://file3.renrendoc.com/fileroot_temp3/2021-12/15/4cb0e6ba-a7de-45c0-bc7b-c48b8baddeab/4cb0e6ba-a7de-45c0-bc7b-c48b8baddeab3.gif)
![数据结构课设——文章编辑_第4页](http://file3.renrendoc.com/fileroot_temp3/2021-12/15/4cb0e6ba-a7de-45c0-bc7b-c48b8baddeab/4cb0e6ba-a7de-45c0-bc7b-c48b8baddeab4.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程设计报告课程设计题目:文章编辑专业:信息工程班级:1720601学生姓名:指导教师:、实验目的及要求:任务:输入一页文字,程序可以统计出文字、数字、空格的个数。静态存储一页文章,每行最多不超过 80 个字符,共 N行;要求:(1)分别统计出其中英文字母数和空格数及整篇文章总字数;(2)统计某一字符串在文章中出现的次数,并输出该次数;(3)删除某一子串,并将后面的字符前移。存储结构使用线性表,分别用几个子函数实现相应的功能;输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号。输出形式 :(1)分行输出用户输入的各行字符;(2)分 4 行输出 " 全部字母数 &q
2、uot; 、" 数字个数 " 、" 空格个数 " 、" 文章总字数 "(3)输出删除某一字符串后的文章;实验时间、地点 :一、概要设计(实验思路)1. 问题分析本程序是对一段英文文章的内容进行处理,存储方式采用链式存储。对于文本的输入,采用头插法将文本信息存储到链表已申请好的存储空间中,在此部分设计中最大的问题在于输入文章过程中输入的字符数大于80 时如何换行;对于文本内容的统计,使用循环对已存储的文章进行匹配,字母数、空格数、数字数直接通过比较即可得到;对于文本内容的处理,查找部分仍是使用循环对已存储的文章进行匹配,判断需要查找的字
3、符或者字符串是否与文章中某部分内容相同, 如果存在相同的记录相同的个数及位置并输出个数及位置。删除部分先使用程序的查找功能对文章中需要删除的字符或者字符串进行查找, 然后对其进行删除。2. 数据结构选择本程序是对输入的文字进行操作,故使用的数据结构为单链表操作。根据第一部分的问题分析有该链表操作有3 部分:另有全局变量*head ,作为文章的头指针。创建结构体:typedef struct listchar data80;/ 记录一行字符int length;struct _list *next;struct _list *pre;/ 记录一行字符长度/ 后继指针/ 前趋指针int row;/
4、 记录整篇文章的行数LinkList;在文章内容创建部分中使用线性表的链式存储,并使用全局变量对文本的各种信息进行存储;文章的读取、内容统计、删除、查找都采用链表操作完成。3. 流程图(1)主框架:(2)文章内容统计子菜单(3) 文章内容处理子菜单文SearchWord() 函数实现查章内DeleteWord() 函数内容删容处Printword ()显示当前内理子菜返回主菜单单退出程序(4)使用函数列表及关系图函数名 :1、CreatWord()文本输入函数,对文本的内容进行输入2、PrintWord()当前文本内容输出函数,将当前存储在链表中的文本内容输出5、CountWord()文章内容
5、统计函数,对存储在链表中文本内容进行统计6、SearchWord()文章内容查找函数7、DeleteWord()文章内容删除函数8、Bmenu()文本内容处理菜单函数9、AboutWord()显示作者信息的函数10、 menu()主菜单函数11、 main()主函数关系图 :二、详细设计(实验过程)1、数据结构定义typedef struct listchar data80;int length;struct list *next;/*/*记录一行字符 */记录一行字符长度/* 后继指针 */*/struct list *pre; /* int row;/*前趋指针 */记录整篇文章的行数*/
6、LinkList;2、全局变量定义LinkList *head; int NUM,C,N;/* 定义全局变量 *head ,文章首行头指针*/ * 定义全局变量, Num用来记录行号, C 用来记录子串在主串中出现的总次数 */3、函数说明( 1) CreatWord() 文本创建函数 LinkList *CreatWord()LinkList *temp; char ch;int i,j;head->next=(LinkList *)malloc(sizeof(LinkList); / head->pre=NULL;temp=head->next; / temp->p
7、re=NULL; temp->length=0; for(i=0;i<80;i+) temp->datai='0' printf("tt*n");printf("tt*创建文本*n");printf("tt*n");printf("tt请输入文章(输入#号结束): nn");for(j=0;j<Link_Size;j+)for(i=0;i<80;i+)ch=getchar();temp->datai=ch;temp->length+;if(ch='#
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->datai='0'temp->row=NUM+1;system("cls");return (temp);说明:a、 定义 LinkList指针变量
9、*temp : LinkList *temp;b、 定义文本输入变量 ch ,记录文本行数变量 j ,记录每行字符数变量 i ;c、 申请动态存储空间: head->next=(LinkList *)malloc(sizeof(LinkList); d、 首行头指针的前驱指针为空: head->pre=NULL;首行指针:temp=head->next;首行指针的前驱指针也为空:temp->pre=NULL;定义没输入字符时文章长度为0:temp->length=0;初始化为字符串结束标志,防止出现乱码:for(i=0;i<80;i+)temp->da
10、tai='0'e、 利用循环进行文本输入for(j=0;j<LINK_INIT_SIZE;j+)/控制一页for(i=0;i<80;i+) /控制一行ch=getchar(); /接收输入字符temp->datai=ch; /给 temp 指向的行赋值····temp->length+;/行中字符长度加1if(ch='#')NUM=j; break; /文章结束时, Num来记录整个文章的行数在字符输入的过程中, 如果在单行输入的字符超过了80 个字符,则需要以下操作:输入字符数大于80,重新分配空
11、间建立下一行:temp->next=(LinkList *)malloc(sizeof(LinkList) ;给 temp 的前驱指针赋值: temp->next->pre=temp;temp 指向当前行: temp=temp->next;将下一行初始化为字符串结束标志,防止出现乱码:for(i=0;i<80;i+)temp->datai='0'记录整个文章的行数:temp->row=NUM+1;返回指向最后一行指针:return temp;文本输入部分到此结束。( 2) PrintWord() 文章显示函数 void PrintWor
12、d()int i,j; LinkList *p; p=head->next; system("cls"); printf("n"); printf("tt*n");printf("tt*文本显示*n");printf("tt*n");printf("n当前文章的内容是:n");for(j=0;j<=NUM&&p!=NULL;j+)for(i=0;(i<80)&&(p->datai)!='#'i+)prin
13、tf("%c",p->datai);p=p->next;说明:a、定义文本行数变量j ,每行字符数i : int i,j;b、定义指针变量: LinkList *p;c、将指针 p 指向链表表头: p=head->next;d、利用循环输出链表中信息:for(j=0;j<=NUM&&p!=NULL;j+)=for(i=0;(i<80)&&(p->datai)!='#'i+)=printf("%c",p->datai);p=p->next; 文本显示部分到此结束
14、。( 3) CountWord() 文章内容统计函数void CountWord()LinkList *temp;char ch;int i,j,t;int WORD=0,word=0,space=0,num=0,sum=0;temp=head->next;for(j=0;j<=NUM;j+)for(i=0;(i<80)&&(temp->datai)!='#'i+)ch=temp->datai;if(ch>='A')&&(ch<='Z')WORD+;else if(ch&g
15、t;='a')&&(ch<='z')word+;else if(ch>='0')&&(ch<='9')num+;else if(ch=' ')space+;sum=WORD+word+num;while(1)printf("n");printf("n");printf("n");printf("tt*n");printf("tt*文章内容统计子菜单*n");print
16、f("tt*n");printf("tt*文 章 中字 母的 个 数:%dn",WORD+word);printf("tt*文章中数字的个数 :%dn",num);printf("tt*文章中空格的个数 :%dn",space);printf("tt*文章中所有字的个数 :%dn",sum);printf("tt*1、退出返回主菜单*n");printf("tt*2、直接退出本系统*n");printf("tt*n");printf(&
17、quot;tt请选择: ");scanf("%d",&t);if(t=1)system("cls");break;else if(t=2)exit(0);elseprintf("tt对不起,无此功能! 请回车重新选择 !.n");printf("tt");fflush(stdin);getchar();说明:a、b、c、定义指针变量temp: LinkList *temp;定义记录文本行数变量j ,每行字符数i ;定义记录文本大写字母数、小写字母数、空格数、数字数和总字数的变量:int WORD=
18、0,word=0,space=0,num=0,sum=0;d、将指针temp 指向链表表头:temp=head->next;利用循环对链表中信息进行匹配判断,将大写字母数、小写字母数、空格数、数字数和总字数统计出来: for(j=0;j<=NUM;j+)for(i=0;(i<80)&&(temp->datai)!='#'i+)ch=temp->datai;if(ch>='A')&&(ch<='Z')WORD+;else if(ch>='a')&
19、&(ch<='z')word+;else if(ch>='0')&&(ch<='9')num+;else if(ch=' ')space+;sum=WORD+word+num;e、本程序对统计项目设计了菜单。菜单的编写使用while语句进行循环操作。文本内容统计部分到此结束。( 4) SearchWord() 文章内容查找函数void SearchWord(char *str1,LinkList* temp)char Data20 ;int i,j,k=0,sum=0;int l=1;te
20、mp=head->next;strcpy(Data,str1);for(i=0;i<=NUM;i+)for(j=0;j<80;j+)if(temp->dataj)=Datak) k+;else if(Datak!='0')j=j-k;k=0;if(Datak='0')sum+;j=j-k+1;printf("ttt第%d次出现在第 %d行第 %d列 n",l,i+1,j);l+;k=0;continue;temp=temp->next;printf("nttt字符串总共出现次数为:%dnn",
21、sum);C=sum;N=i*80+j;说明:a、 定义一个数组,用来记录需要查找的字符内容:char Data20;b、定义定义文本行数变量j ,每行字符数i ,记录字符出现的次数变量:int i,j,m=0.,sum=0;c、 对形参中定义的指针变量进行操作,使其指向链表表头:temp=head->next;d、 使用拷贝函数,将形参中str1 的值赋给 Data: strcpy(Data,str1);e、 利用循环进行查找操作:for(i=0;i<=NUM;i+) /*利用循环进行查找操作*/for(j=0;j<80;j+)if(temp->dataj)=Data
22、k) k+;/*将输入的查找字符与链表中信息比较,找到第一个相同的字符*/else if(Datak!='0')j=j-k;/*从主串第j-k个位置重新查找*/k=0;if(Datak='0')sum+;/* 此字符出现的次数加1*/j=j-k+1;/*j记录下该字符串出现的位置*/printf("ttt第 %d次出现在第 %d行第 %d列 n",l,i+1,j);l+;k=0;continue;temp=temp->next;/*指向下一行 */文本内容查找部分到此结束。( 5) DeleteWord() 文章内容删除函数 void
23、DeleteWord(char *str2)char Data20; LinkList *temp,*term; int i,j,a,k,m,y,num; strcpy(Data,str2); for(y=0;y<C;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->dataj)=Datak) k+;else if(Datak!='0') j=j-k;k=0;if(Datak='0')nu
24、m=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;else temp->dataj-k+1=temp->dataj+1;term=temp;temp=temp->next;j=0;说明:a、定义一个数组用来存储需要删除的字符或者字符串:char Data20;b、定义指针变量:LinkList *temp, *term ;c、定义整形变量用来控制行数、字符数:int i,j,k,m,y,num;d、
25、使用拷贝函数讲形参中需要删除的字符或字符串赋值给已定义的数组:strcpy(Data,str2);f 、 使用循环进行删除操作:for(y=0;y<C;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->dataj)=Datak) k+;else if(Datak!='0') j=j-k;k=0;if(Datak='0')num=j;break;if(num<
26、80) break;/* 首先是使用循环查找到需要删除字符或者字符串的字符数以及字符或者字符串的位置,以便于删除 */for(;i<=NUM;i+)for(;j<80;j+)if(j+1<k)term->data80-k+num=temp->dataj+1;/*删除的字符串不在最后一行,将下一行的字符(由temp 指向)前移到前行*/elsetemp->dataj-k+1=temp->dataj+1;/*当要删除的字符串在最后一行只要将最后一行的字符前移*/term=temp;temp=temp->next;/*在使用循环,从查找到的字符或者字符
27、串开始进行删除,在一行删除完毕之后,转至下一行进行删除*/j=0;文本内容删除部分到此完成。( 6) Bmenu() 文章内容处理菜单函数 void Bmenu(LinkList *temp)char str120;char str220;int t;do/*利用 do while循环来控制主菜单显示*/printf("n");printf("ntt*n");printf("tt*文章内容处理子菜单*n");printf("tt*n");printf("tt*1、查找文章中的字符或者字符串*n"
28、);printf("tt*2、删除文章中的字符或者字符串*n");printf("tt*3、显示当前文章内容*n");printf("tt*4、返回主菜单*n");printf("tt*5、直接退出系统*n");printf("tt*n");printf("tt请选择 :");scanf("%d",&t);if(t>5)|(t<1)printf("tt对不起,无此功能! 请回车重新选择 !.n");printf(&q
29、uot;tt");fflush(stdin);getchar();elseswitch(t)case 1:system("cls");printf("n");printf("ntt*n");printf("tt*文章内容处理子菜单*n");printf("tt*n");printf("nttt请输入您需要查找的字符或字符串:");getchar();gets(str1);printf("n");SearchWord(str1,temp);prin
30、tf("ntt按回车键继续· ···· ");getchar();getchar();system("cls");break;case 2:system("cls");printf("n");printf("ntt*n");printf("tt*文章内容处理子菜单*n");printf("tt*n");printf("nttt请输入您需要删除的字符或字符串:");getchar();ge
31、ts(str2);printf("n");SearchWord(str2,temp);DeleteWord(str2);printf("ttt删除%s后的文章为:",str2);PrintWord();printf("nttgetchar();getchar();system("cls");按回车键继续· ···· ");break;case 3:system("cls");printf("nntt*n");printf(&q
32、uot;tt*文章内容处理子菜单*n");printf("tt*n");PrintWord();printf("nntt按回车键继续·····");getchar();getchar();system("cls");break;if(t=4)system("cls");break;if(t=5) exit(0);while(1);说明:用 do-while 语句来制作文章内容处理菜单,用switch 语句来选择实现功能。( 7) AboutWord() 相
33、关性息void AboutWord()printf("nnnnnnnn");printf("t*n");printf("t*本系统由 chevis制作部分功能则是仿照其他程序能力有限 *n");printf("t*谢谢使用!*n");printf("t*n");printf("n");( 8) menu() 主菜单void menu()int t;LinkList *temp;doprintf("n");printf("n");prin
34、tf("n");printf("tt*n");printf("tt*简单的文章编辑器*n");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");
35、printf("tt*5、程序相关*n");printf("tt*6、退出文章编辑器*n");printf("tt*n");printf("tt!注:第一次运行本程序时请选择1 功能进行输入!n");printf("tt*n");printf(" tt请输入相应数字 :");scanf("%d",&t);if(t>6)|(t<1)printf("tt对不起,无此功能! 请回车重新选择 !.n");printf(&qu
36、ot;tt");fflush(stdin);getchar();elseswitch(t)case 1:system("cls");printf("n");temp=CreatWord();break;case 2:system("cls");PrintWord();printf("n");printf("n");printf("nttgetchar();getchar();system("cls");break;case 3:system("c
37、ls");CountWord();break;case 4:system("cls");Bmenu(temp);break;case 5:system("cls");按回车键继续· ···· ");AboutWord();printf("nttgetchar();getchar();system("cls");break;按回车键继续· ···· ");if(t=6) break;while(1)
38、;说明:用 do-while 语句来制作文章内容处理菜单,用switch 语句来选择实现功能。( 9) main() 主函数void main()head=(LinkList *)malloc(sizeof(LinkList);menu();说明:/* 先为head 申请存储空间, 然后创建指针变量temp,然后直接在主菜单函数中进行其他操作*/三、上机调试上机调试过程中遇到的问题及解决方法:a)由于本程序的操作大部分都为经常使用的查找、删除,基本的算法及代码都可以通过查找资料得到,故没有出现多大的问题。错误主要是在于删除等子函数中复杂操作过程中出现的小问题。b)删除及查找过程中需要在子函数中定义一个数组变量,用来存储输入的信息,然后用来与链表中的信息进行比较以达到删除或者查找。另为达到将输入的信息赋值给子函数中定义的数组,特使用了 s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国co2定价制度
- 2025年度智能工程用车租赁服务合同书
- 铜陵安徽铜陵市铜官区小学非编音乐教师招聘笔试历年参考题库附带答案详解
- 金华浙江金华共青团永康市委员会工作人员招聘笔试历年参考题库附带答案详解
- 漯河2024年河南漯河市委政法委员会所属事业单位招聘高层次人才笔试历年参考题库附带答案详解
- 海南2025年海南省健康宣传教育中心招聘事业编制人员笔试历年参考题库附带答案详解
- 常德2025年湖南常德市市直部分事业单位集中招聘79人笔试历年参考题库附带答案详解
- 2025年中国五香熏鱼调料市场调查研究报告
- 2025至2031年中国贡丝绵面料行业投资前景及策略咨询研究报告
- 承德2025年河北承德市教育局选聘急需紧缺学科教师61人笔试历年参考题库附带答案详解
- 雅思学习证明范本范例案例模板
- 商业银行不良资产处置方式汇总课件
- 注塑生产过程控制流程
- 三相分离器操作手册
- 一年级下册口算题(可直接打印)
- 儿童文学应用教程(第二版)完整全套教学课件 第1-12章 儿童文学与课程-儿童文学与小学语文习作教学
- 青岛生建z28-75滚丝机说明书
- 公务员面试应急应变题目大全及解析
- 学校年级组长工作计划
- 2023年广州市青年教师初中数学解题比赛决赛试卷
- 对折剪纸课件
评论
0/150
提交评论