동적 배열 활용
동적 배열은 주소록, 비디오 대여점 관리, 워드 프로세서 등 관리 대상이 동일 타입의 집합이면서 크기가 가변적인 모든 프로그램에 응용 가능하다. 자료의 집합을 다룰 수 있으므로 원시적인 데이터 베이스라고 할 수 있다. 다음 예제는 앞에서 만들었던 동적 배열을 사용한 간단한 주소록 프로그램이다. 한 사람의 신상을 담는 구조체를 정의하고 이 구조체를 요소로 가지는 동적 배열을 만들었다. 배열의 요소 타입만 변경되었으므로 ELETYPE 매크로만 수정하고 나머지 전역변수와 관련 함수는 그대로 사용하면 된다.
예 제 : JusoArray |
#include <Turboc.h>
struct tag_NameCard
{
char name[10];
char tel[15];
char addr[32];
};
#define ELETYPE tag_NameCard
==================== 소스 생략 =====================
ELETYPE *ar; ~ UnInitArray까지 DynArray 예제와 동일함
void main()
{
char ch;
unsigned i;
tag_NameCard Temp;
InitArray(10,5);
for (;;) {
printf("명령을 입력하세요(1:보기, 2:추가, 3:삭제, Q:종료) > ");
ch=getch();
printf("\n");
if (ch == 'Q' || ch == 'q') {
break;
}
switch(ch) {
case '1':
if (num == 0) {
printf("등록된 내용이 없습니다.\n");
} else {
for (i=0;i<num;i++) {
printf("%d, 이름:%s, 전화:%s, 주소:%s\n",i,ar[i].name,
ar[i].tel,ar[i].addr);
}
}
break;
case '2':
printf("이름을 입력하세요(9자) : ");gets(Temp.name);
printf("전화번호를 입력하세요(14자) : ");gets(Temp.tel);
printf("주소를 입력하세요(31자) : ");gets(Temp.addr);
Append(Temp);
break;
case '3':
printf("삭제할 번호를 입력하세요 : ");scanf("%d",&i);
if (i < num) {
Delete(i);
} else {
printf("등록되지 않은 번호입니다.\n");
}
break;
}
}
UnInitArray();
}
tag_NameCard가 사람 한명의 신상을 저장하는 인명 구조체이다. 예제에서는 간단하게 이름, 주소, 전화 번호 등의 기본 정보만 포함했지만 원한다면 얼마든지 더 상세한 정보들을 멤버로 포함할 수 있다. 이런 구조체 타입을 가리키는 ar은 동적 구조체 배열이며 ar이 곧 주소록 정보라고 할 수 있다.
구조체를 담는 배열 자체가 동적으로 관리되므로 얼마든지 많은 정보를 개수에 상관없이 저장할 수 있다. main 함수는 이 배열을 활용하여 입력, 삭제, 출력 등을 하는데 출력 루프, 사용자로부터의 입력 처리, 그리고 약간의 에러 처리 코드만 있을 뿐 배열 자체를 관리하는 일에 대해서는 신경쓰지 않는다. 특별히 어려운 코드는 없으므로 직접 분석해 보기 바란다.
'프로그래밍' 카테고리의 다른 글
[C특강] 배열을 사용한 효과적인 이중 링크드 리스트 구현 (0) | 2011.07.23 |
---|---|
C로 구현한 Queue (0) | 2011.07.18 |
동적배열 (0) | 2011.07.16 |
How to cross-compile BASH for Android (0) | 2011.06.08 |
ioremap (0) | 2011.05.09 |