ラベル 制御文 の投稿を表示しています。 すべての投稿を表示
ラベル 制御文 の投稿を表示しています。 すべての投稿を表示

goto

プログラムの流れを、ラベルのついたポイントへ移します。

[構文]

 label :
 goto label ;  //ラベルの位置からプログラムの実行を続けます。

[tips]
Cプログラミングでgotoを使う事は勧められていません。
C言語の本の著者のなかには、goto文は全く不要であるとする人もいます。
多くのプログラマがgotoの使用に対して眉をひそめるのは、
流れが読み取れないプログラムになりがちだからです。
そうしたプログラムはデバッグ出来ません。

しかし分別ある使い方をするならば、
gotoはプログラムを扱いやすくシンプルにしてくれます。
例えば、深くネストしたループやブロックから、
ある条件で抜け出したいときに有効です。

[例]
3重のforループからgotoを使って抜け出す例です。
for(byte r = 0; r < 255; r++){
    for(byte g = 255; g > -1; g--){
        for(byte b = 0; b < 255; b++){
            if (analogRead(0) > 250){ goto bailout;}
            // 処理
        }
    }
}
bailout:

return

関数の実行を中止して、呼び出し元の関数に処理を戻します。

[構文]
return;
return 値;

[例]
センサからの読みが閾値を超えていたら1を、越えていなかったら0を返す関数です。


 int checkSensor(){       
    if (analogRead(0) > 400) {
       } return 1;
    else{
        return 0;
    }
}

return文は「コメントアウト」を使わずにコードの一部をテストするときにも便利です。

continue

continue文は、for・while・doなどのループの途中で
処理をスキップしたい時に使います。
ループは止めずに、繰り返し条件判定に移ります。

[例]
41から119までをのぞく範囲でPWMを変化させます。

for (x = 0; x <= 255; x++) {
 if (x > 40 && x <120) {
 continue;
}
analogWrite(PWMpin, x);
delay(50);
}   

break

break文は、for・while・doなどのループから、
通常の条件判定をバイパスして抜け出すときに使います。
switch文においても使われます。

[例]
PWM出力を変化させるループの中で、センサーの値が閾値を越えたら処理を中断します。

for (x = 0; x <= 255; x++) {
 analogWrite(pwmpin, x);
 sens = analogread(sensorPin);
 if (sens > threshold) {      //閾値を超えたか?
  x = 0;
  break;
 }
 delay(50);
}

do while

do文はwhile文と同じ方法で使えますが、
条件のテストがループの最後に行われる点が異なります。
これは、do文の場合必ず1回はループ内の処理が実行されることを意味します。

[構文]

do {
          //実行される文
} while (条件式)


[例]
センサからの値が100以上になるまで待ちます。

do {
 delay(50);  //センサが安定するまで停止
x = readSensors();
} while (x < 100)

while

whileは繰り返しの処理に使います。
カッコ内の式がfalseになるまで、処理は無限に繰り返されます。
条件式で使われる変数は、whileループの中で値を加えるとかセンサの値を読むといった
処理により変化する必要があります。
そうしないとループから抜け出す事は出来ません。 

[構文]
while(条件式){    
         //実行される文
}

[例]
単純な繰り返しの例です。

val = 0;
while(var < 200){
 var++;       //この部分が繰り返される
}

for


for文は波カッコに囲まれたブロックを繰り返し実行されます。
様々な繰り返し処理に活用でき、データやピンの配列と組み合わせて
使われる事があります。

for文のヘッダは3つの部分から成り立っています。

for (初期化; 条件式; 加算 ) {   
               //実行される文
}

まず初期化が一度だけ行われます。
処理が繰り返されるたびに条件式がテストされ、
trueならば加算と波カッコ内の処理がされます。
falseならばそこでループは終了します。

[例]
LEDを明滅させるサンプル。
forループの中で、PWMのパラメータを0から255まで1

int PWMpin = 10; // LED in series with 470 ohm resistor on pin 10

void setup()   //初期化不要
{
  
}

void loop()
{
   for (int i=0; i <= 255; i++){
      analogWrite(PWMpin, i);
      delay(10);
   } 
}

switch case


switch case文はif文と同じようにプログラムの制御に使われ
場合分けの記述に適しています。
switch() で指定された変数が、それぞれのcaseと一致するかテストされ
一致したcaseの文が実行されます。

[例]
変数valがテストしたい変数です。その値がどれかのcaseに一致すると
それに続く文が実行されます。
default:はどのcaseにも一致しなかった時に実行されます。
処理が終わったら、breakを使ってswitch文から抜け出す必要があります。
breakがないと、そのまま続けて次のcaseが実行されてしまいます。

  switch (var) {
    case 1:      // valが1のとき実行される
      break;
    case 2:        // valが2のとき実行される
      break;
    default:       //  どのcaseにも一致しなかったとき実行される(defaultは省略可能)
              
  }


if else

if elseを使うと複数のテストをまとめる事ができ、
単体のif文より高度な制御が可能となります。

次の例は、アナログ入力の値が500より小さいときと500以下のときに分けて
それぞれ別の動作を行うものです。


if (pinFiveInput < 500)
{
  // action A
}
else
{
  // action B
}

elseに続けてif文を書く事で、さらに複数のテストを書く事が出来ます。


if (pinFiveInput < 500)
{
  // do Thing A
}
else if (pinFiveInput >= 1000)
{
  // do Thing B
}
else
{
  // do Thing C
}
trueとなるif文にぶつかるまで、テストは続きます。
trueとなったif文の波カッコ内が実行されると、そのif else文全体が終了します。
trueとなるif文が一つもない場合は、(ifのついていない)else文が実行されます。
if elseを使った分岐は好きなだけ繰り返してかまいません。
似た事を実現する別の方法として、switch case文があります。

if

if文は与えられた条件が満たされているかどうかをテストします。

例えば次のif文は、変数 someVariable が 50 より大きいかをテストし、
大きければ続く文を実行します。


 if (someVariable > 50) {     //条件を満たした時に実行される文


 }


別の言い方をすると、カッコ内の条件がtrueのとき、波カッコ{}内の分が実行されます。
条件が満たされていない(trueでない)とき、
波カッコ内の文は実行されず次の処理に移ります。

if文のあとの波カッコは省略される事があります。
その場合はif文の次におかれた1つの文だけが実行されます。
以下の3つの書き方はどれも同じ動作です。

 if (x > 120) digitalwrite(LEDpin, HIGH);

 if (x > 120)
  digitalwrite(LEDpin, HIGH);

 if (x > 120) { digitalwrite(LEDpin, HIGH); }


カッコ内の条件式では、1つあるいは複数の演算子(オペレータ)が使われます。

[演算子の例]
 x == y
 x!= y
 x < y
 x > y
 x <= y
 x >= y