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 :

Tracer rectangles dans un shell


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de jbarreau-mainson
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    446
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 446
    Par défaut Tracer rectangles dans un shell
    Bonjour à tous, j'essaie de faire un petit programme qui qui dessine un rectangle à l'ecran. Rien de compliquer en soit, mais là je m'arrache les cheveux !!!

    Voici mon code :

    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
    51
    52
    #include <stdio.h>
    #include <stdlib.h>
    //#include "rect.h"
     
    #define LONGUEUR c.x-a.x-2
    #define HAUTEUR c.y-a.y-2
     
    /* Structure "Point" regroupant abcisse et ordonnée d'un point.
    Ici, deux points nommés 'a' et 'c' seront traités. */
        struct Point {
            int x;
            int y;
        } a, c;
     
    int main()
    {
        int i, j;
     
        //Saisie de l'abcisse et de l'ordonnée pour le point A
        do {
        puts("Veuillez saisir l'abcisse et l'ordonnee du point A : ");
        scanf("%d %d", &a.x,&a.y);
        }
        while ( a.x < 1 || a.x >= 80 || a.y < -80 || a.y >= 80 );
     
        //Saisie de l'abcisse et de l'ordonnée pour le point C                                                                                                                                                                                                                                                                                                                                                                  Qui a volé l'orange du marchand ? oO
        do {
        puts("Veuillez saisir l'abcisse et l'ordonnee du point C : ");
        scanf("%d %d", &c.x,&c.y);
        }
        while ( c.x < 1 || c.x >= 80 || c.y < -80 || c.y >= 80 );
     
        //Vérification de la saisie et affichage Utilisateur
        puts("Les coordonnees que vous avez entre sont les suivantes :");
        printf("Point A : %d,%d\nPoint C : %d,%d\n", a.x,a.y,c.x,c.y);
     
        system("pause");
        system("cls");
     
        for ( j = a.y ; j < HAUTEUR ; j++ ){
            for ( i = 1 ; i < a.x ; i++ ){
                puts(" ");
            }
            puts("|");
            for ( i = a.x ; i < LONGUEUR ; i++ ){
                    puts("_");
            }
            puts("|\n");
        }
     
    	return 0;
    }
    Mais ca me met tout sur la même colonne, je ne comprend pas pourquoi

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour.

    puts ajoute une fin de ligne quand il écrit.

    Citation Envoyé par http://man.developpez.com/man3/puts.3.php
    puts() écrit la chaîne de caractères s et un retour-chariot final sur stdout.
    il est possible de remplacer puts par printf (un peu lourd) ou par putchar (dans ce cas, attention, on n'écrit plus des chaines de caractères, mais des caractères seuls).

    Autre chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #define HAUTEUR c.y-a.y-2
    /*...*/
    for (j = a.y; j < HAUTEUR; j++) {
    C'est un peu dommage de calculer la condition de fin de boucle à chaque passage. On peut aussi bien écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define HAUTEUR c.y-a.y-2
    /*...*/
    int hauteur = HAUTEUR;
    for (j = a.y; j < hauteur; j++) {
    Dans l'exemple présent, le gain est faible, mais il peut devenir conséquent si le nombre d'éléments à traiter dans la boucle devient important ou si la règle de calcul de fin de sortie de boucle est longue à calculer.

  3. #3
    Membre chevronné Avatar de jbarreau-mainson
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    446
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 446
    Par défaut
    Merci pour ces explications, mais ca ne donne toujorus pas ce que je veux, j'ai l'impression que il y a un problème lors du calcul de LONGUEUR et HAUTEUR, par exemple si l'abcisse ou l'ordonnée de mon point C est inférieur à celles de mon point A le resultat de LONGUEUR et HAUTEUR est négatif et je n'ai rien d'affiché...

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par jbarreau-mainson Voir le message
    mais ça ne donne toujours pas ce que je veux
    Quel est le résultat attendu exactement ?

    Voici ce que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Veuillez saisir l'abcisse et l'ordonnee du point A :
    3 3
    Veuillez saisir l'abcisse et l'ordonnee du point C :
    20 15
    Les coordonnees que vous avez entre sont les suivantes :
    Point A : 3,3
    Point C : 20,15
      |____________|
      |____________|
      |____________|
      |____________|
      |____________|
      |____________|
      |____________|
    par exemple si l'abcisse ou l'ordonnée de mon point C est inférieur à celles de mon point A le resultat de LONGUEUR et HAUTEUR est négatif et je n'ai rien d'affiché...
    Pour résoudre ce problème, il faudrait raisonner en terme de départ et d'arrivée : départ.x = min(a.x, b.x) ...

  5. #5
    Membre chevronné Avatar de jbarreau-mainson
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    446
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 446
    Par défaut
    j'attends quelquechose de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       ____________
      |            |
      |            |
      |            |
      |            |
      |            |
      |____________|
    Pour résoudre ce problème, il faudrait raisonner en terme de départ et d'arrivée : départ.x = min(a.x, b.x) ...
    Je ne connais pas cette fonction ? et donc son utilisation

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par jbarreau-mainson Voir le message
    j'attends quelquechose de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       ____________
      |            |
      |            |
      |            |
      |            |
      |            |
      |____________|
    Ok, l'algorithme de tracé est un peu à revoir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Voilà ce que j'écrirai :
    pour chaque ligne (y)
       pour chaque colonne (x)
          si (x,y) est sur un côté horizontal
             écrire '_'
          sinon si (x,y) est sur un côté vertical
             écrire '|'
          sinon 
             écrire ' '
       fin
       écrire '\n'
    fin
    Citation Envoyé par jbarreau-mainson Voir le message
    Je ne connais pas cette fonction ? et donc son utilisation
    Hum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int min(int a, int b)
    {
        if(a < b) 
            return a;
        else
            return b;
    }

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par jbarreau-mainson Voir le message
    Bonjour à tous, j'essaie de faire un petit programme qui qui dessine un rectangle à l'ecran. Rien de compliquer en soit, mais là je m'arrache les cheveux !!!
    <...>
    Mais ca me met tout sur la même colonne, je ne comprend pas pourquoi
    Ton algo de traçage est faux. Je te conseille de dessiner un rectangle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       --------
      |        |
      |        |
      |        |
       --------
    et ensuite de te demander comment le tracer ligne à ligne.

    Il est clair que le traitement n'est pas le même pour toutes les lignes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    /* premiere et derniere ligne */
    if (ligne == 0 || ligne == nb_ligne - 1)
    {
    /* --- */
    }
    else
    {
    /* |    | */
    }
    Ensuite, je rappelle que puts(chaine) met un \n après chaque chaine. Tu dois confondre avec putchar(caractère).

    Il faut se doter d'outils de mesure qui permettent de vérifier les résultats, tester les cas limites...

    Dans le contrôles de saisie, il manque "c.x > a.x et cy > a.y" (sinon, on ne peut rien tracer). Il faut aussi traiter le cas des petits rectangles (x ou y = 1 ou 2). Pour qu'un rectangle, tel que décrit au-dessus, soit traçable, il doit faire minimum 3x3...

    Correction
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
     
    #include <stdio.h>
    #include <stdlib.h>
     
    /* 0=normal 1=debug */
    #define DBG 1
     
    /* Structure "Point" regroupant abcisse et ordonnée d'un point.
    Ici, deux points nommés 'a' et 'c' seront traités. */
    struct Point
    {
       int x;
       int y;
    };
     
    int main (void)
    {
    #if DBG
       struct Point a = { 1, 1 };
       struct Point c = { 79, 24 };
    #else
     
       struct Point a = { 0 };
       struct Point c = { 0 };
     
    /* Saisie de l'abcisse et de l'ordonnée pour le point A */
       do
       {
          puts ("Veuillez saisir l'abcisse et l'ordonnee du point A : ");
          scanf ("%d %d", &a.x, &a.y);
       }
       while (a.x < 1 || a.x >= 80 || a.y < 1 || a.y >= 80);
     
    /* Saisie de l'abcisse et de l'ordonnée pour le point */
       do
       {
          puts ("Veuillez saisir l'abcisse et l'ordonnee du point C : ");
          scanf ("%d %d", &c.x, &c.y);
       }
       while (c.x < 1 || c.x >= 80 || c.y < 1 || c.y >= 80);
     
    /* Vérification de la saisie et affichage Utilisateur */
    #endif
     
       puts ("Les coordonnees que vous avez entre sont les suivantes :");
       printf ("Point A : %d,%d\nPoint C : %d,%d\n", a.x, a.y, c.x, c.y);
     
    #if DBG
    /* afficher x verticalement */
       {
          int i;
          for (i = 1; i <= 80; i++)
          {
             putchar (i / 10 == 0 ? ' ' : '0' + i / 10);
          }
          for (i = 1; i <= 80; i++)
          {
             putchar ('0' + i % 10);
          }
       }
    #endif
     
       {
          int j;
     
          /* se positionner à la bonne ligne */
          for (j = 1; j < a.y; j++)
          {
    #if DBG
             putchar ('0' + j % 10);
    #else
             putchar (' ');
    #endif
             putchar ('\n');
          }
          for (j = a.y; j <= c.y; j++)
          {
             /* se positionner à la bonne colonne */
             int i;
             for (i = 1; i < a.x; i++)
             {
                if (i == 1)
                {
    #if DBG
                   putchar ('0' + j % 10);
    #else
                   putchar (' ');
    #endif
                }
                else
                {
                   putchar (' ');
                }
             }
             if (j == a.y || j == c.y)
             {
                putchar (' ');
                for (i = a.x; i <= (c.x - 2); i++)
                {
                   putchar ('-');
                }
             }
             else
             {
                putchar ('|');
                for (i = 0; i < c.x - a.x - 1; i++)
                {
                   putchar (' ');
                }
                putchar ('|');
             }
             putchar ('\n');
          }
       }
     
       return 0;
    }

    Par exemple (j'ai changé les coordonnées)
    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
     
    Les coordonnees que vous avez entre sont les suivantes :
    Point A : 5,3
    Point C : 8,7
             11111111112222222222333333333344444444445555555555666666666677777777778
    12345678901234567890123456789012345678901234567890123456789012345678901234567890
    1
    2
    3    --
    4   |  |
    5   |  |
    6   |  |
    7    --
     
    Process returned 0 (0x0)   execution time : 0.041 s
    Press any key to continue.

  8. #8
    Membre chevronné Avatar de jbarreau-mainson
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    446
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 446
    Par défaut
    Merci pour vos conseils, j'ai modifié mon code comme suit :

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    #include <stdio.h>
    #include <stdlib.h>
    #include "rect.h"
     
    #define LONGUEUR c.x-a.x-2
    #define HAUTEUR c.y-a.y-2
    #define NB_LIGNE c.y-a.y
     
     
    /* Structure "Point" regroupant abcisse et ordonnée d'un point.
    Ici, deux points nommés 'a' et 'c' seront traités. */
        struct Point {
            int x;
            int y;
        } a, c;
     
    int main()
    {
        int ligne = 0;
        int nb_ligne = NB_LIGNE;
        int hauteur = HAUTEUR;
        int longueur = LONGUEUR;
        int i, j;
     
        //Saisie de l'abcisse et de l'ordonnée pour le point A
        do {
        puts("Veuillez saisir l'abcisse et l'ordonnee du point A : ");
        scanf("%d %d", &a.x,&a.y);
        }
        while ( a.x < 1 || a.x >= 80 || a.y < -80 || a.y >= 80 );
     
        //Saisie de l'abcisse et de l'ordonnée pour le point C                                                                                                                                                                                                                                                                                                                                                                  Qui a volé l'orange du marchand ? oO
        do {
        puts("Veuillez saisir l'abcisse et l'ordonnee du point C : ");
        scanf("%d %d", &c.x,&c.y);
        }
        while ( c.x < 1 || c.x >= 80 || c.y < -80 || c.y >= 80 );
     
        //Vérification de la saisie et affichage Utilisateur
        puts("Les coordonnees que vous avez entre sont les suivantes :");
        printf("Point A : %d,%d\nPoint C : %d,%d\n", a.x,a.y,c.x,c.y);
     
        if (ligne == 0 || ligne == nb_ligne - 1){
            for ( i = 1 ; i < a.x ; i++ ){
                printf(" ");
            }
            for ( i = a.x+1 ; i < longueur ; i++ ){
                printf("-");
            }
            ligne++;
        }
        else {
            for ( i = 1 ; i < a.x ; i++ ){
                printf(" ");
            }
            printf("|");
            for ( i = a.x+1 ; i < longueur ; i++ ){
                printf("-");
            }
            printf("|");
        }
     
    	return 0;
    }
    Mais aucun "dessin" après saisit des coordonnées, cela vient de chez moi ou bien ca n'affiche rien chez vous non plus ?

    Sinon pas mal l'idee de Min

  9. #9
    Invité(e)
    Invité(e)
    Par défaut
    Il manque des boucles for dans le code.

    "ligne" est reste désespérément à 0.

    Je pense qu'il manque aussi une variable "colonne" (pour une seconde boucle for).

  10. #10
    Membre chevronné Avatar de jbarreau-mainson
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    446
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 446
    Par défaut
    Merci à vous deux pour le coup de main.
    Je met résolu

  11. #11
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Par défaut
    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
     
     
    void rectangle(int longueur, int largeur)
     {
       int i,j;
    printf("\n");
    //on dessine la premiere ligne
       for (i=1; i<=longueur; i++)
         printf("-");
       printf("\n");
     
    //on dessine les deux largeurs
      for (j=1; j<=largeur; j++)
       {
         printf("|");
         for (i=1; i<=largeur-2; i++)
          printf(" ");
         printf("|\n");
       }
     
    //enfin la derniere longueur
     for (i=1; i<=longueur; i++)
       printf("-");
    printf("\n");
     }
    j' ai codé rapidement une fonction qui dessine un rectangle. je ne l' ai pas essayé mais ça doit marcher.

  12. #12
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Leo,

    C'est amusant que tant de gentils membres fassent carrément l'exercice du PO, alors qu'il s'agit visiblement d'un exercice scolaire (vu et revu x fois).


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

Discussions similaires

  1. Tracer un rectangle dans une image callback
    Par valgoku dans le forum OpenCV
    Réponses: 0
    Dernier message: 30/01/2012, 10h36
  2. Tracer un rectangle dans une console
    Par sheva007 dans le forum C
    Réponses: 6
    Dernier message: 28/04/2007, 10h24
  3. [MFC]dessiner un rectangle dans ma fenetre
    Par jiraya43 dans le forum MFC
    Réponses: 13
    Dernier message: 15/05/2006, 13h57
  4. Demander un mot de passe dans un shell
    Par tsharlz dans le forum Linux
    Réponses: 1
    Dernier message: 10/05/2006, 15h12
  5. Réponses: 3
    Dernier message: 26/09/2005, 10h41

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