begin process at 2012 05 29 05:25:21
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Divers

 > 

Exercice sur Pointeurs, classes, héritage...


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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

Administrateur CodeS-SourceS
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

1 2

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


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,437 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales