嵌入式0基础开始学习 ⅠC语言(4)循环结构
0.问题引入
求0~100数据之和:
int sum = 0;
sum = 1+2+3+4+....+100;
废手,那么有没有一种好的方法取操作呢?
int sum = 0;
int i =1;
sum = sum +i; // sum = 0+1;
i = i+1 ; // i = 2;
sum = sum +i ;
i = i + 1;
将上面的那两行代码重复执行100次,
那么0~100和就出来了!
循环!!!
循环的本质==>重复!!!
所有重复的代码,都可以用循环来实现。
在c语言中,能达到循环效果的语句
(1)for语句
(2)while语句
(3)do....while语句
(4)goto 和 if 构成循环
1. goto语句
goto “去哪儿”
goto:无条件跳转
让cpu到指定的地方去执行
语句:
goto 行标识符:
行标识符:
标识符,用来表示某一行。
写在一行的最前面,不需要顶格,可以有空白符
如:想办法让计算机重复执行如下两条语句
sum = sum +i ;
i = i + 1;
loop :
sum = sum +i ;
i = i + 1;
goto loop;
像上面的这个语句块,可以实现循环效果,重复执行“sum = sum +i ; i = i + 1;”
但是上面语句块,构成了一个死循环。
所以说,goto语句 一般需要和if语句配合使用,避免造成“死循环”
如:想办法让计算机重复执行如下两条语句100次
sum = sum +i ;
i = i + 1;
int sum = 0;
int i = 1;
loop:
sum = sum+i;
i = i +1;
if(i<=100)//循环次数在100之内
{
goto loop;
}
练习:请各位大佬,写一个程序,求100以内3的倍数之和(用goto语句实现)//3,6,9,12
#include <stdio.h>
int main()
{
int sum = 0;
int i = 3;
loop:
sum = sum +i;
i = i+3
if(i<=99)
{
goto loop;
}
printf("%d\n",sum);
}
NOTE:
建议要限制使用goto,
并不是goto语句有问题,但是使用goto语句的人有问题
建议不使用goto!!!
2.while语句
语法:
while(表达式)
循环体语句;
执行顺序:
当(while)“表达式”的值为非0,则执行“循环体语句”,执行完循环体语句之后
再跳转到上面继续判断“表达式”的值;
......
当(while)”表达式“的值为0,结束循环
表达式: C语言中任意合法表达式都OBJK
语句:
单语句:只有一个;号的语句
复合语句:
{}/if/switch/while....
例子:
int i = 1;
int sum = 0;
while(i<=100)
sum = sum +i;
i = i+1;
上面的这个while,只能够管到 “sum = sum +i;” 这一行语句,表达式的值一直为真
所以上面是一个“死循环”,因为i的值,一直为1,“表达式”的值一直为1(永远为真)
so:
不管while后面有没有语句,先打一对{},以确定while循环的管辖范围
练习:
用while循环来实现:逆序输出一个非负数的各个位上面的数字。
12345
54321
S1: 定义一个整型变量,从键盘赋值
int a;
scanf("%d",&a);
S2:输出a的个位上的数字
geiwe = a%10;
printf("%d",gewei);
s3:然后干掉个位
a = a/10;
s4:回到s2,知道当a为0结束循环
上面的程序,能不能用do...while来实现?
int a;
scanf("%d",&a);
do
{
//输出个位上的数字
geiwe = a%10;
printf("%d",gewei);
a = a/10;
}while(a!=0);
3.do....while
语法:
do
{
循环体语句;
}
while(表达式);
执行顺序:
先执行“循环体语句”,然后再判断“表达式的值”,如果表达式的值为非0
则回到上面,继续执行“循环体语句”;
....
直到“表达式”的值为0,结束循环
例子:求1-100之和
int i = 1;
int sum = 0;
do
sum += i;
i++;
while(i<=100);
"sum += i;
i++;" 这两行代码既不是单语句,也不是复合语句。
导致do没有和它匹配while,编译出错!!!
建议:不管do后面有没有语句,先打一对{}!!!
练习:
求n!(n是用户输入的一个正整数)
n! = 1*2*3*...*(n-1)*n
int n;
scanf("%d",&n);
int i = 1;//变量累加
int s = 1;//保存n!
s =s*i ;//s = 1*1
i++ ; // i = 2
s = s*i; // s = 1*2
i++;// i = 3
.....
重复语句
do
{
s = s*i;
i++;
}
while(i<=n);
c语言代码;
int n;
scanf("%d",&n);
int i = 1;//变量累加
int s = 1;//保存n!
do
{
s = s*i;
i++;
}
while(i<=n);
printf("%d",s);
4.for循环
语法:
for(表达式1;表达式2;表达式3)
循环体语句;
执行顺序:先执行表达式1,然后再判断表达式2的值,如果为非0,则执行循环体语句,然后再跳到上面执行
再执行表达式3;
然后再判断表达式2的值;
....
直到表达式2的值为0,结束循环
表达式1;表达式2;表达式3:
任意表达式都可以
并且“表达式1;表达式2;表达式3”都可以省略,但是两个;
是不能省略的!!!!
如果表达式2省略,则表示for循环的执行条件永远为真。
for(表达式1;;表达式3)
循环体语句;
====》
for(表达式1;1;表达式3)
循环体语句;
例子:求1~100
int sum = 0;
int i;
for(i=1;i<=100;i++);// i=101
sum = sum +i;//sum = 0+101
printf("%d\n",sum);//101
没有语法问题!!!
for循环中的“循环体语句”如果没有{},那么for语句它只能管到一个;!!!!
so:
不管这个for后面有没有语句,先打一对{}
for(;;)
{
}
练习:
1.打印所有的“水仙花数”(100-999)
水仙花数: 是一个三位数,并且这个三位数的个位,十位,百位上的数字的
立方和等于其本身。
如:
149 != 1*1*1 +4*4*4 +9*9*9
思路;
x为一个三位数
a,b,c分别为x的个位,十位,百位
x = 100
a = x%10
b = x/10%10
c = x/100
if(a*a*a+b*b*b+c*c*c)
{
printf x
}
x++
a = x%10
b = x/10%10
c = x/100
if(a*a*a+b*b*b+c*c*c==x)
{
printf x
}
.....
c语言代码:
int x,a,b,c;
for(x=100;x<1000;x++)
{
a = x%10;
b = x/10%10;
c = x/100;
if(a*a*a + b*b*b + c*c*c ==x)
{
printf("%d\n",x);
}
}
153,370,371,407
2.判断一个整数是否为质数
质数:除了1和它本身之外,没有其他的因数,称之为质数
伪代码;
i =>[2,x-1]
scanf x
i= 2
x%i == 0?
i++
x%i == 0?
i++
x%i == 0?
int i,x;
scanf("%d";&x);
int flag = 0; // 0 -是质数
// 1 -不是质数
for(i=2;i<x;i++)
{
if(x%i==0)
{
flag =1;
break;
}
}
if(flag==0)
{
printf("shi");
}
else
{
printf("bushi");
}
5.break 和 continue
break:
break 语句只能用在switch语句和循环体语句(while/for...)中,
(1)break用在switch中,用来跳出它所属的switch语句
(2)break用在循环体中,用来跳出它所属的那一个循环的。
一句话 break“跳出”
switch或循环体,是不是一定要用到break?
不一定,看您的心情!!!
continue:
continue只能用在循环体中(while/for...)中,
表示结束本次循环,继续下一次循环!!!1
例子:
输出如下数组元素值,除了值为5的那一个元素
int a[10] ={1,2,3,4,5,6,7,8,9,10};
int i;
for(i=0;i<10;i++)
{
if(a[i]==5) //i == 4
{
continue;
}
printf("%d\n",a[i]);
}
练习:
1. 求1000以内所有的完数
完数:是指除了本身以外所有的因子之和等于其本身
如:
6:1 2 3
6 == 1+2+3
分析:
1~1000
满足:它的因子之和(除去本身)等于它本身(1~x/2)
2:
1 !=2
3: 1 !=3
...
x= 1
if x所有的因子之和 == x
printf x
x++
x = 2
if x所有因子之和 == x
printf x
x++
=》
int x,i,sum;
for(x=2;x<1000;x++)//2~1000 的数
{
sum = 0;
for(i=1;i<=x/2;i++) //i:因子 范围[1,x/2]
{
if(x%i==0)
{
sum += i;//sum = sum +i
}
}
if(sum==x)
{
printf("%d\n",x);
}
}
2.求两个整数m,n 最大公约数,最小公倍数(m,n是从键盘输入的数字)
最小公倍数 = m*n/最大公约数
最大公约数:
m %l ==0
n %l ==0
l是m,n的一个公约数
设g是为m,n的最大公约数。
g=>[1,min(m,n)]
满足:m%g==0 && n%g==0
从(m,n)中最小的那一个数开始找
x = min(m,n);
if x是不是m,n 的一个公约数
则x就是最大公约数
x--
....
for(x=min(m,n);x>0;x--)
{
if(m%x==0&&n%x==0)
{
x就是最大公约数
break;
}
}
回顾:
1.goto .....if...
goto 无条件跳转指令
2.while 语句
while (表达式)
循环体语句;
3.do....while
do
{
循环体语句;
}
while(表达式);
4.for 语句
for(表达式1;表达式2;表达式3)
循环体语句;
执行顺序:
5.break 和 contiune
练习:
1. 请大家输入自己的生日(y-m-d),求自己在这个世界上浪费了多少天的公粮!!!
1.你出生的那一天到那一年的年末还有多少天
switch(m)
{
case 1:
d1 += 31;
case 2:
if(y是闰年)
d1 += 29;
else
d1 +=28;
case 3:
.....
}
d1= d1 -d;
2.你出生的第二年年初---2022年年末一共多少天
for(i=y+1;i<year-1;i++)
{
if(i是不是闰年)
d2 +=366;
else
d2 +=365;
}
3.2023已经过了多少天
2.求Sn = a + aa +aaa +...+....(n个a)
其中,n,a都是由用户输入
a =>[0,9]
如:
n = 5, a=2
Sn = 2+22+222+2222+22222
求和:
求第ai项
累加
sum + ai ->sum
例子:a = 2;
n = 5;
ai = 0;
Sn = 2 + 22+222+2222+22222;
i = 0
ai = ai*10+a
sum+=ai;
i = 1
ai = ai*10+a;
sum +=ai;
for(i=0;i<n;i++)
{
ai = ai*10+a;
sum += ai;
}
3.求10000000!末尾有多好个0
只要有一对2*5 末尾就会产生一个0
将1*2*3*.....*10000000进行质因数分解
只需要求分解质因数之和5的个数即可
int count =0; //记录末尾的0的个数
for(x=5;x<10000000;x+=5)
{
int i = x;
while(i%5==0)
{
count++;
i = i/5;
}
}
4.1024的655次方最后三位数是多少?
p = 1;
for(n = 1;n<=655;n++)
{
p= p*1024;
p = p%1000;
}
5,下面程序的功能是把316表示为两个加数的和,使两个加数分别能被13和11整除,请选择填空
(C)
#include<stido.h>
main()
{
int i=0,j,k;
do{i++;k=316-13*i;}while(__);
j=k/11;
printf("316=13*%d+11*%d",i,j);
}
A,k%11==0 B,k/11
C,k%11 D,k/11==0
6,设j和i都是int型,则以下for循环语句(B)
for(j=0,k=-1;k=1;j++,k++)
printf("****\n");
A,循环体一次也不执行
B,是无限循环
C,循环结束的条件不合法
D,循环体只执行一次
7有以下程序段
int n=0,p;
do
{
scanf("%d",&p);
n++;
}while(p!=12345&&n<3);
此处do-while循环结束的条件为?
(p的值等于12345或者n的值大于等于3)
8,以下叙述正确的是?(C)
A,用do-while构成循环时,只有在while后的表达式为非0时结束循环
B,do-while语句构成的循环不能用其他语句构成的循环来代替
C,用do-while构成循环时,只有在while后的表达式为零时结束循环
D,do-while语句构成的循环只能用break语句推出
9,以下程序的输出结果是?(10)
int k,j,s;
for(k=2;k<6;k++,k++)
{
s=1;
for(j=k;j<6;j++)
s+=j;
}
printf("%d\n",s);
10,以下程序段中,能够正确执行循环的是(B)
A,static int a;while(a)
B,int s=6;do s-=2;while(s);
C,for(i=1;i>10;i++)
D,int s=6;m:if(s<100) exit(0); else s-=2; goto m;
11,以下程序中,while循环的循环次数是(死循环,不确定次数)
main()
{
int i=0;
while(i<10)
{
if(i<1) continue;
if(i==5) break;
i++;
}
}
12,以下程序段的输出结果是?(1 -2)
int x=3;
do
{
printf("%3d",x-=2);
}while(!(--x));
13,下面程序的运行结果是?(0)
#include <stido.h>
main()
{
int y=10;
do{y--;}while(--y);
printf("%d\n",y--);
}
14,下面程序段的输出结果是? (11)
int i=0,sum=1;
do
{
sum+=i++;
}while(i<5);
printf("%d\n",sum);
15,有以下程序段:
s=1.0;
for(k=1;k<=n;k++)
s=s+1.0/(k*(k+1));
printf("%f\n",s);
请填空,使下面的程序段的功能完全与之等同,
s=0.0;
d=1.0;
k=0;
do
{
s+=d;
____;
d=(1.0)/(k*(k+1));
}while(____);
printf("%f\n",s);
(k++ k<=n)
16,下列程序的功能是输入一个整数,判断其是否为素数,如果为素数输出1,否则输出0,请填空
main()
{
int i,x,y=1;
scanf("%d",&x);
for(i=2;i<___;i++)
{
if(___){y=0;break;}
}
printf("%d\n",y);
}
(x/2 x%i==0)
17,执行以下程序后的输出结果是?(5,4,6)
{
int a,b,c,d,i,j,k;
a=10;b=c=d=5;i=j=k=0;
for(;a>b;++b)
i++;
while(a>++c)
j++;
do
k++;
while(a>d++);
printf("%d,%d,%d",i,j,k);
}
18,如果一次输入字符AB,在以下while语句执行后ch的值是?(0)
while(ch=getchar()=='A');
相关文章:
嵌入式0基础开始学习 ⅠC语言(4)循环结构
0.问题引入 求0~100数据之和: int sum 0; sum 1234....100; 废手,那么有没有一种好的方法取操作呢? int sum 0; int i 1; sum sum i; // sum 01; …...

