数値入力
百五減算というパズル。なぜこれでわかるのか考えてみよう。 code:105.c
int main(void)
{
int a, b, c, x;
printf("1 から 100 までの整数を一つ考えてください。\n");
printf("それを 3 で割った余り? ");
scanf("%d", &a);
printf("それを 5 で割った余り? ");
scanf("%d", &b);
printf("それを 7 で割った余り? ");
scanf("%d", &c);
x = (70 * a + 21 * b + 15 * c) % 105;
printf("あなたの考えた数は %d でしょう!\n", x);
return 0;
}
scanf(scan formatted)書式指定入力。printf の書式指定とほぼ同じ。例外: %f は float 型を入力
%lf は double 型を入力
情報オリンピックでは余計な出力は一切省いて次のようなプログラムを作ることが要求される: code:105a.c
int main(void)
{
int a, b, c, x;
scanf("%d", &a);
scanf("%d", &b);
scanf("%d", &c);
x = (70 * a + 21 * b + 15 * c) % 105;
printf("%d\n", x);
return 0;
}
これは次のように書くこともできる:
code:105b.c
int main(void)
{
int a, b, c, x;
scanf("%d%d%d", &a, &b, &c);
x = (70 * a + 21 * b + 15 * c) % 105;
printf("%d\n", x);
return 0;
}
(参考)コマンドライン引数での入力
code:105a.c
int main(int argc, char *argv[])
{
int a, b, c, x;
if (argc != 4) {
printf("3,5,7で割った余りを入力\n");
return 1;
}
a = atoi(argv1); /* 3で割った余り */ b = atoi(argv2); /* 5で割った余り */ c = atoi(argv3); /* 7で割った余り */ x = (70 * a + 21 * b + 15 * c) % 105;
printf("あなたの考えた数は %d でしょう!\n", x);
return 0;
}
これを gcc 105a.c でコンパイルした実行ファイルが a.out であれば,例えば次のように実行する:
% ./a.out 2 3 4
これで
あなたの考えた数は 53 でしょう!
と出力される。
argc は引数(argument)の個数(count)。上の入力の場合,argc は4になる。
argv は引数(argument)の値(value)を入れた配列。上の入力の場合,argv[0] が ./a.out,argv[1] が 2,argv[2] が 3,argv[3] が 4 になる。値は文字列となるので,次のどれかを使って数値に変換する。
atoi は文字列を int 型に変換する(ASCII to int)。
atol は文字列を long 型に変換する。
atof は文字列を double 型に変換する。