第四次作业——结对编程

落花浮王杯 提交于 2019-12-01 04:49:49

 一、合作 :

github项目地址https://github.com/Shen-MoMo/WordCount 

合作同学作业地址:

结对成员学号:201731062502 ,201731041215


 

二、PSP表格:

PSP2.1

Personal Software Process Stages

预估耗时(分钟)

实际耗时(分钟)

Planning

计划

 

 

· Estimate

· 估计这个任务需要多少时间

 30

 30

Development

开发

 

 

· Analysis

· 需求分析 (包括学习新技术)

 60

 60

· Design Spec

· 生成设计文档

 30

 30

· Design Review

· 设计复审 (和同事审核设计文档)

 30

 30

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

 10

 10

· Design

· 具体设计

 30

 120

· Coding

· 具体编码

 60

 120

· Code Review

· 代码复审

 30

 90

· Test

· 测试(自我测试,修改代码,提交修改)

 60

 120

Reporting

报告

 

 

· Test Report

· 测试报告

 30

 30

· Size Measurement

· 计算工作量

 30

 30

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

 30

 30

 

合计

 430

 700

PSP表格在记录项目完成进度上很有帮助,可以让成员清晰的看到进度与每个进程的花费时间,在项目开始之前,预估时间也是对本次此项目的一个时间安排,但是往往预估的时间都比我们实际话费的时间时间更少。

三、计算模块接口的设计与实现过程:

1、项目需求:

  • 统计字符数
  • 统计单词数
  • 统计行数
  • 统计结果以指定格式输出到默认文件中
  • 其他扩展功能

2、我的思路:

(我只做了两个功能,搭档做了另外两个)

  • 首先对文件内容的提取,采用C#提供的库函数:FileStream,使用时注意文件路径编写
  • 然后我负责完成统计文件中的字符数字个数,和文件行数,
  • 在编写getChacactor()函数时,得到文件内容,通过ReadLine()方法将文件内容读取并存入字符串中,然后利用ascii码值在0-127之间的作为字符,这样排除了中文,设置count变量,如果他的ascii在0-127之间就复合要求
  • 在编写getRows()函数时,用文件流StreamReader方式读取文件,保存读取内容,定义‘\n’为跳过标志,用Split()对保存内容按跳过的字符类型,分割成字符串,最后统计这个字符串的长度

3、流程图:

 

 

四、代码复审:

代码复审过程中,我查看了最初制定的代码规范,对比编程过程,命名采用驼峰命名法,不使用缩写形式,使用tab作为缩进,大小为4,在关键地方写上注释,这更便于理解;

在编写过程中,最初忽略了中文不算字符这个条件,就直接用ToString()函数获取字符串长度,没有加条件判断,导致最后返回的结果算上了中文,在代码复查过程中,我利用Ascii值0-127这一条件进行判断,排除了这个问题;

错误的:

FileStream fs = new FileStream(fileName, FileMode.Open);//打开文件
            string str = Convert.ToString(fs.Length);
            fs.Close();                                      
            Console.Write("字符统计成功!\n");
            return int.

 错误结果:


正确的:

while ((str = fs.ReadLine()) != null)
            {
                for (i = 0; i < str.Length; i++)
                {
                    if (str[i] >= 0 && str[i] <= 127)
                    {
                       // Console.Write(str[i]);
                        count++;
                    }
                }
            }

正确结果:

审查个功能代码:

统计字符功能

public static int getChacactor(string fileName)
        {
            int count = 0;
            

         
            //统计字符数的方法 
            int i, count;
            count = 0;
            //打开文件
            StreamReader fs = new StreamReader(fileName);
            string str = null;
            while ((str = fs.ReadLine()) != null)
            {
                for (i = 0; i < str.Length; i++)
                {
                    if (str[i] >= 0 && str[i] <= 127)
                    {
                        // Console.Write(str[i]);
                        count++;
                    }
                }
            }
            fs.Close();
            Console.Write("字符统计成功!\n");
            Console.Write("characters:" + count + "\n");
            return count;
        }

