앞에서 만든 동적 배열이 잘 동작하는지 확인하는 시뮬레이션 코드를 작성합시다. 여기에서는 순차적으로 자료를 보관하는 예와 특정 키순으로 보관하는 예, 인덱스를 사용하는 예를 들게요.
int main() { Simul_Seq(); Simul_Order(); Simul_Index(); return 0; }
먼저 순차적으로 동적 배열을 사용하는 시뮬레이션 코드를 작성합시다.
void Simul_Seq() {
먼저 동적 배열을 생성합니다.
Array *arr = New_Array();
그리고 도서 개체를 생성하여 순차적으로 동적 배열에 보관합니다.
Array_PushBack(arr,New_Book("C언어","홍길동",10)); Array_PushBack(arr,New_Book("C++언어","강감찬",20)); Array_PushBack(arr,New_Book("자료구조","김구",5)); Array_PushBack(arr,New_Book("알고리즘","이순신",9)); Array_PushBack(arr,New_Book("디자인패턴","정약용",13));
동적 배열에 있는 내용을 확인합니다. 이 부분은 별도의 함수로 작성합시다.
View_Array(arr);
그리고 보관한 도서를 찾아 봅시다. 이 부분도 별도의 함수로 작성할게요. 이 함수는 동적 배열과 검색할 도서 제목을 입력 인자로 전달할게요. 테스트를 위해 보관한 도서와 보관하지 않은 도서를 검색해 봅시다.
Simul_Find(arr,"C언어"); Simul_Find(arr,"이데아이론");
이번에는 보관한 자료를 삭제합시다. 이 부분도 별도의 함수로 작성할게요.
Simul_Remove(arr,"자료구조");
동적 배열에 보관한 목록을 출력하여 잘 삭제하였는지 확인합니다.
View_Array(arr);
마지막으로 시뮬레이션에 사용한 개체들을 정리합니다. 이 부분도 별도의 함수로 작성합시다.
SimulEnd(arr); }
먼저 동적 배열에 보관한 도서 목록을 출력하는 함수를 작성합시다.
void View_Array(Array *arr) { Book *book = 0;
동적 배열에 자료를 보관한 시작 위치와 마지막 다음 위치를 얻어옵니다.
Iterator seek = Array_Begin(arr); Iterator end = Array_End(arr);
위치를 점진적으로 이동하면서 전체 목록을 출력해야 합니다.
printf("-----보유 도서 목록-----\n"); for( ;seek!=end;seek++) {
현재 위치의 도서 정보를 참조합니다. 여기에서는 도서 개체를 보관하였으므로 이에 맞게 형변환합니다.
book = (Book *)(*seek);
해당 위치에 보관한 도서 개체가 유효하면 도서 정보를 출력합니다.
if(book) { Book_View(book); } }
도서 제목으로 동적 배열에 보관한 도서를 검색하는 함수를 작성합시다.
void Simul_Find(Array *arr,const char *title) { Book *book = 0;
동적 배열에서 검색할 구간의 시작과 끝을 얻어옵니다.
Iterator seek = Array_Begin(arr); Iterator end = Array_End(arr);
순차적으로 이동하면서 검색합니다.
for( ;seek!=end;seek++) {
현재 위치의 도서 개체를 얻어옵니다.
book = (Book *)(*seek);
도서 개체가 유효하면 도서 제목이 차이가 없는지 확인합니다.
if(book && (Book_CompareTitle(book,title)==0)) {
찾았으면 도서 정보를 출력하고 함수를 종료합니다.
printf("검색 결과:"); Book_View(book); return; } }
만약 순차적으로 이동하면서 검색하여도 발견하지 못하면 이를 통보합니다.
printf("<%s> 책을 찾을 수 없습니다.\n",title); }
도서 제목으로 동적 배열에 보관한 도서를 삭제하는 함수를 작성합시다.
void Simul_Remove(Array *arr,const char *title) { Book *book = 0;
삭제할 도서를 찾는 로직은 검색하는 부분과 비슷합니다.
Iterator seek = Array_Begin(arr); Iterator end = Array_End(arr); for( ;seek!=end;seek++) { book = (Book *)(*seek); if(book && (Book_CompareTitle(book,title)==0)) {
차이점은 찾은 위치의 내용을 배열에서 제거한다는 것입니다.
Array_Erase(arr,seek);
그리고 해당 도서를 소멸할게요.
Delete_Book(book); printf("삭제 성공!\n"); return; } } printf("<%s> 책을 찾을 수 없습니다.\n",title); }
시뮬레이션을 마치면서 동적으로 생성한 개체를 소멸하는 함수를 작성합시다.
void SimulEnd(Array *arr) { Book *book = 0;
검색과 삭제를 할 때처럼 동적 배열을 순차적으로 이동하면서 도서 개체를 참조합니다.
Iterator seek = Array_Begin(arr); Iterator end = Array_End(arr); for( ;seek!=end;seek++) { book = (Book *)(*seek);
만약 도서 개체가 유효하면 도서 개체를 소멸합니다.
if(book) { Delete_Book(book); } }
마지막으로 동적 배열도 소멸합니다.
Delete_Array(arr); }
이번에는 특정 키순으로 자료를 보관하는 시뮬레이션 함수를 작성합시다.
void Simul_Order() {
먼저 동적 배열을 생성합니다.
Array *arr = New_Array();
여기에서는 지은이 순으로 보관하는 것으로 할게요. 그리고 보관할 위치를 찾아 보관하는 함수는 별도의 함수로 작성합시다.
Simul_OrderAdd(arr,New_Book("C언어","홍길동",10)); Simul_OrderAdd(arr,New_Book("C++언어","강감찬",20)); Simul_OrderAdd(arr,New_Book("자료구조","김구",5)); Simul_OrderAdd(arr,New_Book("알고리즘","이순신",9)); Simul_OrderAdd(arr,New_Book("디자인패턴","정약용",13));
확인하기 위해 동적 배열에 보관한 도서 목록을 출력합니다.
View_Array(arr);
검색과 삭제 기능은 순차 보관할 때와 차이가 없습니다.
Simul_Find(arr,"C언어"); Simul_Find(arr,"이데아이론"); Simul_Remove(arr,"자료구조"); View_Array(arr); SimulEnd(arr); }
지은이 순으로 도서를 보관하는 함수를 작성합시다.
void Simul_OrderAdd(Array *arr,Book *book) { Book *stored_book = 0;
보관할 위치를 찾기 위해 구간의 시작과 끝을 구합니다.
Iterator seek = Array_Begin(arr); Iterator end = Array_End(arr);
순차적으로 이동하면서 보관한 도서 개체를 구합니다.
for( ;seek!=end;seek++) { stored_book = (Book *)(*seek);
보관한 도서 개체와 추가할 도서 개체의 지은이를 비교하여 보관한 도서 개체의 값이 크거나 같으면 위치를 찾은 것입니다.
if(stored_book && (Book_CompareAuthor(stored_book,book->author)>=0)) { break; } }
찾은 위치에 도서를 보관합니다.
Array_Insert(arr,seek,book); }
마지막으로 인덱스로 보관하는 시뮬레이션 함수를 작성합시다.
void Simul_Index() {
먼저 동적 배열을 생성합니다.
Array *arr = New_Array();
인덱스로 사용할 때는 최대 보관할 수 있는 개수 만큼을 디폴트 값으로 설정합니다. 여기에서는 최대 100으로 하고 디폴트 값을 0으로 설정할게요.
Array_SetSize(arr,100,0);
그리고 특정 인덱스에 보관한 내용을 변경하는 함수를 이용하여 도서 개체를 보관합니다. 보관할 위치는 도서 번호 – 1 인덱스에 보관하는 것으로 할게요.
Array_SetAt(arr,9,New_Book("C언어","홍길동",10)); Array_SetAt(arr,19,New_Book("C++언어","강감찬",20)); Array_SetAt(arr,4,New_Book("자료구조","김구",5)); Array_SetAt(arr,8,New_Book("알고리즘","이순신",9)); Array_SetAt(arr,12,New_Book("디자인패턴","정약용",13));
원하는 대로 보관하는지 확인합니다.
View_Array(arr);
도서 번호로 검색합시다. 이 부분은 별도의 함수로 작성할게요. 보관한 도서와 보관하지 않은 도서 번호를 확인합니다.
Simul_FindNum(arr,20); Simul_FindNum(arr,21);
도서 번호로 보관한 도서를 삭제합니다. 이 부분도 별도의 함수로 작성할게요.
Simul_RemoveNum(arr,9);
삭제 동작이 정상적인지 확인하기 위해 전체 정보를 출력합니다.
View_Array(arr); SimulEnd(arr); }
도서 번호로 검색하는 함수를 작성합시다.
void Simul_FindNum(Array *arr,int bnum) { Book *book = 0;
도서 번호 -1 인덱스에 보관한 도서 개체를 얻어옵니다.
book = (Book *)Array_GetAt(arr,bnum-1);
만약 유효하면 검색 성공한 것입니다.
if(book) { printf("검색 결과:"); Book_View(book); }
그렇지 않다면 실패한 것입니다.
else { printf("<%d>번 책을 찾을 수 없습니다.\n",bnum); } }
도서 번호로 보관한 도서 개체를 삭제하는 함수를 작성합시다.
void Simul_RemoveNum(Array *arr,int bnum) { Book *book = 0;
먼저 도서 번호 -1 인덱스의 도서를 구합니다.
book = (Book *)Array_GetAt(arr,bnum-1);
만약 유효하면 도서가 있는 것입니다.
if(book) {
이 때는 도서 개체를 소멸합니다.
Delete_Book(book);
그리고 해당 인덱스에 0으로 보관한 값을 설정합니다.
Array_SetAt(arr,bnum-1,0); }
유효하지 않으면 해당 번호의 도서는 없는 것입니다.
else { printf("<%d>번 책을 찾을 수 없습니다.\n",bnum); } }
이상으로 동적 배열의 테스트를 마칠게요.
//Program.c #include "Array.h" #include "Book.h" void View_Array(Array *arr) { Book *book = 0; Iterator seek = Array_Begin(arr); Iterator end = Array_End(arr); printf("-----보유 도서 목록-----\n"); for( ;seek!=end;seek++) { book = (Book *)(*seek); if(book) { Book_View(book); } } } void SimulEnd(Array *arr) { Book *book = 0; Iterator seek = Array_Begin(arr); Iterator end = Array_End(arr); for( ;seek!=end;seek++) { book = (Book *)(*seek); if(book) { Delete_Book(book); } } Delete_Array(arr); } void Simul_Find(Array *arr,const char *title) { Book *book = 0; Iterator seek = Array_Begin(arr); Iterator end = Array_End(arr); for( ;seek!=end;seek++) { book = (Book *)(*seek); if(book && (Book_CompareTitle(book,title)==0)) { printf("검색 결과:"); Book_View(book); return; } } printf("<%s> 책을 찾을 수 없습니다.\n",title); } void Simul_Remove(Array *arr,const char *title) { Book *book = 0; Iterator seek = Array_Begin(arr); Iterator end = Array_End(arr); for( ;seek!=end;seek++) { book = (Book *)(*seek); if(book && (Book_CompareTitle(book,title)==0)) { Array_Erase(arr,seek); Delete_Book(book); printf("삭제 성공!\n"); return; } } printf("<%s> 책을 찾을 수 없습니다.\n",title); } void Simul_Seq() { Array *arr = New_Array(); Array_PushBack(arr,New_Book("C언어","홍길동",10)); Array_PushBack(arr,New_Book("C++언어","강감찬",20)); Array_PushBack(arr,New_Book("자료구조","김구",5)); Array_PushBack(arr,New_Book("알고리즘","이순신",9)); Array_PushBack(arr,New_Book("디자인패턴","정약용",13)); View_Array(arr); Simul_Find(arr,"C언어"); Simul_Find(arr,"이데아이론"); Simul_Remove(arr,"자료구조"); View_Array(arr); SimulEnd(arr); } void Simul_OrderAdd(Array *arr,Book *book) { Book *stored_book = 0; Iterator seek = Array_Begin(arr); Iterator end = Array_End(arr); for( ;seek!=end;seek++) { stored_book = (Book *)(*seek); if(stored_book && (Book_CompareAuthor(stored_book,book->author)>=0)) { break; } } Array_Insert(arr,seek,book); } void Simul_Order() { Array *arr = New_Array(); Simul_OrderAdd(arr,New_Book("C언어","홍길동",10)); Simul_OrderAdd(arr,New_Book("C++언어","강감찬",20)); Simul_OrderAdd(arr,New_Book("자료구조","김구",5)); Simul_OrderAdd(arr,New_Book("알고리즘","이순신",9)); Simul_OrderAdd(arr,New_Book("디자인패턴","정약용",13)); View_Array(arr); Simul_Find(arr,"C언어"); Simul_Find(arr,"이데아이론"); Simul_Remove(arr,"자료구조"); View_Array(arr); SimulEnd(arr); } void Simul_FindNum(Array *arr,int bnum) { Book *book = 0; book = (Book *)Array_GetAt(arr,bnum-1); if(book) { printf("검색 결과:"); Book_View(book); } else { printf("<%d>번 책을 찾을 수 없습니다.\n",bnum); } } void Simul_RemoveNum(Array *arr,int bnum) { Book *book = 0; book = (Book *)Array_GetAt(arr,bnum-1); if(book) { Delete_Book(book); Array_SetAt(arr,bnum-1,0); } else { printf("<%d>번 책을 찾을 수 없습니다.\n",bnum); } } void Simul_Index() { Array *arr = New_Array(); Array_SetSize(arr,100,0); Array_SetAt(arr,9,New_Book("C언어","홍길동",10)); Array_SetAt(arr,19,New_Book("C++언어","강감찬",20)); Array_SetAt(arr,4,New_Book("자료구조","김구",5)); Array_SetAt(arr,8,New_Book("알고리즘","이순신",9)); Array_SetAt(arr,12,New_Book("디자인패턴","정약용",13)); View_Array(arr); Simul_FindNum(arr,20); Simul_FindNum(arr,21); Simul_RemoveNum(arr,9); View_Array(arr); SimulEnd(arr); } int main() { Simul_Seq(); Simul_Order(); Simul_Index(); return 0; }