• 软件工程:java实现wc项目基本功能


    项目相关要求

    项目地址:https://github.com/xiawork/wcwork
    实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。
    具体功能要求:

    基本功能列表:

      wc.exe -c file.c //返回文件 file.c 的字符数

      wc.exe -w file.c //返回文件 file.c 的词的数目

      wc.exe -l file.c //返回文件 file.c 的行数

    扩展功能:

      -s 递归处理目录下符合条件的文件。

      -a 返回更复杂的数据(代码行 / 空行 / 注释行)。

    空行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。

    代码行:本行包括多于一个字符的代码。

    注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:

    高级功能:

      -x 参数。这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。

      返回当前目录及子目录中所有*.c 文件的代码行数、空行数、注释行数。

    PSP

    PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
    Planning 计划 60 90
    · Estimate · 估计这个任务需要多少时间 60 120
    Development 开发 900 1360
    · Analysis · 需求分析 (包括学习新技术) 60 90
    · Design Spec · 生成设计文档 30 50
    · Design Review · 设计复审 (和同事审核设计文档) 30 40
    · Coding Standard · 代码规范 (为目前的开发制定合适的规范) 20 15
    · Design · 具体设计 60 40
    · Coding · 具体编码 200 210
    · Code Review · 代码复审 30 40
    · Test · 测试(自我测试,修改代码,提交修改) 100 110
    Reporting 报告 120 150
    · Test Report · 测试报告 60 80
    · Size Measurement · 计算工作量 30 40
    · Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 60 20
    合计 1760 2455

    解题思路:

    程序首先通过编写控制台,通过输入的文件路径获得文件,然后通过BuffeInputStream和FileReader对文件进行操作,获得文件具体对象,
    通过这个对象给予我们的内容,在另一个方法类里调用相应的方法创建获取字符数,单词数,总行数的方法readcharacter(),readword(),readline(),
    然后通过main函数运行,得出所要结果。

    困难和解决

    在设计方法时,使用正则表达式不准确,经常出现格式错误,后面通过大量搜集查找相关问题,初步解决了格式出错的问题
    在文件目录输入过程中,忘记了控制台的编写,导致后面常出现编译成功,但是没有文件输入这功能
    在文件调用过程中不熟悉具体内涵,对一些操作总是不明了

    设计思路

    本项目包含两个类,一个是包含主方法的wc类,一个是包含方法功能的fuctionn类。

    Wc的main函数表示

    public static void main(String[] args) throws IOException {
        File file=fuction.getFile();    //获取文件
        BufferedInputStream bis=new BufferedInputStream(new FileInputStream(file)); //读取文件 
        FileReader reader = new FileReader(file);
        int fileLen = (int)file.length();
        char[] chars = new char[fileLen];  
        reader.read(chars);
        String txt = String.valueOf(chars);
        System.out.println("请输入命令:"); 
     Scanner sc=new Scanner(System.in);  //创建键盘录入对象
        String line = sc.nextLine();       //具体输入实例对象
        switch(line) {
        case"-l":
        	fuction.readline(txt); 
        	break;
        case"-w":
        	fuction.readword(txt);
        	break;
        case"-c":
        	fuction.readcharacter(txt);
        	break;
        } 
        bis.close();       //关流释放资源
    }
    

    fuction类中的getfile()方法

    public static File getFile() {
    		    System.out.println("请录入一个文件路径:");  
    	        Scanner sc=new Scanner(System.in);   //创建键盘录入对象
    	        while(true) {
    	            String line=sc.nextLine();     // 接收键盘录入的路径
    	            File file=new File(line);       //封装成File对象,对其进行判断
                        if(!file.exists()) {
    	            System.out.println("您录入的文件路径不存在,请重新录入");
    	            }else if(file.isDirectory()) {
    	                System.out.println("你录入的是文件夹路径,请重新录入");
    	            }else {
                           return file;	
    	            }
    	      }
    	}
    

    fuction中的readline()方法

    用正则表达式,将文件内容分割成一个个的数组,再通过对数组的操作得到想要的结果

    public static void readline(String file){
    		   String[] array = file.split("
    ");
    		   int len = array.length;
    		   System.out.print("代码行数为:" + len);
    	  }
    

    fuction中的readword()方法

    public static void readword(String file) {
    		int i;
    		String[] array = file.split("\s+");
    		   int len = array.length;
    		   System.out.print("单词数为:" + len);
    	}
    

    fuction中的readcharacter()方法

     public static void readcharacter(String file) {
    		  int i;
    			String[] array = file.split("\w");
    			   int len = array.length;
    			   System.out.print("字符数为:" + len);
    	}
    
    

    测试结果




    代码覆盖率

    总结

    通过这次项目的练习,我发现我对编写过程的不熟悉,编程语言的基础很薄弱,有很多的编程常识都不清楚,很多东西都要学习,很多以前学习过的基本内容也要重新学习一遍,第一次写项目,对这个过程很不熟悉,也因此花费了许多不必要的时间,所幸通过身边同学们的帮助,让我的项目进程有所推进,而在这个过程中,我也学习到了很多的知识,对项目开发这类多少也有了些许的经验。以后我也也需要多多努力,尽力的提升自己。

  • 相关阅读:
    Checking Types Against the Real World in TypeScript
    nexus pip proxy config
    go.rice 强大灵活的golang 静态资源嵌入包
    几个golang 静态资源嵌入包
    rpm 子包创建学习
    Rpm Creating Subpackages
    ava 类似jest snapshot 功能试用
    ava js 测试框架基本试用
    The Architectural Principles Behind Vrbo’s GraphQL Implementation
    graphql-compose graphql schema 生成工具集
  • 原文地址:https://www.cnblogs.com/4702ace/p/9647997.html
Copyright © 2020-2023  润新知