こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

問題集について

ある問題集で
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
何ですけど、これだと永遠に終わらないような気がするのですが、これは間違いなのかなと思うんですけどどうでしょうか?なにか足りないところがあったら補足しますのでよろしくお願いします。

投稿日時 - 2009-07-14 22:36:17

QNo.5125992

すぐに回答ほしいです

質問者が選んだベストアンサー

No.4 です。

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

 はい。

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

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

これは、

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

投稿日時 - 2009-07-15 14:43:42

お礼

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

投稿日時 - 2009-07-15 14:49:08

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.5

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

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

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

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

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

投稿日時 - 2009-07-15 12:08:21

お礼

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

投稿日時 - 2009-07-15 14:02:29

ANo.4

>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 になるかと。
 具体的に、文字列を使って「補足」をお願いします。

投稿日時 - 2009-07-15 09:58:49

お礼

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

投稿日時 - 2009-07-15 13:52:15

ANo.3

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

どういう理由で終わらないと思われたのでしょうか。

投稿日時 - 2009-07-15 07:47:02

お礼

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

投稿日時 - 2009-07-15 07:58:21

ANo.2

「永遠に終わらない」ような気がしたのはなぜでしょうか?
まあ, それ以前に scanf がおかしいのでなんともなりませんが.

投稿日時 - 2009-07-15 00:38:01

お礼

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

投稿日時 - 2009-07-15 07:17:40

ANo.1

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

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

投稿日時 - 2009-07-14 23:01:22

補足

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

投稿日時 - 2009-07-14 23:13:21

お礼

回答有難うございます。コードが間違っていました。
正しくは
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:25