C语言实战项目---通讯录

news2024/11/25 12:56:09

项目要实现的内容:能够存放100个人的通讯录程序,能够实现联系人数据的存储,删除,修改,查找,展示联系人的信息。

所需知识:结构体,指针,函数.................

废话不多说,咱们直接开始

1.界面的打印

我们需要一个可以执行选择的界面提供用户选择不同的数字来执行不同的程序。

我们在这里提前声明一下:

1.add(增加联系人的信息)

2.deal(删除联系人的信息)

3.search(查找联系人的信息)

4.modify(修改联系人的信息)

5.show(展示联系人的信息)

那我们现在就开始

void menu()
{
	printf("************************************************\n");
	printf("***      1. add        2.deal                   *\n");
	printf("***      3.search      4.modify                 *\n");
	printf("***      5.show        6.exit                   *\n");
	printf("*************************************************\n");
	
}

这个就是我们的菜单

菜单的打印很简单就使用一个 printf一个函数,我们接着继续把选择语句写出来 在我们写之前我们来思考一个问题(我们一共有六个可供选择的程序接口,那么我们该如何分辨我们选择执行的程序不会出错呢?)其实有个办法就是使用  枚举常量来实现。

大家来看不懂枚举的大家看我往期博客 我把地址放在这 CSDN

enum Option
{
	exit,       //退出信息管理系统   0
	add,        //增加信息管理系统   1
	deal,       //删除信息管理系统   2
	search,     //搜索信息管理系统   3 
	modify,     //修改信息管理系统   4
	show,       //展示信息管理系统   5

};

这样我们就可以清楚的知道我们所选择的每个选项,所要执行的程序。

我们来实现选择,选择不同的数字来执行不同的程序。原理很简单,使用一个do while(循环)

嵌套一个Switch语句。

int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择\n");
		scanf_s("%d", &input);
		switch (input)
		{
		case exit:
			printf("退出信息管理系统");
			break;
		case add:
			ADDContact(&con);
			break;
		case deal:
			DEALContact(&con);
			break;
		case search:
			SearchContact(&con);
			break;
		case modify:
			ModifyCkontact(&con);
			break;
		case show:
			SHOWContact(&con);
			break;
		default:
			printf("请重新选择");
			break;
		}


	} while (input);

	return 0;
}


大家请看,当我们使用了枚举类型之后我们的选择都具象化了。

最基本的菜单和界面操作完成后我们来实现各种接口。

2.实现接口的预操作

2.1 创建结构体变量

我们创建的结构体是用来保存联系人的信息,其中包含联系人的“姓名”“性别”“地址”“年龄”“电话”

我们使用typedef 来将结构体命名为 peopleinform(people--人,inform--信息)

typedef struct peopleinform //设置人的信息
{
	char name[20];
	char sex[5];
	char adrs[30];
	int age;
	char tele[20];

}peopleinform;

这是一个人的信息,但是我们的通讯录要实现的是100个人的信息,那么我们就需要再创建一个结构体来实现。

typedef struct Contact
{
	peopleinform date[100]; //用来存放数据
	int sz; //用来记录的是信息管理系统中存放信息的个数

}Contact;

以上就是我们预处理,那么我们来实现接口。

 3.初始化联系人信息管理系统

再实现联系人数据增加的前提是我们要初始化date,sz,保证它们中没有任何的数据,以免对我们后续联系人数据的增加产生干扰。

我们初始化有两个办法,一个就是使用memset函数之间初始化

                                       二是使用循环来实现。

                                       由于C语言提供了函数,我们就使用这个。

//初始化信息管理系统
void IntiContact(Contact* pc);
void IntiContact(Contact* pc)
{
	assert(pc);
	pc->sz = 0;
	memset(pc->date, 0, sizeof(pc->date));
	/*
	memset是一个初始化函数,作用是将某一块内存中的全部设置为指定的值
	s指向要填充的内存块。
	c是要被设置的值。
	n是要被设置该值的字符数。
	返回类型是一个指向存储区s的指针
	*/


}

关键点拨:我们使用指针类型的原因,大家都知道传参。一个是传值,一个是传地址。

为什么在这里我们选择传地址(完了使用指针访问地址)???

