C语言笔记:循环数组的应用

原文链接: http://c.biancheng.net/c/

文章目录

机器翻译

问题描述:
某同学计算机上安装了一个翻译软件,原理是从头到尾依次将每个英文单词用对应中文含义替换。对每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有,软件就会用它进行翻译;如果内存中没有,软件就会在外存中的词典内查找,查出单词的中文含义然后翻译,并将这个单词和译意放入内存,方便后续的查找和翻译,现需要

  • 输入两行,第一行输入两个正整数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 查看本文章

猜你喜欢

转载自blog.csdn.net/weixin_42124234/article/details/102392231
今日推荐