본문 바로가기

명품 C++

[명품 C++] 4. 객체 포인터와 객체 배열, 객체의 동적 생성

4.1 객체 포인터

객체에 대한 포인터 변수 선언 형식 

Circle *p;

객체의 주소는 객체 앞에 &연산자를 사용

p = &donut; //p에 donut의 객체 주소 저장

객체에 접근하는 방식 : ->연산자 사용

d = donut.getArea(); //객체 이름으로 멤버 함수 호출
d = p->getArea(); //포인터로 객체 멤버 함수 호출

 

 

 

4.2 객체 배열

객체 배열 : 원소가 객체라는 점을 빼면 기본 타입의 배열을 선언하고 활용하는 방법과 동일

배열이 소멸될 때 원소 객체마다 소멸자가 호출된다.

#include <iostream>
using namespace std;
class Circle{
    int radius;
    public:
        Circle() {radius = 1; }
        Circle(int r) { radius = r;}
        void setRadius(int r) {radius = r;}
        double getArea();
};

double Circle::getArea(){
    return 3.14*radius*radius;
}
int main() {
    Circle circleArray[3];
    
    circleArray[0].setRadius(10);
    circleArray[1].setRadius(20);
    circleArray[3].setRadius(30);
    
    for (int i=0;i<3;i++){
        cout << "Circle" << i << "의 면적은" << circleArray[i].getArea() << "\n";
    }
    Circle *p;
    p = circleArray;
    for (int i=0;i<3;i++){
        cout << "Circle" << i << "의 면적은" << p->getArea() << "\n";
        p++;
    }
}

+)

객체의 주소는 객체 앞에 &연산자를 사용한다고 했는데, 왜 배열 예제에서는 사용하지 않을까 생각해봄

> 포인터를 배열의 첫 번째 자리로, 즉 객체값으로 주면 실행 가능

Circle *p;
    p = &circleArray[0];
    for (int i=0;i<3;i++){
        cout << "Circle" << i << "의 면적은" << p->getArea() << "\n";
        p++;
    }

객체 배열 초기화

생성자를 사용하여 초기화 할 수 있다

Circle circleArray[3] = { Circle(10), Circle(20), Circle()};

다차원 객체 배열

2차원, 3차원 등 다차원 객체 배열 생성 가능

Circle circles[2][3]; //2행 3열의 객체 배열 생성

2차원 배열 역시 생성자를 지정하여 배열을 초기화할 수 있다

Circle circles[2][3] = { {Circle(1), Circle(2), Circle(3) }, 
						{Circle(4), Circle(5), Circle(6) } };
circle[0][0] = 1 circle[0][1] = 2 circle[0][2] = 3
circle[1][0] = 4 circle[1][1] = 5 circle[1][2] = 6

check time 3,4 답

#include <iostream>
using namespace std;
class Sample{
    int a;
    public:
        Sample() {a = 100; cout<<a<<' '; }
        Sample(int r) { a = r; cout<<a<<' ';}
        Sample(int r,int k) {a=r*k; cout<<a<<' ';}
        int get() {return a;}
};

int main() {
    int sum1=0;
    int sum2=0;
    Sample arr[3];
    Sample arr2D[2][2] = {{Sample(2,3), Sample(2,4)},{Sample(5), Sample()}};
    
    Sample *p; //3번 답 
    p = arr;
    for (int i=0;i<3;i++){
        sum1 += p->get();
        i++;
    }
    cout << sum1;
    
    // 4번 답 
    for (int i=0;i<2;i++){
        for (int j=0;j<2;j++){
            sum2 += arr2D[i][j].get();
        }
    }
    cout << sum2;
    }

 

 

 

4.3 동적 메모리 할당 및 반환

실행 중에 필요힌 만큼 메모리를 할당받고 필요 없을 때 반환하는 동적 메모리 할당/반환 메커니즘이 필요

new : heap이라는 공간으로부터 메모리를 할당 받음

delete : 할당받은 메모리를 heap으로 반환

