C/C++语言实现简易通讯录 [含文件操作,循环双链表]

文章目录

  • C/C++语言实现简易通讯录
    • 概要
    • 基本功能
    • 运行截图展示
    • 主要代码展示

🎖  博主的CSDN主页:Ryan.Alaskan Malamute
📜 博主的代码仓库主页 [ Gitee ]:@ryanala      [GitHub]: Ryan-Ala

C/C++语言实现简易通讯录

⚠⚠⚠ 如果需要代码可以前往这里下载 简易通讯录(最终版)

概要

本采用c++语言实现的简易通讯录,具体功能包括添加、删除,查找和修改联系人信息,显示和清空联系人列表等基本功能

该简易通讯录采用了循环双链表的数据结构,以及文件操作等技术,能够实现对通讯录联系人基本信息的修改与保存

基本功能

  • 显示联系人:显示通讯录中所有联系人信息
  • 删除联系人:按照姓名进行删除联系人
  • 查找联系人:按照姓名进行查找联系人
  • 修改联系人:根据姓名重新修改联系人
  • 清空联系人:清空通讯录中所有信息
  • 保存通讯录:将本次录入的联系人基本信息保存至文件中,以便在下一次打开时查阅

运行截图展示

登录

在这里插入图片描述
录入基本信息
在这里插入图片描述
显示联系人
在这里插入图片描述
查找联系人

在这里插入图片描述

修改联系人
在这里插入图片描述

主要代码展示

双链表实现部分

注意:这里只给出部分代码,如有需要全部源码链接已在文章开头给出链接

ListNode.cpp

#pragma once#include"contact.h"typedef struct ListNode
{Datatype data;struct ListNode* next;struct ListNode* prev;   //指向下一个节点
} *pListNode, contact;//初始化循环双链表
pListNode Init_List();//创建一个新的节点
pListNode Buy_newNode(); pListNode Buy_newNode(peoinform* x); //L前插入
void Insert_List(pListNode L);  //尾插
void Insert_End(pListNode L); 
void Insert_End(pListNode L, pListNode x); //头插
void Insert_Head(pListNode L);   //删除
int Delete(pListNode s);  //尾删
void Delete_End(pListNode L);   //头删
void Delete_Head(pListNode L);  //打印
void Printf_List(pListNode L);   //任意位置插入
//int Insert_List(pListNode L, Datatype x, int i);   //查找
pListNode Find_List(pListNode L, const char* x);   //删除某个元素
int Delete_List(pListNode L, const char* x);  //销毁
int Destory_List(pListNode L);  //判空
int Empty_List(pListNode L);  //长度
int Length_List(pListNode L);  

ListNode.cpp

