Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 wink


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 wink

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

best_friend_fr a écrit :

Salut

Erreur classique wink

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 smile !

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 big_smile


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 yikes

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 smile !


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