1 from math import sqrt as sq 2 class krater: 3 def __init__(self, x, y, r, nev): 4 self.x = x 5 self.y = y 6 self.r = r 7 self.nev = nev 8 9 def __repr__(self): 10 return str((self.x, self.y, self.r, self.nev)) 11 12 kraterek = [] # lista az adatok tárolására 13 # ------------------------------------------------------------------------------------- 14 # 1. Olvassa be és tárolja el a bemeneti állomány tartalmát! Az állományban legfeljebb 15 # 100 kráter adatai szerepelnek. 16 # ------------------------------------------------------------------------------------- 17 fbe = open('felszin_tpont.txt','r') 18 for sor in fbe: 19 sor = sor.strip().split('\t') 20 sor[0:3] = map(float,sor[0:3]) 21 kraterek.append(krater(sor[0],sor[1],sor[2],sor[3])) 22 fbe.close() 23 # ------------------------------------------------------------------------------------- 24 # 2. Számolja meg, hogy hány kráter található a bemeneti állományban, és írja a 25 # képernyőre a kráterek számát! 26 # ------------------------------------------------------------------------------------- 27 print('2. feladat') 28 print(f'A kráterek száma: {len(kraterek)}') 29 # ------------------------------------------------------------------------------------- 30 # 3. Kérje be a felhasználótól egy kráter pontos nevét, majd írja ki a kráter adatait! 31 # A kiírás egy teljes mondat legyen, például: "A(z) Stephen Hawking középpontja 32 # X=3.45 Y=2.78 sugara R=0.35.". Ha a név nem szerepel a kráterek nevei között, 33 # akkor írja ki: "Nincs ilyen nevű kráter.". 34 # ------------------------------------------------------------------------------------- 35 print('3. feladat') 36 krater_nev = input('Kérem egy kráter nevét: ') 37 i = 0 38 while i < len(kraterek) and kraterek[i].nev != krater_nev: 39 i += 1 40 if i < len(kraterek): 41 print(f'A(z) {kraterek[i].nev} középpontja X={kraterek[i].x} Y={kraterek[i].y} sugara R={kraterek[i].r}.') 42 else: 43 print('Nincs ilyen nevű kráter.') 44 # ------------------------------------------------------------------------------------- 45 # 4. Vizsgálja meg a szonda által kapott adatokat, és adja meg a legnagyobb sugarú 46 # kráter sugarát és névadójának nevét! Amennyiben több legnagyobb kráter van, úgy 47 # elég az egyiket megadnia. 48 # ------------------------------------------------------------------------------------- 49 print('4. feladat') 50 # max_r = max(kraterek, key = lambda elem: elem.r) 51 # print(f'A legnagyobb kráter neve és sugara: {max_r.nev} {max_r.r}') 52 # rendezéssel, ezt egy későbbi feladatban fel tudjuk használni (7. feladatban) 53 rend = sorted(kraterek, key = lambda elem: elem.r, reverse = True) 54 print(f'A legnagyobb kráter neve és sugara: {rend[0].nev} {rend[0].r}') 55 # ------------------------------------------------------------------------------------- 56 # 5. A következő feladatokban szüksége lesz arra, hogy kiszámítsa két kráter közép- 57 # pontjának távolságát. Készítsen függvényt, amely a Pitagorasz-tétel felhaszná- 58 # lásával kiszámítja két, koordinátákkal adott pont távolságát! 59 # A függvény bemenete a két pont, (x1, y1) és (x2, y2) koordinátái (valós számok), 60 # visszaadott értéke a távolságuk (valós szám). A függvény leírása a következő: 61 # Függvény tavolsag(x1, y1, x2, y2 : Valós ) : Valós 62 # tavolsag := Négyzetgyök((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)) 63 # Függvény vége 64 # ------------------------------------------------------------------------------------- 65 def tavolsag(x1, y1, x2, y2): 66 return sq(pow((x2-x1),2)+pow((y2-y1),2)) 67 # ------------------------------------------------------------------------------------- 68 # 6. Két kráter nem fedi át egymást, nincs közös részük, ha középpontjaik távolsága 69 # nagyobb, mint a két kráter sugarának összege. Kérje be egy kráter nevét, és adja 70 # meg azoknak a krátereknek a nevét, amelyekkel a bekért kráternek nincs közös része! 71 # A kiírásban szereplő kráterek nevei között egy vessző és egy szóköz legyen az 72 # elválasztás! Ha nincs ilyen kráter, akkor nem kell megjelenítenie semmit. 73 # ------------------------------------------------------------------------------------- 74 print('6. feladat') 75 krater_nev = input('Kérem egy kráter nevét: ') 76 i = 0 77 while i < len(kraterek) and kraterek[i].nev != krater_nev: 78 i += 1 79 if i < len(kraterek): # megtaláltuk a megadott nevű krátert 80 print('Nincs közös része:', end = ' ') 81 x = kraterek[i].x 82 y = kraterek[i].y 83 r = kraterek[i].r 84 for krater in kraterek: 85 if krater.nev != krater_nev: 86 if tavolsag(x, y, krater.x, krater.y) > r + krater.r: 87 print(krater.nev, end = ', ') 88 print() 89 else: 90 print('Nincs ilyen nevű kráter.') 91 # ------------------------------------------------------------------------------------- 92 # 7. Egy kráter tartalmaz egy másik krátert, ha a kisebb kráter teljes egészében a nagy 93 # kráterben található. Ez körök esetében azt jelenti, hogy a két kör középpontjának 94 # távolsága kisebb, mint a nagyobb kör sugarának és a kisebb kör sugarának különb- 95 # sége. Vizsgálja meg a krátereket, és írja ki azoknak a krátereknek a nevét, 96 # amelyek esetében a nagyobb kráter tartalmazza a kisebb krátert! Minden ilyen 97 # tartalmazást csak egyszer jelenítsen meg úgy, hogy megadja, hogy melyik kráter 98 # tartalmazza a másikat! 99 # ------------------------------------------------------------------------------------- 100 print('7. feladat') 101 # sugár szerint csökkenően rendezett listán megyünk végig 102 for i in range(len(rend) - 1): 103 for j in range(i + 1, len(rend)): 104 if tavolsag(rend[i].x, rend[i].y, rend[j].x, rend[j].y) < (rend[i].r - rend[j].r): 105 print(f'A(z) {rend[i].nev} kráter tartalmazza a(z) {rend[j].nev} krátert.') 106 # ------------------------------------------------------------------------------------- 107 # 8. A kráterek adatai alapján számítsa ki, hogy mekkora területűek az egyes kráterek, 108 # és készítsen egy terulet.txt szöveges állományt, amely tartalmazza a kráterek 109 # nevét és területét! A kör területe 𝑇 = r²𝜋, ahol r a kör sugara, 𝜋 értéke két 110 # tizedesjegyre kerekítve 3.14. Az állomány minden egyes sorában egy kráter adatai 111 # szerepeljenek: először a kráter területe két tizedesjegyre kerekítve, majd egy 112 # tabulátor karakter, majd a kráter neve! 113 # ------------------------------------------------------------------------------------- 114 print('8. feladat - terulet.txt') 115 fki = open('terulet.txt','w') 116 pi = 3.14 117 for krater in kraterek: 118 print(f'{pow(krater.r,2)*pi:.2f}\t{krater.nev}') # mehet képernyőre is 119 print(f'{pow(krater.r,2)*pi:.2f}\t{krater.nev}', file = fki) 120 fki.close() 121