条件分岐:if文の基本的な利用

前回の復習

  • 計算、描画、変数
  • ふりがな表を見ながら、プログラムの読み下し文が書けるようになりましょう
    • ふりがな表はいつでも見られるようにしておきましょう
  • 前回資料

式、文

プログラムは複数の から構成され、文は を含みます。

「整数123」や「実数45.6」、「文字列「Hello」」などは 定数リテラル )と呼びます。 定数や変数は式の一種です。 そして、式に演算子を適用した結果や関数を呼び出した結果も式となります。

以下は式の例です。

  • 123
  • 45.6
  • "Hello"
  • x
  • x = 10
  • 10 + 3
  • -x
  • abs(x)
  • println(x)

式の末尾に ; をつけると逐次処理を行う文となります。 また、変数の宣言や変数の初期化も文です。 複数の文は { } によってまとめることができます。 { } でまとめられた複数の文を ブロック と呼び、ブロックも文となります。

以下は文の例です。

int x;
x = 1 + 2 * 3;
int y = x;
{
  int x2 = x * x;
  int y2 = y * y;
  println(x2 + y2);
}

プログラムが式や文のルールに従っていない場合、文法エラー(syntax error)が発生します。

真理値

ある条件が満たされているかどうかで処理の内容を切り替えることを 条件分岐 と呼びます。 Processingでは、条件が満たされている、満たされていないの二種類の状態を表すために 真理値 を使います。 真理値には truefalse の二種類があり、それぞれ真と偽を表します。 真理値を変数で扱うためには、真理値(boolean)型の変数を使用します。 真理値表に関するふりがな表は以下の通りです。

表記 ふりがな
true
false
boolean [変数名]; 真理値型の変数 [変数名] を作成しろ
boolean [変数名] = [右辺] ; 真理値型の変数 [変数名] を作成して、 [右辺] で初期化しろ

比較演算子

数値(整数、実数)を比較した結果は真理値として表されます。 ふりがな表の6種類の 比較演算子 を覚えておきましょう。

表記 ふりがな
[左辺] < [右辺] [左辺][右辺] より小さいの真偽
[左辺] <= [右辺] [左辺][右辺] 以下の真偽
[左辺] > [右辺] [左辺][右辺] より大きいの真偽
[左辺] >= [右辺] [左辺][右辺] 以上の真偽
[左辺] == [右辺] [左辺][右辺] が等しいの真偽
[左辺] != [右辺] [左辺][右辺] が等しくないの真偽

以下のプログラムの読み下し文を書き、実行結果を予測してみましょう。

println(true);

boolean b = false;
println(b);

println(0 < 1);

println(1000000 * 1000000 > 0);

float s = 123.4;
float t = 234.5;
println(sqrt(s * t) <= (s + t) / 2);

上のプログラムの読み下し文は以下のようになります。

真 を表示しろ

真理値型の変数 b を作成して、偽 で初期化しろ
変数 b の値 を表示しろ

整数0 が 整数1 より小さいの真偽 を表示しろ

整数1000000 に 整数1000000 を掛けた結果 が 整数0 より大きいの真偽 を表示しろ

実数型の変数 s を作成して、実数 123.4 で初期化しろ
実数型の変数 t を作成して、実数 234.5 で初期化しろ
変数 s の値 に 変数 t の値 を掛けた結果 の平方根 が
  変数 s の値 に 変数 t の値 を足した結果 を 整数2 で割った結果 以下の真偽を表示しろ

実行結果は以下のようになります。

true
false
true
false
true

授業内課題03-1

以下のプログラムについて、(1) 読み下し文を書き、(2) 実行結果を予測せよ。 プログラムを実行し予測と合っていたか確かめよ。

println(true == true);

println(0 == 1);

println(1 + 1 == 2);

println(0.01 * 10 != 0.1);

float x1 = 10.0;
float y1 = 20.0;
float r1 = 10.0;
float x2 = 30.0;
float y2 = 40.0;
float r2 = 20.0;
println(dist(x1, y1, x2, y2) > r1 + r2);

論理演算子

論理演算子 を使うことで、複数の真理値をつないだ条件を表すことができます。 !&&|| がそれぞれ論理演算の 否定論理積論理和 を表します。 演算子の優先順位は否定、論理積、論理和であることに注意しましょう。

表記 ふりがな
! [真理値] [真理値] の否定
[真理値1] && [真理値2] [真理値1][真理値2] の両方が真であるの真偽
[真理値1] || [真理値2] [真理値1][真理値2] のどちらかが真であるの真偽

以下のプログラムの読み下し文を書き、実行結果を予測してみましょう。

boolean flag = true;
flag = !flag;
println(flag);

