4{if(s1.ch[i]==s2.ch[j])
{ i++;j++; //继续使下标移向下一个字符位置 } else {
i=i-j+1; j=0; /*使i下标回溯到原位置的下一个位置, 使j指向说s2的第一个字符,再重新比较 */ } }
if (j>=s2.length) return i-s2.length; else
return -1;//表示s1中不存在s2,返回-1 //表示s1中存在s2,返回其起始位置 } //函数结束
void CreatTextFile() {
SString S; char fname[10],yn; FILE *fp;
printf(\"输入要建立的文件名:\"); scanf(\"%s\ fp=fopen(fname,\"w\"); yn='n';//输入结束标志初值 while(yn=='n'||yn=='N') {
printf(\"
请
输
入
一
行
文
本
:
5
\");gets(S.ch);gets(S.ch);
S.length=strlen(S.ch); fwrite(&S,sizeof(S),1,fp);
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\ fp=fopen(fname,\"r\");
printf(\"输入要统计计数的单词:\"); cin>>T.ch;
T.length=strlen(T.ch);
while(!feof(fp)){ //扫描整个文本文件
fread(&S,sizeof(S),1,fp);//读入一行文本 k=0; //初始化开始检索位置
while(kj=PartPosition(S,T,k);//调用串匹配函数 if(j<0 ) break; else { i++;//单词计数器加1
6
k=j+T.length;//继续下一字串的检索 } } }
printf(\"\\n单词%s在文本文件%s出现%d次\\n\ }
void SubStrInd() { FILE *fp;
SString S,T; //定义两个串变量 char fname[10]; int i,j,k,l,m;
int wz[20]; //存放一行中字串匹配的多个位置 printf(\"输入文本文件名:\"); scanf(\"%s\ fp=fopen(fname,\"r\");
printf(\"输入要检索的单词:\"); scanf(\"%s\ T.length=strlen(T.ch); l=0; //行计数器置0
while(!feof(fp)) { //扫描整个文本文件 fread(&S,sizeof(S),1,fp); //读入一行文本 l++; //行计数器自增1 k=0;//初始化开始检索位置 i=0; //初始化单词计数器
while(kj=PartPosition(S,T,k); //调用串匹配函数 if(j<0) break;7
else {
i++;//单词计数器加1 wz[i]=j;//记录匹配单词位置 k=j+T.length;//继续下一字串检索 } } if(i>0){
printf(\"行号:%d,次数:%d,位置分别为:\ for(m=1;m<=i;m++) printf(\"\\n\"); } } }
int main() {
void CreatTextFile(),SubStrCount(),SubStrInd(); int xz; do {
printf(\"* * * * * * * * * * * * * * * * * * * * * *\\n\");
printf(\"*文本文件的检索、字串的统计及定位 *\\n\");
printf(\"* * * * * * * * * * * * * * * * * * * * * *\\n\");
printf(\"%4d\
printf(\"* 1. 建立文本文件 *\\n\");
printf(\"* 2. 单词字串的计数 *\\n\");
printf(\"* 3. 单词字串的定位 *\\n\");
printf(\"* 4. 退出整个程序
8
*\\n\");
printf(\"* * * * * * * * * * * * * * * * * * * * * *\\n\"); printf(\" 请选择(1--4) \");
scanf(\"%d\ switch(xz) {
case 1 : CreatTextFile();break; case 2 : SubStrCount();break; case 3 : SubStrInd();break; case 4 : return 0;
default:printf(\"选择错误,重新选 \\n\"); } }while(1); }
3.3 程序运行结果(拷屏)
1未输入文件前的页面
2输入文本文件,计数单词出现的次数
9
3检索某单词的行号,出现次数,以及位置
10
4. 课程设计心得、存在问题及解决方法
经过一周的奋斗,这次数据结构的课程设计终于做完了。通过这次设计我也着实又感受了一次编程的乐趣,从中也学到了不少知识。
感受最深的一点是:以前用编程,只是注重如何编写函数能够完成所需要的功能,似乎没有明确的战术,只是凭单纯的意识和简单的语句来堆砌出一段程序。现在编程感觉完全不同了。在编写一个程序之前,先对这个课程设计进行了一下分析,将每个要求都花了一下算法流程图,使得自己的思路更加的清晰了 。 然后进行编程,不断的在电脑上调试程序,终于完成了此次的课程设计。
另外,我还体会到深刻理解数据结构的重要性。只有真正理解这样定义数据类型的好处,才能用好这样一种数据结构。了解典型数据结构的性质是非常有用的,它往往是编写程序的关键。
通过这次课程设计逐渐提高了自己的程序设计和调试能力,我以前对算法一直很害怕,总是看不明白究竟这程序中间的过程是怎么进行的。在这次实验中我终于克服了这一障碍,一遍遍在心中自己默默的走,终于弄明白了,真的是功夫不负有心人啊!
这次试验也让我看到了自己的不足,还是不太用模板类。还有许多关于C++的一些比较具体的东西还不太懂,比方说指针。这次试验还让我意识到只有不断的在电脑上调试程序,自己的水平才能得到提高。
我会继续我们的兴趣编写程序的,相信在越来越多的尝试之后,自己会不断进步和提高。
11