2014-10-24 12 views
-3

나는 완전한 초보자입니다. SharpDevelop에 작은 C# 프로그램을 작성했습니다. 여기있다 :SharpDevelop의 'for 루프'를 사용하는이 작은 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 (예를 들어) ijnm은 양의 정수이다 n/60 각각 m/60에 반드시 동일한 찾을 예정이다. (나는 double 타입 대신에 int 타입을 사용할 수 있지만, 타입이 double 일 때 사용하고 싶습니다.)

하지만 작동하지 않습니다. "프로젝트 실행"을 클릭하면 검은 색 화면이 나타나지만 아무 일도 일어나지 않습니다 ... 그리고 SharpDevelop는 어떤 오류도 지적하지 않습니다 ...

그래서 내가 실수를 했습니까? 내 프로그램을 수정하는 방법?

+1

첫 번째 'for' 루프에 중단 점을 설정하고 단계별로 진행하면서 어떤 일이 발생하는지 확인하는 것이 좋습니다. – Stefan

+1

왜 당신이 downvoted 얻을 확실하지, 당신의 문제는 꽤 분명하다. 자세한 내용은 내 대답을 참조하십시오. –

+0

먼저 원하는 결과를 얻을 수있는 값 집합을 가져와야합니다. 그런 다음 수식을 확인하십시오. 그것이 작동하면 문제는'i','j' 값에 있습니다. 그렇지 않다면 공식을 수정하십시오. 반복. –

답변

4

정수부.

1/60 = 0 

대신 1/60.0d이 필요합니다.

정수로 나누면 정수 결과가 나타납니다. 정수는 십진수를 저장할 수 없습니다.

당신은 0.0166666666666667을 기대하지만 가리키고 0입니다 1/60하고있는

이 코드는 지금

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+")"); 
    } 
} 

편집을 작동합니다 * 언급 Probally 가치, 60d 60 더블 타입을 보장 작성. 따라서 귀하의 부서는 현재 더블을 다시 계산합니다 *

+1

동의합니다. 알렉스의 대답에 대해 자세히 설명하겠습니다. 리터럴 (숫자)은 그들이 나타내는 것을 컴파일합니다 (귀하의 경우 : 60은 정수입니다 .60d 또는 60을 '.'로 쓰면 컴파일러에서 60의 double 값. –

1

내가 여기서 본 실수는 1/60이 0.0166을 나타내는 두 배가 될 것이라고 예상하고 있습니다. 실제로 1과 60은 정수이므로 정수 구분이됩니다. 알고리즘이 수학적으로 정확하다고 가정하고 1.0/60.0, 1/60.0 또는 1.0/60, 1/60d 또는 이들의 조합을 사용하여 수정해야합니다.

일단이 문제를 해결하면 프로그램이 루프가 완료 될 때까지 프로그램이 종료되지 않고 이미 많은 양의 데이터를 인쇄하고 있다고 할지라도 일부 결과를 인쇄하는 많은 행이 표시되기 시작할 수 있습니다. 바깥 쪽 루프를 종료하기 위해 플래그 변수 (bool)를 추가하고 내부 루프를 종료하려면 break을 추가하여이를 수정할 수 있습니다.

0

1/60integer division이며 그 결과로 항상 0가 생성됩니다. 항상 분수 부분을 삭제합니다. / Operator (C# Reference)

두 정수를 나눌에서

는, 결과는 항상 정수입니다. 예 : 의 경우 7/3의 결과는 2입니다.

첫 번째 for 루프는 다음과 같습니다. i이 증가 만나지 때문에

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

, 그것은 30 수 없으며 이것이 infinite loop를 생성하는 이유입니다.

해결책으로 부동 소수점 나누기를 대신 사용해야합니다.

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

는에 게다가, 당신이 읽고 제안 당신은 쉽게도 여기에 묻지 않고 코드에서 어떤 문제가 있는지 찾을 수 있습니다 에릭 Lippert의의 How to debug small programs.

+0

@Downvoter는 적어도 내가 어디서 잘못 될지 알 수 있도록 신경을 써야 하나? –

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);