언어 자료구조 알고리즘/디딤돌 자료구조 (C언어)

[C언어 자료구조] 2.3 동적 배열 테스트

언제나휴일 2016. 11. 26. 12:53
반응형

[C언어 자료구조] 2.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 파일의 소스 코드입니다.

//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;

}

반응형