IT보안관의 공부 클라우드
전화번호 관리 프로젝트(C프로그래밍 파워업그레이드) 본문
메뉴는 총 6가지.
1. 전화번호 입력
2. 전체 정보 출력
3. 전화번호 검색
4. 전화번호 삭제
5. 전화번호 변경
6. 종료
입력된 정보는 프로젝트 폴더에 PhoneNumbers.dat 파일에 저장.
데이터의 저장은 malloc를 이용하여 Heap에 저장
소스코드
/* Name : main.c ver 1.3
* Content : main 함수
* Implementation : LHH
* 1.1: SEARCH,DELETE 기능 추가
* 1.3: 파일에 저장 불러오기 추가
* 1.3: CHANGE 추가
* 1.4: 저장 로드 함수 변경
* Last modified 2020/08/11
*/
#include "common.h"
#include "screenOut.h"
#include "phoneFunc.h"
enum{INPUT=1, SHOWALL, SEARCH, DELETE, CHANGE, QUIT};
/*함 수: int main(void)
*기 능: 사용자 선택 처리
*반 환: 정상 종료 시 0
*/
int main(){
LoadDataFromFileInStruct();
int inputMenu = 0;
while(1){
ShowMenu();
fputs("선택하세요: ",stdout);
scanf("%d", &inputMenu);
fflush(stdin);
switch(inputMenu){
case INPUT:
InputPhoneData();
break;
case SHOWALL:
ShowAllData();
break;
case SEARCH:
SearchPhoneData();
break;
case DELETE:
DeletePhoneData();
break;
case CHANGE:
ChangePhoneData();
break;
}
if(inputMenu==QUIT){
StoreDataToFileInStruct();
puts("이용해 주셔서 고마워요~");
break;
}
}
return 0;
}
// end of File
/* Name : common.h ver 1.0
* Content : 공통 ANSI 표준 헤더
* Implementation : LHH
*
* Last modified 2020/08/05
*/
#ifndef __COMMON_H__
#define __COMMON_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#endif
// end of file
/* Name : screenOut.h ver 1.1
* Content : 콘솔 출력을 위한 함수 선언
* Implementation : LHH
* 1.1: ShowPhoneInfoByPtr 추가
* Last modified 2020/08/10
*/
#ifndef __SCREENOUT_H__
#define __SCREENOUT_H__
#include "phoneData.h"
void ShowMenu(void);
void ShowPhoneInfo(phoneData phone);
void ShowPhoneInfoByPtr(phoneData * phone);
#endif
//end of file
/* Name : phoneFunc.c ver 1.4
* Content : 전화번호 컨트롤 함수들의 선언
* Implementation : LHH
* 1.1 : SearchPhoneData, DeletePhoneData 추가
* 1.2 : StoreDataToFile, LoadDataFromFile 함수 추가
* 1.3 : ChangePhoneData 함수 추
* 1.4 : StoreDataToFileInStruct, LoadDataFromFileInStruct 함수 추가
* Last modified 2020/08/11
*/
#ifndef __PHONEFUNC_H__
#define __PHONEFUNC_H__
#include "phoneData.h"
void InputPhoneData(void);
void ShowAllData(void);
void SearchPhoneData(void);
void DeletePhoneData(void);
void StoreDataToFile(void);
void LoadDataFromFile(void);
void ChangePhoneData(void);
void StoreDataToFileInStruct(void);
void LoadDataFromFileInStruct(void);
#endif
//end of file
/* Name : phoneData.h ver 1.0
* Content : 구조체 phoneData 의 선언 및 정의
* Implementation : LHH
*
* Last modified 2020/08/05
*/
#ifndef __PHONEDATA_H__
#define __PHONEDATA_H__
#define NAME_LEN 30
#define PHONE_LEN 30
typedef struct __phoneData{
char name[NAME_LEN];
char phoneNum[PHONE_LEN];
}phoneData;
#endif
//end of file
/* Name : screenOut.c ver 1.3
* Content : 콘솔 출력을 위한 함수 정의
* Implementation : LHH
* 1.1: ShowMenu함수에 전화번호 검색, 삭제 기능 추가
* 1.2: ShowPhoneInfoByPtr 함수 추가
* 1.3: ShowMenu함수에 전화번호 변경 추가
* Last modified 2020/08/11
*/
#include "common.h"
#include "phoneData.h"
/*함 수: void ShowMenu(void)
기 능: 선택을 위한 메뉴 출력
반 환: void
*/
void ShowMenu(void){
system("timeout 5");
system("cls");
puts("--------------메뉴--------------");
puts("1. 전화번호 입력");
puts("2. 전체 정보 출력");
puts("3. 전화번호 검색");
puts("4. 전화번호 삭제");
puts("5. 전화번호 변경");
puts("6. 종료");
puts("--------------------------------");
printf("선택 >> ");
}
/*함 수: void ShowPhoneInfo(phoneData phone)
기 능: 이름과 전화번호 정보 출력
반 환: void
*/
void ShowPhoneInfo(phoneData phone){
puts("┏-------------------------");
printf("┃▶이름: %s \n",phone.name);
printf("┃▶전화번호: %s \n",phone.phoneNum);
puts("┗-------------------------");
}
void ShowPhoneInfoByPtr(phoneData *phone){
puts("┏-------------------------");
printf("┃▶이름: %s \n",phone->name);
printf("┃▶전화번호: %s \n",phone->phoneNum);
puts("┗-------------------------");
}
//end of file
/* Name : phoneFunc.c ver 1.7
* Content : 전화번호 컨트롤 함수
* Implementation : LHH
* 1.1: 함수 InputPhoneData, ShowAllData의 구현 완료
* 1.2: SearchPhoneData, DeletePhoneData 함수 추가
* 1.3: phoneList를 포인터 배열로 변경, 출력 함수 ShowPhoneInfoByPtr 함수로 변경
* 1.4: 동명이인을 처리하기 함수확장
* 1.5: StoreDataToFile, LoadDataFromFile 함수 추가
* 1.6: ChangePhoneData 함수 추가
* 1.7 : StoreDataToFileInStruct, LoadDataFromFileInStruct 함수 추가
* Last modified 2020/08/11
*/
#include "common.h"
#include "phoneData.h"
#include "screenOut.h"
#define LIST_NUM 100
int numOfData=0;
phoneData *phoneList[LIST_NUM];
/*함 수: void InputPhoneData(void)
*기 능: 전화번호 관련 데이터 입력 받아서 저장
*반 환: void
*/
void InputPhoneData(void){
if (numOfData>LIST_NUM){
fputs("저장 공간이 부족합니다.",stdout);
return;
}
int i;
phoneData *data;
data=(phoneData*)malloc(sizeof(phoneData));
fputs("이름 입력:",stdout);
gets(data->name );
fputs("전화번호 입력:",stdout);
gets(data->phoneNum);
//비교
for(i=0;i<numOfData;i++){
if((strcmp(data->name,phoneList[i]->name)==0) && (strcmp(data->phoneNum,phoneList[i]->phoneNum) == 0)){
fputs("이미 입력된 데이터 입니다.",stdout);
free(data);
return ;
}
}
phoneList[numOfData]=data;
numOfData++;
fputs("입력이 완료되었습니다.",stdout);
StoreDataToFileInStruct();
}
/*함 수: void ShowAllData(void)
*기 능: 저장된 데이터 전체 출력
*반 환: void
*/
void ShowAllData(void){
int i;
for(i=0;i<numOfData;i++){
ShowPhoneInfoByPtr(phoneList[i]);
}
fputs("출력이 완료되었습니다.",stdout);
}
void SearchPhoneData(void){
char sName[NAME_LEN];
int i;
int ret=0;
fputs("찾는 이름은?:",stdout);
gets(sName);
for(i=0;i<numOfData;i++){
if(strcmp(sName,phoneList[i]->name)==0){
ShowPhoneInfoByPtr(phoneList[i]);
ret=1;
//break;
}
}
if(ret=1) fputs("검색이 완료되었습니다.",stdout);
else fputs("찾는 이름의 데이터가 없습니다.",stdout);
}
void DeletePhoneData(void){
char sName[NAME_LEN];
int num[LIST_NUM]={0,};// 동명이인을 처리하기위한 배열
int i;
int j=0; //동명이인을 처리하기 위한 변수
fputs("찾는 이름은?:",stdout);
gets(sName);
for(i=0;i<numOfData;i++){
if(strcmp(sName,phoneList[i]->name)==0){
num[j]=i;
j++;
}
}
if(j==0){
fputs("찾는 이름이 없습니다.",stdout);
return ;
}
if(j>1){
for(i=0;i<j;i++){
printf("선택 %d:\n",i+1);
ShowPhoneInfoByPtr(phoneList[num[i]]);
}
fputs("선택 :",stdout);
scanf("%d",&j);
i=num[j-1];
numOfData--;
}
else{
for(i=0;i<numOfData;i++){
if(strcmp(sName,phoneList[i]->name)==0){
numOfData--;
break;
}
}
}
for(; i<numOfData;i++){
phoneList[i]=phoneList[i+1];
}
fputs("삭제가 완료되었습니다.",stdout);
StoreDataToFileInStruct();
}
void StoreDataToFile(void){
FILE *fp;
int i;
fp=fopen("PhoneNumbers.txt","w");
if(fp==NULL){
fputs("파일 오픈 오류",stdout) ;
return ;
}
fwrite(&numOfData,sizeof(int),1,fp);
for(i=0;i<numOfData;i++){
fprintf(fp,"%s\n%s\n",phoneList[i]->name,phoneList[i]->phoneNum);
free(phoneList[i]);
}
fputs("저장 완료",stdout);
fclose(fp);
}
void LoadDataFromFile(void){
FILE *fp;
phoneData *buf;
int i;
int j=0;
fp=fopen("PhoneNumbers.txt","r");
if(fp==NULL){
fputs("파일 오픈 오류",stdout);
return 0;
}
fread(&numOfData,sizeof(int),1,fp);
for(i=0; i<numOfData; i++){
phoneList[i]=(phoneData*)malloc(sizeof(phoneData));
fgets(phoneList[i]->name, NAME_LEN, fp);
j=strlen(phoneList[i]->name);
phoneList[i]->name[j-1]=0;
fgets(phoneList[i]->phoneNum, PHONE_LEN, fp);
j=strlen(phoneList[i]->phoneNum);
phoneList[i]->phoneNum[j-1]=0;
}
fputs("출력 완료",stdout);
fclose(fp);
}
void ChangePhoneData(void){
char sName[NAME_LEN];
char sNum[PHONE_LEN];
int num[LIST_NUM]={0,};// 동명이인을 처리하기위한 배열
int i;
int j=0; //동명이인을 처리하기 위한 변수
fputs("찾는 이름은?:",stdout);
gets(sName);
for(i=0;i<numOfData;i++){
if(strcmp(sName,phoneList[i]->name)==0){
num[j]=i;
j++;
}
}
if(j==0){
fputs("찾는 이름이 없습니다.",stdout);
return ;
}
if(j>1){
for(i=0;i<j;i++){
printf("선택 %d:\n",i+1);
ShowPhoneInfoByPtr(phoneList[num[i]]);
}
fputs("선택 :",stdout);
scanf("%d",&j);
getchar();
i=num[j-1];
}
else{
for(i=0;i<numOfData;i++){
if(strcmp(sName,phoneList[i]->name)==0){
break;
}
}
}
fputs("변경할 전화번호는? ",stdout);
gets(sNum);
strcpy(phoneList[i]->phoneNum,sNum);
fputs("변경이 완료되었습니다.",stdout);
StoreDataToFileInStruct();
}
void StoreDataToFileInStruct(void){
FILE *fp;
int i;
fp=fopen("PhoneNumbers.dat","w");
if(fp==NULL){
fputs("파일 오픈 오류",stdout) ;
return 0;
}
for(i=0;i<numOfData;i++){
fwrite(phoneList[i],sizeof(phoneData),1,fp);
}
fputs("저장 완료",stdout);
fclose(fp);
}
void LoadDataFromFileInStruct(void){
FILE *fp;
phoneData *buf;
int i;
int j=0;
fp=fopen("PhoneNumbers.dat","r");
if(fp==NULL){
fputs("파일 오픈 오류",stdout);
return 0;
}
while(1){
buf=(phoneData*)malloc(sizeof(phoneData));
fread(buf,sizeof(phoneData),1,fp);
if(feof(fp)!=0)break;
phoneList[numOfData]=buf;
// printf("%s %s %d\n",phoneList[numOfData]->name,phoneList[numOfData]->phoneNum,numOfData);
numOfData++;
}
fputs("출력 완료",stdout);
fclose(fp);
}
//end of file
'개발 > C' 카테고리의 다른 글
배열과 포인터 (0) | 2021.01.17 |
---|---|
리틀엔디안 빅엔디안 (0) | 2020.12.17 |
원하는 갯수의 숫자 배열 입력 후 정렬(C프로그래밍 파워 업그레이드) (0) | 2020.08.14 |
버블소트(C프로그래밍 파워업그레이드) (0) | 2020.08.07 |
문자열 함수 strlen, strcpy, strcmp 따라만들기(C프로그래밍 파워업그레이드) (0) | 2020.08.06 |
Comments