目录

一、实验报告封面

北京电子科技学院(BESTI)

实 验 报 告

课程 Java程序设计 班级 1652班
姓名 蔡霓 学号 20165223
成绩 指导教师 娄嘉鹏
实验日期 2018年4月28日 实验密级 非密级
预习程度 已预习 实验时间 13:45 - 15:25
必修/选修 选修 实验序号

实验名称:敏捷开发与XP实践

实验内容

  1. XP基础
  1. XP核心实践
  1. 相关工具

实验要求

1.没有Linux基础的同学建议先学习《Linux基础入门(新版)》 《Vim编辑器》课程

2.完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导

3.严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。

返回目录

二、具体实验内容

(一)代码规范格式化

  1. 参考 IDEA简易教程-代码规范 安装alibaba 插件,解决代码中的规范问题。
  1. 在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,在SettingsPluginsBrowse 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)实验截图

返回目录

三、实验总结

  • 代码托管

我的代码20165223

搭档代码20165218

  • 参考资料
  1. Intellj IDEA 简易教程-代码规范
  2. 实验三 敏捷开发与XP实践
  3. 积极主动敲代码,使用JUnit学习Java
  4. Java 密码学算法

返回目录

四、PSP时间

实验步骤 耗时 百分比
题目分析 30min 15%
思路设计 60min 30%
代码实现 60min 30%
调试测试 20min 10%
实验总结 30min 15%

返回目录

20165223 实验三 敏捷开发与XP实践的更多相关文章

  1. 20145213《Java程序设计》实验三敏捷开发与XP实践

    20145213<Java程序设计>实验三敏捷开发与XP实践 实验要求 1.XP基础 2.XP核心实践 3.相关工具 实验内容 1.敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法 ...

  2. 20145308刘昊阳 《Java程序设计》实验三 敏捷开发与XP实践 实验报告

    20145308刘昊阳 <Java程序设计>实验三 敏捷开发与XP实践 实验报告 实验名称 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 统计的PSP(Personal ...

  3. JAVA课程实验报告 实验三 敏捷开发与XP实践

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计  班级:1353  姓名:韩玉琪  学号:20135317 成绩:             指导教师:娄嘉 ...

  4. 20145225《Java程序设计》 实验三 "敏捷开发与XP实践"

    20145225<Java程序设计> 实验三 "敏捷开发与XP实践" 实验报告 实验内容 使用 git 上传代码 使用 git 相互更改代码 实现代码的重载 git 上 ...

  5. 20145215实验三 敏捷开发与XP实践

    20145215实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验步骤 (一)敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法应用到软件的开发.运营和维护上的过程.软 ...

  6. 20145325张梓靖 实验三 "敏捷开发与XP实践"

    20145325张梓靖 实验三 "敏捷开发与XP实践" 程序设计过程 实验内容 使用 git 上传代码 git上传中遇到的问题 使用 git 相互更改代码 实现代码的重构 git ...

  7. 20162311 实验三 敏捷开发与XP实践 实验报告

    20162311 实验三 敏捷开发与XP实践 实验报告 实验内容 一.研究学习IDEA中的Code菜单 使用Code ->Reformate Code功能将以下代码格式化 public clas ...

  8. 2018-2019-20175205 实验三敏捷开发与XP实践《Java开发环境的熟悉》实验报告

    2018-2019-20175205 实验三敏捷开发与XP实践<Java开发环境的熟悉>实验报告 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)>&l ...

  9. 20175314 实验三 敏捷开发与XP实践

    20175314 实验二 Java面向对象程序设计 一.实验内容 XP基础 XP核心实践 相关工具 二.实验步骤 (一)代码格式化 创建"175314.exp3"项目,在该项目下创 ...

随机推荐

  1. asp.net core下一个简单的分页技术

    在做web应用的时候免不了要对数据进行分页,我最近在做asp.net core的开发的时候就遇到了这个需求,现在简单的记录一下: public class PaginatedList<T> ...

  2. C#设计模式之2:单例模式

    在程序的设计过程中很多时候系统会要求对于某个类型在一个应用程序域中只出现一次,或者是因为性能的考虑,或者是由于逻辑的要求,总之是有这样的需求的存在,那在设计模式中正好有这么一种模式可以来满足这样的要求 ...

  3. WPF中任务栏只显示主窗口

    我们在用WPF开发的时候,常常会遇到在主窗口打开的情况下,去显示子窗口,而此时任务栏同时显示主窗口与子窗口.这样看起来很不美观.所以在弹出子窗口之前,设置它的几个相应属性,便不会出现这种问题了. // ...

  4. [转帖]Office全版本零售版转换VOL

    Office全版本零售版转换VOL https://blog.51cto.com/10981246/2062137 转成bat 执行 改天试试   @ECHO OFF&PUSHD %~DP0 ...

  5. 临时的ThisCall

    // 获取当前定位 changeCity: function () { let that = this; that.locationClose(); Upj._changeCity().then((d ...

  6. java的强制类型转换

    java强制类型转换  详细连接https://www.cnblogs.com/kuangwong/p/6198862.html 在Java项目的实际开发和应用中,常常需要用到将对象转为String这 ...

  7. python之路--第一类对象,函数名,变量名

    一 . 第一类对象 函数对象可以像变量一样进行赋值 , 还可以作为列表的元素进行使用 可以作为返回值返回 , 可以作为参数进行传递 def func(): def people(): print('金 ...

  8. ES 6 系列 - 对于常用对象的拓展 api

    本篇中学习并记录可能会比较常用的 api ,详细请自行查找相关资料. 一.字符串的拓展 es 6 加强了对于 Unicode 的支持.javascript 允许采用 \uxxxxx 的方式表示一个字符 ...

  9. Jenkins+PowerShell持续集成环境搭建(七)构建触发器

    Jenkins 有三种类型的构建触发器,如下图: Build after other projects are built:在其他项目构建后构建: Build periodically:定时构建: P ...

  10. 英特尔DRM内核驱动程序默认启用PSR2省电功能

    导读 英特尔DRM/KMS内核驱动程序很快就会启用PSR2面板自刷新功能,以便在英特尔支持的超极本/笔记本电脑上实现更多节能. 一段时间以来,英特尔的Direct Rendering Manager驱 ...