int x = 100;
int size = 50;
println(0 <= x - size && x + size <= 400);
println(x - size < 0 || 400 <  x + size);

上のプログラムの読み下し文は以下のようになります。

真理値型の変数 flag を作成して、 真 で初期化しろ
変数 flag に 変数 flag の値 の否定 を代入しろ
変数 flag の値 を表示しろ

整数型の変数 x を作成して、 整数100 で初期化しろ
整数型の変数 size を作成して、 整数50 で初期化しろ
( 整数0 が 変数 x の値 から 変数 size の値 を引いた結果 以下の真偽 ) と
  ( 変数 x の値 に 変数 size の値 を足した結果 が 整数400 以下の真偽 ) の
    両方が真であるの真偽 を表示しろ
( 変数 x の値 から 変数 size の値 を引いた結果 が 整数0 より小さい ) と
  ( 整数400 が 変数 x の値 に 変数 size の値 を足した結果 より小さい ) の
    どちらかが真であるの真偽 を表示しろ

実行結果は以下のようになります。

false
true
false

授業内課題03-2

以下のプログラムについて、(1) 読み下し文を書き、(2) 実行結果を予測せよ。 プログラムを実行し予測と合っていたか確かめよ。

boolean flag = true;
println(!!flag);

println(true || false && false);
println((true || false) && false);
println(true || (false && false));

条件分岐

条件分岐は if文 によって行います。 if文はその名前の通り文の一種です。 if文は以下のふりがな表のように表記します。

表記 ふりがな
if ( [条件式] ) {
 [処理]
}
もし [条件式] が真なら以下を実行しろ
{
 [処理]
}
if ( [条件式] ) {
 [処理1]
} else {
 [処理2]
}
もし [条件式] が真なら以下を実行しろ
{
 [処理1]
}
そうでなければ以下を実行しろ
{
 [処理2]
}

[条件式] は真理値型の値を持つ式でなければいけません。 [文] には文を書きます。

一般的には以下のようにif文を記述します。

if (true) {
  println("この文字列は出力されます");
}

if (true) {
  println("この文字列は出力されます");
} else {
  println("この文字列は出力されません");
}

if (false) {
  println("この文字列は出力されません");
} else if (true) {
  println("この文字列は出力されます");
} else if (false) {
  println("この文字列は出力されません");
} else {
  println("この文字列は出力されません");
}

Processingには、else if という特別な文法は存在しません。 上記のようなプログラムは、if文とブロックを組み合わせて実現されています。

最後のif文を、文法通りに解釈すると以下のようになります。

if (false)
  println("この文字列は出力されません");
else
  if (true)
    println("この文字列は出力されます");
  else
    if (false)
      println("この文字列は出力されません");
    else
      println("この文字列は出力されません");

この場合、else の個数が増えるほどネスト(入れ子構造)が深くなってしまいます。 if文の読み下しを行う場合には、一般的な記述に合わせて以下のふりがな表を利用してください。 [ 処理 ][ 処理1 ][ 処理2 ]には、複数の文を書くことができます。

表記 ふりがな
if ( [条件式] ) {
 [処理]
}
もし [条件式] が真なら以下を実行しろ
{
 [処理]
}
if ( [条件式] ) {
 [処理1]
} else {
 [処理2]
}
もし [条件式] が真なら以下を実行しろ
{
 [処理1]
}
そうでなければ以下を実行しろ
{
 [処理2]
}
if ( [条件式1] ) {
 [処理1]
} else if ( [条件式2] ) {
 [処理2]
}
もし [条件式1] が真なら以下を実行しろ
{
 [処理1]
}
そうでなくて、もし [条件式2] が真なら以下を実行しろ
{
 [処理2]
}

以下のプログラムの読み下し文を書き、実行結果を予測してみましょう。

int d1 = 3;
int d2 = 4;
int d3 = 5;
if (d1 * d1 + d2 * d2 == d3 * d3) {
  println("直角三角形");
} else {
  println("直角三角形ではない");
}

if (false) {
  println("この文字列は出力されません");
} else if (true) {
  println("この文字列は出力されます");
} else if (false) {
  println("この文字列は出力されません");
} else {
  println("この文字列は出力されません");
}

上のプログラムの読み下し文は以下のようになります。

整数型の変数 d1 を作成して、 整数3 で初期化しろ
整数型の変数 d2 を作成して、 整数4 で初期化しろ
整数型の変数 d3 を作成して、 整数5 で初期化しろ
もし ( 変数 d1 の値 に 変数 d1 の値 を掛けた結果 に 変数 d2 の値 に 変数 d2 の値 を掛けた結果が
  変数 d3 の値 に 変数 d3 の値 をかけた結果 と等しいの真偽 ) が真なら以下を実行しろ
{
  文字列「直角三角形」 を表示しろ
}
そうでなければ以下を実行しろ
{
  文字列「直角三角形ではない」 を表示しろ
}

