Aide pour un programme en c++ novice

Résolu
tooth Messages postés 11 Date d'inscription lundi 11 janvier 2010 Statut Membre Dernière intervention 29 janvier 2010 - 27 janv. 2010 à 17:40
tooth Messages postés 11 Date d'inscription lundi 11 janvier 2010 Statut Membre Dernière intervention 29 janvier 2010 - 29 janv. 2010 à 22:53
bonjour
j'ai besoin d'aide pour compiler et exécuter un programme qu'on nous a demandé à l'école, j'ai jamais étudié de c++ alors je galère bcp,
voilà le travail demandé:
Objectif : Une entreprise Beta alloue des voitures de fonctions à ses employés et
collaborateurs, le but de ce programme est d’affecter les véhicules et de gérer les imprévus
comme accidents ou panne.

Structure :
Classes utilisées :
1- Collaborateur : nom, N°, Fonction.
2- Voiture : marque, N° d’immatriculation, Etat (affectée, accidentée, disponible, en
panne…).

Opérations Possibles :
- Ajouter des véhicules (Achat…).
- Embaucher des collaborateurs, leur affecter des voitures (ou non).
- Affecter des voitures (une voiture ne peut être alloué que si elle est disponible).
- Afficher l’état du stock (voiture, état, à qui elle est affectée le cas échéant).
- Supprimer des voitures (Vente, Casse…).

voilà le travail que j'ai effectué mais qui ne se compile pas:

fichier voiture.h

#ifndef voiture_h
#define voiture_h

#include
#include<cstdlib>
#include<string>

using namespace std;

class voiture
{
public:
//constructeurs et distructeur

voiture(){compteur++;};
voiture(std::string m,std::etat e,std::string mtr);
~voiture(){compteur--;};

//autres methodes

int setvoiture();
void affichestock() const;


std::string marque, matricule;
enum etat {dispo,affecte,accidente,en_panne};
etat status;
static int compteur;

};
#endif

fichier collaborateur.h

#ifndef collaborateur_h
#define collaborateur_h

#include
#include<cstdlib>
#include<string>

using namespace std;

class collaborateur
{
public :
bool servi;
//constructeurs et distructeur

collaborateur(){compteur1++;};
~collaborateur(){compteur1--;};

//autres methodes

void setcollaborateur();
void affecter();

private :
std::string Nom,Fonction;
int Numero;
bool droit;

int static compteur1;
};
#endif

fichier voiture.cpp

#include "voiture.h"
#include "collaborateur.h"
#include <cstdlib>
#include
#include <string>


using namespace std;

compteur= 0;

//constructeur

voiture::voiture(std::string m, std::string mtr, std::etat e) : marque(m), matricule(mtr), status(e)
{compteur++;}

//saisie des voitures

void voiture::setvoiture()
{
cout<<"donner la marque:"<<endl;
cin>>marque;
cout<<"donner l'etat de la voiture:"<<endl;
cin>>status;
cout<<"donner la matruicule:"<<endl;
cin>>matricule;
return compteur++;
}

//afficher le stock

void voiture::affichestock()const
{
cout<<"La marque de la voiture est:"<<marque<<endl;
cout<<"L'état de la voiture est:"<<status<<endl;
cout<<"La matricule de la voiture est:"<<matricule<<endl;
cout<<"Le nombre de voiture dans le stock est:"<<compteur<<endl;
}

//distructeur

voiture::~voiture(){compteur--;}

fichier collaborateur.cpp

#include "voiture.h"
#include "collaborateur.h"
#include <cstdlib>
#include
#include <string>


using namespace std;

compteur1 =0;

//constructeur

collaborateur::collaborateur: Nom("dacia"), Fonction("fsfsdd"), Numero(142), droit(true)
{compteur1++;}

//créer des collaborateurs

int collaborateur::setcollaborateur(std::string Nom, std::string Fonction, int Numero, bool droit)
{
cout<<"Donner le nom:";
std::cin>>Nom;
cout<<"Donner sa fonction:";
std::cin>>Fonction;
cout<<"Donner son numéro:";
cin>>Numero;
cout<<"Est ce qu'il a droit a une voiture:";
cin>>droit;
servi=false;
return compteur1++;
}

//affectation des voitures

void collaborateur::affecter()
{
if(droit==true)
{ if (servi==false)
{ if(etat==1)
{etat=affecte;
servi=true;
cout<<"la voiture vous a été affecté"<<endl;
else
cout<<"la voiture n'est pas disponible"<<endl;
}
else
cout<<"vous avez déja une autre voiture"<<endl;
}
else
cout<<"vous avez pas droit a une voiture"<<endl;
}
}

