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

Pascal Discussion :

Manipulation des listes chaînées


Sujet :

Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    iut informatique
    Inscrit en
    Décembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : iut informatique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 7
    Par défaut Manipulation des listes chaînées
    Bonjour

    Je viens de m'inscrire sur votre forum, je ne sais pas si c'est bien ici que je dois poster ma question ou non. Quoi qu'il en soit, j'ai un problème concernant mon projet que je dois rédiger en Pascal.
    En effet, on doit manipuler des listes chaînées à-travers un document "voitures.dat", où les données sont de type "t_voiture".
    J'arrive à compiler (si j'enlève question 4) sans erreur ; par contre, au moment d'exécuter je n'ai rien, pas la moindre trace de données qui doivent (normalement) s'afficher à l'ecran.
    Dans "sous-programme question 4" j'ai
    test.pas(104,13) Error: Incompatible types: got "Liste" expected "ShortString"
    Pourriez-vous m'aider svp, c'est un coef assez important. x)
    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
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    PROGRAM principal; 		
     
    //-----------------------------------------------STRUCTURE VOITURE-------------------------------------------------------------------------------------//
    TYPE t_voiture = record			
    		marque	: string[30];
    		modele	: string[20];
    		carb	: char;
    		annee	: integer;
    		prix	: integer;
    end;
     
     
    //----------------------------------------------------------------LISTE CHAINEE POUR MANIPULER LES INFOS DU FICHIER VOITURES.DAT-------------------------------------------//
    type  
        Liste = ^Cellule;
        Cellule = record
            contenu: t_voiture; 
            suivant: Liste;   
    end;
    //---------------------------------------------------------------VARIABLES PROGRAMME PRINCIPAL----------------------------------------------------------------------//
    VAR
    	liste_voit	: Liste;
     
     
     
    //----------------------------------------------------------------PROCEDURE QUI CHARGE EN MEMOIRE LES VOITURES (DANS LA LISTE CHAINEE)-------------------------------------//
     
    PROCEDURE charge_infos (VAR liste_voit: Liste);     			 {sous programme de la question 1}
    VAR
    	fichVoit	: file of t_voiture;
    	infos		: t_voiture;
     
    BEGIN
    	Assign (fichVoit, 'voitures.dat');
    	Reset (fichVoit);
    	while not Eof(fichVoit) do
    		begin
    			Read(fichVoit,infos);
    			new(liste_voit);
     
    			liste_voit^.contenu.marque 	:= infos.marque;
    			liste_voit^.contenu.modele 	:= infos.modele;
    			liste_voit^.contenu.carb   	:= infos.carb;
    			liste_voit^.contenu.annee  	:= infos.annee;
    			liste_voit^.contenu.prix   	:= infos.prix;
     
    			liste_voit     		  	:= liste_voit^.suivant;
     
    		end;
    END;			
     
     
    //----------------------------------------------------------------PROCEDURE AFFICHANT A L'ECRAN LES VOITURES DISPO A LA VENTE-----------------------------------------------//
    											{sous programme de la question 2}
    PROCEDURE affiche_voitures (VAR liste_voit: Liste);						
     
    BEGIN			
     
    		while (liste_voit <> nil) do
    	   begin	
    		writeln(liste_voit^.contenu.marque);
    		writeln(liste_voit^.contenu.modele);
    		writeln(liste_voit^.contenu.carb);   
    		writeln(liste_voit^.contenu.annee);  
    		writeln(liste_voit^.contenu.prix); 
     
    		liste_voit := liste_voit^.suivant;
    	   end
     
     
     
    END;
     
    //--------------------------------------------------------PROCEDURE AFFICHANT LE NOMBRE DE VOITURES EN FONCTION DU CARBURANT---------------------------------------------//
    											{sous programme de la question 3}
     
    FUNCTION  nombre_carb_recur (carb: char; liste_voit: Liste): integer;
     
    BEGIN
    	if (liste_voit = nil) then
    		nombre_carb_recur:=0
    	else
    	if (liste_voit^.contenu.carb = carb) then
    		nombre_carb_recur := 1 + nombre_carb_recur(carb, liste_voit^.suivant)
    	else
    		nombre_carb_recur := nombre_carb_recur(carb, liste_voit^.suivant);	
    END;
     
    //----------------------------------------------------------FONCTION AFFICHANT L'ANNEE ET RENVOIT L'ADRESSE MEMOIRE D'UN VEHICULE-----------------------------------------// 
    											{sous programme de la question 4}
    FUNCTION annee_adresse(liste_voit: Liste): string;									
     
    VAR
    	adr	: string;
      	annee	: integer;
    BEGIN
    	annee:=liste_voit^.contenu.annee;
     
    	while(liste_voit <> nil) do
    	begin
    		if(liste_voit^.contenu.annee < (liste_voit^.suivant)^.contenu.annee) then
    			begin
    			annee := (liste_voit^.suivant)^.contenu.annee;
    			adr   := liste_voit;
    			end
    		else	
    			liste_voit := liste_voit^.suivant;
    	end;
    	annee_adresse:= adr;
    	writeln('L''année de fabrication du vehicule le plus recent : ', annee);
    END;	
     
     
     
     
    //----------------------------------------------------------PROCEDURE QUI SUPRIMME L'ADRESSE DONNEE EN PARAMETRES -------------------------------------------------------// 
    											{sous programme de la question 5}
    PROCEDURE supprime_case_recur(adr: Liste; VAR liste_voit: Liste);	
    VAR 
    	ptr: Liste;
    BEGIN	
    	if (liste_voit <> nil) then
    		if (liste_voit^.suivant = adr) then
    			begin
    			ptr := liste_voit;
    			liste_voit   := liste_voit^.suivant;
    			dispose(ptr)
    			end
    		else
    			supprime_case_recur(adr, liste_voit^.suivant);
    END;			
     
     
     
     
     
     
     
     
    //-------------------------------------------------------------------PROGRAMME PRINCIPAL----------------------------------------------------------------------------------//			
     
     
     
     
    BEGIN
     
    	charge_infos (liste_voit);  
    	affiche_voitures (liste_voit);
     
    END.

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Hello,

    Ta procédure de chargement n'est pas correcte, tu n'insères pas ton nouvel enregistrement de la bonne façon. De plus, si tu crées une nouvel enregistrement avec la variable qui pointe sur le début de la liste, toute la liste est effacée à chaque fois. Il faut passer par une variable temporaire. Même remarque avec la procédure d'affichage (variable temporaire pour le parcours de la liste, sinon tu perds la référence au début de la liste).

    Une fois que tu auras corrigé ça, ca devrait aller mieux N'hésite pas à dérouler ton algorithme sur un bout de papier pour comprendre les pointeurs.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    iut informatique
    Inscrit en
    Décembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : iut informatique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 7
    Par défaut
    Bonjour
    Merci pour ton aide. Au moins j'ai quelques pistes de recherches. Je vais essayer de coriger tout ça. Si besoin je reviens vers vous.

    Merci encore une fois

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    iut informatique
    Inscrit en
    Décembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : iut informatique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 7
    Par défaut
    Je crois avoir mis en place les consignes que tu m'a donné. Par contre j'ai une erreur dans mon sous programme question 4.

    """" test.pas(104,13) Error: Incompatible types: got "Liste" expected "ShortString"""""

    Si je comprends bien il n'arrive pas a mettre l'adresse de la cellule dans ma variable
    adr de type string. Dans ce cas la de quel type sont ces adresses? dans quoi je peux les stocker?

    Merci

  5. #5
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    En environnement 32 bits, les adresses sont stockées sur 32 bits, donc l'équivalent d'un longword... A toi de faire la conversion qu'il faut

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    iut informatique
    Inscrit en
    Décembre 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : iut informatique

    Informations forums :
    Inscription : Décembre 2013
    Messages : 7
    Par défaut
    Voici le code modifié, corrigé.
    J'ai tenté de remplacer string par word mais ça ne compile toujours pas.
    Pourriez vous me donner une solution un peu plus explicite svp.

    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
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    PROGRAM principal; 		
     
    //-----------------------------------------------STRUCTURE VOITURE-------------------------------------------------------------------------------------//
     
    TYPE t_voiture = record			
    		marque	: string[30];
    		modele	: string[20];
    		carb	: char;
    		annee	: integer;
    		prix	: integer;
    end;
     
    //----------------------------------------------------------------LISTE CHAINEE POUR MANIPULER LES INFOS DU FICHIER VOITURES.DAT-------------------------------------------//
     
    type  
        Liste = ^Cellule;
        Cellule = record
            contenu: t_voiture; 
            suivant: Liste;   
    end;
     
    //----------------------------------------------------------------PROCEDURE QUI CHARGE EN MEMOIRE LES VOITURES (DANS LA LISTE CHAINEE)-------------------------------------//
     
    PROCEDURE charge_infos (VAR liste_voit: Liste);     			 {sous programme de la question 1}
    VAR
    	fichVoit	: file of t_voiture;
    	infos		: t_voiture;
    	ptr		: Liste;
     
    BEGIN
    	Assign (fichVoit, 'voitures.dat');
    	Reset (fichVoit);
     
    	new(ptr);
    	ptr	:= liste_voit;
     
    	while not Eof(fichVoit) do
    		begin
    			Read(fichVoit,infos);
     
    			ptr^.contenu.marque 	:= infos.marque;
    			ptr^.contenu.modele 	:= infos.modele;
    			ptr^.contenu.carb   	:= infos.carb;
    			ptr^.contenu.annee  	:= infos.annee;
    			ptr^.contenu.prix   	:= infos.prix;
     
    			ptr   		  	:= ptr^.suivant;
     
    		end;
    END;			
     
    //----------------------------------------------------------------PROCEDURE AFFICHANT A L'ECRAN LES VOITURES DISPO A LA VENTE-----------------------------------------------//
    											{sous programme de la question 2}
    PROCEDURE affiche_voitures (VAR liste_voit: Liste);
    VAR
    	ptr		: Liste;
     
    BEGIN
    	new(ptr);
    	ptr	:= liste_voit;
     
    		while (ptr <> nil) do
    	   begin	
    		writeln(ptr^.contenu.marque);
    		writeln(ptr^.contenu.modele);
    		writeln(ptr^.contenu.carb);   
    		writeln(ptr^.contenu.annee);  
    		writeln(ptr^.contenu.prix); 
     
    		ptr	 := ptr^.suivant;
    	   end
     
     
     
    END;
     
    //--------------------------------------------------------PROCEDURE AFFICHANT LE NOMBRE DE VOITURES EN FONCTION DU CARBURANT---------------------------------------------//
    											{sous programme de la question 3}
     
    FUNCTION  nombre_carb_recur (carb: char; liste_voit: Liste): integer;
     
    BEGIN
    	if (liste_voit = nil) then
    		nombre_carb_recur:=0
    	else
    	if (liste_voit^.contenu.carb = carb) then
    		nombre_carb_recur := 1 + nombre_carb_recur(carb, liste_voit^.suivant)
    	else
    		nombre_carb_recur := nombre_carb_recur(carb, liste_voit^.suivant);	
    END;
     
    //----------------------------------------------------------FONCTION AFFICHANT L'ANNEE ET RENVOIT L'ADRESSE MEMOIRE D'UN VEHICULE-----------------------------------------// 
    											{sous programme de la question 4}
    FUNCTION annee_adresse(liste_voit: Liste): word;									
     
    VAR
    	adr	: word;
      	annee	: integer;
    BEGIN
    	annee:=liste_voit^.contenu.annee;
     
    	while(liste_voit <> nil) do
    	begin
    		if(liste_voit^.contenu.annee < (liste_voit^.suivant)^.contenu.annee) then
    			begin
    			annee := (liste_voit^.suivant)^.contenu.annee;
    			adr   := liste_voit;
    			end
    		else	
    			liste_voit := liste_voit^.suivant;
    	end;
    	annee_adresse:= adr;
    	writeln('L''année de fabrication du vehicule le plus recent : ', annee);
    END;	
     
    //----------------------------------------------------------PROCEDURE QUI SUPRIMME L'ADRESSE DONNEE EN PARAMETRES -------------------------------------------------------// 
    											{sous programme de la question 5}
    PROCEDURE supprime_case_recur(adr: Liste; VAR liste_voit: Liste);	
    VAR 
    	ptr: Liste;
    BEGIN	
    	if (liste_voit <> nil) then
    		if (liste_voit^.suivant = adr) then
    			begin
    			ptr := liste_voit;
    			liste_voit   := liste_voit^.suivant;
    			dispose(ptr)
    			end
    		else
    			supprime_case_recur(adr, liste_voit^.suivant);
    END;												
     
    //-------------------------------------------------------------------PROGRAMME PRINCIPAL----------------------------------------------------------------------------------//			
     
    VAR
    	liste_voit	: Liste;
    	exe		: integer;
    	E		: char;
    	adr		: word;
     
    BEGIN
    	charge_infos (liste_voit);
     
    	writeln('Que voulez-vous faire ?');
    	writeln('1) Quittez le logiciel');
    	writeln('2) Afficher les véhicules disponible a la vente');
    	writeln('3) Afficher le nombre de vhéicules fonctionant à une énérgie donnée');
    	writeln('4) Supprimer le véhicule le plus récent de la liste chainée');
    	readln (exe);
     
    	If exe=1 then
    		exit;
    		if exe=2 then
    			affiche_voitures (liste_voit);
    			if exe=3 then
    			begin
    				writeln('Donner le carburant, (E,D ou Z)');
    				readln(E);
    				nombre_carb_recur (E, liste_voit);
    			end;
    				if exe=4 then
    				begin
    					adr := annee_adresse(liste_voit);
    					supprime_case_recur(adr,liste_voit);
    				end;	
     
    END.

Discussions similaires

  1. manipulation des listes chainées
    Par bounadalvidal dans le forum Débuter
    Réponses: 8
    Dernier message: 19/01/2010, 19h40
  2. Réponses: 6
    Dernier message: 14/02/2008, 13h16
  3. De la manipulation des listes déroulantes
    Par Herode dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 07/11/2007, 16h55
  4. Trier des listes chaînées
    Par colocolo dans le forum C
    Réponses: 2
    Dernier message: 16/02/2007, 17h40
  5. Manipuler des listes d'objet ?
    Par xla99 dans le forum Général Python
    Réponses: 4
    Dernier message: 06/06/2006, 15h06

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