文章目录
机器翻译
问题描述:
某同学计算机上安装了一个翻译软件,原理是从头到尾依次将每个英文单词用对应中文含义替换。对每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有,软件就会用它进行翻译;如果内存中没有,软件就会在外存中的词典内查找,查出单词的中文含义然后翻译,并将这个单词和译意放入内存,方便后续的查找和翻译,现需要
- 输入两行,第一行输入两个正整数M(不超过100)和N,分别代表内存容量和文章长度(即一个英文句子中的单词个数);第二行输入的为N个非负整数,按照文章顺序,依次输入每个单词(此处用数字代替英文单词)
- 输出软件需要查外存词典的次数
实现代码:
#include <stdio.h>
#include <stdlib.h>
int Search(int a[],int n,int x);//在n个元素数组a中查找查找x,找到返回1,否则返回0
int main(void)
{
int M,N;//存储内存的容量以及单词的个数
int x;//用整数代表(模拟)单词
scanf("%d %d",&M,&N);
int *a=(int *)malloc(sizeof(int)*M);//动态申请内存存放单词
int n=0;//存入内存中的单词数
int k=0;//待存放内存中的单词下标
int times=0;//查外存字典的次数
while(N--)
{
scanf("%d",&x);
if(!Search(a,n,x))//如果在内存中没有找到单词x
{
times++;//查字典次数加1
a[k]=x;//将单词存入内存中,若已满,则会用新单词替换最早进入内存的单词,体现在下一行的求余语句
k=(k+1)%M;//求下次存放内存中时单词对应的下标(求余思想求下标)
if(n<M)
{
n++;//内存没满,内存中单词数加1
}
}
}
printf("总共需要查找外部词典的次数:%d\n",times);
}
int Search(int a[],int n,int x)
{
int i=0;//数组a下标从0开始与x比较
while(i<n)//n为内存中的单词数
{
if(a[i]==x)
{
return 1;//找到x,返回1
}
i++;
}
return 0;//没有找到,返回0
}
输出:
解释:
输入第一个单词“1”时:此时内存词典(可存放3个单词)无任何记录,查找外存词典将1存入内存词典(即数组a),此时查找外存词典1次
输入第二个单词“2”时:此时内存词典(还可存放2个单词)无有关2的记录,查找外存词典将2存入内存词典(即数组a),此时查找外存词典2次
输入第三个单词“1”时:此时内存词典存在有关1的记录,无须查找外存词典
输入第四个单词“5”时:此时内存词典(还可存放1个单词)无有关5的记录,查找外存词典将5存入内存词典(即数组a),此时查找外存词典3次
输入第五个单词“4”时:此时内存词典(内存词典已满)无有关4的记录,查找外存词典将4更新为下标为0的元素(将1替换为4),此时查找外存词典4次
输入第六单词“4”时:此时内存词典存在有关4记录,无须查找外存词典
输入第七个单词"1"时:由于此时之前内存词典中1已经更新为4,无有关1的记录,查找外存词典将1更新为下标为1的元素(将2替换为1),此时查找外存词典5次。
扫描二维码关注公众号,回复:
7579978 查看本文章