kraterek.py
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