作业结对编程

羊不吃草 羊不吃草     2022-09-24     110

关键词:

作业 结对编程

一 结对成员

陈颖锋 201421122113

许鸿洋 201421122114

项目开发的coding.net 地址:https://coding.net/u/ricardoCYF/p/zuoye3/git

二 项目描述

  1. 一个小组中的两个同学选取比较优秀的 作业1  (两个人的都独立完成了),  把它作为本次作业的基础,然后再修改。
  1. 结对编程实现上述功能,同样的,在程序正式开发之前,请先预估下PSP每个环节的消耗时间,并在过程中统计实际耗时,最后提交PSP表格。依然注意,这个主要是给你们自己看的,不必造假数据。
  1. 两人合作的过程中, 请看下面的内容
  1. 满足代码风格规范代码设计规范(参考书第4章4.1-4.3内容)http://www.cnblogs.com/xinz/archive/2011/11/20/2255971.html
  1. 请重视这点,在开发时两个人要有口头上的沟通:“好的,我们一起在开发中遵守一起认可的编码规范”
  1. 请把你们约定的编码规范文档也提交到git
  1. 给人提意见的方式——送一个汉堡包http://www.cnblogs.com/xinz/archive/2011/08/22/2148776.html
  1. 理解领航员和驾驶员两种角色关系,并在结对编程中两个人轮流做对方的角色。两人都必须参与本次作业的编码工作,并在git提交日志上体现这点。
 三 项目实现
  1.需求分析:
    题目自动生成, 答题
  1. 程序设计
     题目自动生成(根据数量和范围) 答题(做题  答案验证 得出正确答案)
  1. 代码展示:展示每个功能的核心代码。

控制器(url转发处理)——业务类(进行业务处理)——使用工具类生成运算字符串——数学类(解析字符串转成FenShu对象的操作)

业务类:

@Service
public class MainService {

public List<String> getQuestList(int num,int random) {
if (num <= 0)
throw new InputMismatchException();
if (random <= 0)
throw new InputMismatchException();

List<String> list=new ArrayList<String>();
for (int i = 0; i <num ; i++) {
String str= Util.calStringCreate(random);

list.add(str);

}
return list;


}


public List<String> getResult(List<String> quest,List<String> answer) {
List<String> list=new ArrayList<String>();
if(quest.size()!=answer.size())
try {
throw new Exception("输入不匹配");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int i = 0; i < quest.size(); i++) {
String str=quest.get(i);
String rs= Math.calc(str);
if(answer.get(i).equals(rs)){
list.add("正确");
}
else{
list.add("错误");
}
}
return list;
}


}

数学类:

