高等教育单词统计程序C_第1页
高等教育单词统计程序C_第2页
高等教育单词统计程序C_第3页
高等教育单词统计程序C_第4页
高等教育单词统计程序C_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单词统计问题描述文字研究人员需要统计某篇英文小说中某些特定单词的出现次数和位置,试写出一个实现这一目标的文字统计系统。这称为“文学研究助手”。要求算法输入:文本文件和词集。算法输出:单词出现的次数,出现位置所在行的行号(同一行出现两次的只输出一个行号)。算法要点:(1)文本串非空且以文件形式存放。(2)单词定义:用字母组成的字符序列,中间不含空格,不区分大小写。(3)待统计的单词不跨行出现,它或者从行首开始,或者前置一个空格。(4)数据结构采用二维链表,单词结点链接成一个链表,每个单词的行号组成一个链表,单词结点作为行号链表的头结点。需求分析用户需求:用户可以通过该程序查询和统计一篇英文文章中

2、某些特定单词出现次数和位置。功能需求:用户可以输入单词来查询单词出现次数和位置; 程序可以正确显示查询结果; 用户可以选择是否在一次输出后继续查询; 在一次查询中的结果记录到一个二维链表中。概要设计为达到设计要求,本程序采用二维链表存储单词结点和相关的位置信息。抽象数据类型:struct nodeint col; /行坐标int row; /所在行的列坐标node* next; /指向下一个坐标结点的指针; /单词坐标坐点类型struct Nodechar words20; /单词数组node* ptr; /指向单词坐标结点的指针Node* next; /指向下一个单词结点的指针int num

3、; /单词所含字符个数; /单词结点class TLinkpublic:TLink() head = NULL; /构造函数TLink() /析构函数while( head != NULL )Node* temp;temp = head;head = head -> next;delete temp;void Insert( char* Item );/前条件:参数Item为一个字符数组。/后条件:Item所包含的单词被插入到链表。void calcute(char *szFile,int size);/前条件:szFile以正确保存了文本字符,size为文本字符长度。/后条件:统计链表

4、每一个插入的单词的个数及所在行、列坐标。Node* gethead();/前条件:链表已初始化/后条件:返回链表头指针private:Node* head;char A_to_a( char alp );/前条件:alp为一个正确的英文字母/后条件:如果alp是大写字母,则转化为小写字母,否则不变。void showwindow();/后条件:显示统计结果。void show_text();/前条件:在正确的路径上存在一个英文文本。/后条件:读入英文文本到字符数组并显示在屏幕上。void input();/后条件:读入用户输入的字符并插入到单词链表。数据结构图解:将从文件流读入的文章字符存到s

5、zFile字符数组中,以空格计数行单词个数,以换行符记录文章列数,将输入后插入到链表中的单词与字符数组中的单词比较,遇到相等的则将当前的行列数插入到链表的位置结点中,并且单词个数加1。本程序允许用户选择是否重复进行,并且对于在一次操作中重复输入的单词,在链表中不进行重复插入。功能模块:模块调用:程序流程图:主要模块伪码概要设计:插入函数(参数:Item【】数组): 新建单词结点;while( Itemi != '0' ) 复制各字符到单词结点的单词数组中; 记录单词字母个数; 插入单词字母个数到链表相应域;temp -> wordsi = '0'查找并比较

6、链表中是否已有要插入的单词; 如果有 不进行插入并销毁新建结点; 否则 插入新建的单词结点;/*/统计函数( 参数:char *szFile, int size)while( 没有到文本字符的结尾 )依次遍历文本字符,遇到非字母字符时计数单词所含字母个数;while( 没有到链表尾 )if( 单词结点所含单词的字母个数与计数相等 )忽略大小写比较本次遍历到的单词和链表中的结点单词;if(相等) 插入行列值遇空格行单词个数加1; 遇换行列数加1;/*/结构显示模块while( 没到链表尾 )输出结点单词;如果存在,则输出单词的所有行、列值及出现次数; 否则输出没有该词或输入错误信息;/*/输入模

7、块doif( 链表不空 )清空链表;输出提示信息;接受用户输入;while( true )输入的是结束字符; 退出;记录输入逗号前的单词;插入到链表;继续输入;if( 链表空 )输出"没有插入任何单词!";else统计;显示结果;提示是否继续;输入;while( 不继续 );详细设计程序清单:/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

8、TLinkpublic:TLink() head = NULL; TLink()while( head != NULL )Node* temp;temp = head;head = 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#inclu

9、de<iostream>#include<fstream>#include<cstdlib>#include"source.h"usingnamespace std;TLink link;int i=0;char szFile2000;int main()show_text();cout << endl;input();return 0;/*/void TLink:Insert(char *Item)int flag = 0;Node* temp;temp = new Node;int i = 0;while( Itemi !

10、= '0' )temp -> 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 < i; + n )if( A_to_a( ptrr -> wordsn ) != A_to_a( Itemn ) )break;if( n = i )flag

11、 = 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

