「C言語」の「switch文」について紹介します。
「switch文」は一つの条件に対して複数の処理に分岐させたい時に使用します。
同じように条件分岐に使用される「if文」では変数や条件式を組み合わせた分岐に向いていますが、swich文では変数が複数の値を持つ場合の分岐に向いています。
1.基本的な書き方
基本的な書き方は次のようになります。
case 値1 : //条件=値1の時
プログラム1; //プログラム1を実行
break ;
case 値2 : //条件=値2の時
プログラム2; //プログラム2を実行
break ;
default: //条件が値1,2以外の時
プログラム3; //プログラム3を実行
break;
}
「switch文」は「条件」に式を設定して「case」に「値」を設定します。
「条件」に設定した式を評価した値が一致した「値」をもった「case」の「プログラム」が実行されます。
「case」に記入した「プログラム」の最後には「break」を実行し「swich文」を抜けます。
「default」にはどの「値」にも一致しなかった場合に実行する「プログラム」を記入します。
「default」は省略が可能でこの場合は何も実行せず「switch文」を終了します。
2.実践プログラム:フルカラーLEDの色を変化
安価で高機能なマイコンボード「ATOM LITE」本体のボタンを押すたびに本体のフルカラーLEDの色を「白→赤→緑→青」と変化させるプログラムで「switch文」の動作を確認してみましょう。
「ATOM LITE」については、以下のリンクで詳しく紹介しています。
下のコードを「コピペ」して書き込んでください。
※下コード(黒枠)内の右上角にある小さなアイコンのクリックでコピーできます。
#include <M5Atom.h> //Atomのヘッダファイルを準備
// FastLEDライブラリの設定(CRGB構造体)
CRGB dispColor(uint8_t r, uint8_t g, uint8_t b) {
return (CRGB)((r << 16) | (g << 8) | b);
}
// 変数宣言
int cnt = 0; //ボタンを押した回数カウント用
// 初期設定 -----------------------------------------------
void setup() {
// 本体初期化(UART有効, I2C無効, LED有効)
M5.begin(true, false, true);
Serial.begin(9600); //シリアル出力設定
}
// メイン -------------------------------------------------
void loop() {
M5.update(); //本体のボタン状態更新
// 本体ボタンを押した回数をカウント(4回目で0リセット)
if (M5.Btn.wasPressed()) { //ボタンが押されていたら
cnt++; //カウント用変数cnt + 1
if (cnt == 4) { //cntが4なら
cnt = 0; //cntを0リセット
}
Serial.printf("cnt = %d\n", cnt); //カウント値シリアル出力
}
// switch文
switch(cnt) { //cntのカウント数によって分岐
case 1: //cntが1なら
M5.dis.drawpix(0, dispColor(100, 0, 0)); //LED赤色点灯
break;
case 2: //cntが1なら
M5.dis.drawpix(0, dispColor(0, 100, 0)); //LED緑色点灯
break;
case 3: //cntが1なら
M5.dis.drawpix(0, dispColor(0, 0, 100)); //LED青色点灯
break;
default: //cntが1~3以外(0)なら
M5.dis.drawpix(0, dispColor(20, 20, 20)); //LED白色点灯
break;
}
delay(100); //100ms待機
}
28行目~42行目が「switch文」です。
まずは20行目から書かれているプログラムで、ボタンが押された回数をカウントします。(本体ボタン制御用関数「M5.Btn.wasPressed()」使用)
ボタンが4回押されると変数「cnt」を0にリセットするので「cnt」はボタンを押すたびに「1→2→3→0」の順で変化を繰り返します。
「cnt」のカウント数はシリアル出力で確認できます。
本体ボタン制御用関数、変数、シリアル出力については以下のリンクで詳しく紹介しています。
このカウント数「cnt」を「switch文」の「条件」として、カウント数が「条件の値」と一致した「case」内の「プログラム」が実行されます。
「case」には本体のフルカラーLEDの色を指定する「プログラム」が書かれていて、それぞれの色に点灯します。
この「プログラム」は「FastLED」ライブラリを使用したものです。
「FastLED」ライブラリについては以下のリンクで詳しく紹介しています。
3.「if文」との違い
「switch文」と同じように条件分岐に使用されるものに「if文」があります。
「switch文」のプログラムは「if文」のプログラムでも同じ動作をさせることができます。
「if文」については以下のリンクで詳しく紹介しています。
先ほどの「switch文」で作成したプログラムを「if文」に置き換えて動作確認してみましょう。
下のコードを「コピペ」して書き込んでください。
※コピーは下コード(黒枠)内の右上角にある小さなアイコンのクリックでもできます。
#include <M5Atom.h> //Atomのヘッダファイルを準備
// FastLEDライブラリの設定(CRGB構造体)
CRGB dispColor(uint8_t r, uint8_t g, uint8_t b) {
return (CRGB)((r << 16) | (g << 8) | b);
}
// 変数宣言
int cnt = 0; //ボタンを押した回数カウント用
// 初期設定 -----------------------------------------------
void setup() {
// 本体初期化(UART有効, I2C無効, LED有効)
M5.begin(true, false, true);
Serial.begin(9600); //シリアル出力設定
}
// メイン -------------------------------------------------
void loop() {
M5.update(); //本体のボタン状態更新
// 本体ボタンを押した回数をカウント(4回目で0リセット)
if (M5.Btn.wasPressed()) { //ボタンが押されていたら
cnt++; //カウント用変数cnt + 1
if (cnt == 4) { //cntが4なら
cnt = 0; //cntを0リセット
}
Serial.printf("cnt = %d\n", cnt); //カウント値シリアル出力
}
//if文
if(cnt == 1) { //CNTが1なら
M5.dis.drawpix(0, dispColor(100, 0, 0)); //LED赤色点灯
} else if(cnt == 2) { //CNTが2なら
M5.dis.drawpix(0, dispColor(0, 100, 0)); //LED緑色点灯
} else if(cnt == 3) { //CNTが3なら
M5.dis.drawpix(0, dispColor(0, 0, 100)); //LED青色点灯
} else { //cntが1~3以外(0)なら
M5.dis.drawpix(0, dispColor(20, 20, 20)); //LED白色点灯
}
delay(100); //100ms待機
}
28行目~37行目が「if文」です。
「if文」でも同じ動作をすることが確認できると思います。
「swich文」と「if文」の違いは何でしょうか?
同じ条件分岐を行うプログラムですので結果に変わりはありません、処理速度についてはプログラムによって多少の差は出てきますが大きな差にはなりません。
大きな違いは、プログラムの書きやすさ、読みやすさ、理解のしやすさにあります。
複数条件の分岐を行う場合「if文」では「else if」と「条件」を何度も書く必要がありますが「swich」文では「case」ごとに「条件の値」だけを記入するだけで済み、変数が複数の値を持つ場合の分岐に向いています。
一方「if文」では「プログラム」ごとに「条件」を書いていくため、変数や条件式を組み合わせた分岐を行う場合に理解しやすくなります。
4.ブラウザ上で動作確認するならpaiza.IO
ちょっとした動作確認をしたい時は、ブラウザ上でプログラムを作成して実行できる「paiza.IO」が便利なので以下にリンクを貼っておきます。
無料で使用できて「C言語」だけでなく「python」や「JavaScript」「PHP」等たくさんの言語にも対応しています。
プログラミングの上達には学ぶことも大切ですが、自分で書いて実行して、どんな動きになるか、間違っててもいいのでこれをひたすら繰り返すことが一番の近道と思います。たくさん書いて実行してみましょう。
5.まとめ
「C言語」の「switch文」の使い方について紹介しました。
「switch文」は一つの条件に対して複数の処理に分岐させたい時に使用します。
「if文」は変数や条件式を組み合わせた分岐に向いていますが、「swich文」は変数が複数の値を持つ場合の分岐に向いています。
「switch文」の理解には実際に作成したプログラムを動かして、目で見て確認すると理解が早いです。
これには安価で高機能なマイコンボード「ATOM LITE」が手軽でおすすめです。
本体内蔵のボタンとフルカラーLEDでいろいろな動作プログラムを作成して、理解を深めましょう。
同じ条件分岐の「if文」との使い分けには迷うところですが、基本的にどちらを使用しても同じ動作を実現することができます。
後から編集する時や、他の人が見て理解しやすいか等を意識して使い分けましょう。
動かして学ぶ「C言語」については、他にも以下のリンクで基礎からサンプルプログラムを使って詳しく紹介しています。
6.独学に限界を感じたら
最後に、独学に限界を感じている方へ、私のように無駄な時間を過ごさないように「C言語」や「Python」を基礎から学べるオンラインスクール(教室での受講も可)の紹介です。
私は学生の頃、独学で「C言語」を始めましたが、かなり時間をかけて結局一度挫折しました(汗)
仕事で少しプログラミングに触れる機会もあり、今となっては小規模なプログラムなら組めますが、どれだけ時間をかけたでしょう・・・
短期間で基礎から学べて質問もできる、そんな環境が当時あったらと思うと・・・
今はとても羨ましい時代になりました。
いろいろなプログラミングスクールのサイトを見て回りましたが「C言語」と「Python」の両方を扱っている所は少ないです。その中でも以下のスクールは他の言語も含めて、たくさんの講座から目的やスキルに合ったものを組合わせて、オンラインでも対面でも受講が可能です。
ほとんどの受講生が未経験で、全国に教室があるため現地で直接指導してくれますが多くの講座がオンライン対応です。
オンラインでは「個人レッスン(講師一人につき3名程)」と「集合レッスン」の選択も可能です。
オンラインレッスンの方には授業で使用するノートPC(ソフトインストール済み)も追加料金なしで貸りられて、質問掲示板を使って授業時間外でも質問できます。
無料体験もあり、説明会やカウンセリング等も行っています。
以下のリンクから内容だけでも確認してみてください。
コメント