프로그래밍 언어/javastudy

영어 어휘 테스트 프로그램/ 명품 자바 에센셜 7

fladi 2021. 7. 17. 02:41
728x90

교재: 명품 java essential/ 7단원 컬렉션과 제네릭

 

 

 

 

 

<Open Callenge>

 

 

일단 Word클래스의 코드입니다.

class Word {
	String eng;
	String kor;

	public Word(String eng, String kor) {
		this.eng = eng;
		this.kor = kor;
	}
}

영어와 그에 대응하는 한국어를 멤버변수로 넣어줬습니다.

 

 

public 클래스인 WordQuiz에는 1개의 필드, 4개의 멤버변수를 만들어줬습니다.

 

private Vector<Word> v; Word클래스 객체의 벡터

 

public WordQuiz() 생성자. 벡터v에 미리 값을 넣어준다.(책에 있는 것과 같음)
private Word[] shuffle(Word[] choice) 정답을 섞은 보기 4개를 Set배열에 넣어줬는데, 거기 저장되어있는 값들을 랜덤하게 섞어주는 함수. 
public int makeQ(int correct_idx) 선지를 만들기 위한 함수. 정답에 해당하는 인덱스(0~17)를 받아 랜덤하게 서로 다른 인덱스 3개를 더 뽑은 뒤 Set에 넣고 shuffle함수를 돌려준다. 그 다음 랜덤하게 정렬된 선지를 출력한 후, 정답에 대응되는 선택지 번호를 출력한다.(1~4)
public boolean go() 프로그램 동작의 메인이 되는 함수. 벡터v에서 랜덤하게 정답인덱스를 고른 후, makeQ함수에 넣어준다. 그 다음 사용자에게 입력을 받아 그 값이 정답인지 아닌지 출력해준다. 만약 입력값이 1~4가 아닐 경우 false를 출력, 맞다면 true를 출력한다.

 

 

1) WordQuiz() 생성자

	public WordQuiz() {
		v = new Vector<Word>();

		v.add(new Word("love", "사랑"));
		v.add(new Word("animal", "동물"));
		v.add(new Word("eye", "눈"));
		v.add(new Word("trade", "거래"));
		v.add(new Word("emotion", "감정"));
		v.add(new Word("painting", "그림"));
		v.add(new Word("fault", "오류"));
		v.add(new Word("society", "사회"));
		v.add(new Word("picture", "사진"));
		v.add(new Word("doll", "인형"));
		v.add(new Word("honey", "꿀"));
		v.add(new Word("human", "인간"));
		v.add(new Word("bear", "곰"));
		v.add(new Word("hate", "미워하다"));
		v.add(new Word("paper", "종이"));
		v.add(new Word("book", "책"));
		v.add(new Word("map", "지도")); // 17
	}

 

 

2) shuffle메소드

	private void shuffle(Word[] choice) {
		int a, b;

		for (int i = 0; i < 10; i++) {
			a = (int) (Math.random() * 4);
			b = (int) (Math.random() * 4);

			Word temp = choice[a];
			choice[a] = choice[b];
			choice[b] = temp;
		}
	}

 

인덱스 0~3중 2개를 랜덤하게 선택하여 자리를 바꿔주는 걸 10번 반복해줬습니다.

충분히 잘 섞였겠죠?

 

 

3) makeQ 메소드

	public int makeQ(int correct_idx) {
		Set<Word> s = new HashSet<>();
		Word temp = v.get(correct_idx);
		s.add(temp);

		while (s.size() < 4) {
			int rand_idx = (int) (Math.random() * 17);
			temp = v.get(rand_idx);
			s.add(temp);
		}

		Word[] choice = s.toArray(new Word[0]);
		shuffle(choice);

		for (int i = 0; i < choice.length; i++) {
			System.out.print("(" + (i + 1) + ") " + choice[i].kor + " ");
		}
		System.out.print(">>");

		int idx = 0;
		for (int i = 0; i < choice.length; i++) {
			if (choice[i] == v.get(correct_idx)) {
				idx = i;
				break;
			}
		}

		return idx + 1;
	}

v의 인덱스 중 정답으로 설정된 인덱스를 입력받습니다.(0~16중 하나겠죠)

중복방지 검사를 위해 Set자료구조를 이용해줬습니다. set의 사이즈가 4가 되면 서로 다른 값 4개가 저장되겠죠?

(같은 값이 중복되어 저장될 수 없다는 걸 이용한 겁니다.)

 

Set에 정답 인덱스를 넣어준 뒤, 0~17중 서로다른 3개의 값을 더 넣어줍니다.

그리고 set의 값을 배열로 받아 shuffle함수를  수행시켜주고 선지를 출력해줍니다.

마지막엔 정답의 선지를 반환해줍니다. idx는 배열인덱스 0 1 2 3을 기준으로 저장되어 있기 때문에 1을 더한값을 출력해줍니다.

 

 

