5.1.3 동적 배열 테스트
앞에서 만든 동적 배열이 잘 동작하는지 확인하는 시뮬레이션 코드를 작성합시다. 여기에서는 순차적으로 자료를 보관하는 예와 특정 키순으로 보관하는 예, 인덱스를 사용하는 예를 들게요.
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;
}
프로젝트 결과물
관련 게시글
'언어 자료구조 알고리즘 > [C]디딤돌 자료구조와 알고리즘' 카테고리의 다른 글
[디딤돌 자료구조와 알고리즘] 5.3.1 큐(QUEUE) 설계 (0) | 2016.05.23 |
---|---|
[디딤돌 자료구조와 알고리즘] 5.3 큐(QUEUE) (0) | 2016.05.23 |
[디딤돌 자료구조와 알고리즘] 5.2 연결리스트 - 5.2.3 연결리스트 테스트 (0) | 2016.05.16 |
[디딤돌 자료구조와 알고리즘] 5.2 연결리스트 - 5.2.2 연결리스트 구현 (0) | 2016.05.16 |
[디딤돌 자료구조와 알고리즘] 5.2 연결리스트 - 5.2.1 연결리스트 설계 (0) | 2016.05.16 |
[디딤돌 자료구조와 알고리즘] 5.1 배열 - 5.1.2 동적 배열 구현 (0) | 2016.05.16 |
[디딤돌 자료구조와 알고리즘] 5.1 배열 - 5.1.1 동적 배열 설계 (0) | 2016.05.16 |
[디딤돌 자료구조와 알고리즘] 5. 선형 자료구조 - 개요 (0) | 2016.05.16 |
[디딤돌 자료구조와 알고리즘] 4.3.2 병합 정렬 알고리즘 구현 (0) | 2016.04.10 |
[디딤돌 자료구조와 알고리즘 with C] 4.3 병합 정렬 알고리즘 (0) | 2016.04.10 |