用C文件编写通讯录系统

来源:互联网 发布:随心所欲mmd动作数据 编辑:程序博客网 时间:2024/06/04 18:32

【问题描述】

1)通过键盘建立通讯录,每条记录至少包括2个数据项:姓名、电话号码;

2)对通讯录进行插入、删除、修改和查找;

3)通过姓名查找,必须实现精确查找和模糊查找,例如输入“张”,则显示第一个姓张的朋友,然后可以选择“下一个”,鼓励思路创新,提供其他多种查找方式,例如拼音查找等;

4)也可以根据电话号码或部分电话号码进行精确查找和模糊查找;

5)自行定义数据结构,可以选择性的将顺序查找、折半查找、索引查找、树型查找、哈希表等灵活运用其中,完成多方式查找功能。

【解题思路】

主体实现步骤:

  • 创建通讯录
  • 增加联系人
  • 显示所有联系人
  • 精确查询你需要的用户信息
  • 模糊查询你需要的用户信息
  • 修改你要更新的联系人信息
  • 删除你不需要的联系人
  • 修改通讯录的密码
  • 退出通讯录程序

创建:用fopen()建立一个文本文件,然后用fprintf()向其中输入数据(向文件中输入“姓名”,“号码”),并对文件进行命名。

添加:可以添加通讯录记录,利用C语言文件,向文件中按顺序输入姓名、号码,再用fclose()函数关闭并保存文件。

输出:也是用通过循环依次输出文件中的数据,即输出所有通讯录里的记录。

删除:输入你要删除的人的姓名后,系统会自动删除他(她)的记录,在删除通过switch语句满足提示你确认删除的功能,只有等你确认删除后才会删除。

查找:为了满足用户的实际需求,设计了两种查询方式,精确查询和模糊查询,每种查询方式,用户又有两种选择:姓名查询和电话查询。程序用到strcmp()函数,通过比较字符串是否相同来判别是否找到相关信息,找到后,就把文件中的数据赋给对应的变量,再把变量所带的值输出到屏幕上。

修改:输入你要修改的那个人的姓名后,系统会查找该通讯录文件,找到个人的记录后,会显示他(她)的记录,然后找到修改处的地址,然后用户再依次输入他(她)的相关信息来替代以前的记录。

保存:用到fclose()函数,每次操作成功后会自动保存到指定的文件中。

另外,新增加密功能保护用户隐私,函数char *lock(char y[10])随时更新用户的密码,可谓万无一失。

【算法设计】

整体设计框架:


main.cpp

程序说明:

使用switch选择语句,用户输入指令打开相应的功能。

#include "Functions.h"structPhoneCard *head=NULL;void search1();void search2();void main(){  int n=0;char x[20],y[20];char *p3;p3=y;structPhoneCard *p,*p1,*p2;FILE *fp;if((fp=fopen("tongxunlu.txt","r"))){head=NULL;strcpy(y,"123");}else{fp=fopen("tongxunlu.txt","r");fscanf(fp,"%s",y);if((feof(fp))==0){p=(structPhoneCard *)malloc(LEN);fscanf(fp,"%s%s",p->name,p->num);head=p; p2=p;p->next=NULL;while(!feof(fp)){ n=n+1;p1=(structPhoneCard *)malloc(LEN);fscanf(fp,"%s%s",p->name,p->num);p->next=p1;p2=p;p=p1;}p2->next=NULL;if(n==0)head=NULL;}else head=NULL; fclose(fp);}printf("请输入密码(初始密码为123)\n");scanf("%s",x);if((strcmp(x,y)==0)||(strcmp(x,"0")==0)){while(1){system("cls");printf("********************************通讯录系统******************************\n");printf("**********************1  新建通讯录         2    添加联系人*************\n");printf("**********************3  显示所有联系人     4    精确查询***************\n");printf("**********************5  模糊查询           6    修改联系人*************\n");printf("**********************7  删除联系人         8    修改密码***************\n");printf("*******************************9   退出*********************************\n");printf("请选择:");scanf("%d",&n);switch(n){case 1: head=create(head);break;case 2: head=add(head);break;case 3: show(head);system("pause");break;case 4: search1();break;case 5: search2();break;case 6: head=update(head);break;case 7: head=del(head);break;case 8: p3=lock(p3);break;case 9: save(head,y);exit(0);default:printf("输入有误,请重新输入\n");system("pause");}}}else{printf("密码错误,程序自动退出\n");exit(0);}}void search1(){int n;system("cls");printf("*****************************1  姓名查询******************************\n");printf("*****************************2  电话查询******************************\n");printf("请选择:");scanf("%d",&n);switch(n){case 1: searchname1(head);break;case 2: searchnum1(head);break;default:printf("输入有误,请重新输入\n");system("pause");}}void search2(){int n;system("cls");printf("*****************************1  姓名查询******************************\n");printf("*****************************2  电话查询******************************\n");printf("请选择:");scanf("%d",&n);switch(n){case 1: searchname2(head);break;case 2: searchnum2(head);break;default:printf("输入有误,请重新输入\n");system("pause");}}

create.app

程序说明:

此函数在通讯录为空的情况下,用户第一次输入联系人信息时被调用。while(p1->num[0]!='0')是用来判断第一个数据是否为空。用户可以一下子输入很多联系人信息,最后以“0”来终止并返回。

#include "Functions.h"structPhoneCard *create(structPhoneCard *head){structPhoneCard *p1,*p2;int m;if(head==NULL){int n;system("cls");n=1;printf("请依次输入联系人姓名,号码...///姓名,号码都输入0则结束///\n");p1=p2=(structPhoneCard *)malloc(LEN);printf("输入第%d个通讯录资料\n",n);scanf("%s%s",p1->name,p1->num);head=NULL;while(p1->num[0]!='0'){n=n+1;if(n==2)head=p1;else p2->next=p1;p2=p1;p1=(structPhoneCard *)malloc(LEN);printf("输入第%d个通讯录资料\n",n);scanf("%s%s",p1->name,p1->num);}p2->next=NULL;printf("输入结束\n");}else{printf("已存在通讯录,重新创建选(1),否则任意键退出\n");scanf("%d",&m);if(m==1){int n;system("cls");n=1;printf("请依次输入联系人姓名,号码...///姓名,号码都输入0则结束///\n");printf("请输入姓名和号码时用回车键分开\n");p1=p2=(structPhoneCard *)malloc(LEN);printf("输入第%d个通讯录资料\n",n);scanf("%s%s",p1->name,p1->num);head=NULL;while(p1->name[0]!='0'){n=n+1;if(n==2)head=p1;else p2->next=p1;p2=p1;p1=(structPhoneCard *)malloc(LEN);printf("输入第%d个通讯录资料\n",n);scanf("%s%s",p1->name,p1->num);}p2->next=NULL;printf("输入结束\n");}}return(head);}

add.cpp

程序说明:

增加函数不同于创建,增加函数是在已有联系人即通讯录不为空的情况下执行的函数。所以我们用
if(head!=NULL){p1=head;while(p1->next!=NULL){p1=p1->next;}
来判断已存在的联系人的位置,然后将增加的联系人添加至通讯录链表的最末位。
#include "Functions.h"structPhoneCard *add(structPhoneCard *head){structPhoneCard *p1,*p2;intn,m=0;if(head!=NULL){p1=head;while(p1->next!=NULL){p1=p1->next;}printf("请输入姓名和号码时用回车键分开\n");while(p1->name[0]!='0'){p2=p1;m=m+1;p1=(structPhoneCard *)malloc(LEN);printf("新增第%d个通讯录资料\n",m);scanf("%s%s",p1->name,p1->num);p2->next=p1;}p2->next=NULL;printf("输入结束\n");}else{printf("通讯录不存在,新建选(1),否则选(2)\n");while(1){scanf("%d",&n);if(n==1){head=newadd(head);break;}else{if(n==2)break;elseprintf("输入有误,请重新输入......\n");}}}return(head);}
show.cpp

程序说明:

为通讯录设计的显示功能,只需要在主界面按下一个键就可以显示所有的你想看到的联系人的资料。

#include "Functions.h"void show(structPhoneCard *head){structPhoneCard *p1;system("cls");printf("姓名           号码\n");p1=head;while(p1!=NULL){printf("%s%20s\n",p1->name,p1->num);p1=p1->next;}}
searchname1.cpp/searchnum1.cpp

程序说明:

主函数中给出了精确查询函数void search1()定义,然后函数通过用户选择调用上面两个函数,实现精确姓名查找和精确电话查找功能。

#include "Functions.h"void searchname1(structPhoneCard *head){char a[20];structPhoneCard *p1;int n;p1=head;if(head==NULL) {printf("通讯录无资料,请创建后再查询......\n");system("pause");}else{   while(1){system("cls");p1=head;printf("请输入你要查询的姓名,按回车键结束\n");scanf("%s",a); for(;p1!=NULL;p1=p1->next){  if(strcmp(a,p1->name)==0){printf("姓名           号码\n");printf("%s%20s\n",p1->name,p1->num);}}printf("输出完毕,请选择是否继续\n");printf("重新输入选(1),否则任意数字键退出\n");scanf("%d",&n); if(n!=1){break;}}}}
#include "Functions.h"void searchnum1(structPhoneCard *head){char a[20];structPhoneCard *p1;int n;p1=head;if(head==NULL) {printf("通讯录无资料,请创建后再查询......\n");system("pause");}else{   while(1){system("cls");p1=head;printf("请输入你要查询的号码,按回车键结束\n");scanf("%s",a); for(;p1!=NULL;p1=p1->next){  if(strcmp(a,p1->num)==0){printf("姓名           号码\n");printf("%s%20s\n",p1->name,p1->num);}}printf("输出完毕,请选择是否继续\n");printf("重新输入选(1),否则任意数字键退出\n");scanf("%d",&n); if(n!=1){break;}}}}
searchname2.cpp/searchnum2.cpp

程序说明:

主函数中给出了模糊查询函数void search2()定义,然后函数通过用户选择调用上面两个函数,实现模糊姓名查找和模糊电话查找功能。

#include "Functions.h"void searchname2(structPhoneCard *head){char a[20];structPhoneCard *p1;inti,n;p1=head;if(head==NULL) {printf("通讯录无资料,请创建后再查询......\n");system("pause");}else{   while(1){system("cls");p1=head;printf("请输入你要查询的姓氏,按回车键结束\n");scanf("%s",a); i=strlen(a);for(;p1!=NULL;p1=p1->next){  if(strncmp(a,p1->name,i)==0){printf("姓名           号码\n");printf("%s%20s\n",p1->name,p1->num);}}printf("重新输入选(1),否则任意数字键退出\n");scanf("%d",&n); if(n!=1){break;}}}}

#include "Functions.h"void searchnum2(structPhoneCard *head){char a[20];structPhoneCard *p1;inti,n;p1=head;if(head==NULL) {printf("通讯录无资料,请创建后再查询......\n");system("pause");}else{   while(1){system("cls");p1=head;printf("请输入你要查询的号码一部分,按回车键结束\n");scanf("%s",a); i=strlen(a);for(;p1!=NULL;p1=p1->next){  if(strncmp(a,p1->num,i)==0){printf("姓名           号码\n");printf("%s%20s\n",p1->name,p1->num);}}printf("重新输入选(1),否则任意数字键退出\n");scanf("%d",&n); if(n!=1){break;}}}}

del.cpp

程序说明:

通讯录的删除设计是为了对联系人信息的跟进,有利于用户日后能很好的修改联系人的资料。只需要用户输入联系人姓名,即可快速查找到联系人的资料,进行删除。

#include "Functions.h"structPhoneCard *del(structPhoneCard *head){int n;structPhoneCard *p1,*p2;char a[20];p1=p2=head;system("cls");if(head!=NULL){if(p1->next==NULL){printf("只有一个可删除的联系人,如下\n");printf("姓名            号码\n");printf("%s%20s\n",p1->name,p1->num);printf("确认删除选(1)否则任意数字键退出\n");scanf("%d",&n);if(n==1) {head=NULL;printf("已删除联系人\n");}}else{show(head);printf("请输入你要删除联系人的姓名,按回车键结束\n");scanf("%s",a);while((strcmp(p1->name,a)!=0)&&(p1->next!=NULL)){p2=p1;p1=p1->next;}if(p1->next==NULL){if(strcmp(p1->name,a)==0){printf("要删除的联系人信息如下\n");printf("姓名            号码\n");printf("%s%20s\n",p1->name,p1->num);p2->next=p1->next;printf("已删除联系人\n");}elseprintf("通讯录中无此人资料\n");}else{if(p1==head){printf("要删除的联系人信息如下\n");printf("姓名            号码\n");printf("%s%20s\n",p1->name,p1->num);head=p1->next;}else{printf("要删除的联系人信息如下\n");printf("姓名            号码\n");printf("%s%20s\n",p1->name,p1->num);p2->next=p1->next;printf("已删除联系人\n");}}}}else printf("通讯录不存在\n");system("pause");return(head);}
update.cpp

程序说明:

先判断通讯录是否为空,然后由用户输入要修改的联系人姓名,判断通讯录中是否有此人,然后键盘输入修改后的信息,并返回head指针。

#include "Functions.h"structPhoneCard *update(structPhoneCard  *head){char a[20];structPhoneCard  *p1;p1=head;if(head==NULL) printf("通讯录无资料,请创建后再修改......\n");else{system("cls");show(head);printf("请输入你要修改的姓名,按回车键结束\n");scanf("%s",a);while((strcmp(p1->name,a)!=0)&&(p1->next!=NULL)){p1=p1->next;}if(p1->next==NULL){if(strcmp(p1->name,a)==0){printf("姓名           号码\n");printf("%s%20s\n",p1->name,p1->num);printf("请输入修改后的信息,姓名和号码用回车键分开\n");scanf("%s%s",p1->name,p1->num);}elseprintf("通讯录中无此人资料\n");}else{printf("姓名           号码\n");printf("%s%20s\n",p1->name,p1->num);printf("请输入修改后的信息,姓名和号码用回车键分开\n");scanf("%s%s",p1->name,p1->num);}}system("pause");return(head);}

lock.cpp

程序说明:

此功能可以很好的保护用户的隐私,程序先打印出原来密码,然后提示你要更改的密码,键盘输入新密码后,返回一个值给主函数。

#include <stdio.h>#include <stdlib.h>char *lock(char y[20]){system("cls");printf("原密码为%s\n",y);printf("请输入你要更改的密码\n");scanf("%s",y);printf("您更改的密码为%s\n",y);system("pause");return y;}
save.cpp

程序说明:

此函数可以保存用户通讯录信息,如果用户没有建立通讯录文件,系统会自动创建,用户输入自己设置的密码后,程序用next指针依次访问通讯录中联系人信息,并以文件的形式保存下来,然后会提示存储完毕,系统退出字样。

#include "Functions.h"void save(structPhoneCard *head,char y[10]){FILE *fp;structPhoneCard *p;int n;system("cls");printf("保存数据请选(1),否则任意数字键退出......\n");scanf("%d",&n);if(n==1){if((fp=fopen("tongxunlu.txt","r"))==NULL){printf("文件不存在,系统自动创建tongxunlu文件\n");}fp=fopen("tongxunlu.txt","w");fprintf(fp,"密码:   ");fprintf(fp,"%-20s\n",y);fprintf(fp,"姓名            号码\n");for(p=head;p!=NULL;){ fprintf(fp,"%s%20s",p->name,p->num);p=p->next;}fclose(fp);printf("储存完毕,系统自动退出......\n");system("pause");system("cls");printf("\n\n\n\n\n\n\n\n\n\n\n\n");printf("          *************************谢谢使用!***************************\n");system("pause");}}
数据结构/头文件:

Function.h

#ifndef FUNCTIONS_H#define FUNCTIONS_H#include <stdio.h>#include <stdlib.h>#include<malloc.h>#include<string.h>#define LEN sizeof(structPhoneCard )structPhoneCard{char name[20];//姓名char num[20];//电话structPhoneCard *next;//定义一个next指针,指向下一结点};//定义结构体structPhoneCard *newadd(structPhoneCard *head);structPhoneCard *add(structPhoneCard *head);void show(structPhoneCard *head);structPhoneCard *del(structPhoneCard *head);structPhoneCard *update(structPhoneCard *head);void save(structPhoneCard *head,char y[10]);char *lock(char y[20]);void searchname1(structPhoneCard *head);void searchnum1(structPhoneCard *head);void searchname2(structPhoneCard *head);void searchnum2(structPhoneCard *head);#endif
注:程序运行前资源文件里建立一个空的文档:tongxunlu.txt


【运行结果】

主界面

选择1新建通讯录


输入0则跳回主界面,选择2增加联系人


输入0后跳回主界面,选择3显示所有联系人


按任意键跳回主界面,选择4精确查询


在精确查询界面里选择1姓名查询


选择2电话查询


按任意数字键跳回主界面,选择5模糊查询


在模糊查询界面选择1姓名查询


选择2电话查询


按任意数字键跳回主界面,选择6修改联系人


修改后按任意键跳回主界面,选择3显示修改后的通讯录


按任意键返回主界面,选择7删除联系人


按任意键返回主界面,选择3显示删除后的通讯录


按任意键返回主界面,选择8修改用户密码


按任意键返回主界面后,选择9退出并保存通讯录资料


查看通讯录文件存储情况


按任意键后程序显示谢谢使用界面


按任意键程序退出

0 0
原创粉丝点击