Java -Review(4) 반복문 & 조건문

지환·2023년 9월 26일
0

JAVA

목록 보기
12/39
post-thumbnail

반복문 & 조건문

FizzBuzz 예제

  • 사용자로부터 값을 입력 받는다
  • 5의 배수는 fizz
  • 7의 배수는 buzz
  • 5와 7의 최소 공배수 fizzbuzz

package comfor;

import java.util.Scanner;

class fizzBuzzIF
{
	Scanner sc = new Scanner(System.in);
	public int number;

	// 사용자가 주는 건 Limit이다.
	
	public void getUser()
	{
		fizzBuzzIF n1 = new fizzBuzzIF();
		System.out.print("값을 입력하세요[Limit]:");
		int fizz = sc.nextInt();
		// 사용자로 부터 받은 값을 여기에 저장함
		this.number = fizz;
		
		n1.SetUser(number);
	}
	
	public void SetUser(int number)
	{
		
		for ( int i = 1;  i<=number; i++)
		{
			if(i % 5 == 0)
			{
				System.out.println("Fizz :"+i);
				

			}
			
			if(i % 7 == 0)
			{
				System.out.println("Buzz : "+i);
			}
			
			if(i % 7 == 0 && i % 5 ==0)
			{
				System.out.println("FizzBuzz :"+i);
			}
			
		}
		
	}
}
		



// fizz는 조건을 따지는 클래스로 작용. 즉 main에서 
// 사용자로부터 입력을 받고 그 값을 토대도 (limit)
// 그 값을 

public class FizzBuzz2 {

	/*
	 * 5의 배수는 fizz
	 * 7의 배수는 buzz 
	 * 5와 7의 최소 공배수 fizzbuzz
	 */
	


	public static void main(String[] args) {

		FizzBuzz2 user1 = new FizzBuzz2();
		fizzBuzzIF fbi = new fizzBuzzIF();
		int i;
		fbi.getUser();


	}

}

----------------------------------------------------

값을 입력하세요[Limit]:35
Fizz :5
Buzz : 7
Fizz :10
Buzz : 14
Fizz :15
Fizz :20
Buzz : 21
Fizz :25
Buzz : 28
Fizz :30
Fizz :35
Buzz : 35
FizzBuzz :35

야구게임

Tusu

package comfor;

import java.util.Random;

public class Tusu {

	private int number;
	
    public void setNumber() {
    	
    	int[] nums = {1,2,3,4,5,6,7,8,9};
    	for(int i = 0; i<3; i++)
    	{
    		int randomIndex = i + (int)(Math.random() * (9-i));
    		int temp = nums[i];
    		nums[i] = nums[randomIndex];
    		nums[randomIndex] = temp;
  
    	}
        this.number = nums[0] * 100 + nums[1] * 10 + nums[2];
    
    }
	
    public int getNumber()
    {
    	return number;
    }
    
    
}

Taja

package comfor;

import java.util.Scanner;


public class Taja {
    private int[] userGuess;
    private boolean correct;

    public void setUserGuess(int[] userGuess) {
        this.userGuess = userGuess;
    }
    

    public boolean isCorrect() {
        return correct;
    }

    public void setCorrect(boolean correct) {
        this.correct = correct;
    }

    public void evaluateGuess(int targetNumber) {
        int strike = 0;
        int ball = 0;

        for (int i = 0; i < 3; i++) {
            if (userGuess[i] == targetNumber % 10) {
                strike++;
            } else {
                for (int j = 0; j < 3; j++) {
                    if (userGuess[i] == targetNumber / 100 && userGuess[j] == (targetNumber / 10) % 10 && i != j) {
                        ball++;
                    }
                }
            }
        }

        if (strike == 3) {
            correct = true;
        } else {
            System.out.println(strike + "S " + ball + "B");
        }
    }
}


Machine

package comfor;

public class Machine {
	
    public void if_case(Tusu tusu, Taja taja) {
        int targetNumber = tusu.getNumber();
        taja.evaluateGuess(targetNumber);
    }

}

Main

package comfor;
/* 요구사항 
1. 사용자로부터 3개의 입력을 받는다.
2. 3개의 값중에 하나 맞고, 두개 틀리면 --> 1s 2b
3. 3개의 값중에 두개 맞고, 하나 틀리면 --> 2s 1b
4. 3개의 값중에 세개 다 맞으면 --> out
5. 4ball ---> 한 번 더 기회를 드리죠

-- 등장인물 3 --- (투수)-Tusu[Random] |||||||||| (타자)-Taja  ||||||||||판독기 Machine
각각 클래스를 나눠 작성한다.
class Tusu 
class Taja
*/

import java.util.Scanner;

public class Baseball {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        Taja taja = new Taja();
        Tusu tusu = new Tusu();
        Machine machine = new Machine();

        tusu.setNumber(); // 난수를 설정

        for (int j = 1; j <= 4; j++) {
            System.out.println("3개의 숫자를 입력하세요 (1부터 9까지 중복되지 않게): ");
            int[] userGuess = new int[3];
           
            for (int i = 0; i < 3; i++) {
                userGuess[i] = sc.nextInt();
            }

            taja.setUserGuess(userGuess); // 사용자 입력을 Taja에 설정
            machine.if_case(tusu, taja); // 게임 진행

            if (taja.isCorrect()) {
                System.out.println("정답입니다!");
                break;
            } else {
                System.out.println("다시 시도하세요.");
            }
        }

        sc.close();
    }
}

달의 무게

package com.step3;
//Scanner는 java폴더 아래 util폴더 아래 선언되어 있는 클래스 이다.
//자바가상머신을 설치하면 내장되어 있는 클래스 이다.
//import문을 써야 하는 건 java.lang 폴더가 아닌 폴더는 JVM이 찾을 수가 없어서
//반드시 import문으로 물리적인 위치를 나타낸다.
//Scanner클래스 내부에도 여러개의 메소드가 정의되어 있다.
//어떤 메소드가 있는지는 인스턴스화 한 후에 인스턴스 변수.찍고 기다리면 quick fix기능
//제공되어 확인해 볼 수 있다. - 
//이클립스는 JVM에서 제공하는 API 즉 document문서를 제공받고 있어서 
//그 내용을 보여주는 것이다.
import java.util.Scanner;

//변수가 필요한가? - 그렇다면 몇 개가 필요한가요?
class MoonWeight{
	//굳이 사용자로 부터 입력 받는 값을 별도의 메소드로 선언해 보기
	//리턴타입을 int로 한 이유가 뭐죠? - 사용자가 콘솔에 입력한 값을 읽어오는 메소드가
	//nextInt()인데 이메소드의 소유주가 Scanner이다.
	//nextInt로 읽어오는 값이 int이므로 메소드 설계시 리턴타입은 동일한 int로 결정함.
	//화면쪽에 리액트가 활용되고, 더해서 타입스크립트가 등장하면서 this가 
	//소스에 따라서 this가 참조하는 객체가 달라졌다. - 초보 개발자  -this이슈 - 함수형 -> 코드양 줄어듦 ->람다식(EcmaScript2015년 6버전)
	int getUser() {
		Scanner sc = new Scanner(System.in);
		int user = sc.nextInt();
		return user;
	}
	double account(int earth) {//earth = 80
		double moon = 0.0;//지변으로 처리
		moon = (earth*17)/100.0;//(80*17)/100.0
		return moon;
	}
}
public class MoonWeightMain {

	public static void main(String[] args) {
		System.out.println("당신의 몸무게를 입력하세요.");
		MoonWeight mw = new MoonWeight();
		//메소드 호출 결과를 굳이 리턴타입으로 받아서 처리하는 방법과
		//변수로 받지 않고 메소드 호출을 직접 하는 경우의 차이가 있다|없다.
		//문제점 지적 -  인스턴스 변수 하나에 대해서 입력받은 지구의 몸무게 값도 하나이어야 하는데
		//만일 변수로 치환하지 않고 매번 메소드를 새로 호출하면 입력받는 값이 그 때 마다 달라질 수 있어서 
		//이런 상황일때는 리턴타입으로 받아서 그 변수를 사용할것.
		int user = mw.getUser();
		System.out.println("사용자가 입력한 값은 " +user+" 입니다.");
		System.out.println("달의 몸무게는 "+mw.account(user) + " 입니다.");
	}
}

몸무게 입력

