Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme avec la POO

exercice d'entrainement, que pensez vous de mon travail ?

    8 juillet 2007 à 1:31:43

    Voila j'aimerais réussir à faire ceci pour m'entrainer et approfondir mes connaissances de la POO:

    "Nous verrons ici comment résoudre un problème de gestion à l'aide de la POO. cas: gestion des températures de différentes villes et statistiques. Pour chaque ville et chaque mois de l'année, on disposera de la température moyenne observée. L'application nous permettra d'effectuer la saisie des températures des différentes villes, elle nous affichera ensuite: la ville la plus froide , la ville la plus chaude, la ville qui subit l'amplitude la plus forte chaque affichage sera constitué du nom de la ville et du chiffre demandé exprimé en degrès (celsius). On propose la liste de classe suivante: ville région application"

    Ainsi j'ai réfléchi à la manière de procédé et ca donnerait ceci: Qu'en pensez vous ? Est ce correcte ? Est ce que ca correspond à l'énnoncé ?

    la class region aurait juste un attribut: un string nom et un constructeur pour initialiser le nom (tout deux étant public.)

    la class ville aurait plusieurs attribut : un string nom, un double tableautemperature, et un element de type region pour faire le lien avec la class région, bien sur un constructeur initialiserait ces variables (la aussi tout serait en public)

    la class application (qui servirait pour la saisie et l'affichage): aurait un attribut de type ville ( qui appellerait le constructeur de ville) elle aurait aussi une méthode pour la saisie d'une ville et un constructeur.

    Ce qui pourrait donner ceci:

    #include<iostream>
    #include<string>

    using namespace std;

    class region
    {
    public:

    string nom_region;
    region(string name_region);
    };

    region::region(string name_region)
    {
    nom_region=name_region;
    }

    class ville
    {
    public;
    string nom_ville;
    double tabtemperature[12];
    region *m_region;

    ville(string name_ville, double tableau_temperature[12], string region_name);

    };

    ville::ville(string name_ville, double tableau_temperature[12], string region_name)
    {
    nom_ville=name_ville;
    tabtemperature[12]=tableau_temperature[12];

    m_region=new region(region_name);

    }

    class application
    {
    public:

    ville *m_ville;

    application();
    void saisir();

    };

    application::application()
    {
    }

    void application::saisir()
    {
    system("cls");

    string ville_name;
    string regionname;
    double temperature[12];

    string tabmois[12];

    tabmois[0]="janvier";
    tabmois[1]="février";
    tabmois[2]="mars";
    tabmois[3]="avril";
    tabmois[4]="mai";
    tabmois[5]="juin";
    tabmois[6]="juillet";
    tabmois[7]="aout";
    tabmois[8]="septembre";
    tabmois[9]="octobre";
    tabmois[10]="novembre";
    tabmois[11]="decembre";

    cout<<"nom de la ville:"<<endl;
    cin>>ville_name;
    cout<<"region de la ville:"<<endl;
    cin>>regionname;
    for(long tour=0; tour<12; tour++)
    {
    cout<<"mois : "<<tabmois[tour]<<endl;
    cout<<"temperature moyenne observée:"<<endl;
    cin>>temperature[tour];
    }

    m_ville=new ville(ville_name, temperature[12], regionname);

    system("pause");
    }

    int main (void)
    {
    application appli1;

    appli1.saisir();

    return(0);

    }

     
    • Partager sur Facebook
    • Partager sur Twitter
      8 juillet 2007 à 1:43:34

      Je crois premièrement qu'une ville fait partie d'une régions, donc la classe régions, selon-moi, contiendrait des villes. De plus, la classe application ne devrait pas contenir des entrées et des sorties de flux, mais devrais plutôt être en mesure de retournée le nom de la ville la plus chaude, ou de la plus froide, sans pour autant l'écrire a l'écran. ( tu ne devrais pas normalement faire de cout dans une classe habituellement )

      EDIT #1: (Explication supplémentaire) Comme tu t'en rendras peut-être compte, ta classe régions pour l'instant ne contient qu'une string, alors, pourquoi faire une classe qui ne contiendrais qu'une chaine de caractère si une simple variable normal aurait facilement pu faire le travail....

      EDIT #2: (encore :P) De plus, si tu veux bien suivre les concepts de l'encapsulation, tu devrais toujours déclarer tes attributs de classe comme étant private, de cette manière tu empêches les utilisateurs de la classe de modifier l'état de l'objet pour le rendre invalide. Je te conseillerais donc vivement de permettre la modification des attributs de tes classe seulement via des accesseurs et des mutateurs, qui eux, validerons la validité des modifications faites sur l'objet.

      J'aimerais tout de même te dire que si c'est ton premier programme orienté objet, c'est tout de même bien fait, la pratique reste cependant ta meilleur amie :)
      • Partager sur Facebook
      • Partager sur Twitter
        8 juillet 2007 à 12:01:16

        Bonjour voila ce qu'ai fait:
        Fichier.h:

        #include<iostream>
        #include<string>

        using namespace std;

        class region
        {
              private:
              string region2;
              string ville2;
             
              public:
                     region(string region_name,string ville_name);
                     string affnom_region();
                     string affnom_ville();
                     
                       
        };

        class ville
        {
              private:
                      region *m_region;
                      double temperature[12];
                      //string nom_ville;//en mysql ce serait une clef étrangère pour relier
                      //les tables villes et régions entre elles
                     
                     
                      public:
                      ville(string name_region,string name_ville,double tabtemperature[12]);
                      string affname_region();
                     
                           
        };
         

        Fichier.cpp:

        #include<iostream>
        #include<string>

        #include "gestion.h"

        using namespace std;

        region::region(string region_name, string ville_name)
        {
            region2= region_name;
            ville2=ville_name;                 
                             
        }

        string region::affnom_region()
        {
               return region2;
        }

        string region::affnom_ville()
        {
               return ville2;
        }

        ville::ville(string name_region, string name_ville, double tabtemperature[12] )
        {
             temperature[12]= tabtemperature[12];
             
             m_region=new region(name_region,name_ville);             
                           
        }

        string ville::affname_region()
        {
               return m_region.affnom_region();//erreur je ne peut accéder à cette méthode pourquoi ?
               //la nous sommes dans ville et nous voulons accéder à une méthode de la class region
        }


         


        Enfin le main.cpp:

        #include <cstdlib>
        #include <iostream>

        #include "gestion.h"

        using namespace std;

        int main(int argc, char *argv[])
        {
            double tabtp[12];
            for(long tour=0;tour<12;tour++)
            {
                     cout<<"temperature :"<<endl;
                     cin>>tabtp[tour];
            }
           
            string regiona="PACA";
            string villea="Marseille";
           
            ville ville1(regiona,villea,tabtp[12]);
         
            cout<<endl;
            cout<<"nom de la region : "<<ville1.affnom_region()<<endl;
           
            system("PAUSE");
            return EXIT_SUCCESS;
        }
         


        Mais je n'arrive pas à partir de la class ville a afficher les info contenus dans la class region comment faire ? Suis je obliger de passer par de l'héritage?


        • Partager sur Facebook
        • Partager sur Twitter
          9 juillet 2007 à 4:33:56

          Citation : broots05

          Mais je n'arrive pas a partir de la class ville a afficher les info contenus dans la class region comment faire ? Suis je obliger de passer par de l'héritage?



          m_regions est un pointeur, donc, si tu veux accéder au fonction de cette classe, tu dois y accéder soit par déréférenciation
          (*m_region).affnom_region() 


          ou bien avec l'opérateur -­>, donc
          m_region-­>affnom_region()


          ensuite, je crois toujours que ton programme est mal structuré, mais bien sur, ce n'est qu'un point de vu personnel ( toute personne en désaccord avec moi aura probablement tord cependant hahaha (blague) :p )

          Voila ma vision du problème:

          Une région contient des villes.Donc la classe région, devrais contenir un tableau (dynamique si possible) de ville.

          Une ville devrait donc être créé a partir de la classe région (certainement via une fonction ajouter ville)

          la classe application(puisqu'elle est requise) devrait pouvoir recevoir supposons une région, et via divers fonction, accéder au tableau de ville des régions, et trouver celle qui a la température la plus basse supposons.

          Rien ne t'oblige a fonctionner de cette manière, mais je suis très ouvert a tes suggestions, et a tes opinions sur se que je viens de formuler.

          J'espère que j'ai pu t'aider
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            9 juillet 2007 à 13:16:45

            Déjà le principe de l'encapsulation dit qu'il faut pas que les utilisitateurs de ta classe puissent modifié ce qu'il y a dedans sans que tu puisse appliqué un contrôle dessus.
            Donc déjà tout les attributs public il faut les mettres soit en private ou protected, pour que les utilisateur puissent accéder a ces donné tu créés une nouvelle méthode qui s'appelle getAttribut () (attribut étant le nom de ton attribut) qui retourne ton attribut.
            Et puis pour le changer bien sur un setAttribut ( type attribut)
            Bon ca c'est juste comme ca.

            Aprés je rejoins apollon1234 sur le fait qu'il faut un conteneur de ville dans la class région.
            Aprés la classe application elle sert a rien de mon point de vue.
            Pour faire les calcules tu peux parcourir le conteneur et puis appeller une méthode qui donne la température aprés tu fais ce que tu veux avec les resultat.
            Tu fais une méthode pour ajouté des villes et puis en enlever.

            Voila j'espère d'avoir aider et être compréhancible. :p
            • Partager sur Facebook
            • Partager sur Twitter
              9 juillet 2007 à 14:09:05

              Oui ta région c'est un ensemble de villes alors tu peux les conserver dans un tableau dynamique : STL vector ce n'est pas très difficile à faire, tu peux rechercher sur le site ou sur la FAQ C++ developpez.com

              Ensuite repense à tes noms de variables, si c'est pour l'école mon prof m'aurait recallé pour lui sortir des noms comme ça.
              classe Region
              {
                 string m_nom;
                 vector<Ville> m_villes;
                 //...
               


              Perso j'aime bien les noms de type/Classe avec la première lettre en majuscule et les attibuts commençant avec un préfixe "m_" pour Membre de la classe.

              Tu ajoutes des fonctions pour ajouter une ville, la supprimer, la modifier de plus pour connaitre le nombre de villes et en lire une (copie).

              La classe application ne me semble pas nécessaire, j'aurais plus créer un classe de statistiques...

              Ce n'est pas nécessaire d'avoir un pointeur sur une ville dans la classe application car la classe région ne devrait te retourner que des copies de ses villes.

              les concepts sont selon moi :
              Une région a un nom
              Une région a des villes

              Une ville a un nom
              Une ville a des températures dans le temps
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                11 juillet 2007 à 0:53:20

                Citation : MatteX


                Ensuite repense à tes noms de variables, si c'est pour l'école mon prof m'aurait recallé pour lui sortir des noms comme ça.

                Perso j'aime bien les noms de type/Classe avec la première lettre en majuscule et les attibuts commençant avec un préfixe "m_" pour Membre de la classe.



                Tiens tiens ca me rappel des choses.
                Sauf que nous c'est Tel Telle Tels pour les paramètres formels, Son Sa Ses pour les champs des structures , Ma Mon Mes attributs de classe, le la les pour les variables.
                Alors nous pour le faire chier on faisait Ma_variable_qui_sert_a_rien_du_tout ^^ ou des trucs resemblant.
                • Partager sur Facebook
                • Partager sur Twitter
                  11 juillet 2007 à 16:42:21

                  Citation : angelsafrania

                  Citation : MatteX


                  Ensuite repense à tes noms de variables, si c'est pour l'école mon prof m'aurait recallé pour lui sortir des noms comme ça.

                  Perso j'aime bien les noms de type/Classe avec la première lettre en majuscule et les attibuts commençant avec un préfixe "m_" pour Membre de la classe.



                  Tiens tiens ca me rappel des choses.
                  Sauf que nous c'est Tel Telle Tels pour les paramètres formels, Son Sa Ses pour les champs des structures , Ma Mon Mes attributs de classe, le la les pour les variables.
                  Alors nous pour le faire chier on faisait Ma_variable_qui_sert_a_rien_du_tout ^^ ou des trucs resemblant.



                  Ce qui se fait beaucoup, c'est effectivement de faire commencer les nom de classe par une majuscule, une autre pratique et de les faire commencer par un C ou un S majuscule, selon qu'il s'agit d'une classe ou bien d'une structure:


                  class CVille // La déclaration de la classe
                  {
                  };

                  CVille Ville; // Une instance de la classe

                   


                  Ensuite pour composer les noms des variables, on peut utiliser un préfixe, certains trouvent que les préfixes rendent le code moins lisible, d'autre trouvent que c'est le contraire (ça dépend vraiment des gouts).

                  Pour une variable globale on utilisera le préfixe g_, pour une variable static s_, pour un attribut de structure ou de classe m_. De cette manière un simple coup d'oeil au nom de la variable renseigne sur sa portée.

                  Ensuite, on peut ajouter un second préfixe juste après le préfixe de portée, qui va servir à donner des informations sur le type de l'objet, notamment le préfixe p pour indiquer un pointeur, et parfois d'autre préfixes quand le code pourrait être ambigu à la relecture, par exemple le wc pour distinguer un char d'un wchar_t, qui servent à la même chose mais n'ont pas la même taille, u pour indiquer qu'il s'agit d'un type non signé, f pour un type flottant, s pour un short l pour long, d pour double, ll pour un 64 bits, n pour un size_t, b pour un booléen, t pour un tableau ... Si on utilise ce type de convention on débute le nom de la variable Par une majuscule pour différentier le nom du préfixe.



                  g_Int;    // Une variable gobale de type entier
                  pcwString // Un pointeur sur une chaine de caractères unicode
                  pcString  // Un pointeur sur une chaine de caractères ansi
                  pInt      // Un pointeur sur un entier

                  ....
                   


                  C'est ce que l'on appelle une convention de nommage, il en existe d'autres. C'est surtout utile dans les gros programmes qui sont développés par des équipes. Le fait que tous les codeurs utilisent la même convention facilite la reprise d'un code par un membre de l'équipe qui n'est pas l'auteur du code en question et qui, grâce à la convention de nommage ne sera pas obligé d'aller faire des allers retours, pour vérifier ses types et les portées des objets qu'il utilise. Cela dit, il faut savoir être très souple avec ça, parce qu'il est assez rare de pouvoir choisir la convention que l'on utilise. Dans le monde professionnel, elle est la plupart du temps imposée(quand elle existe), par le commanditaire (employeur ou client) ou bien pour que le programme puisse obtenir les certifications, dont il a besoin pour pouvoir être passé en production, dans le cadre d'un processus qualité, ou de conformité à une norme quelconque.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug

                  Probleme avec la POO

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown