文档库 最新最全的文档下载
当前位置:文档库 › c++_简单通讯录管理系统__课程设计_报告

c++_简单通讯录管理系统__课程设计_报告

目录一.程序功能分析******************

二.主要数据结构*******************

三.主要特色**********************

四.源代码*************************

五.测试数据组******************

六.心得和感想********************

1

一、程序功能分析

实现以下功能:

1) 通讯录编辑(输入、储存、添加、删除、显示);

2) 按不同的项进行查找;

3) 对已存在的通讯录按不同的项排序;

4) 将通讯录写入文件;

5) 从文件读入通讯录。

二、主要数据结构

class Node

{

char Name[10];//姓名

int OfficePhone;//办公室电话

int HomePhone;//住宅电话

char MobilePhone[15];//手机号码

char EMail[20];//email地址

Node *Next;//下一结点指针

public:

Node(char *pname=NULL, int ophone=0, int hphone=0,char *pmphone=NULL, char *pemail=NULL);

void Show();//显示结点数据 void SetName(char *name);//修改姓名

void SetOfficePhone(int o);//修改办公室电话

void SetHomePhone(int h);//修改住宅电话

void SetMobilePhone(char *m);//修改手机号码

void SetEMail(char *e);//修改email地址

friend class AddrList;//将AddrList类说明为友元类

friend void addfromtxtfile(AddrList &);//将addfromtxtfile说明为友元函数

friend void writetotxtfile(AddrList &);//将writetotxtfile说明为友元函数

};

class AddrList

{

Node *HeadPtr;//链表首指针

Node *TailPtr;//链表尾指针

int Tag;//排序状态标志,当Tag=1时,按姓名排序当Tag=2时,按办公室电话排序

public: //成员函数

AddrList(Node *head=NULL, Node *tail=NULL, int tag=1)//构造函数,产生空链表,将tag的值置为1

void AddTail(Node *p)//将p指向的结点加入到链表尾部

void AddSort(Node *p)//将p指向的结点按Tag指定的顺序插入到链表中

Node *LookUp(char *name)//按姓名查找结点,返回该结点指针

void del(char *name)//删除指定姓名的结点

void Sort(int tag)//按tag指定的关键字重新排序

2

void ShowAll()//显示全部结点,每10个显示一屏

void SetTag(int t)//置Tag值

int GetTag()//取tag值

Node *GetHeadPtr()//取首指针

~AddrList()//释放链表空间

void CreateList(char *filename)//从二进制文件中读入数据,//构造链表

void WriteToFile(char *filename)//将链表中数据//写入指定的二进制文件

};

三、主要特色

本程序主要特色有两个方面:

1.使用了链表和类共同完成通讯录各个功能的操作。

2.由于动态链表建立,可以自由使用。

四、源代码

#include

#include

#include

#include

#include

class Node

{ char Name[10];//姓名

int OfficePhone;//办公室电话

int HomePhone;//住宅电话

char MobilePhone[15];//手机号码

char EMail[20];//email地址

Node *Next;//下一结点指针

public:

Node(char *pname=NULL, int ophone=0, int hphone=0,

char *pmphone=NULL, char *pemail=NULL)

{

if(pname) strcpy(Name, pname);

else strcpy(Name, " ");

OfficePhone=ophone;

HomePhone=hphone;

if(pmphone) strcpy(MobilePhone, pmphone);

else strcpy(MobilePhone, " ");

if(pemail) strcpy(EMail, pemail);

else strcpy(EMail, " ");

}

void Show()//显示结点数据

{

cout<

(H)"<

}

3

void SetName(char *name)//修改姓名

{

strcpy(Name,name);

}

void SetOfficePhone(int o)//修改办公室电话

{

OfficePhone=o;

}

void SetHomePhone(int h)//修改住宅电话

{

HomePhone=h;

}

void SetMobilePhone(char *m)//修改手机号码

{

strcpy(MobilePhone,m);

}

void SetEMail(char *e)//修改email地址

{

strcpy(EMail,e);

}

friend class AddrList;//将AddrList类说明为友元类

friend void addfromtxtfile(AddrList &);//将addfromtxtfile说明为友元函数

friend void writetotxtfile(AddrList &);//将writetotxtfile说明为友元函数

}; //链表类

