Création d'une Liste chainée c++
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Création d'une Liste chainée c++



  1. #1
    fredlav109

    Exclamation Création d'une Liste chainée c++


    ------

    bonjour je suis débutante en programmation language c++ je suis un cours présentement et notre professeur nous a demander cela :
    Objectifs du travail demandé
    Le principal but de ce travail est de se familiariser avec les pointeurs et les classes dans le langage C++. Il
    est donc demandé dans ce TP de concevoir un programme, écrit en C++, créant une liste chaînée en
    mémoire à partir de données contenues dans un fichier texte FP. Ce dernier contient de l’information
    concernant des dossiers de professeurs. Chaque dossier de professeur contient son nom, son prénom, une
    liste de cours qu’il souhaite enseigner et une liste de noms d’étudiants qu’il souhaite diriger. Pour ce faire,
    il est demandé de programmer une classe DossierProfesseur qui crée, à partir des données contenues dans
    le fichier texte FP, une liste chaînée (dont la structure est décrite plus loin). Cette classe permettra
    d’effectuer les opérations suivantes sur cette liste :
    1. Supprimer un dossier professeur.
    2. Afficher le nom de l’enseignant ayant le plus d’étudiants.
    3. Afficher le cours le plus demandé.
    4. Afficher le nombre des professeurs souhaitant enseigner un cours donné.
    5. Recopier la liste chaînée mise à jour dans autre fichier Filename.2
    Les informations contenues dans le fichier texte FP ont le format suivant :
    nom
    prenom
    cours 1
    cours 2
    .
    .
    cours n
    & // ici & sert à séparer les cours des étudiants
    Etudiant 1
    Etudiant 2
    .
    .
    & //cette fois-ci & sert à passer au professeur suivant
    Le nom et prenom sont des chaînes de caractères identifiant un professeur donné. Les de cours 1, cours 2,
    ... etc sont des chaînes de caractères identifiant des sigles de cours. Utiliser les sigles suivants: SIF100,
    SIF101, SIF102, SIF103, …, etc. Les valeurs de Etudiant 1, Etudiant 2, …, etc sont des chaînes de
    caractères identifiant le nom des étudiants que souhaite diriger le professeur en question. Le caractère &
    sert la première fois à séparer les sigles de cours des noms des étudiants et la deuxième fois à séparer les
    dossiers de professeurs.
    Votre programme lira à partir d’un autre fichier texte FT, les transactions à effectuer par votre programme
    dont le format est: op [param1]. Les opérations possibles sont comme ci-dessous.
    - nom, prenom : supprimer un professeur de la liste chaînée.
    # : afficher le nom du professeur ayant le plus d’étudiants dans la liste chaînée.
    * : afficher le cours le plus demandé dans la liste chaînée.
    % coursename: afficher le nombre de professeurs souhaitant enseigner le cours coursename.
    $ : recopie la liste chaînée mise à jour dans le fichier FP.
    Les structures de données à utiliser sont les suivantes :
    struct Professeur{
    char* nom;
    char* prenom;
    Cours* listecours;
    Etudiants* listetudiants;
    Professeur* suivant;
    };
    Graphiquement, cette structure est comme suit :
    pointeur vers la pointeur vers la
    structure Cours structure Etudiant
    nom prenom
    pointeur vers un autre
    professeur 3
    struct Cours{
    char * sigle;
    Cours * suivant;
    };
    Graphiquement, cette structure est comme suit :
    struct Etudiant {
    char* nom;
    Etudiant* apres;
    };
    Graphiquement, la structure Etudiant est comme suit :
    classe DossierProfesseur {
    private:

    Professeur * tete; // début de la liste chaînée

    public:
    Dossierprofesseur (char* FP); // Construit de la structure de la liste chaînée en mémoire à partir
    // du fichier FP
    ~Dossierprofesseur ( ); // Détruit de la liste chaînée existant en mémoire.
    void supprimer (char * nom, char * prenom ); // supprime de la liste chaînée un professeur donné
    char* afficher leprofplusetudiant ( ) const; // affiche le nom du professeur ayant le plus d’étudiants
    char* affichercoursplusdemande ( ) const; // affiche le cours le plus demandé de la liste
    int affichernbreprofpouruncours (char* coursdonne) const; // affiche le nombre de professeurs pour le
    // cours coursdonne recopie la liste chaînée
    void recopier (char *FP); // dans le fichier FP
    };



    Alors voila vous connaissez maintenant la basse de mon programme voila ce que j'ai de fait:

    Code:
    DossierProfesseur.H
    
    #pragma once
    #ifndef Def_Dossier
    #define Def_Dossier
    #include <string>
    #include "Struct.h"
    using namespace std;
    #define Taille_de_Liste 100
    
    class DossierProfesseur
    {
    private:
    	Professeur * tete; // Début de la liste chainée
    	Professeur*courant;
    	
    public:
    	DossierProfesseur(string FP); // Constructeur
    	~DossierProfesseur(); // Destructeur
    	void Supprimer(char*nom, char*prenom); // Supprime un professeur donnée
    	char*afficherleprofplusetudiant()const; // Affiche le nom du professeur ayant le plus d'étudiant
    	char*affichercoursleplusdemande()const; // Affiche le sigle du cours le plus demander
    	int affichernbreprofpouruncours(char*coursdonne) const; // Affiche le nombre de professeur pour le coursdonne
    	void Recopier(char*FP); //Recopie la liste chainée dans le fichier FP
    };
    #endif
    Code:
    Struct.h
    
    struct Cours
    {
    	char*sigle;
    	Cours*suivant;
    };
    
    struct Etudiants
    {
    	char*nom;
    	Etudiants*suivant;
    };
    
    struct Professeur
    {
    	char*nom; // Pointeur sur un caractère
    	char*prenom; // Pointeur sur un caractère
    	Cours*listecours; // Pointeur sur l'objet Cours
    	Etudiants*listetudiants; // Pointeur sur l'objet Etudiants
    	Professeur*suivant; // Pointeur sur l'objet Professeur suivant
    };
    Code:
    dossierProfesseur.cpp
    
    #include "DossierProfesseur.h"
    #include <cassert>
    #include<string>
    #include <fstream>
    #include <iostream>
    #include <list>
    
    using namespace std;
    
    int main()
    {
    	DossierProfesseur* prof = new DossierProfesseur("C:\\Users\\Fred\\Desktop\\université\\8SIF109 programmation\\2ieme fois\\Devoir #1\\DossierProfesseur\\FichierFp.txt");
    	DossierProfesseur* Prof = new DossierProfesseur("C:\\Users\\Fred\\Desktop\\université\\8SIF109 programmation\\2ieme fois\\Devoir #1\\DossierProfesseur\\FichierFt.txt");
    	Lecture_Fichier_Ft();
    	system("PAUSE");
    }
    DossierProfesseur::DossierProfesseur(string FP)
    {
    
    ifstream fichier(FP, ios::in);  // on ouvre le fichier en lecture
    
    		if (fichier)  // si l'ouverture a réussi
    		{
    			cout << " Lefichier est ouvert! /n";
    		}
    		else  // sinon
    			cerr << "Impossible d'ouvrir le fichier !" << endl;
    		char Ligne[20];
    		int cpt = 0;
    		
    		while (fichier.eof()) // tant que c'est pas la fin du fichier
    		{
    			tete = new Professeur; // Créer un nouveau professeur
    			fichier >> Ligne; // lire une ligne
    			tete->nom=Ligne; //affecter ligne a la bonne variable(nom)
    			fichier >> Ligne;//lire la ligne suivante
    			tete->prenom= Ligne;//affecter ligne a la bonne variable(prenom)
    			while (cpt < 2) // tant que cpt est plus petit que 2
    			{
    				fichier >> Ligne;// lire une ligne du fichier
    				if (Ligne == "&") // si Ligne est égale au symbole
    					cpt++;			// incrémenter cpt
    				else if (cpt == 0) // sinon, si cpt est égale a 0
    				{
    					tete->listecours = new Cours;  // créer un nouveau cours
    					tete->listecours->sigle = Ligne;			// affecter la ligne a a la bonne variable (sigle)
    				}
    				else if (cpt == 1) // sinon,si cpt est égale a 1
    				{
    					tete->listetudiants = new Etudiants; // créer un nouvel étudiant
    					tete->listetudiants->nom = Ligne;					// affecter la ligne a la bonne variable ( nom)
    				}
    					
    			}
    			cpt = 0;
    		}
    
    		
    	
    		fichier.close();	// fermer le fichier
    }
    
    DossierProfesseur::~DossierProfesseur()
    {
    	while (tete != NULL)
    	{
    		courant = tete;
    		tete = tete->suivant;
    		delete courant;
    	}
    }
    
    void DossierProfesseur::Supprimer(char*nom, char*prenom) // Supprimer un professeur donnée
    {
    	Professeur*tmp = tete;
    	if (tete == NULL)
    		 cout<<" La Liste est vide";
    	while (tete != NULL)
    	{
    
    		if ((tete->nom == nom) && (tete->prenom == prenom))
    		{
    			delete tete;
    		}
    		else
    			tete = tete->suivant;
    	}
    
    }
    
    char*DossierProfesseur::afficherleprofplusetudiant() const // Affiche le nom du professeur ayant le plus d'étudiant
    {
    
    }
    
    char*DossierProfesseur::affichercoursleplusdemande() const // Affiche le sigle du cours le plus demander
    {
    
    }
    
    int DossierProfesseur::affichernbreprofpouruncours(char*coursdonne) const // Affiche le nombre de professeur pour le coursdonne
    {
    
    }
    
    void DossierProfesseur::Recopier(char*FP) //Recopie la liste chainée dans le fichier FP
    {
    
    }
    void Lecture_Fichier_Ft(string FT)
    {
    	ifstream operation(FT,ios::in);
    	
    	if (operation)
    		cout << "Le Fichier Ft est ouvert!\n";
    	else
    		cerr << "Impossible d'ouvrire le fichier FT" << endl;
    
    	char c;
    	while (operation.eof())
    	{
    		operation >> c;
    		if (c == '-')
    			void Supprimer(char*nom, char*prenom);
    		else if (c == '#')
    			prof.afficherleprofplusetudiant();
    		else if (c == '*')
    			char*affichercoursleplusdemande() const;
    		else if (c == '%')
    			int affichernbreprofpouruncours(char*coursdonne) const;
    		else if (c == '$')
    			void Recopier(char*FP);
    	}
    	operation.close();
    }

    Mais je pense que je suis complètement de le champ pouvez-vous m'aider??????

    Une Étudiante très très désespérer.

    -----

  2. #2
    Jack
    Modérateur

    Re : Création d'une Liste chainée c++

    Mais je pense que je suis complètement de le champ pouvez-vous m'aider??????
    Il faudrait reformuler parce que je ne comprends pas le sens de cette phrase. Ni quel est le problème en fait ...

  3. #3
    fredlav109

    Re : Création d'une Liste chainée c++

    Bonjour, désoler je voulais que je crois que mon programme n'est pas du tout correct que ce que je fais n'est pas la bonne chose.... donc le problème est là je voudrais savoir si se que j'ai programmer est correct? et vous allez voir des fonctions de ma classe dossierProfesseur qui ne sont pas coder c'est les fonctions que je ne sais pas comment mis prendre, je ne sais pas de quel façon ma fonction doit fonctionner

  4. #4
    Chanur

    Re : Création d'une Liste chainée c++

    Bonjour,
    Il faudrait que tu nous expliques ce qui te bloque : le bon sens et la charte du forum empêchent qu'on fasse le travail à ta place.

    Sinon, il y a dans ton code quelques erreurs qui sautent aux yeux :
    Code:
    while (fichier.eof()) // tant que c'est pas la fin du fichier
    Ce que tu as écrit, c'est tant que c'est la fin de fichier ...

    Code:
    tete->nom=Ligne; //affecter ligne a la bonne variable(nom)
    fichier >> Ligne;//lire la ligne suivante
    tete->prenom= Ligne;//affecter ligne a la bonne variable(prenom)
    Tu donnes la même valeur (le pointeur Ligne) à tete->nom et tete->prenom.
    En fait, ce que tu devrais faire c'est recopier la chaîne de caractère contenue à l'adresse Ligne dans d'autre zones dont les adresses seront affectées à tete->nom et tete->prenom.
    La fonction strdup, par exemple, fait ça très bien.

    Code:
    if (Ligne == "&")
    Tu ne compares pas les chaînes de caractères mais leurs adresses, qui seront bien sûr toujours différentes.
    La fonction strcmp, par exemple, permet de comparer des chaînes de caractères.
    Ou encore, comme tu ne t'intéresse qu'au premier caractère de la ligne :
    Code:
    if (Ligne[0] == '&')
    Et enfin, plutôt que te demander si ce que tu as fait est bon, tu devrais le tester :
    Si ça ne marche pas, il est certain que c'est faux.
    Si ça marche, il est possible que ce soit faux.

    Bon courage, et a plus.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  5. A voir en vidéo sur Futura
  6. #5
    Jack
    Modérateur

    Re : Création d'une Liste chainée c++

    C'est du C++ et je vois que tu as inclus le fichier d'entête <string>. Pourquoi utiliser des C strings dans ce cas?

    Pour compléter la réponse de Chanur, l'utilisation d'un debugger peut grandement faciliter la mise au point du programme. Comment développes-tu? En ligne de commande ou avec un IDE?

Discussions similaires

  1. [c]insertion liste chainee
    Par invite8b421ec7 dans le forum Programmation et langages, Algorithmique
    Réponses: 7
    Dernier message: 02/06/2011, 11h16
  2. [C]Liste chainée
    Par invite8b421ec7 dans le forum Programmation et langages, Algorithmique
    Réponses: 29
    Dernier message: 09/04/2011, 11h09
  3. liste chainée
    Par invite69686042 dans le forum Programmation et langages, Algorithmique
    Réponses: 7
    Dernier message: 01/01/2011, 19h18
  4. liste chainée en C
    Par invite69686042 dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 01/01/2011, 11h31
  5. liste chainée
    Par invite69686042 dans le forum Programmation et langages, Algorithmique
    Réponses: 8
    Dernier message: 11/12/2010, 15h35