【JAVASE】抽象类
1、抽象类概念 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。比如: 说明&a…...

嵌入式硬件中PCB走线与过孔的电流承载能力分析
简介 使用FR4敷铜板PCBA上各个器件之间的电气连接是通过其各层敷着的铜箔走线和过孔来实现的。 由于不同产品、不同模块电流大小不同,为实现各个功能,设计人员需要知道所设计的走线和过孔能否承载相应的电流,以实现产品的功能,防止过流时产品烧毁。 文中介绍设计和测试FR4敷…...

动态规划之背包问题中如何确定遍历顺序的问题-组合or排列?
关于如何确定遍历顺序 322. 零钱兑换中,本题求钱币最小个数,那么钱币有顺序和没有顺序都可以,都不影响钱币的最小个数。 所以本题并不强调集合是组合还是排列。 如果求组合数就是外层for循环遍历物品,内层for遍历背包。 如果求…...

开源大模型与闭源大模型
概述 开源大模型和闭源大模型是两种常见的大模型类型,它们在以下方面存在差异: 开放性: 开源大模型:代码和模型结构是公开可用的,任何人都可以访问、修改和使用。闭源大模型:模型的代码和结构是私有的&…...

python+selenium - UI自动框架之封装查找元素
单一的元素定位方法不能满足所有元素的定位,可以根据每个元素的特点来找到合适的方法,可以参考下图的方法: elementFind.py from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_con…...