/**
* Created by computer on 2017/9/26.
* 计算运算字符串的类
*/
public class Math {
/**
* @param str 需要运算的字符串
*/
public static boolean isBracket(String str){
String regex=".*\\(.*";
return str.matches(regex);
}


/**
*计算没有括号得到字符串
* @param str 运算字符串
* @return FenShu的fenshu变量
*/
public static String calc(String str){
/*
1得到运算符的List集合
2得到操作数的List集合
3计算
*/
List<Character> opList=getOpList(str);
List<FenShu> numList=getNumList(str);
FenShu result=jisuan(opList,numList);
return Util.trueFenShu(result);
}

/**
*
* @param i:运算符的下标
* @param c:运算符
* @param num:操作数集合
*/
public static void mulDiv(int i,Character c,List<FenShu> num){
if (c == '*' || c == '/') {//删除*/运算符并进行对应数值的计算 结果保存
FenShu opl = num.get(i);
FenShu opr = num.get(i + 1);
if (c == '*') {
num.set(i + 1, fenShuMul(opl, opr));
} else if (c == '/') {
num.set(i + 1, fenShuDivi(opl, opr));
}
}
}

 

/**
*
* @param op 操作符集合
* @param num 操作数集合
* @return 真分数值
*/
public static FenShu jisuan(List<Character> op,List<FenShu> num){
//遍历运算符集合提取出+ -的下标并用二维数组保存+ -分割的运算符字符集
List <Integer>opList1=new ArrayList<Integer>();
for (int i = 0; i <op.size() ; i++) {
if (op.get(i)=='+'||op.get(i)=='-'){
opList1.add(i);
}
}
if(opList1.size()>0){
if (0<opList1.get(0)) {
for (int i = 0; i < opList1.get(0); i++) {//下标从0到小于opList1.get(0)
Character c = op.get(i);
mulDiv(i,c,num);
}
}
if (opList1.size()>1)
for (int i = 0; i < opList1.size(); i++) {//目的求被+-分割起来的区域 从运算符集合+-后的*/开始直到下一个+-运算符出现
for (int j = opList1.get(i)+1; j <opList1.get(i+1) ; j++) {
Character c=op.get(j);
mulDiv(j,c,num);
}
if (opList1.get(i+1)==opList1.get(opList1.size()-1))//末尾时候退出
break;
}
if (opList1.get(opList1.size()-1)!=op.size()-1){//如果+-符号不是是运算符集合的最后一位 需要对于后面的式子进行乘除计算
for (int j = opList1.get(opList1.size()-1)+1; j <op.size() ; j++) {
Character c=op.get(j);
mulDiv(j,c,num);
}
}
}
else if (opList1.size()==0){
for (int i = 0; i < op.size(); i++) {//下标从0到小于opList1.get(0)
Character c = op.get(i);
mulDiv(i,c,num);
}
}
//这是先乘除之后的数 和 需要加减的符号
// if (opList1.size()>0)
// for (int i:opList1) {
// System.out.println(num.get(i).getFenzi()+"/"+num.get(i).getFenmu());
// System.out.println(op.get(i));
// }
// System.out.println(num.get(num.size()-1).getFenzi()+"/"+num.get(num.size()-1).getFenmu());
List<Character> opList2=new ArrayList<Character>();
List<FenShu> numList2=new ArrayList<FenShu>();
if (opList1.size()>0)
for (int i:opList1) {
numList2.add(num.get(i));
opList2.add(op.get(i));
}
numList2.add(num.get(num.size()-1));
while (!opList2.isEmpty()){
Character c=opList2.remove(0);
FenShu opl=numList2.remove(0);
FenShu opr=numList2.remove(0);

if(c=='+'){
numList2.add(0, fenShuAdd(opl,opr));
}
else if(c=='-'){
numList2.add(0, fenShuSub(opl,opr));
}
}
return numList2.get(0);
}


/**
*
* @param str 运算的字符串
* @return 返回运算符集合
*/

public static List<Character> getOpList(String str){
List<Character> list = new ArrayList<Character>();
String regex = "[0-9]*";
Pattern pattern=Pattern.compile(regex);
String []split=pattern.split(str);
for (int i = 0; i <split.length; i++) {
String tmp=split[i].trim();
if(tmp.equals("+")|tmp.equals("-")|tmp.equals("*")|tmp.equals("/")){
list.add(tmp.trim().charAt(0));
}
}
return list;
}

/**
*
* @param str 运算的字符串
* @return 返回FenShu类型的集合
*/
public static List getNumList(String str){
List<FenShu> list = new ArrayList<FenShu>();
String regex = "\\+|-|\\*|/";
Pattern pattern=Pattern.compile(regex);
String []split=pattern.split(str);
for (int i = 0; i <split.length; i++) {
String tmp=split[i].trim();
String regex2="[0-9]+";
if(tmp.matches(regex2)){
Integer num=Integer.valueOf(tmp);
FenShu fenshu=new FenShu(num,1);
list.add(fenshu);
}
}
return list;
}

/**
* 分数类的加减乘除
* @param fenshu1
* @param fenshu2
* @return
*/


public static FenShu fenShuAdd(FenShu fenshu1, FenShu fenshu2){
int lcm=getMinMul(fenshu1.getFenmu(),fenshu2.getFenmu());//z最小公倍数 未化简的分母
int numera=(lcm/fenshu1.getFenmu())*fenshu1.getFenzi()+(lcm/fenshu2.getFenmu())*fenshu2.getFenzi();//最小公倍数除以分母乘以分子相加 这是分子和
int gcd= getMaxDiv(numera,lcm);//最大公约数 可以约的值
numera/=gcd;
int deomina=lcm/gcd;
FenShu fenshu3=new FenShu(numera,deomina);
return fenshu3;
}

public static FenShu fenShuSub(FenShu fenshu1, FenShu fenshu2){
int lcm=getMinMul(fenshu1.getFenmu(),fenshu2.getFenmu());//z最小公倍数 未化简的分母
int numera=(lcm/fenshu1.getFenmu())*fenshu1.getFenzi()-(lcm/fenshu2.getFenmu())*fenshu2.getFenzi();//最小公倍数除以分母乘以分子相加 这是分子和
int gcd= getMaxDiv(numera,lcm);//最大公约数 可以约的值
numera/=gcd;
int deomina=lcm/gcd;
FenShu fenshu3=new FenShu(numera,deomina);
return fenshu3;
}


public static FenShu fenShuMul(FenShu fenshu1, FenShu fenshu2){
int a,b,c,d;
a=fenshu1.getFenzi();
b=fenshu1.getFenmu();
c=fenshu2.getFenzi();
d=fenshu2.getFenmu();
int numera=a*c;
int deomina=b*d;
if(deomina<0) {
throw new RuntimeException("分母不能小于0");
}
int gcd=getMaxDiv(numera,deomina);
numera/=gcd;
deomina/=gcd;
FenShu fenshu3=new FenShu(numera,deomina);
return fenshu3;
}
public static FenShu fenShuDivi(FenShu fenshu1, FenShu fenshu2){
int a,b,c,d;
a=fenshu1.getFenzi();
b=fenshu1.getFenmu();
c=fenshu2.getFenmu();
d=fenshu2.getFenzi();
int numera=a*c;
int deomina=b*d;
if(deomina<0) {
numera = -1*numera;
deomina=-1*deomina;
}
int gcd=getMaxDiv(numera,deomina);
numera/=gcd;
deomina/=gcd;
FenShu fenshu3=new FenShu(numera,deomina);
return fenshu3;
}


/**
* 求最小公倍数
*/

public static int getMinMul(int a,int b){

int c=a*b/getMaxDiv(a,b);
return c;
}

/**
* 求最大公约数
*/
public static int getMaxDiv(int a,int b){
if (a<0)
a=java.lang.Math.abs(a);
if(b<0)
throw new RuntimeException("分母不能小于0");
while (b!=0){
int c=a%b;
a=b;
b=c;
}
return a;
}

 

}

