新手c语言讲解及题目分享(十四)--函数专项练习(二)

新手c语言讲解及题目分享(十四)--函数专项练习(一)-CSDN博客

目录

前言

一.函数调用中的参数传递

1.普通变量作为函数的参数

2.数组元素作为参数

3.数组名作为函数的参数

4.指针变量作为函数的参数

二.函数的嵌套调用

三.函数的递归调用

四.函 数 与 宏

1.不带参数的宏定义

2.带参数的宏定义

五.函数指针与返回指针的函数

1.指向函数的指针变量定义的一般形式

2.用指向函数的指针变量调用函数

Ⅰ.利用指针进行函数的选择调用

Ⅱ.指向函数的指针变量作函数参数

3.返回指针值的函数


前言

前一章我讲解了一些有关函数的部分内容,但已经足够开始编写程序。但还有些细节的地方和不理解的地方在这篇都会涉及到。主要包括函数中参数的传递,不同类型的结构作为函数参数和函数的嵌套等一些函数的进阶内容都会在本文中讲解。对我个人而言函数还是非常重要的,它可以是你的代码具有更高的可读性。

这期题目分享全放到文章中。

一.函数调用中的参数传递

当被调用函数是有参函数时,主调函数与被调函数之间具有数据传递关系。 定义函数时的参数称为形式参数,简称形参。

形参在函数未被调用时没有确定的值,只 是形式上的参数。调用函数时的参数称为实际参数,简称实参。实参可以是变量、常量或表达式,有确定的取值,是实实在在的参数。函数定义时形参不占用内存,只有发生调用时才 被分配内存单元,接收实参传来的数据。

定义函数时必须定义形参的类型。函数的形参与实参的数量应相等,并且对应的形参和 实参的类型相同。形参和实参可以同名,形参是该函数内部的变量,即使形参和实参同名, 也是两个不同的变量,占用不同的内存单元。

1.普通变量作为函数的参数

单向的值传递(实参→形参),形参和实参分别分配存储空间,形参值的改变不会影响 实参。

2.数组元素作为参数

由于形参是在函数被调用时临时分配存储单元,不可能为一个数组元素单独分配存储单 元(数组是一个整体,在内存中占连续的一段存储单元)。因此数组元素只能用作函数实 参,不能用作形参。在用数组元素作函数实参时,把实参的值传给形参,也是单向的值传递 方式。

题目: 编写一个C语言程序,该程序包含一个函数 process_element,它接受一个整数参数。该函数将检查传入的整数是否为正数,如果是,则计算并返回该整数的平方;如果不是,则返回0。然后在 main 函数中,创建一个整数数组,并使用循环遍历数组中的每个元素,调用 process_element 函数处理每个元素,并打印结果。

