当前位置: 首页 > news >正文

【C语言】通讯录管理系统(保姆级教程+内含源码)

C系列文章目录


目录

C系列文章目录

前言

一,模块化编程

二,系统框架构建

1.成员信息的创建

2.菜单实现

3.系统功能声明

三、系统功能实现

1.初始化通讯录

2.增加联系人

3.显示所有联系人

4.根据姓名查找位置

5.删除指定联系人

6.查找指定联系人

7.修改指定联系人

8.清空所有联系人

9.按照名字排序所有联系人

四,源文件展示

1.test.c

2.game.c

3.game.h

总结


前言

通过使用C语言来创建一个通讯录的管理系统,管理人员可对成员信息进行管理。成员信息包括姓名、年龄、电话、性别以及住址,执行操作有增删改查这四项基本操作以及成员信息全览和信息排序。

一,模块化编程

  1. 可维护性:模块化编程将代码划分为独立的模块,每个模块负责特定的任务或功能。这样,在需要修改或调试某个功能时,只需关注相关的模块,而不需要涉及整个程序。这大大简化了维护和调试的工作,使得代码更易于理解和修改。

  2. 重用性:模块化编程鼓励开发人员将一些常用的功能封装成模块,然后在不同的项目中重复使用。这样可以避免重复编写相同的代码,减少了开发工作量,提高了开发效率。同时,通过不断重用经过测试和验证的模块,可以提高代码的可靠性和稳定性。

  3. 可扩展性:当需要添加新的功能或修改现有功能时,模块化编程能够提供更好的可扩展性。由于模块之间的依赖关系明确定义和管理,可以单独修改或替换某个模块,而不会影响到其他模块。这种灵活性使得系统更容易适应变化和演化。

  4. 并行开发:模块化编程允许多个开发人员并行工作,每个人负责开发和测试不同的模块。这样可以提高开发效率,缩短项目的开发周期。同时,模块化编程也方便团队协作和沟通,降低了开发过程中的冲突和合并的风险。

  5. 可测试性:模块化编程使得单元测试更容易进行。每个模块都是相对独立的,可以单独测试其功能和性能。这样可以更容易地发现和修复问题,提高软件的质量和稳定性。

总之,模块化编程的优势包括可维护性、重用性、可扩展性、并行开发和可测试性。这些优势使得代码更易于理解、修改和维护,提高了开发效率和软件质量。

在学习通讯录管理系统前,我们先了解模块化编程,模块化编程的思想可以让我们更好的进行编程,让我们更好的理解接下来的通讯录管理系统过程。

二,系统框架构建

1.成员信息的创建

因为我们要输入成员信息较多,所有我们可以选择通过创建结构体来创建一个通讯录结构体和一个成员信息结构体。
通讯录结构体内部会嵌套一个成员信息结构体和一个表示成员数量的变量。

typedef struct PeoInfo//创建成员信息结构体
{char name[FILENAME_MAX];int age;char sex[SEX_MAX];char tele[TELE_MAX];char addr[ADDR_MAX];
}PeoInfo;
typedef struct Contact//创建通讯录结构体
{PeoInfo data[MAX];int sz;
}Contact;

2.菜单实现

首先对于我们要创建的通讯录管理系统来说,建立一个菜单让人们选择功能是非常重要的,这就好比在一个餐厅里,只有提供了一份菜单,顾客就可以根据自己的意愿的点菜,在操作界面显示一个完整简明的菜单,才能更好地管理通讯录系统。

void nume()
{printf("*******************************\n");printf("*****   通讯录管理系统    ******\n");printf("***  1.add          2.del  ****\n");//增加和删除指定联系人printf("***  3.search       4.modify***\n");//查找和修改指定联系人printf("***  5.show         6.sort ****\n");//显示和排序所有联系人printf("***  7.empty        0.exit ****\n");//清除所有联系人,和退出程序printf("*******************************\n");
}

3.系统功能声明

