その3

Table of Contents

やること

  1. if 文を使う
  2. これまで使ってきたもので応用的なことをやってみる

解説

if 文はある条件の時のみ指定された操作を実行するものです。

ついでにこれまで使ってきたもので応用的なこともやってみましょう。

if 文を使う

if 文は

if (実行条件)
{
    やりたいことを書く
}

という形式で書きます。

実行条件は bool 型を入れるので,

if( 9*9 < 100 )

のように条件式を直接書いてもいいですし,

bool test = 9*9 < 100
if( test )

のように変数を入れてもいいです。

bool 型の false は整数の 0 で表わされることがよくあるので,

if( 0 )

if( false )

と同じ意味を持ちます。

また,if 文とセットで else 文もよく使われます。 else 文は if 文で実行条件が false の時に実行されます。 使い方は

if( false )
{
    //こっちは実行されない
}
else
{
    //こっちが実行される
}

のように使います。

また,

if( 条件A )
    // 処理 A
else if( 条件 B )
    // 処理 B
else if( 条件 C )
    // 処理 C
else
    // 処理 D

のようにすることもできます。

if, else 文で例えば,プログラムを実行する人(プレイヤー)に 1+1 を解いてもらうゲームを作れます。

#include <iostream>
using namespace std;

int main(){
// 問題を表示する
cout << "1+1 = ?" << endl;

// プレイヤーに答えを入力してもらう
cout << "Please type: " ;
int your_answer;
cin >> your_answer; // ここでプレイヤーがキーボードから数字を入力する

// 答えに応じて出力を変える
if( your_answer == 2 )
{
    // 正解のとき
    cout << "YES!!! YOU ARE GREAT!!!" << endl;
}
else
{
    // はずれのとき
    cout << "NO!!! The answer is 2" << endl;
    cout << "FOOL! FOOL! YOU ARE FOOL!" << endl;
}

return 0;
}

応用的なこと

o上のプログラムは 2 以外のものを入力するとハズレとみなします。 数字ではなく文字を入力したときもハズレとみなします。

数字以外の物を入力したときに,プレイヤーに再入力させるにはどうしたらいいでしょうか? 一つの方法は,while 文で数字が入力されるまでループさせる,というものです。

#include <iostream>
using namespace std;

int main(){
// 問題を表示する
cout << "1+1 = ?" << endl;

// プレイヤーに答えを入力してもらう
cout << "Please type: " ;

int your_answer;
cin >> your_answer; // ここでプレイヤーがキーボードから数字を入力する

while( cin.fail() )
  {
    cin.clear(); // エラーの状態をリセットする。ここの前後で cin.fail() が 1 から 0 に変わる
    cin.ignore(); // バッファーのものを削除する

    cout << "You typed : " << your_answer << endl;
    cout << "Please type: " ;
    cin >> your_answer;
  }

// 答えに応じて出力を変える
if( your_answer == 2 )
  {
      // 正解のとき
      cout << "YES!!! YOU ARE GREAT!!!" << endl;
  }
else
  {
      // はずれのとき
      cout << "NO!!! The answer is 2" << endl;
      cout << "FOOL! FOOL! YOU ARE FOOL!" << endl;
  }

return 0;
}

これを実行してみると

# 成功例
mail:cpp genki$ ./a.out
1+1 = ?
Please type: 2
YES!!! YOU ARE GREAT!!!

# 失敗例1
mail:cpp genki$ ./a.out
1+1 = ?
Please type: 1
NO!!! The answer is 2
FOOL! FOOL! YOU ARE FOOL!

# 失敗例2
mail:cpp genki$ ./a.out
1+1 = ?
Please type: a
You typed : 0
Please type: b
You typed : 0
Please type: 2
YES!!! YOU ARE GREAT!!!

# 失敗例3
mail:cpp genki$ ./a.out
1+1 = ?
Please type: abc
You typed : 0
Please type: You typed : 0
Please type: You typed : 0
Please type: abc
You typed : 0
Please type: You typed : 0
Please type: You typed : 0
Please type: 2
YES!!! YOU ARE GREAT!!!

成功例,失敗例1は改造前のプログラムと同じです。

失敗例2では間違って,“a”, “b” を打っていますが,プログラムは再入力を促しています。 “You typed: 0” となっているのは,cin が fail 状態になったとき,0 が格納されるという仕様のためです。 cin が fail かどうかを調べるには “cin.fail()” を使います。 また,すでに格納されたものを無視するには “cin.ignore()” を使います。 よく意味がわからないときは,ignore の箇所をコメントアウトしてみましょう。 おそらく,次の cin で入力待ちにならず無限ループに陥るのではないでしょうか? 最初に入力したものが cin に残っているので,次の入力に移ることなく while 文の継続判定に進んでしまうのです。 これを避けるために ignore を使います。

失敗例3では複数文字を入力しました。 すると,勝手にループを 3 周して cin の入力待ちになりました。 これは ignore で 1 文字ずつしか削除していないためです。 cin_ignore に ignore の説明があり,この問題を回避するヒントになります。

課題

ここまでで

をやって来ました。 これらを使うといろいろなことができます。

はじめに,サンプルプログラムを実行して,読んでみましょう。

課題1

その2 の課題1では九九の表を書きました。 これの一部を書き換えて,

という表を出力してください。 つまり,以下のものを出力してください。

1 |        1        2     Fizz        4     Buzz     Fizz        7        8     Fizz
2 |        2        4     Fizz        8     Buzz     Fizz       14       16     Fizz
3 |     Fizz     Fizz     Fizz     Fizz FizzBuzz     Fizz     Fizz     Fizz     Fizz
4 |        4        8     Fizz       16     Buzz     Fizz       28       32     Fizz
5 |     Buzz     Buzz FizzBuzz     Buzz     Buzz FizzBuzz     Buzz     Buzz FizzBuzz
6 |     Fizz     Fizz     Fizz     Fizz FizzBuzz     Fizz     Fizz     Fizz     Fizz
7 |        7       14     Fizz       28     Buzz     Fizz       49       56     Fizz
8 |        8       16     Fizz       32     Buzz     Fizz       56       64     Fizz
9 |     Fizz     Fizz     Fizz     Fizz FizzBuzz     Fizz     Fizz     Fizz     Fizz

これは Fizz Buzz と呼ばれる英語圏の言葉遊びだそうです。

回答例

課題2

フィボナッチ数列 0, 1, 1, 2, 3, 5, … は以下のように書けます。

\( a_{i} = 0 \ \ (i = 0) \)

\( a_{i} = 1 \ \ (i = 1) \)

\( a_{i} = a_{i-1} + a_{i-2} \ \ (i=2, 3, 4, ....) \) 

フィボナッチ数列を i=0 から 9 まで以下のように出力しましょう。

a0: 0
a1: 1
a2: 1
a3: 2
a4: 3
a5: 5
a6: 8
a7: 13
a8: 21
a9: 34

回答例

課題3

以下のようなもの(プログレスバー)を作ってみましょう。

回答例

実際は自分で作るより,誰かの作ったものを使ったほうが簡単ですが・・・・・・