박종혁교수 - parkjonghyuk.net · 두사람이게을 진행하며,...

19
3장. 실전문제 박 종 혁 교수 (서울과기대 컴퓨터공학과) Tel: 970-6702 Email: [email protected] SeoulTech 2019-2 nd 프로그래밍입문(2)

Transcript of 박종혁교수 - parkjonghyuk.net · 두사람이게을 진행하며,...

Page 1: 박종혁교수 - parkjonghyuk.net · 두사람이게을 진행하며, 선수의이름을초기에력받는다 . 선수가번갈아 자신의차례에서 키를치면랜덤한3개의수가생성되고두

3장. 실전문제

박 종 혁 교수(서울과기대컴퓨터공학과)

Tel: 970-6702Email: [email protected]

SeoulTech 2019-2nd 프로그래밍입문(2)

Page 2: 박종혁교수 - parkjonghyuk.net · 두사람이게을 진행하며, 선수의이름을초기에력받는다 . 선수가번갈아 자신의차례에서 키를치면랜덤한3개의수가생성되고두

실전문제(1)

• 다음에서 Person은사람을, Family는가족을추상화한클래스로서완성되지않은클래스이다.

• 다음 main()이 작동하도록 Person과 Family 클래스에 필요한 멤버들을 추가하고 코드를 완성하라.

2

Page 3: 박종혁교수 - parkjonghyuk.net · 두사람이게을 진행하며, 선수의이름을초기에력받는다 . 선수가번갈아 자신의차례에서 키를치면랜덤한3개의수가생성되고두

실전문제(1) - 소스코드#include <iostream>

#include <string>

using namespace std;

class Person {

string name;

public:

Person() { name=""; }

Person(string name) { this->name = name; }

string getName() { return name; }

void setName(string name) { this->name = name; }

};

class Family {

string name;

Person* p; // Person 배열포인터

int size; // Person 배열의크기. 가족구성원수

public:

Family(string name, int size); // size 개수만큼Person 배열동적생성

void setName(int index, string name);

void show(); // 모든가족구성원출력

~Family();

};

Family::Family(string name, int size) {

this->name = name;

this->size = size;

p = new Person [size];

}

3

Family::~Family() {

delete [] p;

}

void Family::setName(int index, string name) {

p[index].setName(name);

}

void Family::show() {

cout << name + " 가족은다음과같이 " << size << "명입니다." << endl;

for(int i=0; i<size; i++) {

cout << p[i].getName() << '\t';

}

cout << endl;

}

int main() {

Family *simpson = new Family("Simpson", 3); // 3명으로구성된Simpson 가족

simpson->setName(0, "Mr. Simpson");

simpson->setName(1, "Mrs. Simpson");

simpson->setName(2, "Bart Simpson");

simpson->show();

delete simpson;

}

Page 4: 박종혁교수 - parkjonghyuk.net · 두사람이게을 진행하며, 선수의이름을초기에력받는다 . 선수가번갈아 자신의차례에서 키를치면랜덤한3개의수가생성되고두

실전문제(2)

• 다음은반지름을속성으로가진 Circle 클래스이다.

4

#include <iostream>using namespace std;

class Circle {

int radius; // 원의반지름값public:

void setRadius(int radius); // 반지름을설정한다.double getArea(); // 면적을리턴한다.

};

Page 5: 박종혁교수 - parkjonghyuk.net · 두사람이게을 진행하며, 선수의이름을초기에력받는다 . 선수가번갈아 자신의차례에서 키를치면랜덤한3개의수가생성되고두

실전문제(2)

• 키보드에서 원의개수를입력받고, 그개수만큼 원의반지름을입력받고, 다음과같이실행되도록 main()함수를 작성하라. Circle클래스를 완성하라

5

실행 결과

원의개수 >> 3원 1의반지름 >> 10원 2의반지름 >> 2원 3의반지름 >> 1100보다큰원을검색합니다.면적이 100보다큰원은 1개입니다

Page 6: 박종혁교수 - parkjonghyuk.net · 두사람이게을 진행하며, 선수의이름을초기에력받는다 . 선수가번갈아 자신의차례에서 키를치면랜덤한3개의수가생성되고두

실전문제(2) - 소스코드#include <iostream>

using namespace std;

