0

私は現在、混乱しています.comであり、プログラミング知識の欠如が明らかに示されています...だから、プロに電話する時が来ました! (ちなみに、私は皆さんからすでに多くのことを学んだと感じています)

問題

仮想壁の幅を取得してタイルサイズを要求する小さなアプリがあります。次に、幅の間に隙間なく収まるタイルの数を計算します。タイルが均等に収まらない場合、ユーザーには2つが表示されますボタンは「壁を拡大」または「壁を縮小」します。この例では、以下のコードは壁を拡大する場合です。次に、タイルが正確に収まるようにするために必要な壁の幅を 0.1 単位で見つけようとしながら、 を実行する必要があります。壁の幅が 12.5 フィートで、タイルの幅と長さが 13.6 であるなどの double 値を処理できる必要があるため、int ではなく double を使用しています。

次のコードがあります(ただし、この方法を単純化しすぎていると思います)

いずれにせようまくいかない 半日かけて読書やゲームなどを行ったが、理解できない。間違った道を進んでいるのだろうか、それとも正しい軌道に乗っているのだろうか

いつものように、アドバイスは温かく受け取られます

Hさん

{

double wWdth;
double tWdth;
double wdivision = 3;

NSString *growstring = [NSString stringWithFormat:@"%@,%@", self.wallWidth.text, self.tileWidth.text];
NSArray *wall = [growstring componentsSeparatedByString:@","];
NSLog(@"%@",wall);
wWdth = [[wall objectAtIndex:0]doubleValue];
blkWdth = [[wall objectAtIndex:1]doubleValue];

do
{
    NSLog(@" INSIDE WHILE %.f",wdivision);
    wWdth = wWdth;
    wWdth += 0.1;
    wdivision = fmod(qWdth,blkWdth);
} while (wdivision ==! 0);




NSString* newWdth = [NSString stringWithFormat:@"%.f", wWdth];
self.wallWidth.text=newWdth;

}

4

3 に答える 3

0

ループwhile状態にはいくつかの問題があります。の値に基づいており、wdivisionの値wdivisionは からfmod(qWdth,blkWdth)です。しかし、qWdth決してblkWdth変わらない。したがって、ループは1回または永久に実行されます。

ループ条件は、最終的に false になる値に基づいている必要があるため、ループはある時点で終了します。

また、==!for (私が想定していること) を「等しくない」演算子として使用しています。「等しくない」演算子は!=. あなたが持っているものは本当に:

while (wdivision == !0);

!0等しい1ので、実際には次のようになります。

while (wdivision == 1);

したがって、ループは 1 にwdivision等しい場合を除き、1 回の反復後に終了します。そうである場合、ループは決して終了しません。

wdivisionは関数にdouble基づいているため、fmod実際には正確に 0 になることはありません。おそらく代わりにこれを使用する必要があります。

while (division > DBL_EPSILON);

wdivisionただし、繰り返しごとに異なるように、 の計算方法を変更する必要があります。

于 2013-06-24T18:08:02.487 に答える
0

持っているコードに固執したい場合は、「増分の半分以内に収まる」ことができる限り近いことを認識してください。だから線

wWdth += 0.1;
wdivision = fmod(qWdth,blkWdth);
} while (wdivision ==! 0);

に置き換える必要があります

wWdth += increment;
wdivision = fmod(qWdth,blkWdth);
} while (abs(wdivision) > 0.5*increment);
于 2013-06-24T16:11:27.220 に答える