第14周:阅读教材第13章(p417-458),主要内容是输入输出,重点是文件的操作,完成第14周上机任务;
【任务1】涨工资
从文件salary.txt中读入500名工人的工资,全部增加100元后进行排序,将排序后的结果在屏幕上输出,并保存到文件ordered_salary.txt中。
[ 参考:涨工资了 - http://blog.csdn.net/sxhelijian/article/details/7632245 ]
【任务2】学生成绩排序
文件score.dat中保存的是100名学生的姓名和C++课、高数和英语成绩。
(1)定义学生类,其中包含姓名、C++课、高数和英语成绩及总分、均分数据成员,成员函数根据需要确定。
(2)读入这名学生的成绩,用对象数组进行存储。
(3)求出各科和总分的最高分。
(4)请按总分的降序(高成绩在前,低成绩在后)排序
(5)在屏幕上显示各科及总分的最高分,排序后的成绩单(包括总分)保存到文件odered_score.dat中。
[ 参考:学生成绩排序 - http://blog.csdn.net/sxhelijian/article/details/7632249 ]
【任务3】电子词典
做一个简单的电子词典。在文件dictionary.txt中,保存的是英汉对照的一个词典,词汇量近8000个,英文、中文释义与词性间用’\t’隔开。建一个表示词条的类Word,Word类的一个对象可以描述一个词,类对象数组可以存储词库。将文件中的内容读到对象数组中,由用户输入英文词,显示中文释义。
提示:文件中的词汇已经排序,故在查找时,用二分查找法提高效率。
拓展1:允许用户运行程序后,连续地查词典,直到输入”0000”结束。
拓展2:试着做一个窗口版的电子词典。
拓展3:使这个词典,读入一篇文章,输出其中的所有名词(或动词,或全部实词)。——搜索引擎用类似的功能,用于筛去虚词,因为并不是所有词都值得索引。
【任务4】文档的自动处理:要求编写C++程序,读WolfSheep.nls,去除其中所有的注释,并保存到文件WS_nocomment.nls中。
NetLogo(http://ccl.northwestern.edu/netlogo/)是一个用来对自然和社会现象进行仿真的可编程建模环境。NetLogo 特别适合对随时间演化的复杂系统进行建模。建模人员能够向成百上千的独立运行的“主体”(agent)发出指令,使探究微观层面上的个体行为与宏观模式之间的联系成为可能。NetLogo 有详尽的文档和教学材料。它还带着一个模型库,库中包含许多已经写好的仿真模型,可以直接使用也可修改。这些仿真模型覆盖自然和社会科学的许多领域,包括生物和医学,物理和化学,数学和计算机科学,以及经济学和社会心理学等。
NetLogo是我近年来科研工作常用的一个仿真平台,建议同学们不妨有时间玩一玩。本任务不是要让同学们用Netlogo编程,而是用C++编程去处理Netlogo源程序。
在NetLogo中,代码的注释以分号开始。例如,文件WolfSheep.nls中是一个模拟生态系统中狼、羊、草地保持生态平衡的一部分代码,其中,每一行分号之后的文字全是注释。
要次明确要求:编写C++程序,读WolfSheep.nls,去除其中所有的注释,并保存到文件WS_nocomment.nls中。
例如,WolfSheep.nls中下面的一段代码:
ask patches [ set pcolor green ]
; check GRASS? switch.
; if it is true, then grass grows and the sheep eat it. else, then the sheep don't need to eat
if grass? [
ask patches [
set countdown random grass-regrowth-time ; initialize grass grow clocks randomly
set pcolor one-of [green brown]
]
]
经过处理后,在WS_nocomment.nls中,上面划线部分的注释将全部不存在。
提示1:任务的另一种直白的解读是:读入每一行,复制每一行分号前面的部分。或者说,读入每一行,逐个复制文件中的字符,如果出现分号,分号及其后的文字将不再复制。
提示2:任务0中的某些程序可供参考,它们做了本题中的部分工作。
任务的最低要求:去除注释,如果注释单独占一行,保留空行;
任务的较高要求:当注释单独占一行时,去除注释后,空行将不再保留。注释单独占一行,即本行在分号之前,除了空格与Tab(即’\t’)外,不出现其他任何符号。
任务的最高要求:见拓展三,消除出现这种Bug的可能。
任务4拓展提示:
这部分的思路和体会可以用于一切由计算机自动处理文档的场所合。想想目前互联网的热潮,包括搜索引擎、自然语言处理,甚至语音识别等,都要涉及到对文本的处理。
这部分拓展利用对源代码的处理进一步做些体验,让计算机自动处理源代码也是业内的一个重要领域(想想你提交一个C++程序,编译系统能为你检查语法错误,能将C++代码转换为计算机能够识别和执行的机器代码——将来学习到《编译系统》有关的知识时,千万别说没用和枯燥)。要处理的C++源程序请自己准备。
拓展一:读入一个C++程序,将其单行的注释(即 每一行“//”后面的内容)删除后保存;
拓展二:写一个程序,它能“剥”去C++源程序中的所有注释(包括//形式和/*...*/形式的)。
拓展三:修正上面所有程序中的一个Bug。如果字符串中包含表示注释的符号,如Netlogo程序中的字符串”this is a comment; that not”,C++程序中的字符串”words after // is comment.”,按照前面的处理会酿成大祸:将分号或//及其后面的符号全部删除后,表示字符串结束的双引号将不存在,破坏了字符串的完整性,同时程序将无法通过编译。
拓展四:基于上面的任一个程序,要处理的文件名和保存后的文件名由用户输入,并完成处理。
拓展五:跳出杀戮源代码中注释的行为,为程序的每一行后面都加上“//”,以方便程序员精心注释(练练而已,要每行代码后都写注释,勤奋过头了)。
拓展六:简单处理一般的文本。某些作者在写作中,无意中会在行首加入个数不定的各种非法符号,如多个空格、Tab符号、#、$等等。现在规定每一行必须以字母开头,请编程序让计算机自动整理这些不规矩的文本。提示:你要先做这么一个不规矩的文本。更高要求:规矩的文本每行前要有两个空格。
【任务5】学生成绩处理:保存为二进制文件
ASCII文件score.dat中保存的是100名学生的姓名和C++课、高数和英语成绩。
(1)定义学生类,其中包含姓名、C++课、高数和英语成绩及总分、均分数据成员,成员函数根据需要确定。
(2)读入学生的成绩,并求出总分,用对象数组进行存储。
(3)将所有数据保存到一个二进制文件binary_score.dat中,最后在文件中写入你自己的各科成绩(咱不谦虚,也求个好运,全100分)。
(4)为验证输出文件正确,再将binary_score.dat中的记录逐一读出到学生对象中并输出查看。
所用文件上传CSDN资源在遭删除,需要者私信告知Email,单独寄送。