//对通讯录进行初始化
void InitContact(Contact* pc);//增加联系人
void AddContact(Contact* pc);//显示联系人
void ShowContact(Contact* pc);//删除联系人
void DelContact(Contact* pc);//查找联系人
void SearchContact(Contact* pc);//修改联系人
void ModifyContact(Contact* pc);//清空所有联系人
void QingContact(Contact* pc);//排序联系人
void PaiContact(Contact* pc);

三、系统功能实现

1.初始化通讯录

为什么要对通讯录进行初始化呢,因为在创建了通讯录之后,里边的所有信息的以随机值的形式存在,不知道的还以为这个通讯录里已经存放了成员信息,所以要进行初始化。

//初始化通讯录
void InitContact(Contact* pc)
{assert(pc);//防止空指针pc->sz = 0;//将sz初始化为0memset(pc->data, 0, sizeof(pc->data));//数组名,替换,替换数
}

2.增加联系人

//增加联系人
void AddContact(Contact* pc)
{assert(pc);//防止空指针if (pc->sz == MAX)//表示通讯录结构体的开辟的空间满了{printf("通讯录已满,无法增加\n");return;}//通讯录没有满就输入else{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);pc->sz++;//一个结构体数据填满后,就在继续填充下一个printf("增加成功\n");}
}

3.显示所有联系人

//打印所有联系人
void ShowContact(Contact* pc)
{assert(pc);//防止空指针if (pc->sz == 0)//检查sz是否是指向开头{printf("通讯录为空,无需打印\n");return;}int i = 0;printf("%-20s%-5s%-5s%-12s%-30s%\n", "名字", "年龄", "性别", "电话", "地址");for (i = 0; i < pc->sz; i++){printf("%-20s%-5d%-5s%-12s%-30s%\n", pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}
}

4.根据姓名查找位置

这个函数的存在就是为了通讯录管理人员通过成员姓名来查找该成员信息所处的位置。

static int FindByName(Contact* pc, char name[])
{assert(pc);//防止空指针int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0)//对比数据是否相同,如果相同就返回该指针的指向数据,不相同就返回-1{return i;}}return -1;
}

5.删除指定联系人

//删除指定联系人
void DelContact(Contact* pc)
{char name[NAME_MAX];assert(pc);if (pc->sz == 0)//先要看通讯录是否为空{printf("通讯录为空,无法删除\n");return;}printf("请输入要删除人的名字:");scanf("%s", name);int ret = FindByName(pc, name);//返回查找函数if (ret == -1){printf("要删除的人不存在\n");return;}int i = 0;for (i = ret; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("删除成功\n");
}

6.查找指定联系人

void SearchContact(Contact* pc)
{char name[NAME_MAX];assert(pc);printf("请输入要查找人的名字:");scanf("%s", name);int ret = FindByName(pc, name);if (ret == -1){printf("要查找的人不存在\n");return;}printf("%-20s%-5s%-5s%-12s%-30s%\n", "名字", "年龄", "性别", "电话", "地址");printf("%-20s%-5d%-5s%-12s%-30s%\n", pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].addr);
}

7.修改指定联系人

//修改联系人
void ModifyContact(Contact* pc)
{char name[NAME_MAX];assert(pc);printf("请输入要修改人的名字:");scanf("%s", name);int ret = FindByName(pc, name);if (ret == -1){printf("要修改的人不存在\n");return;}printf("请输入名字:");scanf("%s", pc->data[ret].name);printf("请输入年龄:");scanf("%d", &(pc->data[pc->sz].age));printf("请输入性别:");scanf("%s", pc->data[ret].sex);printf("请输入电话:");scanf("%s", pc->data[ret].tele);printf("请输入地址:");scanf("%s", pc->data[ret].addr);printf("修改成功\n");
}

8.清空所有联系人

//清空所有联系人
void QingContact(Contact* pc)
{char name[NAME_MAX];assert(pc);if (pc->sz == 0){printf("通讯录为空,无法删除\n");return;}pc->sz = 0;memset(pc->data, 0, sizeof(pc->data));printf("删除成功\n");}

9.按照名字排序所有联系人

使用qsort函数经行排序