#include <stdio.h>// 函数声明
int process_element(int element);int main() {int numbers[] = {3, -1, 5, 0, -4, 7};int size = sizeof(numbers) / sizeof(numbers[0]);// 遍历数组并处理每个元素for (int i = 0; i < size; i++) {int result = process_element(numbers[i]);printf("The square of %d is: %d\n", numbers[i], result);}return 0;
}// 函数定义
int process_element(int element) {if (element > 0) {return element * element; // 如果是正数,返回其平方} else {return 0; // 如果不是正数,返回0}
}

在这个程序中,process_element 函数接受一个整数参数,并根据该整数的值返回其平方或0。main 函数创建了一个整数数组,并使用 for 循环遍历数组。在每次迭代中,它调用 process_element 函数,并将当前数组元素的值作为参数传递。然后,程序打印出每个元素及其处理后的结果。

这个例子展示了如何将数组元素作为参数传递给函数,以及如何在函数内部根据传入的参数执行不同的操作。

3.数组名作为函数的参数

数组是存储数据的重要工具。数组中存放的数据有次序关系,很容易进行统一处理。 函数可以通过参数传递来处理数组。用数组名作为函数实参时,向形参(数组名或指针变 量)传递的是数组在内存中的起始地址,形参和实参共用一个内存单元,形参值的改变会 影响实参。

题目: 编写一个C语言程序,该程序包含一个函数 sum_array,它接受一个整数数组和数组的大小作为参数,并计算数组中所有元素的和。然后在 main 函数中,创建一个整数数组,调用 sum_array 函数计算并打印数组元素的总和。

#include <stdio.h>// 函数声明
int sum_array(int arr[], int size);int main() {int numbers[] = {1, 2, 3, 4, 5};int size = sizeof(numbers) / sizeof(numbers[0]);int sum = sum_array(numbers, size);printf("The sum of the array elements is: %d\n", sum);return 0;
}// 函数定义
int sum_array(int arr[], int size) {int sum = 0;for (int i = 0; i < size; i++) {sum += arr[i]; // 累加数组中的每个元素}return sum; // 返回总和
}

在这个程序中,sum_array 函数接受一个整数数组 arr 和数组的大小 size 作为参数。函数通过一个 for 循环遍历数组中的所有元素,并将它们累加到变量 sum 中。完成累加后,函数返回总和。

在 main 函数中,我们创建了一个整数数组 numbers 并计算了其大小。然后,我们调用 sum_array 函数,并将数组名 numbers 和数组的大小 size 作为参数传递。最后,我们打印出数组元素的总和。

这个例子展示了如何在C语言中将整个数组作为参数传递给函数。需要注意的是,在C语言中,数组名 arr 在函数参数列表中实际上是一个指向数组第一个元素的指针,因此函数内部无法直接获取数组的大小,必须作为单独的参数传递。

4.指针变量作为函数的参数

将普通变量的地址传递给形参变量,形参变量必须是指针类型的。指针作为函数参数进 行传递,实质上还是值的单向传递,只不过传递的是地址值,实参和形参指向同一个存储单 元。在函数中改变形参变量所指向内存单元的值的,相当于改变了实参所指向的存储单元的 值。而实参指针变量的值没有改变。在程序设计过程中,往往利用这点,在编写程序时,通 过函数调用改变多个值。

题目: 编写一个C语言程序,该程序包含一个函数 increment,它接受一个指向整数的指针作为参数,并将该指针所指向的整数增加10。然后在 main 函数中,声明一个整数变量,初始化它,并调用 increment 函数来增加其值。最后,打印出增加后的值。

#include <stdio.h>// 函数声明
void increment(int *ptr);int main() {int value = 5;printf("Original value: %d\n", value);increment(&value); // 调用函数,传递变量的地址printf("Value after increment: %d\n", value);return 0;
}// 函数定义
void increment(int *ptr) {*ptr += 10; // 增加指针所指向的整数的值
}

在这个程序中,increment 函数接受一个指向整数的指针 ptr 作为参数。在函数内部,通过解引用指针 *ptr 来访问和修改指针所指向的整数,将其增加10。

在 main 函数中,我们声明了一个整数变量 value 并初始化为5。然后,我们调用 increment 函数,并将 value 的地址(通过 &value 获取)作为参数传递。调用 increment 函数后,value 的值增加了10。最后,我们打印出增加后的值。

这个例子展示了如何在C语言中使用指针作为函数参数,并通过指针修改传递的变量值。这是C语言中常用的技术,因为它允许函数直接修改传入的变量,而不仅仅是其副本。

二.函数的嵌套调用

C 语言中,函数的定义是平行的、独立的,函数间无从属关系,不允许嵌套定义,但可 以嵌套调用,即在调用一个函数的过程中,被调用的函数又可以调用另一个函数。无论嵌套 调用多少层,每个函数调用结束后都会返回到调用点,继续程序的执行,直到主函数执行完 成时程序运行结束。嵌套调用为结构化的程序设计提供了基本的支持。

题目: 编写一个C语言程序,该程序包含两个函数:square 和 sum_of_squaressquare 函数接受一个整数参数并返回其平方。sum_of_squares 函数接受两个整数参数,计算并返回这两个整数的平方和。在 main 函数中,调用 sum_of_squares 函数并打印结果。

#include <stdio.h>// 函数声明
int square(int num);
int sum_of_squares(int a, int b);int main() {int num1 = 3;int num2 = 4;// 调用 sum_of_squares 函数,它内部调用 square 函数int result = sum_of_squares(num1, num2);printf("The sum of squares of %d and %d is: %d\n", num1, num2, result);return 0;
}// square 函数定义,返回整数的平方
int square(int num) {return num * num;
}// sum_of_squares 函数定义,返回两个整数平方的和
int sum_of_squares(int a, int b) {return square(a) + square(b); // 嵌套调用 square 函数
}

在这个程序中,square 函数接收一个整数 num 并返回 num 的平方。sum_of_squares 函数接收两个整数 a 和 b,它通过调用 square 函数两次(一次为 a,一次为 b)来计算这两个数的平方和,并将结果返回。

在 main 函数中,我们声明了两个整数 num1 和 num2,分别初始化为3和4。然后,我们调用 sum_of_squares 函数,并将 num1 和 num2 作为参数传递。sum_of_squares 函数内部调用了 square 函数两次,分别计算 num1 和 num2 的平方,并将这两个平方值相加。最后,我们打印出计算得到的结果。

这个例子展示了函数的嵌套调用,即一个函数在执行过程中调用了另一个函数。

三.函数的递归调用

函数的递归指在调用函数的过程中,直接或间接的调用函数自身。 合理的递归调用应是有限的,在一定条件下会停止的。递归算法里必须具有使函数调用 终结的条件,称为递归终结条件。 从程序设计的角度考虑,递归算法包括递归公式和递归终结条件。

递归过程可表示为: if(递归终结条件) return (终结条件下的值);

else return (递归公式);

从数学的角度考虑就是构造递归函数。递归函数包括递归公式和递归终结条件(终结值)。

题目: 编写一个C语言程序,该程序包含一个递归函数 factorial,它接受一个非负整数 n 作为参数,并返回 n 的阶乘(n!)。在 main 函数中,读取用户输入的一个非负整数,并使用 factorial 函数计算并打印其阶乘。

#include <stdio.h>// 函数声明
unsigned long long factorial(int n);int main() {int number;printf("Enter a non-negative integer: ");scanf("%d", &number);// 检查输入是否为非负整数if (number < 0) {printf("Factorial is not defined for negative numbers.\n");} else {// 调用递归函数计算阶乘unsigned long long result = factorial(number);printf("Factorial of %d is: %llu\n", number, result);}return 0;
}// 递归函数定义,计算阶乘
unsigned long long factorial(int n) {if (n == 0) {return 1; // 递归的基本情况} else {return n * factorial(n - 1); // 递归调用}
}

在这个程序中,factorial 函数是一个递归函数,它计算并返回一个非负整数 n 的阶乘。递归的基本情况是当 n 为0时,此时阶乘为1。对于其他情况,函数通过递归调用自身来计算 n * (n - 1)!

在 main 函数中,程序提示用户输入一个非负整数,然后检查这个数是否为非负。如果输入有效,程序调用 factorial 函数来计算并打印出该数的阶乘。

递归是一种强大的编程技术,但它需要谨慎使用,因为错误的递归可能会导致无限循环或栈溢出。对于这个例子,确保输入的整数不会太大,以避免计算结果超出 unsigned long long 的范围。

四.函 数 与 宏

宏定义用指定的宏名(标识符)代替宏体。

1.不带参数的宏定义

不带参数的宏定义的一般形式为:

#define 宏名 宏体

其中,#define 是宏定义命令,宏名是一个标识符,宏体是一个字符序列。

2.带参数的宏定义

#define 宏名(形参表列) 宏体

其中,#define 是宏定义命令,宏名是一个标识符,形参表列是用逗号隔开的一个标识符 序列,宏体是包含形参的一个字符序列。

在程序中使用带参数宏的一般形式为:

宏名(实参表列)

其中,实参表列是逗号隔开的表达式。

注:(1)定义带参数的宏时,宏名和右边的圆括号之间不能加空格,否则,就成了不带参数的宏定义。

(2)为了正确进行替换,一般将宏体和各形参都加上圆括号。

(3)若实参是表达式,宏替换之前不求解表达式,宏替换之后进行编译时再求解。

五.函数指针与返回指针的函数

1.指向函数的指针变量定义的一般形式

指向函数的指针变量定义方式为:

类型说明符 (*指针变量名)();

类型说明符指函数返回值的类型

注:在定义指向函数的指针变量时,两对圆括号都不能省略。下两种形式具有不同的含义:

int (*fp)(); /*定义一个指向函数的指针变量*/

int *fp(); /*在老版本的 C 语言,这是声明返回整型指针值的函数原型*/

2.用指向函数的指针变量调用函数

定义了指向函数的指针变量后,通过指针变量可间接调用函数。用指向函数的指针变量 调用函数分为两个步骤:

(1)将函数的入口地址(即函数名)赋值给指向函数的指针变量;

(2)将指向函数的指针变量(连同圆括号)代替函数名使用。

Ⅰ.利用指针进行函数的选择调用

根据不同的条件,将不同的函数首地址赋值给函数指针变量,通过函数指针变量来间接 地调用该函数,从而达到根据不同条件调用不同函数的目的。

题目: 编写一个C语言程序,该程序包含四个不同的函数,每个函数执行一个基本的数学运算(加、减、乘、除)。主函数中,根据用户输入的运算符(+-*/),使用函数指针来调用相应的运算函数,并打印结果。

#include <stdio.h>// 声明四个运算函数
double add(double a, double b) { return a + b; }
double subtract(double a, double b) { return a - b; }
double multiply(double a, double b) { return a * b; }
double divide(double a, double b) { return b != 0 ? a / b : 0; }int main() {double num1, num2, result;char operator;// 定义函数指针数组,用于选择函数double (*operation[4])(double, double) = {add, subtract, multiply, divide};char *ops = "+-*/"; // 对应运算符的字符串// 从用户那里获取输入printf("Enter an operator (+, -, *, /): ");scanf(" %c", &operator);printf("Enter two numbers: ");scanf("%lf %lf", &num1, &num2);// 查找运算符并调用相应的函数for (int i = 0; i < 4; i++) {if (operator == ops[i]) {result = operation[i](num1, num2); // 通过函数指针调用函数break;}}// 打印结果if (operator == '/' && num2 == 0) {printf("Division by zero is undefined.\n");} else {printf("Result: %lf\n", result);}return 0;
}
Ⅱ.指向函数的指针变量作函数参数

用指向函数的指针变量作为函数参数,把相应函数的入口地址传送给主调函数。函数通 过函数指针变量调用相应的函数。

题目: 编写一个C语言程序,该程序包含一个名为 apply_operation 的函数,它接受两个整数和一个指向函数的指针作为参数。该指针指向的函数执行一个基本的数学运算(加、减、乘、除)。apply_operation 函数将调用传入的函数来对两个整数进行运算,并返回结果。在 main 函数中,根据用户的选择,调用 apply_operation 函数并打印结果。

#include <stdio.h>// 声明四个基本运算函数
int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }
int multiply(int a, int b) { return a * b; }
int divide(int a, int b) { return b != 0 ? a / b : 0; }// apply_operation 函数声明,它接受一个指向函数的指针作为参数
int apply_operation(int a, int b, int (*operation)(int, int));int main() {int num1, num2, result;int choice;// 获取用户输入的两个数字printf("Enter two numbers: ");scanf("%d %d", &num1, &num2);// 获取用户选择的运算类型printf("Choose an operation:\n");printf("1: Addition\n");printf("2: Subtraction\n");printf("3: Multiplication\n");printf("4: Division\n");scanf("%d", &choice);// 根据用户选择调用 apply_operation 函数switch (choice) {case 1:result = apply_operation(num1, num2, add);break;case 2:result = apply_operation(num1, num2, subtract);break;case 3:result = apply_operation(num1, num2, multiply);break;case 4:result = apply_operation(num1, num2, divide);if (num2 == 0) {printf("Division by zero is undefined.\n");return 1;}break;default:printf("Invalid choice.\n");return 1;}// 打印结果printf("Result: %d\n", result);return 0;
}// apply_operation 函数定义
int apply_operation(int a, int b, int (*operation)(int, int)) {return operation(a, b); // 调用传入的函数指针
}

3.返回指针值的函数

函数的返回值不仅可以是整型、实型、字符型等数据,也可以是指针类型的数据,即地址值。当函数返回指针类型数据时,应在定义函数时对返回值的类型进行说明。说明的格式为:

函数返回值类型 *函数名(形式参数表列)

题目: 编写一个C语言程序,该程序包含一个名为 create_array 的函数,它接受一个整数 n 作为参数,并返回一个指向包含 n 个整数的数组的指针。在 main 函数中,调用 create_array 函数,并打印数组中的元素。

#include <stdio.h>// 函数声明
int* create_array(int n);int main() {int n, *array;// 从用户那里获取 n 的值printf("Enter the number of elements in the array: ");scanf("%d", &n);// 调用 create_array 函数并打印结果array = create_array(n);printf("The elements of the array are: ");for (int i = 0; i < n; i++) {printf("%d ", array[i]);}printf("\n");return 0;
}// 函数定义
int* create_array(int n) {int *ptr = (int*)malloc(n * sizeof(int)); // 动态分配内存if (ptr == NULL) { // 检查内存分配是否成功printf("Memory allocation failed.\n");return NULL;}// 初始化数组元素for (int i = 0; i < n; i++) {ptr[i] = i + 1; // 数组元素从1开始}return ptr; // 返回指向数组的指针
}

————由于博主还是大三的在读生,时间有限,每天会不定时更新一些学习经验和一些32的项目,如果喜欢就点点关注吧,大佬们!!!!————

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

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

相关文章

从误删到重生:2024年数据恢复软件市场新趋势与精选工具

现在科技发展越来越先进&#xff0c;大部分的办公内容也都是通过电脑来进行操作的。但是总免不了偶尔会遇到电脑蓝屏或者其他原因导致数据丢失的情况。那辛辛苦苦做好的材料不见了一定很恼火。这次我分享几个电脑数据恢复工具来解决这个问题。 1.福晰数据恢复 连接直达&#…

C++ | Leetcode C++题解之第392题判断子序列

题目&#xff1a; 题解&#xff1a; class Solution { public:bool isSubsequence(string s, string t) {int n s.size(), m t.size();vector<vector<int> > f(m 1, vector<int>(26, 0));for (int i 0; i < 26; i) {f[m][i] m;}for (int i m - 1; …

操作系统面试真题总结(五)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 线程切换要保存哪些上下文&#xff1f; 当发生线程切换时&#xf…

【论文阅读】Stealing Image-to-Image Translation Models With a Single Query(2024)

摘要 Training deep neural networks(训练深度神经网络) requires(需要) significant computational resources(大量计算资源) and large datasets(大型数据集) that are often confidential(机密的) or expensive(昂贵的) to collect. As a result(因此), owne…

sed awk 第二版学习(二)—— 正则表达式语法

目录 一、表达式 二、成行的字符 1. 反斜杠 2. 通配符 3. 编写正则表达式 4. 字符类 &#xff08;1&#xff09;字符的范围 &#xff08;2&#xff09;排除字符类 &#xff08;3&#xff09;POSIX 字符类补充 5. 重复出现的字符 6. 匹配单词 7. gres 替换脚本 8. …

2024-09-02 Ubuntu固定USB串口名(包括1拖N的USB串口)

在运行Ubuntu系统的开发板上,如果使用可插拔的USB串口,有时候程序正在运行时,如果突然连接传感器的USB串口设备被插拔了一下,这时,会发现系统中的USB串口名发生了改变。例如,插拔之前是/dev/ttyUSB0,插拔之后变成了/dev/ttyUSB3。发生这种情况的时候,有时候会导致程序无…

关于VUE3开发频繁引入ref,reactive,computed等基础函数。

利用unplugin-auto-import插件可以避免频繁引入ref&#xff0c;reactive&#xff0c;computed等基础函数。 1.安装unplugin-auto-import依赖 npm i -D unplugin-auto-import 2.在vite.config.ts中注入依赖 效果

关于主流电商平台|淘宝|拼多多|抖音|1688官方平台接口的接入和返回

taobao.trades.sold.get( 查询卖家已卖出的交 搜索当前会话用户作为卖家已卖出的交易数据&#xff08;只能获取到三个月以内的交易信息&#xff09; 1. 返回的数据结果是以订单的创建时间倒序排列的。 2. 返回的数据结果只包含了订单的部分数据&#xff0c;可通过taobao.trade…

代码随想录Day 32|leetcode题目:501.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯

提示&#xff1a;DDU&#xff0c;供自己复习使用。欢迎大家前来讨论~ 文章目录 动态规划理论基础一、理论基础1.1 什么是动态规划1.2 动态规划的解题步骤1.3 动态规划应该如何debug 二、题目题目一&#xff1a; 509. 斐波那契数解题思路&#xff1a;动态规划递归解法 题目二&a…

【golang-入门】环境配置、VSCode开发环境配置

golang介绍基础信息 windows环境配置安装包下载安装环境变量设置检查 VSCode开发配置插件配置在 Visual Studio Code 中安装通义灵码go hello word 参考资料 golang介绍 基础信息 golang官网&#xff1a;https://go.dev/golang学习网&#xff1a;https://studygolang.com/使用…

ARM基础知识---CPU---处理器

目录 一、ARM架构 1.1.RAM---随机存储器 1.2.ROM---只读存储器 1.3.flash---闪存存储器 1.4.时钟&#xff08;振晶&#xff09; 1.5.复位 二、CPU---ARM920T 2.1.R0~R12---通用寄存器 2.2.PC程序计数器 2.3.LR连接寄存器 2.4.SP栈指针寄存器 2.5.CPSR当前程序状态寄存…

测试:TestGRPCDiscovery

目录 测试:TestGRPCDiscovery 类定义 方法 async def asyncSetUp(self): async def asyncTearDown(self): async def test_discovery(self): 总结 这是一个关于算力共享中环形结构通讯机制的项目图的功能模型解释。以下是根据所给信息对项目功能的概述: 项目结构: 项…

Windows 下载安装RabbitMQ

环境描述 windows10 Erlang 26.2.x 版本 RabbitMQ 3.13.7 因为RabbitMQ是Erlang语言开发的&#xff0c;所以必须安装 Erlang RabbitMQ官网链接: https://www.rabbitmq.com/docs/which-erlang 1.下载并安装Erlang 26.2.5 1.1下载Erlang 26.2.5 https://erlang.org/dow…

深度强化学习算法(四)(附带MATLAB程序)

深度强化学习&#xff08;Deep Reinforcement Learning, DRL&#xff09;结合了深度学习和强化学习的优点&#xff0c;能够处理具有高维状态和动作空间的复杂任务。它的核心思想是利用深度神经网络来逼近强化学习中的策略函数和价值函数&#xff0c;从而提高学习能力和决策效率…

鸿誉移民:定制化移民服务,吹响全球高效率移民的嘹亮号角!

鸿誉移民&#xff1a;定制化移民服务&#xff0c;吹响全球高效率移民的嘹亮号角&#xff01; 作为国内知名海外移民服务机构&#xff0c;鸿誉移民历经多年行业沉淀&#xff0c;拥有着极其丰富的移民咨询以及移民办理经验&#xff0c;并以咨询及时精准&#xff0c;签证快捷、通…

【数据结构】Map的使用与注意事项

文章目录 概念模型Map 的使用put() 和 get()getOrDefault()remove()keySet()entrySet() 注意事项 概念 Map 和 set 是一种专门用来进行搜索的容器或者数据结构&#xff0c;其搜索的效率与其具体的实例化子类有关。 以前常见的搜索方式有&#xff1a; 直接遍历&#xff0c;时间…

URP简洁的instance的写法

材质还是要开启enable instance&#xff0c;这是上一次的写法 https://dbbh666.blog.csdn.net/article/details/136644181 最近发现更适合我个人的习惯的写法 就是代码控制这个整个过程 C#代码是这样的&#xff0c;获取一个mesh&#xff0c;获取每个mesh的transform&#xff0c…

常见的性能测试方法!

前言 性能测试划分有很多种&#xff0c;测试方法也有很多种&#xff0c;更确切的说是由于测试方法的不同决定了测试划分的情况&#xff0c;但在测试过程中性能测试的划分没有绝对的界限&#xff0c;常用的有压力测试、负载测试和并发用户测试等。 性能测试的方法主要包括以下…

stm32之硬件I2C读写MPU6050陀螺仪、加速度传感器应用案例

系列文章目录 1. stm32之I2C通信协议 2. stm32之软件I2C读写MPU6050陀螺仪、加速度传感器应用案例 3. stm32之I2C通信外设 文章目录 系列文章目录前言一、电路接线图二、应用案例代码三、应用案例分析3.1 基本思路3.2 相关库函数介绍3.3 MPU6050模块3.1.1 模块初始化3.1.2 指定…

52 mysql 启动过程中常见的相关报错信息

前言 我们这里主要是看一下 service mysql start, service mysql stop 的过程中的一些常见的错误问题 这些 也是之前经常碰到, 但是 每次都是 去搜索, 尝试 1, 2, 3, 4 去解决问题 但是 从来未曾思考过 这个问题到底是 怎么造成的 The server quit without updating PID fil…