【C语言】循环语句详解
✨个人主页: Anmia.
🎉所属专栏: C Language🎃操作环境: Visual Studio 2019 版本

目录
1.什么是循环结构?
2.while循环
while流程图
while语句中的break和continue
break
continue
3.for循环
for流程图
for循环中的break和continue
break
continue
for语句的循环控制变量
一些for循环的变种
do...while()循环
do...while()循环流程图
do...while对比while,for有什么特殊?
do while循环中的break和continue
break
continue
练习
练习1
练习2
练习3
练习4
练习5
练习6
后言
1.什么是循环结构?
用顺序结构和选择结构可以解决简单的,不重复的问题,但在日常生活中或者是在应用程序中,许多问题是需要反复处理执行的。
- 问题1:分别统计全班50个学生的平均成绩。
- 问题2:求30个整数的和。
要处理以上问题,最原始的方法是分别编写若干个相同或者相似的语句或者程序段来进行处理,这种方法工作量大,程序长,重复,难以阅读和维护。
循环结构又称为重复结构,利用循环结构可以方便的处理这种需要重复处理的问题。大多数应用程序都是包含循环结构。
C语言给我们提供了三种循环语句:
- while
- do...while
- for
2.while循环
我们已经掌握了,if语句:
if(条件)语句;当条件满足的情况下,if语句后的语句执行,否则不执行。
但是这个语句只会执行一次。
由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。
那我们怎么做呢?
C语言中给我们引入了: while 语句,可以实现循环。while(表达式) 循环语句;
while流程图

比如我们实现:
在屏幕上打印1-10的数字。#include <stdio.h> int main() {int i = 1;while(i<=10){printf("%d ", i);i = i+1;}return 0; }以 i 作为是否执行while循环的条件,我们此时i =1 满足 i<=10 这个循环条件,所以加入whilex循环。先打印1,然后i+1变成2,2再和循环条件i<=10进行判断,满足则继续执行循环体,直到i=11不满足i<=10,退出循环体,结束循环。运行结果如下
上面的代码已经帮我了解了 while 语句的基本语法,那我们再了解一下:
while语句中的break和continue
break
#include <stdio.h>
int main()
{int i = 1;while(i<=10){if(i == 5)break;printf("%d ", i);i = i+1;}return 0;
}
这里的输出结果是什么?
答案如图。
看运行结果不难看出,在i 加到5时,在进行if循环判断时,if条件成立,执行break语句。直接跳出了当前的while循环,不再执行后面的循环语句。
通过之前学习的switch中的break,似乎效果一致,即跳出当前的循环语句/switch语句。
- 总结:
- break在while循环中的作用:
- 其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
- 所以:while中的break是用于永久终止循环的。
continue
#include <stdio.h>
int main()
{int i = 1;while(i<=10){i = i+1;if(i == 5)continue;printf("%d ", i);}return 0;
}
这段代码的运行结果又是什么呢?
答案如图。
看运行结果不难看出,进入循环i先+1后打印,所以没有打印1。当i+1=5时进入if中的语句,执行continue,我们发现没打印5,但是打印了后面的6 7 8 9 10 11。
- 没打印5的原因:因为continue是结束本次循环后面的语句,因此在Continue执行后,后面的printf被跳过了,直接跳回到i=i+1,继续循环往复。
- 打印了11的原因:因为i=10仍然是满足条件i<=10后还会执行循环体。
- 总结:
- continue在while循环中的作用就是:
- continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,
- 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
下面再看两段代码,分别是什么意思?
#include <stdio.h>
int main()
{int ch = 0;while ((ch = getchar()) != EOF)putchar(ch);return 0;
}
getchar() - 获取(输入)一个字符
getchar 读取字符成功时,返回字符的ASCLL码值
读取失败时 或者 遇到文件末尾时就返回EOFwindows环境Ctrl + z getchar返回 EOF
详细见:
【C语言】EOF搭配while循环来控制scanf输入的次数_Anmia.的博客-CSDN博客
#include <stdio.h>
int main()
{char ch = '\0';while ((ch = getchar()) != EOF){if (ch < ‘0’ || ch > ‘9’)continue;putchar(ch);}return 0;
}
这个代码的作用是:只打印数字字符,跳过其他字符的。
3.for循环
我们已经知道了while循环,但是我们为什么还要一个for循环呢?
首先来看看for循环的语法:for(表达式1; 表达式2; 表达式3)循环语句;
- 表达式1:为初始化部分,用于初始化循环变量的。
- 表达式2:为条件判断部分,用于判断循环时候终止。
- 表达式3:为调整部分,用于循环条件的调整。
例子1:
使用for循环 在屏幕上打印1-10的数字。
#include <stdio.h>
int main()
{int i = 0;//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)for(i=1; i<=10; i++){printf("%d ", i);}return 0;
}
for流程图