int *pInt = new int; //int 타입의 정수 공간 할당 
char *pChar = new char; // char타입의 문자 공간 할당 
int *pInt2 = new int(20); //20으로 초기화 된 정수 공간 할당 

if (!pInt){ //p가 NULL이면 메모리 할당 받기 실패
	return 0;
}
*pInt = 5; //할당받은 정수 공간에 5 저장 
int n = *pInt; //할당 받은 정수 공간에서 값 읽기, n=5


delete pInt; //할당받은 정수 공간 반환 
delete pChar; //할당받은 문자 공간 반환

배열도 마찬가지

int *p = new int [5]; //정수형 배열의 동적 할당 

if (!p){ //p가 NULL이면 메모리 할당 받기 실패
	return 0;
}

for (int i=0;i<5;i++){
	p[i] = i;
}

delete [] p; //배열 메모리 반환

 

- new로 배열을 동적 할당 받을 때 생성자를 통해 직접 초깃값을 지정할 수는 없다 

int *pArray = new int[10](20); //error
int *pArray = new int(20)[10]; //error

int *pArray = new int[] {1,2,3,4}; //가능
int *pArray = new int[4] {1,2,3,4}; //가능

예제 4-6)

#include <iostream>
using namespace std;

int main() {
    cout << "입력할 정수의 개수는? ";
    int n;
    cin >> n;
    int *p = new int[n];

    if (!p){ //p가 NULL이면 메모리 할당 받기 실패
	    return 0;
    }

    for (int i=0;i<n;i++){
        cout << i+1 << "번째 정수: ";
        cin >> p[i];
    }
    
    int sum = 0;
    for (int i=0;i<n;i++){
        sum += p[i];
    }
    
    cout<<"평균 : " << sum/n << "\n";

delete [] p; //배열 메모리 반환
    }

check 문제 1-(2) 정답

#include <iostream>
using namespace std;

int main() {
    int *p = new int[5];

    if (!p){ //p가 NULL이면 메모리 할당 받기 실패
	    return 0;
    }

    for (int i=0;i<5;i++){
        cin >> p[i];
    }
    
    int biggest = p[0];
    for (int i=1; i<5; i++){
        if (biggest < p[i]){
            biggest = p[i];
        }
    }
    cout << biggest;
    delete [] p;
    }

 

 

 

4.4 객체와 객체 배열의 동적 생성 및 반환

객체의 동적 생성과 생성자

Circle *p = new Circle; //기본 생성자 Circle() 호출
Circle *q = new Circle(30); //생성자 Circle(30) 호출 

delete p //Circle 객체 반환
delete q //포인터 p,q는 살아있지만 메모리는 반환되었음
//delete 할 때 포인터 변수는 반드시 new를 이용하여 동적 할당 받은 메모리의 주소여야 함

예제 4-7)

#include <iostream>
using namespace std;
class Circle{
    int radius;
    public:
        Circle() {radius = 1; 
            cout << "생성자 실행 radius = " << radius << "\n";
        }
        Circle(int r) { radius = r;
            cout << "생성자 실행 radius = " << radius << "\n";
        }
        ~Circle() {cout << "소멸자 실행 radius = " << radius << "\n"; }
        void setRadius(int r) {radius = r;}
        double getArea();
};

double Circle::getArea(){
    return 3.14*radius*radius;
}
int main() {
    Circle *p, *q;
    p = new Circle;
    q = new Circle(30);
    cout << p->getArea() << "\n" << q->getArea() << "\n";
    delete p;
    delete q;
}

예제 4-8)

#include <iostream>
using namespace std;
class Circle{
    int radius;
    public:
        Circle() {radius = 1; 
            cout << "생성자 실행 radius = " << radius << "\n";
        }
        Circle(int r) { radius = r;
            cout << "생성자 실행 radius = " << radius << "\n";
        }
        ~Circle() {cout << "소멸자 실행 radius = " << radius << "\n"; }
        void setRadius(int r) {radius = r;}
        double getArea();
};

