1. 문제

 

7. 다음 프로그램은 컴파일 오류가 발생한다. 소스의 어디에서 왜 컴파일 오류가 발생하는가?

 

아래 결과와 같이 출력되도록 프로그램을 수정하라.

 

2. 결과

 

 

3. 코드

#include <iostream>
using namespace std;


class Circle {
	int radius;
public:
	Circle(int radius = 1) { this->radius = radius; }
	int getRadius() { return radius; }
};

template <class T>
T bigger(T a, T b) {
	if (a > b) return a;
	else return b;
}
Circle bigger(Circle a, Circle b) {
	if (a.getRadius() > b.getRadius()) return a;
	else return b;
}

int main() {
	int a = 20, b = 50, c;
	c = bigger(a, b);
	cout << "20과 50중 큰 값은 " << c << endl;
	Circle waffle(10), pizza(20), y;
	y = bigger(waffle, pizza);
	cout << "waffle과 pizza 중 큰 것의 반지름은 " << y.getRadius() << endl;
}

 

4. 설명

 

처음 20과 50을 비교할 때는 잘 실행되지만, 그 다음 Circlr 클래스 변수를 비교할려면 오류가 발생한다.

 

그 이유는 클래스 변수를 비교할 수는 없기 때문이다. 그러므로 클래스 변수 안의 있는 비교할 수 있는 멤버 변수 radius를 비교하도록 따로 구현을 해주어야 한다.

 

 

1. 문제

 

6. 다음 함수는 매개 변수로 주어진 int 배열 src에서 배열 minus에 들어있는 같은 정수를 모두 삭제한 새로운 int 배열을 동적으로 할당받아 리턴한다. retSize는 remove() 함수의 실행 결과를 리턴하는 배열의 크기를 전달받는다.

 

템픔릿을 이용하여 remove를 일반화하라.

 

 

2. 결과

 

 

3. 코드

#include <iostream>
using namespace std;

template <class T>
T* remove(T src[], int sizeSrc, T minus[], int sizeMinus, int& retSize) {
	int count = 0, choice = sizeMinus;
	T* re = new T;

	for (int i = 0; i<sizeSrc; i++) {
		for (int j = 0; j<sizeMinus; j++)
			if (src[i] != minus[j]) choice--;

		if (choice == 0) {
			re[count] = src[i];
			count++;
		}
		choice = sizeMinus;
	}
	retSize = count;
	return re;
}

int main() {
	int x[] = { 1, 10, 100, 5, 4 };
	int y[] = { 4, 6, 10, 9 };
	int size = 0;
	int* result = remove(x, 5, y, 4, size);

	for (int i = 0; i<size; i++)
		cout << result[i] << ' ';
	cout << endl;
}

 

4. 설명

 

x배열의 각 원소들을 for문으로 각 y원소들과 비교하여 제거할지를 판단합니다.

 

size 변수는 remove함수 내에서 배열의 크기를 저장합니다.

 

 

 

1. 문제

 

5. 다음 함수는 매개 변수로 주어진 두 개의 int 배열을 연결한 새로운 int 배열을 동적할당 받아 리턴한다.

 

concat가 int 배열뿐 아니라 다른 타입의 배열도 처리할 수 있도록 일반화하라.

 

2. 결과

 

 

 

3. 코드

#include <iostream>
using namespace std;

template <class T>
T* concat(T a[], int sizea, T b[], int sizeb) {
	T* sum = new T[sizea + sizeb];
	int i;
	for (i = 0; i<sizea; i++)
		sum[i] = a[i];
	for (i = sizea; i<sizea + sizeb; i++)
		sum[i] = b[i - sizea];
	return sum;
}

int main() {
	int x[] = { 1, 10, 100, 5, 4 };
	int y[] = { 7, 6, 10, 9 };
	int *a = concat(x, 5, y, 4);

	for (int i = 0; i<9; i++)
		cout << a[i] << ' ';
	cout << endl;
}

 

4. 설명

 

새로운 배열 하나를 동적 생성하여서 두 배열의 원소들을 차례대로 대입합니다.

 

main의 for문에서 9처럼 일일이 숫자를 입력하고 싶지 않으시다면

 

int size = sizeof(x) / 4 + sizeof(y)/4; 를 중간에 대입 후  size까지 for문을 실행시키면 됩니다.

 

