通讯录(C语言)

通讯录

  • 一、基本思路及功能介绍
  • 二、功能实现
    • 1.基础菜单的实现
    • 2.添加联系人信息功能实现
    • 3.显示联系人信息功能实现
    • 4.删除联系人信息功能实现
    • 5.查找联系人信息功能实现
    • 6.修改联系人信息功能实现
    • 7.排序联系人信息功能实现
    • 8.加载和保存联系人信息功能实现
  • 三、源文件展示
    • 1.test.c
    • 2.contact.c
    • 3.contact.h

一、基本思路及功能介绍

想要用C语言实现通讯录的功能,基本上涵概了C语言入门的一些知识运用,如:指针、结构体、文件操作、动态内存管理等相关的知识;

实现一个简单的通讯录的基本功能:

    1.添加联系人信息;2.删除联系人信息;3.查找联系人信息;4.修改联系人信息;5.显示联系人信息;6.排序联系人信息;   7.保存联系人信息;8.退出通讯录;

二、功能实现

1.基础菜单的实现

void menu()
{printf("\t\t\t\t************************************\n");printf("\t\t\t\t******    通讯录管理系统    ********\n");printf("\t\t\t\t************************************\n");printf("\t\t\t\t*      1.添加联系人       *\n");printf("\t\t\t\t*      2.删除联系人       *\n");printf("\t\t\t\t*      3.查找联系人	      *\n");printf("\t\t\t\t*      4.修改联系人       *\n");printf("\t\t\t\t*      5.显示联系人       *\n");printf("\t\t\t\t*      6.排序联系人       *\n");printf("\t\t\t\t*      0.退出通讯录       *\n");printf("\t\t\t\t************************************\n");printf("\t\t\t\t************************************\n");
}
enum
{EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT
};
int main()
{int input = 0;struct Contact con;InitContact(&con);//初始化通讯录do{menu();printf("请输入:>");scanf("%d", &input);switch (input){case ADD:AddContact(&con);//添加联系人信息break;case DEL:DelContact(&con);//删除联系人信息break;case SEARCH:SearchContact(&con);//查找联系人信息break;case MODIFY:ModifyContact(&con);//修改联系人信息break;case SHOW:ShowContact(&con);//显示联系人信息break;case SORT:SortContact(&con);//排序联系人信息break;case EXIT:SaveContact(&con);//保存信息DistroyContact(&con);//销毁通讯录信息printf("退出通讯录\n");break;default:printf("选择错误,请重新选择\n");break;}} while (input);return 0;
}

2.添加联系人信息功能实现

//扩充容量
void CheckContact(struct Contact* pc)
{if (pc->sz == pc->capacity){struct PeoInfo* ptr = (struct PeoInfo*)realloc(pc->data, (pc->capacity + 2) * sizeof(struct PeoInfo));if (ptr != NULL){pc->data = ptr;pc->capacity += 2;printf("扩容成功\n");}else{printf("扩容失败\n");exit(1);}}
}//初始化通讯录
void InitContact(struct Contact* pc)
{pc->sz = 0;pc->data = (struct PeoInfo*)malloc(DEFAULT_SZ * sizeof(struct PeoInfo));pc->capacity = DEFAULT_SZ;
}//添加联系人信息
void AddContact(struct Contact* pc)
{CheckContact(pc);printf("请输入联系人的姓名:>");scanf("%s", pc->data[pc->sz].name);printf("请输入联系人的年龄:>");scanf("%d", &pc->data[pc->sz].age);printf("请输入联系人的性别:>");scanf("%s", pc->data[pc->sz].sex);printf("请输入联系人的电话:>");scanf("%s", pc->data[pc->sz].tele);printf("请输入联系人的住址:>");scanf("%s", pc->data[pc->sz].addr);printf("添加成功\n");pc->sz++;
}

3.显示联系人信息功能实现

 
//显示联系人信息
void ShowContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,显示失败!!!\n");return;}int i = 0;printf("\t\t--------------------------------------------------------------------------\n");printf("\t\t--------------------------------------------------------------------------\n");printf("\t%15s\t%15s\t%15s\t%15s\t%15s\n\n","姓名", "年龄", "性别", "电话", "住址");for (i = 0; i < pc->sz; i++){printf("\t%15s\t%15d\t%15s\t%15s\t%15s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}printf("\t\t--------------------------------------------------------------------------\n");printf("\t\t--------------------------------------------------------------------------\n");
}

4.删除联系人信息功能实现

 
//删除联系人信息
int FindContactByName(const struct Contact* pc, char* name)
{int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1;
}void DelContact(struct Contact* pc)
{if (pc->sz == 0){printf("联系人为空,操作失败\n");return;}char name[NAME_MAX] = { 0 };printf("请输入要删除的联系人姓名:>");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("查找的联系人不存在!!!\n");}else{for (int i = pos; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("删除成功\n");}
}

5.查找联系人信息功能实现

//查找联系人信息
void SearchContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,查找失败!!!\n");return;}char name[NAME_MAX] = { 0 };printf("请输入要查找的联系人的名字:>");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("联系人不存在!!!\n");return;}else{printf("\t%15s\t%15s\t%15s\t%15s\t%15s\n\n","姓名", "年龄", "性别", "电话", "住址");printf("\t%15s\t%15d\t%15s\t%15s\t%15s\n",pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].tele,pc->data[pos].addr);}
}

6.修改联系人信息功能实现

//修改联系人信息
void ModifyContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,查找失败!!!\n");return;}char name[NAME_MAX] = { 0 };printf("请输入要修改的联系人姓名:>");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("联系人不存在!!!\n");return;}else{printf("请输入新的联系人姓名:>");scanf("%s", pc->data[pos].name);printf("请输入新的联系人年龄:>");scanf("%d", &pc->data[pos].age);printf("请输入新的联系人性别:>");scanf("%s", pc->data[pos].sex);printf("请输入新的联系人电话:>");scanf("%s", pc->data[pos].tele);printf("请输入新的联系人住址:>");scanf("%s", pc->data[pos].addr);}printf("修改成功\n");
}

7.排序联系人信息功能实现

//排序联系人信息
void SortContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,无法排序!!!\n");return;}int i = 0;int j = 0;struct PeoInfo tmp;for (i = 0; i < pc->sz - 1; i++){int flag = 1;for (j = 0; j < pc->sz - i - 1; j++){if (strcmp(pc->data[j].name, pc->data[j + 1].name) < 0){tmp = pc->data[j];pc->data[j] = pc->data[j + 1];pc->data[j + 1] = tmp;flag = 0;}}if (flag == 1){return;}}printf("排序成功\n");
}

8.加载和保存联系人信息功能实现

//加载有效信息到通讯录中
void LoadContact(struct Contact* pc)
{FILE* pf = fopen("contact.txt", "rb");if (pf == NULL){perror("contact:fopen");return;}struct PeoInfo tmp = { 0 };while (fread(&tmp, sizeof(struct PeoInfo), 1, pf)){CheckContact(pc);pc->data[pc->sz] = tmp;pc->sz++;}fclose(pf);pf = NULL;
}//保存信息
void SaveContact(struct Contact* pc)
{//1.打开文件FILE* pf = fopen("contact.txt", "wb");if (pf == NULL){perror("SaveContact:fopen");return;}//2.写数据int i = 0;for (i = 0; i < pc->sz; i++){fwrite(&(pc->data[i]), sizeof(struct PeoInfo), 1, pf);}//3.关闭文件fclose(pf);pf = NULL;
}

三、源文件展示

1.test.c