#include"ListNode.h"pListNode Init_List()  //初始化循环双链表
{pListNode s = (pListNode)malloc(sizeof(ListNode));if (!s){cerr << ":)  ERROR!    Dynamic allocation of memory failed" << endl;exit(1);}s->next = s;s->prev = s;return s;
}pListNode Buy_newNode()  //创建一个新的节点
{pListNode newnode = (pListNode)malloc(sizeof(ListNode));if (!newnode){cerr << ": ERROR!    Dynamic allocation of memory failed" << endl;exit(1);}Scanf_peoinform(&newnode->data);newnode->prev = NULL;newnode->next = NULL;return newnode;
}pListNode Buy_newNode(peoinform* x)
{pListNode newnode = (pListNode)malloc(sizeof(ListNode));if (!newnode){cerr << ":)  ERROR!    Dynamic allocation of memory failed" << endl;exit(1);}strcpy(newnode->data.name, x->name);strcpy(newnode->data.sex, x->sex);strcpy(newnode->data.tele, x->tele);strcpy(newnode->data.address, x->address);strcpy(newnode->data.realation, x->realation);strcpy(newnode->data.birthday, x->birthday);strcpy(newnode->data.notes, x->notes);newnode->prev = NULL;newnode->next = NULL;return newnode;
}void Insert_List(pListNode L)
{if (!L){cerr << ":)  ERROR!    Function argument is nullptr!" << endl;exit(1);}system("cls");pListNode prev = L->prev;pListNode newNode = Buy_newNode();prev->next = newNode;newNode->prev = prev;newNode->next = L;L->prev = newNode;cout << "输入完成" << endl;system("pause");system("cls");
}
void Insert_End(pListNode L)
{if (!L){cerr << ":)  ERROR!    Function argument is nullptr!" << endl;exit(1);}Insert_List(L);
}void Insert_End(pListNode L, pListNode x)
{if (!L){cerr << ":)  ERROR!    Function argument is nullptr!" << endl;exit(1);}if (!x){cerr << ":)  ERROR!    Function argument is nullptr!" << endl;exit(1);}pListNode prev = L->prev;prev->next = x;x->prev = prev;x->next = L;L->prev = x;
}void Insert_Head(pListNode L)
{if (!L){cerr << ":)  ERROR!    Function argument is nullptr!" << endl;exit(1);}Insert_List(L->next);
}void Delete_End(pListNode L)
{if (!L){cerr << ":)  ERROR!    Function argument is nullptr!" << endl;exit(1);}if (Empty_List(L)){exit(1);}Delete(L->prev);  
}void Delete_Head(pListNode L)
{if (!L){cerr << ":)  ERROR!    Function argument is nullptr!" << endl;exit(1);}if (Empty_List(L)){exit(1);}Delete(L->next);
}void Printf_List(pListNode L)
{if (!L){cerr << ":)  ERROR!    Function argument is nullptr!" << endl;exit(1);}pListNode s = L->next;cout << "表中元素为:";while (s != L){cout << "姓名:" << s->data.name << "   ";cout << "性别:" << s->data.sex << "   ";cout << "生日:" << s->data.birthday << "   ";cout << "电话:" << s->data.tele << "   ";cout << "地址:" << s->data.address << "   ";cout << "关系:" << s->data.realation << "   ";s = s->next;}cout << endl << "打印完毕!" << endl;
}pListNode Find_List(pListNode L, const char* x)
{if (!L){cerr << ":)  ERROR!    Function argument is nullptr!" << endl;return NULL;}pListNode s = L->next;while (s != L){if (!strcmp(s->data.name,x)){return s;}else{s = s->next;}}if (s = L){return NULL;}return NULL;
}int Delete(pListNode s)
{if (!s){cerr << "Delete_L_NULL" << endl;exit(1);}s->prev->next = s->next;s->next->prev = s->prev;free(s);s = NULL;return 1;
}int Delete_List(pListNode L, const char* x)
{if (!L){cerr << "Delete_L_NULL" << endl;exit(1);}pListNode s = Find_List(L, x);if (!s){cerr << "删除失败!" << endl;return 0;}return Delete(s);
}int Destory_List(pListNode L)  
{if (!L){cerr << "Destory_L_NULL" << endl;exit(1);}pListNode s = L->next, r = s;while (s != L){s = s->next;free(r);r = s;}free(L);L = NULL;return 1;
}int Empty_List(pListNode L)
{if (!L){cerr << "Empty_List_L_NULL" << endl;exit(1);}return L->next == L;
}int Length_List(pListNode L)
{if (!L){cerr << "Length_L_NULL" << endl;exit(1);}int count = 0;pListNode s = L->next;while (s != L){count++;s = s->next;}return count;
}

contact.cpp

