数据结构课程设计-文本文件单词检索和计数
文本文件单词的检索与计数

软件综合课程设计文本文件单词的检索与计数实时监控报警系统二〇一四年六月文本文件单词的检索与计数1.问题陈述要求编程建立一个文本文件,每个单词不包含空格且不跨行,单词由字符序列构成且区分大小写;统计给定单词在文本文件中出现的总次数;检索输出某个单词出现在文本中的行号、在该行中出现的次数以及位置。
该设计要求可分为三个部分实现:其一,建立文本文件,文件名由用户用键盘输入;其二,给定单词的计数,输入一个不含空格的单词,统计输出该单词在文本中的出现次数;其三,检索给定单词,输入一个单词,检索并输出该单词所在的行号、该行中出现的次数以及在该行中的相应位置。
(1).建立文本文件(2)给定单词的计数(3)检索单词出现在文本文件中的行号、次数及其位置(4)主控菜单程序的结构①头文件包含②菜单选项包含建立文件、单词定位、单词计数、退出程序③选择1-4执行相应的操作,其他字符为非法。
2.程序代码#include<stdio.h>#include<string.h>#include<iostream>#define MaxStrSize 256 //根据用户需要自己定义大小using namespace std;typedef struct {char ch[MaxStrSize]; //ch是一个可容纳256个字符的字符数组int length;} SString;//定义顺序串类型int PartPosition (SString s1,SString s2,int k){ int i,j;i=k-1;//扫描s1的下标,因为c中数组下标是从0开始,串中序号相差1 j=0;//扫描s2的开始下标while(i<s1.length && j<s2.length){if(s1.ch[i]==s2.ch[j]){ i++;j++; //继续使下标移向下一个字符位置}else{i=i-j+1; j=0;} }if (j>=s2.length)return i-s2.length;elsereturn -1;//表示s1中不存在s2,返回-1//表示s1中存在s2,返回其起始位置} //函数结束void CreatTextFile(){SString S;char fname[10],yn;FILE *fp;printf("输入要建立的文件名:");scanf("%s",fname);fp=fopen(fname,"w");yn='n';//输入结束标志初值while(yn=='n'||yn=='N'){printf("请输入一行文本:");gets(S.ch);gets(S.ch);S.length=strlen(S.ch);fwrite(&S,S.length,1,fp);fprintf(fp,"%c",10);//是输入换行printf("结束输入吗?y or n :");yn=getchar();}fclose(fp);//关闭文件printf("建立文件结束!");}void SubStrCount(){FILE *fp;SString S,T;//定义两个串变量char fname[10];int i=0,j,k;printf("输入文本文件名:");scanf("%s",fname);fp=fopen(fname,"r");printf("输入要统计计数的单词:");cin>>T.ch;T.length=strlen(T.ch);while(!feof(fp)){ //扫描整个文本文件// fread(&S.ch,1,sizeof(S),fp);//读入一行文本 memset(S.ch,'\0',256);fgets(S.ch,100,fp);S.length=strlen(S.ch);k=0; //初始化开始检索位置while(k<S.length-1) //检索整个主串S{j=PartPosition(S,T,k);//调用串匹配函数if(j<0 ) break;else {i++;//单词计数器加1k=j+T.length;//继续下一字串的检索 }}}printf("\n单词%s在文本文件%s中共出现%d次\n",T.ch,fname,i);}//统计单词出现的个数void SubStrInd(){ FILE *fp;SString S,T; //定义两个串变量char fname[10];int i,j,k,l,m;int wz[20]; //存放一行中字串匹配的多个位置printf("输入文本文件名:");scanf("%s",fname);fp=fopen(fname,"r");printf("输入要检索的单词:");scanf("%s",T.ch);T.length=strlen(T.ch);l=0; //行计数器置0while(!feof(fp)) { //扫描整个文本文件//fread(&S,sizeof(S),1,fp); //读入一行文本memset(S.ch,'\0',256);fgets(S.ch,256,fp);S.length=strlen(S.ch);l++; //行计数器自增1k=0;//初始化开始检索位置i=0; //初始化单词计数器while(k<S.length-1) //检索整个主串S{ j=PartPosition(S,T,k); //调用串匹配函数if(j<0) break;else {i++;//单词计数器加1wz[i]=j;//记录匹配单词位置k=j+T.length;//继续下一字串检索}}if(i>0){ printf("行号:%d,次数:%d,位置分别为:",l,i);for(m=1;m<=i;m++) printf("%4d",wz[m]+1);printf("\n");}}}//检索单词出现在文本文件中的行号、次数及其位置int main(){ void CreatTextFile(),SubStrCount(),SubStrInd();int xz;do {printf("* * * * * * * * * * * * * * * * * * * ** * * * *\n");printf("*文本文件的检索、字串的统计及定位*\n");printf("* * * * * * * * * * * * * * * * * * * ** * * * *\n");printf("* 1. 建立文本文件*\n");printf("* 2. 单词字串的计数*\n");printf("* 3. 单词字串的定位*\n");printf("* 4. 退出整个程序*\n");printf("* * * * * * * * * * * * * * * * * * * ** * * * *\n");printf(" 请选择(1--4) ");scanf("%d",&xz);switch(xz) {case 1 : CreatTextFile();break;case 2 : SubStrCount();break;case 3 : SubStrInd();break;case 4 : return 0;default:printf("选择错误,重新选\n");}}while(1);}3.运行结果4.设计体会与总结我的课程设计题目是文本文件单词的检索与计数。
数据结构课程设计_中文文本编辑(文本删除、修改、查询、统计、添加)

数据结构课程设计:文本编辑(最后附完整代码)一.问题描述---------------------------------------------1二.设计思路---------------------------------------------1三.系统实现功能1.建立单链表-------------------------------------------22.显示文章内容---------------------------------------- 33.查找文章语句-----------------------------------------34.删除文章语句-----------------------------------------55.替换文章语句-----------------------------------------76.统计文章字数-----------------------------------------107.写入文本结束程序--------------------------------------10四.系统不足及需改进分------------------------------------11五.文件清单说明------------------------------------------11六:附录-------------------------------------------------12一:问题描述本次我所做的课程设计为:文本编辑,主要内容是对中文文本的显示、查找、删除、替换、统计、写入文本。
在程序选择功能后根据提示,输入任意长度中文语句即可对文章进行操作。
二:设计思路文本编辑,顾名思义就是对一遍文章进行编辑,我所设计的是对中文的编辑。
中文有两个字节(汉字、标点),通常情况下通过文件输入流仅仅可以取一个字节或者是以空格为分隔符取单词这仅仅对英文的文章适用,周六周日我从网上搜索相关方法,未找到一条切实可用的对中文字符操作的方法。
数据结构课程设计报告(简易英汉词典系统)

数据结构课程设计报告(简易英汉词典系统)广西大学课程设计报告课程:《数据结构》题目:简易英汉词典系统学院:______计算机与电子信息学院_专业:______计网类___________班级:______计网071_____ ___ _学号: 0707100103学生姓名:蓝冠恒指导教师:__ ________二〇〇九年四月一、实验目的和要求【实验目的】设计一个简易英汉词典系统,实现基本的单词检索功能,即输入英文单词则系统输出其汉语,反之亦然;并能够进行基本的词典维护操作,包括插入和删除,要求按英语的词典顺序排列单词。
【设计要求】(1)使用图形化界面。
(2)建立英语词汇表,输入为小写字母时为合法输入。
(3)每个词条应包含单词的英语形式、汉语释义、发音等基本信息。
二、设计概要:1、根据实验要求,与及所了解的数据类型相关知识,定义了如下数据类型:链接数据库声明的变量:Connection connection = null;Statement statement = null;ResultSet Result = null;声明全局变量:String newWord, pronunciations, indexWord="", deleteWord, searchEnglish, searchChinese,isSound;它们分别是:新增单词、新单词音标、引擎词、删除词、查找的英文、查找的汉语、判断音频是否存在。
2、实验功能所定义的各种按钮、文本框、选择框和列表框:取消删除功能按钮:JButton deleteCancelButton = new JButton();英汉互译面板上的发音按钮:JButton sound = new JButton();浏览词库面板上的发音按钮:JButton scanSoundButton = new JButton();添加单词的按钮:JButton addOkJButton = new JButton();取消添加功能的按钮:JButton addCancelButton = new JButton();删除词库单词信息按钮:JButton deleteOkButton = new JButton();浏览词库按钮:JButton scanButton = new JButton();要查找的英文或汉语的文本框输入框:JTextField inputSearchWord = new JTextField();新增单词文本输入框:JTextField inputNewWord = new JTextField();新增单词音标输入框:JTextField pronunciation = new JTextField();新增单词释义输入框:JTextField newWordChinese = new JTextField();新增单词过去式输入框:JTextField newWordPreterite = new JTextField();新增单词现在进行时态输入框:JTextField newWordModernism = new JTextField();要删除的单词输入框:JTextField inputDeleteWord = new JTextField();新增单词词性复选框:JComboBox newWordClass = new JComboBox();列出要查找的词的记录信息的多行文本框:TextArea outputSearchEnglish = new TextArea();列出要删除的单词的记录信息的多行文本框:TextArea deleteWordChinese = new TextArea();列出浏览时需浏览单词信息的多行文本框:TextArea scanOutput = new TextArea();DefaultListModel model = new DefaultListModel();列出所查找的英文或汉语对应的单词的列表框:JList listSearchEnglish = new JList(model);列出备选英标的列表框:JList pronunciationJList = new JList(listItem);列出可能且可以被删除的单词的列表框:JList deleteJList = new JList(model);列出词库所有单词的列表框:JList scanWordJList = new JList(model);3、实现功能所定义的各种函数:1)public static String Return(String str)将数据库里的单词的音标进行还原。
单词的检索与计数教材

内江师范学院计算机科学学院数据结构课程设计报告课题名称:文本文件单词的检索与计数姓名:学号:专业班级:软件工程系(院):计算机科学学院设计时间:20XX 年X 月X日设计地点:成绩:1.课程设计目的(1).训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。
(2).初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;(3).提高综合运用所学的理论知识和方法独立分析和解决问题的能力;(4).训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。
2.课程设计任务与要求:文本文件单词的检索与计数软件任务:编写一个文本文件单词的检索与计数软件, 程序设计要求:1)建立文本文件,文件名由用户键盘输入2)给定单词的计数,输入一个不含空格的单词,统计输出该单词在文本中的出现次数要求:(1)、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。
前期准备工作完备与否直接影响到后序上机调试工作的效率。
在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。
(2)、设计的题目要求达到一定工作量(300行以上代码),并具有一定的深度和难度。
(3)、程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;(4)、每位同学需提交可独立运行的程序;(5)、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实,不少于8页(代码不算);(6)、课程设计实践作为培养学生动手能力的一种手段,单独考核。
3.课程设计说明书一需求分析3.1 串模式匹配算法的设计要求在串的基本操作中,在主串中查找模式串的模式匹配算法——即求子串位置的函数Index(S,T),是文本处理中最常用、最重要的操作之一。
字符串操作(算法与数据结构课程设计)

字符串操作一、问题描述字符串是一种常见的数据类型,在现实生活中有着广泛的应用。
本次课程设计需要选择合适的结构完成字符串的建立,实现串的基本操作,编写三种模式匹配算法和字符串的加密与解密算法,并利用它们实现字符串的应用:包括文本文件对单词的检索和计数。
二、基本要求程序要求选择合适的存储结构,并实现以下功能:1.完成串的基本操作,如:串的赋值,比较,连接,插入,删除;2.实现串的模式匹配,包括:穷举法,BF算法和KMP算法;3.字符串的应用:字符串的加密与解密;文本文件单词的计数;文本文件单词的检索;三、测试数据1.对模式匹配(穷举法,KMP算法和BF算法)的测试:如:在“asd sfhasd asd”中找从第3个下标开始匹配的模式串“asd”。
2.对加密与解密的测试:如:对串“afhbs 537hsj/sjdh”加密,再将加密后的串还原。
3.对文本文件单词的计数和检索的测试:如创建一个文本文件,在其中对单词“me”进行计数并且检索其所处行、列。
四、算法思想1、用结构体SString记录字符串信息,其中ch代表字符串,length代表字符串长度。
2、模式匹配:1)穷举法的Index(S,T,pos):从位置开始通过SubString截取S中T长度的字符串,并与T通过StrCompare进行比较,若找到则返回位置;否则继续。
若没找到,返回-1。
2)BF算法: IndexBF(S, T,pos)主串S从pos位置开始,模式串T从0位置开始,从目标串s=“s0s2…sn-1"的第一个字符开始和模式串t=“t0t2…tm-1"中的第一个字符比较,若相等,则继续逐个比较后续字符;否则从目标串s的第二个字符开始重新与模式串t的第一个字符进行比较。
依次类推,若从模式串s的i位置字符开始,每个字符依次和目标串t中的对应字符相等,则匹配成功,该算法返回i;否则,匹配失败,函数返回-1。
3)KMP算法:该算法较BF算法有较大改进,主要是消除了主串指针的回溯,从而使算法效率有了某种程度的提高。
文本文件单词的检索与计数课程设计实验报告

文件检索1需求分析1.1 建立文本文件建立文本文件的实现思路(1)定义一个串变量(2)定义文本文件(3)输入文件名,打开该文件(4)循环读入文本行,写入文本文件,其过程如下:While(不是文件输入结束){读入一文本行至串变量;串变量写入文件;输入是否结束输入标志;}(5)关闭文件1.2给定单词的计数该功能需要用到前一节中设计的模式匹配算法,逐行扫描文本文件。
匹配一个,计数器加1,直到整个文件扫描结束;然后输出单词的次数。
1.3 检索单词出现在文本文件中的行号、次数及其位置1.4 主控菜单程序的结构(1)头文件包含(2)菜单选择包括:1、建立文件2、单词计数3、单词定位4、退出程序(3)选择1~4执行相应的操作,其他字符为非法2.概要设计2.流程图2.1建立文本文件定义一个串变量,定义文本文件,输入文件名,打开该文件,循环读入文本行,写入文本文件,关闭文件。
建立文本文件的思路过程2.2给定单词的计数逐行扫描文本文件。
匹配一个,计数器加1,直到整个文件扫描结束;然后输出单词的次数。
给定单词计数的过程2.3检索单词出现在文本文件中的行号、次数及其位置逐行扫描文本文件。
扫描一个单词,单词数加1,匹配一个,计数器加1,输出该单词数,行数到底以此,行数加1,单词数清零,直到整个文件扫描结束;然后输出单词的次数,行号,第几个单词。
检索单词的出现在文本文件中的行号,次数以及位置3详细设计主代码#include<stdio.h>#include<string.h>#define MaxStrSize 256 //根据用户需要自己定义大小typedef struct{char ch[MaxStrSize]; //ch是一个可容纳256个字符的字符数组int length;}SString; //定义顺序串类型int PartPosition(SString s1, SString s2, int k){int i, j;i=k-1; //扫描s1的下标,因为c中数组下标是从0开始,串中序号相差1 j=0; //扫描s2的开始下标while (i<s1.length&&j<s2.length){if(s1.ch[i]==s2.ch[j]){i++;j++; //继续使下标移向下一个字符位置}else{i=i-j+1;j=0;}}if(j>=s2.length)return i-s2.length;elsereturn -1; //表示s1中不存在s2,返回-1//表示s1中不存在s2,返回其起始位置} //函数结束void CreatTextFile(){SString S;char fname[10], yn;FILE *fp;printf("输入要建立的文件名:");scanf("%s", fname);fp=fopen(fname,"w");yn='n'; //输入结束标志初值while(yn=='n'||yn=='N'){printf("请输入一行文本:");gets(S.ch);gets(S.ch);S.length=strlen(S.ch);fwrite(&S, S.length, 1, fp);fprintf(fp,"%c", 10); //是输入换行printf("结束输入吗?y or n: ");yn=getchar();}fclose(fp); //关闭文件printf("建立文件结束!");}void SubStrCount(){FILE *fp;SString S,T; //定义两个串变量char fname[10];int i=0,j,k;printf("输入文本文件名:");scanf("%s", fname);fp=fopen(fname ,"r");printf("输入要统计技术的单词:");scanf("%s", T.ch);T.length=strlen(T.ch);while(!feof(fp)){ //扫描整个文件文本//fread(&S.ch,1,sizeof(S),fp); //读入一行文本memset(S.ch,'\0', 256);fgets(S.ch,100,fp);S.length=strlen(S.ch);k=0; //初始化开始检索位置while(k<S.length-1) //检索整个主串S{j=PartPosition(S,T,k);if(j<0)break;else{i++; //单词计数器加1k=j+T.length; //继续下一字串的检索}}}printf("\n单词%s在文本文件%s中共出现%d次\n", T.ch, fname,i);} //统计单词出现个数void SubStrInd(){FILE *fp;SString S,T; //定义两个串变量char fname[10];int i,j,k,l,m;int wz[20];printf("输入文本文件名:");scanf("%s", fname);fp=fopen(fname,"r");printf("输入要检索的单词:");scanf("%s", T.ch);T.length=strlen(T.ch);l=0;while(!feof(fp)){//fread(&S, sizeof(S), 1, fp);//读入一行文本memset(S.ch,'\0', 256);fgets(S.ch,256,fp);S.length=strlen(S.ch);l++;k=0;i=0;while(k<S.length-1){j=PartPosition(S,T,k);if(j<0)break;else{i++;wz[i]=j;k=j+T.length;}}if(i>0){printf("行号:%d , 次数:%d, 位置分别为:",l, i);for(m=1;m<=i;m++)printf("%4d", wz[m]+1);printf("\n");}}}int main(){void CreatTextFlie(), SubStrInd();int xz;do{printf("****************************************\n");printf("*文本文件的检索、字符串的统计及定位*****\n");printf("****************************************\n");printf("* 1.建立文本文件*\n");printf("* 2.单词字符串的计数*\n");printf("* 3.单词字符串的定位*\n");printf("* 4.退出程序*\n");printf("****************************************\n");printf(" 请选择(1——4)\n");scanf("%d", &xz);switch(xz){case 1:CreatTextFile(); break;case 2:SubStrCount(); break;case 3:SubStrInd(); break;case 4:return 0;default: printf("选择错误,重新选\n");}}while(1);}4调试分析4.1未输入文件前的页面4.2输入文本文件,计数单词出现的次数4.3检索某单词的行号,出现次数,以及位置5课程总结经过一周的奋斗,这次数据结构的课程设计终于做完了。
《数据结构与算法课程设计》-实验教学大纲

《数据结构与算法课程设计》课程教学大纲一、课程基本信息课程代码:19110132课程名称:数据结构与算法课程设计英文名称:Course design of data structure and algorithm课程类别:专业课学时:32学分:2适用对象: 计算机科学与技术专业考核方式:考查先修课程:C语言程序设计二、课程简介中文简介:数据结构与算法等相关课程对理论和实践兼有要求,其中对算法设计和程序编写的掌握尤为重要。
学生虽可以通过与课堂教学同步的上机实验完成相关内容的练习,但却往往局限于一些功能简单、彼此之间关系独立的算法和程序。
数据结构与算法课程设计更签掉综合训练,致力于培养学生严谨、灵活的算法设计思想和较高的编程能力,为今后从事计算机开发与应用打下基础。
通过对本课程的学习,培养学生进一步理解和掌握所学的各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序设计中的使用方法,使学生具备初步的独立分析和设计能力;初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;提高综合运用所学的理论知识和方法独立分析和解决问题的能力;训练用系统的观点进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
本课程的先修课程C语言程序设计,数据结构等。
另外,在课程讲授过程中会涉及一些重要算法发展的历史介绍,以此激发培养学生学习研究算法的兴趣和钻研精神。
英文简介:Data structure and algorithm and other related courses require both theory and practice, in which the mastery of algorithm design and programming is particularly important. Although students can complete the exercises of related content through computer experiments synchronized with classroom teaching, they are often limited to some algorithms and programs with simple functions and independent relationships. Thecourse design of data structure and algorithm has signed off comprehensive training, and is committed to cultivating students' rigorous and flexible algorithm design ideas and higher programming ability, so as to lay a foundation for future computer development and application.Through the study of this course, students will be trained to further understand and master the logical structure, storage structure and operation algorithm of various basic abstract data types, as well as their application methods in program design, so as to enable students to have the ability of preliminary independent analysis and design, and preliminarily master the problem analysis, system design, program coding, testing, etc. in the process of software development In order to improve the ability of analyzing and solving problems independently by using the theoretical knowledge and methods we have learned, we should train software developers to develop software from a systematic point of view and cultivate the scientific working methods and style that software workers should have.The prerequisite courses of this course are C language programming, data structure, etc.In addition, the history of some important algorithms will be introduced in the course of teaching, so as to stimulate students' interest and research spirit in learning and researching algorithms.三、课程性质与教学目的本课程通过一些小型软件项目实践来训练和提升学生对一些基本的数据结构和算法的认识,切实提高学生的算法和程序设计能力。
数据结构课程设计文学研究助手

一、问题描述:文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。
试写一个实现这一目标的文字统计系统,称为“文学研究助手”。
英文小说存于一个文本文件中。
待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。
程序的输出结果是每个词的出现次数和出现位置所在行的行号,格式自行设计。
二、需求分析:1、文本串非空且以文件形式存放,统计匹配的词集非空。
文件名和词集均由用户从键盘输入;2、“单词”定义:由字母构成的字符序列,中间不含空格字符且区分大小写;3、待统计的“单词”在文本串中不跨行出现,它或者从行首开始,或者前置若干空格字符;4、在计算机终端输出的结果是:单词,出现的次数,出现的位置所在行的行号,同一行出现两次的只输出一个行号;5、测试数据:文本文件为本次实习中的word.txt:待统计的词集:he she it has to here can not is was三、概要设计:拟采用对两个有序表进行相互比较的策略进行“单词匹配”。
程序中将涉及下列三个抽象数据类型:1. 定义“单词”类型:ADT Aword{数据对象:D={Si | Si ∈标准c字符串集合,i = 1,2,3,…….,n,n ≥0}数据关系:R1={<Si-1,Si>} | Si-1,Si ∈D,i = 1,2,3,…..,n}基本操作:NewWord(WordType *nw,Sequence cha)初始条件:cha为字符序列;操作结果:生成一个其值为给定字符序列的单词;WordCmp(WordType wd1,WordType wd2)初始条件:单词wd1和单词wd2已存在;操作结果:若wd1<wd2,则返回-1;若wd1=wd2,则返回0;若wd1>wd2,则返回1;PrintWord(WordType wd)初始条件:单词wd已存在;操作结果:在计算机终端上显示单词wd;}ADT AWord2. 定义有序表类型:ADT OrderList{数据对象:D={Si | Si ∈AWord,i = 1,2,3,…….,n,n ≥0}数据关系:R1={<Si-1,Si>} | Si-1,Si ∈D,Si-1<S,i = 1,2,3,…..,n}基本操作:InitList(OrderList *L)操作结果:构造一个空的有序表;DestroyList(OrderList *L)初始条件:有序表L已存在;操作结果:销毁L的结构,并释放所占空间;LocateElem(OrderList L,ElemType e,LinkType *q)初始条件:有序表L已存在;操作结果:若有序表L中存在元素e,则q指示L中第一个值为e的元素的位置,并返回函数值FRUE;否则q指示第一个大于e的元素的前驱的位置,并返回函数值FALSE;InsertAfter(OrderList *L,LinkType q,LinkType s)初始条件:有序表L已存在,q指示L中一个元素;操作结果:在有序表L中q指示的元素之后插入元素s;ListCompare(OrderList La,OrderList Lb,EqelemList *s)初始条件:有序表La和Lb已存在;操作结果:以s返回其中相同元素;}ADT OrderList3. 定义单词文本串文件类型如下:ADT TextString{数据对象:D={Si | Si ∈标准c字符集,i = 1,2,3,…….,n,n ≥0};数据关系:D中字符被“换行符”分割成若干行,每一行的字符间满足下列关系:R1={<Si-1,Si>} | Si-1,Si ∈D,i = 1,2,3,…..,n}基本操作:Initialization(FILE **fr)初始条件:文件fr已存在;操作结果:打开文件fr,设定文件指针指向文件中第一行第一个字符;GetAWord(FILE *f,Sequence *st)初始条件:文件f已打开;操作结果:从文件指针所指字符起提取一个“单词st”;ExtractWord(FILE *f,OrderList *ta)初始条件:文件f已打开,文件指针指向文件f中某一行的第一个字符;操作结果:提取该行中所有单词,并构成单词的有序表ta,本操作结束时,文件指针指向文件f中下一行的第一个字符;match(FILE *f,OrderList pat,ResultType rs)初始条件:文件f已打开,文件指针指向文件f中第一个字符;pat为包含所有待查询单词的有序表;操作结果:rs为查询结果;}ADT TextString4. 本程序包含四个模块:1)主程序模块:主函数设计如下int main ( ) {输入信息和文件初始化;生成测试目标词汇表;统计文件中每个待测单词出现的次数和位置;输出测试结果;};2)单词单元模块-------实现单词类型;3)有序表单元模块--------实现有序表类型;4)单词文本串文件单元模块------实现文本串文件类型;四、详细设计1、主程序中的宏定义:#define MAXSIZE 1000 //字符空间的最大容量#define MAXLEN 20 //单词的最大长度#define MAXNUM 16 //一行中单词最多个数#define FALSE 0#define TRUE 12、存储结构/*** 堆结构的定义*/typedef struct{char stores[MAXSIZE];int freep; /*当前可用空间开始位置*/}HeapSpace;HeapSpace sp;/*** 单词数据类型定义*/typedef struct{ //单词在堆中的位置描述int stadr; /*单词在对空间中的开始位置*/int len; /*单词长度*/}WordType;typedef struct{ //单词描述char ch[MAXLEN]; /*单词字符串*/int size; /*单词长度*/}Sequence;/*** 有序表类型定义*/typedef WordType ElemType;typedef struct NodeType{ //单词有序表结点定义ElemType data;struct NodeType *next;}NodeType,*LinkType;typedef struct{ //单词有序表定义LinkType head; /*有序表头指针*/LinkType tail; /*有序表尾指针*/int size; /*有序表结点个数*/}OrderList;* 记录一行中匹配成功单词在目标词汇表中的位置*/typedef struct{int eqelem[MAXNUM]; /*单词在目标词汇表中的位置*/int last; /*匹配成功单词的个数*/}EqelemList;/*** 文件测试相关的数据类型定义*/typedef struct Node{ //单词在文件中的位置int elem; /*被测单词在文件中的行号*/struct Node *next;/*指向下一个行号结点的指针*/}Node,*Link;typedef struct{ //单词统计分析记录结构定义WordType data; /*被测试的单词*/int count; /*在文件中出现的次数*/Link Next; /*记录出现的所有行号的脸表头指针*/}HeadNode;/*** 文本文件测试结果记录定义*/typedef HeadNode ResultType[MAXNUM];typedef int status;3、主要算法设计:/*---------------------与单词相关的函数---------------------*//*------------------------------------------------------------------*//* 定义新单词函数*//* 功能:把新单词放入堆中*//* 参数:WordType *nw--单词描述信息指针*//* Sequence cha--单词信息*//* 返回值:操作成功与否的状态信息*//* 0--操作失败,空间不足;1--操作成功*//*--------------------------------------------------------------*/status NewWord(WordType *nw,Sequence cha){int i,k;if(sp.freep+cha.size>=MAXSIZE){printf("Heap Full!\n");getchar();return 0;else{i=sp.freep;sp.freep=sp.freep+cha.size;for(k=0;k<cha.size;k++) sp.stores[i+k]=cha.ch[k];nw->stadr=i;nw->len=cha.size;return 1;}}/*------------------------------回到最初空间-------------------*/ void NewLength(OrderList rs){int m=0;LinkType p,q;p=rs.head->next;while(p){if(m<=p->data.stadr){m=p->data.stadr;q=p;}p=p->next;}sp.freep=m+q->data.len;}/*------------------------------------------------------------------*//* 复制单词信息函数*//* 功能:把一个单词信息复制到另一个变量中*//* 参数:WordType *nw--新单词描述信息指针*//* WordType *oldw--旧单词描述信息指针*//* 返回值:无*//*----------------------------------------------------------------*/ void CopyWord(WordType *nw,WordType oldw){nw->stadr=oldw.stadr;nw->len=oldw.len;}/*------------------------------------------------------------------*//* 单词比较函数*//* 功能:比较堆中两单词的大小*//* 参数:WordType wd1--第一个单词描述信息*//* WordType wd2--第二个单词描述信息*//* 返回值:-1--小于;0--等于;1--大于*//*--------------------------------------------------------------*/int WordCmp(WordType wd1,WordType wd2){int k,si,sj,m;si=wd1.stadr;sj=wd2.stadr;for(k=0;k<=wd1.len&&k<=wd2.len;k++){m=fabs((float)(sp.stores[si+k]-sp.stores[sj+k]));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;elseif(sp.stores[si+k]>sp.stores[sj+k])return 1;else return -1;}else if(wd1.len<wd2.len){if(k==wd1.len)return -1;elseif(sp.stores[si+k]>sp.stores[sj+k])return 1;else return -1;}else{if(k==wd2.len)return 1;elseif(sp.stores[si+k]>sp.stores[sj+k])return 1;else return -1;}}/*------------------------------------------------------------------*/ /* 打印单词函数*/ /* 功能:打印堆中一个单词*/ /* 参数:WordType wd--单词描述信息*/ /* 返回值:无*/ /*------------------------------------------------------------------*/ void PrintWord(WordType wd){int i;for(i=0;i<wd.len;i++) putchar(sp.stores[wd.stadr+i]);}/*-------------------与有序表相关的函数----------------------*//*-------------------------------------------------------------------*//* 结点生成函数*//* 功能:生成一个单词在堆中存储信息的结点*//* 参数:LinkType *p--生成的新结点指针*//* ElemType e--单词存储信息*//* 返回值:TRUE--成功;FALSE--失败*//*-----------------------------------------------------------------*/ status MakeNode(LinkType *p,ElemType e){*p=(LinkType)malloc(sizeof(NodeType));if(!(*p)) return FALSE;(*p)->data.stadr=e.stadr;(*p)->data.len=e.len;(*p)->next=NULL;return TRUE;}/*------------------------------------------------------------------------*/ /* 有序表初始化函数*/ /* 功能:申请头结点,初始化有序表*/ /* 参数:OrderList *L--有序表指针*/ /* 返回值:TRUE--初始化成功;FALSE--初始化失败*/ /*------------------------------------------------------------------------*/ status InitList(OrderList *L){ElemType wd;wd.len=0;if(MakeNode(&(L->head),wd)){L->tail=L->head;L->head->next=NULL;L->size=0;return TRUE;}else{L->head=NULL;return FALSE;}}/*------------------------------------------------------------------*//* 撤销有序表函数*//* 功能:释放有序表所有结点,撤销有序表*//* 参数:OrderList *L--有序表指针*//* 返回值:无*//*------------------------------------------------------------------*/ void DestroyList(OrderList *L){LinkType p,q;p=L->head;while(p){q=p;p=p->next;free(q);}L->head=L->tail=NULL;}/*-------------------------------------------------------------------*/ /* 有序表查找函数*//* 功能:确定给定单词e在有序表中的位置*//* 参数:OrderList L--有序表*//* ElemType e--给定要查找的数据e *//* LinkType *q--有序表结点指针*//* 查找成功,q指向具有e值的结点*//* 查找失败,q指向小于e的结点*//* 返回值:int型,1--查找成功;0--查找失败*//*-----------------------------------------------------------------*/ status LocateElem(OrderList L,ElemType e,LinkType *q) {LinkType pre,p;p=L.head->next;while(p){if(WordCmp(p->data,e)==0){*q=p;return TRUE;}if(WordCmp(p->data,e)==-1)*q=p;p=p->next;}return FALSE;}/*------------------------------------------------------------------*//* 有序表插入函数*//* 功能:在制定结点q后插入一个结点s *//* 参数:OrderList *L--有序表指针*//* LinkType q--指定结点指针*//* LinkType s--待查入结点指针*//* 返回值:无*//*---------------------------------------------------------------*/void InsertAfter(OrderList *L,LinkType q,LinkType s){if(L->head&&q&&s){s->next=q->next;q->next=s;if(L->tail==q) L->tail=s;L->size++;}}/*------------------------------------------------------------------------*/ /* 表匹配函数*/ /* 功能:把Lb表中匹配La表成功的元素放入s表*/ /* 参数:OrderList La--存放统计单词的有序表*/ /* OrderList Lb--存放待匹配单词的有序表*/ /* EqelemList *s--存放匹配成功单词信息表指针*/ /* 返回值:无*/ /*-------------------------------------------------------------------------*/ void ListCompare(OrderList La,OrderList Lb,EqelemList *s) {int pos,n;LinkType pa,pb;if(La.head&&Lb.head){pa=La.head->next;pb=Lb.head->next;s->last=pos=0;while(pa&&pb){n=WordCmp(pa->data,pb->data);if(n==0){s->eqelem[s->last++]=pos++;pa=pa->next;pb=pb->next;}else if(n==-1){pa=pa->next;pos++;}else pb=pb->next;}}}/*--------------------------------------------------------*//* 判表空函数*//* 功能:判断表L是否是空表*//* 参数:OrderList L--有序表*//* 返回值:0--非空表;1--空表*//*--------------------------------------------------------*/ status ListEmpty(OrderList * L){if(L->size==0) return TRUE;return FALSE;}int ListLength(OrderList* L){ /*返回判表长度*/ if(L->head ==L->tail) return 0;else return L->size ;}/*-----------与文本文件有关的函数-----------------------*/ /*---------------------------------------------------------------*/ /* 字符判断函数*/ /* 功能:判断文件中下一个字符是否为回车符*/ /* 参数:FILE *f--文件指针*/ /* 返回值:0--不是回车符;1--是回车符*/ /*---------------------------------------------------------------*/ int feoln(FILE *f){char cha;cha=fgetc(f);if(cha=='\n') return(TRUE);ungetc(cha,f);return FALSE;}/*---------------------------------------------------------------*/ /* 读取单词函数*/ /* 功能:从文件中读取一个单词*/ /* 参数:FILE *f--文件指针*/ /* Sequence *st--指向单词的指针*/ /* 返回值:无*/ /*----------------------------------------------------------------*/ void GetAWord(FILE *f,Sequence *st)char ch;int k=0;ch=fgetc(f);while(ch==' '){ch=fgetc(f);if(ch=='\n')break;}/*去掉空格和回车*/if(ch=='\n'){ungetc(ch,f);ch=' ';}/*最后一个为回车键,文件指针回指*/while(((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9'))&&!feof(f)) {st->ch[k]=ch;ch=fgetc(f);k++;}if(ch=='\n')ungetc(ch,f);st->size=k;}/*----------------------------------------------------------------*//* 读取文件当前行单词函数*//* 功能:提取文件指针所指行所有单词*//* 参数:FILE *f--文件指针*//* OrderList *ta--存放单词有序表的指针*//* 返回值:0--操作失败;1--操作成功*//*----------------------------------------------------------------*/status ExtractWord(FILE *f,OrderList *ta){int i;char lendc;Sequence str;WordType nwd;LinkType p,q;LinkType s;InitList(ta);p=ta->head;q=ta->head;for(i=0;!feof(f);i++){if(feoln(f))return(TRUE);GetAWord(f,&str);/*从文件中读出一个单词*/NewWord(&nwd,str);/*将单词放入堆存储空间*/MakeNode(&s,nwd);/*生成一个单词节点*/if(ta->head->next){while(p!=NULL&&WordCmp(p->data,s->data)==-1){q=p;p=p->next;}p=q;}InsertAfter(ta,p,s);p=ta->head->next;q=ta->head;}/*------------------------------------------------------------------*//* 文件单词匹配函数*//* 功能:统计指定单词在文件中出现的次数和位置*//* 参数:FILE *f--文件指针*//* OrderList pat--指定统计的单词有序表*//* ResultType rs--统计结果列表*//* 返回值:0--统计失败;1--统计成功*//*------------------------------------------------------------------*/status match(FILE *f,OrderList pat,ResultType rs){int i,k,linenum,failed,fsp;OrderList sa;EqelemList eqlist;Link p,q;if(!pat.head)return FALSE;linenum=1;while(!feof(f)){ExtractWord(f,&sa);ListCompare(pat,sa,&eqlist);i=0;if(st)while(i<st)/*计算出单词出现行号以及一行出现次数*/{p=(Link)malloc(sizeof(Node));p->next=rs[eqlist.eqelem[i]].Next;rs[eqlist.eqelem[i]].Next=p;p->elem=linenum;rs[eqlist.eqelem[i]].count++;i++;}/*内层while*/linenum++;/*行数加1*/DestroyList(&sa);NewLength(pat);}/*外层while*/fclose(f);return TRUE;}/*-------------------------------------------------------------------*//* 初始化文件函数*//* 功能:输入指定的文件名并打开文件*//* 参数:FILE **f--返回的文件指针*//* 返回值:0--初始化失败;1--初始化成功*/ /*---------------------------------------------------------------*/ status Initialization(FILE **fr){char FileName[30];printf("Input file name:");do{scanf("%s",FileName);}while(strlen(FileName)==0);*fr=fopen(FileName,"r");if(*fr){printf("file open!\n");return TRUE;}else{printf("file not open!\n");return FALSE;}}/*------------------------------------------------------------------*/ /* 输入统计的词集函数*/ /* 功能:输入待统计的词集并建立起数据结构*/ /* 参数:OrderList *pt--返回的词集有序表指针*/ /* 返回值:无*/ /*------------------------------------------------------------------*/ void InputWord(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);if(pt->head->next){while(p!=NULL&&WordCmp(p->data,s->data)==-1){q=p;p=p->next;}p=q;}InsertAfter(pt,p,s);p=pt->head->next;q=pt->head;i=0;}if(cc=='\n')return;}}/*------------------------------------------------------------------*//* 初始化统计结果表函数*//* 功能:用待统计词集初始化统计结果表*//* 参数:ResultType rs--统计结果数组*//* OrderList pt--待统计的词集表*//* 返回值:无*//*-----------------------------------------------------------------*/void InitRList(ResultType rs,OrderList pat){int k;LinkType p;p=pat.head->next;for(k=0;k<pat.size;k++){CopyWord(&rs[k].data,p->data);rs[k].Next=NULL;rs[k].count=0;p=p->next;}}/*------------------------------------------------------------------*//* 输出统计结果函数*//* 功能:输出统计的结果*//* 参数:ResultType rs--统计结果数组*//* int n--待统计的词集个数*//* 返回值:无*//*-------------------------------------------------------------------*/void OutResult(ResultType rslist,int n){int i,j;Link p;for(i=0;i<n;i++){printf("The word ");PrintWord(rslist[i].data);printf(" appeared in the file %d times",rslist[i].count);if(rslist[i].count!=0){printf(" and on ");p=rslist[i].Next;for(j=0;j<rslist[i].count;j++)if(j<rslist[i].count-1){printf("%d,",p->elem);p=p->next;}else printf("%d\n",p->elem);}else printf("\n");}}/*------------------------------------------------------------------*//* 撤销统计结果数据空间函数*//* 功能:释放存放统计结果数据的动态存储空间*//* 参数:ResultType rs--统计结果数组*//* 返回值:无*//*------------------------------------------------------------------*/ void FreeResult(ResultType rs,int n){int i;Link p,q;for(i=0;i<n;i++)if(rs[i].Next!=NULL)break;if(rs[i].Next!=NULL)for(i=0;i<n;i++){p=rs[i].Next;while(p){q=p;p=p->next;free(q);}rs[i].Next=NULL;rs[i].count=0;}else return;}int main(){int flag=0;sp.freep=0; /*sp为全局变量*/FILE *fp=NULL;OrderList *pt;pt=(OrderList *)malloc(sizeof(OrderList));pt->head=NULL;ResultType rs;do{Initialization(&fp); /*输入文件名并打开文件*/printf("input search words\n");getchar();InputWord(pt); /*输入查询的单词*/if(fp&&!ListEmpty(pt)){InitRList(rs,*pt);if(match(fp,*pt,rs))OutResult(rs,ListLength(pt));elseDestroyList(pt);}printf("Do you want to have a seach again?(YES--1/NO--0)\n");scanf("%d",&flag);fflush(stdin);}while(flag);system("pause");return 0;}五、调试分析:1、在编程的过程中,对设计做了如下修改:1)考虑到堆空间可能设置不够大,以至可能引起数组出界的错误,因此将NewWord 改为status类型函数,返回堆空间分配成功与否的信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
合肥学院计算机科学与技术系课程设计报告2017~2018学年第二学期课程数据结构与算法课程设计名称文本文件单词的检索与计数学生姓名陈映而学号**********专业班级16软件工程(1)班指导教师孙斐文本文件单词的检索与计数一、问题分析和任务定义要求编程建立一个文本文件,每个单词不包含空格且不跨行,单词由字符序列构成且区分大小写;统计给定单词在文本文件中出现的总次数;检索输出某个单词出现在文本中的行号、在该行中出现的次数以及位置。
(1)建立文本文件(2)给定单词的计数(3)检索单词出现在文本文件中的行号、次数及其位置(4)主控菜单程序的结构二、数据结构的选择和概要设计数据结构:1.所有存储形式都用顺序存储2.用矩阵检索单词出现的位置和次数概要设计:该设计要求可分为三个部分实现:1.对文件的操作,其中包括文本文档的建立,文件名由用户用键盘输入;以及读取文本文档内容并显示在屏幕上;2.给定单词的计数,输入一个不含空格的单词,统计输出该单词在文本中的出现次数;3.检索给定单词,输入一个单词,检索并输出该单词所在的行号、该行中出现的次数以及在该行中的相应位置。
图2-1 课题目录图2-2 流程图图2-3 函数关系开始输入number 显示主菜单 n=1? Y Nn=2? Y Nn=3? Y Nn=4?Y结束 文件操作单词定位输入numbern=1? 单词计数Y 创建文件内容显示N主菜单n=2? Y Nn=3? Y 写入文本N返回主菜单三、详细设计和编码1.头文件包含:#include<stdio.h>#include<stdlib.h>#include<string.h>2.功能细分(1)创建自定义名字文档①用字符数组filename存放特定的文件路径(D:\\Dev-Cpp\\课程设计数据\\)②从键盘输入自定义的文档名字name,把name和“.txt”用strcat连接③再用strcat把路径filename与文档名name连接起来④打开文件时用变量(filename)表示文件名,若无该文件则创建图3-1 创建自定义名字文档编码(2)打开文件读取内容并输出①输入文档名字,根据名字打开文件②打开文件后,用fgets读取文档内容③fgets读取一行输出一行,并用i记录行数④fgets返回EOF(END OF FILE)表示文件结尾(3)写入文本①输入文档名字,根据名字打开文档,若无该文档,则重新建立一个。
②根据提示,从键盘输入字符,最后以0结束③用字符变量ch接收字符,并用fputc()把字符输出到文本文档中图3-2 写入文档编码(4)单词的计数①输入文档名字,根据名字打开文件②根据提示输入单词③用ch遍历文本文档④把空格前的单词与给定单词比较,若相同则count++⑤若不相同则重新开始比较(5)获取文件的行数①输入单词②获取文本行数:根据\n判断,由于有些行是空行,无法算作一行,所以要判断\n后一个字符是不是也是\n若是两个连续的\n,则line-1;若不是,则line+1;③判断方法:当ch1为\n时,把ch1赋值给ch2,ch1继续获取下一个字符,若ch1==ch2,则line-1;图3-3 获取文件行数编码(6)矩阵存储单词检索①输入单词②边统计边判断统计:定义一个二维数组a,所有位置的初始值为-1遍历文本文件时,在遇到第一个\n前为第一行,遇到第一个空格前为第一个单词,即a[0][0]位置上的-1变为0,依次类推把每个单词与给定单词作比较,若该单词与给定单词相同,则该单词位置上的0的值变为1③统计每一行值为1的数的个数,为给定单词在该行中出现的次数;④输出每一行为1的数的列的值,即为给定单词在该行中出现的位置;⑤把行列数的值赋给矩阵的s,v;用循环,把数组中所有值为1的数的位置存储在矩阵的word(y,z)中,并且计算每行为1的总数count++;图3-4 矩阵的结构体类型图3-5 单词的位置、个数的输出四、上机调试过程1.输出文档内容时,fgets()不能用EOF判断是否到达结尾,若把EOF换作null,但由于单词与单词之间有空格,无法正确显示。
解决:用fgetc读取每个字符存放于ch中,当ch!=EOF的时候,就可以不断输出直到文件结尾,再用len记录行数,初始值为1,当遇到‘\n’时则+1。
2.单词的计数出错,无法准确计算出文档有多少和给定的单词。
解决:①在循环中,判断ch为空格或转行符号时,要用&&判断,不能用||,否则将在判断时出错②在比较过程中,若下一个字符不符合就直接判断为错,从i=0重新开始,否则只要单词中包含给出的单词都表示正确③在比较时还要主要标点符号,符号也会影响判断3.在计算文本文档行数的时候,若有空行,也会计算成一行。
解决:当两个连续的转行符号\n\n在一起时,line应该先+1再-1,即不变。
当一个转行符号\n后不是转行符号,也不是文件结尾,line+14.标点符号后有空格,重复计算单词。
解决:修改判断条件,若标点符号后是空格,则不计算单词5.调试过程中,完成输入点击“Enter”后,直接跳过程序进行下一步。
解决:下一步进入该函数时,程序会自动获取该Enter键,导致函数直接结束。
因此要用getchar()先获取该字符,才可以开始执行程序。
五、测试结果及其分析图5-1 程序主菜单图5-2 功能1 子菜单1.创建文件图5-3 创建文件成功图5-4 文档成功出现在文件夹中2.文档内容显示图5-5 abc.txt文档内容图5-6 abc.txt文档内容显示在屏幕上3.单词计数(1)测试数据1文档:abc.txt给定单词:you正确数据:9个检验数据:9个图5-7 abc.txt中you的单词总数(2)测试数据2文档:abc.txt给定单词:Y ou(与you区分大小写)正确数据:4个检验数据:4个图5-7 abc.txt中You的单词总数(3)测试数据3文档:v alue.txt给定单词:it正确数据:3个检验数据:3个图5-8 value.txt中it的单词总数(4)测试数据4文档:value.txt给定单词:is正确数据:4个检验数据:4个图5-9 value.txt中is的单词总数4.单词定位(1)测试数据1文档:abc.txt给定单词:you(共9个)图5-10 abc.txt中you所在的位置和个数(2)测试数据2文档:value.txt给定单词:is(共4个)图5-10 value.txt中is所在的位置和个数5.时间性能分析①程序中对数据进行顺序存储的时间性能为O(n);但是用矩阵记录单词的坐标和个数用了两层for循环,其时间性能为O(n*n);②在对文本文档进行遍历并输出,只需要while控制的一层循环,所以其时间性能为O(n);③在计算文本文档的行数和单词的个数的时候,用了多个if-else的判断,但是仍然只有一层while控制的循环,所以其时间性能为O(n);总结:该程序的时间性能为O(n*n);六、用户使用说明1.功能叙述①创建文本文档②显示文本文档的内容③统计给定单词在文本文档中出现的次数④检索给定单词,并输出其所在的行、列和每行总共出现的次数2.操作说明①由数字0-9可以选择不同的功能,以及板块的退出②除数字以外的符号可以结束程序(空格键和\n除外)3.输入说明本程序涉及文件名字的输入和单词的输入。
①输入文件名:文件名由数字0-9、26个英文字母以及符号-组成;②单词的输入:字符间不可出现空格,只能用26个英文字母组成,且区分大小写七、参考文献[1] 王昆仑,李红. 数据结构与算法. 北京:中国铁道出版社,2006年5月。
八、附录#include<stdio.h>#include<stdlib.h>#include<string.h>#define Max100void FileOperation();void CreateFile();void Show();void WordCount();void Explor();typedef struct{int y,z;}node;typedef struct{int s,v;int count[Max];node word[Max];}SeqMatrix;int main()//主菜单{int number;printf("***************\n"); printf("1.文件操作\n");printf("2.单词计数\n");printf("3.单词定位\n");printf("4.退出程序\n");printf("***************\n");printf("\n请输入功能序号:"); scanf("%d",&number);switch(number){case1:FileOperation();case2:WordCount();case3:Explor();default:exit(0);}return0;}void FileOperation()//文件操作{system("CLS");int number;printf("***************\n");printf("1.创建文件\n");//printf("2.写入文件\n");printf("2.显示内容\n");printf("3.返回\n");printf("***************\n");printf("\n请输入功能序号:");scanf("%d",&number);switch(number){case1:CreateFile();case2:Show();case3:system("CLS");main();default:exit(0);}}void CreateFile()//创建文档{system("CLS");char filename[100]="D:\\Dev-Cpp\\课程设计数据\\";//直接把地址赋值进数组中char name[25];FILE*fp;getchar();printf("输入创建的文件的名字:");gets(name);strcat(name,".txt");//连接成一个文件名strcat(filename,name);if((fp=fopen(filename,"a+"))==NULL){printf("null");exit(0);}//给文件输入内容fprintf(fp,"We each dictate what it is,how it is,and why it is.\n\nShe is kind,carin g,nurturing,and loving.\n");printf("创建成功!");fclose(fp);char ch;printf("\n任意值退出,0返回:");ch=getchar();if(ch=='0'){FileOperation();}else{exit(0);}}void Show()//显示内容{system("CLS");char filename[100]="D:\\Dev-Cpp\\课程设计数据\\";char name[25];FILE*fp;char ch;//int len=1;getchar();printf("输入打开的文件的名字:");gets(name);//输入文件名strcat(name,".txt");//连接成一个文件名strcat(filename,name);if((fp=fopen(filename,"r"))==NULL){printf("找不到该文件!\n");Show();}ch=fgetc(fp);//获取每个字符while(ch!=EOF){putchar(ch);//输出在屏幕/*if(ch=='\n'){len++;}*/ch=fgetc(fp);}fclose(fp);char c;printf("\n任意值结束,0返回:");c=getchar();if(c=='0'){FileOperation();}else{exit(0);}}void WordCount()//单词计数{getchar();system("CLS");char filename[100]="D:\\Dev-Cpp\\课程设计数据\\"; char name[25];char character[10];FILE*fp;char ch;int count=0;int len;char c;printf("请输入文本文件名:");gets(name);strcat(name,".txt");strcat(filename,name);if((fp=fopen(filename,"r"))==NULL){printf("找不到该文件\n");main();}printf("\n请输入要计数的单词:");gets(character);len=strlen(character);//len-1表示这个单词的大小int i=0,k=0;ch=fgetc(fp);while(ch!=EOF){if(ch!=''&&ch!='\n'&&ch!=','&&ch!='.'&&ch!='?'&&ch!='!'){if(ch==character[i])//字符相等{i++;}k++;ch=fgetc(fp);}else{if(i==len&&i==k)//k是读取的单词中字母的序号,i是相同字符的个数,len是给定单词长度{count++;}i=0;k=0;ch=fgetc(fp);}}if(ch==EOF&&i==len&&i==k){count++;}printf("单词总数为:%d",count);fclose(fp);printf("\n任意值结束,0返回:");c=getchar();if(c=='0'){system("CLS");main();}else{exit(0);}}void Explor()//单词检索{char filename[100]="D:\\Dev-Cpp\\课程设计数据\\";//文件路径char name[25];//文件名char character[10];//给定单词FILE*fp;char ch,ch2,c;int a[20][30];int i,j,k,x;int len;//单词的长度getchar();system("CLS");for(i=0;i<20;i++){for(j=0;j<30;j++){a[i][j]=-1;}}printf("请输入文本文件名:");gets(name);strcat(name,".txt");strcat(filename,name);if((fp=fopen(filename,"r"))==NULL){printf("找不到该文件\n");main();}printf("\n请输入要计数的单词:");gets(character);len=strlen(character);//len-1表示这个单词的大小i=0,j=0,k=0,x=0;//i为行j为列k用于判断ch=fgetc(fp);while(ch!=EOF){if(ch!=''&&ch!='\n'&&ch!=','&&ch!='.'&&ch!='?'&&ch!='!'&&ch!=':') {//printf("%c",ch);if(ch==character[k])//字符相等{k++;}x++;//printf("[%d,%d]",k,x);ch=fgetc(fp);}//判断单词是否一致else if(ch==''||ch==','||ch=='.'||ch=='?'||ch=='!'||ch==':'){ch=fgetc(fp);if(ch==''){a[i][j]=0;ch=fgetc(fp);}else{a[i][j]=0;}if(k==len&&k==x){a[i][j]=1;}k=0;x=0;j++;}else if(ch=='\n'){ch2=ch;ch=fgetc(fp);if(ch==ch2){//a[i][j]=0;i++;j=0;ch=fgetc(fp);}else if(ch!=ch2&&ch!=EOF){i++;j=0;}}}printf("\n");SeqMatrix m;m.s=i+1;m.v=30;for(i=0;i<Max;i++){m.count[i]=0;}k=0;for(i=0;i<m.s;i++){printf("第%d行该单词出现的位置:",i+1); for(j=0;j<m.v;j++){if(a[i][j]==1){m.word[k].y=i;m.word[k].z=j;printf("%d",m.word[k].z+1);m.count[i]++;k++;}//printf("%d",a[i][j]);}printf("[共%d个]\n",m.count[i]);printf("\n");}fclose(fp);printf("\n任意值结束,0返回:");c=getchar();if(c=='0'){system("CLS");main();}else{exit(0);}}2018 年2月。