Pages : 1
#1 Le 03/03/2007, à 12:53
- amwus
triangle de pascal affichage
Bonjour.
Voila, je dois faire un programme qui me calcule un triangle de pascal, et qui me permet de l'afficher dans diverses positions (droite, gauche, haut, bas).
Bon, mon code fonctionne, toutefois j'ai un problème embetant. Je ne peux pas calculer de triangle d'une dimension supérieure à 7 ! C'est assez embêtant...
Je met ici mon algorithme de calcul de la matrice, et d'affichage vers le bas, soit un triangle de pascal habituel :
Calcul de la matrice : prend la dimension dans dim :
// Calculation of pascals triangle in matrix.
int matrix[dim][dim];
for (int posx = 0; posx <= dim; posx++) {
matrix[posx][posx] = 1;
matrix[posx][0] = 1;
for (int posy = 1; (posy <= dim) && (posy < posx); posy++) {
matrix[posx][posy] = matrix[posx-1][posy-1] + matrix[posx-1][posy];
}
}
Et voici la fonction d'affichage :
for (int x = 0; x <= dim; x++) {
for (int y = 0; y <= x; y++) {
if (matrix[x][y]) {
printf("%3d", matrix[x][y]);
}
}
printf("\n");
}
Je ne sais pas d'ou peut provenir le problème...
Merci d'avance pour votre aide
Black holes are where god divided by zero...
Hors ligne
#2 Le 03/03/2007, à 13:50
- Geoffrey
Re : triangle de pascal affichage
essaye avec %d au lieu de %3d dans ton printf
Hors ligne
#3 Le 03/03/2007, à 14:03
- best_friend_fr
Re : triangle de pascal affichage
Salut
Erreur classique
Tes indices dans la matrice vont de 0 à dim compris...
Donc ses dimensions sont dim+1, et non dim
Dernière modification par best_friend_fr (Le 03/03/2007, à 14:04)
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#4 Le 03/03/2007, à 14:09
- Freddy
Re : triangle de pascal affichage
Je ne peux pas calculer de triangle d'une dimension supérieure à 7 !
Ça veut dire quoi ? Tu as un message d'erreur, lequel ?
Le résultat est erroné, et dans ce cas quel est le résultat obtenu / attendu ?
Pour quel coefficient, exactement ? Toute la ligne du 7, ou uniquement certains ?
There is no system but GNU, and Linux is one of its kernels.
Hors ligne
#5 Le 03/03/2007, à 16:02
- amwus
Re : triangle de pascal affichage
Salut
Erreur classique
Tes indices dans la matrice vont de 0 à dim compris...
Donc ses dimensions sont dim+1, et non dim
Hum oui mais dans la fonction d'affichage ou de calcul ? Comment j'y remédie ? Je ne comprend pas...
Et non je n'obtiens pas de message d'erreur mais j'ai un affichage de n'importe quoi :
Dimension : 8
Orientation : Bas
1
-12103314641956
-1078617692-1209005424-1210305489
-1210305489134513358 1 1
1 1134513164428889134513310
134513164428889134513310225011984 3-1209042856
134513310225011984 3-1209042856 1 2 1
3-1209042856 1 2 1-1209042180
1 2 1-1209042180 2 1
par exemple...
Dernière modification par amwus (Le 03/03/2007, à 16:03)
Black holes are where god divided by zero...
Hors ligne
#6 Le 03/03/2007, à 16:21
- amwus
Re : triangle de pascal affichage
Ok.... j'ai mis les dimension de la matrice à dim+1 et du coup ça marche mieux... merci du tuyaux !
Encore une petite question, si je veux calculer la matrice transposée, que se passera -t- il pour les endroit où il n'y a rien dans la matrice de base ? Je veux dire là, avec mon algorithme j'ai calculé qqchose directement au bon endroit, mais pas dans toute la matrice. Or pour calculer la matrice transposée, je dois avoir B'[i,j] := B[j,i]... il n'y aura pas forcément qqchose dans B[j,i]...
Hum je ne suis pas sur que ma question soit assez claire
Black holes are where god divided by zero...
Hors ligne
#7 Le 03/03/2007, à 16:45
- best_friend_fr
Re : triangle de pascal affichage
Ben, si tu n'initialise pas les valeurs à 0, c'est les valeurs qu'il y avait avant qui vont rester. Donc n'importe quoi...
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#8 Le 03/03/2007, à 17:35
- amwus
Re : triangle de pascal affichage
oui exactement et c'est la raison pour laquelle j'ai préféré recalculer ma matrice à partir de 0...
Maintenant, j'ai un problème à l'affichage.
J'aimerais obtenir un affichage comme celui la :
1 1 1 1 1
1 2 3 4
1 3 6
1 4
1
Je calcule ma matrice comme suit :
for (int posy = 0; posy <= dim; posy++) {
matrix[posy][posy] = 1;
matrix[0][posy] = 1;
for(int posx = 1; (posx <= dim) && (posx < posy); posx++) {
matrix[posx][posy] = matrix[posx-1][posy-1] + matrix[posx][posy-1];
}
}
Alors pour l'affichage j'ai ça :
for (int y = 0; y <= dim; y++) {
for (int x = 0; x <= y; x++) {
if (matrix[x][y]) {
printf("%5d", matrix[x][y]);
}
}
printf("\n");
}
Bon apparement, là il calcule les bonnes valeurs, mais pas de bon affichage.
J'obtiens un triangle de pascal normal, vers le bas.
Comment puis je obtenir le bon affichage. J'ai essayé d'aller à la ligne directement après le printf, mais là non plus ça ne fonctionne pas. J'ai tous les éléments les uns en dessous des autres...
Dernière modification par amwus (Le 03/03/2007, à 17:35)
Black holes are where god divided by zero...
Hors ligne
#9 Le 03/03/2007, à 17:42
- best_friend_fr
Re : triangle de pascal affichage
Salut
La, après ton calcul, tu as une matrice de la forme
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
Donc si tu veux obtenir la matrice transposée, tu dois faire varier y plus vite que x, soit échanger les 2 for pour l'affichage
for (int x = 0; x <= dim; x++) {
for (int y = x; y <= dim; y++) {
if (matrix[x][y])
printf("%5d", matrix[x][y]);
else
printf(" ");
}
printf("\n");
}
Je ne l'ai pas tappé, donc vérifie et débugge
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#10 Le 03/03/2007, à 19:20
- amwus
Re : triangle de pascal affichage
alors c'est déjà mauvais... Zut va falloir que je refasse ça. Mon calcul de matrice est censé m'afficher une matrice de la forme :
1 1 1 1 1
1 2 3 4
1 3 6
1 4
1
Et là il suffit de lire et de printer... Mais bon apparement ce n'est pas bon...
Black holes are where god divided by zero...
Hors ligne
#11 Le 03/03/2007, à 19:23
- best_friend_fr
Re : triangle de pascal affichage
Ben, tu as qu'a calculer ta matrice normalement et l'afficher dans l'autre sens. Ou est le problème?
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#12 Le 03/03/2007, à 20:00
- amwus
Re : triangle de pascal affichage
oui je vais essayer ça comme tu m'as dis...
Black holes are where god divided by zero...
Hors ligne
#13 Le 03/03/2007, à 20:53
- amwus
Re : triangle de pascal affichage
Raaaa ça m'énerve ce truc
Bon j'ai repris tout depuis le début, je pense que le plus simple est de calculer le triangle de pascal directement à l'envers pour avoir ça :
1 1 1 1
1 2 3
1 3
1
Donc j'essaie de calculer ça dans ma matrice et après d'afficher directement le contenu, sans trop se soucier de la manière d'afficher ça.
J'ai encore remanié mon algorithme pour arriver à ça :
for (int posx = 0; posx <= dim; posx++) {
matrix[posx][posx] = 1;
matrix[0][posx] = 1;
for(int posy = posx + 1; (posy <= dim); posy++) {
matrix[posx][posy] = matrix[posx-1][posy-1] + matrix[posx][posy-1];
}
}
et là ça me donne pas encore tout à fait le bon résultat :
1 1 1 1
1-1209781704 2012
1134513358
1
Est ce que tu penses que l'algorithme travaille comme il le faut ou pas ? Pour moi ça doit fonctionner, je ne comprend pas !
En tout cas merci beaucoup de ton aide !
Black holes are where god divided by zero...
Hors ligne
#14 Le 03/03/2007, à 21:02
- best_friend_fr
Re : triangle de pascal affichage
for (int posx = 0; posx <= dim; posx++) {
for(int posy = posx + 1; (posy <= dim); posy++) {
En faisant ca, ton x est toujours inférieur à ton y.
Ton triangle a donc la tête suivante
x
xx
xxx
xxxx
Je ne sais pas ce que tu affiches, mais si c'est la partie en haut à droite, c'est normal que ca déconne...
Tant qu'a faire, poste ton fichier en entier à chaque fois (dans des balises code), pour qu'on sache ce que tu modifies...
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#15 Le 03/03/2007, à 21:32
- amwus
Re : triangle de pascal affichage
bon d'accord... voici le code complet :
/* pascals-triangle.c Osmalskyj Julien 2007-03-03
*
* This program prints a pascal's triangle in four possible positions :
* left, right, up, down. It uses the command line arguments. The first
* argument is the triangle dimension and the second is the orientation (l,r,u,d).
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Functions prototypes
static void printPascal(int dim, int pos);
int main(int argc, char *argv[])
{
if (argc != 3) {
fprintf(stderr, "Usage: pascal [OPTION1](dimension)[OPTION2](orientation l,r,u,d)\n");
fprintf(stderr, "exemple : pascal 4 u\n");
exit(1);
}
enum {LEFT, RIGHT, UP, DOWN};
int direction; // direction code : 0,1,2 or 3.
if (strcmp(argv[2], "l") == 0)
direction = LEFT;
else if (strcmp(argv[2], "r") == 0)
direction = RIGHT;
else if (strcmp(argv[2], "u") == 0)
direction = UP;
else if (strcmp(argv[2], "d") == 0)
direction = DOWN;
else {
fprintf(stderr, "pascal: erreur: mauvais argument. Entrez l,r,u,d.\n");
exit(1);
}
printPascal(atoi(argv[1]), direction);
printf("\n");
return 0;
}
// printPascal : prints triangle pascal. Dimension and orientation in dim and pos.
static void printPascal(int dim, int pos)
{
int matrix[dim+1][dim+1];
if ((pos == 2) || (pos == 3)) { // Matrix calculation for position UP or DOWN
for (int posx = 0; posx <= dim; posx++) {
matrix[posx][posx] = 1;
matrix[posx][0] = 1;
for (int posy = 1; (posy <= dim) && (posy < posx); posy++) {
matrix[posx][posy] = matrix[posx-1][posy-1] + matrix[posx-1][posy];
}
}
}
else { // Matrix calculation for position LEFT or RIGHT
for (int posx = 0; posx <= dim; posx++) {
matrix[posx][posx] = 1;
matrix[0][posx] = 1;
for(int posy = posx + 1; (posy <= dim); posy++) {
matrix[posx][posy] = matrix[posx-1][posy-1] + matrix[posx][posy-1];
}
}
}
printf("\n");
printf("Dimension : %d\n", dim);
switch(pos) {
case 0: // LEFT
printf("Orientation : Gauche\n\n");
// here code to print left triangle
break;
case 1: // RIGHT
printf("Orientation : Droite\n\n");
for (int x = 0; x <= dim; x++) {
for (int y = x; y<= dim; y++) {
if (matrix[x][y]) {
printf("%5d", matrix[x][y]);
}
}
printf("\n");
}
break;
case 2: // UP
printf("Orientation : Haut\n\n");
for (int x = dim; x >= 0; x--) {
for (int y = 0; y <= x; y++) {
if (matrix[x][y]) {
printf("%5d", matrix[x][y]);
}
}
printf("\n");
}
break;
case 3: // DOWN
printf("Orientation : Bas\n\n");
for (int x = 0; x <= dim; x++) {
for (int y = 0; y <= x; y++) {
if (matrix[x][y]) {
printf("%5d", matrix[x][y]);
}
}
printf("\n");
}
break;
default:
fprintf(stderr, "pascal: erreur inconnue.\n");
exit(1);
break;
}
return;
}
Black holes are where god divided by zero...
Hors ligne
#16 Le 03/03/2007, à 21:44
- best_friend_fr
Re : triangle de pascal affichage
Salut
Si je comprends bien, ton programme doit pouvoir afficher le meme triangle dans 4 positions.
Je serai toi, je ne calculerai qu'un triangle (de la facon de tout à l'heure)
et je changerai l'affichage, pour l'adapter à la demande
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#17 Le 03/03/2007, à 21:58
- amwus
Re : triangle de pascal affichage
oui j'y ai pensé... le triangle s'affiche parfaitement vers le bas et vers le haut mais pas vers la droite et la gauche... mais c'est bcp moins facile comme ça...
Black holes are where god divided by zero...
Hors ligne
#18 Le 03/03/2007, à 22:09
- best_friend_fr
Re : triangle de pascal affichage
Ca sera beaucoup plus facile si tu ne fais qu'une matrice !!
La, tu inverses 2 fois, ce qui est plus dur à repérer.
Ecris ta matrice sur un papier et regarde les indices à mettre pour afficher.
Ce n'est pas dur, mais il faut programmer avec méthode.
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#19 Le 03/03/2007, à 23:39
- aleph
Re : triangle de pascal affichage
Amusant, une petite remarque : pourquoi diable utiliser une matrice/tableau à deux dimensions ?
A but pédagogique, voici un pseudo code qui n'utilise pas de matrice.
#~ pour n lignes
#~ tableau = [1]
#~ print tableau
#~ tableau = [1, 1]
#~ for 1..n
#~ print tableau
#~ création et calcul du nouveau_tableau à partir de tableau
#~ tableau = nouveau tableau
Avantage: les coefficients du triangle de Pacal sont les coefficients du polynôme (a+b)**n. L'utilisation d'une matrice nécessite n*n*entiers d'occupation mémoire. Avec deux tableaux, cela revient à n*(n+1)*entiers. Non négligeable si n est très grand. La programmation, c'est aussi la recherche de méthodes économiques.
Résultat en 11 lignes de codes en Python :
(aucun mérite, j'ai de l'expérience)
0 : [1]
1 : [1, 1]
2 : [1, 2, 1]
3 : [1, 3, 3, 1]
4 : [1, 4, 6, 4, 1]
5 : [1, 5, 10, 10, 5, 1]
6 : [1, 6, 15, 20, 15, 6, 1]
7 : [1, 7, 21, 35, 35, 21, 7, 1]
8 : [1, 8, 28, 56, 70, 56, 28, 8, 1]
9 : [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
10 : [1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1]
Bonne chance.
#20 Le 04/03/2007, à 10:23
- amwus
Re : triangle de pascal affichage
j'ai utilisé la méthode de best_friend, et en cherchant un peu j'ai trouvé. C'est vrai que je me suis pris la tête pour rien dans cette histoire !
En tout cas merci de votre aide !
Black holes are where god divided by zero...
Hors ligne
Pages : 1