티스토리 뷰

주소록 관리 시스템

프로그램 설계 : 개요

주소록 관리를 위하여 파일에 보관되며 검색,수적, 삭제가 가능한 시스템 구현
* 프로그램 구현 시 처리 대상 자료 : 이름 , 생년월일, 주소, 나이 , 전화번호

* 유효성 검사를 위하여 다양한 라이브러리 함수를 사용할 수 있음
* 프로그램의 기능 수행을 위한 요구분석을 주의 깊게 수행해야 함
* 현재 시간 등을 반홖하는 함수로 time 함수를 이용할 수 있음
* 이진파일의 입출력은 fread, fwrite를 이용한다 있음

 

  • 메뉴 방식으로 작업 선택
  • 보안을 위하여 이진 파일로 데이터 저장
  • 출생연도 입력 시 나이 계산 자동으로 입력
  • 이름순 전체 출력
  • 이름 검색 후 출력, 수정, 삭제
  •  

시간 변환

* 주소록 입력
* 주소록 출력
* 주소록 검색
* 나이 자동계산

 

  • asctime : 시간구조체를 문자로 변환
  • ctime : 시간변수를 문자로 변환
  • gmtime : UTC 시간으로 변환
  • localtime : 지역 시간으로 변환
  • strftime : 날짜와 시간으로 이루어진 문자열을 strct tm으로 변환

자료 구조 정의


struct phone {
    char name[20];
    char phone[14];
    int birth;
    int age;
    char addr[50];
};

 

입력 검증

데이터를 입력하지 않고 넘어가는 경우를 검사


while(1){
    fflush(stdin);
    printf("\n이름 : ");
    gets(mp[cnt].name);
    if ( strlen(mp[cnt].name) > 0 )
        break;
    printf("\n이름을 입력하세요 ");
}

 

숫자 입력인지 확인


while(1){
    fflush(stdin);
    printf(“출생연도 : ”);
    scanf(“%d”,&mp[cnt].birth);
    if ( mp[cnt].birth > 0 )
        break;
    }

 

코드 분석

* 검색 문자의 위치를 찾을 수 있는 함수: strchr
* 문자열의 길이를 반홖하는 함수 : strlen
* 현재 시간 정보를 얻을 수 있는 함수 : time
* 이진 파일의 읽기와 쓰기에 이용하는 함수 : fread, fwrite

 

나이계산


int calAge(int birth){
    time_t timer;
    struct tm *t;

    timer = time(NULL);
    
    t = localtime(&timer);

    return t->tm_year + 1900- birth;
}


>

이전 데이터 파일 쓰기


void savePhones(PHONE* mp, int cnt)
{ FILE * fp;
    int i;
    fp = fopen ("myPhones.bin" , "wb+");
    if (fp == NULL) perror ("Error opening file");
    else {
        fwrite(&cnt, sizeof(int), 1, fp);
            fwrite(mp, sizeof(PHONE), cnt, fp);
    fclose (fp); }
}

 

이전 데이터 파일 읽기


PHONE* readPhones(PHONE* mp, int* cn)
{
    FILE * fp;
    int i,cnt;
    cnt = *cn;
    fp = fopen ("myPhones.bin" , "rb+");
    if (fp == NULL) perror ("Error opening file");
    else {
        fread(&cnt, sizeof(int),1,fp);
        mp = (PHONE*)realloc(mp,sizeof(PHONE)*(cnt+1));
        fread(mp, sizeof(PHONE), cnt, fp);
        fclose (fp);
}
    *cn = cnt;
    return mp;
}

 

데이터 삭제


PHONE* deletePhone(PHONE* mp, int dn, int* cn) {
    int i,cnt;
    cnt = *cn;
    for(i=dn;i<cnt-1;i++)
            mp[i] = mp[i=1];
    *cn = cnt-1;
    return mp;
}

 

댓글
© 2018 webstoryboy