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

 

 

 

 

 

posted on 2018-12-13 16:03  艾璐  阅读(144)  评论(0编辑  收藏  举报