#include"ListNode.h"
#include"Heap.h"
#include"contact.h"pListNode Init_contact()
{pListNode Head = Init_List();return Head;
}void Menu(){cout << endl;cout << "*******************************" << endl;cout << "***** 1.添加 **** 2.删除 ******" << endl;cout << "***** 3.查找 **** 4.修改 ******" << endl;cout << "***** 5.显示 **** 6.清空 ******" << endl;cout << "***** 0.退出(保存) ************" << endl;cout << "*******************************" << endl;}void Menu_revise(){cout << endl;cout << "*******************************" << endl;cout << "***** 1.姓名 **** 2.性别 ******" << endl;cout << "***** 3.生日 **** 4.电话 ******" << endl;cout << "***** 5.地址 **** 6.关系 ******" << endl;cout << "***** 7.备注 **** 0.退出(保存)*" << endl;cout << "*******************************" << endl;}void Menu_select(){cout << endl;cout << "*******************************" << endl;cout << "***** 1.继续修改当前联系人 ****" << endl;cout << "***** 2.修改其他联系人 ********" << endl;cout << "***** 0.退出(保存) ************" << endl;cout << "*******************************" << endl;}void Menu_serch(){cout << endl;cout << "*******************************" << endl;cout << "***** 1.按姓名查找 ************" << endl;cout << "***** 2.按电话号码查找 ********" << endl;cout << "*******************************" << endl;}void Menu_ashore(){cout << endl;cout << "*******************************" << endl;cout << "******* 1.登录**2.注册 ********" << endl;cout << "******* 3.注销**0.退出 ********" << endl;cout << "*******************************" << endl;}int Detect(){char size[MAX_SCANF] = { 0 };cin >> size;while (strlen(size) > 1){loop:cout << "输入格式错误!请重新输入:" << endl;cin.ignore(1024, '\n');cin >> size;}if (!isdigit(size[0]))goto loop;return  size[0] - '0';}void Scanf_peoinform(Datatype*x){if (!x){cerr << ":)  ERROR!    Function argument is nullptr!" << endl;exit(1);}cout << endl << "请输入联系人信息:" << endl;cout << endl << "姓名:" << endl;cin >> x->name;cout << endl << "性别:" << endl;cin >> x->sex;cout << endl << "生日:" << endl;cin >> x->birthday;cout << endl << "电话:" << endl;cin >> x->tele;cout << endl << "地址:" << endl;cin >> x->address;cout << endl << "关系:" << endl;cin >> x->realation;cout << endl << "备注:" << endl;cin >> x->notes;}void Printf_peoinform(Datatype* x){if (!x){cerr << ":)  ERROR!    Function argument is nullptr!" << endl;exit(1);}cout << "姓名: " << x->name << endl;cout << "性别: " << x->sex << endl;cout << "生日: " << x->birthday << endl;cout << "电话: " << x->tele << endl;cout << "地址: " << x->address << endl;cout << "关系:" << x->realation << endl;cout << "备注:" << x->notes << endl;cout << "_______________________________" << endl;}void Display_contact(contact* con){if (!con){cerr << ":)  ERROR!    Function argument is nullptr!" << endl;exit(1);}if (con->next == con){cout << "通讯录中无联系人!" << endl;return;}pListNode p = con->next;while (p && p != con){Printf_peoinform(&(p->data));p = p->next;}cout << endl;}void Add_contact(contact* con){if (!con){cerr << ":)  ERROR!    Function argument is nullptr!" << endl;exit(1);}Insert_End(con);}void Delete_contact(contact* con){if (!con){cerr << ":)  ERROR!    Function argument is nullptr!" << endl;exit(1);}cout << endl << "请输入需要删除的联系人的姓名:";char name[MAX_NAME];cin >> name;pListNode pos = Find_List(con, name);if (pos){     Delete(pos);cout << "删除成功!" << endl;}else cout << "未找到名为:" << name << "的联系人,删除失败!" << endl;}void Serch_contact(contact* con){system("cls");Menu_serch();LABEL:int num = 0;num = Detect();if (num == 1)Serch_contact_name(con);else if (num == 2)Serch_contact_tele(con);else{cout << "未找到对应的命令,请重新输入! " << endl;goto LABEL;}}void Serch_contact_name(contact* con){if (!con){cerr << ":)  ERROR!    Function argument is nullptr!" << endl;exit(1);}system("cls");cout << "请输入需要查询的联系人: ";char name[MAX_NAME];cin >> name;pListNode s = con->next;int flag = 0;while (s != con){if (strstr(s->data.name, name)){flag = 1;Printf_peoinform(&(s->data));}s = s->next;}if (!flag){cout << "未找到联系电话包含: " << name << " 的联系人!" << endl;}system("pause");system("cls");}void Serch_contact_tele(contact* con){if (!con){cerr << ":)  ERROR!    Function argument is nullptr!" << endl;exit(1);}system("cls");cout << "请输入需要查询联系人的电话号码: ";char tele[MAX_TELE];cin >> tele;pListNode s = con->next;int flag = 0;while (s != con){if (strstr(s->data.tele, tele)){flag = 1;Printf_peoinform(&(s->data));}s = s->next;}if (!flag){cout << "未找到联系电话包含: " << tele << " 的联系人!" << endl;}system("pause");system("cls");}void Revise_contact(contact* con){if (!con){cerr << ":)  ERROR!    Function argument is nullptr!" << endl;exit(1);}pListNode pos = NULL;char name[MAX_NAME];int num = 0;int flag = 0;char size[MAX_SCANF] = { 0 };LABEL1:if (flag){Menu_select();cout << "Please Input a number: " << endl;num = Detect();if (num == 1)goto LABEL3;else if (num == 2)goto LABEL2;else{cout << "程序退出,保存成功!" << endl;return;}}else{LABEL2:cout << "请输入需要修改的联系人姓名: ";}cin >> name;pos = Find_List(con, name);if (pos){cout << "查询成功!该联系人信息为:" << endl;Printf_peoinform(&pos->data);do{flag = 1;LABEL3:Menu_revise();cout << "请选择需要修改的信息:";switch (Detect()){case NAME:cout << "请重新输入姓名:" << endl;cin >> pos->data.name;cout << "修改成功!" << endl;goto LABEL1;break;case SEX:cout << "请重新输入性别:" << endl;cin >> pos->data.sex;cout << "修改成功!" << endl;goto LABEL1;break;case BIRTHDAY:cout << "请重新输入生日:" << endl;cin >> pos->data.birthday;cout << "修改成功!" << endl;goto LABEL1;break;case TELE:cout << "请重新输入电话:" << endl;cin >> pos->data.tele;cout << "修改成功!" << endl;goto LABEL1;break;case ADRESS:cout << "请重新输入地址:" << endl;cin >> pos->data.address;cout << "修改成功!" << endl;goto LABEL1;break;case REALATION:cout << "请重新输入关系:" << endl;cin >> pos->data.realation;cout << "修改成功!" << endl;goto LABEL1;break;case NOTES:cout << "请重新输入备注:" << endl;cin >> pos->data.notes;cout << "修改成功!" << endl;goto LABEL1;break;case EXIT:cout << "程序退出,保存成功!" << endl;goto LAB;default:cout << "无效的命令,请重新输入: " << endl;}} while (num);}else{cout << "未找到名为: " << name << " 的联系人,无法修改!" << endl;}LAB:;}void Desstory_contact(contact*& con){if (!con){cerr << ":)  ERROR!    Function argument is nullptr!" << endl;exit(1);}Destory_List(con);con = Init_List();cout << "清空成功!" << endl;}int Empty_contact(contact* con){if (!con){cerr << ":)  ERROR!    Function argument is nullptr!" << endl;exit(1);}return Empty_List(con);}void Sort_name(contact*& con){if (!con){cerr << ":)  ERROR!    Function argument is nullptr!" << endl;exit(1);}int length = Length_List(con), i = 0;if (length > 1){contact** ret = (contact**)malloc(sizeof(contact*) * length), * p = con->next;while (p && p != con){ret[i++] = p;p = p->next;}HeapSort(ret, length);for (int i = 0; i < length - 1; i++){ret[i]->next = ret[i + 1];ret[i + 1]->prev = ret[i];}con->next = ret[0];ret[0]->prev = con;con->prev = ret[length - 1];ret[length - 1]->next = con;}cout << "已将通讯录联系人按姓名首字母排序!" << endl;}//写入通讯录void Save_contact(contact* con){if (!con){cerr << ":)  ERROR!    Function argument is nullptr!" << endl;exit(1);}FILE* fin = fopen("contact.txt", "wb");if (!fin){cerr << "fopen_error!" << endl;exit(1);}else{pListNode p = con->next;while (p && p != con){fwrite(&(p->data), sizeof(peoinform), 1, fin);p = p->next;}fclose(fin);fin = NULL;cout << "保存成功!" << endl;}}//退出通讯录,释放内存void Exit_contact(contact* con){if (!con){cerr << ":)  ERROR!    Function argument is nullptr!" << endl;exit(1);}Save_contact(con);Destory_List(con);  //销毁循环双链表}//加载文件信息至通讯录void Loadcontact(contact* con){if (!con){cerr << ":)  ERROR!    Function argument is nullptr!" << endl;exit(1);}FILE* fin = fopen("contact.txt", "rb");if (fin == NULL){return;}else{peoinform temp = { 0 };while (fread(&temp, sizeof(peoinform), 1, fin)){contact* newNode = Buy_newNode(&temp);Insert_End(con, newNode);}}fclose(fin);}// 比较bool Compare(Ashore * L, char* x, char* y){if (!strcmp(L->account, x)){if (!strcmp(L->aode, y))return true;}return false;}//登录bool Logon(Ashore* L){char account[MAX_account];char aode[MAX_code];cout << "请输入账号" << endl;cin >> account;cout << "请输入密码" << endl;cin >> aode;return !strcmp(L->account, account) && !strcmp(L->aode, aode);}void Scan(Ashore* L, char* x, char* y){strcpy(L->account, x);strcpy(L->aode, y);Save_(L);}//注册void Registe(Ashore* L){char account[MAX_account] = { 0 };char aode[MAX_code] = { 0 };cout << "请输入账号" << endl;cin >> account;cout << "请输入密码" << endl;cin >> aode;Scan(L, account, aode);}//写入void Save_(Ashore* L){if (!L){cerr << ":)  ERROR!    Function argument is nullptr!" << endl;exit(1);}FILE* fp = fopen("Ashore.txt", "wb");if (!fp){cerr << "fopen_error!" << endl;exit(1);}else{fwrite(L, sizeof(Ashore), 1, fp);fclose(fp);fp = NULL;cout << "保存成功" << endl;system("pause");system("cls");}}//加载密码Ashore* Loadcontact_(){FILE* fp = fopen("Ashore.txt", "rb");if (fp == NULL){return NULL;}else{Ashore temp = { 0 };if (fread(&temp, sizeof(Ashore), 1, fp)){Ashore* newNode = Buy_(&temp);fclose(fp);return newNode;}else{return NULL;}}return NULL;}Ashore* Buy_(Ashore* L){Ashore* newnode = (Ashore*)malloc(sizeof(Ashore));strcpy(newnode->account, L->account);strcpy(newnode->aode, L->aode);return newnode;}Ashore* In_(){Ashore* first = (Ashore*)malloc(sizeof(Ashore));return first;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/781586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

