为啥 SharpDevelop 上这个使用“for”循环的小 C# 程序不起作用?

Posted

技术标签:

【中文标题】为啥 SharpDevelop 上这个使用“for”循环的小 C# 程序不起作用?【英文标题】:Why is this small C# program on SharpDevelop which uses 'for' loops not working?为什么 SharpDevelop 上这个使用“for”循环的小 C# 程序不起作用? 【发布时间】:2014-10-24 06:35:29 【问题描述】:

我是一个完全的初学者。我在 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);

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

但它不起作用。当我点击“运行项目”时,弹出黑屏,但什么也没有发生……而且SharpDevelop没有指出任何错误……

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

【问题讨论】:

我建议在第一个 for 循环上设置一个断点,单步执行,看看会发生什么。 不知道为什么你会被否决,你的问题很明显。详情见我的回答。 首先,您需要获取一组您知道应该产生所需结果的值。然后检查你的公式。如果它确实有效,则问题出在ij 值中。如果不是,那么,修正公式。重复。 Division returns zero的可能重复 【参考方案1】:

整数除法。

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 是双精度类型。因此,您的部门现在返回双 *

【讨论】:

我同意。让我详细说明亚历克斯的答案 - 文字(数字)是根据它们所代表的内容编译的(你的情况:60 是一个整数。如果你用 '.' 写 60d 或 60。你会让编译器知道你的意思60 的双精度值。【参考方案2】:

我在这里看到的错误是使用 1/60 期望它是一个代表 0.0166 的双精度...它实际上是 0,因为 1 和 60 都是整数,这成为整数除法。假设您的算法在数学上是正确的,请尝试使用 1.0/60.0、1/60.0 或 1.0/60、1/60d 或这些的任意组合,这应该可以解决问题。

修复此问题后,您可能会开始看到大量行打印某些结果,因为您的程序在循环完成之前不会终止,即使它可能已经在打印大量数据。您可以通过添加一个标志变量(一个布尔值)来终止外部循环并添加break 来终止内部循环来修复它。

【讨论】:

【参考方案3】:

您可以通过保留循环和整数,然后在日志函数需要它们时计算出双精度数,让您的生活更轻松一些。

还可以通过在 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);

【讨论】:

【参考方案4】:

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,您无需在此处询问即可轻松找到代码中的问题。

【讨论】:

@Downvoter 至少愿意发表评论,这样我就可以知道我可能错在哪里?

以上是关于为啥 SharpDevelop 上这个使用“for”循环的小 C# 程序不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 for 循环在某些平台上退出而不在其他平台上退出?

获取 irrklang - 在 sharpdevelop 工作

如果项目由 SharpDevelop 生成,则 OpenFileDialog 会被 Norton Antivirus 阻止

SharpDevelop浅析_4_TextEditor_自动完成代码折叠……

SharpDevelop with Silverlight

icsharpcode.net/sharpdevelop/avalonedit 中不存在 WPF 设计错误 ( VerticalScrollBarVisibility) 和 ( Horizo​​nta