结对编程

陈颖锋 陈颖锋     2022-09-24     392

关键词:

作业 结对编程

一 结对成员

陈颖锋 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对象的操作)

业务类:

 1 @Service
 2 public class MainService {
 3 
 4 public List<String> getQuestList(int num,int random) {
 5 if (num <= 0)
 6 throw new InputMismatchException();
 7 if (random <= 0)
 8 throw new InputMismatchException();
 9 List<String> list=new ArrayList<String>();    
10 for (int i = 0; i <num ; i++) {
11 String str= Util.calStringCreate(random);
12 
13 list.add(str);
14 
15 }
16 return list;
17 
18 
19 }
20 
21 
22 public List<String> getResult(List<String> quest,List<String> answer) {
23 List<String> list=new ArrayList<String>();
24 if(quest.size()!=answer.size())
25 try {
26 throw new Exception("输入不匹配");
27 } catch (Exception e) {
28 // TODO Auto-generated catch block
29 e.printStackTrace();
30 }
31 for (int i = 0; i < quest.size(); i++) {
32 String str=quest.get(i);
33 String rs= Math.calc(str);
34 if(answer.get(i).equals(rs)){
35 list.add("正确");
36 }
37 else{
38 list.add("错误");
39 }
40 }
41 return list;
42 }
43 
44 
45 }

 

