Rechercher : dans
Par :

Carré magique en C++ : Tableaux 2D

Dernière réponse le 1 mar 2008 à 13:03:00 azerty0, le 17 déc 2007 à 12:05:10 
 Signaler ce message aux modérateurs

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;  
}
Configuration: Windows Vista
Firefox 2.0.0.11

Meilleures réponses pour « Carré magique en C++ : Tableaux 2D » dans :
Langage C - Les tableaux VoirType de données complexes Les variables, telles que nous les avons vues, ne permettent de stocker qu'une seule donnée à la fois. Or, pour de nombreuses données, comme cela est souvent le cas, des variables distinctes seraient beaucoup trop lourdes...
Les structures en langage C VoirDifférence entre une structure et un tableau Un tableau permet de regrouper des éléments de même type, c'est-à-dire codés sur le même nombre de bits et de la même façon. Toutefois, il est généralement utile de pouvoir rassembler des éléments de...
Les tableaux en langage C++ VoirType de données complexes Les variables, telles que nous les avons vues, ne permettent de stocker qu'une seule donnée à la fois. Or, pour de nombreuses données, comme cela est souvent le cas, des variables distinctes seraient beaucoup trop lourdes...

1

Char Snipeur, le 17 déc 2007 à 14:32:30

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[])
Salutation ! Quand on sait pas, on touche pas !JBT
Char Snipeur

Répondre à Char Snipeur

2

azerty0, le 18 déc 2007 à 00:11:15

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

Répondre à azerty0

3

Char Snipeur, le 18 déc 2007 à 08:53:55

ç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é ;) )
Salutation ! Quand on sait pas, on touche pas !JBT
Char Snipeur

Répondre à Char Snipeur

4

bigboss, le 6 jan 2008 à 18:00:09
  • +1

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");
}

Répondre à bigboss

5

Char Snipeur, le 7 jan 2008 à 08:47:07

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.
Salutation ! Quand on sait pas, on touche pas !JBT
Char Snipeur

Répondre à Char Snipeur

6

bissbiss, le 8 jan 2008 à 23:43:44

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

Répondre à bissbiss

7

bissbiss, le 8 jan 2008 à 23:44:49

C'est moi bigboss

Répondre à bissbiss

8

Char Snipeur, le 9 jan 2008 à 10:39:17

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 !
Salutation ! Quand on sait pas, on touche pas !JBT
Char Snipeur

Répondre à Char Snipeur

9

bissbiss, le 9 jan 2008 à 18:16:20

Ok je comprend daba merci je vais essayer de modifier les fautes
merci

Répondre à bissbiss

10

Ingénieur, le 20 fév 2008 à 14:00:04

J'ai l'honneur de vous demander une documantation en C++ avec des exercices résoulues

Répondre à Ingénieur

11

azerty0, le 22 fév 2008 à 15:16:31

Hum hum...

Cad ?

Répondre à azerty0

12

dr_twix, le 29 fév 2008 à 22:39:20

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

Répondre à dr_twix

13

 azerty0, le 1 mar 2008 à 13:03:00
  • +1

Je te propose deja dessayer avant de demander qu'on fasse le travail a ta place...

Répondre à azerty0
Collection CommentÇaMarche.net