通讯录管理系统
- 问题定义与描述
1.1问题定义
创建一个学生通讯录管理系统。系统中每个学生信息包括学号、姓名、性别、出生日期、家庭地址、学号、电话、QQ。程序的运行效果如下图所示,选择任意菜单后,实现相应功能。
图1.1 学生通讯录管理系统功能需求
1.2问题描述
在问题定义与描述阶段要考虑题目的可行性和需求分析,接下来进入开发阶段,完成系统设计和系统实现的任务。
2、系统设计
总体设计
采用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。需要注意的是划分出来的模块应该相对独立但又相关,且容易理解。可以用模块化层次结构图(即模块图)来分析其任务的划分,一般从上到下进行,最上面一层是主模块,下面各层是其上一层模块的逐步细化描述。
2.1主要功能模块
添加:添加通讯录记录。
显示:显示通讯录记录。
删除:删除通讯录记录。
查询:查询通讯录记录。
修改:修改通讯录记录。
保存:将信息保存到文件。
2.2数据结构设计
结构体
s struct addr
{ char post_num[10];
char addr[40];
};
struct birth
{ int year;
int month;
int day;
};
struct friend1
{ int number;
char name[20];
char sex;
struct birth birth;
struct addr addr;
char telephone[13];
}friends[50];
FILE *fp;
int i;
2.3输入记录模块
输入记录模块主要实现将数据存入结构体中。,用户应选择2,调用Data_Inpu ()函数,进行朋友姓名、电话、地址、性别的输入,即完成在结构体中添加记录的操作。
2.4查询记录模块
查询记录模块主要实现了在结构体中按姓名查找满足相关条件的信息记录。在查询函数search()中,找到相同名字则打印出记录。
2.5删除记录模块
该操作完成删除指定姓名的记录,
输入要删除的序号,输入后调用函数若找到该记录,询问是否继续寻找相同姓名的记录。
2.6显示所有记录模块
该操作完成显示所有记录信息,它分两步完成。
第一步,按照数组中序号进行排序。
第二步,逐条显示出来。
3、系统实现
3.1 编码
3.1.1 部分程序源代码
#include
#include
#include
#include
#include
struct addr
{ char post_num[10];
char addr[40];
};
struct birth
{ int year;
int month;
int day;
};
struct friend1
{ int number;
char name[20];
char sex;
struct birth birth;
struct addr addr;
char telephone[13];
}friends[50];
FILE *fp;
int i;
void Data_Show(int j)
{
printf("nntNo:%3dn",friends[j].number);
printf("ntBirthday(y/m/d):%4d%2d%2d",friends[j].birth.year,friends[j].birth.month,friends[j].birth.day);
printf("ntPostnum:%-10s",friends[j].addr.post_num);
printf("ntaddress:%-40s",friends[j].addr.addr);
printf("ntTele%-13s",friends[j].telephone);
}
void Data_Input(int j)
{
fflush(stdin);
friends[j].number=j;
printf("nnntNo %d record",j);
printf("nntName:");
scanf("%s",friends[j].name);
fflush(stdin);
printf("ntSex(m/f):");
scanf("%c",&friends[j].sex);
printf("nt---birthday---");
printf("ntyear:");
scanf("%d",&friends[j].birth.year);
printf("nttmonth:");
scanf("%d",&friends[j].birth.month);
printf("nttday:");
scanf("%d",&friends[j].birth.day);
printf("ntPost_number:");
scanf("%s",friends[j].addr.post_num);
printf("ntAddress:");
scanf("%s",friends[j].addr.addr);
printf("nttelephone:");
scanf("%s",friends[j].telephone);
printf("y/n");
if( getch()=='n')
main();
}
void Data_Save()
{
int j;
fp=fopen("friend.txt","w");
for(j=1;j<=i;j++)
{ fwrite(&friends[j],sizeof(struct friend1),1,fp);
}
}
void main()
{
int j,k;
char ch;
char *search_name;
clrscr();
Data_Load();
i--;
do
{ printf("nnntFunction choose:");
printf("nt1.Read");
printf("nt2.Append");
printf("nt3.Delete");
printf("nt4.Search");
printf("nt5.Insert");
printf("nt6.Save and Exit");
printf("nt7.Quit");
printf("nn");
printf("tChoice:");
ch=getche();
switch(ch)
{ case '1': j=1;
while(getch()!=0x1b&&j<=i) Data_Show(j++);
if(j>i) printf("ntEnd of e_noten");
break;
case '2':
while(getch()!=0x1b&&i<50)
{ i++;
Data_Input(i);
}
if(i==50)printf("nte_note is filledn");
break;
case '3':
if(i<1)
{ printf("ntNo recordsn");
break;
}
printf("ntDelete No:");
scanf("%d",&k);
for(j=k;j
{ strcpy(friends[j].name,friends[j+1].name);
friends[j].sex=friends[j=1].sex;
friends[j].birth.year=friends[j+1].birth.year;
friends[j].birth.month=friends[j+1].birth.month;
friends[j].birth.day=friends[j+1].birth.day;
strcpy(friends[j].addr.post_num,friends[j+1].addr.post_num);
strcpy(friends[j].addr.addr,friends[j+1].addr.addr);
strcpy(friends[j].telephone,friends[j+1].telephone);
}
i--;
break;
case '4':
printf("ntPlease input name:");
gets(search_name);
for(j=1;j<=i;j++)
{
if(strcmp(search_name,friends[j].name)==0)
{ Data_Show(j);
break;
}
}
if(j>1)
printf("nt No such records") ;
break;
case '5':
printf("ntInsert No:");
scanf("%d",&k);
for(j=i+1;j { strcpy(friends[j].name,friends[j-1].name); friends[j].sex=friends[j-1].sex; friends[j].birth.year=friends[j-1].birth.year; friends[j].birth.month=friends[j-1].birth.month; friends[j].birth.day=friends[j-1].birth.day; strcpy(friends[j].addr.post_num,friends[j-1].addr.post_num); strcpy(friends[j].addr.addr,friends[j-1].addr.addr); strcpy(friends[j].telephone,friends[j-1].telephone); } Data_Input(k); i++; break; case '6': Data_Save(); exit(0); break; case '7': printf("ntDo you want to save e_note:(y/n)"); ch=getch(); if(ch=='y') Data_Save(); fclose(fp); exit(0); default: printf("Please choose num 1-4n" ); } }while(1); } 3.1.2 主函数main() main()函数主要实现了对整个程序的运行控制,以及相关功能模块的调用。 void main() { int j,k; char ch; char *search_name; clrscr(); Data_Load(); i--; do { printf("nnntFunction choose:"); printf("nt1.Read"); printf("nt2.Append"); printf("nt3.Delete"); printf("nt4.Search"); printf("nt5.Insert"); printf("nt6.Save and Exit"); printf("nt7.Quit"); printf("nn"); printf("tChoice:"); ch=getche(); switch(ch) { case '1': j=1; while(getch()!=0x1b&&j<=i) Data_Show(j++); if(j>i) printf("ntEnd of e_noten"); break; case '2': while(getch()!=0x1b&&i<50) { i++; Data_Input(i); } if(i==50)printf("nte_note is filledn"); break; case '3': if(i<1) { printf("ntNo recordsn"); break; } printf("ntDelete No:"); scanf("%d",&k); for(j=k;j
{ strcpy(friends[j].name,friends[j+1].name); friends[j].sex=friends[j=1].sex; friends[j].birth.year=friends[j+1].birth.year; friends[j].birth.month=friends[j+1].birth.month; friends[j].birth.day=friends[j+1].birth.day; strcpy(friends[j].addr.post_num,friends[j+1].addr.post_num); strcpy(friends[j].addr.addr,friends[j+1].addr.addr); strcpy(friends[j].telephone,friends[j+1].telephone); } i--; break; case '4': printf("ntPlease input name:"); gets(search_name); for(j=1;j<=i;j++) { if(strcmp(search_name,friends[j].name)==0) { Data_Show(j); break; } } if(j>1) printf("nt No such records") ; break; case '5': printf("ntInsert No:"); scanf("%d",&k); for(j=i+1;j { strcpy(friends[j].name,friends[j-1].name); friends[j].sex=friends[j-1].sex; friends[j].birth.year=friends[j-1].birth.year; friends[j].birth.month=friends[j-1].birth.month; friends[j].birth.day=friends[j-1].birth.day; strcpy(friends[j].addr.post_num,friends[j-1].addr.post_num); strcpy(friends[j].addr.addr,friends[j-1].addr.addr); strcpy(friends[j].telephone,friends[j-1].telephone); } Data_Input(k); i++; break; case '6': Data_Save(); exit(0); break; case '7': printf("ntDo you want to save e_note:(y/n)"); ch=getch(); if(ch=='y') Data_Save(); fclose(fp); exit(0); default: printf("Please choose num 1-4n" ); } }while(1); } 3.1.3 主菜单界面 用户进入通讯录系统时,需要显示主菜单,提示用户进行选择,完成相应任务。此代码被main()函数调用。 void main() { printf("nt1.Read"); printf("nt2.Append"); printf("nt3.Delete"); printf("nt4.Search"); printf("nt5.Insert"); printf("nt6.Save and Exit"); printf("nt7.Quit"); printf("nn"); printf("tChoice:"); ch=getche(); switch(ch) 3.1.4读取文件中的记录 检查文件是否存在,建立student.txt文档,用于保存通讯录中的记录。 void Data_Load() { int j; long k; fp=fopen("friend.txt","r+t"); if(fp!=NULL) { for(i=1;i<50;i++) { j=fgetc(fp); if(j==EOF) return; k=i-1; fseek(fp,k*sizeof(struct friend1),SEEK_SET); fread(&friends[i],sizeof(struct friend1),1,fp); } } else { fp=fopen("friend.txt","w"); i=1; } } }3.1.5 显示所有记录 由于记录显示操作经常进行,所以将这部分由独立的函数来完成,减少代码的重复。排序后更加方便查找所需要的朋友信息,为用户减少不必要的麻烦。 case '1': j=1; while(getch()!=0x1b&&j<=i) Data_Show(j++); if(j>i) printf("ntEnd of e_noten"); break; 3.1.6 删除学生记录 在删除操作中,系统会按用户要求先找到该学生记录,然后从将后一条记录覆盖过来。 case '3': if(i<1) { printf("ntNo recordsn"); break; } printf("ntDelete No:"); scanf("%d",&k); for(j=k;j
{ strcpy(friends[j].name,friends[j+1].name); friends[j].sex=friends[j=1].sex; friends[j].birth.year=friends[j+1].birth.year; friends[j].birth.month=friends[j+1].birth.month; friends[j].birth.day=friends[j+1].birth.day; strcpy(friends[j].addr.post_num,friends [j+1].addr.post_num); strcpy(friends[j].addr.addr,friends[j+1].addr.addr); strcpy(friends[j].telephone,friends[j+1].telephone); } i--; break; 3.1.7查找学生记录 当通讯记录较多的时候,全部罗列出所有记录太浪费精力,查找则能精确快速的完成这项工作。 case '4': printf("ntPlease input name:"); gets(search_name); for(j=1;j<=i;j++) { if(strcmp(search_name,friends[j].name)==0) { Data_Show(j); break; } } if(j>1) printf("nt No such records") ; break; 3.1.8 插入记录 插入通讯录中的朋友详细信息。 case '5': printf("ntInsert No:"); scanf("%d",&k); for(j=i+1;j { strcpy(friends[j].name,friends[j-1].name); friends[j].sex=friends[j-1].sex; friends[j].birth.year=friends[j-1].birth.year; friends[j].birth.month=friends[j-1].birth.month; friends[j].birth.day=friends[j-1].birth.day; strcpy(friends[j].addr.post_num,friends[j- 1].addr.post_num); strcpy(friends[j].addr.addr,friends[j-1].addr.addr); strcpy(friends[j].telephone,friends[j-1].telephone); } Data_Input(k); i++; break; 3.1.9写入记录到文件中。 将所输入的朋友信息保存到frieng.txt中,防止信息丢失。 void Data_Input(int j) { fflush(stdin); friends[j].number=j; printf("nnntNo %d record",j); printf("nntName:"); scanf("%s",friends[j].name); fflush(stdin); printf("ntSex(m/f):"); scanf("%c",&friends[j].sex); printf("nt---birthday---"); printf("ntyear:"); scanf("%d",&friends[j].birth.year); printf("nttmonth:"); scanf("%d",&friends[j].birth.month); printf("nttday:"); scanf("%d",&friends[j].birth.day); printf("ntPost_number:"); scanf("%s",friends[j].addr.post_num); printf("ntAddress:"); scanf("%s",friends[j].addr.addr); printf("nttelephone:"); scanf("%s",friends[j].telephone); printf("y/n"); if( getch()=='n') main(); } 4程序测试与系统维护 4.1测试主菜单界面 主界面如图4.1 4.2测试添加界面 进入添加界面,如图4.2。 图4.2添加界面 4.3测试显示界面 进入显示界面,如图4.3。 4.4测试删除界面 进入删除界面,如图4.4。 图4.5查询界面 4.6测试修改界面 进入修改界面,如图4.6。 4.7测试保存界面 进入保存界面,如图4.7。 需要完整的资料以及源程序可在我的资源里下载。
图4.1主界面
图4.3显示界面
图4.4删除界面
4.5测试查询界面
进入查询界面,如图4.5。
图4.6修改界面
图4.7保存界面



