ITスクール DAY23 ★覚醒!Java初心者必見★ Lotto/おつり
はじめに
昨日から、異なる先生に教えて頂くことになった。
昨日、授業を見てふっと思い浮かべた心の言葉は、、、、
「この人、、、まじでうまい。レベルが違う」だった。
先生は、機能を明確に分け、メソッドとメソッドの連携を組むことも得意で、
一つのメソッドにもたくさんの機能を入れないため、とても分かりやすかった。
今日は、少し先生のスタイルを意識し、プロセスをしっかり組んでからコードを作成した。
今日はただのコードよりは、自分がどのふうに考えて問題を解決したかを紹介したい。
Lotto
まずは、ストラクチャーを組み、役割に分けて、一つずつ必要なメソッドを並ぶ。
思考の流れ1
1.Scannerからロート番号を入力するメソッド (void?)
2.推薦番号を生成するメソッド (void?)
これはランダムクラス使おう、Mathはかけるの面倒だ。
重複はさけたいから、HashSetの方がいいかな、、?
要素の数は6だから配列がいいかな?
という考えをにりつく。
まだメソッドのリターンタイプは決めづらい。
readablityも考えたい。
- 入力した番号と当たり番号を対象し、比較する。
そのため、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
거스름 돈 : 12920원
50000원 : 0장
10000원 : 1장
5000원 : 0장
1000원 : 2장
500원 : 1개
100원 : 4개
50원 : 0개
10원 : 2개
Discussion