//destructeur
collaborateur::~collaborateur(){--compteur1;}

fichier main.cpp

#include <cstdlib>
#include
#include <string>
#include "voiture.h"
#include "collaborateur.h"
using namespace std;




int main()
{
voiture a;
a.setvoiture;
collaborateur b;
b.setcollaborateur();
b.affecter();
a.affichestock();
return 0;
system("PAUSE");
}



si quelqu'un peut m'aider un grand merci en avance

14 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
27 janv. 2010 à 20:58
Il y a beaucoup de petites erreurs. J'ai quasiment tout remis au propre.
Tout d'abord:
- N'utilise jamais using namespace std. Voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- Pas besoin de cstdlib
- Pas besoin de system("pause")
- Généralement, on appelle les fichiers .cpp/.hpp ou .cc/.hh, mais le .h tout seul est réservé au fichier d'entête du C.
- string est dans iostream, donc pas besoin de l'inclure
- On met une majuscule au classe
- Les attributs sont différenciés grâce à un _

Voiture.hh
#ifndef VOITURE_HH_
# define VOITURE_HH_

#include 

enum Etat
  {
    DISPO =  1,
    AFFECTE = 2,
    ACCIDENTE = 3,
    EN_PANNE = 4
  };

class Voiture
{
public:
  Voiture();
  Voiture(const std::string& m, Etat e, const std::string& mtr);
  ~Voiture();

  void setVoiture();
  void afficheStock() const;

private:
  std::string _marque, _matricule;
  Etat _status;
  static int compteur;
};
#endif


Voiture.cc
#include "voiture.hh"
#include 

int Voiture::compteur  = 0;

Voiture::Voiture()
{
  compteur++;
}

Voiture::~Voiture()
{
  compteur--;
}

Voiture::Voiture(const std::string& m, Etat e, const std::string& mtr)
  : _marque(m), _matricule(mtr), _status(e)
{
  compteur++;
}

void Voiture::setVoiture()
{
  std::cout << "Donnez la marque: " << std::endl;
  std::cin >> _marque;
  std::cout << "Donnez l'etat de la Voiture: " << std::endl;
  int tmp;
  std::cin >> tmp;
  _status =  Etat(tmp);
  std::cout << "Donnez la matricule: " << std::endl;
  std::cin >> _matricule;
}

void Voiture::afficheStock() const
{
  std::cout << "La marque de la Voiture est: " << _marque << std::endl
    << "L'état de la Voiture est: " << _status << std::endl
    << "La matricule de la Voiture est: " << _matricule << std::endl
    << "Le nombre de Voiture dans le stock est: " << compteur
    << std::endl;
}


Collaborateur.hh
#ifndef COLLABORATEUR_HH_
# define COLLABORATEUR_HH_

#include

class Collaborateur
{
 public :
  bool _servi;

  Collaborateur();
  Collaborateur(const std::string& Nom,
const std::string& Fonction,
int Numero, bool droit);
  ~Collaborateur();

  void demandeCollaborateur();
  void affecter();

 private :
  std::string _nom;
  std::string _fonction;
  int _numero;
  bool _droit;

  static int compteur;
};
#endif


Collaborateur.cc
#include "collaborateur.hh"
#include 

int Collaborateur::compteur  = 0;

Collaborateur::Collaborateur()
{
  compteur++;
}

Collaborateur::~Collaborateur()
{
  compteur--;
}

Collaborateur::Collaborateur(const std::string& nom,
     const std::string& fonction,
     int numero, bool droit)
  : _nom(nom), _fonction(fonction), _numero(numero), _droit(droit)
{
  compteur++;
}

void Collaborateur::demandeCollaborateur()
{
  std::cout << "Donnez le nom: ";
  std::cin >> _nom;
  std::cout << "Donnez sa fonction: ";
  std::cin >> _fonction;
  std::cout << "Donnez son numéro: ";
  std::cin >> _numero;
  std::cout << "Est ce qu'il a droit a une voiture: ";
  std::cin >> _droit;
  _servi = false;
}

