Programming/Java

Java) 영어 단어 테스트 프로그램

쫑드기 2020. 5. 23. 18:52

<프로그램 개요>

영어단어를 테스트하는 프로그램이다.

 

<기능>

1. 단어 삽입

2. 힌트 제공 1(해당 단어 스펠링 2개 공개)

3. 랜덤으로 테스트가 진행. 이미 테스트한 단어는 출력하지 않음.

4. 맞은 단어와 틀린 단어 개수 출력

//만약 힌트가 제공된 후 단어를 맞힌다면 맞은 단어에 포함

5. 주관식

 

<문제 해결에 까다로웠던 점>

1. 힌트를 제공하는 기능을 구현하는 것

=> charAt(index)함수를 이용하여 string char type 배열로 만들어서 해결!

 

2. 이미 랜덤으로 테스트를 진행한 단어들을 제외하는 알고리즘을 구현하는 것

=> boolean type배열을 선언하여 해결!

 

<소스코드>

1. WordBookFucntion.java (interface)

 

1
2
3
4
5
6
7
8
9
10
 package WordBook;
 
public interface WordBookFunction {
    
    public void menu();
    public void addWord();    
    public void test();
    public void exit();
}
 
cs

 

 

 

 

2. MyWordBook.java (inherits WordBookFunction interface)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
package WordBook;
 
import java.util.Vector;
import java.util.Scanner;
 
class Word {
    private String englishWords;
    private String koreanWords;
    
    public Word(String englishWords, String koreanWords){
        this.englishWords = englishWords;
        this.koreanWords = koreanWords;
    }
    
    public String GetEngWords() {
        return englishWords;
    }
    public String GetKorWords() {
        return koreanWords;
    }
}
 
 
public class MyWordBook implements WordBookFunction {
    Vector<Word> v = new Vector<Word>();
    Scanner scanner = new Scanner(System.in);
    
    //Constructor
    public MyWordBook(String name) {
        System.out.println("\"" + name +"\" " + "단어장에 오신 것을 환영합니다.");
        v.add(new Word("love""사랑"));
        v.add(new Word("apple""사과"));
        v.add(new Word("bottle""병"));
    }
 
    //Menu
    public void menu() {
        
        System.out.println("\n<등록된 단어수: " + v.size() + '>');
        System.out.println("-----하고싶은 것을 선택해주세요-----");
        System.out.println("1.단어등록");
        System.out.println("2.테스트");
        System.out.println("3.종료");
        System.out.println("-----------------------------");
    }
    
    //Insert word
    public void addWord() {
    
        System.out.println("단어 추가를 그만하고 싶으시다면 <영어단어>에 '그만'을 입력해주세요.");
        
        while(true) {
            
            System.out.print("<영어단어>를 입력해 주세요(영어)>> ");
            String englishWords = scanner.next();
            
            if(englishWords.equals("그만")) 
                break;
            
            System.out.print("<단어 뜻>을 입력해 주세요(한국어) >> ");
            String koreanWords = scanner.next();
            
            v.add(new Word(englishWords, koreanWords));
        }
 
    }
    
