2016-09-30 2 views
-4

Я изучаю C++, и у меня есть проблема с моей программой. Он должен напечатать следующее, если n=11:Вложенные петли и модуль C++

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

Это мой код, который корректно работает с п = 5, но не с большими числами:

#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; 
} 

Это печатается, если n=11:

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

Я вижу, что я успешно написал, как распечатать один из диагнозов '*'. Но что-то не работает с другим, которое движется назад. К сожалению, я не могу решить эту проблему и вам нужен ваш совет. Что я делаю не так? Как отлаживать такие проблемы?

+3

Правильный инструмент для решения таких проблем - ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –

+0

Есть ли конкретная причина, по которой вам приходится решать эту проблему с помощью оператора мод? Это похоже на странный способ сделать это ... –

+0

У меня было подобное упражнение, в котором использовался оператор мод. –

ответ

1

Эта проблема очень проста для отладки.

Взгляните на первый ошибочный *. Он отображается в позиции с i=1, j=6. С n=11 ваше состояние i%(n-i)==j%(n-j) становится 1%(11-1) == 6%(11-6), что эффективно верно, потому что выражение оценивается как 1 с обеих сторон.

Что стоит за этим выражением? Почему вы используете этот тип if, чтобы определить, принадлежит ли ячейка ко второй диагонали? Попробуйте записать каждую пару i, j, которая должна быть напечатана на второй диагонали, и вы должны заметить более простой узор.

P.S. В выражении if (i%n==j%n) вам не нужно принимать операнды по модулю n, потому что оба они меньше n, поэтому он избыточен и может быть переписан просто как if (i == j).

+0

Спасибо большое! Ты поставил меня на правильный путь, я решил это! –

Смежные вопросы