课程设计报告
——简单通讯录管理
一 程序功能
该通讯录是一个简单的数据库库
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
,每一个
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
(结点)包含一个人的所有通讯信息,详见后面源代码中的Node类的定义。
程序执行过程是:显示主菜单,用户在Input1~9,0:处输入选项(按照功能列表输入0~9中的一个数字),按回车后,执行相应功能。
1. Add Record(增加记录)
用户按提示输入各个字段。一次输入一个人的数据。新记录加入后,通讯录按指定的排序顺序排序。初始时,默认按“姓名”排序;选择菜单“8.Sort”后可修改排序顺序为按“办公室电话”排序。指定一种排序方法后,就一直保持此排序方法,直到重新指定。菜单“8.Sort”可在两种排序方法之间切换。
2. Delete Record(删除记录)
用户根据提示输入待删除的姓名,系统删除该姓名的所有信息。
3. Display All Record(显示所有记录)
系统按指定顺训显示所有记录,每显示十条记录,暂停,用户按
键继续。
4. Query(按姓名查找并显示一个记录)
用户按提示输入待查找的姓名,按键,显示改姓名下所有信息。
5.Modify Record(按姓名查找,并修改一个记录)
用户按提示输入待修改的姓名,系统会显示该姓名下所有信息,同时会显示子菜单,用户按子菜单提示,指定修改哪一个数据项。
子菜单如下:
(1) Modify Name //修改姓名
(2) Modify Office Phone //修改办公室电话
(3) Modify Home Phone //修改住宅电话
(4) Modify Mobile Phone //修改手机号码
(5) Modify Email //修改email地址
Input1~4:
6.Add from a Text File(从正文文件中批量添加数据到链表中)
用户可建立一个正文文件(格式见实现说明中的“输入数据文件格式”),存放待加入的数据,然后从该文件中一次性导入多个人员的数据。程序运行时,用户需按提示输入中文文件名。
7.Write to a Text File
将库表中的数据写入一个中文文件中(格式见下面的“导出数据文件格式” 说明)。程序运行时用户需要按提示输入中文文件名。
8.Sort(排序)
首先显示当前排序关键字,然后会提示是否要修改,用户可根据需要回答是否要修改。该系统包含两种排序方式,按姓名和按办公室电话,可在两者间切换。
9.Delete All(删除所有记录)
0.Quit(退出系统)
二 题目分析、问题及解决、心得
题目分析:该通讯记录需要记录每个人的所有通讯信息,可以定义一个Node类进行记录,要实现多个人的信息统一记录,则需要用一个链表来实现,此链表又必须包含每个人的所有信息,所以将其定义为Node的友元类以方便记录。而主菜单的每一项功能需要用单个函数实现,故运用函数调用可实现该系统的各项功能。
问题及解决:主要问题是各个函数调用关系比较复杂,链表内外对其数据的调用关系;通过在纸上写出其调用的关系理清各函数作用并与同学讨论解决。
心得:编写过程中需要特别仔细,尤其是分号及大小写。同时加深了自己对链表、指针的理解,以及曾强了自己对函数调用关系的分析能力。
三 源代码及注释
#include
#include
#include
#include
#include
#include //包含的头文件
#define len sizeof(Node) //从文件中一次读取或读入的数据长度
class Node
{
char Name[10]; //姓名
int OfficePhone; //办公室电话
int HomePhone; //住宅电话
char MobilePhone[15]; //手机号码
char Email[20]; //email地址
Node *next; //下一个结点指针
public:
Node(char *N="nn",int O=0,int H=0,char *M="1",char *E="afsd") //带缺省值的构造函数
{
strcpy(Name,N);
strcpy(MobilePhone,M);
strcpy(Email,E);
OfficePhone=O;
HomePhone=H;
}
void Show() //显示结点数据
{
cout<next=p;
TailPtr=p;
p->next=NULL;
}
}
void AddSort(Node *p) //将p指向的结点按tag指定的顺序插入到链表中
{
if(HeadPtr==NULL) //链表为空时
{
HeadPtr=TailPtr=p;
p->next=NULL;
}
else //链表不为空
{
Node *p1=HeadPtr,*p2=HeadPtr;//定义Node型指针并初始化
if(tag==1)
{
if(strcmp(HeadPtr->Name,p->Name)>=0) //将姓名进行字符间比较,p指向的结点的姓名小于首结点时
{ p->next=HeadPtr; HeadPtr=p; }
else
{
while(p1->next && strcmp(p1->Name,p->Name)<0)//查找姓名较p小的结点
{
p2=p1; //保存结点
p1=p1->next; //指向下一个结点
}
if(strcmp(p1->Name,p->Name)<0) AddTail(p); //若该结点姓名仍较小,插入链表尾部
else //将p插入满足条件的结点于下一结点之间
{ p2->next=p;p->next=p1;}
}
}
if(tag==2)
{
if(p->OfficePhone<=HeadPtr->OfficePhone) //将办公室电话进行比较,p指向的结点的办公室电话小于首结点时
{ p->next=HeadPtr; HeadPtr=p; }
else
{
while(p1->next&&p1->OfficePhoneOfficePhone)//查找办公室电话较p小的结点
{ p2=p1;p1=p1->next;} //p2保存结点,p1指向下一个结点
if(p1->OfficePhoneOfficePhone) AddTail(p); //若该结点办公室电话仍较小,插入链表尾部
else //将p插入满足条件的结点于下一结点之间
{ p2->next=p;p->next=p1; }
}
}
}
}
Node *LookUp(char *name) //按姓名查找结点,返回改结点指针
{
Node *p=HeadPtr;
while(p)
{
if(strcmp(p->Name,name)==0) return p; //查找到结点后,返回结点指针,结束调用
p=p->next;
}
return NULL; //未查找到,返回空指针
}
void Delete(char *name) //删除指定姓名结点
{
Node *p1=HeadPtr,*p2;
while(p1->next&&strcmp(p1->Name,name)) //循环查找待删除的指定结点
{
p2=p1;p1=p1->next;
}
if(strcmp(p1->Name,name)==0)//找到待删除的指定结点,由p1指向
{
if(p1==HeadPtr) //若找到的结点是首结点
HeadPtr=p1->next;
else //若找到的结点不是首结点
p2->next=p1->next;
delete p1;
cout<<"已删除该姓名!"<next=NULL;
p=p->next;
AddSort(p1);
}
}
void ShowAll() //显示全部结点,每10个一屏
{
Node *p=HeadPtr;
int i=1;system("cls");
while(p) //循环调用,逐个显示结点数据
{
cout<Show();
p=p->next;
if(i++%10==0)
{ system("pause");system("cls");}
}
}
void SetTag(int t) //置tag值
{ tag=t;}
int GetTag() //取tag值
{ return (tag);}
int Count() //统计链表中结点(记录)个数
{
int i=0;Node *p=HeadPtr;
while(p)
{ p=p->next;i++;}
return i;
}
Node *GetHeadPtr() //取首指针
{ return (HeadPtr); }
void DeleteAll() //删除所有数据
{
Node *p;
while(HeadPtr)
{
p=HeadPtr;
HeadPtr=HeadPtr->next;
delete p;
}
}
~AddrList() //释放链表空间
{
Node *p;
while(HeadPtr)
{
p=HeadPtr;
HeadPtr=HeadPtr->next;
delete p;
}
}
void CreateList(char *filename) //从二进制文件中读入数据,构造链表
{
Node *p[100];int i=0;
fstream file(filename,ios::in|ios::binary); //以读方式打开二进制文件
if(!file) //文件打开失败
{
cout<<"不能打开该文件:"<next;
}
file.close(); //关闭文件filename
}
void OutText(char *file) //将链表中的数据导入file文件
{
Node *p;p=HeadPtr;
int n=1;
fstream out(file,ios::out);
if(!out) //文件打开失败
{
cout<<"不能打开该文件:"<next;
}
out.close(); //关闭文件file
}
};
int menu_select() // 设置主菜单
{
char *menu[]={ "1.AddRecord","2.Delete Record","3.Display All Record","4.Qurery By Nme","5.Modify Record","6.Add From a Text File",
"7.Write to a Text File","8.Sort","9.Delete All","0.Quit",NULL};//用字符型指针数组存储主菜单选项
int i;
int choice;
do //输出主菜单选项,并输入要操作的项的序号
{
system("cls");
cout<<"\n\n=====Address Book Managing System=====\n\n";
for(i=0;menu[i];i++)
cout<