You are on page 1of 41

Programozási alapismeretek

3. előadás
Tartalom

➢ Ciklusok
specifikáció+„algoritmika”+kódolás
➢ Tömbök
ELTE
➢ Egy bevezető példa a tömbhöz
➢ Sorozatok –tömbök
➢ Elágazás helyett tömb
➢ Konstans tömbök

2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 2/41


Ciklusok

Feladat:
Határozd meg egy természetes szám
(N>1) 1-től különböző legkisebb osztóját!
ELTE Specifikáció:
➢ Bemenet: NN
➢ Kimenet: ON
➢ Előfeltétel: N>1
➢ Utófeltétel: 1<ON és O|N és
i (2i<O): i ł N

2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 3/41


Ciklusok

A megoldás reprezentálása:
Programváltozók
Változó deklarálása
N:Egész
ELTE
O:Egész

Reprezentációs „szabály” a
specifikáció→reprezentáció áttéréskor:
N → Egész

2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 4/41


Ciklusok

A megoldás ötlete:
Próbáljuk ki a 2-t; ha nem jó, akkor a
3-at, ha az sem, akkor a 4-et, …;
ELTE
legkésőbb az N jó lesz!
Az ezt kifejező lényegi algoritmus:
Változó Lokális változó
i:Egész
deklarálása
i:=2
Ciklus amíg i ł N
i:=i+1
Ciklus vége
O:=i
2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 5/41
Ciklusok
Feladat:
Határozd meg egy természetes szám
(N>1) 1-től különböző legkisebb és önma-
gától különböző legnagyobb osztóját!
ELTE Specifikáció:
➢ Bemenet: NN
➢ Kimenet: Lko,LnoN
➢ Előfeltétel: N>1
➢ Utófeltétel: 1<LkoN és 1Lno<N és
Lko|N és
i (1<i<Lko):
(2i<Lko): i ł N
N és
és
Lno|N és
i (Lno<i<N): i ł N
2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 6/41
Ciklusok

Megjegyzés:
A specifikációból az algoritmus megkapható,
de az Lno az utófeltételben az Lko ismeretében
másképp is megfogalmazható: Lko*Lno=N!
ELTE

Az erre építő algoritmus:


Változó
i:Egész
i:=2
Ciklus amíg ił N
i:=i+1
Lko*Lno=N
Ciklus vége
Lko:=i
Lno:=N div Lko
2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 7/41
Ciklusok

Feladat:
Határozd meg egy természetes szám
(N>1) 1-től és önmagától különböző leg-
ELTE
kisebb osztóját (ha van)!
Specifikáció:
➢ Bemenet: NN
➢ Kimenet: ON, VanL
➢ Előfeltétel: N>1
➢ Utófeltétel: Van=i (2i<N): i|N és
Van→2O<N és O|N és
i (2i<O): i ł N
2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 8/41
Ciklusok
Algoritmus:
Változó i:Egész
i:=2
Ciklus amíg i<N és ił N
ELTE
i:=i+1 i N
Ciklus vége
Van:=i<N 2 → i  N Div i  N Div 2
Ha Van akkor O:=i azaz
i*i  N
azaz
i N
Megjegyzés:
Ha i osztója N-nek, akkor (N Div i) is
osztója, azaz elég az osztókat a szám
gyökéig keresni!
2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 9/41
Ciklusok

Feladat:
Határozd meg egy természetes szám
(N>1) osztói összegét!
ELTE Specifikáció:
➢ Bemenet: NN
➢ Kimenet: SN A feltételes szumma értelmezéséhez
egy példa:

➢ Előfeltétel: N>1 N
N=15 → =
i=1 : (1|15) → 1

➢ Utófeltétel: S = i i =1
i=2 : (2 ł 15) → 1
i=3 : (3|15) → 1+3
i=4 : (4 ł 15) → 1+3

iN i=15: (15|15)→1+3+…+15

2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 10/41


Ciklusok

Algoritmus:
Változó
i:Egész
ELTE
S:=0
Ciklus i=1-től N-ig
Ha i|N akkor S:=S+i
Ciklus vége
Kérdés: Elég lenne itt is gyök(N)-ig menni az
S:=S+i+(N Div i) értékadással?

2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 11/41


Ciklusok

Feladat:
Határozd meg egy természetes szám
(N>1) páratlan osztói összegét!
ELTE Specifikáció:
➢ Bemenet: NN
➢ Kimenet: SN
➢ Előfeltétel: N>1 N
➢ Utófeltétel: S= i i =1
i N és páratlan(i)
➢ Definíció: páratlan függvény definiálása
2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 12/41
Ciklusok

Algoritmus1:
Változó i:Egész
S:=0
Ciklus i=1-től N-ig
ELTE
Ha i|N és páratlan(i) akkor S:=S+i
Ciklus vége
Algoritmus2:
Változó i:Egész
S:=0
Ciklus i=1-től N-ig 2-esével
Ha i|N akkor S:=S+i
Ciklus vége

2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 13/41


Ciklusok

Feladat:
Határozd meg egy természetes szám
(N>1) prímosztói összegét!
ELTE Specifikáció:
➢ Bemenet: NN
➢ Kimenet: SN
➢ Előfeltétel: N>1 N
➢ Utófeltétel: S=  i
i =2
i N és prím(i)
prím(i)=???
2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 14/41
Ciklusok
Algoritmus:
a legkisebb osztó biztosan prím; ha N-t oszt-
juk vele ahányszor csak tudjuk, a következő
osztó(ja a redukált N-nek) megint prím lesz.
ELTE Változó i:Egész
S:=0
i:=2
Ciklus amíg i≤N
Ha i|N akkor S:=S+i
Ciklus amíg i|N
N:=N Div i
Ciklus vége
Elágazás vége
i:=i+1
Ciklus vége
2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 15/41
Ciklusok

Tanulságok:
➢ Ha az utófeltételben , , vagy  jel van,
akkor a megoldás mindig ciklus!
➢ Ha az utófeltételben  vagy  jel van, ak-
ELTE
kor a megoldás sokszor feltételes ciklus!
➢ Ha az utófeltételben  jel van, akkor a
megoldás sokszor számlálós ciklus!
➢ Feltételes  esetén a ciklusban elágazás lesz.

2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 16/41


Ciklusok
algoritmus – kód
Feltételes ciklus:
Ciklus amíg feltétel while (feltétel){
Tipikus előfordulás: a utasítások utasítások
beolvasás ellenőrzésénél Ciklus vége }
(l. 2.ea.-ban)
Ciklus
do{
utasítások
ELTE utasítások
amíg feltétel
}while (feltétel);
Ciklus vége

Számlálós ciklus:
Ciklus i=1-től N-ig for (int i=1;i<=N;++i){
utasítások utasítások
Ciklus vége }
Ciklus i=1-től N-ig
x-esével for (int i=1;i<=N;i+=x){
utasítások utasítások
Ciklus vége }

2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 17/41