double Circle::getArea(){
    return 3.14*radius*radius;
}
int main() {
    int radius;
    while (true){
        cout << "반지름을 입력>>";
        cin >> radius;
        if (radius < 0) {
            break;
        }
        Circle *p;
        p = new Circle(radius);
        cout << "원의 면적은 : " << p->getArea() << "\n";
        delete p;
    }
}

객체 배열의 동적 생성 및 반환

- 객체의 동적 생성 및 반환과 동일

Circle *p = new Circle[3]; //기본 생성자 Circle() 호출
Circle *q = new Circle[3](30); //error
Circle *z = new Circle[3] {Circle(1), Circle(2), Circle(30)}; //ok

delete [] p //포인터 p는 살아있지만 배열은 반환되었음, 각 객체마다 ~Circle() 실행
//생성의 반대 순으로 삭제 일어남

- 사용

Circle *p = new Circle[3];

//1번째 방법
p[0].setRadius(10);
p[1].setRadius(10);
p[2].setRadius(10);

//2번째 방법
p->setRadius(10);
(p+1)->setRadius(20);
(p+2)->setRadius(30);

예제 4-9)

#include <iostream>
using namespace std;
class Circle{
    int radius;
    public:
        Circle() {radius = 1; 
            cout << "생성자 실행 radius = " << radius << "\n";
        }
        Circle(int r) { radius = r;
            cout << "생성자 실행 radius = " << radius << "\n";
        }
        ~Circle() {cout << "소멸자 실행 radius = " << radius << "\n"; }
        void setRadius(int r) {radius = r;}
        double getArea();
};

double Circle::getArea(){
    return 3.14*radius*radius;
}
int main() {
    Circle *p = new Circle[3];
    p[0].setRadius(10);
    p[1].setRadius(20);
    p[2].setRadius(30);
    
    for (int i=0;i<3;i++){
        cout << p[i].getArea() << "\n";
    }
    
    Circle *q = p;
    for (int i=0;i<3;i++){
        cout << q->getArea() << "\n";
        q++;
    }
    
    delete [] p;
}

예제 4-10)

#include <iostream>
using namespace std;
class Circle{
    int radius;
    public:
        Circle() {radius = 1;}
        Circle(int r) { radius = r;}
        ~Circle();
        void setRadius(int r) {radius = r;}
        double getArea();
};

double Circle::getArea(){
    return 3.14*radius*radius;
}
int main() {
    int n, radius;
    cout << "원의 개수를 입력하세요 >> ";
    cin >> n;
    Circle *p = new Circle[n];
    for (int i=0;i<n;i++){
        cout << "원" << i+1 << ": ";
        cin >> radius;
        p[i].setRadius(radius);
    }
    
    int result=0;
    for (int i=0;i<n;i++){
        cout << p[i].getArea() << " ";
        if (100<=p[i].getArea() && p[i].getArea()<=200)
            result++;
    }
    cout << "\n" << result;
    
    delete [] p;
}

 

 

 

4.5 this 포인터

특징

객체 자신에 대한 포인터, 클래스의 멤버 함수 내에서만 사용, 전역변수도 아니고 지역변수도 아니다

객체마다 존재하고, 멤버 함수에 컴파일러 몰래 삽입한 매개 변수이다. static 멤버 함수에는 사용할 수 없다

각 객체 속에 this는 다른 객체 속의 this와 서로 다른 포인터

제약 조건

1. 클래스의 멤버 함수에서만 사용 가능

2. 정적 멤버 함수는 사용 불가능

class Circle{
    int radius;
    public:
        Circle() {this->radius = 1;}
        Circle(int r) { this-> radius = r;}
        ~Circle();
        void setRadius(int r) {this->radius = r;}
        double getArea();
};

this가 필요한 경우는?

1. 멤버 변수의 이름과 동일한 이름으로 매개 변수 이름을 짓고자 하는 경우

Circle(int radius) { this-> radius = radius;} //ok
Circle(int radius) { radius = radius;} //error

