当前位置:文档之家› 数据结构课设——文章编辑

数据结构课设——文章编辑

课程设计报告课程设计题目:文章编辑专业:信息工程班级:1720601学生姓名:指导教师:、实验目的及要求:任务:输入一页文字,程序可以统计出文字、数字、空格的个数。

静态存储一页文章,每行最多不超过80个字符,共N行;要求:(1)分别统计出其中英文字母数和空格数及整篇文章总字数;(2)统计某一字符串在文章中出现的次数,并输出该次数;(3)删除某一子串,并将后面的字符前移。

存储结构使用线性表,分别用几个子函数实现相应的功能;输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号。

输出形式:(1)分行输出用户输入的各行字符;(2)分4行输出"全部字母数"、"数字个数"、"空格个数"、"文章总字数"(3)输出删除某一字符串后的文章;实验时间、地点:一、概要设计(实验思路)1.问题分析本程序是对一段英文文章的内容进行处理,存储方式采用链式存储。

对于文本的输入,采用头插法将文本信息存储到链表已申请好的存储空间中,在此部分设计中最大的问题在于输入文章过程中输入的字符数大于80时如何换行;对于文本内容的统计,使用循环对已存储的文章进行匹配,字母数、空格数、数字数直接通过比较即可得到;对于文本内容的处理,查找部分仍是使用循环对已存储的文章进行匹配,判断需要查找的字符或者字符串是否与文章中某部分内容相同,如果存在相同的记录相同的个数及位置并输出个数及位置。

删除部分先使用程序的查找功能对文章中需要删除的字符或者字符串进行查找,然后对其进行删除。

2. 数据结构选择本程序是对输入的文字进行操作,故使用的数据结构为单链表操作。

根据第一部分的问题分析有该链表操作有3部分:另有全局变量 *head,作为文章的头指针。

创建结构体:typedef struct list{ char data[80]; //记录一行字符int length; //记录一行字符长度struct _list *next; //后继指针struct _list *pre; //前趋指针int row; //记录整篇文章的行数}LinkList;在文章内容创建部分中使用线性表的链式存储,并使用全局变量对文本的各种信息进行存储;文章的读取、内容统计、删除、查找都采用链表操作完成。

3.流程图(1)主框架:(2)文章内容统计子菜单(3)文章内容处理子菜单(4)使用函数列表及关系图函数名:1、CreatWord() 文本输入函数,对文本的内容进行输入2、PrintWord() 当前文本内容输出函数,将当前存储在链表中的文本内容输出5、CountWord() 文章内容统计函数,对存储在链表中文本内容进行统计6、SearchWord() 文章内容查找函数7、DeleteWord() 文章内容删除函数8、Bmenu() 文本内容处理菜单函数9、AboutWord() 显示作者信息的函数10、menu() 主菜单函数11、main() 主函数关系图:二、详细设计(实验过程)1、数据结构定义typedef struct list{char data[80]; /*记录一行字符*/int length; /*记录一行字符长度*/struct list *next; /*后继指针*/struct list *pre; /*前趋指针*/int row; /*记录整篇文章的行数*/}LinkList;2、全局变量定义LinkList *head; /*定义全局变量*head,文章首行头指针*/int NUM,C,N; /*定义全局变量,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->pre=NULL;temp->length=0;for(i=0;i<80;i++)temp->data[i]='\0';printf("\t\t**************************************************** \n");printf("\t\t**** 创建文本****\n");printf("\t\t**************************************************** \n");printf("\t\t请输入文章(输入#号结束):\n\n");for(j=0;j<Link_Size;j++){for(i=0;i<80;i++){ch=getchar();temp->data[i]=ch;temp->length++;if(ch=='#'){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);}说明:a、定义LinkList指针变量*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->data[i]='\0';e、利用循环进行文本输入for(j=0;j<LINK_INIT_SIZE;j++)// 控制一页{ for(i=0;i<80;i++) //控制一行{ ch=getchar(); //接收输入字符temp->data[i]=ch; //给temp指向的行赋值····temp->length++;//行中字符长度加1if(ch=='#'){NUM=j; break; //文章结束时,Num来记录整个文章的行数}}}在字符输入的过程中,如果在单行输入的字符超过了80个字符,则需要以下操作:输入字符数大于80,重新分配空间建立下一行:temp->next=(LinkList *)malloc(sizeof(LinkList)) ;给temp的前驱指针赋值:temp->next->pre=temp;temp指向当前行: temp=temp->next;将下一行初始化为字符串结束标志,防止出现乱码:for(i=0;i<80;i++)temp->data[i]='\0';记录整个文章的行数:temp->row=NUM+1;返回指向最后一行指针:return temp;文本输入部分到此结束。

(2)PrintWord() 文章显示函数void PrintWord(){int i,j;LinkList *p;p=head->next;system("cls");printf("\n");printf("\t\t**************************************************** \n");printf("\t\t**** 文本显示****\n");printf("\t\t**************************************************** \n");printf("\n当前文章的内容是:\n");for(j=0;j<=NUM&&p!=NULL;j++){for(i=0;(i<80)&&(p->data[i])!='#';i++){printf("%c",p->data[i]);}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->data[i])!='#';i++){=printf("%c",p->data[i]);}p=p->next; }文本显示部分到此结束。

(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->data[i])!='#';i++){ch=temp->data[i];if((ch>='A')&&(ch<='Z'))WORD++;else if((ch>='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("\t\t****************************************************\n" );printf("\t\t**** 文章内容统计子菜单****\n");printf("\t\t****************************************************\n" );printf("\t\t**** 文章中字母的个数: %d \n",WORD+word);printf("\t\t**** 文章中数字的个数: %d \n",num);printf("\t\t**** 文章中空格的个数: %d \n",space);printf("\t\t**** 文章中所有字的个数: %d \n",sum);printf("\t\t**** 1、退出返回主菜单****\n");printf("\t\t**** 2、直接退出本系统****\n");printf("\t\t****************************************************\n" );printf("\t\t请选择:");scanf("%d",&t);if(t==1){system("cls");break;}else if(t==2)exit(0);else{printf("\t\t 对不起,无此功能!请回车重新选择!...\n");printf("\t\t");fflush(stdin);getchar();}}}说明:a、定义指针变量temp:LinkList *temp;b、定义记录文本行数变量j,每行字符数i;c、定义记录文本大写字母数、小写字母数、空格数、数字数和总字数的变量:int WORD=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->data[i])!='#';i++){ch=temp->data[i];if((ch>='A')&&(ch<='Z'))WORD++;else if((ch>='a')&&(ch<='z'))word++;else if((ch>='0')&&(ch<='9'))num++;else if(ch==' ')space++;}sum=WORD+word+num;}e、本程序对统计项目设计了菜单。

相关主题