はじめての C

金山さんところの 課題 6.1(論理演算) について ...
この課題では scanf("%s",buf) を使わず プログラムを組み立てたほうがいい、と思う。
関数 scanf は標準入力から読み込んだデータを保管しておくので、次の入力のときに いったん前のデータを破棄しないといけない。
ただしこれは 入力エラーの場合であって、正常に入力されていれば 変数は次の入力が実行されると 前のデータが消され 新しいデータが格納される。
ちょっと実験してみると、

  1. /* suuzi */
  2. #include
  3. main()
  4. {
  5. int a;
  6. printf("整数を入力してください a = ");
  7. if (scanf("%d", &a)) {
  8. printf("それは %d ですね。\n", a);
  9. }
  10. printf("整数を入力してください a = ");
  11. if (scanf("%d", &a)) {
  12. printf("それは %d ですね。\n", a);
  13. }
  14. printf("整数を入力してください a = ");
  15. if (scanf("%d", &a)) {
  16. printf("それは %d ですね。\n", a);
  17. }
  18. }

変数 a の値は 入力の値によって つぎつぎ変化するはず。
課題 6.1 から char buf[64]; と scanf("%s",buf); を取り除くと↓

  1. /* mondai */
  2. #include
  3. main()
  4. {
  5. int a, b, c, x, y, z;
  6. y = 4;
  7. z = 0;
  8. printf("「問題」答が真なら(1)を 偽なら(0)を入力しなさい。\n\n");
  9. /* sono_1 */
  10. a = 5; b = 3;
  11. printf("a = %d, b = %d のとき\na > 1 && b > 2 は\n真(1)か 偽(0)か? x = ", a, b);
  12. scanf("%d", &x);
  13. if (x == (a > 1 && b > 2)) {
  14. z++;
  15. }
  16. /* sono_2 */
  17. a = 2; b = -2;
  18. printf("\n");
  19. printf("a = %d, b = %d のとき\na < 0 || b < 0 は\n真(1)か 偽(0)か? x = ", a, b);
  20. scanf("%d", &x);
  21. if (x == (a < 0 || b < 0)) {
  22. z++;
  23. }
  24. /* sono_3 */
  25. a = -4; b = -2;
  26. printf("\n");
  27. printf("a = %d, b = %d のとき\na < 0 && !b < 0 は\n真(1)か 偽(0)か? x = ", a, b);
  28. scanf("%d", &x);
  29. if (x == (a < 0 && !b < 0)) {
  30. z++;
  31. }
  32. /* sono_4 */
  33. a = 8; b = -2; c = 0;
  34. printf("\n");
  35. printf("a = %d, b = %d, c = %d のとき\n", a, b, c);
  36. printf("a > 0 && b > -2 || c > 1 は\n真(1)か 偽(0)か? x = ");
  37. scanf("%d", &x);
  38. if (x == (a > 0 && b > -2 || c > 1)) {
  39. z++;
  40. }
  41. printf("\n");
  42. printf("正解は %d 問のうち &d 問でした。\n", y, z);
  43. if (y == z) {
  44. printf("全問正解ですネ !\n");
  45. } else {
  46. printf("もう一度 挑戦する ?\n");
  47. }
  48. }

ただし 関数 scanf がプログラムの中で 実際 どのように動いているのかを知っているわけではないので 本当にこれでいいのかどうかは 保証できないけど ...
text: 金山典世さん(稚内北星)のページ