1. 程式人生 > >14王蕊-03艾璐-實訓一

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