第二周博客作业二

作业要求来自:https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/922

介绍上述“项目”中每个功能的重点/难点,展示重要代码片断,展示你感觉得意、突破、困难的地方。

 

代码及版本控制

git地址:https://git.coding.net/SuperCodingChao/wfProject.git

功能1 重点:
  • 控制台输入命令 wf -s test.txt (难点)命令行参数
  • 读取文件并判断有多少单词并且保存不同的单词和出现的次数。(难点)
  • 输出结果
  首先我在图书馆借了关于C#的书,挑选了字符串处理和文件读写的部分看了。但是由于无法统计每个单词出现的次数,我想可能有类似C++的set集合或者map映射功能的数据类型。但是书上似乎没有具体的方法,然后我在百度搜到了一个字符串统计的算法,是两段程序,我能够理解程序的意思,然后复制到主函数里面简单修改了一下输出格式。来源博客地址是:http://blog.csdn.net/itbuluoge/article/details/19917099 我把它放在WordCount类中,简单修改了之后代码如下:
 1 class WordCount
 2     {
 3         public string txtName;
 4         public void getTxtName(string fileName)
 5         {
 6             txtName = fileName;
 7         }
 8         public void CountMethod(string fileName)//处理文件中字符统计
 9         {
10             //StreamReader sr = new StreamReader("a.txt");
11             //string content = sr.ReadToEnd();
12             string content = File.ReadAllText(fileName);//读取文件内容保存字符串
13             int len;
14             int maxlen = 1;//初始化记录最长的单词,以便于输出时对齐
15             Dictionary<string, int> gethotstring(string cnt)
16             {
17                 //使用Dictionary泛型,键值对,记录每个单词出现的次数,构成字典
18                 Dictionary<string, int> HOT = new Dictionary<string, int>();
19                 //用delimiters数组来分割字符串
20                 char[] delimiters = { ' ', '!', ',', ':', '.', '"', ';' };
21                 
22                 string[] s = cnt.Split(delimiters, StringSplitOptions.RemoveEmptyEntries); 
23                 len = s.Length;//总共的单词数目
24                 for (int i = 0; i < len; i++)//遍历每个单词
25                 {
26                     if (HOT.ContainsKey(s[i]))//如果在字典中出现过
27                     {
28                         HOT[s[i]]++;//该单词出现的次数+1
29                     }
30                     else
31                     {
32                         HOT[s[i]] = 1;//否则在字典中加入单词,次数为1
33                     }
34                     if (s[i].Length > maxlen) maxlen = s[i].Length;//更新最长的单词串长
35                 }
36                 //返回字典,按照出现次数降序排序
37                 return HOT.OrderByDescending(r => r.Value).ToDictionary(r => r.Key, r => r.Value);
38             }
39             Dictionary<string, int> MEWHOT = gethotstring(content);
40 
41             string output = null;//保存输出的结果字符串
42             //遍历字典  
43             int size = 0;//记录输出的单词个数
44             foreach (KeyValuePair<string, int> kvp in MEWHOT)
45             {
46                 size++;
47                 if (size > 10) break;//只输出top 10多的单词及其出现次数
48 
49                 output += kvp.Key;//单词
50 
51                 //拼接空格,对齐
52                 for (int i = 1; i <= 12 - kvp.Key.Length; i++)
53                     output += " ";
54                 //拼接出现次数
55                 output += kvp.Value.ToString();//转化成字符串
56                 output += "\n";//换行
57             }
58             Console.WriteLine("total {0}\n", MEWHOT.Count);//输出字典词数
59             Console.WriteLine(output);//输出统计结果
60         }
61 }
View Code
  但是如果再让我编写一遍没有参考还是写不出来的。不过功能实现了。这个功能花了4个小时,我一开始并没有估计完成这个功能花费的时间。也不清楚到底多久可以做出来,只是先一点点做。可能因为这个问题没有很难,我又搜到了核心代码,所以比较顺利。
 
