《英文单词使用频度统计--毕业设计论文.doc》由会员分享,可在线阅读,更多相关《英文单词使用频度统计--毕业设计论文.doc(40页珍藏版)》请在三一办公上搜索。
1、数据结构课 程 设 计 任 务 书学院名称: 数学与计算机学院 课程代码:_专业: 软件工程 年级: 一、设计题目 英文单词使用频度统计二、主要内容本设计属于数组链表的应用,统计英文文本文件中各单词的使用频度(使用次数/单词总数)。要求使用数组链表存放文件中不同单词及出现的次数,数组链表的节点内容包括指向左右子树的指针、单词本身、使用次数。基本操作过程是从文本文件中读取一个单词并插入数组链表并累计出现次数,文件读完,即按使用频度顺序输出各单词。三、具体要求及提交的材料1做好设计计划,认真查阅相关资料,完成程序设计及调试;2按课程设计说明书_实例模板完成课程设计说明书的撰写;3设计结束后,必须上
2、交如下材料:(1)课程设计说明书(报告)打印稿一份;(2)课程设计说明书及源代码电子文档四、主要技术路线提示认真分析系统功能需求,拟定设计方案和程序框架,查阅相关资料,完成算法设计和程序调试。五、进度安排共计两周时间,建议进度安排如下:1 选题,应该在上机实验之前完成2 需求分析、方案拟定、程序框架思考可分配4学时3 详细的程序设计可分配8学时4 调试和分析可分配8学时。可以有2学时的机动,即提前完成设计任务的学生可提前安排程序验收和答辩六、 推荐参考资料1. 冯博琴 等编著,软件技术基础(修改版),西安交通大学出版社,19972. 严蔚敏 等著,数据结构,清华大学出版社,20033. 李芸芳
3、 等著,软件技术基础(第二版),清华大学出版社,20004. 徐孝凯 等著,数据结构(C语言描述),清华大学出版社,2004指导教师 签名日期 年 月 日系 主 任 审核日期 年 月 日目 录摘要1 引言 12 需求分析 12.1用户需求 12.2功能需求 13 概要设计 23.1设计思路图解 23.1.1数据结构图解23.1.2功能模块图23.1.3模块调用图33.1.4程序流程图43.2编码设计思路 53.2.1抽象数据类型53.2.2要模块设计74 详细设计 10 4.1头文件代码设计10 4.2详细代码设计125 系统测试 225.1实现环境 225.2 语言选择 225.3 测试文件
4、 225.4 测试分析 23总结 26致谢 27参考文献 28摘 要 本课程设计需要完成对信息中单词出现频率的统计。信息中同一个单词可能出现的格式有所不同,通过大小写转换后统一为小写格式来比较。在窗口中输出整个文件信息,给出输入提示,执行程序后输出要查询的单词出现的频率和位置。1 引 言 1.1问题的提出随着社会的发展,人们学习热情高涨,考证热已经遍布全国,特别是大学生的四六级考试,及其他的英语考试,可谓是英语似乎占据了大家的大部分时间。而这样便给很多出版社或知道书籍作者很多牟利的机会。统计单词便是他们吸引同学购买的一中手段,如何才能快捷准确的统计出所给出的信息中的指定的单词出现频率呢,这样便
5、孕育出了单词频率统计系统。1.2任务与分析本设计属于二叉树的应用,统计英文文本文件中各单词的使用频度(使用次数/单词总数)。要求使用二叉排序树存放文件中不同单词及出现的次数,二叉树的节点内容包括指向左右子树的指针、单词本身、使用次数。基本操作过程是从文本文件中读取一个单词并插入二叉排序树并累计出现次数,文件读完,即按使用频度顺序输出各单词。2需求分析2.1用户需求用户可以通过该程序查询和统计一篇英文文章中某些特定单词出现次数和位置。2.2功能需求用户可以输入单词来查询单词出现次数和位置;程序可以正确显示查询结果;用户可以选择是否在一次输出后继续查询;在一次查询中的结果记录到一个二维链表中。3概
6、要设计3.1设计思路图解3.1.1数据结构图解 图1 数据结构图解将从文件流读入的文章字符存到szFile字符数组中,以空格计数行单词个数,以换行符记录文章列数,将输入后插入到链表中的单词与字符数组中的单词比较,遇到相等的则将当前的行列数插入到链表的位置结点中,并且单词个数加1。本程序允许用户选择是否重复进行,并且对于在一次操作中重复输入的单词,在链表中不进行重复插入。3.1.2功能模块图 图2功能模块图3.1.3模块调用图 图3模块调用图 3.1.4程序流程图 图4程序流程图3.2编码设计思路3.2.1抽象数据类型struct nodeint col; /行坐标int row; /所在行的列
7、坐标node* next; /指向下一个坐标结点的指针; /单词坐标坐点类型struct Nodechar words20; /单词数组node* ptr; /指向单词坐标结点的指针Node* next; /指向下一个单词结点的指针int num; /单词所含字符个数; /单词结点class TLinkpublic:TLink() head = NULL; /构造函数TLink() /析构函数while( head != NULL )Node* temp;temp = head;head = head - next;delete temp;void Insert( char* Item );/
8、前条件:参数Item为一个字符数组。/后条件:Item所包含的单词被插入到链表。void calcute(char *szFile,int size);/前条件:szFile以正确保存了文本字符,size为文本字符长度。/后条件:统计链表每一个插入的单词的个数及所在行、列坐标。Node* gethead();/前条件:链表已初始化/后条件:返回链表头指针private:Node* head;char A_to_a( char alp );/前条件:alp为一个正确的英文字母/后条件:如果alp是大写字母,则转化为小写字母,否则不变。void showwindow();/后条件:显示统计结果。v
9、oid show_text();/前条件:在正确的路径上存在一个英文文本。/后条件:读入英文文本到字符数组并显示在屏幕上。void input();/后条件:读入用户输入的字符并插入到单词链表。3.2.2主要模块设计/*/ 新建单词结点;while( Itemi != 0 ) 复制各字符到单词结点的单词数组中; 记录单词字母个数; 插入单词字母个数到链表相应域;temp - wordsi = 0;查找并比较链表中是否已有要插入的单词; 如果有 不进行插入并销毁新建结点; 否则 插入新建的单词结点;/*/统计函数( 参数:char *szFile, int size)while( 没有到文本字符
10、的结尾 )依次遍历文本字符,遇到非字母字符时计数单词所含字母个数;while( 没有到链表尾 )if( 单词结点所含单词的字母个数与计数相等 )忽略大小写比较本次遍历到的单词和链表中的结点单词; if(相等) 插入行列值 遇空格行单词个数加1; 遇换行列数加1;/*/结构显示模块while( 没到链表尾 )输出结点单词;如果存在,则输出单词的所有行、列值及出现次数; 否则输出没有该词或输入错误信息;/*/输入模块doif( 链表不空 )清空链表;输出提示信息;接受用户输入; while( true )输入的是结束字符; 退出;记录输入逗号前的单词;插入到链表;继续输入;if( 链表空 )输出
11、没有插入任何单词!;else 统计; 显示结果;提示是否继续;输入;while( 不继续 );4详细设计4.1头文件设计/*头文件*/FILE:source.h#ifndef SOURCE_H#define SOURCE_Hstruct nodeint col;int row;node* next;struct Nodechar words20;node* ptr;Node* next;int num;class TLinkpublic:TLink() head = NULL; TLink()while( head != NULL )Node* temp;temp = head;head =
12、head - next;delete temp;void Insert( char* Item );void calcute(char *szFile,int size);Node* gethead();private:Node* head;char A_to_a( char alp );void showwindow();void show_text();void input();#endif /将链表类声明于头文件中便于调用,清晰易见。4.2详细代码设计/english.cpp#include#include#include#include source.husing namespace
13、std;TLink link;int i=0;char szFile2000; /定义一个足够长度的字符/*主函数*/主要调用函数用来实现功能int main()show_text(); /显示全文函数cout wordsi = Itemi; + i;temp - num = i;temp - wordsi = 0;Node* ptrr = NULL;ptrr = link.gethead();while( ptrr != NULL ) if( ptrr - num = temp - num )int n;for( n = 0; n wordsn ) != A_to_a( Itemn ) )
14、/对他们进行比较break;if( n = i ) /如果找到相等的单词flag = 1;break; ptrr = ptrr - next; if( flag != 1 ) temp - ptr = NULL; temp - next = NULL; Node* Temp = head; if( head = NULL ) head = temp; else while( Temp - next != NULL ) Temp = Temp - next; Temp - next = temp; elsedelete temp; /释放链表/*大写转化成小写*/将大些转化成小写,避免开头或特殊
15、单词char A_to_a( char alp )if( ( alp = A ) & ( alp = Z ) )alp = alp + 32;return alp;/*统计频率和位置*/void TLink:calcute(char *szFile, int size)int i = 0; /记录已搜索过的字符数-1intcol = 1; /列标int row = 0; /行标int count; /记录空格数-1Node* ptrr = NULL;while( i = a & szFilei = A & szFilei num = j )int n;for( n = 0; n wordsn
16、) != A_to_a( szFilei - j + n ) )break;if( n = j )node* temp;temp = new node;temp - col = col;temp - row = row;temp - next = NULL;node* Temp = ptrr - ptr; if( ptrr - ptr = NULL )ptrr - ptr = temp;else while( Temp - next != NULL ) Temp = Temp - next; Temp - next = temp; /插入行数ptrr = ptrr - next;if( szF
17、ilei = | szFilei = n )count = -1; while( szFilei = ) + i; /设置列数 + row;/行的单词个数加 + count;/单词之间空格-1 row = row - count; if( szFilei = n ) + col; /列遇到换行累加 + i;row = 0;/单词的行个数清零 else+ i;cout wordsk != 0; + k )cout wordsk;cout ptr = NULL )cout 没有该词,或输入不正确! ptr != NULL )cout (;cout ptr - col ; /显示行数cout ,;c
18、out ptr - row ; /显示列数cout );cout ptr = curptr - ptr - next; word_num +; /统计次数cout endl;cout 该单词共出现 word_num 次! next;/*显示全文*/打开文件并输出TXT文件中的信息void show_text()ifstream fin; /流fin.open(D:english.txt); /打开文件if (fin.fail()coutInput file opening failed.n;exit(1);char next;/获取文件中的字符fin.get(next);while (! fi
19、n.eof() /判断是否到文件尾 szFilei = next; /赋予szFile+ i; fin.get(next); /将整个文件的内容赋给szFileszFilei = 0; /尾置空for( int k = 0; k i; + k )cout szFilek; /输出文件内容cout *Total number : i endl;cout * endl;/*输入函数*/窗口录入用户输入信息给出相应的操作void input()char Item40; /暂存数组char in; /接受输入字符char ans; /判断是否重新开始doif( link.gethead() != NU
20、LL )link.TLink(); /调用析构cout 请输入要统计的单词,单词之间用逗号隔开(输入键结束,本程序忽略空格): in;int flag = 1; /用来判断是否输入结束while( true )if( in = )break;int m = 0;while( in != , ) Itemm = in;+ m;cin in;if( in = ) flag = 0; break;Itemm = 0; /将暂存数据的字符置空link.Insert( Item );if( flag = 0 ) break;cin in;if( link.gethead() = NULL )cout 没
21、有插入任何单词! endl;else link.calcute( szFile, i ); showwindow();cout ans;while( ( ans != n ) & ( ans != N ) ); /判断5.系统测试 5.1 实现环境硬件平台:安装有windows系统,操作系统和版本:Microsoft visual vc+6.05.2 语言选择C+语言5.3 测试文件D:english.txtExtravagant Spending on College Campus According to a survey, in recent years the monthly expe
22、nditure of a college student has been on the sharp rise. Many college students spend money like water and have no concept of thrift in their mind. They take it for granted that they spend money from their parents before they enter into the society. This extravagant spending is mainly caused by the f
23、ollowing factors. First of all, nowadays most of students are the only children of their families. They are the apple in their familys eyes and naturally get more care and pocket money. Secondly, with the improvement of living standard, parents can afford higher expenditure of their children. Thirdl
24、y, some students like to pursue fashion and trends, which tends to need more money. Finally, campus love is also a possible factor causing extravagant spending. From my point of view, a college student, as a pure consumer, should learn to be thrifty. We should limit our expenditure on daily necessit
25、ies but not buy whatever we want regardless of their prices. The habit of thrift can help us form right values and is favorable to our future development.5.4测试分析5.4.1运行程序初始界面图5 运行程序初始界面图5.4.2输入单词“of”查询结果图6 输入一个单词查询结果5.4.3输入单词“of”和“student”查询结果 图7 输入两个单词显示结果5.4.4输入“tomorrow”显示结果 图8 输入文中未出现单词显示结果5.4.5
26、输入“n”推出程序 图9 退出程序 总结在本次课程设计中感受到自己也可以编写小程序让单词统计变得如此简单,同时再次体会了链表在数据结构中的重要作用,通过查阅书籍与网上查询了解了链表的更多使用技巧,进一步夯实了以后编程的能力。致谢在这次课程设计中学到了很多在课堂上没有学到的东西,首先感谢我的老师在上机时对我的耐心指导和帮助,在我编写的程序难以运行满意是老师总是能够给我充分的帮助,启发我成功排除错误,少走了不少弯路;其次我要感谢学校给提供给我们足够的实验环境与器材,同时配备了优秀的指导老师让我们在轻松愉快的环境中学习与实验。在这次实验中可谓是让我受益匪浅,学得轻松,学得开心,学得满足。参考文献1谭
27、浩强 等.C语言程序设计教程.高等教育出版社.20052李建学 等.数据结构课程设计案例精编(用C/C+描述).清华大学出版.2007-2-13严蔚敏 等.数据结构(C语言版).清华大学出版社.2003-1#include#include#include#include source.husing namespace std;TLink link;int i=0;char szFile2000; /定义一个足够长度的字符/*主函数*/int main()show_text(); /显示全文函数cout wordsi = Itemi;+ i;temp - num = i;temp - words
28、i = 0; /将录入的单词赋予wordNode* ptrr = NULL;ptrr = link.gethead();while( ptrr != NULL ) if( ptrr - num = temp - num )int n;for( n = 0; n wordsn ) != A_to_a( Itemn ) )break;if( n = i ) /如果相等flag = 1;break; ptrr = ptrr - next; if( flag != 1 ) temp - ptr = NULL; temp - next = NULL; Node* Temp = head; if( head = NULL ) head = temp; else while( Temp - next != NULL ) Temp = Temp - next; Temp - next = temp; elsedelete temp;/*大写转化成小写*/char A_to_a( char alp )if( ( alp = A ) & ( alp = Z ) )alp = alp + 32;return alp;/*统计频率和位置*/void TLink:calcute(char *szFile