这是本学期末要求设计的通讯录管理系统,完全自己构思和编码,未参照任何网络上的其它程序。程序实现比较简单,没有应用链表。
/********************************************************************
* 通讯录管理系统 *
* 作者:zzr *
* http://blog.csdn.net/ZhengZhiRen/ *
*该程序实现功能:1.界面 *
* 2.添加记录(键盘输入或从文件导入) *
* 3.查找记录 *
* 4.删除记录 *
* 5.使用文件(db.dat)保存数据 *
* *
*程序在WindowsXP.SP2 + VC6.0 下调试通过 *
*程序还存在多处Bug *
********************************************************************/
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define back() show_menu()
struct record
{
char name[20]; /*姓名*/
char sex; /*性别*/
long birthday; /*生日*/
char email[20]; /*E-mail*/
char tel[15]; /*电话****注意:使用字符数组储存****/
};
void table_head()
/*该函数绘制记录表头部*/
{
printf("==============================BEGIN==================================/n");
printf("%-20s %-4s %-8s %-20s %-15s/n","姓名","性别","生日","E-mail","电话");
}
void table_end()
/*该函数绘制记录表尾部*/
{
printf("===============================END===================================/n");
}
int readtoarray(char filename[],struct record rec[])
/*该函数将filename中的记录读入数组,返回读入的记录数*/
{
struct record *p;
int count=0;
FILE *fp;
p=rec;
fp=fopen(filename,"r");
while(!feof(fp))
{
fscanf(fp,"%s%1s%ld%s%s",p->name,&p->sex,&p->birthday,p->email,p->tel);
p++;
count++;
}
fclose(fp);
return (count);
}
int add()
/*添加记录,成功返回1*/
{
struct record new_record;
struct record *p;
char c;
FILE *fp;
p=&new_record;
printf("请输入“姓名 性别(男m,女f) 生日 E-mail 电话”,用空格间隔:/n");
scanf("%s%1s%ld%s%s",p->name,&p->sex,&p->birthday,p->email,p->tel);/*注意p->sex的输入*/
c=getchar();/*接收回车符*/
/*将记录添加到db.dat*/
fp=fopen("db.dat","a");
fprintf(fp,"%s %c %ld %s %s/n",p->name,p->sex,p->birthday,p->email,p->tel);
fclose(fp);
table_head();
printf("%-20s %-4c %-8ld %-20s %-15s/n",p->name,p->sex,p->birthday,p->email,p->tel);
table_end();
printf("记录添加成功/n");
return (1);
}
int add_fromfile()
/*从文件添加记录,成功返回1*/
{
char filename[30];/*文件名*/
struct record new_record[100];/*存放添加的记录*/
struct record *p;
int i;
int n;
FILE *fp;
printf("请输入文件名:/n");
gets(filename);
/*从文件读入记录*/
n=readtoarray(filename,new_record);
/*将记录添加到db.dat*/
p=new_record;
fp=fopen("db.dat","a");
for(i=0;i<n;i++,p++)
fprintf(fp,"%s %c %ld %s %s/n",p->name,p->sex,p->birthday,p->email,p->tel);
fclose(fp);
/*显示输出*/
p=new_record;
table_head();
for(i=0;i<n;i++,p++)
printf("%-20s %-4c %-8ld %-20s %-15s/n",p->name,p->sex,p->birthday,p->email,p->tel);
table_end();
printf("%d条记录已添加/n",n);
return (1);
}
void listall()
/*列出文件db.dat中的所有记录*/
{
struct record rec;
int count=0;
FILE *fp;
table_head();
fp=fopen("db.dat","r");
while(!feof(fp))
{
fscanf(fp,"%s%1s%ld%s%s/n",rec.name,&rec.sex,&rec.birthday,rec.email,rec.tel);
printf("%-20s %-4c %-8ld %-20s %-15s/n",rec.name,rec.sex,rec.birthday,rec.email,rec.tel);
count++;
}
fclose(fp);
table_end();
printf("共%d条记录/n",count);
}
void find_record(char s[20],char c)
/*该函数在db.dat中查找匹配的记录,参数s为查找的内容,参数c为查找方式*/
{
struct record rec[200];
int n;/*记录数*/
int i;
int count=0;
/*将文件db.dat中的记录读入数组*/
n=readtoarray("db.dat",rec);
/*查找匹配的记录并显示*/
table_head();
switch(c)
{
case 'n':/*按姓名查找*/
for(i=0;i<n;i++)
if(strcmp(rec[i].name,s)==0)
{
printf("%-20s %-4c %-8ld %-20s %-15s/n",rec[i].name,rec[i].sex,rec[i].birthday,rec[i].email,rec[i].tel);
count++;
}
break;
case 's':/*按性别查找*/
for(i=0;i<n;i++)
if(rec[i].sex==s[0])
{
printf("%-20s %-4c %-8ld %-20s %-15s/n",rec[i].name,rec[i].sex,rec[i].birthday,rec[i].email,rec[i].tel);
count++;
}
break;
case 'b':/*按生日查找*/
for(i=0;i<n;i++)
if(rec[i].birthday==atol(s))
{
printf("%-20s %-4c %-8ld %-20s %-15s/n",rec[i].name,rec[i].sex,rec[i].birthday,rec[i].email,rec[i].tel);
count++;
}
break;
case 'e':/*按E-mail查找*/
for(i=0;i<n;i++)
if(strcmp(rec[i].email,s)==0)
{
printf("%-20s %-4c %-8ld %-20s %-15s/n",rec[i].name,rec[i].sex,rec[i].birthday,rec[i].email,rec[i].tel);
count++;
}
break;
case 't':/*按电话查找*/
for(i=0;i<n;i++)
if(strcmp(rec[i].tel,s)==0)
{
printf("%-20s %-4c %-8ld %-20s %-15s/n",rec[i].name,rec[i].sex,rec[i].birthday,rec[i].email,rec[i].tel);
count++;
}
break;
}
table_end();
printf("共%d条匹配的记录/n",count);
}
void show_menu()
/*该函数显示第一级菜单*/
{
void menu_add();
void menu_find();
void menu_delete();
char c[2];
printf("请选择:/n1 添加记录/n2 查找记录/n3 删除记录/n4 列出所有记录/n5 退出/n");
gets(c);
switch(c[0])
{
case '1':
menu_add();
break;
case '2':
menu_find();
break;
case '3':
menu_delete();
break;
case '4':
listall();
break;
case '5':
exit(0);/*退出程序*/
break;
}
back();/*返回主菜单*/
}
void menu_add()
/*该函数显示“添加记录”菜单*/
{
char c[2];
printf("请选择:/n1 输入/n2 从文件添加/n3 返回/n");
gets(c);
switch(c[0])
{
case '1':
add();
break;
case '2':
add_fromfile();
break;
case '3':
break;
}
}
void menu_find()
/*该函数显示“查找记录”菜单*/
{
char c[2];
char s[25];
printf("请选择:/n1 按姓名查找/n2 按性别查找/n3 按生日查找/n4 按E-mail查找/n5 按电话查找/n6 返回/n");
gets(c);
switch(c[0])
{
case '1':
printf("请输入姓名:/n");
gets(s);
find_record(s,'n');
break;
case '2':
printf("请输入性别:/n");
gets(s);
find_record(s,'s');
break;
case '3':
printf("请输入生日:/n");
gets(s);
find_record(s,'b');
break;
case '4':
printf("请输入E-mail:/n");
gets(s);
find_record(s,'e');
break;
case '5':
printf("请输入电话:/n");
gets(s);
find_record(s,'t');
break;
case '6':
break;
}
}
void menu_delete()
/*该函数显示“删除记录”菜单*/
{
struct record rec;
struct record records[200];
int i;
int n;
int flag=0;
FILE *fp;
printf("请输入“姓名 性别(男m,女f) 生日 E-mail 电话”,用空格间隔:/n");
scanf("%s%1s%ld%s%s%*c",rec.name,&rec.sex,&rec.birthday,rec.email,rec.tel);
/*将记录读入数组*/
n=readtoarray("db.dat",records);
n--;/*注意减1,readtoarray将文件末的'/n'读入作为最后一条记录,有待改进*/
/*删除匹配的记录*/
fp=fopen("db.dat","w");
for(i=0;i<n;i++)
{
if(strcmp(records[i].name,rec.name)==0 &&
records[i].sex==rec.sex &&
records[i].birthday==rec.birthday &&
strcmp(records[i].email,rec.email)==0 &&
strcmp(records[i].tel,rec.tel)==0
)
{
flag++;
continue;/*跳过匹配的记录*/
}
fprintf(fp,"%s %c %ld %s %s/n",
records[i].name,records[i].sex,records[i].birthday,records[i].email,records[i].tel);
}
fclose(fp);
printf("%d条记录已删除/n",flag);
}
void main()
{
FILE *fp;
/*如果没有文件db.dat,则创建*/
fp=fopen("db.dat","a");
fclose(fp);
/*显示菜单*/
show_menu();
}