class Circle {

int radius; // 원의반지름값

public:

void setRadius(int radius); // 반지름을설정한다.

double getArea(); // 면적을리턴한다.

};

void Circle::setRadius(int radius) {

this->radius = radius;

}

double Circle::getArea() {

return 3.14*radius*radius;

}

6

int main() {

Circle *p;

int size;

cout << "원의개수 >> ";

cin >> size; // 원의개수입력

if(size < 1)

return 0;

p = new Circle[size]; // 객체배열동적생성

int radius;

for(int i=0; i<size; i++) {

cout << "원 " << i+1 << "의반지름 >> ";

cin >> radius;

p[i].setRadius(radius);

}

int count = 0;

for(int i=0; i<size; i++) {

if(p[i].getArea() > 100) {

count++;

}

}

cout << "면적이 100보다큰원은 " << count << "개입니다" << endl;

delete [] p; // 객체배열소멸

}

Page 7: 박종혁교수 - parkjonghyuk.net · 두사람이게을 진행하며, 선수의이름을초기에력받는다 . 선수가번갈아 자신의차례에서 키를치면랜덤한3개의수가생성되고두

실전문제(3)

• 다음은커피자판기로작동하는프로그램을만들기위해필요한두클래스이다.

7

Page 8: 박종혁교수 - parkjonghyuk.net · 두사람이게을 진행하며, 선수의이름을초기에력받는다 . 선수가번갈아 자신의차례에서 키를치면랜덤한3개의수가생성되고두

실전문제(3)

• 다음과같이실행되도록 main() 함수와 CoffeeVendingMachine, Container를 완성하라. 만일커피, 물, 설탕중잔량이하나라도 부족해커피를제공할수없는경우 ‘원료가부족합니다.’ 를출력하라

8

실행 결과

***** 커피자판기를작동합니다 *****메뉴를눌러주세요(1:에스프레소, 2:아메리카노, 3:설탕커피, 4:잔량보기, 5:채우기)>> 4커피 10, 물 10, 설탕 10메뉴를눌러주세요(1:에스프레소, 2:아메리카노, 3:설탕커피, 4:잔량보기, 5:채우기)>> 1에스프레소드세요메뉴를눌러주세요(1:에스프레소, 2:아메리카노, 3:설탕커피, 4:잔량보기, 5:채우기)>> 4커피 9, 물 9, 설탕 10메뉴를눌러주세요(1:에스프레소, 2:아메리카노, 3:설탕커피, 4:잔량보기, 5:채우기)>> 3에스프레소드세요메뉴를눌러주세요(1:에스프레소, 2:아메리카노, 3:설탕커피, 4:잔량보기, 5:채우기)>> 4커피 8, 물 7, 설탕 9메뉴를눌러주세요(1:에스프레소, 2:아메리카노, 3:설탕커피, 4:잔량보기, 5:채우기)>> 5커피 10, 물 10, 설탕 10메뉴를눌러주세요(1:에스프레소, 2:아메리카노, 3:설탕커피, 4:잔량보기, 5:채우기)>>

Page 9: 박종혁교수 - parkjonghyuk.net · 두사람이게을 진행하며, 선수의이름을초기에력받는다 . 선수가번갈아 자신의차례에서 키를치면랜덤한3개의수가생성되고두

실전문제(4)

• 겜블링 게임을 만들어보자. 두 사람이 게임을 진행하며, 선수의 이름을 초기에 입력받는다. 선수가 번갈아

자신의 차례에서 <Enter> 키를 치면 랜덤한 3개의 수가 생성되고 모두 동일한 수가 나오면 게임에서 이기

게된다. 숫자의 범위는 0~2로제한한다. 선수는 Player 클래스로 작성하고, 2명의선수는배열로 구성하라.

그리고 게임은 GamblingGame 클래스로 작성하라

• (힌트)

▫ 랜덤수를발생시키기위해 srand()와 rand() 함수를활용

9

실행 결과

***** 겜블린게임을시작합니다. *****첫번째선수이름>>수연이두번째선수이름>>제갈이수연이:<Enter>

2 1 2 아쉽군요!제갈이:<Enter>

1 0 2 아쉽군요!수연이:<Enter>

2 2 1 아쉽군요!제갈이:<Enter>

0 0 0 수연이님승리!

