【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード

ある問題集で
targetとnumが合っているまで繰り返すプログラム何ですけど、
voidGuessNumber()
{
char target[5];
char num[5];
int count =0;
createRandNumber(target)
do{
printf(%d回目各桁が異なる%dけたの数を入力してください:,++count,5)
scanf("%4d",num);
while(isValidNumber(num)==FALSE);
{
printf(入力が正しくありません、再度入力してください:);
scanf("%4d",num);
}

}while(isMatch(target,num)==FALSE);
}
int isValidNumber(char num[])
機能:文字列numの各文字がすべて異なる数字の時TRUE,それ以外のときFALSEを返す。
int isMatch(char target[],char num[])
機能:targetとnumの文字数があっているときTRUEそれ以外FALSE
何ですけど、これだと永遠に終わらないような気がするのですが、これは間違いなのかなと思うんですけどどうでしょうか?なにか足りないところがあったら補足しますのでよろしくお願いします。

A 回答 (6件)

No.4 です。



>なにか勘違いしているのでしょうか?

 はい。

>isValideNumberI(num)ですべて異なる数字のときTRUEなのでこれでは、繰り返されて、

 isValideNumberI() 関数は、taeget が引数となっていないことから、taeget の内容は判りません(←★重要)。
 判るのは、引数で渡された num の内容、"1234" の'1', '2', '3', '4' が「すべて異なる数字」ということだけです。

これは、

>int isValidNumber(char num[])
>機能:文字列numの各文字がすべて異なる数字の時TRUE,それ以外のときFALSEを返す。
    ↑↑↑↑↑↑↑↑↑
 と、ご自分で書いています。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。ということは、例えばnumが”1124”の場合はFALSEにるということでしょうか?確認よろしくお願いします。

お礼日時:2009/07/15 14:49

ループの内側に


scanf("%4d",num);
が入ってて、ループするたびにnumの中身が変わる。

ループするたびにnumの中身が変わるのなら、必ずいつかは「ループを脱出する条件に合うnum」になる筈。

>間違いなのかなと思うんですけどどうでしょうか?

一番の間違いは「numは不変」と思い込んでしまった事。

とはいえ「毎回、ループを脱出する条件に合わない数値を入力し続け、ループを脱出する条件に合う数値を絶対に入力しない」って事をすれば、質問者さんの言う通り「永久に終らない」だろうけど。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。例えば、taegetで”1234”ができて、入力で ”1234”と入力したとしてもisValideNumberI(num)ですべて異なる数字のときTRUEなのでこれでは繰り返されて、"4567" を入力して外にでてもisMatch(target,num)で文字列が合わないので繰り返されてしまうので終わらないと思うのですが・・・なにか勘違いしているのでしょうか?あとscanf("%4d",num);は間違いでscanf("%4s",num);の間違いです。

お礼日時:2009/07/15 14:02

>int isValidNumber(char num[])


>機能:文字列numの各文字がすべて異なる数字の時TRUE,それ以外のときFALSEを返す。

>int isMatch(char target[],char num[])
>機能:targetとnumの文字数があっているときTRUEそれ以外FALSE


例えば、createRandNumber() で target に、"1234" ができて、入力で、"4567" とすれば、
共に4桁で、「文字数があっている」ので isMatch() は TRUE を返し、do while は終了するのでは。

#3 補足
>int isValidNumber(char num[])で文字列numの各文字がすべて異なる数字のときTRUEになってそこから出るので
>int isMatch(char target[],char num[])で一生文字列が合わないことになりTRUEになることはないからです。

 「文字『列』が合わない」とは、機能の変更でしょうか。「文字『数』が合うか否か」ではなかったのでは?。

 たとえ「文字列が合うか否か」機能の場合でも、入力で、"1234" とすれば、TRUE になるかと。
 具体的に、文字列を使って「補足」をお願いします。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。「文字列が合わない」の間違いです。taegetで”1234”ができて、入力で”1234”と入力したとしてもisValideNumberI(num)ですべて異なる数字のときTRUEなのでこれでは、繰り返されて、"4567"を入力して外にでてもisMatch(target,num)で文字列が合わないので繰り返されてしまうので終わらないと思うのですが・・・なにか勘違いしているのでしょうか?

お礼日時:2009/07/15 13:52

isMatch(target,num)がTRUEを返したら終わります。



どういう理由で終わらないと思われたのでしょうか。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。int isValidNumber(char num[])で文字列numの各文字がすべて異なる数字のときTRUEになってそこから出るのでint isMatch(char target[],char num[])で一生文字列が合わないことになりTRUEになることはないからです。

お礼日時:2009/07/15 07:58

「永遠に終わらない」ような気がしたのはなぜでしょうか?


まあ, それ以前に scanf がおかしいのでなんともなりませんが.
    • good
    • 0
この回答へのお礼

すみません。scanf("%4d",num);はscanf("%4s",num)の間違いでした。

お礼日時:2009/07/15 07:17

提示されたコード(の断片)で、


do と while の数が異なっています。
そのため、提示されたコードの真実性に疑問が生じています。

せっかくですから、当該のコード「全体」を提示なさってはいかがでしょうか。

この回答への補足

全部のコードがこれです。

補足日時:2009/07/14 23:13
    • good
    • 0
この回答へのお礼

回答有難うございます。コードが間違っていました。
正しくは
voidGuessNumber()
{
char target[5];
char num[5];
int count =0;
createRandNumber(target)
do{
printf(%d回目各桁が異なる%dけたの数を入力してください:,++count,5)
scanf("%4d",num);
while(isValidNumber(num)==FALSE)
{
printf(入力が正しくありません、再度入力してください:);
scanf("%4d",num);
}

}while(isMatch(target,num)==FALSE);
}
です。

お礼日時:2009/07/14 23:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!