『楽しく!』『できる!!』C講座のページ


第3回:ダメージを計算しよう!

・変数
 例えばRPGでの戦闘時のダメージを計算する式が、
(攻撃力 − 守備力)× 1.5 = ダメージ
という式で与えられるとします。
つまり、攻撃力7の勇者の攻撃は守備力5のモンスターに3のダメージをあたえるわけです。
しかし攻撃力はキャラによって違いますし、守備力もモンスターによって異なります。そのたびに計算式を組み立て直すのは面倒です。そこで上の式を
(x − y )× 1.5 = a
とすれば、x、y、 aの値を変化させることで計算式が一つで済みます。
このとき、用いるx、y、aが変数です。数字を入れておける箱を想像するといいでしょう。

・第3回 「ダメージの計算をしよう!」

 今回のテーマは上のとおり「ダメージを計算しよう!」です。(要するに「四則演算」ですがそれでは、あまりにおもしろくないので…(苦笑))

今回のソースは

#include <stdio.h>

/*ダメージ計算プログラム*/

void main(void)
{

int x,y;     //整数としてx,y,zを使用する
double z;    //小数を扱える型としてzを使用する

printf("自分の攻撃力と敵の防御力を入力してください。\n");
printf("ダメージを計算します。\n");

printf("自分の攻撃力:");
scanf("%d",&x);         //自分の攻撃力をxに代入する
printf("敵の防御力:");
scanf("%d",&y);         //敵の防御力をyに代入する

z = (x - y) * 1.5;   // ダメージを計算してzに代入

printf("敵に与えるダメージ => %f",z);  //zの値を出力する

}

です。
 このソースを打ちこんで、コンパイル、実行してみてください。
 どうでしょう。自分の攻撃力と相手の防御力を入力すると敵に与えるダメージを算出するプログラムが完成したはずです。


・四則演算って……何?
 まず、四則演算とは…。って聞いた事ありますよね。 いわゆる足し算、引き算、掛け算、割り算、の四つの演算のことです。

・ コメント文
 ソース中に /* ではじまり、*/で終わる部分と、//という部分があります。
/* 〜 */で囲まれた部分と//以降の文。それらはコメント文と呼ばれプログラムの中ではコンパイル時に無視されます。
これは、自分や他人の理解を助けるための注釈などに使用します。

つまり、
     // この部分や
     /* こんな部分はコンパイルされな〜い */
というわけです。

一週間も立てば「自分の書いたプログラムも他人が書いたプログラムになる」と言われるのですが、自分のかいたプログラムでさえ忘れてしまうものです。
極力コメント文はつけるようにしてください。
 以下の例にもコメント文を用いています。見つけてみてください。

・ C言語における変数
 基本的なことは数学で出てくる変数となんら変わるところはありません。数学でx,y,…などとでできたものと同じように、数字を代入して使います。
 ただ、C言語で変数を扱うときいくつか気を付けることがあります。

@ すべての変数は使用前に宣言しなければならない
A (x=1)=(1=x)でない

@ は当然といえば当然でしょう。いきなり「x」といわれてもxがどんな性質をもつのか分かりません。そこで宣言として

int x,y;    //x,y は整数として使いますよ。
double z;   //z は倍精度浮動小数点数として使いますよ。

と宣言するわけです。書式は

型名 変数名1,変数名2,…,変数名n;

です。上のように、型名の後ろに一文字分スペースを入れ、その後ろに変数名を書きます。変数名は動作環境などによって文字数に制限があったり、コンピュータに最初から設定されているものは使えなかったりするので、めちゃくちゃ長い名前などは避けましょう。 また、x,yのように同じ型を宣言するときはコンマで区切って一度に宣言できます。

A ですが、x=1と1=xは等しくありません。C言語における"="はイコールではなく右辺の値を左辺の変数に"代入すること"を意味します。

x=1はxに1が代入されますが、1=xでは1にxという変数を代入しようとしてエラーが起こるわけです。

・printfと変数
 次に変数に代入された値を出力する方法ですが、例えば変数 a に代入された値を出力しようとする場合
printf("a");
ではダメです。これでは a という文字のみが表示されます。
正しくは

printf("%d",a);  //整数として a の値を出力しなさい。

です。上の命令で初めてaに代入された値が出力されます。
 これは、 printfの””中の%dによって、「出力しようとする型」を指定し、後ろに変数名を書いている のです。この場合は右に書いてあるように「整数としてaの値を出力する」わけです。 またこのとき、「変数の型」と「出力しようとする型」が違うとエラーになります。

それぞれの対応のうち一般的なものを以下に示します。

種類 型名 指定子 表現範囲
整数 int %d -32768 〜 32767
浮動小数点数 float %f 3.4×10の-38乗 〜 3.4×10の38乗(有効数字7桁)
文字 char %c 一文字 (-128 〜 127)
文字列 配列 %s 複数の文字

です。

・ scanfと変数
 scanfは変数に値を取り込む関数です。
scanf("%d",&a);
とすれば、aに整数として値を取り込む。という命令になります。
 要するに、 printfと同じ書式で指定する わけです。ただし こちらは、& がついていることをお忘れなく。
 上の例では攻撃力などを取りこむときに使っていますね。
&をつけることを忘れないでください。


 さて、今回は一度に新しいことがたくさんでてきたので、頭が混乱している人の方が多いかもしれません。僕も一度にたくさんのことをやりすぎたかなぁ。と少し反省しています。上で解説していること全てが新しいことなので、なにか難しいことをやっているように感じると思いますが、個々を見るとぜ〜んぜん大したことはやってません…。
「嘘だ!」と思った人は、あったか〜いお茶でもすすりながら眺めてみてください。肩の力を抜くと違ったものに見えてくると思いますよ。
 今回出てきた「新しいこと」はめちゃ重要です。重要ということは、何度も出てくる。ということなので、そのときにまたこのページを見れば理解できる。というレベルで良いと思います。この講座をやってれば、嫌でも今回の「新しいこと」は暗記してしまうと思いますよ。


・今回の課題
 さて、いよいよお待ちかね(?)今回の課題です。今回の講座で新たに 「入力」 を習得したわけですから、前回一方的な挨拶だけだった自己紹介を双方向性を持つ会話に発展させることにしましょう。
 実行結果が以下の様になるようにプログラムを書いてみてください。

<実行結果>

「あなたの名前を教えていただけますか?」
(入力受付)
「nameさんですね。私はRX-2343です。」
「あなたのお歳を教えていただけますか?」
(入力受付)
「age歳ですか。」
「私はは1000歳になります。」

※nameには入力された名前が、ageには入力された数字が表示されるようにして下さい。
(例)
「あなたの名前を教えていただけますか?」
Yu-ta
「Yu-taさんですね。私はRX-2343です。」
「あなたのお歳を教えていただけますか?」
99
「99歳ですか。」
「私は1000歳になります。」




・前回の答え(ソース)
#include <stdio.h>

void main(void)
{
 printf("「私はRX-2343です。歳は1000歳になります。」");
}