C言語を3か月で身につけてるための第1週の前半のやるべきことは、変数宣言、代入文、演算子、演算結果の表示の使い方を身につけることでしたね。
第1週の後半4日で身につける内容は
・if文
・switch文
・for文
・while文
です。第1週前半でもif文を用いたプログラム例を示しました。 関係演算子、等値演算子、論理演算子とif文は密接に関係しているため、例を示すのに記述する必要がありました。
大まかなスケジュールはこちらのページを参照ください。
———————————————————————–
C言語 プログラムを3か月で身につけるスケジュール
———————————————————————–
では、早速書いていきます。
第1週後半
if文
if文は、プログラムの処理を条件付きで実行させたいときに記述するものです。
「もし、○○なら△△を実行、そうでなければ、□□を実行」としたいときに使います。
プログラムはC言語に限らず、if文で成り立っていると言っても過言ではないです。
記述の仕方は以下の通りです。
if(条件式1) { 条件式1を満たした時に行う処理 } else if(条件式2) { 条件式1を満たさず、条件式2を満たした時に行う処理 } else { 条件式1も2も満たさなかった時に行う処理 }
となります。ifを日本語にすると、「もし」ですよね。だから、プログラムを記述する上でもそれほど違和感や抵抗はないと思いますが、どうでしょうか?
条件式のところは、第1週前半で解説した関係演算子、等値演算子、論理演算子を使って、作成していきます。
単純なところでは「a == 0」とか「a > 0」というところでしょうか?
プログラム例を示したほうが、わかりやすいと思うので、第1週前半同様、算術演算プログラムを記述します。
(例) #include <stdio.h> main() { int x, y; /* 算術演算させるための変数 */ /* 算術演算させる数値の格納(ユーザがキーボードで入力) */ /* ここでは文字入力されたときの処理を入れてないので */ /* 数字以外のものを入力するとプログラムは暴走する。 */ /* また、整数のみしか扱っていない。 */ printf( "x = " ); scanf( "%d", &x ); printf( "y = " ); scanf( "%d", &y ); /* 算術演算の結果を出力 */ printf( "x + y = %d\n", x + y ); printf( "x - y = %d\n", x - y ); printf( "x * y = %d\n", x * y ); if ( x == 0 || y == 0 ) { printf( "割り算はできません。\n" ); printf( "余りを求められません。\n" ); } else if ( x >= y ) { printf( "x / y = %d\n", x / y ); printf( "x / y の余りは%d\n", x % y ); } else { printf( "y / x = %d\n", y / x ); printf( "y / x の余りは%d\n", y % x ); } } 入力 x = 7 Enter x = 2 Enter x = 5 Enter y = 3 Enter y = 7 Enter y = 0 Enter 出力結果 x + y = 10 x + y = 9 x + y = 5 x - y = 4 x - y = -5 x - y = 5 x * y = 21 x * y = 14 x * y = 0 x / y = 2 y / x = 3 割り算はできません。 x / y の余りは1 y / x の余りは1 余りを求められません。
足し算、引き算、掛け算の部分はおまけですので、ここでは無視してください。
注目すべきは、割り算部分の処理です。if文を使用しているのがわかりますね。
割り算は値が確定していない変数で、単純に演算をさせてしまうと、割る数が「0」だと問題が発生するのがわかりますよね?
そうならないように、プログラムで割る数が「0」でないかをチェックする必要があります。
そこで登場するのがif文です。
始めのif文の条件式を見てください。if (x == 0 || y == 0) とあります。
これはキーボードで入力された数値のどちらかが「0」であれば、割り算をやらせないという条件にしています。少々厳しめの条件かと思いましたが、このようにしました。
そして、次のelse if文でxの値がyの値以上であるという条件です。
この場合は、x÷yの演算とその余りを求める処理を実行させています。
最後に、else文でそれ以外の条件の場合に実行するのは、y÷xの演算とその余りを求める処理ということになります。
考えてもらえば、わかりますが、最後のelse文はyの値がxの値より大きいときに実行されます。これ以外の条件の場合は、最初のif文か次のelse if文の条件を満たします。
こちらのページでさらに詳細に解説していますので、よければ読んでみてください。
C言語 条件文if ~ else if ~ elseの使い方
switch文
switch文はある変数に対して、取りうる値に対して、それぞれ別の処理を実行したいときに記述するものです。
記述の仕方は以下の通りです。
switch( 変数 ) { case 0 : 実行文 break; case 1 : 実行文 break; : : : : : : default: 実行文 break; }
一番最後の default は省略可能です。省略した場合、変数がcase文に一致するものがなかった場合、何も処理が実行されずにswitch文を抜けることになります。
もし、一致するcaseがあった場合、break;と記述された前までの処理を実行します。
switch文での絶対にやってはいけないことは、break; を書き忘れることです。
忘れてしまっても、文法エラーではありませんので、コンパイル時にエラーになりません。
どうなるかというと、switch文の中のbreak; がある処理まで実行されてしまいます。もし、break;がなければ、一番最後の case か default の処理が実行されて、switch文を抜けます。
わざと、break;を書かないときもあります。例えば、変数aに対して、値が0と1の場合は同じ処理を実行するというときは、値が0のcase文にはbreak;を書きません。
switch文を使ったプログラムはこんな感じになります。
(例) #include <stdio.h> #define MAX 65535 main() { int x, y; /* 算術演算させるための変数 */ int ans; /* 算術演算の結果 */ int enzan; /* 演算の種類(0:加算 1:減算 2:乗算 3:除算) */ char kigo[4]; /* +, -, *, / を格納 */ /* この部分は出力表示用に設定している。 */ kigo[0] = '+'; kigo[1] = '-'; kigo[2] = '*'; kigo[3] = '/'; /* 算術演算させる数値の格納(ユーザがキーボードで入力) */ /* ここでは文字入力されたときの処理を入れてないので */ /* 数字以外のものを入力するとプログラムは暴走する。 */ /* また、整数のみしか扱っていない。 */ printf( "x = " ); scanf( "%d", &x ); printf( "y = " ); scanf( "%d", &y ); printf( "どの四則演算をしますか?\n数字で選択してください。\n" ); printf( "0:加算 1:減算 2:乗算 3:除算\nInput No. : " ); scanf( "%d", &enzan ); /* 演算実行 */ switch( enzan ) { case 0 : ans = x + y; break; case 1 : ans = x - y; break; case 2 : ans = x * y; break; case 3 : if ( y == 0 ) ans = MAX; else ans = x / y; break; default: ans = 0; } /* 算術演算の結果を出力 */ if ( enzan >= 0 && enzan <= 3 ) printf( "x %c y = %d\n", kigo[enzan], ans ); else printf( "演算選択ミス\n"); } 入力 x = 7 Enter y = 3 Enter どの四則演算をしますか? 数字で選択してください。 0:加算 1:減算 2:乗算 3:除算 Input No. : 1 Enter 出力結果 x - y = 4
演算する数値を2つ入力させたあと、どの演算をさせるかを選択させて、選択に応じた結果のみを表示するプログラムです。
四則演算の記号を代入している部分は、ここでは読み飛ばしてください。
switch文のところのみ注目してください。
ユーザに演算の選択をさせたときのデータを「enzan」に格納しているので、それがswitch文の各caseの判断のもとになります。
enzanの値が0なら足し算、1なら引き算、2なら掛け算、3なら割り算を実行するようになっています。もし、それ以外の値なら、defaultの処理が実行され、演算結果ansに0を代入して、switch文を抜けます。
ここで、もし、case 0 の最後のbreakを忘れると、case 1のx – yがansに格納されてしまいます。つまり、演算選択を足し算を選んでも引き算になってしまうということです。
これでは、やりたいことが実現できていないプログラムということになってしまいますので、注意してください。
割り算部分は例によって、「0」で割らないように配慮しています。
そして、最終出力という流れになります。
breakを忘れると、意図したとおりに動作しないということはお話ししました。
ですが、switch文はif文で書き直すこともが可能なのです。
カンのいいあなたなら、わかると思いますが、最初のcaseは「if (enzan == 0)」と書いているのと同じです。
したがって、以降は「else if (enzan == 1)」と続けて、最後の「else」の部分はdefaultの処理を書けばいいのです。
switch文のところだけを、if文に書き直すと、こうなります。
/* 演算実行 */ if(enzan == 0) { ans = x + y; } else if(enzan == 1) { ans = x - y; } else if(enzan == 2) { ans = x * y; } else if(enzan == 3) { if (y == 0) ans = MAX; else ans = x / y; } else { ans = 0; }
if文はbreak文を記述する必要がないため、やりたいことが確実にできると思います。しかし、書いてみたらわかるとと思いますが、else ifと書くのは結構面倒です。
switch文で書くほうが、プログラムが見やすい場合もありますので、if文で書くかswitch文で書くかはそのときの状況によって使い分けてください。
for文
同じ処理を何回も記述するのは面倒ですよね?for文は同じ処理を繰り返して実行させたいときに記述するものです。
記述の仕方は以下の通りです。
for ( 初期化; 条件; 次の一歩 ) { 実行文 }
初期化は、たいていの場合、for文の繰り返し回数を数える変数を0にするのに使うことが多いです。
条件はif文と同じ要領で書き、繰り返しを実行するための条件です。この条件を満たさなければ、永久にfor文を抜けることができなくなります。
次の一歩というのは、表現が難しかったので、こう書きましたが、主に、繰り返し回数のデータを更新する事に使うことが多いです。
いずれも省略することが可能です。条件を省略すると、無限ループになります。for文の中で、必ずbreak文を記述し、for文から抜けるようにしなければ、for文以降の処理を実行することができません。
オーソドックスにはこんな感じです。
for ( i = 0; i <= 100; i++ )
変数iを0に初期化し、iが100以下のとき、for文内の処理を実行し、1回実行したら、iをインクリメントするというものです。この場合は、101回の処理が繰り返し実行されます。
for文を使ったプログラムはこんな感じになります。
(例) #include <stdio.h> main() { int i; /* for文をまわすための変数 */ int sum; /* 合計 */ /* 0から100まで加算 */ sum = 0; for ( i = 0; i <= 100; i++ ) { sum += i; } /* 結果を出力 */ printf( "0から100までの合計は%d\n", sum ); } 出力結果 0から100までの合計は5050
単純に、0~100までの数値を加算して、表示するだけのプログラムです。
for文の繰り返し回数を数える変数にi,j,kがよく使われますので、ここでもiを使用しています。
for文の中にbreakを記述すると、条件を満たしていても、強制的にfor文を抜けることができます。
また、continueと記述すると、continue以降の処理を実行せずに、for文の始めから処理を実行し直します。
continueの解説はこちらのページにも書いていますので、よろしければ読んでみてください。
while文
while文はfor文同様、処理の繰り返しをさせたい場合に記述します。
while文で書かれたプログラムはfor文で書くことが可能ですし、逆に、for文で書かれたプログラムはwhile文で書くことが可能です。
while文の記述の仕方は以下の通りです。
while ( 条件 ) { 実行文 }
for文と同様で、途中に break があれば、そこで while文を抜けます。
また、continue があれば、すぐに while文の最初から処理を実行し直します。
while文を使ったプログラムはこんな感じになります。
(例) #include <stdio.h> main() { int i; /* 1ずつ増加させるための変数 */ int sum; /* 合計 */ /* 初期設定 */ sum = 0; i = -5; /* 0から100まで加算 */ while ( 1 ) { if ( i < 0 ) { i++; continue; } if ( i > 100 ) break; sum += i; i++; } /* 結果を出力 */ printf( "0から100までの合計は%d\n", sum ); } 出力結果 0から100までの合計は5050
先ほど、for文のところで書いた0から100までを順番に足して、合計値を表示するプログラムをwhile文で書き換えたものです。
繰り返しの回数を数える変数iはwhile文を実行する前に、初期化しておく必要があります。ここでは、continue文を使うため、わざと-5で初期化しています。
そして、while文の条件を「1」としているので、必ず実行されます。無限ループにわざとしています。これもbreak文を使うためです。
プログラムの流れを簡単に説明しますと、iが負の値の間、iを1ずつ増加し、while文の先頭から実行をやり直します。
iの値が100を超えたら、break文でwhile文を抜けます。それまでの間は、iの値を足しこんで、iを1ずつ増加していきます。
そして、合計値をコンソールに出力するという流れです。
おわかりと思いますが、continueやbreakは使う必要のない仕様ですが、どういう感じで使うのか見てほしかったので、書いてみました。練習で、continue、breakを使わない処理を考えて書いてみてください。
まとめ
C言語のプログラムを3か月で身につけるための第1週後半でやるべきことを解説しました。
・if文
・switch文
・for文
・while文
結構なボリュームだったかもしれませんが、文法自体は難しくなかったと思います。全部覚えられなかったら、if文とfor文だけ覚えてしまいましょう。そうすれば、分岐と繰り返しのプログラムの記述が可能になります。
その後で、switch文とwhile文を覚えたらいいと思います。
これらを4日以内にマスターし、C言語のプログラムを3か月で身につけるための第2週でやるべきことへ進んでください。