Accueil > Forum > > > > Exercice sur Pointeurs, classes, héritage...
Exercice sur Pointeurs, classes, héritage...
mardi 5 janvier 2010 à 20:56:27 |
Exercice sur Pointeurs, classes, héritage...

snoozriton
|
Bonjour à tous,
étant en train d'étudier le C++, j'ai quelques soucis avec un exercice.
C'est un classique dont je vous donne l'énoncé :
1. Définissez la classe Animal qui sera muni des champs age, sexe et nom.
2. Définissez les classe Chien, Chat et Lapin qui héritent de Animal ainsi
que des constructeurs pour chacune de ces classes.
3. On consid`ere un tableaux de cinq pointeurs sur la classe Animal. Faites les modifications n ́ecessaires pour proposer une fonction remplissant ce tableau `a l’aide d’informations entrées au clavier, sachant que l’utilisateur précisera si l’animal considéré est un chien, un chat ou un lapin.
4. Faites les modifications nécessaires pour proposer une fonction qui retourne l’age moyen des animaux du tableau.
5. Faites les modifications nécessaires pour proposer une fonction qui indique le nombre de chiens, de chats et de lapins présents dans le tableau.
6. Faites les modifications n ́ecessaires pour proposer une fonction qui affiche à l'écran toutes les caractéristiques des animaux contenus dans le tableau.
7. Faites les modifications nécessaires pour proposer une fonction qui supprime du tableau tous les chats et chiens mâles.
Lorsque l’utilisateur lance le programme, il doit se trouver face au menu suivant :
• pour remplir le tableau d’animaux, tapez 1.
• pour afficher à l'écran toutes les caract ́eristiques des animaux contenus
dans le tableau, tapez 2.
• pour connaitre l’age moyen des animaux du tableau, tapez 3.
• pour connaitre le nombre de chiens, de chats et de lapins pr ́esents dans le
tableau, tapez 4.
• Pour supprimer du tableau tous les chats et chiens mâles, tapez 5.
Si l’utilisateur tape 0, il sort du programme, sinon l’utilisateur teste la fonction de la question correspondant au numéro inscrit après tapez et on retourne au menu principal.
Jusqu'ici, je n'ai jamais eu de problème avec les exercices simples sur les pointeurs ou les classes. Mais là, tout se mélange et je m'y perds quelque peu...
Je vous mets le début de code que j'ai fait. Ca compile mais ça plante lamentablement lorsque après la saisie d'un 2eme animal.
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
class Animal{
protected:
int age;
char sexe;
string nom;
public:
Animal(int a=0, char s=NULL, string n=""){
age=a;
sexe=s;
nom=n;
}
void affiche(){
cout << age << " " << sexe << " " << nom << " ";
}
~Animal(){}
};
class Chien : public Animal {
private:
string race;
public:
Chien(int a=0, char s=NULL, string n="", string r="Chien"){
age=a;
sexe=s;
nom=n;
race=r;
}
void affiche(){
affiche();
cout << race << endl;
}
//~Chien(){}
};
class Lapin : public Animal {
private:
string race;
public:
Lapin(int a=0, char s=NULL, string n="", string r="Lapin"){
age=a;
sexe=s;
nom=n;
race=r;
}
void affiche(){
affiche();
cout << race << endl;
}
};
class Chat: public Animal {
private:
string race;
public:
Chat(int a=0, char s=NULL, string n="", string r="Chat"){
age=a;
sexe=s;
nom=n;
race=r;
}
void affiche(){
affiche();
cout << race << endl;
}
};
int menu () {
int choix;
cout << " 1 - Pour saisir un chat" <<endl;
cout << " 2 - Pour saisir un chien" <<endl;
cout << " 3 - Pour saisir un lapin" <<endl;
cout << endl << "Choix : ";
cin >> choix;
return choix;
}
void remplissage_tab(Animal *tab, int i){
int choix;
string n;
char s;
int a;
choix=menu();
cout << "Saisissez son nom : ";
cin >> n;
cout << "Saisissez son age : ";
cin >> a;
cout << "Saisissez son sexe M ou F : ";
cin >> s;
switch(choix){ case 1 : tab[i] = Chat(a,s,n);
break;
case 2 : tab[i] = Chien(a,s,n);
break;
case 3 : tab[i] = Lapin(a,s,n);
break;
}
}
void affichage_tab(Animal *tab, int i){
tab[i].affiche();
}
main(){
Animal * tab = new Animal[5];
int i;
for (i=0; i<5; i++) {
remplissage_tab(&tab[i],i);
}
for (i=0; i<5; i++) {
affichage_tab(&tab[i],i);
}
}
|
|
mardi 5 janvier 2010 à 21:44:50 |
Re : Exercice sur Pointeurs, classes, héritage...

