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

 

 

 

posted @ 2018-12-13 15:50  wrwrwr  阅读(118)  评论(0编辑  收藏  举报