C++/기초를 탄탄히 세워주는 C++ 프로그래밍 입문(황준하 저)

기초를 탄탄히 세워주는 C++ 프로그래밍 입문 10장 연습문제

꾸준함. 2017. 7. 7. 13:00

[10.1]

/*

2개의 매개 변수 값을 교환하는 Swap 함수를 함수 템플릿으로 만들고 이를 테스트하기 위한

main 함수도 작성해 본다. 실매개 변수의 값도 교환되어야 한다.

함수 템플릿을 연습할 수 있는 기본적인 문제이다.

어려움이 있다면 int형을 위한 swap 함수를 먼저 작성한 후 템ㅍ프릿 매개 변수로 바뀌어야 될 부분을 생각해 본다

*/

#include <iostream>

using namespace std;

 

template <typename T>

void Swap(T &a, T &b)

{

        T temp = a;

        a = b;

        b = temp;

}

 

int main(void)

{

        int num1 = 10, num2 = 20;

        cout << "num1: " << num1 << " num2: " << num2 << endl;

        char num3 = 'a', num4 = 'b';

        cout << "num3: " << num3 << " num4: " << num4 << endl;

        double num5 = 1.1, num6 = 2.2;

        cout << "num5: " << num5 << " num6: " << num6 << endl;

        Swap(num1, num2);

        Swap(num3, num4);

        Swap(num5, num6);

        cout << "Swap() 실행 후" << endl;

        cout << "num1: " << num1 << " num2: " << num2 << endl;

        cout << "num3: " << num3 << " num4: " << num4 << endl;

        cout << "num5: " << num5 << " num6: " << num6 << endl;

        return 0;

}

 


[10.2]

/*

배열과 원소의 개수를 매개변수로 전달받아 배열의 원소들 중 가장 큰 값을 반환하는 Max 함수

템플릿을 작성해 본다.

main 함수 및 실행 결과를 참고한다

*/

#include <iostream>

using namespace std;

 

template <typename T>

T Max(T *arr, int len)

{

        T max = arr[0];

        for (int i = 1; i < len; i++)

        {

               if (max < arr[i])

                       max = arr[i];

        }

        return max;

}

 

int main(void)

{

        int ary1[4] = { 4, 5, 2, 7 };

        double ary2[5] = { 1.1, 4.4, 8.8, 4.2, 5.5 };

 

        cout << Max(ary1, 4) << endl;

        cout << Max(ary2, 5) << endl;

        return 0;

}

 


[10.3]

/*

다음 main 함수와 같이 수행될 수 있도록 CPoint 클래스 템플릿을 만들어 본다.

x, y 같은 동일한 타입을 갖는다

*/

#include <iostream>

using namespace std;

 

template <typename T>

class CPoint

{

        T x;

        T y;

public:

        CPoint(T a = 0, T b = 0) :x(a), y(b)

        {

        }

        CPoint operator+(CPoint &Po)

        {

               return CPoint(x + Po.x, y + Po.y);

        }

        template <typename T>

        friend ostream &operator<<(ostream &out, CPoint<T> &Po);

};

 

template <typename T>

ostream &operator<<(ostream &out, CPoint<T> &Po)

{

        out << "(" << Po.x << ", " << Po.y << ")";

        return out;

}

 

int main(void)

{

        CPoint<int> a(1, 2);

        CPoint<int> b(3, 4);

        CPoint<int> c = a + b;

        cout << a << " + " << b << " = " << c << endl;

 

        CPoint<double> d(1.2, 3.4);

        CPoint<double> e(5.6, 7.8);

        CPoint<double> f = d + e;

        cout << d << " + " << e << " = " << f << endl;

        return 0;

}

 


[10.4]

/*

2개의 서로 다른 타입의 데이터를 쌍으로 저장할 수 있는 CArray 클래스 템플릿을 만들어 보자.

예를 들면 CArray(<int, char> Obj; 객체는 int 값과 char 값을 쌍으로 저장할 수 있다.

문제를 쉽게 하기 위해 배열의 크기는 10으로 제한하며, 현재 저장되어 있는 개수까지만 유효한 데이터로 취급한다.

그리고 다음과 같은 처리가 가능해야 한다

Obj.put(1, 'a'); //현재까지 저장된 마지막 원소 다음에 데이터를 추가

cout<<Obj; //유효한 원소들을 쌍으로 출력한다

*/

#include <iostream>

using namespace std;

 

template <typename T1, typename T2>

class CArray

{

private:

        T1 arr1[10]; //각각의 자료형에 대한 배열 선언

        T2 arr2[10];

        int len; //배열 길이

public:

        CArray() :len(0)

        {

        }

        void Put(T1 a, T2 b)

        {

               arr1[len] = a;

               arr2[len] = b;

               len++;

        }

        template <typename T1, typename T2>

        friend ostream &operator<<(ostream &out, CArray<T1, T2> &Copy);

};

 

template <typename T1, typename T2>

ostream &operator<<(ostream &out, CArray<T1, T2> &Copy)

{

        for (int i = 0; i < Copy.len; i++)

        {

               out << "(" << Copy.arr1[i] << ", " << Copy.arr2[i] << ")" << endl;

        }

        return out;

}

 

int main(void)

{

        CArray<int, char> Obj;

        Obj.Put(1, 'a');

        cout << Obj;

 

        return 0;

}

 


[10.5]

/*

다음 프로그램의 수행 결과는 무엇인가?

*/

#include <iostream>

using namespace std;

 

template <typename T>

T Sum(T a, T b)

{

        T c = a + b;

        return c;

}

 

template <>

int Sum(int a, int b)

{

        int c = a*b;

        return c;

}

 

int Sum(double a, double b)

{

        int c = a - b;

        return c;

}

 

int main(void)

{

        int x = Sum(3, 4); //명시적형변환 template<> int Sum(int a, int b) 반환

        double y = Sum(1.1, 2.2); //int Sum(double a, double b) 반환

        //이유:호출 우선순위는 일반함수, 명시적 전문화에 의해 호출 가능한 함수, 함수 템플릿의 순서!

 

        cout << x << endl;

        cout << y << endl;

        return 0;

}

 




개발 환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


[참고] 기초를 탄탄히 세워주는 C++ 프로그래밍 입문 황준하 저


반응형