2010-12-07 18 views
5

Für diejenigen, die nicht mit dem klassischen magischen Quadrat-Algorithmus vertraut sind: Ein magisches Quadrat ist ein zweidimensionales Array (n x n), das an jeder Stelle einen numerischen Wert zwischen den Werten 1 und n^2 enthält. Jeder Wert darf nur einmal vorkommen. Außerdem muss die Summe jeder Zeile, Spalte und Diagonale gleich sein. Die Eingabe sollte ungerade sein, da ich eine ungerade magische Quadrat-Lösung schreibe.Magic Square Programm (C++)


Ich habe das Problem erfolgreich abgeschlossen, aber ab jetzt ist es ein unbekannter Fehler hat (Logik? Ausgang?), Die für die letzte Stunde ärgerliche mich ist. Die ausgegebenen Werte sind sehr schlecht. Jede Hilfe wäre sehr geschätzt:


#include<iostream> 
#include<iomanip> 
using namespace std; 

int main() 
{ 
    int n; 

    cout<< "Please enter an odd integer: "; 
    cin>>n; 

    int MagicSquare[n][n]; 


    int newRow, 
    newCol; 

    // Set the indices for the middle of the bottom i 
    int i =0 ; 
    int j= n/2; 

    // Fill each element of the array using the magic array 
    for (int value = 1; value <= n*n; value++) 
    { 
    MagicSquare[i][j] = value; 
    // Find the next cell, wrapping around if necessary. 
    newRow = (i + 1) % n; 
    newCol = (j + 1) % n; 
    // If the cell is empty, remember those indices for the 
    // next assignment. 
    if (MagicSquare[newRow][newCol] == 0) 
    { 
     i = newRow; 
     j = newCol; 
    } 
    else 
    { 
     // The cell was full. Use the cell above the previous one. 
     i = (i - 1 + n) % n; 
    } 

    } 


    for(int x=0; x<n; x++) 
    { 
    for(int y=0; y<n; y++) 
     cout << MagicSquare[x][y]<<" "; 
    cout << endl; 
    } 
} 
+3

Und der Fehler ist _what_ genau? Was macht es, und was ist der Unterschied zwischen dem und was es tun sollte? Haben Sie versucht, einen Debugger zu verwenden? –

+0

Haben Sie versucht, es in einem Debugger zu debuggen. GDB und VS C++ Express sind kostenlos. Nicht viele Ausreden, nicht zu. – linuxuser27

+0

initialisieren Sie das Array mit dem Initialwert, d. H. 0. oder verwenden Sie eine Sprache, die das Array auf den Standardwert initialisiert. Wie Java initialisiert int auf 0, float auf 0.0 und Objekt-Array auf null. – Trying

Antwort

12

Sie haben Ihr MagicSquare zu initialisieren alle Nullen enthalten:

for(int i = 0; i < n; i++) { 
    for(int j = 0; j < n; j++) { 
     MagicSquare[i][j] = 0; 
    } 
    } 

So diese Prüfung wird fast immer fehlschlagen:

if (MagicSquare[newRow][newCol] == 0) { 
    i = newRow; 
    j = newCol; 
} 

Da C/++ sie für Sie nicht auf 0 initialisiert.

0

Sie die Anzahl n vom Benutzer nehmen können nicht, weil Sie die Größe des Arrays mit konstanten

+0

Das ist nicht wahr. Sie können ein Array beliebiger Größe definieren, indem Sie es in einen separaten Bereich {...} einfügen. Achte natürlich auf deinen Stack in diesem Fall. – Archie

+0

@Archie Könnten Sie bitte erläutern, warum dies die rechtliche Syntax ist? Ich bin nicht gefolgt, aber alle anderen scheinen mit dir auf der gleichen Seite zu sein. – Panzercrisis

+0

@Archie: Das ist nicht korrekt. C++ erlaubt Arrays variabler Länge nicht, egal in welchem ​​Bereich sie sich befinden. Einige Compiler erlauben es als Erweiterung, aber es ist kein Standard. – zindorsky

-1

zu definieren haben, sollten Sie das dynamische Array, um von der Tastatur Dimension zu hören schaffen, aber vergessen Sie nicht, löschen Arrays, wenn Sie es nicht brauchen

+0

Die Frage ging nicht um dynamische Arrays. Die vorhandenen Antworten sind korrekt. – yakatz

0

Sie initialisieren müssen alle Elemente Nullen enthalten:

memset(MagicSquare, 0, sizeof(MagicSquare)); 

othewise zeigen es Müll Wert.
N. B: memset-Funktion in cstring-Header-Datei enthalten.

Ihre korrigiert code:

#include<iostream> 
#include<iomanip> 
#include <cstring> 
using namespace std; 

int main() 
{ 
    int n; 

// cout<< "Please enter an odd integer: "; 
    cin>>n; 

    int MagicSquare[n][n]; 


    int newRow, 
    newCol; 
    memset(MagicSquare, 0, sizeof(MagicSquare)); 
    // Set the indices for the middle of the bottom i 
    int i =0 ; 
    int j= n/2; 

    // Fill each element of the array using the magic array 
    for (int value = 1; value <= n*n; value++) 
    { 
    MagicSquare[i][j] = value; 
    // Find the next cell, wrapping around if necessary. 
    newRow = (i + 1) % n; 
    newCol = (j + 1) % n; 
    // If the cell is empty, remember those indices for the 
    // next assignment. 
    if (MagicSquare[newRow][newCol] == 0) 
    { 
     i = newRow; 
     j = newCol; 
    } 
    else 
    { 
     // The cell was full. Use the cell above the previous one. 
     i = (i - 1 + n) % n; 
    } 

    } 


    for(int x=0; x<n; x++) 
    { 
    for(int y=0; y<n; y++) 
     cout << MagicSquare[x][y]<<" "; 
    cout << endl; 
    } 
} 
0
#include<iostream.h> 
#include<iomanip.h> 
int main() 
{ 
    int arr[25][25]={0}; 
    cout<<"Enter size(odd):"; 
    int size; 
    cin>>size; 
    int i=0,j=(size-1)/2,n=1; 
    arr[i][j]=n; 
    while(n<=size*size){ 
      i--; 
      j--; 
      if(i<0&&j>=0){ 
       i=size-1; 
       arr[i][j]=n; 
       n++; 
      }else if(j<0&&i>=0){ 
       j=size-1; 
       arr[i][j]=n; 
       n++; 
      }else if(i<0&&j<0){ 
       i=i+2; 
       j=j+1; 
       arr[i][j]=n; 
       n++; 
      }else if(arr[i][j]!=0){ 
       i=i+2; 
       j=j+1; 
       arr[i][j]=n; 
       n++; 
      }else{ 
       arr[i][j]=n; 
       n++; 
      } 
     } 
     for(i=0,i<ize;i++){ 
      for(j=0,j<size;j++){ 
        cout<<setw(3)<<arr[i][j]; 
      } 
      cout<<endl; 
     } 
     return 0; 
    } 
+0

Code-only-Antworten werden nicht empfohlen. Bitte, fügen Sie Erklärungen über _why_ und _how_ Sie Code funktioniert. – lolbas