학부 시절 만든 프로그램이다.
후배가 만들어달라고 해서 만들어준거 같은데 (기억이 가물가물)
지금 보니 코드가 "생각보다" 깔끔하다.
내가 옛날에 저런걸 만들었었다니..ㄷㄷㄷ
else if와 주석 다는 스타일이 좀 달라지긴 했다.
#include <STDIO.H>
#include <CONIO.H>
#include <STRING.H>
// 학생 타입의 구조체 선언
typedef struct record
{
char number[10]; // 학번 (9글자)
char name[11]; // 이름 (10글자)
char depart[21]; // 과 (20글자)
char phone[15]; // 전화번호(14글자)
char hobby[18]; // 취미(17글자)
char visible; // 화면에 표시 여부(값이 'F'이면 화면에 표시 안함, 'T'이면 표시
} STUDENT;
// 함수들의 프로토 타입 선언부분
void show_logo(); // 로고를 보여주는 함수
void show_menu(); // 메뉴를 보여주고 입력받는 함수
void show_msg(char *); // 에러 메시지를 보여주는 함수
void menu1(); // 메뉴 1
void menu2(); // 메뉴 2
void menu3(); // 메뉴 3
int read_data(); // 데이터를 사용자로부터 입력받는 함수
int write_data(STUDENT); // 데이터를 파일에 쓰는 함수
int find_data(STUDENT); // st형식에 맞는 데이터를 찾아준다.
int delete_data(STUDENT); // st형식에 맞는 데이터를 지워준다.
int inputmsg(char *); // 문자열 출력후, 한 글자를 입력 받는 함수
int instr(char *, char *); // 첫번째 문자열에서 두번째 문자열이 위치하는 위치를 반환해준다.
STUDENT stu; // 위에 선언한 구조체 STUDENT 형식으로 stu변수 선언
void main()
{
show_logo(); // 로고 출력
show_menu(); // 메뉴 출력
}
void show_logo()
{
printf("\n\n\t\t*****************************************");
printf("\n\t\t* *");
printf("\n\t\t* Student Information Management System *");
printf("\n\t\t* *");
printf("\n\t\t* Ver 1.0 *");
printf("\n\t\t* *");
printf("\n\t\t* Copyright Division of Info. & Tech. *");
printf("\n\t\t* *");
printf("\n\t\t*****************************************\n");
}
void show_menu()
{
int inputchar;
while(1) // 무한루프
{
// 메뉴를 출력한다
printf("\t1. 입력 - 새로운 학생 정보를 입력 합니다.\n");
printf("\t2. 찾기 - 조건에 맞는 학생 정보를 찾아줍니다.\n");
printf("\t3. 삭제 - 조건에 맞는 학생 정보를 삭제합니다.\n");
printf("\t4. 종료 - 프로그램을 종료합니다.\n");
inputchar = inputmsg("\n\t원하시는 번호를 눌러주세요. >> ");
if(inputchar == '1') // inputchar, 즉 입력받은 문자가 '1'이라면
{
menu1(); // menu1함수를 호출
} else if(inputchar == '2')
{
menu2();
} else if(inputchar == '3')
{
menu3();
} else if(inputchar == '4')
{
break;
} else {
printf("\t번호를 잘못 입력하셨습니다. 다시 입력해 주세요.\n\n"); // show_msg함수 호출
}
}
}
void show_msg(char *str)
{
// 메시지를 출력하기 위한 함수
printf("\n\t▷▷▷ %s", str);
}
void menu1()
{
// 1번 메뉴를 선택했을때
show_msg("1. 입력 메뉴를 선택하셨습니다. 내용을 입력해주세요.\n");
if(read_data())
{
show_msg("입력이 되었습니다.\n");
} else {
show_msg("입력이 중지되었습니다.\n");
}
}
void menu2()
{
// 2번 메뉴를 선택했을때
int inputchar;
STUDENT search_stu;
int numberofdata;
show_msg("2. 찾기 메뉴를 선택하셨습니다. 찾을 조건을 입력해주세요.\n\n");
strcpy(search_stu.number, "");
strcpy(search_stu.name, "");
strcpy(search_stu.phone, "");
strcpy(search_stu.depart, "");
strcpy(search_stu.hobby, "");
while(1)
{
printf("\t\t1) 전체 목록\n");
printf("\t\t2) 이름을 기준으로 찾기\n");
printf("\t\t3) 학번을 기준으로 찾기\n");
printf("\t\t4) 학과를 기준으로 찾기\n");
printf("\t\t5) 취미를 기준으로 찾기\n");
printf("\t\t6) 취소\n");
inputchar = inputmsg("\n\t\t원하시는 번호를 눌러주세요. >> ");
if(inputchar < '1' || inputchar > '6')
{
printf("\t\t번호를 잘못 입력하셨습니다. 다시 입력해 주세요.\n\n");
continue;
}
if(inputchar == '1')
{
// 아무 처리도 하지 않음
} else if(inputchar == '2')
{
printf("\t\t이름을 입력해주세요. >> ");
gets(search_stu.name);
} else if(inputchar == '3')
{
printf("\t\t학번을 입력해주세요. >> ");
gets(search_stu.number);
} else if(inputchar == '4')
{
printf("\t\t학과를 입력해주세요. >> ");
gets(search_stu.depart);
} else if(inputchar == '5')
{
printf("\t\t취미를 입력해주세요. >> ");
gets(search_stu.hobby);
} else if(inputchar == '6')
{
break;
}
numberofdata = find_data(search_stu);
if(numberofdata == -1)
{
printf("\t\t데이터베이스 파일이 존재하지 않습니다.\n\n");
} else {
printf(" %d명의 학생이 검색되었습니다.\n\n", numberofdata);
}
break;
}
}
void menu3()
{
// 3번 메뉴를 선택했을때
int inputchar;
STUDENT search_stu;
show_msg("3. 삭제 메뉴를 선택하셨습니다. 삭제할 조건을 입력해주세요.\n\n");
strcpy(search_stu.number, "");
strcpy(search_stu.name, "");
strcpy(search_stu.phone, "");
strcpy(search_stu.depart, "");
strcpy(search_stu.hobby, "");
while(1)
{
printf("\t\t1) 전체 삭제\n");
printf("\t\t2) 이름을 기준으로 삭제하기\n");
printf("\t\t3) 학번을 기준으로 삭제하기\n");
printf("\t\t4) 학과를 기준으로 삭제하기\n");
printf("\t\t5) 취미를 기준으로 삭제하기\n");
printf("\t\t6) 취소\n");
inputchar = inputmsg("\n\t\t원하시는 번호를 눌러주세요. >> ");
if(inputchar < '1' || inputchar > '6')
{
printf("\t\t번호를 잘못 입력하셨습니다. 다시 입력해 주세요.\n\n");
continue;
}
if(inputchar == '1')
{
// 아무 처리도 하지 않음
} else if(inputchar == '2')
{
printf("\t\t이름을 입력해주세요. >> ");
gets(search_stu.name);
} else if(inputchar == '3')
{
printf("\t\t학번을 입력해주세요. >> ");
gets(search_stu.number);
} else if(inputchar == '4')
{
printf("\t\t학과를 입력해주세요. >> ");
gets(search_stu.depart);
} else if(inputchar == '5')
{
printf("\t\t취미를 입력해주세요. >> ");
gets(search_stu.hobby);
} else if(inputchar == '6')
{
break;
}
delete_data(search_stu);
break;
}
}
int delete_data(STUDENT st)
{
STUDENT stu;
FILE *fp;
int i = 0;
long fsz;
// 파일을 열어보고
fp = fopen("database.db", "r+");
// 파일이 없으면
if(fp == NULL)
{
printf("\t\t파일이 없습니다.\n\n");
return 0;
}
fseek(fp, 0L, SEEK_END);
fsz = ftell(fp);
rewind(fp);
fread(&stu, sizeof(stu), 1, fp);
while(ftell(fp) < fsz + sizeof(stu))
{
if(instr(stu.name, st.name) && instr(stu.number, st.number) &&
instr(stu.depart, st.depart) && instr(stu.hobby, st.hobby) &&
instr(stu.phone, st.phone) && stu.visible == 'T')
{
// 조건 맞으면
stu.visible = 'F';
fseek(fp, i * sizeof(stu), SEEK_SET);
// stu내용을 파일에 쓴다.
fwrite(&stu, 1, sizeof(stu), fp);
}
i++;
fread(&stu, sizeof(stu), 1, fp);
}
fclose(fp);
return 1;
}
int read_data()
{
// 사용자로부터 데이터를 입력받는 함수.
// 제대로 입력 받아졌으면 1을, 제대로 입력 받아지지 않았다면 0을 리턴한다.
// 메시지 출력후
printf("\t\t1) 학번: ");
gets(stu.number);
if(!strcmp(stu.number, ""))
{
return 0;
}
printf("\t\t2) 이름: ");
gets(stu.name);
if(!strcmp(stu.name, ""))
{
return 0;
}
printf("\t\t3) 과: ");
gets(stu.depart);
if(!strcmp(stu.depart, ""))
{
return 0;
}
printf("\t\t4) 전화번호: ");
gets(stu.phone);
if(!strcmp(stu.phone, ""))
{
return 0;
}
printf("\t\t5) 취미: ");
gets(stu.hobby);
if(!strcmp(stu.hobby, ""))
{
return 0;
}
stu.visible = 'T';
write_data(stu);
return 1;
}
int write_data(STUDENT st)
{
// 파일로 쓰는 함수
// 제대로 쓰여졌다면 1을, 쓰는 도중에 에러가 생기면 0을 리턴한다.
FILE *fp;
fp = fopen("database.db", "r+");
if(fp == NULL)
{
// 파일이 존재하지 않으면 새로 만든다.
fp = fopen("database.db", "w+");
if(fp == NULL)
{
return 0;
}
}
// 파일 끝부분으로 이동한다.
fseek(fp, 0L, SEEK_END);
// st의 내용을 쓴다.
fwrite(&st, sizeof(st), 1, fp);
// 파일을 닫는다.
fclose(fp);
return 1;
}
int find_data(STUDENT st)
{
STUDENT tst;
FILE *fp;
int count = 0, i = 0, inputchar;
fp = fopen("database.db", "r+");
if(fp == NULL)
{
return -1;
} else {
printf("┌────┬────┬───────┬────────┬───────────┐");
printf("│ 학번 │ 이름 │ 학과 │ 연락처 │ 취미 │");
printf("├────┼────┼───────┼────────┼───────────┤");
fread(&tst, sizeof(st), 1, fp);
while(!feof(fp))
{
if(instr(tst.name, st.name) && instr(tst.number, st.number) &&
instr(tst.depart, st.depart) && instr(tst.hobby, st.hobby) &&
instr(tst.phone, st.phone) && tst.visible == 'T')
{
printf("│%8s│%8s│%14s│%16s│%22s│", tst.number, tst.name,
tst.depart, tst.phone, tst.hobby);
count++;
i++;
}
if(i == 20)
{
printf("└────┴────┴───────┴────────┴───────────┘");
while(1)
{
inputchar = inputmsg(" 계속 출력할까요?(Y/N)");
if(inputchar == 'Y' || inputchar == 'y')
{
printf("┌────┬────┬───────┬────────┬───────────┐");
printf("│ 학번 │ 이름 │ 학과 │ 연락처 │ 취미 │");
printf("├────┼────┼───────┼────────┼───────────┤");
i = 0;
break;
} else if(inputchar == 'N' || inputchar == 'n')
{
return count;
} else {
continue;
}
}
}
fread(&tst, sizeof(st), 1, fp);
}
printf("└────┴────┴───────┴────────┴───────────┘");
}
fclose(fp);
printf("\n");
return count;
}
int inputmsg(char *str)
{
// 문자열 출력후 글자 한개를 입력받는 함수
int inputchar;
printf(str); // 문자열 출력후
inputchar = getche(); // 문자 한개를 입력받은후
printf("\n"); // 줄바꿈 한뒤
return inputchar; // 입력받은 문자를 리턴한다.
}
int instr(char *sourceStr, char *findStr)
{
// sourceStr안에 findStr문자열이 들어있는지 검사하는 함수
int i, j, flag = 0;
if(strlen(sourceStr) < strlen(findStr))
{
return flag;
}
if(!strcmp(findStr, ""))
{
return 1;
}
for(i = 0; i < (int)strlen(sourceStr); i++)
{
if(sourceStr[i] == findStr[0])
{
flag = i;
for(j = 0; j <= (int)strlen(findStr); j++)
{
if(sourceStr[flag + j] != findStr[j])
{
flag = -1;
break;
}
}
if(flag == -1)
{
flag = 0;
break;
}
return flag + 1;
}
}
return flag;
}