1 def kiir(ssz,szoveg): 2 print('{}. feladat - {}'.format(ssz,szoveg)) 3 4 #----------------------------------------------------------------------------- 5 # 1. Olvassa be az ip.txt állományban talált adatokat, s annak 6 # felhasználásával oldja meg a következő feladatokat! 7 #----------------------------------------------------------------------------- 8 kiir(1,'Adatok beolvasása') 9 fv=open('ip.txt','r') 10 11 ip_cimek=[] #egyszerű listában tároljuk az adatokat, minden elem egy sztring 12 for ip in fv: 13 ip_cimek.append(ip.rstrip()) 14 fv.close() 15 16 #----------------------------------------------------------------------------- 17 # 2. Határozza meg és írja a képernyőre, hogy hány adatsor van az állományban! 18 #----------------------------------------------------------------------------- 19 kiir(2,'Adatsorok száma') 20 21 print(f'Az állományban {len(ip_cimek)} darab adatsor van.') 22 23 #----------------------------------------------------------------------------- 24 # 3. Írja a képernyőre az állományban található legalacsonyabb IP-címet! 25 # A megoldásában felhasználhatja, hogy a betűk ASCII-kódjai a számok 26 # ASCII-kódjai után találhatók a kódtáblában. 27 #----------------------------------------------------------------------------- 28 kiir(3,'Legalacsonyabb IP-cím') 29 30 ip_cimek2=sorted(ip_cimek) #rendezéssel oldjuk meg ezt a feladatot 31 print('A legalacsonyabb tárolt IP-cím:') 32 print(ip_cimek2[0]) 33 34 #----------------------------------------------------------------------------- 35 # 4. Határozza meg, hogy az állományban hány darab IP-cím van az egyes 36 # fajtákból! Az eredményt jelenítse meg a képernyőn a mintának megfelelően! 37 #----------------------------------------------------------------------------- 38 kiir(4,'IP-címek fajtánként') 39 # 2001:0db8 - dokumentációs címek 40 # 2001:0e - globális egyedi címek 41 # fc és fd - helyi egyedi címek 42 ip_fajta=[0]*3 43 #megszámlálás, semmi más... 44 for ip in ip_cimek: 45 if ip[:9]=='2001:0db8': 46 ip_fajta[0]+=1 47 if ip[:7]=='2001:0e': 48 ip_fajta[1]+=1 49 if ip[:2]=='fc' or ip[:2]=='fd': 50 ip_fajta[2]+=1 51 52 print('Dokumentációs cím: {} darab'.format(ip_fajta[0])) 53 print('Globális egyedi cím: {} darab'.format(ip_fajta[1])) 54 print('Helyi egyedi cím: {} darab'.format(ip_fajta[2])) 55 56 #----------------------------------------------------------------------------- 57 # 5. Gyűjtse ki a sok.txt állományba azokat az IP-címeket, melyek legalább 58 # 18 nullát tartalmaznak! A fájlban minden sor elején szerepeljen az eredeti 59 # állományból a cím sorszáma! Ezt kövesse egy szóközzel elválasztva a cím 60 # az ip.txt állományban szereplő alakjával! 61 #----------------------------------------------------------------------------- 62 kiir(5,'Legalább 18 nullát tartalmazó címek') 63 64 sok=open('sok.txt','w') 65 66 #"kihasználjuk" a Pythont: count 67 for i in range(len(ip_cimek)): 68 if ip_cimek[i].count('0')>=18: 69 print(str(i)+' '+ip_cimek[i], file=sok) 70 71 sok.close() 72 73 #----------------------------------------------------------------------------- 74 # 6. Kérjen be a felhasználótól egy sorszámot! Az állományban a megadott 75 # sorszámon található IP-címet rövidítse a csoportokon belüli bevezető 76 # nullák elhagyásával! Az állományban található alakot és a rövidített 77 # változatot írja a képernyőre egymás alá! 78 #----------------------------------------------------------------------------- 79 kiir(6,'IP-cím rövidítése') 80 81 # bevezető nullák elhagyása: 82 # eredeti: 2001:0db8:03cd:0000:0000:ef45:0006:0123 83 # rövidített: 2001:db8:3cd:0:0:ef45:6:123 84 85 #függvény, csak hogy "rend" legyen... :) 86 def rovidites(ipc): 87 reszek=[] #listát készítünk az ip címeből 88 reszek=ip_cimek[s].split(':') #úgy, hogy a : a szeparáló elem 89 uj_ip=[] #az új, rövidített cím ebben lesz 90 for resz in reszek: 91 resz=':'+resz #a reszek lista elemei elé : kerül, hogy... 92 while resz.startswith(':0'): #vizsgálhassuk a ':0' esetet 93 resz=resz.replace(':0',':') #és addig cseréljük a ':0'-t, amíg van 94 if resz==':': #ha csak ennyi "maradna" a reszből 95 resz=':0' #akkor kiegészítjük egy nullával 96 uj_ip.append(resz) #készül az új cím listája 97 uj_ip=''.join(uj_ip) #szöveggé alakítjuk a listát 98 uj_ip=uj_ip[1:] #az elején ':' van, ezért azt kihagyjuk 99 return uj_ip 100 101 s=int(input('Kérek egy sorszámot: '))-1 102 rovid_ip=rovidites(ip_cimek[s]) 103 print('Az ip-cím: ',ip_cimek[s]) 104 print('Az új cím: ',rovid_ip) 105 106 #----------------------------------------------------------------------------- 107 # 7. Az előző feladatban használt IP-címet rövidítse tovább az egymást követő 108 # nullás csoportok rövidítésére vonatkozó szabályoknak megfelelően! 109 # Az eredményt jelenítse meg a képernyőn! Amennyiben nem rövidíthető, 110 # írja ki: „Nem rövidíthető tovább.”! 111 #----------------------------------------------------------------------------- 112 kiir(7,'IP-cím további rövidítése') 113 114 #leghosszabb rövidíthető sorozat keresése 115 ip_lst=rovid_ip.split(':') #ismét listát csinálunk a ip-címből 116 maxh=0 #leghosszabb ':0' sorozat hossza ebben lesz 117 db=0 #számoljuk az egymást követő '0' értékű elemeket az ip_lst-ban 118 for i in range(len(ip_lst)): 119 if ip_lst[i]=='0': #ha a listaelem 0, akkor 120 db+=1 #elkezdjük számolni, hogy hány ilyen van sorozatban 121 else: #ha nem 0 a listaelem, akkor megnézzük: 122 if db>maxh: #ez-e a maximum 123 maxh=db #ha igen, akkor mennyiségét és helyét eltároljuk 124 hely=i-db 125 db=0 #db nullázása, mert lehet még ennél hosszabb eset is 126 127 if maxh<=1: #ha max<=1, akkor max egy 0 volt a listában, így nem rövidíthető 128 print('Nem rövidíthető tovább!') 129 else: 130 for i in range(maxh): #egyébként 131 ip_lst.pop(hely) #"kitörölgetjük" a nullákat 132 ip_lst.insert(hely,'') #a kitörlgetett elemek helyett egy "üres" elem lesz 133 ip=':'.join(ip_lst) #majd szöveggé alakítjuk : karakterrel "tagolva" 134 #a listát 135 print('Tovább rövidítve: ',ip)