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 9: return 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 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 |