数据结构课设文章编辑.docx
《数据结构课设文章编辑.docx》由会员分享,可在线阅读,更多相关《数据结构课设文章编辑.docx(28页珍藏版)》请在冰点文库上搜索。
![数据结构课设文章编辑.docx](https://file1.bingdoc.com/fileroot1/2023-8/3/a71370f4-d588-412c-b972-1c77b473b5b4/a71370f4-d588-412c-b972-1c77b473b5b41.gif)
数据结构课设文章编辑
课程设计报告
课程设计题目:
文
章
编
辑
专业:
信息工程班级:
1720601学生姓名:
指导教师:
实验目的及要求:
任务:
输入一页文字,程序可以统计出文字、数字、空格的个数。
静态存储一页
文章,每行最多不超过80个字符,共N行;要求:
(1)分别统计出其中英文字母数和空格数及整篇文章总字数;
(2)统计某一字符串在文章中出现的次数,并输出该次数;
(3)删除某一子串,并将后面的字符前移。
存储结构使用线性表,分别用几个子函数实现相应的功能;输入数据的形式和范围:
可以输入大写、小写的英文字母、任何数字及标点符号。
输出形式:
(1)分行输出用户输入的各行字符;
(2)分4行输出"全部字母数"、"数字个数"、"空格个数"、"文章总字数"(3)输出删除某一字符串后的文章;
实验时间、地点:
2013.6.16至6.20于软件楼301
一、概要设计(实验思路)
1.问题分析本程序是对一段英文文章的内容进行处理,存储方式采用链式存储。
对于文本的输入,采用头插法将文本信息存储到链表已申请好的存储空间
中,在此部分设计中最大的问题在于输入文章过程中输入的字符数大于80时如何换行;
对于文本内容的统计,使用循环对已存储的文章进行匹配,字母数、空格数、数字数直接通过比较即可得到;
对于文本内容的处理,查找部分仍是使用循环对已存储的文章进行匹配,判断需要查找的字符或者字符串是否与文章中某部分内容相同,如果存在相同的记录相同的个数及位置并输出个数及位置。
删除部分先使用程序的查找功能对文章中需要删除的字符或者字符串进行查找,然后对其进行删除。
2.数据结构选择
本程序是对输入的文字进行操作,故使用的数据结构为单链表操作。
根据第一部分的问题分析有该链表操作有3部分:
另有全局变量*head,作为文章的头指针。
创建结构体:
}LinkList;
在文章内容创建部分中使用线性表的链式存储,并使用全局变量对文本的各种信息进行存储;文章的读取、内容统计、删除、查找都采用链表操作完成。
3.流程图
(1)主框架:
2)文章内容统计子菜单
SearchWord()函数实现查找
DeleteWord()函数内容删除
Printword()显示当前内容
文章内容处理子菜单
3)文章内容处理子菜单
返回主菜单
退出程序
(4)使用函数列表及关系图函数名:
1、CreatWord()文本输入函数,对文本的内容进行输入
2、PrintWord()当前文本内容输出函数,将当前存储在链表中的文本内容输出
5、CountWord()文章内容统计函数,对存储在链表中文本内容进行统计
6、SearchWord()文章内容查找函数
7、DeleteWord()文章内容删除函数
8、Bmenu()文本内容处理菜单函数
9、AboutWord()显示作者信息的函数
10、menu()主菜单函数
11、main()主函数关系图:
二、详细设计(实验过程)
1、数据结构定义
typedefstructlist
{
chardata[80];intlength;structlist*next;
/*记录一行字符*/
/*记录一行字符长度*/
/*后继指针*/
structlist*pre;introw;
/*前趋指针*/
/*记录整篇文章的行数*/
}LinkList;
2、全局变量定义
LinkList*head;/*
定义全局变量*head,文章首行头指针*/
intNUM,C,N;
/*定义全局变量,Num用来记录行号,C用来记录子串在主串中出现
的总次数*/
3、函数说明
(1)CreatWord()文本创建函数
LinkList*CreatWord()
{
LinkList*temp;
charch;
inti,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");
请输入文章(输入#号结束):
\n\n");
printf("\t\t
for(j=0;jfor(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{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;返回指向最后一行指针:
returntemp;
文本输入部分到此结束。
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:
inti,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()文章内容统计函数
voidCountWord()
{
LinkList*temp;
charch;
inti,j,t;
intWORD=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++;
elseif((ch>='a')&&(ch<='z'))word++;
elseif((ch>='0')&&(ch<='9'))num++;
elseif(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
printf("\t\t****
\n",WORD+word);
printf("\t\t****
printf("\t\t****
文章中
字母
的个数:
%d
文章中数字
的个数:
%d\n",num);
文章中
空格
的个数:
%d
*\n"
);
\n",space);
printf("\t\t****************************************************\n");
scanf("%d",&t);
if(t==1){system("cls");
break;}elseif(t==2)exit(0);
对不起,无此功能!
请回车重新选择
!
...\n");
elseprintf("\t\tprintf("\t\t");
fflush(stdin);
getchar();
}
}
}
说明:
a、定义指针变量temp:
LinkList*temp;
b、定义记录文本行数变量j,每行字符数i;
c、定义记录文本大写字母数、小写字母数、空格数、数字数和总字数的变量:
intWORD=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++;
elseif((ch>='a')&&(ch<='z'))word++;
elseif((ch>='0')&&(ch<='9'))
num++;
elseif(ch=='')space++;
}sum=WORD+word+num;
}
e、本程序对统计项目设计了菜单。
菜单的编写使用while语句进行循环操作。
文本内容统计部分到此结束。
4)SearchWord()文章内容查找函数
voidSearchWord(char*str1,LinkList*temp)
{
charData[20];
inti,j,k=0,sum=0;
intl=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++;elseif(Data[k]!
='\0')
{
j=j-k;k=0;
}if(Data[k]=='\0')
{sum++;j=j-k+1;
printf("\t\t\t第%d次出现在第%d行第%d列\n",l,i+1,j);
l++;
k=0;
continue;}
}temp=temp->next;
字符串总共出现次数为:
%d\n\n",sum);
}printf("\n\t\t\tC=sum;
N=i*80+j;
}
说明:
a、定义一个数组,用来记录需要查找的字符内容:
charData[20];
b、定义定义文本行数变量j,每行字符数i,记录字符出现的次数变量:
inti,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->data[j])==Data[k])k++;/*将输入的查找字符与链表中信息比较,
找到第一个相同的字符*/
elseif(Data[k]!
='\0')
{
j=j-k;/*从主串第j-k个位置重新查找*/k=0;
}if(Data[k]=='\0')
{
sum++;/*此字符出现的次数加1*/j=j-k+1;/*j记录下该字符串出现的位置*/printf("\t\t\t第%d次出现在第%d行第%d列\n",l,i+1,j);
l++;
k=0;continue;
}
}temp=temp->next;/*指向下一行*/
}文本内容查找部分到此结束。
5)DeleteWord()文章内容删除函数voidDeleteWord(char*str2){
charData[20];
LinkList*temp,*term;inti,j,a,k,m,y,num;strcpy(Data,str2);for(y=0;ynum=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->data[j])==Data[k])k++;
elseif(Data[k]!
='\0'){j=j-k;k=0;}if(Data[k]=='\0'){num=j;break;
}
}if(num<80)break;
}for(;i<=NUM;i++)
{for(;j<80;j++)
{
if(j+1{
term->data[80-k+num]=temp->data[j+1];
}
else
{temp->data[j-k+1]=temp->data[j+1];
}
term=temp;temp=temp->next;
j=0;
}
}
}
说明:
a、定义一个数组用来存储需要删除的字符或者字符串:
charData[20];
b、定义指针变量:
LinkList*temp,*term;
c、定义整形变量用来控制行数、字符数:
inti,j,k,m,y,num;
d、使用拷贝函数讲形参中需要删除的字符或字符串赋值给已定义的数组:
strcpy(Data,str2);
f、使用循环进行删除操作:
for(y=0;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->data[j])==Data[k])k++;elseif(Data[k]!
='\0'){j=j-k;k=0;}if(Data[k]=='\0')
{
num=j;break;
}
}if(num<80)break;
}
/*首先是使用循环查找到需要删除字符或者字符串的字符数以及字符或者字
符串的位置,
以便于删除*/
for(;i<=NUM;i++)
{
for(;j<80;j++)
{
if(j+1{
term->data[80-k+num]=temp->data[j+1];/*删除的字符串不在最后一行,
将下一行的字符(由temp指向)
前移到前行*/
}
else
{temp->data[j-k+1]=temp->data[j+1];/*当要删除的字符串在最后一行
只要将最后一行的字
符前移*/
}
}
term=temp;
temp=temp->next;/*在使用循环,从查找到的字符或者字符串开始进行删除,
在一行删除完毕之后,转至下一行进行删除*/
j=0;
}
}
文本内容删除部分到此完成。
6)Bmenu()文章内容处理菜单函数
voidBmenu(LinkList*temp)
{
charstr1[20];
charstr2[20];
intt;
do/*利用dowhile循环来控制主菜单显示*/{
printf("\n");
**\n");
printf("\n\t\t*
printf("\t\t***************************************************
printf("\t\t****1、查找文章中的字符或者字符串
printf("\t\t****2、删除文章中的字符或者字符串
printf("\t\t****3、显示当前文章内容
printf("\t\t****4、返回主菜单
printf("\t\t****5、直接退出系统
**\n");
**\n");
**\n");
**\n");
**\n");
printf("\t\t***************************************************printf("\t\t请选择:
");
scanf("%d",&t);
if((t>5)||(t<1))
{
printf("\t\t对不起,无此功能!
请回车重新选择!
...\n");printf("\t\t");
fflush(stdin);
getchar();
}
else
{switch(t)
{
case1:
system("cls");
printf("\n");
printf("\n\t\t*
**\n");
**\n");
printf("\t\t**
:
");
printf("\n\t\t\t请输入您需要查找的字符或字符串
getchar();
gets(str1);printf("\n");SearchWord(str1,temp);
printf("\n\t\t按回车键继续·····");getchar();getchar();
system("cls");break;
case2:
system("cls");printf("\n");
**\n");
文章内容处理子菜单
PrintWord();
printf("\n\n\t\t按回车键继续·····");
getchar();
getchar();system("cls");break;
}if(t==4)
{
system("cls");break;
}
if(t==5)exit(0);
}
}while
(1);
说明:
用do-while语句来制作文章内容处理菜单,用switch语句来选择实现功能。
(7)AboutWord()相关性息voidAboutWord()
{printf("\n\n\n\n\n\n\n\n");
printf("\t*
**\n");
*\n");
简单的文章编辑器
*\n");
printf("\t*
printf("\n");
}
(8)menu()主菜单voidmenu()
{
intt;
LinkList*temp;do
{
printf("\n");
printf("\n");
printf("\n");
printf("\t\t
printf("\t\t***************************************************
);
printf("\t\t***************************************************
printf("\t\t****
1、
文章内容输入
printf("\t\t****
2、
显示当前文章内容
printf("\t\t****
3、
文章内容统计子菜单
printf("\t\t****
4、
文章内容处理子菜单
printf("\t\t****
5、
程序相关
printf("\t\t****
6、
退出文章编辑器
****\n");
****\n");
****\n");
****\n");
****\n");
****\n");
printf("\t\t!
!
!
注:
第一次运行本程序时请选择1功能进行输入!
!
!
\n");
printf("\t\t******************