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 :

Problème d'affichage en console


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 126
    Points : 66
    Points
    66
    Par défaut Problème d'affichage en console
    Salut !
    Ce matin, je me suis lancé dans un petit exo sans chercher les optimisations de code (il y en a à faire ) et là je me suis retrouvé avec une méga erreur d'affichage que je n'arrive pas à résoudre. Voici le code source :
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #include <iostream>
    #include <iomanip>
    #include <ctime>
    using namespace std;
     
    void brasse(int [][13]);
    void distribue(const int [][13], const char *[], const char *[]);
     
    int main() {
    	const char *couleur[] = { "Carreau", "Coeur", "Pique", "Trèfle" };
    	const char *face[]    = { "As", "Deux", "Trois", "Quatre", "Cinq", "Six", "Sept", "Huit", "Neuf", "Dix", "Valet", "Dame", "Roi" };
    	int jeu[4][13] = {0};
     
    	srand(time ( 0 ));
     
    	brasse(jeu);
    	distribue(jeu, face, couleur);
     
    	cout << endl;
    	return 0;
    }
     
    void brasse(int wJeu[][13]) {
    	int ligne,
    		colonne;
     
    	for(int carte=1; carte<=52; ++carte) {
    		do {
    		ligne = rand() % 4;
    		colonne = rand() % 13;
    		}
    		while(wJeu[ ligne ][ colonne ] != 0);
     
    		wJeu[ ligne ][ colonne ] = carte;
    	}
    }
     
    void distribue(const int wJeu[][13], const char *wFaces[], const char *wCouleurs[]) {
    	for(int carte=1; carte <=52; ++carte) {
    		for(int ligne=0; ligne<3; ++ligne) {
    			for(int colonne=0; colonne<13; ++colonne) {
    				if(wJeu[ligne][colonne] == carte) {
    					cout << setw(6) << setiosflags(ios::left) << wFaces[colonne] << " de "
    						 << setw(7) << setiosflags(ios::left) << wCouleurs[ligne]
    						 << (carte % 2 == 0 ? '\n': '\t');
    				}
    			}
    		}
    	}
    }
    Voici la sortie en console :
    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
    ./mddc
    Quatre de Coeur         Cinq   de Carreau
    Trois  de Pique         Sept   de Pique
    As     de Pique         As     de Coeur         Neuf   de Pique         Dame   de Coeur
    Roi    de Coeur         Roi    de Carreau
    Six    de Coeur         Sept   de Coeur
    Dame   de Carreau       Dame   de Pique         Huit   de Carreau
    Cinq   de Coeur         Deux   de Carreau
    Six    de Pique         Trois  de Coeur
    Dix    de Carreau       Huit   de Pique
    Dix    de Coeur
    Valet  de Pique         Deux   de Coeur
    Six    de Carreau       Huit   de Coeur         Deux   de Pique
    Cinq   de Pique         Valet  de Coeur
    Valet  de Carreau       Sept   de Carreau
    Quatre de Pique         Trois  de Carreau
    Quatre de Carreau       Neuf   de Carreau       As     de Carreau       Neuf   de Coeur
    Dix    de Pique         Roi    de Pique
    Je ne comprends absolument pas d'où vient l'erreur

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    quelle erreur ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 126
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par ram_0000 Voir le message
    quelle erreur ?
    Normalement mon programme devrait afficher les résultats sur 2 colonnes alors que sur ce que j'ai donné c'est sur 3 colonnes voir des fois sur 4 ou encore sur 1 colonne et c'est ça qui me gène. Normalement ça ne devrait pas le faire
    Voici un autre lancé :
    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
    ./mddc
    Six    de Pique         Huit   de Coeur
    Six    de Carreau       Deux   de Carreau
    Dame   de Pique         Cinq   de Carreau
    Valet  de Coeur         Deux   de Coeur
    Neuf   de Carreau       Roi    de Carreau
    Neuf   de Coeur         Dix    de Coeur
    Sept   de Pique
    Cinq   de Pique         Roi    de Coeur         Roi    de Pique
    Dame   de Carreau       As     de Coeur
    Quatre de Pique         Dix    de Carreau
    Huit   de Carreau       As     de Carreau
    Sept   de Carreau       Huit   de Pique
    As     de Pique         Deux   de Pique
    Dix    de Pique         Dame   de Coeur
    Cinq   de Coeur         Trois  de Pique         Neuf   de Pique         Sept   de Coeur         Trois  de Carreau
    Valet  de Carreau
    Six    de Coeur         Trois  de Coeur
    Quatre de Coeur         Quatre de Carreau
    Valet  de Pique
    [edit]Mes options de compilations sont les suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -Wall -W -pedantic -ansi mddc.cpp -o mddc

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    J'avais anticipé l'erreur
    Mais j'en voie une autre, c'est que toutes les cartes ne sont pas distribuées (ou affichées)

    Si je compte dans ton dernier exemple, c'est 37 cartes (sauf erreur) qui sont affichées sur les 52.

    Ton erreur d'affichage vient de là, la carte manquantes sont peut être justement les cartes paires ce qui fait que le saut de ligne n'est pas affiché.

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    OK, j'ai trouvé l'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void distribue(const int wJeu[][13], const char *wFaces[], const char *wCouleurs[])
    {
    	for(int carte=1; carte <=52; ++carte)
    	{
    		for(int ligne=0; ligne<3; ++ligne)
    		{
    ...
    il faut remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    		for(int ligne=0; ligne<3; ++ligne)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    		for(int ligne=0; ligne<4; ++ligne)

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 126
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par ram_0000 Voir le message
    J'avais anticipé l'erreur
    Mais j'en voie une autre, c'est que toutes les cartes ne sont pas distribuées (ou affichées)

    Si je compte dans ton dernier exemple, c'est 37 cartes (sauf erreur) qui sont affichées sur les 52.

    Ton erreur d'affichage vient de là, la carte manquantes sont peut être justement les cartes paires ce qui fait que le saut de ligne n'est pas affiché.
    Hummmm, c'est vrai que je n'ai pas compté les cartes. Hontes à moi. Je vais regarder ça de plus près

    [edit] J'ai trouvé l'erreur. C'est juste une bonne grosse faute de frappe et elle est ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(int ligne=0; ligne<3; ++ligne) {
    Il faut remplacer le 3 pour un 4 et tout va beaucoup mieux
    Merci bien pour l'aide

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    Maintenant quelques commentaires sur l'algorithme
    Dans la fonction de mélange des cartes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	for(int carte=1; carte<=52; ++carte)
    	{
    		do
    		{
    		ligne = rand() % 4;
    		colonne = rand() % 13;
    		}
    		while(wJeu[ ligne ][ colonne ] != 0);
     
    		wJeu[ ligne ][ colonne ] = carte;
    	}
    Tu tires 2 nombre aléatoires lignes et colonne tant que wJeu[ligne][colonne] <> 0

    Je comprends ce que tu fais mais si tu n'as pas de chance, la durée du mélange peut être très longue (et même infinie) car sur les dernières cartes, il y a de fortes chances que ce test soit vrai

    Rajoute un compteur pour voir le nombre d'échecs et affiche le

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 126
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par ChipsterJulien Voir le message
    Hummmm, c'est vrai que je n'ai pas compté les cartes. Hontes à moi. Je vais regarder ça de plus près

    [edit] J'ai trouvé l'erreur. C'est juste une bonne grosse faute de frappe et elle est ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(int ligne=0; ligne<3; ++ligne) {
    Il faut remplacer le 3 pour un 4 et tout va beaucoup mieux
    Merci bien pour l'aide
    [edit bis] erf grilled
    Merci bien

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 126
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par ram_0000 Voir le message
    Maintenant quelques commentaires sur l'algorithme
    Dans la fonction de mélange des cartes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	for(int carte=1; carte<=52; ++carte)
    	{
    		do
    		{
    		ligne = rand() % 4;
    		colonne = rand() % 13;
    		}
    		while(wJeu[ ligne ][ colonne ] != 0);
     
    		wJeu[ ligne ][ colonne ] = carte;
    	}
    Tu tires 2 nombre aléatoires lignes et colonne tant que wJeu[ligne][colonne] <> 0

    Je comprends ce que tu fais mais si tu n'as pas de chance, la durée du mélange peut être très longue (et même infinie) car sur les dernières cartes, il y a de fortes chances que ce test soit vrai

    Rajoute un compteur pour voir le nombre d'échecs et affiche le
    Je vais amélioré l'algo un peu partout car en effet il y a beaucoup de temps qui est perdu inutilement tant dans la partie brassage de carte que dans la partie distribution où même après avoir trouvé la bonne carte je continue

    thx

  10. #10
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    Un autre commentaire sur la fonction distribue (que j'ai remise en forme)
    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
     
    for(int carte=1; carte <=52; ++carte)
    {
       for(int ligne=0; ligne<4; ++ligne)
       {
          for(int colonne=0; colonne<13; ++colonne)
          {
             if(wJeu[ligne][colonne] == carte)
             {
                cout << setw(6) << setiosflags(ios::left) << wFaces[colonne] << " de "
                   << setw(7) << setiosflags(ios::left) << wCouleurs[ligne]
                   << (carte % 2 == 0 ? '\n': '\t');
             }
          }
       }
    }
    Lorsque tu affiches une carte (dans le cout), tu peux quitter immédiatement les 2 boucles "for(int colonne..." et "for(int ligne..." car c'est sûr que tu ne trouveras plus de carte qui satisfait le test. Il n'y en a qu'une seule et elle est déjà trouvée.

    La structure de ton code n'est pas adaptée pour ce "double quitte", il va falloir y retoucher.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'affichage de console
    Par l_achraf dans le forum Windows Forms
    Réponses: 1
    Dernier message: 12/01/2009, 18h40
  2. Problème d'affichage de console
    Par bob981 dans le forum Débuter
    Réponses: 0
    Dernier message: 07/05/2008, 00h41
  3. Eclipse problème d'affichage dans la console
    Par barako dans le forum Eclipse C & C++
    Réponses: 1
    Dernier message: 08/07/2007, 17h07
  4. J'ai un problème d'affichage console lors
    Par yvon_huynh dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 22/05/2006, 14h46
  5. [C] Problèmes affichage application console
    Par Arnaud Giuliani dans le forum MFC
    Réponses: 3
    Dernier message: 19/10/2005, 10h28

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