2017年10月12日
《その76》 ヘッダ と ソースファイル(p.337演習9-6)
ヘッダ
複数のソースファイルで利用する変数や関数の宣言は、ヘッダに記述します。
--[ヘッダの例 sample.h]-----------
void function1(); // 関数の宣言
int function2(int x, int y); // 〃
int function3(); // 〃
extern int a1; // 変数 a1 の extern宣言
/*
extern宣言は『定義ではない宣言』で、
別の場所で定義されている 変数 a1 の利用を宣言しています。
*/
------------------------------------
※ オブジェクトや関数は、プログラムの中で一度だけ定義しなければならないから、
上のヘッダ sample.h で宣言している 変数や関数は、別ファイルのどこかで必ず一度だけ
定義されています。
※ ヘッダに記述するのは、外部結合をもつオブジェクトや関数です。
内部結合と外部結合
内部結合
オブジェクトや関数が、自身が宣言されたソースファイルでのみ通用する性質
[内部結合をもつもの]
● static付きで定義されたオブジェクトや関数
例: static int a2;
static void function4();
● インライン関数
● constを付けて宣言された定値オブジェクト
外部結合
オブジェクトや関数が、自身が宣言されたソースファイルだけでなく、別のソースファイル
でも通用する性質
[外部結合をもつもの]
● staticをつけずに定義された関数
● 関数の外で定義されたオブジェクト
新版明解C++入門編 p.337 演習9-6
数当てゲーム第2版を以下のように変更したプログラムを作成せよ。
● 当てるべき数を 0 〜 999 とする。
● プレーヤが数値を入力できる回数を最大で 10回までに制限する。
● 入力ミスを行った( 0 〜 999 以外の数を入力した)場合は、回数としてカウントしない。
● 正解した場合は何回で正解したのかを表示し、最後まで正解しなかった場青は正解を表示する。
4つのファイル kazuate.h
game.cpp
io.cpp
kazuate.cpp
を順に記述します。
// kazuate.h
void initialize();
void gen_no();
int judge(int cand);
int input();
int confirm_retry();
extern int max_no;
extern int kotae;
// game.cpp
#include <ctime>
#include <cstdlib>
#include "kazuate.h"
using namespace std;
int kotae = 0;
void initialize()
{
srand((unsigned int)time(NULL));
}
void gen_no()
{
kotae = rand() % (max_no + 1);
}
int judge(int cand)
{
if (cand == kotae)
return 0;
else if (cand > kotae)
return 1;
else
return 2;
}
// io.cpp
#include <iostream>
#include "kazuate.h"
using namespace std;
static void prompt()
{
cout << "0〜" << max_no << "の数:";
}
int input()
{
int val;
do {
prompt();
cin >> val;
} while (val < 0 || val > max_no);
return val;
}
int confirm_retry()
{
int cont;
cout << "もう一度しますか?\n"
<< "> cont;
if (cont)
cout << '\n';
return cont;
}
// kazuate.cpp
#include <iostream>
#include "kazuate.h"
using namespace std;
int max_no = 999;
int main()
{
initialize();
cout << "開始!\n";
do {
gen_no();
int hantei;
int chal_n;
for (chal_n = 1; chal_n <= 10; chal_n++) {
hantei = judge(input());
if (hantei == 1)
cout << "\aもっと小さい。\n";
else if (hantei == 2)
cout << "\aもっと大きい。\n";
else
break;
}
if (hantei == 0) cout << "正解! 挑戦回数 : " << chal_n << '\n';
else cout << "制限回数オーバー!! 正解は " << kotae << "でした" << '\n';
} while (confirm_retry());
}
◆ ビルド(B) → kazuateV2 のビルド(U)
◆ デバッグ(D) → デバッグなしで開始(H)
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6803955
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック