[Day8] IoT Maker之Coding知识科普 - (缩排&条件逻辑判断)

1.前言

在各式各样的程序语言中,都有属於自己的语系,像是Arduino就偏向於C语言,而每种语言都有许於各自的语法,但是熟悉了一款语言的基本,就可以令自己在学习下款语言时更加便利,毕竟程序语言(Programming language)的基本概念都大同小异,而转到别的语言时就只需要知道些许不同的语法怎麽写,就能够轻松上手了,因为你懂了基本架构,後面的变化就相对容易。

这些应该在前面那张讲齁,但我忘了(笑,没关系各位,下一个也是我忘记讲的,我自己自首。

2.区块(block) & 缩排

认识区块跟良好的缩排都是必学的,我所说的区块就是左右大夸号{}的内容部分、而在打开Arduino IDE预设就是最为乾净的初始画面,而这边也要多说明,当你出现 { 那就会有对应它的 },所以{}、()及[]都是一组,成双成对,如果你给它们分开,它们会生气,就不给你执行程序了 。

void setup(){
    //setup如名称所说,就是设定一些脚位状态及一些设定,但只跑一次
}
void loop(){
    //loop如名称所说,loop会一直重复执行
}

当没区块时,缩排就是成功与失败的关键,像是Python属於没区块,但是缩排却是很关键,当你一段程序码放错位置,产出结果可能就大大不同,但不管是打Arduino或是Python,都是需要保持良好的缩排,因为良好的缩排可以让除了自己以外的人,更好观看及更看得清楚程序结构,才比较方便修改错误,而如果没有缩排别人则会看不懂这是什麽,还可能需要花时间帮你做缩排的作栋,可读性较差,下面以上次教学的呼吸灯程序码作范例。

const int ledPin = 23;  // Esp32 23脚 
const int freq = 5000;       //频率
const int ledChannel = 0;    //通道
const int resolution = 8;    //每次多少

void setup(){
ledcSetup(ledChannel, freq, resolution);  //设定哪个通道开始多久依次每次多少
ledcAttachPin(ledPin, ledChannel);        //设定脚位和通道
}
void loop(){
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){  
ledcWrite(ledChannel, dutyCycle);       //由通道控制暗到亮
delay(15);
}
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
ledcWrite(ledChannel, dutyCycle);       //由通道控制亮到暗
delay(15);
}
}

看完这个例子有没有觉得很痛苦,根本不知道{}哪个是对应哪个,所以记得要缩排,保持习惯,尤其是这还算是短短几行的程序码,如果遇到上千行甚至上万行的程序码,那该会是何种恐怖景象,不想了,一想到就觉得可怕,那继续讲下去罗。

3.算数运算子?比对运算子?

算数运算子?比对运算子?这些都是什麽?接下来就带大家探讨何谓是算数运算子及比较运算子的不同之处。

算数运算子就像是程序中看见的=、+、-、*、/、%(mod),这六种都是对数值进行计算,下面简单介绍几个例子。

int a = 5;  //=将右方值带入左方,将5这数值装至a变数中
int b = 10; //=将右方值带入左方,将10这数值装至b变数中
int c = a+b; //c = 15
Serial.println(a+b); //+为加法,则输出为15
Serial.println(a-b); //-为减法,输出为-5
Serial.println(a*b); //*为乘法,输出为50
Serial.println(a/b); ///为除法(只看商),输出为0
Serial.println(a%b); //%为取余数,输出为5

※有些程序语言会把%(取余数)的写法转成mod,但只是写法改变,功能相同。

比对运算子就是比较左右方的数值是否是相符的,a是否等於b,如果今天a=15,b=15,那比对结果就会为真(true),如果a=15、b=20,那比对结果为假(false),各位可能都稍微对比对运算子有所概念,那下面就直接进范例,各位可以稍微猜一下每个范例的比对运算子是什麽。

int a=15;
int b=15;
Serial.println(a==b); //a是否等於b    
Serial.println(a>=b); //a是否大於等於b 
Serial.println(a>b);  //a是否大於b     
Serial.println(a<=b); //a是否小於等於b
Serial.println(a<b);  //a是否小於b
Serial.println(a!=b); //a是否不等於b

答案为

a == b:true
a >= b:true
a > b :false
a <= b:true
a < b:false
a != b:false

那看了上述范例,是否各位都明白比对运算子的用途了呢?那就继续往回圈走罗~

4.for回圈

for(initialization;condition;increment)
initialization 定义初始值,例如int i=0,或者i = 0等等。
condition 条件判断,例如i<=255,所以只要当i小於且等於255就会持续执行for里面的指令,反之则离开回圈继续向下执行。
increment 间距,当执行完一次指令时该将i值增加多少,例如初始值设i=0,间距设i+=2则跑完一次回圈则i会增加2,所以i=2。

//递增
int i = 0;
for(i;i<=255;i+=2){
    Serial.println(i);//i值会0 2 4 6 8 10的递增,直到条件不符合
}
//递减
i = 256;    //可忽略,因上方回圈执行完後i值会至256
for(i;i>=0;i--){
    Serial.println(i);//i值会255 254 253 252的递减,直到条件不符合
}
//另种写法,在for里面定义初始值
for(int j=1;i<=10;j++){
    Serial.println(j);//j值会1 2 3 4 5 6的递增
}

5.if判断

接下来接续到if判断,那说到if那可能有些人会想把英文转成中文说法,所以把if转成中文就变成如果,说到如果呢,许多人可能就会想到小时候都会用如果来造样造句,像是:如果我今天中乐透,就会环游世界,没有就继续上班上课,相信这是许多人都会经历过的,那写程序也是如此,透过空闲之余多打点程序,相信程序也会变成造样造句一样简单,接下来就继续往下走罗Go~。
if判断,就像上面有提到一样,就是造样造句,如果我今天中乐透就环游世界,没有就继续上班上课。那这样大家都完成一个属於自己的判断式了,为甚麽呢?各位可以看看下面那张图。

各位看到上面的例子应该会想,啊我不是说完一句了,为甚麽多出没有(else),这又是甚麽,各位先别慌张,等等跟你们说那是虾米碗糕(什麽东西),现在看如果 我今天中乐透,就环游世界,这部分先看就好,下面的部分等等在说明,那接下来开始真正介绍if判断式怎麽写。

if(condition){
code...
}
condition 条件式,将想比对的值放入比较,就可为条件式,范例:a==b,这就是个条件式。

if(a==b){
    //程序码...
}

实际写出来:if(a == b) ...,就会变成这样,那如果套用上面的,if(我买的乐透号码==乐透开奖号码),这样是不是就把中乐透这句话改成if的判断式了,那如果各位理解那我们继续下一个。

那如果我今天条件不成立呢?假设我没中乐透,因为上面那种写法只会判断我一定有中的情况及中奖後续状况,但却没说明如果没中奖该怎麽办,也就是说,没中奖就继续上班上课,这句话还没被翻译出来,所以接下来要讲解到else(否则),那我先讲语句。

if(condition)
else

if(我买的乐透号码==乐透开奖号码){
    //世界旅游
}
else{
    //上班上课
}

那会发现else怎麽後面跟if後面不同,if後面还需要条件式,那else会什麽後面空空如也?这就牵扯到我刚刚有稍微提到的了,else被称做否则,请问各位有听过有人讲话一直讲如果xxx就xxx否则就xxx否则就xxx的吗?一堆否则,都不知道他在讲什麽了,所以呢看到else出现就会知道,他就是if的最终结尾了,所以呢if不一定要有else,但else定需要搭配if,那现在在回去看上面的图就看得懂了吧,那就代表各位都学会了if的用法,恭喜各位٩(๑❛ᴗ❛๑)۶。

但是,接下来继续讲解if的另一种用法。是不是都以为我讲完if了阿 ლ(`∀´ლ)。

现在要讲的是if的多重判断式,那我就先介绍写法啦~

if(condition)
else if(condition)
else

if(我买的乐透号码==乐透头奖号码){
    //中乐透後程序码
}
else if(我的发票号码==发票六奖号码){
    //买饼乾吃
}
else{
    //上班上课
}

看来上面的范例,各位应该都会明白else if的用法,那就是增加if的条件,可以多新增判断语句,去判断更多事情,但这边也需要注意如果你第一个条件式成立,那他就不会继续向下跑,也就是说当你乐透中奖去环游世界时,就不会触发到中了发票六奖吃饼乾的事件。

欢迎交流

好了,希望今天透过这些有趣的比较可以让各位更清楚了解到,条件式、回圈及判断的关系是如何。原本是安排2天的基础科普知识,不过每个人背景不太一样,一下子讲太多怕各位会脑袋装不下,因此明天会继续Coding知识科普,来说说另一种的回圈、判断及一些简化写法的介绍,为後续的实作案例打好基础,那就下回见啦( ̄▽ ̄)~*。


<<:  Day4:Coroutine 的四大特点

>>:  Day1-妈耶! 跨界跨一个太大会不会坏掉QQ

抓取资料库数据 - SQL基础语法(中)

上次我们已经学会要怎麽从资料库依照各个表取出我们想要的栏位,也可以透过条件筛选的方式过滤我们想要的资...

如何快速复制 (clone) 20 TB SQL Server 资料库 - 心得分享

DBA Bootcamp 几个月前,Business Intelligence 部门跑来跟 DBA ...

用 Line LIFF APP 实现信箱验证绑定功能(4) - 表单验证电子邮件地址

前几天完成了一个简单发送认证码的 LIFF APP,其实还有很多可以优化的地方,像是在送出 Requ...

D16: 工程师太师了: 第8.5话

工程师太师了: 第8话 杂记: 额温枪就是侦测额头散发红外线推算体温的温度计。 任何物体在高於绝对零...

[Day29] Vue3 - 事件绑定

在 Javascript 中会用 onclick, onchange...等方式监听 DOM 物件,...