next up previous contents
Next: 14. 制御構造 II Up: 13. 関数 III Previous: 5. グローバル変数

6. 課題 13

cd c を実行した後で( ~/c に移動した後で)、以下の課題を やってみよ。

課題 13.1
関数の宣言時におけるコンパイルエラー

本文の「コンパイルエラーになる例」を入力し、実際にコンパイルしてみて、 エラーが出ることを確かめよ。 次に、関数宣言をつけ加えて、エラーが出なくなることを確認せよ。

課題 13.2
ロールプレイングゲーム作る。

主人公は地下のダンジョンを冒険し、より深い地下に降りて行くのが使命である。 地下の階はある広さがあり、主人公の位置は(7,4)のように座標で表される。 敵は1人だけしか一度には出てこないが、 敵を殺すと新たな敵があらわれる。 敵は動けないが、強さや装甲の堅さは乱数で決める。主人公が、敵と同じマス目に 入ると戦闘が始まる(逃げる事も出来るが、逃走が成功するかどうかも乱数で決 める。)。戦って勝利すると、敵が持っている 強化アイテムを手に入れられる(持ってないときもある)。また、マップには 薬が必ず落ちている。薬には主人公の生命力を回復させる働きがあり、その度合 により強さがあり、薬を拾うとその強さが加算されて行く。薬を使うと 薬はなくなってしまう。 敵の位置は分からない。また、地下への階段がどこかに必ずある。

以下のプログラムを入力せよ。但し、以下のプログラムの関数の定義には 関数の型がわざと省略されているので適切な関数の型を書き加えよ。 更に、関数宣言をしてないので、適切な関数宣言をせよ。 また、それぞれの関数のゲーム上での役割を簡単に説明せよ。

プレイしてみて、問題がないかどうか確かめよ。

作成した関数宣言(整数型の関数や引数のないものも完全に関数宣言すること) と解説(その関数のゲーム中での役割についての簡単な説明)をメイルで、 creport まで送ること。但し、題は kadai13 とすること。

プログラム自体はネットには掲載していません。

前回の復習
関数の型
関数の返り値の型

関数の定義において、関数名の前に関数の型を以下のように書くことで、 返り値の型を定義出来る。


    [関数の型]  関数名( 引数の型 引数 [,...] ){
            文
    }

関数の返り値がない場合は、void を指定する。 (関数の型を省略すると整数型になる点に注意)

引数のない関数
引数を持たない関数の定義

引数のない関数を定義する際に、引数を記述しないと、引数のチェックを行わない だけで、引数のない関数を定義したことにはならない。引数のない関数を指定する ときは、void を用いる。


    noarg( void ){
        ...
    }

上の関数定義では、関数の型を省略しているので、整数型、引数には void を 指定しているので、引数はなしとなる。

関数の宣言

関数が定義される前に、関数が使用されると、コンパイラはその関数を整数型と 仮定してしまい、実際の関数の定義と一致しない事が出てくる(勿論、その場合、 コンパイルエラーとなる)。そこで、コンパイラにあらかじめ関数の仕様を教えて おけば、このようなコンパイルエラーを防ぐことが出来、同時にプログラムミスの 防止にもなる。

関数の宣言は、ファイルの先頭で、以下のように行う。


    [関数の型]  関数名( 引数の型 [,...]);

宣言は、最後にセミコロンをつけるのを忘れてはならない。 また、引数の変数名はあっても良いが、単に無視されるだけである。即ち、 宣言に書いた変数名は、いかなる意味においても意味を持たない。

グローバル変数

これまで我々が学習してきた変数はローカル変数と呼ばれ、必ず {} の間で宣言してきた(例えば関数の中)。即ち、{} に囲まれているとその中でのみ使用可能となる。これに対して、いかなる中括弧にも 囲まれていない箇所に宣言された変数をグローバル変数という。実は、C 言語では、 グローバル変数には2種類あるのだが、ここでは我々はこの点についてこれ以上 学習はしない。ただ、中括弧に囲まれていない箇所に宣言された変数は、そのファイル にあるどの関数(メイン関数を含む)からも使う事が出来ることを覚えて置けば 十分である。

通常、グローバル変数は、ファイルの先頭、#include や関数宣言の後に書いて おけば良いであろう。

課題13訂正

課題13のプログラム中で、

fflush(stdin)

は全て

fgets(buf)

に書き換え、その関数の最初の変数宣言に

char buf[256];

を書き加えること。



Noriyo Kanayama