c语言大作业通讯录管理系统,基于C语言实现个人通讯录管理系统

基于C语言实现个人通讯录管理系统

之前利用C语言完成了一个关于个人通讯录管理系统的课题,主要是关于联系人的添加、查找、删除、修改、输出以及文件的写入与读出,还有一个甜点功能―模拟通话,它的实现原理也很容易理解,文章末尾会介绍到。

主框架:

a51cb20ee8dfd928819f23bbe0bd83d6.png

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("

请输入:

");

printf("姓名:");

scanf("%s",q->chat.name);

printf("地址:");

scanf("%s",q->chat.add);

printf("手机号:");

scanf("%s",q->chat.tel);

do

{

n=0; //仅做记录

if(strlen(q->chat.tel)!=11) //计算手机号的长度 ,判断是否输入规范

{

n=1;

printf("您输入的手机号格式不存在,请重新输入:");

scanf("%s",q->chat.tel);

}

else

{

for(t=0;t<11;t++)

{

if(q->chat.tel[t]chat.tel[t]>"9")

{

n=1;

printf("您输入的手机号格式不合理,请重新输入:");

scanf("%s",q->chat.tel);

break;

}

}

}

}while(n);

//输入QQ号

printf("QQ号:");

scanf("%s",q->chat.tecent);

do

{

n=0;

if(strlen(q->chat.tecent)>10) //以10位QQ号为准,判断是否符合规范

{

n=1;

printf("您输入的QQ号格式不存在,请重新输入:");

scanf("%s",q->chat.tecent);

}

else

{

for(t=0;t<10;t++)

{

if(q->chat.tecent[t]chat.tecent[t]>"9")

{

n=1;

printf("您输入的QQ号格式不合理,请重新输入:");

scanf("%s",q->chat.tecent);

break;

}

}

}

}while(n);

//输入邮箱

printf("Email:");

scanf("%s",q->chat.email);

do

{

//判断邮箱 @符号输入规范(这里不限定邮箱号码位数)

a=0;

for(t=0;q->chat.email[t]!="";t++)

{

if(q->chat.email[t]=="@")

a++; //@数为1

}

if(a!=1)

{

printf("输入的邮箱格式不合理,请重新输入:");

scanf("%s",q->chat.email);

}

}while(a!=1); //是否输入@ ,为1则终止循环

printf("

是否继续添加?(Y/N)");

scanf("%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("*************查询方式**************

");

printf("-----------------------------------

");

printf(" 1.按姓名查找

");

printf(" 2.手机号查找

");

printf(" 3.按QQ号码查找

");

printf(" 4.返回

");

printf("-----------------------------------

");

printf("

请选择查询方式:");

scanf("%d",&m);

do

{

n=0;

if(m!=1&&m!=2&&m!=3&&m!=4)

{

n=1;

printf("您输入的查询方式不存在,请重新输入:");

scanf("%d",&m);

}

}while(n); //是否输入正确

if(!p) //判断链表是否为空

{

printf("该通讯录为空!

");

return 0;

}

if(m==1)

{

char nm[15]; //要查询的联系人

printf("请输入您要查询的联系人姓名:");

scanf("%s",nm);

//若链表不为空,且联系人不相符,则继续往后遍历

while(p!=NULL&&strcmp(p->chat.name,nm)!=0)

p=p->next; //遍历链表

if(!p)

{

printf("您要查询的联系人不存在!

");

return 0;

}

printf("地址:%s

",p->chat.add);

printf("手机号:%s

",p->chat.tel);

printf("QQ号:%s

",p->chat.tecent);

printf("Email:%s

",p->chat.email);

}

if(m==2)

{

char te[20]; //要查询的手机号码

printf("请输入您要查询的手机号:");

scanf("%s",te);

while(p!=NULL&&strcmp(p->chat.tel,te)!=0)

p=p->next;

if(!p)

{

printf("您要查询的联系人不存在!

");

return 0;

}

printf("姓名:%s

",p->chat.name);

printf("地址:%s

",p->chat.add);

printf("QQ号:%s

",p->chat.tecent);

printf("Email:%s

",p->chat.email);

}

if(m==3)

{

char qq[15]; //要查询的qq号

printf("请输入您要查询的QQ号:");

scanf("%s",qq);

while(p!=NULL&&strcmp(p->chat.tecent,qq)!=0)

p=p->next;

if(!p)

{

printf("您要查询的联系人不存在!

");

return 0;

}

printf("姓名:%s

",p->chat.name);

printf("地址:%s

",p->chat.add);

printf("手机号:%s

",p->chat.tecent);

printf("Email:%s

",p->chat.email);

}

if(m==4)

return 0;

printf("是否继续查询?(Y/N)"); //Y则继续执行while循环,否则退出

scanf("%c",&flag);

}

return 0;

}

4、联系人的删除

这部分提供按姓名删除,通过遍历链表查询到指定节点,使用指针使该节点的上一个节点直接指向下一个节点,以此来实现对联系人的删除操作。详解图奉上

eed7d816759f62d6ecae2d5eef9b2562.png

5、联系人信息的修改

关于联系人的修改,它其实是对链表的某一节点进行修改,通过遍历链表查询到指定节点并直接进行修改,修改过程中依旧沿用部分格式限定条件,若输入某项不符合要求,则一直重复输入,直到该项输入符合要求为止。话不多说,上代码

//修改姓名

int changename(ptcs p)

{

scanf("%s",p->chat.name);

printf("修改成功!

");

return 0;

}

//修改地址

int changeadd(ptcs p)

{

scanf("%s",p->chat.add);

printf("修改成功!

");

return 0;

}

//修改手机号内容

int changetel(ptcs p)

{

int n,t;

scanf("%s",p->chat.tel);

do

{

n=0;

if(strlen(p->chat.tel)!=11)

{

n=1;

printf("您输入的手机号格式不存在,请重新输入:");

scanf("%s",p->chat.tel);

}

else

{

for(t=0;t<11;t++)

{

if(p->chat.tel[t]chat.tel[t]>"9")

{

n=1;

printf("您输入的手机号格式不合理,请重新输入:");

scanf("%s",p->chat.tel);

break;

}

}

}

}

while(n);

printf("修改成功!

");

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("您输入的QQ号格式不存在,请重新输入:");

scanf("%s",p->chat.tecent);

}

else

{

for(t=0;t<10;t++)

{

if(p->chat.tecent[t]chat.tecent[t]>"9")

{

n=1;

printf("您输入的QQ号格式不合理,请重新输入:");

scanf("%s",p->chat.tecent);

break;

}

}

}

}

while(n);

printf("修改成功!

");

return 0;

}

//修改电子邮箱

int changeEmail(ptcs p)

{

int t,a;

scanf("%s",p->chat.email);

do

{

a=0;

for(t=0;p->chat.email[t]!="";t++)

{

if(p->chat.email[t]=="@")

a++;

}

if(a!=1)

{

printf("输入的邮箱格式不合理,请重新输入:");

scanf("%s",p->chat.email);

}

}

while(a);

printf("修改成功!

");

return 0;

}

6、联系人的输出

关于输出就是按照输入的顺序依次将联系人输出

//输出通讯录列表

int Display()

{

ptcs p=head->next;

if(!p) //判断链表是否为空

{

printf("该通讯录为空!

");

return 0;

}

printf("

**********************************通讯录列表*************************************

");

printf("姓名地址手机号QQ号Email

");

printf("---------------------------------------------------------------------------------

");

while(p)

{

printf("%-8s%-24s%-16s%-16s%-20s

",p->chat.name,p->chat.add,p->chat.tel,p->chat.tecent,p->chat.email);

p=p->next; //继续往后遍历输出

printf("---------------------------------------------------------------------------------

");

}

return 0;

}

7、文件的写入与读出

通过新建一个文件并且指定文件的权限,将数据写入到指定文件中,以此实现对文件的整体写入操作。它的读出操作是通过访问已建立的文件,使用fgets函数获取文件中的信息并保存在指定的字符数组中,之后逐个进行输出。

//将数据写入文件

int fwrite()

{

ptcs p=head->next;

FILE* fp;

char filename[30];

if(!p)

{

printf("该通讯录为空!");

return 0;

}

printf("请输入所写入的文件名:");

scanf("%s",filename);

if((fp=fopen(filename,"a+"))==NULL)

{

printf("无法打开文件!

");

system("pause"); //暂停

return 0;

}

fprintf(fp,"**********************************通讯录列表*************************************

");

fprintf(fp,"姓名地址手机号QQ号Email

");

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("写入成功!

");

return 0;

}

//读取文件

int fread()

{

char str[100];

char filename[30];

FILE* fp; //定义文件指针

printf("请输入要读出的文件名:");

scanf("%s",filename);

if((fp=fopen(filename,"a+"))==NULL)

{

printf("无法打开文件!

");

system("pause");

return 0;

}

while((fgets(str,100,fp))!=NULL) //fgets获取文件中的信息 ,存入str中

{

printf("%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("通话记录将失去!

");

system("pause");

return 0;

}

if(n<=cacu(p))

{

while(i

{

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;

}

附上系统功能运行图:

0fee3fcad575b479830eb885847fde8e.png

基于C语言实现个人通讯录管理系统相关教程

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值