/*********************************************************** *版权所有 (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="http://img.blog.csdn.net/20151225230006811?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /><img src="http://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="http://img.blog.csdn.net/20151225230141170?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /><img src="http://img.blog.csdn.net/20151225230153784?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
<img src="http://img.blog.csdn.net/20151225230203081?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />