第04回 条件分岐:if文の高度な利用
前回の復習
文字型
もっと色々な処理を行うために、新たに 文字型 を紹介します。 これまでの型と同じように変数の宣言や初期化ができます。
表記 | ふりがな |
---|---|
' [x] ' | 文字「 [x] 」 |
char [変数名]; | 文字型の変数 [変数名] を作成しろ |
char [変数名] = [右辺] ; | 文字型の変数 [変数名] を作成して、 [右辺] で初期化しろ |
文字列の操作
数値の演算と同じように、文字列にも様々な操作を行うことができます。 文字列の操作とそのふりがなは以下の表の通りです。
文字列の何文字目かを考えるとき、コンピュータでは先頭の文字を0文字目と数えます。 最後の文字は、(その文字列の長さ - 1)文字目です。
表記 | ふりがな |
---|---|
[文字列] .charAt( [添字] ) | [文字列] の [添字] 番目の文字 |
[文字列1] .equals( [文字列2] ) | [文字列1] が [文字列2] と文字列として等しいの真偽 |
[文字列] .indexOf( [部分文字列] ) | [文字列] の中で [部分文字列] が始まる位置 |
[文字列] .indexOf( [部分文字列] , [開始位置] ) | [文字列] の[開始位置] 文字目以降で [部分文字列] が始まる位置 |
[文字列] .length() | [文字列] の長さ |
[文字列] .substring( [開始位置] ) | [文字列] の [開始位置] 以降の部分文字列 |
[文字列] .substring( [開始位置] , [終了位置] ) | [文字列] の [開始位置] 文字目から [終了位置] 文字目までの部分文字列 |
[文字列] .toLowerCase() | [文字列] を小文字に変換した結果 |
[文字列] .toUpperCase() | [文字列] を大文字に変換した結果 |
授業内課題04-1
以下のプログラムについて、(1) 読み下し文を書き、(2) 実行結果を予測せよ。 プログラムを実行し予測と合っていたか確かめよ。
println("hello".charAt(2));
String s1 = "Hello, World!";
String s2 = "Hello, ";
s2 += "World!";
println(s1);
println(s2);
println(s1 == s1);
println(s2 == s2);
println(s1 == s2);
println(s1.equals(s1));
println(s2.equals(s2));
println(s1.equals(s2));
String s = "college of humanities and sciences";
if (s.length() % 2 == 0) {
println("even");
} else {
println("odd");
}
if (s.indexOf("ll") >= 0) {
println("Hello contains ll");
} else {
println("Hello does not contain ll");
}
println(s.substring(8, 10));
String hello = "Hello";
println(hello.toLowerCase());
println(hello.toUpperCase());
乱数の生成
プログラムを実行するたびに異なる結果を発生させるためには、乱数(擬似乱数)を利用します。
Processingでは、random
関数を使って乱数を生成します。
random
関数には、乱数の最大値だけを与える方法と、最小値と最大値の両方を与える方法の二種類があります。
最小値を省略した場合、最小値は0となります。
生成される乱数の範囲は最小値以上、最大値未満です。
最大値は含まれないことに注意しましょう。
表記 | ふりがな |
---|---|
random( [最大値] ) | 0以上 [最大値] 未満の乱数 |
random( [最小値] , [最大値] ) | [最小値] 以上 [最大値] 未満の乱数 |
型変換
整数型を実数型に変換したり、実数型を整数型に変換したりすることを型変換と呼びます。 型変換には以下の関数を使いましょう。
表記 | ふりがな |
---|---|
boolean( [値] ) | [値] を真理値に変換した結果 |
char( [値] ) | [値] を文字に変換した結果 |
float( [値] ) | [値] を実数に変換した結果 |
int( [値] ) | [値] を整数に変換した結果 |
str( [値] ) | [値] を文字列に変換した結果 |
例
以下のプログラムは、0以上100未満の整数を乱数で生成します。
int x = int(random(100))
println(x);
以下のプログラムは、変数aの値以上変数bの値 以下 の整数を乱数で生成します。
int a = 10;
int b = 20;
int y = int(random(a, b + 1));
println(y);
授業内課題04-2
授業外課題03-4の自分の回答を改変し、変数px, py, rx, ryの値をランダムに設定して出力結果を確認せよ。 px, rxは0以上Windowの幅未満、py, ryは0以上Windowの高さ未満の範囲とする。 なお、px, py, rx, ryの値をコンソールに表示するようにすること。 また、完成したプログラムの読み下し文を書け。
授業内課題04-3
授業外課題03-5の自分の回答を改変し、変数x1, y1, r1, x2, y2, r2の値をランダムに設定して描画結果を確認せよ。 x1, x2は0以上Windowの幅未満、y1, y2は0以上Windowの高さ未満、r1, r2は50以上150以下の範囲とする。 また、完成したプログラムの読み下し文を書け。
if文のネスト
ブロックは { }
で括られた文の集合でした。
if文は文であるため、{ }
の中身にif文を書くことができます。
すなわち、if文の中にも何回でもif文を登場させることができます。
例
以下のプログラムの読み下し文を書き、実行結果を予測してみましょう。
if (true) {
if (true) {
if (true) {
if (true) {
println("この文字列は出力されます");
} else {
println("この文字列は出力されません");
}
}
}
}
上のプログラムの読み下し文は以下のようになります。
もし 真 が真なら以下を実行しろ
{
もし 真 が真なら以下を実行しろ
{
もし 真 が真なら以下を実行しろ
{
もし 真 が真なら以下を実行しろ
{
文字列「この文字列は出力されます」 を表示しろ
}
そうでなければ以下を実行しろ
{
文字列「この文字列は出力されません」 を表示しろ
}
}
}
}
実行結果は以下のようになります。
この文字列は出力されます
授業内課題04-4
変数nを0以上100以下の乱数で初期化し、nが3で割り切れたら「fizz」、5で割り切れたら「buzz」、3でも5でも割り切れたら「fizz buzz」、いずれでもなければnの値を表示するプログラムを作成せよ。
授業内課題04-5
下図のように、中心に縦線と横線を引き、画面中のランダムな位置に半径50の円を描画する。
円の色は、4等分した領域の右上に円の中心があるとき青色、右下にあるとき白色、左下にあるとき緑色、左上にあるとき赤色に設定すること。
size
関数によって画面の幅と高さを変化させても、他の箇所の変更は不要となるようにせよ。
まとめ
- 式と文などの文法要素を理解しよう
- 真理値とそれに関する比較演算、論理演算を覚えよう
- if文による条件分岐を使おう
解答例
授業内課題04-1
以下のプログラムについて、(1) 読み下し文を書き、(2) 実行結果を予測せよ。 プログラムを実行し予測と合っていたか確かめよ。
println("hello".charAt(2));
String s1 = "Hello, World!";
String s2 = "Hello, ";
s2 += "World!";
println(s1);
println(s2);
println(s1 == s1);
println(s2 == s2);
println(s1 == s2);
println(s1.equals(s1));
println(s2.equals(s2));
println(s1.equals(s2));
String s = "college of humanities and sciences";
if (s.length() % 2 == 0) {
println("even");
} else {
println("odd");
}
if (s.indexOf("ll") >= 0) {
println("Hello contains ll");
} else {
println("Hello does not contain ll");
}
println(s.substring(8, 10));
String hello = "Hello";
println(hello.toLowerCase());
println(hello.toUpperCase());
読み下し文
文字列「hello」の2番目の文字 を表示しろ
文字列型の変数 s1 を作成して、 文字列「Hello, World」 で初期化しろ
文字列型の変数 s2 を作成して、 文字列「Hello, 」 で初期化しろ
変数 s2 の値に 文字列「World」 を足した結果を変数 s2 に代入しろ
変数 s1 の値を表示しろ
変数 s2 の値を表示しろ
変数 s1 の値 と 変数 s1 の値 が等しいの真偽 を表示しろ
変数 s2 の値 と 変数 s2 の値 が等しいの真偽 を表示しろ
変数 s1 の値 と 変数 s2 の値 が等しいの真偽 を表示しろ
変数 s1 の値 と 変数 s1 の値 が文字列として等しいの真偽 を表示しろ
変数 s2 の値 と 変数 s2 の値 が文字列として等しいの真偽 を表示しろ
変数 s1 の値 と 変数 s2 の値 が文字列として等しいの真偽 を表示しろ
文字列型の変数 s を作成して、 文字列「college of humanities and sciences」 で初期化しろ
もし 変数sの値 の長さ を 整数2 で割った結果 が 0 と等しいの真偽 が真なら以下を実行しろ
{
文字列「even」を表示しろ
}
そうでなければ以下を実行しろ
{
文字列「odd」を表示しろ
}
もし 変数sの値 の中で 文字列「ll」 が始まる位置が 整数0 以上の真偽 が真なら以下を実行しろ
{
文字列「Hello contains ll」を表示しろ
}
そうでなければ以下を実行しろ
{
文字列「Hello does not contain ll」を表示しろ
}
変数sの値の 整数8 文字目から 整数10 文字目までの部分文字列 を表示しろ
文字列型の変数 hello を作成して、 文字列「Hello」 で初期化しろ
変数sの値 を小文字に変換した結果 を表示しろ
変数sの値 を大文字に変換した結果 を表示しろ
ポイント
- 2つの文字列の中身が等しいかどうかは、
equals
を使いましょう==
とequals
の違いは2年生でC言語のポインタを学ぶとわかるかもしれません
授業内課題04-2
授業外課題03-4の自分の回答を改変し、変数px, py, rx, ryの値をランダムに設定して出力結果を確認せよ。 px, rxは0以上Windowの幅未満、py, ryは0以上Windowの高さ未満の範囲とする。 なお、px, py, rx, ryの値をコンソールに表示するようにすること。 また、完成したプログラムの読み下し文を書け。
解答例
int px = int(random(width));
int py = int(random(height));
int rx = int(random(width));
int ry = int(random(height));
int w = 200;
int h = 200;
if (rx <= px && px <= rx + w && ry <= py && py <= ry + h) {
println("inside");
} else {
println("outside");
}
読み下し文
整数型の変数 px を作成して、 0以上Windowの幅未満の乱数 を整数に変換した結果 で初期化しろ
整数型の変数 py を作成して、 0以上Windowの高さ未満の乱数 を整数に変換した結果 で初期化しろ
整数型の変数 rx を作成して、 0以上Windowの幅未満の乱数 を整数に変換した結果 で初期化しろ
整数型の変数 ry を作成して、 0以上Windowの高さ未満の乱数 を整数に変換した結果 で初期化しろ
整数型の変数 w を作成して、整数200 で初期化しろ
整数型の変数 h を作成して、整数200 で初期化しろ
もし
( ( ( 変数rxの値 が 変数pxの値以下の真偽
と 変数pxの値 が 変数rxの値 に 変数wの値を足した結果 以下の真偽の両方が真であるの真偽 )
と 変数ryの値 が 変数pyの値 以下の真偽 の両方が真であるの真偽 )
と 変数pxの値 が 変数rxの値 に 変数wの値を足した結果 以下の真偽の両方が真であるの真偽 )
が真なら以下を実行しろ
{
文字列「inside」を表示しろ
}
そうでなければ以下を実行しろ
{
文字列「outside」を表示しろ
}
授業内課題04-3
授業外課題03-5の自分の回答を改変し、変数x1, y1, r1, x2, y2, r2の値をランダムに設定して描画結果を確認せよ。 x1, x2は0以上Windowの幅未満、y1, y2は0以上Windowの高さ未満、r1, r2は50以上150以下の範囲とする。 また、完成したプログラムの読み下し文を書け。
解答例
size(400, 400);
noFill();
int x1 = int(random(width));
int y1 = int(random(height));
int r1 = int(random(50, 151));
int x2 = int(random(width));
int y2 = int(random(height));
int r2 = int(random(50, 151));
float d = dist(x1, y1, x2, y2);
if (d + r1 <= r2 || d + r2 <= r1) {
stroke(255, 0, 0);
} else if (d <= r1 + r2) {
stroke(0, 0, 255);
} else {
stroke(0, 0, 0);
}
ellipse(x1, y1, r1 * 2, r1 * 2);
ellipse(x2, y2, r2 * 2, r2 * 2);
読み下し文
画面の幅を 整数400 に、高さを 整数400 に設定しろ
塗り潰しをなしに設定しろ
整数型の変数 x1 を作成して、 0以上Windowの幅未満の乱数 を整数に変換した結果 で初期化しろ
整数型の変数 y1 を作成して、 0以上Windowの高さ未満の乱数 を整数に変換した結果 で初期化しろ
整数型の変数 r1 を作成して、 整数50以上整数151未満の乱数 を整数に変換した結果 で初期化しろ
整数型の変数 x2 を作成して、 0以上Windowの幅未満の乱数 を整数に変換した結果 で初期化しろ
整数型の変数 y2 を作成して、 0以上Windowの高さ未満の乱数 を整数に変換した結果 で初期化しろ
整数型の変数 r2を作成して、 整数50以上整数151未満の乱数 を整数に変換した結果 で初期化しろ
実数型の変数 d を作成して、 点( 変数x1の値 , 変数y1の値 )と点( 変数x2の値 , 変数y2の値 )の距離 で初期化しろ
もし 変数dの値 に 変数r1の値 を足した結果 が 変数r2の値 以下の真偽 と
変数dの値に 変数r2の値 を足した結果 が 変数r1の値 以下の真偽
のどちらかが真であるの真偽 が真なら以下を実行しろ
{
塗り潰し色を( 整数255 , 整数0 , 整数0 )に設定しろ
}
そうでなくて、もし 変数dの値 が 変数r1の値 に 変数r2 の値を足した結果 以下の真偽 が真なら以下を実行しろ
{
塗り潰し色を( 整数0 , 整数0 , 整数255 )に設定しろ
}
そうでなければ以下を実行しろ
{
塗り潰し色を( 整数0 , 整数0 , 整数0 )に設定しろ
}
中心の座標を( 変数x1の値 , 変数y1の値 )とした幅 変数r1の値 に 整数2 を掛けた結果 、高さ 変数r1の値 に 整数2 を掛けた結果 の楕円を描画しろ
中心の座標を( 変数x2の値 , 変数y2の値 )とした幅 変数r2の値 に 整数2 を掛けた結果 、高さ 変数r2の値 に 整数2 を掛けた結果 の楕円を描画しろ
授業内課題04-4
変数nを0以上100以下の乱数で初期化し、nが3で割り切れたら「fizz」、5で割り切れたら「buzz」、3でも5でも割り切れたら「fizz buzz」、いずれでもなければnの値を表示するプログラムを作成せよ。
解答例
int n = int(random(101));
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);
}
読み下し文
整数型の変数 n を作成して、 0以上整数101未満の乱数 を整数に変換した結果 で初期化しろ で初期化しろ
もし 変数nの値 を 整数3 で割った余り が 整数0 と等しいの真偽
と変数nの値 を 整数5 で割った余り が 整数0 と等しいの真偽
の両方が真であるの真偽 が真なら以下を実行しろ
{
文字列「fizz buzz」を表示しろ
}
そうでなくて、もし [条件式2] が真なら以下を実行しろ
{
文字列「fizz」を表示しろ
}
そうでなくて、もし [条件式2] が真なら以下を実行しろ
{
文字列「buzz」を表示しろ
}
そうでなければ以下を実行しろ
{
変数nの値 を表示しろ
}
授業内課題04-5
下図のように、中心に縦線と横線を引き、画面中のランダムな位置に半径50の円を描画する。
円の色は、4等分した領域の右上に円の中心があるとき青色、右下にあるとき白色、左下にあるとき緑色、左上にあるとき赤色に設定すること。
size
関数によって画面の幅と高さを変化させても、他の箇所の変更は不要となるようにせよ。
解答例
size(400, 400);
int r = 50;
int cx = int(random(width));
int cy = int(random(height));
line(0, height / 2, width, height / 2);
line(width / 2, 0, width / 2, height);
if (cx < width / 2) {
if (cy < height / 2) {
fill(255, 0, 0);
} else {
fill(0, 255, 0);
}
} else {
if (cy < height / 2) {
fill(0, 0, 255);
} else {
fill(255, 255, 255);
}
}
ellipse(cx, cy, 2 * r, 2 * r);
授業外レポート
授業外課題04-1
寿司打( http://neutral.x0.com/home/sushida/play2.html )「5000円コース」をプレイし、以下のスコアを報告せよ(スピードは任意)
- 成績(xxx円分得 or 損した)
- 正しく打ったキーの数
- 平均キータイプ数(回 / 秒)
- ミスタイプ数
授業外課題04-2
以下のプログラムについて、(1) 読み下し文を書き、(2) 実行結果を予測せよ。 プログラムを実行し予測と合っていたか確かめよ。
String s = "Hello";
println(s.toLowerCase().toUpperCase());
println(s.equals(s.substring(0, s.length())));
int w = 400;
int h = 400;
int x = int(random(w));
int y = int(random(h));
println("x = " + x);
println("y = " + y);
if (x < w / 3) {
println("左");
} else if (x < w * 2 / 3) {
if (y < h / 2) {
println("上");
} else {
println("下");
}
} else {
println("右");
}
授業外課題04-3
コンソールに、10%の確率で「当たり」、残り90%の確率で「外れ」と出力するプログラムを作成せよ。 また、完成したプログラムの読み下し文を書け。
授業外課題04-4
3つの6面サイコロを振り、出た目の合計値を出力するプログラムを作成せよ。 また、完成したプログラムの読み下し文を書け。
授業外課題04-5
下図のように、画面の対角線に線分を引き、画面中のランダムな位置に半径50の円を描画する。
円の色は、対角線で4等分した領域の右側に円の中心があるとき青色、上側にあるとき白色、左側にあるとき緑色、下側にあるとき赤色に設定すること。
size
関数によって画面の幅と高さを変化させても、他の箇所の変更は不要となるようにせよ。