4) go메소드

	public boolean go() {
		Scanner scanner = new Scanner(System.in);

		int correct_idx;
		String correct_Q;
		int correct_asw;

		correct_idx = (int) (Math.random() * 17);
		correct_Q = v.get(correct_idx).eng;

		System.out.println("================================================");
		System.out.println(correct_Q + "?");
		
		correct_asw = makeQ(correct_idx);

		int input;
		try {
			input = scanner.nextInt();
		} catch (InputMismatchException e) {
			return false;
		}

		if (input != 1 && input != 2 && input != 3 && input != 4)
			return false;

		if (input == correct_asw)
			System.out.println("Excellent !!");
		else
			System.out.println("No. !!");

		return true;
	}

correct_idx는 벡터 v에서의 정답 위치 인덱스

correct_Q는 벡터 v에서의 정답의 영어값

correct_asw는 선택지 4개 중 정답인 선택지

 

먼저 correct_idx를 0~16중 랜덤한 값으로 결정해줍니다.

그리고 correct_asw는 makeQ메소드를 받도록 해줍니다. makeQ는 선지를 출력해주고 정답인 선지를 반환하니까요.

 

그 다음엔 사용자의 입력을 받아 정답인 선지일 경우 Excellent를 반환합니다.

 

이 때 1,2,3,4가 아닌 다른 값을 입력할 경우 false를 반환합니다. false는 main에서 받아 게임의 반복유무를 결정해줍니다.

 

 

 

5) main함수

	public static void main(String[] args) {
		WordQuiz quiz = new WordQuiz();
		boolean go = true;

		System.out.println("영어 어휘 테스트를 시작합니다. 1~4 외 다른 입력시 종료합니다.");

		while (go) {
			go = quiz.go();
		}
		
		System.out.println("================================================");
		System.out.println("프로그램을 종료합니다.");
	}

go는 게임의 반복유무를 결정해주는 변수입니다.

go에 quiz의 go메소드의 입력값을 넣어주고, false가 들어가면 게임이 종료됩니다.

 

 

 

 

<전체코드>

import java.util.*;

class Word {
	String eng;
	String kor;

	public Word(String eng, String kor) {
		this.eng = eng;
		this.kor = kor;
	}
}

public class WordQuiz {
	private Vector<Word> v;

	public WordQuiz() {
		v = new Vector<Word>();

		v.add(new Word("love", "사랑"));
		v.add(new Word("animal", "동물"));
		v.add(new Word("eye", "눈"));
		v.add(new Word("trade", "거래"));
		v.add(new Word("emotion", "감정"));
		v.add(new Word("painting", "그림"));
		v.add(new Word("fault", "오류"));
		v.add(new Word("society", "사회"));
		v.add(new Word("picture", "사진"));
		v.add(new Word("doll", "인형"));
		v.add(new Word("honey", "꿀"));
		v.add(new Word("human", "인간"));
		v.add(new Word("bear", "곰"));
		v.add(new Word("hate", "미워하다"));
		v.add(new Word("paper", "종이"));
		v.add(new Word("book", "책"));
		v.add(new Word("map", "지도")); // 17
	}

	private void shuffle(Word[] choice) {
		int a, b;

		for (int i = 0; i < 10; i++) {
			a = (int) (Math.random() * 4);
			b = (int) (Math.random() * 4);

			Word temp = choice[a];
			choice[a] = choice[b];
			choice[b] = temp;
		}
	}

	public int makeQ(int correct_idx) {
		Set<Word> s = new HashSet<>();
		Word temp = v.get(correct_idx);
		s.add(temp);

		while (s.size() < 4) {
			int rand_idx = (int) (Math.random() * 17);
			temp = v.get(rand_idx);
			s.add(temp);
		}

		Word[] choice = s.toArray(new Word[0]);
		shuffle(choice);

		for (int i = 0; i < choice.length; i++) {
			System.out.print("(" + (i + 1) + ") " + choice[i].kor + " ");
		}
		System.out.print(">>");

		int idx = 0;
		for (int i = 0; i < choice.length; i++) {
			if (choice[i] == v.get(correct_idx)) {
				idx = i;
				break;
			}
		}

		return idx + 1;
	}

	public boolean go() {
		Scanner scanner = new Scanner(System.in);

		int correct_idx;
		String correct_Q;
		int correct_asw;

		correct_idx = (int) (Math.random() * 17);
		correct_Q = v.get(correct_idx).eng;

		System.out.println("================================================");
		System.out.println(correct_Q + "?");
		
		correct_asw = makeQ(correct_idx);

		int input;
		try {
			input = scanner.nextInt();
		} catch (InputMismatchException e) {
			return false;
		}

		if (input != 1 && input != 2 && input != 3 && input != 4)
			return false;

		if (input == correct_asw)
			System.out.println("Excellent !!");
		else
			System.out.println("No. !!");

		return true;
	}

	public static void main(String[] args) {
		WordQuiz quiz = new WordQuiz();
		boolean go = true;

		System.out.println("영어 어휘 테스트를 시작합니다. 1~4 외 다른 입력시 종료합니다.");

		while (go) {
			go = quiz.go();
		}
		
		System.out.println("================================================");
		System.out.println("프로그램을 종료합니다.");
	}
}

 

 

재밌는 문제였네요!

728x90