数学类:

  1 /**
  2 * Created by computer on 2017/9/26.
  3 * 计算运算字符串的类
  4 */
  5 public class Math {
  6 /**
  7 * @param str 需要运算的字符串
  8 */
  9 public static boolean isBracket(String str){
 10 String regex=".*\\(.*";
 11 return str.matches(regex);
 12 }
 13 
 14 
 15 /**
 16 *计算没有括号得到字符串
 17 * @param str 运算字符串
 18 * @return FenShu的fenshu变量
 19 */
 20 public static String calc(String str){
 21 /*
 22 1得到运算符的List集合
 23 2得到操作数的List集合
 24 3计算
 25 */
 26 List<Character> opList=getOpList(str);
 27 List<FenShu> numList=getNumList(str);
 28 FenShu result=jisuan(opList,numList);
 29 return Util.trueFenShu(result);
 30 }
 31 
 32 /**
 33 *
 34 * @param i:运算符的下标
 35 * @param c:运算符
 36 * @param num:操作数集合
 37 */
 38 public static void mulDiv(int i,Character c,List<FenShu> num){
 39 if (c == '*' || c == '/') {//删除*/运算符并进行对应数值的计算 结果保存
 40 FenShu opl = num.get(i);
 41 FenShu opr = num.get(i + 1);
 42 if (c == '*') {
 43 num.set(i + 1, fenShuMul(opl, opr));
 44 } else if (c == '/') {
 45 num.set(i + 1, fenShuDivi(opl, opr));
 46 }
 47 }
 48 }
 49 
 50  
 51 
 52 /**
 53 *
 54 * @param op 操作符集合
 55 * @param num 操作数集合
 56 * @return 真分数值
 57 */
 58 public static FenShu jisuan(List<Character> op,List<FenShu> num){
 59 //遍历运算符集合提取出+ -的下标并用二维数组保存+ -分割的运算符字符集
 60 List <Integer>opList1=new ArrayList<Integer>();
 61 for (int i = 0; i <op.size() ; i++) {
 62 if (op.get(i)=='+'||op.get(i)=='-'){
 63 opList1.add(i);
 64 }
 65 }
 66 if(opList1.size()>0){
 67 if (0<opList1.get(0)) {
 68 for (int i = 0; i < opList1.get(0); i++) {//下标从0到小于opList1.get(0)
 69 Character c = op.get(i);
 70 mulDiv(i,c,num);
 71 }
 72 }
 73 if (opList1.size()>1)
 74 for (int i = 0; i < opList1.size(); i++) {//目的求被+-分割起来的区域 从运算符集合+-后的*/开始直到下一个+-运算符出现
 75 for (int j = opList1.get(i)+1; j <opList1.get(i+1) ; j++) {
 76 Character c=op.get(j);
 77 mulDiv(j,c,num);
 78 }
 79 if (opList1.get(i+1)==opList1.get(opList1.size()-1))//末尾时候退出
 80 break;
 81 }
 82 if (opList1.get(opList1.size()-1)!=op.size()-1){//如果+-符号不是是运算符集合的最后一位 需要对于后面的式子进行乘除计算
 83 for (int j = opList1.get(opList1.size()-1)+1; j <op.size() ; j++) {
 84 Character c=op.get(j);
 85 mulDiv(j,c,num);
 86 }
 87 }
 88 }
 89 else if (opList1.size()==0){
 90 for (int i = 0; i < op.size(); i++) {//下标从0到小于opList1.get(0)
 91 Character c = op.get(i);
 92 mulDiv(i,c,num);
 93 }
 94 }
 95 //这是先乘除之后的数 和 需要加减的符号
 96 // if (opList1.size()>0)
 97 // for (int i:opList1) {
 98 // System.out.println(num.get(i).getFenzi()+"/"+num.get(i).getFenmu());
 99 // System.out.println(op.get(i));
100 // }
101 // System.out.println(num.get(num.size()-1).getFenzi()+"/"+num.get(num.size()-1).getFenmu());
102 List<Character> opList2=new ArrayList<Character>();
103 List<FenShu> numList2=new ArrayList<FenShu>();
104 if (opList1.size()>0)
105 for (int i:opList1) {
106 numList2.add(num.get(i));
107 opList2.add(op.get(i));
108 }
109 numList2.add(num.get(num.size()-1));
110 while (!opList2.isEmpty()){
111 Character c=opList2.remove(0);
112 FenShu opl=numList2.remove(0);
113 FenShu opr=numList2.remove(0);
114 
115 if(c=='+'){
116 numList2.add(0, fenShuAdd(opl,opr));
117 }
118 else if(c=='-'){
119 numList2.add(0, fenShuSub(opl,opr));
120 }
121 }
122 return numList2.get(0);
123 }
124 
125 
126 /**
127 *
128 * @param str 运算的字符串
129 * @return 返回运算符集合
130 */
131 
132 public static List<Character> getOpList(String str){
133 List<Character> list = new ArrayList<Character>();
134 String regex = "[0-9]*";
135 Pattern pattern=Pattern.compile(regex);
136 String []split=pattern.split(str);
137 for (int i = 0; i <split.length; i++) {
138 String tmp=split[i].trim();
139 if(tmp.equals("+")|tmp.equals("-")|tmp.equals("*")|tmp.equals("/")){
140 list.add(tmp.trim().charAt(0));
141 }
142 }
143 return list;
144 }
145 
146 /**
147 *
148 * @param str 运算的字符串
149 * @return 返回FenShu类型的集合
150 */
151 public static List getNumList(String str){
152 List<FenShu> list = new ArrayList<FenShu>();
153 String regex = "\\+|-|\\*|/";
154 Pattern pattern=Pattern.compile(regex);
155 String []split=pattern.split(str);
156 for (int i = 0; i <split.length; i++) {
157 String tmp=split[i].trim();
158 String regex2="[0-9]+";
159 if(tmp.matches(regex2)){
160 Integer num=Integer.valueOf(tmp);
161 FenShu fenshu=new FenShu(num,1);
162 list.add(fenshu);
163 }
164 }
165 return list;
166 }
167 
168 /**
169 * 分数类的加减乘除
170 * @param fenshu1
171 * @param fenshu2
172 * @return
173 */
174 
175 
176 public static FenShu fenShuAdd(FenShu fenshu1, FenShu fenshu2){
177 int lcm=getMinMul(fenshu1.getFenmu(),fenshu2.getFenmu());//z最小公倍数 未化简的分母
178 int numera=(lcm/fenshu1.getFenmu())*fenshu1.getFenzi()+(lcm/fenshu2.getFenmu())*fenshu2.getFenzi();//最小公倍数除以分母乘以分子相加 这是分子和
179 int gcd= getMaxDiv(numera,lcm);//最大公约数 可以约的值
180 numera/=gcd;
181 int deomina=lcm/gcd;
182 FenShu fenshu3=new FenShu(numera,deomina);
183 return fenshu3;
184 }
185 
186 public static FenShu fenShuSub(FenShu fenshu1, FenShu fenshu2){
187 int lcm=getMinMul(fenshu1.getFenmu(),fenshu2.getFenmu());//z最小公倍数 未化简的分母
188 int numera=(lcm/fenshu1.getFenmu())*fenshu1.getFenzi()-(lcm/fenshu2.getFenmu())*fenshu2.getFenzi();//最小公倍数除以分母乘以分子相加 这是分子和
189 int gcd= getMaxDiv(numera,lcm);//最大公约数 可以约的值
190 numera/=gcd;
191 int deomina=lcm/gcd;
192 FenShu fenshu3=new FenShu(numera,deomina);
193 return fenshu3;
194 }
195 
196 
197 public static FenShu fenShuMul(FenShu fenshu1, FenShu fenshu2){
198 int a,b,c,d;
199 a=fenshu1.getFenzi();
200 b=fenshu1.getFenmu();
201 c=fenshu2.getFenzi();
202 d=fenshu2.getFenmu();
203 int numera=a*c;
204 int deomina=b*d;
205 if(deomina<0) {
206 throw new RuntimeException("分母不能小于0");
207 }
208 int gcd=getMaxDiv(numera,deomina);
209 numera/=gcd;
210 deomina/=gcd;
211 FenShu fenshu3=new FenShu(numera,deomina);
212 return fenshu3;
213 }
214 public static FenShu fenShuDivi(FenShu fenshu1, FenShu fenshu2){
215 int a,b,c,d;
216 a=fenshu1.getFenzi();
217 b=fenshu1.getFenmu();
218 c=fenshu2.getFenmu();
219 d=fenshu2.getFenzi();
220 int numera=a*c;
221 int deomina=b*d;
222 if(deomina<0) {
223 numera = -1*numera;
224 deomina=-1*deomina;
225 }
226 int gcd=getMaxDiv(numera,deomina);
227 numera/=gcd;
228 deomina/=gcd;
229 FenShu fenshu3=new FenShu(numera,deomina);
230 return fenshu3;
231 }
232 
233 
234 /**
235 * 求最小公倍数
236 */
237 
238 public static int getMinMul(int a,int b){
239 
240 int c=a*b/getMaxDiv(a,b);
241 return c;
242 }
243 
244 /**
245 * 求最大公约数
246 */
247 public static int getMaxDiv(int a,int b){
248 if (a<0)
249 a=java.lang.Math.abs(a);
250 if(b<0)
251 throw new RuntimeException("分母不能小于0");
252 while (b!=0){
253 int c=a%b;
254 a=b;
255 b=c;
256 }
257 return a;
258 }
259 
260  
261 
262 }

 

