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

  1. #1
    Candidat au 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
    Points : 3
    Points
    3
    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 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    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.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  3. #3
    Candidat au 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
    Points : 3
    Points
    3
    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
    Candidat au 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
    Points : 3
    Points
    3
    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 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    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
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  6. #6
    Candidat au 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
    Points : 3
    Points
    3
    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.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    Bonjour,
    tu devrais essayer avec ceci:
    FUNCTION annee_adresse(liste_voit: Liste): Liste;

    VAR
    adr : Liste;
    annee : integer;

  8. #8
    Candidat au 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
    Points : 3
    Points
    3
    Par défaut
    Merci pour ta proposition, avec ce changement le compilation se passe sans erreurs.
    Par contre j'ai ce message

    Runtime error 216 at $08049CAC
    $08049CAC
    $08048129
    $08048458
    $08063D03

    Un probleme dans la lecture de fichier je penses

    Merci encore pour ta solution

  9. #9
    Candidat au 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
    Points : 3
    Points
    3
    Par défaut
    pourriez vous corriger mon code, ça compille sans probleme mais n'affiche pas ce que je veux

    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
    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)-------------------------------------//
    										{sous programme de la question 2}
     
     
    //----------------------------------------------------------------PROCEDURE AFFICHANT A L'ECRAN LES VOITURES DISPO A LA VENTE-----------------------------------------------//
    											{sous programme de la question 1}
    FUNCTION charge_infos (): Liste;     							 
    VAR
    	fichVoit	: file of t_voiture;
    	infos		: t_voiture;	
    	ptr		: Liste;
    BEGIN
    	Assign (fichVoit, 'voitures.dat');
    	Reset (fichVoit);
    	new(ptr);
    	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^.suivant   		:= ptr;	
    		end;
    		charge_infos		:= ptr;	
    END;
     
    //----------------------------------------------------------------PROCEDURE AFFICHANT A L'ECRAN LES VOITURES DISPO A LA VENTE-----------------------------------------------//
     
    											{sous programme de la question 2}
    PROCEDURE affiche_voitures (liste_voit: Liste);
    VAR	
    	ptr	: Liste;
     
    BEGIN
    	new(ptr);
    	ptr	:= liste_voit;
     
    		while (ptr^.suivant <> 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): Liste;									
     
    VAR
    	adr	: Liste;
      	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		: Liste;
     
    BEGIN
    	liste_voit	:= charge_infos();
     
    	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.

  10. #10
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 920
    Points
    3 920
    Par défaut
    Les profs s'amusent toujours autant à torturer leurs étudiants avec les listes chaînées .

    Je t'apporte la routine de chargement des donnéesn, médite là-dessus et ne repompe pas bêtement, ton prof pourrait avoir des doutes et il est important pour toi de comprendre.

    Comme la spécification de charge_infos n'est pas précisée, je propose la spécification suivante :
    - les données seront chargées dans l'ordre séquentiel des données du fichier lu,
    - le point d'entrée liste_voit initial doit être préservé si la liste n'est pas vide,
    - si la liste initiale n'est pas vide, les éléments du fichier sont ajoutés en fin de liste,
    - on a donc les cas : liste_voit = Nil et liste_voit <> Nil, fichier d'entrée vide ou non.

    Il serait aussi possible d'ajouter un drapeau pour déterminer si la liste initiale doit être complétée ou si ces éléments initiaux divent être supprimés (on construit une toute nouvelle liste). Dans la solution présentée, on choisit de compléter le liste.

    NB: le suivant du dernier élément d'une liste bien formée est Nil, le cas contaire siginifierait qu'il y a un suivant ou pire que le pointeur est mal défini. D'où l'intérêt de la fonction NewElem.

    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
     
    function NewElem: Liste;
    begin
      New(Result);
      Result^.suivant := Nil;
    End;
     
    procedure charge_infos(var liste_voit: Liste);
    var
      tete_fictive, nouveau, dernier: Liste;
    begin
      try
        // on créée une nouvelle liste
        tete_fictive := NewElem;
        dernier := tete_fictive;
        Assign (fichVoit, 'voitures.dat');
        Reset (fichVoit);
        while not Eof(fichVoit) do
        begin
          nouveau := NewElem;
          Read(fichVoit, nouveau^.contenu);
          // chainage au dernier
          dernier^.suivant := nouveau;
          // mise à jour du dernier
          dernier := nouveau;
        end;
        // On s'occupe de liste_voit
        if tete_fictive = dernier then
          // le fichier lu est vide car dernier a toujours sa valeur d'initialisation
          // liste_voit demeure inchangée
          exit
        else if (liste_voit = Nil) then
          // liste_voit non définie, on prend la liste créée moins la tête fictive
          liste_voit := tete_fictive.suivant;
        else
          // liste_voit contient déjà des données, on se place sur son dernier élément
          // et on ajoute la liste créée moins la tête fictive
          // on ré-emploie la variable dernier pour parcourir liste_voit
          dernier := liste_voit;
          while dernier^.suivant <> Nil do
            dernier := dernier^.suivant;
          dernier^.suivant := tete_fictive.suivant;
      finally
        Dispose(tete_fictive); // nettoyage
      end;
    End;

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

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