现在我们对比一下for循环和while循环。
//实现相同的功能,使用while
int i = 0;
i=1;//初始化部分
while(i<=10)//判断部分
{printf("hehe\n");i = i+1;//调整部分
}//实现相同的功能,使用for
for(i=1; i<=10; i++)
{printf("hehe\n");
}
可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较
远,这样
查找修改就不够集中和方便。所以,for循环的风格更胜一筹;for循环使用的频率也最高。
for循环中的break和continue
break
我们发现在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。
但是还是有些差异:
#include <stdio.h>
int main()
{int i = 0;for(i=1; i<=10; i++){if(i == 5)break;printf("%d ",i);}return 0;
}
continue
#include <stdio.h>
int main()
{int i = 0;for(i=1; i<=10; i++){if(i == 5)continue;printf("%d ",i);}return 0;
}
通过和while的代码对比,相信不难区分它们的写法
for语句的循环控制变量
建议:
1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}//两边都是闭区间
for(i=0; i<=9; i++)
{}
一些for循环的变种
#include <stdio.h>
int main()
{for (;;){printf("hehe\n");}
}
for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问题。
这里打印多少个hehe?
#include <stdio.h>
int main()
{int i = 0;int j = 0;for (i = 0; i < 10; i++){for (j = 0; j < 10; j++){printf("hehe\n");}}return 0;
}
答案是100个,这种形式是for的嵌套。
代码逻辑:
i=0--> i<10成立进入外层for --> j=0 --> j<10成立进入内层for -->打印hehe\n --> j++后 j=2 --> j<10成立继续循环........直到 j=10,j<10不成立跳出内层for---> i++后i=2 --> i<10成立再次进入外层for......直到i=10,j<10不成立跳出外层for,for嵌套结束。
- 简单点看
无非就是满足for循环条件就进入循环,只是外层for循环体中又有一个内层for而已。
如果省略掉初始化部分,这里打印多少个hehe?
#include <stdio.h>
int main()
{int i = 0;int j = 0;for (; i < 10; i++){for (; j < 10; j++){printf("hehe\n");}}return 0;
}
答案是10个,对比上一题,为什么少打印了那么多?主要问题出现在内层初始化部分被省略了,当j++第一次到j=10内层条件不满足,跳出内层循环到i++,i=2时i<10是满足的,会执行外层for的循环体,可是问题就是j之前已经++到10了,内层for有没有初始化部分,会直接检查条件部分是否满足,但j此时是10了,就j<10这个条件就不满足了,因此不会再执行内层for循环。
使用多余一个变量控制循环
int x, y;for (x = 0, y = 0; x<2 && y<5; ++x, y++){printf("hehe\n");}
例题1:
请问下面循环要循环多少次?
#include <stdio.h>
int main()
{int i = 0;int k = 0;for (i = 0, k = 0; k = 0; i++, k++){k++;}return 0;
}
答案是0次,代码中存在一个错误的循环条件,导致循环无法正常终止。在循环条件
k = 0中,应该使用相等运算符==而不是赋值运算符=。
do...while()循环
- 语法如下:
do {循环语句; }while(表达式);
do...while()循环流程图

