独習Cの例3.6.1のコードを書く場合の考え方がわかりません。ご教授お願いいたします。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
パクパク

独習Cの例3.6.1のコードを書く場合の考え方がわかりません。ご教授お願いいたします。

#1

投稿記事 by パクパク » 13年前

なるべく順をおって教えて頂けるとありがたいです。

例3.6.1の問題

(1)forループのネストを使う
(2)1~10までをそれぞれ加算する(1+1,2+2、……)
(3)正解の場合と不正解の場合に”正解!” ”不正解!” と表示する
(4)不正解の場合、三回まで誤答することが出来る
(5)答えが入力されない場合、正答を表示する

以下独習Cの例


/* ch03-14.c */
#include <stdio.h>

int main(void)
{
int answer, count, chances, right;

for (count = 1; count < 11; count++) {
printf(" %d + %d は? ", count, count);
scanf("%d", &answer);

if (answer == (count + count))
printf("正解!\n");
else {
printf("残念、間違いです\n");
printf("もう一度どうぞ\n");

right = 0;
/* forのネスト */
for (chances = 0; chances < 3 && !right; chances++) {
printf(" %d + %d は? ", count, count);
scanf("%d", &answer);

if (answer == (count + count)) {
printf("正解!\n");
right = 1;
}
}

/* まだ正解が得られなければ教える */
if(!right)
printf("正解は %d です\n", (count + count));
}
}

return 0;
}

nil
記事: 428
登録日時: 14年前

Re: 独習Cの例3.6.1のコードを書く場合の考え方がわかりません。ご教授お願いいたします。

#2

投稿記事 by nil » 13年前

コードタグを使用してください。
あと、私は独習Cを所持していないので、問題文がわかりません。
問題文を載せていただければいいかと思います。
また、どこがわからないのかは具体的にお願いします

パクパク

Re: 独習Cの例3.6.1のコードを書く場合の考え方がわかりません。ご教授お願いいたします。

#3

投稿記事 by パクパク » 13年前

返信ありがとうございます。

問題文は足し算練習プログラムを少しずつ改良していくものなので、要約すると以下のようになります。

(1)forループのネストを使う
(2)1~10までをそれぞれ加算する(1+1,2+2、……)
(3)正解の場合と不正解の場合に”正解!” ”不正解!” と表示する
(4)不正解の場合、三回まで誤答することが出来る
(5)答えが入力されない場合、正答を表示する

わからない部分は、rightの使用と、forのネストの部分です。

コード:

code
/* ch03-14.c */
#include <stdio.h>

int main(void)
{
  int answer, count, chances, right;

  for (count = 1; count < 11; count++) {
    printf(" %d + %d は? ", count, count);
    scanf("%d", &answer);

    if (answer == (count + count))
      printf("正解!\n");
    else {
      printf("残念、間違いです\n");
      printf("もう一度どうぞ\n");

      right = 0;
      /* forのネスト */
      for (chances = 0; chances < 3 && !right; chances++) {
        printf(" %d + %d は? ", count, count);
        scanf("%d", &answer);

        if (answer == (count + count)) {
          printf("正解!\n");
          right = 1;
        }
      }

      /* まだ正解が得られなければ教える */
      if(!right)
        printf("正解は %d です\n", (count + count));
    }
  }

  return 0;
}
/code[code=c]
[/code]

nil
記事: 428
登録日時: 14年前

Re: 独習Cの例3.6.1のコードを書く場合の考え方がわかりません。ご教授お願いいたします。

#4

投稿記事 by nil » 13年前

rightには初め0が代入され、
21行目からのfor分の条件にあるように
「rightが0でない時かつ3回答した回数が3回以内」
の時に回答と答え合わせが行われます。
答えが正しければrightに1が代入され、
上記の条件から外れるためループから抜けます。

※インデントはtab1つ分=スペース4個分入れるようにしてください。

box
記事: 2002
登録日時: 15年前

Re: 独習Cの例3.6.1のコードを書く場合の考え方がわかりません。ご教授お願いいたします。

#5

投稿記事 by box » 13年前

同じ動きをするであろうコードを書いてみました。

コード:

/* ch03-14.c */
#include <stdio.h>

int main(void)
{
    int answer, count, chances, right;

    /* 外側のループは、1+1, 2+2, ..., 10+10を求めるために必ず10回実行する。 */
    for (count = 1; count <= 10; count++) {
        printf(" %d + %d は? ", count, count);
        scanf("%d", &answer);

        if (answer == count + count) {
            printf("正解!\n");
        }
        else {
            printf("残念、間違いです\n");
            printf("もう一度どうぞ\n");

            /* 内側のループは、最初の答えが間違っていたときに実行する。
             * 最大3回まで。3回のうちに正解すればループから抜ける。
             */
            for (right = chances = 0; chances < 3 && right == 0; chances++) {
                printf(" %d + %d は? ", count, count);
                scanf("%d", &answer);

                if (answer == count + count) {
                    printf("正解!\n");
                    right = 1;  /* 正解に到達した印 */
                }
            }
            /* 3回チャレンジしたけど正解が得られなければ教える。 */
            if(right == 0) {
                printf("正解は %d です\n", count + count);
            }
        }

    }
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

パクパク

Re: 独習Cの例3.6.1のコードを書く場合の考え方がわかりません。ご教授お願いいたします。

#6

投稿記事 by パクパク » 13年前

お二方、返信ありがとうございます。

一人で勉強しているので、わからない部分があるとつまづいておりました。
これからも質問させて頂くことがあるかもしれません。
その時は皆さん、どうぞよろしくお願い致します。

閉鎖

“C言語何でも質問掲示板” へ戻る