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 언어 는 개인 주소록 관리 시스템 을 실현 한다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 구현 천둥 제거 게임 상세 정보먼저 작은 메뉴를 표시하고 게임을 할지 여부를 선택하십시오.사용자가 종료를 선택하면 프로그램 실행이 끝나고, 사용자가 게임을 선택하면 지뢰 제거 위치 좌표를 입력하라는 메시지가 표시됩니다.사용자가 입력한 좌표가 바둑...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.