CptPingu
|
Plusieurs erreurs:
- Remplissage_tab(&tab[i],i); Non. remplissage_tab(tab, i); Pas besoin de re-re-décaler l'indice. i s'en charge déjà.
- char s=NULL, bizarre char n'est pas un pointeur. Devrait être initialisé à 'f' ou 'h'. En soit ce n'est pas faux, ça équivaut à s = 0 ou s = '\0'.
- Vire #include <stdlib.h> c'est du C, pas du C++. En C++ on utilise 0 plutôt que NULL (NULL vaut toujours 0). Si tu as besoin de stdlib, alors écrit #include <cstdlib>
- Jamais de using namespace std; voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
|
|
mardi 5 janvier 2010 à 21:59:25 |
Re : Exercice sur Pointeurs, classes, héritage...

snoozriton
|
Merci beaucoup !
Ca ne plante plus, je me penche sur la suite maintenant.
|
|
mardi 5 janvier 2010 à 22:17:26 |
Re : Exercice sur Pointeurs, classes, héritage...

abdellahbarca
|
merci mon ami et suivi et je voudrais m'explique comment en fonctionne la fonction gotoxy en langage dev c++
|
|
mardi 5 janvier 2010 à 22:28:22 |
Re : Exercice sur Pointeurs, classes, héritage...

snoozriton
|
Dans l'exercice il est demandé de ne munir la Animal que des champs âge, sexe et nom.
J'ai un tableau de pointeurs sur la classe Animal (comme demandé).
J'instancie les éléments du tableau à l'aide des classes filles Chien, Chat et Lapin en fonction de ce que l'utilisateur souhaite saisir comme animal.
Comment puis-je retrouver à quel type d'animal correspond un élément du tableau sachant qu'il n'y a que âge, sexe et nom qui apparaissent.
Y a-t-il un moyen de retrouver à partir de quelle classe un élément a été instancié ?
J'espère être clair dans ma demande.
Et si quelqu'un peut jeter un oeil à mes constructeurs et destructeurs car c'est encore assez flou pour moi...
Merci d'avance.
|
|
mardi 5 janvier 2010 à 22:34:23 |
Re : Exercice sur Pointeurs, classes, héritage...

CptPingu
|
Il y a plusieurs solutions. Celle-ci n'est pas la meilleur, mais est simple à comprendre pour ton niveau actuel (pas de nouvelles notions nécessaires).
Met une méthode std::string type() dans chacune des classes, qui renvoit le vrai type de la classe.
Ex:
Code C/C++ :
class A
{
public:
virtual std::string type()
{
return "Je suis A";
}
};
class B : public A
{
public:
virtual std::string type()
{
return "Je suis B";
}
};
A* a = new B;
a->type(); // Renverra Je suis B.
Virtual veut dire: La méthode a le droit d'être redéfinit dans la classe fille.
|
|
mardi 5 janvier 2010 à 22:50:18 |
Re : Exercice sur Pointeurs, classes, héritage...

