您的位置:首页 > 理论基础 > 数据结构算法

数据结构课程设计——通讯录管理系统

2015-12-25 22:59 756 查看
/***********************************************************
*版权所有  (C)2015. ChengAng
*
*文件名称:   zupu.cpp
*文件标识:   无
*内容摘要:   该项目的所有函数的实现
*其他说明:   无
*当前版本:   V1.0
*作   者:    程昂
*完成日期:   20151223
*
*修改记录1:
*修改日期:   20151223
*版本号:     V1.0
*修改人:     Cheng Ang
*修改内容:
********************************************************************/

#include"zupu.h"
/***********************************************************
*功能描述:  主函数,负责项目的调度
*输入参数:   无
*输出参数:   无
*返回值:     无
*其他说明:   无
*************************************************************/
int main()     //主函数
{
creat();
huanying();
Save();
return 0;
}
/***********************************************************
*功能描述:新建或者打开已经存在的文件,从中读取内容
*输入参数:   无
*输出参数:   无
*返回值:     无
*其他说明:   无
*************************************************************/
void creat()     //创建或读取文件
{
int j;
long k;
fp=fopen("数据文件.txt","r t");
if(fp!=NULL)
{
for(i=0; i<=maxlen; i++ )
{
j=fgetc(fp);

if(j==EOF)

return;
k=i;
fseek(fp,k*sizeof(struct persons),0);

fread(&persons[i],sizeof(struct persons),1,fp);

s=(linklist)malloc(sizeof(listnode));

s->num=persons[i].num;

strcpy(s->name,persons[i].name);

strcpy(s->e_addr,persons[i].e_addr);

strcpy(s->tel_no,persons[i].tel_no);

s->sim_no=persons[i].sim_no;

strcpy(s->arch,persons[i].arch);

s->cishu=persons[i].cishu;

if(head==NULL)   //若为空,则建立新节点
{
head=s;
r=head;
head->next=NULL;
}
else         //否则,插入节点
{
r->next=s;
r=s;
r->next=NULL;
}
}
fclose(fp);
}
else                            //存入文件
{
fp=fopen("数据文件.txt","w");
i=1;
}
}
/***********************************************************
*功能描述:   开始界面,提供选择操作的界面
*输入参数:   选择键
*输出参数:   无
*返回值:     无
*其他说明:   通过选择进入各种功能
*************************************************************/
void huanying()     //选择界面
{
system("cls");   //清屏
do
{
xiaotu();
cout<<"                欢迎使用通讯录管理系统~~~~~~~"<<endl;
cout<<endl;
cout<<"+---------------------------------------------------------+"<<endl;
cout<<"+ 1.显示分组信息请按1           4.编辑信息请按4           +"<<endl;
cout<<"+ 2.删除信息请按2               5.拨号请按5               +"<<endl;
cout<<"+ 3.添加信息请按3               6.保存并退出请按6         +"<<endl;
cout<<"+ 7.查找信息请按7               8.输出全部信息请按8       +"<<endl;
cout<<"+---------------------------------------------------------+"<<endl;
cout<<endl;
cout<<"请输入您的的选择-----"<<endl;
cin>>ch;
switch(ch)           //选择操作
{
case '1':
system("cls");
Show();
break;
case '2':
system("cls");
Delete();
break;
case '3':
system("cls");
Input();
break;
case '4':
system("cls");
Alter();
break;
case '5':
system("cls");
Dial();
break;
case '6':
system("cls");
Save();
fclose(fp);
xiaotu();
exit(0);
break;
case '7':
system("cls");
find();
break;
case '8':
system("cls");
shuchu();
break;
default:
printf("\n\t*********************************\n");
printf("\n\t 请输入 1-8!!! \n");
printf("\n\t**********************************");
break;
}
}
while(1);
}
/***********************************************************
*功能描述:   添加一个人的信息;插入到链表
*输入参数:   联系人信息
*输出参数:   无
*返回值:     无
*其他说明:   会有判断该人是否存在的功能;
若存在则有返回重新输入或者回到主界面的功能.
*************************************************************/
void Input()      //添加信息
{
int choic;
s=(linklist)malloc(sizeof(listnode));    //建立头节点
cout<<"----------------------------------------------"<<endl;
printf("\n\n\t            请输入该用户的信息:\n");
cout<<"请输入姓名:        ";
cin>>s->name;
cout<<"请输入电话:        ";
cin>>s->tel_no;
cout<<"请设置快捷键(0-9): ";
cin>>s->sim_no;
cout<<"请输入地址:        ";
cin>>s->e_addr;
cout<<"请输分组名         ";
cin>>s->arch;
s->cishu=0;
cout<<"----------------------------------------------"<<endl;
if(head==NULL)
printf("\n\n");
else
{
p8=head;
while(p8!=NULL&&strcmp(s->name,p8->name)!=0&&strcmp(s->tel_no,p8->tel_no)!=0)
p8=p8->next;

if(p8!=NULL)
{
cout<<"+----------------------------------------------+"<<endl;
cout<<"+------------您添加的用户已存在!---------------+"<<endl;
cout<<endl;
cout<<"+       重新输入请按1,返回菜单请按 3          +"<<endl;
cout<<endl;
cout<<"+----------------------------------------------+"<<endl;
cin>>choic;
if(choic==1)
Input();
if(choic==3)
huanying();
free(s);
}
}
if(head==NULL)
{
head=s;
head->next=NULL;
}
else
{
r->next=s;
r=s;
r->next=NULL;        //尾插法
}
}
/***********************************************************
*功能描述:   查找一个联系人信息的功能
*输入参数:   联系人姓名
*输出参数:   该联系人信息
*返回值:     无
*其他说明:   无
*************************************************************/
void find()           //查找功能
{
int choic;
system("cls");
printf("\n\n\t             请输入姓名:");
cin>>name1;
p10=head;
while(p10!=NULL&&strcmp(name1,p10->name)!=0)           //判断是否存在
p10=p10->next;
if(p10==NULL)
{
printf("\n\n\t             您选择的用户不存在!");
printf("\n\n\t2   请重新输入,请选择是重新输入(1)还是返回主菜单(2)");
cin>>choic;
if(choic==1)
{
find();
}
if(choic==2)
{
system("cls");
huanying();
}
}
else
{
cout<<"----------------------------------------------"<<endl;
cout<<"+   名  字:  "<<p10->name<<endl;
cout<<"----------------------------------------------"<<endl;
cout<<"+   电  话:  "<<p10->tel_no<<endl;
cout<<"----------------------------------------------"<<endl;
cout<<"+   快捷键:  "<<p10->sim_no<<endl;
cout<<"----------------------------------------------"<<endl;
cout<<"+   分  组:  "<<p10->arch<<endl;
cout<<"----------------------------------------------"<<endl;
cout<<"+  拨打次数: "<<p10->cishu<<endl;
cout<<"----------------------------------------------"<<endl;
cout<<"**********************************************"<<endl;

cout<<endl;
cout<<"返回界面请按1"<<endl;
cout<<endl;
cout<<"----------------------------------------------"<<endl;
cin>>choic;
if(choic==1)
{
system("cls");
huanying();
}
}
}
/***********************************************************
*功能描述:  编辑一个联系人的信息
*输入参数:   联系人信息
*输出参数:   无
*返回值:     无
*其他说明:   这里运用了input()的功能,同样有input()的判断功能
*************************************************************/
void Alter()         //编辑信息
{
int choic;
cout<<"+----------------------------------------------+"<<endl;
cout<<endl;
printf("\n\n\t           请输入姓名:");
cin>>name1;
cout<<endl;
cout<<"+----------------------------------------------+"<<endl;
p3=head;
while(p3!=NULL&&strcmp(name1,p3->name)!=0)
p3=p3->next;
if(p3==NULL)
{
cout<<"+----------------------------------------------+"<<endl;
cout<<"+------------您选择的用户不存在!---------------+"<<endl;
cout<<endl;
cout<<"+       重新输入请按1,返回菜单请按 3          +"<<endl;
cout<<endl;
cout<<"+----------------------------------------------+"<<endl;
cin>>choic;
if(choic==1)
Alter();
if(choic==3)
huanying();
}
else
{
cout<<endl;
printf("\n\n\t           请输入该用户的新信息!");
cout<<"----------------------------------------------"<<endl;
printf("\n\n\t            请输入该用户的信息:\n");
cout<<"请输入姓名:";
cin>>s->name;
cout<<"请输入电话:";
cin>>s->tel_no;
cout<<"请设置快捷键(0-9):";
cin>>s->sim_no;
cout<<"请输入地址:";
cin>>s->e_addr;
cout<<"请输分组名";
cin>>s->arch;
s->cishu=0;
cout<<"----------------------------------------------"<<endl;
while(p9!=NULL&&strcmp(name1,p9->name)!=0&&strcmp(tel_no1,p9->tel_no)!=0)
p9=p9->next;
if(p9==NULL)
{
strcpy(p3->name,name1);
strcpy(p3->tel_no,tel_no1);
strcpy(p3->e_addr,e_addr1);
p3->sim_no=sim_no1;
strcpy(p3->arch,arch1);
}
else
{
cout<<"+----------------------------------------------+"<<endl;
cout<<"+------------您添加的用户已存在!---------------+"<<endl;
cout<<endl;
cout<<"+               返回菜单请按 1                 +"<<endl;
cout<<endl;
cout<<"+----------------------------------------------+"<<endl;
cin>>choic;
if(choic==1)
{
system("cls");
huanying();
}
}
}
}
/***********************************************************
*功能描述:  进行对分组的选择功能
*输入参数:  分组名字
*输出参数:  无
*返回值:    分组名字
*其他说明:  无
*************************************************************/
void Show()      //选择想要查看的分组
{
p2=head;
int choic;
char ch1[10];

if(p2==NULL)    //若为空
{
cout<<"----------------------------------------------"<<endl;
cout<<"                暂时没有分组                  "<<endl;
cout<<"----------------------------------------------"<<endl;
cout<<"                按1返回主菜单                 "<<endl;
cout<<"----------------------------------------------"<<endl;
cin>>choic;
if(choic==1)
huanying();

}
else
{
printf("                 你想要查看哪个分组?              \n");
while(p2!=NULL)                                       //通过不断指向下一个节点读取分组信息
{

cout<<"------------分组:    "<<p2->arch<<endl;
p2=p2->next;
continue;
}
cout<<"               请输入分组名字选择     "<<endl;
cout<<"                                      "<<endl;
cin>>ch1;
ShowA(ch1);
}

}
/***********************************************************
*功能描述:输出一个分组的全部联系人的信息
*输入参数:   选择键
*输出参数:   无
*返回值:     无
*其他说明:   无
*************************************************************/
void ShowA(char aa[10])    //打印分组联系人信息
{
int choic;
p11=head;
if(p11==NULL)
{
cout<<"----------------------------------------------"<<endl;
cout<<endl;
cout<<"该分组暂时没人,返回界面请按1,继续选择请按3"<<endl;
cout<<endl;
cout<<"----------------------------------------------"<<endl;

cin>>choic;
if(choic==1)
huanying();
if (choic==3)
Show();
}

else
while(p11!=NULL)
{
if((strcmp(p11->arch,aa))==0)
{
cout<<"----------------------------------------------"<<endl;
cout<<"+   名  字:  "<<p11->name<<endl;
cout<<"----------------------------------------------"<<endl;
cout<<"+   电  话:  "<<p11->tel_no<<endl;
cout<<"----------------------------------------------"<<endl;
cout<<"+   快捷键:  "<<p11->sim_no<<endl;
cout<<"----------------------------------------------"<<endl;
cout<<"+   分  组:  "<<p11->arch<<endl;
cout<<"----------------------------------------------"<<endl;
cout<<"+  拨打次数: "<<p11->cishu<<endl;
cout<<"----------------------------------------------"<<endl;
cout<<"**********************************************"<<endl;
}
p11=p11->next;
continue;
}
cout<<endl;
cout<<"返回界面请按1,继续选择请按3"<<endl;
cout<<endl;
cout<<"----------------------------------------------"<<endl;

cin>>choic;
if(choic==1)
{
system("cls");
huanying();
}
if (choic==3)
{
system("cls");
Show();
}

}

/***********************************************************
*功能描述:  删除一个联系人的信息
*输入参数:  联系人姓名
*输出参数:   无
*返回值:     无
*其他说明:   先进行查找是否有该联系人
*************************************************************/
void Delete()        //删除通讯人信息
{
printf("\n\n\t          请输入要删除用户的姓名:");
cin>>name1;
p4=head;
if(strcmp(p4->name,name1)==0)
{
p4=p4->next;
head=p4;
}
else
{
while(strcmp(p4->next->name,name1)!=0)
p4=p4->next;

p5=p4->next;
p4->next=p5->next;
free(p5);
}
}

/***********************************************************
*功能描述:   拨号动画的功能;该联系人拨号次数+1
*输入参数:   选择键1、2;(1)输入姓名、(2)输入快捷键
*输出参数:   联系人电话,拨号次数
*返回值:     拨号次数
*其他说明:   动画过程用了时间函数
*************************************************************/
void Dial()       //拨号功能
{
int c,choic;
int a;
char b;
cout<<"+----------------------------------------------+"<<endl;
cout<<"+     拨叫用户请按(1)    使用单键拨号请按(2)   +"<<endl;  //两种拨号方式
cout<<"+----------------------------------------------+"<<endl;
cin>>a;
p0=head;
if(a==1)
{
cout<<"                    请输入拨叫用户的姓名:";
cin>>name1;
while(strcmp(name1,p0->name)!=0&&p0!=NULL)
p0=p0->next;
if(p0==NULL)
{
cout<<"+----------------------------------------------+"<<endl;
cout<<"                 您选择的用户不存在!";
cout<<"+----------------------------------------------+"<<endl;
cout<<"+       重新输入请按(1)    返回主菜单(2)        +"<<endl;
cout<<"+----------------------------------------------+"<<endl;
cin>>choic;
if(choic==1)
{
system("cls");
Dial();
}
if(choic==2)
{
system("cls");
huanying();
}
}
else
{
cout<<endl;
cout<<"                                               "<<endl;
cout<<"        loding------                           "<<endl;
for(int j=0; j<20; j++)        //运用时间函数,实现拨号界面
{
Sleep(100);
cout<<"■";
}
cout<<"                                               "<<endl;
cout<<"                                               "<<endl;
Sleep(500);
cout<<endl;
cout<<p0->tel_no<<endl;
p0->cishu=p0->cishu+1;
cout<<"+----------------------------------------------+"<<endl;
cout<<"拨打次数:    "<<p0->cishu<<endl;
cout<<"+----------------------------------------------+"<<endl;
cout<<endl;
}
}
else
{
cout<<"请输入单键号码:";
cin>>b;
while(p0!=NULL&&b!=p0->sim_no)                   //遍历链表比较查询
p0=p0->next;
if(p0==NULL)
{
cout<<"	您输入的单键号码不存在!";
cout<<"+----------------------------------------------+"<<endl;
cout<<"+      重新输入请按(1)    返回主菜单(2)        +"<<endl;
cout<<"+----------------------------------------------+"<<endl;
cin>>choic;
if(choic==1)
{
find();
}
if(choic==2)
{
system("cls");
huanying();
}
}
else
{
cout<<endl;
cout<<"                                               "<<endl;
cout<<"        loding------                                        "<<endl;
for(int j=0; j<20; j++)
{
Sleep(100);
cout<<"■";
}
cout<<"                                               "<<endl;
cout<<"                                               "<<endl;
Sleep(500);
cout<<p0->name<<endl;
cout<<p0->tel_no;
p0->cishu=p0->cishu+1;
cout<<"+----------------------------------------------+"<<endl;
cout<<"拨打次数:    "<<p0->cishu<<endl;
cout<<"+----------------------------------------------+"<<endl;
cout<<endl;
}
}
}
/***********************************************************
*功能描述:   输出全部联系人的信息
*输入参数:   无
*输出参数:   信息
*返回值:     无
*其他说明:   无
*************************************************************/
void shuchu()         //输出全部信息
{
int choic;
p10=head;
while(p10!=NULL)
{
cout<<"----------------------------------------------"<<endl;
cout<<"+   名  字:  "<<p10->name<<endl;
cout<<"----------------------------------------------"<<endl;
cout<<"+   电  话:  "<<p10->tel_no<<endl;
cout<<"----------------------------------------------"<<endl;
cout<<"+   快捷键:  "<<p10->sim_no<<endl;
cout<<"----------------------------------------------"<<endl;
cout<<"+   分  组:  "<<p10->arch<<endl;
cout<<"----------------------------------------------"<<endl;
cout<<"+  拨打次数: "<<p10->cishu<<endl;
cout<<"----------------------------------------------"<<endl;
p10=p10->next;                              //遍历输出信息
continue;
}
cout<<endl;
cout<<"返回界面请按1,继续选择请按3"<<endl;
cout<<endl;
cout<<"----------------------------------------------"<<endl;
cin>>choic;
if(choic==1)
huanying();
if (choic==3)
Show();
}

