본문 바로가기

C++ programming

명품 C++ programming 실습 문제 10장 10번

문제 :

나라의 수도 맞추기 게임에 vector를 활용해보자. 나라 이름(nation)과 수도(capital) 문자열로 구성된 Nation 클래스를 만들고, vector<Nation> v;로 생성한 벡터를 이용하여 나라 이름과 수도 이름을 삽입할 수도 있고 랜덤하게 퀴즈를 볼 수도 있다.

프로그램 내에서 벡터에 Nation 객체를 여러 개 미리 삽입하여 퀴즈를 보도록 하라.

실행 화면은 다음과 같으며, 저자는 9개 나라의 이름과 수도를 미리 프로그램에서 삽입하였다.

문자열은 string 클래스를 이용하라.

 

실행 결과 :

 

목적 및 힌트 :

vector에 객체의 삽입, 검색 응용 연습

 

코드 :

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
#include <iostream>
#include <algorithm>
 
using namespace std;
 
class Nation {
    string nation;
    string capital;
public:
    Nation(string n=0string c=0) {
        nation = n;
        capital = c;
    }
    string getNation(){
        return nation;
    }
    string getCapital() {
        return capital;
    }
    bool nationCompare(string n) { //나라 이름을 비교하는 함수. 
        if(nation == n)
            return true;
        return false;
    }
};
 
int main() {
    vector<Nation> v;
    v.push_back(Nation("대한민국""서울"));
    v.push_back(Nation("중국""베이징"));
    v.push_back(Nation("북한""평양"));
    v.push_back(Nation("미국""와싱턴"));
    v.push_back(Nation("대만""타이베이"));
    v.push_back(Nation("캐나다""오타와"));
    v.push_back(Nation("스위스""제네바"));
    v.push_back(Nation("프랑스""파리"));
    v.push_back(Nation("이집트""카이로"));
    
    cout << "***** 나라의 수도 맞추기 게임을 시작합니다. *****\n";
    
    while(true){
        int num;
        cout << "정보 입력: 1, 퀴즈: 2, 종료 3 >> ";
        cin >> num;
        switch(num){
            case 1:
                cout << "현재 " << v.size() << "개의 나라가 입력되어 있습니다.\n";
                 cout << "나라와 수도를 입력하세요(no no 이면 입력끝)\n";
                 for(int i=v.size()+1;; i++){
                     string n, c;
                     bool b;
                    cout << i << ">>";
                     cin >> n >> c;
                     if(n=="no" && c=="no")
                         break;
                     for(int j=0; j<v.size(); j++)
                         if(b=v.at(j).nationCompare(n)){
                             cout << "already exists !!\n";
                             i--
                            break;
                        }
                    if(b)
                        continue;
                    v.push_back(Nation(n, c)); // 정상적인 입력 값이면 vector v에 입력 
                }
                break;
                
            case 2:
                int random;
                while(true){
                    string c;
                    random = rand() % v.size(); // v에 들어있는 원소의 개수보다 작은 숫자를 얻음
                    cout << v.at(random).getNation() << "의 수도는?";
                    cin >> c;
                    if(c == "exit")
                        break;
                    else if(v.at(random).getCapital() == c) // 입력받은 수도가 맞으면 Correct 출력 
                        cout << "Correct !!\n";
                    else
                        cout << "No !!\n";
                }
                break;
                
            case 3:
                return 0;
        }
    }
}
 

 

설명 :

코드가 그렇게 길지 않고 어렵지 않기 때문에 별 다른 함수를 사용하지 않고 main() 함수에서만 작성 하였습니다.