1. 문제

 

(2) 클래스의 선언부와 구현부를 헤더 파일과 cpp 파일로 나누어 프로그램을 작성하라.

 

 

2. 결과

 

 

3. 코드

 

// main.cpp

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

#include "Calculator.h"

int main() {

	char cal[10]; char *p;
	int x, y; 

	while(1) { 
		cout << "두 정수와 연산자를 입력하세요>>";
		cin.getline( cal, 20);
		x = stoi( strtok( cal, " ") );
		y = stoi( strtok( NULL, " ") );
		p = strtok( NULL, "");
		if( strcmp( p, "+") == 0 ) {  
			Add a; 
			a.setValue(x, y); 
			cout << a.calculate() << endl; }
		else if( strcmp( p, "-") == 0 ) {
			Sub s;
			s.setValue(x, y);
			cout << s.calculate() << endl; }
		else if( strcmp( p, "*") == 0 ) {
			Mul m;
			m.setValue(x, y);
			cout << m.calculate() << endl; }
		else if( strcmp( p, "/") == 0 ) {
			Div d;
			d.setValue(x, y);
			cout << d.calculate() << endl; }
	}
}
// Calculator.cpp

#include "Calculator.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;
}
// Calculator.h

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

 

4. 설명

 

클래스의 선언부를 Calculator.h 헤더파일에 구현부는 Calculator.cpp 파일에 각각 나누어서 작성합니다.

 

 

main파일에는 main함수만 있도록 만드셔야 합니다.
 
※ 사용자가 만든 헤더 파일에 include하기 위해서는 #include "Claculator.h" 이처럼 ""을 사용하셔야 합니다.

 

 

 

1. 문제

 

8. 다수의 클래스를 선언하고 활용하는 간단한 문제이다. 더하기(+), 빼기(-), 곱하기(*), 나누기(/)를 수행하는 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()를 호출하여 결과를 화면에 출력한다. 프로그램은 무한 루프를 돈다.

 

 

2. 결과

 

 

 

3. 코드

 

//	Calculator.cpp

#include <iostream>
#include <string>

using namespace std;

class Add {
	int a;
	int b;
public :
	void setValue(int x, int y);
	int calculate();
};
class Sub {
	int a;
	int b;
public :
	void setValue(int x, int y);
	int calculate();
};
class Mul {
	int a;
	int b;
public :
	void setValue(int x, int y);
	int calculate();
};
class Div {
	int a;
	int b;
public :
	void setValue(int x, int y);
	int calculate();
};
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;
}

int main() {

	char cal[10]; char *p;
	int x, y; 

	while(1) { 
		cout << "두 정수와 연산자를 입력하세요>>";
		cin.getline( cal, 20);
		x = stoi( strtok( cal, " ") );
		y = stoi( strtok( NULL, " ") );
		p = strtok( NULL, "");
		if( strcmp( p, "+") == 0 ) {  
			Add a; 
			a.setValue(x, y); 
			cout << a.calculate() << endl; }
		else if( strcmp( p, "-") == 0 ) {
			Sub s;
			s.setValue(x, y);
			cout << s.calculate() << endl; }
		else if( strcmp( p, "*") == 0 ) {
			Mul m;
			m.setValue(x, y);
			cout << m.calculate() << endl; }
		else if( strcmp( p, "/") == 0 ) {
			Div d;
			d.setValue(x, y);
			cout << d.calculate() << endl; }
	}
}

 

 

4. 설명

 

strtok()를 이용하여서 두 수를 int형 변수에 저장한 후 연산자도 char*형 변수 p에 저장한 후 p에 따라 해당하는 사칙연산 클래스  변수를 생성하고 사칙연산이 실행되도록 구현하였습니다.

 

(2)번 때문에 구현부가 짧은 멤버함수도 선언부와 구현부를 나누어 작성하였습니다.

 

※ 이 문제는 띄어쓰기를 기준으로 3값을 구분하므로 cin >> x >> y >> p로 입력을 받으셔도 굳이 strtok()함수를 사용하지 않으셔도 원하는 결과를 얻을 수 있습니다.

 

 

 

1. 문제

 

7. Oval 클래스는 주어진 사각형에 내접하는 타원을 추상화한 클래스이다. Oval 클래스의 멤버는 모두 다음과 같다. Oval 클래스를 선언부와 구현부로 나누어 작성하라.

 

 

2. 결과

 

 

3. 코드

 

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

class Oval {
	int width, height;
public :
	Oval();
	Oval(int w, int h);
	~Oval();
	int getWidth();
	int getHeight();
	void set(int w, int h);
	void show();
};
Oval::Oval() {
	width = 1; height =1;
}
Oval::Oval(int w, int h) {
	width = w; height = h;
}
Oval::~Oval() {
	cout << "Oval 소멸 : width = " << width << ", height = " << height << endl;
}
int Oval::getWidth() {
	return width;
}
int Oval::getHeight() {
	return height;
}
void Oval::set(int w, int h) {
	width = w; height = h;
}
void Oval::show() {
	cout << "width = " << width << ", height = " << height << endl;
}

int main() {
	Oval a, b(3,4);
	a.set(10, 20);
	a.show();
	cout << b.getWidth() << ", " << b.getHeight() << endl;
}
	

 

4. 설명

 

이 문제처럼 오히려 구현부가 return width;같이 간단한 경우는 인라인 함수로 만드는 것이 더 보기도 편하고 코드도 짧아져서 좋습니다.

 

 

각 설명에 알맞은 기능을 하도록 생성자와 멤버함수들을 구현하시면 됩니다.

 

소멸자는 ~Oval()로서 생성자와 반대로 객체가 소멸할 때 발생시키도록 하고싶은 일이 있으면 이 곳의 코드를 입력해 주시면 됩니다. 소멸자는 매개변수를 가질 수 없으며, 객체가 소멸할 때 자동으로 실행됩니다.

 

 

1. 문제

 

6. int 타입의 정수를 객체화한 Integer 클래스를 작성하라. Integer의 모든 멤버 함수를 자동 인라인으로 작성하라. Integer 클래스를 활용하는 코드는 다음과 같다.

 

 

2. 결과

 

 

 

3. 코드

 

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

class Integer {
	int num;
public :
	Integer(int n) { num = n; }
	Integer(string s) { num = stoi(s); }
	int get() { return num; }
	void set(int n) { num = n ; } 
	bool isEven() { if( num % 2 == 0) return true; else return false; }
};

int main() {
	Integer n(30);
	cout << n.get() << ' ';
	n.set(50);
	cout << n.get() << ' ';

	Integer m("300");
	cout << m.get() << ' ';
	cout << m.isEven();
}

 

 

4. 설명

 

실행결과의 맞게 각 함수들과 생성자를 구현하였습니다.

 

클래스 내의 인라인 함수는 구현부 길이가 길지 않을 때 사용하시는 것이 좋습니다.

 

 

1. 문제

 

5. 짝수 홀수를 선택할 수 있도록 생성자를 가진 SelectableRandom 클래스를 작성하고 각각 짝수 10개, 홀수 10개를 랜덤하게 발생시키는 프로그램을 작성하라.

 

 

2. 결과

 

 

 

3. 코드

 

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

class SelectableRandom {
	string s;
public :
	SelectableRandom(string s) { this->s =s; srand( (unsigned)time(0) ) ;}
	int next();
	int nextInRange(int a, int b);
	string getstr() { return s; }
};
int SelectableRandom::next() {
	int n = rand();
	if( s == "홀수" ) 
		while( n % 2 == 0 ) n = rand();
	else if( s == "짝수" )
		while( n % 2 == 1 ) n = rand();
	return n;
}
int SelectableRandom::nextInRange(int a, int b) {
	int n;
	n = a + ( rand() % (b-a+1) );
	if ( s == "홀수" )
		while( n % 2 == 0 ) n = a + ( rand() % (b-a+1) );
	else if( s == "짝수" )
		while( n % 2 == 1 ) n = a + ( rand() % (b-a+1) );
	return n;
}