void menu()
{printf("\t\t\t\t************************************\n");printf("\t\t\t\t******    通讯录管理系统    ********\n");printf("\t\t\t\t************************************\n");printf("\t\t\t\t*      1.添加联系人       *\n");printf("\t\t\t\t*      2.删除联系人       *\n");printf("\t\t\t\t*      3.查找联系人	      *\n");printf("\t\t\t\t*      4.修改联系人       *\n");printf("\t\t\t\t*      5.显示联系人       *\n");printf("\t\t\t\t*      6.排序联系人       *\n");printf("\t\t\t\t*      0.退出通讯录       *\n");printf("\t\t\t\t************************************\n");printf("\t\t\t\t************************************\n");
}
enum
{EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT
};
int main()
{int input = 0;struct Contact con;InitContact(&con);//初始化通讯录do{menu();printf("请输入:>");scanf("%d", &input);switch (input){case ADD:AddContact(&con);//添加联系人信息break;case DEL:DelContact(&con);//删除联系人信息break;case SEARCH:SearchContact(&con);//查找联系人信息break;case MODIFY:ModifyContact(&con);//修改联系人信息break;case SHOW:ShowContact(&con);//显示联系人信息break;case SORT:SortContact(&con);//排序联系人信息break;case EXIT:SaveContact(&con);//保存信息DistroyContact(&con);//销毁通讯录信息printf("退出通讯录\n");break;default:printf("选择错误,请重新选择\n");break;}} while (input);return 0;
}

2.contact.c

