第16周-任务4-文档的自动处理
来源:互联网 发布:网络设计工程师 编辑:程序博客网 时间:2024/06/15 20:30
【引子有些长】
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 istrue, then grass grows and the sheep eat it. if it false, then the sheep don'tneed to eat if grass? [ ask patches[ setcountdown random grass-regrowth-time ; initialize grass grow clocks randomly set pcolorone-of [green brown] ] ]
经过处理后,在WS_nocomment.nls中,以分号作为分隔符的注释将全部不存在。即文档变为:
ask patches [set pcolor green ] if grass? [ ask patches[ setcountdown random grass-regrowth-time ; initialize grass grow clocks randomly set pcolorone-of [green brown] ] ]
提示1:任务的另一种直白的解读是:读入每一行,复制每一行分号前面的部分。或者说,读入每一行,逐个复制文件中的字符,如果出现分号,分号及其后的文字将不再复制。
提示2:任务0中的某些程序可供参考,它们做了本题中的部分工作。
- 任务的最低要求:去除注释,如果注释单独占一行,保留空行;
- 任务的较高要求:当注释单独占一行时,去除注释后,空行将不再保留。注释单独占一行,即本行在分号之前,除了空格与Tab(即’\t’)外,不出现其他任何符号。
- 任务的最高要求:见拓展三,消除出现这种Bug的可能。
【参考解答1】
//符合任务的最低要求的程序:去除注释,如果注释单独占一行,保留空行;#include <iostream>#include <fstream>using namespace std;int main() {ifstream sourceFile;ofstream targetFile;char ch[100];int i;sourceFile.open("WolfSheep.nls", ios::in);targetFile.open("WS_nocomment.nls", ios::out);while (!sourceFile.eof()){sourceFile.getline(ch,100,'\n');i=0;while(ch[i]!='\0' && ch[i]!=';'){targetFile.put(ch[i]);++i;}targetFile.put('\n');}sourceFile.close();targetFile.close();cout << "Finish!" << endl;system("pause");return 0;}
【参考解答2】
//符合任务的较高要求的程序:当注释单独占一行时,去除注释后,空行将不再保留。#include <iostream>#include <fstream>using namespace std;bool isCommentLine(char[]);int main() {ifstream sourceFile;ofstream targetFile;char ch[100];int i;sourceFile.open("WolfSheep.nls", ios::in);targetFile.open("WS_nocomment.nls", ios::out);while (!sourceFile.eof()){sourceFile.getline(ch,100,'\n');if(!isCommentLine(ch)) //如果是独立的注释行,该行将不再写入目标文件{i=0;while(ch[i]!='\0' && ch[i]!=';'){targetFile.put(ch[i]);++i;}targetFile.put('\n');}}sourceFile.close();targetFile.close();cout << "Finish!" << endl;system("pause");return 0;}bool isCommentLine(char line[]) //判断是否为独立的注释行{int i=0;bool is = false;char c=line[i];while(c!='\0' && c!=';' && (c==' ' || c=='\t')){c=line[++i];}if (c==';') is=true;return is;}
【拓展提示】
这部分的思路和体会可以用于一切由计算机自动处理文档的场所合。想想目前互联网的热潮,包括搜索引擎、自然语言处理,甚至语音识别等,都要涉及到对文本的处理。
这部分拓展利用对源代码的处理进一步做些体验,让计算机自动处理源代码也是业内的一个重要领域(想想你提交一个C++程序,编译系统能为你检查语法错误,能将C++代码转换为计算机能够识别和执行的机器代码——将来学习到《编译系统》有关的知识时,千万别说没用和枯燥)。要处理的C++源程序请自己准备。
拓展一(选做):读入一个C++程序,将其单行的注释(即 每一行“//”后面的内容)删除后保存;
拓展二(选做):写一个程序,它能“剥”去C++源程序中的所有注释(包括//形式和/*...*/形式的)。
拓展三(选做):修正上面所有程序中的一个Bug。如果字符串中包含表示注释的符号,如Netlogo程序中的字符串”this is acomment; that not”,C++程序中的字符串”words after //is comment.”,按照前面的处理会酿成大祸:将分号或//及其后面的符号全部删除后,表示字符串结束的双引号将不存在,破坏了字符串的完整性,同时程序将无法通过编译。
拓展四(选做):基于上面的任一个程序,要处理的文件名和保存后的文件名由用户输入,并完成处理。
拓展五(选做):基于拓展四,做一个MFC程序,在对话框中选择要处理的源文件名,并指定目标文件名后进行处理。如在图1中点击按钮“…”后,会利用图2的窗口选择文件。(提示:请自行查找资料,学习有关MFC中关于通用对话框的内容。文件对话框用的类是CFileDialog。通用对话框还包括颜色、字体、页面设置、打印等对话框)。
图1
图2
拓展六(选做):跳出杀戮源代码中注释的行为,为程序的每一行后面都加上“//”,以方便程序员精心注释(练练而已,要每行代码后都写注释,勤奋过头了)。
拓展七(选做):简单处理一般的文本。某些作者在写作中,无意中会在行首加入个数不定的各种非法符号,如多个空格、Tab符号、#、$等等。现在规定每一行必须以字母开头,请编程序让计算机自动整理这些不规矩的文本。提示:你要先做这么一个不规矩的文本。更高要求:规矩的文本每行前要有两个空格。
- 第16周-任务4-文档的自动处理
- 跟随贺老师:2011年C++第16周-任务4-文档的自动处理
- C++第十六周【任务四】 【任务4】文档的自动处理
- 第8周自动班要完成的任务
- 《C++第十六周实验报告4-1》---文档的自动处理
- 第4周任务
- C++第16周项目4 -处理C++源代码 - (3)自动加注释
- 使用Grunt进行自动任务处理的相关教程
- 第14周任务1(建立专门的数组类处理有关数组的操作)
- 第7章任务2:对数据的异常处理
- 第16周任务1
- 第16周任务3
- 第4周任务1
- 第4周任务3
- 第4周任务1
- 第8周任务4
- 第9周任务4
- 第13周任务4
- 【Java】Timer和TimerTask详解
- 众多Android 开源项目推荐,给力工作给力学习
- 二、封装的变化(设计模式的核心)
- RMQ算法初学的学习总结
- linux下的framebuffer(1)
- 第16周-任务4-文档的自动处理
- Android学习记录第二篇 (layout布局)
- Facebook大跌引发市场对扎克伯格质疑
- 验证html5离线应用在线升级(更新中)
- Agitar -单元测试自动化生成利器
- 程序员必备的七大面向对象设计原则(一)
- hdu1231最大子序列
- 如何通过书籍学习Drupal7
- Eclipse中添加JDK源码的方法