单词匹配c编程_第1页
单词匹配c编程_第2页
单词匹配c编程_第3页
单词匹配c编程_第4页
单词匹配c编程_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

单词匹配c编程

一、问题描述

单词匹配(难度系数:3级)

任务描述:

设有n个单词的字典表(1<n<100),计算某给定单词在字典表中的3种匹配情况(字

典中的单词和给定单词长度上限为255):

二、需求分析

①i:该单词在字典表中的序号;

②日:在字典表中仅有一个字符与给定单词不匹配的单词序号;

③R:在字典表中比给定单词多(或少)一个字符(除此字符外其余字符均匹配)的单

词序号。

当查找时有多个单词符合条件,仅要求记录满足条件的第一个单词的序号即可。

功能要求:

①输入形式:字典表文件名给定单词

其中字典表以TXT文件格式存储,且每行一个单词。

②输出形式:输出到文件,输出文件格式为:

i

E,

Fi

其中i为字典表中符合条件的单词序号(1<i<n),若字典表中不存在符合条件的单词,

则对应的i=0。

三、程序设计

1、程序流程图

四、程序实现

主程序:

1、使用文件链接打开相应的单词表,打开正确则继续操作,否则退出程序

FILE*fp;〃定义文件指针

FILE*tp;

intn=100;〃字典内单词的数量为100

charname[10];//定义文件名

printf("\n实验三\n\n");

***********w”>