2. 객체의 멤버 함수에서 객체 자신의 주소를 리턴할 때

연산자 중복을 구현할 때 이런 경우가 많이 발생 

class Sample{
	public:
    	Sample *f() {
        	...
            return this; //현재 객체의 주소 리턴
        }
};

 

 

 

4.6 string 클래스를 이용한 문자열 사용

c-스트링은 초기에 할당받은 메모리 크기 이상의 문자열을 저장할 수 없고, string 클래스는 문자열의 크기에 맞추어 스스로 메모리 크기를 조정한다

string str;
string address("서울 성북구 삼선동 389");
string copy(address);

string *p = new string("C++");
p->append(" Great!");
cout << *p; //C++ Great! 출력
delete p;

 

 

string 객체에 문자열 입력

string name;
cin >> name; //공백 사용 불가능 
getline(cin, name, '\n'); //\n을 만날 때까지 키보드로부터 문자열을 읽어 name에 저장

예제 4-12)

#include <iostream>
#include <string>
using namespace std;

int main() {
    string names[5];
    for (int i=0;i<5;i++){
        cout << "이름 >>";
        getline(cin,names[i],'\n');
    }
    
    string latter = names[0];
    for (int i=1;i<5;i++){
        if (latter < names[i]){
            latter = names[i];
        }
    }
    
    cout << "사전에서 가장 뒤에 나오는 문자열은 : " << latter << "\n";
}

문자열 비교

compare 사용, 비교 연산자도 사용 가능

string name = "kitae";
string alias = "kito";
int res = name.compare(alias); //name과 alias 비교
if (res==0) {cout << "두 문자열이 같다.";}
else if (res<0) {cout << name << "<" <<alias <<"\n"; //name이 앞에 옴 
else cout<<alias<<"<"<<name<<"\n"; //name이 뒤에 옴

문자열 연결

append 사용, +, += 연산자 사용 가능

string a("i love c++");
string b(".");
string c;
a.appned(b);
c = a+b; 
c += b

문자열 삽입

insert 함수

#include <iostream>
#include <string>
using namespace std;

int main() {
    string a("i love c++");
    a.insert(2,"really ");
    cout << a; // i really love c++
    a.replace(2,11,"study");
    cout << a; //i study c++
}

문자열 길이

length, size

string a("i study c++");
    a.insert(2,"really ");
    cout << a.length; //11
    cout << a.size; //11 (length()와 동일)

문자열 삭제 : erase(start, end)는 문자열의 일부분을 삭제, clear()은 전부 삭제

서브 스트링 : 문자열에서 일부분을 발췌한 문자열 얻을 수 있음

string a("i love c++");
    cout << a.substr(2,4); //love 2부터 4개 문자 리턴
    cout << a.substr(2); //love c++ 2부터 끝까지 리턴

문자열 검색 : find() 특정 문자나 문자열을 발견하면 첫 번째 인덱스를 리턴한다

문자열의 각 문자 : at()은 수정 불가능하고 []는 수정이 가능하다

string a("i love c++");
    cout << a.at(7); //c
    cout << a[7]; //c
    a[2] = 'D';
    cout << a; //i love D++

문자열의 숫자 변환 : stoi()

string year = "2014";
    int n = stoi(year); //2014

string 은 문자열만 다루지 문자를 다룰 수는 없다, 문자를 다루는 함수는 <locale> 헤더 파일에 존재한다

#include <iostream>
#include <string>
#include <locale>
using namespace std;

int main() {
    string a = "hello";
    for (int i=0;i<a.length();i++){
        a[i] = toupper(a[i]); //HELLO
    }
    if(isdigit(a[0])) cout << "숫자";
    else if (isalpha(a.at(0))) cout << "문자";
}

예제 4-13)

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s;
    cout << "문자열 입력하세요 : " << "\n";
    getline(cin, s, '\n');
    int len = s.length();
    
    for (int i=0;i<len;i++){
        string first = s.substr(0,1);
        string sub = s.substr(1,len-1);
        s = sub+first;
        cout << s << "\n";
    }
}

