C++入門（簡潔編）第2回

前回の終わりは乱数の使用でした。

※ `rand` はC++14でdeprecatedになりました。また `rand` に依存していた `std::random_shuffle` も `C++14` でdeprecatedになり、C++17で廃止されました。
コーディングの流れ等を掴んでいただけたらと思います。廃止されたコードを使用して申し訳ないです(T_T)

```C++:
//ransu.cpp
#include <iostream>
#include <cstdlib>   //rand()を使うために必要
using namespace std;

int main()
{
    cout << rand() << endl;
    cout << rand() << endl;
    cout << rand() << endl;
}
```

のようにするとランダムで数字が出てくる
`rand()` という関数は `#include <cstdlib>` がないと使えません。

`cout`や `cin` を使うためには `#include <iostream>` を
`rand()` を使うときには `#include <cstdlib>` を


現在の時刻をもとに発生する乱数のもとを決める行なのです。したがって、プログラムを実行する時刻が異なれば、`rand()` から異なる乱数が得られる
↓コード

```C++:
//ransu2.cpp
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    srand( (unsigned)time( NULL ) );

    cout << rand() << endl;
    cout << rand() << endl;
    cout << rand() << endl;
}
```

たとえば、「1から10までの間のでたらめな数」が必要とかの場合
例えば `rand() % 7` としてしまえば、それは0から6までのどれかになる
0から4までは `rand() % 5`
1から3までのでたらめな整数がほしければ、 `rand() % 3 + 1`

1から10までの乱数を3つ発生させるプログラム

```C++:
//ransu3.cpp
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    srand( (unsigned)time( NULL ) );

    cout << rand() % 10 + 1 << endl;
    cout << rand() % 10 + 1 << endl;
    cout << rand() % 10 + 1 << endl;
}
```

「おみくじ」
「自分のラッキーナンバー」を入力
ランダム数と入力数次第で大吉などがでる

```C++:
//omikuji.cpp
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

class Omikuji
{
    int un;  //ラッキーナンバー
public:
    Omikuji();   //コンストラクタ
    void hiku();
};

//コンストラクタ、ラッキーナンバーをユーザに代入してもらいます
Omikuji::Omikuji()
{
    srand( (unsigned)time( NULL ) );
    cout<<"自分のラッキーナンバー（1～5）を入力してください。"<<endl;
    cin>>un;  //自分のラッキーナンバーを代入
}

//おみくじを引く
void Omikuji::hiku()
{
    int x;
    x = rand() % 5 + 1;   //1～5の乱数を発生させ、ｘに代入、これが引いたおみくじの番号
    cout << "あなたの運勢は";
    if(x == un){                                            //xとunが等しければ大吉
        cout << "大吉ということです。" << endl;
    }
    else{                                                    //xとunが等しくなければ「普通」
        cout<<"並みということです。"<<endl;
    }
}

int main()
{
    Omikuji today;  //今日のおみくじ
    today.hiku();
}
```


```C++:出力
自分のラッキーナンバー（1～5)を入力してください。
○
あなたの運勢は大吉と言うことです。
```

クラスを作成しなくてもできる、そのぱたーんがこれ

```C++:
//omikuji2.cpp
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    int un;  //ラッキーナンバー
    cout << "自分のラッキーナンバー（1～5）を入力してください。" << endl;
    cin >> un;  //自分のラッキーナンバーを代入
    srand( (unsigned)time( NULL ) );
    int x;
    x = rand() % 5 + 1;  //引いたおみくじの番号
    cout << "あなたの運勢は";
    if(x == un){                                            //xとunが等しければ大吉
        cout << "大吉ということです。" << endl;
    }
    else{                                                    //xとunが等しくなければ「普通」
        cout<<"並みということです。"<<endl;
    }
}
```

繰り返し

while文

```:
while(条件){
        処理
    }

```



```:
//while_sample.cpp
#include <iostream>
using namespace std;

int main()
{
    int i;
    i = 0;
    while(i < 100){
        cout << i << "  "; //見やすさのため数字の後に空白をいれた
        i++;                   //iを１増やせという意味です。（下を参照）
    }
}

```
0~99間での数字が出力される
このとき++をつけなかったら、無限ループになるので、breakやif文を使用する


```:
//quiz.cpp
#include <iostream>
using namespace std;

int main()
{
    int i;
    while(1){
        cout << "日本一高い山はどれですか。" << endl;
        cout << "数字を入力してください。" << endl;
        cout << "1.ヒマラヤ　2.富士山　3.ロッキー" << endl;
        cin >> i;
        if(i == 2){
            break;
        }
        cout << "はずれです。" << endl;  //不正解の場合breakされないので
                                                     //この文が実行される。
    }
    //ループ終了後次の文が実行される。
    cout<<"正解なので終了しました。"<<endl;
}

```
while(1)とすることでtrueになり、無限になる


値を戻す関数
「値を戻さない」と宣言しているのが、関数の前のvoid
naku()の前にはvoidがあります
この関数が何も戻さないという意味の宣言

今回は、このような「値を戻さない関数」ではなく「値を戻す関数」を紹介

```:ex1.cpp
#include <iostream>
using namespace std;

//関数func()を定義します。
void func()
{
    cout << "こんにちは。私はコンピュータです。" << endl;
}

int main()
{
    func();   //funcを使っている。
}

```