Feladat elágazásra,
vagy más megoldás kell?
Feladat:
A japán naptár 60 éves ciklusokat tartalmaz, az
éveket párosítják, s mindegyik párhoz valami-
lyen színt rendelnek (zöld, piros, sárga, fehér,
ELTE fekete).
o 1,2,11,12, …,51,52: zöld évek
o 3,4,13,14,…,53,54: piros évek
o 5,6,15,16,…55,56: sárga évek
o 7,8,17,18,…57,58: fehér évek
o 9,10,19,20,…,59,60: fekete évek
Tudjuk, hogy 1984-ben indult az utolsó ciklus,
amely 2043-ban fog véget érni.
Írj programot, amely megadja egy M évről
(1984≤M≤2043), hogy milyen színű!
2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 18/41
Feladat elágazásra,
vagy más megoldás kell?
Specifikáció1: Egy még
„ismeretlen”
➢ Bemenet: évN halmaz
➢ Kimenet: sSzín
➢ Előfeltétel: 1984≤év és év≤2043
ELTE
➢ Utófeltétel: ((év-1984) Mod 10) Div 2=0 és
s="zöld" vagy
((év-1984) Mod 10) Div 2=1 és
s="piros" vagy …
➢ Definíció:
A Szín halmaz Szín:={"zöld","piros","sárga","fehér",
definiálása:
visszavezetés a
"fekete"}S
Szöveg halmaz egy
részhalmazára
2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 19/41
Feladat elágazásra,
vagy más megoldás kell?
Specifikáció2: A Szín halmaz
definiálása itt is
➢ Bemenet: évN lehetséges
➢ Kimenet: sSzín
Szín={"zöld","piros","sárga",
ELTE
"fehér","fekete"}S
➢ Előfeltétel: 1984≤év és év≤2043
➢ Utófeltétel: (((év-1984) Mod 10) Div 2=0 →
s="zöld") és
(((év-1984) Mod 10) Div 2=1 →
s="piros") és …

2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 20/41


Feladat elágazásra,
vagy más megoldás kell?
Algoritmus Lokális változó
Változó y:Egész deklarálása
y:=((év-1984) Mod 10) Div 2
Elágazás
ELTE
y=0 esetén s:="zöld"
y=1 esetén s:="piros"
y=2 esetén s:="sárga"
y=3 esetén s:="fehér"
y=4 esetén s:="fekete"
Elágazás vége
Kérdés:
Ezt tennénk, ha 5 helyett 90 ágat kellene írnunk?
A válasz előtt egy új adatszerkezet: a tömb.
2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 21/41
Sorozatok
Specifikációbeli fogalmak:
➢ Sorozat: azonos halmazbeli elemek egymás-
utánja, az elemei sorszámozhatók.
➢ Elem: a sorozat i-edik elemére szokásos mó-
ELTE
don – alulindexeléssel – hivatkozhatunk: Si.
➢ Index: 1..SorozatHossz vagy általában a..b.
➢ Például:
▪ Hónapok1..12N12 – a Hónapok 12 elemű,
természetes számokból álló sorozat 
 (Hónapok1, Hónapok2, … , Hónapok12)
▪ Emeletek-1..10S12 – az Emeletek 12 elemű,
szövegeket tartalmazó sorozat 
 (Emeletek-1, Emeletek0, …, Emeletek10)
2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 22/41
Tömbök

Algoritmikus fogalmak:
➢ Tömb: véges hosszúságú sorozat algoritmi-
kus párja, amelynek i-edik tagjával végezhe-
tünk műveleteket (adott a legkisebb és a
ELTE
legnagyobb index, vagy az elemszám).
➢ Index: sokszor 1..N, időnként 0..N–1, ahol
N az elemek számát jelöli. Máskor a..b. (A
sorozatokhoz hasonlóan.)
➢ Tömbelem-műveletek: elemérték-hivatkozás,
elemérték-módosítás (az elem-indexeléssel
kiválasztva).

2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 23/41


Sorozatok → Tömbök

Példa1:
Specifikációban:
X1..N,Y1..N,Z1..NRN – deklarációs példa
ELTE Z1=X1+Y1 – hivatkozási példa
Algoritmusban:
X,Y,Z:Tömb[1..N:Valós] – deklarációs
példa
Z[1]:=X[1]+Y[1] – hivatkozási példa

2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 24/41


Sorozatok → Tömbök

Példa2:
Specifikációban:
Ek-1..10S12 – deklarációs példa
ELTE Ek-1="Pince" – hivatkozási példa
Algoritmusban:
Ek:Tömb[-1..10:Szöveg] – deklarációs
példa
Ek[-1]:="Pince" – hivatkozási példa

