码迷,mamicode.com
首页 > 其他好文 > 详细

Homework01

时间:2018-09-25 01:27:15      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:system.in   output   分析   evel   exti   存储   行数统计   adl   star   

一.码云地址(码云上传失败,正在解决中,提供GitHub地址)

二.PSP表格

PSP2.1

PSP阶段

预估耗时

(分钟)

实际耗时

(分钟)

Planning

计划

 30

 25

· Estimate

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

 300

 350

Development

开发

 240

 180

· Analysis

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

 30

 20

· Design Spec

· 生成设计文档

 30

 30

· Design Review

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

 0

 0

· Coding Standard

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

 0

 0

· Design

· 具体设计

 50

 30

· Coding

· 具体编码

 240

 180

· Code Review

· 代码复审

 50

 180

· Test

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

 30

 30

Reporting

报告

 200

 150

· Test Report

· 测试报告

 60

80 

· Size Measurement

· 计算工作量

 300

 400

· Postmortem & Process Improvement Plan

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

 40

 60

 

合计

 700

 600

三.需求功能分析

本项目主要基础功能是功能是实现文件的字符,单词数,行数统计。
WordCount的需求可以概括为:对程序设计语言源文件统计字符数、单词数、行数,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件。
可执行程序命名为:wc.exe,该程序处理用户需求的模式为:
wc.exe [parameter] [input_file_name]
存储统计结果的文件默认为result.txt,放在与wc.exe相同的目录下。

四.程序设计

对于文件的输入输出,Java语言提供了完善的io包,通过输入输出流的知识极易操作且安全有效的完成项目基础功能。
程序主要分为三个功能类,和主程序类。
技术分享图片
  • 三个功能类,分别实现统计文件字符数,单词数和行数。

技术分享图片

技术分享图片

技术分享图片

  • 主程序类主要完成对功能类的实例化和调用。

技术分享图片

五.具体编码

  • CountChar类,统计字符数