统计行数功能:

public static int getRows(string fileName)
        {
            //统计行数的方法         
            FileStream fs = new FileStream(fileName, FileMode.Open);//打开文件
            StreamReader sr = new StreamReader(fs, Encoding.Default);//用特定方式读取文件中信息
            string s = sr.ReadToEnd();//读出所有信息
            fs.Close();
            sr.Close();
            char[] c = { '\n' };//定义跳过的字符类型,换行符
            string[] words = s.Split(c, StringSplitOptions.RemoveEmptyEntries);//将读出的信息按跳过的字符类型,分割成字符串
            Console.Write("行数统计成功\n");
            Console.Write("lines:" + words.Length + "\n");
            return words.Length;//返回字符串的个数,即行数          
        }

统计单词功能:

public static int totalWord(string fileName)
        {
            //统计单词的总数
            FileStream fs = new FileStream(fileName, FileMode.Open);//打开文件
            StreamReader sr = new StreamReader(fs, Encoding.Default);
            string s = sr.ReadToEnd();//读取所有信息
            Regex rg = new Regex("[A-Za-z-]+");//用正则表达式匹配单词
            MatchCollection mc;//通过正则表达式所找到的成功匹配的集合
            mc = rg.Matches(s);
            fs.Close();
            sr.Close();
            Console.Write("words:" + mc.Count + "\n");
            return mc.Count;
        } 

统计频率功能:

public static Hashtable countWord(string fileName)
        {
            //统计单个单词的出现次数
            FileStream fs = new FileStream(fileName, FileMode.Open);//打开文件
            StreamReader sr = new StreamReader(fs, Encoding.Default);
            string s = sr.ReadToEnd();//读取所有信息

            Regex rg = new Regex("[A-Za-z-]+");//用正则表达式匹配单词
            MatchCollection mc;//通过正则表达式所找到的成功匹配的集合
            mc = rg.Matches(s);
            Hashtable wordList = new Hashtable();
            for (int i = 0; i < mc.Count; i++)
            {
                string mcTmp = mc[i].Value.ToLower();//大小写不敏感
                if (mcTmp.Length >= 4)
                {
                    if (!wordList.ContainsKey(mcTmp))//第一次出现的单词添加为key
                    {
                        wordList.Add(mcTmp, 1);
                    }
                    else
                    {
                        int value = (int)wordList[mcTmp];
                        value++;
                        wordList[mcTmp] = value;
                    }
                }
            }

五、单元测试展示:

 测试指定文件路径:

cpu性能分析图:

cpu采样:

 

 

 

 

六、 异常处理说明:

 

 

七、描述结对的过程:

  • 刚开始结对的时候,我们先是明确了项目功能,主要有四大功能模块
  • 两人进行分工,我完成的是字符统计和行数统计,搭档完成的是单词统计和top10的单词
  • 明确各自任务后,我们制定了PSP表格,预计每个模块花费的时间,由于大家都缺乏项目经验,不能做到准确估计,所以有些偏差
  • 接下来各自进行编码
  • 完成后,上传github,合并代码
  • 进行性能优化和单元测试
  • 分析并处理异常
  • 最后任务完成,编写博客

 

 

 

八、附加功能:

窗体应用:当用户输入字符串的时候,没有输入Program里面的指令信息的时候,同样可以统计出字符串中的字符个数单词个数,以及频率前10的单词

具体代码如下:

 

九、总结:

非常感谢我的搭档,他做了很多代码优化,也是他完成的附加功能。通过这次个人项目,我也收获了很多,比如程序的设计实现需要先设计再去实现,设计和编译一样重要,完成任何一个程序,需要实现设计方案,避免后面的错误和程序不完善等问题。同时,代码的测试也占有相当的比例,通过各方面的测试避免程序出现错误和对用户体验度的完善。最后,完成一个完整的程序的时候,一定的代码功底就显得尤为重要,这是需要不停积累与练习的。

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!