class AddrList

{

Node *HeadPtr;//链表首指针

Node *TailPtr;//链表尾指针

int Tag;//排序状态标志,当Tag=1时,按姓名排序当Tag=2时,按办公室电话排序

public: //成员函数

AddrList(Node *head=NULL, Node *tail=NULL, int tag=1)//构造函数,产生空链表,将tag的值置为1

{

HeadPtr=head;

TailPtr=tail;

Tag=tag;

}

void AddTail(Node *p)//将p指向的结点加入到链表尾部

{

if(HeadPtr==NULL)

{

HeadPtr=p;

TailPtr=p;

p->Next=NULL;

}

else

{

TailPtr->Next=p;

4

p->Next=NULL;

TailPtr=p;

}

}

void AddSort(Node *p)//将p指向的结点按Tag指定的顺序插入到链表中

{

Node *p1, *p2;

if(Tag==1)//按姓名排序

{

if(HeadPtr==NULL)//如果插入前原始链表为空链表

{

HeadPtr=p;

TailPtr=p;

p->Next=NULL;

}

else

{

if(strcmp(p->Name, HeadPtr->Name)<=0)//插在链表首部 {

p->Next=HeadPtr;

HeadPtr=p;

}

else//插在链表中间或尾部

{

p1=HeadPtr; p2=HeadPtr;

while(p2->Next&&(strcmp(p2->Name, p->Name)<0))//查找待插入位置

{p1=p2; p2=p2->Next;}

if(strcmp(p2->Name, p->Name)<0)//插在链表尾部

{p2->Next=p; p->Next=NULL; TailPtr=p;}

else//插在链表中间,p2之前

{p->Next=p2; p1->Next=p;}

}

}

}

else//按办公室电话排序

{

if(HeadPtr==NULL)//如果插入前原始链表为空链表

{

HeadPtr=p;

TailPtr=p;

p->Next=NULL;

}

else

{

if((p->OfficePhone-HeadPtr->OfficePhone)<=0)//插在链表首部

{

p->Next=HeadPtr;

HeadPtr=p;

5

}

else//插在链表中间或尾部

{

p1=HeadPtr;

p2=HeadPtr;

while(p2->Next&&((p2->OfficePhone-p->OfficePhone)<0))//查找待插入位置

{p1=p2; p2=p2->Next;}

if((p2->OfficePhone-p->OfficePhone)<0)//插在链表尾部

{p2->Next=p; p->Next=NULL; TailPtr=p;}

else//插在链表中间,p2之前

{p->Next=p2; p1->Next=p;}

}

}

}

}

Node *LookUp(char *name)//按姓名查找结点,返回该结点指针

{

Node *p;

p=HeadPtr;

while(p!=NULL)

{

if(strcmp(p->Name, name)==0) return p;

p=p->Next;

}

return NULL;

}

void del(char *name)//删除指定姓名的结点

{

Node *p1, *p2;

if(strcmp(HeadPtr->Name, name)==0)//若待删除的结点为首结点 {

p1=HeadPtr;

HeadPtr=HeadPtr->Next;

delete p1;

cout<<"删除了联系人"<

system("pause");

}

else//删除其他结点

{

p1=HeadPtr;

p2=HeadPtr;

while(strcmp(p2->Name, name)!=0&&p2->Next!=NULL) {

p1=p2;

p2=p2->Next;

}

if(strcmp(p2->Name, name)==0)

{

p1->Next=p2->Next;

6

delete p2;

cout<<"删除了一个联系人的信息!"<

system("pause");

}

}

}

void Sort(int tag)//按tag指定的关键字重新排序 {

Node *p1, *p2;

Tag=tag;

p2=HeadPtr;

HeadPtr=NULL;

TailPtr=NULL;

while(p2)

{

p1=p2->Next;

AddSort(p2);

p2=p1;

}

TailPtr->Next=NULL;

}

void ShowAll()//显示全部结点,每10个显示一屏

{

int n=0;

Node *p;

if(HeadPtr==NULL)

{

cout<<"链表为空,没有记录可显示!"<

}

else for(p=HeadPtr; p!=NULL; p=p->Next)

{

p->Show();

n++;

if(n%10==0) {cout<<"按任意键显示下一屏:"<

}

void SetTag(int t)//置Tag值

{Tag=t;}

int GetTag()//取tag值

{return Tag;}

Node *GetHeadPtr()//取首指针

{return HeadPtr;}

~AddrList()//释放链表空间

{

Node *p;

if(HeadPtr==NULL) ;

else

{

while(HeadPtr)

7

{

p=HeadPtr;

HeadPtr=HeadPtr->Next;

delete p;

}

}

}

void CreateList(char *filename)//从二进制文件中读入数据,//构造链表

{

ifstream infile(filename, ios::in|ios::binary|ios::nocreate);

if(!infile) {cout<<"文件"<

else

{

infile.read((char *)&Tag, 4);//读出二进制文件的第1个数据Tag

int n;

infile.read((char *)&n, 4);//读出记录数

Node *p;

for(int i=0; i

{

p=new Node;

infile.read((char *)p, sizeof(Node));

AddTail(p);

}

}

infile.close();

cout<<"数据从二进制文件加载成功!"<

}

void WriteToFile(char *filename)//将链表中数据

//写入指定的二进制文件

{

ofstream outfile;

outfile.open(filename, ios::out|ios::binary);

outfile.write((char *)&Tag, 4);

Node *p, *p1;

int n=0;

for(p1=HeadPtr; p1!=NULL; p1=p1->Next) n++;

outfile.write((char *)&n, 4);

p=HeadPtr;

while(p)

{

outfile.write((char *)p, sizeof(Node));

p=p->Next;

}

cout<<"成功导出二进制文件"<

outfile.close();

}

};

void DisplayMenu()//主菜单

8

{

char *menu[]={ " ",

" ",

" ",

" ",

" ***********通讯录管理系统************* ",

" ",

" 1. Add Record ",

" 2. Delete Record",

" 3. Display All Record",

" 4. Query by Name",

" 5. Modify Record",

" 6. Add from a Text File",

" 7. Write to a Text File",

" 8. Sort",

" 9. Quit",

" 请选择(1--9) : ",

" ",

"

************************************** ",

NULL } ;

system("cls");

for (int i=0;menu[i];i++)

cout << menu[i]<

};

for(int i=0;menu[i];i++)

cout<

cout<<"请选择请输入1—9序号:"<<'\n';

};

//功能5有子菜单:

void ShowModiMenu()

{

char *submenu[]={"(1) 修改姓名",

"(2) 修改办公室电话",

"(3) 修改住宅电话",

"(4) 修改手机号码",

"(5) 修改email地址\n",

"(0) 不修改,返回主菜单",

NULL};

for(int i=0; submenu[i]; i++)

{

cout<

}

cout<<"请输入选择:";

}

//以下为处理函数

void add(AddrList &addrlist)//增加记录,按Tag排序

{

cout<<"请输入姓名、办公室电话、住宅电话、手机号码、email地址:

9

"<

char name[10], m[15],e[20];

int o,h;

cin>>name>>o>>h>>m>>e;

Node *p;

p=new Node(name, o, h, m, e);

p->Show();

addrlist.AddSort(p);

cout<<"添加成功!是否继续添加?[y/n]";

char t;

cin>>t;

if(t=='y'||t=='Y') add(addrlist);

}

void del(AddrList &addrlist)//删除记录{

if(addrlist.GetHeadPtr()==NULL)

{

cout<<"链表为空,没有记录可删!"<

cout<<"请输入要删除的联系人的姓名:";

char n[10];

cin>>n;

Node *p;

p=addrlist.LookUp(n); if(p==NULL)

{

cout<<"链表上没有联系人"<

}

else

p->Show();

cout<<"确认删除?[y/n]";

char t;

cin>>t;

if(t=='y') addrlist.del(n);

}

void showall(AddrList &addrlist)//显示所有记录

{

addrlist.ShowAll();

system("pause");

}

void query(AddrList &addrlist)//按姓名查找并显示一条记录

{

if(addrlist.GetHeadPtr()==NULL)

{cout<<"链表为空,没有联系人可查找!"<

}

else

{

cout<<"请输入要查找的联系人的姓名:";

char n[10];

10

cin>>n;

Node *p;

p=addrlist.LookUp(n);

if(p==NULL)

{

cout<<"没有"<

}

else

{

cout<<"该联系人的记录为:";

p->Show();

}

system("pause");

}

}

void modify(AddrList &addrlist)//按姓名修改一条记录{

if(addrlist.GetHeadPtr()==NULL)

{

cout<<"链表为空,没有记录可修改!"<

}

else

{

cout<<"请输入要修改的联系人的姓名:";

char n[10]; cin>>n;

Node *p;

p=addrlist.LookUp(n);

if(p==NULL)

{

cout<<"没有"<

}

else

{

cout<<"该联系人的记录为:";

p->Show();

}

ShowModiMenu();

int m, state;

state=cin.rdstate();

if(state)

{

char str[80]; cin.clear(); cin.getline(str, 80);

}

cin>>m;

if(m==1)//修改姓名

{

cout<<"请输入修改后的姓名:";

char n[10];

cin>>n;

p->SetName(n);

11

cout<<"修改成功!新的记录为:";

p->Show();

if(addrlist.GetTag()==1)

addrlist.Sort(1);//判断是否需要重新排序 system("pause");

}

else if(m==2)//修改办公室电话

{

cout<<"请输入修改后的办公室电话:";

int o;

cin>>o;

p->SetOfficePhone(o);

cout<<"修改成功!新的记录为:";

p->Show();

if(addrlist.GetTag()==2)

addrlist.Sort(2);//判断是否需要重新排序

system("pause");

}

else if(m==3)//修改住宅电话

{

cout<<"请输入修改后的住宅电话:";

int h;

cin>>h;

p->SetHomePhone(h);

cout<<"修改成功!新的记录为:";

p->Show(); system("pause");

}

else if(m==4)//修改手机号码

{

cout<<"请输入修改后的手机号码:";

char m[15];

cin>>m;

p->SetMobilePhone(m); cout<<"修改成功!新的记录为:";

p->Show();

system("pause");

}

else if(m==5)//修改email地址

{

cout<<"请输入修改后的email地址:";

char e[20];

cin>>e;

p->SetEMail(e);

cout<<"修改成功!新的记录为:";

p->Show();

system("pause");

}

else if(m==0)//不修改,返回主菜单

{return;}

}

}

12

void addfromtxtfile(AddrList&addrlist)

{

char filename[10], name[10],email[20],mobilephone[15];

int officephone,homephone;

ifstream infile;

cout<<"input filename"<

cin>>filename;

infile.open(filename);

int n;

infile>>n;

for(int i=0;i

{

Node*p=new Node;

infile>>name;

p->SetName(name);

infile>>officephone;

p->SetOfficePhone(officephone);

infile>>homephone;

p->SetHomePhone(homephone);

infile>>mobilephone;

p->SetMobilePhone(mobilephone);

infile>>email;

p->SetEMail(email);

addrlist.AddSort(p);

}

infile.close();

}

void writetotxtfile(AddrList &addrlist)//将库表中的数据导出到正文文件

{

cout<<"请输入目标文件的文件名(扩展名为txt):";

char filename[80];

cin.get();

cin.getline(filename, 80);

ofstream out;

out.open(filename);

if(!out)

{

cout<<"创建文件失败!"<

exit(2);

}

else

{

Node *p;

p=addrlist.GetHeadPtr();

while(p)

{

out<Name<<'

'<OfficePhone<<"(O)"<HomePhone<<"(H)

"<MobilePhone<<"(M) "<EMail<

13

p=p->Next;

}

}

out.close();

cout<<"成功导出正文文件!"<

}

void sort(AddrList &addrlist)//排序库表

{

if(addrlist.GetHeadPtr()==NULL)

{

cout<<"链表中没有记录可排序!"<

}

else if(addrlist.GetTag()==1)

{

cout<<"当前排序关键字为姓名,是否将其改为办公室电话?[y/n]"; char t;

cin>>t;

if(t=='y') {addrlist.SetTag(2); addrlist.Sort(2);}

else return;

}

else if(addrlist.GetTag()==2)

{

cout<<"当前排序关键字为办公室电话,是否将其改为姓名?[y/n]"; char t;

cin>>t;

if(t=='y')

{

addrlist.SetTag(1);

addrlist.Sort(1);

}

else return;

}

cout<<"排序完成!"<

}

void quit(AddrList &addrlist)//退出系统,内部做结尾工作

{

addrlist.WriteToFile("addrlist.dat");

system("pause"); exit(0);

}

void main()//主函数

{

int choice=0, state;

AddrList addrlist;

addrlist.CreateList("addrlist.dat");//从二进制文件中读入数据,

14

//构建链表

while(choice!=9)//循环菜单处理

{

system("cls");

DisplayMenu();//显示主菜单

cin>>choice;

state=cin.rdstate();

if(state)

{

char str[80];cin.clear();cin.getline(str,80);choice=10;

}

switch(choice)

{

case 1: add(addrlist); break;

case 2: del(addrlist); break;

case 3: showall(addrlist); break;

case 4: query(addrlist); break;

case 5: modify(addrlist); break;

case 6: addfromtxtfile(addrlist); break;

case 7: writetotxtfile(addrlist); break;

case 8: sort(addrlist); break;

case 9: quit(addrlist); break;

default : ;

}

}

}

五、测试数据组

吴一84891234 84892345 139******** Wu@https://www.wendangku.net/doc/c55931605.html,

王二84893456 84894567 130******** Wang@https://www.wendangku.net/doc/c55931605.html,

张三84895678 84896789 139******** Zhang@https://www.wendangku.net/doc/c55931605.html,

李四84890111 84893333 130******** Li@https://www.wendangku.net/doc/c55931605.html,

周五84890555 84896666 187******** Zhou@https://www.wendangku.net/doc/c55931605.html,

六、心得和感想

经过一个学期的学习和上机实践,使我对C++语言有了更认识和和了解,通过实践,我发现我的好多不足之处,对各种控制结构及语句、数组的基本与高级应用、指针数组、字符数组、动态数组、函数的定义、调用方式;函数在编程中的具体应用;以及变量存储特征与标识符的作用域,通过实践,使我在这些方面有了认识和提高。课程设计它是一项任务,更是一种挑战和历练,更是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握程序开发技术是十分重要的,而C++语言又是最常见,功能最强大的一种高级语言,因此做好C++语言课程设计是十分必要的。

通过几天的课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正

15

为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问

题,可以说得是困难重重,这毕竟第一次真真的做程序设计,难免会遇到过各种各样的

问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够

深刻,掌握得不够牢固,比如说类,链表,指针……通过这次课程设计之后,我们把前

面所学过的知识又重新温故了一遍。

费劲心思,不过,当我的成果摆在眼前的时候,突然发现,几天的努力没有白费,

我成功了,成功的做出了我的第一个作品,虽说不是很完美,但是,我觉得,我付出了,

就会有收获,我掌握了一门技术。

在课程设计过程中,我学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去

实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪,黑夜过去了,

我们收获的是黎明。

16

相关文档
相关文档 最新文档