動かして学ぶC言語「switch文(複数条件分岐)」の使い方を基本から詳しく紹介

C言語:switch複数条件分岐の使い方

「C言語」の「switch文」について紹介します。

「switch文」は一つの条件に対して複数の処理に分岐させたい時に使用します。
同じように条件分岐に使用される「if文」では変数や条件式を組み合わせた分岐に向いていますが、swich文では変数が複数の値を持つ場合の分岐に向いています。

スポンサーリンク

1.基本的な書き方

基本的な書き方は次のようになります。

switch ( 条件) {
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文」を終了します。

break」を記入しない場合はその下の「プログラム」が実行されていくので、これを利用したプログラムも作成することもできます。
スポンサーリンク

2.実践プログラム:フルカラーLEDの色を変化

安価で高機能なマイコンボード「ATOM LITE」本体のボタンを押すたびに本体のフルカラーLEDの色を「白→赤→緑→青」と変化させるプログラムで「switch文」の動作を確認してみましょう。

「ATOM LITE」については、以下のリンクで詳しく紹介しています。

ATOM LITE プログラミング初心者におすすめ超小型で高機能!
マイコンボードはRaspberry Pi、Arduino、M5Stack等がありますが、一通りやってみてそれぞれの良さはあるものの「最初に何を?」と聞かれたら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」のカウント数はシリアル出力で確認できます。

本体ボタン制御用関数、変数、シリアル出力については以下のリンクで詳しく紹介しています。

M5Stack 本体ボタンの使い方、ボタン操作関数一覧(Arduinoプログラミング)
M5Stackシリーズの本体ボタンは Arduino のコマンドで簡単に制御できます。「Lチカ」のサンプルプログラムを使用して紹介しますので用途に応じて使い分けられるようになりましょう♪
動かして学ぶC言語「変数」について、正しく学ぶならC言語が一番
「変数」とはプログラム内のデータを保存しておくために使用します。 データを入れておく箱のようなもので、一時的にデータを入れておき、必要な時に取り出して使用したり、取り出して加工(演算等)してから元に戻して、また必要な時に使用したりします。
シリアル(UART)出力で内部データの表示(Arduinoプログラミング)
シリアル出力モニタとはプログラム内の値やデータをパソコンのモニタ上に表示させることができる機能で、ほとんどの開発環境にこの機能があります。表示だけではなく出力したデータを記録して保存したり、機器間でデータをやり取りする時にも使用されます。

このカウント数「cnt」を「switch文」の「条件」として、カウント数が「条件の値」と一致した「case」内の「プログラム」が実行されます。

case」には本体のフルカラーLEDの色を指定する「プログラム」が書かれていて、それぞれの色に点灯します。
この「プログラム」は「FastLED」ライブラリを使用したものです。

「FastLED」ライブラリについては以下のリンクで詳しく紹介しています。

定番の Lチカ!(ATOM LITE編)で遊びながら自然と身につくプログラミング
プログラミング初心者ならとりあえず「Lチカ」やりましょう!LEDを点灯、消灯(チカチカ)させるものです。サンプルプログラムをコピペでとりあえず動作確認。LEDの色は数値を変えるだけ。いろいろ試して遊びながら学びましょう♪
スポンサーリンク

3.「if文」との違い

switch文」と同じように条件分岐に使用されるものに「if文」があります。
switch文」のプログラムは「if文」のプログラムでも同じ動作をさせることができます。

if文」については以下のリンクで詳しく紹介しています。

動かして学ぶC言語「if文(条件分岐)」の使い方を基本から詳しく紹介
「C言語」の「if文」について紹介します。「if文」は条件によって実行するプログラムを分岐させたい時に使用します。 基本の書き方や使い方を「Lチカ」プログラムで実際に動かしながら楽しく学びましょう♪

先ほどの「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文」では「プログラム」ごとに「条件」を書いていくため、変数や条件式を組み合わせた分岐を行う場合に理解しやすくなります。

swich文」と「if文」はどちらを使用しても結果に大きな差は出ませんが、後から編集する時や、他の人が見て理解しやすいか等を意識して使い分けましょう。

4.ブラウザ上で動作確認するならpaiza.IO

ちょっとした動作確認をしたい時は、ブラウザ上でプログラムを作成して実行できる「paiza.IO」が便利なので以下にリンクを貼っておきます。
無料で使用できて「C言語」だけでなく「python」や「JavaScript」「PHP」等たくさんの言語にも対応しています。

ブラウザでプログラミング・実行ができる「オンライン実行環境」| paiza.IO
paiza.IOはオンラインですぐにプログラミングが始められる、オンライン実行環境です。Java,Ruby,Python,PHP,Perlなど主要32言語に対応。プログラミング学習にも。

プログラミングの上達には学ぶことも大切ですが、自分で書いて実行して、どんな動きになるか、間違っててもいいのでこれをひたすら繰り返すことが一番の近道と思います。たくさん書いて実行してみましょう。

5.まとめ

「C言語」の「switch文」の使い方について紹介しました。

「switch文」は一つの条件に対して複数の処理に分岐させたい時に使用します。
「if文」は変数や条件式を組み合わせた分岐に向いていますが、「swich文」は変数が複数の値を持つ場合の分岐に向いています。

「switch文」の理解には実際に作成したプログラムを動かして、目で見て確認すると理解が早いです。
これには安価で高機能なマイコンボード「ATOM LITE」が手軽でおすすめです。

本体内蔵のボタンとフルカラーLEDでいろいろな動作プログラムを作成して、理解を深めましょう。

同じ条件分岐の「if文」との使い分けには迷うところですが、基本的にどちらを使用しても同じ動作を実現することができます。
後から編集する時や、他の人が見て理解しやすいか等を意識して使い分けましょう。

「if文」では条件の評価結果が「真(0以外)」か「偽(0)」の分岐しかできませんが、「switch文」では条件の評価結果(1,2,3・・・等)によって複数の分岐を行うことができます。(「swich文」の「条件」の評価結果は整数型である必要があります。)

動かして学ぶ「C言語」については、他にも以下のリンクで基礎からサンプルプログラムを使って詳しく紹介しています。

C言語プログラミングの記事一覧
C言語のプログラミング記事一覧です。安価なマイコンボードを使用して動かしながら学んでみましょう♪ プログラム例を使って、コピペで書き込み、動作確認しながら少しづつ理解を深めましょう。

6.独学に限界を感じたら

最後に、独学に限界を感じている方へ、私のように無駄な時間を過ごさないように「C言語」や「Python」を基礎から学べるオンラインスクール(教室での受講も可)の紹介です。

私は学生の頃、独学で「C言語」を始めましたが、かなり時間をかけて結局一度挫折しました(汗)
仕事で少しプログラミングに触れる機会もあり、今となっては小規模なプログラムなら組めますが、どれだけ時間をかけたでしょう・・・

短期間で基礎から学べて質問もできる、そんな環境が当時あったらと思うと・・・
今はとても羨ましい時代になりました。


いろいろなプログラミングスクールのサイトを見て回りましたが「C言語」と「Python」の両方を扱っている所は少ないです。その中でも以下のスクールは他の言語も含めて、たくさんの講座から目的やスキルに合ったものを組合わせて、オンラインでも対面でも受講が可能です。

ほとんどの受講生が未経験で、全国に教室があるため現地で直接指導してくれますが多くの講座がオンライン対応です。
オンラインでは「個人レッスン(講師一人につき3名程)」と「集合レッスン」の選択も可能です。

オンラインレッスンの方には授業で使用するノートPC(ソフトインストール済み)も追加料金なしで貸りられて、質問掲示板を使って授業時間外でも質問できます。

無料体験もあり、説明会やカウンセリング等も行っています。
以下のリンクから内容だけでも確認してみてください。

コメント

タイトルとURLをコピーしました