C 언어 기반 개인 주소록 관리 시스템 구현

이전에 C 언어 를 이용 하여 개인 주소록 관리 시스템 에 관 한 과 제 를 완 성 했 는데 주로 연락처 의 추가,찾기,삭제,수정,출력 과 파일 의 기록 과 읽 기,그리고 디저트 기능 인 아 날로 그 통화 의 실현 원리 도 쉽게 이해 할 수 있 고 글 의 끝 에 소개 할 것 이다.
주 프레임 워 크:

1.함수 설명
이곳 의 함수 성명 은 주로 전체 시스템 의 기능 을 명확 하 게 이해 하기 위해 서 입 니 다.여 기 는 너무 많은 소 개 를 하지 않 습 니 다.그리고 구조 체 링크 의 생 성 은 각 기능 코드 부분 을 관통 시 켰 기 때문에 없어 서 는 안 된다.
2.연락처 의 추가
이 부분 은 주로 연락처 의 성명,주소,전화,QQ 번호 와 메 일 박스(물론 다른 기능 이 필요 하 므 로 스스로 추가 할 수 있 습 니 다)와 관련 되 는데 배열 의 조작 이 불편 한 전제 에서 링크 의 꼬리 삽입 법 을 사용 하여 혁신 적 인 결점 을 계속 열 고 새로운 결점 의 주 소 를 끝 점 으로 가리 키 며 끝 점 을 계속 뒤로 이동 시 킵 니 다.한편,새로 만 든 결점 은 추 가 된 선후 순서에 따라 연결 된다(아래 그림 을 참고 하면 신속하게 이해 할 수 있 고 이 그림 은 네트워크 에서 기원 된다).물론 그 중의 일부 조건 제한 도 없어 서 는 안 된다.전화,QQ 번호,메 일 박스

int Addpeo()  //     
{
 int t,n,a;
 char flag='y';  //           
 ptcs p=head,q; 
 while(flag!='n'&&flag!='N')  //         
 {
 q=(ptcs)malloc(sizeof(pcs));  //    
 p->next=q;  //        
 p=q;    
 q->next=NULL;  //         ,    
 printf("
\t :
"); printf("\t\t :"); scanf("\t\t%s",q->chat.name); printf("\t\t :"); scanf("\t\t%s",q->chat.add); printf("\t\t :"); scanf("\t\t%s",q->chat.tel); do { n=0; // if(strlen(q->chat.tel)!=11) // , { n=1; printf("\t\t , :"); scanf("\t\t%s",q->chat.tel); } else { for(t=0;t<11;t++) { if(q->chat.tel[t]<'0'||q->chat.tel[t]>'9') { n=1; printf("\t\t , :"); scanf("\t\t%s",q->chat.tel); break; } } } }while(n); // QQ printf("\t\tQQ :"); scanf("\t\t%s",q->chat.tecent); do { n=0; if(strlen(q->chat.tecent)>10) // 10 QQ , { n=1; printf("\t\t QQ , :"); scanf("\t\t%s",q->chat.tecent); } else { for(t=0;t<10;t++) { if(q->chat.tecent[t]<'0'||q->chat.tecent[t]>'9') { n=1; printf("\t\t QQ , :"); scanf("\t\t%s",q->chat.tecent); break; } } } }while(n); // printf("\t\tEmail:"); scanf("\t\t%s",q->chat.email); do { // @ ( ) a=0; for(t=0;q->chat.email[t]!='\0';t++) { if(q->chat.email[t]=='@') a++; //@ 1 } if(a!=1) { printf("\t\t , :"); scanf("\t\t%s",q->chat.email); } }while(a!=1); // @ , 1 printf("
\t ?(Y/N)"); scanf("\t%c",&flag); } return 0; }
3.연락처 조회
이 단 계 는 검색 을 옮 겨 다 니 는 것 으로 모두 세 가지 방식 을 설정 했다.링크 지침 을 정의 하 는 전제 에서 링크 를 옮 겨 다 니 며 정 보 를 비교 하여 연락처 가 존재 하 는 지 여 부 를 판단 하고 존재 하면 사용자 에 게 직접 표시 하 며 존재 하지 않 으 면 기능 옵션 을 되 돌려 준다.

int Query()
{
 int m,n;  //m     
 char flag='y';
 ptcs p=head->next;  
 while(flag!='n'&&flag!='N') //       
 {
 printf("
"); printf("\t************* **************
"); printf("\t-----------------------------------
"); printf("\t 1.
"); printf("\t 2.
"); printf("\t 3. QQ
"); printf("\t 4.
"); printf("\t-----------------------------------
"); printf("
\t :"); scanf("\t%d",&m); do { n=0; if(m!=1&&m!=2&&m!=3&&m!=4) { n=1; printf("\t , :"); scanf("\t%d",&m); } }while(n); // if(!p) // { printf("\t !
"); return 0; } if(m==1) { char nm[15]; // printf("\t :"); scanf("\t%s",nm); // , , while(p!=NULL&&strcmp(p->chat.name,nm)!=0) p=p->next; // if(!p) { printf("\t !
"); return 0; } printf("\t :%s
",p->chat.add); printf("\t :%s
",p->chat.tel); printf("\tQQ :%s
",p->chat.tecent); printf("\tEmail:%s
",p->chat.email); } if(m==2) { char te[20]; // printf("\t :"); scanf("\t%s",te); while(p!=NULL&&strcmp(p->chat.tel,te)!=0) p=p->next; if(!p) { printf("\t !
"); return 0; } printf("\t :%s
",p->chat.name); printf("\t :%s
",p->chat.add); printf("\tQQ :%s
",p->chat.tecent); printf("\tEmail:%s
",p->chat.email); } if(m==3) { char qq[15]; // qq printf("\t QQ :"); scanf("\t%s",qq); while(p!=NULL&&strcmp(p->chat.tecent,qq)!=0) p=p->next; if(!p) { printf("\t !
"); return 0; } printf("\t :%s
",p->chat.name); printf("\t :%s
",p->chat.add); printf("\t :%s
",p->chat.tecent); printf("\tEmail:%s
",p->chat.email); } if(m==4) return 0; printf("\t ?(Y/N)"); //Y while , scanf("\t%c",&flag); } return 0; }
4.연락처 삭제
이 부분 은 이름 에 따라 삭제 하고 링크 를 통 해 지정 한 노드 를 조회 하 며 포인터 로 이 노드 의 이전 노드 가 다음 노드 를 직접 가리 키 도록 하여 연락처 에 대한 삭제 작업 을 실현 합 니 다.상해도봉

int Delete()
{
 char nm[20];  //         
 char flag='y';
 ptcs p=head->next,bh,pre;  //bh,pre         
 if(!p)  //         
 {
 printf("\t      !
"); return 0; } while(flag!='n'&&flag!='N') { p=head->next; printf("\t :"); scanf("\t%s",nm); while(p!=NULL&&strcmp(p->chat.name,nm)!=0) // { pre=p; p=p->next; // , , p } if(!p) { printf("\t !
"); return 0; } bh=p->next; // next bh, if(p==head->next) head->next=bh; else pre->next=bh; // , printf("\t !
"); printf("\t ?(Y/N)"); scanf("\t%c",&flag); } return 0; }
5.연락처 정보의 수정
연락처 의 수정 에 대해 이것 은 링크 의 특정한 노드 를 수정 하 는 것 입 니 다.링크 를 옮 겨 다 니 며 지 정 된 노드 를 조회 하고 직접 수정 하 는 것 입 니 다.수정 과정 에서 일부 형식 제한 조건 을 계속 사용 합 니 다.만약 에 특정한 항목 을 입력 하 는 것 이 요구 에 부합 되 지 않 으 면 이 입력 이 요구 에 부합 할 때 까지 반복 적 으로 입력 합 니 다.말 이 많 지 않 으 면 코드 를 달 아 라.

//    
int changename(ptcs p)
{
 scanf("\t%s",p->chat.name);
 printf("\t    !
"); return 0; } // int changeadd(ptcs p) { scanf("\t%s",p->chat.add); printf("\t !
"); return 0; } // int changetel(ptcs p) { int n,t; scanf("\t%s",p->chat.tel); do { n=0; if(strlen(p->chat.tel)!=11) { n=1; printf("\t , :"); scanf("\t%s",p->chat.tel); } else { for(t=0;t<11;t++) { if(p->chat.tel[t]<'0'||p->chat.tel[t]>'9') { n=1; printf("\t , :"); scanf("\t%s",p->chat.tel); break; } } } } while(n); printf("\t !
"); return 0; } // QQ int changeQQ(ptcs p) { int n,t; scanf("%s",p->chat.tecent); do { n=0; if(strlen(p->chat.tecent)!=10) { n=1; printf("\t QQ , :"); scanf("\t%s",p->chat.tecent); } else { for(t=0;t<10;t++) { if(p->chat.tecent[t]<'0'||p->chat.tecent[t]>'9') { n=1; printf("\t QQ , :"); scanf("\t%s",p->chat.tecent); break; } } } } while(n); printf("\t !
"); return 0; } // int changeEmail(ptcs p) { int t,a; scanf("\t%s",p->chat.email); do { a=0; for(t=0;p->chat.email[t]!='\0';t++) { if(p->chat.email[t]=='@') a++; } if(a!=1) { printf("\t , :"); scanf("\t%s",p->chat.email); } } while(a); printf("\t !
"); return 0; }
6.연락처 의 출력
출력 에 관 해 서 는 입력 순서에 따라 연락 처 를 순서대로 출력 하 는 것 이다.

//        
int Display()
{
 ptcs p=head->next;  
 if(!p)  //         
 {
 printf("\t      !
"); return 0; } printf("
\t********************************** *************************************

"); printf("\t \t \t\t\t \t\tQQ \t\tEmail
"); printf("\t---------------------------------------------------------------------------------
"); while(p) { printf("\t%-8s%-24s%-16s%-16s%-20s
",p->chat.name,p->chat.add,p->chat.tel,p->chat.tecent,p->chat.email); p=p->next; // printf("\t---------------------------------------------------------------------------------
"); } return 0; }
7.파일 의 기록 과 읽 기
새 파일 을 만 들 고 파일 의 권한 을 지정 하여 지정 한 파일 에 데 이 터 를 기록 하여 파일 에 대한 전체 기록 작업 을 수행 합 니 다.이 읽 기 동작 은 만들어 진 파일 에 접근 하여 fgets 함수 로 파일 의 정 보 를 가 져 오고 지정 한 문자 배열 에 저장 한 다음 하나씩 출력 하 는 것 입 니 다.

//       
int fwrite()
{
 ptcs p=head->next;
 FILE* fp;
 char filename[30];
 if(!p)
 {
 printf("\t      !");
 return 0;
 }
 printf("\t          :");
 scanf("\t%s",filename);
 if((fp=fopen(filename,"a+"))==NULL)
 {
 printf("\t      !
"); system("pause"); // return 0; } fprintf(fp,"********************************** *************************************

"); fprintf(fp," \t \t\t\t \t\tQQ \t\tEmail
"); fprintf(fp,"---------------------------------------------------------------------------------
"); while(p) { fprintf(fp,"%-8s%-24s%-16s%-16s%-20s
",p->chat.name,p->chat.add,p->chat.tel,p->chat.tecent,p->chat.email); p=p->next; fprintf(fp,"---------------------------------------------------------------------------------
"); } fprintf(fp,"
********************************** %d ************************************
",cacu(head->next)); fclose(fp); // printf("\t !
"); return 0; } // int fread() { char str[100]; char filename[30]; FILE* fp; // printf("\t :"); scanf("\t%s",filename); if((fp=fopen(filename,"a+"))==NULL) { printf("\t !
"); system("pause"); return 0; } while((fgets(str,100,fp))!=NULL) //fgets , str { printf("\t%s",str); // } return 0; }
8.모 의 통화
time 함 수 를 호출 하여 랜 덤 수(1970.1.1 부터 계산)를 가 져 옵 니 다.현재 시스템 시간 에 따라 관련 함수 로 랜 덤 수의 피 드 를 만 든 다음 에 해당 함 수 를 이용 하여 랜 덤 수 를 만 든 다음 에 주소록 에 있 는 연락처 의 항목 과 일치 하 는 지 판단 합 니 다.일치 하면 해당 연락처 의 정 보 를 지정 한 파일 에 직접 기록 합 니 다.일치 하지 않 으 면이 파일 에 알 수 없 는 연락 처 를 기록 합 니 다.

//       
int call()
{
 int n;
 ptcs p=head->next;
 //     ,          ,            
 srand((unsigned) time(NULL));  
 n=rand()%(cacu(p)+5)+1;  //     1      +5        
 return n;
}

int save(int n,char *filename)//       
{
 FILE* fp;
 ptcs p=head->next;
 int i=1;
 if((fp=fopen(filename,"a+"))==NULL)
 {
 printf("\t       !
"); system("pause"); return 0; } if(n<=cacu(p)) { while(i<n) { p=p->next; i++; } // fprintf(fp,"%-16s%-16s%-16s%-20s
",p->chat.name,p->chat.tel,p->chat.tecent,p->chat.email); fprintf(fp,"----------------------------------------------------------------------
"); } else fprintf(fp,"
"); fclose(fp); // return 0; }
시스템 기능 실행 도 첨부:

설명:왜 링크 구 조 를 선 택 했 습 니까?주로 연락 처 를 추가 하기 전에 추 가 된 개 수 를 지정 하지 않 기 때문에 동적 으로 추가 하 는 과정 입 니 다.링크 의 크기 가 가 변 적 이 고 확장 성 이 강 하 며 연락처 의 삭제 작업 에 대해 링크 를 사용 할 때 메모리 주 소 를 바 꿀 필요 가 없습니다.노드 포인터 의 방향 과 노드 의 값 만 수정 하면 됩 니 다.배열 의 크기 가 고정 되 어 동적 저장 에 적합 하지 않 습 니 다.또한 배열 요 소 를 조작 하 는 과정 에서 이 요 소 는 앞으로 모든 요소 의 메모리 주 소 를 이동 해 야 하기 때문에 조작 하기 가 비교적 번거롭다.
전체 소스 코드 참고 가능:C 언어 는 개인 주소록 관리 시스템 을 실현 한다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기