クラスとは何の関係もない関数を定義することもできこのような関数をグローバル関数という

```:ex2.cpp
#include <iostream>
using namespace std;

//関数func()を定義します。
int func()
{
    cout << "こんにちは。私はコンピュータです。" << endl;
    return 1;   //整数値１を戻す
}

int main()
{
    func();     //func()を使っている。
}

```

結果ははじめのものと全く同じ
funcの定義の前がvoidではなくintであること
「intすなわち、整数を戻す関数である」という意味
今回は戻された値は何の役も果たしていない

```:ex3.cpp
#include <iostream>
using namespace std;

//関数func()を定義します。
int func()
{
    cout<<"こんにちは。私はコンピュータです。"<<endl;
    return 1;   //整数値１を戻す
}

int main()
{
    int d;      //整数変数dの宣言（「整数dを使うよ」という意味）    
    d = func(); //考え込むと不思議な文ですが、次のような意味になります。
                //まず、func()の中身が実行される。
                //そして、この関数から戻された値１がdに代入される。 
    cout << "func()から戻された値＝" << d << endl;  //dの値を出力
}

```

```:結果
こんにちは。私はコンピュータです。
func()から戻された値は=1

```

func()の中身がまず実行され、次に値１が戻され、それがdに代入されることになる

```:tasizan.cpp
#include <iostream>
using namespace std;

//足し算をする関数
int add()
{
    int a, b;  //二つの整数をいれる変数
    cout << "これから二つの整数の足し算をします。" << endl;
    cout << "まず、ひとつめの整数を入力してください。" << endl;
    cin >> a;
    cout << "もうひとつの整数を入力してください。" << endl;
    cin >> b;
    //次のreturnで合計を戻す
    return a + b;
}

int main()
{
    int d = add(); //整数変数dが宣言され、すぐにadd()が実行され、その戻す値がdに代入される。
    cout << "合計：" << d << endl;
}

```

```:結果
入力してくださいx2
合計:7

```

```:neko4.cpp
#include <iostream>
#include <string>  //stringを使うために必要
using namespace std;

class Neko
{
    string name;  //名前
    int tairyoku; //体力
public:
    Neko(string n) : name(n), tairyoku(10){}
    int syokuji();  //食事を（ユーザから）もらう関数
    int naku();     //鳴く関数
};

int Neko::syokuji(){
    cout << name << "に食事をさせます。どれだけ食べさせますか？" << endl;
    cout << "半角の数字で入力してください。" << endl;
    int food;          //食べさせる量　ユーザに決めてもらう
    cin >> food;
    tairyoku += food; 
    return tairyoku;   //tairyokuの値を戻す
}

int Neko::naku()
{
    cout << "にゃあ。俺様は" << name << "だ。" << endl; 
    tairyoku -= 5; 
    return tairyoku;   //tairyokuの値を戻す
}

int main()
{
    cout << "猫をメモリ上に生成します。名前を決めてください。" << endl;
    string temp;
    cin >> temp;    
    Neko kai_neko(temp);  //飼い猫の生成　名はユーザがtempに入力したもの
    cout << endl;
    for(int i = 0; i < 5 ;i++){  //５回だけメモリ上の猫と遊ぶプログラムです
        cout << "どうします？" << endl;  
        cout << "1 食事を与える　2 鳴かす" << endl;
        cout << "半角の数字で入力してください。" << endl;
        int ans;
        cin >> ans;
        if(ans == 1){
            int t;
            t = kai_neko.syokuji();  //まず、Neko::syokujiの内容が実行され、その結果の体力が
            //Neko::syokujiの戻り値として与えられ、tに代入される。
            cout << "猫の体力＝" << t << endl;
        }
        else if(ans == 2){ 
            int t;  //上のtとは別の｛　｝ブロック内にあるので全く無関係
            t = kai_neko.naku();  //まず、Neko::nakuの内容が実行され、その結果の体力が
            //Neko::nakuの戻り値として与えられ、tに代入される。
            cout << "猫の体力＝" << t << endl;
            if(t < 0){
                cout << "食事が不十分だったので、猫は隣のお金持ちの家に行ってしまいました。"<<endl;
                break;  //for文からぬけろという命令　体力が負になったらおしまいということです
            }    //if(t<0)のかっこ閉じる
        }        //if(ans==2)のかっこ閉じる
        cout << endl; //見やすさのための改行
    }            //for(i=0;i<5;i++)のかっこ閉じる
    cout<<"おわり"<<endl;
}

```

```:
猫をメモリ上に生成します。名前を決めてください。
○

どうします？
1食事を与える　2鳴かす
半角数字で入力してください
1
○に食事をさせます。どれだけ食べさせますか？
半角の数字で入力してください。
10
猫の体力=20

どうします？
.
.
.

```


mainもよく見ると、関数の定義と同じ形

```:
int main()
{
    ．．．
｝

```

mainは、プログラムの中心を表わすグローバル関数
mainの最後に「return 0;」と書くのが「正式」
ただし、C++では、mainの最後に何も書かなければ、自動的にそこに「return 0;」があることになる
「mainはintを戻す関数」ということはおぼえておきましょう。