#include "contact.h"//扩充容量
void CheckContact(struct Contact* pc)
{if (pc->sz == pc->capacity){struct PeoInfo* ptr = (struct PeoInfo*)realloc(pc->data, (pc->capacity + 2) * sizeof(struct PeoInfo));if (ptr != NULL){pc->data = ptr;pc->capacity += 2;printf("扩容成功\n");}else{printf("扩容失败\n");exit(1);}}
}//加载有效信息到通讯录中
void LoadContact(struct Contact* pc)
{FILE* pf = fopen("contact.txt", "rb");if (pf == NULL){perror("contact:fopen");return;}struct PeoInfo tmp = { 0 };while (fread(&tmp, sizeof(struct PeoInfo), 1, pf)){CheckContact(pc);pc->data[pc->sz] = tmp;pc->sz++;}fclose(pf);pf = NULL;
}//初始化通讯录
void InitContact(struct Contact* pc)
{pc->sz = 0;pc->data = (struct PeoInfo*)malloc(DEFAULT_SZ * sizeof(struct PeoInfo));pc->capacity = DEFAULT_SZ;LoadContact(pc);//加载有效信息到通讯录中
}//添加联系人信息
void AddContact(struct Contact* pc)
{CheckContact(pc);printf("请输入联系人的姓名:>");scanf("%s", pc->data[pc->sz].name);printf("请输入联系人的年龄:>");scanf("%d", &pc->data[pc->sz].age);printf("请输入联系人的性别:>");scanf("%s", pc->data[pc->sz].sex);printf("请输入联系人的电话:>");scanf("%s", pc->data[pc->sz].tele);printf("请输入联系人的住址:>");scanf("%s", pc->data[pc->sz].addr);printf("添加成功\n");pc->sz++;
}//销毁通讯录
void DistroyContact(struct Contact* pc)
{free(pc->data);pc->data = NULL;pc->sz = 0;pc->capacity = 0;
}//显示联系人信息
void ShowContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,显示失败!!!\n");return;}int i = 0;printf("\t\t--------------------------------------------------------------------------\n");printf("\t\t--------------------------------------------------------------------------\n");printf("\t%15s\t%15s\t%15s\t%15s\t%15s\n\n","姓名", "年龄", "性别", "电话", "住址");for (i = 0; i < pc->sz; i++){printf("\t%15s\t%15d\t%15s\t%15s\t%15s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}printf("\t\t--------------------------------------------------------------------------\n");printf("\t\t--------------------------------------------------------------------------\n");
}//删除联系人信息
int FindContactByName(const struct Contact* pc, char* name)
{int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1;
}void DelContact(struct Contact* pc)
{if (pc->sz == 0){printf("联系人为空,操作失败\n");return;}char name[NAME_MAX] = { 0 };printf("请输入要删除的联系人姓名:>");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("查找的联系人不存在!!!\n");}else{for (int i = pos; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("删除成功\n");}
}//查找联系人信息
void SearchContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,查找失败!!!\n");return;}char name[NAME_MAX] = { 0 };printf("请输入要查找的联系人的名字:>");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("联系人不存在!!!\n");return;}else{printf("\t%15s\t%15s\t%15s\t%15s\t%15s\n\n","姓名", "年龄", "性别", "电话", "住址");printf("\t%15s\t%15d\t%15s\t%15s\t%15s\n",pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].tele,pc->data[pos].addr);}
}//修改联系人信息
void ModifyContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,查找失败!!!\n");return;}char name[NAME_MAX] = { 0 };printf("请输入要修改的联系人姓名:>");scanf("%s", name);int pos = FindContactByName(pc, name);if (pos == -1){printf("联系人不存在!!!\n");return;}else{printf("请输入新的联系人姓名:>");scanf("%s", pc->data[pos].name);printf("请输入新的联系人年龄:>");scanf("%d", &pc->data[pos].age);printf("请输入新的联系人性别:>");scanf("%s", pc->data[pos].sex);printf("请输入新的联系人电话:>");scanf("%s", pc->data[pos].tele);printf("请输入新的联系人住址:>");scanf("%s", pc->data[pos].addr);}printf("修改成功\n");
}//排序联系人信息
void SortContact(struct Contact* pc)
{if (pc->sz == 0){printf("通讯录为空,无法排序!!!\n");return;}int i = 0;int j = 0;struct PeoInfo tmp;for (i = 0; i < pc->sz - 1; i++){int flag = 1;for (j = 0; j < pc->sz - i - 1; j++){if (strcmp(pc->data[j].name, pc->data[j + 1].name) < 0){tmp = pc->data[j];pc->data[j] = pc->data[j + 1];pc->data[j + 1] = tmp;flag = 0;}}if (flag == 1){return;}}printf("排序成功\n");
}//保存信息
void SaveContact(struct Contact* pc)
{//1.打开文件FILE* pf = fopen("contact.txt", "wb");if (pf == NULL){perror("SaveContact:fopen");return;}//2.写数据int i = 0;for (i = 0; i < pc->sz; i++){fwrite(&(pc->data[i]), sizeof(struct PeoInfo), 1, pf);}//3.关闭文件fclose(pf);pf = NULL;
}

3.contact.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define NAME_MAX 20
#define SEX_MAX 20
#define TELE_MAX 20
#define ADDR_MAX 20
#define DEFAULT_SZ 3struct PeoInfo
{char name[NAME_MAX];//姓名int age;			//年龄char sex[SEX_MAX];  //性别char tele[TELE_MAX];//电话char addr[ADDR_MAX];//住址
};struct Contact
{struct PeoInfo* data;//能够动态存储联系人的信息int sz;				 //记录当前联系人的个数int capacity;		 //记录当前通讯录的容量
};//初始化通讯录
void InitContact(struct Contact* pc);//添加联系人信息
void AddContact(struct Contact* pc);//销毁通讯录信息
void DistroyContact(struct Contact* pc);//显示联系人信息
void ShowContact(struct Contact* pc);//删除联系人信息
void DelContact(struct Contact* pc);//查找联系人信息
void SearchContact(struct Contact* pc);//修改联系人信息
void ModifyContact(struct Contact* pc);//排序联系人信息
void SortContact(struct Contact* pc);//加载有效信息到通讯录中
void LoadContact(struct Contact* pc);//保存信息
void SaveContact(struct Contact* pc);

#四、演示效果

没有联系人
在这里插入图片描述

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

查找联系人
在这里插入图片描述

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

