はじめての C
金山さんところの 課題 6.1(論理演算) について ...
この課題では scanf("%s",buf) を使わず プログラムを組み立てたほうがいい、と思う。
関数 scanf は標準入力から読み込んだデータを保管しておくので、次の入力のときに いったん前のデータを破棄しないといけない。
ただしこれは 入力エラーの場合であって、正常に入力されていれば 変数は次の入力が実行されると 前のデータが消され 新しいデータが格納される。
ちょっと実験してみると、
- /* suuzi */
- #include
- main()
- {
- int a;
- printf("整数を入力してください a = ");
- if (scanf("%d", &a)) {
- printf("それは %d ですね。\n", a);
- }
- printf("整数を入力してください a = ");
- if (scanf("%d", &a)) {
- printf("それは %d ですね。\n", a);
- }
- printf("整数を入力してください a = ");
- if (scanf("%d", &a)) {
- printf("それは %d ですね。\n", a);
- }
- }
変数 a の値は 入力の値によって つぎつぎ変化するはず。
課題 6.1 から char buf[64]; と scanf("%s",buf); を取り除くと↓
- /* mondai */
- #include
- main()
- {
- int a, b, c, x, y, z;
- y = 4;
- z = 0;
- printf("「問題」答が真なら(1)を 偽なら(0)を入力しなさい。\n\n");
- /* sono_1 */
- a = 5; b = 3;
- printf("a = %d, b = %d のとき\na > 1 && b > 2 は\n真(1)か 偽(0)か? x = ", a, b);
- scanf("%d", &x);
- if (x == (a > 1 && b > 2)) {
- z++;
- }
- /* sono_2 */
- a = 2; b = -2;
- printf("\n");
- printf("a = %d, b = %d のとき\na < 0 || b < 0 は\n真(1)か 偽(0)か? x = ", a, b);
- scanf("%d", &x);
- if (x == (a < 0 || b < 0)) {
- z++;
- }
- /* sono_3 */
- a = -4; b = -2;
- printf("\n");
- printf("a = %d, b = %d のとき\na < 0 && !b < 0 は\n真(1)か 偽(0)か? x = ", a, b);
- scanf("%d", &x);
- if (x == (a < 0 && !b < 0)) {
- z++;
- }
- /* sono_4 */
- a = 8; b = -2; c = 0;
- printf("\n");
- printf("a = %d, b = %d, c = %d のとき\n", a, b, c);
- printf("a > 0 && b > -2 || c > 1 は\n真(1)か 偽(0)か? x = ");
- scanf("%d", &x);
- if (x == (a > 0 && b > -2 || c > 1)) {
- z++;
- }
- printf("\n");
- printf("正解は %d 問のうち &d 問でした。\n", y, z);
- if (y == z) {
- printf("全問正解ですネ !\n");
- } else {
- printf("もう一度 挑戦する ?\n");
- }
- }
ただし 関数 scanf がプログラムの中で 実際 どのように動いているのかを知っているわけではないので 本当にこれでいいのかどうかは 保証できないけど ...
text: 金山典世さん(稚内北星)のページ