pitypang201110.py
1    def kiir(ssz, szoveg):
2        print('{}. feladat - {}'.format(ssz, szoveg))
3    
4    
5    # -----------------------------------------------------------------------------
6    # 1. Olvassa be a pitypang.txt állományban található maximum 1000 foglalás
7    #    adatát, s annak felhasználásával oldja meg a következő feladatokat!
8    #    Ha az állományt nem tudja beolvasni, akkor a benne található adatok közül
9    #    az 1-5, 326-330 és 695-699 foglalási sorszámú sorok adatait jegyezze be a
10   #    programba, s úgy oldja meg a feladatokat!
11   # -----------------------------------------------------------------------------
12   kiir(1, 'Adatok beolvasása')
13   
14   # A szálloda eddigi foglalásait a pitypang.txt fájl tartalmazza. Az első
15   # sor a fájlban tárolt foglalások számát mutatja. A további sorokban
16   # szóközzel elválasztva soronként az alábbi adatok találhatók:
17   #   • a foglalás sorszáma,                      0
18   #   • a szoba száma (1–27),                     1
19   #   • az érkezés napjának sorszáma,             2
20   #   • a távozás napjának sorszáma,              3
21   #   • a vendégek száma,                         4
22   #   • kérnek-e reggelit (1=igen vagy 0=nem),    5
23   #   • a foglalást végző vendég nevéből képzett azonosítója
24   #     (maximum 25 karakter).                    6
25   # A napok sorszámozása január 1-jétől (1-es sorszám) kezdődik. Április 30-hoz
26   # például a 31 + 28 + 31 + 30 = 120-as sorszám tartozik.
27   # A Tóth család foglalása ebben a szerkezetben a következőképpen néz ki:
28   #      123 21 120 124 3 1 Toth_Balint
29   # A fájl egy éven belül tartalmaz foglalásokat. Az adatok az érkezés napja
30   # szerint növekvő sorrendben vannak rendezve a fájlban.
31   fbe = open('pitypang.txt', 'r')
32   
33   adatok = []
34   N = fbe.readline()
35   print(N)
36   for sor in fbe:
37       sor = sor.strip().split()
38       adatok.append(sor)
39   
40   fbe.close()
41   
42   fbe = open('honapok.txt', 'r')
43   honap = []  # csak a hónapok kezdőnapja kell
44   egy = []
45   i = 1
46   for sor in fbe:
47       egy.append(sor.rstrip())
48       if i % 3 == 0:
49           honap.append(int(sor.rstrip()))
50           egy = []
51       i += 1
52   honap.append(366)
53   # 366-os érték a decemberi érkezések miatt kell majd a 4. feladatban
54   fbe.close()
55   
56   # -----------------------------------------------------------------------------
57   # 2. Jelenítse meg a képernyőn a leghosszabb szállodai tartózkodást! Csak
58   #    az időtartamot vegye figyelembe, azaz nem számít, hogy hány vendég
59   #    lakott az adott szobában! Az esetlegesen azonos hosszúságú tartózkodások
60   #    közül bármelyiket kiválaszthatja. Az eredményt ebben a formában írja a
61   #    képernyőre: Név (érkezési_nap_sorszáma) – eltöltött_éjszakák_száma
62   #    Például: Nagy_Bertalan (105) – 16
63   # -----------------------------------------------------------------------------
64   kiir(2, 'Leghosszabb tartózkodás')
65   
66   # egyszerű maximumkeresési algoritmus
67   maxh = ['', '', 0]  # [Név,Érkezési nap sorszáma,Eltöltött éjszaka]
68   for adat in adatok:
69       ejszaka = int(adat[3]) - int(adat[2])
70       if ejszaka > maxh[2]:
71           maxh[0] = adat[6]  # név
72           maxh[1] = adat[0]  # foglalás sorszáma
73           maxh[2] = ejszaka
74   print('{} ({}) - {}'.format(maxh[0], maxh[1], maxh[2]))
75   
76   # -----------------------------------------------------------------------------
77   # 3. Számítsa ki, hogy az egyes foglalások után mennyit kell fizetnie az
78   #    egyes vendégeknek! A foglalás sorszámát és a kiszámított értékeket
79   #    kettősponttal elválasztva írja ki a bevetel.txt fájlba! Ez – a példában
80   #    szereplő Tóth család esetén – a következő lenne: 123:57200
81   # -----------------------------------------------------------------------------
82   kiir(3, 'Bevétel')
83   
84   fki = open('bevetel.txt', 'w')
85   
86   def szamol(adat):
87       # nyári időszak a 121. napon, míg az őszi a 244. napon kezdődik
88       fizet = 0
89       ejszaka = int(adat[3]) - int(adat[2])  # távozás-érkezés
90       if int(adat[2]) < 121:
91           fizet += 9000 * ejszaka  # tavaszi időszak ára szerint
92       elif int(adat[2]) > 243:
93           fizet += 8000 * ejszaka  # őszi időszak ára szerint
94       else:
95           fizet += 10000 * ejszaka  # nyári időszak ára szerint
96       if int(adat[4]) > 2:  # létszám>2 akkor pótágy is van
97           fizet += ejszaka * 2000
98       if adat[5] == '1':  # ha kérnek reggelit, akkor...
99           fizet += ejszaka * int(adat[4]) * 1100
100      return fizet
101  
102  for adat in adatok:
103      s = adat[0] + ':' + str(szamol(adat))
104      print(s, file=fki)
105  
106  fki.close()
107  
108  # -----------------------------------------------------------------------------
109  # 4. Készítsen statisztikát az egyes hónapokban eltöltött
110  #    vendégéjszakákról! Egy vendégéjszakának egy fő egy eltöltött éjszakája
111  #    számít. A példában szereplő Tóth család áprilisban 3, májusban pedig 9
112  #    vendégéjszakát töltött a szállodában. Írassa ki a havi vendégéjszakák
113  #    számát a képernyőre az alábbi formában: hónap_sorszáma: x vendégéj
114  #    például: 8: 1059 vendégéj
115  # -----------------------------------------------------------------------------
116  kiir(4, 'Statisztika a vendégéjszakákról')
117  
118  
119  #   • a foglalás sorszáma,                      0
120  #   • a szoba száma (1–27),                     1
121  #   • az érkezés napjának sorszáma,             2
122  #   • a távozás napjának sorszáma,              3
123  #   • a vendégek száma,                         4
124  #   • kérnek-e reggelit (1=igen vagy 0=nem),    5
125  #   • a foglalást végző vendég nevéből képzett azonosítója
126  #     (maximum 25 karakter).                    6
127  
128  def statisztika(adat):
129      # függvény logikája:
130  
131      # honapok.txt-ben: a fiktiv hónap nem véletlen ott az elején
132      # azért kellett, hogy a decemberi érkezésekkel ne legyen gond
133      # a keresések során
134  
135      #   aprilis
136      #   30
137      #   91
138      #   majus
139      #   31
140      #   121
141      # Például:
142      # ['296','16','110','122','2','0','Encsy_Gyorgy']
143      #             110 (4):121-110=11  (5):122-121=1
144      # érkezés napja melyik hónapban volt?
145      erkezes = int(adat[2])
146      tavozas = int(adat[3])
147      vsz = int(adat[4])
148      i = 0
149      while erkezes >= honap[i]:
150          i += 1
151      # érkezés napja i-1. hónapra esik (indexelés, ugye!)
152      # következő hónap kezdőnap-érkezés napja, ez megy az i-1.hónapba
153  
154      # távozás napja melyik hónapban volt?
155      j = 0
156      while tavozas >= honap[j]:
157          j += 1
158      # távozás napja-adott hónap kezdőnapja, ez megy a j-1.hónapba
159      if i == j:
160          v_ej = (tavozas - erkezes) * vsz  # ha nem volt "hónapváltás"
161          havi_stat[i - 1] += v_ej
162      else:
163          v_ej = (honap[i] - erkezes) * vsz  # feltételezzük, hogy több hónapos tartózkodás
164          havi_stat[i - 1] += v_ej  # nem volt
165          v_ej = (tavozas - honap[j - 1]) * vsz
166          havi_stat[j - 1] += v_ej
167  
168  havi_stat = [0] * 12
169  
170  for adat in adatok:
171      statisztika(adat)
172  
173  for i in range(12):
174      print('{}: {} vendégéj'.format(i + 1, havi_stat[i]))
175  
176  # -----------------------------------------------------------------------------
177  # 5. Kérje be a felhasználótól egy új foglalás kezdő dátumához tartozó nap
178  #    sorszámát és az eltöltendő éjszakák számát! Határozza meg, hogy hány
179  #    szoba szabad a megadott időszak teljes időtartamában! A választ írassa
180  #    ki a képernyőre!
181  # -----------------------------------------------------------------------------
182  kiir(5, 'Adott időben a szabad szobák száma')
183  
184  erk = int(input('Érkezési nap sorszáma: '))
185  ejsz = int(input('Éjszakák száma: '))
186  
187  # 27 szoba van, kezdetben mind legyen szabad, és ha mégsem, akkor legyen foglalt
188  szabad = [True] * 27
189  
190  for adat in adatok:
191      erkezes = int(adat[2])
192      tavozas = int(adat[3])
193      szoba = int(adat[1]) - 1  # indexelés
194      if (erkezes < erk + ejsz and tavozas > erk):  # ha kívánt intervallum le van fedve
195          szabad[szoba] = False  # akkor az a szoba foglalt
196  
197  szabad_db = 0
198  for sz in szabad:
199      if sz == True:
200          szabad_db += 1
201  print('Szabad szobák száma: {}'.format(szabad_db))