szojatek201105.py
1    def kiir(ssz, szoveg):
2        print('{}. feladat - {}'.format(ssz, szoveg))
3    
4    # -----------------------------------------------------------------------------
5    # 1. Kérjen be a felhasználótól egy szót, és döntse el, hogy tartalmaz-e
6    #    magánhangzót! Amennyiben tartalmaz, írja ki, hogy „Van benne
7    #    magánhangzó.”! Ha nincs, akkor írja ki, hogy „Nincs benne magánhangzó.”!
8    #    A begépelendő szóról feltételezheti, hogy csak az angol ábécé kisbetűit
9    #    tartalmazza. (Az angol ábécé magánhangzói: a, e, i, o, u.)
10   # -----------------------------------------------------------------------------
11   kiir(1, 'Magánhangzó')
12   
13   def mh(szo):
14       mh = set({'a', 'e', 'i', 'o', 'u'})  # halmaz
15       db = 0
16       for i in range(len(szo)):
17           if szo[i] in mh:  # in - benne van-e a halmazban
18               db += 1
19       return db
20   
21   szo = input('Kérek egy szót: ')
22   if mh(szo) > 0:
23       print('Van benne magánhangzó')
24   else:
25       print('Nincs benne magánhangzó')
26   
27   # -----------------------------------------------------------------------------
28   # 2. Írja ki a képernyőre, hogy melyik a leghosszabb szó a szoveg.txt
29   #    állományban, és az hány karakterből áll! Ha több azonos leghosszabb
30   #    hosszúságú szó is van a szógyűjteményben, akkor azok közül elegendő
31   #    egyetlen szót kiírnia. A feladatot úgy oldja meg, hogy tetszőleges
32   #    hosszúságú szövegállomány esetén működjön, azaz a teljes szöveget
33   #    ne tárolja a memóriában!
34   # -----------------------------------------------------------------------------
35   kiir(2, 'Leghosszabb szó')
36   fbe = open('szoveg.txt', 'r')
37   maxh = ''
38   for szo in fbe:
39       szo = szo.rstrip()  # szóvégén az entert "levágjuk"
40       if len(szo) > len(maxh):
41           maxh = szo
42   print('Leghosszabb szó: ', maxh)
43   fbe.close()
44   # -----------------------------------------------------------------------------
45   # 3. A magyar nyelv szavaiban általában kevesebb a magánhangzó, mint a
46   #    mássalhangzó. Határozza meg, hogy az állomány mely szavaiban van több
47   #    magánhangzó, mint egyéb karakter! Ezeket a szavakat írja ki a képernyőre
48   #    egy-egy szóközzel elválasztva! A szavak felsorolása után a mintának
49   #    megfelelően az alábbi adatokat adja meg:
50   #            • hány szót talált;
51   #            • hány szó van összesen az állományban;
52   #            • a talált szavak hány százalékát teszik ki az összes szónak!
53   #    A százalékot két tizedessel szerepeltesse! Például: 130/3000 : 4,33%
54   # -----------------------------------------------------------------------------
55   kiir(3, 'Több magánhangzós szavak')
56   
57   fbe = open('szoveg.txt', 'r')
58   szdb = 0
59   db = 0
60   for szo in fbe:
61       szo = szo.rstrip()
62       hossz = len(szo)  # szó teljes hossza
63       mhsz = mh(szo)  # magánhangzók száma
64       if mhsz > hossz - mhsz:
65           db += 1
66           print(szo, end=' ')
67       szdb += 1
68   print('\nTöbb magánhangzós szavak száma: ', db)
69   print('Szavak száma a forrásban: ', szdb)
70   print(f'A talált szavak aránya {db / szdb * 100:.2f}%')
71   fbe.close()
72   
73   # -----------------------------------------------------------------------------
74   # 4. Hozzon létre egy tömb vagy lista adatszerkezetet, és ebbe gyűjtse ki
75   #    a fájlban található ötkarakteres szavakat! A szoveg.txt állomány
76   #    legfeljebb 1000 darab ötkarakteres szót tartalmaz. Kérjen be a
77   #    felhasználótól egy 3 karakteres szórészletet! Írja ki a képernyőre a
78   #    szólétra építés szabályai szerint hozzá tartozó ötkarakteres szavakat a
79   #    tárolt adathalmazból! A kiírásnál a szavakat egy-egy szóköz válassza el!
80   #    (Teszteléshez használhatja például az „isz” vagy „obo” szórészleteket,
81   #    mert ezekhez a megadott szövegállományban több létraszó is tartozik.)
82   # -----------------------------------------------------------------------------
83   kiir(4, 'Ötbetűs szavak')
84   
85   fbe = open('szoveg.txt', 'r')
86   otosok = []
87   for szo in fbe:
88       szo = szo.rstrip()
89       if len(szo) == 5:
90           otosok.append(szo)
91   fbe.close()
92   
93   letra = input('Kérek egy háromkarakteres szöveget: ')
94   letra = letra[:3]  # mindenképpen 3 karakter legyen
95   
96   for egy in otosok:
97       if egy[1:4] == letra:  # a szó középső 3 karaktere index szerint
98           print(egy, end=' ')
99   print()
100  
101  # -----------------------------------------------------------------------------
102  # 5. Az eltárolt ötkarakteres szavakból csoportosítsa azokat a szavakat,
103  #    melyek ugyanannak a hárombetűs szórészletnek a létraszavai! Hozzon létre
104  #    egy letra.txt állományt, amelybe ezeket a szavakat írja az alábbiak
105  #    szerint:
106  #        • minden szó külön sorba kerüljön;
107  #        • csak olyan szó szerepeljen az állományban, aminek van legalább
108  #          egy párja, amivel egy létrát alkotnak (azaz első és utolsó
109  #          karakter nélkül megegyeznek);
110  #        • az egy létrához tartozó szavak közvetlenül egymás után
111  #          helyezkedjenek el;
112  #        • két létra szavai között egy üres elválasztó sor legyen!
113  # -----------------------------------------------------------------------------
114  kiir(5, 'Létraszavak')
115  N = len(otosok)
116  
117  # rendezzük be a szavakat a középső három karakter szerint
118  # egyszerű cserés rendezés
119  for i in range(N - 1):
120      for j in range(i + 1, N):
121          if otosok[i][1:4] > otosok[j][1:4]:
122              otosok[i], otosok[j] = otosok[j], otosok[i]
123  
124  fki = open('letra.txt', 'w')
125  
126  enter = False;
127  for i in range(1, N):
128      if otosok[i][1:4] == otosok[i - 1][1:4]:
129          print(otosok[i - 1], file=fki)
130          enter = True;
131      else:
132          if enter:
133              print(otosok[i - 1], file=fki)
134              print('', file=fki)
135          enter = False;  # ha megvolt az elválasztó sor, akkor kikapcsoljuk
136  fki.close()