为啥 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
(例如)i
和j
必须分别等于n/60
和m/60
的i
和j
,其中@987654330 @ 和 m
是正整数。 (我知道我可以使用 int
类型而不是 double
类型,但我想让它与 double
类型一起使用。)
但它不起作用。当我点击“运行项目”时,弹出黑屏,但什么也没有发生……而且SharpDevelop没有指出任何错误……
那么我犯了什么错误?以及如何修复我的程序?
【问题讨论】:
我建议在第一个for
循环上设置一个断点,单步执行,看看会发生什么。
不知道为什么你会被否决,你的问题很明显。详情见我的回答。
首先,您需要获取一组您知道应该产生所需结果的值。然后检查你的公式。如果它确实有效,则问题出在i
、j
值中。如果不是,那么,修正公式。重复。
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_自动完成代码折叠……
icsharpcode.net/sharpdevelop/avalonedit 中不存在 WPF 设计错误 ( VerticalScrollBarVisibility) 和 ( Horizonta