관리 메뉴

공부 기록장 💻

명품 C++ Programming 3장 실습 문제 - 클래스, 객체, 생성자, 소멸자, 인라인 함수 본문

# Language & Tools/C++

명품 C++ Programming 3장 실습 문제 - 클래스, 객체, 생성자, 소멸자, 인라인 함수

dream_for 2021. 4. 20. 01:47

(명품 C++ 프로그래밍 3장 )

 

1. 

#include <iostream>
using namespace std;

class Tower {
	int height;
public:
	Tower():Tower(1) {}
	Tower(int h) { height = h; }
	int getHeight() { return height; }
};
int main() {
	Tower myTower;
	Tower seoulTower(100);
	cout<<"높이는 "<<myTower.getHeight()<<"미터"<<endl;
	cout << "높이는 " << seoulTower.getHeight() << "미터" << endl;
}

 

 

 

2. 

 

<string> 헤더 파일의 find 함수와 substr 함수 사용하기

 

1. int find(const string& str, int pos); 문자열의 pos 위치에서부터 str을 탐색하여 발견한 처음 인덱스 반환 
2. string substr(int pos); 문자열의 pos 위치에서부터 문자열을 새로운 서브스트링으로 생성하여 반환

3. int stoi(string s); 정수로 시작하는 문자열 s가 정수가 아닌 값이 나올 때 까지의 문자열을 정수형으로 변환

 

 

Date::Date(string date) {
		year=stoi(date); // 전달받은 date 스트링 객체를 정수가 아닌 문자가 나올때까지의 문자열을 정수로 변환
		int n = date.find('/'); // date 스트링에서 '/' 문자가 처음 나온 인덱스를 n에 저장

		this->month = stoi(date.substr(n + 1)); // month에 n+1부터 끝까지 서브스트링으로 저장하고 이를 정수로 변환하여 저장
		n = date.find('/', n + 1); // n+1 부터 다시 '/' 문자가 나온 처음 인덱스를 n에 저장

		this->day = stoi(date.substr(n + 1)); // date의 n+1부터 끝까지 서브스트링으로 변환 후 정수로 변환하여 day에 저장 
	}

 

전체 코드:

 

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

class Date {
	int year;
	int month;
	int day;
public:
	Date(string date);
	Date(int y, int m, int d) { year = y;month = m;day = d; }
	void show() { cout << year << "년 " << month << "월 " << day << "일" << endl; }
	int getYear() { return year; }
	int getMonth() { return month; }
	int getDay() { return day; }
};

Date::Date(string date) {
		year=stoi(date);
		int n = date.find('/');

		this->month = stoi(date.substr(n + 1));
		n = date.find('/', n + 1);

		this->day = stoi(date.substr(n + 1));
	}

int main() {
	Date birth(2014, 3, 20);
	Date independenceDay("1945/8/15");
	independenceDay.show();
	cout << birth.getYear() << ',' << birth.getMonth() << ',' << birth.getDay() << endl;
}

 

 

결과:

 

 

3.

nclude <iostream>
using namespace std;

class Accout {
	string name;
	int id, balance;
public:
	Accout(string n, int i, int m) { name = n;id = i;balance = m; }
	string getOwner() { return name; }
	void deposit(int m) { balance += m; }
	int withdraw(int m) { balance -= m;return m; }
	int inquiry() { return balance; }
};
int main() {
	Accout a("kitae", 1, 5000);
	a.deposit(50000);
	cout << a.getOwner() << "의 잔액은 " << a.inquiry() << endl;
	int money = a.withdraw(20000);
	cout << a.getOwner() << "의 잔액은 " << a.inquiry() << endl;
}

 

 

5.

 

<cstdlib>, <ctime> 헤더 파일 이용하여 랜덤 난수 생성

 

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

class Random {
public:
	Random() {}
	int next() { return rand() % RAND_MAX; }
	int nextInRange(int s, int e) { return rand() % ( e - s + 1) + s; }
};
int main() {
	Random r;
	srand((unsigned)time(NULL));

	cout << "-- 0 에서 " << RAND_MAX << "까지의 랜덤 정수 10 개--" << endl;
	for (int i = 0;i < 10;i++) {
		int n = r.next();
		cout << n << ' ';
	}
	cout << endl << endl << "-- 2에서 " << "4까지의 랜덤 정수 10 개 -- " << endl;
	for (int i = 0;i < 10;i++) {
		int n = r.nextInRange(2, 4);
		cout << n << ' ';
	}
}

 

 

6. 

 

랜덤 짝수 정수 생성하는 EvenRandom 클래스 구현

 

int EvenRandom::nextInRange(int s, int e) {
	int n;
	do {
		n = rand() % (e - s + 1) + s;
	} while (n % 2);
	return n;
}

 

생성하고자 하는 랜덤 정수의 범위를 정하기 위해서는,

범위 내에 생성될 수 있는 정수의 개수를 (e-s+1)로, 그리고 정수의 범위가 시작되는 s를 더하면 된다.

 

