太原理工大学软件工程课程设计实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
顺序串的模式匹配算法如下: int index(SString S, SString T) { //求子串 T 在主串 S 中首次出现的位置
int i,j,k,m,n; m=T.length; //模式串长度赋 m n=S.length; //目标串长度赋 n for (i=0; i<=n-m; i++)
1.标准的朴素模式匹配算法 2.给定位置的匹配算法 1.2 文本文件单词的检索与计数的设计要求 要求编程建立一个文本文件,每个单词不包含空格且不跨行,单词由字符序 列构成且区分大小写;统计给定单词在文本文件中出现的总次数;检索输出某个 单词出现在文本中的行号、在该行中出现的次数以及位置。 该设计要求可分为三个部分实现:其一,建立文本文件,文件名由用户用键 盘输入;其二,给定单词的计数,输入一个不含空格的单词,统计输出该单词在 文本中的出现次数;其三,检索给定单词,输入一个单词,检索并输出该单词所 在的行号、该行中出现的次数以及在该行中的相应位置。 1.建立文本文件 2.给定单词的计数 3.检索单词出现在文本文件中的行号、次数及其位置
k=0; //初始化开始检索位置
while(k<S.length-1) //检索整个主串 S
{
j=PartPosition(S,T,k);
if(j<0)
break;
else
{
i++; //单词计数器加 1
k=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)) {
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; //表示 s1 中存在 s2,返回其起始位置
if(s1.ch[i]==s2.ch[j]) {
i++;
j++; //继续使下标移向下一个字符位置 } else {
i=i-j+1; j=0; } } 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", 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("建立文件结束!"); }
然而,在各种不同类型的应用中,所处理的串有不同的特点,要想有效地实 现串的处理,就必须熟悉串的存储结构及其基本运算。本课程设计的目的就是熟 悉串类型的实现方法和文本模式匹配方法,熟悉如何利用模式匹配算法实现一般 的文本处理技术。
本课程设计分两步:首先,设计出串定位算法(即模式匹配算法)及其实现; 然后,再利用串定位算法设计文本文件的检索及单词的计数等操作。
文本文件单词的检索与计数
专业:软件工程 班级: 1227 班 姓名: 王晓春 学号: 2012005774 同组人:王晓春 闫瑞娟 张泽磊 组长:王晓春 完成日期: 2014.6.25
Βιβλιοθήκη Baidu一.【问题描述】
串是非数值处理中的主要对象,如在信息检索、文本编辑、符号处理等许多 领域,得到越来越广泛的应用。在高级语言中也引入了串数据类型概念,并且串 变量与其他变量(如整型、实型等)一样,可以进行各种运算。
(4)循环读入文本行,写入文本文件,其过程如下:
While ( 不是文件输入结束) {
读入一文本行至串变量;
串变量写入文件;
输入是否结束输入标志;
}
(5)关闭文件。
2.给定单词的计数
该功能需要用到前一节中设计的模式匹配算法,逐行扫描文本文件。匹配一
个,计数器加 1,直到整个文件扫描结束;然后输出单词出现的次数。
输出行号、该行有匹配单词的个数以及相应的位置; } 2.8 函数调用关系
主程序
CreatTextFile()
SubStrCount()
SubStrInd()
PartPosition()
三.【设计功能的实现】
#include "stdafx.h" #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) {
} //endfor return -1; } //endIndex 给定位置的串匹配算法 该算法要求从串 S1(为顺序存储结构)中第 k 个字符起,求出首次与字符串 S2 相同的子串的起始位置。 该算法与上面介绍的模式匹配算法类似,只不过上述算法的要求是从主串的 第一个字符开始,该算法是上述算法的另一种思路:从第 k 个元素开始扫描 S1, 当其元素值与 S2 的第一个元素的值相同时,判定它们之后的元素值是否依次相 同,直到 S2 结束为止。若都相同,则返回当前位置值;否则继续上述过程,直 至 S1 扫描完为止,其实现算法如下: 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)
void SubStrCount() {
FILE *fp; SString S,T; //定义两个串变量 char fname[10]; int i=1,j,k; printf("输入文本文件名: ");
scanf("%s", fname);
fp=fopen(fname ,"r");
printf("输入要计数的单词或字符串:");
else
return -1;
//表示 s1 中不存在 s2, 返回-1
} //函数结束
说明:以上两个算法可统一为一个算法,即在子串定位算法 Index(S,T)的参
数中增加一个起始位置参数即可。
2.7 各模块及其伪码:
1.建立文本文件
建立文件的实现思路是:
(1)定义一个串变量;
(2)定义文本文件;
(3)输入文件名,打开该文件;
3.检索单词出现在文本文件中的行号、次数及其位置 这个设计要求与上一个类似,但要相对复杂一些。其实现过程描述如下: (1)输入要检索的文本文件名,打开相应的文件;
(2)输入要检索统计的单词; (3)行计数器置初值 0; (4)while (不是文件结束) {
读入一行到指定串中; 求出串长度; 行单词计数器置 0; 调用模式匹配函数匹配单词定位、该行匹配单词计数; 行号计数器加 1; If (行单词计数器!=0)
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);
{ j=0; k=i; // 目标串起始位置 i 送入 k while (j<=m && s.ch[k]==t.ch[j]) {k++; j++;} //继续下一个字符的比较 if (j==m) //若相等,则说明找到匹配的子串,返回匹配位置 i, //否则从下一个位置重新开始比较 return i;
//fread(&S, sizeof(S), 1, fp);//读入一行文本 memset(S.ch,'\0', 256);
fgets(S.ch,256,fp);
S.length=strlen(S.ch);
l++;
k=0;//从串 T 的扫描初始位置默认为数组第一位,可根据用户要求
改变 k 值,成为给定位置的串匹配算法
i=0;
while(k<S.length-1)
{
j=PartPosition(S,T,k);
if(j<0)
break;
else
{
i++;//i 记录被检测单词的出现次数
wz[i]=j;//用数组 wz[]记录被检测单词在所在行的位置
k=j+T.length;//k 为检测目标单词的下一个起始位置
其实现过程如下:
(1)输入要检索的文本文件名,打开相应的文件;
(2)输入要检索统计的单词;
(3)循环读文本文件,读入一行,将其送入定义好的串中,并求该串的实
际长度,调用串匹配函数进行计数。具体描述如下:
While (不是文件结束) {
读入一行并到串中;
求出串长度;
模式匹配函数计数;
}
(4)关闭文件,输出统计结果。
4.主控菜单程序的结构
2.概要设计示例如下:
2.6 算法设计 朴素模式匹配算法
该算法的基本思想是:设有三个指针——i,j,k,用 i 指示主串 S 每次开始 比较的位置;指针 j,k 分别指示主串 S 和模式串 T 中当前正在等待比较的字符位 置;一开始从主串 S 的第一个字符(i=0;j=1)和模式 T 的第一个字符(k=0)比 较,若相等,则继续逐个比较后续字符(j++,k++)。否则从主串的下一个字符(i++) 起再重新和模式串(j=0)的字符开始比较。依此类推,直到模式 T 中的所有字 符都比较完,而且一直相等,则称匹配成功,并返回位置 i;否则返回-1,表示 匹配失败。
二.【设计需求及分析】
1.设计要求
1.1 串模式匹配算法的设计要求 在串的基本操作中,在主串中查找模式串的模式匹配算法——即求子串位置
的函数 Index(S,T),是文本处理中最常用、最重要的操作之一。 所谓子串的定位就是求子串在主串中首次出现的位置,又称为模式匹配或串
匹配。模式匹配的算法很多,在这里只要求用最简单的朴素模式匹配算法。该算 法的基本思路是将给定子串与主串从第一个字符开始比较,找到首次与子串完全 匹配的子串为止,并记住该位置。但为了实现统计子串出现的个数,不仅需要从 主串的第一个字符位置开始比较,而且需要从主串的任一给定位置检索匹配字符 串,所以,首先要给出两个算法:
相关文档
最新文档