文章编辑数据结构课程设计.docx
《文章编辑数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《文章编辑数据结构课程设计.docx(23页珍藏版)》请在冰豆网上搜索。
文章编辑数据结构课程设计
长沙理工大学
《数据结构》课程设计报告
文章编辑
学院专业
班级学号
学生姓名指导教师
课程成绩完成日期
课程设计成绩评定
学院专业
班级学号
学生姓名指导教师
完成日期
指导教师对学生在课程设计中的评价
评分项目
优
良
中
及格
不及格
课程设计中的创造性成果
学生掌握课程内容的程度
课程设计完成情况
课程设计动手能力
文字表达
学习态度
规范要求
课程设计论文的质量
指导教师对课程设计的评定意见
综合成绩指导教师签字年月日
课程设计任务书
计算机与通信工程学院软件工程专业
课程名称
数据结构课程设计
时间
学生姓名
指导老师
题目
文章编辑
主要内容:
采用单链表数据结构静态存储文章,以C语言实现相关程序,实现对输入的文章进行统计文章中总字符数、统计文章中空格个数、统计文章中数字个数、统计文章中英文字母数、删除文章中指定字符串、统计文章中指定字符串出现次数的文章编辑功能操作。
要求:
(1)通过实际项目的分析、设计、编码、测试等工作,掌握用C语言来开发和维护软件。
(2)按要求编写课程设计报告书,能正确编写分析、设计、编码、测试等技术文档和用户使用手册。
应当提交的文件:
(1)文章编辑数据结构课程设计论文。
(2)代码清单。
文章编辑
学生姓名:
陈旖指导老师:
陈倩诒
摘要本课程设计主要解决了基本的文章编辑问题。
对于一页按要求输入到程序执行窗口的文章,静态存储结构使用线性表中,分别完成统计文章总字符数、文章中空格个数、文章中英文字母数、统计文章中英文字母数的操作和文章中某一字符串的出现的次数,并输出该次数;除以上的统计操作,还实现删除文章中指定字符串,并且将删除字符串后面的字符前移,再保存为编辑后的文章。
关键字静态存储;线性表;编辑;字符串
1.引言……………………………………………………………………………………1
1.1课程设计意义…………………………………………………………………1
1.2课程设计目的……………………………………………………………………1
1.3课题要求…………………………………………………………………………1
2.设计思路与方案………………………………………………………………………2
2.1函数流程…………………………………………………………………………2
2.2功能函数…………………………………………………………………………4
3.详细实现………………………………………………………………………………5
3.1数据结构设计……………………………………………………………………5
3.2功能函数设计……………………………………………………………………5
3.3函数分析…………………………………………………………………………6
4.运行环境与结果……………………………………………………………………12
4.1运行环境…………………………………………………………………………12
4.2运行结果…………………………………………………………………………12
5.结束语………………………………………………………………………………16
6.参考文献……………………………………………………………………………17
7.附录…………………………………………………………………………………18
代码清单………………………………………………………………………………18
1引言
1.1课程设计意义
在实践教学中,课程设计是一个重要环节,它以某一课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。
课程设计是让同学们对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。
数据结构[1]是一门重要的专业基础课,是计算机理论和应用的核心基础课程。
数据结构课程设计,要求学生在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计[2]及其实现等方面,加深对课程基本内容的理解[3]。
同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
1.2课程设计目的
1.提高对数据逻辑结构[4]的特点以及存储表示方式的认识,培养在具体应用中选择合适的数据结构和存储结构的能力。
2.熟悉软件开发的基本过程,初步掌握软件开发过程的问题分析、系统设计、程序编码[5]、测试等阶段基本任务和技能方法。
3.培养自己的算法设计和算法分析能力,提高综合运用所学的理论知识和方法独立分析和解决问题的能力。
4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的工作方法、作风和相互合作的精神。
5.综合运用链表[6]的查找、插入和删除,理论结合实际,将其运用到文章编辑这一实验中。
使这些知识得到进一步巩固、加深和拓展。
利用模块的思想,模块之间用指针连接,减少了不必要的麻烦。
巩固加深指针的用途,理解模块的优点。
加深对链表的理解,全面认识链表操作的字符串的模式匹配操作。
1.3课题要求
课题名称:
文章编辑
具体要求:
(1)静态存储一页文章,每行最多不超过80个字符,共N行;
(2)分别统计出其中英文字母数和空格数及整篇文章总字数;
(3)统计某一字符串在文章中出现的次数,并输出该次数;
(4)删除某一子串,并将后面的字符前移;
(5)存储结构使用线性表[3],分别用几个子函数实现相应的功能。
2设计思路与方案
2.1函数流程
根据课题文章编辑的详细要求,可将程序的运行分为三个模块,即文章输入和文章输出模块、指令输入和指令判断模块、执行指令操作模块。
构造多个线性表,将输入的文章的每一行字符,都分别静态存储[4]在相应的线性表中。
每个线性表的存储容量不超过80个字符。
文章输入结束后,程序输出指令菜单,列出程序可以合法执行的操作指令,并选择输入合法的指令,以执行相应的指令操作。
依照课题要求,程序设计了6大功能,分别为统计文章中总字符数、统计文章中空格个数、统计文章中数字个数、统计文章中英文字母个数、删除文章中指定字符串、统计文章中指定字符串出现次数,并且为每一项功能提供相信的执行指令。
程序的执行流程如图2.1所示。
首先按要求输入文章,然后按照指令菜单选择要执行的指令,程序判断指令,并且执行相应的指令操作,输出指令执行结果后,重新返回指令菜单,再次等待指令输入。
指令书输入和指令执行为无限循环,在用户退出程序前,程序不会自动结束。
图2.1函数执行流程图
2.2功能函数
为实现6个执行指令操作,分别设计相应的功能函数,并运用C语言数据结构构造相关代码。
功能函数名以功能说明如表2.2所示。
表2-1功能函数列表
函数
功能
voidCountAll()
统计文章中总字符数
voidCountSpace()
统计文章中空格个数
voidCountNumber()
统计文章中数字个数
voidConuntLetter()
统计文章中英文字母数
voidDelstring()
删除文章中指定字符串
voidFindstring()
统计文章中指定字符串出现次数
3详细实现
3.1数据结构设计
(1)定义
结构体:
typedefstructline
{
char*data;
structline*next;
}LINE;
LINE为单链表存储结构。
3.2功能函数设计
(1)统计文章总字数:
voidCountAll(LINE*&head)
将p付给表头指针;
初始化count为0;
用do-while语句遍历链表,同时统计字符串中总字数;
用printf语句输出文章中总字数,调用子函数menu()。
(2)统计文章中的空格数:
voidCountSpace(LINE*&head)
将p付给表头指针;
初始化count为0;
用do-while语句遍历链表,同时统计字符串中空格数;
用printf语句输出文章中空格数,调用子函数menu()。
(3)统计文章中数字个数:
voidCountNumber(LINE *&head)
将p付给表头指针;
初始化count为0;
用do-while语句遍历链表,同时统计字符串中数字个数;
用printf语句输出文章中数字个数,调用子函数menu()。
(4)统计文章中英文字母数:
voidCountLetter(LINE*&head)
将p付给表头指针;
初始化count为0;
用do-while语句遍历链表,同时统计字符串中英文字母数
用printf语句输出文章中英文字母数,调用子函数menu()。
(5)查找字符串的函数:
voidFindString(LINE*&head)
将p付给表头指针;
初始化count为0;
初始化len1,用来保存当前行的总字符数;
定义整型变量len2表示待统计字符串的长度;
用printf语句提醒用户输入要统计的字符串;
用do-while语句遍历链表,同时用for循环和if语句找出指定字符串在文章中出现的次数;
用printf语句输出指定字符串在文章中出现的总次数,调用子函数menu()。
(6)删除字符串的函数:
voidDelString(LINE*&head)
先创建一个delstringword,其中包含两个字符串char*s和char*str,用*s表示输入的字符串,*str表示要删除的字符。
这个函数的功能是找到字符串s在字符串中出现的位置并删除该字符串。
定义字符串的删除函数DelString(),用do-while语句遍历链表,语句中再套用if语句,并调用delstringword()进行删除。
3.3函数分析
(1)voidCountAll(LINE*&head)
本函数的作用是统计整篇文章的所有字符数,包括空格。
返回统计结果之后会调用menu方法打印指令菜单。
voidCountAll(LINE*&head)
{
LINE*p=head;
intcount=0;
do
{
count+=strlen(p->data);
}
while((p=p->next)!
=NULL);
printf("文章总字数:
%d\n",count);
printf("******************************\n");
printf("\n");
menu();
}
(2)voidCountSpace(LINE*&head)
本函数的作用是统计字符串链表中的空格个数,在统计完空格个数后,调用menu方法打印指令菜单。
voidCountSpace(LINE*&head)
{
LINE*p=head;
intcount=0;
do
{
intLen=strlen(p->data);
for(inti=0;iif(p->data[i]==32)count++;
}
while((p=p->next)!
=NULL);
printf("文章中空格个数:
%d\n",count);
printf("******************************\n");
printf("\n");
menu();
}
(3)voidCountNumber(LINE*&head)
本函数的作用是统计字符串链表中的数字个数,在统计完数字个数后,调用menu方法打印指令菜单。
voidCountNumber(LINE*&head)
{
LINE*p=head;
intcount=0;
do
{
intLen=strlen(p->data);
for(inti=0;iif(p->data[i]>=48&&p->data[i]<=57)count++;
}
while((p=p->next)!
=NULL);
printf("文章中数字个数:
%d\n",count);
printf("******************************\n");
printf("\n");
menu();
}
(4)voidCountLetter(LINE*&head)
本函数的作用是统计整个字符串链表中英文字母的个数。
遍历完成之后会调用menu方法打印指令菜单。
voidCountLetter(LINE*&head)
{
LINE*p=head;
intcount=0;
do
{
intLen=strlen(p->data);//计算当前data里的数据元素个数
for(inti=0;iif((p->data[i]>='a'&&p->data[i]<='z')||(p->data[i]>='A'&&p->data[i]<='Z'))
count++;//计算字母数
}
while((p=p->next)!
=NULL);//遍历链表
printf("文章中英文字母个数:
%d\n",count);//返回文章里
printf("******************************\n");
printf("\n");
menu();
}
(5)voidFindString(LINE*&head)
用户调用这个方法查找相应字符串的出现在文章中的次数。
统计后调用menu()方法打印指令菜单。
voidFindString(LINE*&head)
{
LINE*p=head;
intcount=0;
intlen1=0;
intlen2;
inti,j,k;
charstr1[20];
printf("\n");
printf("请输入要统计的字符串:
");
scanf("%s",str1);
len2=strlen(str1);
do
{
len1=strlen(p->data);
for(i=0;i{
if(p->data[i]==str1[0])
{
k=0;
for(j=0;jif(p->data[i+j]==str1[j])k++;
if(k==len2){count++;i=i+k-1;}
}
}
}
while((p=p->next)!
=NULL);//遍历链表
printf("该字符串在文中出现的次数:
%d\n",count);
printf("******************************\n");
printf("\n");
menu();
}
(6)voidDelString(LINE*&head)
删除字符串的函数,通过这个函数,删除出现在字符串链表里的所有的输入的字符片段。
最后调用menu方法打印指令菜单。
voidDelString(LINE*&head)
{
LINE*p=head;
charstr[20];
printf("请输入要删除的字符串:
");
scanf("%s",str);
do
{
if(strstr(p->data,str)!
=NULL)delstringword(p->data,str);
}
while((p=p->next)!
=NULL);
printf("删除指定字符串后的文章为:
\n");
OutPut(head);
printf("******************************\n");
printf("\n");
menu();
}
4运行环境与结果
4.1运行环境
本程序的运行环境为以Windows7系统PC上的VisualC++6.0。
4.2运行结果
如图4.1,所示,输入一段包含汉字、英文大小写字母、阿拉伯数字、空格、特殊字符的文章,每行都不超过80个字符,以“Ctrl+E(^E)”为结束符。
图4.1文章输入
如图4.2所示,输入指令“2”,执行“统计文章中总字符数”指令,执行结果为“399”。
图4.2统计文章中总字符数
如图4.3所示,输入指令“3”,执行“统计文章中空格个数”指令,执行结果为“57”。
图4.3统计文章中空格个数
如图4.4所示,输入指令“3”,执行“统计文章中数字个数”指令,执行结果为“6”。
图4.4统计文章中数字个数
如图4.5所示,输入指令“4”,执行“统计文章中英文字母数”指令,包括英文大写字母和英文小写字母,执行结果为“399”。
图4.5统计文章中英文字母数
如图4.6所示,输入指令“5”,执行“删除文章中指定字符串”指令,输入要删除的字符串“\n”,执行结果如下。
图4.6删除文章中指定字符串
如图4.7所示,输入指令“6”,执行“统计文章中指定字符串出现次数”指令,输入要统计的字符串为“printf”,执行结果为“8”。
图4.7统计文章中指定字符串出现次数
如图4.8所示,输入指令“7”,输出“指令输入错误”。
图4.8指令输入错误
本程序的文章为用户输入的文章,只能做即时输入的统计、编辑,而不能对已有的磁盘文件中的文章进行统计、编辑,如果引入文件流类,就可以打开磁盘文件,对其进行统计、编辑并保存,这是有待改进的。
5结束语
此次课程设计使我对数据结构方面的知识有了更加深入的了解,也使我认识到自己在学习编程方面还有很多的不足。
今后我要多读一些编程方面的书籍,不能只拘泥于课本上的知识,并注重理论与实践的结合,多上机练习编写程序,提高自己的实际动手能力和独立思考的能力,不断充实自己,更好的掌握编程思想。
同时,此次课程设计也使我对编程产生了兴趣,特别是在通过查书籍资料以及网上资源的情况下能够使程序运行成功,得到了一种成就感,相对于以前的一组人完成一个程序,此次一个人独立完成成就感更大一些。
参考文献
[1]严蔚敏,吴伟民.数据结构(C语言版).北京:
清华大学出版社,2002
[2]许卓群.数据结构与算法.北京:
高等教育出版社,2004
[3]金远平.数据结构(C语言版).北京:
清华大学出版社,2005
[4]殷人昆.数据结构(C语言版).北京:
清华大学出版社,2001
[5]G.Perry.C++程序设计教程.北京:
清华大学出版社,1994
[6]严蔚敏,吴伟民.数据结构习题集(C语言版).北京:
清华大学出版社,2004
附录
代码清单:
#include
#include
typedefstructline
{
char*data;
structline*next;
}LINE;//创建链表,向里面输入文本数据
voidOutPut(LINE*&head)//向屏幕输出文字
{
LINE*p=head;
//printf("^^^^^:
\n");
do
{
printf("%s\n",p->data);
}
while((p=p->next)!
=NULL);//遍历链表
printf("\n");
}
voidmenu()
{
printf("***********编辑指令***********\n");
printf("1:
统计文章中总字符数\n");
printf("2:
统计文章中空格个数\n");
printf("3:
统计文章中数字个数\n");
printf("4:
统计文章中英文字母数\n");
printf("5:
删除文章中指定字符串\n");
printf("6:
统计文章中指定字符串出现次数\n");
printf("******************************\n");
}
voidCreate(LINE*&head)
{
printf("请输入文章,每行最多80个字符,以Ctrl+E(^E)为结束符\n");
LINE*p=newLINE;//首先为链表建立一个附加表头结点
head=p;//将付给表头指针
chartmp[100];
while
(1)
{
gets(tmp);//输入字符串
if(strlen(tmp)>80)
{
printf("每行最多输入80个字符!
");
break;
}
if(tmp[0]==5)break;//如果发现输入^E,则退出输入
p=p->next=newLINE;
p->data=newchar[strlen(tmp)+1];//为结点分配空间
strcpy(p->data,tmp);
if(tmp[strlen(tmp)-1]==5)//除去最后一个控制符^E
{
p->data[strlen(tmp)-1]='\0';
break;
}
}
p->next=NULL;//最后一个指针为空
head=head->next;
printf("\n");
menu();
}
voidCountLetter(LINE*&head)//统计英文字母数
{
LINE*p=head;
intcount=0;
do
{
intLen=strlen(p->data);//计算当前data里的数据元素个数
for(inti=0;iif((p->data[i]>='a'&&p->data[i]<='z')||(p->data[i]>='A'&&p->data[i]<='Z'))
count++;
}//计算字母数
while((p=p->next)!
=NULL);//遍历链表
printf("文章中英文字母个数:
%d\n",count);//返回文章里
printf("******************************\n");
printf("\n");
menu();
}
voidCountNumber(LINE*&head)
{
LINE*p=head;
intcount=0;
do
{
intLen=strlen(p->data);