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插件使用文档

最新文章

  1. NodeJs解析web一例
  2. java-面向对象练习2
  3. 【poj2699】 The Maximum Number of Strong Kings
  4. C# 传入引用类型的参数 返回值是否发生变化
  5. firefox查看微信公众平台的数据分析时就出现不信任链接怎么办?
  6. 用代码编辑数据库T-SQL语句
  7. Linux ed
  8. 基于jsp+servlet图书管理系统之后台用户信息查询操作
  9. zepto打造一款移动端划屏插件
  10. jsp标签简介
  11. 滚动条大于120px时,判断pc端的情况下,导航条固定定位
  12. python_如何对实例属性进行类型检查?
  13. pytorch安装(使用pip3装到conda环境下)
  14. C# 对结构体和指针的使用
  15. SparkStreaming “Could not read data from write ahead log record” 报错分析解决
  16. FortiGate部分用户上网慢,丢包严重
  17. Sort aborted Error in MySQL Error Log
  18. 分布式Session一致性解决方案有哪些?
  19. idea中的pom文件中的jar包下载不了,手动下载jar包的方法
  20. 《Linux命令行与shell脚本编程大全》第十一章 构建基本脚本

热门文章

  1. 隐马尔科夫模型(hidden Markov model, HMM)
  2. Javascript特效代码大全(420个)(转)
  3. 根据List&lt;SqlParameter&gt;返回sql条件(where后)
  4. ThinkPHP项目笔记之RBAC(权限)上篇
  5. (转)spring IOC、DI理解
  6. 程序阅读:简单C++学生信息管理系统
  7. HDU 2159 FATE(二维全然背包)
  8. Centos查看系统位数方法
  9. VC启动一个新线程的三种方法
  10. IOS内购支付服务器验证模式