通讯录管理系统的设计

问题需求分析

在计算机还未普及之前通讯管理都是由联系人采用名片,通讯录往往采用的是笔录手工记帐的方式来操作的。现在一般的通讯录管理都是采用计算机作为工具的实用的计算机通讯录管理程序来帮助人们进行更有效的通讯录信息管理。本通讯录信息管理系统用计算机管理电子通讯录的一种计算机应用技术的创新,通讯录管理系统是典型的信息管理系统,其开发主要包括后台文件存储通信用户记录和维护,以及客户端操作应用程序的开发两个方面。要求应用程序功能完备,易使用等特点。

数据结构定义

我使用两种类型的结构体的方式存储数据, 通过链表的方式存储通讯录信息, 第一个结构是手机号码包含如下内容: 编号, 姓名, 性别, 号码, 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;
}

上面有错, 还请指出, 如果认为我写的还不错, 还请点个赞, 多多支持一下, O(∩_∩)O~~

一个很Low的通讯录管理系统(但是能用)C/C++单链表实现相关推荐

  1. 数据结构:假设有一个带头结点的单链表L,每个结点值由单个数字、小写字母和大写字母构成。设计一个算法将其拆分成3个带头结点的单链表L1、L2和L3,L1包含L中的所有数字结点,L2包含L中的所有小写字母

    假设有一个带头结点的单链表L,每个结点值由单个数字.小写字母和大写字母构成.设计一个算法将其拆分成3个带头结点的单链表L1.L2和L3,L1包含L中的所有数字结点,L2包含L中的所有小写字母结点,L3 ...

  2. 通讯录管理系统课设使用c编写基于链表增查删改分组文本操作随程序实时同步

    通讯录管理系统已经有好多人写过了 但是基于文本操作大多数只有从文件中输出和输入并不是即时的 解决方法是将链表里的数据输出以结构体的方式到文本 读入应该以一样的方式 增加个人信息函数定义 void Ad ...

  3. 上传一个很low的雷霆战机java小游戏

    我自己写了一份,但觉得还是老师写的有注释容易懂: 不多bb,具体代码如下: Ball.java: package day04; import java.awt.Graphics; import jav ...

  4. 使用jQuery怼一个很low的QQ农场 | (练习+自娱自乐)

    先来看一下效果: 需要用的知识: jQuery控制页面 开始敲代码,首先写HTML代码: <div id="bg"><span id="seed&quo ...

  5. java单链表通讯录_[Java教程]用java实现单链表(菜鸟出征)

    [Java教程]用java实现单链表(菜鸟出征) 0 2016-03-24 14:00:06 package code;class Node{ Node next; int data; public ...

  6. 【python】利用python制作通讯录管理系统(面向过程)

    管理人员档案,管理学生信息,实现录入和查找功能,方便人员管理 下面就教大家如何利用python编写这一系统⬇⬇⬇ ------------------------------------------- ...

  7. C语言基础篇02:单链表实现学生成绩管理系统

    单链表实现学生成绩管理系统 前言 需求分析 详细设计 增加成绩信息 删除成绩信息 修改成绩信息 查询学生信息和浏览学生信息 总结 前言 上篇已经讲过单链表的基本实现,这篇将以一个简单的管理系统入手. ...

  8. 用C++做一个通讯录管理系统(手把手教学)

    项目目录 1.系统需求 2.创建项目 2.1 创建项目 2.2 添加文件 3.菜单功能 4.退出功能 5.添加联系人 5.1 设计联系人结构体 5.2 设计通讯录结构体 5.3 main函数中创建通讯 ...

  9. C++ 实现一个简单的通讯录管理系统

    需求 通讯录是一个可以记录亲人.好友信息的工具.本教程主要利用C++来实现一个通讯录管理系统系统中需要实现的功能如下: 添加联系人∶向通讯录中添加新人,信息包括(姓名.性别.年龄.联系电话.家庭住址) ...

最新文章

  1. select下拉框下拉跳转代码
  2. 数据中心UPS电源节能降耗的四大原则
  3. OpenCV:在imshow() 之前使用namedWindow() 的必要性讨论?
  4. mysql修改存储引擎报错_MySQL查看修改存储引擎总结
  5. 汇编解析(2)-内存寻址之实模型平面模式(real mode flat mode)(2)
  6. php跨域单点登录,SSO单点登录、跨域重定向、跨域设置Cookie、京东单点登录实例分析...
  7. 算法积分0042算法笔记——【随机化算法】计算π值和计算定积分
  8. 在Java EE 7上骑骆驼–带有Swagger文档的REST服务
  9. SublimeText2使用笔记
  10. 区域显示触发_Nature Communications:地幔数据显示可氧化的火山气体的减少可能触发了大氧化事件...
  11. linux sipp 呼叫转移_SIPp 学习笔记 一 (安装)
  12. FUNCTION count does not exist
  13. CentOS7根目录磁盘扩容(/dev/mapper/centos-root 空间不足)
  14. 系统架构设计——伸缩性架构
  15. 西安交通大学计算机张飞导师,航海学院邀请西安交通大学段战胜教授来院作学术报告...
  16. FXS与FXO接口的区别及应用
  17. 2017京东校招面试回忆(已成功拿到offer)
  18. 82岁高龄的高德纳仍在写《计算机程序设计艺术》,那是他未完成的人生目标...
  19. 餐饮门店如何玩转社群
  20. sqli-labs-waf

热门文章

  1. excel vba 调用webbrowser_VBA 公式与函数
  2. 计算机二级python选择题题库_2018年计算机二级python题库精编(1)
  3. 《操作系统》OS学习(一):OS相关
  4. 计算机如何添加管理员权限,电脑使用代码如何添加管理员权限
  5. Django后台项目之用户管理功能开发流程
  6. 【经验分享】工程开发与Coding规范
  7. 写出float x 与“零值”比较的if语句——一道面试题分析
  8. docker mysql关掉后启动_Docker启动mysql的坑2
  9. [HDU5215]Cycle
  10. Sicily-1063