Problèmes programme simple.
Répondre à la discussion
Affichage des résultats 1 à 23 sur 23

Problèmes programme simple.



  1. #1
    Wadad

    Arrow Problèmes programme simple.


    ------

    Bonjour à tous,

    J'étudie en ce moment un peu de programmation sur le site du zéro, que vous connaissez surement. Or me voila devant un problème de taille pour moi, qui sera sans doute vite trouvé par vous autres : je n'arrive pas à trouver mon erreur...

    Le programme doit créer un rectangle d'étoile * grâce aux données rentrées par l'utilisateur à savoir hauteur et largeur.

    Avant de savoir comment améliorer ce programme je voudrais juste comprendre ce qui cloche.

    Je vous donnerai toutes les infos si vous ne le trouvez pas clair.
    Merci à tous.



    Code:
    1 #include <iostream>
    2 // le but du programme est de créer un rectangle d'étoiles,
    3 // à partir de deux données rentrées par l'utilisateur...
    4 using namespace std;
    5 void dessineRectangle (double h(0), l(0))
    6 {
    7     do
    8     {
    9         do
    10        {
    11            cout << "*";
    12            l--;
    13        } while (l>0);
    14    cout << endl;
    15    h--;
    16    } while (h>0);
    17
    18 }
    19
    20 int main()
    21 {
    22    double largeur, hauteur;
    23    cout << "Largeur?" << endl;
    24    cin >> largeur;
    25    cout << "Hauteur?" << endl;
    26    cin >> hauteur;
    27    dessineRectangle(largeur, hauteur);
    28    return 0;
    29 }

    -----
    Dernière modification par Jack ; 17/05/2011 à 11h20. Motif: ajour balises code

  2. #2
    lou_ibmix_xi

    Re : Problèmes programme simple.

    Salut,

    Si tu nous disais ce qui cloche. Le code ne compile pas? Quelle sont les messages du compilateurs... Le programme compile mais "plante", à quel moment... Le programme tourne bien mais ne fait pas ce que tu voudrais qu'il fasse? Quel est son comportement.

    Une autre remarque, utilise les balises "code" pour que les indentations ne soient pas perdues...

    Code:
    #include <iostream>
    // le but du programme est de créer un rectangle d'étoiles,
    // à partir de deux données rentrées par l'utilisateur...
    using namespace std;
    
    void dessineRectangle (double h(0), l(0)) {
        do {
            do {
                cout << "*";
                l--;
            } while (l>0);
            cout << endl;
            h--;
        } while (h>0);
    }
    
    int main () {
        double largeur, hauteur;
        cout << "Largeur?" << endl;
        cin >> largeur;
        cout << "Hauteur?" << endl;
        cin >> hauteur;
        dessineRectangle(largeur, hauteur);
        return 0;
    }
    Quelques remarques en vrac. Pourquoi utiliser des doubles pour une appllications qui n'en à pas besoin, tes nombres de colonnes et de lignes sont clairement des entiers. Dans certains cas cela pourrait être dangereux (genre tests d'égalités).
    La déclaration de la fonction, il manque le type du second argument. De plus, je ne suis pas un gros spécialiste des arguments par défaut, mais je ne suis pas sûr qu'ils se déclarent entre parenthèses (à vérifier).

    Bon courage

  3. #3
    softelectro

    Re : Problèmes programme simple.

    Salut

    Pour compléter le post précédent de lou_ibmix_xi, la définition de la fonction n'est pas correcte.
    1) Il manque le type du second argument
    2) je ne voit pas à quoi serve les "(0)" sur les arguments
    3) Si tu test le passage des valeurs par défaut, le programme est mal écrit.

    J'ai regardé le tuto du SdZ, regarde comment il écrive le prog, ça te donnera des idées pour corriger tes fautes.

    Bonne programmation

  4. #4
    invite765732342432
    Invité

    Re : Problèmes programme simple.

    Et une fois tous ces problèmes de syntaxe résolus, le programme affichera une ligne d'étoile et le reste de lignes vides...

  5. A voir en vidéo sur Futura
  6. #5
    Wadad

    Re : Problèmes programme simple.

    Alors,

    Code:
    #include <iostream>
    // le but du programme est de créer un rectangle d'étoiles,
    // à partir de deux données rentrées par l'utilisateur...
    using namespace std;
    
    void dessineRectangle (int h,int l)
    {
        do
        {
            do
            {
                cout << "*";
                l--;
            } while (l>0);
        cout << endl;
        h--;
        } while (h>0);
    
    }
    
    int main()
    {
        int largeur, hauteur;
        cout << "Largeur?" << endl;
        cin >> largeur;
        cout << "Hauteur?" << endl;
        cin >> hauteur;
        dessineRectangle(largeur, hauteur);
        return 0;
    }
    Voila pour la balise code
    Merci de m'avoir aidé car maintenant le programme se lance ce qui est un bon début...

    Après avoir corrigé quelques erreurs au niveau des arguments, j'ai donc ce nouveau code, qui se lance, mais qui comme le dit Faith, ne marche qu'à moitié...
    Voici ce qui apparait :
    (voir pièce jointe)
    Nom : Etoile_rectangle.JPG
Affichages : 62
Taille : 20,5 Ko

    Je me demande s'il ne faudrait pas inverser h et l...?
    Il doit y avoir un problème de raisonnement, pour moi, le dessinneRectangle place un ligne d'étoiles grâce à l, qui correspond au nombre donné par l'utilisateur, puis h diminue de 1 et la ligne devrait recommencer à se placer grâce à l...

    (si vous voyez ce que je veux dire...)

  7. #6
    invite765732342432
    Invité

    Re : Problèmes programme simple.

    Citation Envoyé par Wadad Voir le message
    Il doit y avoir un problème de raisonnement, pour moi, le dessinneRectangle place un ligne d'étoiles grâce à l, qui correspond au nombre donné par l'utilisateur, puis h diminue de 1 et la ligne devrait recommencer à se placer grâce à l...
    Mais regarde ce que subit l: tu commences par le diminuer jusqu'à 0, pour quoi pas, mais une fois qu'il est à 0, que se passe-t-il ? (déroule bien l'algo à la main, en faisant plus d'une itération, ce sera assez facile à identifier)

    En fait, pour ce genre d'algorithme, la boucle for est beaucoup plus adaptée (mais rien ne t'empêche de réussir avec ton do...while)

  8. #7
    ventilopomme

    Re : Problèmes programme simple.

    ah oui je vois un gros probleme d'algo
    tu passes dans ta boucle la premiere fois tu traces ta ligne
    tu passes une seconde fois si tu remets pas ta variable avec la valeur que tu as en parametre de la fonction et bien tu rentres pas dedans
    Code:
    #include <iostream>
    // le but du programme est de créer un rectangle d'étoiles,
    // à partir de deux données rentrées par l'utilisateur...
    using namespace std;
    
    void dessineRectangle (int h,int l)
    {
        int longueur;
        do
        {
            longueur=l; 
            do
            {
                cout << "*";
                longueur--;
            } while (longueur>0);
        cout << endl;
        h--;
        } while (h>0);
    
    }
    
    int main()
    {
        int largeur, hauteur;
        cout << "Largeur?" << endl;
        cin >> largeur;
        cout << "Hauteur?" << endl;
        cin >> hauteur;
        dessineRectangle(largeur, hauteur);
        return 0;
    }
    tu l'aurais vu si tu avais tourné ton algo sur une feuille de papier
    ou afficher avec des couts la valeur au fur et a mesure la valeur des variables
    exclu à jamais du présent

  9. #8
    Wadad

    Re : Problèmes programme simple.

    J'ai finalement résolu les problèmes en utilisant une boucle "for..." afin d'éviter qu'elle ne s'arrête.

    maintenant si je veux faire un rectangle évidé, faudra-t-il que j'entre dans la boucle "for..." une nouvelle boucle de type "if ligne==0 or ligne+==h && colonne==0 or colonne+1==l"
    cout << "*"

    voila mon nouveau code et ce qu'il donne.

    Code:
    #include <iostream>
    using namespace std;
    
    void dessineRectangle (int l,int h)
    {
        for(int ligne (0); ligne<h; ligne++)
        {
            for(int colonne (0); colonne<l; colonne++)
            {
            if (ligne==0 or ligne+1==h && colonne==0 or colonne+1==l)
            cout << "*";
            }
        cout << endl;
        }
    
    }
    
    int main()
    {
        int largeur, hauteur;
        cout << "Largeur?" << endl;
        cin >> largeur;
        cout << "Hauteur?" << endl;
        cin >> hauteur;
        dessineRectangle(largeur, hauteur);
        return 0;
    }
    ce qu'il donne : voir pièce jointe...

    Voila merci de m'aider
    Images attachées Images attachées  

  10. #9
    ventilopomme

    Re : Problèmes programme simple.

    on veut bien t'aider mais montre nous ton raisonnement et comment tu es arrivé à ce programme
    exclu à jamais du présent

  11. #10
    Wadad

    Re : Problèmes programme simple.

    @ventilopomme

    Mon raisonnement est de faire tourner l'algorithme précédent en rajoutant une condition : placer une * que quand ligne==0 dont au début de celle ci et quand ligne+1==l autrement dit à la fin.
    Mais je pense que je vais devoir créer une nouvelle boucle if spéciale à la colonne. je corrige mon code et regarde sa.

    J'y suis arrivé à partir de mon autre programme, et j'ai réflechis aux conditions à donner pour le dessin...

  12. #11
    Wadad

    Re : Problèmes programme simple.

    @ventilopomme
    Pour en revenir a votre message précédent, il est vrai qu'il est en cela (voir son algorithme travailler étape par étape) agréable de travailler sur algobox qui propose un mode pas à pas...

  13. #12
    ventilopomme

    Re : Problèmes programme simple.

    non je voulais dire sur papier avant de coder le programme au début on fait cela et apres on le fait machinalement mentalement
    exclu à jamais du présent

  14. #13
    Wadad

    Re : Problèmes programme simple.

    Voila ce qui ressort de ma reflexion...

    Code:
    #include <iostream>
    // le but du programme est de créer un rectangle d'étoiles,
    // à partir de deux données rentrées par l'utilisateur...
    using namespace std;
    
    void dessineRectangle (int l,int h)
    {
        for(int ligne (0); ligne<h; ligne++)
        {
            for(int colonne (0); colonne<l; colonne++)
            {
            if (colonne==0 or colonne+1==l)
            {
                cout << "*";
            }
            else if (ligne==0 or ligne+1==h)
            {
             cout << "*";
            }
            }
        cout << endl;
        }
    
    }
    
    int main()
    {
        int largeur, hauteur;
        cout << "Largeur?" << endl;
        cin >> largeur;
        cout << "Hauteur?" << endl;
        cin >> hauteur;
        dessineRectangle(largeur, hauteur);
        return 0;
    }
    Mais encore un petit tracas, bien que cela marche mon rectangle n'est pas evidé car les * se suivent. Regardez cette images, vous comprendrez...

    (cf pièce jointe)

    Comment peut-on résoudre ce problème, je pensais à mettre l-2 espace mais comment donner cette instruction à l'ordianteur?
    Images attachées Images attachées  

  15. #14
    softelectro

    Re : Problèmes programme simple.

    il te manque un dernier cas (else). quand tu es dans le rectangle,il faut mettre un espace.

    Es ce que l'opérateur "or" est accepter en C++?

    @+
    Dernière modification par softelectro ; 17/05/2011 à 14h46.

  16. #15
    Xoxopixo

    Re : Problèmes programme simple.

    Bonjour,

    L'espace est un caractere comme les autres.
    Si tu affiches le caractere "*"
    Il te faut aussi afficher le caractere " " lorsque tes teste de conditions concluent à l'absence d'un bord.

    N'oublie pas que l'affichage se fait, 'à la suite', les caracteres se placent les uns derriere les autres. Puisque je ne vois aucune instruction qui positionne le curseur d'affichage, comme on le fait par exemple en 'basic' avec un LOCATE x,y par exemple.

    De plus ton programme ne tient pas compte de tous les cas possibles.
    Si l'utilisateur entre 1 en ligne ou en colonne, que va-t-il se passer ?

    Citation Envoyé par Lou_ibmix_xi
    La déclaration de la fonction, il manque le type du second argument. De plus, je ne suis pas un gros spécialiste des arguments par défaut, mais je ne suis pas sûr qu'ils se déclarent entre parenthèses (à vérifier).
    Moi non plus.
    Par contre je sais qu'il n'est pas bon de declarer les variables comme tu le fais. Ici, tu declares "ligne" directement dans le for....
    Code:
    for(int ligne (0); ligne<h; ligne++)
    Il est plus propre de declarer toutes les variables en haut du sous-programme, dans le cas des variables locales. D'un coup d'oeil tu vois
    tes variables et leurs types. Sans avoir à fouiner dans chaque ligne de programme.

    donc ici.
    int ligne = 0;
    int colonne =0;

    Ensuite, si tu dois modifier cette variable, il n'est plus necessaire de redeclarer le type à chaque fois. Et ce n'est absolument pas souhaitable.
    Mais comment le sais-tu sans parcourir ton sous-programme ?
    Donc la declaration se fait en haut.
    C'est fini l'epoque ou on cherchait à économiser 2 octets.

    Un conseil aussi concernant le nommage.
    Dans ce cas particulier, ligne et colonne sont utilisées dans des test conditionnels. Autant les nommer X et Y, ca permet d'avoir un code plus court. Surtout qu'il te faut 2 tests, que tu peux mettre sur une même ligne.

    La question c'est afficher une etoile, ou ne pas afficher une etoile, et donc afficher un espace à la place.
    Sur une ligne :
    si X=0 ou Y=0 ou X=DX-1 ou Y=DY-1 alors
    affiche "*" sinon affiche " "

    Comme c'est précisé egalement ici.
    Citation Envoyé par Softelectro
    il te manque un dernier cas (else). quand tu es dans le rectangle,il faut mettre un espace.
    J'ai remplacé le l, I i,!, |, enfin le mechant petit "L" qui se cache
    par DX et le h par DY
    C'est plus parlant, et surtout, tu vois tout de suite comme ça si tu compares bien des X avec des X et non pas des X avec des Y
    Ca saute aux yeux en cas d'erreur et surtout c'est plus lisible pour quelqu'un d'autre. Il est petit ton programme ici, mais imagine 50 pages comme ça....la criiise...

    Le programme est presque fini.

  17. #16
    invite765732342432
    Invité

    Re : Problèmes programme simple.

    Citation Envoyé par Xoxopixo Voir le message
    Par contre je sais qu'il n'est pas bon de declarer les variables comme tu le fais. Ici, tu declares "ligne" directement dans le for....
    Code:
    for(int ligne (0); ligne<h; ligne++)
    Il est plus propre de declarer toutes les variables en haut du sous-programme, dans le cas des variables locales. D'un coup d'oeil tu vois
    tes variables et leurs types. Sans avoir à fouiner dans chaque ligne de programme.
    Hummm... Pour un for, je trouve beaucoup plus propre de déclarer l'incrément dans le for lui-même.
    Le code gagne en concision et en clarté (enfin, selon le point de vue)
    Et ça évite certaines blagues comme de réutiliser cette variable pour autre chose.

    Si l'utilisateur entre 1 en ligne ou en colonne, que va-t-il se passer ?
    Ca marchera quand même ? (avec la version avec les for)

  18. #17
    Wadad

    Talking Re : Problèmes programme simple.

    Merci à tous pour vos consignes, conseils, aides en tout genres, et indices car j'ai réussi (ENFIN!) à faire ce rectangle évidé... voila mon code, j'ai essayé de satisfaire tout le monde en simplifiant, rendant plus lisible et mieux expliqué aussi

    Code:
    #include <iostream>
    // le but du programme est de créer un rectangle d'étoiles,
    // à partir de deux données rentrées par l'utilisateur...
    using namespace std;
    
    
    void dessineRectangle (int hauteur,int largeur)
    {
        for(int x(0); x<hauteur; x++)// saute une ligne.
        {
            for(int y(0); y<largeur; y++)// ajoute des étoiles...
            {
            if (y==0 || y==largeur-1) // ... seulement 1 au début,
            // une à la fin.
            {
                cout << "*";
            }
            else if (x==0 || x==hauteur-1) // ... sauf à la prenière
            // et dernière ligne.
            {
                cout << "*";
            }
            else // dans tout les autres cas on place un " ".
            {
                cout << " ";
            }
            }
        cout << endl;
        }
    
    }
    
    int main()
    {
        int largeur, hauteur;
        cout << "Hauteur?" << endl;
        cin >> largeur;
        cout << "Largeur?" << endl;
        cin >> hauteur;
        dessineRectangle(largeur, hauteur);
        return 0;
    }
    voila! je vais essayer d'autres figures plus complexes pour m'entrainer, par ailleurs, si vous voyez des exercices réalisable je suis preneur!

    Images attachées Images attachées  
    Dernière modification par Wadad ; 17/05/2011 à 20h43.

  19. #18
    invite765732342432
    Invité

    Re : Problèmes programme simple.

    Juste un point: peux-tu nous dire quel compilateur (ou quelles options de compilation) tu utilises ?
    (la notation "int x(0)" nous surprend un peu...)

  20. #19
    Wadad

    Re : Problèmes programme simple.

    Citation Envoyé par Faith Voir le message
    Juste un point: peux-tu nous dire quel compilateur (ou quelles options de compilation) tu utilises ?
    (la notation "int x(0)" nous surprend un peu...)
    J'utilise Codeblocs, si c'est bien ce que je pense être le compilateur...

  21. #20
    Xoxopixo

    Re : Problèmes programme simple.

    Pas mal le résultat.

    Bon pour la declaration de variables, c'est une habitude à prendre je dirais. Apres chacun fait comme il le souhaite.
    On a nos habitudes aussi.

    Il n'y a pas que le C dans la vie et on s'éfforce depuis longtemps en programmation de distinguer les données, et les traitements. Comme en Assembleur et en objet.
    Il me semble.

    Pour avancer un peu, tu pourrais par exemple tenter d'inscrire une croix à une position définie dans le cadre.
    Ou customiser le cadre ? Pouvoir choisir le caractere à afficher.
    Ca donne des idées.
    Tu peux ensuite stoquer le cadre sous forme d'un tableau etc.
    Recuperer le tableau depuis ta procedure Main par exemple.
    Apres tu fait un petit jeu avec un bonhomme qui doit eviter des mines ?

  22. #21
    Wadad

    Re : Problèmes programme simple.

    Alors voila pour le choix du caractère...

    Code:
    #include <iostream>
    // le but du programme est de créer un rectangle d'étoiles,
    // à partir de deux données rentrées par l'utilisateur...
    using namespace std;
    
    
    void dessineRectangle (int hauteur,int largeur)
    {
     char caractereChoisi ('*');
     cin >> caractereChoisi;
        for(int x(0); x<hauteur; x++)// saute une ligne.
        {
            for(int y(0); y<largeur; y++)// ajoute des étoiles...
            {
            if (y==0 || y==largeur-1) // ... seulement 1 au début,
            // une à la fin.
            {
                cout << caractereChoisi;
            }
            else if (x==0 || x==hauteur-1) // ... sauf à la prenière
            // et dernière ligne.
            {
                cout << caractereChoisi;
            }
            else // dans tout les autres cas on place un " ".
            {
                cout << " ";
            }
            }
        cout << endl;
        }
    
    }
    
    int main()
    {
        int largeur, hauteur;
        cout << "Hauteur?" << endl;
        cin >> largeur;
        cout << "Largeur?" << endl;
        cin >> hauteur;
        cout << "Choissisez un caractere : ";
        dessineRectangle(largeur, hauteur);
        return 0;
    }
    Je bosse sur la croix maintenant

  23. #22
    Wadad

    Thumbs up Re : Problèmes programme simple.

    Et comme promis, voila pour la croix dans le rectangle, croix entièrement cuztomisable...

    Code:
    #include <iostream>
    using namespace std;
    
    
    void dessineRectangle (int hauteur,int largeur)
    {
     char caractereChoisi ('*');
     char caractereCroi ('-');
     cin >> caractereChoisi >> caractereCroi;
        for(int x(0); x<hauteur; x++)// saute une ligne.
        {
            for(int y(0); y<largeur; y++)// ajoute des caractères...
            {
            if (y==0 || y==largeur-1) // ... seulement 1 au début,
            // un à la fin.
            {
                cout << caractereChoisi;
            }
            else if (y*2+2==largeur || y*2==largeur) // place un 
            //caractère pour une largeur pair.
            {
                cout << caractereCroi;
            }
            else if (y*2+1==largeur) // idem mais impair.
            {
                cout << caractereCroi;
            }
            else if (x==0 || x==hauteur-1) // ... sauf à la prenière
            // et dernière ligne.
            {
                cout << caractereChoisi;
            }
            else if (x*2+2==hauteur || x*2==hauteur) // place un 
            // caractère pour une hauteur pair.
            {
                cout << caractereCroi;
            }
            else if (x*2+1==hauteur) // idem mais impair.
            {
                cout << caractereCroi;
            }
            else // dans tout les autres cas on place un " ".
            {
                cout << " ";
            }
            }
        cout << endl;
        }
    
    }
    
    int main()
    {
        int largeur, hauteur;
        cout << "Hauteur?" << endl;
        cin >> largeur;
        cout << "Largeur?" << endl;
        cin >> hauteur;
        cout << "Choissisez deux caracteres : ";
        dessineRectangle(largeur, hauteur);
        return 0;
    }
    avec une petite illustration que voila... :

    cf pièce jointe


    Par contre je ne sais pas comment on insère tout cela en tableau dans la fonction main... Si quelqu'un peut éclairer ma lanterne...
    Images attachées Images attachées  

  24. #23
    bzh_nicolas

    Re : Problèmes programme simple.

    Citation Envoyé par Faith Voir le message
    Juste un point: peux-tu nous dire quel compilateur (ou quelles options de compilation) tu utilises ?
    (la notation "int x(0)" nous surprend un peu...)
    C'est une syntaxe autorisée en C++ mais pas du tout en C "strict".

Discussions similaires

  1. programme pic simple qui ne fonctionne pas
    Par alainav1 dans le forum Électronique
    Réponses: 6
    Dernier message: 10/04/2011, 14h55
  2. Programme ASM simple qui ne marche pas
    Par inoxxam dans le forum Électronique
    Réponses: 9
    Dernier message: 21/03/2010, 11h21
  3. problèmes lors de l'installation de programme
    Par invite884d42aa dans le forum Sécurité et malwares : désinfectez votre machine
    Réponses: 12
    Dernier message: 31/01/2010, 08h40
  4. Problèmes avec le programme CaCHe
    Par invitea9af6e39 dans le forum Chimie
    Réponses: 0
    Dernier message: 06/05/2008, 17h45
  5. Problèmes pour réaliser un système d'aspect simple
    Par inviteb4eb391c dans le forum Électronique
    Réponses: 3
    Dernier message: 25/10/2005, 19h58