显示联系人
加粗样式

排序联系人
在这里插入图片描述

退出通讯录
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

YOKOGAWA CP461-50处理器模块

数据处理能力&#xff1a; CP461-50 处理器模块具有强大的数据处理能力&#xff0c;用于执行各种控制和数据处理任务。 多通道支持&#xff1a; 该模块通常支持多通道输入和输出&#xff0c;允许与多个传感器和执行器进行通信。 通信接口&#xff1a; CP461-50 处理器模块通常…

每日一题(复制带随机指针的链表)

每日一题&#xff08;复制带随机指针的链表&#xff09; 138. 复制带随机指针的链表 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 由于每个链表还包含了一个random节点指向了链表中的随机节点&#xff0c;所以并不能直接照搬复制原链表。首先想到的暴力思路是复…

嵌入式学习笔记(1)ARM的编程模式和7种工作模式

ARM提供的指令集 ARM态-ARM指令集&#xff08;32-bit&#xff09; Thumb态-Thumb指令集&#xff08;16-bit&#xff09; Thumb2态-Thumb2指令集&#xff08;16 & 32 bit&#xff09; Thumb指令集是对ARM指令集的一个子集重新编码得到的&#xff0c;指令长度为16位。通常在…

Thymeleaf

这就是自动装配的原理 1) .SpringBoot启动会加载大量的自动配置类 2)、我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中; 3)、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中&#xff0c;我们就不需要再手动配置了) 4)、给容器…

渣土车识别监测 渣土车未盖篷布识别抓拍算法

渣土车识别监测 渣土车未盖篷布识别抓拍算法通过yolov7深度学习训练模型框架&#xff0c;渣土车识别监测 渣土车未盖篷布识别抓拍算法在指定区域内实时监测渣土车的进出状况以及对渣土车未盖篷布违规的抓拍和预警。YOLOv7 的策略是使用组卷积来扩展计算块的通道和基数。研究者将…

数字化新零售平台系统提供商,门店商品信息智慧管理-亿发进销存

传统的批发零售业务模式正面临着市场需求变化的冲击。用户日益注重个性化、便捷性和体验感&#xff0c;新兴的新零售模式迅速崛起&#xff0c;改变了传统的零售格局。如何在保持传统业务的基础上&#xff0c;变革发展&#xff0c;成为了业界亟需解决的问题。 在这一背景下&…

JixiPix Artista Impresso Pro for mac(油画滤镜效果软件)

JixiPix Artista Impresso pro Mac是一款专业的图像编辑软件&#xff0c;专为Mac用户设计。它提供了各种高质量的图像编辑工具&#xff0c;可以帮助您创建令人惊叹的图像。该软件具有直观的用户界面&#xff0c;使您可以轻松地浏览和使用各种工具。 它还支持多种文件格式&…

前端是leyui后端sqlserver和maraDB进行分页

项目场景&#xff1a; 前端是leyui后端sqlserver和maraDB进行分页,两种数据库在后端分页的不同写法 解决方案&#xff1a; 前端: 定义table,表格的格式在接口返回时进行创建,根据id进行绑定 <div class"layui-tab-item layui-show" style"padding-top: 10…

C++的基类和派生类构造函数

基类的成员函数可以被继承&#xff0c;可以通过派生类的对象访问&#xff0c;但这仅仅指的是普通的成员函数&#xff0c;类的构造函数不能被继承。构造函数不能被继承是有道理的&#xff0c;因为即使继承了&#xff0c;它的名字和派生类的名字也不一样&#xff0c;不能成为派生…

rate-based 拥塞控制吞吐测量

要点&#xff1a;一个方法无法精确刻画链路画像&#xff0c;就用多种方法组合刻画&#xff0c;设计一个 “自定义平均”。 当前 Linux kernel TCP 实现的 TCP delivery rate 测量机制(BBR 有使用到)如下图&#xff1a; 简略后可展示为下图&#xff1a; 详见 net/ipv4/tcp_…

