Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Programozási alapismeretek 3. előadás. ELTE Szlávi-Zsakó: Programozási alapismeretek 3.2014. 07. 14.2014. 07. 14.2014. 07. 14. Szlávi-Zsakó: Programozási.

Hasonló előadás


Az előadások a következő témára: "Programozási alapismeretek 3. előadás. ELTE Szlávi-Zsakó: Programozási alapismeretek 3.2014. 07. 14.2014. 07. 14.2014. 07. 14. Szlávi-Zsakó: Programozási."— Előadás másolata:

1 Programozási alapismeretek 3. előadás

2 ELTE Szlávi-Zsakó: Programozási alapismeretek Szlávi-Zsakó: Programozási alapismeretek 3. 2/  Ciklusok – specifikáció+„algoritmika”+kódolás Ciklusok  Egy bevezető példa a tömbhöz Egy bevezető példa a tömbhöz  A tömb A tömb  Elágazás helyett tömb Elágazás helyett tömb  Konstans tömbök Konstans tömbök Tartalom

3 ELTE Szlávi-Zsakó: Programozási alapismeretek Szlávi-Zsakó: Programozási alapismeretek 3. 3/ Ciklusok Feladat: Határozzuk meg egy természetes szám (N>1) 1-től különböző legkisebb osztó-ját! Specifikáció:  Bemenet: N:Egész  Kimenet: O:Egész  Előfeltétel: N>1  Utófeltétel: 1

4 ELTE Szlávi-Zsakó: Programozási alapismeretek Szlávi-Zsakó: Programozási alapismeretek 3. 4/ 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, …; legkésőbb az N jó lesz! Az ezt kifejező algoritmus: i:=2 i ł N i:=i+1 O:=i

5 ELTE Szlávi-Zsakó: Programozási alapismeretek Szlávi-Zsakó: Programozási alapismeretek 3. 5/ Ciklusok Feladat: Határozzuk 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! Specifikáció:  Bemenet: N:Egész  Kimenet: Lko,Lno:Egész  Előfeltétel: N>1  Utófeltétel: 1

6 ELTE Szlávi-Zsakó: Programozási alapismeretek Szlávi-Zsakó: Programozási alapismeretek 3. 6/ Ciklusok Megjegyzés: Az Lno az utófeltételben az Lko ismere - tében másképp is megfogalmazható: Lko*Lno=N! Az ehhez „illeszkedő” algoritmus: i:=2 i ł N i:=i+1 Lko:=i Lno:=N Div Lko

7 ELTE Szlávi-Zsakó: Programozási alapismeretek Szlávi-Zsakó: Programozási alapismeretek 3. 7/ Ciklusok Feladat: Határozzuk meg egy természetes szám (N>1) 1-től és önmagától különböző leg- kisebb osztóját (ha van)! Specifikáció :  Bemenet: N:Egész  Kimenet: O:Egész, Van:Logikai  Előfeltétel: N>1  Utófeltétel: Van=  i (2  i

8 ELTE Szlávi-Zsakó: Programozási alapismeretek Szlávi-Zsakó: Programozási alapismeretek 3. 8/ Ciklusok Algoritmus: 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! i:=2 i

9 ELTE Szlávi-Zsakó: Programozási alapismeretek Szlávi-Zsakó: Programozási alapismeretek 3. 9/ Ciklusok Feladat: Határozzuk meg egy természetes szám (N>1) osztói összegét! Specifikáció:  Bemenet: N:Egész  Kimenet: S:Egész  Előfeltétel: N>1  Utófeltétel:

10 ELTE Szlávi-Zsakó: Programozási alapismeretek 3. 10/ Ciklusok Algoritmus: S:=0 i=1..N i|N S:=S+i  I N

11 ELTE Szlávi-Zsakó: Programozási alapismeretek 3. 11/ Ciklusok Feladat: Határozzuk meg egy természetes szám (N>1) páratlan osztói összegét! Specifikáció:  Bemenet: N:Egész  Kimenet: S:Egész  Előfeltétel: N>1  Utófeltétel: S=

12 ELTE Szlávi-Zsakó: Programozási alapismeretek 3. 12/ Algoritmus 1 : Algoritmus 2 : Ciklusok S:=0 i=1..N i|N és páratlan(i) S:=S+i  S:=0 i=1..N; 2-esével i|N S:=S+i  I N I N

13 ELTE Szlávi-Zsakó: Programozási alapismeretek 3. 13/ Ciklusok Feladat: Határozzuk meg egy természetes szám (N>1) prímosztói összegét! Specifikáció:  Bemenet: N:Egész  Kimenet: S:Egész  Előfeltétel: N>1  Utófeltétel: S= prím(i)???

14 ELTE Szlávi-Zsakó: Programozási alapismeretek 3. 14/ 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. S:=0 i:=2 iNiN i|N S:=S+i  i|N N:=N Div i i:=i+1 I N

15 ELTE Szlávi-Zsakó: Programozási alapismeretek 3. 15/ Ciklusok Feladat: Határozzuk meg azon i,j (i,j>1) termé- szetes számok számát, amelyekre i*j1  Utófeltétel: S=

16 ELTE Szlávi-Zsakó: Programozási alapismeretek 3. 16/ Ciklusok S:=0 i=2..N Div 2 j=2..N Div 2 i*j

17 ELTE Szlávi-Zsakó: Programozási alapismeretek 3. 17/ Ciklusok S:=0 i=2..N Div 2 j:=2 i*j≤N S:=S+1 j:=j+1 Algoritmus 2 : Algoritmus 3 : S:=0 i=2..N Div 2 S:=S+(N Div i)-1

18 ELTE Szlávi-Zsakó: Programozási alapismeretek 3. 18/ 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- 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! (  is…)  Két egymásba ágyazott  jel esetén két cik- lus lesz egymás belsejében.  Feltételes  esetén a ciklusban elágazás lesz.

19 ELTE Szlávi-Zsakó: Programozási alapismeretek 3. 19/ Ciklusok algoritmus – kód Feltételes ciklus: Számlálós ciklus: feltétel utasítások while (feltétel){ utasítások } i=1..N utasítások for (int i=1;i<=N;++i){ utasítások } i=1..N; x-esével utasítások for (int i=1;i<=N;i+=x){ utasítások } utasítások feltétel do{ utasítások }while (feltétel) Tipikus előfordulás: a beolvasás ellenőrzésénél (l. 2.ea.-ban) 2.ea.

20 ELTE Szlávi-Zsakó: Programozási alapismeretek /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, 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ű!

21 ELTE Szlávi-Zsakó: Programozási alapismeretek /41 Feladat elágazásra, vagy más megoldás kell ? Specifikáció 1 :  Bemenet: év:Egész  Kimenet: s:Szín  Előfeltétel: 1984≤év és év≤2043  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ó: Szín:=(”zöld”,”piros”,”sárga”,”fehér”, ”fekete”)  Szöveg Egy még „ismeretlen” halmaz A Szín halmaz definiálása, visszavezetés a Szöveg halmazra

22 ELTE Szlávi-Zsakó: Programozási alapismeretek /41 Feladat elágazásra, vagy más megoldás kell ? Specifikáció 2 :  Bemenet: év:Egész  Kimenet: s:Szín Szín=(”zöld”,”piros”,”sárga”, ”fehér”,”fekete”)  Szöveg  Előfeltétel: 1984≤év és év≤2043  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 … A Szín halmaz definiálása itt is lehetséges

23 ELTE Szlávi-Zsakó: Programozási alapismeretek /41 Feladat elágazásra, vagy más megoldás kell ? y:=((év-1984) Mod 10) Div 2 y=0y=1y=2y=3y=4 s:= ”zöld” s:= ”piros” s:= ”sárga” s:= ”fehér” s:= ”fekete” Kérdés: Akkor is ezt tennénk, ha 5 helyett 90 ágat kellene írnunk? A válasz előtt egy új adatszerkezet: a tömb. Algoritmus:

24 ELTE Szlávi-Zsakó: Programozási alapismeretek /41 Tömbök Kapcsolódó fogalmak:  Sorozat: azonos típusú elemek egymásutánja, az elemei sorszámozhatók.  Tömb: véges hosszúságú sorozat, a sorozat i- edik tagjával végezhetünk műveleteket (adott a legkisebb és a legnagyobb index, vagy az elemszám).  Index: sokszor 1..N, máskor 0..N–1.  Tömbelem-műveletek: elemérték-hivatkozás, elemérték-módosítás (az elem indexeléssel kiválasztva).

25 ELTE Szlávi-Zsakó: Programozási alapismeretek /41 Tömbök (algoritmusban) Deklarációs példák: X:Tömb[1..N:Egész] Y:Tömb[0..4:Szöveg] Az előbbi példa Szín halmazát reprezentál- hatjuk egy konstans tömbbel: Konstans Szín:Tömb[0..4:Szöveg]= (”zöld”,”piros”,”sárga”,”fehér”,”fekete”) Hivatkozási példák: X[1]:=X[N]; Y[i]:=Szín[0]

26 ELTE Szlávi-Zsakó: Programozási alapismeretek 3.26/ Deklarációs példák – X:Tömb[1..N:Egész] Y:Tömb[0..4:Szöveg] Az előbbi példa Szín halmazát reprezentál- hatjuk egy konstans tömbbel: Konstans Szín:Tömb[0..4:Szöveg]= (”zöld”,”piros”,”sárga”,”fehér”,”fekete”) Tömbök (algoritmusban+kódban) string Y[5] const string Szin[5]={"zöld","piros", "sárga","fehér","fekete"}; int X[N+1] Tömb-elemszám  indexelés 0..N indexelés 0..???  Tömb-elemszám a C++ kódjukkal :

27 ELTE Szlávi-Zsakó: Programozási alapismeretek /41 Tömbök (C++ kódban – áttekintés) Statikus tömbök:  Deklaráció:  Hivatkozások : const int MaxN=???;//tömb max.elemszáma típus tömb[MaxN]; //tömbdeklaráció //0..MaxN-1 közötti indexekkel … … tömb[ind] … //tömbérték-hivatkozás … tömb[ind]=kif;//tömbérték-módosítás … Eltérés a specifikációban és az algoritmusban szokásostól!

28 ELTE Szlávi-Zsakó: Programozási alapismeretek /41 Tömbök (C++ kódban – áttekintés) Statikus tömb konstansok:  Deklaráció: vagy const int N=???;//tömb elemszáma const típus tömb[N]={t1,t2,…,tN}; //konstans tömb deklarációja, //0..N-1 közötti indexekkel const típus tömb[]={t1,t2,…,tN}; //konstans tömb deklarációja const int N=sizeof tömb/sizeof(típus); //tömb elemszáma //indexek: 0..N-1 közötti Figyeljünk a sizeof szintaxisára: más adatra, és más típusra!

29 ELTE Szlávi-Zsakó: Programozási alapismeretek /41 Tömbök (C++ kódban – áttekintés) Dinamikus tömbök:  Deklaráció:  Létrehozás:  Hivatkozások (nincs változás) : int N; //tömb aktuális elemszám … … tömb[ind] … //tömbérték-hivatkozás … tömb[ind]=kif;//tömbérték-módosítás … N=???;//N meghatározása, pl. beolvasása típus tömb[N];//tömbhelyfoglalás N db //típus típusú elem számára

30 ELTE Szlávi-Zsakó: Programozási alapismeretek /41 Tömb beolvasása (ellenőrzéssel) : bool hiba; //van-e hiba? … do{ cout > N; hiba=HelyesN(N); if (hiba) { cout << "hibaüzet" << endl; } }while (hiba); bool hiba; //van-e hiba? … do{ cout > N; hiba=HelyesN(N); if (hiba) { cout << "hibaüzet" << endl; } }while (hiba); A HelyesN-be beleér- tem a szintaktikus és szemantikus ellenőr- zést is. Tömbök (C++ kódban – áttekintés) Algoritmikusan: Be: N [HelyesN(N))] L. még korábban! L. még korábban! korábban

31 ELTE Szlávi-Zsakó: Programozási alapismeretek /41 Tömb beolvasása (ellenőrzéssel) : Térjünk vissza a kérdésre… bool hiba; //van-e hiba? … do{ cout > N; hiba=!HelyesN(N); if (hiba) { cout << "hibaüzet" << endl; } }while (hiba); bool hiba; //van-e hiba? … do{ cout > N; hiba=!HelyesN(N); if (hiba) { cout << "hibaüzet" << endl; } }while (hiba); for (int i=0;i > v[i]; hiba=!Helyes(v[i]); if (hiba) { cout > v[i]; hiba=!Helyes(v[i]); if (hiba) { cout << "hibaüzenet" << endl; }; }while (hiba); } Algoritmikusan: Be: v(1..N) [Helyes(v(1..N))] A Helyes-be beleértem a szintaktikus és szemantikus ellenőr- zést is. Tömbök (C++ kódban – áttekintés) L. még korábban! L. még korábban! korábban

32 ELTE Szlávi-Zsakó: Programozási alapismeretek /41 Elágazás helyett tömb Specifikáció:  Bemenet: év:Egész  Kimenet: s:Szín Szín=(”zöld”,”piros”,”sárga”, ”fehér”,”fekete”)  Szöveg Konstans Színek:Tömb[0..4:Szín]= (”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]

33 ELTE Szlávi-Zsakó: Programozási alapismeretek /41 Elágazás helyett tömb Algoritmus: y:=((év-1984) Mod 10) Div 2 s:=Színek[y]

34 ELTE Szlávi-Zsakó: Programozási alapismeretek /41 Konstans tömbök alkalmazása Feladat: Írj programot, amely egy 1 és 99 közötti számot betűkkel ír ki! Specifikáció:  Bemenet: N:Egész Konstans egyes:Tömb[0..9:Szöveg]= (””, ”egy”,…,”kilenc”) Konstans tizes: Tömb[0..9:Szöveg]= (””, ”tizen”,…,”kilencven”)  Kimenet: S:Szöveg  Előfeltétel: 1  N  99 Leglogikusabb helyre téve. Az algoritmus szempontjából bemenet…

35 ELTE Szlávi-Zsakó: Programozási alapismeretek /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]+ egyes[N Mod 10] Algoritmus: N=10N=10N=20 N  {10,20} S:=”tíz”S:=”húsz”S:=tizes[N Div 10]+ egyes[N Mod 10]

36 ELTE Szlávi-Zsakó: Programozási alapismeretek /41 Konstans tömbök alkalmazása Feladat: Írj programot, amely egy hónapnévhez a sorszámát rendeli! Specifikáció:  Bemenet: H:Szöveg Konstans HóNév:Tömb[1..12:Szöveg]= (”január”,…,”december”)  Kimenet: S:Egész  Előfeltétel: H  HóNév  Utófeltétel: 1  S  12 és HóNév[S]=H

37 ELTE Szlávi-Zsakó: Programozási alapismeretek /41 Algoritmus: Kérdés: mi lenne, ha az ef. nem teljesülne? Futási hiba? Végtelen ciklus? Konstans tömbök alkalmazása i:=1 HóNév[i]  H i:=i+1 S:=i

38 ELTE Szlávi-Zsakó: Programozási alapismeretek /41 Konstans tömb – mit tárolunk? Feladat: Egy nap a nem szökő év hányadik napja? Specifikáció 1 :  Bemenet: H,N:Egész Konstans hó:Tömb[1..12:Egész]= (31,28,31,…,31)  Kimenet: S:Egész  Előfeltétel: 1≤H≤12 és 1≤N≤hó[H]  Utófeltétel:

39 ELTE Szlávi-Zsakó: Programozási alapismeretek /41 Konstans tömb – mit tárolunk? Algoritmus: Megjegyzés: Szökőév esetén H≥3 esetén S- et 1-gyel meg kellene növelni! (És az ef. is módosul.) S:=N i=1..H–1 S:=S+hó[i]

40 ELTE Szlávi-Zsakó: Programozási alapismeretek /41 Konstans tömb – mit tárolunk? Egy másik megoldás: Tároljuk minden hónapra, hogy az előző hónapokban összesen hány nap van! Specifikáció 2 :  Bemenet: … Konstans hó:Tömb[1..12:Egész]= (0,31,59,90,…,334)  Utófeltétel: S=N+hó[H] Kérdés: Ez jobb megoldás? Mi lesz az előfel- tétellel?

41 Programozási alapismeretek 3. előadás vége


Letölteni ppt "Programozási alapismeretek 3. előadás. ELTE Szlávi-Zsakó: Programozási alapismeretek 3.2014. 07. 14.2014. 07. 14.2014. 07. 14. Szlávi-Zsakó: Programozási."

Hasonló előadás


Google Hirdetések