이는 물론 x와 y가 int형 배열일 경우에 해당합니다.

 

 

 

1. 문제

 

4. 배열에서 원소를 검색하는 search() 함수를 템플릿으로 작성하라. search()의 첫번째 매개 변수는 검색하고자 하는 원소 값이고, 두 번째 매개 변수는 배여이며, 세 번째 매개 변수는 배열의 개수이다. search() 함수가 검색에 성공하면 true를, 아니면 false를 리턴한다. search()의 호출 사례는 다음과 같다.

 

2. 결과

 

 

 

3. 코드

#include <iostream>
using namespace std;

template <class T>
bool search( T se, T a[], int size) {
	for(int i=0; i<size; i++)
		if( a[i] == se ) return true;
	return false;
}

int main() {
	int x[] = {1, 10, 100, 5, 4};
	
	if( search(100, x, 5) ) cout << "100이 배열 x에 포함되어 있다" << endl;
	else cout << "100이 배열 x에 포함되어 있지 않다" << endl;
}

 

4. 설명

 

 

함수가 실행되면 size만큼 for문을 돌려서 찾는 원소가 있는지 비교합니다.

 

위 x에서 100이 아닌 다른 원소를 입력하면 포함되어 있지 않다는 결과가 나오게 됩니다.

 

 

1. 문제

 

3. 배열의 원소를 반대 순서로 뒤집는 reverseArray() 함수를 템플릿으로 작성하라. reverseArray()의 첫 번째 매개 변수는 배열에 대한 포인터이며 두 번째 매개 변수는 배열의 개수이다. reverseArray()의 호출 사례는 다음과 같다.

 

2. 결과

 

 

 

3. 코드

#include <iostream>
using namespace std;

template <class T>
void reverseArray(T a[], int size) {
	T imsi;
	for (int i = 0; i<size / 2; i++) {
		imsi = a[i];
		a[i] = a[size - i - 1];
		a[size - i - 1] = imsi;
	}
}

int main() {
	int x[] = { 1, 10, 100, 5, 4 };

	reverseArray(x, 5);
	for (int i = 0; i<5; i++) cout << x[i] << ' ';
}

 

4. 설명

 

 

원소의 순서를 뒤집는 reverseArray 함수입니다.

 

원소의 개수 size가 짝수일 경우 0~size/2까지 즉 size/2번 for문을 실행하여서 원소의 순서를 뒤집어주고,

 

size가 홀수일 경우는 가운데의 값의 순서는 그대로이므로 (size/2)-0.5번 만큼만 for문을 실행하여주면 순서가 뒤집어집니다.

 

 

1. 문제

 

2. 두 개의 배열을 비교하여 같으면 true를, 아니면 false를 리턴하는 제네릭 함수 equalArrays()를 작성하라. 또한 main() 함수를 작성하여 equalArrays()를 호출하는 몇 가지 사례를 보여라. equalArrays()를 호출하는 코드 사례는 다음과 같다.

 

 

2. 결과

 

 

 

3. 코드

#include <iostream>
using namespace std;

template <class T>
bool equalArrays(T a[], T b[], int size) {
	for (int i = 0; i<size; i++)
		if (a[i] != b[i]) return false;
	return true;
}

int main() {
	int x[] = { 1, 10, 100, 5, 4 };
	int y[] = { 1, 10, 100, 5, 4 };

	if (equalArrays(x, y, 5)) cout << "같다" << endl;
	else cout << "다르다" << endl;
}

 

4. 설명

 

배열의 size만큼 비교하여서 두 배열이 같은지 비교합니다.

 

배열의 원소 중 하나만 값을 바꾸어도 "다르다"를 출력합니다.

 

 

 

1. 문제

 

1. 배열을 받아 가장 큰 값을 리턴하는 제네릭 함수 biggest()를 작성하라. 또한 main() 함수를 작성하여 biggest()를 호출하는 몇 가지 사례를 보여라.

 

2. 결과

 

 

 

3. 코드

#include <iostream>
using namespace std;

template <class T>
T biggest(T a[], int size) {

	T big = a[0];
	for (int i = 1; i<size; i++)
		if (a[i] > big) big = a[i];

	return big;
}

