K3の住民

最近はレア社のゲームについては書いていませんが、一応レア社のゲームが一番好きな人です。『雪圀』で"圀"は"国"とほぼ同義ですが、国ではありませんって当たり前か(笑)。

適当にCの基礎を学ぼう・3

最近、やたらとプログラミング言語を擬人化させた広告が出る。うん、馬鹿にする
つもりは毛頭無いんだけど、流石日本って感じだね。昔は「流石」と言うまでも
無かったんだけど、そういった文化が発達しすぎて一般化しつつある。悲しい。


はい、続きです。ポインタ早く解説出来ねーかなーと思いつつも、初心者より上程度
の僕がCの解説しますよ。

前回は低級言語、高級言語についてより詳しく解説し、条件文、while文、do-while文
についてフローチャートを載せつつも解説しました。
今回は、Cの文法のメインディッシュと言っても過言では無いfor文、簡単な多条件を
分かりやすくするswitch文を紹介します。

for文

はい、ついに来ましたね。for文は寧ろプログラミングに触れていない人で知らない
人はいないというぐらい有名なループ文です。
ifやwhile文、do-while文では条件を書くだけで良かったですが、このfor文は少し
覚えなければならないことがあります。

先ず、for文の構成を以下に示します。

for(初期化式; 継続条件式; 後処理式;)
{
  ・・・
}

初期化式についてですが、なんとこのfor文では、宣言した変数の初期化もしてくれ
ます。しかもデータ型も指定可能。その代わりそのfor文でしか使えないことに注意。

次に継続条件式ですが、これはwhile文と同じで条件が合えばループをします

次に後処理式。このループが終わった後forで初期化された変数はどうなるのか、
を設定することが出来ます。まぁ、主に使われるのは、増分や減分ぐらいなん
ですが。

因みに、このfor文にて設定出来る3つの式は、何れも省略が可能。よって後処理が
必要無い、寧ろあってほしくない、でも初期化や継続はしていきたいと言った場合
には後処理式を省略することで後処理をせずにループさせることが可能です。
因みに継続条件式または後処理式(これは場合によるが)を省略すると、while(1)と
同じように無限ループになります

では、forループはどのように使うか、そしてどう省略するかを、以下のプログラム
に示します。

int main(void)
{
  /*--- for文(省略無しver.) ---*/
  int e, cal=0;
  
  /* eの初期値を0として、eが5以下であるとき実行、その後eを増分する */
  for(e=0; e<=5; e++)
  {
    cal += e * (e + 3)
  }
  
  /*----- for文(省略ver.) -----*/
  for(int s=0; ; )  /* 変数sを宣言し、初期値を0として、後処理なしで無限ループ */
  {
    s++;
  }
  
  return 0;
}

まぁ、for文についてはざっとこんな感じです。では、フローチャートを用いながら
このプログラムの解説をします。

先ず、省略しないfor文はフローチャートではこのような流れになっています。以下
に、そのフローチャートを示します。

f:id:ryoryoau24:20170210222540p:plain

「あれ?前はYes/Noなんて無かったぞ?」って人にお話しします。
これはフローチャートを作る際に真偽が存在する処理には、真であればYes、偽で
あればNoと表記することがあります。僕的にはYes/Noが無い方がごちゃごちゃして
いないので見やすい、と思ったのですが、うーん、分かりづらいかなぁって人の方が
大半かもしれないと思ったのでつけることにしました。もしYes/Noが無い方が
見やすいと言う人が多ければ、次からは元に戻します。

で、まぁ、forの式一つ一つを分けていくと、処理の流れはこのような感じですね。
本来であれば、判断記号にforの括弧内の処理をひとまとめにするんですが、Cを
やり始めた人にはこっちの方が分かりやすいと思ったので敢えて分けました。
次からはfor内の処理を判断記号にひとまとめにします。
では流れを説明します。先ずはint型変数eを宣言し、forで初期化して0にします。
このforループの継続条件は5以下であることので、eの値が5よりも上になるまで
ループします。この間、calの値が演算により、変化し、forの後処理によってeは
増分されます。eが6となったとき、forの継続条件は満たされなくなり、ループを
抜ける、と言うプログラムになっています。


では続いて、省略した場合のforループのフローチャートを以下に示します。

f:id:ryoryoau24:20170210222226p:plain

Yesしか無かったので、早速Yes/No入れてません。Yesしか無いなら必要無いでしょ。
これが無限ループですね。偽が存在しないので、永久ループとなり、ずっとこのまま
です。つまりプログラムが終わりません。だから終わりがあるプログラムには
入れないようにしましょう。というか今思えばこのプログラム2つ目のfor文で永久
ループだからreturn文いらないよなぁ・・・まぁいいや。

switch文

switch文はifやelse、else ifがあるのであまり使われることは無いのですが、
知っておくと色々と便利なので紹介します。
先ずこの文法の利点は多分岐のプログラムを打ち込むのが楽になり(具体的には
shiftキーを押す必要が無い、とか)、またプログラムとしても非常に見やすいです。
(まぁこれは人によると思いますが)
ですが、ifやelse、else ifのような万能な文とは違い、欠点が存在します。詳細は
後述。

構成としては、このような感じです。

switch(式)
  {
    case 定数1:
        ・・・
    case 定数2:
    case 定数3:
        ・・・
    default:
        ・・・
  }

caseの後には定数が入ります。しかし、ここからが万能なif、else、else ifと違う
ところで、caseの後には定数しか入れることが出来ません。つまり、式を入れたら
コンパイルエラーが発生します
で、このdefaultは、如何なるcaseにも無い場合に通る処理です。つまり、elseと同様
の働きをします
また、このswitch文は上から順にcaseの処理を進めていくので、一つの条件でしか
処理を実行したくない場合、break文が必要となります。このbreak文については後程
解説します。
また「case 定数2」「case 定数3」を並べていますが、これは「case 定数2」と
「case 定数3」は同じ処理をしますよ、と言う意味です。

では、どのように打ち込むのか、早速プログラムを以下に示します。

int main(void)
{
  int sw = 0;
  
  while(sw <= 5)     /* 変数swが5以下であれば、ループする      */
  {
    switch(sw)
    {
      case 1:    /* swの値が1のとき実行             */
          sw++;
          break;
      case 2:    /* swの値が2のときまたは            */
      case 3:    /* swの値が3のとき実行             */
          sw++;
          break;
      case 4:    /* swの値が4のとき実行             */
          sw++;
      case 5:    /* 「case 4」から引き続き、swの値が5のとき実行 */
          sw++;
          break;
      default:    /* それ以外のとき実行              */
          sw++;
          break;
    }
  }
  
  return 0;
}

結構膨大な処理になってしまいましたが、これをif、else、else ifに直すとスリムには
なりますが、その分複雑に見えます。つまり、多条件を単純明快にしたいときに条件
が定数であればこのswitch文が欠かせないわけです(まぁ、このプログラムだと、
while(sw <= 5)の処理内にsw++;を入れればそれだけで良いわけですが、今回はswitch文
の説明なので・・・)。

では、このプログラムをフローチャートで説明します。
f:id:ryoryoau24:20170211110520p:plain

本来は図記号は小さくしたりしないのですが、画像の大きさの関係上、こうなって
しまいました。すみません。
それでは解説します。このプログラムでは、全ての分岐を通るようになっています。
先ずはswは0になっているので、whileは5以下なので処理が実行されます。次に
switch文が実行されます。どのcaseにも該当していない為、defaultを通ります。
defaultを通ったので、swは増分されて値が1になります。
まだswは5以下なので繰り返します。以降この繰り返しを省きます。
swが1なので、swが増分され、2になります。次にswが2であり、3であることが
条件になっているのでswは増分をし、まだswが3であるという条件が残っている
ので繰り返した後、またswを増分します。
最後にswは4となっているので、swは増分され、更にswは5となっているのでswは
増分され、最終的には6になります。
swが5より上の値になってしまった為、ループを抜けます。これで処理は終了です。

ちょっとややこしい説明ですが、多条件を説明するならこんな感じにした方が
分かりやすいかなと思ったので、敢えて全部の条件を通るプログラムを作りました。
また、このフローチャートを見た限りでは複雑に見えますが、if、else、else ifで
表しても大体こんな感じなので問題無い。

まぁ、覚えといた方が使えるかもしれない程度で、あまり覚えなくても良いかも
しれません。

因みにwhile文は必須なわけでは無いです。条件を一つ通るだけなら、switch文だけ
で十分です。


以上です。今回のはちょっと分かりにくかったかなあ・・・。もう少し良く
教えるようにしたいですね。教えるのが下手で本当にすみません。

今回はこれくらいにしときます。