03艾璐-14王蕊-实训一
一、码云地址:https://gitee.com/wrwrwrw/projects
二、我的实训伙伴:16012114王蕊
结对编程过程照片:
三、实训内容:
黄金点
阿超的课都是下午两点钟,这时班上不少的同学都昏昏欲睡,为了让大家兴奋起来,阿超让同学玩一个叫“黄金点”的游戏:
N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或100),交给裁判,裁判算出所有数字的平均值,然后乘以0.618(所谓黄金分割常数),得到G值。提交的数字最靠近G(取绝对值)的同学得到N分,离G最远的同学得到-2分,其他同学得0分。记录每一次游戏每名同学的数字和分数。
1.解题思路:
(1)我们对黄金点的问题进行了相应的简化,先不考虑多轮输出,只进行一轮游戏,最后在添加轮数相关的循环。
(2)我们对黄金点程序的编写分了几个部分,分别是从控制台读入数据部分,计算G值部分,条件语句比较最远和最靠近数值部分,实现加分部分,最终输出结果部分。
(3)很多变量定义的是全局变量,为了方便二次使用。从控制台读入数据前,我们定义了一个Object数组,将读入的数据进行相应的存放。方便最后输出结果时你再次调用。
寻找最靠近和最远数值部分,定义了两变量,分别表示最靠近和最远数值,用if语句,进行比较运算,得出数值。
2.实施代码:
1 import java.util.*; 2 public class GoldPoint { 3 public static void main(String[] args){ 4 GoldPoint gd=new GoldPoint(); 5 gd.goldPoint(); 6 } 7 int n; 8 Object [] m=new Object[50]; //定义Object数组,里面可以放任何类。用来存放输入的数值,Object避免数据类型错误。 9 int peopleNum; //参加的人数 10 int time; //进行轮数 11 public void goldPoint(){ 12 HashMap<String,Double> inputMap=new HashMap<String,Double>(); //存入输入数值 13 HashMap<String,Double> scoreMap=new HashMap<String,Double>(); //存入分数 14 String name=""; 15 Double inputScore; 16 Scanner scan=new Scanner(System.in); //参数对象是从控制台读入的数据流 17 System.out.println("*****黄金点游戏*****"); 18 System.out.println("输入参加游戏的人数:"); 19 peopleNum=scan.nextInt(); 20 n=peopleNum; 21 System.out.println("输入游戏进行的轮数:"); 22 time=scan.nextInt(); 23 System.out.println("第一轮游戏开始!"); 24 Double sum=0.0; 25 Double G=0.0; 26 for(int i=0;i<peopleNum;i++){ 27 System.out.println("请输入第"+(i+1)+"名玩家姓名:"); 28 name=scan.next(); 29 System.out.println("请输入第一轮输入的数值:"); 30 inputScore=scan.nextDouble(); 31 m[i]=inputScore; //将输入的数值存放到数组中 32 inputMap.put(name, inputScore); 33 scoreMap.put(name,(double) 0);//初始化scoreMap 34 sum+=inputScore; 35 } 36 G=sum/peopleNum*0.618; 37 System.out.println("G="+G); 38 this.findWinner(inputMap, scoreMap, G); 39 this.show(scoreMap); 40 System.out.println("第一轮结束"); 41 42 //轮数循环的开始 43 for(int i=0;i<time-1;i++){ 44 sum=0.0; 45 System.out.println("第"+(i+2)+"轮游戏开始!"); 46 Iterator iter = inputMap.entrySet().iterator(); 47 int temp=0; 48 while (iter.hasNext()) { 49 Map.Entry entry0 = (Map.Entry) iter.next(); 50 String key = (String) entry0.getKey(); 51 System.out.println(key+"输入第"+(i+2)+"轮输入的数值:"); 52 Double score =scan.nextDouble(); 53 m[temp]=score; 54 inputMap.put(key, score); //替换掉以前的分数 55 sum+=score; 56 temp++; 57 } 58 G=sum/peopleNum*0.618; 59 System.out.println("G="+G); 60 this.findWinner(inputMap, scoreMap, G); 61 this.show(scoreMap); 62 System.out.println("第"+(i+2)+"轮结束"); 63 } 64 System.out.println("游戏结束"); 65 66 } 67 68 //找出每次分数最接近黄金点的 和最远的 最接近的加N分 最远的减2分 其余加零分(可能有相同的) 69 70 public void findWinner(HashMap<String,Double> inputMap,HashMap<String,Double> scoreMap,Double G){ 71 Double temp; //定义新变量,用来比较最近的一个数值 72 Double temp0; //定义新变量,用来比较最远的一的数值 73 List<String> latest=new ArrayList<String>(); 74 List<String> farthest=new ArrayList<String>(); 75 Iterator iter = inputMap.entrySet().iterator(); 76 Map.Entry entry = (Map.Entry) iter.next(); 77 Double input = (Double) entry.getValue(); 78 String key0 = (String) entry.getKey(); 79 latest.add(key0); 80 farthest.add(key0); 81 iter.hasNext(); 82 temp0=temp=Math.abs(G-input); 83 //遍历map 84 while (iter.hasNext()) { 85 entry = (Map.Entry) iter.next(); 86 String key = (String) entry.getKey(); 87 input = (Double) entry.getValue(); 88 Double temp1=Math.abs(G-input); 89 if(temp>temp1){//寻找最近的数值 90 temp=temp1; 91 latest.clear(); 92 latest.add(key); 93 } 94 else if(temp==temp1){ 95 latest.add(key); 96 } 97 if(temp0<temp1){//寻找最远的数值 98 temp0=temp1; 99 farthest.clear(); 100 farthest.add(key); 101 } 102 else if(temp0==temp1){ //有可能出现离G值相同的数值 103 farthest.add(key); 104 } 105 } 106 //实现加分 107 iter = scoreMap.entrySet().iterator(); 108 while (iter.hasNext()) { 109 Map.Entry entry0 = (Map.Entry) iter.next(); 110 String key = (String) entry0.getKey(); 111 Double score =(Double) entry0.getValue(); 112 if(this.containList(key, latest)){ 113 score=score+n; //分数最接近黄金点的加N分 114 scoreMap.put(key, score); 115 } 116 if(this.containList(key, farthest)){ 117 score=score-2; //分数最最远的减2分 118 scoreMap.put(key, score); 119 } 120 } 121 } 122 public boolean containList(String str,List<String> list){ 123 for(int i=0;i<list.size();i++){ 124 if(str.equals(list.get(i))){ 125 return true; 126 } 127 } 128 return false; 129 } 130 public void show(HashMap<String,Double> scoreMap){ 131 for (int i=0;i<peopleNum;i++){ 132 133 System.out.println("第"+(i+1)+"个人输入的数值:"+m[i]); //循环依次输出每人个猜的数值 134 } 135 System.out.println("最终得分情况:"); 136 Iterator iter = scoreMap.entrySet().iterator(); 137 while (iter.hasNext()) { 138 Map.Entry entry0 = (Map.Entry) iter.next(); 139 String key = (String) entry0.getKey(); 140 Double score =(Double) entry0.getValue(); 141 System.out.println(key+":"+score); 142 } 143 144 } 145 146 }
3.运行代码截图:
四、实训小结
(1)通过本次结对编程,两个人面对一台电脑,使用一只鼠标,在编程的过程中可以相互探讨,取长补短,把两个人的想法汇总,再到实施,可以很好的将整个代码呈现出来。
两个人合作可以更快速,高效的整理出思路,在面对一些问题的时候,也会找出更好的解决办法。而且在伙伴的身上也可以学到很多,王蕊同学身上有很多我需要学习的地方,
比如多查各种相关资料,多动手实践,多画图整理自己的思路,都是很好的学习方法,学习习惯。
(2)结对编程真的可以带来1+1>2的效果的,两个人的想法,思路都可以在实践中碰撞出不一样的火花。而且可以提高学习效率,两个人再为同一件事情努力的时候,会更加集中
注意力,两个人可以扩大查找资料的范围,更有利于学习的宽度和广度。
五、汉堡包评价
那现在我来评价一下我的伙伴:王蕊是一个学习能力很强的人,而且动手能力非常强,虽然偶尔有些小马虎,但是问题不大,和她一起合作我很安心,因为所有我解决不了的问题
她都可以帮我解决,相比来讲我就比较弱啦,对于代码的理解,和一些代码的实现都有问题,所以谢谢我的队友所给我的帮助,想给她的建议是要注意一些细小的错误,这样可以
避免很多不必要的问题。
学习内容 | 代码行数 | 博客字数 |
实训一 | 146 | 400 |