#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 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]);
}