void Collaborateur::affecter()
{
// Pas compris ce que tu cherchais à faire, tu sembles mélanger
// la classe voiture et la classe collaborateur.
// J'ai donc tout mis en commentaire
//
//   if (_droit)
//   {
//     if (!_servi)
//     {
//       if (etat == DISPO)
//       {
// 	_etat=affecte;
// 	_servi = true;
// 	std::cout << "La voiture vous a été affecté " << std::endl;
//       }
//       else
// 	std::cout<<"La voiture n'est pas disponible" << std::endl;
//     }
//     else
//       std::cout<<"Vous avez déja une autre voiture" << std::endl;
//   }
//   else
//     std::cout<<"Vous n'avez pas le droit a une voiture" << std::endl;
}


main.cc
#include "voiture.hh"
#include "collaborateur.hh"

int main()
{
  Voiture a;
  a.setVoiture();
  Collaborateur b;
  b.demandeCollaborateur();
  b.affecter();
  a.afficheStock();

  return 0;
}


_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
27 janv. 2010 à 21:46
Pour confondre une méthode avec un attribut de classe, tu dois avoir de nombreuses lacunes :)
Je t'invite à regarder des tutoriaux, sur le site du zéro par exemple.

private:
  Voiture _voiture;


_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
3
tooth Messages postés 11 Date d'inscription lundi 11 janvier 2010 Statut Membre Dernière intervention 29 janvier 2010
27 janv. 2010 à 17:44
voilà les erreurs que je reçois

5 C:\Documents and Settings\rachida\Mes documents\essai\main.cpp In file included from main.cpp

16 C:\Documents and Settings\rachida\Mes documents\essai\voiture.h `std::etat' has not been declared (j'avais mis directement etat mais le compilateur ne l'a pas reconnu)

16 C:\Documents and Settings\rachida\Mes documents\essai\voiture.h ISO C++ forbids declaration of `e' with no type

16 C:\Documents and Settings\rachida\Mes documents\essai\voiture.h ISO C++ forbids declaration of `e' with no type

15 C:\Documents and Settings\rachida\Mes documents\essai\main.cpp statement cannot resolve address of overloaded function

C:\Documents and Settings\rachida\Mes documents\essai\Makefile.win [Build Error] [main.o] Error 1

merci pour votre temps
0
tooth Messages postés 11 Date d'inscription lundi 11 janvier 2010 Statut Membre Dernière intervention 29 janvier 2010
27 janv. 2010 à 21:19
merci beaucoup pour l'aide CptPingu
pour ce que t'as mit en commentaire:
pour affecter une voiture il faut faire des testes sur des variables appartenant à la classe voiture et d'autres de la classe collaborateur, une variable bool droit qui définit si le collaborateur a droit à une voiture de fonction, et un test sur la voiture si elle est disponible ou pas (variable status de type enum etat), aussi sur la variable bool servi, qui verifie si le collaborateur n'a pas déjà une voiture de fonction, et les "else" pour donner un message pour la cause du refus, ou bien un message pour confirmer l'affectation
merci encore
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
27 janv. 2010 à 21:24
Alors il te faut un attribut de type "Voiture" dans ta classe "Collaborateur".
Tu affectes une voiture en fonction des critères que tu m'as décrit.

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
tooth Messages postés 11 Date d'inscription lundi 11 janvier 2010 Statut Membre Dernière intervention 29 janvier 2010
27 janv. 2010 à 21:34
comme ça

class Collaborateur
{
public :
bool _servi;

Collaborateur();
Collaborateur(const std::string& Nom,
const std::string& Fonction,
int Numero, bool droit);
~Collaborateur();

void demandeCollaborateur();
void affecter();
void voiture();
private :
std::string _nom;
std::string _fonction;
int _numero;
bool _droit;

static int compteur;
};
#endif
0
tooth Messages postés 11 Date d'inscription lundi 11 janvier 2010 Statut Membre Dernière intervention 29 janvier 2010
27 janv. 2010 à 22:07
bon j'ai compiler et executer le prog:
il me demande de donner la marque et le status puis il sort du programme
0
tooth Messages postés 11 Date d'inscription lundi 11 janvier 2010 Statut Membre Dernière intervention 29 janvier 2010
27 janv. 2010 à 22:13
comme j'ai dit dans mon premier poste j'ai jamais étudié le c++ avant, je suis en admission parallèle donc j'ai pas de pré-requis, c'est pour ça que j'aprécie bcp ton aide.
bon dans l'implémentation il y a du traitement por la variable tmp; est ce que c'est la cause de l'interruption du programme à l'exécution?
0
tooth Messages postés 11 Date d'inscription lundi 11 janvier 2010 Statut Membre Dernière intervention 29 janvier 2010
27 janv. 2010 à 23:00
j'ai trouvé que pour l'etat il faut donne un chiffre qui correspond à dispo ou accidenté ect, mais apres il termine l'execution
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
27 janv. 2010 à 23:03
comme j'ai dit dans mon premier poste j'ai jamais étudié le c++ avant, je suis en admission parallèle donc j'ai pas de pré-requi

Ce n'était pas une critique, mais un conseil. Lire les tutoriaux est très bénéfique. De plus, ce n'est pas l'école mais la motivation et la curiosité qui permettent d'apprendre un langage.

il y a du traitement por la variable tmp; est ce que c'est la cause de l'interruption du programme à l'exécution?

Qu'entends-tu par interruption ? Une erreur ou une pause du programme ?
Il faut donner à statut un numéro, sinon il risque d'y avoir quelques problèmes. Dans ce que je t'ai donné, je n'ai ajouté aucune gestion des erreurs (entrée invalides), il faut bien sur les gérer, c'est à dire, prendre en compte le fait que l'utilisateur peut entrer n'importe quoi.

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
tooth Messages postés 11 Date d'inscription lundi 11 janvier 2010 Statut Membre Dernière intervention 29 janvier 2010
27 janv. 2010 à 23:19
je sais que c'est trop mais quand le prog demander est ce que le collaborateur à droit à une voiture, faut il donner "true ou false" ou bien "0 ou 1"?
et j'ai mis l'attribut Voiture _voiture dans la classe collaborateur, mais il me donne bcp d'erreurs quand j'inclus la methode affecter voilà les erreurs (merci pour ta patience )

1 C:\Documents and Settings\rachida\Mes documents\kjqsd\collaborateur.cpp In file included from collaborateur.cpp

25 C:\Documents and Settings\rachida\Mes documents\kjqsd\collaborateur.hh `Voiture' does not name a type