2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 25/41


Sorozatok → Tömbök

Példa3:
Az előbbi feladatpélda Szín halmaza a spe-
cifikációban egy szöveg konstansokból álló
sorozat:
ELTE

Színek0..4S5=
("zöld","piros","sárga","fehér","fekete")
Az algoritmusban így reprezentáljuk:
Konstans Színek:Tömb[0..4:Szöveg]=
("zöld","piros","sárga","fehér","fekete")
Találja ki: miért jó döntés 0-tól indexelni!
2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 26/41
Elágazás helyett tömb
A japán naptáras feladat
Specifikáció:
➢ Bemenet: évN
➢ Kimenet: sSzín

ELTE
Szín={"zöld","piros","sárga",
"fehér","fekete"}S
Színek0..4Szín5=
("zöld","piros","sárga","fehér","fekete")
➢ Előfeltétel: 1984≤év és év≤2043

➢ Utófeltétel: s=Színek(((év–1984) Mod 10) Div 2)

2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 27/41


Elágazás helyett tömb
A japán naptáras feladat
Specifikáció (egyszerűsítve, csak szöveg
típussal):
➢ Bemenet: évN
ELTE ➢ Kimenet: sS
Színek0..4S5=
("zöld","piros","sárga","fehér","fekete")
➢ Előfeltétel: 1984≤év és év≤2043

➢ Utófeltétel: s=Színek(((év–1984) Mod 10) Div 2)

2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 28/41


Elágazás helyett tömb
Feladatparaméterek A japán naptáras feladat
deklarálása
Algoritmus: Programváltozók
Adatreprezentálás: deklarálása
Változó
év:Egész
ELTE
s:Szöveg
Konstans
Színek:Tömb[0..4:Szöveg]=
("zöld","piros","sárga",
"fehér","fekete")
Tevékenység:
Be:év [1984≤év és év≤2043]
s:=Színek[((év–1984) Mod 10) Div 2]
2020. 02. 18. 15:16

Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 29/41
Tömbök
(Algoritmus→kód) Tömb-elemszám 
indexelés 0..N

C++ 0-val kezdi a tömbindexelést!


De szabad nem használni a 0-dikat. ☺
Deklarációs példák – a C++ kódjukkal:
X:Tömb[1..N:Valós] float X[N+1]
ELTE
E:Tömb[-1..10:Szöveg] string Y[12]

Az előbbi Szín halmazos példa:


Konstans Színek:Tömb[0..4:Szöveg]=
("zöld","piros","sárga","fehér","fekete")
const string Szinek[5]={"zöld","piros",
"sárga","fehér","fekete"};
2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 30/41
Tömbök
(Algoritmus→kód)
Kódolási kérdések1:
Ciklus i=1-től n-ig
x[i]:=i
Ciklus vége
C++-ban így is lehetne, de veszélyes:
ELTE
1. (ciklus-szervezést megtartva)
for(i=1;i<=n;++i){
x[i-1]=i
}
2. (a 0. elemhez igazodva)
for(i=0;i<=n-1;++i){
x[i]=i+1
}

2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 31/41


Tömbök
(Algoritmus→kód)
Kódolási kérdések2:
Ciklus i=-1-től n-ig
x[i]:=0
Ciklus vége
C++-ban így lehet (hiába veszélyes):
ELTE
1. (ciklus-szervezést megtartva)
for(i=-1;i<=n;++i){
x[i+1]=0;
}
2. (a 0. elemhez igazodva)
for(i=0;i<=n+1;++i){
x[i]=0;
}

2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 32/41


Tömbök
(Algoritmus→kód)
Kódolási kérdések3:
Ciklus i=-1-től n-ig
x[i]:=i+5
Ciklus vége
C++-ban így lehet (hiába veszélyes):
ELTE
1. (ciklus-szervezést megtartva)
for(i=-1;i<=n;++i){
x[i+1]=i+5;
}
2. (a 0. elemhez igazodva)
for(i=0;i<=n+1;++i){
x[i]=i+4;
}

2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 33/41


Konstans tömbök
alkalmazása
Feladat:
Írj programot, amely egy 1 és 99 közötti
számot betűkkel ír ki!
ELTE
Specifikáció:
Leglogikusabb ➢ Bemenet: NN
helyre téve.
Az algoritmus egyes0..9S10=
szempontjából
„adottság”, azaz ("","egy",…,"kilenc")
bemenet…
tizes0..9S10=
("","tizen",…,"kilencven")
➢ Kimenet: SS
➢ Előfeltétel: 1N99

2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 34/41


Konstans tömbök
alkalmazása
➢ Utófeltétel:
N=10 → S="tíz" és
N=20 → S="húsz" és
N{10,20} → S=tizes(N Div 10) +
ELTE
egyes(N Mod 10)

2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 35/41


Konstans tömbök
Feladatparaméterek
deklarálása
alkalmazása Programváltozók
deklarálása
Algoritmus:
Változó N:Egész
Konstans egyes:Tömb[0..9:Szöveg]=
("","egy",…,"kilenc")
tizes:Tömb[0..9:Szöveg]=
ELTE
("","tizen",…,"kilencven")
Változó S:Szöveg
A tevékenység lényegi része:
Elágazás
N=10 esetén S:="tíz"
N=20 esetén S:="húsz"
N{10,20} esetén S:=tizes[N Div 10]+
egyes[N Mod 10]
Elágazás vége

2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 36/41


Konstans tömbök
alkalmazása
Feladat:
Írj programot, amely egy hónapnévhez a
sorszámát rendeli!
ELTE
Specifikáció:
➢ Bemenet: HS
HóNév1..12S12=
("január",…,"december")
➢ Kimenet: SN
➢ Előfeltétel: HHóNév
➢ Utófeltétel:1S12 és HóNévS=H

2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 37/41


Konstans tömbök
alkalmazása Programparaméterek
deklarálása
Algoritmus:
Változó
H:Szöveg,S:Egész
Konstans
ELTE HóNév:Tömb[1..12:Szöveg]=
("január",…,"december")
S:=1
Ciklus amíg HóNév[S]≠H
S:=S+1
Ciklus vége
Kérdés: mi lenne, ha az ef. nem teljesülne?
Futási hiba? Végtelen ciklus?
2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 38/41
Konstans tömb – mit
tárolunk?
Feladat:
Egy nap a nem szökőév hányadik napja?
Specifikáció:
ELTE ➢ Bemenet: H,NN
hó1..12N12=(31,28,31,…,31)
➢ Kimenet: SN
➢ Előfeltétel: 1≤H≤12 és 1≤N≤hóH
H −1
➢ Utófeltétel: S = N +  hó i
i =1

2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 39/41


Konstans tömb – mit
tárolunk? Programparaméterek
deklarálása
Algoritmus:
Változó
H,N,S:Egész
Konstans
ELTE
hó:Tömb[1..12:Egész]=
(31,28,31,…,31)
Változó i:Egész Lokális változó
S:=N deklarálása
Ciklus i=1-től H-1-ig
S:=S+hó[i]
Ciklus vége
Megjegyzés: Szökőév esetén H≥3 esetén S-et
1-gyel meg kellene növelni! (És az előfeltétel
2020. 02. 18. 15:16
is módosul.)
Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 40/41
Áttekintés

➢ Ciklusok
specifikáció+„algoritmika”+kódolás
➢ Tömbök
ELTE
➢ Egy bevezető példa a tömbhöz
➢ Sorozatok –tömbök
➢ Elágazás helyett tömb
➢ Konstans tömbök

2020. 02. 18. 15:16 Horváth-Papné-Szlávi-Zsakó: Programozás(i alapismeretek) 3. előadás 41/41

You might also like