做 - 现在我在逻辑上被困住了

时间:2013-06-24 16:03:15

标签: objective-c do-while

我现在很适合confused.com而且我缺乏编程知识显然......所以有时间打电话给专业人士! (作为旁注,我觉得我已经从你们那里学到了很多东西)

问题

我有一个小应用程序,它采用虚拟墙的宽度,然后要求瓷砖大小,然后计算出你可以适应多少瓷砖宽度之间没有间隙,如果瓷砖不适合用户是提供了两个按钮“grow wall”或“shrink wall”,在这个例子中,如果用于增长墙壁,下面的代码。然后它应该经过一段时间试图以0.1的增量找出墙需要多宽以允许瓷砖精确配合。它需要能够处理双重值,例如墙宽12.5英尺,瓷砖宽度和长度13.6,这就是为什么我使用双打而不是整体

我有以下代码(但我认为这样做太简单了)

无论哪种方式都不起作用,我已经花了半天时间阅读比赛,但无法弄清楚,我是走错路还是我在正确的赛道上

一如既往,任何建议都会受到热烈欢迎

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;

}

3 个答案:

答案 0 :(得分:0)

如果您想坚持使用自己的代码,请认识到“获得增量的一半”是尽可能接近的。所以行

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

应替换为

wWdth += increment;
wdivision = fmod(qWdth,blkWdth);
} while (abs(wdivision) > 0.5*increment);

答案 1 :(得分:0)

也许我没有完全正确地理解这个问题,所以如果我不这样做,我会道歉。你说你要求瓷砖尺寸对吗?如果瓷砖不能完全贴合到墙壁尺寸,那么你会增长/缩小墙面?如果是这样,你不能只取当前的墙尺寸,并根据你点击长/缩墙时将其设置为瓷砖尺寸的下一个倍数(向上或向下)?将其设置为图块大小的倍数将允许图块完全适合它。

答案 2 :(得分:0)

您的while循环条件有几个问题。它基于wdivision的值,而wdivision的值来自fmod(qWdth,blkWdth)。但qWdthblkWdth都没有改变。所以你的循环要么执行一次,要么永远执行。

您的循环条件需要基于最终会变为false的值,因此循环会在某个时刻终止。

此外,您使用==!(我认为)是“不等于”运算符。 “不等于”运算符为!=。你拥有的是:

while (wdivision == !0);

!0相当于1所以你真的有:

while (wdivision == 1);

所以你的循环将在一次迭代后结束,除非恰好wdivision等于1.如果是,你的循环永远不会结束。

由于wdivision是基于double函数的fmod,因此它可能永远不会真正等于0。您可能应该使用此代码:

while (division > DBL_EPSILON);

但同样,您需要更改wdivision的计算方式,以便每次迭代都不同。