1.设计要求与分析
建立一个文本文件,每个单词不包含空行且不跨行。检索单词的出现的行数,与位置。
2.具体设计
2.1建立文本文件
2.1.1定义一个串变量
代码语言:javascript复制typedef struct{
char cACh[MAXSIZE];
int iLenght;
}SEQSTR;
这是一个顺序串
代码语言:javascript复制void fileCreate ( )
{
int i;
SEQSTR STR;
char cFileName[10],cContinueFlg;
FILE *fp;
printf("输入要建立的文件名:");
scanf("%s",cFileName);
fp = fopen(cFileName,"w");
cContinueFlg = 'n';
while (cContinueFlg == 'n'||cContinueFlg == 'N') {
printf("输入一行文本 n");
getchar();
gets(STR.cACh);
strcat(STR.cACh,"n");
STR.iLenght=strlen(STR.cACh);
for (i = 0; i < STR.iLenght; i ) {
fwrite(&STR.cACh[i],sizeof(char),1,fp);
}
printf("结束吗?y or n:");
cContinueFlg=getchar();
}
fclose(fp);
printf("建立文件结束!n");
}
1.输入文件名,打开该文件
2.循环读入到该文件过程如下
While(不是文件的输入结束){
读入一文本进入串变量;
串变量写入文件;
输入是否为结束的标志;
}
2.2检索单词的出现的位置
2.2.1串的匹配算法
从主串(顺序存储结构)的第k个字符起首次与匹配串相同的起始位置。
代码语言:javascript复制int stringMatch ( SEQSTR STRMaster, SEQSTR STRMatch, int iInitPos) {
int iMaster,iMatch;
iMaster = iInitPos - 1;
iMatch = 0;
while (iMaster < STRMaster.iLenght && iMatch < STRMatch.iLenght) {
if (STRMaster.cACh[iMaster] == STRMatch.cACh[iMatch]) {
iMaster ;
iMatch ;
}
else {
iMaster = iMaster - iMatch 1;
iMatch = 0;
}
}
if (iMatch >= STRMatch.iLenght)
return iMaster 1-STRMatch.iLenght;
else
return -1;
}
iMaster,iMatch;是扫描的变量,在未完成主串与匹配串的扫描时,当出现相同的字符时两者都会自加,一旦发现不同的立马回到主串的起始位置的下一个的位置,匹配串的扫描变量立马清零。扫描完了,返回主串存在匹配串的起始位置。
2.2.2单词的检索
1.输入要检索的文件名,并打开
2.输入要检索的单词
3.行计数器清0
4.While(不是文件的结尾) {
读入一行到指定的主串中;
求出串的长度;
行单词计数器置0;
检索的位置置1为初始的位置;
While(初始化检索的位置<主串的长度) {
调用串匹配函数,得到位置;
有的话,单词计数器 1,在这串中先保留起来它的位置;
接着下一个的检索;
}
检索完这行,如果有单词,就输出;
}
代码语言:javascript复制void wordRetrieval() {
FILE *fp;
SEQSTR STRMaster,STRSlave;
char cAFileName[10];
int i,j,k,l,m;
int iASiteStore[20];
printf("输入的文件名:");
scanf("%s",cAFileName);
fp = fopen(cAFileName,"r");
printf("输入要搜索的单词:");
scanf("%s",STRSlave.cACh);
STRSlave.iLenght=strlen(STRSlave.cACh);
l=0;
while (0==feof(fp)) {
fgets(STRMaster.cACh,sizeof(STRMaster.cACh),fp);//文件读一个字符串
STRMaster.iLenght=strlen(STRMaster.cACh);
if (feof(fp))
break;
l ;
k=1;
i=0;
while (k < STRMaster.iLenght) {
j = stringMatch(STRMaster,STRSlave,k);
if (j < 0)
break;
else {
i ;
iASiteStore[i] = j;
k = j STRSlave.iLenght;
}
}
if (i > 0) {
printf("行号:%d次数:%d,位置分别是:",l,i);
for ( m = 1; m <= i; m )
printf("M",iASiteStore[m]);
printf("n");
}
else
printf("没找到");
}
}
整个源代码
代码语言:javascript复制// wordRetrieval.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define MAXSIZE 256
typedef struct{
char cACh[MAXSIZE];
int iLenght;
}SEQSTR;
typedef SEQSTR *qSEQSTR;
int stringMatch ( SEQSTR STRMaster, SEQSTR STRMatch, int iInitPos) {
int iMaster,iMatch;
iMaster = iInitPos - 1;
iMatch = 0;
while (iMaster < STRMaster.iLenght && iMatch < STRMatch.iLenght) {
if (STRMaster.cACh[iMaster] == STRMatch.cACh[iMatch]) {
iMaster ;
iMatch ;
}
else {
iMaster = iMaster - iMatch 1;
iMatch = 0;
}
}
if (iMatch >= STRMatch.iLenght)
return iMaster 1-STRMatch.iLenght;
else
return -1;
}
void fileCreate ( )
{
int i;
SEQSTR STR;
char cFileName[10],cContinueFlg;
FILE *fp;
printf("输入要建立的文件名:");
scanf("%s",cFileName);
fp = fopen(cFileName,"w");
cContinueFlg = 'n';
while (cContinueFlg == 'n'||cContinueFlg == 'N') {
printf("输入一行文本 n");
getchar();
gets(STR.cACh);
strcat(STR.cACh,"n");
STR.iLenght=strlen(STR.cACh);
for (i = 0; i < STR.iLenght; i ) {
fwrite(&STR.cACh[i],sizeof(char),1,fp);
}
printf("结束吗?y or n:");
cContinueFlg=getchar();
}
fclose(fp);
printf("建立文件结束!n");
}
void wordRetrieval() {
FILE *fp;
SEQSTR STRMaster,STRSlave;
char cAFileName[10];
int i,j,k,l,m;
int iASiteStore[20];
printf("输入的文件名:");
scanf("%s",cAFileName);
fp = fopen(cAFileName,"r");
printf("输入要搜索的单词:");
scanf("%s",STRSlave.cACh);
STRSlave.iLenght=strlen(STRSlave.cACh);
l=0;
while (0==feof(fp)) {
fgets(STRMaster.cACh,sizeof(STRMaster.cACh),fp);//文件读一个字符串
STRMaster.iLenght=strlen(STRMaster.cACh);
if (feof(fp))
break;
l ;
k=1;
i=0;
while (k < STRMaster.iLenght) {
j = stringMatch(STRMaster,STRSlave,k);
if (j < 0)
break;
else {
i ;
iASiteStore[i] = j;
k = j STRSlave.iLenght;
}
}
if (i > 0) {
printf("行号:%d次数:%d,位置分别是:",l,i);
for ( m = 1; m <= i; m )
printf("M",iASiteStore[m]);
printf("n");
}
else
printf("没找到");
}
}
int main(int argc, char* argv[])
{
int iChoose;
//printf("Hello World!n");
while(1) {
scanf("%d",&iChoose);
switch (iChoose) {
case 1:fileCreate();break;
case 2:wordRetrieval();break;
}
}
return 0;
}