在此之前我还有一篇博客(函数栈帧的创建与销毁)地址放在这里--CSDN 感兴趣的可以去详细了解。

解释:形参是实参的一份临时拷贝,如果单纯的传值,我们访问的时候是不需要修改的。

传值-----(B是一个中间人我是C需要把一份东西给A,我把东西给B,B给A),但是当我要找到A时,我就需要A的地址了。

传地址----(B这个中间人直接把A的地址给了我,我直接去找A,对A里面的值进行修改)。

因为我们需要对   date 和 sz 的内部的值进行修改所以 我们使用的是传地址。

初始化完成之后我们就可以来实现各种各样的接口了。

4.联系人数据的增加

//增加学生信息的信息
void ADDContact(Contact* pc);

这个过程是相对比较简单的使用printf函数和scanf函数即可。

报错:scanf函数我们在使用的时候,如果我们在后面不加上具体的数量,大小会报错。

void ADDContact(Contact* pc)
{
	assert(pc);
	//先判断信息管理系统有没有空间支持增加
	if (pc->sz == 100)
	{
		printf("信息管理系统已满无法增加\n");
		return;

	}
	//如果没有返回就增加一个人的信息
	printf("请输入名字");
	scanf_s("%s", pc->date[pc->sz].name, 20);
	printf("请输入年龄");
	scanf_s("%d", &(pc->date[pc->sz].age));
	printf("请输入性别");
	scanf_s("%s", pc->date[pc->sz].sex, 5);
	printf("请输入电话");
	scanf_s("%s", pc->date[pc->sz].tele, 20);
	printf("请输入地址");
	scanf_s("%s", pc->date[pc->sz].adrs, 30);
	//由于信息录入完成所以增加了一个人的信息
	pc->sz++;
	printf("增加成功\n");

}

 程序跑起来效果就是这样。

5.联系人数据的查看

由于“删除”“修改”“查找”都需要使用遍历查找,所以我们把它们放在后面,我们先来实现查看接口。

//查看学生信息的信息
void SHOWContact(Contact* pc);

相较于后面几个接口这个接口比较好实现,使用循环来打印就是。

大家请看

void SHOWContact(Contact* pc)
{
	assert(pc);
	;	if (pc->sz == 0)
	{
		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->date[i].name, pc->date[i].age, pc->date[i].sex, pc->date[i].tele, pc->date[i].adrs);
	}
}

我来为大家解释一下代码:

printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");

这一行代码:是打印我们的上面部分,采用的是左对齐的方式。(所以%20s,我们会加上“-”这个符号,其中%20s,是宽度)

printf("%-20s%-5d%-5s%-12s%-30s\n", //分别打印姓名,年龄,性别,电话,地址。
            pc->date[i].name, pc->date[i].age, pc->date[i].sex, pc->date[i].tele, pc->date[i].adrs);

这一行打印的是我们下面的部分。

那我们接着继续往下看

6.联系人数据的删除
 

6.1查找指定联系人

//删除指定学生信息的信息
void DEALContact(Contact* pc);

在我们实现删除的前提是找到指定的联系人,那么该如何操作呢?

思路如下:1.自定函数FindByName通过遍历来找到指定的姓名

                  2.再来删除

查找的代码:

