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(); 멤버 함수를 만들어 줍니다.

 

1. 문제

 

1. main()의 실행 결과가 다음과 같도록 Tower 클래스를 작성하라.

 

 

2. 결과

 

 

3. 코드

#include <iostream>
using namespace std;

class Tower {
	int high;
public :
	Tower() { high = 1; }
	Tower(int h ) { high = h; }
	int getHeight() { return high ;}
};

int main() {
	Tower myTower;
	Tower seoulTower(100);
	cout << "높이는 " << myTower.getHeight() << "미터" << endl;
	cout << "높이는 " << seoulTower.getHeight() << "미터" << endl;
}

 

4. 설명

 

매개변수가 없는 생상자는 high를 1로 초기화 하도록 만들고, int형 매개변수 하나가 있는 생성자는 입력 받은 매개변수로 high를 초기화 하도록 만듭니다.

그리고 높이를 return하는 getHeight()함수를 만들었습니다. int형을 return함으로써 int getHeight()로 만드셔야 합니다.

 

 

 

※ public : 위치에 선언해야 main()에서 이용가능 합니다. 

디폴트 값은 private로서 변수 high는 private로서 main에서 접근할 수 없습니다.

 

 

 

1. 문제

 

두 사람이 하는 가위, 바위, 보 게임을 만들어보자. 두 사람의 이름은 '사또'와 처녀 귀신 '아랑'으로 한다. 먼저 "사또>>"를 출력하고 '사또'로부터 "가위", "바위", "보" 중 하나의 문자열을 입력받고, 다시 "아랑>>"을 출력하고 '아랑'으로부터 "가위", "바위", "보" 중 하나의 문자열을 입력받는다. 누가 이겼는지 판단하여 승자를 출력한다. 비기게 되면 "비겼습니다"라고 출력하고 프로그램을 종료한다.

 

 

2. 결과

 

 

 

3. 코드

 

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

int main()
{
	string s,o;
	cout << "가위 바위 보 게임을 합니다. 가위, 바위, 보 중에서 입력하세요." << endl;
	cout << "사또>>" ;
	getline(cin, s);
	cout << "아랑>>";
	getline(cin, o);

	if( s == "바위" ) {
		if( o == "바위" ) cout << "비겼습니다." << endl;
		else if( o == "가위" ) cout << "사또가 이겼습니다." << endl;
		else if( o == "보" ) cout << "아랑이 이겼습니다." << endl;
	}
	else if ( s == "가위" ) {
		if( o == "가위" ) cout << "비겼습니다." << endl;
		else if( o == "보" ) cout << "사또가 이겼습니다." << endl;
		else if( o == "바위" ) cout << "아랑이 이겼습니다." << endl;
	}
	else if ( s == "보" ) {
		if( o == "보" ) cout << "비겼습니다." << endl;
		else if( o == "바위" ) cout << "사또가 이겼습니다." << endl;
		else if( o == "가위" ) cout << "아랑이 이겼습니다." << endl;
	}
}

 

 

4. 설명

 

string 변수를 사용하여서 간단하게 해결하실 수 있습니다.

 

 

문자열 변수는 저장된 문자가 같은지 검사할려면 strcmp()함수를 사용해야 했지만 string 변수는 "=="(비교연산자)로 비교가 가능합니다.

 

※ 이 상황에서 else문을 사용하시면 안됩니다. else문을 사용하시면 가위 바위 보가 아닌 아무거나 입력하여도 참으로 처리되어서 진행되기 때문 입니다.

+ Recent posts