もし 偽 が真なら以下を実行しろ
{
  文字列「この文字列は出力されません」 を表示しろ
}
そうでなくて、もし 真 が真なら以下を実行しろ
{
  文字列「この文字列は出力されます」 を表示しろ
}
そうでなくて、もし 偽 が真なら以下を実行しろ
{
  文字列「この文字列は出力されません」 を表示しろ
}
そうでなければ以下を実行しろ
{
  文字列「この文字列は出力されません」 を表示しろ
}

実行結果は以下のようになります。

直角三角形
この文字列は出力されます

授業内課題03-3

以下のプログラムについて、(1) 読み下し文を書き、(2) 実行結果を予測せよ。 プログラムを実行し予測と合っていたか確かめよ。

int count = 0;

boolean flag1 = true;
if (flag1 == true ||flag1 == false) {
  count += 1;
}

boolean flag2 = 0 > 1;
if (flag1 && !flag2) {
  count += 1;
}

boolean flag3 = flag1 || flag2;
if (flag3) {
  count += 1;
}

println(count);

授業内課題03-4

変数nの値が3で割り切れたら「fizz」、5で割り切れたら「buzz」、3でも5でも割り切れたら「fizz buzz」、いずれでもなければnの値を表示する以下のプログラムを完成させよ。そして、変数nの値を変更したいくつかのパターンでの出力結果を報告せよ。

int n = 15;

// ここを作る

授業内課題03-5

(cx, cy)を中心座標とした半径100の円の中心が幅400、高さ400のウィンドウの左側にあれば赤色、そうでなければ青色で塗り潰した円を描画する以下のプログラムを完成させよ。そして、変数cx, cyの値を変更したいくつかのパターンでの出力結果を報告せよ。

size(400, 400);
int cx = 100;
int cy = 200;

// ここを作る

まとめ

  • 式と文などの文法要素を理解しよう
  • 真理値とそれに関する比較演算、論理演算を覚えよう
  • if文による条件分岐を使おう

解答例

授業内課題03-1

以下のプログラムについて、(1) 読み下し文を書き、(2) 実行結果を予測せよ。 プログラムを実行し予測と合っていたか確かめよ。

println(true == true);

println(0 == 1);

println(1 + 1 == 2);

println(0.01 * 10 != 0.1);

float x1 = 10.0;
float y1 = 20.0;
float r1 = 10.0;
float x2 = 30.0;
float y2 = 40.0;
float r2 = 20.0;
println(dist(x1, y1, x2, y2) > r1 + r2);

読み下し文

真 と 真 が等しいの真偽 を表示しろ

整数0 と 整数1 が等しいの真偽を表示しろ

整数1 に 整数1 を足した結果 が 整数2 と等しいの真偽 を表示しろ

実数0.01 に 整数10 を掛けた結果 が 実数0.1 と等しくないの真偽 を表示しろ

実数型の変数 x1 を作成して、実数10.0 で初期化しろ
実数型の変数 y1 を作成して、実数20.0 で初期化しろ
実数型の変数 r1 を作成して、実数10.0 で初期化しろ
実数型の変数 x2 を作成して、実数30.0 で初期化しろ
実数型の変数 y2 を作成して、実数40.0 で初期化しろ
実数型の変数 r2 を作成して、実数20.0 で初期化しろ
点( 変数x1の値 , 変数y1の値 )と点( 変数x2の値 , 変数y2の値 )の距離 が
  変数r1の値 に 変数r2の値 を足した結果 より大きいの真偽 を表示しろ

実行結果

true
false
true
true
false

授業内課題03-2

以下のプログラムについて、(1) 読み下し文を書き、(2) 実行結果を予測せよ。 プログラムを実行し予測と合っていたか確かめよ。

boolean flag = true;
println(!!flag);

println(true || false && false);
println((true || false) && false);
println(true || (false && false));

読み下し文

真理値型の変数 flag を作成して、 真 で初期化しろ
変数 flag の値 の否定 の否定 を表示しろ

真 と 偽 と 偽 の両方が真であるの真偽 のどちらかが真であるの真偽 を表示しろ
真 と 偽 の どちらかが真であるの真偽 と 偽 の両方が真であるの真偽 を表示しろ
真 と 偽 と 偽 の両方が真であるの真偽 のどちらかが真であるの真偽 を表示しろ

実行結果

true
true
false
true

授業内課題03-3

以下のプログラムについて、(1) 読み下し文を書き、(2) 実行結果を予測せよ。 プログラムを実行し予測と合っていたか確かめよ。

int count = 0;

