通讯录的制作
学生姓名: 学 号: 0
学 院: 软件学院
专 业: 信息管理与信息系统
题 目: 通讯录的制作
成绩
指导教 师
2010年12月20日
1
目的
用数据结构中的双向链表作数据结构,结合C语言基本知识。编写一个通讯录管理系统。以把所学数据结构知识应用到实际软件开发中去。通过设计一个《通讯录的制作》,进
一步熟悉数据结构的基本知识,利用所学的基本知识解决简单的程序设计问题。了解系统开
发的需求分析、概要设计、详细设计、调试分析和整体调试的全过程,加深对数据结构的理
解与Visual C++环境的使用,逐步熟悉程序设计的方法,并养成良好的编程习惯。 2. 设计内容和要求
设计内容:本系统应完成一下几方面的功能:
1) 输入信息——enter();
2) 显示信息———display( );
3) 查找以姓名作为关键字 ———search( );
4) 删除信息———delete( );
5) 存盘———save ( );
6) 装入———load( ) ;
设计要求:
1) 每条信息至包含 :姓名(NAME )街道(STREET)城市(CITY)邮编(EIP)国家(STATE)
几项
2) 作为一个完整的系统,应具有友好的界面和较强的容错能力 3) 上机能正常运行,并写出课程设计
3(本设计所采用的数据结构
数据包含:
五个数据成员:
char name[20]; 姓名
char street[20]; 街道
char city[20]; 城市
char eip[20]; 邮编
char state[20]; 国家
包含函数: 功能如下: void mainmenu(); 主菜单 void searchmenu(); 查找菜单 void enter(); 新添纪录
1
void search(); 按姓名查询
void display(); 显示所有
void load(); 读取文件
void save(); 写入文件
void delete(); 按姓名删除 void listinsert() 增加一个新信息结点 包含结构体:
struct record
{
char street[20];
char name[20];
char city[20];
char state[20];
char eip[20];
}student[500];
struct slnode
{
record date;
struct slnode *next;
struct slnode *prior;
};
4(功能模块详细设计
4.1 详细设计思想
围绕主函数进行每个子函数功能的完善,程序包含五个数据成员(name,street,state,eip,city),九个子函数(mainmenu,searchmenu,listinsert ,load,enter,search,display,load,save,delete),两个结构体(struct record,struct slnode),通过它们完成通讯录的各种功能(输入,查看全部,按姓名查找,删除,保存),再构造方便简洁的友好界面,使用简洁易懂的界面语言。
2
开始
执行main()函数
ch=getche()
switch(ch)
ch=getche()ch
=getche();,
ch=getche();选择操作编号
1 2 3 4 5 enter() Delet() Save() exit(0) search
menu
()
ch=getche()
switch(ch)
ch=getche()ch
=getche();,
ch=getche();
1查看全部 2以姓名查找 3返回主菜单
search() display()
3
将软件进行初始化,即在VC++6.0中运行该程序,进入程序主界面,首次运行建立文件,
提示文件是否成功建立。然后按任意键后进入主菜单。 界面显示的是“主菜单”,主菜单有五个方面:
1,新添记录
查询菜单 2,
3,删除联系人
4,保存退出
不保存退出 5,
查询菜单包括三个方面
1,显示所有
2,按姓名查询
3,返回主菜单
输入和存取人员信息,选择菜单界面的第1个选择进入此选择界面,根据提示,输入信息相关
信息。
按"2"显示查询的菜单。
按“3”删除指定联系人。
按“4”将输入的联系人信息保存到文件中并退出通讯录。 按“5”退出通讯录,不保存输入的联系人信息。 4.2 核心代码
#include
#include #include #include struct record
{
char name[20];
char street[20]; char city[20];
char eip[20];
char state[20];
4
}student[500];
struct slnode
{
record date;
struct slnode *next;
struct slnode *prior;
};
typedef slnode * linklist;
linklist l;
int num=0;
FILE *fp;
void mainmenu(); void searchmenu(); void enter();
void search();
void display(); void load();
void save();
void delet();
void listinsert(); void initlist(); void main()
{
initlist();
load();
listinsert();
while (1)
mainmenu(); }
void load()
5
{
if((fp=fopen("student.bin","rb"))==NULL)
{
printf("\n\t\t通讯录文件不存在");
if ((fp=fopen("student","wb"))==NULL)
{
printf("\n\t\t建立失败");
exit(0);
}
else
{
printf("\n\t\t通讯录文件已建立"); printf("\n\t\t按任意键进入主菜单"); getch();
return;
}
exit(0);
}
fseek(fp,0,2);
if (ftell(fp)>0)
{
rewind(fp);
for (num=0;!feof(fp) && fread(&student[num],sizeof(struct record),1,fp);num++);
printf("\n\t\t文件导入成功");
printf("\n\t\t按任意键返回主菜单"); getch();
return;
}
printf("\n\t\t文件导入成功");
printf("\n\t\t通讯录文件中无任何纪录");
6
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
void mainmenu()//主菜单
{
char choic;
system("cls");
printf("\n\t\t***************************************************");
printf("\n\t\t **+++++++++++++欢迎进入通讯录系统++++++++++++**");
printf("\n\t\t ** 1-新添纪录 **");
printf("\n\t\t ** 2-查找联系人 **");
printf("\n\t\t ** 3-删除联系人 **");
printf("\n\t\t ** 4-保存退出 **");
printf("\n\t\t ** 5-不保存退出 **");
printf("\n\t\t***************************************************");
printf("\n\t\t请选择:");
choic=getch();
switch (choic)
{
case '1':enter();break;
case '2':searchmenu();break;
case '3':delet();break;
case '4':save();break;
case '5':exit(0);
default:mainmenu();
}
}
void searchmenu()//查询子菜单
{
7
char choic;
printf("\n\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
printf("\n\t\t ~ 查询菜单 ~");
printf("\n\t\t ~ 1-显示所有 ~");
printf("\n\t\t ~ 2-按姓名查询 ~");
printf("\n\t\t ~ 3-返回主菜单 ~");
printf("\n\t\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
printf("\n\t\t请选择:");
choic=getch();
switch (choic)
{
case '1':display();break;
case '2':search();break;
case '3':mainmenu();break;
}
}
void enter()//添加新纪录信息
{
printf("\n\t\t**************** 请输入学生信息 ****************\n");
printf("\n\t\t姓名:");
scanf("%s",&student[num].name);
printf("\n\t\t街道:");
scanf("%s",&student[num].street);
printf("\n\t\t城市:");
scanf("%s",&student[num].city);
printf("\n\t\t输入邮编:");
scanf("%s",&student[num].eip);
printf("\n\t\t国家:");
scanf("%s",&student[num].state);
num++;
8
printf("\n\t\t是否继续添加?(Y/N):");
if (getch()=='y')
enter();
return;
}
void display()//显示所有记录
{
int i;
if(num!=0)
{
printf("\n\t\t*************** 以下为通讯录所有信息************");
for (i=0;idate.name,student[i].name);
strcpy(s->date.city,student[i].city);
10
strcpy(s->date.street,student[i].street);
strcpy(s->date.eip,student[i].eip);
strcpy(s->date.state,student[i].state);
s->prior=p->prior;
s->next=p;
p->prior->next=s;
p->prior=s;
p=p->next;
}
}
void initlist()//插入
{
l=new slnode;
l->next=l;
l->prior=l;
}
void search()//查找
{
int j=0,a=0;
printf("\n\t\t***************** 按姓名查找 *******************");
char name[20];
printf("\n\t\t请输入姓名:");
scanf("%s",name);
for(int i=a;i心得及存在问题
1)程序的编写应是:三分编写,七分调试;
2)程序编写之前需求分析,至关重要,将关系这整个项目的成败.
3)熟能生巧,这次在用指针处理双向链表时,以前对这块内容并不十分清楚,这次感觉 很吃力,所以在今后的编程之中,尽可能把基本技能练习熟练.
4)做软件最终是满足用户的需求,所以做软件时应一切应以用记为导向.
17
5)由于我们的知识浅薄,经验不足及阅历颇浅,因此,在该程序的设计方面还有很多的不足,会在以后的学习过程中,根据所学的知识不断的修改、完善,争取慢慢趋于完美。
存在问题:
原来按姓名查找功能不能实现,怎么实现都是“查无此人”, 后来经过查资料使用了if(strcmp(student[i].name,name)==NULL)语句,才使程序实现。总之还是因为基地打的不实, 以后一定巩固加强基础知识的认识。
18