傻瓜翻译程序

来源:互联网 发布:网络配线架怎么安装 编辑:程序博客网 时间:2024/04/29 10:54

在今年的一个公司的实习招聘的试题中,遇到了实现一个简单的翻译字典的程序,现在写出来,和大家分享一下。大笑

有一个弱智的翻译程序,它接收一个文本文件作文输入源source.txt,通过查找给定的字典dictionary.txt,进行一一对应的翻译,并讲翻译结果输出到指定的文件out.txt。对于输入的内容,如果在字典中能找到对应的翻译,则输出翻译后的词条,否则原样输出。

字典存储为一个文本文件,每一行表示一个词条,源词条和翻译之间用逗号分隔,例如,如果有下面这个字典:

hello,你好

world,世界

当输入“hello world!”,翻译器输出“你好 世界!”,当输入“hello Blog!”,则·输出“你好 Blog!”。

1.实现这样子一个翻译程序,读入待翻译的文件和词典文件,输出翻译结果到out.txt文件中

2.要求字典的条目不限于单词(word),还可以是短语(phrase),

例如字典:

come,来

come out,出现

out,外面的

当输入的源文档中有“come out”时,应翻译为“出现”,而不是“来,外面的”


这个题目其实也不算难,主要考核了对文档的读写操作的函数。例如getline();open();close();tellg()等等


在用程序实现这个功能的时候,总结了一些经验教训,希望这些经验对大家有用:

1.在着手编程序前,先把程序的流程图给弄清楚,画出来。这样子,当思路清晰了,剩下的就只有用哪种编程语言实现了。

2.编写复杂的程序,尽量分模块实现不用的功能,一个小函数实现一个功能。这样子方便调试。

3.在调用getline(字符数组/字符指针,字符个数n,终止标志字符)时,该函数读取n-1个字符,赋给指定的字符数组,如果在读取n-1个字符之前遇到了指定的终止字符,    则提前结束读取。这个函数会自作聪明,会在数组最后加入一个0(null)来标志数组的结束。

a[4]为字母o(ASCII码111);a[5]为空(ASCII码000);a[6]为字符@(ASCII码064)


在编这个程序的时候,我遇到了一个暂时无法解决的问题,希望各位高手支招:

当一个读一个文件读到文件最后时即file.eof()为真时,无法通过函数seekg(偏移值,ios::beg)来改变文件指针的位置。

ifstream infile("source.txt",ios::in);

while(!infile.eof())//如果没有到文件最后,就继续读文件

infile.getline(a,50,'/n');//读取文件中的一行;

infile.seekg(ios::beg);//  错误,在这里不知道为什么不能够再次把文件指针设置到文件开头,请高手赐教

问题已经得到高手(Lucas_Hsueh)的指点,解决办法如下:

dictionaryFile读完后的EOF标记需要用infile.clear()清除,不然永远进不了while内部。


在文章的最后,给出鄙人的程序运行结果、流程图和源代码。源文件可以点击这里下载。个人能力有限,难免有错漏的地方,欢迎大家指出,谢谢!




//main

//source

这个翻译程序,有一个小小的bug:源文件中最后一个单词(或者符号)不能够翻译出来,而是被忽略掉了。如下如图,源文件末尾有三个单词“come come come”,但是翻译出来的只有两个“来来”


bug已经解决,解决办法是在读source源文件中最后一个单词时,利用clear()函数清楚eof,不再往后读;代码如下:




本程序仅实现了翻译的功能,但是还是存在着不足的地方:

        1.没有对各代码函数之间进行封装和归类,会对软件的后期更新和维护造成困难;

        2.这个函数的时间复杂度过大,因为采取了顺序查询方式进行单词的查询,每查询一个单词都需要在字典本中从头开始进行查询,直到找到对应的单词,否则就一直读到字典本的末尾,这是一个很糟糕的查询方法。

0 0
原创粉丝点击