功能2 支持命令行输入英文作品的文件名,请老五亲自录入。实现了功能1 ,只要在功能1的基础上 字符串拼接 文件名+“txt”即可。
功能3 支持命令行输入存储有英文作品文件的目录名,批量统计。难点是文件夹的读取,遍历文件夹下面的txt文档。另外1、2、3异常处理并没有实现,地址或者文件名不合法不存在的情况,VS直接运行会出错。
功能4 从控制台读入英文单篇作品。这个输入文章内容还比较好实现,可是第一种输入重定向的输入没懂什么意思。需要学习新的知识点。耗时大。最终我放弃实现第一种,而是实现了第二种输入。  
运行结果截图:
困难:版本控制、git的使用,对分支的理解让我困扰很久。我本来以为老师说的版本控制是要4个功能分别是四个版本,我在创建远程分支之后不清楚本地分支和远程的关系,我应该在哪里修改代码。后来问了一个比较懂git的同学,他看了作业要求之后提醒了我,这个功能应该是在一个程序里面实现的。然后我有了新的思路。重新建了一个项目,把之前写好的功能1、2写在了一个程序里面,通过输入参数的不同作为分支条件判断应该如何处理。
得意和突破:把之前写好的统计单词数的代码封装到类中,在每个分支语句中使用这个类就可以了。对类的理解加深了一点。
 

 PSP阶段表格

PSP阶段 预计花费时间 第一次实际花费时间 第二次实际花费时间
功能1 未预估时间 总花费3h58min

35+42=77min

  • 文件读取和字符统计函数
-- --  
  • 输出结果
-- --  
  • 命令行参数读入处理
-- --  
  • 版本控制
-- -- 42min
功能2 55min
56min+26min=82
5min
  • 学习创建项目分支,版本控制
30min 7min  
  • 在功能1基础上修改输入
5min 5min  
  • 测试功能2 改bug
10min 3+26  
  • 版本控制
10min 41min  
功能3 33min 57+26=83min 19min
  • 修改输入代码:文件夹的读取、遍历文件夹下面的txt文档
15min    
  • 测试,改bug
5min    
  • 版本控制
3min 57min,其他26min  
  • 异常处理
10min    
功能4 43min  -- 36min
  • 需求分析和学习
15min    
  • 编码
15min    
  • 测试改bug
10min    
  • 版本控制
3min   7min

2017年9月18日08:22添加:

  对比分析我的估计时间和实际完成时间,还有第二次做的时间。我在版本控制和命令行参数及“<”上用时很多,尤其是版本控制。一开始的想法有些问题,以为要做四个分支,然后自己不会四个分支分别上传,很困扰。后来重新做的时候在编码上快了很多,思路比较清晰,主要处理的就是命令行参数的问题,不过这时的版本控制仍然是问题。因为新建了仓库,本地上传到远程仓库开始的命令又不记得了,之前做的时候也没有总结,试错了很多命令,然后又去搜索教程。所以第二次做的时候没有第一次用时那么多,相对顺利些,在编码上错误很少,测试在我感觉也比较快。本来想功能四都完成的,但是bing了之后也没搞懂“<”的作用在程序里面要怎么处理。所以还是只实现了其一功能。

2017年9月18日21:49添加:

  老师在微信群中有评论到我,我又继续查了一下“linux重定向”,“<”是输入重定向,就是说输入数据从重定向的文件中读取。然后我改了代码运行如下:

后来搜索了索引数组越界的情况,发现自己分支判断顺序有误,应该先判断命令行参数是否是0,是0的情况下,就是功能4,直接输入就好。否则要判断索引数组的不同输入情况,因为我按照顺序判断输入,当没有参数时,if语句访问args[0]自然就越界错误了。

改正后运行结果如下:

 功能4第一种重定向到文件,test就是文件的名称,没有后缀。有后缀的文件要加后缀。

后来测试发现wf -s  test.txt 功能1都出错了,非常纳闷!后来一顿改,才想到因为我忘记我把test.txt的后缀删除了,没有这个文件了!后来恢复了git上commit的代码,教程来源记录一下吧→http://linjunzhu.github.io/blog/2014/10/24/git-resume/   

posted @ 2017-09-17 15:56  王超_nenu  阅读(288)  评论(0编辑  收藏  举报