话题通信的python实现

一、发布者Publisher的python实现 step1&#xff1a;在scripts文件夹中创建py节点 step2&#xff1a;第一行是为了指定解释器&#xff0c;Ubuntu20.04是python3&#xff0c;比他低的版本是python。第二行是为了指定编码方式。第五行中&#xff0c;引用index.ros.org中数据类型…

RVM安装ruby笔记

环境 硬件&#xff1a;Macbook Pro 系统&#xff1a;macOS 14.1 安装公钥 通过gpg安装公钥失败&#xff0c;报错如下&#xff1a; 换了几个公钥地址&#xff08;hkp://subkeys.pgp.net&#xff0c;hkp://keys.gnupg.net&#xff0c;hkp://pgp.mit.edu&#xff09;&#xff0c;…

论文笔记:Retrieval-Augmented Generation forAI-Generated Content: A Survey

北大202402的RAG综述 1 intro 1.1 AICG 近年来&#xff0c;人们对人工智能生成内容&#xff08;AIGC&#xff09;的兴趣激增。各种内容生成工具已经精心设计&#xff0c;用于生产各种模态下的多样化对象 文本&代码&#xff1a;大型语言模型&#xff08;LLM&#xff09;…

Java:链表

一、链表简介 1、链表与顺序表的区别 上一篇博客我介绍了顺序表&#xff0c;这次我们来认识认识链表&#xff01;先来看看二者的区别&#xff1a; 顺序表&#xff1a;由于顺序表实际上是一个数组&#xff0c;因此它在物理上是连续的&#xff0c;逻辑上也是连续的&#xff01; …

