作业要求:《实验二 软件工程个人项目》

本项目Github的仓库主页

1. 需求分析

本次实验要求使用JAVA编程语言,独立完成一个英文文本词频统计的软件开发。
该程序要求实现:

  • 要求能够读入任意英文文本文件,该文件中英文词数大于等于一个;
  • 要能够容纳英文原版《哈利波特》10万词以上的文章;
  • 要有指定单词的词频统计功能,即用户可输入从该文本中想要查找词频的一个或任意多个英文单词,运行程序的统计功能可显示对应单词在文本中出现的次数和柱状图;
  • 高频单词统计功能,即用户共键盘输入高频词输出个数k,运行程序统计功能,可按文本中词频数降序显示前k个单词的词频及单词;
  • 统计该文本所有单词数量及词频数,并能将单词及词频数按字典顺序输出到文件result.txt

2. 功能设计

根据需求分析中提到的内容,本程序中设计以下几个功能:

  • 统计文件中所有单词及其词频数,且输出到指定文件;
  • 统计指定单词在文件中出现的次数;
  • 输出前K个高频词的个数及其柱状图;

程序流程图:

3. 设计实现

本程序包含四个类,包括一个主函数Main.java和三个功能类,分别是Count1.java,Count1.java,Count1.java主程序主要是用来控制程序的整个流程,用户输入不同的功能选项,来调用这三个功能。三个类的功能分别是:

  • Count1.java:该类是用来实现对指定文件中所有单词及其词频进行统计功能的,统计完成后并将统计结果输出到指定文件中。
  • Count2.java:该类是用来实现用户从键盘输入任意一个单词,查询并统计该单词在文件中出现的次数功能的,若查询的该单词不存在则显示提示信息。
  • Count3.java:该类是用来实现统计用户指定任意个数的高频词频及其柱状图功能的。

4. 测试运行

  • 本程序主界面显示如下:

  • 功能选项1测试:

    选择选项1,显示文件中所有单词个数及其词频统计结果,并将结果输出到指定文件中。

  • 功能选项2测试:

    用户任意输入想要在文件中查询的单词,查询并显示结果,若该文件中不存在该单词则提示错误信息。

  • 功能选项3测试:

    用户输入想要查询统计的任意个数K个高频单词,查询成功则显示单词词频及其柱状图

    若输入查询个数为不在有效范围内(负数或者大于文中单词类型个数),则提示相应的错误信息。

  • 功能选项4:

    退出程序,不在输出菜单。

5. 代码片段

  • 读取指定文件
    String filecontent = "";//用来存放读取到的文件内容信息//用键值对分别存储单词和它出现的次数Map<String,Integer> map = new HashMap<String, Integer>();try {//读取指定文件DATA.txt,这里使用的是相对路径
//          FileInputStream fis = new FileInputStream("J:\\计算机科学与技术\\02 第二学期\\2  软件工程(代祖华)\\实验二 词频统计\\DATA.txt");FileInputStream fis = new FileInputStream("src\\DATA.txt");//创建BufferedReader的缓冲流,一次性读取很多数据,然后按要求分次交给上层调用者BufferedReader br = new BufferedReader(new InputStreamReader(fis));String str = "";try {//一行一行读取while ((str = br.readLine()) != null){filecontent = filecontent + str;}} catch (IOException e) {e.printStackTrace();}}catch (FileNotFoundException e){e.printStackTrace();}
  • 分割字符串并统计键值对
        //arrspilt数组用来统计单词出现的次数String [] arrspilt = filecontent.split("[^a-zA-Z]+");for (int i=0;i<arrspilt.length;i++){//通过键名来获取键值if (map.get(arrspilt[i]) == null){//统计键值对map.put(arrspilt[i],1);}else {int count = map.get(arrspilt[i]);map.put(arrspilt[i],++count);}}
  • 对词频统计结果进行排序
        //利用TreeMap实现Comparator接口Comparator<Map.Entry<String, Integer>> valcom = new Comparator<Map.Entry<String,Integer>>() {//对词频统计结果进行排序public int compare(Map.Entry<String, Integer> rst1,Map.Entry<String, Integer> rst2) {//降序排序int sortrst=rst2.getValue()-rst1.getValue();return sortrst;} };List<Map.Entry<String, Integer>> ordlist = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());// 用sort函数来排序Collections.sort(ordlist,valcom);
  • 将词频统计结果输出到指定文件results.txt中
                                //将词频统计结果输出到指定文件results.txt中try {FileWriter fw= new FileWriter("src\\results.txt");BufferedWriter bw= new BufferedWriter(fw); for (Map.Entry<String, Integer> entry : ordlist) {bw.write(entry.getKey() + ":" + entry.getValue());  bw.newLine();}bw.flush();//刷新bw.close();//关闭System.out.println("词频统计结果已输出到result.txt文件!");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}
  • 统计任意单词在文件中出现次数
                                List<Map.Entry<String, Integer>> ordlist = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());// 用sort函数来排序Collections.sort(ordlist,valcom);Scanner sc = new Scanner(System.in); System.out.println("请输入想要统计出现在文章中的单词:"); String w = sc.next();for (Map.Entry<String, Integer> entry : ordlist) {if(entry.getKey().equals(w)){//找到文件中与键盘录入单词相同的单词word=entry.getKey();count2=entry.getValue();flag=1;break;}else{flag=0;}}if(flag==1){System.out.println("该单词"+word+"出现的个数为:"+count2);    }else{System.out.println("对不起文章中没有出现该单词!");}
  • 显示K个高频词及其柱状图
            System.out.println("注:该文件中共有"+ordlist.size()+"个不同的单词!");Scanner sc = new Scanner(System.in); System.out.println("请输入要查看的高频词频的个数:"); int k = sc.nextInt();//String k=sc.next();//System.out.println(list.size());if(k>0&&k<=ordlist.size())//判断输入值是否超出范围{System.out.println("----------词频最高的前"+k+"个单词及其柱状图-----------");for (Map.Entry<String, Integer> entry : ordlist) {//System.out.println("单词 "+entry.getKey() + " 出现 " + entry.getValue()+" 次 ");System.out.printf("单词 "+"%-8s" + "出现 " +"%-3d"+" 次 |",entry.getKey(),entry.getValue()); //用符号个数来模拟柱状图for(int i=entry.getValue();i>0;i--){System.out.print("⬛");}System.out.println();//System.out.println(entry.getKey() + ":" + entry.getValue());if(--k==0)break;//如果k==0则不再输出后面的词频                    }System.out.println("------------------------------------------------"); }else{System.out.println("输入有误!请重新输入!");}

6. 总结:设计的程序如何实现软件设计模块化的原则

模块化程序设计是指在进行程序设计时将一个大程序按照功能划分为若干小程序模块,每个小程序模块完成一个确定的功能,并在这些模块之间建立必要的联系,通过模块的互相协作完成整个功能的程序设计方法。

在本程序中,需要实现全文单词个数及其词频统计,用户输入任意单词词频统计和任意个数高频词频统计及柱状图显示等多个功能,虽然这个程序只是一个小程序,但却也包含多个功能,如果我们将这若干个功能放在一个文件中,就会显得很臃肿,凌乱和复杂,在调试和维护时也很麻烦,最好的方式就是一个功能一个文件,将功能分散开来,用主程序,子程序等框架把软件的主要结构和流程描述出来,并定义和调试各部分模块,再通过主函数来实现对其他功能的调用,以功能块为单位进行程序设计,这样降低录了程序复杂度,使程序设计,调试等操作简单化。

7. PSP个人软件过程

PSP2.1 任务内容 计划共完成需要的时间(min) 实际完成需要的时间(min)
Planning 计划 10 10
•Estimate • 估计这个任务需要多少时间,并规划大致工作步骤 10 10
Development 开发 255 295
••Analysis 需求分析 (包括学习新技术) 10 15
•Design Spec • 生成设计文档 5 7
•Design Review • 设计复审 (和同事审核设计文档) 5 7
•Coding Standard 代码规范 (为目前的开发制定合适的规范) 5 6
•Design 具体设计 10 10
•Coding 具体编码 200 220
•Code Review • 代码复审 5 10
•Test • 测试(自我测试,修改代码,提交修改) 15 20
Reporting 报告 13 15
••Test Report • 测试报告 4 3
•Size Measurement 计算工作量 4 4
•Postmortem & Process Improvement Plan • 事后总结 ,并提出过程改进计划 5 8

从本次这个词频统计程序的开发过程来看,我在做这项工作时是用来不少的时间,尤其是在开发过程中的编码设计阶段,由于很长时间没有再写代码,关于java好多知识都忘得差不多了,所以在编码时需要耗费时间来查资料,来纠错改错,但也基本完成了本次任务,看来日后要多加强代码的编写练习。

转载于:https://www.cnblogs.com/HaiYou667-GJ/p/10549413.html

201671010412 郭佳 实验二 软件工程个人项目相关推荐

  1. 201671010434王雯涵--实验二 软件工程个人项目

    作业要求:实验二 软件工程个人项目 本项目完成的代码 1.软件定义 ※程序可读入任意英文文本文件,该文件中英文词数大于等于1个,统计该文本所有单词数量及词频数,并能将单词及词频数按字典顺序输出到文件r ...

  2. 实验二 软件工程个人项目

    任务1源码在Github的仓库主页链接地址:https://github.com/bang888/szys 需求分析: 接收参数n 生成练习题 每个练习题中运算符不少于2种,数字在0到100之间 运算 ...

  3. 实验三 软件工程结对项目

    Deadline:2018-4-4 10:00,以博客发表日期为准 评分标准: 按时交 - 有分(满分30分,代码和博客各15分),检查项目包括: -  未提交项目源码到Github上,代码部分不得分 ...

  4. 201671010447杨露露 实验四软件工程结对项目

    一:作业点评 点评内容: 评价博文链接:https://www.cnblogs.com/runju/p/10558809.html 1.缺点:博文结构不太清晰,排版可以在美化一些,博文的内容中对程序功 ...

  5. 201671010412 郭佳 实验四附加实验

    实验四附加实验 问题编号 问题描述 这个作业属于哪个课程 软件工程任教教师 实验四附加实验 项目互评 点评1博客地址 201671010445杨爱婷<英文文本统计分析>结对项目报告 点评2 ...

  6. 201671010412 郭佳 实验三 作业互评与改进

    任务一:作业互评 1.  2019春季计算机学院软件工程(罗杰)(北京航空航天大学) 评论链接:<BUAA软工 -- 第一次阅读作业> https://www.cnblogs.com/fo ...

  7. 实验二 词频统计软件项目报告

    实验要求 实验二 软件工程个人项目 GitHib链接 https://github.com/Z-zt/Count 一.需求分析 通过分析实验二题目要求,得出的用户需求主要为: 程序可读入任意英文文本文 ...

  8. 201671010456-张琼 实验十四 团队项目评审课程学习总结

    博文简要信息表 项目 内容 这个作业属于哪个课程 http://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu- ...

  9. 201671030111 李蓉 实验十四 团队项目评审课程学习总结

    项目 内容 这个作业属于哪个课程 软件工程 这个作业的要求在哪里 实验十四 团队项目评审&课程学习总结 作业学习目标 掌握软件项目评审会流程,反思总结课程学习内容. 任务一:结合本学期课程学习 ...

最新文章

  1. anaconda应答文件
  2. url特殊字符转义及解决方法
  3. poj 3281(最大流)
  4. 联合查询是要多创建一个实体类么_[译] 如何用 Room 处理一对一,一对多,多对多关系?...
  5. ssrs报表服务器数据库配置文件,创建报表服务器数据库(SSRS 配置管理器)
  6. Netty框架整体架构及源码知识点
  7. 【报错笔记】MAVEN pom.xml 报错解决方法
  8. 拼接字符串去掉最后多余的串,JSON的遍历
  9. burp爆破线程设置多少_你知道线程池创建多少线程比较合理吗?
  10. C#中HTML和UBB互相转换的代码
  11. U盘的针脚板竟然掉了
  12. jdbc连接linux下的mysql_Linux JDBC连接MySQL数据库
  13. 适合小孩接触编程起步的几款软件,从游戏中学习编程
  14. 北斗卫星轨道有哪些?
  15. CUDA学习:Windows下的CUDA环境配置
  16. Celery定时任务
  17. 【日常积累】实验室作业Socket实现多个客户端相互通信。
  18. n个骰子的点数 java_《剑指Offer》60:n个骰子的点数
  19. 利用docker搭建在线Markdown服务器
  20. Python列表元素个数的加权和

热门文章

  1. sklearn中的决策树(回归)
  2. Android_8.1 Log 系统源码分析
  3. ecg 幅度_ECG原理与综述.ppt
  4. 2019年IT行业就业形势
  5. 网络常识:公网、私网、内网等
  6. 高性价比成磷酸铁锂杀手锏
  7. 博通二合一蓝牙android驱动,Broadcom 博通 蓝牙与无线网卡一体-蓝牙3.0版驱动 for xp...
  8. 北京“新城卓越”黑中介租房感受
  9. 项目经理如何做好项目进度计划
  10. 【计算机网络】——习题解析:UDP 用户数据报的首部十六进制表示是:06 32 00 45 00 1C E2 17,试求源端口、目的端口、 用户数据报的总长度、数据部分长度等