プログラミングを頑張る日記

プログラミングを勉強して、ハッカーになろう

C++を頑張る(4)

今日はC++をやってみます。
こんな感じでシャッフルしてるから身につかない気がしますが、
もうこんな勉強が癖になってしまっています。うひー。

関数プロトタイプ

関数は変数と同じように使う前に宣言していなければいけません。
当たり前のことではありますが、
関数は宣言した時に処理の定義もしているので、
いざ処理の流れを追う時に下から上に読んだりしなくてはいけなくて
不便というか不自然というか。

void output_answer(int n, int m){
    printf("%d+%d%dです。\n", n, m, n + m);
    printf("%d-%d%dです。\n", n, m, n - m);
    printf("%d*%d%dです。\n", n, m, n * m);
    printf("%d/%d%dです。\n", n, m, n / m);
}

void input_num(int& n,int& m){
    cout << "1つ目の数値を入力してください:" << flush;
    cin >> n;
    cout << "2つ目の数値を入力してください:" << flush;
    cin >> m;
    
}

int main() {
    int n, m;
    input_num(n, m);
    output_answer(n, m);
}

登場する関数が少ないのでまだマシだとは思いますが、
処理の流れ的には下から読まないと行けないです。
まあ上2つの関数の順番はどっちでもいいのですが。
でも理想としては、関数がスタートするmain()の定義が
一番上に来てほしい感じがします。

というわけで、定義はともかく宣言だけでも先にして、
関数を使えるようにしちゃおう、というのが関数プロトタイプのようです。
実際に関数プロトタイプを使って書き直してみます。

#include <iostream>
#include <cstdio>
using namespace std;

// 宣言
void output_answer(int n, int m);
void input_num(int& n,int& m);
// 宣言ここまで
// 実装
int main() {
    int n, m;
    input_num(n, m);
    output_answer(n, m);
}

void input_num(int& n,int& m){
    cout << "1つ目の数値を入力してください:" << flush;
    cin >> n;
    cout << "2つ目の数値を入力してください:" << flush;
    cin >> m;
    
}

void output_answer(int n, int m){
    printf("%d+%d%dです。\n", n, m, n + m);
    printf("%d-%d%dです。\n", n, m, n - m);
    printf("%d*%d%dです。\n", n, m, n * m);
    printf("%d/%d%dです。\n", n, m, n / m);
}
// 実装ここまで

うん、これが自然なのではないでしょうか。

関数プロトタイプを使うことで関数を呼べるということから、
・引数の型と数
・戻り値の型
・関数の名前
さえわかっていれば関数は使えるということがわかります。
これらが関数にとって一番大事なことなんでしょう。
さて、この関数プロトタイプとも関連するという
インクルードの説明が次の章です。

インクルード

今まで必ずひっついていた"#include"のお話が遂にです。

関数は宣言しないと使えないはずですが、これまでcoutやら
printfは宣言せずに使ってきました。
これらは別に宣言しなくても使える関数というわけではなく
別のところで宣言が済んでいるか使えていたそうです。
その別のところというのがiostreamだったりcstdioであるそうです。

そしてその宣言されているファイルを埋め込んで2つ以上のファイルを
合成する命令こそが"include"だそうです。

どっかにiostreamという名前のファイルがあって、
その中にはcoutだったりcinの関数定義がいっぱい書かれていて、
こっちがcppファイルの先頭で"#include "とすることで
そのファイルがこちらのファイルに埋め込まれて関数が使えるようになると。

このようにインクルードされるファイルのことをヘッダファイルと言います。
自分で作ることもできますが、iostreamのように標準であるものは
標準ヘッダファイルと言うそうです。
標準ヘッダファイルは"#include "とインクルードしますが、
それ以外のヘッダファイルは"#include "hogehoge.h""とするそうです。
(ダブルクオートだらけになっちゃいました。)

せっかくなのでさっき作った関数たちをヘッダファイルに追い出してみます。

// mycalculate.h
#include <iostream>
#include <cstdio>
using namespace std;

void input_num(int& n,int& m){
    cout << "1つ目の数値を入力してください:" << flush;
    cin >> n;
    cout << "2つ目の数値を入力してください:" << flush;
    cin >> m;
    
}

void output_answer(int n, int m){
    printf("%d+%d%dです。\n", n, m, n + m);
    printf("%d-%d%dです。\n", n, m, n - m);
    printf("%d*%d%dです。\n", n, m, n * m);
    printf("%d/%d%dです。\n", n, m, n / m);
}
// main.cpp
#include "mycalculate.h"
int main() {
    int n, m;
    input_num(n, m);
    output_answer(n, m);
}

main.cppの中身がすごくスッキリしました。
ヘッダファイルはcppファイルと同じフォルダに置いています。
多分フォルダ分けるべきなんだろうなあとは思います。

少し短めですが、次の章からはまた違う話になるようなので
今日はここまでです。それでは。