12、9; ) && ( alp <= 'Z' ) )alp = alp + 32;return alp;/*/void TLink:calcute(char *szFile, int size)/cout << "calcute is called!" << endl;int i = 0; /记录已搜索过的字符数-1intcol = 1;/列标int row = 0;/行标int count;/记录空格数-1Node* ptrr = NULL;while( i < size )ptrr = link.gethe

13、ad();int j = 0;/对每个单词从开始计数while( ( szFilei >= 'a' && szFilei <= 'z' ) | ( szFilei >= 'A' && szFilei <= 'Z' ) )+ i;+ j;while( ptrr != NULL )if( ptrr -> num = j )int n;for( n = 0; n <= j; + n )if( A_to_a( ptrr -> wordsn ) != A_to_a(

14、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;elsewhile( Temp -> next != NULL ) Temp = Temp -> next; Temp -> next = temp;/插入行数ptrr =

15、 ptrr -> next;if( szFilei = ' ' | szFilei = 'n' )count = -1;while( szFilei = ' ' ) + i; /设置列数 + row;/行的单词个数加 + count;/单词之间空格-1 row = row - count;if( szFilei = 'n' ) + col; /列遇到换行累加 + i;row = 0;/单词的行个数清零 else+ i;cout << endl;/*/Node* TLink:gethead()return head

16、;/*/void showwindow()Node* curptr = link.gethead();while( curptr != NULL )int word_num = 0;for( int k = 0; curptr -> wordsk != '0' + k )cout << curptr -> wordsk;cout << endl;if( curptr -> ptr = NULL )cout << "没有该词,或输入不正确!" << endl;elsewhile( curptr

17、-> ptr != NULL )cout << "("cout << curptr -> ptr -> col ;cout << ","cout << curptr -> ptr -> row ;cout << ")"cout << ' 'curptr -> ptr = curptr -> ptr -> next;word_num +;cout << endl;cout <<

18、"该单词共出现" << word_num << "次!" << endl; curptr = curptr -> next;/*/void show_text()ifstream fin;fin.open("D:english.txt");if (fin.fail()cout<<"Input file opening failed.n"exit(1);char next;fin.get(next);while (! fin.eof() szFilei = nex

19、t;+ i; fin.get(next);szFilei = '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() != NULL

20、 )link.TLink();cout << "请输入要统计的单词,单词之间用逗号隔开(输入键结束,本程序忽略空格):" << endl;cin >> 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( Ite

21、m );if( flag = 0 )break;cin >> in;if( link.gethead() = NULL )cout << "没有插入任何单词!" << endl;else link.calcute( szFile, i ); showwindow();cout << "是否继续?(Y/y or N/n):"cin >> ans;while( ( ans != 'n' ) && ( ans != 'N' ) );运行结果结果分析输入要

22、查找的单词之后,单词插入链表,停止输入后,程序开始在文本字符中查找链表中的单词。程序从文本数组顺次扫描,并在扫描到空格时记录一个单词的扫描结束,并记录单词所含字母个数,然后查找链表,如有和该单词字母个数相同的记录则进行比较,否则继续查找下一个直到链表尾。此后程序继续扫描文本字符数组的下一个单词并和链表中单词进行相同的比较过程,直到字符数组扫描完毕。要想在输出结果后继续,则选择Y或y继续,否则输入N或n退出。最后输出结果。本次运行中第一次操作输入is,are,这是正确的输入,则输出正确的结果;第二次选择y继续,输入the,这也是正确的输入,则输出正确结果;第三次选择y继续,输入microsoft

23、,22%,microsoft,一、三个输入正确,但是同样的输入,则按照程序设计,只输出一次结果,第二次输入错误,则程序报告输入有误。选择n,程序按预期结束。收获与体会通过本次的课程设计实验,是我对数据结构的设计编程有了更好的理解,进一步学习了把学到的知识运用到实际的一些问题解决中去。巩固了和提高了编程的能力,积累了一些编程技巧和经验。程序设计是选择一种好的结构,然后设计一个好的算法。数据结构设计的好坏会直接影响到程序算法设计的可实现性及难易程度。在课程设计的过程中使我更深刻认识到结构设计的重要性,有时在结构中加一个记录一个数字的变量也许会使程序代码更明朗和易于设计。程序设计是一项看似枯燥却会有

24、无穷乐趣的事情,我们在做编程设计时,需要极其的认真、求实、耐心和信心。一点的错误都不会使我们得到预期的结果,所以,我要继续认真学习和练习,多动手动脑,循序渐进的提高自己的程序设计能力。附:读入的文本:01 Microsoft Windows is a complex operating system. It offers02 so many featuresand does so much that it's impossible for 03 any one person to fully understandthe entire system. This 04 complexity

25、 also makes it difficult for someone to decide05 where to start concentrating the learning effort. Well, I 06 always like to start at the lowest level by gaining a solid 07 understanding of the system's basic building blocks. Once 08 you understand the basics, it's easy to incrementally 09 add any higher-level aspects of the system to your knowledge. 10 So this book focuses on Windows' basic building blocks and11 the fundamental concepts that you must know when architecting 12 and implementing software targeting the Windows operati

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论