【IDEA】使用debug方式去运行java程序

什么是debug工具&#xff1f; 调试工具&#xff08;debug工具&#xff09;是一种用于帮助程序员识别和修复程序中的错误的工具。它们提供了一系列的功能&#xff0c;帮助程序员在代码执行的过程中跟踪和检测问题&#xff0c;例如查看变量的值、检查函数的调用栈、设置断点来停…

Spring学习——什么是循环依赖及其解决方式

文章目录 前言一、什么是循环依赖二、解决思路1、循环依赖分类2、对象初始化步骤及对象分类3、spring是如何解决的4、图解5、三级缓存1、区别2、ObjectFactory是什么 三、源码debug1、spring创建对象过程1、dubug第一步——找到getBean2、dubug第二步——getBean与doGetBean3、…

腾讯 tendis 替代 redis linux安装使用

下载地址 Tendis存储版 点击下载 linux 解压 tar -zxvf 安装包.tgz cd 解压安装包/scripts 启动 ./start.sh 停止 ./stop.sh 详细配置 修改 /scripts tendisplus.conf # tendisplus configuration for testing # 绑定本机IIP bind 192.168.31.112 port 51002 #设…

海格里斯助推实体制造业转型升级 “算法定义硬件”解题AIoT市场

随着自动化的发展&#xff0c;电子商务和智能制造推动了自动化立体仓库的快速发展与创新&#xff0c;产生了“密集仓储”的概念。对于一个实体企业来讲&#xff0c;其数智物流转型正在趋向于“去伪存真”&#xff0c;企业追求高ROI与真实经济价值&#xff0c;具有降本增效的业务…

JavaEE 初阶篇-深入了解多线程安全问题(出现线程不安全的原因与解决线程不安全的方法)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 多线程安全问题概述 1.1 线程不安全的实际例子 2.0 出现线程不安全的原因 2.1 线程在系统中是随机调度且抢占式执行的模式 2.2 多个线程同时修改同一个变量 2.3 线…

游戏行业行业竞争越来越激烈,遇到DDoS攻击遭受严重损失该如何解决

近年来&#xff0c;我们见证了数字化的快速发展&#xff0c;随着这样的发展&#xff0c;网络的威胁也逐渐增多&#xff0c;在网络攻击门槛不断降低&#xff0c;行业竞争越来越激烈&#xff0c;游戏行业的DDoS攻击如雨点般密集&#xff0c;在整个DDoS攻击的份额中&#xff0c;游…

SpringAMQP-Exchange交换机

1、Fanout-Exchange的特点是&#xff1a;和它绑定的消费者都会收到信息 交换机的作用是什么? 接收publisher发送的消息将消息按照规则路由到与之绑定的队列不能缓存消息&#xff0c;路由失败&#xff0c;消息丢失FanoutExchange的会将消息路由到每个绑定的队列 声明队列、交…

【实验报告】--基础VLAN

【VLAN实验报告】 一、项目背景 &#xff08;为 Jan16 公司创建部门 VLAN&#xff09; Jan16 公司现有财务部、技术部和业务部&#xff0c;出于数据安全的考虑&#xff0c;各部门的计算机需进 行隔离&#xff0c;仅允许部门内部相互通信。公司拓扑如图 1 所示&#xff0c; …