package com.step3;
//Scanner는 java폴더 아래 util폴더 아래 선언되어 있는 클래스 이다.
//자바가상머신을 설치하면 내장되어 있는 클래스 이다.
//import문을 써야 하는 건 java.lang 폴더가 아닌 폴더는 JVM이 찾을 수가 없어서
//반드시 import문으로 물리적인 위치를 나타낸다.
//Scanner클래스 내부에도 여러개의 메소드가 정의되어 있다.
//어떤 메소드가 있는지는 인스턴스화 한 후에 인스턴스 변수.찍고 기다리면 quick fix기능
//제공되어 확인해 볼 수 있다. - 
//이클립스는 JVM에서 제공하는 API 즉 document문서를 제공받고 있어서 
//그 내용을 보여주는 것이다.
import java.util.Scanner;

//변수가 필요한가? - 그렇다면 몇 개가 필요한가요?
class MoonWeight{
	double account(int earth) {
		double moon = 0.0;//지변으로 처리
		moon = (earth*17)/100.0;
		return moon;
	}
}
public class MoonWeightMain {

	public static void main(String[] args) {
		System.out.println("당신의 몸무게를 입력하세요.");
		Scanner sc = new Scanner(System.in);
		int user = sc.nextInt();
		System.out.println("사용자가 입력한 값은 " +user+" 입니다.");
		MoonWeight mw = new MoonWeight();
		System.out.println("달의 몸무게는 "+mw.account(user) + " 입니다.");
	}
}

JFrame

package comfor;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

//JFrame을 상속받아서 사용자 정의 클래스를 선언하였다.
//ActionListener는 엔터 쳤을 때 이벤트 처리를 위해서 선언한 인터페이스 이다.
public class RandomGameView extends JFrame  implements ActionListener{
	//FlowLayout설정해서 중앙- 다중문쓰는 JTextArea배치, 남쪽에는 싱글로우작성하는 JTextField
	JPanel 			jp_center 			= new JPanel();
	JPanel 			jp_east 				= new JPanel();//새게임,정답,지우기,종료버튼 배치하기
	JTextArea 		ta_result 			= new JTextArea(10,50);
	JTextField      tf_input				= new JTextField("",10);
	JButton 			jbtnNew             = new JButton("새게임");
	JButton 			jbtnDap              = new JButton("정답");
	JButton 			jbtnClear            = new JButton("지우기");
	JButton 			jbtnExit              = new JButton("종료");
	Font 				f 							= new Font("Thoma", Font.BOLD, 18);
	public void initDisplay(){
		//엔터를 치는 건 사람인데 엔터를 느끼는건 JVM이라서 ActionListener라는 인터페이스의 약속된 메소드를 오버라이딩 하기
		tf_input.addActionListener(this);//이벤트 소스와 이벤트 처리를 담당하는 핸들러 클래스 매핑하기
		jp_center.setLayout(new FlowLayout());//동,서,남,북, 중앙 버튼이나 체크박스 배치하기
		jp_center.setBackground(Color.green);
		jp_center.add("Center", ta_result);
		jp_center.add("South", tf_input);
		jp_east.setBackground(Color.black);
		jp_east.setLayout(new GridLayout(4,1,2,2));
		
		//jp_east속지에 새게임 버튼 배치하기
		jp_east.add(jbtnNew);
		jp_east.add(jbtnDap);
		jp_east.add(jbtnClear);
		jp_east.add(jbtnExit);
		this.add("Center", jp_center);
		this.add("East", jp_east);//this는 JFrame을 가리키는 수정자 이다.
		this.setTitle("숫자맞추기게임");
		this.setSize(600,400);
		this.setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//이 코드가 X버튼 눌렸을 때 사용된 자원회수함
	}	
	public static void main(String[] args) {
		JFrame.setDefaultLookAndFeelDecorated(true);
		RandomGameView rgv = new RandomGameView();
		rgv.initDisplay();
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		Object obj = e.getSource();
		String command = e.getActionCommand();//이벤트 발동하는 버튼의 라벨
		if("1".equals(command)) {
			System.out.println(command);
			ta_result.append(command);
		}
		else if(obj == tf_input) {//너 엔터 친거야?
			ta_result.append(tf_input.getText()+"\n");
			tf_input.setText("");
		}
	}
}

이벤트 동작 처리

	@Override
	public void actionPerformed(ActionEvent e) {
		Object obj = e.getSource();
		String command = e.getActionCommand();//이벤트 발동하는 버튼의 라벨
		if("1".equals(command)) {
			System.out.println(command);
			ta_result.append(command);
		}
		else if(obj == tf_input) {//너 엔터 친거야?
			ta_result.append(tf_input.getText()+"\n");
			tf_input.setText("");
		}
	}
profile
아는만큼보인다.

0개의 댓글