C语言程序设计实践
——通讯录管理系统
六、程序源代码及注释
#include #include #include #include #define SUM 100 #define STOP 1000
typedef struct /*结构体,存放通讯录成员信息,重新定义成member型变量*/ { char name[10]; char tel[15]; char cla[5]; char mail[20]; char qq[15]; }member;
member info[SUM]; //所有成员空间
FILE *fp;
//文件指针,用于打开或保存通讯录文件 int count=0; //全局变量,用于计数已存入数量
/*-----------------------*/
int load(char filename[])//打开通讯录文件 { member *p; int i=0; if((fp=fopen(filename,\"rb\"))==NULL)
return i; else
{
while(!feof(fp))
{
p=(member *)malloc(sizeof(member));
if(fread(p,sizeof(member),1,fp)==1)
{
strcpy(info[i].name,p->name);
strcpy(info[i].tel,p->tel);
strcpy(info[i].cla,p->cla);
strcpy(info[i].mail,p->mail);
strcpy(info[i].qq,p->qq);
i++;
}
free(p);
}
return i;
} } /*------------------*/
void save(char filename[]) //保存通讯录文件 {
int i;
member *p;
if((fp=fopen(filename,\"wb\"))==NULL)
{
printf(\"无法保存!打开文件%s时出错\\n\",filename);
exit(1);
}
else
for(i=0;i
{
p=(member *)malloc(sizeof(member));
strcpy(p->name,info[i].name);
strcpy(p->tel,info[i].tel);
strcpy(p->cla,info[i].cla);
strcpy(p->mail,info[i].mail);
strcpy(p->qq,info[i].qq);
fwrite(p,sizeof(member),1,fp);
free(p);
}
fclose(fp); } /*-----------------*/ void display(void)
//分类查看功能 { system(\"cls\");
char dis;
char way[5];
int i,j=0;
choice:
printf(\"**********
请选择查看分类
***********\\n\");
printf(\"**********
1.亲友
**********\\n\");
printf(\"**********
2.同学
**********\\n\");
printf(\"**********
3.老师
**********\\n\");
printf(\"**********
4.其他
**********\\n\");
printf(\"**********
5.查看全部
**********\\n\");
printf(\"**********
0.返回上一级菜单
**********\\n\");
printf(\"*****************************************\\n\");
printf(\"请选择(1~5或0):\");
dis=getchar();
getchar();
switch(dis)
{
case \'1\':strcpy(way,\"亲友\");break;
case \'2\':strcpy(way,\"同学\");break;
case \'3\':strcpy(way,\"老师\");break;
case \'4\':strcpy(way,\"其他\");break;
case \'5\':printf(\"*******全部通讯成员*******\\n\");
for(i=0;i
printf(\"
姓名:%s\\n\",info[i].name);
printf(\"
电话号码:%s\\n\",info[i].tel);
printf(\"
电子邮箱:%s\\n\",info[i].mail);
printf(\"
QQ号:%s\\n\",info[i].qq);
printf(\"
分类:%s\\n\",info[i].cla);
printf(\"*****************************\\n\");
j++;
}
if(j==0){
printf(\"************************\\n\");
printf(\"无任何通讯成员\\n\");
}
j=0;
Sleep(STOP);
goto choice; break;
case \'0\':return; break;
default:
printf(\"*************************\\n\");
printf(\"
输入指令有误!
\\n\");
printf(\"*************************\\n\");
Sleep(STOP);
goto choice;
}
printf(\"********通讯成员之%s*******\\n\",way);
for(i=0;i
if(strcmp(info[i].cla,way)==0){
printf(\"****
姓名:%s\\n\",info[i].name);
printf(\"****
电话号码:%s\\n\",info[i].tel);
printf(\"****
电子邮箱:%s\\n\",info[i].mail);
printf(\"****
QQ号:%s\\n\",info[i].qq);
printf(\"****
分类:%s\\n\",info[i].cla);
printf(\"**********************************\\n\");
j++;
}
}
if(j==0){
printf(\"该分类中无通讯成员\\n\");
printf(\"******************\\n\");
}
j=0;
Sleep(STOP);
goto choice; }
/*------*/ int add(void)
//增加新的成员 {
member temp;
int i;
reinput_name:
printf(\"请输入新成员的姓名:\");
gets(temp.name);
for(i=0;i
if(strcmp(info[i].name,temp.name)==0){
printf(\"该姓名已存在!\\n\");
Sleep(STOP);
goto reinput_name;
}
reinput_tel:
printf(\"请输入新成员的电话号码:\");
gets(temp.tel);
for(i=0;i
if(strcmp(info[i].tel,temp.tel)==0){
printf(\"该电话号码已存在!\\n\");
Sleep(STOP);
goto reinput_tel;
}
printf(\"请输入新成员的电子邮箱:\");
gets(temp.mail);
printf(\"请输入新成员的QQ号:\");
gets(temp.qq);
printf(\"请输入新成员的分类:\");
gets(temp.cla);
info[count]=temp;
count++;
return count; }
/*-----*/ int search(char sname[]) //查找功能 {
int flag=0,i;
for(i=0;i
if(strcmp(info[i].name,sname)==0){
printf(\"*****************************\\n\");
printf(\"****
姓名:%s\\n\",info[i].name);
printf(\"****
电话号码:%s\\n\",info[i].tel);
printf(\"****
电子邮箱:%s\\n\",info[i].mail);
printf(\"****
QQ号:%s\\n\",info[i].qq);
printf(\"****
分类:%s\\n\",info[i].cla);
printf(\"******************************\\n\");
flag=1;
}
return flag; }
/*---------*/ int rework(char rname[])
//修改功能 {
int flag=0,i;
for(i=0;i
if(strcmp(info[i].name,rname)==0){
printf(\"*********************\");
printf(\"请输入新的姓名:\");
gets(info[i].name);
printf(\"请输入新的电话号码:\");
gets(info[i].tel);
printf(\"请输入新的电子邮箱:\");
gets(info[i].mail);
printf(\"请输入新的QQ号:\");
gets(info[i].qq);
printf(\"请输入新的分类:\");
gets(info[i].cla);
printf(\"********************\");
flag=1;
}
return flag; }
/*-----------------------------*/ int erase(char ename[]) //删除功能 {
int flag=0,i,j;
for(i=0;i
if(strcmp(info[i].name,ename)==0){
for(j=i;j
info[j]=info[j+1];
count--;
flag=1;
}
return flag; } /*-----------------------------*/ int call(void)//拨号功能 {
int i,j,flag=0;
char cname[10];
printf(\"**************************\\n\");
for(i=0;i
printf(\"%s \",info[i].name);
}
putchar(\'\\n\');
printf(\"请输入需要拨号的姓名:\");
gets(cname);
for(i=0;i
if(strcmp(info[i].name,cname)==0){
printf(\"正在拨号:\");
for(j=0;info[i].tel[j]!=\'\\0\';j++){
printf(\"%c\",info[i].tel[j]);
Sleep(300);
}
putchar(\'\\n\');
flag=1;
}
return flag; } /*-----------------------*/ int main(void)
//主函数 { char filename[40]; char c,save_j; int t; char s_r_e_name[10];
printf(\"欢迎使用通讯录系统!请输入通讯录文件的有效路径(若文件不存在则自动创建新通讯录)\\n\"); gets(filename); count=load(filename); system(\"cls\");
printf(\"
======================================\\n\");
printf(\"
==========欢迎使用我的通讯录==========\\n\");
printf(\"
============ 制作:石贵清
===========\\n\");
begin:
printf(\"★★★★★★★★★★★★★★★★★★★★★★★★★★\\n\");
printf(\"※
※\\n\");
printf(\"※
通
迅
录
※\\n\");
printf(\"※
※\\n\");
printf(\"※
1.添加新联系人.
5.分类显示查询.
※\\n\");
printf(\"※
※\\n\");
printf(\"※
2.删除联系人.
6.拨出电话.
※\\n\");
printf(\"※
※\\n\");
printf(\"※
3.查询通讯成员.
7.保存通讯文件.
※\\n\");
printf(\"※
※\\n\");
printf(\"※
4.修改信息.
0.关闭通迅录.
※\\n\");
printf(\"★★★★★★★★★★★★★★★★★★★★★★★★★★\\n\"); printf(\"友情提醒:请在退出本程序之前按7保存通讯文件! \\n\"); printf(\"请输入您选择的操作:\");
c=getchar();
getchar(); switch(c) {
case \'1\':
if(count==SUM){
printf(\"======= 通讯录空间已满,无法继续录入!===\\n\");
Sleep(STOP);
goto begin; break;
}
t=add();
printf(\"===== 信息已建立,请尽快保存!=====\\n\");
if(t==SUM){
printf(\"===== 通讯录空间已满,无法继续录入!=====\\n\");
}
Sleep(STOP);
goto begin;
break; case \'2\': if(count==0){
printf(\"
========================\\n\");
printf(\"=== 通讯录中无任何成员!====\\n\");
printf(\"
======================\\n\");
Sleep(STOP);
goto begin;
break; }
printf(\"请输入要删除成员的姓名:\");
gets(s_r_e_name);
t=erase(s_r_e_name);
if(!t) {
printf(\"=================\\n\");
printf(\"==== 查无此人====\\n\");
printf(\"=================\\n\"); } else {
printf(\"======================\\n\");
printf(\"======已成功删除======\\n\");
printf(\"======================\\n\"); } Sleep(STOP); goto begin;
break; case \'3\':
printf(\"请输入要查找的成员姓名:\");
gets(s_r_e_name);
t=search(s_r_e_name);
if(!t)
{
printf(\"======================\\n\");
printf(\"===== 查无此人 =======\\n\");
printf(\"======================\\n\");
}
Sleep(STOP);
goto begin;
break;
case \'7\':
save(filename);
printf(\"==============================\\n\");
printf(\"======
保存成功!
=======\\n\");
printf(\"==============================\\n\"); Sleep(STOP); goto begin;
break;
case \'4\':
printf(\"请输入要修改的成员姓名:\");
gets(s_r_e_name);
t=rework(s_r_e_name);
if(!t) {
printf(\"=======
查无此人
====\\n\"); }
else
{
printf(\"=========================\\n\");
printf(\"====
修改成功
====\\n\");
}
Sleep(STOP);
goto begin;
break;
case \'5\':
display();
Sleep(STOP);
goto begin;
break;
case \'6\':
t=call();
if(!t)
{
printf(\"=============================\\n\");
printf(\"====== 输入姓名错误! =======\\n\");
printf(\"============================\\n\");
}
else
{
printf(\"=========================\\n\");
printf(\"======
电话已经拨出
=====\\n\");
printf(\"=======================\\n\");
}
Sleep(STOP);
goto begin;
break;
case \'0\':
printf(\"是否保存数据文件?(Y:是/N:否)\");
save_j=getchar();
if(save_j==\'Y\'||save_j==\'y\'){
save(filename);
printf(\"
====== 保存成功!=======\\n\");
printf(\"======= 感谢您的使用!再见! ======\\n\");
}
else
{
printf(\"========================\\n\");
printf(\"=== 感谢您的使用!再见! ===\\n\");
printf(\"========================\\n\");
}
exit(0); default:
printf(\"=====
Sleep(STOP);
goto begin; } return 0; }
输入指令无效!====\");