예제 4-14)*

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s;
    cout << "식 입력하세요 : " << "\n";
    getline(cin, s, '\n');
    int sum = 0;
    int startIndex = 0;
    while(true){
        int findIndex = s.find("+", startIndex);
        if (findIndex == -1){
            string part = s.substr(startIndex);
            cout << part << "\n";
            sum += stoi(part);
            break;
    }
    int count = findIndex - startIndex;
    string part = s.substr(startIndex, count);
    
    cout << part << "\n";
    sum += stoi(part);
    startIndex = findIndex+1;
}
cout << "숫자들의 합은 "<<sum;
}

예제 4-15)

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s;
    cout << "문자열 입력하세요 : " << "\n";
    getline(cin, s, '&');
    cin.ignore(); //주의
    
    string f, r;
    cout << "find : ";
    getline(cin,f,'\n');
    
    cout << "replace : ";
    getline(cin,r,'\n');
    
    int startIndex = 0;
    while(true){
        int findIndex = s.find(f, startIndex);
        if (findIndex == -1) break;
    
        s.replace(findIndex,f.length(),r);
        startIndex = findIndex+r.length();
}
cout << s << "\n";
}

 

 

 

openchallenge

#include <iostream>
#include <string>
using namespace std;
class Player{
    string name;
    public:
        void setName(string name) { this->name = name; }
        string getName() { return name; }
};

class WordGame{
    Player *p;
    int num;
    public:
        WordGame(int num){this->num=num;
            p = new Player[num];
        }
        void start();
};

void WordGame::start() {
    string s;
    for (int i=0;i<num;++i){
        cout << "참가자의 이름을 입력하세요. 빈칸없이>>";
        cin >> s;
        p[i].setName(s);
    }
    
    cout << "\n" << "시작하는 단어는 아버지입니다" << "\n";
    string a = "아버지";
    string b;
    int index = 0;
    
    for (;;) {
        cout << p[index%num].getName() << ">>";
        cin >> b;
        int j = a.size();
        if (a.at(j - 2) == b.at(0) && a.at(j - 1) == b.at(1)) {
            a = b;
        }
        else {
            cout << p[index%num].getName() << "탈락"<<"\n";
            break;
        }
        ++index;
    }
}

int main() {
    int num;
    cout << "끝말 잇기 게임을 시작합니다" << "\n";
    cout << "게임에 참가하는 인원은 몇명입니까?";
    cin >> num;
    WordGame wordgame(num);
    wordgame.start();
}

실습

1

#include <iostream>
using namespace std;
class Color{
    int red, green, blue;
    public:
        Color(){
            red = green = blue = 0;
        }
        Color (int r, int g, int b){
            red = r; green = g; blue = b;
        }
        void setColor(int r, int g, int b){
            red = r; green = g; blue = b;
        }
        void show(){
        cout<<red<<' '<<green<< ' '<<blue<<"\n";
        }
};

int main() {
   Color screenColor(255,0,0);
   Color *p;
   p = &screenColor; //(1)
   p->show(); //(2)
   Color colors[3]; // (3)
   p = colors; //(4)
   p[0].setColor(255, 0, 0); //(5)
   p[1].setColor(0, 255, 0);
   p[2].setColor(0, 0, 255);
   
   for (int i=0;i<3;i++){
       p[i].show();
   }
}

2

#include <iostream>
using namespace std;

int main() {
    int *arr = new int[5];
    cout << "정수 5개 입력>>";
    for (int i = 0; i < 5; i++) {
		cin >> arr[i];
	}
	
	int sum = 0;
	for (int i=0 ; i< 5; i++){
	    sum+=arr[i];
	}
    
    cout << "평균 : " <<sum/5.0;
}

3

