20165324 Java实验三 敏捷开发与XP实验

20165324 Java实验三 敏捷开发与XP实验

一、实验报告封面

课程:Java程序设计 班级:1653班 姓名:何春江 学号:20165324

指导教师:娄嘉鹏 实验日期:2018年4月16日

实验时间:13:45 - 15:25 实验序号:24

实验名称:面向对象程序设计

二、实验内容

任务一:在IDEA中使用工具(Code->Reformate Code)格式化代码,并学习Code菜单的功能

知识点总结

  • Code菜单

  • 代码整理得:
public class CodeStandard {
    public static void main(String[] args) {
        final int m = 20;
        StringBuffer buffer = new StringBuffer();
        buffer.append('S');
        buffer.append("tringBuffer");
        System.out.println(buffer.charAt(1));
        System.out.println(buffer.capacity());
        System.out.println(buffer.indexOf("tring"));
        System.out.println("buffer = " + buffer.toString());
        if (buffer.capacity() < m) {
            buffer.append("1234567");
        }
        for (int i = 0; i < buffer.length(); i++) {
            System.out.println(buffer.charAt(i));
        }
    }
}
  • Code菜单使用截图

任务二:下载搭档实验二的Complex代码,加入不少于三个JUnit单元测试用例

  • 实验截图:
  • 提交上传截图:

  • git log

任务三:下载搭档的代码,至少进行三项重构

  • 重构内容
  1. Rename可以给类、包、方法变量改名字。
  2. 封装类,还可以封装成员变量。
  3. 避免代码重复,打印信息System.out.println();可通过toString方法重构。
  • 重构动机:
  1. 增加新功能;
  2. 原有功能有BUG;
  3. 改善原有程序的结构;
  4. 优化原有系统的性能 。
  • 重构手法:

本次重构内容

  • 将Student类中各定义的变量进行重构
  • 包名,类名的重构
  • 方法的重构
  • 对于输出的重构,因为其输出中存在其他参数,未能成功使用toString()进行重构。
package hcj;
import java.util.Scanner;
public class Test {
    public static void main(String args[]) {
        System.out.println("输入两个班的人数:");
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int m=sc.nextInt();
        Student []stu1=new Student[n];//创建对象数组
        Student []stu2=new Student[m];//创建对象数组
        Fen(stu1,n);
        Fen(stu2,m);
        System.out.println("现在输入一班学生信息:");
        Input(stu1,n);
        System.out.println("现在输入二班学生信息:");
        Input(stu2,m);
        paixu(stu1,n);
        paixu(stu2,m);
        System.out.println("一班信息为:");
        Output(stu1,n);
        System.out.println("二班信息为:");
        Output(stu2,m);
    }
    private static void Fen(Student[] stu, int n) {//分配空间
        for (int i=0;i<n;i++) {
            stu[i]=new Student();
        }
    }

    private static void Input(Student stu[],int n) {//输入
        Scanner sc=new Scanner(System.in);
        for (int i=0;i<n;i++) {
            System.out.println("请按以下格式输入学生信息:姓名 学号 性别 数学成绩 物理成绩");
            stu[i].setName(sc.next());
            stu[i].setNumber(sc.nextInt());
            stu[i].setGender(sc.next());
            stu[i].setMathScore(sc.nextInt());
            stu[i].setPhyScore(sc.nextInt());
        }
    }
    private static void paixu(Student stu[],int n) {
        for (int i=0;i<n-1;i++) {
            for (int j=i+1;j<n;j++) {
                if (stu[i].getNumber() > stu[j].getNumber()) {
                    Student s=stu[i];
                    stu[i]=stu[j];
                    stu[j]=s;
                }
            }
        }
    }
    private static  void Output(Student stu[],int n) {
        for (int i=0;i<n;i++) {
            System.out.println("姓名:"+ stu[i].getName() +",学号:"+ stu[i].getNumber() +",性别:"+ stu[i].getGender() +",数学成绩:"+ stu[i].getMathScore() +",物理成绩:"+ stu[i].getPhyScore());
        }
    }
}
class Student {
    private String name;
    private int number;
    private String gender;
    private int mathScore;
    private int phyScore;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getMathScore() {
        return mathScore;
    }

    public void setMathScore(int mathScore) {
        this.mathScore = mathScore;
    }

    public int getPhyScore() {
        return phyScore;
    }

    public void setPhyScore(int phyScore) {
        this.phyScore = phyScore;
    }
}

