/***********************************************************
*版权所有 (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="" />