반응형

문제

다음 함수는 매개 변수로 주어진 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에 포함되어 있지 않다";
}
반응형
반응형

문제

원을 추상화한 Circle 클래스는 간단히 아래와 같다.

class Circle {
	int radius;
public:
	Circle(int radius = 0) { this->radius = radius; }
	void show() { cout << "radius = " << radius << " 인 원" << endl; }
};

 

다음 연산이 가능하도록 연산자를 프렌드 함수로 작성하라

int main()
{
	Circle a(5), b(4);
	++a;
	b = a++;
	a.show();
	b.show();
}

 

결과

radius = 7 인 원

radius = 6 인 원

 

소스코드

#include<iostream>
using namespace std;
class Circle {
	int radius;
public:
	Circle(int radius = 0) { this->radius = radius; }
	void show() { cout << "radius = " << radius << " 인 원" << endl; }
	friend void operator++(Circle& a);
	friend Circle& operator++(Circle& a, int b);
};

void operator++(Circle& a)
{
	++a.radius;
}
Circle& operator++(Circle& a,int b)
{
	Circle temp = a;
	a.radius++;
	return temp;
}
int main()
{
	Circle a(5), b(4);
	++a;
	b = a++;
	a.show();
	b.show();
}

설명 : 전위, 후위 연산자 모두 참조 매개변수를 사용한다. 전위 연산자인 ++a 의 경우 리턴 값이 필요없으므로 참조매개변수로 a.radius값을 1증가시킨다. 후위 연산자인 경우 매개 변수를 가지도록 선언이 되며, 후위 연산자는 그 줄의 코드가 실행된 후 증가를 시키기 때문에 참조매개변수를 이용해 a.radius의 값은 증가시켜주지만 temp의 이전의 상태를 삽입하여 리턴한다. 이 때 매개변수는 사용되지 않으므로 무시해도 된다. 단지, 전위인지 후위인지 구분하는 매개 변수이다. 

 

오류 또는 수정 사항 궁금한 점 있으시면 댓글로 남겨주세요.

반응형

+ Recent posts