zoukankan      html  css  js  c++  java
  • 作业 结对编程

    作业 结对编程

    一 结对成员

    陈颖锋 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

  • 相关阅读:
    个人冲刺8
    个人冲刺7
    个人冲刺6
    个人冲刺5
    个人冲刺4
    个人冲刺阶段3
    个人冲刺阶段2
    课下作业1-扩展阅读
    随手快递app开发的第四天
    随手快递app开发的第三天
  • 原文地址:https://www.cnblogs.com/YangJM/p/7712602.html
Copyright © 2011-2022 走看看