lift200905.py
1    #-------------------------------------------------------------------------------
2    # 1. Olvassa be az igeny.txt állományban talált adatokat, s azok felhasználásá-
3    #    val oldja meg a következő feladatokat! Ha az állományt nem tudja beolvasni,
4    #    az első 8 igényhez tartozó adatokat jegyezze be a programba és dolgozzon
5    #    azzal!
6    #-------------------------------------------------------------------------------
7    def F1():
8        print('1. feladat - adatok beolvasása...')
9    
10       fbe=open('igeny.txt','r')
11   
12       global cspszam                  # 6. és 7. feladatban felhasználjuk
13       global szintek                  # 4. feladatban felhasználjuk
14       szintek=int(fbe.readline())     # forrásfájl első sora
15       cspszam=int(fbe.readline())     # ... második
16       igenyszam=int(fbe.readline())   # ... harmadik
17       for sor in fbe:                 # további sorok...
18           sor=sor.strip().split()     # lista lesz a sorból
19           sor=list(map(int,sor))      # a lista elemeit integerré alakítjuk
20           igenyek.append(sor)         # a lista "megy" a mátrixba
21   
22       fbe.close()
23       
24       print('-------------------------------------------------------------------')
25   
26   #-------------------------------------------------------------------------------
27   # 2. Tudjuk, hogy a megfigyelés kezdetén a lift éppen áll. Kérje be a felhaszná-
28   #    lótól, hogy melyik szinten áll a lift, és a további részfeladatok megoldá-
29   #    sánál ezt vegye figyelembe! Ha a beolvasást nem tudja elvégezni, használja
30   #    az igény.txt fájlban az első igény induló szintjét!
31   #-------------------------------------------------------------------------------
32   def F2():
33       print('\n2. feladat')
34       global hely                     # 5. feladatban felhasználjuk
35       hely=int(input('Kérem a lift indulási helyét! '))
36       print('-------------------------------------------------------------------')
37   
38   #-------------------------------------------------------------------------------
39   # 3. Határozza meg, hogy melyik szinten áll majd a lift az utolsó kérés teljesí-
40   #    tését követően! Írja képernyőre a választ a következőhöz hasonló formában:
41   #    „A lift a 33. szinten áll az utolsó igény teljesítése után.” !
42   #-------------------------------------------------------------------------------
43   def F3():
44       print('\n3. feladat')
45       utolso=igenyek[-1][5]           # a mátrix utolsó elemének indexe: -1
46       print(f'A lift a {utolso}. szinten áll az utolsó igény teljesítése után.')
47       print('-------------------------------------------------------------------')
48   
49   #-------------------------------------------------------------------------------
50   # 4. Írja a képernyőre, hogy a megfigyelés kezdete és az utolsó igény teljesí
51   #    tése között melyik volt a legalacsonyabb és melyik a legmagasabb sorszámú
52   #    szint, amelyet a lift érintett!
53   #-------------------------------------------------------------------------------
54   def F4():
55       print('\n4. feladat')
56       min_sz=szintek                  # minimumnak a legnagyobb értéket adjuk,
57       max_sz=0                        # maximumnak a legkisebbet, majd...
58       for igeny in igenyek:
59           # induló és cél szint minimuma és a "vélt" minimum közül a kisebbet vesszük
60           min_sz=min(min_sz,min(igeny[4],igeny[5]))
61           # induló és cél szint maximuma és a "vélt" maximum közül a nagyobbat vesszük
62           max_sz=max(max_sz,max(igeny[4],igeny[5]))
63       print(f'A legalacsonyabb szint: {min_sz}')
64       print(f'A legmagasabb szint: {max_sz}')
65       print('-------------------------------------------------------------------')
66       
67   #-------------------------------------------------------------------------------
68   # 5. Határozza meg, hogy hányszor kellett a liftnek felfelé indulnia utassal és
69   #    hányszor utas nélkül! Az eredményt jelenítse meg a képernyőn!
70   #-------------------------------------------------------------------------------
71   def F5():
72       print('\n5. feladat')
73       aktual=hely         # ez az a hely, ahol a legelején áll a lift (lsd. 2. feladat)
74       ures=0              # megfelelő számlálók inicializálása
75       utas=0
76       for igeny in igenyek:       # végigmegyünk az igényeken...
77           if igeny[4]<igeny[5]:   # ha induló szint kisebb, akkor felfelé megy utassal
78               utas+=1             # ... számláló növelése
79           if igeny[4]>aktual:     # ha a lift alacsonyabb szinten van a híváskor, 
80               ures+=1             # akkor üresen megy fel a szerelőkhöz
81           aktual=igeny[5]         # ahol kiszállnak az lesz az "új" altuális hely
82       
83       print(f'A lift {utas} alkalommal ment felfelé utasokkal')
84       print(f'A lift {ures} alkalommal ment felfelé utasok nélkül')
85       print('-------------------------------------------------------------------')
86   
87   #-------------------------------------------------------------------------------
88   # 6. Határozza meg, hogy mely szerelőcsapatok nem vették igénybe a liftet a
89   #    vizsgált intervallumban! A szerelőcsapatok sorszámát egymástól egy-egy
90   #    szóközzel elválasztva írja a képernyőre!
91   #-------------------------------------------------------------------------------
92   def F6():
93       print('\n6. feladat')
94       csapatok=[0]*cspszam        # megszámoljuk, hogy a csapatok hányszor
95                                   # szerepelnek a mátrixunkban
96                                   
97       for igeny in igenyek:
98           # az igenyben szereplő csapatszám indexeli a csapatokat
99           # https://odorpeter.hu/tippek_trukkok.html#2
100          csapatok[igeny[3]-1]+=1 
101  
102      global nem          # következő feladatban felhasználjuk
103      nem=set()           # ebben a halmazban gyűjtjük a nem szereplő csapatokat
104      print('Ezek a szerelőcsapatok nem vették igénybe a liftet:')
105  
106      # szükségünk lesz a csapatok szereplési száma mellett a sorszámukra is,
107      # ezért használjuk az enumerate függvényt, 1-től indítva a számozást
108      for i,csapat in enumerate(csapatok,start=1):
109          if csapat==0:       # ha nem szerepel "megy" a halmazba
110              nem.add(i)
111              print(i,end=' ')
112      print('\n-------------------------------------------------------------------')
113  
114  #-------------------------------------------------------------------------------
115  # 7. Előfordul, hogy egyik vagy másik szerelőcsapat áthágja a szabályokat, és
116  #    egyik szintről gyalog megy a másikra. (Ezt onnan tudhatjuk, hogy más emele-
117  #    ten igényli a liftet, mint ahova korábban érkezett.) Generáljon véletlen-
118  #    szerűen egy létező csapatsorszámot! (Ha nem jár sikerrel, dolgozzon a
119  #    3. csapattal!) Határozza meg, hogy a vizsgált időszak igényei alapján lehet
120  #    -e egyértelműen bizonyítani, hogy ez a csapat vétett a szabályok ellen!
121  #    Ha igen, akkor adja meg, hogy melyik két szint közötti utat tették meg gya-
122  #    log, ellenkező esetben írja ki a Nem bizonyítható szabálytalanság szöveget!
123  #-------------------------------------------------------------------------------
124  def F7():
125      print('\n7. feladat')
126      # 3, 12, 19
127      global csapat               # 8. feladatban is kell
128      while True:                             # addig generálunk csapatszámot, amíg
129          csapat=random.randint(1,cspszam)    # olyan nem lesz, ami tényleg szerepel
130          if csapat not in nem:               # a mátrixban (forrásfájlban)
131              break
132      print(f'A véletlenszerűen kiválasztott csapat: {csapat}')
133      
134      gyalog=False                # gyalog mennek-e a szerelők
135      kezd=True                   # az adott csapat először kezdő állapotát nézem-e
136      for igeny in igenyek:
137          if igeny[3]==csapat:    # megvan a csapatunk
138              if kezd:            # most kezdjük vele a viszgálatot
139                  kiszallas=igeny[5]  # ahol kiszállnak a liftből
140                  kezd=False          # innentől már nem kezdőállapotot nézünk majd
141              else:               # ez már nem kezdőállapot
142                  if igeny[4]!=kiszallas:     # ha a beszállási hely eltér attól ahol
143                                              # előzőleg hagyták a liftet, akkor
144                                              # gyalog mentek a két szint között
145                      print(f'Gyalogosan közlekedtek a(z) {kiszallas}. ', end='')
146                      print(f'és  a(z) {igeny[4]}. szint között!')
147                      gyalog=True         # volt gyaloglás
148                  kiszallas=igeny[5]      # ezt ne felejtsük el aktualizálni...
149                          
150      if not gyalog:      # ha nem volt gyaloglás a vizsgálat végén, akkor...
151          print('Nem bizonyítható szabálytalanság!')
152          
153      print('-------------------------------------------------------------------')
154  
155  #-------------------------------------------------------------------------------
156  # 8. A munkák elvégzésének adminisztrálásához minden csapatnak egy blokkoló kár-
157  #    tyát kell használnia. A kártyára a liftben elhelyezett blokkolóóra rögzíti
158  #    az emeletet, az időpontot. Ennek a készüléknek a segítségével kell megadni
159  #    a munka kódszámát és az adott munkafolyamat sikerességét. A munka kódja 1
160  #    és 99 közötti egész szám lehet. A sikerességet a „befejezett” és a „befeje-
161  #    zetlen” szavakkal lehet jelezni.
162  #    Egy műszaki hiba folytán az előző feladatban vizsgált csapat kártyájára az
163  #    általunk nyomon követett időszakban nem került bejegyzés. Ezért a csapatfő-
164  #    nöknek a műszak végén pótolnia kell a hiányzó adatokat. Az igeny.txt állo-
165  #    mány adatait felhasználva írja a képernyőre időrendben, hogy a vizsgált
166  #    időszakban milyen kérdéseket tett fel az óra, és kérje be az adott válaszo-
167  #    kat a felhasználótól! A pótlólag feljegyzett adatokat írja a blokkol.txt
168  #    állományba!
169  #-------------------------------------------------------------------------------
170  def F8():
171      # magánvélemény: ez a feladat egy hülyeség... :)
172      print('\n8. feladat - adatok kiírása...')
173      fki=open('blokkol.txt','w')
174      for igeny in igenyek:
175          if igeny[3]==csapat:
176              print(f'Indulási emelet: {igeny[4]}')
177              print(f'Indulási emelet: {igeny[4]}',file=fki)
178              print(f'Célemelet: {igeny[5]}')
179              print(f'Célemelet: {igeny[5]}',file=fki)
180              fkod=int(input('Feladatkód: '))
181              print(f'Feladatkód: {fkod}',file=fki)
182              print(f'Befejezés ideje: {igeny[0]}:{igeny[1]}:{igeny[2]}')
183              print(f'Befejezés ideje: {igeny[0]}:{igeny[1]}:{igeny[2]}',file=fki)
184              siker=input('Sikeresség: ')
185              print(f'Sikeresség: {siker}',file=fki)
186      fki.close()
187      
188  #------------------------------- F Ő M O D U L -------------------------------
189  import random
190  igenyek=[]
191  F1()
192  F2()
193  F3()
194  F4()
195  F5()
196  F6()
197  F7()
198  F8()
199          
200