😎

ITスクール DAY23 ★覚醒!Java初心者必見★ Lotto/おつり

2023/08/10に公開

はじめに

昨日から、異なる先生に教えて頂くことになった。
昨日、授業を見てふっと思い浮かべた心の言葉は、、、、
「この人、、、まじでうまい。レベルが違う」だった。
先生は、機能を明確に分け、メソッドとメソッドの連携を組むことも得意で、
一つのメソッドにもたくさんの機能を入れないため、とても分かりやすかった。
今日は、少し先生のスタイルを意識し、プロセスをしっかり組んでからコードを作成した。
今日はただのコードよりは、自分がどのふうに考えて問題を解決したかを紹介したい。

Lotto

まずは、ストラクチャーを組み、役割に分けて、一つずつ必要なメソッドを並ぶ。

思考の流れ1

1.Scannerからロート番号を入力するメソッド (void?)
2.推薦番号を生成するメソッド (void?)

これはランダムクラス使おう、Mathはかけるの面倒だ。
重複はさけたいから、HashSetの方がいいかな、、?
要素の数は6だから配列がいいかな?

という考えをにりつく。
まだメソッドのリターンタイプは決めづらい。
readablityも考えたい。

  1. 入力した番号と当たり番号を対象し、比較する。

そのため、1,2メソッドはint[]をリターンしようと思いついた!

思考の流れ2

1.Scannerからロート番号を入力するメソッド () -> int[]
hashsetで入力した番号を入れる。
0~45のみ入れるようにする。ー>一番上で評価した方がいいかも
ヒューマンエラーもあるかもしれないから、重複した番号があったら教えよう。
それなら、まずsetのサイズが6になるまでwhileで繰り返そう。

2.推薦番号を生成するメソッド()ー>int[] 
Randomクラスで1番と同じく値を入れてリターンして3番に入れよう。

3. 入力した番号と当たり番号を対象し、比較する。 **(int[] , int[] ) -> int **
ここで番号があってるかをチェックしよう。forがいいかな

4.当たりかないかを出力するメソッド (void)

public static void main(String[] args) {
	startLotto();
}
public static void startLotto() {
     int[] myLottoNumList =chooseLottoNum();
     int[] winningNumList = getWinningLottoNum();
     int sameNumCount = checkResult(myLottoNumList, winningNumList);
     printResult(sameNumCount);
   }

思考の流れ3

機能をガンガン組む。しかし、より洗練されたコードを作りたい、、、
番後の比較って結局探索だから、、、どうせ見やすくしたいし、
ロートって番号の順序も構わなかったから、Arrays.sortで整列したね、、
二分検索やろうか!!!

思考の流れ4

作成したコードをもう一度片づける。

public static int[] chooseLottoNum()
public static int[] chooseLottoNum(){
		
Set<Integer> myLottoNumbers = new HashSet<>();
int[] myLottoNumList = new int[6];
int count = 1;
		
Scanner inputNum = new Scanner(System.in);
System.out.println("로또를 시작하겠습니다.");
System.out.println("1에서 45까지의 정수를 입력해주세요.");

   while(myLottoNumbers.size()!=6) {
   	System.out.printf("%d번째 번호 입력 : " , count);
        int lottoNum = inputNum.nextInt();
			
	//範囲設定(1~45) -> 合ってない場合 -> continueでループ再開
	if (lottoNum < 1 || lottoNum > 45) {
	System.out.println("입력하신 수의 범위가 맞지 않습니다.");
	continue;
	}
	//重複で追加ができない場合ならtrueでif文実行-> continueでループ再開
	if (!myLottoNumbers.add(lottoNum)) {
	System.out.println("중복된 수입니다. 다른 수를 입력해주세요.");
	continue;
	}
	myLottoNumbers.add(lottoNum);	
	count++;
	}//while 	
		
	//HashSetで受けた番後をlistに入れてリターン
	Iterator<Integer> pickUpLottoNum = myLottoNumbers.iterator();
			
	  for (int i = 0; i < myLottoNumList.length; i++) {
		LottoNumList[i] = pickUpLottoNum.next();
	  }
			
	   return myLottoNumList;
	 }//chooseLottoNum() end
public static int[] getWinningLottoNum()
public static int[] getWinningLottoNum(){
	
	Set<Integer> winningNumbers = new HashSet<>();
	int[] winningNumList = new int[6];	
	Random winningNumberGenerator = new Random();
		
	while(winningNumbers.size()!=6) {
		winningNumbers.add(winningNumberGenerator.nextInt(45)+1);
	}//while 	
		
	Iterator<Integer> pickUpLottoNum = winningNumbers.iterator();
		
	for (int i = 0; i < winningNumList.length; i++) {
		winningNumList[i] = pickUpLottoNum.next();
	}
		
	return winningNumList;
	}//getWinningLottoNum() end
public static int checkResult(int[] myLottoNumList, int[] winningNumList)
public static int checkResult(int[] myLottoNumList, int[] winningNumList) {
		
  int sameNumCount = 0;
  Arrays.sort(myLottoNumList);
  System.out.println("입력하신 번호 : " + Arrays.toString(myLottoNumList));
  Arrays.sort(winningNumList);
  System.out.println("당첨 번호    : " + Arrays.toString(winningNumList));
		
  for(int myNum : myLottoNumList) {
     	if(Arrays.binarySearch(winningNumList, myNum) >= 0) sameNumCount++;
	}		
     return sameNumCount;
   }//checkResult() end
public static void printResult(int sameNumCount)
public static void printResult(int sameNumCount) {
    switch(sameNumCount) {   //<-何個が一致しているか
    case 6: {System.out.println("1등입니다"); break;}  //1th 
    case 5: {System.out.println("2등입니다"); break;}  //2th
    case 4: {System.out.println("3등입니다"); break;}  //3th
    default: {
	System.out.println("숫자가 " + sameNumCount + "번 일치합니다. 꽝입니다"); 
	     }
	}
     }

public static void startLotto() {
	int[] myLottoNumList =chooseLottoNum();
	int[] winningNumList = getWinningLottoNum();
	int sameNumCount = checkResult(myLottoNumList, winningNumList);
	printResult(sameNumCount);
   }

以下で完璧にコードが完成された。

public static void main(String[] args) {
	startLotto();
}
로또를 시작하겠습니다.
1에서 45까지의 정수를 입력해주세요.
1번째 번호 입력 : 5
2번째 번호 입력 : 5
중복된 수입니다. 다른 수를 입력해주세요.  //重複チェック
2번째 번호 입력 : 46
입력하신 수의 범위가 맞지 않습니다.   //1~45かをチェック
2번째 번호 입력 : 2
3번째 번호 입력 : 10
4번째 번호 입력 : 11
5번째 번호 입력 : 18
6번째 번호 입력 : 41
입력하신 번호 : [2, 5, 10, 11, 18, 41]  //usernumber
당첨 번호    : [3, 6, 15, 38, 40, 45]  //winningnumber
숫자가 0번 일치합니다. 꽝입니다  

おつり

最初のイメージ。こんな感じでやろうかを考えることが大事だ。
コードを組む前に、プそセスを作り、それをメソッド化すれば、組みやすくなる!

public static void main(String[] args) {
	getChange();
    }

public static void getChange() {
	int price = setprice();
	int money = payMoney();
	int change = calculateChange(price,money);
	giveChange(change);
   }

今回は、わざわざ例外を処理せず、先生が使ったスキル。
再起呼び出しを活用して問題を解決した。

金が負数になる場合、おつりが負数になる場合を再起で処理した。

import java.util.*;

public class Emain2 {

public static void main(String[] args) {
	getChange();
}
	
public static Scanner sc = new Scanner(System.in);
	
public static int setprice(){
	System.out.print("물건 가격 : ");
	int price = sc.nextInt();
	return (price >= 0 ) ? price : setprice();
   }
	
public static int payMoney(){
        System.out.print("지불할 돈 : ");
	int money = sc.nextInt();
	return (money >= 0 ) ? money : payMoney();
  }
	
public static int calculateChange(int price, int money){
        int change = (money - price);
	if(money - price >= 0) { 
	return change;
	}else {
	System.out.println("돈이 부족합니다. 다시 입력하세요.");
	money = payMoney();
	return calculateChange(price, money);
	}
   }	
	
public static void giveChange(int change) {
	if(change == 0) {
	System.out.println("딱 맞는 금액을 지불했습니다.");
	}
	while(change>0) {
	  System.out.printf("거스름 돈 : %d원\n",change);
	  System.out.printf("50000원 : %d장\n",change/50000);
	  change = change%=50000;
	  System.out.printf("10000원 : %d장\n",change/10000);
	  change = change%=10000;
	  System.out.printf(" 5000원 : %d장\n",change/5000);
	  change = change%=5000;
	  System.out.printf(" 1000원 : %d장\n",change/1000);
	  change = change%=1000;
	  System.out.printf("  500원 : %d개\n",change/500);
	  change  = change%=500;
	  System.out.printf("  100원 : %d개\n",change/100);
	  change = change%=100;
	  System.out.printf("   50원 : %d개\n",change/50);
	  change = change%=50;
	  System.out.printf("   10원 : %d개\n",change/10);
	  change = change%=1;
	}
}	
	
public static void getChange() {
	int price = setprice();
	int money = payMoney();
	int change = calculateChange(price,money);
	giveChange(change);
	}
}
물건 가격 : 15000
지불할 돈 : 27920
거스름 돈 : 1292050000: 010000: 15000: 01000: 2500: 1100: 450: 010: 2

Discussion