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))