工具类:

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

 1 public class Util {
 2 public static String trueFenShu(FenShu fs){
 3 int abs= Math.abs(fs.getFenzi());
 4 if (abs<fs.getFenmu())
 5 return fs.getFenzi()+"/"+fs.getFenmu();
 6 else if (abs==fs.getFenmu())
 7 return String.valueOf(fs.getFenzi()/fs.getFenmu());
 8 else {
 9 int num=abs/fs.getFenmu();
10 int fenzi=abs%fs.getFenmu();
11 if (fenzi==0){
12 if (fs.getFenzi()>=0)
13 return num+"";
14 else
15 return "-"+num;
16 }
17 if (fs.getFenzi()>=0)
18 return num+"'"+fenzi+"/"+fs.getFenmu();
19 else
20 return "-"+num+"'"+fenzi+"/"+fs.getFenmu();
21 }
22 }
23 
24 
25 public static String calStringCreate(int r){
26 char []c={'+','-','*','/'};//操作符数组
27 Random random=new Random();
28 StringBuffer str=new StringBuffer();
29 int n= random.nextInt(3)+1;
30 int num=random.nextInt(r-1)+1;
31 str.append(num);
32 for (int i = 0; i <n ; i++) {//在1到3范围内随机个数的运算符
33 char c2=c[(int)(c.length* java.lang.Math.random())];//生成随机操作符
34 int num2=random.nextInt(r-1)+1;//生成大于0小于r的自然数
35 str.append(c2);
36 str.append(num2);
37 }
38 return str.toString();
39 }
40 
41 public static void main(String[] args) {
42 calStringCreate(20);
43 }
44 }

 

分数类:

 1 public class FenShu {
 2 //整数int 分子 分母 真分数
 3 private int fenzi;
 4 private int fenmu;
 5 
 6 
 7 public FenShu(int fenzi, int fenmu) {
 8 if (fenmu<=0)
 9 throw new RuntimeException("分母不能小于0");
10 this.fenzi = fenzi;
11 this.fenmu = fenmu;
12 }
13 
14 public int getFenzi() {
15 return fenzi;
16 }
17 
18 public int getFenmu() {
19 return fenmu;
20 }
21 
22 public void setFenzi(int fenzi) {
23 this.fenzi = fenzi;
24 }
25 
26 public void setFenmu(int fenmu) {
27 if (fenmu<=0)
28 throw new RuntimeException("分母不能小于0");
29 this.fenmu = fenmu;
30 }
31 }

 

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

     

 

四 小结

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

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

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

我们都希望把作业做好,但是可能习惯各做各的,难免缺少沟通,我自己的问题很多,同伴给予了很多帮助,希望多沟通,以后能够一起把更多的事情做好。

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

<

结对编程项目

内容:成员0:学号:2015035107149姓名:黄妍成员1:学号:2015035107154姓名:马璐结对编程项目作业名称:井字棋游戏选择该结对编程项目原因:巩固自己的知识,让自己能更加熟练的编程。 查看详情

浅谈结对编程

浅谈结对编程 结对编程  结对编程,是一种敏捷软件开发的方法,极限编程的组成部分。结对编程技术是指两位程序员肩并肩地坐在同一台电脑前合作完成同一个设计、同一个算法、同一段代码或同一组测试。一人充当&ld... 查看详情

结对编程心得

结对编程是我第一次听说到的一个编程方式,结对编程就是两个人组成一个小队伍进行编程,是一种新的编程思想。结对编程的优点有以下这几点第一点,就是思考问题的角度,一个人思考问题肯定没有两个人思考问题来的明白... 查看详情

结对编程

结对编程技术是指两位程序员坐在同一工作台前开发软件。与两位程序员各自独立工作相比,结对编程能编写出质量更高的代码。我的结对编程的队友是徐冉,我们互相了解,形成一定的默契,徐冉同学对任何事情一丝不拘的态... 查看详情

week4结对编程

1.照片  1.1 结对编程参与者:李文涛、黎柏文  1.2 展示照片    2.结对编程的优点&缺点  2.1优点    2.1.1、两人分工合作,减少了工作量    2.1.2、结对编程的伙伴往往能提供不同的思维,能提高... 查看详情

结对编程作业

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

结对编程

我的结对编程队友:周云关于结对编程,发现了一些新的受益之处。首先,它可以促进我们自身的提高,两个人一起看代码时,能取长补短。我和我的结对编程队友一起看代码,然后我们互相交流一下各自的意见,从而把我们的... 查看详情

结对编程作业

结对编程作业(黄金点游戏)我的角色:驾驶员。结对编程伙伴:王香友(领航者)。1.源代码已上传到coding.net中,网址如下: https://coding.net/u/Qbj/p/STAR-COD/git/blob/master/huangjiandianyouxi2.结对编程作业总结、过程图片、运行结果... 查看详情

结对编程作业

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

结对编程项目作业

 结对编程项目作业内容:成员0:    学号:2015035107153    姓名:吕爽成员1:    学号:2015035107155    姓名:陶丽爽结对编程项目作业名称:四则运算出题器。选择该结对编程项目... 查看详情

结对编程

  结对编程是指两个人在同一台电脑上进行的编程,其实结对编程做起来很简单也很有趣,找个水平差不多的和自己配成一对。只用一台计算机,大家选一个人坐在键盘前面负责输入,另一个人坐在后面口述。两个人要不... 查看详情

结对编程体会

...,在试用了两种方法后,选择了一个比较好的编写程序,结对编程减少了自己一个人想不到问题浪费的时间,结对编程有利于自己编程能力的提高,也有利于交流思想。 查看详情

第五周任务以及结对编程

...容有下:    1.完成自己没完成的任务。    2.结对编程。    3.PSP。    4.站立会议(待开)。    5.燃尽图。具体任务如下:    这次结对编程我是和高鑫同学进行结对,在对构建之法这本书的学习... 查看详情

结对编程

   1.结对编程任务分配:    驾驶员:王璐    领航员:谢雨豪  2.黄金点程序代码地址:    https://coding.net/u/xyh103/p/a103/git/blob/master/main.cpp  3.结对编程心得总结:    这次的编程任务是我与王璐同学... 查看详情

结对编程

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

结对编程

结对编程顾名思义就是和队友一起合作编程,共同完成项目开发。这次结对编程我的结对队友是张梦秋,为什么会选择和她合作呢?因为在以前的项目实训中我们就彼此合作过,感觉彼此能有默契的配合完成工作,而且我们还是... 查看详情

201521123072结对编程(代码片段)

软件工程结对编程作业1.结对信息1.1结对编程成员:黄晓杨:201521123071秦贞一:2015211230721.2项目开发的码云地址:https://gitee.com/HXY071/four_operations.git1.3结对照片:1.4所选代码个人博客地址5:http://www.cnblogs.com/NianQiFeng,源代码:http... 查看详情

结对编程作业

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