IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Besoin de conseil pour liste chainee


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Par défaut Besoin de conseil pour liste chainee
    BOnjour je dois réaliser une classe listesalarie avec une liste chaine simple de salarie

    Je ne sais pas par où commencer .
    J'ai créer mon prototype mais je ne suis meme pas sur.

    Quelqu'un peut me dire comment commencer ma classe avec ma liste chaine???

    Pas le faire à ma place mais m'expliquer par où commencer.

    Je vous donnes les fichiers:

    salarie.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    /*
    Fichier testé avec succès
    */
     
    #ifndef _salarie_H
    #define _salarie_H
     
    #include <iostream>
    #include "date.h"
    #include "personnel.h"
    using namespace std;
     
    //classe salarie
    class salarie:public personnel
    {
    	protected:
    		date arrivee;
    		int salaire;
    		int nbtravail;
    		bool enconge;
    		salarie *prec;
    		salarie *suivant;
     
    	public:
    		//constructeur
    		salarie();
    		salarie(char* ,char* ,int, int,date, int, bool);
    		//saisie
    		void saisie();
    		//affiche
    		void affiche();
    		//augmente le salaire
    		int augmentesalaire(int);
    		//droit au rtt
    		double rtt();
    		//pointeuse
    		int ajoutenbtravail(int);
    		//prend congé
    		bool prendreconge(int);
    		//fin de conge
    		bool finconge();
    		bool operator < (const salarie &);
     
    };
    #endif
    salarie.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    /*
    Fichier testé avec succès
    */
     
    #include "salarie.h"
    #include <iostream>
    #include "date.cpp"
    #include "personnel.cpp"
    #include <math.h>
    using namespace std;
     
    //constructeur
    salarie::salarie()
    {
    	arrivee.maj(01,01,2000);
    	salaire=0;
    	nbtravail=0;
    	enconge=false;
    	prec =NULL;
    	suivant=NULL;
    }
    salarie::salarie(char* x, char* y, int z, int s, date d, int nbt, bool c):personnel(x,y,z)
    {
     
    	arrivee=d;
    	salaire=s;
    	nbtravail=nbt;
    	enconge=c;
    	prec=NULL;
    	suivant=NULL;
    }
    //Affiche
    void salarie::affiche()
    {	
    	personnel::affiche();
    	cout << "Date d embauche: " ;
    	cout << arrivee << endl;
    	cout << "Salaire: " << salaire << endl;
    	cout << "Nombre d heures: " << nbtravail << endl;
    	cout << "En conge: " ;
    	if (enconge){ cout << "Oui"<< endl; } else { cout << "Non" << endl;}
    }
    //saisie
    void salarie::saisie()
    {
    	int a,b,c,tmp;
    	personnel::saisie();
    	cout << "Date d embauche : jj? " ;
    	cin >> a;
    	cout << "Date d embauche : mm? ";
    	cin >>b;
    	cout << "Date d embauche : aa? " ;
    	cin >> c;
    	arrivee.maj(a,b,c);
    	cout << "Salaire ? ";
    	cin >> salaire;
    	cout << "Nombre d heures ?" ;
    	cin >> nbtravail;
    	cout << "Enconge ? (0=oui/1=non) ";
    	cin >> tmp;
    	if (tmp){ enconge=false ;}else{enconge=true;}
    }
    //augmente salaire
    int salarie::augmentesalaire(int a)
    {
    	salaire=salaire+a;
    }
    //rtt?
    //calcule le nb de RTT ou x est le nombre de jours travaillés
    double salarie::rtt()
    {
    	return ceil(nbtravail/15);//arrondi a l entier le plus proche au dessu
    }
    //ajoute un nombre de jour travaillés
    int salarie::ajoutenbtravail(int x)
    {
    	nbtravail=nbtravail+x;	
    }
    //on verifie qu'il peut prendre conge. Si c'est le cas , on les déduit de son quota.
    bool salarie::prendreconge(int jdem) //prend en paramètre un certains nombre de jours demandés
    {
    	//on test si les jours demandés sont inférieurs aux jours acquis
    	if (rtt()<jdem)
    	{
    		return 0;	
    	}
    	else
    	{
    		int res;
    		res= -(jdem*15);
    		ajoutenbtravail(res);
    		enconge = true;
    		return 1;
    	}
    }
    // on remet l'employe en travail et no,n plus en congé
    bool salarie::finconge()
    {
    	enconge=false;	
    }
    // on compare la date des employés
    bool salarie::operator <(const salarie & s)
    {
    	if (arrivee<s.arrivee)
    	{
    		return true;
    	}
    	else
    	{
    		return false;
    	}
    }
    listesalarie.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #ifndef _listesalarie_H
     
    #define _listesalarie_H
     
    #include <iostream>
    #include "salarie.h"
    using namespace std;
     
     
    //classe listesalarie
    class listesalarie:public salarie
    {
    		//pointeurs
    		salarie *tete;
    		salarie *queue;
    	public:
    		//constructeur
    		listesalarie();
    		//affiche liste
    		void affiche();
    		//ajoute un salarie en queue de liste
    		int ajoutequeue(const salarie &);
    		//insere un salarie en bon endroit
    		int insertordre(const salarie &);
    		//recherche un salarie par son N & P
    		int recherche (char* const,char* const);
    		//supprime un salarie par son N & P
    		int supprime (char*, char*);
    		//calcule le nombre de salarie
    		int nbsalarie();
    		//retourne le nombre de salarie en congé
    		int nbconges();
    		//retourne les salarie partageant le bureau du tel
    		int memebureau(int);	
    };
     
    #endif
    listesalarie.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include <iostream>
    #include "listesalarie.h"
    #include "salarie.cpp"
    using namespace std;
     
    //constructeur
    listesalarie::listesalarie()
    {
    	tete =new salarie;
    	tete=NULL;
    	queue=new salarie;
    	queue=NULL;
    }
    //affiche
    void listesalarie::affiche()
    {
    	salarie* s = tete;
     
    	while (s != NULL) {
     
    		s->affiche();
     
    		s=suivant;
     
    	}
     
    }
    Je vous remercie de vos conseils

  2. #2
    Membre éclairé Avatar de femtosa
    Inscrit en
    Juin 2002
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 253
    Par défaut
    Commence peut-être par jeter un coup d'oeil la dessus :

    Tuto1
    Tuto2


  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Par défaut
    j'ai lu le tuto et j ai eu une remarque.
    J'essai d afficher une liste vide :/
    Donc j'essai de la remplir.
    En faisant des test j obtiens une erreur .
    listesalarie.cpp: In member function «void listesalarie::ajoutequeue(salarie&)»:listesalarie.cpp:28: erreur: cannot convert «salarie» to «salarie*» in assignment
    ma fonction ajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    void listesalarie::ajoutequeue(salarie & s) 
    {
     
    	if (tete == NULL) 
    	{
     
    		tete = s;
     
    		queue = s;
     
    	}
    	else
    	{
     
    		if (queue->arrivee < s.arrivee)
    		{
     
    			queue->suivant=s;
     
    			s.pred=queue;
    			queue = s;
     
    		} 
     
    	}
     
    }
    Je dois changer de type a un moment donné
    Que veut dire cette erreur? Où ai je commis une erreur?

    Merci de votre aide

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Passe un pointeur plutôt qu'une référence (ou bien prend son adresse lors de l'affectation).

  5. #5
    Membre éclairé Avatar de femtosa
    Inscrit en
    Juin 2002
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 253
    Par défaut
    Tu utilises des pointeurs pour gérer ta liste chainée, hors quand tu ajoutes des éléments dans ta liste, tu ne traites pas des pointeurs !

    Change ton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void listesalarie::ajoutequeue(salarie & s)
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void listesalarie::ajoutequeue(salarie * s)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Par défaut
    ok donc ca donne ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    //on insere à la queue.
    void listesalarie::ajoutequeue(salarie * s)
    {
       if (tete == NULL)
       {
    	   tete = s;
    	   queue = s;
       }
       else
       {
       	if (queue->arrivee < s->arrivee)
       	{
    	   queue->suivant=s;
    	   s->prec=queue;
    	   queue = s;
       	}
       }   
    }
    Par contre maintenant que je la remplis, je veux l afficher. Ma fonction affiche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    //affiche
    void listesalarie::affiche()
    {
    	salarie* s = tete;
     
    	while (s != NULL) {
     
    		s->affiche();
     
    		s=suivant;
     
     
    	}
     
    }
    Il ne m'affiche que le premier des deux salaries que j'ai saisi dans le main. En fait il ne m'affiche pas le second.
    J'ai l impression qu il n arrive pas a passer au suivant , peut etre que le pointeur suivant de s1 ne pointe par sur s2

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Par défaut
    bon en postant j ai reflechi à un truc , ma fonction ajoutequeue se modifie comme ceci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    //on insere à la queue.
    void listesalarie::ajoutequeue(salarie * s)
    {
       if (tete == NULL)
       {
    	   tete = s;
    	   queue = s;
       }
       else
       {
       	   queue->suivant=s;
    	   s->prec=queue;
    	   queue = s;
       }   
    }
    Le truc je pense est que->suivant ne pointe pas bien sur le salarie s suivant

Discussions similaires

  1. Besoin de conseils pour changer de configuration matériel
    Par lnplnp dans le forum Ordinateurs
    Réponses: 9
    Dernier message: 17/04/2006, 23h27
  2. Besoin de conseils pour une application
    Par peredodu dans le forum Access
    Réponses: 9
    Dernier message: 05/03/2006, 11h18
  3. Réponses: 13
    Dernier message: 13/09/2005, 09h41
  4. Réponses: 4
    Dernier message: 20/05/2005, 13h30
  5. Réponses: 3
    Dernier message: 24/12/2004, 12h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo