信息技术与工程学院
课 程 设 计 报 告
课程名称
数据结构
设计题目
文学研究助手
专
班
业 计算机科学与技术
级 计算机 1801 班
小组成员杨杰莹
1809112139
杜 倩
1813122207
闫晓慧
1809112138
王禹婧
1809112135
刘 璇
1809112124
指导教师
韩 莉
成绩
月
年
日
目 录
1 需求分析 ................................................ 1
2 概要设计 ................................................ 1
2.1 定义单词类型 .......................................... 1
2.2 定义有序表类型 ........................................ 1
2.3 定义文本串文件类型 .................................... 1
3 详细设计 ...............................错误!未定义书签。
3.1 主程序模块 ........................... 错误!未定义书签。
3.2 单词单元模块 .......................................... 4
3.3 有序表单元模块 ........................................ 4
3.4 单词文本串文件模块 .................................... 5
4 调试分析 ............................................... 12
5 测试结果 ............................................... 13
参考文献 .................................................. 7
附录 ...................................................... 7
1 需求分析
(1)文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。试写一
个实现这一目标的文字统计系统,称为“文学研究助手”。
(2)英文小说存于一个文本文件中。待统计的词汇集合要一次输入完毕,即统计工
作必须在程序的一次运行之后就全部完成。程序的输出结果是每个词的出现次数和出
现位置所在行的行号,格式自行设计。
(3)测试数据:文本文件为本次实习中的 c 源程序文件保存为 shuji.txt
2 概要设计
采用对两个有序表进行相互比较的策略进行“单词匹配”。程序中将涉及下列三
个抽象数据类型:
2.1 定义单词类型
ADT Aword{
数据对象: D=(Si|Si∈标准 c 字符串集合 i= 1,2,3,........n,n≥0}
数据关系: RI={|Si-1,Si ∈Di=1,2,3 ......n}
基本操作:
New Word(WordType *nw,Sequence cha)
初始条件: cha 为字符序列
操作结果:生成一个其值为给定字符序列的单词
WordCmp(WordType wd1,WordType wd2)
初始条件:单词 wd1 和单词 wd2 已存在
操作结果:若 wdlwd2,则返
回 1
PrintWord(WondType wd)
初始条件:单词 wd 已存在
操作结果:在计算机终端上显示单词 wd
}ADT AWord
2.2 定义有序表类型
ADT OrderList{
1
数据对象: D=(Si|Si ∈AWord,i= 1,2,3.....n,n.≥0}
数据关系: R1={|Si-1,Si ∈D,Si-l|Si-1,Si∈D,i=1,2,3......n}
基本操作:
Initialization(FILE **fr)
初始条件:文件 fr 已存在
操作结果:打开文件 fr.设定文件指针指向文件中第一行第一个字符
GetAWord(FILE *f,Sequence *st)
2
初始条件:文件 f 已打开
操作结果;从文件指针所指字符起提取一个“单词 st"
ExtractWord(FILE *f,OrderList *ta)
初始条件:文件 f 已打开,文件指针指向文件 f 中某一行的第一个字符
操作结果:提取该行中所有单词,井构成单词的有序表 a,本操作结束时,文件指
针指向文件 f 中下一行的第一个字符:
match(FILE *f,OrderLsit pat, ResultType rs)
初始条件:文件 f 已打开,文件指针指向文件 f 中第一个字符,pat 为包含所有待
查询单词的有序表
操作结果:rs 为查询结果
}ADT Textstring
3 详细设计
3.1 主程序模块:
主函数设计如下:
status main()
{
char c;
while(1)
{
printf("\n\n**********欢迎使用文学研究助手系统**********\n\n");
printf("**********请选择(1-2)**********\n");
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\t 1.开始\n");
printf("\t 2.结束\n");
printf("********************************\n");
3
printf("\t 你的选择是:\n");
c=getchar();
fflush(stdin);
switch(c)
{
case '1' :
chazhao()
; break;
/*输出该单词所
在行号和次数*/
case '2' :
; break;
default
: printf("\t 按任意键继续(1-2)\n");
getch();
}
}
}
3.2单词单元模块
int WordCmp(WordType wd1,WordType wd2)//单词比较函数
{
int k,si,sj,m;
息
//功能:比较堆中两单词的大小
//参数:WordType wd1--第一个单词描述信
si=wd1.stadr;sj=wd2.stadr;
//WordType wd2--第二个单词描述信息
for(k=0;k<=wd1.len&&k<=wd2.len;k++)
//返回值:-1--小于;0--等于;1--大于
{
m=fabs((float)(sp.stores[si+k]-sp.stores[sj+k]));
4
if(m!=0&&m!=32)break;
if(k==wd1.len||k==wd2.len)break;
}
if(wd1.len==wd2.len)
{
if(k==wd1.len)return 0;
else
if(sp.stores[si+k]>sp.stores[sj+k])return 1;
else return -1;
}
else if(wd1.lensp.stores[sj+k])return 1;
else return -1;
}
else
{
if(k==wd2.len)return 1;
5
else
if(sp.stores[si+k]>sp.stores[sj+k])return 1;
else return -1;
}
}
void InputWord(OrderList *pt)//输入统计的词集函数
//功能:输入待统计的词集并建立起数据结构
//参数:OrderList *pt--返回的词集有序表指针
//返回值:无
{
char cc;
int i=0;
Sequence ws;
LinkType p,q,s;
WordType nwd;
InitList(pt);
p=pt->head;
q=pt->head;
while((cc=getchar()))
{
if(cc!=' '&&cc!='\n'){ws.ch[i]=cc;i++;}
else{
ws.size=i;
NewWord(&nwd,ws);
MakeNode(&s,nwd);
6