#include <iostream>
using namespace std;
class Color{
    int red, green, blue;
    public:
        Color(){
            red = green = blue = 0;
        }
        Color (int r, int g, int b){
            red = r; green = g; blue = b;
        }
        void setColor(int r, int g, int b){
            red = r; green = g; blue = b;
        }
        void show(){
        cout<<red<<' '<<green<< ' '<<blue<<"\n";
        }
};

int main() {
    string s;
    cout << "문자열 입력>>";
    getline(cin,s,'\n');
    int len = s.length();
    int count = 0;
    for (int i=0;i<len;i++){
        if (s[i]=='a'){
            count++;
        }
    }
    cout << "문자 a는 " << count<<"개 있습니다.\n";
    
    int index = 0;
	cout << "a의 인덱스: ";
	while ((index = s.find('a', index)) != -1) {
		cout << index << ' ';
		index++;
	}
}

4

#include <iostream>
using namespace std;

class Sample{
    int *p;
    int size;
    public:
        Sample(int n){
            size = n; p = new int[n];
        }
        void read(){
            for (int i=0;i<size;i++){
                cin >> p[i];
            }
        }
        void write(){
            for (int i = 0; i < size; i++) {
                    cout << p[i] << ' ';
            }
            cout << endl;
        }
    int big(){
        int biggest = p[0];
        for (int i=1;i<size;i++){
            if (biggest<p[i]){
                biggest = p[i];
            }
        }
        return biggest;
    };
    
    ~Sample(){
        delete[] p;
    };
};

int main() {
    Sample s(10);
    s.read();
    s.write();
    cout << "가장 큰 수는 " << s.big() << "\n";
}

5

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
using namespace std;


int main() {
    string s;
    srand((unsigned)time(0));
    while (true){
        cout << "아래에 한 줄을 입력하세요.(exit를 입력하면 종료합니다)\n";
        cout << ">>";
        getline(cin, s, '\n');
        if (s == "exit")
            break;
        int n = rand() % s.length();
        char alpha = rand() % 26 + 'a';
        s[n] = alpha;
        cout << s << endl;
    }
}

6

#include <iostream>

#include <string>
using namespace std;


int main() {
    string s;
    while (true){
        cout << "아래에 한 줄을 입력하세요.(exit를 입력하면 종료합니다)\n";
        cout << ">>";
        getline(cin, s, '\n');
        if (s == "exit")
            break;
        for (int i=(s.length()-1);i<s.length();i--){
            cout << s[i];
        }
        cout << "\n";
    }
}

7

#include <iostream>
#include <string>
using namespace std;

class Circle{
    int radius;
public:
    void setRadius(int radius){
        this->radius = radius;
    }
    double getArea(){
        return 3.14*radius*radius;
    }
};

int main() {
    int radius;
    Circle array[3];
    for (int i=0;i<3;i++){
        cout << "원 "<<i+1<<"의 반지름 >> ";
        cin >>radius;
        array[i].setRadius(radius);
    }
    
    int count = 0;
    for (int i=0;i<3;i++){
        if (array[i].getArea()>100){
            count++;
        }
    }
    
    cout << "면적이 100보다 큰 원은 " << count <<"개 입니다.\n";
}

8

#include <iostream>
#include <string>
using namespace std;

class Circle{
    int radius;
public:
    void setRadius(int radius){
        this->radius = radius;
    }
    double getArea(){
        return 3.14*radius*radius;
    }
};

int main() {
    int n;
    cout << "원의 개수 >> ";
    cin >> n;
    int radius;
    Circle array[n];
    
    for (int i=0;i<n;i++){
        cout << "원 "<<i+1<<"의 반지름 >> ";
        cin >>radius;
        array[i].setRadius(radius);
    }
    
    int count = 0;
    for (int i=0;i<n;i++){
        if (array[i].getArea()>100){
            count++;
        }
    }
    
    cout << "면적이 100보다 큰 원은 " << count <<"개 입니다.\n";
}

9

#include <iostream>
#include <string>
using namespace std;

class Person{
    string name;
    string tel;
public:
    string getName(){
        return name;
    }
    string getTel(){
        return tel;
    }
    void set(string name, string tel){
        this->name=name;
        this->tel=tel;
    }
};