int main() {
	int x[] = { 1, 10, 100, 5, 4 };
	double xx[] = { 3, 2.9, 5.5, 9.9, 7 };
	char xxx[] = { 'g', 't', 'z', 'a', 'q' };

	cout << "int형 배열에서 가장 큰 값 : " << biggest(x, 5) << endl;
	cout << "double형 배열에서 가장 큰 값 : " << biggest(xx, 5) << endl;
	cout << "char형 배열에서 가장 큰 값 : " << biggest(xxx, 5) << endl;
}

 

4. 설명

 

int형, double형, char형 3개의 배열로 예를 보여주었습니다.

 

char형 배열에서는 'z'가 아스키 코드 상 가장 큰 값(수)이므로 z가 출력 됩니다.

 

 

 

1. 문제

 

영어 어휘 테스트 프로그램 작성

 

영어 단어의 뜻 맞추기 게임을 만들어 보자. 영어 단어와 한글 단어로 구성되는 Word 클래스를 작성하고, vector<Word> v;로 벡터를 생성하고, 프로그램 내에서 여러 개의 Word 객체를 벡터에 삽입해 둔다. 그리고 다음 화면과 같이 랜덤하게 사용자에게 문제를 던지며, 4개의 한글 보기를 출력한다. 4개의 보기 중 정답을 제외한 3개는 벡터에 있는 단어 중에서 랜덤하게 선택한다. 이문제에서 iterator는 사용할 필요 없다.

 

2. 결과

 

 

3. 코드

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

class Word {
	string en;
	string ko;
public:
	Word(string en, string ko) {
		this->en = en; this->ko = ko;
	}
	string getEn() { return en; }
	string getKo() { return ko; }
};

int main() {

	vector<Word> v;
	v.push_back(Word("human", "인간"));
	v.push_back(Word("society", "사회"));
	v.push_back(Word("dall", "인형"));
	v.push_back(Word("emotion", "감정"));
	v.push_back(Word("painting", "그림"));
	v.push_back(Word("trade", "거래"));
	v.push_back(Word("animal", "동물"));
	v.push_back(Word("photo", "사진"));
	v.push_back(Word("bear", "곰"));

	srand((unsigned)time(0));
	int n1; string answer;
	string bogi[4]; for (int i = 0; i<4; i++) bogi[i] = "";
	int number[4]; for (int i = 0; i<4; i++) number[i] = 0;
	int i;
	bool exit = true;

	cout << "영어 어휘 테스트를 시작합니다. 1~4 외 다른 입력시 종료합니다." << endl;
	while (exit) {
		n1 = rand() % v.size();
		bogi[0] = v.at(n1).getKo();
		answer = bogi[0];
		cout << v.at(n1).getEn() << "?" << endl;

		while (exit) {				// 중복되지 않는 보기 만들기
			for (i = 1; i<4; i++) {
				n1 = rand() % v.size();
				bogi[i] = v.at(n1).getKo();
			}
			if (bogi[0] != bogi[1] && bogi[0] != bogi[2] && bogi[0] != bogi[3] &&
				bogi[1] != bogi[2] && bogi[1] != bogi[3] && bogi[2] != bogi[3])
				exit = false;
		}
		exit = true;

		number[0] = rand() % 4;
		while (exit) {					//보기 순서 섞기
			for (i = 1; i<4; i++) {
				number[i] = rand() % 4;
			}
			if (number[0] != number[1] && number[0] != number[2] && number[0] != number[3] &&
				number[1] != number[2] && number[1] != number[3] && number[2] != number[3])
				exit = false;
		}
		exit = true;
		int result;

		for (i = 1; i<5; i++)
			cout << "(" << i << ") " << bogi[number[i - 1]] << " ";
		cout << ":>";
		cin >> result;

		if (result != 1 && result != 2 && result != 3 && result != 4)	//순서 중요 먼저 1, 2, 3, 4 이외의 값인지 확인해야함
			exit = false;
		else if (answer == bogi[number[result - 1]])
			cout << "Excellent !!" << endl;
		else if (result == 1 || result == 2 || result == 3 || result == 4)
			cout << "No. !!" << endl;
	}
}

 

4. 설명

 

 

앞에서 여러번 하였던 

 

srand( (unsigned) time(0) );

int n = rand();

를 사용하여 랜덤 수를 구하는 것을 제대로 이해하였다면 크게 어려움 없이 풀수 있는 문제였습니다.

 

대략적인 설명은 주석처리 해놨습니다.

 

+ Recent posts