Aide code C++ faire un rectangle ( noob )

Aide code C++ faire un rectangle ( noob ) - C++ - Programmation

Marsh Posté le 24-05-2016 à 11:55:26    

Salut à tous,
 
Voilà tout j'apprends le C++ pendant mes cours d’hôtellerie :p après quelques jours je viens d'apprendre,avec openclassrooms et un bouquin, à faire plusieurs fonctions pour découper son programme, j'ai commencé par des calculs puis là il me demandait de comprendre ça :  
 
#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++)
        {
            cout << "*";
        }
        cout << endl;
    }
}
 
int main()
{
    int largeur, hauteur;
    cout << "Largeur du rectangle : ";
    cin >> largeur;
    cout << "Hauteur du rectangle : ";
    cin >> hauteur;
 
    dessineRectangle(largeur, hauteur);
    return 0;
}
 
 
J'ai bien compris donc je me suis donné un petit excercice, faire un rectangle pas plein puis écrire dedans ! :p puis ba ça fait 20 min que je réfléchis et je suis en galère ! Quelqu'un pour m'aider ?
 
Merci d'avance,
Louis

Reply

Marsh Posté le 24-05-2016 à 11:55:26   

Reply

Marsh Posté le 24-05-2016 à 12:55:12    

Placer le texte dedans est largement moins trivial que dessiner un rectangle en texte :)
 
Vu que tu ne peux pas déplacer ton curseur (au moins, pas de manière standard), tu dois avoir ton code prêt pour afficher un rectangle creux
* affiche une ligne pleine,  
* affiche ligne-2 lignes creuses (affiche une étoile puis colonne-2 espaces, puis une autre étoile pour le corps)
* affiche une nouvelle ligne pleine
 
Une fois que tu en es là, tu pourras t'attaquer à mettre une chaine de caractères dans le rectangle. Pour ca, il faut que tu te prépares porbablement une fonction qui va afficher une ligne avec une étoile de chaque côté et la chaine de ton choix au milieu.


---------------
last.fm
Reply

Marsh Posté le 24-05-2016 à 13:14:11    

Merci de ta réponse ! J'ai pas compris ça : "que tu ne peux pas déplacer ton curseur (au moins, pas de manière standard)" ^^  
 
Sinon ce qu'il faut c'est créer :
 
 
************************
 
 
 
 
***********************
 
puis après créer une fonction après qui faire  
 
*                            *
*Chaîne de caractères*
*                            *
*                            *
 
Puis assembler les 2 :) ?
 
*************
*      Char     *
*************
Quant à utilisation du for (que j'ai appris comme boucle) pour mon exercice je suis septique ça te paraît bien d'utiliser for ?

Reply

Marsh Posté le 24-05-2016 à 14:22:11    

oui, c'est très bien d'utiliser for.
Tu vas devoir itérer sur tes lignes, pour ca, il te faut un for.
 
Quand tu fais ton remplissage d'espaces au sein d'une même ligne, à nouveau, il faut utiliser for.
 
Un indice pour te simplifier la mise en oeuvre :
 

*         *
*  hello  *


 
Ces deux lignes peuvent être considérées de la même manière, l'une affichant hello, l'autre affichant simplement une chaîne vide.


---------------
last.fm
Reply

Marsh Posté le 24-05-2016 à 14:29:46    

Merci pour ton aide :)

 

Oui j'ai réussi à monter un truc comme ça mais j'ai pas réussi à le monter en donnant moi même les valeurs du rectangle ( cin >> ect .. ) :)

 

J'essaye encore


Message édité par Luiser le 24-05-2016 à 14:40:22
Reply

Marsh Posté le 24-05-2016 à 14:51:21    

tu dois calculer le nombre de caractères d'un type avant d'itérer dessus.
 
Tu peux passer par une étape de ce genre :

Code :
  1. void dessineLignePleine(int l)
  2. {
  3.     for(int colonne(0); colonne < l; colonne++)
  4.     {
  5.         cout << "*";
  6.     }
  7.     cout << endl;
  8. }
  9. void dessineRectangle(int l, int h)
  10. {
  11.     for(int ligne(0); ligne < h; ligne++)
  12.     {
  13.         dessineLignePleine(l);
  14.     }
  15. }


 
