通讯录管理系统的设计
问题需求分析
在计算机还未普及之前通讯管理都是由联系人采用名片,通讯录往往采用的是笔录手工记帐的方式来操作的。现在一般的通讯录管理都是采用计算机作为工具的实用的计算机通讯录管理程序来帮助人们进行更有效的通讯录信息管理。本通讯录信息管理系统用计算机管理电子通讯录的一种计算机应用技术的创新,通讯录管理系统是典型的信息管理系统,其开发主要包括后台文件存储通信用户记录和维护,以及客户端操作应用程序的开发两个方面。要求应用程序功能完备,易使用等特点。
数据结构定义
我使用两种类型的结构体的方式存储数据, 通过链表的方式存储通讯录信息, 第一个结构是手机号码包含如下内容: 编号, 姓名, 性别, 号码, QQ, 微信号, 住址, 生日, 第二个结构体是节点, 每一个节点包含一个手机号和一个指针, 通过指针的相互连接形参链表, 也就是变成我们需要的通讯录。
系统功能详细设计
实现通讯录管理系统的基本功能,可以实现电话用户的查询,电话号码的查询,电话号码的添加及删除等功能,以方便人们的记录和通讯。
通讯者姓名查询:输入用户姓名,根据用户姓名查询对应用户具体信息。
通讯者号码查询:输入用户号码,根据号码查询对应用户具体信息。
通讯者号码查询:输入用户性别,根据性别查询对应用户具体信息。
通讯者生日查询:输入用户,根据号码查询对应用户具体信息
通讯者信息添加:输入用户具体信息,将用户具体信息存入指定文件中,便于以后的查询。
通信者信息修改:输入用户姓名或者号码,根据输入的用户信息查询指定用户信息,然后对用户的信息进行修改,修改保存后,将修改后的用户信息存入文件中。
通讯者信息删除:输入用户信息,根据用户信息查询指定用户,针对该用户从文件中,删除对应的信息。
通讯录信息显示:显示通讯录中所有的用户的具体信息,也可以指定输出某一项具体信息。
通讯者信息的保存:将所用用户信息, 存入指定文件中。
通讯者信息的加载:加载指定文件中所有用户的信息, 存入链表中。
通讯者信息的添加:添加用户到链表中指定位置。
函数关系调用图
设计体会
此处设计中出现的问题就是对C++文件操作的不熟悉,导致做文件操作的时候出现很多问题, 这个程序中还有很多不完善的地方, 就比如查找, 添加, 修改, 当数据非常多的时候, 如果还是采用顺序操作, 那么将会引起很大性能问题。
完整代码
#include<iostream>
#include<stdlib.h>
#include<fstream>
#include<string>
#include<conio.h>
using namespace std;
typedef struct{int id; string name, sex, number, qq, weChat, addr, birth;
}Telephone;
struct Node{Telephone tele;struct Node *next;
};
void Input(Telephone &t){//数据域的输入cout<<"请输入联系人的姓名:"<<endl;cin>>t.name;cout<<"请输入联系人的电话:"<<endl;while(true){cin>>t.number;int k = 1; if(t.number.length() != 11){k = 0;cout<<"电话号码输入有误(长度不够),请重新输入:"<<endl;}else{for(int i=0; i<11; i++){//判断号码是否为数字 if(t.number[i] < '0' || t.number[i] > '9'){k = 0;cout<<"电话号码输入有误(非数字),请重新输入:"<<endl;}}}if(k) break;cout<<"K="<<k<<endl; }cout<<"请输入联系人的性别(male或female):"<<endl;while(cin>>t.sex){if(t.sex == "男" || t.sex == "女") break;else cout<<t.sex<<"输入有误,请重新输入:"<<endl;}cout<<"请输入联系人的地址:"<<endl;cin>>t.addr;cout<<"请输入联系人QQ号:"<<endl;cin>>t.qq;cout<<"请输入联系人WeChat号:"<<endl;cin>>t.weChat;cout<<"请输入联系人生日:"<<endl;cin>>t.birth;
}
void Output(Telephone t){cout<<"id="<<t.id<<" name="<<t.name<<" sex="<<t.sex<<" addr="<<t.addr<<" qq="<<t.qq<<" wechat="<<t.weChat<<" birth="<<t.birth<<endl;
}
int LengthLinkList(Node* L){//求表长
int len=0;Node *p=L;while(p->next){len++;p = p->next;}return len;
}
void save(Node* L){ofstream out;out.open("TelephoneList.txt", ios::out | ios::app);if (!out.is_open())return;out<<LengthLinkList(L)<<" ";for(Node *p = L->next; p != NULL; p = p->next){out<<p->tele.id<<" "<<p->tele.name<<" "<<p->tele.sex<<" "<<p->tele.number<<" "<<p->tele.qq<<" "<<p->tele.weChat<<" "<<p->tele.addr<<" "<<p->tele.birth<<" ";}out.close();
}
Node* load(Node* L){Node *p = L, *q;ifstream in("TelephoneList.txt");string str[8];char buffer[256];if(!in.is_open()){cout<<"加载文件错误"<<endl; return NULL;} cout << "载入通讯录文件" << endl;in.getline(buffer, 100, ' ');string data = string(buffer);int sum = 0;for(int j = 0; j < data.length(); j++){sum = sum*10 + data[j] - 48;}for(int i = 0; i < sum; i++){for (int j = 0; j < 8; j++){in.getline(buffer, 100, ' ');str[j] = string(buffer);}q = new Node();q->tele.id = 0; string s = str[0];cout<<"s="<<s<<" s.length="<<s.length()<<" s[0]="<<s[0]<<endl;for(int j = 0; j < s.length(); j++){q->tele.id = q->tele.id*10 + s[j]-48;}
cout<<"tele.id="<<q->tele.id<<endl;q->tele.name = str[1];q->tele.sex = str[2];q->tele.number = str[3];q->tele.qq = str[4];q->tele.weChat = str[5];q->tele.addr = str[6];q->tele.birth = str[7];q->next = p->next;p->next = q;p = q;}in.close();return p;
}
int ID = 0;
void CreateLinkList(Node* L){//尾插法创建链表,头结点不存内容 Node *node, *p = load(L);Telephone t;int f = 1;ID = LengthLinkList(L);if(p != NULL){L = p;}while(f != 0){Input(t);t.id = ID++;node = new Node();node->tele = t;node->next = NULL;L->next = node;L = node; cout<<"输入1继续,输入0结束:"<<endl;cin>>f;}
}
void DisplayLinkList(Node* L){//浏览链表Node* p = L->next;cout<<"通讯录"<<endl; while(p != NULL){Output(p->tele);p = p->next;}
}
void findName(Node* L,string str){//按姓名Node *p=L->next;while(p != NULL){if(p->tele.name == str) Output(p->tele); p=p->next;}
}
void findSex(Node* L,string str){//按性别Node *p=L->next;while(p != NULL){if(p->tele.sex == str) Output(p->tele); p=p->next;}
}
void birthSearch(Node* L,string str){//按生日Node *p=L->next;while(p != NULL){if(p->tele.birth == str) Output(p->tele); p=p->next;}
}
void add(Node* L, int i, Telephone t){//插入元素(从0号开始计算) Node *p = L, *s;t.id = ID++;if(i >= LengthLinkList(L)){cout<<"插入位置错误"<<endl;return; }else{s = new Node();s->tele = t;for(int j = 0; j < i; j++){p = p->next;} s->next = p->next;p->next = s;}
}
void remove(Node* L, string name){//删除元素Node *p, *q; if(L == NULL){cout<<"输入错误"<<endl; return; }p = L;q = L->next;while(true){if(q->tele.name == name){p->next = q->next;delete q;break;}p = p->next;q = q->next;}
}
void update(Node* L, string name){//修改联系人信息Node *p = L->next;while(p != NULL){if(p->tele.name == name){cout<<"开始修改"<<endl; Input(p->tele);return; }p = p->next;}cout<<"没找到对应联系人"<<endl;
}
void freeLinkList(Node* L){//释放整个链表的内存Node *p = L, *q = L;while(p != NULL){p = p->next;free(q);q = p;}
}
void menu(){//主菜单cout<<"单链表通讯录\n\n";cout<<"1.通讯录链表的建立;\n";cout<<"2.通讯者信息的插入;\n";cout<<"3.通讯者信息的查询;\n";cout<<"4.通讯者信息的修改;\n";cout<<"5.通讯者信息的删除;\n";cout<<"6.通讯者信息的保存;\n";cout<<"7.通讯者信息的输出;\n";cout<<"8.通讯者信息的载入;\n";cout<<"9.退出管理系统;\n";
}
int main(){int n;char c, k, m;string data;Telephone x;//初始化头结点 Node* L = new Node();L->next = NULL; while(1){menu();cout<<"请选择:"<<endl;cin>>k;system("cls");switch(k){case '1':CreateLinkList(L);cout<<"创建成功"<<endl;system("cls");break;case '2':Input(x);cout<<"输入要插入的位置"<<endl;cin>>n; add(L, n, x);DisplayLinkList(L);cout<<"输入任意键继续";cin>>m;system("cls");break;case '3':while(1){cout<<"1.按姓名查询\n2.按性别查询\n3.按生日查询\n4.返回主菜单\n请输入相应的序号进行选择:"<<endl; cin>>c; system("cls");switch(c){case '1':cout<<"请输入所要找查联系人的姓名:"<<endl; cin>>data; findName(L, data);cout<<"输入任意键继续";cin>>m;system("cls");break;case '2':cout<<"请输入所要找查联系人的性别:"<<endl; cin>>data; findName(L, data);cout<<"输入任意键继续";cin>>m;system("cls");break;case '3':cout<<"请输入所要找查联系人的生日:"<<endl; cin>>data; findName(L, data);cout<<"输入任意键继续";cin>>m;system("cls");break;case '4':goto loopOut;break;default:printf("输入错误!\n");system("cls");break;}}loopOut:system("cls");break;case '4':cout<<"请输入所要修改联系人的姓名:"<<endl;cin>>data; update(L, data);system("cls");break;case '5':cout<<"请输入所要删除联系人的姓名:"<<endl;cin>>data; remove(L, data);DisplayLinkList(L);cout<<"输入任意键继续";cin>>m;system("cls");break;case '6':save(L);system("cls");case '7':DisplayLinkList( L);cout<<"输入任意键继续";cin>>m;system("cls");break;case '8':load(L);ID = LengthLinkList(L);cout<<"输入任意键继续";cin>>m;system("cls");break;case '9':freeLinkList(L);exit(-1);default:printf("输入错误!");system("cls");}}return 0;
}