第二周个人作业

1.GitHub地址:https://github.com/YJG1997/wc

2.psp表格

PSP2.1表格


PSP2.1


PSP阶段


预估耗时

(分钟)


实际耗时

(分钟)


Planning


计划

 60  50

· Estimate


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

 30  20

Development


开发

 60  90

· Analysis


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

 30  40

· Design Spec


· 生成设计文档

 30  20

· Design Review


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

 20  20

· Coding Standard


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

 20  20

· Design


· 具体设计

 90  90

· Coding


· 具体编码

1200  1440

· Code Review


· 代码复审

 60  60

· Test


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

 60  50

Reporting


报告

 120  100

· Test Report


· 测试报告

 60  90

· Size Measurement


· 计算工作量

 30  30

· Postmortem & Process Improvement Plan


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

 60  50
 
合计

 1930  2170

3.解题思路

刚拿到题目时,看到题目的需求是对程序设计语言源文件统计字符数、单词数、行数,统计结果以指定格式输出到默认文件中时,第一反应时怎么判定和区分字符、单词,然后怎么去计算行数,用判定换行符来解决计算行数的问题是否可行,看到后面,有对字符和单词判定的说明,思路稍微就有点清晰了。因为对Java还不是很熟练,于是重新翻看了一遍《面向对象程序设计教程》。只是看书具体编码还有些困难,于是借助百度参考了一下别人的经验。

4.程序设计实现过程

首先完成基本功能需求,即完成统计字符数、单词数和行数的功能,此基本功能包含在baseC类中,在此类中用count的重载确定执行的操作,具体计数的方法charcount()、wordcount()、linecount()。然后用FileWrite新建一个result.txt文件,将结果输出到此文件中。

至于扩展功能,用allfile()方法实现递归处理目录下符合条件的文件,用complex()方法实现统计更复杂的数据(代码行/空行/注释行),用stop()方法实现停用词表,即统计文件单词总数时,不统计该表中的单词。

5.代码说明

代码分为三部分,wc.java 是 main class,baseC.java实现基本功能,extendedC.java实现扩展功能。

基本功能中实现字符计数的方法charcount():

public static void charcount(String thefile){
int charcount=0;
String sfile=new String(thefile);
File file=new File(sfile);
if(file.exists()){
try{
FileInputStream fis=new FileInputStream(file);
InputStreamReader isr=new InputStreamReader(fis,"UTF-8");
BufferedReader br=new BufferedReader(isr);
String line=new String("");
StringBuffer sb=new StringBuffer();
while((line=br.readLine())!=null){
sb.append(line);
charcount+=line.length();
}
br.close();
isr.close();
fis.close();
}
catch(FileNotFoundException e){
e.printStackTrace();
}
catch(UnsupportedEncodingException e){
e.printStackTrace();
}
catch(IOException e){
e.printStackTrace();
}
}
try{
//打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
FileWriter writer = new FileWriter("result.txt", true);
char[] message=(thefile+", 字符数:"+charcount+"\r\n").toCharArray();//换行"\r\n"不是"\n"
writer.write(message);
writer.close();
}
catch(IOException e){
System.out.println("File read/write Error"+e);
}
}

wordcount()、linecount()大体类似。

complex()方法统计代码行/空行/注释行:

static void complex(String myfile,String outfile)throws FileNotFoundException {
if(outfile==null)
outfile="result.txt";
String sfile=new String(myfile);
File file=new File(sfile);
// 记录注释行数
long annotationLine = 0;
// 记录空白行数
long blankLine = 0;
// 记录有效代码的行数
long codeLine = 0;
//假注释
long notLine=0;
if (file == null || !file.exists())
throw new FileNotFoundException(file + ",文件不存在!");
BufferedReader br = null;
// 判断此行是否为注释行
boolean comment = false;
int whiteLines = 0;
int commentLines = 0;
int normalLines = 0;
try {
br = new BufferedReader(new FileReader(file));
String line = "";
while ((line = br.readLine()) != null) {
line = line.trim();
if (line.matches("^[//s&&[^//n]]*$")||line.equals("{")||line.equals("}")) {
// 空行 :本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”
whiteLines++;
}
/* 本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:
* }//注释
*/
else if (line.startsWith("/*") && !line.endsWith("*/")||((line.startsWith("{/*")||line.startsWith("}/*"))&&!line.endsWith("*/"))){
// 判断此行为"/*"开头的注释行
commentLines++;
comment = true;
} else if (comment == true && !line.endsWith("*/")&&!line.startsWith("*/")) {
// 为多行注释中的一行(不是开头和结尾)
notLine++;
commentLines++;
} else if (comment == true && (line.endsWith("*/")||line.startsWith("*/"))) {
// 为多行注释的结束行
commentLines++;
comment = false;
} else if (line.startsWith("//")|| line.startsWith("}//")||line.startsWith("{//")||
((line.startsWith("{/*") ||line.startsWith("}/*")||line.startsWith("/*")) && line.endsWith("*/"))) {
// 单行注释行
commentLines++;
} else {
// 正常代码行
//System.out.println(line);
normalLines++;
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
br = null;
} catch (IOException e) {
e.printStackTrace();
}
}
try{
//打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
FileWriter writer = new FileWriter(outfile, true);
char[] message=(myfile+",代码行/空行/注释行:"+(normalLines+notLine)+"/"+whiteLines+"/"+(commentLines-notLine)+"\r\n").toCharArray();//换行"\r\n"不是"\n"
writer.write(message);
writer.close();
}
catch(IOException e){
System.out.println("File read/write Error"+e);
}
}
}