C:\Documents and Settings\rachida\Mes documents\kjqsd\collaborateur.cpp In member function `void Collaborateur::affecter()':

47 C:\Documents and Settings\rachida\Mes documents\kjqsd\collaborateur.cpp `etat' undeclared (first use this function)

47 C:\Documents and Settings\rachida\Mes documents\kjqsd\collaborateur.cpp `DISPO' undeclared (first use this function)

49 C:\Documents and Settings\rachida\Mes documents\kjqsd\collaborateur.cpp `_etat' undeclared (first use this function)

49 C:\Documents and Settings\rachida\Mes documents\kjqsd\collaborateur.cpp `affecte' undeclared (first use this function)

C:\Documents and Settings\rachida\Mes documents\kjqsd\Makefile.win [Build Error] [collaborateur.o] Error 1
0
tooth Messages postés 11 Date d'inscription lundi 11 janvier 2010 Statut Membre Dernière intervention 29 janvier 2010
27 janv. 2010 à 23:30
j'ai inclus la le fichier voiture.hh, dans le fichier collaborateur.cpp et collaborateur.hh
mais il continu à donner des erreurs sur la variable etat
C:\Documents and Settings\rachida\Mes documents\kjqsd\collaborateur.cpp In member function `void Collaborateur::affecter()':

48 C:\Documents and Settings\rachida\Mes documents\kjqsd\collaborateur.cpp `etat' undeclared (first use this function)

50 C:\Documents and Settings\rachida\Mes documents\kjqsd\collaborateur.cpp `_etat' undeclared (first use this function)

50 C:\Documents and Settings\rachida\Mes documents\kjqsd\collaborateur.cpp `_etat' undeclared (first use this function)
0
tooth Messages postés 11 Date d'inscription lundi 11 janvier 2010 Statut Membre Dernière intervention 29 janvier 2010
27 janv. 2010 à 23:56
pardon pour les multi-postes, le forum devrait permettre la modification des postes.

je crois qu'il faut utiliser la variable status de type enum etat au lieu de "_etat" dans la methode affecter() j'ai essayé mais ça donne tjrs les mêmes erreurs de déclaration, si c'est possible de m'expliquer d'où viens le problème, à propos du lien du tutoriel ça ne marche pas, comme ceux de ton site et de ton blog d'ailleur
0
tooth Messages postés 11 Date d'inscription lundi 11 janvier 2010 Statut Membre Dernière intervention 29 janvier 2010
29 janv. 2010 à 22:53
bon merci beaucoup CptPingu, j'ai bcp avancé grâce à toi
0
Rejoignez-nous