14王蕊-03艾璐-实训一
14王蕊-03艾璐-实训一
一,码云链接:https://gitee.com/wrwrwrw/projects
二,结对编程过程照片:
我的搭档:艾璐
三,实训选题:
黄金点
阿超的课都是下午两点钟,这时班上不少的同学都昏昏欲睡,为了让大家兴奋起来,阿超让同学玩一个叫“黄金点”的游戏:
N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。记录每一次游戏每名同学的数字和分数。
四,程序设计思路:首先我们对黄金点的问题进行了相应的简化,先不考虑多轮输出,只进行一轮游戏,最后在添加轮数相关的循环。然后,我们对黄金点程序的编写分了几个部分,分别是从控制台读入数据部分,计算G值部分,条件语句比较最远和最靠近数值部分,实现加分部分,最终输出结果部分。其次,很多变量定义的是全局变量,为了方便二次使用。从控制台读入数据前,我定义了一个Object数组,将读入的数据进行相应的存放。方便最后输出结果时你再次调用。寻找最靠近和最远数值部分,定义了两变量,分别表示最靠近和最远数值,用if语句,进行比较运算,得出数值。具体的内容在代码注释里
五,程序设计流程框架图:
六,代码部分:
GoldPoint.java
import java.util.*; public class GoldPoint { public static void main(String[] args){ GoldPoint gd=new GoldPoint(); gd.goldPoint(); } int n; Object [] m=new Object[50]; //定义Object数组,里面可以放任何类。用来存放输入的数值,Object避免数据类型错误。 int peopleNum; //参加的人数 int time; //进行轮数 public void goldPoint(){ HashMap<String,Double> inputMap=new HashMap<String,Double>(); //存入输入数值 HashMap<String,Double> scoreMap=new HashMap<String,Double>(); //存入分数 String name=""; Double inputScore; Scanner scan=new Scanner(System.in); //参数对象是从控制台读入的数据流 System.out.println("*****黄金点游戏*****"); System.out.println("输入参加游戏的人数:"); peopleNum=scan.nextInt(); n=peopleNum; System.out.println("输入游戏进行的轮数:"); time=scan.nextInt(); System.out.println("第一轮游戏开始!"); Double sum=0.0; Double G=0.0; for(int i=0;i<peopleNum;i++){ System.out.println("请输入第"+(i+1)+"名玩家姓名:"); name=scan.next(); System.out.println("请输入第一轮输入的数值:"); inputScore=scan.nextDouble(); m[i]=inputScore; //将输入的数值存放到数组中 inputMap.put(name, inputScore); scoreMap.put(name,(double) 0);//初始化scoreMap sum+=inputScore; } G=sum/peopleNum*0.618; System.out.println("G="+G); this.findWinner(inputMap, scoreMap, G); this.show(scoreMap); System.out.println("第一轮结束"); //轮数循环的开始 for(int i=0;i<time-1;i++){ sum=0.0; System.out.println("第"+(i+2)+"轮游戏开始!"); Iterator iter = inputMap.entrySet().iterator(); int temp=0; while (iter.hasNext()) { Map.Entry entry0 = (Map.Entry) iter.next(); String key = (String) entry0.getKey(); System.out.println(key+"输入第"+(i+2)+"轮输入的数值:"); Double score =scan.nextDouble(); m[temp]=score; inputMap.put(key, score); //替换掉以前的分数 sum+=score; temp++; } G=sum/peopleNum*0.618; System.out.println("G="+G); this.findWinner(inputMap, scoreMap, G); this.show(scoreMap); System.out.println("第"+(i+2)+"轮结束"); } System.out.println("游戏结束"); } //找出每次分数最接近黄金点的 和最远的 最接近的加N分 最远的减2分 其余加零分(可能有相同的) public void findWinner(HashMap<String,Double> inputMap,HashMap<String,Double> scoreMap,Double G){ Double temp; //定义新变量,用来比较最近的一个数值 Double temp0; //定义新变量,用来比较最远的一的数值 List<String> latest=new ArrayList<String>(); List<String> farthest=new ArrayList<String>(); Iterator iter = inputMap.entrySet().iterator(); Map.Entry entry = (Map.Entry) iter.next(); Double input = (Double) entry.getValue(); String key0 = (String) entry.getKey(); latest.add(key0); farthest.add(key0); iter.hasNext(); temp0=temp=Math.abs(G-input); //遍历map while (iter.hasNext()) { entry = (Map.Entry) iter.next(); String key = (String) entry.getKey(); input = (Double) entry.getValue(); Double temp1=Math.abs(G-input); if(temp>temp1){//寻找最近的数值 temp=temp1; latest.clear(); latest.add(key); } else if(temp==temp1){ latest.add(key); } if(temp0<temp1){//寻找最远的数值 temp0=temp1; farthest.clear(); farthest.add(key); } else if(temp0==temp1){ //有可能出现离G值相同的数值 farthest.add(key); } } //实现加分 iter = scoreMap.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry0 = (Map.Entry) iter.next(); String key = (String) entry0.getKey(); Double score =(Double) entry0.getValue(); if(this.containList(key, latest)){ score=score+n; //分数最接近黄金点的加N分 scoreMap.put(key, score); } if(this.containList(key, farthest)){ score=score-2; //分数最最远的减2分 scoreMap.put(key, score); } } } public boolean containList(String str,List<String> list){ for(int i=0;i<list.size();i++){ if(str.equals(list.get(i))){ return true; } } return false; } public void show(HashMap<String,Double> scoreMap){ for (int i=0;i<peopleNum;i++){ System.out.println("第"+(i+1)+"个人输入的数值:"+m[i]); //循环依次输出每人个猜的数值 } System.out.println("最终得分情况:"); Iterator iter = scoreMap.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry0 = (Map.Entry) iter.next(); String key = (String) entry0.getKey(); Double score =(Double) entry0.getValue(); System.out.println(key+":"+score); } } }
七,运行结果:
八,实训总结:
在此次比编程任务中,我主要担当写手和优化任务,我遇到了很多错误,变量类型转换问题,输出结论不正确问题。前者我上网进行了查阅,最终解决了问题,后者请教了老师,老师很耐心,教我了解决方法,和问题所在。实训让我收获很多。
通过此次结对编程,加深了对合作的认识,在现在社会就是一个合作的时代,并不是一个适合特立独行的时代。要认识自己的劣势和长处,客观的认识自己,结对编程锻炼的是彼此统一的合作,必须一起努力。在结对编程中,平时的代码规范习惯,为我们两个人的合作,增加了便利性。与搭档的默契配合,学习搭档的长处,弥补自己的短处,是这次结对编程我收获最大的地方。此外,两个人关于代码设计实现的讨论,让编程变得更加有趣,有了更多实现代码的可能性。所以,在良好合作的基础上,结对编程能够带来1+1>2的效果!
九,汉堡包:
A:搭档的 优点:积极,细心,有想法。能很好的弥补我马虎,不积极的缺点。可以在我马虎的时候及时指出问题。
B:搭档的缺点:认真程度不够,对代码理解程度不够。
C:对搭档的建议:希望在以后的学习中。可以多些思考,认真一些,增加一些代码量,这样日后在代码阅读上可以很快速,也可以很快提出代码可优化的部分和自己对于代码更改的想法。
学习内容 | 代码行数 | 博客字数 |
实训一-黄金点 | 146 | 360 |