2015-02-03 2 views
-1

Я пробовал написать этот код для вывода магического квадрата нечетного порядка на основе ввода нечетного числа. Когда я вхожу в 1 или 3, он работает нормально. Всякий раз, когда я ввожу что-либо выше, например, 5, 7, 9, 11 и т. Д., Программа сбрасывает момент, когда я нажимаю клавишу ввода. Я просмотрел свой код, и я не могу определить, где проблема. Я не получаю сообщений об ошибках.сбой программ на определенных входах

Небольшое примечание: если вы знаете, что такое магический квадрат, мой алгоритм здесь (предоставленный нам профессором на английском языке для перевода на C++) не выводит правильные значения, так как они не все объединяются в один и тот же номер.

#include <iostream> 
#include <iomanip> 

using namespace std; 


int main() 
{ 
int n; //n = order 
cout << "Enter an odd integer for the order of the Magic Square: "; 
cin >> n; 
cout << endl; 
if(n%2 == 0) //only allows program to accept odd numbers 
    { 
    cout << "The number you have entered is not odd" << endl; 
    return 0; 
    } 
int x, y; //x and y access the columns and rows of the following matrix 
int magicsquare[n][n]; //creates a n by n matrix to set up magic square 
int counter, square = n*n; //square is upper boundary 

for(x=0; x<n; x++)  //initialize all spaces in matrix with zeros 
{ 
    for(y=0; y<n; y++) 
     magicsquare[x][y] = 0; 
} 

/*Beginning of the magic square algorithm*/ 
x = 0, y = n/2; //initialize algorithm at the middle column of the top row 
for (counter = 1; counter <= square; counter++) //magic square will contain the integers from 1 to n squared 
{ 
    magicsquare[x][y] = counter; //places current counter number at current position in the matrix or square 
    x--; //moves position diagonally up 
    y++; //and to the right 

    /*If a move takes you above the top row in the jth column, move to the bottom of the jth column*/ 
    if(x<0) 
     x = n - 1; 
    /*If a move takes you outside to the right of the square in the ith row, move to the left side of the ith row*/ 
    else if(y==n) 
     y = 0; 
    /*If a move takes you to an already filled square or if you move out of the square at the upper right 
    hand corner, move immediately below position of previous number*/ 
    else if((magicsquare[x][y] != 0) || (x<0 && y==n)) 
    { 
     y--; //move one space to the left back into the square 
     x = x+2; //move two spots down into the square and below previous number 
    } 
} 
for(x=0; x<n; x++) 
{ 
    for(y=0; y<n; y++) 
     cout << setw(5) << magicsquare[x][y]; 
    cout << endl; 
} 

return 0; 
} 
+0

Опубликовать большой блок кода и сказать, что это «сбой» не помогает. Что именно происходит? Вы получили сообщение об ошибке? Какие? И можете ли вы использовать отладчик или использовать инструкции печати, чтобы хотя бы изолировать, где это происходит? –

+0

Вы прошли через свой отладчик, чтобы узнать, что происходит? Какое исключение вы получаете? – adamdc78

+0

@MarkLuna неясно, что вы намерены, но тот факт, что вы используете 'else if' в своем цикле, чтобы протестировать условия, которые уже были отсеяны, указывает на то, что в логике неверно. –

ответ

2

Я не могу следовать логике в моей голове, чтобы узнать, может ли это когда-нибудь на самом деле произошло, но в этом коде:

if(x<0) 
    x = n - 1; 
/*If a move takes you outside to the right of the square in the ith row, move to the left side of the ith row*/ 
else if(y==n) 
    y = 0; 

Если оба условия были бы правдой, вы выиграли 't исправить y и следующую итерацию вы сбегаете с конца матрицы.

Также обратите внимание, что int magicsquare[n][n]; является расширением для компилятора и не поддерживается стандартом C++, поскольку n не является константой времени компиляции. Вы почти наверняка хотите использовать vector.

1

Следующая незаконна:

int magicsquare[n][n]; 

ли вы игнорировать ошибки, или вы используете компилятор, который не дает ошибок на всех? Я предлагаю вам использовать IDE, которая подсказывает вам, когда совершена ошибка, поэтому вы можете легко увидеть свою ошибку. Пожалуйста, не используйте блокнот для написания C++, это ужасно.

Фиксированная версия:

int** magicsquare = new int*[n]; //creates a n by n matrix to set up magic square 
for(int i = 0; i < n+1; ++i) 
    magicsquare[i] = new int[n]; 

Теперь, вместе с намеком Mark B, вы получите это работает в кратчайшие сроки. Не забудьте очистить магическую стрелку, используя удаление.

+0

На самом деле g ++ поддерживает это расширение. потому что это допустимое поведение C99.И с появлением технической спецификации расширения массивов мы все можем использовать это поведение: http://stackoverflow.com/a/28094952/2642059 –

+0

Я использую CodeBlocks, и это не дает мне никаких ошибок. Он работал совершенно нормально, поэтому я не знаю, что я сделал, что вызвало его сбой. Я не думал, что массивы и матрицы будут объявлены иначе, чем C, поскольку это первый случай, когда я пытаюсь это сделать с C++. –

+0

Могу ли я получить доступ к матрице так же, как я получаю доступ к нему в своем коде прямо сейчас, если объявить его, как вы показали? т. е. с помощью magicsquare [row] [column] –

0

Так что я ничего не знаю о магических квадратах. Но я думаю, что это поведение, которое вы пытаетесь достичь:

for (int counter = 1, x = 0, y = (n/2); counter <= n * n; ++counter){ 
    magicsquare[x][y] = counter; //places current counter number at current position in the matrix or square 

    if (counter % n == 0){ //moves down into the square and below previous number 
     x = (x + 1) % n; 
    } 
    else //moves position diagonally up and to the right 
    { 
     x = (x + n - 1) % n; 
     y = (y + 1) % n; 
    } 
} 

Два дополнительных пункта:

  1. Пока мы не можем использовать массив Extensions Технические характеристики, я думаю, вы должны избегать объявления runtime- С99 в в вашем коде. Несмотря на то, что gcc разрешит это. Вы можете заняться чем-то вроде: vector<vector<int>> magicsquare(n, vector<int>(n));
  2. Это не соответствует поведению, проиллюстрированному Wikipedia's article, но вы можете получить его путем настройки начальных значений и порядка индексирования.
Смежные вопросы