mysql安装及配置win下安装这边提供一个mysql5.7的安装包：mysql5.7安装包第一步：选项分别为服务器安装、客户端安装、完整安装、自定义安装；这边我们选择安装方式为custom。第二步：依次点开MySQL servers——mysql server——MySQL server5.7——MySQL server5.7.44-X64然后点击绿色箭头将选中的版本移到右边的框里，然后点击选中右侧框中的mysql server 5.7.44-x64，，再点击Advanced Options可以自定义安装路径和数据储存位置；然后点击下一步。上面是安装路径，下方是数据储存位置第三步：点击Execute会开始安装，等待安装完成后点击next。选择安装类型,这边选择Development Computer;然后点击next。Development Computer个人开发学习使用;Server Computer用于FTP,email,web服务器等;Dedicated Computer用作MySQL服务器;第四步：到这里输入root用户密码，重复输入两次；点击next。第五步：到这里，继续next第六步：点击Execute,然后点击等待完成后，点击Finish，然后结束安装。MySQL环境变量复制完整的mysql安装路径及bin目录，如：D:\Program Files\MySQL\MySQL Server 5.7\bin右击此电脑，选择属性，先点击高级系统设置，再点击环境变量；在系统变量中双击Path；点击新建，将MySQL的安装路径粘贴上去，之后点击确定；然后验证mysql是否配置成功，打开cmd窗口，输入以下命令进行验证：mysql -uroot -pyoupassword #youpassword为你安装mysql时设置的root用户密码Linux下安装待补其他问题navicat连接2002 - Can't connect to server on '192.168.27.130' (10061)在mysql安装之后，我们的mysql并不会主动开启mysql远程访问权限，我们如果需要使用navicat来远程连接数据库操作的话，就需要我们主动去开启远程连接权限。这里有两种方法：权限问题 直接赋权法：在MySQL 8.0 及以上版本中，GRANT语句已经不允许直接包含IDENTIFIED BY子句来设置用户密码。mysql -uroot -pyoupassword #youpassword为你数据库root用户密码 GRANT ALL PRIVILEGES ON *.* TO “root”@”%” IDENTIFIED BY '你的root密码' WITH GRANT OPTION;权限问题 新建用户法：进入mysql，输入以下命令检查数据库对不同用户使用的身份验证方法：bashSELECT user,authentication_string,plugin,host FROM mysql.user;这边可以看到root用户的登录方式为auth_socket，并且只能在本地登录，在生产环境中可以新建一个用户并且赋予他相应权限。第一步：查看所有数据库SHOW DATABASES;第二步：切换数据库use mysql;第三步：创建用户new_user,并设置只能本地登录，登录密码为passwordCREATE USER 'new_user'@'localhost' IDENTIFIED BY 'password';第四步：查看不同用户登录验证方式SELECT user,authentication_string,plugin,host FROM mysql.user;这个时候可以看到新建的用户可以使用密码登录，且只能是本地登录。第五步：创建一个新的数据库CREATE DATABASE mydatabase;第六步：设置刚才创建的用户登陆方式update user set host='%' where user='new_user' and host='localhost';第七步：查看不同用户登录验证方式SELECT user,authentication_string,plugin,host FROM mysql.user;可以看到用户的登陆方式切换为了%第七步：授权用户new_user可以在任意主机登录，并且只能对于数据库database_name进行所有操作的权限。GRANT ALL PRIVILEGES ON database_name.* TO 'new_user'@'%';第八步：退出mysqlexit第九步：进入目录/etc/mysql/mysql.conf.d,修改其目录下的文件mysqld.cnfsudo vim /etc/mysql/mysql.conf.d/mysqld.cnf第十步：将bind-address = 127.0.0.1注释掉(在其前面加#号)# bind-address = 127.0.0.1第十一步：重启数据库sudo service mysql restart至此配置结束。权限问题 mysql8.0赋权法本地登入mysql，更改mysql数据库里的user表里的host项，将localhost改为%mysql -uroot -pyoupassword mysql>use mysql; mysql>update user set host = '%' where user = 'root'; mysql>select host, user from user;赋权GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;切换root用户认证方式为caching_sha2_passwordALTER USER 'root'@'%' IDENTIFIED WITH caching_sha2_password BY 'your_new_password';刷新权限FLUSH PRIVILEGES;防火墙问题打开3306端口iptables -I INPUT -p top --aport 3306 -j ACCEPT
一、初识Java计算机语言发展历史计算机编程语言的发展，是随着计算机本身硬件发展而发展的。硬件速度越快、体积越小、成本越低，应用到人类社会的场景就会越多，那么所需要的算法就会越复杂，也就要求计算机编程语言越高级。最初重达几十吨但一秒只能运算5000次的ENIAC(世界上第一台计算机)，只能做非常小的应用，比如：某些情况的弹道计算。现在任何一个人的手机运算能力都可以秒杀那个年代地球上所有计算机运算能力的总和。计算机编程语言的发展历经了从低级到高级发展。发展的核心思想就是“让人更容易编程”。越容易使用的语言，就有越多人使用；越多人使用，就有越多协作；越多协作，就可以创造越复杂的物体；计算机语言经历了三代：第一代是机器语言，第二代是汇编语言，第三代是高级语言。所需程序https://www.123pan.com/s/EGKKVv-GLfxh.html 提取码:bKAy常用DOS命令DOS系统Microsoft公司推出的操作系统。（在windows之前的操作系统） DOS是英文"Disk Operating System"的缩写,其中文含意是"磁盘操作系统". DOS是单用户、单任务的操作系统.（只能执行一个任务）DOS命令在windows中，我们通过鼠标菜单等来操作系统，而在dos操作系统中，要通过dos命令来操作系统。 是DOS操作系统的命令，是一种面向磁盘的操作命令，不区分大小写。切换盘符 c: d: e:显示目录下详细信息 dir改变当前目录 cd清屏 cls创建目录 md删除目录 rd复制文件 copy删除文件 delJava入门程序开发开发Java程序，需要三个步骤：编写代码，编译代码，运行代码[x] 编写代码：任何一个文本编辑器都可以些代码，如Windows系统自带的记事本[x] 编译代码：将人能看懂的源代码（.java文件）转换为Java虚拟机能够执行的字节码文件（.class文件）[x] 运行代码：将字节码文件交给Java虚拟机执行第一个java程序public class helloworld(){ public static void main(String[] args){ System.out.println("hello world"); } }注意：文件名称必须与代码中的类名称一致JDK组成JDK由JVM、核心类库、开发工具组成，如下图所示：什么是JVM?答：JDK最核心的组成部分是JVM（Java Virtual Machine），它是Java虚拟机，真正运行Java程序的地方。什么是核心类库？答：它是Java本身写好的一些程序，给程序员调用的。 Java程序员并不是凭空开始写代码，是要基于核心类库提供的一些基础代码，进行编程。什么是JRE?答：JRE（Java Runtime Enviroment），意思是Java的运行环境；它是由JVM和核心类库组成的；如果你不是开发人员，只需要在电脑上安装JRE就可以运行Java程序。什么是开发工具呢？答：Java程序员写好源代码之后，需要编译成字节码，这里会提供一个编译工具叫做javac.exe，编写好源代码之后，想要把class文件加载到内存中运行，这里需要用到运行工具java.exe。 除了编译工具和运行工具，还有一些其他的反编译工具、文档工具等待...JDK、JRE的关系用一句话总结就是：用JDK开发程序，交给JRE运行Java跨平台原理Java跨平台原理：C语言跨平台原理：总结：JVM(Java Virtual Machine)就是一个虚拟的用于执行bytecode字节码的”虚拟计算机”。他也定义了指令集、寄存器集、结构栈、垃圾收集堆、内存区域。JVM负责将Java字节码解释运行，边解释边运行，这样，速度就会受到一定的影响。不同的操作系统有不同的虚拟机。Java 虚拟机机制屏蔽了底层运行平台的差别，实现了“一次编译，随处运行”。 Java虚拟机是实现跨平台的核心机制。如图所示：我们说的语言跨平台是编译后的文件跨平台，而不是源程序跨平台。接下来我们再比较下两种方式的差异：第一，C语言是编译执行的，编译器与平台相关，编译生成的可执行文件与平台相关；第二，Java是解释执行的，编译为中间码的编译器与平台无关，编译生成的中间码也与平台无关（一次编译，到处运行），中间码再由解释器解释执行，解释器是与平台相关的，也就是不同的平台需要不同的解释器.Java开发工具IDEA想要在IDEA正确的写一个Java程序，必须先认识一下IDEA的管理Java程序的工程结构。第一步：首先得在IDEA中创建一个Project（工程、也叫项目），后面统称为工程。第二步：需要在Project中创建Module（模块），一个工程中可以包含多个模块第三步：需要在Module中新建Package（包），一个模块中可以有多个包第四步：需要在Package中新建Class（类），一个包中可以包含多个类二、Java基础语法2.1 注释为了方便程序的阅读，Java语言允许程序员在程序中写上一些说明性的文字，用来提高程序的可读性，这些文字性的说明就称为注释。注释不会出现在字节码文件中，即Java编译器编译时会跳过注释语句。 在Java中根据注释的功能不同，主要分为单行注释、多行注释和文档注释。单行注释单行注释使用“//”开头，“//”后面的单行内容均为注释。多行注释多行注释以“/”开头以“/”结尾，在“/”和“/”之间的内容为注释，我们也可以使用多行注释作为行内注释。但是在使用时要注意，多行注释不能嵌套使用。文档注释文档注释以“/*”开头以“/”结尾， 注释中包含一些说明性的文字及一些JavaDoc标签（后期写项目时，可以生成项目的API）2.2 字面常量常量通常指的是一个固定的值，例如：1、2、3、’a’、’b’、true、false、”helloWorld”等。 在Java语言中，主要是利用关键字final来定义一个常量。 常量一旦被初始化后不能再更改其值。为了更好的区分和表述，一般将1、2、3、’a’、’b’、true、false、”helloWorld”等称为字面常量，而使用final修饰的PI等称为符号常量（字符常量）。public class LiteralDemo{ public static void main(String[] args){ //1.整数 System.out.println(666); //2.小数 System.out.println(3.66); //3.字符: 字符必须用单引号引起来 System.out.println('a'); System.out.println('0'); System.out.println('中'); System.out.println(' '); //空格也算字符 //特殊字符：\t表示制表符 \n表示换行 System.out.println('\t'); //这相当于一个tab键，专业叫做制表符 System.out.println('\n'); //这是换行的意思 //4.字符串：字符串是双引号引起来的 System.out.println("我爱你中国abc"); //5.布尔值：只有两个值true和false System.out.println(true); System.out.println(false); } }2.3 变量变量本质上就是代表一个可操作的存储空间，空间位置是确定的，但是里面放置什么值不确定。我们可通过变量名来访问“对应的存储空间”，从而操纵这个“存储空间”存储的值。Java是一种强类型语言，每个变量都必须声明其数据类型。变量的数据类型决定了变量占据存储空间的大小。 比如，int a=3;表示a变量的空间大小为4个字节。变量作为程序中最基本的存储单元，其要素包括变量名，变量类型和作用域。变量在使用前必须对其声明, 只有在变量声明以后，才能为其分配相应长度的存储空间。 变量的声明格式：int age = 18; System.out.println(a);当执行int age = 18; 这句代码时，JVM会在内存中申请一块区域，在这个区域中存储了一个整数18，给这个区域取的名字叫age； 相当于在盒子中存了一个数据18，这个盒子的名字是age，当我们打印age时，就是从盒子中把盒子中的数据取出来再打印。变量的作用域变量定义在哪个{}范围内，就只在哪个大括号内有效。变量的有效范围称之为变量的作用域 { int a = 10; System.out.println(a); //这是是对的 } System.out.println(a); //这里会出错注意事项：变量在定义时可以不赋值，但使用时必须赋值。总结：变量是用来记录程序中的数据的，可以把变量理解成内存中的小盒子，盒子里放的东西就是变量记录的数据变量的定义格式： 数据类型 变量名 = 初始值;变量记录的数据程序运行过程中是可以发生改变的：变量名 = 值;2.4 关键字被Java语言赋予了特殊含义，用作专门用途的单词特点：Java中所有关键字都为小写abstractassertbooleanbreakbytecasecatchcharclassconstcontinuedefaultdodoubleelseenumextendsfinalfinallyfloatforgotoifimplementsimportinstanceofintinterfacelongnativenewpackageprivateprotectedpublicreturnstrictfpshortstaticsuperswitchsynchronizedthisthrowthrowstransienttryvoidvolatilewhile2.5 标识符标志符其实就是我们自己取的名字。像前面我们取的类名，变量名其实都是标志符。最好是字母、数字、下划线、$组成不能以数字开头不能是Java的关键字三、数据类型、运算符3.1 数据的表示3.1.1 整数在计算机中的储存原理任何数据在计算机中都是以二进制表示的。所谓二进制其实就是一种数据的表示形式，它的特点是逢2进1。计算机中最小的存储单位是字节（Byte），一个字节占8位（bit），也就是说即使这个数据不足8位也需要用8位来存储。3.1.2 字符在计算机中的储存原理字符并不是直接存储的，而是把每一个字符编为一个整数，存储的是字符对应整数的二进制形式。美国人搞了一套字符和整数的对应关系表，叫做ASCII编码表。ASCII编码表中字符编码的规律：字符0对应48，后面的1,2,3,4...9 对应的十进制整数依次往后顺延字符a对应97，后面的b,c,d,e...z 对应的十进制整数依次往后顺延字符A对应65，后面的B,C,D,E...Z 对应的十进制整数依次往后顺延3.1.3 图片视频声音的存储原理图片的储存从图片开始，如果你把一张图片不断的放大，你会看到有马赛克的效果。你会发现图片中的每一个细节是由一个一个的小方格组成的，每一个小方格中其实就是一种颜色。任何一种颜色可以使用三原色来表示，简称RGB，其中R（红色），G（绿色），B（蓝色），而RGB中每一种颜色又用一个字节的整数来表示，最小值是0最大值是255视频的储存实际上视频和图片是一样的，把多张图片连续播放，在一秒钟内连续播放24张以上，由于人眼存在视觉暂留现象，人眼感受不到画面切换的时间间隔，就认为是连续的视频了。声音的储存声音是以波的形式传播的。我们可以把声波在表示在一个坐标系上，然后在坐标系上取一些点，把这些点的坐标值以二进制的形式存储到计算机中，这就是声音的存储原理。3.1.4 数据的其他表示形式3.1.5 不同进制在Java程序中的书写格式System.out.pirntln('a'+1); //98 System.out.pirntln(0b01100001); //97 System.out.pirntln(0141); //97 System.out.pirntln(0x61); //973.2 数据类型详解Java是一种强类型语言，每个变量都必须声明其数据类型。 Java的数据类型可分为两大类：基本数据类型（primitive data type）和引用数据类型（reference data type）。 基本数据类型：四大类八种引用数据类型：String3.3 数据类型转换3.3.1 自动转换在赋值运算或者算数运算的时候，要求数据类型一致，就要进行类型的转换。类型转换的形式总体分为2种，一种是自动类型转换，一种是强制类型转换。什么是自动类型转换自动类型转换指的是，数据范围小的变量可以直接赋值给数据范围大的变量 byte a = 12; int b = a; //这里就发生了自动类型转换(把byte类型转换int类型)自动类型转换的原理是怎样的自动类型转换其本质就是在较小数据类型数据前面，补了若干个字节//代码示例： public class TypeConversionDemo1 { public static void main(String[] args) { // 目标：理解自动类型转换机制。 byte a = 12; int b = a; // 发生了自动类型转换了 System.out.println(a); System.out.println(b); int c = 100; // 4 double d = c;// 8 发生了自动类型转换了 System.out.println(d); char ch = 'a'; // 'a' 97 => 00000000 01100001 int i = ch; // 发生了自动类型转换了 => 00000000 00000000 00000000 01100001 System.out.println(i); } }表达式的自动类型转换多种数据类型参与运算，其结果以大的数据类型为byte,short,char 三种类型数据在和其他类型数据运算时，都会转换为int类型再运算//代码示例： public class TypeConversionDemo2 { public static void main(String[] args) { // 目标：掌握表达式的自动类型转换机制。 byte a = 10; int b = 20; long c = 30; long rs = a + b + c; System.out.println(rs); double rs2 = a + b + 1.0; System.out.println(rs2); byte i = 10; short j = 30; int rs3 = i + j; System.out.println(rs3); // 面试笔试题： 即使两个byte运算，结果也会提升为int byte b1 = 110; byte b2 = 80; int b3 = b1 + b2; System.out.println(b3); } }3.3.2 强制类型转换强行将范围大的数据，赋值给范围小的变量，这里就需要用到强制类型转换。下面是强制类型转换的格式//格式： 目标数据类型 变量名 = (目标数据类型)被转换的数据;//代码示例： public class TypeConversionDemo3 { public static void main(String[] args) { // 目标：掌握强制类型转换。 int a = 20; byte b = (byte) a; // ALT + ENTER 强制类型转换。 System.out.println(a); System.out.println(b); int i = 1500; byte j = (byte) i; System.out.println(j); double d = 99.5; int m = (int) d; // 强制类型转换 System.out.println(m); // 丢掉小数部分，保留整数部分 } }强制类型转换原理强制类型转换的原理，其实就是强行把前面几个字节砍掉，但是有数据丢失的风险。四、运算符算机是用来处理数据的，处理数据就少不了对数据的计算，想要对数据进行计算就必须用到运算符。运算符就是参与运算的符号。Java提供的运算符有很多种，可以分为算术下面几种算术运算符+，-，*，/，%，++（自增），--（自减）赋值运算符=扩展赋值运算符+=，-=，*=，/=关系运算符>，<，>=，<=，==，!= 逻辑运算符&，|， &&，||，!，^位运算符&，|，^，~ ， >>，<<，>>>条件运算符？：4.1 算数运算符4.2 自增自减运算符4.3 赋值运算符4.4 关系运算符4.5 逻辑运算符4.6 三元运算符4.7 运算优先级4.8 获取用户键盘输入的数据Api文档下载地址（java8）：https://yunyuwu.lanzouy.com/iMaeY1ctqiebScanner就是Java提供给我们用于键盘录入数据的类，为了录入不同类型的数据，还提供了不同的功能，每一个功能会有不同的名称，我们只需要调用Scanner提供的功能就可以完成键盘录入数据。完整代码示例：public class ScannerDemo1 { public static void main(String[] args) { // 1、导包:一般不需要我们自己做，idea工具会自动帮助我们 导包的。 // 2、抄写代码：得到一个键盘扫描器对象（东西） Scanner sc = new Scanner(System.in); // 3、开始 调用sc的功能，来接收用户键盘输入的数据。 System.out.println("请您输入您的年龄："); int age = sc.nextInt(); // 执行到这儿，会开始等待用户输入一个整数，直到用户按了回车键，才会拿到数据。 System.out.println("您的年龄是：" + age); System.out.println("请您输入您的名字："); String name = sc.next(); // 执行到这儿，会开始等待用户输入一个字符串，直到用户按了回车键，才会拿到数据。 System.out.println(name + "欢迎您进入系统~~"); } }五、程序流程控制【1】流程控制的作用：流程控制语句是用来控制程序中各语句执行顺序的语句，可以把语句组合成能完成一定功能的小逻辑模块。【2】控制语句的分类： 控制语句分为三类：顺序、选择和循环。顺序结构”代表“先执行a，再执行b”的逻辑。条件判断结构”代表“如果…，则…”的逻辑。循环结构”代表“如果…，则再继续…”的逻辑。三种流程控制语句就能表示所有的事情！不信，你可以试试拆分你遇到的各种事情。这三种基本逻辑结构是相互支撑的，它们共同构成了算法的基本结构，无论怎样复杂的逻辑结构，都可以通过它们来表达。所以任何一种高级语言都具备上述两种结构。5.1 分支结构5.1.2 if分支
一、函数C语言里可以对语句进行分组，每个语句分组叫做一个函数一旦函数被调用，会执行该函数所表示的语句分组1.1 函数的定义//此段代码为一个函数用于计算a+b的值 int main (int a,int b) { return a + b; }函数调用 - 使用已经定义好的函数被使用的函数称为被调用函数 - printf函数使用被调用函数的函数被称为调用函数 - main函数函数定义的写法：返回值类型 函数名 (输入参数值)//本行为函数头 { //花括号里边的为函数体 做点什么事情吧 return 返回值; }形参与实参：形参与实参相互独立#include<stdio.h> int add (int a,int b)//此处a,b为形式参数、简称：形参 { return a + b; } int main() { int result; result = add(2,3);//此处为实际参数，简称：实参 printf("%d",result); return 0; }1.2 函数调用的本质三步骤：跳转执行返回（从哪儿跳转，到哪儿返回）1.3 为什么要使用函数明确任何C语言程序都是由两部分组成：一堆的变量（包括数组）和一堆的函数前者负责分配内存，后者负责操作访问内存函数的概念：就是一堆语句的组合，一次写好，到处使用！本质目的：减少开发的工作量，提高代码的可维护性1.4 函数的返回值只能从被调用函数向调用函数传递一个数据，这个数据叫做被调用函数的返回值返回值必须记录在被调用函数的储存区里，编写函数的时候要把这个储存区的类型名称卸载函数名称前面被调用函数里使用return关键字指定作为返回值的数值调用函数里要把整个函数调用该语句当作数字使用，这个数字就是被调用函数的返回值1.5 函数的参数可以从调用函数向被调用函数传递多个数据，这些数据的类型可以不同被调用函数需要为每个传递过来的数据提供一个储存区编写函数的时候需要在函数名称后面的小括号里声明一组变量，这些变量就用来表示前面提到的储存区，这些变量叫做形式参数，小括号里的所有内容叫做形式参数列表调用带有参数的函数时需要在函数调用语句的小括号里为每个形式参数提供一个对应的数字，计算机 会把这些数字记录到对应的形式参数里。被调用函数可以通过形式参数得到这些数字。这些数字叫做实际参数只要能当作数字使用的内容，都可以作为实际参数使用。函数调用过程中通常伴随着两个函数之间的数据传递数据传递存在两个完全相反的方向可以从被调用函数向北调用函数传递数据-参数可以从被调用函数向调用函数传递数据-返回值1.6 函数的声明任何函数都可以分为大括号前面的部分和大括号里面的部分函数大括号前面的部分可以单独写成一条语句，这种语句叫做函数声明语句函数声明语句里可以省略形式参数名称把函数声明语句卸载文件开头叫做函数的显式声明除了主函数以外的所有函数都应该进行显式声明格式：extern 返回值类型 函数名(形参列表)函数的定义在函数的调用前面，可以省略函数声明二、递归函数2.1 什么是递归函数C语言里函数可以调用自己，自己调用自己的函数叫递归函数2.2 递归函数编写步骤单独编写语句解决分解后的每个小问题（假设递归函数已经可以使用了）在递归调用语句前编写分支处理不可分解的情况（这种分支必须要能结束函数）三、作用域和生命周期能使用某个变量的所有语句叫做变量的变量的作用域生命周期是一段时间，在生命周期开始的时候计算机给程序分配储存区，在生命周期结束的时候，计算机把分配给程序的储存区收回3.1 局部变量局部变量是定义在函数内的变量作用域：定义的位置开始到函数结束生命周期：函数某一次执行的时间范围3.2 全局变量全局变量是定义在函数外的变量作用域：从定义的位置开始向下的所有语句生命周期：整个程序的执行时间3.3 作用域和生命周期局部变量（静态局部变量）区别：静态局部变量的生命周期是整个程序的执行时间全局变量（静态全局变量）区别：静态全局变量无法被其他文件调用生命周期：定义变量的时候编译器为其分配存储区，函数结束的时候回收其存储区静态变量的生命周期和作用域与普通变量的不一样，静态变量的生命周期是整个程序执行时间声明静态变量的时候需要使用static关键字没有初始化的静态变量会自动被初始化成0函数结束后，静态局部变量的储存区也还是可以使用静态局部变量的作用域仍然只包含函数里面的所有语句静态变量的初始化只在程序开始的时候执行一次，不论初始化语句写在什么地方静态全局变量的生命周期还是整个程序的执行时间，但是它的作用域只包含声明它的文件里的所有语句（不可以跨文件使用静态全局变量）
一、初识数组1.数组的概念数组是由一系列类型相同的数据对象依次排列组合而成组成数组的数据对象被称作数组的元素重点：依次排列类型相同2.声明数组//格式： 元素类型 数组名[元素数量]； //示例： char c[5]; int n[10]; long l[3]; float f[2]; double df[1];3.数组初始化//格式如下： 元素类型 数组名[元素数量] = {逗号分割的元素内容}; //示例： int arr[10] = {1,2,3,4,5,6,7,8,9,0}； //等号右边被称为初始化列表,初始化列表写明了数组的元素分别需要被初始化为哪些值。注意事项：如果元素内容小于元素数量，那么会被自动填补为0如果元素内容多于元素数量，那么将会无法编译元素数量可以不填写，让初始化列表决定数组长度4.访问数组//格式： 数组名[下标] //示例代码： int arr[10] = {1,2,3,4,5,6,7,8,9,0}; printf("%d\n", arr[0]); printf("%d\n", arr[1]); printf("%d\n", arr[2]); printf("%d\n", arr[3]); printf("%d\n", arr[4]); printf("%d\n", arr[5]); printf("%d\n", arr[6]); printf("%d\n", arr[7]); printf("%d\n", arr[8]); printf("%d\n", arr[9]);注意事项：数组下标是从0开始的，如果有九个元素，那么下标为105.修改数组的值代码示例：int arr[10] = {}; printf("%d\n", arr[5]); arr[5] = 123; printf("%d\n", arr[5]);注意事项：数组越界错误当数组元素有一个固定数量时，请勿访问或修改数组元素内以外的元素。C语言编译器不会检查数组是否越界。数组不一定初始化，但是之后需要赋值，避免使用无意义数值6.数组所占空间大小数组所占的空间 = 单个元素所占空间大小*数组元素个数7.数组的整体赋值数组不能整体赋值，且初始化列表智能存在于初始化。那么如何赋值整个数组的数据呢？有两种方法：使用循环遍历赋值int arr1[]; int arr2[1,2,3,4,5]; for (i=0;i<4;i++); arr1[i]=arr2[i]使用memcpy内存复制函数//memcpy函数格式 memcpy(目标数组, 原始数组, 需要复制多少字节数据); //示例： memcpy(arr1, arr2, sizeof(arr1)); /*注意事项 使用memcpy函数需要引入头文件<memory.h> 假设需要复制的数据字节数为N； 目标数组大小不能小于N，否则没有足够空间存放数据； 原始数组的数据大小不能小于N，否则将复制无意义内容； */8.小练习逆序输出一组数字#include<stdio.h> void main(){ int i; int a[10] = {0}; for(i = 0;i<10;i++){ printf("输入数字："); scanf("%d",&a[i]); } printf("逆序数字排列为："); for(i = 9;i>=0;i--){ printf("%d ",a[i]); } }二、二维数组2.1 二维数组的概念二维数组就是由多个一维数组组成的数组int score[5][10]二维数组的每个元素都是一维数组一维数组的每个元素表示的都是一个储存区在定义一个二维数组的时候，需要提供两个整数前一个整数表示一维数组的个数，后一个整数表示一维数组里的储存区个数数据类型表示的是每个储存区的类型int score[5][10] //定义了1个二维数组，一共分为了5个数组.每个一维数组中有10个int类型的储存区2.2 二维数组的格式//格式： 元素类型 数组名[二维数组长度][一维数组长度] = {{...},{...}...}; 二维数组长度 = 二维数组中有几个一维数组 一维数组长度 = 一维数组中有几个储存区 //举例： int a[3][4] = {{1,2,3,4,},{5,6,7,8},{9,10,11,12}}; //可以把二维数组当作一维数组进行初始化，二维数组本质上还是一维数组 int mat[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int mat[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};2.3 二维数组的使用int mat[3][4] = {{1,2,3,4},[5,6,7,8],[9,10,11,12]}; //mat[0]表示第一个一维数组，是第一个一维数组的名字 //mat[0][1]表示访问mat[0]一维数组下标为1的储存区二维数组名称后可以只写一个下标，这个下标作为组下标使用，这个写法可以表示组下标对应组里第一个储存区的地址二维数组名称后加组下标也可以作为一维数组名称使用，这个一维数组里包含组下标对应组里所有的储存区2.4 随机数#include <stdlib.h> //srand() rand() #include <time.h> //time() srand(time(0)); //设置一个随机数种子 rand() //表示一个随机的整数 rand() % 10 //表示的是0~9之间随机数2.5 小练习双色球获取6个1-33之间的数字（不可重复）作为红球获取1个1-16之间的数字作为蓝球#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { srand(time(NULL)); // 设置随机数种子 // 生成6个1-33之间的不重复的随机数作为红球 int red_balls[6]; for (int i = 0; i < 6; i++) { int temp; while (1) { temp = rand() % 33 + 1; int flag = 0; for (int j = 0; j < i; j++) { if (red_balls[j] == temp) { flag = 1; break; } } if (!flag) { red_balls[i] = temp; break; } } } // 生成1个1-16之间的随机数作为蓝球 int blue_ball; blue_ball = rand() % 17 + 1; // 输出结果 printf("红球："); for (int i = 0; i < 6; i++) { printf("%d ", red_balls[i]); } printf("蓝球：%d", blue_ball); return 0; }2.6 小结
一、Docker基本概念当我们利用Docker安装应用时，Docker会自动搜索并下载应用镜像（image）。镜像不仅包含应用本身，还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境，称为容器（container）。镜像仓库，就是专门保存镜像、管理镜像的地方。Docker官方维护了一个公共仓库：Docker Hub，任何注册了的用户都可以上传镜像到Docker Hub，也可以从上面下载镜像。另外，国内也有很多类似的镜像仓库：比如 网易云镜像仓库、阿里云镜像仓库等。1. Docker是做什么的？Docker可以帮助我们下载应用镜像，创建并运行镜像的容器，从而快速部署应用什么是镜像？将应用所需的函数库、依赖、配置等与应用一起打包得到的就是镜像什么是容器?为每个镜像的应用进程创建的隔离运行环境就是容器什么是镜像仓库?存储和管理镜像的服务就是镜像仓库，2. Docker命令docker run -d \ --name mysql \ -p 3306:3306 \ -e TZ=Asia/Shanghai \ -e MYSQL_ROOT_PASSWORD=123 \ mysqldocker run是创建并运行一个容器，-d参数是让容器在后台运行，在关掉终端后也可以运行--name参数是给容器起一个唯一的名字-p参数是设置端口映射，这个选项将容器的3306端口映射到宿主机的3306端口，这样你就可以从宿主机访问到MySQL服务了。-e TZ=Asia/Shanghai \参数是设置环境变量，影响mysql容器的时区设置-e MYSQL_ROOT_PASSWORD=123 \这个选项设置环境变量MYSQL_ROOT_PASSWORD为"123"，这会影响到MySQL的root用户的密码。mysql是要运行的镜像的名字3. Docker镜像命名规范Docker镜像的命名规范主要包括以下几点：使用小写字母和数字：因为Docker镜像名称是大小写敏感的，所以建议使用小写字母和数字来避免混淆。使用短划线(-)或下划线(_)分隔：可以使用短划线或下划线来分隔不同的单词，例如my-image或my_image。以library/project形式命名：镜像名称通常表示其包含的库或项目，因此建议使用library/project的形式来命名镜像，例如ubuntu:18.04或nginx:latest。遵循命名空间规则：如果一个镜像同时包含多个库或项目，可以使用冒号(:)将它们分开，例如redis:6.0.9或node:14.17.0。不要使用特殊字符：尽量避免在镜像名称中使用特殊字符，如空格、斜杠、问号等。这些字符可能会导致镜像名称无法正确解析。使用描述性名称：尽量给镜像起一个描述性的名称，以便于理解它包含的内容。例如，webapp:latest表示一个包含最新版本web应用程序的镜像。二、Docker基础1. 数据卷概念及挂载因为容器与宿主机是隔离的，如果容器删除，容器内的数据会丢失。为了解决这个问题，有了数据卷。在后期宿主机目录发生变更，只要改变数据卷的指向即可。数据卷（volume）是一个虚拟目录，是容器内目录与宿主机目录之间映射的桥梁。它将宿主机目录映射到容器内目录，方便我们操作容器内文件。数据卷创建的默认目录是/var/lib/docker/volumes命令说明docker volume creqate创建数据卷docker volume ls查看所有数据卷docker volume rm删除指定数据卷docker volume inspect查看某个数据卷的详情docker volume prune清除数据卷在执行docker run命令时，使用-v 数据卷:容器内目录 可以完成数据卷挂载在创建容器时，如果挂在了数据卷且数据卷不存在，会自动创建数据卷。2. 本地目录的挂载使用docker run -v命令挂载，具体命令为：docker run -v 本地目录:容器内目录l本地目录必须以“/”或 "./" 开头，如果直接以名称开头，会被识别为数据卷而非本地目录-v mysql : /var/lib/mysql会被识别为一个数据卷叫mysql，运行时会自动创建这个数据卷-v ./mysql : /var/lib/mysql会被识别为当前目录下的mysql目录，如果不存在会自动创建镜像中包含了应用程序所需要的运行环境、函数库、配置、以及应用本身，逐层构建而成。3. 自定义镜像（Dockerfile）镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件按照顺序逐层打包。Dockerfile就是一个文本文件，其中包含一个个的指令(Instruction)，用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像。常见指令如下：指令说明示例FROM指定基础镜像FROM centos:6ENV设置环境变量，可在后面指令使用ENV key valueCOPY拷贝本地文件到镜像的指定目录COPY ./mysql-5.7.rpm /tmpRUN执行Linux的shell命令，一般是安装过程的命令RUN yum install gccEXPOSE指定容器运行时监听的端口，是给镜像使用者看的EXPOSE 8080ENTRYPOINT镜像中应用的启动命令，容器运行时调用ENTRYPOINT java -jar xx.jar配置示例：# 指定基础镜像 FROM ubuntu:16.04 # 配置环境变量，JDK的安装目录、容器内时区 ENV JAVA_DIR=/usr/local ENV TZ=Asia/Shanghai # 拷贝jdk和java项目的包 COPY ./jdk8.tar.gz $JAVA_DIR/ COPY ./docker-demo.jar /tmp/app.jar # 设定时区 RUN ln -snf /usr/share/zoneinfo/ $TZ /etc/localtime && echo $TZ > /etc/timezone # 安装JDK RUN cd $JAVA_DIR \ && tar -xf ./jdk8.tar.gz \ && mv ./jdk1.8.0_144 ./java8 # 配置环境变量 ENV JAVA_HOME=$JAVA_DIR/java8 ENV PATH=$PATH:$JAVA_HOME/bin # 入口，java项目的启动命令 ENTRYPOINT ["java", "-jar", "/app.jar"]往往不需要这么复杂，我们可以直接基于JDK为基础镜像省略前面的步骤：# 基础镜像 FROM openjdk:11.0-jre-buster # 设定时区 ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 拷贝jar包 COPY docker-demo.jar /app.jar # 入口 ENTRYPOINT ["java", "-jar", "/app.jar"]构建镜像在编写好Dockerfile后，可以使用以下命令来构建镜像：# docker build -t 镜像名 Dockerfile目录 docker build -t myImage:1.0 .-t：时给镜像起名，格式依然是repository:tag的格式，不指定tag时，默认为latest.：是指定Dockerfile所在目录，如果就在当前目录，则指定为："."实操如下：docker load -i xxx.jar # 导入镜像 docker build -t demo: . # 使用当前目录的 Dockerfile 创建镜像，标签为 demo docker run -d --name demo -p 8080:8080 # 启动容器在后台运行，容器名为demo，端口映射为80804. 网络默认情况下，所有的容器都是以bridge方式连接到Docker的一个虚拟网桥上：在安装docker之后，会生成一个虚拟网卡，生成一个虚拟网桥虚拟网卡的名字叫做：docker0，ip为：172.16.0.2/16前两个网段不能改docker是允许我们自定义网络的，加入自定义网络的容器才可以通过容器名互相访问，Docker的网络操作命令如下：命令说明docker network create创建一个网络docker network ls查看所有网络docker network rm删除指定网络docker network prune清除未使用的网络docker network connect使指定容器链接加入某网络docker network disconnect使指定容器连接离开某网络docker network inspect查看网络详细信息# 示例： docker network create xiaobei docker network ls docker network rm demo docker network prune docker network connect xiaobei demo docker network disconnect docker network inspect xiaobei三、Docker Compose1. 基本概念Docker Compose通过一个单独的docker-compose.yml 模板文件（YAML 格式）来定义一组相关联的应用容器，帮助我们实现多个相互关联的Docker容器的快速部署。一个容器就是一个服务2. 文件结构version: "3.8" # 版本 services: mysql: image: mysql # 镜像名：mysql container_name: mysql # 容器名：mysql ports: - "3306:3306" # 端口号：3306:3306 environment: # 环境变量 TZ: Asia/Shanghai MYSQL_ROOT_PASSWORD: 123 volumes: # 数据卷挂载 - "./mysql/conf:/etc/mysql/conf.d" - "./mysql/data:/var/lib/mysql" - "./mysql/init:/docker-entrypoint-initdb.d" networks: # 网络 - new hmall: # 构建新镜像 build: context: . # 指定当前目录 dockerfile: Dockerfile # 文件名为Dockerfile container_name: hmall # 容器名：hmall ports: - "8080:8080" # 端口 networks: - new # 网络 depends_on: # 依赖于谁，该应用依赖于mysql - mysql nginx: image: nginx # 试着自己想想吧，我累了Ovo container_name: nginx ports: - "18080:18080" - "18081:18081" volumes: - "./nginx/nginx.conf:/etc/nginx/nginx.conf" - "./nginx/html:/etc/nginx/html" depends_on: - hmall networks: - new networks: new: name: hmall
一、安装进入官网下载安装包，并进行安装，一路打勾选择next即可。https://nodejs.org/zh-cn/download.msi是Windows installer开发出来的程序安装文件，它可以让你安装，修改，卸载你所安装的程序。说白了.msi就是Windows installer的数据包，把所有和安装文件相关的内容封装在一个包里。此外：它还包含有关安装过程自己的信息。例如：安装序列、目标文件夹路径、安装选项和控制安装过程的属性。.zip是一个压缩包，解压之后即可，不需要安装二、配置环境打开安装目录，如：D:\Program Files\nodejs在安装目录下新建两个文件夹node_global和node_cachewin+x打开管理员终端，输入npm config prefix "你的安装路径\node_global"npm config prefix "D:\Program Files\nodejs\node_global"再次输入npm config set cache "你的安装路径\node_cache"npm config set cache "D:\Program Files\nodejs\node_cache"设置环境变量，打开【系统属性】-【高级】-【环境变量】，在系统变量中新建变量名：NODE_PATH变量值：D:\Program Files\nodejs\node_global\node_modules编辑用户变量（环境变量）的 path，将默认的 C 盘下 APPData\Roaming\npm 修改成 D:\Program Files\nodejs\node_global，点击确定编辑【系统变量】-【Path】中，新建一个%NODE_PATH%三、添加国内镜像添加国内镜像源：如果没有梯子的话，可以使用阿里的国内镜像进行加速。npm config set registry https://registry.npm.taobao.org替换命令npm install -g cnpm --registry=https://registry.npmmirror.com
一、数据库基本概念（1）数据 所谓数据（Data）是指对客观事物进行描述并可以鉴别的符号，这些符号是可识别的、抽象的。它不仅仅指狭义上的数字，而是有多种表现形式：字母、文字、文本、图形、音频、视频等。现在计算机存储和处理的数据范围十分广泛，而描述这些数据的符号也变得越来越复杂了。（2）数据库数据库（Database，DB）指的是以一定格式存放、能够实现多个用户共享、与应用程序彼此独立的数据集合。 （3）数据库管理系统数据库管理系统（Database Management System，DBMS）是用来定义和管理数据的软件。如何科学的组织和存储数据，如何高效的获取和维护数据，如何保证数据的安全性和完整性，这些都需要靠数据库管理系统完成。目前，比较流行的数据库管理系统有：Oracle、MySQL、SQL Server、DB2等。 （4）数据库应用程序数据库应用程序（Database Application System，DBAS）是在数据库管理系统基础上，使用数据库管理系统的语法，开发的直接面对最终用户的应用程序，如学生管理系统、人事管理系统、图书管理系统等。（5）数据库管理员数据库管理员（Database Administrator，DBA）是指对数据库管理系统进行操作的人员，其主要负责数据库的运营和维护。（6）最终用户最终用户（User）指的是数据库应用程序的使用者。用户面向的是数据库应用程序（通过应用程序操作数据），并不会直接与数据库打交道。 （7）数据库系统数据库系统（Database System，DBS）一般是由数据库、数据库管理系统、数据库应用程序、数据库管理员和最终用户构成。其中DBMS是数据库系统的基础和核心。 二、数据库类型和常见的关系型数据库1、数据库类型数据库经过几十年的发展，出现了多种类型。根据数据的组织结构不同，主要分为网状数据库、层次数据库、关系型数据库和非关系型数据库四种。目前最常见的数据库模型主要是：关系型数据库和非关系型数据库。1.关系型数据库关系型数据库模型是将复杂的数据结构用较为简单的二元关系（二维表）来表示，如图所示。在该类型数据库中，对数据的操作基本上都建立在一个或多个表格上，我们可以采用结构化查询语言（SQL）对数据库进行操作。关系型数据库是目前主流的数据库技术，其中具有代表性的数据库管理系统有：Oracle、DB2、SQL Server、MySQL等。PS：关系=二维表2.非关系型数据库NOSQLNOSQL（Not Only SQL）泛指非关系型数据库。关系型数据库在超大规模和高并发的web2.0纯动态网站已经显得力不从心，暴露了很多难以克服的问题。NOSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战，尤其是大数据应用难题。常见的非关系型数据库管理系统有Memcached、MongoDB，redis，HBase等。2、常见的关系型数据库虽然非关系型数据库的优点很多，但是由于其并不提供SQL支持、学习和使用成本较高并且无事务处理，所以本书的重点是关系型数据库。下面我们将介绍一下常用的关系型数据库管理系统。OracleOracle数据库是由美国的甲骨文（Oracle）公司开发的世界上第一款支持SQL语言的关系型数据库。经过多年的完善与发展，Oracle数据库已经成为世界上最流行的数据库，也是甲骨文公司的核心产品。 Oracle数据库具有很好的开放性，能在所有的主流平台上运行，并且性能高、安全性高、风险低；但是其对硬件的要求很高、管理维护和操作比较复杂而且价格昂贵，所以一般用在满足对银行、金融、保险等行业大型数据库的需求上。DB2DB2是IBM公司著名的关系型数据库产品。DB2无论稳定性，安全性，恢复性等等都无可挑剔，而且从小规模到大规模的应用都可以使用，但是用起来非常繁琐，比较适合大型的分布式应用系统。SQL ServerSQL Server是由Microsoft开发和推广的关系型数据库，SQL Server的功能比较全面、效率高，可以作为中型企业或单位的数据库平台。SQL Server可以与Windows操作系统紧密继承，无论是应用程序开发速度还是系统事务处理运行速度，都能得到大幅度提升。但是，SQL Server只能在Windows系统下运行，毫无开放性可言。MySQLMySQL是一种开放源代码的轻量级关系型数据库，MySQL数据库使用最常用的结构化查询语言（SQL）对数据库进行管理。由于MySQL是开放源代码的，因此任何人都可以在General Public License的许可下下载并根据个人需要对其缺陷进行修改。由于MySQL数据库体积小、速度快、成本低、开放源码等优点，现已被广泛应用于互联网上的中小型网站中，并且大型网站也开始使用MySQL数据库，如网易、新浪等。3、Mysql登录、访问、退出操作1.登陆命令mysql -hlocalhost -uroot -pmysql：bin目录下的文件mysql.exe。mysql是MySQL的命令行工具，是一个客户端软件，可以对任何主机的mysql服务（即后台运行的mysqld）发起连接。 -h：host主机名。后面跟要访问的数据库服务器的地址；如果是登录本机，可以省略-u：user 用户名。后面跟登录数据的用户名，第一次安装后以root用户来登录，是MySQL的管理员用户 -p: password 密码。一般不直接输入，而是回车后以保密方式输入。2.访问数据库显示MySQL中的数据库列表：show databases; 默认有四个自带的数据库，每个数据库中可以有多个数据库表、视图等对象。 切换当前数据库的命令：use mysql; MySQL下可以有多个数据库，如果要访问哪个数据库，需要将其置为当前数据库。该命令的作用就是将数据库mysql（默认提供的四个数据库之一的名字）置为当前数据库显示当前数据库的所有数据库表：show tables;MySQL 层次：不同项目对应不同的数据库组成 - 每个数据库中有很多表 - 每个表中有很多数据3.退出数据库退出数据库可以使用quit或者exit命令完成，也可以用\q; 完成退出操作三、MYSQL常用命令查看数据查看库：show databases;建立数据库： create database 库名;选择数据库：use 库名;查看库下的所有表：show tables;查看表结构 ：desc表名;(describe缩写)建立数据表：use 库名; create table 表名 (字段名 varchar(20)字符串， 字段名 char(1));修改数据:修改表名：rename table oldname to newname;往表中插入记录：insert into 表名values (‘hyq’，‘m’);显示表中的记录：select * from 表名;11、将表中记录清空：delete from表名 where id=1;删除数据表：drop table 表名；删除数据库：drop database 库名;更新表中数据：update 表名 set 字段名1=‘a’, 字段名2=‘b’ where 字段名3=‘c’;多个字段更新，用逗号隔开自增:update myTable set vipczz=vipczz+1 where vip=1;
一、STM32环境1. 所需环境软件环境：STM32CubeMX（用于生成工程）Clion（编写代码）MinGW（编译C语言代码）OpenOCD（debug）arm-none-eabi-gcc（编译单片机上运行程序的编译器）硬件环境：开发板下载器2. 工具安装2.1 STM32CubeMX直接到官网下载最新版安装，然后登陆账号，有些芯片资源需要登陆后下载。官网链接：https://www.st.com/en/development-tools/stm32cubemx.html#get-software2.2 OpenOCD也是一样直接到官网下载，下载的文件为压缩包文件，解压出来放到自己能记得住的合适位置即可官网链接：https://gnutoolchains.com/arm-eabi/openocd/2.3 MinGW下载MinGW程序，并进行解压，放到自己记得住合适的位置。下载地址：https://sourceforge.net/projects/mingw-w64/files/官网有些慢 蓝奏云链接：https://yunyuwu.lanzouv.com/i8aD8xq4muf然后我们点击：此电脑——属性——高级系统设置——环境变量，点击系统环境变量中的Path。接着重启电脑后，摁住win+R键输入cmd，在cmd控制台输入下方代码并回车，当输出结果如图所示就是成功了gcc -v -E -x c++ -2.4 arm-none-eabi-gcc下载安装完成后记得勾选下方倒数的三个选项添加到环境变量中，可以省去自己去手动配置环境变量。下载地址：https://launchpad.net/gcc-arm-embedded/+download安装完成后重启电脑 执行下方语句，若有输出则成功arm-none-eabi-gcc -v2.5 clion新建一个项目，选择路径后创建。点击 文件——设置——嵌入式开发——选择安装的路径自己的路径，不是必须一致。二、51环境打开clion软件，安装platformio插件，然后将clion进行重启创建新项目，选择platformio，点击install guide会跳转到浏览器网页点击Instsallation Methods 再点击 Local Download（macos/linux/windows）右击get-platformio.py 在新窗口打开右击鼠标，另存为get-platformio.py下载python环境并添加到环境变量在对应文件位置输入python get-platformio.py 耐心等待下载完成C:\Users\xiaobei\.platformio\penv\Scripts将下载的模块添加到环境变量中，我给的路径只是举例，具体看自己，然后重启clion。2.1 配置1每次新建项目都需要配置新建51单片机项目，选择platformio选择项目路径，点击任意位置输入你的芯片信息，点击创建。打开CMakeListsPrivate.txt将下列代码复制粘贴到下一行include_directories("${ENV_HOME_PATH}/.platformio/packages/toolchain-sdcc/include")点击 文件——重新加载 CMake 项目2.2 配置2只需要配置一次双击main.c，然后添加以下代码#include "mcs51/8052.h"鼠标放到8052.h上，摁住ctrl，点击鼠标左键；将<>修改为""；并添加以下代码#include "lint.h"鼠标放到8051.h上，摁住ctrl，点击鼠标左键，跳转到8051.h文件，添加以下代码：#include "lint.h"2.3 编译上传到单片机右上角选择配置，选择上传，然后点击绿色三角形编译，等待出现Cycling power: done时，点击启动电源。
一、什么是电流1.1 原子一切都是原子构成，一个简单的原子模型可以简化成带正电荷的原子核在中央，周围环绕有若干个带负电的电子。同性相斥，异性相吸。1.2 原子与电荷原子核带正电，吸引带负电的电子，电子带负电之间又互相排斥。绝大多数固体材料，他们的原子核和电子靠的近是稳定的。但是在金属固体里面，比如铜，电子离原子核远，是可以自由移动的。原子核原地不动，保持着材料的结构稳定，但是电子可能会在原子之间跳动。1.3 电流的产生如果一个电子不老实进行移动，那么附近的电子就会像多米诺骨牌一样不断移动。他们之间不断推着挤，就产生了电流。1.4 电流的单位 安培1000ma=1A1.5 电路与电池电路就是电流导通的道路，电池是一种特殊的通过化学反应产生能量的装置，电池正极吸收电子，电池负极发送电子。1.6 电流方向传统电学：电流从正极流向负极真实世界：电流从负极流向正极1.7 交流电(AC)与直流电(DC)AC(交流电)交流电的电流方向随时间变化电荷会在正、负两个方向上流动，周期性的交替反向交流电通常是通过电网供应的电力用于各种大型较大功耗的电气设备和机械设备如电视、电冰箱、微波炉DC(直流电)直流电是指电流方向不变的电流电荷始终在同一个方向上流动直流电源通常由电池或者其他直流电源供应直流电常用于需要稳定电压和恒定方向的小型设备中如手机、电动车直流交流电的对比1.8 开路与闭路开路与闭路的区别在于电路中开关的状态是否闭合，这直接影响了电路中的电流是否能够流通，从而影响电路中的电气设备是否能够正常工作。开路当电路中的开关处于断开状态，电路就处于开路状态。在这种状态下，电流无法流通，电路中的电气设备也无法工作。闭路当电路中的开u按处于闭合状态，电路就处于闭路状态。在这种状态下，电流可以在电路中流通，电器设备也可以正常工作。二、什么是电压2.1 电压电压就是电势能什么是势能？势能是物理学描述的能量类型，说明物体具备的能量。电压，电势能是指在电子在电路中的动能。单位通常为伏特(V)。电压是电力系统中的一种重要概念，它决定着电流流动的强度。电压越高，电子移动的越快，电流就会越大；而电压越低，电流就会越小。三、电阻和欧姆定律电压产生电势差，推动电流的流动3.1 电阻电压产生电势差，推动电流的流动电阻是电子学中的基本概念，它是指电流经过导体时阻碍电流流动的程度、电阻的单位是欧姆。电压、电阻和电流之间的关系3.2 欧姆定律欧姆定律是电学中的基本定律之一他描述了电流和电压之间的关系。欧姆定律的公式为I=U/R，其中I是电流，U是电压。R是电阻。这个公式表面，在电阻不变的情况下，电压和电流成正比欧姆定律的重要参数I 电流单位 安 AU 电压单位 伏 VR 电阻单位 欧姆 R3.3 欧姆定律的计算串联电路并联电路串并联电路的计算四、常见元器件4.1 电阻器作用就是阻碍电流的流动电阻器的分类电阻器的作用电阻器是一种电子元器件，它可以提供一定的电阻，限制电流的流动。电阻器是由导体材料制成的，通过将导体材料绕制成螺旋状或折叠装，并将两端引出，形成一个固定电阻值的器件。4.1.1 电阻的分类基于功能和制作工艺划分。普通电阻：普通电阻是一种最基本的电阻器，通常由一根或多根绕在绝缘体上的金属丝或碳膜组成，可以提供固定的电阻值，适用于各种电路中。薄膜电阻：薄膜电阻是一种由金属或合金薄膜制成的电阻器，可以提供高精度和稳定性的电阻值，常用于精密仪器、测量仪器等高要求的场合。光敏电阻：光敏电阻是一种电阻值受光照强度影响的电阻器，常用于光敏电路和光控系统中。金属薄膜电阻：金属薄膜电阻器是一种由金属薄膜制成的电阻器，具有较高的精度和稳定性，适用于高精度电路中。电位器：电位器是一种可调电阻器，通常由一个旋转或滑动的电阻器件和一个旋钮或滑动器组成，可以提供可调的电阻值，常用于电路的调节和控制。旋钮可调电阻：旋钮可调电阻是一种可调电阻器，与电位器类似，但是旋钮可调电阻通常是用旋钮来改变电阻值，通常用于电子设备的调节和控制。热敏电阻：热敏电阻是一种电阻值随温度变化而变化的电阻器，通常用于温度测量和控制系统中。压敏电阻：压敏电阻是一种电阻值随压力变化而变化的电阻器，通常用于压力传感器和压力测量等应用场合。高精度电阻：高精度电阻是一种精度较高的电阻器，通常具有稳定的电阻值和温度系数，适用于高精度仪器和精密测量仪器等场合。4.1.2 电阻的数据手册电阻我们主要关心：封装、标称、额定功率封装：看电阻是什么样的，直插还是贴片的，大小是多大标称：看电阻表的电阻阻值是多少，精确度是多少，精度越高越贵额定功率：额定功率计算公式为：P=I*I*R=I*U，额定功率其实决定了耐压值。电阻能通过的最大电流是固定的，额定功率越高，耐压值就越高，超过了电阻的耐压值会导致电阻烧毁。4.2 电容器电容就是装电的容器，主要防止电压的突变电容器是一种电子元件，用于储存电荷和能量。它由两个导体板和介质层组成，介质层位于两个导体板之间。当电容器接入电路时，负电荷被储存在导体板上，并在两板之间产生电场。电容器的单位是法拉（F），一个法拉等于存储一库仑电荷所需的电势差为一伏特的电容器。常见的电容器有电解电容器、陶瓷电容器、聚酯薄膜电容器、铝电解电容器等。不同的材料介质，容纳电荷的能力不一样。电容的充放电是基于静电力的，不涉及化学反应变化，比锂电池更安全一些。4.2.1 电容的分类4.2.2 电容的单位不同的材料介质，容纳电荷的能力不一样。电容单位是法拉F注意：法拉是个非常大非常大的单位哦，其他单位为mf，uf，nf，pf1F（法拉）＝1000mF（毫法）1mF（毫法）＝1000μF（微法）1μF（微法）＝1000nF（纳法）1nF（纳法）＝1000pF（皮法）电容器的作用：阻止电压的突变，储能，滤波（大电容滤低频，小电容滤高频）。生活中的电容：充电器的电源灯并不是立刻断开，里面有电容，电荷慢慢释放掉。4.2.3 电容的分类基于功能和制作工艺划分玻璃电容：使用玻璃作为介质的电容器，具有高温稳定性和低损耗等特点，常用于高频和高温环境下的电路中。钽电容：使用钽金属作为电极的电容器，具有小尺寸、大电容量和高频特性等优点，常用于微型电路中。薄膜电容：使用金属膜或金属箔作为电极的电容器，具有高精度、稳定性好等特点，常用于高性能电子器件中。铝电解电容：使用铝箔和电解液作为电极的电容器，具有大电容量、低成本等特点，常用于低频和直流电路中。云母电容：使用云母作为介质的电容器，具有高精度、高频特性等特点，常用于精密仪器和高频电路中。空气电容：使用空气作为介质的电容器，具有高精度、稳定性好等特点，但体积较大，常用于高频和高压电路中。陶瓷电容：使用陶瓷作为介质的电容器，具有小尺寸、高频特性和高温稳定性等优点，常用于电子设备中。可调电容：具有可变电容值的电容器，常用于无线电和调谐电路中。金属纸电容：使用金属化薄膜作为电极的电容器，具有高精度、稳定性好等特点，常用于高性能电子器件中。超级电容：也称为电化学电容器，具有高能量密度、高功率密度和长寿命等特点，常用于储能系统和电动汽车中。4.2.4 注意事项有些电容有极性，正负极接反会爆炸铝电解电容是一种极性电容，由于其特殊的结构和工作原理，如果接反了极性，可能会导致电容器失效或者损坏，甚至可能导致电容器短路或者起火等危险情况。铝电解电容的结构是由一层氧化铝薄膜和一层电解液构成的。当正极连接正电压，负极连接负电压时，电解液中的氢离子会向氧化铝膜的负极移动，而负离子则向电解液的正极移动，形成一个稳定的电场，从而形成电容效应。如果电容器反接了极性，电解液中的氢离子会向氧化铝膜的正极移动，形成氢气，铝电解电容会爆浆。电容爆浆后压力较大，电解电容的外壳也是无规律的变形，有可能产生手榴弹爆炸后的效果，容易造成其他元器件的损坏。4.3 电感器4.3.1 电和磁的关系电和磁可以互相转换。电机中的电流流过线圈，从而产生磁场，这个磁场将旋转部件（例如电动机轴）带动起来，这就是电磁感应原理的应用。发电机和电机相反，通过旋转磁场，发电机可以转换机械能为电能。4.3.2 什么是电感器主要防止电流的突变电感器是一种电子元件，用于在电路中储存和释放能量。他由一个线圈组成，通常由铜线绕成，通常带有一个铁芯。当电流通过电感器时，它会在线圈中产生一个磁场，从而储存能量。当电流停止流动时，磁场会崩溃，导致电感器逐渐释放储存的能量。电感器的主要作用是在电路中调节电流的变化率。它可以用来过滤电路中的高频噪声，电感器两端的电流不会突变，保护其他电子元件不受到电磁干扰的影响。电感器的核心要点通过磁场储存能量组织电流的突变4.3.3 电感和电阻理想的电感没有能量损耗电感：电磁感应元器件，电会产生磁场，磁场又会抵制电流的变化。理想的电感没有能量损耗。跟电阻不同，电阻阻碍电流，发热。电感使用漆包线，纱包线等外部绝缘导线缠绕到铁芯上电感的单位是亨利（Henry）表示为H，它的中文读法是“恒利”，以英国物理学家亨利的名字命名。电感的基本单位是：H（亨），它和电容一样，也是一个很大的计量单位，另外还有毫亨mh、微亨uh、纳亨nh电感的作用；电感可以作为电路稳定器的一部分，通过抵抗电路中电流的变化，保持电路的稳定性和可靠性。
一、单片机简介1.1 单片机是什么单片机：Single-Chip Microcomputer,单片微型计算机，是一种集成电路芯片电脑VS单片机1.2 单片机的特点体积小 <5mm*5mm功耗低 mA级集成度高 IO/TIM/AD/DA使用方便 C/Debug扩展灵活 ICC/SPI/FSNC1.3 单片机的使用场景仪器仪表——电源/示波器/焊台家用电器——空调/冰箱/洗衣机工业控制——机器人/PLC/电梯汽车电子——GPS/ABS/胎压监测1.4 单片机的发展历程1.5 CISC VS RISC对比项复杂指令集计算机(CISC)精简指令集计算机(RISC)目的为了便于编程和提高储存器的访问效率为了提高处理器运行速度指令特点1. 指令多，模式多，格式可变2.指令的执行需要的时钟周期差距很大3. 无流水线或流水线程度较低4. 指令由微带码翻译执行1. 指令少，模式少，格式固定2. 大多数指令只需1个时钟周期3. 流水线结构4. 指令直接由硬件执行优点1. 指令丰富、功能强大2.寻址方式灵活1. 指令精简，易于设计，使用率均衡2.程序执行效率高缺点1. 指令使用率不均衡2. 不利于采用先进结构提高性能3. 结构复杂不利于超大规模集成电路实现1. 指令数较少，功能不及CISC强大2. 寻址方式不够灵活CISC和RISC举例冯诺依曼结构 VS 哈佛结构1.6 总结二、Cortex-M系列2.1 ARM公司ARM公司：只做内核设计和IP授权，不参与芯片设计2.2 ARM架构为什么能风靡全球2.3 Cortex内核分类及特征对比项Cortex-ACortex-RCortex-M特点高时钟频率，长流水线，高性能较高时钟频率，较长的流水线，实时性强时钟频率较低，通常较短的流水线，超低功耗应用场景移动计算，智能手机，平板电脑，数字电视军工，汽车电子，无线基带，硬盘控制器工控、传感器、消费电子、家用电器、医疗器械2.4Cortex-M3/4/7介绍类别Cortex-M3Cortex-M4Cortex-M7核心版本ARMv7-MARMv7E-M 指令系统Thumb/Thumb-2 DSP指令扩展无有有浮点单元无单精度浮点单元可选单/双精度浮点单元流水线3级3级+分支预测6级+分支预测中断NVIC，NMI + 1~240物理中断源，8~256个中断优先级 系统定时器24位系统滴答定时器 睡眠模式集成WFI和WFE指令以及退出睡眠功能 调试可选JTAG和SWD调试接口 内存保护可选8个区域MPU可选8个区域MPU可选8、16个区域MPUDMIPS/MHz1.251.252.14CoreMark®/MHz3.343.435.012.5总结三、初识STM323.1 STM32是什么STM32ST：意法半导体 M：MCU/MPU 32：32位3.2 STM32芯片分类ST中文社区网 ST官网五大类3.3 STM32命名规则3.4 STM32选型由高到低（性能），由大到小（内存，闪存）3.5 总结四、查看数据手册4.1 芯片的基本参数主频/FLASH/SRAM工作电压/最大电流IO引脚接入电压范围单个IO引脚最大电流4.2 最小系统最小系统：保证MCU正常工作的最小电路组成单元芯片电源电路复位电路晶振电路Boot启动电路下载调试电路其他电路