예를 들어, 5부터 20까지의 범위 내에서 짝수 정수 난수를 생성한다고 할 때,

5부터 20까지의 개수는 총 (20 - 5 +1) 16개이다.

그리고 5라는 수부터 시작되어야 하므로, s의 값인 5를 더해주는 것이다.

 

인수로 전달된 s와 e 모두 짝수인 경우, 예를 들어 6과 10이라면,

6,7,8,9,10 총 5개의 난수(10-6+1)가 생성될 수 있으며

6이라는 수부터 난수가 생성되어야 한다. 

따라서 rand()%5 + 6 으로 인해 생성될 수 있는 난수는 {0,1,2,3,4} 집합에 각각 6을 더해준 {6,7,8,9,10} 이다.

 

 

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

// 클래스 선언부
class EvenRandom {
public:
	EvenRandom() {}
	int next();
	int nextInRange(int s, int e);
};

// 클래스 구현부
int EvenRandom::next() {
	int n;
	do {
		n = rand() % RAND_MAX;
	} while (n % 2); // n%2가 0이 아닌 경우(==홀수인경우) 계속 반복 실행
	return n;
}

int EvenRandom::nextInRange(int s, int e) {
	int n;
	do {
		n = rand() % (e - s + 1) + s;
	} while (n % 2);
	return n;
}

int main() {
	srand((unsigned)time(NULL));
	EvenRandom r;

	cout << "-- 0 에서 " << RAND_MAX << "까지의 랜덤 짝수 정수 10 개--" << endl;
	for (int i = 0;i < 10;i++) {
		int n = r.next();
		cout << n << ' ';
	}
	cout << endl << endl << "-- 2에서 " << "4까지의 랜덤 짝수 정수 10 개 -- " << endl;
	for (int i = 0;i < 10;i++) {
		int n = r.nextInRange(2, 4);
		cout << n << ' ';
	}
}

 

 

7. 

위에서 do ~ while문에서의 조건문만 바꾸면 홀수 난수를 생성하는 OddRandom 을 구현할 수 있다.

 

#include <ctime>
using namespace std;

class OddRandom {
public:
	OddRandom() {}
	int next();
	int nextInRange(int s, int e);
};

int OddRandom::next() {
	int n;
	do {
		n = rand() % RAND_MAX;
	} while (n % 2==0); // n%2가 0이 아닌 경우(==홀수인경우) 계속 반복 실행
	return n;
}

int OddRandom::nextInRange(int s, int e) {
	int n;
	do {
		n = rand() % (e - s + 1) + s;
	} while (n % 2==0);
	return n;
}
int main() {
	srand((unsigned)time(NULL));
	OddRandom r;

	cout << "-- 0 에서 " << RAND_MAX << "까지의 랜덤 홀수 정수 10 개--" << endl;
	for (int i = 0;i < 10;i++) {
		int n = r.next();
		cout << n << ' ';
	}
	cout << endl << endl << "-- 5에서 " << "20까지의 랜덤 홀수 정수 10 개 -- " << endl;
	for (int i = 0;i < 10;i++) {
		int n = r.nextInRange(5,20);
		cout << n << ' ';
	}
	cout << endl;
}

 

 

10.

 

계산기 프로그램

 

main.cpp

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

#include "calculator.h"

int main() {
	int x, y;
	char op;

	Add a;
	Sub s;
	Mul m;
	Div d;

	while(1)
	{
		cout << "두 정수와 연산자를 입력하세요 >>";
		cin >> x >> y >> op;

		switch (op) {
		case '+':
			a.setValue(x, y);
			cout << a.calculate() << endl << endl;
			break;
		case '-':
			s.setValue(x, y);
			cout << s.calculate() << endl << endl;
			break;
		case '*':
			m.setValue(x, y);
			cout << m.calculate() << endl << endl;
			break;
		case '/':
			d.setValue(x, y);
			cout << s.calculate() << endl << endl;
			break;
		default:break;
		}
	}
}

 

calculate.cpp - 클래스 구현부

#include "calculator.h"

void Add::setValue(int x, int y) { this->a = x;this->b = y; }
void Sub::setValue(int x, int y) { this->a = x;this->b = y; }
void Mul::setValue(int x, int y) { this->a = x;this->b = y; }
void Div::setValue(int x, int y) { this->a = x;this->b = y; }

int Add::calculate() { return a + b; }
int Sub::calculate() { return a - b; }
int Mul::calculate() { return a * b; }
int Div::calculate() { return a / b; }

 

calculate.h - 클래스 선언부

#ifndef CALCULATOR_H
#define CALCULATOR_H

class Add {
	int a, b;
public:
	void setValue(int x, int y);
	int calculate();
};
class Sub {
	int a, b;
public:
	void setValue(int x, int y);
	int calculate();
};
class Mul {
	int a, b;
public:
	void setValue(int x, int y);
	int calculate();
};
class Div {
	int a, b;
public:
	void setValue(int x, int y);
	int calculate();
};
#endif

 

728x90
반응형
Comments