package WordCount;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CountChar {
    public int CharNum(String filePath) throws IOException {
        int charNumber=0;
        String line;
        File file=new File(filePath);
        //从文件中读取数据入字符输入缓冲流,为后续的字符操作提供缓冲功能
        FileReader fr = null;
        FileWriter fw=null;
        try {
            fr = new FileReader(file);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        BufferedReader br=new BufferedReader(fr);
        //将数据存入缓冲字符串
        StringBuffer sb=new StringBuffer();
        //将数据一行一行的存入字符串
        line=br.readLine();
        while(line!=null) {
            sb=sb.append(line);
            line=br.readLine();
        }
        String info=sb.toString();
        charNumber=info.length();
        br.close();
        try {
            fw=new FileWriter("D:\\eclipse\\Homework01\\workdata\\result.txt",true);
            fw.write(filePath+" "+"行数:"+charNumber);
            fw.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        ///错误实例,只能读入第一行数据并判断字符数。而后更改。
        /*if((line=br.readLine())!=null) {
            char[] ch=line.toCharArray();
            for(int i=0;i<ch.length;i++) {
                if(!Character.isWhitespace(ch[i])) {
                    charNumber++;
                }
            }
        }*/
        return charNumber;
}
}
  • CountWord类,统计单词数
package WordCount;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CountWord {
    public int countWord(String filePath) throws IOException {
        int wordNumber=0;
        String line;
        String [] saveWord;//字符串数组,存储分割的单词
        //从文件中读入数据
        File file=new File(filePath);
        FileReader fr=null;
        FileWriter fw=null;
        try {
            fr=new FileReader(file);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        BufferedReader br=new BufferedReader(fr);
        StringBuffer sb=new StringBuffer();
        //将全部数据存入缓冲字符串
        while((line=br.readLine())!=null) {
            sb.append(line);
        }
        //非字母字符全部用空格替换
        String str=sb.toString().replaceAll("[^a-zA-Z^]", " ");
        saveWord=str.split("\\s+");//匹配字符并进行分割
        wordNumber=saveWord.length;
        br.close();
        try {
            fw=new FileWriter("D:\\eclipse\\Homework01\\workdata\\result.txt",true);
            fw.write(filePath+" "+"行数:"+wordNumber);
            fw.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return wordNumber;
    }
}
  • CountLine类,统计行数
package WordCount;

import java.io.*;

public class CountLine {
    public int CountLine(String filePath) {
        int lineNumber=0;
        String line;
        //从文件中读入数据
        File file=new File(filePath);
        FileReader fr=null;
        FileWriter fw=null;
        try {
            fr=new FileReader(file);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        BufferedReader br=new BufferedReader(fr);
        //通过行数增加,判断行数。
        try {
            while((line=br.readLine())!=null) {
                lineNumber++;
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            br.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            fw=new FileWriter("D:\\eclipse\\Homework01\\workdata\\result.txt",true);
            fw.write(filePath+" "+"行数:"+lineNumber);
            fw.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return lineNumber;
    }
}
  • 主程序类
package WordCount;

import java.io.IOException;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Main {
        public static void main(String[] args)
        {
            CountChar cc=new CountChar();//实例化所需要的功能类
            CountLine cl=new CountLine();
            CountWord cw=new CountWord();
            String filePath="D:\\eclipse\\Homework01\\workdata\\test1.txt";
            String Result=""; //显示查询的结果
            int len=args.length; //命令长度
           
            boolean useChar = false;//用于判断是否有统计字符数命令
            boolean useLine = false;//用于判断是否有统计行数命令
            boolean useWord = false;//用于判断是否有统计单词数命令
            
           for(int i=0;i<len;i++)
           {
               if(args[i].startsWith("-"))//判断命令中出现了那些指令
               {
                   switch(args[i])
                   {
                     case "-c":
                        useChar = true;
                        break;
                     case "-l":
                        useLine = true;
                        break;
                     case "-w":
                        useWord =true;
                        break;
                     /* case "-o":
                          if(!args[i+1].startsWith("-"))//用于判断后面是否指定了具体的输出文件
                          {
                              outputFile =args[i+1];
                              i++;
                          }
                          else
                          {
                              System.out.println("error!");
                              System.exit(0);
                          }
                          break;*/
                      default:
                          System.out.println("error !");
                            break;                      
                   }
               }
               else
                   System.out.println("命令不符!");
           }
            if (useWord) {
                try {
                    Result+=cw.countWord(filePath)+"\r\n";
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }//调用统计单词数方法
            }
            if (useLine) {
                Result+=cl.CountLine(filePath)+"\r\n";//调用统计行数方法
            }
            if (useChar) {
                try {
                    Result+=cc.CharNum(filePath)+"\r\n";
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }//调用统计字符数方法
            }
        }
        /*
         * 
         * 
         * 
         * 这是一个巨大的错误,写完才发现,自己并未看清真正的需求,当时就想着统计单词数,字符数,行数,就直接开始编码,最后才发现需要写入口函数
        这是一个巨大的教训,这是这门课教会我们的东西,而我却根本没有引起重视,这是我真正需要学习的。此例不删,以此为戒。
        
        *
        *
        *
        */
        /*// TODO Auto-generated method stub
        Scanner sc=new Scanner(System.in);
        boolean flag=true;
        String filePath;
        int ch;
        System.out.println("请输入需操作文件地址:");
        filePath=sc.nextLine();
        while(flag) {
            System.out.println("1.统计字符数");
            System.out.println("2.统计单词数");
            System.out.println("3.统计行数");
            System.out.println("4.返回菜单");
            System.out.println("5.退出系统");
            System.out.println("请输入所需操作(输入提示的数字):");
            ch=sc.nextInt();
            if(ch==5) {
                flag=false;
                break;
            }
            switch(ch) {
            case 1:
                CountChar cc=new CountChar();
                int num1 = 0;
                try {
                    num1 = cc.CharNum(filePath);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println(filePath+" "+"字符数:"+num1);
                break;
            case 2:
                CountWord cw=new CountWord();
                int num2 = 0;
                try {
                    num2 = cw.countWord(filePath);
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println(filePath+" "+"单词数:"+num2);
                break;
            case 3:
                CountLine cl=new CountLine();
                int num3=cl.CountLine(filePath);
                System.out.println(filePath+" "+"行数:"+num3);
                break;
            case 4:
                break;
                default:
                    System.out.println("输入数字不正确");
                    break;
            }
        }*/
    }

六.程序测试

  • 单元测试

技术分享图片

技术分享图片

技术分享图片

  • 上传git以及GitHub

技术分享图片

技术分享图片

  • 入口参数测试

技术分享图片

技术分享图片

技术分享图片

技术分享图片

  • 实际文件展示

技术分享图片

技术分享图片

七.项目总结

本次个人项目,对于项目功能的实现,单独并不大,对于代码实现,主要是完成了我们对于Java基础知识的复习,本次项目最大的收获是对于psp表格的运用,将我们的的工作过程量化到细节,使得我们对于自己工作量,工作效能,工作成果,都有一个直观的认识,这不仅有利于我们的学习,更对于我们以后的工作,职业发展有着深远的影响。谢谢大家。

Homework01

标签:system.in   output   分析   evel   exti   存储   行数统计   adl   star   

原文地址:https://www.cnblogs.com/Crls/p/9697125.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!