2016-09-30 6 views
-4

저는 C++을 배우고 있으며 프로그램에 문제가 있습니다. 큰 숫자중첩 루프 및 모듈러스 C++

*---------* 
-*-------*- 
--*-----*-- 
---*---*--- 
----*-*---- 
-----*----- 
----*-*---- 
---*---*--- 
--*-----*-- 
-*-------*- 
*---------* 

이것은 N = 5 제대로 작동 내 코드는 아니지만 : 그것은 n=11 경우 다음과 같은 출력한다 n=11 경우

#include <iostream> 
using namespace std; 

int main() 
{ 
    int n; 

    cout << "Enter size (n x n): " << endl; 
    cin >> n; 

    for (int i=0;i<n;i++){ 
     for (int j=0;j<n;j++){ 
      if (i%n==j%n) cout << '*'; 
      else if (i%(n-i)==j%(n-j)) cout << '*'; 
      else cout << '-'; 
     } 
     cout << endl; 
    } 
    return 0; 
} 

이 인쇄되고 :

*---------* 
-*----*--*- 
--*-----*-- 
---*---*--- 
----*------ 
-----*----- 
-*----*--*- 
---*---*--- 
--*-----*-- 
-*----*--*- 
*---------* 

나는 '*'진단 중 하나를 인쇄하는 방법을 성공적으로 작성했습니다. 그러나 무언가는 거꾸로 가고있는 다른 것과는 작동하지 않습니다. 불행히도이 문제를 해결할 수 없어 귀하의 조언이 필요합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 이러한 문제를 디버깅하는 방법?

+3

이러한 문제를 해결하는 올바른 도구는 디버거입니다. 스택 오버플로를 묻기 전에 코드를 단계별로 실행해야합니다. 자세한 도움말은 [작은 프로그램 디버깅 방법 (Eric Lippert 작성)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)을 참조하십시오. 문제를 재현하는 [최소, 완료 및 확인 가능] (http://stackoverflow.com/help/mcve) 예제와 함께 해당 질문을 \ [편집]해야합니다. 디버거. –

+0

mod 연산자로 이것을 해결해야만하는 특별한 이유가 있습니까? 이것은 그것을하는 이상한 방법으로 보인다 ... –

+0

나는 mod 연산자를 사용하는 비슷한 운동을했다. –

답변

1

이 문제는 디버깅하기가 정말 간단합니다.

첫 번째 오류 *을 살펴보십시오. i=1, j=6의 위치에 나타납니다. n=11을 사용하면 i%(n-i)==j%(n-j)의 조건은 1%(11-1) == 6%(11-6)이됩니다. 이는 표현식이 양쪽에서 1으로 평가되기 때문에 사실입니다.

이 표현의 배경은 무엇입니까? 이 종류의 if을 사용하여 셀이 두 번째 대각선에 속하는지 확인하는 이유는 무엇입니까? 두 번째 대각선에 인쇄해야하는 각 쌍 i, j을 적어보십시오. 그러면 더 간단한 패턴을 볼 수 있습니다.

P. if (i%n==j%n) 표현식에서는 n의 모듈러스가 모두 n보다 작기 때문에 피연산자를 취할 필요가 없으므로 중복되어 있으며 간단히 if (i == j)으로 다시 쓸 수 있습니다.

+0

고마워요! 너는 나를 올바른 길로 가게했다. 나는 그것을 해결했다! –