printf("欢迎进入单词匹配系统

\n");

***************\n”y

printf(”请输入查找的文件名:");

gets(name);〃接收用户输入的文件名

/*以T的方式打开文件name.txt,以"w”的方式打开文件output.txt,并判断文件是否打开

成功*/

if((fp=fopen(name,uru))==NULL||(tp=fopen("output.txt,,,,(w',))==NULL)

〃文件打开失败,退出程序

(

printf("\n打开文件错误!!\n”);

printf(n\n正在退出系统…\n");

getchar();

return0;

2、子程序I,在单词表中搜索符合I规则(和待查单词相匹配)的单词。

主要设计思想:首先比较两个字符串的长度,if(size(data)=size(str))则依次比较字

符串的各位,直至“\0”,否则跳出循环。最后把单词序号以字符串的形式输出,并把其写入

tp所指的文件:fputs(Put,tp);

代码如下:

voidI(FILE*fp,FILE*tp,char*str,intn)

(

charPut[5];

inti=l,j;

intsize!=strlen(str);〃统计字符串str的长度

intsize2=0;

chardata[255];

while(i<=n)〃在文件中搜索符合I的字符串

(

fgets(data,255,fp);〃将fp所指文件中的字符送入数组data中

size2=strlen(data);

/*比较两个字符串是否相同,相同时写入文件并进行输出*/

if(sizel==size2-l)

(

j=0;

while(str[j]!=W)

(

if(str[j]!=data[j])

break;

else

j++;

)

if(j==sizel)//循环结束没有跳出

Put[0]=,i,;

Put[l尸';

Put[2]=i+48;//ASCH码转换,将其转化成字符型

Put[3]=,\n';

,

put[4]=\0';

fputs(Put,tp);〃把字符串put写入到tp所指的文件中

printf(Hi%d\nu,i);

return;

i++;

)

fputsC'O\n",tp);

printf(Hi0\nu);

3、子程序EL在单词表中搜索符合EI(在字典中查找仅有一个字符与待查单词不匹

配)规则的单词。

主要设计思想:如果仅有一个字符与待查单词不匹配,则两个字符串长度必须相同。If(size

(data)=size(str);增加一个参数m=0,用于记录两个字符串中不相同的字符个数:

data[j]!=str[j];m++;当且仅当m=l时满足,输出序号i,并把其送入到文件中:

fputs(Put,tp);

代码如下:

voidEI(FILE*fp,FILE*tp,char*str,intn)

(

inti=l,j,m,size2=0;

charPut[5];

rewind(fp);//使文件指针复位

intsizel=strlen(str);

chardata[255];

while(i<=n)〃在文件中搜索符合Ei的字符串

(

fgets(data,255,fp);〃将fp所指文件中的字符送入数组data中

size2=strlen(data);

if(sizel==size2-l)〃两个字符串必须长度相同

(

m=0,j=0;

while(str[j]!=、O')

(

if(str[j]!=data[j])//记录下两个串中不相同元素的个数

m++;

j++;

if(m==l)〃只有一个元素不相同符合要求

Put[O]=,E,;

Put[2]=i+48;

Put[3]=*\n';

,

put[4]=*\0;

fputs(Put,tp);〃把字符串写入到文件中

printf(nE%d\nM,i);

return;

i++;

}

fputs("E0\n",tp);

printf("E0\nu);

)

4、子程序FL在单词表中搜索符合FI规则的单词。

主要设计思想:共两种情况:

(1)查找的单词比给定单词长度大一:If(size(str)=size(data)+1,借用函数slrstr():

j=strstr(str,data);找出字符串data在str中第一次出现的位置,并返回该指针。

(2)查找的单词比给定单词长度小一:If(size(data)=size(str)+1,借用函数strstr():

j=strstr(data,str);找出字符串str在data中第一次出现的位置,并返回该指针。输出单词序号

i,并把其送入到文件中。

代码如下:

/*FI:在字典中查找比给定单词多(或少)一个字符(除此字符外其余字符均匹配)的单词

序号*/

voidFI(FILE*fp,FILE*tp,char*str,intn)

(

charPut[5];

rewind(fp);//使文件指针复位

char*j;

chardata[255];

inti=1,k,m=0,q,size2=0;

intsizel=strlen(str);

while(i<=n)〃在文件中搜索符合Fi的字符串

(

fgets(data,255,fp);〃将fp所指文件中的字符送入数组data中

size2=strlen(data);

/*两字符串长度必须相差1,分两种情况:str和data从第一个字符开始都相同,str

和data的第二个字符开始相同*/

if(sizel==size2)//str字符串长度比data(没算“\n”)大1

k=O,q=O;

while(data[q]!=*\n*)

(

if(str[q]!=data[q])〃记录下两个串中不相同元素的个数

{break;}

elsek++;

q++;

)

if(k==size2-l)〃返回值和str指针相同,说明两个字符串前部分相同

(

Put[O]='F;

Put[l]=*

Put[2]=i+48;

Put[3]=、n';

Put[4]=W;

fputs(Put,tp);

printf("F%d\n",i);

return;

if(sizel==size2)

(

k=O,q=O;

while(data[q]!=*\n,)

(

if(str[q+lj!=data[q])〃记录下两个串中不相同元素的个数

{break;}

elsek++;

q++;

)

if(k==sizel-l)〃返回值和str指针相同,说明两个字符串前部分相同

(

Put[O]=F;

Put[l]=*f;

Put[2]=i+48;

Put[3]='\n';

Put[4]W

fputs(Put,tp);

printf(MF%d\n",i);

return;

elseif(size2==sizel+2)〃字符串data长度比str大1

j=strstr(data,str);〃返回第一次出现该位置的指针

if(j==data)//ffi串前部分相同

{

Put[O]=F;

Put[l]=’';

Put[2]=i+48;

Put[3]=!\n';

Put[4]=、0';

fputs(Put,tp);

printf(KF%d\nu,i);

return;

)

)

i++;

)

fputs(nF0\n",tp);

printf("FO\nu);

五、程序测试

单词表:

Jword.txt-记事本

文件(F)编辑(E)格式(O)MW(V)帮助(H)

ok

of

a

aanod

tn

ir

h

i

hat

t

wawy

f

the

wayt

w

nh:

s

a

b

t

1•s

we

jyouI

do

but

from

which

one

would

all

will

there

s

w

me

wn

c

more

if

no

进入程序

1、打开文件错误,自动退出程序:

实验三

>(■)<,W**XMMXXJCXIOOtXKXXMXXXM~X*X**X*)(*X*XW]

欢迎进入单词匹配系统

卜青输入查找的文件名:WOKd.txt

销输入待查找单词:

3、开始查找单词

请输入查找的文件名:3。rd.txt

请输入待查找单词:qi,”t

i0

E0

F0

请输入查找的文件名:sord.txt

请输入待查找单词:『小ich

i25

E0

F0

请输入查找的文件名:Mkd.txt

请输入待查找单词“ay

i13

E31

F0

请输入查找的文件名RoNd.txt

请输入待查找单词:at

i16

E8

F4

每次写入文件的内容:

r

ioutput.txt-记事本

文件(F)锚(E)蹴(0)查看(V)帮助而"

1•@

E8

F4

六、设计小结

本程序分别设计了三个子函数I、EkFI用于处理三种不同的情况,并分别输出满足题

意的单词序号。

但是本程序依然存在一些缺陷,比如一次只能输入一个单词,而且运行完之后需要重新

打开文件,很繁琐。除此之外函数的健壮性不够,比如输入数字程序依然进行。

七、使用说明

1、进入程序,打开单词表。

2、输入待查单词,程序自动给出三种匹配方式下的结果:

请输入查找的文件名:word.txt

请输入待查找单词:

i89

E30

F0

八、附录

将程序源代码粘贴如下:

#include<stdio.h>

#include<string.h>

/*1:查找与待查单词相匹配的函数*/

voidI(FILE*fp,FILE*tp,char*str,intn)

(

charPut[5];

inti=l,j;

intsizel=strlen(str);〃统计字符串str的长度

intsize2=0;

chardata[255];

while(i<=n)//在文件中搜索符合I的字符串

(

fgets(data,255,fp);〃将fp所指文件中的字符送入数组data中

size2=strlen(data);

/*比较两个字符串是否相同,相同时写入文件并进行输出*/

if(sizel==size2-l)

(

j=0;

whUe(str[j]!=W)

(

if(str[j]!=data[j])

break;

else

j++;

I

ifG==size1)//循环结束没有跳出

Put[0]=T;

Put[l]=*r;

Put[2]=i+48;//ASCII码转换,将其转化成字符型

Put[3]=V;

Put[4]=、0’;

fputs(Put,tp);〃把字符串put写入到tp所指的文件中

printf(Mi%d\nu,i);

return;

i++;

)

fputs("O\n",tp);

printf(Hi0\nn);

/*EI:在字典中查找仅有一个字符与待查单词不匹配的单词序号可

voidEI(FILE*fp,FILE*tp,char*str,intn)

(

inti=l,j,m,size2=0;

charPut[5];

rewind(fp);〃使文件指针复位

intsizel=strlen(str);

chardata[255];

while(i<=n)〃在文件中搜索符合Ei的字符串

{

fgets(data,255,fp);〃将fp所指文件中的字符送入数组data中

size2=strlen(data);

if(size1==size2-1)〃两个字符串必须长度相同

(

m=0,j=0;

while(str[j]!='\O,)

(

if(str[j]!=data[j])〃记录下两个串中不相同元素的个数

(

m++;

)

j++;

)

if(m==l)〃只有一个元素不相同符合要求

(

Put[0]=E;

Put[lJ=f

Put[2]=i+48;

Put[3]=An';

put[4]=W;

fputs(Put,tp);〃把字符串写入到文件中

printf("E%d\nn,i);

return;

i++;

)

fputs("E0\n",tp);

printf("E0\n");

)

/*EI:在字典中查找比给定单词多(或少)一个字符(除此字符外其余字符均匹配)的

单词序号*/

voidFI(FILE*fp,FILE*tp,char*str,intn)

(

charPut[5];

rewind(fp);//使文件指针复位

char*j;

chardata[255];

inti=1,k,m=0,q,size2=0;

intsizel=strlen(str);

while(i<=n)//在文件中搜索符合Fi的字符串

(

fgets(data,255,fp);〃将fp所指文件中的字符送入数组data中

size2=strlen(data);

/*两字符串长度必须相差1,分两种情况:str和data从第一个字符开始都相同,

str和data的第二个字符开始相同*/

if(sizel==size2)//str字符串长度比data(没算"\n”)大1

(

k=O,q=O;

while(data[q]!=,\n')

(

if(str[q]!=data[q])〃记录下两个串中不相同元素的个数

{break;}

elsek++;

q++;

)

if(k==size2-l)〃返回值和str指针相同,说明两个字符串前部分相

(

Put[0]=,F';

Put[l]='*;

Put[2]=i+48;

Put[3]=,\n';

Put[4]='\0';

fputs(Put,tp);

printf(nF%d\n”,i);

return;

if(sizel==size2)

(

k=0,q=0;

while(data[q]!=,\n,)

if(str[q+1]!=data[q])〃记录下两个串中不相同元素的个数

{break;}

elsek++;

q++;

)

if(k==sizel-1)〃返回值和str指针相同,说明两个字符串前部分相同

(

Put[O]=*F';

Put[l]=**;

Put[2]=i+48;

Put[3]='\n';

Put[4]='\0';

fputs(Put,tp);

printf("F%d\n",i);

return;

elseif(size2==sizel+2)〃字符串data长度比str大1

{

j=strstr(data,str);〃返回第一次出现该位置的指针

if(j==data)〃两串前部分相同

(

Put[O]='F';

Put[l]=**;

Put[2]=i+48;

Put[3J='\n';

温馨提示

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

评论

0/150

提交评论