第16周-任务4-文档的自动处理

【引子有些长】

  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符号、#、$等等。现在规定每一行必须以字母开头,请编程序让计算机自动整理这些不规矩的文本。提示:你要先做这么一个不规矩的文本。更高要求:规矩的文本每行前要有两个空格。

时间: 2024-11-12 20:54:14

第16周-任务4-文档的自动处理的相关文章

如何打开一个16进制的文档

问题描述 由于开发需要使用VB.NET制作16进制文本读取器,之前有用VB6.0开发了一个,可是NET与6.0差异比较大,请各位帮忙修改一下,使其可以正确读取!如下为VB6.0代码供各位前辈参考!PrivateSubCommand3_Click()Dimss()AsByte,iAsLongText1.Text=""Open"d:S30012"ForBinaryAs#1ss=InputB(LOF(1),#1)Close#1Fori=0ToUBound(ss)Ifi&g

文档型漏洞攻击研究报告

本文讲的是文档型漏洞攻击研究报告, 研究背景 由于反病毒技术快速发展及免费安全软件在全球的高度普及,恶意程序的传播变得越来越困难.自2013年以来,中国一直是全球个人电脑恶意程序感染率最低的国家. 但是随着漏洞挖掘及利用技术越来越公开化,导致越来越多的黑客更加倾向于利用常见办公软件的文档漏洞进行恶意攻击,特别是在一些APT(Advanced Persistent Threat)攻击中,更是体现得淋漓尽致.针对特定目标投递含有恶意代码的文档,安全意识薄弱的用户只要打开文档就会中招. 对于漏洞文档(

26个产品经理必须要了解的文档

 现在在我们的产品部只有四个人,而且也是经过了一段时间的磨合,所以每个人的性格特点我大概也了解得差不多了. 周扬,比较爱学习,而且思维缜密,有毅力,也善于总结,也没什么架子,爱和别人开玩笑,在公司里能和每一个人都能打成一片,所以呢,人缘就特别好,他就属于那种能够在公司内左右逢源的那种,当然,他也是真有能力,这一点他是得到了技术部的一致认可. 当然了,还有他烟抽得也是比较猛,不知道这算不算缺点,但是得看从哪个角度来说,如果是从男同事的角度看,也许这不能称之为一个缺点,但如果是从从女同事的角度来看,

Android官方入门文档[16]创建一个Fragment代码片段

Android官方入门文档[16]创建一个Fragment代码片段   Creating a Fragment创建一个Fragment代码片段   This lesson teaches you to1.Create a Fragment Class2.Add a Fragment to an Activity using XML You should also read•Fragments 这节课教你1.创建一个Fragment代码片段类2.使用XML来添加一个Fragment代码片段给一个活

Word入门动画教程16:预览将要打开的文档

打开文档前,用户可以先预览所选文档的内容.方法如下: 1.单击常用工具栏的"打开"按钮,在"打开"对话框中定位到要打开文档所处的具体文件夹. 2.选中目标文档. 3.单击视图按钮右侧的下拉按钮,在菜单中选择"预览",在对话框中部右侧将出现此文档的预览图,以此可以查看并判断是否为自己所要打开文档. 提示: 1.连续单击"打开"对话框中的"视图"按钮,中部的文件及文件夹显示区将按"缩略图".

工作周记 - 第八周 (2016/07/11 - 2016/07/15) 文档!文档!文档!

文档!文档!文档!重要的事情说三遍 1.项目一期基本开发完毕,包括后台管理系统以及提供给手机端的接口,由于奔着敏捷开发去的,文档没有过多花时间去写, 当然了文档肯定有,开发人员写的自己能看懂,但是对于对接人员来说看了就跟吃了屎一样难受 好吧,由于项目进度比原先提前,所以根据实际情况来修改文档,把文档修改得更加人性化,可读化 其实文档对于一些程序员来说,很瞧不起,但是,文档能力大家一定要提高,文档能力的提高可以给你未来带来很大的便捷 因为你要转管理,就必须要具备一定的文档能力 来看看文档模板吧,目

PowerDesigner将PDM导出生成WORD文档

环境 PowerDesigner15 1.点击Report Temlates 制作模板 2.如果没有模板,单击New图标创建.有直接双击进入. 3.在弹出的类型(Type)对话框中想选择PBM(Physical data Model),如果有中文汉化包则选择simolified Chinese(中文简体)没有则选择English, 在Name文本框中取名:   4.如图:我们左右2个区,Aavailable区域中选择你想要在WORD文档中展示的东东,这里我们选择List of Tables,和L

[参考文档] [翻译]Oracle 12c R2优化器白皮书

[参考文档] [翻译]Oracle 12c R2优化器白皮书 原文链接:http://www.oracle.com/technetwor ... edb-12c-1963236.pdf 第一版翻译链接:http://www.itpub.net/thread-1855401-1-1.html Oracle数据库12c第二版优化器 Oracle白皮书 2016年11月 序言 优化器是Oracle数据库最引人入胜的部件之一,因为它对每一个SQL语句的处理都必不可少.优化器为每个SQL语句确定最有效的执

一些不错的文档网址--笔记【原创】

一些不错的内核文档网址 1. 轻松认识 Linux Kernel 转自:http://www.bricktou.com/default_cn.html  git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git git reset v4.0 -hard http://www.infradead.org/~mchehab/kernel_docs/index.html 2. Linux Device Dr