boolean flag1 = true;
if (flag1 == true ||flag1 == false) {
  count += 1;
}

boolean flag2 = 0 > 1;
if (flag1 && !flag2) {
  count += 1;
}

boolean flag3 = flag1 || flag2;
if (flag3) {
  count += 1;
}

println(count);

読み下し文

整数型の変数 count を作成して、 整数0 で初期化しろ

真理値型の変数 flag1 を作成して、 真 で初期化しろ
もし 変数 flag1 の値 が 真 と等しい の真偽 と 変数 flag1 の値 が 偽 と等しい の真偽 のどちらかが真であるの真偽 が真なら以下を実行しろ
{
  変数 count の値に 整数1 を足した結果を変数 count に代入しろ
}

真理値型の変数 flag2 を作成して、 整数0 が 整数1 より大きいの真偽 で初期化しろ
もし 変数 flag1 の値 と 変数 flag2 の値 の否定 の両方が真なら以下を実行しろ
{
  変数 count の値に 整数1 を足した結果を変数 count に代入しろ
}

真理値型の変数 flag3 を作成して、変数 flag1 の値 と 変数 flag2 の値 のどちらかが真であるの真偽 で初期化しろ
もし 変数 flag3 の値 が真なら以下を実行しろ
{
  変数 count の値に 整数1 を足した結果を変数 count に代入しろ
}

変数 count の値 を表示しろ

実行結果

3

授業内課題03-4

解答例

int n = 15;

if (n % 3 == 0 && n % 5 == 0) {
  println("fizz buzz");
} else if (n % 3 == 0) {
  println("fizz");
} else if (n % 5 == 0) {
  println("buzz");
} else {
  println(n);
}

実行結果

fizz buzz

授業内課題03-5

解答例

size(400, 400);
int cx = 100;
int cy = 200;
int r = 100;

if (cx < width / 2) {
  fill(255, 0, 0);
} else {
  fill(0, 0, 255);
}

ellipse(cx, cy, 2 * r, 2 * r);

実行結果

fig01

cxを300に書き換えた結果

fig02

授業外レポート

授業外課題03-1

寿司打( http://neutral.x0.com/home/sushida/play2.html )「5000円コース」をプレイし、以下のスコアを報告せよ(スピードは任意)

  • 成績(xxx円分得 or 損した)
  • 正しく打ったキーの数
  • 平均キータイプ数(回 / 秒)
  • ミスタイプ数

授業外課題03-2

以下のプログラムについて、(1) 読み下し文を書き、(2) 実行結果を予測せよ。 プログラムを実行し予測と合っていたか確かめよ。

println(false);

float a = 4;
float b = 12;
float c = 5;
println(b * b - 4 * a * c < 0);

int x = 100;
int size = 50;
if (0 <= x - size && x + size <= 400) {
  println("inside");
} else {
  println("outside");
}

if (x % 2 == 0) {
  println("偶数");
} else if (x % 2 == 1) {
  println("奇数");
} else {
  println("この文字列は出力されません");
}

授業外課題03-3

以下のプログラムについて、(1) 読み下し文を書き、(2) 実行結果を予測せよ。 プログラムを実行し予測と合っていたか確かめよ。

size(400, 400);

int cx = 90;
int cy = height / 2;
int r = 100;

if (cx - r < 0 || width < cx + r) {
  fill(255, 0, 0);
}
ellipse(cx, cy, 2 * r, 2 * r);

授業外課題03-4

点(px, py) が 、左上の座標を(rx, ry)とした幅w、高さhの長方形の内側に入っていたら「inside」そうでなければ「outside」と出力する以下のプログラムを完成させよ。そして、変数px, py, rx, ry, w, hの値を変更したいくつかのパターンでの出力結果を報告せよ。

int px = 50;
int py = 50;
int rx = 100;
int ry = 100;
int w = 200;
int h = 200;

// ここを作る

授業外課題03-5

中心(x1, y1)をした半径r1の円c1と中心(x2, y2)とした半径r2の円c2について、c1とc2を描画する以下のプログラムを完成させよ。 線の色は、c1がc2を含むまたはc2がc1を含むときに赤、c1とc2が重なる領域を持つときに青、そうでないときに黒とする。 そして、変数x1, y1, r1, x2, y2, r2の値を変更したいくつかのパターンでの出力結果を報告せよ。

size(400, 400);
noFill();

int x1 = 100;
int y1 = 100;
int r1 = 100;
int x2 = 200;
int y2 = 200;
int r2 = 100;

// ここを作る

ellipse(x1, y1, r1 * 2, r1 * 2);
ellipse(x2, y2, r2 * 2, r2 * 2);

fig03

fig04

fig05

results matching ""

    No results matching ""