java 拦截器-用户无操作超时退出利用Redis
1、授权过滤,只要实现AuthConfigAdapter接口 2、利用Redis token超时时间,用户访问后台续时 效果 Component public class AuthFilter implements Filter {private static Logger logger LoggerFactory.getLogger(AuthFilter.class);Autowiredprivat…...

民国漫画杂志《时代漫画》第16期.PDF
时代漫画16.PDF: https://url03.ctfile.com/f/1779803-1248612470-6a05f0?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络!...
线程池以及日志类的实现
目录 线程池: 日志类: 可变参数以及相关函数 1.va_list 2. va_start 3. va_end 日志Log类 线程池 线程池: 是一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着 监督管理者分配可并发执行…...

基于长短期记忆网络 LSTM 的送餐时间预测
前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对…...

K-means聚类算法详细介绍
目录 🍉简介 🍈K-means聚类模型详解 🍈K-means聚类的基本原理 🍈K-means聚类的算法步骤 🍈K-means聚类的优缺点 🍍优点 🍍缺点 🍈K-means聚类的应用场景 🍈K-mea…...

SAP FS00如何导出会计总账科目表
输入T-code : S_ALR_87012333 根据‘FS00’中找到的总账科目,进行筛选执行 点击左上角的列表菜单,选择‘电子表格’导出即可...

ROS参数服务器
一、介绍 参数服务器是用于存储和检索参数的分布式多机器人配置系统,它允许节点动态地获取参数值。 在ROS中,参数服务器是一种用于存储和检索参数的分布式多机器人配置系统。它允许节点动态地获取参数值,并提供了一种方便的方式来管理和共享配…...
QCC---DFU升级变更设备名和地址
QCC---DFU升级变更设备名和地址 这个很多人碰到这个疑问,升级了改不了设备名和地址 /******************************************************************************* Copyright (c) 2018 Qualcomm Technologies International, Ltd. FILE NAME sink_dfu_ps.c DESCRIPT…...
[力扣题解] 695. 岛屿的最大面积
题目:695. 岛屿的最大面积 思路 代码 深度优先搜索 // 深度搜索 class Solution { private:int area_max 0;int dir[4][2] {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};void dfs(vector<vector<int>>& grid, vector<vector<bool>>& …...
AI模型发展路径探析:开源与闭源,何者更胜一筹?
AI模型发展路径探析:开源与闭源,何者更胜一筹? 在当今快速发展的人工智能领域,AI模型成为推动技术创新和应用落地的关键。而评价一个AI模型“好不好”“有没有发展”,往往会引向一个重要话题:开源与闭源这…...

concurrency 并行编程
Goroutine go语言的魅力所在,高并发。 线程是操作系统调度的一种执行路径,用于在处理器执行我们在函数中编写的代码。一个进程从一个线程开始,即主线程,当该线程终止时,进程终止。这是因为主线程是应用程序的原点。然后…...
JavaScript如何让一个按钮的点击事件在完成之前禁用
在JavaScript中,要禁用一个按钮的点击事件直到某个操作完成,你可以将其点击事件用匿名函数的方式书写。 你可以将其在点击函数内设置为null来禁用按钮。 <button id"butto_n">点击抽奖</button><script>butto_n.onclick bu…...

透视App投放效果,Xinstall助力精准分析,让每一分投入都物超所值!
在移动互联网时代,App的推广与投放成为了每一个开发者和广告主必须面对的问题。然而,如何精准地掌握投放效果,让每一分投入都物超所值,却是一个令人头疼的难题。今天,我们就来谈谈如何通过Xinstall这个专业的App全渠道…...

【Linux杂货铺】进程通信
目录 🌈 前言🌈 📁 通信概念 📁 通信发展阶段 📁 通信方式 📁 管道(匿名管道) 📂 接口 编辑📂 使用fork来共享通道 📂 管道读写规则 &…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...

Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...