6.测试设计过程

白盒测试用例设计技术可分为逻辑覆盖和路径覆盖,逻辑覆盖又可分为以下几种,从弱到强:

语句覆盖(SC):设计足够多的测试用例,确保每条语句都被执行过。

判定覆盖(DC):设计足够多的测试用例,确保每个判定都分别取真值与假值。

条件覆盖(CC):设计足够多的测试用例,确保每个条件都分别取真值与假值。(一个判定里可能包含多个条件)

判定/条件覆盖(DCC):设计足够多的测试用例,确保每个判定和条件分别取真值和假值。

条件组合覆盖(CMC):设计足够多的测试用例,确保覆盖每个判定中的各个条件的所有组合情况。(只考虑同一个判定内的各条件组合情况)

路径覆盖:设计足够多的测试用例,确保每条路径都被执行。如果程序复杂,比如包含循环的情况,路径覆盖的测试用例数将会是个天文数字,无法实现。可以采用简化了的路径覆盖,即将循环看成是一个判定,只考虑循环被执行和未执行两种情况。

wc主类:

public class wc{
    public static void main(String[] args) {
        int len=args.length;
        String one,two,three,four,five,six,seven,eight,night;//定义参数
        if(len<=1)
            System.out.println("请按照格式输入");
        else {
            if(len==2)
            {
                one=args[0];
                two=args[1];
                if(one.equals("-a"))
                    try {
                        //System.out.println("morrdate");
                        extendedC.complex(two,null);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                else if(one.equals("-l")||one.equals("-c")||one.equals("-w"))
                    baseC.count(one, two);
                else System.out.println("无该操作");

            }
            else if(len==3)
            {
                one=args[0];two=args[1];three=args[2];
                if(three.endsWith(".c")){
                    if((one.equals("-l")||one.equals("-c")||one.equals("-w")&&(two.equals("-l")||two.equals("-c")||two.equals("-w"))))//需两功能处理文件
                          baseC.count(one, two, three);
                    else if(one.equals("-s")&&(two.equals("-l")||two.equals("-c")||two.equals("-w")||two.equals("-a")))//递归处理文件(简单统计单词、字符或行)(处理代码行、注释行和空行)
                             {
                             String[] list={two,three};
                              extendedC.allfile(list);
                             }
                    else System.out.println("输入格式错误!");
                      }
               else if(three.endsWith(".txt")&&two.equals("-e")){//停用词表,单词数
                       extendedC.stop(one, three,null);
                }
                else System.out.println("输入格式错误!");
        }
            else if(len==4){
                one=args[0];two=args[1];three=args[2];four=args[3];
                if(four.endsWith(".c")){
                        if((one.equals("-l")||one.endsWith("-c")||one.equals("-w"))&&(two.equals("-l")||two.equals("-c")||two.equals("-w"))
                                &&(three.equals("-l")||three.equals("-c")||three.equals("-w")))//需三功能处理文件
                                baseC.count(one, two, three,four);
                        else if(one.equals("-s")&&(two.equals("-l")||two.equals("-c")||two.equals("-w"))
                                    &&(three.equals("-l")||three.equals("-c")||three.equals("-w")))//递归处理文件(简单统计单词、字符或行)
                            {
                                    String[] list={two,three,four};
                                    extendedC.allfile(list);
                                }
                            else System.out.println("输入格式错误!");
                            }
                    else if(two.endsWith(".c")&&three.equals("-o"))
                               baseC.count(one, two,three,four);
                    else System.out.println("请按照正确格式输入");

            }
            else if(len==9){
                one=args[0];two=args[1];three=args[2];four=args[3];five=args[4];six=args[5];seven=args[6];eight=args[7];night=args[8];
                if(one.equals("-s")&&two.equals("-a")&&(three.equals("-l")||three.equals("-c")||three.equals("-w"))
                        &&(four.equals("-l")||four.equals("-c")||four.equals("-w"))&&six.equals("-e")&&eight.equals("-o"))
                    {
                            String[] list={two,three,four,five,six,seven,eight,night};
                            extendedC.allfile(list);
                    }
                else System.out.println("请按照格式输入");
            }
            else System.out.println("请按照格式输入");

    }

    }
}

根据主类设计测试用例如下:

在命令行输入:

1.len<=1

wc.exe -c 

2.len==2

wc.exe -a file.c

3.len==2

wc.exe -l file.c

4.len==2

wc.exe -n file.c  //输出“无该操作”

5.len==3

wc.exe -l -c file.c

6.len==3

wc.exe -c -e *.txt //"*.txt"表示txt文件

7.len==3

wc.exe -s -a *.c

8.len==4

wc.exe -c -w -l file.c

9.len==4

wc.exe -s -l -c file.c

10.len==9

wc.exe -s -a –c -w *.c–e stop.txt –o –output.txt

参考链接:

http://www.cnblogs.com/xinz/p/7426280.html

http://www.cnblogs.com/jiel/p/7545780.html

原文地址:https://www.cnblogs.com/JinGangYao/p/8613406.html

时间: 2024-11-07 10:01:25

第二周个人作业的相关文章

现代软件工程第二周的作业

现有的命名方式有多少种?请举例说明 一.匈牙利命名法: 广泛应用于象 Microsoft Windows 这样的环境中. Windows 编程中用到的变量(还包括宏)的命名规则匈牙利命名法,这种命名技术是由一 位能干的 Microsoft 程序员查尔斯· 西蒙尼(Charles Simonyi) 提出的. 匈牙利命名法通过在变量名前面加上相应的小写字母的符号标识作为前缀, 标识出变量的作用域, 类型等.这些符号可以多个同时使用,顺序是先 m_(成员变量),再指针,再简单数据类型, 再其他.例如:

【周末作业】2015.7.15 第二周 css作业及答案

[作业题] 一.问答题 1. CSS选择器以及引入方式哪几种,CSS选择器有哪些以及它们的优先级 2. 行内元素和块级元素的区别,分别举出6个行内元素和块级元素,块级元素的特点是什么 3. 改变元素外边距是什么属性,改变元素内边距是什么属性 4. 如何让一个div在页面中居中 5. 如何隐藏一个div 6. CSS的注释是什么 7. 怎样定义li列表项目符号为实心矩形 8. margin:5px 2px; 表示什么 9. CSS产生浏览器兼容性问题的原因是什么,举出三个处理浏览器兼容性问题的例子

软件测试第二周个人作业--wordcount

1.Github项目地址:https://github.com/SSS-SY/wordcount 2.PSP2.1表格 PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) Planning 计划 20 15 · Estimate · 估计这个任务需要多少时间 30 15 Development 开发 360 605 · Analysis · 需求分析 (包括学习新技术) 60 80 · Design Spec · 生成设计文档 0 5 · Design Review · 设计复审

第二周个人作业WordCount

一.GitHub地址 https://github.com/JasonLiu1105/WordCount 二.PSP表格 PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) Planning 计划 20 20 · Estimate · 估计这个任务需要多少时间 2days 3days Development 开发 1day 1day · Analysis · 需求分析 (包括学习新技术) 240 240 · Design Spec · 生成设计文档 20 20 · Design R

马哥Linux培训第二周课程作业

1.   Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示. #    文件及目录列表查看:ls #    文件内容查看:cat, tac #    修改文件时间戳或创建新文件:touch #    文件编辑: vi, nano 文件管理:cp, mv, rm, (mkdir, rmdir:创建.删除目录) (1)     .复制命令:cp 格式: cp[OPTION]... [-T] SOURCE DEST cp[OPTION]... SOURCE... DIRECTOR

16级第二周寒假作业J题

Favorite Donut TimeLimit: 1500/1000 MS (Java/Others)  MemoryLimit: 131072/131072 K (Java/Others) 64-bit integer IO format:%I64d Problem Description 露露爱吃甜食.她最喜欢的食物是环形甜甜圈.每天她从同一个面包店买一个环形甜甜圈.环形甜甜圈由n个部分组成.每个部分具有其自身的糖度,甜度可以由从a到z(从低到高)的字母表示,并且环形甜甜圈可以以一个第i个

Coursera machine learning 第二周 编程作业 Linear Regression

必做: [*] warmUpExercise.m - Simple example function in Octave/MATLAB[*] plotData.m - Function to display the dataset[*] computeCost.m - Function to compute the cost of linear regression[*] gradientDescent.m - Function to run gradient descent 1.warmUpE

第二周的作业第二题_张东明

描述:每人自己建立一个HelloWorld项目,练习使用git的add/commit/push/pull/fetch/clone等基本命令.比较项目的新旧版本的差别. 1.  创建一个Git仓库——在现有目录初始化库 创建一个helloWorld文件夹,在该文件夹右键直接打开Git Bash,输入git init命令,创建完成库. 2.  检查文件状态 由于我以前使用过git,所以不用设置用户名和邮箱,对于新的电脑需要在此设置用户名和邮箱. 3.  使用clone命令 把远程库中的项目克隆到本地

16级第二周寒假作业B题

Line belt TimeLimit:1000MS  MemoryLimit:32768KB 64-bit integer IO format:%I64d Problem Description In a two-dimensional plane there are two line belts, there are two segments AB and CD, lxhgww's speed on AB is P and on CD is Q, he can move with the s