반응형

문제

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

 

#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;
}

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

 

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

20과 50중 큰 값은 50
waffle과 pizza 중 큰 것의 반지름은 20

 

y = bigger(waffle, pizza); 이 부분에서 클래스에 대한 비교가 없기 때문에 오류가 납니다.

 

소스코드

#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;
}
반응형
반응형

문제

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

int* remove(int src[], int sizeSrc, int minus[], int sizeMinus, int& retSize);

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

 

소스코드

#include<iostream>
using namespace std;
template<class T>
T* remove(T src[], T sizeSrc, T minus[], T sizeMinus, T& retSize) {


	int count = 0;
	for (int i = 0; i < sizeSrc; i++)
	{
		for (int j = 0; j < sizeMinus; j++)
		{
			if (src[i] == minus[j]) {
				src[i] = 0; //같을때 그 값을 0으로 만들고
				count++; //같은 숫자 카운트
			}
		}
	}
	
	int size = sizeSrc - count;
	T* tmp = new T[size]; //같은개수 빼기
	
	count = 0; //재사용

	for (int i = 0; i < sizeSrc; i++)
	{
		if (src[i] != 0)//0이라면 추가안함
			tmp[count++] = src[i];

	}
	retSize = count;
	return tmp;
}

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

	int retSize;
	int* z = remove(x, 5, y, 4, retSize);
	for (int i = 0; i < retSize; i++)
		cout << z[i] << ' ';

	cout << endl;
	delete[] z;
}
반응형
반응형

문제

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

int* concat(int a[], int sizea, int b[], int sizeb);

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

 

소스코드

#include<iostream>
using namespace std;

template <class T>
T* concat(T a[], T sizea, T b[], T sizeb) {
	T* z = new T[sizea + sizeb];

	for (int i = 0; i < sizea+sizeb; i++)
	{
		if (i < sizea)
			z[i] = a[i];
		else
			z[i] = b[i-sizea];
	}
	return z;
}

int main() {
	int x[] = { 1, 10, 100, 5, 4 };
	int y[] = { 2, 20, 200, 10, 8 };
	int* a = concat(x, 5, y, 5);

	for (int i = 0; i < 10; i++)
		cout << a[i] << ' ';
        delete [] a;
}
반응형
반응형

문제

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

 

메인함수

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

 

소스코드

#include<iostream>
using namespace std;
template<class T>
T search(T n,T x[],T size) {
	for (int i = 0; i < size; i++)
		if (x[i] == n)
			return true; //맞는 값이 있으면 true리턴
	return false; //아니면 false 리턴
}

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

문제

배열의 원소를 반대 순서로 뒤집는 reverseArray() 함수를 템플릿으로 작성하라.

reverseArray()의 첫 번째 매개 변수는 배열에 대한 포인터이며 두 번째 매개 변수는 배열의 개수이다. reverseArray()의 호출 사례는 다음과 같다.

 

메인함수

int x[] = { 1,10,100,5,4 };
	reverseArray(x, 5);
	for (int i = 0; i < 5; i++)	cout << x[i] << ' '; // 4 5 100 10 1 이 출력된다.

 

소스코드

#include<iostream>
using namespace std;
template<class T>
void reverseArray(T x[], T n) {
	for (int i = 0, j = n - 1; i < n/2; i++, j--)
	{
		T tmp = x[i];
		x[i] = x[j];
		x[j] = tmp;
	}
}

int main() {
	int x[] = { 1,10,100,5,4 };
	reverseArray(x, 5);
	for (int i = 0; i < 5; i++)	cout << x[i] << ' '; // 4 5 100 10 1 이 출력된다.
}
반응형
반응형

문제

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

 

메인함수

int x[] = { 1,10,100,5,4 };
	int y[] = { 1,10,100,5,4 };
	if (equalArrays(x, y, 5))cout << "같다";
	else cout << "다르다";

 

소스코드

#include<iostream>
using namespace std;
template <class T>
T equalArrays(T x[], T y[], T n) {
	for (T i = 0; i < n; i++)
		if (x[i] != y[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 << "같다";
	else cout << "다르다";
}
반응형
반응형

문제

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

 

힌트

biggest()를 호출하는 코드 사례는 다음과 같다.

int x[] = { 1,10,100,5,4 };
cout << biggest(x, 5) << endl; //5는 배열 xdml zmrl. 100이 출력된다.

 

소스코드

#include<iostream>
using namespace std;
template <class T>
T biggest(T x[], T n) {
	T big = x[0];
	for (int i = 0; i < n; i++)
		big = big > x[i] ? big : x[i]; 
	//삼항 조건 연산자 조건 ? true : false
	//조건이 맞으면 true 아니면 false
	return big;
}
int main()
{
	int x[] = { 1,10,100,5,4 };
	cout << biggest(x, 5) << endl; //5는 배열 xdml zmrl. 100이 출력된다.
}

 

반응형

+ Recent posts