int main() {
    cout << "이름과 전화번호를 입력해주세요\n";
    Person array[3];
    string name, tel;
    for (int i=0;i<3;i++){
        cout << "사람 "<<i+1<<">> ";
        cin >> name >> tel;
        array[i].set(name,tel);
    }
    cout << "모든 사람의 이름은 ";
    for (int i=0;i<3;i++){
        cout << array[i].getName();
    }
    cout << "\n";
    
    string find;
    cout << "전화번호 검색합니다. 이름을 입력하세요>>";
    cin >> find;
    
    for (int i=0;i<3;i++){
        if (array[i].getName()==find){
            cout << "전화번호는 " << array[i].getTel() << "\n";
        }
    }
}

10

#include <iostream>
#include <string>
using namespace std;

class Person{
    string name;
public:
    Person(){
        
    }
    Person(string name) {
        this->name=name;
    }
    string getName(){
        return name;
    }
    void setName(string name){
        this->name=name;
    }
};
class Family{
    Person *p;
    int size;
    string name;
    int num;
public:
    Family();
    Family(string name, int size){
        this->name = name;
        this->size = size;
        p = new Person[size];
    }
    void show(){
        cout << "Simpson 가족은 다음과 같이 3명 입니다\n";
        for (int i=0;i<size;i++){
            cout << p[i].getName()<<"\t";
        }
        cout << "\n";
    }
    ~Family(){
        delete []p;
    };
    void setName(int num, string name) {
            p[num].setName(name);
        }
};

int main() {
    Family *simpson = new Family("simpson", 3);
    simpson->setName(0,"Mr. Simpson");
    simpson->setName(1,"Mrs. Simpson");
    simpson->setName(2,"Bart Simpson");
    simpson->show();
    delete simpson;
}

11

#include <iostream>
#include <string>
using namespace std;

class Container {
    int size;
public:
    Container() { size = 10; }
    void fill() {size = 10;}
    void consume() { size = size - 1;}
    int getSize(){return size;}
};

class CoffeeVendingMachine {
    Container tong[3];
    void fill(){
        for (int i=0;i<3;i++){
            tong[i].fill();
        }
        show();
    };
    void selectEspresso(){
        tong[0].consume();
        tong[1].consume();
        cout << "에스프레소 드세요 \n";
    }
    void selectAmericano(){
        tong[0].consume();
        tong[1].consume();
        tong[1].consume();
        cout << "아메리카노 드세요 \n";
    }
    void selectSugarCoffee(){
        tong[0].consume();
        tong[1].consume();
        tong[1].consume();
        tong[2].consume();
        cout << "설탕커피 드세요 \n";
    }
    void show(){
        cout << "커피 " << tong[0].getSize() << ", 물 " << tong[1].getSize() << ", 설탕 " << tong[2].getSize() << "\n";
    }
public:
    void run(){
        cout << "***** 커피자판기를 작동합니다. *****" << endl;
        
        int choice;
        while (true) {
            cout << "메뉴를 눌러주세요(1: 에스프레소, 2:아메리카노, 3:설탕커피, 4:잔량보기, 5:채우기)>> ";
            cin >> choice;
            switch (choice) {
                case 1:
                    selectEspresso();
                    break;
                case 2:
                    selectAmericano();
                    break;
                case 3:
                    selectSugarCoffee();
                    break;
                case 4:
                    show();
                    break;
                case 5:
                    fill();
                    break;
            }
        }
    }
};

int main(void){
    CoffeeVendingMachine machine;
    machine.run();
}

12

#include <iostream>
#include <string>
using namespace std;

class Circle{
    int radius;
    string name;
public:
    void setCircle(string name,int radius){
        this->name=name;
        this->radius = radius;
    }
    double getArea(){
        return 3.14*radius*radius;
    }
    string getName(){
        return name;
    }
};

class CircleManager{
    Circle *p;
    int size;
public:
    CircleManager(int size){
        this->size=size;
        p = new Circle[size];
        string name;
        int radius;
        for (int i = 0; i < size; i++) {
            cout << "원 " << i + 1 << "의 이름과 반지름 >> ";
            cin >> name >> radius;
            p[i].setCircle(name, radius);
            }
    }
    ~CircleManager(){
        delete [] p;
    }
    void searchByName(){
        string find;
        cout << "검색하고자 하는 원의 이름 >> ";
        cin >> find;
        for (int i=0;i<size;i++){
            if (p[i].getName()==find){
                cout << find << "의 면적은 " << p[i].getArea();
            }
        }
        cout << "\n";
    }
    void searchByArea(){
        int target;
        cout << "최소 면적을 정수로 입력하세요 >> ";
        cin >> target;
        cout << target << "보다 큰 원을 검색합니다.\n";
        for (int i=0;i<size;i++){
            if (p[i].getArea()>target){
                cout << p[i].getName()<<"의 면적은 " << p[i].getArea()<<",";
            }
        }
        cout << "\n";
    }
};

int main (void){
    int size;
    cout << "원의 개수>> ";
    cin >> size;
    CircleManager p(size);
    p.searchByName();
    p.searchByArea();
}

13

#include <iostream>
#include <string>
using namespace std;

class Histogram{
    string str;
public:
    Histogram(string str){
        this->str=str;
    }
    void put(string str){
        this->str += '\n' + str;
    }
    void putc(char ch) {
        this->str += ch;
    }
    void print(){
        int alpha=0;
        int alphaNum[26] = { 0, };
        cout << str << "\n";
        for (int i=0;i<str.size();i++){
            if (isalpha(str[i])){
                alpha++;
                alphaNum[tolower(str[i]) - 'a'] += 1;
            }
        }
        cout << "총 알파벳 수 : " << alpha << "\n";
        
        for (int i=0;i<26;i++){
            char c = 'a' + i;
            cout << c << " (" << alphaNum[i] << ")\t: ";
            for (int j = 0; j < alphaNum[i]; j++) {
                cout << "*";
            }
            cout << "\n";
        }
    }
};

int main (void){
    Histogram elvisHisto("Wise men say, only fools rush in But I can't help, ");
        elvisHisto.put("falling in love with you");
        elvisHisto.putc('-');
        elvisHisto.put("Elvis Presley");
        elvisHisto.print();
}

14

#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
using namespace std;

class Player{
    string name;
public:
    void setName(string name) { this->name = name; }
    string getName() { return name; }
};

class GamblingGame{
    Player p[2];
public:
    void start();
    bool turn(string name);
    ~GamblingGame() {
        cout << "게임을 종료합니다." << endl;
    }
};

void GamblingGame::start() {
    srand((unsigned)time(0));
    string name;
    cout << "***** 갬블링 게임을 시작합니다. *****\n";
    cout << "첫번째 선수 이름>>";
    cin >> name;
    p[0].setName(name);
    cout << "두번째 선수 이름>>";
    cin >> name;
    p[1].setName(name);
    cin.ignore();
    
    int end = 0;
    while (true) {
        for (int i = 0; i < 2; i++) {
            if (turn(p[i].getName())) {
                cout << p[i].getName() << "님 승리!!!" << "\n";
                end = 1;
                break;
            }else
                cout << "아쉽군요!" << "\n";
            }
            if (end == 1)
                break;
        }
}

bool GamblingGame::turn(string name){
    string enter;
    cout << name << "<Enter>";

    while (true) {
        char ch;
        cin.get(ch);
        if (ch == '\n')
            break;
        }
        int random[3] = { 0, };
        for (int i = 0; i < 3; i++) {
            random[i] = rand() % 3;
        }
        cout << "\t" << random[0] << "\t" << random[1] << "\t"<< random[2] << "\t";
        if (random[0] == random[1] && random[1] == random[2])
            return true;
        else
            return false;
    
}

int main (void){
    GamblingGame game;
    game.start();
}