int FIndByNmae(Contact* pc, char name[])
{
	assert(pc);
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->date[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1; //找不到
}

分析如下:我们使用循环来遍历SZ(sz中存储的是有效联系人的信息,我们查找是否有名字相同的),我们使用了  strcmp 函数我们可以找到此人。找不到就会直接返回。

怕大家不理解Strcmp 我找来了资料大家可以看看。

 6.2删除指定联系人

oid DEALContact(Contact* pc)
{
	char name[20];
	assert(pc);
	if (pc->sz == 0)
	{
		printf("没有学生信息的数据无法删除");
		return;
	}
	//找到学生信息
	printf("输入想要删除学生信息的名字:");
	scanf_s("%s", name, 20);
	//找到名字为name的人
	//分装一个新的函数FIndByName用来查找学生信息
	int ret = FIndByNmae(pc, name);
	if (ret == -1)
	{
		printf("要删除的人不存在\n");
		return;
	}
	//删除这个人的信息 
	int i = 0;
	for (i = ret; i < pc->sz - 1; i++)
	{
		pc->date[i] = pc->date[i + 1];
	}
	pc->sz--;
	printf("删除成功");

}

我来给大家详细通过画图来解释一下删除的全过程(如何进行删除操作的)

 

假设我们要删除 ret那么如何删除呢?

我们通过覆盖,从后面到前面覆盖,就是使用ret后面的那一个来把ret覆盖起来。

以上就是删除联系人的信息

7.联系人数据的修改

 //修改指定学生信息的信息 
void  ModifyCkontact(Contact*pc);

当我们有了自定义函数来实现查找之后,修改操作便会简单很多。 我们之间把增加的后半段代码复制过来。

void  ModifyCkontact(Contact* pc)
{
	char name[20];
	assert(pc);
	printf("请输入你要修改的人的名字:");
	scanf_s("%s", name, 20);
	int ret = FIndByNmae(pc, name);
	if (ret == -1)
	{
		printf("要修改的人不存在\n");
		return;
	}
	//修改
	printf("请输入名字");
	scanf_s("%s", pc->date[ret].name, 20);
	printf("请输入年龄");
	scanf_s("%d", &(pc->date[ret].age));
	printf("请输入性别");
	scanf_s("%s", pc->date[ret].sex, 5);
	printf("请输入电话");
	scanf_s("%s", pc->date[ret].tele, 20);
	printf("请输入地址");
	scanf_s("%s", pc->date[ret].adrs, 30);

	printf("修改成功");
}



8.联系人数据的查找

//查找指定学生信息的信息
 void SearchContact(Contact*pc);
void SearchContact(Contact*pc)
{
	char name[20];
	assert(pc);
	printf("请输入你要查找的人的名字:");
	scanf_s("%s", name, 20);
	int ret = FIndByNmae(pc, name);
	if (ret == -1)
	{
		printf("要查找的人不存在\n");
		return;
	}
	//显示出来
	printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	printf("%-20s%-5d%-5s%-12s%-30s\n", //分别打印姓名,年龄,性别,电话,地址。
		pc->date[ret].name, pc->date[ret].age, pc->date[ret].sex, pc->date[ret].tele, pc->date[ret].adrs);

}

 相同的原理只要我们可以找到就可以实现。

9.通讯录的完整代码

text.c

#include"Contact.h"
void menu()
{ 
	printf("************************************************\n" );
	printf("        基于动态链表实现的学生信息系统          *\n");
	printf("***      1. add        2.deal                   *\n");
	printf("***      3.search      4.modify                 *\n");
	printf("***      5.show        6.exit                   *\n");
	printf("*************************************************\n");
	printf("本系统提供了增加,删除,搜索,修改,展示 学生信息\n");
}
enum Option
{
	exit,       //退出信息管理系统
	add,        //增加信息管理系统
	deal,       //删除信息管理系统
	search,     //搜索信息管理系统
	modify,     //修改信息管理系统
	show,       //展示信息管理系统

};
int main()
{
	int input = 0;
	Contact con;  //con就是创建的信息管理系统
	//初始化信息管理系统(因为在开始信息管理系统没有进行初始化内部存放的都是随机值)
	IntiContact(&con);
	do
	{
		menu();
		printf("请选择\n");
		scanf_s("%d", &input);
		switch (input)
		{
		case exit:
			printf("退出信息管理系统");
			break;
		case add:
			ADDContact(&con);
			break;
		case deal:
			DEALContact(&con);
			break;
		case search:
			SearchContact(&con);
			break;
		case modify:
			ModifyCkontact(&con);
			break;
		case show:
			SHOWContact(&con);
			break;
		default:
			printf("请重新选择");
			break;
		}


	} while (input);

	return 0;
}

 Contact.c

#include"Contact.h"
void IntiContact(Contact* pc)
{
	assert(pc);
	pc->sz = 0;
	memset(pc->date, 0, sizeof(pc->date));
	/*
	memset是一个初始化函数,作用是将某一块内存中的全部设置为指定的值
	s指向要填充的内存块。
	c是要被设置的值。
	n是要被设置该值的字符数。
	返回类型是一个指向存储区s的指针
	*/


}
void ADDContact(Contact* pc)
{
	assert(pc);
	//先判断信息管理系统有没有空间支持增加
	if (pc->sz == 100)
	{
		printf("信息管理系统已满无法增加\n");
		return;

	}
	//如果没有返回就增加一个人的信息
	printf("请输入名字");
	scanf_s("%s", pc->date[pc->sz].name,20);
	printf("请输入年龄");
	scanf_s("%d", &(pc->date[pc->sz].age));
	printf("请输入性别");
	scanf_s("%s", pc->date[pc->sz].sex,5);
	printf("请输入电话");
	scanf_s("%s", pc->date[pc->sz].tele,20);
	printf("请输入地址");
	scanf_s("%s", pc->date[pc->sz].adrs,30);
	//由于信息录入完成所以增加了一个人的信息
	pc->sz++;
	printf("增加成功\n");

}
void SHOWContact(Contact* pc)
{
	assert(pc);
	;	if (pc->sz == 0)
	{
		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->date[i].name, pc->date[i].age, pc->date[i].sex, pc->date[i].tele, pc->date[i].adrs);
	}
}

