ちぇりーの館

1−7 C言語プログラミング講座 変数を使って値を保持してみよう!(3)



こんにちは! 今回は、文字型を数字型に変換する方法を説明します。それでは、次のプログラム を書いてみてください。

#include <stdio.h>
#include <stdlib.h>

#define MAX_BUFFER			256
#define NOW_YEAR			2009

int main(void)
{
	char buffer[MAX_BUFFER];
	int  age;
	int  year;

	printf("年齢を入力してください\n");

	gets(buffer);           //現在の年齢を取得

	age  = atoi(buffer);    //年齢を数字に変換
	year = NOW_YEAR - age;  //西暦の年齢

	printf("あなたの年齢は、%d歳ですね。では、%d年生まれですね☆\n", age, year );

	scanf("a");

	return 0;
}

プログラム結果

このプログラムを実行すると、"年齢を入力してください"という文字が表示され、次の行にカーソル が入力待ちの状態になります(画面でチカチカ光っている部分です)。ここで、年齢を半角数字で入力して、Enterキーを押してみてください。 次の行で、入力された年齢を元に生まれ年が表示されていると思います。今回のプログラムでは見慣れないモノがチラホラとあり、 少し読み難いかもしれませんが、がんばって見て行きましょう。

#include <stdio.h>
#include <stdlib.h>

今回は、いつも書いている"stdio.h"に加えて新たに"stdlib.h"というファイルも追加しています。 #includeについては、"1-3 printfを使って画面の文字を出してみよう!"の章でも 簡単に触れましたが、今は関数を使うために必要なものという認識でOKです。 今回の場合は、いつも使用しているprintf関数,scanf関数に加えてgets関数,atoi関数という2つの関数を追加しております。 gets関数は"stdio.h"が書いていればよいのですが、atoi関数の方は"stdio.h"ではなく"stdlib.h"が 書かれていなければ使う事ができません。試しに、"stdlib.h"の行を削除して実行してみてください。 atoi関数が書かれた場所でエラーが発生していると思います。

#define MAX_BUFFER			256
#define NOW_YEAR			2009

この部分は、値の定義と言います。つまり、ここで定義した文字列は、プログラム実行時には右側に書かれている値に 置き換えるという意味になります。ではなぜ、ダイレクトに値を書かないのかと言うと二つの理由があります。 一つ目は、プログラムを読みやすくするためです。つまり、"2009"と書かれているより、"NOW_YEAR" と書いていてあった方が『あ! これは、現在の西暦をあらわしているんだ』と分かり易くなります。 二つ目は、値の変更が容易になります。例えば、年が変わり2009年から2010年になった場合に、直接プログラム中に 値を埋め込んでいた場合、すべての場所で"2009"から"2010"に値を変えなければなりません。それに対し、値が定義されていた場合には、 NOW_YEARを"2009"から"2010"に変えるだけで修正ができます。実際に、大規模なプログラムを組む際には、 極力直接値を入れずに定義名を入れるようにします。なんたって、大規模なプログラムでは、一つの定義が数千箇所で使われる 事もあるのですから…… |(-_-)|

define定義

   gets(buffer);       //現在の年齢を取得

この行では、キーボードから入力された文字列を"buffer"という変数に格納する関数となります。 "//"というのは、コメントと呼ばれる部分で、"//"が書かれている部分から行が変わるまで の部分はプログラムとして認識しないという意味になります。また、この部分では日本語を 使っても良いので、多くの場合プログラムの補足的な説明を書く事に用いられます。

   age  = atoi(buffer);    //年齢を数字に変換


ここが今回でもっとも重要な部分となります。前回までに、変数には数字型(int)と文字型(char)があると 説明しました。キー入力で、取得した値は文字型となります。従って、入力された文字列をそのまま使って計算などをする事はできません。 しかし、プログラムを書いていると多くの場面で、入力された文字列を使って 計算を行いたい事は多々あります。そこで、登場するのがatoi関数です。この関数を使う事に よって、文字列に格納されている値を数字の値に出力する事ができます。

	year = NOW_YEAR - age;  //西暦の年齢
	printf("あなたの年齢は、%d歳ですね。では、%d年生まれですね☆\n", age, year );
	scanf("a");
	return 0;
}


この部分は、特に問題がないと思います。今の年から入力された年齢を引き、生まれた年を計算しています。 ちなみに、エラー処理は、一切行っていないので半角数字以外の値を入力されると、年齢が0歳となって しまいますが、無視してください。

それでは、最後にサンプルプログラムとして、入力された値を掛け算するプログラムを書いて見ましょう。
#include 
#include 

#define MAX_BUFFER			256

int main(void)
{
	char buffer1[MAX_BUFFER];
	char buffer2[MAX_BUFFER];
	int  val1;
	int  val2;

	printf("二つの数字の掛け算を行います。\n");

	//-----------1つめの数字を設定--------------
	printf("一つ目の数字を入力してください\n");
	gets(buffer1);
	val1  = atoi(buffer1);
	//-----------2つめの数字を設定--------------
	printf("二つ目の数字を入力してください\n");
	gets(buffer2);
	val2  = atoi(buffer2);

	printf("計算結果は、%d×%d=%dですね☆\n", val1, val2, val1*val2 );

	scanf("a");

	return 0;
}

サンプルプログラムの結果

 いかがでしたか? 以上で、変数についての説明は終了となります。次回は、 いよいよif文の説明になります。次回のif文を説明すると、プログラムの幅がグッと 広くなるので、次回も楽しみにしていてください☆
前回同様、内容が判り難かったり、疑問・質問等がありましたら時間の許す限りお答えしようと思いますので どしどしメールを送ってください。でわでわ、お疲れ様でした (^_^)/

< 一覧ページへ戻る


当サイトが面白いと感じた方は、お手数ですが下記リンクをクリックしてください。
クリック毎に当ホームページの評価が上がります。ご協力お願いします!
inserted by FC2 system