http和https的工作原理是什么?

HTTP&#xff08;HyperText Transfer Protocol&#xff09;和HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是两种用于在互联网上传输数据的主要协议&#xff0c;它们均用于在客户端&#xff08;通常是Web浏览器&#xff09;与服务器之间交换信息。尽管它们…

.NET CORE 分布式事务(二) DTM实现TCC

目录 引言&#xff1a; 1. TCC事务模式 2. TCC组成 3. TCC执行流程 3.1 TCC正常执行流程 3.2 TCC失败回滚 4. Confirm/Cancel操作异常 5. TCC 设计原则 5.1 TCC如何做到更好的一致性 5.2 为什么只适合短事务 6. 嵌套的TCC 7. .NET CORE结合DTM实现TCC分布式事务 …

访学博后须知|携带手机等电子产品入境美国注意事项

美国对携带手机等电子产品入境有着严格的规定&#xff0c;因此知识人网小编提醒拟出国做访问学者、博士后或联合培养的博士生了解以下注意事项&#xff0c;尽量减少不必要的麻烦。 随着互联网的普及&#xff0c;手机等电子产品在人民生活中占有不可或缺的地位。因为研究和工作需…

海量数据处理项目-账号微服务和流量包数据库表+索引规范(下)

海量数据处理项目-账号微服务和流量包数据库表索引规范&#xff08;下&#xff09; 第2集 账号微服务和流量包数据库表索引规范讲解《下》 简介&#xff1a;账号微服务和流量包数据库表索引规范讲解 账号和流量包的关系&#xff1a;一对多traffic流量包表思考点 海量数据下每…

ES6 学习(二)-- 字符串/数组/对象/函数扩展

文章目录 1. 模板字符串1.1 ${} 使用1.2 字符串扩展(1) ! includes() / startsWith() / endsWith()(2) repeat() 2. 数值扩展2.1 二进制 八进制写法2.2 ! Number.isFinite() / Number.isNaN()2.3 inInteger()2.4 ! 极小常量值Number.EPSILON2.5 Math.trunc()2.6 Math.sign() 3.…

仓库规划(plan)

明天就要考试了&#xff0c;但是我正处于一点都不想学的状态 高考前我也是这样的 逆天 代码如下&#xff1a; #include<vector> #include<cstdio> using namespace std; int n, m; struct Node{int id;vector<int> d;bool operator<(const Node &t…

平台介绍-搭建赛事运营平台(8)

平台介绍-搭建赛事运营平台&#xff08;5&#xff09;提到了字典是分级的&#xff0c;本篇具体介绍实现。 平台级别的代码是存储在核心库中&#xff0c;品牌级别的代码是存储在品牌库中&#xff08;注意代码类是一样的&#xff09;。这部分底层功能封装为jar包&#xff0c;然后…

matlab BP神经网络回归预测(套用任何数据不改代码,最后一列是标签)

部分代码&#xff1a; %% BP神经网络 % 清空环境变量 关闭打开过的图表 clear all;clc;close all %% 导入数据 dataxlsread(data1.xlsx); %% 设置训练集数量 num_rowsize(data,1) %数据集行数 n_trainsfloor(num_row*0.8) %按比例求训练集数目 % n_trains150 …