嵌入式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来共享通道 📂 管道读写规则 &…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...