int FIndByNmae(Contact* pc, char name[])
{
	assert(pc);
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->date[i].name, name) == 0)
		{
			return i;

		}
	}

	return -1; //找不到

 }

void DEALContact(Contact* pc)
{
	char name[20];
	assert(pc);
	if (pc->sz == 0)
	{
		printf("没有学生信息的数据无法删除");
		return;
	}
	//找到学生信息
	printf("输入想要删除学生信息的名字:");
	scanf_s("%s", name, 20);
	//找到名字为name的人
	//分装一个新的函数FIndByName用来查找学生信息
	int ret = FIndByNmae(pc, name);
	if (ret == -1)
	{
		printf("要删除的人不存在\n");
		return;
	}
	//删除这个人的信息 
	int i = 0;
	for (i = ret; i < pc->sz-1; i++)
	{
		pc->date[i] = pc->date[i + 1];
	}
	pc->sz--;
	printf("删除成功");

}
void SearchContact(Contact*pc)
{
	char name[20];
	assert(pc);
	printf("请输入你要查找的人的名字:");
	scanf_s("%s", name, 20);
	int ret = FIndByNmae(pc, name);
	if (ret == -1)
	{
		printf("要查找的人不存在\n");
		return;
	}
	//显示出来
	printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
	printf("%-20s%-5d%-5s%-12s%-30s\n", //分别打印姓名,年龄,性别,电话,地址。
		pc->date[ret].name, pc->date[ret].age, pc->date[ret].sex, pc->date[ret].tele, pc->date[ret].adrs);

}

void  ModifyCkontact(Contact* pc)
{
	char name[20];
	assert(pc);
	printf("请输入你要修改的人的名字:");
	scanf_s("%s", name, 20);
	int ret = FIndByNmae(pc, name);
	if (ret == -1)
	{
		printf("要修改的人不存在\n");
		return;
	}
	//修改
	printf("请输入名字");
	scanf_s("%s", pc->date[ret].name, 20);
	printf("请输入年龄");
	scanf_s("%d", &(pc->date[ret].age));
	printf("请输入性别");
	scanf_s("%s", pc->date[ret].sex, 5);
	printf("请输入电话");
	scanf_s("%s", pc->date[ret].tele, 20);
	printf("请输入地址");
	scanf_s("%s", pc->date[ret].adrs, 30);

	printf("修改成功");
}


Contact.h

#pragma once
#include<string.h>
#include<assert.h>
#define NAME_MAX 20;
#define SEX_MAX 5;
#define ADRS_MAX 20;
#define TELE_MAX 15;
#include<stdio.h>
typedef struct peopleinform //设置人的信息
{
	char name[20];
	char sex[5];
	char adrs[30];
	int age;
	char tele[20];

}peopleinform;
typedef struct Contact
{
	peopleinform date[100]; //用来存放数据
	int sz; //用来记录的是信息管理系统中存放信息的个数

}Contact;
//初始化信息管理系统
void IntiContact(Contact* pc);
//增加学生信息的信息
void ADDContact(Contact* pc);
//查看学生信息的信息
void SHOWContact(Contact* pc);
//删除指定学生信息的信息
void DEALContact(Contact*pc);
//查找指定学生信息的信息
 void SearchContact(Contact*pc);
 //修改指定学生信息的信息 
