软件工程-第二次作业
博客
(10分)
发表博客,介绍上述“项目”中每个功能的重点/难点,展示重要代码片断,展示你感觉得意、突破、困难的地方。
词频统计
重点是利用哈希表统计语句中的单词出现次数,用哈希表长度表示单词数量。
难点是自己对C#很陌生,不知道如何去读取文件,输出文件。
解决的困难是在调用文件的过程中犯了一个非常低级的错误,因为文件隐藏导致只输入了文件名,没能输入文件名后缀导致无法调用。还有就是开启控制台的时候,出现闪退情况。加入了Console.ReadKey();后得到了解决。
功能一
代码:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.IO;
class wf
{
static void Main(string[] args)
{
string file_name = args[1];
//file_name = Console.ReadLine();
StreamReader sr = new StreamReader(file_name);
string line;
//Console.WriteLine(sline.ToString());
string t = "";
while ((line = sr.ReadLine()) != null)
{
line = line.ToLower();//全部变为小写字母
//Console.WriteLine(line);
//Console.ReadKey();//防止闪退-/*
t += line;
t += " ";
}
char[] c = { ' ', ',', '.', '?', '!', ':', ';', '\'', '\"' };
//分隔字符串后产生的字符串数组
string[] ss = t.Split(c);
//建立哈希表
Hashtable ha = new Hashtable();
for (int ii = 0; ii < ss.Length; ii++)
{
//判断文本是否进入
if (ha.ContainsKey(ss[ii]))
{
ha[ss[ii]] = (int)ha[ss[ii]] + 1;
}
else
{
ha.Add(ss[ii], 1);
}
}
//int sum = 0;
bool flag = false;
//遍历哈希表
foreach (DictionaryEntry de in ha)
{
if (de.Key == "")
{
flag = true;
continue;
}
//追加文本
//Console.WriteLine(de.Key + ":" + de.Value);
}
//string ss = "total:";
if (flag == true)
{
Console.Write("total:");
Console.WriteLine(ha.Count - 1);
//Console.ReadKey();//防止闪退
//Console.WriteLine("total:", ha.Count - 1);
}
else
{
Console.Write("total:");
Console.WriteLine(ha.Count);
//Console.ReadKey();//防止闪退
}
foreach (DictionaryEntry d in ha)
{
if (d.Key == "")
{
//flag = true;
continue;
}
Console.WriteLine(d.Key + ":" + d.Value);
}
Console.ReadKey();//防止闪退
}
}
实现截图如下:

功能二
在控制台输入文件的名字,对文章中单词的数目进行统计。然后对该文件目录进行遍历,并且对每一个文件中的单词进行统计,输出文章中出现的单词以及出现次数,要对单词按照淑贤频率由高到低进行排序。
FileUtil file2 = new FileUtil(); Console.WriteLine("请输入文章名War_and_Peace或Jane_Eyre :"); string fileName = Console.ReadLine(); string url_choiceTwo = "..\\..\\essay\\" + fileName + ".txt"; if (File.Exists(url_choiceTwo)) { file2.CountEachWord(url_choiceTwo, 2); } else { Console.WriteLine("无效文件"); }
实现截图如下:

功能三
读取已经录入的两篇文章,统计词数,对前十出现频率的单词进行统计并输出。
string[] files = Directory.GetFiles("..\\..\\essay\\"); foreach (string f in files) { Console.WriteLine(f); FileUtil file3 = new FileUtil(); file3.CountEachWord(f, 3); }
实现截图如下:

功能四
该功能支持输入文本并且将文本的内容中的单词量统计出来,如果是小文本,支持全部统计输出,如果是大文本就只输出前十个单词和出现的次数。
public int Division(int[] valueArray, string[] keyArray, int v1, int v2) { while (v1 < v2) { int num = valueArray[v1]; string num2 = keyArray[v1]; if (num < valueArray[v1 + 1]) { valueArray[v1] = valueArray[v1 + 1]; valueArray[v1 + 1] = num; keyArray[v1] = keyArray[v1 + 1]; keyArray[v1 + 1] = num2; v1++; } else { int temp = valueArray[v2]; valueArray[v2] = valueArray[v1 + 1]; valueArray[v1 + 1] = temp; string temp2 = keyArray[v2]; keyArray[v2] = keyArray[v1 + 1]; keyArray[v1 + 1] = temp2; v2--; } }
实现截图如下:

PSP
(8分)
在同一篇博客中,参照教材第35页表2-2和表2-3,为上述“项目”制作PSP阶段表格。
PSP阶段表格第1列分类,如功能1、功能2、测试功能1等。
要求1 估算你对每个功能 (或/和子功能)的预计花费时间,填入PSP阶段表格,时间颗粒度为分钟。
要求2 记录词频统计项目实际花费时间,填入PSP阶段表格,时间颗粒度要求分钟。
要求3 对比要求1和要求3中每项时间花费的差距,分析原因。

预计时间和实际时间相差有点多,造成的原因是自己对C#语言不够熟练,在上传文件和读取文件的环节中遇到了问题,并且在修改和测试的过程中遇到很多问题如控制台闪退,输出单词中包含空格等。这些都是自己不够细心和经验不足造成的。
代码及版本控制:HTTPS:https://git.coding.net/ZhangEJ/wf.git
SSH: git@git.coding.net:ZhangEJ/wf.git
GIT: git://git.coding.net/ZhangEJ/wf.git
浙公网安备 33010602011771号