202103226-1 编程作业

标题

这个作业属于哪个课程 软件工程
这个作业要求在哪里 202103226-1 编程作业
这个作业的目标 学习使用码云,以及相关题目的编写
作业正文 正文
其他参考文献 参考了福州大学一些同学的思路

part1:WordCount编程

1.码云项目地址

2.PSP表格

PSP Personal Software Process tages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 1600 2520
Estimate 估计这个任务需要多少时间 1920 2520
Development 开发 300 600
Analysis 需求分析(包括学习新技术) 200 240
Design Spec 生成设计文档 30 40
Design Review 设计复审 30 30
Coding Standard 代码规范 (为目前的开发制定合适的规范) 30 30
Design 具体设计 200 220
Coding 具体编码 800 900
Code Review 代码复审 30 60
Test 测试(自我测试,修改代码,提交修改) 100 140
Reporting 报告 60 80
Test Repor 测试报告 60 70
Size Measurement 计算工作量 20 30
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 60 80
合计 1920 2520

3.解题思路描述

(1) 统计文件的字符数(对应输出第一行):

  • 只需要统计Ascii码,汉字不需考虑
  • 空格,水平制表符,换行符,均算字符
//将字符串转为char数组通过ascii码去除中文
                char[] chars = line.toCharArray();
                for (char c : chars) {
                    //去除中文ascii码范围
                    if (!(19968 <= c && c < 40869)) {
                        ++num;  //统计字符总数
                    }
                }

(2) 统计文件的单词总数(对应输出第二行),单词:至少以4个英文字母开头,跟上字母数字符号,单词以分隔符分割,不区分大小写。

  • 英文字母: A-Z,a-z
  • 字母数字符号:A-Z, a-z,0-9
  • 分割符:空格,非字母数字符号
  • 例:file123是一个单词, 123file不是一个单词。file,File和FILE是同一个单词

(3) 统计文件的有效行数(对应输出第三行):任何包含非空白字符的行,都需要统计。

(4) 统计文件中各单词的出现次数(对应输出接下来10行),最终只输出频率最高的10个。

  • 频率相同的单词,优先输出字典序靠前的单词。

      例如,windows95,windows98和windows2000同时出现时,则先输出windows2000
    
  • 输出的单词统一为小写格式

然后将统计结果输出到output.txt,输出的格式如下;其中word1和word2 对应具体的单词,number为统计出的个数;换行使用' ',编码统一使用UTF-8。

characters: number
words: number
lines: number
word1: number
word2: number
...

相关代码

 //先获取所有出现次数
            Collection<Integer> values = map.values();
            ArrayList<Integer> list = new ArrayList<>(values);
            //给出现次数从大到小排序
            list.sort((o1, o2) -> o2 - o1);
            System.out.println(list);
            //获取map中出现次数相等的并移除
            for (int i = 0; i < list.size() && i < 10; i++) {
                for (Map.Entry<String, Integer> entry : map.entrySet()) {
                    if (entry.getValue().equals(list.get(i))) {
                        System.out.println(entry.getKey() + " : " + entry.getValue());
                        map.remove(entry.getKey());
                        break;
                    }
                }
            }

思考及找资料过程:
思路 第一个 统计 非中文 字符 方法 查资料 中文 ascii 码范围 if(19968 <= c && c<40869)

4.代码规范制定链接

代码规范的链接

5.设计与实现过程

计算模块接口的设计与实现过程。 设计包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?说明你的算法的关键(展示出项目关键代码),并解释思路,以及独到之处。(20')

6.性能改进

这是最初始的代码,很多条件都没有考虑,简略的写一下,参考过许多人的思路。

public class wordcount {

        public static void main(String[] args) throws Exception{ 
            Scanner input=new Scanner(System.in); 
            System.out.println("请输入路径");
            String path=input.next(); 
            int charNum= 0 ;   
            int wordsNum= 0;    
            int lineNum = 0;    
            InputStreamReader isr = new InputStreamReader(new FileInputStream(path)); 
            BufferedReader br = new BufferedReader(isr); 
            while( br.read()!= -1){    //-1 代表为空文件  如果不为空就执行下面执行体
                String s = br.readLine(); //读取一行
                charNum+=s.length(); //字符数的叠加
                wordsNum +=s.split(" ").length; //调用split分割字符串 获取单词长度
                lineNum ++; 
            }
            isr.close();//关闭
            System.out.println("字符数:"+charNum+"	单词数:"+wordsNum+"行 数:"+lineNum); 
        }
}

7.单元测试

计算模块部分单元测试展示。

8.异常处理说明

9.心路历程与收获

很久没有敲代码了,大部分都忘记了,再加上对于未来的道路有了不一样的选择,作业对我而言简直是难上加难。太难受了,最后的完成,离不开大佬的指导。

原文地址:https://www.cnblogs.com/muxixixixi/p/14598971.html