snoozriton
|
Merci CptPingu, cela me sera sans doute utile mais dans cet exercice, je ne vois pas comment je pourrai interpréter le résultat. Par exemple pour compter le nombre de chats, de chiens... ou Supprimer les chats et les chiens mâles.
Dans mon code, j'ai commencé à mettre une donnée membre race (que je devrais renommer en type plutôt) dans chaque classe fille.
C'est sans doute comme ça que je pourrai plus facilement m'en sortir.
Mais il me vient alors un autre problème. Sachant que cette donnée n'apparaitra pas dans le tableau constitué d'éléments, y a-t-il un moyen de retrouver cette donnée membre ?
|
|
mardi 5 janvier 2010 à 23:11:59 |
Re : Exercice sur Pointeurs, classes, héritage...

CptPingu
|
Oui, si des méthodes publiques utilisent la race en interne, ce n'est pas gênant.
Ex:
Code C/C++ :
class A
{
public:
virtual std::string type()
{
return "Je suis A";
}
};
class B : public A
{
public:
virtual std::string type()
{
// On considère que _race = "pouet";
return "Je suis B et la race est : " + _race;
}
private:
std::string _race;
};
A* a = new A;
A* b = new B;
a->type(); // Affichera "Je suis A"
b->type(); // Affichera "Je suis B et la race est : pouet"
|
|
mardi 5 janvier 2010 à 23:52:38 |
Re : Exercice sur Pointeurs, classes, héritage...

CptPingu
|
Version propre pour les questions 1, 2 et 3.
Code C/C++ :
#include <iostream>
#define SIZE 5
class Animal
{
public:
Animal(int age, char sexe, const std::string& nom);
virtual ~Animal();
virtual void affiche();
protected:
int _age;
char _sexe;
std::string _nom;
};
Animal::Animal(int age, char sexe, const std::string& nom)
: _age(age), _sexe(sexe), _nom(nom)
{
}
void Animal::affiche()
{
std::cout << _age << " " << _sexe << " " << _nom;
}
Animal::~Animal()
{
}
class AnimalDeRace : public Animal
{
public:
AnimalDeRace(int age, char sexe, const std::string& nom,
const std::string race);
virtual void affiche();
virtual ~AnimalDeRace();
protected:
std::string _race;
};
AnimalDeRace::AnimalDeRace(int age, char sexe, const std::string& nom,
const std::string race)
: Animal(age, sexe, nom), _race(race)
{
}
void AnimalDeRace::affiche()
{
Animal::affiche();
std::cout << " " << _race;
}
AnimalDeRace::~AnimalDeRace()
{
}
class Chien : public AnimalDeRace
{
public:
Chien(int age, char sexe, const std::string& nom,
const std::string race="Chien");
virtual ~Chien();
};
Chien::Chien(int age, char sexe, const std::string& nom,
const std::string race)
: AnimalDeRace(age, sexe, nom, race)
{
}
Chien::~Chien()
{
}
class Chat : public AnimalDeRace
{
public:
Chat(int age, char sexe, const std::string& nom,
const std::string race="Chat");
virtual ~Chat();
};
Chat::Chat(int age, char sexe, const std::string& nom,
const std::string race)
: AnimalDeRace(age, sexe, nom, race)
{
}
Chat::~Chat()
{
}
class Lapin : public AnimalDeRace
{
public:
Lapin(int age, char sexe, const std::string& nom,
const std::string race="Lapin");
virtual ~Lapin();
};
Lapin::Lapin(int age, char sexe, const std::string& nom,
const std::string race)
: AnimalDeRace(age, sexe, nom, race)
{
}
Lapin::~Lapin()
{
}
int menu()
{
int choix;
std::cout << " 1 - Pour saisir un chat" << std::endl
<< " 2 - Pour saisir un chien" << std::endl
<< " 3 - Pour saisir un lapin" << std::endl
<< std::endl
<< "Choix : ";
std::cin >> choix;
return choix;
}
void remplissage_tab(Animal** tab, int i)
{
std::string nom;
char sexe;
int age;
int choix = menu();
std::cout << "Saisissez son nom : ";
std::cin >> nom;
std::cout << "Saisissez son age : ";
std::cin >> age;
std::cout << "Saisissez son sexe M ou F : ";
std::cin >> sexe;
switch (choix)
{
case 1: tab[i] = new Chat(age, sexe, nom);
break;
case 2: tab[i] = new Chien(age, sexe, nom);
break;
case 3: tab[i] = new Lapin(age, sexe, nom);
break;
}
}
void affichage_tab(Animal** tab)
{
for (int i = 0; i < SIZE; ++i)
{
tab[i]->affiche();
std::cout << std::endl;
}
}
int main()
{
Animal* tab[SIZE] = {0};
for (int i = 0; i < SIZE; ++i)
remplissage_tab(tab, i);
affichage_tab(tab);
return 0;
}
|
|
mercredi 6 janvier 2010 à 08:07:54 |
Re : Exercice sur Pointeurs, classes, héritage...