工具类:

随机生成运算字符串 将分数类转成真分数的字符串形式

public class Util {
public static String trueFenShu(FenShu fs){
int abs= Math.abs(fs.getFenzi());
if (abs<fs.getFenmu())
return fs.getFenzi()+"/"+fs.getFenmu();
else if (abs==fs.getFenmu())
return String.valueOf(fs.getFenzi()/fs.getFenmu());
else {
int num=abs/fs.getFenmu();
int fenzi=abs%fs.getFenmu();
if (fenzi==0){
if (fs.getFenzi()>=0)
return num+"";
else
return "-"+num;
}
if (fs.getFenzi()>=0)
return num+"'"+fenzi+"/"+fs.getFenmu();
else
return "-"+num+"'"+fenzi+"/"+fs.getFenmu();
}
}


public static String calStringCreate(int r){
char []c={'+','-','*','/'};//操作符数组
Random random=new Random();
StringBuffer str=new StringBuffer();
int n= random.nextInt(3)+1;
int num=random.nextInt(r-1)+1;
str.append(num);
for (int i = 0; i <n ; i++) {//在1到3范围内随机个数的运算符
char c2=c[(int)(c.length* java.lang.Math.random())];//生成随机操作符
int num2=random.nextInt(r-1)+1;//生成大于0小于r的自然数
str.append(c2);
str.append(num2);
}
return str.toString();
}

public static void main(String[] args) {
calStringCreate(20);
}
}

分数类:

public class FenShu {
//整数int 分子 分母 真分数
private int fenzi;
private int fenmu;


public FenShu(int fenzi, int fenmu) {
if (fenmu<=0)
throw new RuntimeException("分母不能小于0");
this.fenzi = fenzi;
this.fenmu = fenmu;
}

public int getFenzi() {
return fenzi;
}

public int getFenmu() {
return fenmu;
}

public void setFenzi(int fenzi) {
this.fenzi = fenzi;
}

public void setFenmu(int fenmu) {
if (fenmu<=0)
throw new RuntimeException("分母不能小于0");
this.fenmu = fenmu;
}
}

  1. 程序运行:程序运行及每个功能的使用截图

     

 

四 小结

  1.小结感受:结对编程真的能够带来1+1>2的效果吗?通过这次结对编程,请谈谈你的感受和体会。

可以的,头脑风暴,多沟通

  2.运用“汉堡包”的方式,评价你的合作伙伴,指出优点、缺点,希望ta提高的地方

最外层:  行为和后果 :第一次结对,容易误解

中间层:  习惯和动机 :习惯一个人做事不沟通,都是为了更好

最内层:  本质和基本属性 :缺少沟通

  3.提供此次结对作业的PSP,PSP 表格中请填写花费的时间 (单位: 分钟), 而不是每一步所占的比例。

psp2.1

Personal Software Process Stages

Time Senior Student(min)

Time(min)

Planning

计划

200

270

· Estimate

估计这个任务需要多少时间

500

550

Development

开发

450

600

· Analysis

需求分析 (包括学习新技术)

10

20

· Design Spec

生成设计文档

20

30

· Design Review

设计复审

10

10

· Coding Standard

代码规范

15

20

· Design

具体设计

40

60

· Coding

具体编码

300

500

· Code Review

代码复审

15

60

· Test

测试(自我测试,修改代码,提交修改)

20

50

Reporting

报告

60

50

· 

测试报告

60

60

· 

计算工作量

20

30

· 

并提出过程改进计划

30

20

作业结对编程

作业结对编程一结对成员陈颖锋201421122113许鸿洋201421122114项目开发的coding.net地址:https://coding.net/u/ricardoCYF/p/zuoye3/git二项目描述一个小组中的两个同学选取比较优秀的作业1 (两个人的都独立完成了), 把它作为本次作业的... 查看详情

结对编程作业

  最近在写结对编程,通过写结对编程作业了解了在将来的工作会是什么样。在结对编程中使我了解到结对编程的优点。由于我的编程能力能比我队友好一点,所以本次由我来进行编程,我队友进行复查。  本次的作业是黄... 查看详情

结对编程作业

软件工程网络15结对编程作业1.链接学号:201521123069博客链接:http://www.cnblogs.com/kzq-java-markdown/学号:201521123074博客链接:http://www.cnblogs.com/guzhiling/结对编程码云项目链接:https://gitee.com/guzhiling/software_engineering/tree/mas 查看详情

结对编程项目作业0

标题:结对编程项目作业内容:成员0:学号:2015035107003 姓名:鞠牧孜 成员1:学号:2015035107010 姓名:郑月 结对编程项目作业名称:五子棋游戏 选择该结对编程项目原因:因为五子棋游戏是一种受大众喜欢的一款游戏,其... 查看详情

结对编程作业

结对编程成员:王向阳,彭雪峰(http://www.cnblogs.com/PPXXFF/)驾驶员:王向阳领航员:彭雪峰代码链接https://coding.net/u/K_sun/p/code/git/blob/master/goldGame总结:通过此次的结对编程,更加了解到结对编程的好处,通过结对编程可以使自己... 查看详情

2021秋软工实践第一次结对编程作业

这个课程属于哪里构建之法-2021秋-福州大学软件工程这个作业要求在哪里2021秋软工实践第一次结对编程作业这个作业的目标学习体验结对编程,学习设计原型模型学号031902110结对小伙伴学号031902114作业博客地址作业博客2021... 查看详情

结对编程项目作业4

https://gitee.com/Chenggf/JianYiJiSuanQi 新功能:增加了删除功能  查看详情

结对编项目作业

成员0:学号:2015035107095姓名:黄楷铂成员1:学号:20150351020姓名:邓清峰结对编程项目作业名称:自然语言进行数据库查询系统选择该结对编程项目原因:有一些相关的编程经验。 查看详情

结对编程作业

一、角色分配  驾驶员:李良伟领航员:姜懿芙二、编程过程与运行结果1.登入页面 2.游戏页面 3.三、程序代码代码已提交至https://coding.net/u/auroraif/p/201610180/git三、心得体会   较我相比,李良伟的编程水平与... 查看详情

结对编程项目作业2-结对编项目设计文档

航空购票系统成员:刘铭,李德帅开发环境:Androidstdio功能:        查看详情

结对编程作业

 这是第一次尝试结对编程,在本次结对编程作业中为了更好地体会它的好处和特点,我和我的搭档分别扮演了驾驶员和领航者的角色。 作为驾驶员:在我编程的过程中,出现了一些小问题,比如忘加分号,这些小问题可... 查看详情

结对编程项目作业5

结对成员:  学号:201503510077 董馨遥  学号:2015035107084 杨璐结对成员合照:假设这里有一张照片程序运行方法:首先有python2.7.5,打开文件直接运行就可以程序运行示例及运行结果:其他附加内容:项目地址链接https://gitee.com... 查看详情

结对编程作业

编程作业一、角色分工  驾驶员:刘阳  领航员:季城宇二、程序代码  代码已提交至coding.net链接如下https://coding.net/u/Arthur0618/p/the-third-assignment/git/blob/master/README.md?filename=README.md三、心得体会     对我... 查看详情

团队作业--结对编程

...地址:https://coding.net/u/rovinglight/p/sums-generator/git 本次作业的完成内容   本次作业基于个人作业一的四则运算程序做增量开发,新增了如下功能 &nb 查看详情

结对编项目作业

 成员1:学号:2015035107001姓名:陈静暄成员2:学号:2015035107004姓名:冷雅丽结对编程项目作业名称:英文词频检测程序选择该结对编程项目原因:因为喜欢 查看详情

结对编项目作业

1:2015035107001  陈静暄2::2015035107004  冷雅丽结对编程项目作业名称:英文词频检测程序选择该结对编程项目原因:因为喜欢 查看详情

软件工程网络15结对编程作业(201521123045)

一.结对编程成员:郑子熙(201521123045):陈文俊(201521123047):二.对原有程序分析:三.改进现有代码:四.代码展示:五.PSP:六.实验小节: 查看详情

结对编程项目作业5

码云最终程序:https://gitee.com/songyx/codes/7xekuy4g9apd1h0frlbvq58结对成员:宋沅修.余兴财学号:2015035107119学号:2015035107130结对成员合照: 程序运行方法:下载pygame.鼠标右键点击贪吃蛇.py点击EditwithIDLE运行程序运行示例及运行结果: ... 查看详情