任务四:以结对的方式完成Java密码学相关内容的学习,结合重构、git、代码标准等

  • 结对编程之实现线性移位寄存器和对偶移位寄存器
  • 初步完整代码如下:
import java.util.Scanner;
public class Test {
    public static void main(String[] args) {
        System.out.println("请输入移位寄存器的级数n:");
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.println("请设置初态:");
        int[] a = new int[n];//状态数
        int  sum=1;
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
            sum=2*sum;
        }
        System.out.println("请输入结构常数:");//形如[c1,c2,c3,c4,c5]
        int[] c = new int[n];//存储的为反馈函数,与反馈函数的对应规律为:若结构常数为[0,1,0,1],则反馈函数为1 0 1 0
        for (int i = n-1; i >= 0; i--) {
            c[i] = sc.nextInt();
        }
        System.out.println("线性移位寄存器输出序列为:");
        for (int i = 0; i <sum-1; i++) {
            System.out.printf("%d", a[0]);
            operate1(a, c, n);
        }
        System.out.println(" ");
        System.out.println("对偶移位寄存器输出序列为:");
        for(int i=0;i<sum-1;i++) {
            System.out.printf("%d",a[0]);
            operate2(a,c,n);
        }
    }
    private static int[] operate2(int[] a, int[] c, int n) {
        int temp=a[0];
        for(int i=0;i<n-1;i++) {
            a[i]=a[i+1];
        }
        a[n-1]=0;
        if(temp==1) {
            for(int j=0;j<n;j++) {
                a[j]=(a[j]+c[n-j-1])%2;
            }
        }
        return a;
    }
    private static int[] operate1(int[] a, int[] c, int n) {
        int temp=0;
        for (int i = 0; i < n; i++) {
            if (a[i] * c[i] == 1) {
                temp += 1;
            }
        }
        a[n - 1] %= 2;
        for (int j = 0; j < n - 1; j++) {
            a[j] = a[j + 1];
        }
        a[n-1]=temp;
        return a;
    }
}

  • 重构之后代码如下:
import java.util.*;
public class Lfsr {
    public static void main(String[] args) {
        System.out.println("请输入移位寄存器的级数n:");
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.println("请设置初态:");
        int[] a = new int[n];//状态数
        int  sum=1;
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
            sum=2*sum;
        }
        System.out.println("请输入结构常数:");//形如[c1,c2,c3,c4,c5]
        int[] c = new int[n];//存储的为反馈函数,与反馈函数的对应规律为:若结构常数为[0,1,0,1],则反馈函数为
        for (int i = n-1; i >= 0; i--) {
            c[i] = sc.nextInt();
        }
        System.out.println("线性移位寄存器输出序列为:");
        for (int i = 0; i <sum-1; i++) {
            System.out.printf("%d", a[0]);
            operate1(a, c, n);
        }
        System.out.println(" ");
        System.out.println("对偶移位寄存器输出序列为:");
        for(int i=0;i<sum-1;i++) {
            System.out.printf("%d",a[0]);
            operate2(a,c,n);
        }
    }
    private static int[] operate2(int[] a, int[] c, int n) {
        int temp=a[0];
        for(int i=0;i<n-1;i++) {
            a[i]=a[i+1];
        }
        a[n-1]=0;
        if(temp==1) {
            for(int j=0;j<n;j++) {
                a[j]=(a[j]+c[n-j-1])%2;
            }
        }
        return a;
    }
    private static int[] operate1(int[] a, int[] c, int n) {
        int temp=0;
        for (int i = 0; i < n; i++) {
            if (a[i] * c[i] == 1) {
                temp += 1;
            }
        }
        a[n - 1] %= 2;
        for (int j = 0; j < n - 1; j++) {
            a[j] = a[j + 1];
        }
        a[n-1]=temp;
        return a;
    }
}
  • 重构实现截图

  • 实验截图为:

步骤 耗时 百分比
需求分析 10min 15%
设计 15min 21%
代码实现 20min 28%
测试 15min 21%
分析总结 10min 15%

三、实验体会与总结

结对编程,一起学习了线性移位寄存器和对偶移位寄存器的相关内容,轮换担任了领航员,一起实现了Java与密码学的小结合。

四、参考资料

敏捷开发与XP实践
IDEA插件使用文档

原文地址:https://www.cnblogs.com/20165324hcj/p/8933335.html