do...while对比while,for有什么特殊?
循环至少执行一次,使用的场景有限,所以不是经常使用。以下是代码案例。
#include <stdio.h>
int main()
{int i = 10;do{printf("%d\n", i);}while(i<10);return 0;
}
do while循环中的break和continue
break
#include <stdio.h>
int main()
{int i = 10;do{if (5 == i)break;printf("%d\n", i);} while (i < 10);return 0;
}
以上代码,单看i=10肯定是不满足i<10这个循环条件的,但由于do...while循环的特性,它不论循环条件是否成立,都会先执行一次循环体再进行判断。所以上面代码结果是只输出了10。
continue
那这段代码的结果呢?
#include <stdio.h>
int main()
{int i = 10;do{if (5 == i)continue;printf("%d\n", i);} while (i < 10);return 0;
}
答案也是只输出一个10,原因同上。
练习
练习1
计算 n的阶乘。
#include <stdio.h>int main() {int n;unsigned long long factorial = 1;printf("请输入一个非负整数:");scanf("%d", &n);if (n < 0) {printf("输入的数必须是非负整数。\n");}else {for (int i = 1; i <= n; i++) {factorial *= i;}printf("%d 的阶乘是 %llu\n", n, factorial);}return 0;
}
练习2
计算n的阶乘和。
#include <stdio.h>int main() {int n;unsigned long long factorialSum = 0;printf("请输入一个非负整数:");scanf("%d", &n);if (n < 0) {printf("输入的数必须是非负整数。\n");}else {for (int i = 1; i <= n; ++i) {unsigned long long factorial = 1;for (int j = 1; j <= i; ++j) {factorial *= j;}factorialSum += factorial;}printf("从1到%d的阶乘和是 %llu\n", n, factorialSum);}return 0; }
这段代码首先要求用户输入一个非负整数,并将其存储在变量
n中。然后,使用两个嵌套的for循环来计算从 1 到n的所有整数的阶乘,并将每个阶乘的结果累加到factorialSum变量中。最后,使用printf函数将结果输出到屏幕上。
练习3
用二分查找在一个有序数组中查找具体的某个数字n
int main() {int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);int left = 0;//左下标int right = sz - 1;//右下标int num = 0;int flag = 0;scanf("%d", &num);while (left <= right){int mid = (left + right) / 2;//(左下标+右下标)/2if (arr[mid] < num){left = mid + 1;}else if (arr[mid] > num){right = mid - 1;}else{printf("找到了,数字%d的下标是:%d\n", num, mid);flag = 1;break;}}if (flag == 0){printf("没找到!");}return 0; }
这段代码使用二分查找算法在给定的有序数组中查找一个特定的数字。
首先,定义一个整型数组
arr,并初始化为{1,2,3,4,5,6,7,8,9,10}。然后,计算数组的大小sz,即数组中元素的个数。接下来,定义两个变量
left和right分别表示数组的左下标和右下标。初始时,left设为 0,right设为sz - 1。然后,通过用户输入获取一个数字
num。接下来,使用一个循环来执行二分查找。循环条件是
left <= right,即左下标小于等于右下标。在每次循环中,计算中间下标mid,即(left + right) / 2。然后,根据中间元素的值与目标数字
num的大小关系,更新左下标和右下标。如果中间元素小于num,则将左下标left更新为mid + 1;如果中间元素大于num,则将右下标right更新为mid - 1。如果中间元素等于
num,则找到了目标数字,输出找到的消息,并将标志变量flag设为 1,然后使用break语句跳出循环。如果循环结束后
flag仍为 0,表示未找到目标数字,输出未找到的消息。最后,返回 0 表示程序执行完毕。
这段代码适用于在有序数组中查找特定数字的场景。如果数组是无序的,二分查找算法将不适用,需要使用其他查找算法。
练习4
编写代码,演示多个字符从两端移动,向中间汇聚
#include <string.h> #include <windows.h> int main() {char arr1[] = "Hello World!!!";char arr2[] = "**************";int left = 0;//左下标int right = strlen(arr2) - 1;//右下标//-1是因为数组下标从0开始while (left <= right){arr2[left] = arr1[left];arr2[right] = arr1[right];printf("%s\n", arr2);Sleep(1000);//等待一秒system("cls");//清空屏幕left++;right--;}printf("%s\n", arr2);printf("%d\n", strlen(arr2));return 0; }
这段代码使用两个字符数组
arr1和arr2来模拟一个动态变化的字符串效果。首先,定义一个字符数组
arr1并初始化为 "Hello World!!!",定义另一个字符数组arr2并初始化为 "**************",长度与arr1相同。接下来,定义两个变量
left和right分别表示arr2的左下标和右下标。初始时,left设为 0,right设为strlen(arr2) - 1,其中strlen(arr2)函数用于获取arr2的长度。然后,使用一个循环来依次将
arr1中的字符赋值给arr2对应位置的字符,并在每次循环中输出arr2的内容。为了实现动态效果,使用Sleep函数暂停一秒钟,然后使用system("cls")函数清空屏幕。循环结束后,输出最终的
arr2的内容和长度。最后,返回 0 表示程序执行完毕。
这段代码的目的是实现一个字符动画效果,将
arr1中的字符逐渐替换arr2中的字符,并在每次替换后输出arr2的内容。通过循环中的延时和清空屏幕操作,实现了字符动态变化的效果。
练习5
编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成功,如果三次均输入错误,则退出程序。
#include <string.h> #include <windows.h> int main() {int i;char password[20] = { 0 };for (i = 0; i < 3; i++){printf("请输入密码:>");scanf("%s", password);if (strcmp(password, "123456") == 0){printf("密码正确!\n");break;}else{printf("密码错误!\n");Sleep(1000);system("cls");}}if (i == 3){printf("三次输入错误,登录失败!");}return 0; }
这段代码实现了一个简单的密码验证功能。
首先,定义一个整型变量
i,用于记录密码输入的次数。然后,定义一个字符数组
password,长度为 20,并初始化为全零。接下来,使用一个
for循环,循环次数为 3,表示最多允许输入密码三次。在每次循环中,使用
printf函数提示用户输入密码,并使用scanf函数获取用户输入的密码,并将其存储在password数组中然后,使用
strcmp函数将用户输入的密码与预设的密码 "123456" 进行比较。如果两个密码相等,即返回值为 0,表示密码正确,输出密码正确的消息,并使用break语句跳出循环。如果密码不正确,则输出密码错误的消息,使用
Sleep函数暂停一秒钟,然后使用system("cls")函数清空屏幕,以便下一次输入密码。循环结束后,判断变量
i的值是否等于 3。如果等于 3,表示密码输入错误的次数已达到上限,输出登录失败的消息。最后,返回 0 表示程序执行完毕。
这段代码的目的是实现一个简单的密码验证功能。用户可以最多输入三次密码,如果密码输入正确,则输出密码正确的消息并登录成功;如果密码输入错误,则输出密码错误的消息,并在每次错误后暂停一秒钟并清空屏幕,以便重新输入密码。如果连续三次输入都错误,则输出登录失败的消息。
练习6
猜数字游戏实现
#include <stdlib.h>//rand 和 srand需要
#include <time.h> //time需要
void menu()
{printf("********************\n");printf("**** 1. play ****\n");printf("**** 0. exit ****\n");printf("********************\n");
}
void game()
{//1. 生成1-100随机数//rand函数,生成的是伪随机数,范围是0-RAND_MAX(32767);//rand函数需要用srand函数来设置随机数生成器int ret = rand() % 100 + 1;//%100-->(0~99) +1 -->(1~100) //2. 猜数字int guess = 0;while (1){printf("请猜数字:>");scanf("%d", &guess);if (guess < ret){printf("猜小了!\n");}else if(guess > ret){printf("猜大了!\n");}else{printf("猜对了!\n");break;}}}
int main()
{srand((unsigned int)time(NULL));//unsigned int 是因为srand函数的参数需要,所以要强制类型转化//NULL是因为time函数参数需要一个指针变量,所以我们可以用空指针代替。int input = 0;do{menu();printf("请输入:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,请重新输入!\n");break;}} while (input);return 0;
}
这段代码实现了一个猜数字游戏。游戏开始时,会显示一个菜单,让玩家选择是否开始游戏或退出游戏。
在
game()函数中,首先使用rand()函数生成一个 1 到 100 之间的随机数,并将其赋值给变量ret。然后,使用一个
while循环,让玩家不断输入猜测的数字,直到猜对为止。在每次循环中,玩家输入猜测的数字,并与随机数
ret进行比较。如果猜测的数字小于
ret,则输出 "猜小了"。如果猜测的数字大于
ret,则输出 "猜大了"。如果猜测的数字等于
ret,则输出 "猜对了",并使用break语句跳出循环。在
main()函数中,使用srand()函数设置随机数生成器的种子,以确保每次运行程序时生成的随机数不同。然后,使用一个
do-while循环,显示菜单并根据玩家的选择执行相应的操作。如果玩家输入的是 1,则调用game()函数开始游戏;如果玩家输入的是 0,则输出 "退出游戏" 并结束循环;如果玩家输入的是其他数字,则输出 "输入错误,请重新输入"。循环条件是
input,当玩家输入 0 时,循环结束。最后,返回 0 表示程序执行完毕。
这段代码的目的是实现一个简单的猜数字游戏。玩家根据提示输入猜测的数字,通过与随机生成的数字进行比较,判断猜测的数字是大了、小了还是猜对了,并给出相应的提示。玩家可以选择继续游戏或退出游戏。
后言
本篇较为详细的将了循环语句中的重点,以及6道测试题检测学习情况,对后面学习可以起到一定的理解帮助。希望可以得到支持,后面会持续输出各项详解。
相关文章:
【C语言】循环语句详解
✨个人主页: Anmia.🎉所属专栏: C Language 🎃操作环境: Visual Studio 2019 版本 目录 1.什么是循环结构? 2.while循环 while流程图 while语句中的break和continue break continue 3.for循环 for流…...
SpringBoot项目配置文件数据库用户名密码加密
1、需求 在使用SpringBoot开发过程中,会将一些敏感信息配置到SpringBoot项目的配置文件中(不考虑使用配置中心的情况 ),例如数据库的用户名和密码、Redis的密码等。为了保证敏感信息的安全,我们需要将此类数据进行加密配置。 2、操作步骤 …...
5个IT事件管理的最佳实践
什么是IT事件? IT事件是一个影响很大的紧急问题,通常会影响整个组织或其主要部分。重大事件几乎总是导致组织的服务变得不可用,这导致组织的业务受到打击,并最终影响其财务状况。以下是5个重大IT事件管理的最佳实践: …...
双核和双路服务器的区别
服务器术语里,大家经常会听到1U、2U,单路、双路,机架式、塔式及刀片式等常用名词。其中,机架式、塔式及刀片式是 指服务器的外形,U是指服务器的高度,路是指服务器的处理器数量。 部分朋友会问,我…...
学习JAVA打卡第四十七天
日期的格式化 程序可能希望按照某种习惯来输出时间。例如时间的顺序:年/月/日或年/月/日/时/分/秒。可以直接使用String类调用format方法对日期进行格式化。 Format方法 Format方法: format(格式化模式,日期列表) 按照“格式…...
Exploring Unreal Engine New Free Archviz Explorer Project 视频笔记
链接: https://www.bilibili.com/video/BV1Q34y1Z7he/ 场景中没有太阳,也没有定向光 该蓝图用来控制光线的显示 删除这个蓝图 添加这个蓝图 顶部会出现时间滑块 该项目还有扩展插件,用户可以自由下载 它是由一个8k的卫星图做的地形底图 …...
Python|爬虫和测试|selenium框架的安装和初步使用(一)
前言: Python作为一门胶水语言来说,可以说是十分的优秀,什么事情都可以干,并且在某些领域还能干的非常不错,尤其是在爬虫和测试领域,该语言可以说是没有对手。 这么说的原因是因为如果你要使用爬虫爬取某…...
SAP FI之定义财务年和财务年度变式(Fiscal Year Variants)
目录 前言 一、财务年度/财务年度变式 二、使用步骤 1.配置步骤 前言 本文主要介绍SAP会计年度和SAP会计年度变式。 一、财务年度/财务年度变式 财务年度可以具有与日历年相同的期间,也可以不同。中国财政年度从1月到12月,称为历年制,有…...
关于SAM中decomposed Relative Positional Embeddings的理解
关于SAM中decomposed Relative Positional Embeddings的理解。 relative positional embedding的一种实现方式是:先计算q和k的相对位置坐标,然后依据相对位置坐标从给定的table中取值。以q和k都是77为例,每个相对位置有两个索引对应x和y两个…...
1、Spring是什么?
Spring 是一款主流的 Java EE 轻量级开源框架 。 框架 你可以理解为是一个程序的半成品,它帮我们实现了一部分功能,用这个框架我们可以减少代码的实现和功能的开发。 开源 也就是说,它开放源代码。通过源代码,你可以看到它是如何…...
【华为OD机试python】阿里巴巴找黄金宝箱(IV)【2023 B卷|200分】
题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地, 藏宝地有编号从0-N的箱子,每个箱子上面有一个数字,箱子排列成一个环, 编号最大的箱子的下一个是编号为0的箱子。 请输出每个箱子贴的数字之后的第一个比它大的数,如果不存在则输出-1。 输入…...
操作系统复习总结5
操作系统复习总结,仅供笔者复习使用,参考教材: 《操作系统原理》 - 何静媛编著. 西安电子科技大学出版社《操作系统考研复习指导》2024年 - 王道论坛组编. 电子工业出版社 本文主要内容为:输入输出管理; 计算机系统…...
【LeetCode】406.根据身高重建队列
题目 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造并返回输入数组…...
渗透测试漏洞原理之---【任意文件包含漏洞】
文章目录 1、文件包含概述1.1 文件包含语句1.1.1、相关配置 1.2、动态包含1.2.1、示例代码1.2.2、本地文件包含1.2.3、远程文件包含 1.3、漏洞原理1.3.1、特点 2、文件包含攻防2.1、利用方法2.1.1、包含图片木马2.1.2、读取敏感文件2.1.3、读取PHP文件源码2.1.4、执行PHP命令2.…...
day28 异常
to{}catch{} try{}catch{}的流传输 try {fis new FileInputStream("file-APP\\fos.txt");fos new FileOutputStream("fos.txt");int a ;while ((a fis.read())! -1){fos.write(a);}System.out.println(a); } catch (IOException e) {e.printStackTrace()…...
Pico使用C/C++选择使用哪个I2C控制器,以及SDA和SCL针脚
本文一开始讲述了解决方案,后面是我做的笔记,用来讲述我的发现流程和探究的 Pico I2C 代码结构。 前提知识 首先要说明一点:Pico 有两个 I2C,也就是两套 SDA 和 SCL。这点你可以在针脚图中名字看出,比如下图的 Pin 4…...
C++动态内存管理
动态内存 在C/C程序中(线程)栈空间是有限的,大部分变量使用的都是动态分配来的堆内存,这些动态申请来的堆内存是需要开发者通过代码去自行管理的。如何管理好这些动态申请来的内存,是C/C开发中的一个重点难点问题。 m…...
SpringBoot—日志
目录 日志使用日志日志级别设置日志级别设置分组指定日志文件路径日志切割归档使用第三方日志框架log4j2配置文件【分级存储】logback配置文件【分级存储】 实例代码 日志 使用日志 给controller添加日志信息 要给controller类上添加Slf4j注解,然后使用log.info(…...
如何在,Linux中安装Luajit2.*
1.文件下载The LuaJIT Project 2.将下载文件上传到对应的服务器:例如/opt 3.进入对应的文件夹 4.make PREFIX/usr/local,设置安装路径 5.make install,编译安装 6.进入安装目录,cd /usr/local/include/luajit-2.0 7.luajit -v…...
单片机-如何让数码管动态显示
数码管硬件图 1、数码管 连接 74HC245 芯片 单片机IO口输出难稳定,需要数码管与单片机连接需要增加驱动电路, 使用 74HC245 abcdefgDP并联导出 74HC245 对数码管进行驱动,P0 是输出电流 来驱动各个段的 驱动芯片 增加电阻 是为了防止电流…...
cursor接入外部大模型教程!新手必看
一、接入前准备 在开始之前,请先登录你的大模型平台,这里使用 我自用的举例官网地址,创建并复制你的 API Key。 这里添加令牌,有名称和分组,简单举例,填入名称 cursor-claude, 一个key只能选一…...
MoE推理加速全栈优化,从模型切分到KV Cache共享,实测吞吐提升3.8倍,你还在用稠密LLM?
更多请点击: https://codechina.net 第一章:DeepSeek MoE架构解析 DeepSeek MoE(Mixture of Experts)模型通过动态路由机制在推理时仅激活部分专家子网络,显著提升计算效率与模型容量的平衡能力。其核心设计在于将前馈…...
CST仿真效率翻倍:手把手教你设置激励与优化器,搞定天线阵列参数优化
CST仿真效率翻倍:手把手教你设置激励与优化器,搞定天线阵列参数优化 天线阵列设计是射频工程师的日常挑战之一。当你在CST中完成基础建模后,真正的考验才刚刚开始——如何高效配置激励、选择合适的优化器,并快速获得准确的仿真结果…...
推荐几款实测有效的降重工具,要求同时对付查重系统和AIGC检测
毕业季论文两大 “生死关”—— 知网 / 维普 / 格子达等查重标红、AIGC 疑似率超标,已成为无数学生的噩梦。普通降重工具仅能降重复率,改写后仍难逃 AI 检测;AI 写作工具生成内容流畅度高,却自带明显 AI 痕迹,双检极易…...
嵌入式LCD与RTC驱动实战:从时序模拟到系统整合
1. 项目概述:当LCD遇见RTC,一个经典嵌入式显示方案的深度剖析最近在整理一个老项目的资料,翻出来一个挺有意思的模块:用一块字符型LCD屏,搭配一颗实时时钟芯片,实现一个带时间显示的简易信息板。这个组合—…...
从无人机云台到机械臂关节:聊聊FOC力矩控制在机器人里的那些实战坑
从无人机云台到机械臂关节:FOC力矩控制在机器人中的实战精要 当无人机云台在强风中依然保持画面稳定,当机械臂关节能够感知鸡蛋壳的脆弱并精准施力——这些看似简单的动作背后,都离不开一项关键技术:磁场定向控制(FOC&…...
终极指南:如何在Windows电脑上安装APK文件,告别臃肿安卓模拟器!
终极指南:如何在Windows电脑上安装APK文件,告别臃肿安卓模拟器! 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想在Wind…...
技术赋能:BilibiliDown如何用智能解析引擎重塑视频下载工作流
技术赋能:BilibiliDown如何用智能解析引擎重塑视频下载工作流 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mi…...
用数据校准方向,让实习招聘更有章法
为什么盲目投流不如精准的搜索曝光? 在校招实习的日常招募中,HR常常面临一个困惑:明明岗位薪资和公司平台都不错,为什么搜索量和投递量却迟迟上不去?这往往是因为在信息密度极高的春招季,企业的校招信息被…...
别再死记硬背了!用‘IP地址与运算’这个技巧,5分钟搞懂子网掩码和网络地址
子网掩码实战:5分钟掌握IP与运算的核心技巧 网络工程师面试时总会被问到"如何快速计算网络地址",而很多初学者面对子网掩码和IP地址的二进制转换就头疼不已。其实有个被大多数教材忽略的技巧——IP地址主机位置零法,能让你不用完整…...


答案如图。
答案如图。