目录
一、实验报告封面
北京电子科技学院(BESTI)
实 验 报 告
◆ | ◇ | ◆ | ◇ |
---|---|---|---|
课程 | Java程序设计 | 班级 | 1652班 |
姓名 | 蔡霓 | 学号 | 20165223 |
成绩 | 指导教师 | 娄嘉鹏 | |
实验日期 | 2018年4月28日 | 实验密级 | 非密级 |
预习程度 | 已预习 | 实验时间 | 13:45 - 15:25 |
必修/选修 | 选修 | 实验序号 | 三 |
实验名称:敏捷开发与XP实践
实验内容:
- XP基础
- XP核心实践
- 相关工具
实验要求:
1.没有Linux基础的同学建议先学习《Linux基础入门(新版)》 《Vim编辑器》课程
2.完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导
3.严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。
二、具体实验内容
(一)代码规范格式化
- 参考 IDEA简易教程-代码规范 安装alibaba 插件,解决代码中的规范问题。
- 在IDEA中使用工具(Code->Reformate Code)把下面代码重新格式化,再研究一下Code菜单,找出一项让自己感觉最好用的功能。提交截图,加上自己学号水印。
public class CodeStandard {
public static void main(String [] args){
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()<20)
buffer.append("1234567");
for(int i=0; i<buffer.length();i++)
System.out.println(buffer.charAt(i));
}
}
(1)实验步骤
- 打开IDEA,在
Settings
→Plugins
→Browse repositories...
中的搜索框输入alibaba - 看到Alibaba Java Code Guidelines插件,点击Install进行安装,然后重启IDE生效
- 新建类:
CodeStandard.java
,输入题目给出的代码 - 使用工具
Code → Reformate Code
,按提示修改并格式化代码 - 了解Code菜单功能
名称 | 快捷键 | 功能 |
---|---|---|
Override Methods | Ctrl + O | 重写覆盖方法 |
Implements Methods | Ctrl + I | 实现接口方法 |
Gengrate | Alt + Insert | 生成Construct、Getter/Setter、toString等 |
Surround With | Ctrl + Alt +T | 生成包围代码 |
Unwarp/Remove | Ctrl + Shift + Delete | 取消代码包围 |
Cyclic Expand Word | Alt + / | 循环往上选择单词 |
Cyclic Expand Word | Backwrad | 循环往下选择单词 |
Comment with Line Comment | Ctrl + / | 行注释 |
Comment with Block Comment | Ctrl + Shift + / | 块注释 |
Reformat Code | Ctrl + Alt + L | 格式化代码 |
Move Statement Down | Ctrl + Shift + ↓ | 方法、代码下移 |
Move Statement Up | Ctrl + Shift + ↑ | 方法、代码上移 |
(2)实验代码
- 类
CodeStandard.java
:
public class CodeStandard {
public static void main(String [] args){
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()<20)
buffer.append("1234567");
for(int i=0; i<buffer.length();i++)
System.out.println(buffer.charAt(i));
}
}
(3)实验截图
(二)添加搭档项目
1.在码云上把自己的学习搭档加入自己的项目中
2.确认搭档的项目加入自己后,下载搭档实验二的Complex代码
3.加入不少于三个JUnit单元测试用例,测试成功后git add .; git commit -m "自己学号 添加内容";git push;
4.提交搭档项目git log的截图,包含上面git commit的信息,并加上自己的学号水印信息。
(1)实验步骤
- 以开发者的身份在码云上将学习搭档加入自己的项目中
- 下载搭档实验二的Complex代码,加入JUnit单元测试用例
- 提交搭档项目git log的截图
(2)实验代码
Complex
类
public class Complex {
// 定义属性并生成getter,setter
double RealPart;
double ImagePart;
// 定义构造函数
public Complex(double R, double I) {
this.RealPart = R;
this.ImagePart = I;
}
;
public Complex() {
}
;
//Override Object
/*public boolean equals(Object obj){
}
public String toString();
//Override Object
public boolean equals(Object obj)
public String toString()*/
}
class FourOperations{
// 定义公有方法:加减乘除
//Complex a = new Complex();
// Complex b = new Complex();
Complex ComplexAdd(Complex a,Complex b){
Complex answer=new Complex();
answer.RealPart=a.RealPart+b.RealPart;
answer.ImagePart=a.ImagePart+b.ImagePart;
return answer;
}
Complex ComplexSub(Complex a,Complex b){
Complex answer=new Complex();
answer.RealPart=a.RealPart-b.RealPart;
answer.ImagePart=a.ImagePart-b.ImagePart;
return answer;
}
Complex ComplexMulti(Complex a,Complex b){
Complex answer=new Complex();
answer.RealPart=(a.RealPart*b.RealPart)-(a.ImagePart*b.ImagePart);
answer.ImagePart=(a.RealPart*b.ImagePart)+(a.ImagePart*b.RealPart);
return answer;
}
Complex ComplexDiv(Complex a,Complex b){
Complex answer=new Complex();
double fenmu = b.RealPart*b.RealPart+b.ImagePart+b.ImagePart;
answer.RealPart=(a.RealPart*b.RealPart+a.ImagePart*b.ImagePart)/fenmu;
answer.ImagePart=(a.ImagePart*b.RealPart-a.RealPart*b.ImagePart)/fenmu;
return answer;
}
}
- 测试代码
ComplexTest
类
import org.junit.Test;
import static org.junit.Assert.*;
public class ComplexTest {
@Test
public void testComplexAdd() throws Exception {
assertEquals(5,2+3);
System.out.println();
}
@Test
public void testComplexSub() throws Exception {
assertEquals(6,9 - 3);
}
@Test
public void testComplexMulti() throws Exception {
assertEquals(6,2 * 3);
}
@Test
public void testComplexDiv() throws Exception {
assertEquals(2,6 / 3);
}
}
(3)实验截图
(三)搭档代码重构
完成重构内容的练习,下载搭档的代码,至少进行三项重构,提交重构后代码的截图,加上自己的学号水印。提交搭档的码云项目链接。
(1)实验步骤
- 下载搭档的代码
Age.java
,进行三项重构
(2)实验代码
- 原代码:
import java.lang.*;
import java.sql.*;
public class Age {
public static void main(String args[]) {
Connection con = null;
Statement sql;
ResultSet rs;
String name1 = new String("");
String name2 = new String("");
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (Exception e) {
}
String uri = "jdbc:mysql://localhost:3306/world?useSSL=true";
String user = "root";
String password = "";
// String sqlStr="select * from country where LifeExpectancy ";
try {
con = DriverManager.getConnection(uri, user, password);
} catch (SQLException e) {
}
try {
sql = con.createStatement();
rs = sql.executeQuery("select * from country");
float age1 = 0;
float age2 = 100;
while (rs.next()) {
float LifeExpectancy = rs.getFloat(8);
String Name = rs.getString(2);
if (LifeExpectancy >= age1) {
age1 = LifeExpectancy;
name1 = Name;
} else if (LifeExpectancy <= age2 && LifeExpectancy != 0.0) {
age2 = LifeExpectancy;
name2 = Name;
}
}
System.out.println("寿命最长的国家为:" + name1 + ",平均寿命" + age1+"岁");
System.out.println("寿命最短的国家为:" + name2 + ",平均寿命" + age2+"岁");
con.close();
} catch (SQLException e) {
System.out.println(e);
}
}
}
- 重构代码:
import java.lang.*;
import java.sql.*;
public class zbyProgram {
public static void main(String args[]) {
Connection con = null;
Statement sql;
ResultSet rs;
String longest_name = new String("");
String shortest_name = new String("");
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (Exception e) {
}
String uri = "jdbc:mysql://localhost:3306/world?useSSL=true";
String user = "root";
String password = "";
// String sqlStr="select * from country where LifeExpectancy ";
try {
con = DriverManager.getConnection(uri, user, password);
} catch (SQLException e) {
}
try {
sql = con.createStatement();
rs = sql.executeQuery("select * from country");
float longest_age = 0;
float shortest_age = 100;
while (rs.next()) {
float LifeExpectancy = rs.getFloat(8);
String Name = rs.getString(2);
if (LifeExpectancy >= longest_age) {
longest_age = LifeExpectancy;
longest_name = Name;
} else if (LifeExpectancy <= shortest_age && LifeExpectancy != 0.0) {
shortest_age = LifeExpectancy;
shortest_name = Name;
}
}
System.out.println("寿命最长的国家为:" + longest_name + ",平均寿命" + longest_age+"岁");
System.out.println("寿命最短的国家为:" + shortest_name + ",平均寿命" + shortest_age+"岁");
con.close();
} catch (SQLException e) {
System.out.println(e);
}
}
}
(3)实验截图
(四)Java密码学相关内容学习
1.参考《Java 密码学算法》,以结对的方式完成Java密码学相关内容的学习,结合重构,git,代码标准。
2.提交学习成果码云链接和代表性成果截图,要有学号水印。
(1)实验步骤
- 非对称加密-RSA算法1,创建RSA公钥和私钥
- 非对称加密-RSA算法2,获取公钥私钥,并进行加密,获取密文
- 非对称加密-RSA算法3,使用私钥文件对密文进行解密
(2)实验代码
CaeserCipher.java
代码:
import java.util.*;
import java.lang.*;
public class CaeserCipher {//凯撒密码
public static void main(String[] args) {
System.out.println("输入一串字符串作为明文(回车结束):");
Scanner input = new Scanner(System.in);
String m = input.next();//读入一行字符串,以回车为标志
System.out.println("输入密钥:");
int k = input.nextInt();
int key = k % 26;//防止密钥超界
Arithmetic output = new Arithmetic();
String c = output.encrpty(m, k);
System.out.println("加密后的密文为:" + c);
System.out.println("解密后的明文为:" + output.decrypt(c, key));
}
}
Arithmetic.java
代码:
import java.lang.*;
public class Arithmetic {//加密和解密算法
public String encrpty(String m, int k) {
StringBuilder result = new StringBuilder();
char[] mi = m.toCharArray();
int n = mi.length;
for (int c : mi) {
if (c >= 'a' && c <= 'z') {
c += k; // 移动key%26位
if (c < 'a')
c += 26; // 向左超界
if (c > 'z')
c -= 26; // 向右超界
}
// 如果字符串中的某个字符是大写字母
else if (c >= 'A' && c <= 'Z') {
c += k; // 移动key%26位
if (c < 'A')
c += 26;// 同上
if (c > 'Z')
c -= 26;// 同上
}
result.append((char) c);
}
return result.toString();
}
public String decrypt(String m, int k) {
StringBuilder result = new StringBuilder();
char[] mi = m.toCharArray();
int n = mi.length;
for (int c : mi) {
if (c >= 'a' && c <= 'z') {
c -= k; // 向前移动k位
if (c < 'a')
c += 26; // 向左超界
if (c > 'z')
c -= 26; // 向右超界
}
// 如果字符串中的某个字符是大写字母
else if (c >= 'A' && c <= 'Z') {
c -= k; // 向前移动3位
if (c < 'A')
c += 26;// 同上
if (c > 'Z')
c -= 26;// 同上
}
result.append((char) c);
}
return result.toString();
}
}
(3)实验截图
三、实验总结
- 代码托管:
- 参考资料:
四、PSP时间
实验步骤 | 耗时 | 百分比 |
---|---|---|
题目分析 | 30min | 15% |
思路设计 | 60min | 30% |
代码实现 | 60min | 30% |
调试测试 | 20min | 10% |
实验总结 | 30min | 15% |