프로그래밍/C,C++

[명품 C++ programming]10,11장 실습문제

수학가형 2022. 1. 6. 18:03

단원:

10. 템플릿과 표준 라이브러리(STL)

11. C++ 입출력 시스템

 

[실습 10.8]문제 7을 푸는 다른 방법을 소개한다. bigger()함수의 다음 라인에서 >연산자 때문에, T에 클래스 타입이 대입될 때 구체화가 실패하여 컴파일 오류가 발생한다. 이 문제를 해결하기 위해 추상 클래스 Comparable이 주어진다. Circle 클래스가 Comparable을 상속받아 순수 가상 함수를 모두 구현하면, 앞의 bigger() 템플릿 함수를 사용하는데 아무 문제가 없다. Circle뿐 아니라, Comparable을 상속받은 모든 클래스를 bigger()에 사용할수 있다. Comparable을 상속받은 Circle 클래스를 완성하고 문제 7의 main()을 실행하여 테스트하라.

 

코드:

#include<iostream>
 
using namespace std;
 
class Comparable  //추상클래스
{
public:
        virtual bool operator > (Comparable& op2) = 0;  //순수가상함수
        virtual bool operator < (Comparable& op2) = 0;
        virtual bool operator == (Comparable& op2) = 0;
};
 
class Circle: public Comparable  //추상클래스를 public으로 받은 Circle 클래스 생성
{
        int radius;
public:
        Circle(int radius = 1)
        {
               this->radius = radius;
        }
        int getRadius()
        {
               return radius;
        }
 
        virtual bool operator > (Comparable& op2)
        {
               Circle* p = (Circle*)&op2;  //다운캐스팅
               int comradius = p->radius;
 
               if ((this->radius) > comradius)
                       return true;
               else
                       return false;
        }
 
        virtual bool operator < (Comparable& op2)
        {
               Circle* p = (Circle*)&op2;  //다운캐스팅
               int comradius = p->radius;
 
               if ((this->radius) < comradius)
                       return true;
               else
                       return false;
        }
 
        virtual bool operator == (Comparable& op2)
        {
               Circle* p = (Circle*)&op2;  //다운캐스팅
               int comradius = p->radius;
 
               if ((this->radius) == comradius)
                       return true;
               else
                       return false;
        }
       
};
 
template <class T>
T bigger(T a, T b)
{
        if (a > b)
               return a;
        else
               return b;
}
 
int main()
{
        int a = 20;
        int b = 50;
        int c = bigger(a, b);
 
        cout << "20 50 값은" << c << endl;
        Circle waffle(10);
        Circle pizza(20);
        Circle y;
 
        y = bigger(waffle, pizza);
        cout << "waffle pizza 것의 반지름은" << y.getRadius() << endl;
}

결과:

 

 

[실습 10.11]책의 연도, 책이름, 저자 이름을 담은 Book 클래스를 만들고 vector<Book> v;로 작성한 벡터를 사용하여 책을 입고하고, 저자와 연도로 검색하는 프로그램을 만들어라.

 

코드-Book 클래스 헤더:

#include"essential.h"
class Book  //Book 클래스
{
        int year;  //년도
        string name, author;  // 이름과 작가명
public:
        Book(int year, string name, string author);  //생성자
        int getyear();  //년도 반환 함수
        string getauthor();  //저자 반환 함수
        string getname();  //이름 반환 함수
};

코드-essential 헤더:

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

코드-Book.cpp:

#include"Book.h"
 
Book::Book(int year, string name, string author)
{
        this->year = year;
        this->name = name;
        this->author = author;
}
 
int Book::getyear()
{
        return year;
}
 
string Book::getauthor()
{
        return author;
}
 
string Book::getname()
{
        return name;
}

코드-main.cpp:

#include"Book.h"
 
void findauthor(vector<Book> v, string name)  //저자로 Book 검색하는 함수
{
        cout << endl;
        int n = 0;
        for (int i = 0; i < v.capacity(); i++)
        {
               if (v[i].getauthor() == name)
               {
                       cout << v[i].getyear() << "년도, " << v[i].getname() << ' ' << v[i].getauthor() << endl;
                       n++;
               }
        }
        if (n == 0)
               cout << "일치하는 항목이 없습니다." << endl;
}
 
void findyear(vector<Book> v, int year)  //년도로 Book 검색하는 함수
{
        cout << endl;
        int n = 0;
        for (int i = 0; i < v.capacity(); i++)
        {
               if (v[i].getyear() == year)
               {
                       cout << v[i].getyear() << "년도, " << v[i].getname() << ' ' << v[i].getauthor() << endl;
                       n++;
               }
        }
        if (n == 0)
               cout << "일치하는 항목이 없습니다." << endl;
}
 
int main()
{
        vector<Book> v;
 
        int tmpyear;  //임시변수
        string tmpname;
        string tmpauthor;
 
        cout << "입고할 책을 입력하세요. 년도에 -1 입력하면 입고를 종료합니다." << endl;
        for (int i = 0;; i++)  //무한반복문
        {
               cout << "년도: ";
               cin >> tmpyear;
               cin.ignore(100, '\n');  //버퍼 비우기
       
               if (tmpyear == -1)  //입고중단조건
               {
                       cout << " 입고된 책은 " << i << " 입니다." << endl;
                       break;
               }
               cout << "\n책이름: ";
               getline(cin, tmpname, '\n');
 
               cout << "\n저자: ";
               getline(cin, tmpauthor, '\n');
 
               cout << endl;
 
               Book tmp(tmpyear, tmpname, tmpauthor);  //Book type 객체 생성
               v.push_back(tmp); //v 푸시
        }
 
        //검색부
        cout << "검색하고자 하는 저자 이름을 입력하세요>> ";
        cin >> tmpauthor;
        findauthor(v, tmpauthor);
 
        cout << "검색하고자 하는 년도를 입력하세요>> ";
        cin >> tmpyear;
        findyear(v, tmpyear);
 
        return 0;
}

결과:

 

 

[실습 11.11]교재에 주어진 프로그램과 실행 결과를 참고하여 pos조작자를 작성하라.

코드:

#include<iostream>
using namespace std;
 
//pos 조작자 작성하기. (매개변수 X)
 
istream& pos(istream& ins)  //출력이 스트림의 레퍼런스이고 매개변수가 ins라는 아림의 스트림 레퍼런스인 함수 작성
{
        cout << "위치는? ";
        return ins;  //ins 레퍼런스를 반환하므로 문장 cin>>pos 실행된 cin 반환되어 cin>>x; 된다.
}
 
 
int main()
{
        int x, y;
        cin >> pos >> x;
        cin >> pos >> y;
        cout << x << ',' << y << endl;
}

결과:

 


문제 소스:

책정보, 명품 C++ Programming : 네이버 책 (naver.com)

 

명품 C++ Programming

C++는 1979년 BJARNE STROUSTRUP에 의해 “C WITH CLASSES”라는 이름으로 시작되었지만, 지금은 시스템 소프트웨어, 응용 소프트웨어, 게임, 임베디드 소프트웨어, 모바일 프로그램 등 소프트웨어의 전 분

book.naver.com

 

'프로그래밍 > C,C++' 카테고리의 다른 글

정렬/탐색  (0) 2022.01.30
배열  (0) 2022.01.30
[명품 C++ programming]9장 Open challenge  (0) 2022.01.06
[명품 C++ programming]7,8,9장 실습문제  (0) 2022.01.06
[명품 C++ programming]4,5,6장 실습문제  (0) 2022.01.06