CAFE

C 프로그래밍

전화번호부 관리 (구조체, 저장, 읽기, 정렬, 검색)

작성자별은빛나고|작성시간16.12.05|조회수14,360 목록 댓글 0

1. 전화번호 추가 2. 이름 검색 3. 전화번호 검색

4. 이름순 정렬 5. 생년월일순 정렬 6. 전화번호부 저장하기

7. 전화번호부 불러오기 8. 전화번호 삭제 9. 종료

 

§ 전화번호부는 이름(영어), 전화번호(xxx-xxxx-xxxx), 생년월일(19941115) 3개 정보를 가지는 구조체 배열(사이즈 100) 에 저장한다.

 

§ 프로그램 사용자는 1명의 전화번호를 키보드로 입력한다. (메뉴 1 등록)

§ 프로그램 사용자는 이름을 키보드로 입력받아 전화번호와 생년월일 정보를 찾아 화면으로 출력

할 수 있다. (메뉴 2)

§ 프로그램 사용자는 전화번호를 키보드로 입력받아 이름과 생년월일 정보를 찾아 화면으로 출력

할 수 있다. (메뉴 3)

§ 프로그램 사용자는 이름(알파벳) 순으로 전화번호부를 화면에 출력할 수 있다. (메뉴 4, 옵션)

§ 프로그램 사용자는 생년월일 순으로 전화번호부를 화면에 출력할 수 있다. (메뉴 5, 옵션)

§ 프로그램 사용자는 전화번호부를 파일에 저장한다. 파일이름을 입력받은 후 저장한다. (메뉴 6)

§ 프로그램 사용자는 전화번호부 파일의 이름을 입력받은 후 불러온다. (메뉴 7)

§ 프로그램 사용자는 이름을 입력받은 후 해당 정보를 전화번호부에서 삭제한다. (메뉴 8, 옵션)

§ 프로그램 사용자는 특정 키(:메뉴 선택 시 9)를 누르면 프로그램이 종료된다. (메뉴 9)

§ 위 메뉴를 포함하고 필요할 경우 추가 메뉴를 더 만들 수 있다.

 

<문제 출처 : http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=265533531 >


#include <stdio.h>    // scanf, printf...
#include <string.h>    // strcmp
 
struct phone_book {
    char name[20];
    char phone[15];
    int birth;
};
 
void print_menu();
void print_list(struct phone_book list);
void add(struct phone_book *list);
void search(struct phone_book list[], int kind);
void sort(struct phone_book list[], int kind);
void save(struct phone_book list[]);
void load(struct phone_book list[]);
void del(struct phone_book list[]);
void all(struct phone_book list[]);
 
enum {NAME, PHONE, BIRTH};    // 0, 1, 2
 
int qty;    // 등록된 학생 수 
 
