为什么SharpDevelop上的这个小型C#程序使用'for'循环不起作用?

时间:2014-10-24 06:35:30

标签: c# for-loop sharpdevelop absolute-value

我是一个完全的初学者。我在SharpDevelop上写了一个小的C#程序。这是:

double i, j;

for(i=1; i<=30; i+=(1/60))
{
    for(j=1+1/60; j<=30; j+=(1/60))
    {
        if(Math.Abs(Math.Log(i)/Math.Log(j)-0.63092975357)<=0.00001)
        {
            Console.WriteLine("ln("+i+")   ln("+j+")");
        }
    }
}

        Console.ReadKey(true);

我的程序应该找到ij ln(i)/ln(j)=0.63092975357(例如)ij必须等于{{分别为1}}和n/60,其中m/60n为正整数。 (我知道我可以使用m类型而不是int类型,但我想使用double类型。

但它不起作用。当我点击“运行项目”时,会弹出黑屏,但没有任何反应...... SharpDevelop没有指出任何错误......

那么我犯了什么错误?以及如何修复我的程序?

4 个答案:

答案 0 :(得分:4)

整数师。

1/60 = 0

您需要1 / 60.0d

除以整数后,您将得到整数结果。整数不能存储小数。

当您执行1/60时,您期望0.0166666666666667,但它实际上是0。

此代码现在可以使用

double i, j;

for(i=1; i<=30; i+=(1/60d))
{
  for(j=1+1/60d; j<=30; j+=(1/60d))
  {
      if(Math.Abs(Math.Log(i)/Math.Log(j)-0.63092975357)<=0.00001) 
          Console.WriteLine("ln("+i+")   ln("+j+")"); 
  }
}

编辑:*值得一提的是,编写60d可确保60是双重类型。因此,你的师现在重新调整了双*

答案 1 :(得分:1)

我在这里看到的错误是使用1/60,期望它是一个代表0.0166的双...实际上是0,因为1和60都是整数,这就变成了整数除法。尝试使用1.0 / 60.0,1 / 60.0或1.0 / 60,1 / 60d或这些的任意组合,并且应该修复它,假设您的算法在数学上是正确的。

一旦你解决了这个问题,你可能会开始看到大量的行打印一些结果,因为你的程序不会终止直到循环结束,甚至认为它可能已经打印了大量数据。您可以通过添加一个标志变量(bool)来终止外部循环来修复它,并break来终止内部循环。

答案 2 :(得分:1)

你可以通过保持你的循环和整数,然后在你需要日志函数的时候计算双打来让你的生活更轻松。

此外,通过在ReadKey之前添加Console.Write(),您可以看到循环结束的时间。

for(var i=1; i<=1800; i++)
{
    for(var j=1; j<=1800; j++)
    {
        double di = double(i)/60.0; 
        double dj = double(j)/60.0;

        if(Math.Abs((Math.Log(di)/Math.Log(dj))-0.63092975357)<=0.00001)
        {
            Console.WriteLine("ln("+di+")   ln("+dj+")");
        }
    }
}

Console.WriteLine("Press any key to continue");
Console.ReadKey(true);

答案 3 :(得分:0)

1 / 60会执行integer division,因此总会生成0。它总是丢弃小数部分。

来自/ Operator (C# Reference)

  

分割两个整数时,结果始终为整数。对于   例如,7/3的结果是2。

这就是为什么你的第一个for循环会是这样的;

for(i = 1; i <= 30; i += 0)

因为i永远不会增加,所以永远不会30,这就是为什么会产生infinite loop

作为解决方案,您需要使用浮点除法。

for(i = 1; i <= 30; i += (1 / 60f))
{
    for(j = 1+1/60f; j <= 30; j += (1 / 60))

除此之外,我建议你阅读Eric Lippert的How to debug small programs,你可以轻松找到代码中的错误,甚至不用问这里。