본문 바로가기

프로필/공모전 출품작 및 수상작

구글 놀 공모전 출품작

나만의 전화번호부 만들기!
 
C언어를 사용해 만든 [나만의 전화번호부]를 소개하겠습니다.
 
먼저 실행 방법과 실행 화면을 설명 후, 프로그램 제작 방법을 알려드리겠습니다.
 
 
* 프로그램 실행 방법 및 실행 화면
 

1. 실행파일인 ChoiBoYunB.exe를 실행했을 때 나타나는 첫화면입니다.

 

※ 프로그램 설명 및 주의사항

- ChoiBoYunB.exe 실행파일과 input.txt 파일은 반드시 같은 폴더 안에 있어야 합니다.

- input.txt 파일이 존재해야 되고 입력 형식은 반드시 아래와 같아야 합니다.

- ChoiBoYun, 01012345678, Seoul Gangnam Gaepo

- Delete, Searching은 Insert로 추가 데이타를 삽입한 후에 실행해야 합니다.

- 메뉴 1~6중 한가지를 실행한 뒤 다른 메뉴를 다시 Cellular Phone Program에서 선택

하려면 <Enter>키를 눌러야 합니다.

 

① Insert : 추가 데이타 삽입

② Delete : 추가로 삽입한 데이타 삭제

③ Display : 최초 입력 파일인 input.txt 파일과 추가로 삽입한 데이타 모두 보기

④ Searching : 추가로 입력된 데이타 검색

⑤ Count : input.txt 에 저장된 모든 사람의 수