Pour, ensuite, aller vers :

Code :
  1. void dessineLignePleine(int l)
  2. {
  3.     for(int colonne(0); colonne < l; colonne++)
  4.     {
  5.         cout << "*";
  6.     }
  7.     cout << endl;
  8. }
  9. void dessineLigneCreuse(int l)
  10. {
  11.   // ...
  12. }
  13. void dessineRectangle(int l, int h)
  14. {
  15.   if(h>2)
  16.   {
  17.     dessineLignePleine(l);
  18.     for(int ligne(0); ligne < h-2; ligne++)
  19.     {
  20.         dessineLigneCreuse(l);
  21.     }
  22.     dessineLignePleine(l);
  23.   }
  24.   else
  25.   {
  26.     for(int ligne(0); ligne < h; ligne++)
  27.     {
  28.         dessineLignePleine(l);
  29.     }
  30.   }
  31. }


 
Tu peux appliquer la même logique pour les colonnes que je t'ai montrée ici pour les lignes :)


---------------
last.fm
Reply

Marsh Posté le 24-05-2016 à 18:33:32    

Super Mr ! Je m'y remet ! J'essaye de faire en m'inspirant de toi je te dis si j'y suis arrivé d'ici ce soir ^^
Merci encore passes une bonne soirée
 
Louis

Reply

Marsh Posté le 24-05-2016 à 21:19:56    

Voilà après quelqueS heureS un demi cahier de brouillon utiliser :

 
Code :
  1. #include <iostream>
  2. using namespace std;
  3. void dessinerRectangleVide(int nbLigne, int nbColonne)
  4. {
  5.     cout << endl;
  6.     for(int i = 1; i <= nbLigne; i++) {
  7.         if(i == 1 || i == nbLigne) {
  8.             for(int j = 1 ; j <= nbColonne; j++) {
  9.                 cout << "*";
  10.             }
  11.         }else{
  12.             for(int j = 1; j <= 2; j++) {
  13.                 cout << "*" << string(nbColonne-1, ' ');
  14.             }
  15.         }
  16.         cout << " " << endl;
  17.     }
  18. }
  19. int main()
  20. {
  21.     int nbLignes, nbColonnes;
  22.     cout << "Combien de lignes doit faire votre rectangle?" << endl;
  23.     cin >> nbLignes;
  24.     cout << "Combien de colonnes doit faire votre rectangle?" << endl;
  25.     cin >> nbColonnes;
  26. dessinerRectangleVide(nbColonnes,nbLignes);
  27.     return 0;
  28. }
 

reste plus qu'a écrire dedans :)
Merci encore theshockwave


Message édité par Luiser le 24-05-2016 à 21:32:03
Reply

Marsh Posté le 24-05-2016 à 23:13:37    

Une variante:

Code :
  1. #include <iostream>
  2. #include <string>
  3. void dessineRectangle(int largeur, int hauteur) {
  4.     if ((largeur > 0) && (hauteur > 0)) {
  5.         const std::string lignePleine(largeur, '*');
  6.         if (largeur < 3) {
  7.             for (int i = 0; i < hauteur; ++i) {
  8.                 std::cout << lignePleine << std::endl;
  9.             }
  10.         } else {
  11.             const std::string ligneVide = "*" + std::string(largeur - 2, ' ') + "*";
  12.             std::cout << lignePleine << std::endl;
  13.             if (hauteur > 1) {
  14.                 for (int i = 0; i < (hauteur - 2); ++i) {
  15.                     std::cout << ligneVide << std::endl;
  16.                 }
  17.                 std::cout << lignePleine << std::endl;
  18.             }
  19.         }
  20.     } else {
  21.         if (largeur < 0) {
  22.             std::cerr << "Largeur négative!" << std::endl;
  23.         }
  24.         if (hauteur < 0) {
  25.             std::cerr << "Hauteur négative!" << std::endl;
  26.         }
  27.     }
  28. }
  29. int main() {
  30.     int largeur, hauteur;
  31.     std::cout << "Largeur du rectangle : ";
  32.     std::cin >> largeur;
  33.     if (!std::cin) {
  34.         std::cerr << "Largeur incorrecte!" << std::endl;
  35.         return(-1);
  36.     }
  37.     std::cout << "Hauteur du rectangle : ";
  38.     std::cin >> hauteur;
  39.     if (!std::cin) {
  40.         std::cerr << "Hauteur incorrecte!" << std::endl;
  41.         return(-1);
  42.     }
  43.     dessineRectangle(largeur, hauteur);
  44.     return 0;
  45. }


 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 24-05-2016 à 23:29:57    

Salut Merci pour ton alternative ! ça m'apprendre d'autres versions que les miennes débutantes, question j'ai pas réussi à déplacer mon texte qui s'affiche dans le rectangle avec la condition que le texte soit plus petit que le rectangle.
SOS :p si tu pouvais m'aider


Message édité par Luiser le 24-05-2016 à 23:30:12
Reply

Marsh Posté le 24-05-2016 à 23:29:57   

Reply

Marsh Posté le 25-05-2016 à 01:41:23    

Ben je comprends pas pourquoi tu veux écrire un texte dans un rectangle de taille précise, c'est pas un truc pour débutants vu qu'il y a plein de trucs pas sympas qui peuvent arriver:
Texte trop grand
Hauteur paire, donc pas autant de texte au dessus qu'en dessous, etc.
 
Bref, autant partir d'un texte, et se mettre à l'encadrer:

Code :
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <string>
  4. #include <vector>
  5. static size_t max_line_length(std::vector<std::string> lines) {
  6.     size_t max = 0;
  7.     for (auto line : lines) {
  8.         if (line.length() > max) {
  9.             max = line.length();
  10.         }
  11.     }
  12.     return max;
  13. }
  14. // padding : nombre de blancs entre la bordure et le texte
  15. // deco: caractère de décoration de la bordure
  16. void encadrerTexte(const std::vector<std::string>& texte, int padding, char deco) {
  17.     int maxlen = max_line_length(texte);
  18.     const std::string lignePleine(maxlen + (2 * padding) + 2, deco);
  19.     const std::string ligneVide = deco + std::string(maxlen + (2 * padding), ' ') + deco;
  20.     std::cout << lignePleine << std::endl;
  21.     std::cout << ligneVide << std::endl;
  22.     // on est en C++11 pour avoir droit à auto ici
  23.     for (auto ligne : texte) {
  24.         std::cout << deco << std::string(padding, ' ');
  25.         std::cout << ligne << std::string(maxlen - ligne.length(), ' ');
  26.         std::cout << std::string(padding, ' ') << deco << std::endl;
  27.     }
  28.     std::cout << ligneVide << std::endl;
  29.     std::cout << lignePleine << std::endl;
  30. }
  31. int main() {
  32.     std::vector<std::string> lignes;
  33.     std::string ligne;
  34.     std::cout << "Veuillez entrer les lignes a encadrer, terminez par une ligne vide." << std::endl;
  35.     while (std::getline(std::cin, ligne)) {
  36.         if (ligne == "" ) {
  37.             break;
  38.         }
  39.         lignes.push_back(ligne);
  40.     }
  41.     std::cout << std::endl;
  42.     encadrerTexte(lignes, 3, '*');
  43.     return 0;
  44. }


Veuillez entrer les lignes a encadrer, terminez par une ligne vide.
hello world
and more
more
and again some more text
enough!
bla bla bla
 
 
********************************
*                              *
*   hello world                *
*   and more                   *
*   more                       *
*   and again some more text   *
*   enough!                    *
*   bla bla bla                *
*                              *
********************************


 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 25-05-2016 à 08:42:06    

Ok super ! Bon pas du tout de mon niveau donc je passe pour le moment :). Je continue ma route je vous dit si j'ai besoins d'aide merci encore !  
Bonne journée gilou

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed