-
Notifications
You must be signed in to change notification settings - Fork 0
/
Info321-Tp4.adb
254 lines (233 loc) · 6.88 KB
/
Info321-Tp4.adb
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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
with ada.text_io;
use ada.text_io;
with ada.integer_text_io;
use ada.integer_text_io;
with ada.strings.unbounded;
use ada.strings.unbounded;
with ada.strings.unbounded.text_io;
use ada.strings.unbounded.text_io;
procedure main is
N: constant integer := 100;
type ligne is array(1..6) of unbounded_string;
type chaine;
type ptr is access chaine;
type chaine is record
data: ligne;
next: ptr;
end record;
type vehicules is (Tramway, Metro, Train, Bus, Ferry, Cablecars, Telecabine, Funiculaire);
package enum_vehicule is new enumeration_io(vehicules);
use enum_vehicule;
type matrice is array(1..N, 1..6) of unbounded_string;
mat : matrice;
tab: ptr;
function lire_CSV(URL: string) return matrice is
-- Lis un fichier CSV et renvoie son contenu sous forme de matrice.
fichier : File_Type;
ligne_actuelle : unbounded_string;
cptr_ligne : integer;
cptr_col : integer;
prev_car : integer;
Result: Matrice;
begin
Open(Name => URL, File => fichier, Mode => in_file);
cptr_ligne := 1;
loop
ligne_actuelle := get_line(fichier);
cptr_col := 1;
prev_car := 1;
for car in 1..length(ligne_actuelle) loop
if element(ligne_actuelle, car) = ',' then
Result(cptr_ligne, cptr_col) := to_unbounded_string(slice(ligne_actuelle, prev_car, car - 1));
prev_car := car + 1;
cptr_col := cptr_col + 1;
end if;
end loop;
Result(cptr_ligne, cptr_col) := to_unbounded_string(slice(ligne_actuelle, prev_car, length(ligne_actuelle)));
cptr_ligne := cptr_ligne + 1;
exit when end_of_file(fichier);
end loop;
close(fichier);
return Result;
end;
function lire_CSV_LC(URL: String) return ptr is
-- Lis un fichier CSV et renvoie son contenu sous forme de liste chaînée.
fichier : File_Type;
ligne_actuelle : unbounded_string;
cptr_col : integer;
prev_car : integer;
anchor : ptr;
ptrs : ptr;
begin
Open(Name => URL, File => fichier, Mode => in_file);
anchor := null;
cptr_col := 1;
ligne_actuelle := get_line(fichier);
while not End_of_File(fichier) loop
ligne_actuelle := get_line(fichier);
cptr_col := 1;
prev_car := 1;
ptrs := new chaine;
for car in 1..length(ligne_actuelle) loop
if element(ligne_actuelle, car) = ',' then
ptrs.data(cptr_col) := to_unbounded_string(slice(ligne_actuelle, prev_car, car - 1));
prev_car := car + 1;
cptr_col := cptr_col + 1;
end if;
end loop;
ptrs.data(cptr_col) := to_unbounded_string(slice(ligne_actuelle, prev_car, length(ligne_actuelle)));
ptrs.next := anchor;
anchor := ptrs;
end loop;
close(fichier);
return anchor;
end;
function lire_routes return ptr is
--Lis le fichier "routes.txt" et renvoie le contenu sous forme de liste chaînée.
begin
return lire_CSV_LC("routes.txt");
end;
function lire_arrets return ptr is
--Lis le fichier "stops.txt" et renvoie le contenu sous forme de liste chaînée.
begin
return lire_CSV_LC("stops.txt");
end;
function lire_trajets return ptr is
--Lis le fichier "stop_times" et renvoie le contenu sous forme de liste chaînée.
begin
return lire_CSV_LC("stop_times.txt");
end;
function rechercher_ligne(nom: unbounded_string) return unbounded_string is
-- Renvoie l'identifiant de la ligne correspondant au nom donné.
arret: ptr;
begin
arret := lire_routes;
while arret /= null and then arret.data(2) /= nom loop
arret := arret.next;
end loop;
if arret = null then
return to_unbounded_string("None");
else
return arret.data(1);
end if;
end;
function rechercher_arret(nom: unbounded_string) return ptr is
-- Renvoie la liste des arrêts ayant pour nom le nom donné.
arret: ptr;
result: ptr;
pt_temp : ptr;
begin
result := null;
arret := lire_trajets;
while arret /= null loop
if arret.data(5) = nom then
pt_temp := new chaine;
pt_temp.data := arret.data;
pt_temp.next := result;
result := pt_temp;
end if;
arret := arret.next;
end loop;
return result;
end;
function rechercher_trajets(route_id: unbounded_string) return ptr is
-- Renvoie la liste de tous les arrêts d'une ligne donnée par l'identifiant.
arret: ptr;
result: ptr;
pt_temp : ptr;
begin
result := null;
arret := lire_trajets;
while arret /= null loop
if arret.data(2) = route_id then
pt_temp := new chaine;
pt_temp.data := arret.data;
pt_temp.next := result;
result := pt_temp;
end if;
arret := arret.next;
end loop;
return result;
end;
function get_unbounded_string return unbounded_string is
-- Procédure permettent de récupérer une chaine de caractère
str: unbounded_string;
begin
skip_line;
str := get_line;
return str;
end;
procedure afficher_departs(nom: unbounded_string) is
-- Affiche tous les départs d'un arrêt donné par son nom.
arret: ptr;
begin
new_line;
arret := rechercher_arret(nom);
put("Prochains départs à partir de l'arrêt "); put(nom); put(" :"); new_line;
while arret /= null loop
put(" - Heure de départ: "); put(arret.data(4)); new_line;
arret := arret.next;
end loop;
new_line;
end;
procedure afficher_lignes is
-- Affiche le contenu de "routes.txt"
route: ptr;
begin
new_line;
route := lire_routes;
while route /= null loop
put("Ligne: "); put(route.data(3)); put(" : "); new_line;
put(" - Identifiant: "); put(route.data(1)); new_line;
put(" - Nom court: "); put(route.data(2)); new_line;
put(" - Type de transport: "); put(vehicules'val(integer'value(to_string(route.data(4))))); new_line;
new_line;
route := route.next;
end loop;
end;
procedure choix_possibles is
-- 0: Quitter
-- 1: Afficher toutes les lignes
-- 2: Afficher une ligne en particulier
-- 3: Donner tous les departs d'un arret
begin
put("Voici les actions possibles:"); new_line;
put(" 1: Afficher toutes les lignes"); new_line;
put(" 2: Afficher tous les arrets d'une ligne (entrer son nom)"); new_line;
put(" 3: Afficher tous les départs d'un arret (donner son nom)"); new_line;
new_line;
put(" 0: Quitter");new_line;
put("Quel est votre choix? ");
end;
procedure afficher_ligne(nom: unbounded_string) is
-- Affiche tous les arrêts d'une ligne complète donnée par son identifiant.
arret: ptr;
begin
new_line;
arret := rechercher_trajets(rechercher_ligne(nom));
put("Ligne "); put(arret.data(2)); put(":"); new_line;
while arret /= null loop
put(" Nom de l'arret: "); put(arret.data(5)); new_line;
put(" - Heure d'arrivée: "); put(arret.data(3)); new_line;
put(" - Heure de départ: "); put(arret.data(4)); new_line;
new_line;
arret := arret.next;
end loop;
end;
pointeur : ptr;
choix: integer;
entree: unbounded_string;
begin
choix_possibles;
get(choix);
while choix /= 0 loop
case choix is
when 1=> afficher_lignes;
when 2 => new_line; put("Donner la ligne désirée"); new_line; afficher_ligne(get_unbounded_string);
when 3 => new_line; put("Donner l'arret désirée"); new_line; afficher_departs(get_unbounded_string);
when others => put("Choix invalide");
end case;
choix_possibles;
get(choix);
end loop;
end;