5G NR:RACH流程 -- Msg1发送时RA-RNTI的计算及功率控制

前言 如果阅读了这两篇博文《如何产生PRACH preamble》和《如何选择合适的时频资源发送preamble》&#xff0c;那么对msg1有了基本了解&#xff0c;但是真到了Msg1发送的时候&#xff0c;该怎么处理呢&#xff0c;这里涉及到两个问题&#xff1a; 问题1&#xff1a;发…

数据结构:排序解析

文章目录 前言一、常见排序算法的实现1.插入排序1.直接插入排序2.希尔排序 2.交换排序1.冒泡排序2.快速排序1.hoare版2.挖坑版3.前后指针版4.改进版5.非递归版 3.选择排序1.直接选择排序2.堆排序 4.归并排序1.归并排序递归实现2.归并排序非递归实现 5.计数排序 二、排序算法复杂…

训练简单的线性模型,预测电影评分和票房收入

文章目录 训练简单的线性模型&#xff0c;预测电影评分和票房收入数据集加载数据可视化数据分割数据集训练模型可视化结果应用模型保存和加载模型 训练简单的线性模型&#xff0c;预测电影评分和票房收入 这是一个简单的线性模型&#xff0c;用于预测电影的评分和票房收入。不…

idea全局搜索失效,Ctrl+shift+F快捷键不起作用

方法1&#xff1a;是否与搜狗等输入法软件存在快捷键冲突&#xff0c;当然也可能是你新下载的什么软件导致的快捷键冲突导致IDEA全局搜索失效。比如下图&#xff1a; 可以改掉输入法的快捷键或者直接关闭输入法的快捷键&#xff0c;这样idea的全局搜索功能就恢复了。 方法2&…

1.9 动态解密ShellCode反弹

动态解密执行技术可以对抗杀软的磁盘特征查杀。其原理是将程序代码段中的代码进行加密&#xff0c;然后将加密后的代码回写到原始位置。当程序运行时&#xff0c;将动态解密加密代码&#xff0c;并将解密后的代码回写到原始位置&#xff0c;从而实现内存加载。这种技术可以有效…

【Cookie和Session的那些事儿】

&#x1f320;作者&#xff1a;TheMythWS. &#x1f386;专栏&#xff1a;《集合与数据结构》 &#x1f387;座右铭&#xff1a;不走心的努力都是在敷衍自己&#xff0c;让自己所做的选择&#xff0c;熠熠发光。 目录 认识Cookie和Session Cookie Cookie对象的特点 Cookie对…

Unity 之 参数类型之值类型参数的用法

文章目录 基本数据类型结构体结构体的进一步补充 总结&#xff1a; 当谈论值类型参数时&#xff0c;我们可以从基本数据类型和结构体两个方面详细解释。值类型参数指的是以值的形式传递给函数或方法的数据&#xff0c;而不是引用。 基本数据类型 基本数据类型的值类型参数&…

数据库介绍

一.什么是数据库&#xff1f; 通俗的来讲数据库就是用来存放数据的地方&#xff0c;可以理解为和冰箱一样 官方&#xff1a; 数据库&#xff08;Database&#xff09;是按照数据结构来组织、存储和管理数据的仓库。 每个数据库都有一个或多个不同的 API 用于创建&#xff0c;…

说说Flink双流join

分析&回答 Flink双流JOIN主要分为两大类 一类是基于原生State的Connect算子操作另一类是基于窗口的JOIN操作。其中基于窗口的JOIN可细分为window join和interval join两种。 基于原生State的Connect算子操作 实现原理&#xff1a;底层原理依赖Flink的State状态存储&…

11.添加侧边栏,并导入数据

修改CommonAside的代码&#xff1a; <template><div><el-menu default-active"1-4-1" class"el-menu-vertical-demo" open"handleOpen" close"handleClose":collapse"isCollapse"><!--<el-menu-it…