Carré magique en C++ : Tableaux 2D

Fermé
azerty0 Messages postés 1274 Date d'inscription samedi 27 octobre 2007 Statut Membre Dernière intervention 5 septembre 2013 - 17 déc. 2007 à 12:05
azerty0 Messages postés 1274 Date d'inscription samedi 27 octobre 2007 Statut Membre Dernière intervention 5 septembre 2013 - 1 mars 2008 à 13:03
Bonjour,

Je souhaite créer un programme qui crée des carrés magiques. Entre autres, un carré magique, comporte n² cases. On rentre n au départ, ca nous donne un carrée de n cases sur n cases donc. Je dois crée le programme qui initilalise le carré, ca je pense avoir réusssit, mais cest dans la structure de mon programme.

Jutilise un tableau 2D, et je crois ne pas avoir bien compris comment cela marchait, au niveau des pointeurs etc etc... Quand on lapelle par référence dans une fonction par exemple, ou encore au niveau de sa déclaration...

Si qqn pouvait méclairer la dessus et eventuellement me montrer ou son mes erreurs, je lui en serait très reconnaissant.

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

int carre_magique(int n, int *tab[]) // se charge de remplir le tableau
{
    int i=(n+1)/2;
    int j=(n-1)/2;
    int z=1;
    tab[i][j] = z;
    
    while (z!=(n*n))
    {
           if(tab[((i+1)%n)][((j+1)%n)]==0) // si la case ui suit nest pas remplie, je me déplace, et je remplie ma nouvelle case
           {
           
                   i++; j++; 
                   tab[(i%n)][(j%n)]=++z;
                   i=i%n; j=j%n;
           }
    
           else if(tab[((i+1)%n)][((j+1)%n)]!=0) // si la case suivante est remplie, je me déplace vers le bas, et pas besoin de retester, la case sera obligatoirement vierge.
           {
                   i+=2;
                   tab[(i%n)][(j%n)]=++z;
                   i=i%n;
           }
     }
     return n;
}


int main()
{
     int n;
     cout << "Ce programme cree des carres magiques pour vous, de quel ordre voulez-vous que soit votre carre magique ? ";
     cin >> n;
     int ** tableau [n][n];  // création de mon tableau en deux dimensions
     
     carre_magique(n,tableau[n][n]); // appel de ma fonction qui initialise mon carré magique
     
     for(int i=0;i<n;i++) // cette boucle est sencée afficher a lécran mon carré, avec setw(), ca doit me faire qqch de bien présenté
     {
            for(int j=0;j<n;j++) cout << setw(4) << tableau[i][j];
            cout << endl;
     }
     
     system("PAUSE");
     return 0;  
}

13 réponses

moi aussi je vois pas mon programme sur le carre magique svp est ce que vous pouvez m'aider voila mon programme



#include<stdio.h>
#include<conio.h>
#include<string.h>
int t[10][10];

int n,i,j;int k[10][10],h[10][10];
int S[10];int S1[10][10],S2[10][10];
int magique(int n, int *tab[]) )

{ for(i=0;i<n;i++)
{for(j=0;j<n;j++)
S[i]+=t[i][j];}
for(j=0;j<n;j++)
{for(i=0;i<n;i++)
S[j]+=t[i][j];}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if((S[i]=S[i+1])&&(S[j]=S[j+1])&&(S[i]=S[j]))
return 0;
else
return 1;
}
int parfaite(int n, int *tab[]))

{k=magique(t[10][10]);
if(k==0)
{
for(i=0;i<n;i++)
S1=t[i][i];
S2+=t[i][n-i-1];
if(S2==S1)
return2;
}
else return 3;
else return 1;
}
void main()
{int t[10][10];
int h;
int J;
printf("entrer l'ordre de la matrice\n");
scanf("%d",&n);
h=magique(t[10][10]);
J=parfaite(t[10][10]);
if((h==0)&&(J==3))
printf("le carre est magique et parfaite\n");
if((h==0)&&(J==3))
printf("le carre est magique non parfait\n");
if(h==1)
printf("le carre n'est magique\n");
}
4
azerty0 Messages postés 1274 Date d'inscription samedi 27 octobre 2007 Statut Membre Dernière intervention 5 septembre 2013 75
1 mars 2008 à 13:03
Je te propose deja dessayer avant de demander qu'on fasse le travail a ta place...
2
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
17 déc. 2007 à 14:32
houla !
Encore qqun qui a des problème avec des pointeurs !! l'instruction :
int ** tableau [n][n];
crée une variable tableau de type int**** (poiteur 4 d'un entier) soit un tableau à 4 dimensions !
Soit tu fait int tableau [n][n]; soit tu fait int ** tableau ; , mais pas les deux.
dans un premier temps, évite les [], après ça sera plus claire.
N'oublie pas d'initialister tes tableaux (avec malloc ou new[])
0
azerty0 Messages postés 1274 Date d'inscription samedi 27 octobre 2007 Statut Membre Dernière intervention 5 septembre 2013 75
18 déc. 2007 à 00:11
cest bon, jai réglé ces problèmes, mais le programme ne marche pas... Merci au passage, je viens dapprendre qqch de très important ;)

Tout a l'heure, j'ai essayé en mettant tout dans le main, ca a marché et mntnt, j'ai changé une paire de trucs, le programme passe ne compile, mais il bug :

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


void init(int n, int ** &tab) // remplit le tableau de 0
{
    for(int i=0;i<n;i++)
    {
         for(int j=0;j<n;j++)
         {
         tab[i][j]=0;
         }
    }     
}


int carre_magique(int n, int ** &tab) // se charge de remplir le tableau avec les nombres
{
    int i=(n+1)/2;
    int j=(n-1)/2;
    int z=1;
    tab[i][j] = z;
    
    while (z!=(n*n))
    {
           if(tab[((i+1)%n)][((j+1)%n)]==0) tab[(++i=i%n)][(++j=j%n)]=++z;  // si la case qui suit nest pas remplie, jincrémente, et je remplie ma nouvelle case
    
           else tab[(i=((i+2)%n))][(j%n)]=++z;  // si la case suivante est remplie, je me déplace vers le bas, et pas besoin de retester, la case sera obligatoirement vierge.
    }
    return n;
}


int main()
{
     int n;
     cout << "Ce programme cree des carres magiques pour vous, de quel ordre voulez-vous que soit votre carre magique ? (Rentrez un entier impair) ";
     cin >> n;
     int tableau[n][n] ;  // création de mon tableau en deux dimensions
     
     init(n, tableau[n][n]);  // initialisation de mon beau tableau
     carre_magique(n, tableau[n][n]);
     
     for(int i=0;i<n;i++) 
     {
            for(int j=0;j<n;j++) cout << setw(5) << tableau[i][j];
            cout << endl;
     }
     
     system("PAUSE");
     return 0;  
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
18 déc. 2007 à 08:53
ça compile ???
je suis étonné !
Une chose est sur, tu nas toujours pas compris les pointeurs.
ta fonction 'init' est déclaré ainsi :
initi(int , int**) (je ne voi pas ce que le & viens foutre là dedans d'ailleurs. Qu'est-ce qui ta pris de le mettre ?)
et toi tu lui passe tableau[n][n] soit un int à la place d'un int** comme second argument ! Le compilo aurait du râler !
en passant, l'appel tableau[n][n] te renvera une erreur dans le pire des cas, et n'importe quoi dans le meilleur. En C un tableau de dimension n a des valeur de 0 à n-1 (ce qui fait bien n valeurs), la dernière case du tableau, c'est tableau[n-1].
Pour finir, je n'en ai pas parler, mais normalement, tu ne peux pas dimensioner un tableau avec un int non const. La ligne :
int tableau[n][n];
ne devrais pas compiler.
fait des recherche sur les pointeurs, sur ce forum, il y a plein de type qui ont eu ou ont les même problèmes que toi, et il y a des messages qui font de bon rappel bien complet (Et puis leur auteurs en ont un peu marre de se répété ;) )
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
7 janv. 2008 à 08:47
Salut.
Quand tu met un bout de programme aussi long, utilise les balises de code qui conserve la mise en forme, parceque là c'est illisible.
Deuxième point, quel est exactement ton problème ? Bien entendu tu peux tombé sur des gens très gentil qui vont reprendre ton bout de code, le compiler et voir ce qui va pas, mais tu diminue grandement tes chances d'avoir une réponse.
0
mon pobleme c'est la declaration des fonction et leur call f l main je crois que c'est ca
et pour le faite que c'est pas lisible qu'est ce que t veux dire par balises de codes
merci
0
c'est moi bigboss
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
9 janv. 2008 à 10:39
tu entoure ton source par les balises
<code>
</code>
"call f l main" quoi qu'est-ce ? 8-|
pour la déclaration des fonction, je ne voi rien à redire à par une parenthèse fermante en trop qui n'a pas lieu d'être.
par contre, leur appel c'est n'importe quoi, tu as défini deux argument à tes fonctions, et tu n'en passe qu'un.
ensuite, c'est 't' qu'il faut passer et non 't[10][10]'
Houlà ! je viens de voir aussi deux else successif dans ta fonction 'parfaite' à revoir !
0
ok je comprend daba merci je vais essayer de modifier les fautes
merci
0
J'ai l'honneur de vous demander une documantation en C++ avec des exercices résoulues
0
azerty0 Messages postés 1274 Date d'inscription samedi 27 octobre 2007 Statut Membre Dernière intervention 5 septembre 2013 75
22 févr. 2008 à 15:16
Hum hum...

Cad ?
0
je voudré un code en c une fonction ki qui permet de sa voir si la matrice est magique ou po une matrice dordre 3
0