snoozriton
|
Bonjour,
peux-tu m'expliquer pourquoi tu créés une nouvelle classe AnimalDeRace ?
Comment tu fais pour intégrer ton code de cette façon avec l'indentation ? Quand je fais un copier/coller, j'ai tout aligné à gauche comme tu as pu le voir dans le premier post...
Merci
|
|
Cette discussion est classée dans : fonction, int, tableau, tab, animal
Répondre à ce message
Sujets en rapport avec ce message
Allocation dynamique dans une fonction [ par Veovis ]
Salut,Toujours dans mon projet de TP, j'ai un petit soucis avec l'allocation dynamique dans une fonction. Ce que je voudrais faire c'est quand le tabl
Tableau en C [ par Mickylord ]
Bonsoir a tous !Voici ma question :J'ai une fonction principale, main(), et une autre fonction tab(). Je voudrais déclarer un tableau dans la fonction
tableau d'entier. [ par gdpasmini ]
Hello !j'ai un petit soucis avec une fonction qui renvoi un tableau en parametre... voila les details :Dans mes fonctions : int * boutonDecodFlux(void
Allocation dynamique de mémoire d'un tableau dans une fonction [ par DJfewos971 ]
Bonjour a tous,mon problème est de pouvoir alloué la mémoire dynamiquement d'un tableau dans une fonction.Voici mon problème niveau Code:#include #inc
tableau dans une fonction [ par meksoft002 ]
salut, je vouderais mettre la dimension d'un tableau a partir d'une fonction mais..l'éxecution ne se termine pas quand je la lance void creer(Personn
fonction min max [ par devamos ]
bonjour,j'aimerais des corrections,si vous pouvez m'aider j'ai ecri ces instructions en devc++,,, c'est une fonction qui cherche le max et le min dans
problème avec l'initialision d'un tableau [ par khen ]
Bonjour,voila j'ai un petite problème avec l'initialisation de mon tableau , je vous explique le problèmeon a un tableau de 3 dimension appelé tab et
Tableau 2 dimension en fonction [ par acidjackproject ]
Bonjour, j'aimerai pas un tableau à 2 dimension en paramètre sans pointeurs. Quand je le fais (comme suit), il m'affiche "error:array type has incompl
Fonction qui utilise un int* externe pour créer un tableau [ par tibob51 ]
Bonjour je voudrai savoir si il est possible qu'une fonction recoive un pointeur d'entier,créé un tableau dynamiquement puis l'initialise,afin de le r
[C] incompatibilité dans une fonction [ par The_KniGhT_972 ]
Bonjour, dans mon code C, j'ai un tableau de int a deux dimensions noté comme suit int tab[nbs][dmax]; et une fonction qui prend en paramètre un tab
Livres en rapport
|
Derniers Blogs
JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|