앞으로 이 책에서는 다양한 정렬 알고리즘을 구현할 거예요. 먼저 공통으로 사용할 코드를 구현합시다.
정렬에 사용할 데이터는 문자열과 번호를 멤버로 갖는 형식으로 정의할게요. 그리고 테스트에서는 이름 순으로 정렬도 해 보고 번호로 정렬도 해 보기로 해요.
테스트에 사용할 데이터 형식을 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(); } }