zoukankan      html  css  js  c++  java
  • 第二周博客作业二

    作业要求来自: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 += "
    ";//换行
    57             }
    58             Console.WriteLine("total {0}
    ", 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/   

  • 相关阅读:
    笔记35 跨重定向请求传递数
    判断邮箱的正则表达式
    按钮
    async await 的用法
    笔记34 Spring MVC的高级技术——处理multipart形式的数据
    Convert Sorted Array to Binary Search Tree
    Binary Tree Zigzag Level Order Traversal
    Unique Binary Search Trees,Unique Binary Search Trees II
    Validate Binary Search Tree
    Populating Next Right Pointers in Each Node,Populating Next Right Pointers in Each Node II
  • 原文地址:https://www.cnblogs.com/wangc034/p/7535868.html
Copyright © 2011-2022 走看看