2.1.2 공통으로 사용할 코드 구현

앞으로 이 책에서는 다양한 정렬 알고리즘을 구현할 거예요. 먼저 공통으로 사용할 코드를 구현합시다.

정렬에 사용할 데이터는 문자열과 번호를 멤버로 갖는 형식으로 정의할게요. 그리고 테스트에서는 이름 순으로 정렬도 해 보고 번호로 정렬도 해 보기로 해요.

테스트에 사용할 데이터 형식을 Member 클래스라 정할게요.

class Member
{
    //멤버 필드로 이름과 번호를 선언하세요.
    string name;
    int num;
public:
    //생성자에서 이름과 번호를 입력 인자로 받아 멤버 필드를 설정하세요.
    Member(string name,int num)
    {
        this->name = name;
        this->num = num;
    }
    //이름과 번호 멤버 필드에 접근할 수 있게 접근자 메서드를 제공하세요.
    string GetName()const
    {
        return name;
    }
    int GetNum()const
    {
        return num;
    }
    //개체 정보를 출력하는 메서드도 제공합시다.
    void View()const
    {
        cout<<setw(10)<<setfill('0')<<num<<","<<name<<endl;
    }
};

번호로 비교하는 함수와 이름으로 비교하는 함수도 필요하겠죠.

int CompareByNum(Member *m1, Member *m2)
{
    int n1 = m1->GetNum();
    int n2 = m2->GetNum();
    return  n1 - n2;
}

int CompareByName(Member *m1, Member *m2)
{
    string n1 = m1->GetName();
    string n2 = m2->GetName();
    return  n1.compare(n2);
}

랜덤한 회원 개체를 원하는 개수만큼 생성해서 배열에 설정하는 함수도 제공합시다. 회원 개체를 동적으로 생성하면 Member * 형식으로 사용하므로 배열을 입력 인자로 받으려면 Member ** 형식으로 받으면 되겠죠.

void MakeRandomMembers(Member **pbase, size_t n)
{
    for(size_t i=0; i<n; i++)
    {
        //번호는 랜덤 함수를 이용할게요. 
        //랜덤 함수가 반환하는 값은 0~32767이어서 
        //두 번 호출한 곱으로 합시다.
        int num = rand()*rand();
        char buf[256];
        //이름도 접미사에 랜덤한 수를 넣게 만듭시다.
        sprintf_s(buf,sizeof(buf),"이름%010d",rand()*rand());
        pbase[i] = new Member(buf,num);
    }
}

동적으로 만든 회원 개체들을 소멸하는 함수도 제공해야겠죠.

void RemoveMembers(Member **pbase, size_t n)
{
    for(size_t i=0; i<n; i++)
    {        
        delete pbase[i];
    }
}

회원 개체를 보관한 배열의 원소를 출력하는 함수도 작성합시다.

void ViewMembers(Member **pbase, size_t n)
{
    for(size_t i=0;i<n; i++)
    {
        pbase[i]->View();
    }
}

다음은 공통으로 사용할 common.h 파일의 내용이예요.

//common.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <iomanip>
#include <iostream>
#include <string>
#include <time.h>
using namespace std;
class Member
{
    string name;
    int num;
public:
    Member(string name,int num)
    {
        this->name = name;
        this->num = num;
    }
    string GetName()const
    {
        return name;
    }
    int GetNum()const
    {
        return num;
    }
    void View()const
    {
        cout<<setw(10)<<setfill('0')<<num<<","<<name<<endl;
    }
};

int CompareByNum(Member *m1, Member *m2)
{
    int n1 = m1->GetNum();
    int n2 = m2->GetNum();
    return  n1 - n2;
}


int CompareByName(Member *m1, Member *m2)
{
    string n1 = m1->GetName();
    string n2 = m2->GetName();
    return  n1.compare(n2);
}

void MakeRandomMembers(Member **pbase, size_t n)
{
    for(size_t i=0; i<n; i++)
    {
        int num = rand()*rand();
        char buf[256];
        sprintf_s(buf,sizeof(buf),"이름%010d",rand()*rand());
        pbase[i] = new Member(buf,num);
    }
}

void RemoveMembers(Member **pbase, size_t n)
{
    for(size_t i=0; i<n; i++)
    {        
        delete pbase[i];
    }
}

void ViewMembers(Member **pbase, size_t n)
{
    for(size_t i=0;i<n; i++)
    {
        pbase[i]->View();
    }
}