int main(void)
{
    int job;    // 메뉴 선택 
    
    struct phone_book list[100= {"\0", };    // 100명 
           
    while (1) {
        print_menu();
 
        scanf("%d"&job);
    
        switch (job) {
            case 1: add(&list[qty]);        break;    // 추가 
            case 2: search(list, NAME);        break;    // 이름 검색 
            case 3: search(list, PHONE);    break;    // 전화번호 검색 
            case 4: sort(list, NAME);        break;    // 이름 정렬 
            case 5: sort(list, BIRTH);        break;    // 생년월일 정렬 
            case 6: save(list);                break;    // 전화번호부 저장 
            case 7: load(list);                break;    // 전화번호부 읽기 
            case 8: del(list);                break;    // 전화번호 삭제 
            case 9return 0;                break;    // 종료 
            
            case 0: all(list);                break;    // 전체 출력 
        }
 
        system("pause");
    }
    
    return 0;
}
 
void print_menu()
{
    system("cls");
    
    printf("1. 전화번호 추가\n");
    printf("2. 이름 검색\n");
    printf("3. 전화번호 검색\n");
    printf("4. 이름순 정렬\n");
    printf("5. 생년월일순 정렬\n");
    printf("6. 전화번호부 저장\n");
    printf("7. 전화번호부 읽기\n");
    printf("8. 전화번호 삭제\n");
    printf("9. 종료\n\n 선택 : ");
}
 
void print_list(struct phone_book list)
{
    printf("이름 : %-20s 전화번호 : %-15s 생년월일 : %d\n", list.name, list.phone, list.birth); 
}
 
void add(struct phone_book *list)
{
    int i;
    
    if (qty == 99) {
        printf("더 이상 추가할 수 없습니다.\n");
        return;
    } 
 
    fflush(stdin);            // 키보드 버퍼 비우기 
 
    printf("이름(영어) : ");
 
    for (i = 0; i < 20; i++) {
        if ((list->name[i] = getche()) == 13) {        // '\n'
            break;
        }
    }
    list->name[i] = '\0';            // 마지막 글자('\n')를 null문자로 
 
    if (i == 0) {                            // 이름이 입력되지 않으면 취소 
        printf("전화번호 추가  취소\n"); 
        return;    
    }
     
    printf("전화번호(xxx-xxxx-xxxx) : ");    
    gets(list->phone);
    printf("생년월일(19941115) : ");
    scanf("%d"&list->birth);
 
    print_list(*list);    // 입력된 내용 출력 
 
    qty++;
}
 
void search(struct phone_book list[], int kind)
{
    int i;
    char n_tmp[20];                            // 검색할 이름 
 
    if        (kind == NAME)    printf("검색할 이름 : ");
    else if (kind == PHONE) printf("검색할 전화번호 : "); 
 
    fflush(stdin);                            // 키보드 버퍼 비우기 
    gets(n_tmp);                            // 검색할 이름이나 전화번호 
    
    for (i = 0; i < qty; i++) {
        if ((kind == NAME && strcmp(list[i].name, n_tmp) == 0||
            (kind == PHONE && strcmp(list[i].phone, n_tmp) == 0)) {
            print_list(list[i]);
        }
    }
}
 
void sort(struct phone_book list[], int kind)
{
    int i, j;
    struct phone_book tmp;            // 임시 저장 공간 
    
    for (i = 0; i < qty-1; i++) {
        for (j = qty-1; j > i; j--) {
            if ((kind == NAME && strcmp(list[j-1].name, list[j].name) > 0||
                (kind == BIRTH && list[j-1].birth > list[j].birth)) {
 
                tmp = list[j];            // 두 자료를 교환 
                list[j] = list[j-1];
                list[j-1= tmp;
            }
        }
    }                                    // 버블 정렬 
    
    for (i = 0; i < qty; i++) print_list(list[i]);    // 정렬 결과 출력 
}
cs
 
void save(struct phone_book list[])
{
    int i;
    char fname[20= "\0";
    FILE *fp;
    
    fflush(stdin);    
    printf("저장할 파일 이름 : ");
 
    for (i = 0; i < 20; i++) {
        if ((fname[i] = getche()) == 13) {        // '\n'
            break;
        }
    }
    fname[i] = '\0';
    
    if (i == 0) {                            // 파일 이름이 입력되지 않으면 취소 
        printf("파일 저장 취소\n"); 
        return;    
    }
     
    if ((fp = fopen(fname, "w")) == NULL) {                    // 파일 열기 
        printf("파일 생성 실패!!!\n");
        return;
    }
 
    for (i = 0; i < qty; i++) {    
        if ((fprintf(fp, "%s %s %d\n", list[i].name, list[i].phone, list[i].birth, fp) == 0)) {
            printf("파일 쓰기 실패!!!\n");
            return;
        }
    }
    
    fclose(fp);                                                // 파일 닫기 
}
 
void load(struct phone_book list[])
{
    int i;
    char fname[20= "\0";
    FILE *fp;
    
    fflush(stdin);    
    printf("읽어올 파일 이름 : ");
 
    for (i = 0; i < 20; i++) {
        if ((fname[i] = getche()) == 13) {        // '\n'
            break;
        }
    }
    fname[i] = '\0';
    
    if (i == 0) {
        printf("파일 읽기 취소\n"); 
        return;    
    }
         
    if ((fp = fopen(fname, "r")) == NULL) {
        printf("파일 열기 실패!!!\n");
        return;
    }
 
    qty = 0;
 
    while (!feof(fp)) {
        if ((fscanf(fp, "%s %s %d\n", list[qty].name, list[qty].phone, &list[qty].birth, fp) == 0)) {
            printf("파일 읽기 실패!!!\n");
            return;
        }
        qty++;
    }
    
    fclose(fp);
}
 
void del(struct phone_book list[])
{
    int i, j;
    char n_tmp[20];
    
    fflush(stdin);    
    printf("삭제할 이름 : ");
    gets(n_tmp);
    
    for (i = 0; i < qty; i++) {
        if (strcmp(list[i].name, n_tmp) == 0) {            // 삭제할 곳이면 
            for (j = i; j < qty-1; j++) list[j] = list[j+1];    // 뒤의 자료들을 앞으로 당김 
 
            qty--;                                // 인원 수 줄이기 
 
            strset(list[qty].name, '\0');        // 마지막 자료 지우기 
            strset(list[qty].phone, '\0');
            list[qty].birth = 0;
        }
    }
 
    for (i = 0; i < qty; i++) print_list(list[i]);
}
 
void all(struct phone_book list[])
{
    int i;
    
    for (i = 0; i < qty; i++)     print_list(list[i]);
}
cs


다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