2010-12-07 5 views
5

Pour ceux qui ne connaissent pas l'algorithme du carré magique classique: Un carré magique est un tableau bidimensionnel (n x n) qui contient une valeur numérique entre les valeurs 1 et n^2 à chaque emplacement. Chaque valeur peut apparaître qu'une seule fois. De plus, la somme de chaque ligne, colonne et diagonale doit être la même. L'entrée devrait être étrange car j'écris une solution de carré magique impair.Programme Magic Square (C++)


J'ai terminé le problème mais maintenant il a un bug inconnu (logique? Sortie?) Qui a été me fâcher pour la dernière heure. Les valeurs qui sont sorties sont très hors marque. Toute aide serait très apprécié:


#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

Et le bug est _what_, exactement? Qu'est-ce que ça fait, et quelle est la différence entre ça et ce que ** ça devrait faire? Avez-vous essayé d'utiliser un débogueur? –

+0

Avez-vous essayé de le déboguer dans un débogueur. GDB et VS C++ Express sont gratuits. Pas beaucoup d'excuses pour ne pas. – linuxuser27

+0

initialise le tableau avec la valeur initiale, c'est-à-dire 0. ou utilise un langage qui initialise le tableau à la valeur par défaut. Comme java initialize int à 0, float à 0.0 et object array à null. – Trying

Répondre

12

Vous avez oublié d'initialiser votre MagicSquare pour contenir tous les zéros:

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

Ainsi cette vérification échouera presque toujours:

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

Comme C/++ ne les initialise pas à 0 pour vous.

0

vous ne pouvez pas prendre le numéro n de l'utilisateur, parce que vous devez définir la taille du tableau avec une constante

+0

Cela n'est pas vrai. Vous pouvez définir un tableau de taille arbitraire en le plaçant dans une étendue distincte {...}. Bien sûr, surveillez votre pile dans ce cas. – Archie

+0

@Archie Pourriez-vous expliquer pourquoi cette syntaxe est légale? Je n'ai pas suivi, mais tout le monde semble être sur la même longueur d'onde avec vous. – Panzercrisis

+0

@Archie: Ce n'est pas correct. C++ n'autorise pas les tableaux de longueur variable, quelle que soit leur portée. Certains compilateurs peuvent l'autoriser en tant qu'extension, mais ce n'est pas standard. – zindorsky

-1

Vous devez créer le tableau dynamique afin d'écouter la dimension du clavier, mais ne pas oublier de supprimer des tableaux lorsque vous ne avez pas besoin

+0

La question ne portait pas sur les tableaux dynamiques. Les réponses existantes sont correctes. – yakatz

0

vous devez initialiser contenir tous les éléments de zéros:

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

othewise il montrer la valeur des déchets. NB: fonction memset incluse dans le fichier d'en-tête cstring.

Votre correction 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

Les réponses au code uniquement ne sont pas encouragées. S'il vous plaît, ajouter des explications sur _why_ et _how_ vous codez des œuvres. – lolbas