int main() {
	SelectableRandom r("짝수");
	SelectableRandom rr("홀수");

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

 

 

4. 설명

 

홀수, 짝수 둘 중 하나를 매개변수로 가지는 생성자를 만든 후 홀수, 짝수를 입력 받은 후 string변수 s에 저장합니다.

 

 

그 후 4번과 유사하게, 저장된 변수 값이 짝수이면 while( n % 2 == 1 )로 짝수가 나올 때까지,
 
홀수이면 while( n % 2 == 0)으로 홀수가 나올 때까지 반복문이 실행되도록하면 됩니다.

 

 

 

1. 문제

 

4. 문제 3번을 참고하여 짝수 정수만 랜덤하게 발생시키는 EvenRandom 클래스를 작성하고 EvenRandom 클래스를 이용하여 10개의 짝수를 랜덤하게 출력하는 프로그램을 완성하라. 0도 짝수로 처리한다.

 

 

2. 결과

 

 

 

3. 코드

 

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

class EvenRandom {
public :
	EvenRandom() { srand( (unsigned)time(0) ) ;}
	int next();
	int nextInRange(int a, int b);
};
int EvenRandom::next() {
	int n = rand();
	while( n % 2 == 1 ) n = rand();
	return n;
}
int EvenRandom::nextInRange(int a, int b) {
	int n;
	n = a + ( rand() % (b-a+1) );
	while( n % 2 == 1 ) n = a + ( rand() % (b-a+1) );
	return n;
}

int main() {
	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에서 " << "10 까지의 랜덤 정수 10 개 --" << endl;
	for(int i=0; i<10; i++) {
		int n = r.nextInRange(2, 10);
		cout << n << ' ';
	}
	cout << endl;
}

 

4. 설명

 

편의상 문제 3번의 코드를 약간씩만 수정하여서 해결하였습니다.

 

문제 3번과 달리 랜덤한 짝수만을 구하는 것이니 

간단히 랜덤한 수를 구하는 함수 rand()를 int형 변수 n의 저장 후

while( n % 2 == 1 )일 경우 즉, 홀수가 나오지 않을 때까지 n = rand();로 랜덤한 수를 구해주면 됩니다.

 

 

2~10범위의 랜덤한 짝수일 경우도 while문으로 짝수가 나올 때까지 반복하도록하면 됩니다. 
단, 주의하실점은 n = a + ( rand() % (b-a+1) )로 해주셔야 합니다.

 

 

 

1. 문제

 

3. 랜덤 수를 발생시키는 Random 클래스를 만들자. Random 클래스를 이용하여 랜덤한 정수를 10개 출력하는 사례는 다음과 같다. Random 클래스가 생성자, next(), nextInRange()의 3개의 멤버 함수를 가지도록 작성하고 main() 함수와 합쳐 하나의 cpp파일에 구현하라.

 

 

2. 결과

 

 

 

3. 코드

 

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

class Random {
public :
	Random() { srand( (unsigned)time(0) ) ;}
	int next();
	int nextInRange(int a, int b);
};
int Random::next() {
	int n = rand();
	return n;
}
int Random::nextInRange(int a, int b) {
	int n;
	n = a + ( rand() % (b-a+1) );
	return n;
}

int main() {
	Random 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 << ' ';
	}
	cout << endl;
}

 

4. 설명

 

생성자에서는 보통 변수들을 초기화 하는 기능을 합니다.

이 Random클래스 생성자에서는 srand( (unsigned)time(0) ); 을 실행하여서서 실행할 때마다 다른 랜덤 값을 가져오게 합니다.

 

rand()함수는 범위(0~32767) 사이의 수를 랜덤하게 return하는 함수 입니다.

 

특정 범위에 랜덤한 수를 가져오는 방법은

ex) 2부터 4 까지

1. 위에서 본 것처럼 rand()는 범위에 수 중 랜덤한 수를 return하는 함수입니다.

 

2. 그렇다면 rand() % 3 을 계산한다면, 그 결과는 0, 1, 2 이 중 하나가 나옵니다.

 

3. 이것만으로 0~2사이 랜덤한 수를 구할 수 있습니다.

 

4. 여기서 2~4인 랜덤한 수를 구하기 위해서는 +2를 해주면 끝입니다.

 

5. 이러한 방법으로 특정 범위에서 랜덤한 수를 구할 수 있습니다.

 

 

※ RAND_MAX : <cstdlib> 헤더 파일에 선언되어 있는 수로서 32767 입니다.

※ 범위 a~b의 랜덤한 수 구하는 공식 : a + ( rand() % (b-a+1) ); 많이 해보시면 꼭 이렇게 공식처럼 외우시지 않으셔도 하실 수 있을 겁니다.

 

 

 

1. 문제

 

2. 날짜를 다루는 Date 클래스를 작성하고자 한다. Date를 이용하는 main()과 실행 결과는 다음과 같다. 클래스 Date를 작성하여 아래 프로그램에 추가하라.

 

 

2. 결과

 

 

3. 코드

 

#include <iostream>
using namespace std;

class Date {
	int year, month, day;
public :
	Date(int y, int m, int d) { year = y; month = m; day = d; }
	Date( char *nal ) ;
	void show() { cout << year << "년" << month << "월" << day << "일" << endl; }
	int getYear() { return year; }
	int getMonth() { return month; }
	int getDay() { return day; }
};
Date::Date( char *nal) {
	char a[20];
	for(int i=0; i< strlen(nal); i++)
		a[i] = *(nal+i);
	year = atoi( strtok( a, "/" ) );
	month = atoi( strtok( NULL, "/" ) );
	day = atoi( strtok( NULL, "" ) );
}

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

 

4. 설명

 

Date생성자를 Date( int y, int m, int d)로 각각 년, 월, 일을 입력받는 생성자와, Date( char *nal)로 하나의 문자열로 입력받는 생성자 2개를 만듭니다.

매개변수로 문자열을 입력받는 생성자는 strtok();함수를 사용하여서 "/"을 기준으로 나눈다음 atoi()함수를 사용하여서 int형으로 바꾸어 클래스 멤버 변수인 year, month, day에 각각 저장합니다.

 

그 외 년, 월, 일을 출력해주는 void show(); 멤버함수

각각 년, 월, 일을 return해주는 getYear(); getMonth(); getDay(); 멤버 함수를 만들어 줍니다.

 

+ Recent posts