( input.txt파일을 변경하고 실행하면 변경내용을 반영해 사람 수 계산

⑥ Exit : 종료

 

2. 숫자3을 입력시 나타나는 화면입니다.

( 최초리스트 생성 파일인 input.txt 파일을 읽어오기 위해서 )

※ 참고 (input.txt파일 : 예시로 보여드리기 위해 임의로 작성한 주소입니다.)
 
 
 
 

3. 숫자5를 입력시 나타나는 화면입니다.

( input.txt에 총 저장된 사람 수를 구하기 위해서 )

 

4. input.txt파일을 변경한 후 Display와 Count를 실행해보기 위해 우선 input.txt파일을 아래와 같이 변경합니다. ( 2개 데이타를 추가하였습니다. )

Alice, 01355871215, ChungChung JinChun Sayang
J
ungYang, 01112314479, Jeju Jeju Segupo

 

 

5. 숫자3을 입력시 나타나는 화면 두번째 입니다.

( 최초리스트 생성 파일인 input.txt 파일의 변경된 내용을 읽어오기 위해서 )

 

6. 숫자5를 입력시 나타나는 화면 두번째 입니다.

( 변경된 input.txt 파일의 총 저장된 사람 수를 구하기 위해서 )

 
 

7. 숫자1을 입력시 나타나는 화면입니다. ( 추가 데이터를 삽입하기 위해서 )

- 아래와같이 SoRyun, 01000127830, Seoul Guro A 를 입력합니다.

 
 

8. 숫자3을 입력시 나타나는 화면 세번째 입니다.

( input.txt 파일과 추가로 삽입한 데이타를 모두 보기 위해서 )

- SoRyun, 01000127830, Seoul Guro A 이 추가된 것을 볼 수 있습니다.

 
 

9. 숫자1을 입력하여 1개의 데이타를 더 추가하였습니다.

추가한 1개 데이타는 YeWon, 01045444576, Seoul Songpa Jamsil 입니다.

 

10. 숫자4를 입력시 나타나는 화면입니다. ( 추가로 입력된 데이터를 검색하기 위해서 )

- 이름으로 검색하기 위해서 검색방법 선택에 숫자1을 입력, 검색할 내용 입력에

SoRyun 을 입력 -> SoRyun의 정보를 보여줌 ( 이름, 전화번호, 주소 )

 

11. 숫자4를 입력시 나타나는 화면입니다. ( 추가로 입력된 데이터를 검색하기 위해서 )

- 전화번호로 검색하기 위해서 검색방법 선택에 숫자2를 입력, 검색할 내용 입력에

01045444576을 입력 -> YeWon 의 정보를 보여줌 ( 이름, 전화번호, 주소 )

 

12. 숫자2를 입력합니다. ( 데이터를 삭제하기 위해서 ) - YeWon 을 삭제

숫자2를 입력시 나타나는 화면 -> 삭제한 YeWon 의 정보를 보여줌

 

13. 숫자3을 입력시 나타나는 화면 네번째 입니다. 

( input.txt 파일과 삽입, 삭제한 데이타를 모두 보기 위해서 )

- 위에서 삭제했듯이 YeWon, 01045444576, Seoul Songpa Jamsil 이 삭제된 것을

볼 수 있습니다.

 
 

14. 숫자6을 입력 ( 종료하기 위해서 )

- 6을 입력하고 <Enter>키를 누르면 ChoiBoYunB.exe가 자동으로 종료됩니다.

 
 

15. 숫자8을 입력시 나타나는 화면입니다.

( 에러제어 코딩 - 1에서 6까지의 숫자만 입력 )

 

16. 숫자2를 입력 ( 에러 제어 코딩 - 존재하지 않는 데이터를 입력시 삭제 불가 에러 )

- 존재하지 않는 GwanWoo 라는 이름을 입력

 
 

17. 숫자4를 입력후 검색할 내용에 존재하지 않는 내용인 GwanWoo를 입력합니다.

( 에러 제어 코딩 - 존재하지 않는 이름을 검색시 검색 불가 에러 )

 
 

18. 숫자4를 입력후 검색할 내용에 존재하지 않는 내용인 01600091234를 입력합니다.

( 에러 제어 코딩 - 존재하지 않는 전화번호를 검색시 검색 불가 에러 )

 
 

* 프로그램 소스 및 소스 설명

// 파일 삽입을 위해 #include라는 전처리기 지시자 사용

#include <stdio.h> // printf, scanf를 사용하기 위해서 사용하는 헤더파일
#include <string.h> // strcpy함수를 정의, 문자 관련 명령을 사용하기 위해 사용하는 헤더파일
#include <stdlib.h> // exit() atoi() rand() srand() system()등을 사용하기 위해 사용하는 헤더파일
#include <conio.h> // 텍스트화면을 처리하기 위해 사용하는 헤더파일

 

// 기호 상수를 정의하기 위해 사용

#define NAME_SIZE 20
#define PHONE_SIZE 15
#define ADDRESS1_SIZE 30
#define ADDRESS2_SIZE 30
#define ADDRESS3_SIZE 30
 
typedef struct // 데이터형의 새로운 이름을 부여하기 위해서 typedef 사용
{
 char name[NAME_SIZE]; // name의 크기는 20
 char phone[PHONE_SIZE]; // phone의 크기는 15
 char address1[ADDRESS1_SIZE]; // address1의 크기는 30
 char address2[ADDRESS2_SIZE]; // address2의 크기는 30
 char address3[ADDRESS3_SIZE]; // address3의 크기는 30
 char text[50]; // text의 크기는 50
 FILE *file_ptr; // 파일을 열기 위한 파일 포인터 file_ptr를 선언
}telnode;
 

/* 링크드 리스트인 link_node 구조체 */

typedef struct link_node
{
 telnode item;
 struct link_node *next;
};

typedef struct
{
 telnode *head; // 헤드 포인터
 int length; // 노드의 개수
} LinkedListType;
 

/* 구조체에 대한 typedef형을 정의하고 포인터를 사용해서 가리킨다. */
typedef struct link_node Pbook;
typedef struct link_node *Plink;


void insert(telnode temp, Plink *head_node) // 데이타를 삽입하는 함수

 Plink temp_node=*head_node;
 Plink New_node;

 /* 첫번째 요소를 추가한다. */
 New_node = (Plink) malloc(sizeof(Pbook)); // malloc() : 원하는 만큼의 메모리를 할당하여 그에대한 포인터는 반환
 New_node->item=temp;
 New_node->next=NULL;

 if(*head_node)
 {
  while(temp_node->next)
   temp_node=temp_node->next;
  temp_node->next=New_node;  
 }
 else
  *head_node=New_node;
}
telnode delete_list(char name[], Plink *head_node) // 데이타 삭제하는 함수
{
 Plink temp=*head_node;
 Plink deltemp=temp->next;
 telnode temp_node;
 if(!head_node)
 {
  printf("\n [ 입력된 자료가 없습니다! ]\n"); // 에러 제어 코드 ( 입력된 자료가 없을때 )
  exit(1);
 }
 else
 {
  if(strcmp(temp->item.name, name)==0)
  {
   temp_node=temp->item;
   *head_node=deltemp;
   free(temp);
   return temp_node;
  }
  else
  {
   while(deltemp)
   {
    if(strcmp(deltemp->item.name, name)==0)
    {
     temp_node = deltemp->item;
     temp->next=deltemp->next;
     free(deltemp);
     return temp_node;
    }
    else
    {
     temp=deltemp;
     deltemp=deltemp->next;
    }
   }
  }
 }
 printf("\n [ 입력된 데이타를 찾을 수가 없습니다! ]\n"); // 에러 제어 코드 ( 없는 데이타 검색시 )
 printf("\n [ input파일이 아닌 추가로 입력한 데이타를 적어주세요! ]\n");
 strcpy(temp_node.name,"error"); // 에러 제어 코드
 strcpy(temp_node.phone,"error"); // 에러 제어 코드
 strcpy(temp_node.address1,"error"); // 에러 제어 코드
 strcpy(temp_node.address2,"error"); // 에러 제어 코드
 strcpy(temp_node.address3,"error"); // 에러 제어 코드
 return temp_node;
}
void display_list(char sdata[], Plink *head_node) // 데이타를 출력하는 함수
{
 Plink temp=*head_node;
 char text[50]; // 읽기를 할 내용을 넣을 메모리 변수
 FILE *file_ptr; // 파일을 열기 위한 파일 포인터 file_ptr를 선언
 
  file_ptr = fopen("input.txt", "r");

/* input.txt라는 파일명을 사용하기 위해 파일을 open함. 파일을 읽기 위해 “r"을 사용함. 자료가 입력되어 있는 input.txt파일이 존재하면 그 자료를 대상으로 각 함수를 실행함. */

      printf("【 파일에 입력된 데이타 출력 】 : \n");
   while(fgets(text, 50, file_ptr) != NULL)
    {
    printf("\n %s", text); // 화면 출력         
    }
    // 만일 input.txt 파일이 존재하지 않는다면 사용자로 하여금 데이타를 입력받아 기록함.
   while(temp) {
    printf("\n\n %s, %s, %s %s %s\n", temp->item.name, temp->item.phone, temp->item.address1, temp->item.address2, temp->item.address3);
    temp=temp->next;
   }
  fclose(file_ptr); // open한 파일을 닫을 때 사용
}
void searching_data(int stype,char sdata[], Plink *head_node) // 데이타를 검색하는 함수
{
 Plink temp=*head_node;
 if(!head_node)
 {
  printf("\n [ 입력된 데이타가 없습니다! ]\n"); // 에러 제어 코드 ( 입력된 데이타가 부재시 )
  exit(1);
 }
 else
 {
 if(stype==1)   // stype=1 이면 이름
 {
  while(temp)
  {
   if(strcmp(temp->item.name, sdata)==0)
   {
    printf("\n [ 검색된 데이타 ]\n 이름 : %s, 전화번호 : %s, 주소 : %s %s %s\n", temp->item.name, temp->item.phone, temp->item.address1, temp->item.address2, temp->item.address3);
    return;
   }
   temp=temp->next;
  }
  // 에러 제어 코드 ( 없는 데이타 검색시 )
  printf("\n [ 입력한 이름과 일치하는 데이타를 찾을 수 없습니다! ]\n");
  printf("\n [ input파일이 아닌 추가로 입력한 데이타를 적어주세요! ]\n");
 }
 else if(stype==2)   // stype=2이면 전화번호
 {
  temp=*head_node;
  while(temp)
  {
   if(strcmp(temp->item.phone, sdata)==0)
   {
    printf("\n [ 검색된 데이타 ]\n 이름 : %s, 전화번호 : %s, 주소 : %s %s %s\n", temp->item.name, temp->item.phone, temp->item.address1, temp->item.address2, temp->item.address3);
    return;
   }
   temp=temp->next;
  }
  // 에러 제어 코드 ( 없는 데이타 검색시 )
  printf("\n [ 입력한 전화번호와 일치하는 데이타를 찾을 수 없습니다! ]\n");
  printf("\n [ input파일이 아닌 추가로 입력한 데이타를 적어주세요! ]\n");
 }
 }
}
int GetFileLines(FILE *file_ptr) //지정된 파일로 부터 라인수를 계수하기 위한 함수
{
   int iLines=0;
   char text[50];
   char *cTemp;
   while(1)
   {
        cTemp=fgets(text,50,file_ptr);
        if(cTemp==0) //읽은 줄이 파일의 끝이라면 루프탈출
           break;
        iLines++;
    };
    return iLines;
}
void menu(int select, Plink *A)
{
 telnode temp;
 int stype;
 int iCustCounts=0; //총 저장된 사람의 수
 char sdata[15]; 
 char c;
 char text[50];
 FILE *file_ptr;
 switch(select)
 {
 
 case 1: // 구분값이 1이면 추가로 데이타를 삽입
  printf("\n【 이름 입력 (※ 띄어쓰지 말고 ChoiBoYun처럼 입력)】: ");
  printf("\n ☞ ");
  scanf("%s", &temp.name);
  printf("\n【 전화번호 입력 (※ 띄어쓰지 말고 01012345678처럼 입력)】: ");
  printf("\n ☞ ");
  scanf("%s", &temp.phone);
  printf("\n【 주소 입력 (※ 시,구,동을 띄어쓰기로 Seoul GwangJin Jayang처럼 모두 입력)】: ");
  printf("\n ☞ ");
  scanf("%s %s %s", &temp.address1, &temp.address2, &temp.address3);
  insert(temp, A);
  printf("\n ▷ 입력 완료 ◁ \n");
  printf("\n ※ Cellular Phone Program에서 메뉴를 선택하려면 <Enter>키를 눌러주세요! \n");
  c = getch(); //읽은 결과를 보여주고 사용자 키 대기
  break;
 case 2: // 구분값이 2이면 추가로 삽입한 데이타 삭제
  printf("\n【 삭제할 이름 입력 】: ");
  scanf("%s", &sdata);
  temp=delete_list(sdata, A);
  printf("\n [ 삭제한 데이타 ] : ");
  printf("\n [ 이름 : %s ] ", temp.name);
  printf("\n [ 전화번호 : %s ] ", temp.phone);
  printf("\n [ 주소 : %s %s %s ] ", temp.address1, temp.address2, temp.address3);
  printf("\n ※ Cellular Phone Program에서 메뉴를 선택하려면 <Enter>키를 눌러주세요! \n");
  c = getch();
  break;
 case 3: // 구분값이 3이면 모든 데이타 출력
  display_list(A, A);
  printf("\n ※ Cellular Phone Program에서 메뉴를 선택하려면 <Enter>키를 눌러주세요! \n");
  c = getch();
  break;
 case 4: // 구분값이 4이면 추가로 입력된 데이타 검색
  printf("\n【 검색 방법 선택 ☞ 1. 이름   2. 전화번호 】: ");
  scanf("%d", &stype);
  printf("\n【 검색할 내용 입력 】: ");
  scanf("%s", &sdata);
  searching_data(stype, sdata, A);
  printf("\n ※ Cellular Phone Program에서 메뉴를 선택하려면 <Enter>키를 눌러주세요! \n");
  c = getch();
  break;
 case 5: // 구분값이 5이면 input.txt에 총 저장된 사람수 계산
  file_ptr = fopen("input.txt", "r"); // 파일을 open함.
        if(file_ptr != NULL)
  {
   iCustCounts = GetFileLines(file_ptr); //총 저장된 사람수 구하는 함수 호출
   while(fgets(text, 150, file_ptr) != NULL)
    {
    printf(" %s", text);
    printf("\n");         
    }
   printf("\n【 총 저장된 사람수는 %d 명 입니다. 】\n",iCustCounts);
   printf("\n ※ Cellular Phone Program에서 메뉴를 선택하려면 <Enter>키를 눌러주세요! \n\n");
   system("Pause");
   fclose(file_ptr); // open한 파일을 닫을 때 사용
   break;
  } 
 case 6: // 구분값이 6이면 종료
  printf("\n【 프로그램 종료 】\n");
  exit(0);
  break;
 default : // 구분값이 1~6 사이가 아닌 다른 숫자이면 에러 제어 코드 ( 1~6 중에서 사용 ) 
  printf("\n ※ 잘못 선택하셨습니다!!(1~6번 중에서 선택해 주세요!) \n");
  printf("\n ※ Cellular Phone Program에서 메뉴를 선택하려면 <Enter>키를 눌러주세요! \n");
  c = getch();
  break;
 }
}
int main()
{
 Plink A=NULL;
 int select;
 
  while(select !=6)
   {
   system("cls"); // 도스 명령어를 사용하여 화면을 지우기 위해
   printf("\n ◈   나만의 전화번호부   ◈            by Google Knol's 최보윤   \n\n");
   printf("┏━━━━━━━━━━━━ Cellular Phone Program ━━━━━━━━━━━━┓\n");
   printf("┃ 1. Insert   2. Delete   3. Display   4. Searching   5. Count   6. Exit ┃\n");
   printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
   printf(" \n【 위 프로그램 설명 】\n");
   printf(" 1 : 추가 데이타 삽입, 2 : 추가로 삽입한 데이타 삭제, 3 : 모든 데이타 보기\n");
   printf(" 4 : 추가로 입력된 데이타 검색, 5 : input.txt에 총 저장된 사람수, 6 : 종료\n");
   printf("\n【 Cellular Phone Program에서 메뉴를 선택해주세요! ※1~6중에서 선택 】\n");
   printf("\n ☞ ");
   scanf("%d", &select);
   menu(select, &A);
   }
}

 

이상입니다.

자세한 설명을 드리려고 노력했는데 도움이 되셨으면 좋겠습니다.

그럼, 각자 자신만의 전화번호부를 만들어서 사용해 보시길 바랍니다.

 

http://knol.google.co.kr/k/-/-/1l4nechlih93v/4#