main()의 실행 결과가 다음과 같도록 Tower 클래스를 작성하라
#include<iostream>
using namespace std;
int main()
{
Tower myTower;
Tower seoulTower(100);
cout << "높이는 " << myTower.getHeigth() << "미터" << endl;
cout << "높이는 " << seoulTower.getHeigth() << "미터" << endl;
}
높이는 1미터
높이는 100미터
#include<iostream>
#include<string>
using namespace std;
class Tower
{
private:
int height;
public:
Tower();
Tower(int h);
~Tower(); //소멸자
int getHeigth();
};
Tower::Tower()
{
height = 1;
}
Tower::Tower(int h)
{
height = h;
}
int Tower::getHeigth()
{
return height;
}
Tower::~Tower()
{
}
int main()
{
Tower myTower;
Tower seoulTower(100);
cout << "높이는 " << myTower.getHeigth() << "미터" << endl;
cout << "높이는 " << seoulTower.getHeigth() << "미터" << endl;
}
날짜를 다루는 Date 클래스를 작성하고자 한다. Date를 이용하는 main()과 실행 결과는 다음과 같다.
#include <iostream>
using namespace std;
int main() {
Date virth(2014, 3, 20);
Date independenceDay("1945/8/15");
independenceDay.show();
cout << birth.getYear() << ',' << birth.getMonth() << ',' << birth.getDay() << endl;
}
1945년8월15일
2014,3,20
#include<iostream>
#include<string>
using namespace std;
class Date
{
private:
int year;
int month;
int day;
public:
Date(int year, int month, int day);
Date(string str);
~Date();
int getYear();
int getMonth();
int getDay();
void show();
};
Date::Date(int year, int month, int day)
{
this->year = year;
this->month = month;
this->day = day;
}
Date::Date(string str)
{
year = stoi(str.substr(0, 4));
month = stoi(str.substr(5, 1));
day = stoi(str.substr(7, 2));
}
int Date::getYear()
{
return year;
}
int Date::getMonth()
{
return month;
}
int Date::getDay()
{
return day;
}
void Date::show()
{
cout << year << "년" << month << "월" << day << "일\n";
}
Date::~Date()
{
}
int main()
{
Date birth(2014, 3, 20);
Date independenceDay("1945/8/15");
independenceDay.show();
cout << birth.getYear() << ',' << birth.getMonth() << ',' << birth.getDay() << endl;
}
은행에서 사용하는 프로그램을 작성하기 위해, 은행 계좌 하나를 표현하는 클래스 Account가 필요하다. 계좌 정보는 계좌의 주인, 계좌 번호, 잔액을 나타내는 3 멤버 변수로 이루어진다. main() 함수의 실행과 결과가 다음과 같도록 Account 클래스를 작성하라.
#include <iostream>
using namespace std;
int main() {
Account a("Kitae", 1, 5000); // id 1번, 잔액 5000원, 이름이 Kitae인 계좌 성
a.deposit(50000); // 50000원 저금
cout << a.getOwner() << "의 잔액은 " << a.inquiry() << endl;
int money = a.withdraw(20000); // 20000원 출금. withdraw()는 출금한 실제 금액 리턴
cout << a.getOwner() << "의 잔액은 " << a.inquiry() << endl;
}
kitae의 잔액은 55000
kitae의 잔액은 35000
#include<iostream>
#include<string>
using namespace std;
class Account
{
public:
Account(string name, int id, int curmoney);
~Account();
int deposit(int money);
int withdraw(int money);
string getOwner();
int inquiry();
private:
string name;
int id;
int curmoney;
};
Account::Account(string name, int id, int curmoney)
{
this->name = name;
this->id = id;
this->curmoney = curmoney;
}
int Account::deposit(int money)
{
curmoney += money;
return curmoney;
}
int Account::withdraw(int money)
{
curmoney -= money;
return curmoney;
}
string Account::getOwner()
{
return name;
}
int Account::inquiry()
{
return curmoney;
}
Account::~Account()
{
}
int main()
{
Account a("Kitae", 1, 5000);
a.deposit(50000);
cout << a.getOwner() << "의 잔액은 " << a.inquiry() << endl;
int money = a.withdraw(20000);
cout << a.getOwner() << "의 잔액은 " << a.inquiry() << endl;
}
CoffeeMachine 클래스를 만들어보자. main() 함수와 실행 결과가 다음과 같도록 CoffeeMachine 클래스를 작성하라. 에스프레소 한 잔에는 커피와 물이 각각 1씩 소비되고, 아메리카노의 경우 커피는 1, 물은 2가 소비되고, 설탕 커피는 커피 1, 물 2, 설탕 1이 소비된다. CoffeeMachine 클래스에는 어떤 멤버 변수와 어떤 멤버 함수가 필요한지 잘 판단하여 작성하라.
#include <iostream>
using namespace std;
int main() {
CoffeeMachine java(5, 10, 3); // 커피량:5, 물량:10, 설탕:6 으로 초기화
java.drinkEspresso(); // 커피 1, 물 1 소비
java.show(); // 현재 커피 머신의 상태 출력
java.drinkAmericano(); // 커피 1, 물 2 소비
java.show(); // 현재 커피 머신의 상태 출력
java.drinkSugarCoffee(); // 커피 1, 물 2, 설탕 1 소비
java.show(); // 현재 커피 머신의 상태 출력
java.fill(); // 커피 10, 물 10, 설탕 10 으로 채우기
java.show(); // 현재 커피 머신의 상태 출력
커피 머신 상태, 커피:4, 물:9 설탕:3
커피 머신 상태, 커피:3, 물:7 설탕:3
커피 머신 상태, 커피:2, 물:5 설탕:2
커피 머신 상태, 커피:10, 물:10 설탕:10
#include<iostream>
using namespace std;
class CoffeeMachine
{
public:
CoffeeMachine(int coffee, int water, int suger);
~CoffeeMachine();
void drinkEspresso();
void drinkAmericano();
void drinkSugerCoffee();
void show();
void fill();
private:
int coffee, water, suger;
};
CoffeeMachine::CoffeeMachine(int coffee, int water, int suger)
{
this->coffee = coffee;
this->water = water;
this->suger = suger;
}
void CoffeeMachine::drinkEspresso()
{
coffee -= 1;
water -= 1;
}
void CoffeeMachine::drinkAmericano()
{
coffee -= 1;
water -= 2;
}
void CoffeeMachine::drinkSugerCoffee()
{
coffee -= 1;
water -= 2;
suger -= 1;
}
void CoffeeMachine::show()
{
cout << "커피 머신 상태, 커피 :" << coffee << " 물:" << water << " 설탕:" << suger << endl;
}
void CoffeeMachine::fill()
{
coffee = 10;
water = 10;
suger = 10;
}
CoffeeMachine::~CoffeeMachine()
{
}
int main()
{
CoffeeMachine java(5, 10, 3);
java.drinkEspresso(); //커피1, 물1, 소비
java.show();
java.drinkAmericano();
java.show();
java.drinkSugerCoffee();
java.show();
java.fill();
java.show();
}
랜덤 수를 발생시키는 Random 클래스를 만들자. Random 클래스를 이용하여 랜덤 한 정수를 10개 출력하는 사례는 다음과 같다. Random 클래스가 생성자, next(), nextInRange()의 3개의 멤버 함수를 가지도록 작성하고 main() 함수와 합쳐 하나의 cpp 파일에 구현하라.
int main() {
Random r;
cout << "-- 0에서 " << RAND_MAX << "까지의 랜덤 정수 10 개--" << endl;
for(int i=0; i<10; i++) {
int n = r.next(); // 0에서 RAND_MAX(32767) 사이의 랜덤한 정수
cout << n << ' ';
}
cout << endl << endl << "-- 2에서 " << "4 까지의 랜덤 정수 10 개 --" << endl;
for(int i=0; i<10; i++) {
int n = r.nextInRange(2,4); // 2에서 4 사이의 랜덤한 정수
cout << n << ' ';
}
cout << endl;
}
-- 0에서 32767까지의 랜덤 정수 10개--
....
-- 2에서 4 까지의 랜덤 정수 10개 --
....
#include<iostream>
#include<cstdalign>
#include<ctime>
using namespace std;
class Random
{
public:
Random();
int next();
int nextRange(int a, int b);
~Random();
private:
};
Random::Random()
{
srand((unsigned)time(0));
}
int Random::next()
{
int n = rand();
return n;
}
int Random::nextRange(int a, int b)
{
int n = rand() % (b - a + 1) + a;
return n;
}
Random::~Random()
{
}
int main()
{
Random r;
cout << "-- 0에서 " << RAND_MAX << "까지의 랜덤 정수 10개 --\n" << endl;
for (int i = 0; i < 10; i++)
{
int n = r.next(); //0에서 RAND_MAX(32767) 사이의 랜덤 정수
cout << n << ' ';
}
cout << "-- 2에서 " << RAND_MAX << "4까지의 랜덤 정수 10개 --\n" << endl;
for (int i = 0; i < 10; i++)
{
int n = r.nextRange(2, 4); //0에서 RAND_MAX(32767) 사이의 랜덤 정수
cout << n << ' ';
}
}
이 문제는 해설을 보고 풀었다. a부터 b의 랜덤 범위 지정을 rand() % (b - a + 1) + a; 이런 식으로 암기하고 있는 것도 좋을 듯하다.
문제 5번을 참고하여 짝수 정수만 랜덤하게 발생시키는 EvenRandom 클래스를 작성하고 EvenRandom 클래스를 이용하여 10개의 짝수를 랜덤하게 출력하는 프로그램을 완성하라.
-- 0에서 32767까지의 랜덤 정수 10개--
....
-- 2에서 10 까지의 랜덤 정수 10개 --
....
#include<iostream>
#include<cstdalign>
#include<ctime>
using namespace std;
class Random
{
public:
Random();
int next();
int nextRange(int a, int b);
~Random();
private:
};
Random::Random()
{
srand((unsigned)time(0));
}
int Random::next()
{
int n = rand();
return n;
}
int Random::nextRange(int a, int b)
{
int n = rand() % (b - a + 1) + a;
if (n % 2 == 0)
{
return n;
}
else
{
n = rand() % (b - a + 1) + a;
}
}
Random::~Random()
{
}
int main()
{
Random r;
cout << "-- 0에서 " << RAND_MAX << "37267까지의 랜덤 정수 10개 --\n" << endl;
for (int i = 0; i < 10; i++)
{
int n = r.nextRange(0, 37267); //0에서 RAND_MAX(32767) 사이의 랜덤 정수
cout << n << ' ';
}
cout << "-- 2에서 " << RAND_MAX << "10까지의 랜덤 정수 10개 --\n" << endl;
for (int i = 0; i < 10; i++)
{
int n = r.nextRange(2, 10); //0에서 RAND_MAX(32767) 사이의 랜덤 정수
cout << n << ' ';
}
}
문제 5번을 참고하여 생성자를 이용하여 짝수 홀수를 선택할 수 있도록 SelectableRandom 클래스를 작성하고 짝수 10개, 홀수 10개를 랜덤하게 발생시키는 프로그램을 작성하라.
-- 0에서 32767까지의 랜덤 정수 10개--
....
-- 2에서 10 까지의 랜덤 정수 10개 --
....
#include<iostream>
#include<cstdalign>
#include<ctime>
using namespace std;
class Random
{
public:
Random();
int next();
int nextRange(int a, int b);
~Random();
private:
};
Random::Random()
{
srand((unsigned)time(0));
}
int Random::next()
{
int n = rand();
return n;
}
int Random::nextRange(int a, int b)
{
int n = rand() % (b - a + 1) + a;
if (n % 2 != 0)
{
return n;
}
else
{
n = rand() % (b - a + 1) + a;
}
}
Random::~Random()
{
}
int main()
{
Random r;
cout << "-- 0에서 " << RAND_MAX << "37267까지의 랜덤 정수 10개 --\n" << endl;
for (int i = 0; i < 10; i++)
{
int n = r.nextRange(0, 37267); //0에서 RAND_MAX(32767) 사이의 랜덤 정수
cout << n << ' ';
}
cout << "-- 2에서 " << RAND_MAX << "10까지의 랜덤 정수 10개 --\n" << endl;
for (int i = 0; i < 10; i++)
{
int n = r.nextRange(2, 10); //0에서 RAND_MAX(32767) 사이의 랜덤 정수
cout << n << ' ';
}
}
int 타입의 정수를 객체화한 Integer 클래스를 작성하라. Integer의 모든 멤버 함수를 자동 인라인으로 작성하라.Integer 클래스를 활용하는 코드는 다음과 같다.
#include<iostream>
#include<string>
using namespace std;
int main() {
Integer n(30);
cout << n.get() << ' '; // 30 출력
n.set(50);
cout << n.get() << ' '; // 50 출력
Integer m("300");
cout << m.get() << ' '; // 300 출력
cout << m.isEven(); // true(정수로 1) 출력
}
30 50 300 1
#include<iostream>
#include<string>
using namespace std;
class Integer
{
public:
Integer(int number);
Integer(string number);
int get();
int set(int number);
bool isEven();
~Integer();
private:
int a;
};
Integer::Integer(int number)
{
this->a = number;
}
Integer::Integer(string number)
{
this->a = stol(number);
}
int Integer::get()
{
return a;
}
int Integer::set(int number)
{
a = number;
return a;
}
bool Integer::isEven()
{
if (a % 2 == 0)
{
return true;
}
}
Integer::~Integer()
{
}
int main()
{
Integer n(30);
cout << n.get() << ' '; //30출력
n.set(50);
cout << n.get() << ' '; //50출력
Integer m("300");
cout << m.get() << ' '; //30출력
cout << m.isEven();
}
Oval 클래스는 주어진 사각형에 내접하는 타원을 추상화한 클래스이다. Oval 클래스의 멤버는 모두 다음과 같다. Oval 클래스를 선언부와 구현부로 나누어 작성하라.
정수값의 사각형 너비와 높이를 가지는 width, height 변수 멤버
너비와 높이 값을 매개 변수로 받는 생성자
너비와 높이를 1로 초기화하는 매개 변수 없는 생성자
width와 height를 출력하는 소멸자
타원이 너비를 리턴하는 getWidth() 함수 멤버
타원의 높이를 리턴하는 getHeight() 함수 멤버
타원의 너비와 높이를 변경하는 set(int w, int h) 함수 멤버
타원의 너비와 높이를 화면에 출력하는 show() 함수 멤버
#include<iostream>
using namespace std;
int main() {
Oval a, b(3,4);
a.set(10, 20);
a.show();
cout << b.getWidth() << "," << b.getHeight() << endl;
}
width = 10, heigth = 20
3, 4
Oval 소멸 : width = 3, height = 4
Oval 소멸 : width = 10, height = 20
#include<iostream>
using namespace std;
class Oval
{
public:
Oval();
Oval(int a, int b);
int set(int w, int h);
void show();
int getWidth();
int getHeight();
~Oval();
private:
int a, b;
};
Oval::Oval()
{
this->a = 0;
this->b = 0;
}
Oval::Oval(int a, int b)
{
this->a = a;
this->b = b;
}
int Oval::set(int w, int h)
{
this->a = w;
this->b = h;
return this->a, this->b;
}
void Oval::show()
{
cout << "width = " << a << ", height = " << b << endl;
}
int Oval::getWidth()
{
return a;
}
int Oval::getHeight()
{
return b;
}
Oval::~Oval()
{
cout << "Oval 소멸 : width = " << a << ", height = " << b << endl;
}
int main()
{
Oval a, b(3, 4);
a.set(10, 20);
a.show();
cout << b.getWidth() << "," << b.getHeight() << endl;
}
다수의 클래스를 선언하고 활용하는 간단한 문제이다. 더하기(+), 빼기(-), 곱하기(*), 나누기(/)를 수행하는 4개의 클래스를 Add, Sub, Mul, Div를 만들고자 한다. 이들은 모두 공통으로 다음 멤버를 가진다.
int 타입 변수 a, b : 피연산자
void setValue(int x, int y) 함수 : 매개 변수 x, y를 멤버 a, b에 복사
int calculate() 함수 : 연산을 실행하고 결과 리턴
main() 함수는 Add, Sub, Mul, Div 클래스 타입의 객체 a, s, m, d를 생성하고, 아래와 같이 키보드로부터 두 개의 정수와 연산자를 입력받고, a, s, m, d 객체 중에서 연산을 처리할 객체의 setValue() 함수를 호출한 후, calculate()를 호출하여 결과를 화면에 출력한다. 프로그램은 무한 루프를 돈다.
3-10.cpp
#include<iostream>
using namespace std;
#include "3-10.h"
void Add::setValue(int x, int y) {
a = x;
b = y;
}
int Add::calculate() {
return a + b;
}
void Sub::setValue(int x, int y) {
a = x;
b = y;
}
int Sub::calculate() {
return a - b;
}
void Mul::setValue(int x, int y) {
a = x;
b = y;
}
int Mul::calculate() {
return a * b;
}
void Div::setValue(int x, int y) {
a = x;
b = y;
}
int Div::calculate() {
return a / b;
}
3-10.h
#pragma once
class Add {
private:
int a, b;
public:
void setValue(int x, int y);
int calculate();
};
class Div {
private:
int a, b;
public:
void setValue(int x, int y);
int calculate();
};
class Mul {
private:
int a, b;
public:
void setValue(int x, int y);
int calculate();
};
class Sub {
private:
int a, b;
public:
void setValue(int x, int y);
int calculate();
};
3-10main.cpp
#include<iostream>
using namespace std;
#include "3-10.h"
int main() {
Add a;
Sub s;
Mul m;
Div d;
int x, y;
char c;
while (true) {
cout << "두 정수와 연산자를 입력하세요>>";
cin >> x >> y >> c;
if (c == '+') {
a.setValue(x, y);
cout << a.calculate() << endl;
}
else if (c == '-') {
s.setValue(x, y);
cout << s.calculate() << endl;
}
else if (c == '*') {
m.setValue(x, y);
cout << m.calculate() << endl;
}
else if (c == '/') {
d.setValue(x, y);
cout << d.calculate() << endl;
}
}
}
다음 코드에서 Box 클래스의 선언부와 구현부를 Box.h, Box.cpp 파일로 분리하고 main() 함수 부분을 main.cpp로 분리하여 전체 프로그램을 완성하라.
#include<iostream>
using namespace std;
class Box {
int width, height;
char fill;
public:
Box(int w, int h) { setSize(w, h); fill = '*';}
void setFill(char f) {fill = f;}
void setSize(int w, int h) { width = w; height = h;}
void draw();
};
void Box::draw() {
for (int n = 0; n < height; n++) {
for (int m = 0; m < width; m++) cout << fill;
cout << endl;
}
}
int main() {
Box b(10, 2);
b.draw(); // 박스를 그린다.
cout << endl;
b.setSize(7, 4); // 박스의 크기를 변경한다.
b.setFill('^'); // 박스의 내부를 채울 문자를 '^'로 변경한다.
b.draw(); // 박스를 그린다.
}
3-11.cpp
#include<iostream>
using namespace std;
#include"3-11.h"
void Box::draw()
{
for (int i = 0; i < h; i++)
{
for (int j = 0; j < w; j++)
{
cout << fill;
}
cout << fill << endl << endl;
}
}
Box::~Box()
{
}
3-11.h
#pragma once
class Box
{
public:
Box(int w, int h) {
setSize(w, h);
fill = '*';
}
void setFill(char f) { fill = f; }
void setSize(int w, int h) { this->w = w, this->h = h; }
void draw();
~Box();
private:
int w, h;
char fill;
};
3-11main.cpp
#include<iostream>
using namespace std;
#include"3-11.h"
int main()
{
Box b(10, 2);
b.draw();
cout << endl;
b.setSize(7, 4);
b.setFill('^');
b.draw();
}
컴퓨터의 주기억장치를 모델링하는 클래스의 Ram을 구현하려고 한다.
Ram 클래스는 데이터가 기록될 메모리 공간과 크기 정보를 가지고, 주어진 주소에 데이터를 기록하고(write), 주어진 주소로부터 데이터를 읽어 온다(read).
Ram 클래스는 다음과 같이 선언된다.
class Ram {
char mem[100 * 1024]; // 100KB 메모리. 한 번지는 한 바이트이므로 char 타입 사용
int size;
public:
Ram(); // mem 배열을 0으로 초기화하고 size를 100*1024로 초기화
~Ram(); // "메모리 제거됨" 문자열 출력
char read(int address); // address 주소의 메모리 바이트 리턴
void write(int address, char value); // address 주소에 한 바이트로 value 저장
};
3-12.cpp
#include<iostream>
using namespace std;
#include"3-12.h";
Ram::Ram()
{
size = 1024 * 100;
for (int i = 0; i < size; i++)
{
mem[i] = 0;
}
}
char Ram::read(int address)
{
return mem[address];
}
void Ram::write(int address, char value)
{
mem[address] = value;
}
Ram::~Ram()
{
cout << "메모리 제거됨";
}
3-12.h
#pragma once
class Ram
{
public:
Ram();
~Ram(); //"메모리 제거됨" 문자열 출력
char read(int address);
void write(int address, char value);
private:
char mem[100 * 1024]; //10kb 메모리, 한 번지는 한 바이트이므로 char타입 사용
int size;
};
c-12main.cpp
#include<iostream>
using namespace std;
#include"3-12.h";
int main()
{
Ram ram;
ram.write(100, 20); //100번지에 20 저장
ram.write(101, 30);
char res = ram.read(100) + ram.read(101);
ram.write(102, res); //102번지에 50 저장
cout << "102 번지의 값 = " << (int)ram.read(102) << endl;
}