数値入力
百五減算というパズル。なぜこれでわかるのか考えてみよう。
105.c#include <stdio.h>
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
型を入力
情報オリンピックでは余計な出力は一切省いて次のようなプログラムを作ることが要求される:
105a.c#include <stdio.h>
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;
}
これは次のように書くこともできる:
105b.c#include <stdio.h>
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;
}
(参考)コマンドライン引数での入力
105a.c#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int a, b, c, x;
if (argc != 4) {
printf("3,5,7で割った余りを入力\n");
return 1;
}
a = atoi(argv[1]); /* 3で割った余り */
b = atoi(argv[2]); /* 5で割った余り */
c = atoi(argv[3]); /* 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
これで
と出力される。
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
型に変換する。