Page 10: 박종혁교수 - parkjonghyuk.net · 두사람이게을 진행하며, 선수의이름을초기에력받는다 . 선수가번갈아 자신의차례에서 키를치면랜덤한3개의수가생성되고두

실전문제(5)

• 비행기를 나타내는 Airplane라는 이름의 클래스를 설계하라. Airplane 클래스는 이름

(name), 승객수(capacity), 속도(speed) 를멤버변수로가지고있다

▫ 멤버 변수를 정의하라. 모든 멤버변수는 전용 멤버로 하라

▫ 모든 멤버변수에 대한접근자와 설정자 멤버함수를 작성한다

▫ Airplane 클래스의 생성자 몇 개를 중복 정의하라. 생성자는 모든 데이터를 받을 수도 있고 아니면 하나

도받지 않을 수있다

▫ Airplane 객체의 현재 상태를 콘솔에 출력하는 print() 함수도 포함시켜라

▫ Main () 에서 Plane 객체 2개를 생성하고 접근자와 설정자를 호출하여보라

10

Page 11: 박종혁교수 - parkjonghyuk.net · 두사람이게을 진행하며, 선수의이름을초기에력받는다 . 선수가번갈아 자신의차례에서 키를치면랜덤한3개의수가생성되고두

실전문제(6)

• 상자를 나타내는 Box 라는 이름의 클래스를 설계하라. Box 클래스는 상자의 길이

(length), 너비(width), 높이(height) 등의 변수를 가진다

▫ 멤버 변수는 전용 멤버로 한다

▫ Box 클래스의 생성자를 중복 정의하라. 생성자는 모든 데이터를 받을 수도 있고 아니면 하나도 받지

않을 수 있다. 멤버 초기화 리스트를 사용해본다

▫ 접근자와 생성자를 추가할 박스가 비어 있는지 그렇지 않은지를 나타내는 empty () 라는 멤버 함수

도 추가한다. 부피를 계산하는 getVolume () 멤버 함수도 추가한다. Box 객체의 현재 상태를 콘솔에

출력하는 print () 함수도 포함시켜라

▫ Main () 에서 Box 객체 여러 개를 생성하고 접근자와 설정자를 호출하여 보라

11

Page 12: 박종혁교수 - parkjonghyuk.net · 두사람이게을 진행하며, 선수의이름을초기에력받는다 . 선수가번갈아 자신의차례에서 키를치면랜덤한3개의수가생성되고두

실전문제(7)

• 영화를 나타내는 Movie라는 이름의 클래스를 설계하라. 제목(title), 감독(director), 평

점(rating) 을나태는멤버변수를가진다

▫ 멤버 변수는 전용 멤버로 한다

▫ Movie 클래스의 생성자를 중복 정의한다. 생성자는 모든 데이터를 받을 수도 있고 아니면 하나도 받

지 않을 수 있다

▫ 접근자와 생성자를 비롯하여 필요한 멤버 함수들을 추가하라

▫ Main () 에서 Movie 객체 여러 개를 생성하고 접근자와 설정자를 호출하여 보라

12

Page 13: 박종혁교수 - parkjonghyuk.net · 두사람이게을 진행하며, 선수의이름을초기에력받는다 . 선수가번갈아 자신의차례에서 키를치면랜덤한3개의수가생성되고두

실전문제(8)

• 핸드폰의 문자 메시지를 나타내는 클래스 SNS를 작성하여 보자. SMS는 송신자의 전화

번호(sender), 수신자의전화번호(receiver), 메시지텍스트(text) 등의데이터를가진다

▫ 멤버 변수는 전용 멤버로 한다

▫ 적절한 생성자를 추가한다

▫ 멤버 함수 print () 는 메시지에 헤더를 붙여서 콘솔에 추가한다. 기타 적절한 접근자와 설정자를 추

가한다

▫ 몇 개의 문자 메시지를 생성하여서 테스트하라

13

Page 14: 박종혁교수 - parkjonghyuk.net · 두사람이게을 진행하며, 선수의이름을초기에력받는다 . 선수가번갈아 자신의차례에서 키를치면랜덤한3개의수가생성되고두

실전문제(9)

• 날짜를 나타내는 Date 클래스를작성해보자. Date 클래스는 year, month, day 를멤버변수로 가진다. 화면에자기

