第七話 入力
立花先輩は、猛烈にキーボードを叩き続けてから言った。
「よし出来た」
「はやっ」
「で、こっちが、数を入力できるヴァージョン。見てみて」
俺はモニターを覗き込んで、先輩が作ったばかりのコードを見た。
/* 今度は数も入れられるよ calcprogram2.c */
#include<stdio.h>
int main(void)
{
int a,b,result;
printf("最初の数を入れてね : ");
scanf("%d",&a);
printf("次の数を入れてね : ");
scanf("%d",&b);
result = a + b;
printf("\n"); /* ひとまず改行 */
printf("%d + %d の答えは、%dです!\n",a,b,result);
return 0;
}
「あ、今度のは、calc関数は無いんだ」
「あれは説明用だしー。なるべくmain関数だけにした方が、解りやすいでしょ? じゃあ走らせてみるわよ」
先輩はコマンドプロンプトでプログラムを走らせた。
C:¥sample>gcc -o calcprogram2 -Wall calcprogram2.c
C:¥sample>calcprogram2
最初の数を入れてね: _
「あ、カーソルが出た」
「ここで数を入力してエンターするのよ。じゃあ、5 + 3を入れてみる」
最初の数を入れてね: 5 [ENTER]
次の数を入れてね: 3[ENTER]
5 + 3 の答えは、 8です!
C:¥sample>_
「おおっ」俺はつい歓声を上げる。
「もう一度やってみるわよ。今度は 2 + 1」
C:¥sample>calcprogram2
最初の数を入れてね: 2 [ENTER]
次の数を入れてね: 1[ENTER]
2 + 1 の答えは、 3です!
C:¥sample>_
「ほら。またコンパイルしなくても、何度でも使えるようになったわ。入力と画面への出力の方法を知ってれば、最低限のアプリは作れるわね」
「これって引き算とかも作れるんですか?」
「うん。コードの a + b のところを a - b にするだけ。ただ、掛け算と割り算にはちょっと気をつけてね。どちらも、C言語やほとんどの言語では×や÷の代わりに * や / の記号を使うの。昔は使える文字数が限られていたから、×÷記号が無かったからだけど……」
「ふむふむ、わかりました」
「よし。じゃ、コードの説明に入るよー」
先輩は再び、calcprogram2.cのコードのウィンドウを前面に出した。
「まずint a,b,result。こういう風に、使う変数は一行で同時に宣言できるの」
「はい」
「あとは、このコードで説明すべきなのは、scanf()関数ね。残りは、問題なく理解できると思う」
「scanf関数で入力するんですよね?」俺は推測した。
「うん。ま、見ての通りなんだけど。これは、printf()関数と対になっている関数で、1つめの引数の%dのフォーマットの型データ――つまり整数、int型ね――をユーザーの入力から受け取って、2つめの引数に指定した変数に入れるって関数なの」
俺は一つ、疑問を口にした。
「先輩、2番目の引数の&aって、なんです? aじゃないんですか?」
「そっ、それは……」
先輩は口ごもった。お? なにか恐るべきCの秘密に俺は触れてしまったようだ。
「えっ、えーっと……まだイツキくんは、コンピューターのメモリーアドレスについてわからないと思うから、今はまだ内緒」
「は?」
「変数のメモリーアドレスを引数として提供する、という説明じゃ……ダメ?」
「さっぱりわかりませんが」
「と、とにかくっ。2番目の引数には数を入れたい変数を書いておくの。その前の&は、『とりあえず無視』して」
「は、はぁ……」
「あとは、最後のprintf()関数みたいに、第一引数のフォーマットで指定すれば、残りの引数はいくらでも入れられるってことも覚えておいて。では、コードの解説はこれでおしまいっ」
うーむ。ちと釈然とせんものがある。
まぁ、先輩の目から見れば、俺はまだまだ未熟なのだろう。
メモリーアドレス、か。
「でもね、最後に一つ、最大の忠告をするわ」先輩が改まった口調になって言った。
「このscanf関数は――なるべく使わない方がいい関数なの」
「え?」
先輩は、説明を続けた。