/***********************************************************
*功能描述:输出兔子图案
*输入参数:   无
*输出参数:   无
*返回值:     无
*其他说明:   无
*************************************************************/
void xiaotu()          //兔子图案
{
cout<<endl;
cout<<"                       ┏━┓ ┏━┓"<<endl;
cout<<"                       ★│┃  ┃│┃"<<endl;
cout<<"                       ┃│┗灬┛│┃"<<endl;
cout<<"                       ┃     ┃"<<endl;
cout<<"                       ┃ ^   ^  ┃"<<endl;
cout<<"                          ﹌ ˇ ﹌   "<<endl;
cout<<"                       ┗○━━━○┛"<<endl;
}

/***********************************************************
*功能描述:  将操作完成后的信息存储到文件
*输入参数:  无
*输出参数:   无
*返回值:     无
*其他说明:   方便下次运行时的调用
*************************************************************/
void Save()            //存入文件
{
int j;
fp=fopen("数据文件.txt","w");
for(p2=head,j=0; p2!=NULL; j++ ,p2=p2->next)
{
strcpy(persons[j].name,p2->name);
strcpy(persons[j].tel_no,p2->tel_no);
persons[j].sim_no=p2->sim_no;
strcpy(persons[j].e_addr,p2->e_addr);
strcpy(persons[j].arch,p2->arch);
persons[j].cishu=p2->cishu;
fwrite(&persons[j],sizeof(struct persons),1,fp);
}
}
<pre name="code" class="cpp">/************************************************************版权所有  (C)2015. ChengAng**文件名称:   zupu.cpp*文件标识:   无*内容摘要:   该文件用于对结构体以及各函数的定义*其他说明:   无*当前版本:   V1.0*作   者:    程昂*完成日期:   20151223**修改记录1:*修改日期:   20151223*版本号:     V1.0*修改人:     Cheng Ang*修改内容:********************************************************************/#include <iostream>#include<stdlib.h>#include<windows.h>#include<stdio.h>using namespace std;#define maxlen 100  //最多100个信息void find();     //查找功能void huanying(); //选择界面void creat();    //创建或打开文件void ShowA(char aa[10]);    //显示分组信息void Show();     //选择分组void Delete();   //删除功能void find();     //查找功能void Save();     //存入文件void Input();     //添加信息void xiaotu();    //兔子图案void shuchu();    //输出全部信息void Alter();     //编辑信息void Dial();      //拨号功能//存放通讯表的结构体数组peisons[maxlen]的定义struct persons{int num;char name[20];    //姓名char e_addr[20];  //地址char tel_no[15];  //电话char sim_no;      //快捷键char arch[10];    //分组int cishu;        //拨打次数} persons[maxlen];//存放通讯表的链表的节点类型 listnode 的定义typedef struct lnode{int num;char name[20];    //姓名char e_addr[20];  //地址char tel_no[15];  //电话char sim_no;      //快捷键char arch[10];    //分组int cishu;        //拨打次数struct lnode *next;  //储存指向下一个人的指针} listnode, *linklist;linklist head=NULL,r=NULL;   //初始化链表listnode *s,*p0,*p1,*p2,*p3,*p4,*p5,*p6,*p7,*p8,*p9,*p10,*p11,*p12;  //定义指针//结构体外信息int i;char name1[10],ch;char tel_no1[15];char arch1[10];char sim_no1;char e_addr1[20];int  cishu_1=0;FILE *fp;  //定义文件指针
<img src="https://img-blog.csdn.net/20151225230006811?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /><img src="https://img-blog.csdn.net/20151225230053193?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" style="font-family: Arial, Helvetica, sans-serif;" alt="" />
<img src="https://img-blog.csdn.net/20151225230141170?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /><img src="https://img-blog.csdn.net/20151225230153784?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
<img src="https://img-blog.csdn.net/20151225230203081?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  通讯录 管理 版权