Carré magique en C++ : Tableaux 2D
azerty0
Messages postés
1274
Date d'inscription
Statut
Membre
Dernière intervention
-
azerty0 Messages postés 1274 Date d'inscription Statut Membre Dernière intervention -
azerty0 Messages postés 1274 Date d'inscription Statut Membre Dernière intervention -
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.
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; }
A voir également:
- Carré magique en C++ : Tableaux 2D
- Éponge magique danger - Guide
- Metre carré clavier ✓ - Forum Bureautique
- Quel est le raccourci clavier pour m2 et m3 ? ✓ - Forum Bureautique
- 2 au carré symbole iphone ✓ - Forum iPhone
- Carré en c ✓ - Forum Programmation
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");
}
#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");
}
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[])
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[])
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 :
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; }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
ç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é ;) )
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é ;) )
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.
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.
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
et pour le faite que c'est pas lisible qu'est ce que t veux dire par balises de codes
merci
tu entoure ton source par les balises
"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 !
<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 !