词频统计-功能一
一.完成一个小程序
我 拿到这个题目之后,就决定用最不熟悉的c#来实现,因为老师说不懂的去学才会有进步。布置任务后的第二天就开始去图书馆借了两本书《c#从入门到精通》,《c#项目实战》,拿到书之后看了入门书《c#从入门到精通》,看书的过程是痛苦的,因为发现大二选修课学的c#全交还给老师了,只能重头再学了。唯一有点印象的就是窗口应用程序,基于UI的设计。
写代码首先需要工具,由于电脑上没有visual studio的安装包,当时求助了度娘。
如果没有安装包的同学们,可以借鉴一下这个链接http://blog.csdn.net/chunleixiahe/article/details/52874158,里面vs2003-2015的版本都有,推荐。由于网速问题,下载安装包都花费了半个小时。
看到题目,我就直接用Windows窗口程序完成了文件的查找,读取和统计字数,然后询问老师是否可以用Windows窗口程序完成,发现这次作业后续功能需要重定向输入,必须得做成控制台,否则无法做重定向输入。
编程中也遇到了很多问题,只能一步步看书和借助度娘来解决。
遇到的主要问题如下:
1.不知道c#对文件如何操作,如何查找文件,读取文件,输出文件的内容。
2.不知道如何统计文件中内容的字符,并且正确输出每个单词的出现的频数,后来实现这个小功能主要使用了哈希表,并对哈希表的值进行排序,然后遍历哈希表对每个单词出现的次数进行输出。
我的实现代码如下:
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace wf { class Program { static void Main(string[] args) { string theFileName; Console.Write(">type "); theFileName=Console.ReadLine(); string thePath = @"D:\vs2010\test.txt"; //string thePath = null; //Console.Write(">type "); //thePath = Console.ReadLine(); //StreamReader content = File.OpenText(thePath); //读取文件内容并输出 StreamReader reader = new StreamReader(thePath); string sline=reader.ReadLine(); Console.WriteLine(sline.ToString()); sline = sline.ToLower();//全部变为小写字母 //定义一个字符数组 char[] c = { ' ', ',', '.', '?', '!', ':', ';', '\'', '\"' }; //分隔字符串后产生的字符串数组 string[] S = sline.Split(c); //Console.WriteLine(); //Console.WriteLine(">wf -s test.txt"); // Console.WriteLine("total " + S.Length); //建立哈希表 Hashtable ha = new Hashtable(); for (int i = 0; i < S.Length; i++) { //判断文本是否进入 if (ha.ContainsKey(S[i])) { ha[S[i]] = (int)ha[S[i]] + 1; } else { ha.Add(S[i], 1); } } //int sum = 0; string[] arrKey = new string[ha.Count];//存哈希表的键 int[] arrValue = new int[ha.Count];//存哈希表的值 ha.Keys.CopyTo(arrKey, 0); ha.Values.CopyTo(arrValue, 0); Console.WriteLine(); Console.WriteLine(">wf -s test.txt"); Console.WriteLine("total " + ha.Count); Console.WriteLine(); Array.Sort(arrValue,arrKey);//按哈希表的值进行排序 //遍历哈希表 //foreach (DictionaryEntry de in ha) //{ //输出 // Console.WriteLine(de.Key + ":" + de.Value); //Console.Write(ha.Count); // } for (int i = arrKey.Length - 1; i >= 0; i--) { if ((string)arrKey[i] != "") { Console.Write(arrKey[i].ToString() + ":"); Console.WriteLine(arrValue[i].ToString()); } } } } }
实现的截图如下:
二.例行报告
1.PSP(personal software process)个人软件过程
类别 | 任务 | 开始时间 | 结束时间 | 打扰时间 | 净时间 |
借书 | 借书 | 2017.9.15 10:00 | 2017.9.15 10:20 | 无 | 20min |
看书 | 2017 9.15 12:20 | 2017.9.16 21:15 | n多打扰时间 |
<5h |
|
编程 | 写代码 | 2017 9.16 18:00 | 2017.9.16 21:30 | 洗漱30min,回复消息20min | 2h40min |
写作 | 写博客 | 2017.9.16 21:50 | 2017.9.16 22:30 | 无 | 40min |
2.进度条
代码行 | 博文字数 | 知识点 | |
第二周 | 83 | 800 | 见博客词频统计-功能一 |
三.修改格式
看到老师给出的样例是需要右对齐。
所以在输出部分修改了一行代码Console.Write(arrKey[i].ToString().PadRight(12) );
使得输出结果结果如下图
类别 | 任务 | 开始时间 | 结束时间 | 被打扰时间 | 净时间 |
编程 | 修改输出格式 | 2017.9.17 10:00 | 2017.9.17 10:24 | 聊天5min | 19min |