问题描述
你旅游到了一个国外的城市。那里的人们说的外国语言你不能理解。不过幸运的是,你有一本词典可以帮助你。
输入:
首先输入一个词典,词典中包含不超过100000个词条,每个词条占据一行。
每一个词条包括一个英文单词和一个外语单词,两个单词之间用一个空格隔开。
而且在词典中不会有某个外语单词出现超过两次。词典之后是一个空行,然后给出一个由外语单词组成的文档,
文档不超过100000行,而且每行只包括一个外语单词。输入中出现单词只包括小写字母,而且长度不会超过12。
输出:
在输出中,你需要把输入文档翻译成英文,每行输出一个英文单词。
如果某个外语单词不在词典中,就把这个单词翻译成“eh”。
解题思路:
1.首先要做一个词典结构体数组,里面包含了英文和方言
2.然后就是输入赋值给数组:这里我采用了从外部文件读取的方式,并将词条存入我创建的词典结构体数组中
3.要对词典的方言进行一个排序,因为我们是按照方言找对应词条数组下表,然后得到它对应的英文,我采用了快速排序的方法
4.然后将输入的单词与词条的方言进行比对,并返回词典结构体数组的下标,采用二分法,每次都取中间的下标对应的值进行比较大小
这样每次都少比较一半的单词
5.打印结果
存在的问题:
每一次只能查一个单词
可改进思路:
1.设置一个char[][],一次读很多个,然后依次解析并输出翻译结果。
2.可以把待翻译的英文也存在一个txt中,然后将翻译结果写入一个新建的txt中,这样就不需要自己敲单词了。
代码及说明
#include "pch.h" #include<stdio.h> #include<iostream> #include<string.h> #include<stdlib.h> #include<string> #include <fstream> using namespace std; const int maxn = 100000;//最大单词量 int wordcount = 0;//词典node数组的下标值 struct node //节点的结构体 { char english[12];//英语 char foreign[12];//方言 }; node dictionary[maxn];//单词书 //利用快速排序算法,将词典按照方言的字母从a到z排序 void QuickSort(node array[], int start, int last)//array[]是待排序的数组,start是数组的起始下标,last是终止下标 { int i = start; int j = last; node temp = array[i]; if (i < j) { while (i < j) { //strcmp的含义是将字符数组从前到后挨个进行比较,如果前面小于后面,就返回<0,如果相等就返回0 while (i < j && strcmp(array[i].foreign, array[j].foreign) < 0) j--; if (i < j){ array[i] = array[j]; i++; } while (i < j && strcmp(array[i].foreign, array[j].foreign)>0) i++; if (i < j) { array[j] = array[i]; j--; } } //把基准数放到i位置 array[i] = temp; //递归方法 QuickSort(array, start, i - 1); QuickSort(array, i + 1, last); } } //二分法查找 int bsearch(char *s, int n) { int mid, start, end; start = 0; end = n - 1; int flag = 0; while (start <= end) { mid = (start + end) / 2;//从中间位置开始找 flag = strcmp(s, dictionary[mid].foreign);//比较输入的单词和中间位置下标的方言是否一致 if (flag == 0)//如果为0证明恰好就是它,把下标返回就可以了 return mid; if (flag < 0)//小于0就在左边部分找,否则就在右半部分找 { end = mid - 1; } else { start = mid + 1; } } return -1; } //读取词典的函数 //将词典以单词的形式读取并存入到dictionary数组中 void readDectionary() { const char filename[] = "D:\\dictionary.txt"; ifstream i_file; string out_text;//输出的单词 //读 i_file.open(filename); if (i_file.is_open()) { //k是为了判断读取的单词是基数还是偶数 //目的是为了判断放入英语还是方言的char[]中,在txt文档中,基数为英语,偶数为方言(格式是先写英语然后再空格写方言) int k = 0; while (i_file >> out_text) { k++; //这里定义了一个字符数组,将获取的单词string转为char[]类型 char dst[12]; for (int i = 0; i<=out_text.length(); i++) { dst[i] = out_text[i]; } //余数为1则为基数 if(k%2==1){ memcpy(dictionary[wordcount].english, dst, sizeof(dst)); cout << dictionary[wordcount].english << endl; } else { memcpy(dictionary[wordcount].foreign, dst, sizeof(dst)); cout << dictionary[wordcount].foreign << endl; wordcount++;//dictionary恰好存入一组英语和方言,下标值加1 } } } else cout << "打开文件:" << filename << "时出错!"; i_file.close(); } int main() { //读取词典,按照单词读取: readDectionary(); //快速排序 QuickSort(dictionary, 0, wordcount); //输入待翻译的单词 cout << "请输入单词" << "\n"; char word[12]; cin >> word; //在词典中找方言,并将词典下标值返回给P int p; p = bsearch(word, wordcount); //判断词典中是否有对应的翻译 if (p == -1) { cout << "ch" << "\n"; } else { cout << dictionary[p].english; } }
运行结果截图: