C基礎2 選択処理
C基礎2 選択処理
条件を勉強します。条件に応じて、プログラムの流れが二手に分かれます。条件に使う記号は、算数で勉強した「>」や「<」は同じですが、その他の記号はC言語独自の書き方になります。
プログラムの流れを図で表わすフローチャートも登場します。フローチャートはプログラミングだけでなく、普通に作業手順を図式化する時にも使われる図です。フローチャートにも慣れるようにするとよいでしょう。
動画は、Windows10とVisualStudio2019を使った説明になっていますが、WIndows11とVisualStudio2022を使った場合の操作方法と同じです。
コンピュータは、プログラムに書かれた命令を、上から順番に実行していきます。プログラムに書かれた、命令の順番を表わした図をフローチャートと呼んでいます。
条件によって実行される命令が異なる場合、フローチャートでは、菱形の図形を使って条件を表わし、条件が成立した場合の流れと、条件が成立しなかった場合の流れが分かるように書きます。
条件が成立するか否かで、実行される命令を分けるプログラムでは、if文とelse文を使います。
文法的には、if文とelse文は、文ブロックと呼ばれる書き方は不要ですが、プログラミングミスを未然に防止するため、必ず、文ブロック化するようにします。
if文の条件で使う代表的な6つの演算子(==、!=、<、<=、>、>=)があります。これらの条件の逆の条件が、直ぐに書けるようにしておくことは、プログラミング上達の第一歩になります。
if文とelse文のプログラムを書く時に犯すミスの例を、下記の動画で紹介してます。1つの記号を書くか否かで、全く違うプログラムになってしまいます。最新の注意を払ってプログラミングしましょう。
条件を使ったフローチャートと、そのプログラムを、if文とelse文を使って書くことで、プログラムの流れとはどの様なものかを学びます。
if文とelse文では、文ブロックを使うようにします。
・プログラムの流れはフローチャートに書く
プログラムは、上から水が流れるように、上から順番に実行されます。
・フローチャートの菱形(条件)で流れが二手に分かれる
フローチャートの菱形は、条件を書くためのマークです。
条件が成り立った場合(Yesのケース)と、成り立たなかった場合(Noのケース)の流れになります。
・if文に条件を書く
プログラムに書くとき、条件はif文に書きます。
if文側に書くのは、条件が成り立った時に実行する文で、else文側に書くのは、条件が成り立たなかった時に実行する文です。
・文ブロックの書き方は二通りある
サンプルプログラムは、出来るだけ行数を少なくしたいため、左側の書き方にしていますが、どちらの書き方でも良いです。ただ、自分で決めた書き方に揃えた方が、プログラムとしては綺麗です。
・条件では、逆の条件を書けるようにする
条件に使う代表的な演算子は6種類あります。
=と組み合わせる演算子では、=は必ず右側に書きますので覚えておくと良いでしょう。
直ぐに、逆の条件を書ける様にしておくと、プログラミングが楽になります。
四角形の縦と横の長さを入力して、正方形なのか長方形なのかを判断するプログラムを作成しましょう。
拡張問題として、正方形の場合は一辺の長さを表示し、長方形の場合は、縦と横の差を表示するようにしてみましょう。
拡張問題のサンプルプログラムは、「2.2 二分岐と多分岐(四角形判定の拡張)」で説明します。
条件によって、プログラムの流れが複数に分かれるものを選択処理と言います。
プログラムの流れが2つに分かれるものを二分岐、3つ以上に分かれるものを多分岐と言います。
if文とelse文は、二分岐のプログラムだけでなく、多分岐のプログラムも書く事ができます。
練習問題06の拡張問題のプログラムを、二分岐の書き方かた多分岐の書き方に修正していきます。
多分岐構造を意識した、ネストレベルを揃える書き方を学びます。
・複数の流れに変える多分岐がある
if文は、条件が成り立った流れと、成り立たなかった流れの、2つ流れを作る命令ですが、プログラムの構造としては、多分岐構造というものもあります。
・複数の「場合分け」をするのが多分岐構造です
練習問題06の拡張問題は、「縦と横が等しい場合」、「縦が横より長い場合」、「横が縦より長い場合」の3つの場合に分けて、表示するメッセージを変える問題です。これをプログラムに書く時、多分岐構造を使います。
・多分岐構造のフローチャートをイメージする
多分岐構造のフローチャートを書いて、何が場合分けされた命令なのかを意識することが大切です。
プログラムに書く時、場合分けされた命令文のネストラインを揃えます。
・多分岐した文のネストラインを揃えて書く
2つ目以降の条件は、「else if (条件)」の様に、elseとifを同じ行に書きます。
場合分けされた命令文のネストラインを揃えて書きます。
条件で使う6つの演算子(==、!=、<、<=、>、>=)を結ぶ演算子として、「かつ(論理積)」と「または(論理和)」演算子があります。「かつ」は&&演算子(論理積演算子)、「または」は||演算子(論理和演算子)を使います。
四則演算子の場合は、「a+b+c」の様に、複数の演算子を連続して使うことができますが、条件で使う演算子は「a<b<c」の様に、連続して使うと違った意味になってしまいます。「a<b && b<c」の様に、2つの条件を「かつ」で結ぶ様な書き方をしなければなりません。
「2.2 二分岐と多分岐(四角形判定の拡張)」で説明した、練習問題06の拡張問題のプログラムを更にステップアップしたプログラムにします。
&&演算子や||演算子を使った条件を加えることで、誤ったデータを入力した時は、エラーメッセージを表示する様にします。
・&&は「かつ」、||は「または」です
2つの条件を結ぶのが、&&演算子と||演算子です。
2つの条件が共に真の場合に真で、それ以外が偽になるのが&&演算子です。
2つの条件が共に偽の場合に偽で、それ以外が真になるのが||演算子です。
・逆の条件を作れる様にする
単純な条件だけでなく、「かつ」や「または」の入った条件も、逆の条件を作れる様にしましょう。
・2つの条件の重なりは算数の様な書き方はできない
算数で習った、2つの条件を重ねた書き方はできません。
「0 < x < 10」は「0 < x && x < 10」、「x < 3, 20 < x」は「x < 3 || 20 < x」と書きます。
プログラムは「関数」という単位で実行されます。今まで使っていたprintfやscanfも関数で、Visual Studioの中にprintf関数やscanf関数が入っています。Visual Studioの中には、printf関数やscanf関数以外の様々な関数が入っています。これらの関数は、機械語に翻訳された状態でライブラリと呼ばれる格納庫の中に入っています。
Visual Studioのライブラリに入っている関数は、「関数呼出し」することで、使う事ができます。
今まで「#include <stdio.h>」を書いていましたが、これはprintf関数やscanf関数を使うためのもので、別の関数を使う場合は、別の「#include <・・・>」を追加する必要があります。「・・・」の部分は、ファイル名を書く所で、使う関数によって定められたファイルがあり、そのファイル名を記述します。
メモ:画面に表示することをStandard Outputと言い、キーボードから入力することをStandard Inputと言います。「stdio.h」というファイルは、Standard Input Outputの為のヘッダファイルという意味の名前になっています。
関数呼出しによって、どの様にプログラムの実行の流れが遷移するかを説明します。
また、printf関数やscanf関数以外の関数として、乱数を取得するrand関数と経過時間を計測するためのcloc関数を使ったプログラムを説明します。
新たな関数を使う場合は、#includeの記述を追加しなければならないことを学びます。
・プログラムは関数という単位で動く
今まで書いたいたプログラムは、main関数という関数を作っていました。プログラムはmain関数から動き始めます。
・新たなグループの関数を使う場合は#includeを追加する
関数は幾つかのグループに所属しています。別のグループの関数を使う場合は、そのグループに対応したファイルを記載した#includeを追加します。
・乱数取得はrand関数とsrand関数を使う
乱数は、乱数の種を初期化してから取得します。
乱数の種の初期化はsrand関数、乱数取得はrand関数を使います。種の初期化でtime関数を使います。
srand関数とrand関数を使う時に必要なのが「#include <stdlib.h>」で、time関数を使う時に必要なのが「#include <time.h>」です。
・時間計測はcloc関数を使う
clock関数を使う時に必要なのが「#include <time.h>」です。
clock関数は、プログラムが開始された時からの経過時間をミリ秒単位で教えてくれます。
基本問題と拡張問題があります。
基本問題は、1から99までの整数を2つ乱数から取得し、その足し算結果をプレイヤーに入力させ、正解もしくは不正解を表示するプログラムを作成しましましょう。
拡張問題は、解答を入力するまでに要した時間を計測し、早く正解を解答したら「素晴らしい!」、正解するのに時間がかかってしまったら「遅い!」等、プレイヤーの入力に緊迫感を持たせるようにプログラムを修正してみましょう。
多分岐構造は、switch文を使って書く事もできます。但し、switch文にすることができるのは、場合分けの条件が、整数定数と等しいかどうかの条件の場合に限られます。
switch文は、caseラベル、defaultラベル、break文といったものと組み合わせて書かなければなりません。間違いやすい所を、下記の動画で説明していますので、注意して書く様にしてください。
ジャンケンの「グー」「チョキ」「パー」を表示するプログラムを例に、if文とelse文を使ったプログラムを、switch文を使った書き方に変更します。
全ての多分岐構造をswitch文にする事は出来ませんが、switch文に出来る場合は、switch文で書けるようになりましょう。
・多分岐構造はswitch文でも書くことができる
ジャンケンの手を表示するプログラムをswitch文で書いています。caseラベル、defaultラベル、break文が何処かを言える様になりましょう。全てのcaseとdefaultの最後に、break文を書かなければなりません。
・break文のないswitch文は多分岐構造にならない
break文を書き漏らすと、多分岐構造でなくなってしまいます。
・caseラベルを重ねると「または」の条件になる
switch文の便利な点は、caseラベルを重ねて書く事ができる点です。
プレイヤーとコンピュータがジャンケンするゲームを作りましょう。
プレイヤーが1と入力したグー、2と入力したらチョキ、それ以外はパーを出したことにします。コンピュータ側の手は、乱数から求め、勝負の結果を表示します。
拡張問題として、勝負の結果をアスキーアートで表示する様にしてみましょう。ゲーム感がアップします。
テスト実施フォーム ← テストチャレンジできます
上記テストの解説と解答