//排序所有人
int cmp_s(const void* elem1, const void* elem2)
{return strcmp((char*)elem1, (char*)elem2);
}
void PaiContact(Contact* pc)
{assert(pc);qsort(pc, pc->sz, sizeof(pc->data[0]), cmp_s);int i = 0;printf("%-20s%-5s%-5s%-12s%-30s%\n", "名字", "年龄", "性别", "电话", "地址");for (i = 0; i < pc->sz; i++){printf("%-20s%-5d%-5s%-12s%-30s%\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);}
}

四,源文件展示

1.test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void nume()
{printf("*******************************\n");printf("*****   通讯录管理系统   ******\n");printf("***  1.add          2.del  ****\n");//增加和删除指定联系人printf("***  3.search       4.modify***\n");//查找和修改指定联系人printf("***  5.show         6.sort ****\n");//显示和排序所有联系人printf("***  7.empty        0.exit ****\n");//清除所有联系人,和退出程序printf("*******************************\n");
}
enum Option
{EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT,EMPTY,
};
int main()
{int input = 0;Contact con;InitContact(&con);do{nume();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:PaiContact(&con);break;case EMPTY:QingContact(&con);break;default:break;}} while(input);return 0;
}

2.game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//初始化通讯录
void InitContact(Contact* pc)
{assert(pc);//防止空指针pc->sz = 0;//将sz初始化为0memset(pc->data, 0, sizeof(pc->data));//数组名,替换,替换数
}
//增加联系人
void AddContact(Contact* pc)
{assert(pc);//防止空指针if (pc->sz == MAX)//表示通讯录结构体的开辟的空间满了{printf("通讯录已满,无法增加\n");return;}//通讯录没有满就输入else{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);pc->sz++;//一个结构体数据填满后,就在继续填充下一个printf("增加成功\n");}
}
//打印所有联系人
void ShowContact(Contact* pc)
{assert(pc);//防止空指针if (pc->sz == 0)//检查sz是否是指向开头{printf("通讯录为空,无需打印\n");return;}int i = 0;printf("%-20s%-5s%-5s%-12s%-30s%\n", "名字", "年龄", "性别", "电话", "地址");for (i = 0; i < pc->sz; i++){printf("%-20s%-5d%-5s%-12s%-30s%\n", pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);}
}
static int FindByName(Contact* pc, char name[])
{assert(pc);//防止空指针int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0)//对比数据是否相同,如果相同就返回该指针的指向数据,不相同就返回-1{return i;}}return -1;
}
//删除指定联系人
void DelContact(Contact* pc)
{char name[NAME_MAX];assert(pc);if (pc->sz == 0)//先要看通讯录是否为空{printf("通讯录为空,无法删除\n");return;}printf("请输入要删除人的名字:");scanf("%s", name);int ret = FindByName(pc, name);//返回查找函数if (ret == -1){printf("要删除的人不存在\n");return;}int i = 0;for (i = ret; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("删除成功\n");
}
//查找联系人
void SearchContact(Contact* pc)
{char name[NAME_MAX];assert(pc);printf("请输入要查找人的名字:");scanf("%s", name);int ret = FindByName(pc, name);if (ret == -1){printf("要查找的人不存在\n");return;}printf("%-20s%-5s%-5s%-12s%-30s%\n", "名字", "年龄", "性别", "电话", "地址");printf("%-20s%-5d%-5s%-12s%-30s%\n", pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].addr);
}
//修改联系人
void ModifyContact(Contact* pc)
{char name[NAME_MAX];assert(pc);printf("请输入要修改人的名字:");scanf("%s", name);int ret = FindByName(pc, name);if (ret == -1){printf("要修改的人不存在\n");return;}printf("请输入名字:");scanf("%s", pc->data[ret].name);printf("请输入年龄:");scanf("%d", &(pc->data[pc->sz].age));printf("请输入性别:");scanf("%s", pc->data[ret].sex);printf("请输入电话:");scanf("%s", pc->data[ret].tele);printf("请输入地址:");scanf("%s", pc->data[ret].addr);printf("修改成功\n");
}
//清空所有联系人
void QingContact(Contact* pc)
{char name[NAME_MAX];assert(pc);if (pc->sz == 0){printf("通讯录为空,无法删除\n");return;}pc->sz = 0;memset(pc->data, 0, sizeof(pc->data));printf("删除成功\n");}
//排序所有人
int cmp_s(const void* elem1, const void* elem2)
{return strcmp((char*)elem1, (char*)elem2);
}
void PaiContact(Contact* pc)
{assert(pc);qsort(pc, pc->sz, sizeof(pc->data[0]), cmp_s);int i = 0;printf("%-20s%-5s%-5s%-12s%-30s%\n", "名字", "年龄", "性别", "电话", "地址");for (i = 0; i < pc->sz; i++){printf("%-20s%-5d%-5s%-12s%-30s%\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);}
}

3.game.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 100typedef struct PeoInfo
{char name[FILENAME_MAX];int age;char sex[SEX_MAX];char tele[TELE_MAX];char addr[ADDR_MAX];
}PeoInfo;typedef struct Contact
{PeoInfo data[MAX];int sz;
}Contact;//对通讯录进行初始化
void InitContact(Contact* pc);//增加联系人
void AddContact(Contact* pc);//显示联系人
void ShowContact(Contact* pc);//删除联系人
void DelContact(Contact* pc);//查找联系人
void SearchContact(Contact* pc);//修改联系人
void ModifyContact(Contact* pc);//清空所有联系人
void QingContact(Contact* pc);//排序联系人
void PaiContact(Contact* pc);

总结

本篇文章详细的,有体系的介绍了通讯录管理系统的结构,方便我们小白的更加理解C语言的自定义结构体。

相关文章:

【C语言】通讯录管理系统(保姆级教程+内含源码)

C系列文章目录 目录 C系列文章目录 前言 一&#xff0c;模块化编程 二&#xff0c;系统框架构建 1.成员信息的创建 2.菜单实现 3.系统功能声明 三、系统功能实现 1.初始化通讯录 2.增加联系人 3.显示所有联系人 4.根据姓名查找位置 5.删除指定联系人 6.查找指定联…...

python自动解析301、302重定向链接

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 使用模块requests 方式代码如下&#xff1a; import requests url_string"http://******" r requests.head(url_string, streamTrue) print r.h…...

【未解决问题】opencv 交叉编译 ffmpeg选项始终为NO

opencv 打不开视频的原因 在交叉编译时候&#xff0c;发现在 pc 端能用 opencv 打开的视频&#xff0c;但是在 rv1126 上打不开。在网上查了很久&#xff0c;原因可能是 ffmpeg 造成的。 解决opencv源代码编译找不到ffmpeg-CSDN博客 交叉编译 ffmpeg 尝试了一天还是第二个博客…...

Python实用技术二:数据分析和可视化(2)

目录 一&#xff0c;多维数组库numpy 1&#xff0c;操作函数&#xff1a;​ 2&#xff0c;numpy数组元素增删 1&#xff09;添加数组元素 2&#xff09;numpy删除数组元素 3&#xff09;在numpy数组中查找元素 4&#xff09;numpy数组的数学运算 3&#xff0c;numpy数…...

24Hibench

1. Hibench 官网 ​ HiBench is a big data benchmark suite that helps evaluate different big data frameworks in terms of speed, throughput and system resource utilizations. It contains a set of Hadoop, Spark and streaming workloads, including Sort, WordCou…...

VC++父进程交互式操作子进程标准输入输出

父进程接管子进程的标准输入输出和错误,实现对子进程的交互操作。比如子进程是一个类似mysql这种可以交互的命令,执行操作后输出结果,父进程根据结果分析决定执行下一步的命令,从而替代人工的输入。 通过父进程创建子进程,使用管道重定向子进程的输入输出错误可以实现 在 …...

一步一招,教你如何制作出成功的优惠促销微传单

在当今的数字化时代&#xff0c;几乎所有的事情都可以在互联网上完成&#xff0c;包括制作宣传单。有很多在线工具可以帮助我们轻松制作出精美的商场促销宣传单。下面就以乔拓云为例&#xff0c;详细介绍如何简单几步制作出让人眼前一亮的商场促销宣传单。 1. 注册并登录乔拓云…...

27、Flink 的SQL之SELECT (Pattern Recognition 模式检测)介绍及详细示例(7)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…...

Git使用【上】

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析3 前言 先前有些git命令我在我的其它文章里面已经写过&#xff0c;若要查看可参考【Linu…...

flink的序列化基准测试

背景&#xff1a; flink提供了在本地环境使用jmh测试不同序列化方法的性能差异&#xff0c;本文就是基于这个https://github.com/apache/flink-benchmarks这个性能测试&#xff0c;总结几个结论&#xff0c;以便后面使用时避免掉坑 基准测试 我们本次运行的是SerializationF…...

Error: node: unknown or unsupported macOS version: :dunno 错误解决

一、原因 今天安装 brew install node报错了&#xff0c;错误信息如下&#xff1a; 二、解决方案 1&#xff09;查找homebrew-cask安装位置 echo $(brew --repo homebrew/homebrew-cask) // 输出 /opt/homebrew/Library/Taps/homebrew/homebrew-cask2&#xff09;使用 gi…...

嵌入式Linux应用开发-基础知识-第十八章系统对中断的处理②

嵌入式Linux应用开发-基础知识-第十八章系统对中断的处理② 第十八章 Linux系统对中断的处理 ②18.3 Linux中断系统中的重要数据结构18.3.1 irq_desc数组18.3.2 irqaction结构体18.3.3 irq_data结构体18.3.4 irq_domain结构体18.3.5 irq_chip结构体 18.4 在设备树中指定中断_在…...

Kolmogorov-Smirnov正态性检验

Kolmogorov-Smirnov正态性检验是一种统计方法&#xff0c;用于检验数据集是否服从正态分布。其基本原理和用途如下&#xff1a; 基本原理&#xff1a; 假设检验&#xff1a;Kolmogorov-Smirnov检验基于一个假设&#xff0c;即待检验的数据集服从特定的理论正态分布。计算累积…...

BI神器Power Query(25)-- 使用PQ实现表格多列转换(1/3)

实例需求&#xff1a;原始表格包含多列属性数据,现在需要将不同属性分列展示在不同的行中&#xff0c;att1、att3、att5为一组&#xff0c;att2、att3、att6为另一组&#xff0c;数据如下所示。 更新表格数据 原始数据表&#xff1a; Col1Col2Att1Att2Att3Att4Att5Att6AAADD…...

windows系统一键开启和关闭虚拟化

说明 跟虚拟化相关的三个程序 一键开启脚本 REM 开启 Hyper-V 服务 pushd "%~dp0"dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txtfor /f %%i in (findstr /i . hyper-v.txt 2^>nul) do dism /online /norestart /add-package:"%Sy…...

NSSCTF做题(5)

[NSSCTF 2022 Spring Recruit]babyphp 代码审计 if(isset($_POST[a])&&!preg_match(/[0-9]/,$_POST[a])&&intval($_POST[a])){ if(isset($_POST[b1])&&$_POST[b2]){ if($_POST[b1]!$_POST[b2]&&md5($_POST[b1])md5($_POST[b2])){…...

java基础题——二维数组的基本应用

1.设计程序按照各个学生的 Java 成绩进行排序 ( 降序 ) 2.设计程序&#xff0c;根据学生总成绩进行排序(降序排列)&#xff0c;并输出学生姓名、每门课程的名称和该学生的成绩、该学生的总成绩 public static void main(String[] args) {String[] names {"安琪拉",…...

Leetcode 2119.反转两次的数字

反转 一个整数意味着倒置它的所有位。 例如&#xff0c;反转 2021 得到 1202 。反转 12300 得到 321 &#xff0c;不保留前导零 。 给你一个整数 num &#xff0c;反转 num 得到 reversed1 &#xff0c;接着反转 reversed1 得到 reversed2 。如果 reversed2 等于 num &#x…...

BI神器Power Query(27)-- 使用PQ实现表格多列转换(3/3)

实例需求&#xff1a;原始表格包含多列属性数据,现在需要将不同属性分列展示在不同的行中&#xff0c;att1、att3、att5为一组&#xff0c;att2、att3、att6为另一组&#xff0c;数据如下所示。 更新表格数据 原始数据表&#xff1a; Col1Col2Att1Att2Att3Att4Att5Att6AAADD…...

VUE3照本宣科——认识VUE3

VUE3照本宣科——认识VUE3 前言一、命令创建项目1.中文官网2.菜鸟教程 二、VUE3项目目录结构1.public2.src&#xff08;1&#xff09;assets&#xff08;2&#xff09;components 3. .eslintrc.cjs4. .gitignore5. .prettierrc.json6.index.html7.package.json8.README.md9.vit…...

《计算机视觉中的多视图几何》笔记(12)

12 Structure Computation 本章讲述如何在已知基本矩阵 F F F和两幅图像中若干对对应点 x ↔ x ′ x \leftrightarrow x x↔x′的情况下计算三维空间点 X X X的位置。 文章目录 12 Structure Computation12.1 Problem statement12.2 Linear triangulation methods12.3 Geomet…...

TFT LCD刷新原理及LCD时序参数总结(LCD时序,写的挺好)

cd工作原理目前不了解&#xff0c;日后会在博客中添加这一部分的内容。 1.LCD工作原理[1] 我对LCD的工作原理也仅仅处在了解的地步&#xff0c;下面基于NXP公司对LCD工作原理介绍的ppt来学习一下。 LCD(liquid crystal display,液晶显示屏) 是由液晶段阵列组成&#xff0c;当…...

基于Java的电影院购票系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...

Linux基础指令(六)

目录 前言1. man 指令2. date 指令3. cal 指令4. bc 指令5. uname 指令结语&#xff1a; 前言 欢迎各位伙伴来到学习 Linux 指令的 第六天&#xff01;&#xff01;&#xff01; 在上一篇文章 Linux基本指令(五) 中&#xff0c;我们通过一段故事线&#xff0c;带大家感性的了…...

Anderson-Darling正态性检验【重要统计工具】

Anderson-Darling正态性检验是一种用于确定数据集是否服从正态分布&#xff08;也称为高斯分布或钟形曲线分布&#xff09;的统计方法。它基于Anderson和Darling于1954年提出的检验统计量。该检验的基本原理和用途如下&#xff1a; 基本原理&#xff1a; 零假设&#xff08;Nu…...

Ubuntu基于Docker快速配置GDAL的Python、C++环境

本文介绍在Linux的Ubuntu操作系统中&#xff0c;基于Docker快速配置Python、C等不同编程语言均可用的地理数据处理库GDAL的方法。 首先&#xff0c;我们访问GDAL库的Docker镜像官方网站&#xff08;https://github.com/OSGeo/gdal/tree/master/docker&#xff09;。其中&#x…...

<C++> 哈希表模拟实现STL_unordered_set/map

哈希表模板参数的控制 首先需要明确的是&#xff0c;unordered_set是K模型的容器&#xff0c;而unordered_map是KV模型的容器。 要想只用一份哈希表代码同时封装出K模型和KV模型的容器&#xff0c;我们必定要对哈希表的模板参数进行控制。 为了与原哈希表的模板参数进行区分…...

【数据结构与算法】通过双向链表和HashMap实现LRU缓存 详解

这个双向链表采用的是有伪头节点和伪尾节点的 与上一篇文章中单链表的实现不同&#xff0c;区别于在实例化这个链表时就初始化了的伪头节点和伪尾节点&#xff0c;并相互指向&#xff0c;在第一次添加节点时&#xff0c;不需要再考虑空指针指向问题了。 /*** 通过链表与HashMa…...

MySQL的内置函数

文章目录 1. 聚合函数2. group by子句的使用3. 日期函数4. 字符串函5. 数学函数6. 其它函数 1. 聚合函数 COUNT([DISTINCT] expr) 返回查询到的数据的数量 用SELECT COUNT(*) FROM students或者SELECT COUNT(1) FROM students也能查询总个数。 统计本次考试的数学成绩分数去…...

数据结构与算法-(7)---栈的应用-(3)表达式转换

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…...