자신의 상태를출력하는 print () 함수를가지고 있도록가정한다. print () 는 다양한형식으로 날짜를출력할 수있

도록중복 정의해본다. nextMonth() 는 다음달을나타내는 객체를 반환한다. isLeapYear() 는윤년이면 true 를 반

환한다. 몇개의 객체를생성하여 테스트하라

14

Class Date {int year;int month;int day;

Public:Date();Date(int y, int m. int d);bool isLeapYear(int y);void print() const;Date nexdtMonth();…

};

Date nextMonth();Bool isLeapYear(); // 윤년이면 true 반환

Page 15: 박종혁교수 - parkjonghyuk.net · 두사람이게을 진행하며, 선수의이름을초기에력받는다 . 선수가번갈아 자신의차례에서 키를치면랜덤한3개의수가생성되고두

실전문제(10

• 실습문제 (4) 에서우리는핸드폰의문자메시지를나타내는클래스 SMS를작성한적이있다. SMS

는송신자의전화번호 (sender), 수신자의전화번호(receiver), 메시지텍스트(text) 등의데이터를

가진다. 몇개의문자메시지를다음과같은방법으로생성하여서테스트하라

▫ 전통적인 객체 배열을 이용하여 3개의 문자메시지를 생성하여 저장해보자

▫ 벡터를 이용하여 3개의 문자메시지를 동적으로 생성하여 저장해보자

15

Class SMS{

string sender;string receiver;string text;

Public:SMS() {sender = “”;receiver = “”;text = “”;}…

}

Page 16: 박종혁교수 - parkjonghyuk.net · 두사람이게을 진행하며, 선수의이름을초기에력받는다 . 선수가번갈아 자신의차례에서 키를치면랜덤한3개의수가생성되고두

실전문제(11)

• 학생을 나타내는 클래스 Student를 정의한다. Student는 이름 (name), 성적 (marks) 을

멤버 변수로 가진다. 벡터를 이용하여서 동적 객체 배열을 만든다. 사용자로부터 데이터

를 입력 받아서 배열에 저장한 후에 sort() 함수를 사용하여 학점이 가장 높은 순으로 모

든학생들의정보를출력하라

16

Class Student {string name;double marks;

Public:Student(string n, double m) : name{n}, marks{m} { }…..

};

정렬을 위해 #include <algorithm> 추가해야함sort(vec.begin(), vec.end(), compare); 사용

Page 17: 박종혁교수 - parkjonghyuk.net · 두사람이게을 진행하며, 선수의이름을초기에력받는다 . 선수가번갈아 자신의차례에서 키를치면랜덤한3개의수가생성되고두

실전문제(12)

• 다음과 같이 연락처를 나타내는 Contact 클래스를 작성한다. Contact 클래스는 이름(name)과 전화

번호(tel)를 가지고 있다. 3개의 Contact 객체를 저장하는 동적 배열을 정의하고 사용자로부터 연락

처 정보를 받아서 동적 배열 안에 저장한다. 이어서 사용자로부터 이름을 받아서 동적 배열에서 탐

색한후에연락처전화번호를출력하는프로그램을작성한다

17

Class Contact {Private:

string name;string tel;…

}

Page 18: 박종혁교수 - parkjonghyuk.net · 두사람이게을 진행하며, 선수의이름을초기에력받는다 . 선수가번갈아 자신의차례에서 키를치면랜덤한3개의수가생성되고두

참고문헌

• 뇌를자극하는 C++ 프로그래밍, 이현창, 한빛미디어, 2011

• 열혈 C++ 프로그래밍(개정판), 윤성우, 오렌지미디어, 2012

• 객체지향 원리로이해하는 ABSOLUTE C++ , 최영근외 4명 , 교보문고, 2013

• C++ ESPRESSO, 천인국, 인피니티북스, 2011

• 명품 C++ Programming, 황기태 , 생능출판사, 2018

• 어서와 C++는 처음이지, 천인국, 인피니티북스, 2018

18

Page 19: 박종혁교수 - parkjonghyuk.net · 두사람이게을 진행하며, 선수의이름을초기에력받는다 . 선수가번갈아 자신의차례에서 키를치면랜덤한3개의수가생성되고두

Q&A