20162323周楠 马尔科夫链
20162323周楠 马尔科夫链
需求分析
通过“学习”一篇文章后,随机输出新的文章。
仅考虑英文输入输出
从文件读入待”学习“文章
能处理标点符号(参考材料中有说明)
能控制输出文章的篇幅
通过参数指定输出的单词数
误差控制
生成的语句要能完整结束(比如遇到句号、问号、感叹号等结束标志)。
为了能实现上述条件,允许输出的单词数量误差 ±50。
设计思路
StringTokenizer的用法:去除空格,将各个单词分割出来
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String str=br.readLine();
StringTokenizer st=new StringTokenizer(str);
while(st.hasMoreTokens())
{
// listtemp.removeAll(listtemp);
// System.out.println(st.nextToken());
listtemp.add((String)(st.nextToken()));//将各词暂时放在list中
}
说明:
stringtokenizer 是java.util的 而streamtokenizer是java.io的。
stringtokenizer的例子1:
import java.util.StringTokenizer;
public class TokenTest
{ public static void main(String args[])
{
String str="aaa,bbb,ccc,dd,ee,eeadsfd";
String empty="";
StringTokenizer strTokenizer=new StringTokenizer(str,",");//以逗号为分割符
while(strTokenizer.hasMoreTokens())
{
empty=empty+strTokenizer.nextToken();
}
System.out.println(empty);
}
}
streamtokenizer的例子2:
input.txt内容如下:
hello everybody
today is a good day
提取出"hello"和"day" 2个子串然后写入"output.txt"
import java.io.*;
public class Jtest
{
public static void main(String[] args)
{
String find1 = "hello";//欲?取字串
String find2 = "day";//欲?取字串
String tmp = null;
try
{
FileReader in = new FileReader("input.txt");
FileWriter out = new FileWriter("output.txt");
StreamTokenizer st = new StreamTokenizer(in);
//使用StreamTokenizer剖析串流
while(st.nextToken() != StreamTokenizer.TT_EOF)
{
if(st.ttype != StreamTokenizer.TT_WORD)
{
continue;
}
tmp = st.sval; //获取的当前词
if(tmp.equals(find1) || tmp.equals(find2))
{
out.write(tmp);
out.write(System.getProperty("line.separator"));//这个是换行
}
}
in.close();
out.close();
}
catch(IOException exp)
{
System.out.println("IOException");
}
}
}
StreamTokenizer即令牌化输入流的作用是将一个输入流中变成令牌流。令牌流中的令牌实体有三类:单词(即多字符令牌)、单字符令牌和空白(包括Java和C/C++中的说明语句)。
StreamTokenizer类的构造器为: StreamTokenizer(InputStream in)
该类有一些公有实例变量:ttype、sval和nval ,分别表示令牌类型、当前字符串值和当前数字值。当我们需要取得令牌(即HTML中的标记)之间的字符时,应访问变量sval。而读向下一个令牌的方法是调用nextToken()。方法nextToken()的返回值是int型,共有四种可能的返回:
(1)StreamTokenizer.TT_NUMBER: 表示读到的令牌是数字,数字的值是double型,可以从实例变量nval中读取。
(2)StreamTokenizer.TT_WORD: 表示读到的令牌是非数字的单词(其他字符也在其中),单词可以从实例变量sval中读取。
(3)StreamTokenizer.TT_EOL: 表示读到的令牌是行结束符。
(4)StreamTokenizer.TT_EOF:表示该流已读到尽头。
开始调用nextToken()之前,要设置输入流的语法表,以便使分析器辨识不同的字符。WhitespaceChars(int low, int hi)方法定义没有意义的字符的范围。WordChars(int low, int hi)方法定义构造单词的字符范围。
hashtable的遍历
static Hashtable ht=new Hashtable();
Enumeration en = ht.keys();//hash表的遍历
while(en.hasMoreElements())
{
List li = (List) en.nextElement();
System.out.print("DEBUG: " + li);//表头
System.out.print(" = ");
System.out.println(ht.get(li));//表尾
}
随机数的产生
Random random = new Random();
System.out.println(20+random.nextInt(81));//生成20-100之间的随机数
编写过程记录
| PSP2.1 | Personal Softwore Process Stage | 预计耗时(分钟) | 实际耗时(分钟) | 重要成长 |
|---|---|---|---|---|
| Planning | 计划 | 20 | 30 | |
| Estimate | 做这个任务需要多长时间 | 900 | 720 | |
| Development | 开发 | 360 | 360 | |
| Analysis | 需求分析(包括学习新技术) | 30 | 30 | |
| Design Spec | 生成设计文档 | 180 | 100 | |
| Design Review | 设计复审(和同事审核设计软件) | 300 | 100 | |
| Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 60 | 60 | |
| Design | 具体设计 | 300 | 240 | |
| Coding | 具体编码 | 600 | 400 | |
| Code Review | 代码复审 | 120 | 60 | |
| Test | 测试(自我测试,修改代码,提交修改) | 240 | 120 | |
| Reporting | 报告 | 120 | 60 | |
| Test Report | 测试报告 | 120 | 80 |
| Size Measurement | 计算工作量 | 20 | 20 |
| Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 30 | |
评价
- 结对编程中的两个角色
- 领航员:20162323周楠
- 驾驶员:20162322朱娅霖
两个人在一起结对编程,能互相学习,从对方身上看到自己欠缺的地方,遇到困难也可以互相鼓励,共同解决,不像一个人时那样焦头烂额,耗费时间。
浙公网安备 33010602011771号