    //Test
    public void test() {
        boolean quizAvail;  //test실행 여부 판단 변수 
        boolean rightOrWrong[] = new boolean [v.size()]; //해당 단어가 맞았는지 틀렸는지 확인하는 배열 선언
        int testCount = 0, correctCount = 0, wrongCount=0;
 
        //모든 단어를 false(틀림)으로 초기화
        for(int i=0; i<v.size(); i++) {
            rightOrWrong[i]= false;
        }
        
        //등록된 단어가 없을 때
        if(v.size() == 0) { 
            System.out.println("단어장에 등록된 단어가 없습니다. 단어를 등록해 주세요.\n");
            quizAvail = false;
        }
        //등록된 단어가 있을 때
        else {
            System.out.println("현재 " + v.size() + "개의 단어가 들어 있습니다. -1을 입력하면 테스트를 종료합니다.\n");
            quizAvail = true;
        }
        
        //Until quizAvail is TRUE
        while(quizAvail) { 
            
            int randomNum = (int)(Math.random()*v.size());    //0 ~ (v.size()-1)사이의 난수 생성
            
            //해당 단어가 false일 때 test실행 
            if(rightOrWrong[randomNum] != true) {
                testCount++;
                String word = v.get(randomNum).GetKorWords(); 
                System.out.print(word + ">>  ");
            
                String result = scanner.next();
                
                //if correct
                if(result.equals(v.get(randomNum).GetEngWords())) {
                    System.out.println("Excellent !!\n");
                    rightOrWrong[randomNum] = true;
                    correctCount++;
                }
                //if enter -1
                else if(result.equals("-1")) {
                    System.out.println("End of test\n");
                    break;
                }
                //if wrong
                else {
                    System.out.println("No. !!\n");
                    hint(randomNum); //힌트 부여(1회)
 
                    System.out.print(word + ">>  ");
                    result = scanner.next();
                    
                    //if correct
                    if(result.equals(v.get(randomNum).GetEngWords())) {
                        System.out.println("Excellent !!\n");
                        rightOrWrong[randomNum] = true;
                        correctCount++;
                    }
                    //if wrong
                    else {
                        System.out.println("No. !!\n");
                        rightOrWrong[randomNum] = true;  //틀렸지만 해당 단어를 다시 테스트 목록에 넣지 않기 위해 true값을 줌.
                        wrongCount++;
                    }
                }
                
            }
            //테스트가 모두 끝이 났을 때
            else if (testCount == v.size()){
                System.out.println("단어 시험이 끝이 났습니다.");
                break;
            }
            
        }
        
        System.out.println("맞은 단어 : " + correctCount + "개");
        System.out.println("틀린 단어 : " + wrongCount + "개");
    }
    
    //Hint
    public void hint(int randomNum) {
            System.out.print("Hint >> ");
            
            char arr[] = new char [v.get(randomNum).GetEngWords().length()]; //영어단어를 저장할 char type 배열 생성
            
            for(int i=0;i<arr.length;i++)
                arr[i]=(v.get(randomNum).GetEngWords().charAt(i)); //String을 한 글자씩 끊어 char type 배열에 저장
            
            //랜덤 난수를 저장할 배열의 길이를 설정(스펠링 2개만 제공, 나머지는  '-')
            int blankSpell_length = 0;
            while(true) {
                if(((arr.length - blankSpell_length) == 2))
                    break;
                blankSpell_length++;
            }
            
            int blankSpelling[] = new int [blankSpell_length];
            
            //각자 다른 랜덤 값을 배열에 저장
            for(int i=0; i<blankSpell_length; i++) {
                blankSpelling[i]=(int)(Math.random()*(arr.length));
                int prev=0;
                while(prev != i) {
                    if(blankSpelling[i] == blankSpelling[prev]) {
                        blankSpelling[i]=(int)(Math.random()*(arr.length));
                    }
                    else
                        prev++;
                } 
            }
            
            //영어단어를 담은 배열에 임의의 순서대로 '-'을 저장
            for(int i=0;i<arr.length;i++){ 
                for(int j=0; j<blankSpell_length; j++) {
                    if(blankSpelling[j]==i)
                        arr[i] = '-';    
                }
                
            }
            
            //힌트 출력
            for(int i=0; i<arr.length; i++)
                System.out.print(arr[i]);
            System.out.println();
    }
    
    //Exit
    public void exit() {
        System.out.println("단어장을 종료합니다.");
    }        
}
 
cs

 

 

3. WordBook.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package WordBook;
 
import java.util.Scanner;
 
public class WordBook {
    
    public static void main(String[] args) {
        
        MyWordBook mybook = new MyWordBook("명품 종환");
        
        Scanner scanner = new Scanner(System.in);
        while(true) {
            mybook.menu();
            
            String select = scanner.nextLine();
            
            if(select.contentEquals("1")) {
                mybook.addWord();
            }
            else if(select.contentEquals("2")) {
                mybook.test();
            }
            else if(select.contentEquals("3")) {
                mybook.exit();
                break;
            }
 
        }
        scanner.close();
    }
}
 
cs

 

<실행 결과>

틀린 부분 있으면 피드백 부탁드립니다. 

감사합니다. 좋은 하루 되세요~!

 

 

 

'Programming > Java' 카테고리의 다른 글

Java) 카드 번호 맞추기 게임(up & down game)  (0) 2020.04.09