void  ModifyCkontact(Contact*pc);


今天的博客就到这里了,后续为大家更新C++的相关课程。

感谢你的观看

                               

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

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

相关文章

代码随想录刷题随记30-贪心4

代码随想录刷题随记30-贪心4 860.柠檬水找零 leetcode链接 比较显然 class Solution {public boolean lemonadeChange(int[] bills) {int []accountnew int[3];for(int cur:bills){if(cur5)account[0];else if(cur10){account[0]--;if(account[0]<0)return false;account…

CTK库编译-01

地址 官网地址&#xff1a;Commontk github地址&#xff1a;https://github.com/commontk/CTK 编译环境 Qt套件&#xff1a; IDE&#xff1a;VS2022 使用vs2022 文件->打开->cmake 修改根目录下的CMakeLists.txt 默认只编译core模块&#xff0c;所以需要把部分模块…

VTK —— 三、简单操作 - 示例3 - 将点投影到平面上(附完整源码)

代码效果 本代码编译运行均在如下链接文章生成的库执行成功&#xff0c;若无VTK库则请先参考如下链接编译vtk源码&#xff1a; VTK —— 一、Windows10下编译VTK源码&#xff0c;并用Vs2017代码测试&#xff08;附编译流程、附编译好的库、vtk测试源码&#xff09; 教程描述 本…

分析师常用商业分析模型

一、背景 在用户调研中&#xff0c;我们发现分析师对商业分析模型的使用还是比较频繁。本文主要对用户调研结果中的分析师常用商业分析模型以及一些业界经典的商业分析模型进行分析&#xff0c;并梳理出执行落地流程&#xff0c;以此来指导分析师工具设计分析功能的引导性。 …

SRC公益漏洞挖掘思路分享

0x00 前言 第一次尝试挖SRC的小伙伴可能会觉得挖掘漏洞非常困难&#xff0c;没有思路&#xff0c;不知道从何下手&#xff0c;在这里我分享一下我的思路 0x01 挖掘思路 确定自己要挖的漏洞&#xff0c;以及该漏洞可能存在的功能点&#xff0c;然后针对性的进行信息收集 inurl…

Llama 3 模型上下文长度扩展至1048K

AI苏妲己&#xff1a; Gradient AI 近日宣布&#xff0c;通过其创新的渐进式训练方法&#xff0c;成功将 Llama 3 系列模型的上下文长度扩展至超过100万令牌。 Llama 3 模型最初设计用于处理8000个令牌的上下文长度&#xff0c;这大约相当于6000字或10页文档。为了适应更长的…

如何迁移Windows PC数据到统信UOS 1070

原文链接&#xff1a;如何迁移Windows PC数据到统信UOS 1070 Hello&#xff0c;大家好啊&#xff01;随着统信UOS 1070的推出&#xff0c;越来越多的用户和企业选择迁移到这个基于Linux的操作系统&#xff0c;以享受其安全性和稳定性的优势。今天&#xff0c;我们将探讨如何使用…

effective python学习笔记_pythonic思维

查py版本 import sys sys.version sys.version_info 遵循PEP8 PEP8,Python Enhancement Proposal #8 章节列了几个点&#xff0c;也可以看原文PEP 8 – Style Guide for Python Code | peps.python.org 导包顺序建议&#xff1a;先导标准库模块&#xff0c;再导三方模块&…

PXE远程部署CentOS系统

文章目录 在局域网内搭建PXE服务器PXE 启动组件PXE的优点实验一、搭建PXE服务器&#xff0c;实现远程部署CentOS系统环境准备server关闭防火墙安装组件准备 Linux 内核、初始化镜像文件及PXE引导文件配置启用TFTP 服务配置启动DHCP服务准备CentOS 7 安装源配置启动菜单文件 Cli…

如何让CANoe或Wireshark自动解析应用层协议

当我们使用CANoe软件或Wireshark工具抓取以太网总线上的报文时,网卡首先会把以太网总线上的模拟信号解析成以太网帧数据。数据链路层根据二层头部中的Type字段值确定上层的协议。 如果以太网使用的是TCP/IP协议栈,那么Type值要么是0x0800(IPv4),要么是0x0806(ARP),要么是0x…

vue3与js的router基本使用方式

title: vue3与js的router基本使用方式 tags: vue3js abbrlink: ‘57270957’ date: 2024-04-17 18:54:47 第一步快捷引入的别名 使用路由需要大量在src文件中引用所需要的地址&#xff0c;并且组件中也需要很多的包的引用&#xff0c;将快速跳转到src这一文件的步骤进行简化操…

PADS使用网表导入layout和使用ECO to PCB有什么不同?

网表导入总是不成功&#xff0c;先用ECO更新过去了

SaaS应用加速解决方案

随着企业业务的迅速扩展&#xff0c;SaaS应用成为企业提升办公效率的关键。然而&#xff0c;在SaaS应用广泛使用的同时&#xff0c;访问速度受限、网络拥堵等问题也逐渐浮现。为了解决这些挑战&#xff0c;SaaS应用加速方案应运而生&#xff0c;旨在助力企业高效运转&#xff0…

【C语言】精品练习题

目录 题目一&#xff1a; 题目二&#xff1a; 题目三&#xff1a; 题目四&#xff1a; 题目五&#xff1a; 题目六&#xff1a; 题目七&#xff1a; 题目八&#xff1a; 题目九&#xff1a; 题目十&#xff1a; 题目十一&#xff1a; 题目十二&#xff1a; 题目十…

目前最便宜的VPS多少钱一个月?

目前最便宜的VPS一个月的价格在5美元左右&#xff0c;换算成人民币约为35元。 VPS服务器的配置、性能、所在地区都是影响其价格的因素&#xff0c;价格与性能呈正相关&#xff0c;也有的廉价VPS的服务商会提供性能低的配置&#xff0c;让用户可以进行简单的网站托管或开发环境…

【how2j Vue部分】两种在Vue的Ajax框架——fetch axios

fetch.js 和 axios.js 都是 Vue 中比较常见的两种ajax框架 1. fetch.js 一般说来 Vue 不会直接使用原生的 Ajax 而是使用 ajax 框架。 而 fetch.js 就是眼下比较流行的一种 ajax 框架 1. 准备 json数据&#xff1a;var url "https://gitee.com/api/v5/users/liyangyf&…

如何判断代理IP质量?

由于各种原因&#xff08;从匿名性和安全性到绕过地理限制&#xff09;&#xff0c;代理 IP 的使用变得越来越普遍。然而&#xff0c;并非所有代理 IP 都是一样的&#xff0c;区分高质量和低质量的代理 IP 对于确保流畅、安全的浏览体验至关重要。以下是评估代理 IP 质量时需要…

2024抖音小店最新注册流程来了,快快收藏!

大家好&#xff0c;我是电商糖果 2024年想开一家抖音小店&#xff0c;但是不知道具体的开店流程。 不要着急&#xff0c;这篇文章就给大家详细的讲解一下。 首先&#xff0c;准备开店材料&#xff1a;5000左右的类目保证金&#xff0c;电脑&#xff0c;手机号&#xff0c;法…

【算法】滑动窗口——长度最小的子数组

本篇文章是用一个实例来介绍常用算法之一“滑动窗口”的相关概念&#xff0c;有需要借鉴即可。 目录 1.题目2.暴力求解2.1暴力求解思路&#xff1a;2.2时间复杂度是多少&#xff1f; 3.暴力求解的优化3.1固定left的情况下&#xff0c;优化right的次数。3.2sum求值优化3.3不同组…

Linux高级学习(前置 在vmware安装centos7.4)

【小白入门 通俗易懂】2021韩顺平 一周学会Linux 此文章包含第006p-第p007的内容 操作 在安装好的vmware下进行安装 这里使用的是vmware15&#xff08;win10下&#xff09;&#xff0c;win11可能无法使用15&#xff08;有几率蓝屏&#xff09;&#xff0c;换成16就行了 用迅雷…