ページ 1 / 1
独習Cの例3.6.1のコードを書く場合の考え方がわかりません。ご教授お願いいたします。
Posted: 2012年12月19日(水) 18:50
by パクパク
なるべく順をおって教えて頂けるとありがたいです。
例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;
}
Re: 独習Cの例3.6.1のコードを書く場合の考え方がわかりません。ご教授お願いいたします。
Posted: 2012年12月19日(水) 18:53
by nil
コードタグを使用してください。
あと、私は独習Cを所持していないので、問題文がわかりません。
問題文を載せていただければいいかと思います。
また、どこがわからないのかは具体的にお願いします
Re: 独習Cの例3.6.1のコードを書く場合の考え方がわかりません。ご教授お願いいたします。
Posted: 2012年12月19日(水) 19:02
by パクパク
返信ありがとうございます。
問題文は足し算練習プログラムを少しずつ改良していくものなので、要約すると以下のようになります。
(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]
Re: 独習Cの例3.6.1のコードを書く場合の考え方がわかりません。ご教授お願いいたします。
Posted: 2012年12月19日(水) 19:33
by nil
rightには初め0が代入され、
21行目からのfor分の条件にあるように
「rightが0でない時かつ3回答した回数が3回以内」
の時に回答と答え合わせが行われます。
答えが正しければrightに1が代入され、
上記の条件から外れるためループから抜けます。
※インデントはtab1つ分=スペース4個分入れるようにしてください。
Re: 独習Cの例3.6.1のコードを書く場合の考え方がわかりません。ご教授お願いいたします。
Posted: 2012年12月19日(水) 20:26
by box
同じ動きをするであろうコードを書いてみました。
コード:
/* 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のコードを書く場合の考え方がわかりません。ご教授お願いいたします。
Posted: 2012年12月20日(木) 07:44
by パクパク
お二方、返信ありがとうございます。
一人で勉強しているので、わからない部分があるとつまづいておりました。
これからも質問させて頂くことがあるかもしれません。
その時は皆さん、どうぞよろしくお願い致します。