软工网络15--结对编程练习
结对编程
改进现有代码2
团队成员:
梁林 201521123119 码云地址:https://gitee.com/ll119
龚厦彬 201521123115 码云地址:https://gitee.com/handsomecat/events
clone项目,在开发环境中运行该应用程序,修改完毕最后上传至码云,并在博客中给出链接
检查大部分主要类之间的关系,画出类图
核心代码展示
private static int GCD(int m, int n) {//最大公约数
// TODO Auto-generated method stub
while (true) {
if ((m = m % n) == 0)
return n;
if ((n = n % m) == 0)
return m;
}
}
public static int LCM(int m, int n) { //求最小公倍数
return m*n/GCD(m,n);
}
public static int[] createFraction(){ //随机组成真分母
int[] fraction=new int[2];
int fraction1 = (int)(Math.random()*10+1);//避免分子出现零
int fraction2 = (int)(Math.random()*10+1);//避免分母出现零
if(fraction1!=fraction2){ //避免出现分子分母相同
if(fraction1<fraction2){ //避免出现假分数
fraction[0]=fraction1;
fraction[1]=fraction2;
return fraction;
}else{
fraction[0]=fraction2;
fraction[1]=fraction1;
return fraction;
}
}else
createFraction();
return fraction;
}
public main()//计算四则运算并输出
{
new Thread(myTimeRunable).start();
int n = 0;
MainFrame ma= new MainFrame();
int m = (int)(Math.random()*n+1);//随机整数题目和分数题目的题量
try{
//调用初始化方法
jbInit();
}
catch(Exception exception){
exception.printStackTrace();
}
try{
n= Integer.parseInt(ma.number);
}catch(NumberFormatException e){
//利用消息对话框提示输入失败
JOptionPane.showMessageDialog(this,"输入错误!请重新输入");
}
for(int j=0;j<(n-m);j++){//整数题目
String ans;
int op=(int)(Math.random()*5+1);//随机选择计算符
int num1=(int)(Math.random()*10+1);//随机两个整数
int num2=(int)(Math.random()*10+1);
if(op==1){//加法
Question.add(num1+"+"+num2+"=");
Answer.add(num1+num2+"");
}
if(op==2){//减法,防止出现负数
if(num1>num2){
Question.add(num1+"-"+num2+"=");
Answer.add(num1-num2+"");
}
else{
Question.add(num2+"-"+num1+"=");
Answer.add(num2-num1+"");
}
}
if(op==3){//乘法
Question.add(num1+"*"+num2+"=");
Answer.add(num1*num2+"");
}
if(op==4){//除法
Question.add(num1+"÷"+num2+"=");
if(num1%num2==0){
Answer.add(num1/num2+"");
}else{
int num3=GCD(num1,num2);
num1=num1/num3;
num2=num2/num3;
String a = num1+"/"+num2;
Answer.add(a+"");
}
}
if(op==5) {//乘方
Question.add(num1+"^"+num2+"=");
Answer.add(Math.pow(num1,num2)+"");
}
}
for(int j=0;j<m;j++){//分数题目
Scanner in = new Scanner(System.in);//真分数的计算
int op=(int)(Math.random()*4+1);
int[] f1 =createFraction();
int[] f2 =createFraction();
int j1=GCD(f1[0],f1[1]);
f1[0]=f1[0]/j1;//化简分数
f1[1]=f1[1]/j1;
j1=GCD(f2[0],f2[1]);
f2[0]=f2[0]/j1;
f2[1]=f2[1]/j1;
int gbs = LCM(f1[1],f2[1]);
if(op==1){//加法
Question.add("("+f1[0]+"/"+f1[1]+")+("+f2[0]+"/"+f2[1]+")=");
int num1=f1[0]*f2[1]+f2[0]*f1[1];
int num2=f1[1]*f2[1];
int num3=GCD(num1,num2);
num1=num1/num3;
num2=num2/num3;
String a=new String();
if(num1==num2)
{
a="1";
}
else
{
a=num1+"/"+num2;
}
Answer.add(a+"");
}
if(op==2){//减法
int num1=f1[0]*f2[1]-f2[0]*f1[1];
if(num1>0){ //防止出现负数
Question.add("("+f1[0]+"/"+f1[1]+")-("+f2[0]+"/"+f2[1]+")=");
int num2=f1[1]*f2[1];
String a=new String();
if(num1==0)
{
a="0";
}
else
{
int num3=Math.abs(GCD(num1,num2));
num1=num1/num3;
num2=num2/num3;
if(num1==num2)
{
a="1";
}
else
{
a=num1+"/"+num2;
}
}
Answer.add(a+"");
}else{
Question.add("("+f2[0]+"/"+f2[1]+")-("+f1[0]+"/"+f1[1]+")=");
int num11=f2[0]*f1[1]-f1[0]*f2[1];
int num2=f1[1]*f2[1];
String a=new String();
if(num11==0)
{
a="0";
}
else
{
int num3=Math.abs(GCD(num11,num2));
num11=num11/num3;
num2=num2/num3;
if(num11==num2)
{
a="1";
}
else
{
a=num11+"/"+num2;
}
}
Answer.add(a+"");
}
}
if(op==3){//乘法
Question.add("("+f1[0]+"/"+f1[1]+")*("+f2[0]+"/"+f2[1]+")=");
int num1= f1[0]*f2[0];
int num2 = f1[1]*f2[1];
int num3=GCD(num1,num2);
String a=new String();
num1= num1/num3;
num2 = num2/num3;
if(num1==num2)
{
a="1";
}
else
{
a=num1+"/"+num2;
}
Answer.add(a+"");
}
if(op==4){//除法
Question.add("("+f1[0]+"/"+f1[1]+")÷("+f2[0]+"/"+f2[1]+")=");
int num1= f1[0]*f2[1];
int num2 = f1[1]*f2[0];
int num3=GCD(num1,num2);
String a=new String();
num1= num1/num3;
num2 = num2/num3;
if(num1==num2)
{
a="1";
}
else
{
a=num1+"/"+num2;
}
Answer.add(a+"");
}
}
//输出题目
JTextArea0.setText("");
for(String string : Question){
num ++;
JTextArea0.append("("+num+")、"+string+"\n");
}
}
//计时器
private class MyRunable implements Runnable{
private int hour = 0;
private int min = 0;
private int sec = 0;
private NumberFormat format = NumberFormat.getInstance();
private String nextSecond(){
++sec;
if(sec == 60) {
++min;
sec = 0;
}
if(min == 60) {
++hour;
min = 0;
}
return currentTime();
}
private String currentTime(){
return format.format(hour)+":"+format.format(min)+":"+format.format(sec);
}
@Override
public void run() {
format.setMinimumIntegerDigits(2);
format.setGroupingUsed(false);
while(true) {
if(rootPaneCheckingEnabled) {
if(isRun) {
nextSecond();
jLabel4.setText(currentTime());
}
}
try {
Thread.sleep(1000);
}catch (InterruptedException e) {
}
}
}
}
@Override
//菜单项事件对应的处理方法
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
//点击“系统”菜单下的“退出”菜单项
if(e.getSource()==jButton0)
{
int num1=0;
JTextArea2.setText("");
for(String string : Answer){//输出正确答案
num1 ++;
JTextArea2.append("("+num1+")、"+string+"\n");
}
//获取答案并对比得正确率
String[] ans = JTextArea1.getText().split("\n");
for(int i = 0;i < ans.length;i++){
answer.add(ans[i]+"");
}
for(String str:answer)
{
if(Answer.contains(str))
{
right++;
}
}
int sum;
sum=right*100/num1;
JTextArea3.append(sum+"%");
isRun = false;
}
//计时开始
if(e.getSource()==jButton2)
{
isRun = true;
}
//继续做题
if(e.getSource()==jButton1)
{
MainFrame MF=new MainFrame();
//移除主框架上原有的内容
this.remove(this.getRootPane());
this.dispose();
MF.setVisible(true);
}
}
代码规范
代码风格的原则是:简明,易读,无二义性。
缩进用四个空格
行宽100字符
在复杂的条件表达式中,用括号清楚地表示逻辑优先级。
断行时每个“{”和“}”都独占一行。
分行不把多行语句放在一行上。
命名采用“匈牙利命名法”。
下划线用来分隔变量名字中的作用域标注和变量的语义。
所有的类型/类/函数名都用Pascal形式,所有的变量都用Camel形式。
复杂的注释应该放在函数头,注释(包括所有源代码)只用ASCII字符,不用中文或其他特殊字符。
团队讨论照片
浏览所有代码考虑代码质量和测试覆盖率
运行测试
PSP表格
小结
初次结对编程,感觉很是不习惯,没有1+1>2的感觉,可能是默契度不够,磨合一段时间应该就好了。