IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Affichage du Triangle de Pascal


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 31
    Par défaut Affichage du Triangle de Pascal
    Bonjour

    J'ai du mal à afficher le triangle de Pascal conformement à cet énoncé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    /* Le triangle de Pascal.
    * Le triangle de Pascal est un tableau triangulaire de nombre qui commence comme
    * cela 
    *              1
    *             1 1
    *            1 2 1
    *           1 3 3 1
    *          1 4 6 4 1
    *         1 5 10 10 5 1
    *        1 6 15 20 15 6 1
    *       1 7 21 35 35 21 7 1
    *      1 8 28 56 70 56 28 8 1
    *
    * Chaque nombre du triangle de Pascal est une des combinaisons C(n,k).
    * Si on compte les lignes et le colonnes
    * diagonales à partir de 0, le nombre de ligne n et de la colonne k est C(n,k). 
    * Par exemple, le nombre de la ligne 6 colonne 2 est C(6,2) = 15. Ecrire un 
    * programme qui utilise la fonction comb() pour imprimer le triangle de Pascal 
    * jusqu'à la douzième ligne. 
    */
    J'ai écrit ce code (dans un projet sous l'IDE DevC++) mais qui ne marche bien pour l'affichage.

    fichier .h "triangleDePascal.h"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int comb(int n, int k)
    {
        if(n < 0|| k < 0 || n < k )
             return 0;
       int c = 1, m = n + 1;
      // m = n + 1;
     for( int i = 1; i <= k; i++,m--)
     {
    	c *= m/i;
     }
     return c;
    }
    fichier principale "main.cpp"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
     
    #include <cstdlib>
    #include <iostream>
     
    #include "triangleDePascal.h"
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
      int n, k;
     
      cout << " Entrez deux entiers pour l'impression du triangle de Pascal : ";
      cin >> n >> k;
      for ( int i = 0; i <  n; i++ )
     {
    	for ( int j = i; j < k; j++ )
    	{
                cout << " ";
                cout << comb( i, j ) << '\n';
            }
      cout << endl;
     cin.ignore(numeric_limits <	streamsize > ::max(), '\n');
     }
    }
    Est-ce que quelqu'un voit une erreur sur ce code qui fait que j'obtiens un résultat erroné. (Exemple d'affichage pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    C(6,2) : 1 0
     1 2 )
    Merci d'avance.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Avant de voir les commentaires sur ton code proprement dit, quelques remarques "générales":

    l'inclusion de cstdlib n'est pas nécessaire, car elle est avantageusement remplacée par celle de iostream.

    Par contre, pour pouvoir utiliser numeric_limits, tu devrait inclure <limits>

    Ensuite, plutôt qu'une phrase comme "Entrez deux entiers pour l'impression du triangle de Pascal : ", tu devrais être plu précis dans ce que tu souhaites que l'utilisateur introduise, et donc peut être travailler en deux temps:
    introduisez la valeur de départ pour votre triangle de pascal" (récupérer cette valeur et la valider)
    introduiez le nombre de lignes souhaité" (récupérer cette valeur et la valider)

    En outre, si tu tiens à séparer correctement ton code en fichiers d'en-tête et fichiers d'implémentation, sache que le fichier d'en-tête (*.h ou *.hpp) ne devrait contenir que les déclarations de fonction et les définitions de classes.

    Ton fichier d'en-tête ressemblerait donc à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int comb(int n, int k);
    ... tout simplement...
    et tu aurais un fichier d'implémentation (triangleDePascal.cpp) qui contiendrait l'implémentation de la fonction sous la forme (non corrigée) de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int comb(int n, int k)
    {
        if(n < 0|| k < 0 || n < k )
             return 0;
       int c = 1, m = n + 1;
      // m = n + 1;
     for( int i = 1; i <= k; i++,m--)
     {
    	c *= m/i;
     }
     return c;
    }
    Toute la question étant ici de savoir s'il est intéressant de travailler ainsi pour une seule fonction

    Enfin, tu devrais prendre l'habitude d'utiliser des termes "auto commentés" pour tes différents identifiants (noms de fonction, d'arguments, de variables, etc)...

    Une fonction représentant une action, tu pourrais envisager de renommer avantageusement comb en... combiner et tes variables n et k en vue de leur donner des noms qui représentent clairement ce à quoi il servent (depart et nombre_ligne )

    Ces détails pratiques ayant été abordés, ne crois tu pas que les deux boucles imbriquées font partie de la logique qui permet de créer le triange de pascal

    Si oui, il semble logique de les sortir de la fonction main et de les factoriser dans une fonction qui serait - par exemple - nommée AfficherPascal.

    Cela "simplifierait" ta fonction main en:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main(/* int argc, char* argv[] ceci n'est nécessaire que si tu veux
             * pouvoir passer des arguments lors de l'appel de l'exécutable...
             * ici, ce n'est pas vraiment utile ;)
             */ )
    {
        int depart;
        int nbLignes;
        cout<<"Introduisez la valeur de départ :";
        cin >>depart;
        cout<<"introduisez le nombre de ligne :";
        cin >> nbLignes;
        AfficherPascal(depart, nbLignes);
        return 0;
    }
    En effet, le nombre de valeurs affichées par le triangle de pascal dépendra directement de la position de la ligne du triangle que l'on affiche:
    • 1 pour la première
    • 2 pour la deuxième
    • 3 pour la troisième
    • 4 pour la quatrième
    • ...

    De plus, nous remarquons que les valeurs affichées pour une ligne donnée dépendent directement... des valeurs affichées pour la ligne précédente.

    La première idée qui vient à l'esprit est donc... qu'il serait intéressant de garder ces valeurs "quelque part"...

    De cette manière, tu pourrais envisager de créer ton triangle de pascal d'une seule traite (éventuellement de manière récursive) et de l'afficher une fois qu'il a été créé...

    En t'y prenant bien, si tu décide de permettre à la personne de demander l'affichage de plusieurs triangles de pascal, tu pourrais même envisager de ne recréer le triangle que si l'utilisateur demande l'affichage d'un triangle plus grand ou dont la valeur de début diffère...

    En effet, si l'utilisateur demande la première fois l'affichage d'un triangle commençant à 1 et comprenant 9 lignes, et la deuxième fois celui d'un triangle commençant à 1 mais de 6 lignes à peine, tout ce que tu as à faire, c'est de n'afficher que les 6 premières lignes du triangle déjà calculé la première fois ...

    Évidemment, si l'utilisateur demande la deuxième fois l'affichage d'un triangle de 10 ou 11 lignes ou dont la valeur de départ est 5, il faudra le recalculer

    Mais cela peut te permettre de gagner énormément de temps

    Je vais te laisser "cogiter" un peu sur la manière d'arriver à ces résultats, mais je vais te mettre sur la voie pour t'aider dans ta conception

    Un triangle est composé de lignes, il te faut donc une "collection" dynamique de lignes.

    Chaque ligne est de son coté... une "collection" dynamique de valeurs entières.

    L'idéal est d'utiliser les conteneurs de la STL, tels que vector ou list.

    Tu pourrais donc déclarer une ligne du triangle de pascal sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<int> lignePascal;
    et ton triangle de pascal sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<lignePascal> triangePascal;
    (les deux se satisferaient très bien d'utiliser std::list )

    L'idéal serait alors de partir sur une structure qui contienne le triangle de pascal et qui soit en mesure de te rappeler le nombre de lignes et la valeur de départ utilisée, voire sur une classe qui "encapsulerait" toutes ces informations et qui fournirait les comportements adéquats
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 31
    Par défaut Affichage du Triangle de Pascal
    Merci Koala01.

    Je vais mettre en oeuvre cet algorithme. Je sais que ça me prendra bien du temps. Mais je produirais un effort personnel là-dessus.

    Je ne crois pas que j'ai suffisamment avancé pour réaliser ce code avec les collections dynamiques( c'est ça les pointeurs? J'aborderai ce chapitre après les tableaux! J'étudie en fait dans un livre ("Serie Schaum"). Là j'en suis encore aux fonctions).

    J'ai aussi bien pris en compte vos remarques sur les règles de bonne pratique de programmation(que je connais mais dont je ne me sers pas toujours).

    Je vous renouvelle mes remerciements pour votre contribution.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Mon dieu, il ne s'agit absolument pas de te conseiller de manipuler des pointeurs

    Il est vrai que les pointeurs sont une des solutions envisageables pour créer des structures à taille dynamique, mais, dans l'ensemble, les cas dans lesquels il est utile (indispensable ) de les utiliser sont finalement très rares

    Ici, il s'agit d'utiliser des conteneurs qui, bien qu'utilisant des pointeurs en internes, présentent un ensemble de comportements qui te permettent de gérer plusieurs objets d'un même type de manière bien plus sécurisante que ce que tu serais tenté de faire en utilisant les pointeurs toi-même...

    Le plus souvent, ces conteneurs te permettront d'ajouter un élément à la fin avec un code aussi simple que (si tab est un std::vector<int>)
    J'admets peut etre avoir mal choisi le terme de "collection dynamique", qui peut prêter à confusion avec l'allocation dynamique de la mémoire...

    Ici, l'idée était surtout de parler de conteneur qui adaptent "dynamiquement" leur taille aux besoin de stockage
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    L'intérêt du triangle de pascal est d'utiliser les valeurs d'une ligne pour calculer la suivante. Ce qui impose de les stocker quelque part.

    J'ai l'impression par contre que l'exercice en question te demande de ne pas utiliser cette méthode, mais de recalculer chaque valeur de manière lourde, mais sans donc avoir besoin de rien stocker.

    Peut-être la méthode plus classique viendra-t-elle dans un prochain chapitre, une fois que tu auras vu les tableaux (j'espère sous la forme vector, qui est de loin la plus simple et la plus utile) ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 31
    Par défaut Affichage du Triangle de Pascal - Erreur de compilation
    Merci à tous les deux JolyLoic et Koala01.

    Effectivement je suis un débutant en C++. Dans la mesure que je suis à la lettre un livre d'apprentissage dont je veille à faire tous les exercices et dans l'ordre.

    A partir des indications reçues j'ai structuré mon programme comme suit:

    fichier .h : pascalTriangle.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int combination(int value, int line_number);
    // void displayPascalTriangl(int , int );
    void displayPascalTriangl(int value, int line_number);
    fichiers .cpp
    1) pascalTriangle.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int combination(int value, int line_number)
    {
        if(value < 0|| line_number < 0 || value < line_number )
             return 0;
    	int comb = 1, m = value + 1;
    	for( int i = 1; i <= line_number; i++,m--)
    	{
    		comb *= m/i;
    	}
        return comb;
    }
    2) displayPascalTriangle.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    #include <iostream>
    #include "pascalTriangl.h"
     
    void displayPascalTriangl(int value, int line_number)
    {
         for (int i = -1; i <  value; i++)
    	 {
    		cout << " ";
            for (int j = i + 1; j < line_number; j++)
    		{
                //cout << " ";
                // cout << combination(i, j) << '\n';
                cout << combination(i, j) << " ";
            }
    		cout << endl;
         }
         cout << endl;	
    }
    3) mainPascalTriangle.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    #include <iostream>
    #include <limits>
    #include "pascalTriangl.h"
    using namespace std;
     
    // int main(int argc, char *argv[])
    int main()
    {
    	int value, line_number;
    	cout << " Introduisez un entier pour l'affichage du triangle de Pascal : ";
    	cin >> value;
        cout << " Introduisez le nombre de ligne : ";
    	cin >> line_number;  
        cin.ignore(numeric_limits <	streamsize > ::max(), '\n');
        displayPascalTriangl(value, line_number);
    }
    Le problème auquel je suis confronté à ce niveau est ce message d'erreur :

    displayPascalTriangl.cpp: In function `void displayPascalTriangl(int, int)':
    displayPascalTriangl.cpp:8: error: `cout' undeclared (first use this function)
    displayPascalTriangl.cpp:8: error: (Each undeclared identifier is reported only once for each function it appears in.)
    displayPascalTriangl.cpp:15: error: `endl' undeclared (first use this function)

    make.exe: *** [displayPascalTriangl.o] Error 1


    Exécution terminée


    Pourtant j'ai bien utilisé la directive <iostream> et mon fichier .h

    Est-ce que j'ai omis d'inclure une librairie dont je n'ai pas connaissnace? J'utilise DEVC++ come Environement de Developement!.

    Merci de votre disponibilité pour le temps consacré.

Discussions similaires

  1. triangle de pascal
    Par chouuc dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 20/01/2009, 01h36
  2. Triangle de Pascal
    Par WhiteTigerZ dans le forum Pascal
    Réponses: 5
    Dernier message: 09/03/2007, 19h47
  3. Affichage de triangles
    Par Premium dans le forum OpenGL
    Réponses: 9
    Dernier message: 28/11/2006, 09h49
  4. Triangle de Pascal
    Par yushkoya dans le forum VBScript
    Réponses: 6
    Dernier message: 11/07/2006, 14h18
  5. Création vertex pour affichage en Triangle Strips
    Par ReiKiss dans le forum DirectX
    Réponses: 2
    Dernier message: 09/11/2005, 10h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo