第二周博客作业二
2017-09-17 15:56
309 查看
作业要求来自: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 |
对比分析我的估计时间和实际完成时间,还有第二次做的时间。我在版本控制和命令行参数及“<”上用时很多,尤其是版本控制。一开始的想法有些问题,以为要做四个分支,然后自己不会四个分支分别上传,很困扰。后来重新做的时候在编码上快了很多,思路比较清晰,主要处理的就是命令行参数的问题,不过这时的版本控制仍然是问题。因为新建了仓库,本地上传到远程仓库开始的命令又不记得了,之前做的时候也没有总结,试错了很多命令,然后又去搜索教程。所以第二次做的时候没有第一次用时那么多,相对顺利些,在编码上错误很少,测试在我感觉也比较快。本来想功能四都完成的,但是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/
相关文章推荐
- 算法课程Leetcode作业第二周技术博客
- 20162316刘诚昊 第二周博客作业
- C语言博客作业--函数
- C语言博客作业--函数
- 博客作业:lvm基本应用,扩展及缩减实现;
- Linux系统管理 博客作业 (一) LVM
- Java课程设计——博客作业教学数据分析系统(201521123084 林正晟)
- 第二周作业(三)
- linux第二周作业
- 【Linux基础】第二周作业
- 第二周作业 3
- 第二周作业
- 第二周作业
- 第二周作业
- linux 作业第二周
- C语言博客作业--数据类型
- 马哥2016全新Linux+Python高端运维班第二周作业
- C语言博客作业--数据类型
- C语言博客作业--数据类型
- 2017-2018-1 20155228 《信息安全系统设计基础》第二周课堂测试与课后作业