-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.py
388 lines (243 loc) · 13 KB
/
main.py
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
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
# -*- coding: utf-8 -*-
"""
Projet Algo 1
OOMS Aur��lien
BA1 INFO
"""
from os import system
class Patient:
def __init__(self,ticket,name,language):
self.__ticket = ticket #ordre dans la file d'attente
self.__name = name #nom du patient
self.__language = language #langue du patient
def getTicket(self):
return self.__ticket
def getName(self):
return self.__name
def getLanguage(self):
return self.__language
def setTicket(self,newTicket):
self.__ticket = newTicket
def setName(self,newName):
self.__name = newName
def setLanguage(self,newLanguage):
self.__language = newLanguage
class Docteur:
def __init__(self,ticket,name,language,disposable = True):
self.__ticket = ticket #ordre dans la file d'attente
self.__name = name #nom du patient
self.__language = language #langue du patient
self.__disposable = disposable
def getTicket(self):
return self.__ticket
def getName(self):
return self.__name
def getLanguage(self):
return self.__language
def getDisposable(self):
return self.__disposable
def setTicket(self,newTicket):
self.__ticket = newTicket
def setName(self,newName):
self.__name = newName
def setLanguage(self,newLanguage):
self.__language = newLanguage
def setDisposable(self,newDisposable):
self.__disposable = newDisposable
class FileLangues:
"""
File selon le principe FIFO
Le patient "factice" sert �� r��cup��rer certaines erreurs lorsque la liste est vide, lors d'une insertion, on ins��re donc ��
l'indice 1 et non 0. On utilise un dictionnaire pour limiter la recherche d'��l��ment lors d'un remove. L'attribut nbrPatients
permet d'enregistrer la taille de la file et donc de ne pas compter les ��l��ments lors d'un appel �� size()
NB: 'f' est > que n'importe quel entier et certains noms d'attributs font penser qu'il s'agit uniquement de la file d'attente
alors que cette classe est ��galement utilis��e afin de donner un ordre aux diff��rents m��decins.
"""
def __init__(self):
self.__file = {}
self.__indicesA = ['f'] #indice des objets parlant la langue A
self.__indicesB = ['f'] #indice des objets parlant la langue B
self.__indicesAB = ['f'] #indice des objets parlant la langue AB
self.__nbrPatients = 0 #nombre d'objets dans la file
def getFile(self):
return self.__file
def isEmpty(self):
return self.__nbrPatients == 0
def insert(self,patient):
if patient.getLanguage() not in 'AB':
raise #n'arrive jamais lors de l'utilisation de l'interface, car on teste si la langue est correcte
else:
self.__nbrPatients += 1
#ins��re dans la liste d'indice appropri��e et dans la file
if patient.getLanguage() == 'A':
self.__file[patient.getTicket()] = patient
self.__indicesA.insert(1,patient.getTicket()) #insert est ici l'op��rateur sur les listes Python
elif patient.getLanguage() == 'B':
self.__file[patient.getTicket()] = patient
self.__indicesB.insert(1,patient.getTicket()) #insert est ici l'op��rateur sur les listes Python
elif patient.getLanguage() == 'AB':
self.__file[patient.getTicket()] = patient
self.__indicesAB.insert(1,patient.getTicket()) #insert est ici l'op��rateur sur les listes Python
def size(self):
return self.__nbrPatients
def removeA(self):
key = None
try:
#retourne 255 si seul l'��lement factice est pr��sent dans les sous-listes
key2 = min(self.__indicesA[-1],self.__indicesAB[-1])
#cherche le ticket minimum et pop en cons��quence
if type(key2) == int:
if key2 == self.__indicesA[-1]:
self.__indicesA.pop()
else:
self.__indicesAB.pop()
key = key2
self.__nbrPatients -= 1
return self.__file.pop(key)
except:
return 255
def removeB(self):
key = None
try:
#retourne 255 si seul l'��lement factice est pr��sent dans les sous-listes
key2 = min(self.__indicesB[-1],self.__indicesAB[-1])
#cherche le ticket minimum et pop en cons��quence
if type(key2) == int:
if key2 == self.__indicesB[-1]:
self.__indicesB.pop()
else:
self.__indicesAB.pop()
key = key2
self.__nbrPatients -= 1
return self.__file.pop(key)
except:
return 255
def remove(self):
key = None
try:
#retourne 255 si seul l'��lement factice est pr��sent dans les sous-listes
key2 = min(self.__indicesA[-1],self.__indicesB[-1],self.__indicesAB[-1])
#cherche le ticket minimum et pop en cons��quence
if type(key2) == int:
if key2 == self.__indicesA[-1]:
self.__indicesA.pop()
elif key2 == self.__indicesB[-1]:
self.__indicesB.pop()
else:
self.__indicesAB.pop()
key = key2
self.__nbrPatients -= 1
return self.__file.pop(key)
except:
return 255
def __repr__(self):
out = ''
keys = self.__file.keys()
for key in keys:
try:
if self.__file[key].getDisposable(): #n'affiche pas les m��decins non disponibles
out += '#' + str(key) + ' ' + str(self.__file[key].getName()) + ' : ' + str(self.__file[key].getLanguage()) +'\n'
except:
out += '#' + str(key) + ' ' + str(self.__file[key].getName()) + ' : ' + str(self.__file[key].getLanguage()) +'\n'
if out == '':
out = 'Cette file est vide'
return out
def display(filePatient,fileMedecin,cabinets):
"""
Fonction qui affiche la file d'attente, les m��decins disponibles et les consultations en cours.
"""
print "FILE D'ATTENTE :\n"
print filePatient
print
print "MEDECINS DISPONIBLES :\n"
print fileMedecin
print
print "CONSULTATIONS EN COURS :\n"
if cabinets == []:
print 'Il n\'y a aucune consulation en cours.'
else:
for consultation in cabinets:
print '@ M��decin : ' + consultation[0].getName() + ' Patient : ' + consultation[1].getName()
print
def interface():
done = False
ticketPatient = 0 #ticket d��terminant l'ordre d'arriv��e
ticketMedecin = 0 #Donne ��galement un ordre au m��decin pour que ceux-ci traitent un nombre ��gale de patients
filePatient = FileLangues()
fileMedecin = FileLangues()
cabinets = []
while not done:
system('clear')
CMD = '-1'
while CMD not in '1234':
display(filePatient,fileMedecin,cabinets)
CMD = raw_input('1 -- > Rajouter un patient dans la file d\'attente\n\
2 -- > Indiquer qu\'un m��decin est arriv�� �� l\'h��pital\n\
3 -- > Indiquer qu\'un m��decin est disponible\n\
4 -- > Fermeture du programme\n\nCHOIX : ')
system('clear')
if CMD == '1':
print 'Vous avez choisi de rajouter un patient �� la file d\'attente'
ticketPatient += 1
name = raw_input('Nom du patient : ')
language = 'C'
while language not in 'AB':
system('clear')
print 'Le nom du patient est : ' + name
language = raw_input('Langue du patient (A, B ou AB) : ')
filePatient.insert(Patient(ticketPatient,name,language))
elif CMD == '2':
print 'Vous avez choisi d\'indiquer qu\'un m��decin venait d\'arriver �� l\'h��pital'
ticketMedecin += 1
name = raw_input('Nom du m��decin : ')
language = 'C'
while language not in 'AB':
system('clear')
print 'Le nom du m��decin est : ' + name
language = raw_input('Langue du m��decin (A, B ou AB) : ')
fileMedecin.insert(Docteur(ticketMedecin,name,language))
elif CMD == '3':
name = raw_input('Nom du m��decin : ')
system('clear')
found = False
for item in fileMedecin.getFile().items():
if item[1].getName() == name:
if fileMedecin.getFile()[item[0]].getDisposable():
raw_input('Le m��decin '+ name +' est d��j�� disponible.')
found = True
else:
fileMedecin.getFile()[item[0]].setDisposable(True)
for tupIe in cabinets:
if tupIe[0] == fileMedecin.getFile()[item[0]]:
cabinets.remove(tupIe)
ticketMedecin += 1
fileMedecin.getFile()[item[0]].setTicket(ticketMedecin)
fileMedecin.getFile()[ticketMedecin] = fileMedecin.getFile().pop(item[0])
#update du ticket qui permet une bonne r��partition des patients entre les m��decins
raw_input('Le m��decin '+ name+' est maintenant disponible.')
found = True
if not found:
raw_input('Il n\'existe aucun m��decin du nom de ' + name +'.')
elif CMD == '4':
done = True
if CMD in '123':
doctorAvailable = True
if not fileMedecin.isEmpty():
for index in fileMedecin.getFile().keys():
if fileMedecin.getFile()[index].getDisposable():
if fileMedecin.getFile()[index].getLanguage() == 'A':
patient = filePatient.removeA()
if patient != 255:
fileMedecin.getFile()[index].setDisposable(False)
cabinets.append((fileMedecin.getFile()[index],patient))
elif fileMedecin.getFile()[index].getLanguage() == 'B':
patient = filePatient.removeB()
if patient != 255:
fileMedecin.getFile()[index].setDisposable(False)
cabinets.append((fileMedecin.getFile()[index],patient))
else:
patient = filePatient.remove()
if patient != 255:
fileMedecin.getFile()[index].setDisposable(False)
cabinets.append((fileMedecin.getFile()[index],patient))
interface()