合肥学院
计算机科学与技术系
课程设计报告
2011 ~2012 学年第二学期
课学学专指
业导
班教生
姓
程 数据结构与算法
关键字统计问题
赵文昇 1004014004
计算机科学与技术10级4班 李红 陈艳平 王竹婷
名 号 级 师
课程设计名称
2012 年 2 月
数据结构课程设计报告
题目
请你写一个程序统计一个单词(不区分大小写)在文章中出现的次数(单词指一个小写的英文单词,全部由小写英文字母组成。单词的前后必须是字母字符或空字符)。 一、问题分析和任务定义
这个程序的要求是,输入:第一行是一些句子,表示一篇文章。输出:每组测试数据输出一行,表示这个单词在文章中出现的次数
实现本程序需要解决一下几方面的问题: 首先,由键盘输入的一些句子用何种方式的数据结构来存储,也就是当用户输入一段英文之后,计算机是怎么存储的,其次是要考虑当用户输入要查找的单词时,计算机是怎么存储的。
然后要考虑的问题是:如何来比较两个单词是否相等,而且不区分大小写。当比较完成之后要返回给主函数什么样值。 二、数据结构选择和概要设计
根据这个题目的要求,首先要定义一个结构体,用字符串链表来存储用户所输入的一段文章,要求输入的每一个单词都存储在各自的节点中,以便以后的查找和比较。
根据题目的要求分析可知,首先要求用户输入一段英文,注意该文章中有空格,有大写的,有小写的,有标点符号。因为这些非字母的字符是用来判断是否要重新申请内存,这些字符后面的英文字母将存储在新的节点中。而这些字符将存放在内存其它地方,而且每个字符是依次替换的,所以占用的空间很小。所以,用户输入的需要比较的单词也是按照这种方法存储的。然后要比较关键单词和文章中的单词,当相同时用计数器计数,最后返回这个数到主函数中。
三、详细设计和编码
在概要设计中有字符串链表的概念,字符串链表需要首先定义一个结构体,该结构体中的变量只有两个,一是字符串数组,二是指针。 该结构体定义如下:
typedef struct node{
char ch[size];//size是定义的宏常量
struct node *next;//指向下一个结点的指针 }Node;
根据题目要求,要定义四个子函数,第一个是接收用户第一次输入的英文并返回头结点的地址,第二个是接收用户输入要查找的关键单词,同样返回头结点地址,第三个是用关键单词与输入英文的每一个单词比较,返回一个整数类型的数据,最后一个是一个关键单词和一个英文文章中的单词比较,如果相等则返回0,不相等返回-1。
其中需要注意的是最后一个函数是直接被第三个函数直接调用的。它们与主函数的关系如下所示:
Main() 主函数 Getmessage(); 存储英文 Getword(); 存储关键词 Strcm(); 单词比较 Number(); 关键字统计 下面介绍这几个函数的主要思想和关键步骤的编码:
主函数首先调用Getmessage();该函数是把用户输入的英文短文中的每个字母依次存储到字符串数组中,当遇到逗号,感叹号,空格等等就会重新申请一个内存空间,后面的字母就会存储到新的内存空间,一直到当用户输入#号时就结束,也就是该函数调用结束,返回给主函数头结点的首地址,其中关键步骤的编码是: while(a!='#')//输入#号时循环结束 {
while(1) {
scanf(\
if((65<=a&&a<=90)||(97<=a&&a<=122))//判断输入的是不是26英文字母 {
t->ch[i]=a; i++; } else break; }
t->ch[i]='\\0';//把字符数组转变成字符串 i=0; if(a=='#') {
t->next=NULL;
return q;//返回头结点的地址 }
else{
t=(Node *)malloc(sizeof(Node)); p->next=t; p=p->next; }
存储要查找单词的函数Getword():该函数首先要接收一个整形的数据,该数据是用户要查找的关键单词的个数,这个数的作用是用来控制循环结束,该函数结束时,就生成了一个字符串链表,返回值也是该字符串链表的头结点的首地址。关键步骤的编码如下: printf(\请输入你想查找单词的个数-----\scanf(\
printf(\请输入单词------\\n\while(1)
{
scanf(\
if(i
{
p=(Node *)malloc(sizeof(Node)); w->next=p; w=w->next; i++; } else {
break; }
}
p->next=NULL;
return q;//返回头结点的地址
求单词在文章中出现次数的函数number(),该函数用到计数器,用Getmessage()函数生成的字符串链表的next是否为NULL作为循环结束的条件,同时还调用了函数strcm();该子函数用来判断两个单词是否相等,具体做法是,首先判断两者的单词长度是否相等,不相等则返回-1,相等了在调用库函数strcmp();如果该函数返回0则代表相等,否则判断这两个单词的每个字母是否一样,或者,是不是互为大小写得,如果有一个不一样则返回-1,该函数调用结束,如果一样则比较下一个字母是否一样,关键步骤的编码如下: while(pm[i]!='\\0')//长度相等时,判断字符串结束的条件
{
if(abs(qw[i]-pm[i])!=32&&abs(qw[i]-pm[i])!=0)//判断字母的大小 { } else i++; }
写
return -1;
return 0;
主函数调用以上的子函数,再用一个循环,就能实现该题目的要求了,主函数的调用如下:
printf(\请输入一段英文短文----\\n\ p=Getmessage(); q=Getword(); while(q!=NULL)
{
printf(\
q=q->next; }
printf(\程序完成,谢谢,再见\四、上机调试过程
编写该程序之后发现主要的语法错误主要在于子函数和变量的定义,括号的配对,关键字和函数名称的书写,以及一些库函数的规范使用。这些问题均可以根据编译器的警告提示,对应的将其解决。上机调试的时候,不仅要注意语法错误,还要注意程序思想,观察有没有什么漏洞,和程序的健壮性,多输入一些有可能出错的短文来使程序更加完美,健壮。 五、测试结果及其分析
输入 David:hello,lily.Lily:oh,david!hello,how are you?,hellow,hell. 5 Hello
Dav Ello David Lily 输出 2 0 0 2 2