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

Hasonló előadás


Az előadások a következő témára: "Programozási alapismeretek 3. előadás"— Előadás másolata:

1 Programozási alapismeretek 3. előadás
Programozási alapismeretek 3. előadás Szlávi-Zsakó: Programozási alapismeretek 3. előadás 1

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

3 Programozási alapismeretek
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<ON és O|N és i (2i<O): i ł N A „ ł” nem oszthatóság műveleti jele. Szlávi-Zsakó: Programozási alapismeretek 3. Szlávi-Zsakó: Programozási alapismeretek 3. 3/41 3 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

4 Programozási alapismeretek
/2009 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 Szlávi-Zsakó: Programozási alapismeretek 3. Szlávi-Zsakó: Programozási alapismeretek 3. 4/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

5 Programozási alapismeretek
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<LkoN és 1Lno<N és Lko|N és i (2i<Lko): i ł N és Lno|N és i (Lno<i<N): i ł N Szlávi-Zsakó: Programozási alapismeretek 3. Szlávi-Zsakó: Programozási alapismeretek 3. 5/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

6 Programozási alapismeretek
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 Szlávi-Zsakó: Programozási alapismeretek 3. Szlávi-Zsakó: Programozási alapismeretek 3. 6/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

7 Programozási alapismeretek
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<N): i|N és Van  O|N és 2O<N és i (2i<O): i ł N Szlávi-Zsakó: Programozási alapismeretek 3. Szlávi-Zsakó: Programozási alapismeretek 3. 7/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

8 Programozási alapismeretek
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<N és i ł N i:=i+1 Van:=i<N Van O:=i I N 2i  N Div i N Div 2 azaz i*i  N azaz i N i:=2 Ciklus amíg i√N és i ł N i:+1 Ciklus vége Van:= i√N Ha Van akkor O:=i Szlávi-Zsakó: Programozási alapismeretek 3. Szlávi-Zsakó: Programozási alapismeretek 3. 8/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

9 Programozási alapismeretek
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: Szlávi-Zsakó: Programozási alapismeretek 3. Szlávi-Zsakó: Programozási alapismeretek 3. 9/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

10 Programozási alapismeretek
Ciklusok Algoritmus: S:=0 i=1..N i|N S:=S+i I N Szlávi-Zsakó: Programozási alapismeretek 3. 10/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

11 Programozási alapismeretek
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= páratlan(i)=??? Világos, h. a „páratlan”-ság függvénye egyszerűen megalkotható a MOD „maradék” operátor ismeretében. Azaz a specifikációt kiegészíthetnénk az alábbi, 5. résszel: Definíció: páratlan: Egész → Logikai páratlan(x):=(x Mod 2)=1 Szlávi-Zsakó: Programozási alapismeretek 3. 11/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

12 Programozási alapismeretek
Ciklusok Algoritmus1: Algoritmus2: S:=0 i=1..N i|N és páratlan(i) S:=S+i I N S:=0 i=1..N; 2-esével i|N S:=S+i Gondolja meg, h. ha a második algoritmus ötlete hamarabb vetődik föl bennünk, akkor a specifikációt miként fogalmaztuk volna meg. I N Szlávi-Zsakó: Programozási alapismeretek 3. 12/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

13 Programozási alapismeretek
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)=??? A „prím”-ség a korábbi hasonló megszorításnál jóval összetettebb, ezért most nem foglalkozunk vele. Szlávi-Zsakó: Programozási alapismeretek 3. 13/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

14 Programozási alapismeretek
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N i|N S:=S+i N:=N Div i i:=i+1 I N Szlávi-Zsakó: Programozási alapismeretek 3. 14/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

15 Programozási alapismeretek
Ciklusok Feladat: Határozzuk meg azon i,j (i,j>1) termé-szetes számok számát, amelyekre i*j<N (N>1)! Specifikáció: Bemenet: N:Egész Kimenet: S:Egész Előfeltétel: N>1 Utófeltétel: S= Szlávi-Zsakó: Programozási alapismeretek 3. 15/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

16 Programozási alapismeretek
Ciklusok Algoritmus1: S:=0 i=2..N Div 2 j=2..N Div 2 i*j<N S:=S+1 i – 1 I N S:=S+1 Szlávi-Zsakó: Programozási alapismeretek 3. 16/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

17 Szlávi-Zsakó: Programozási alapismeretek 3.
Ciklusok Algoritmus2: Algoritmus3: S:=0 i=2..N Div 2 j:=2 i*j<N S:=S+1 j:=j+1 S:=0 i=2..N Div 2 S:=S+(N Div i)-2 Szlávi-Zsakó: Programozási alapismeretek 3. 17/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás 17

18 Szlávi-Zsakó: Programozási alapismeretek 3.
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. Szlávi-Zsakó: Programozási alapismeretek 3. 18/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

19 Ciklusok algoritmus – kód
Programozási alapismeretek Ciklusok algoritmus – kód Feltételes ciklus: feltétel utasítások while (feltétel){ utasítások } Tipikus előfordulás: a beolvasás ellenőrzésénél (l. 2.ea.-ban) utasítások feltétel do{ utasítások }while (feltétel) Számlálós ciklus: 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 } Szlávi-Zsakó: Programozási alapismeretek 3. 19/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

20 Feladat elágazásra, vagy más megoldás kell?
Programozási alapismeretek 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). 1,2,11,12, …,51,52: zöld évek 3,4,13,14,…,53,54: piros évek 5,6,15,16,…55,56: sárga évek 7,8,17,18,…57,58: fehér évek 9,10,19,20,…,59,60: fekete évek Tudjuk, hogy 1984-ben indult az utolsó ciklus, amely 2043-ban fog véget érni. Írjunk programot, amely megadja egy M évről (1984≤M≤2043), hogy milyen színű! Szlávi-Zsakó: Programozási alapismeretek 3. 20/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

21 Feladat elágazásra, vagy más megoldás kell?
Programozási alapismeretek 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 Szlávi-Zsakó: Programozási alapismeretek 3. 21/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

22 Feladat elágazásra, vagy más megoldás kell?
Programozási alapismeretek 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 Szlávi-Zsakó: Programozási alapismeretek 3. 22/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

23 Feladat elágazásra, vagy más megoldás kell?
Programozási alapismeretek Feladat elágazásra, vagy más megoldás kell? Algoritmus: y:=((év-1984) Mod 10) Div 2 y=0 y=1 y=2 y=3 y=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. Szlávi-Zsakó: Programozási alapismeretek 3. 23/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

24 Programozási alapismeretek
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). Szlávi-Zsakó: Programozási alapismeretek 3. 24/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

25 Tömbök (algoritmusban)
Programozási alapismeretek 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] Szlávi-Zsakó: Programozási alapismeretek 3. 25/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

26 Tömbök (algoritmusban+kódban)
Programozási alapismeretek Tömbök (algoritmusban+kódban) Tömb-elemszám  indexelés 0..N indexelés 0..???  Tömb-elemszám 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”) a C++ kódjukkal: int X[N+1] string Y[5] const string Szin[5]={"zöld","piros", "sárga","fehér","fekete"}; Szlávi-Zsakó: Programozási alapismeretek 3. 26/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

27 Tömbök (C++ kódban – áttekintés)
Programozási alapismeretek 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 … Eltérés a specifikációban és az algoritmusban szokásostól! … tömb[ind] … //tömbérték-hivatkozás … tömb[ind]=kif;//tömbérték-módosítás … Szlávi-Zsakó: Programozási alapismeretek 3. 27/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

28 Tömbök (C++ kódban – áttekintés)
Programozási alapismeretek 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! Szlávi-Zsakó: Programozási alapismeretek 3. 28/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

29 Tömbök (C++ kódban – áttekintés)
Programozási alapismeretek 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 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 … tömb[ind] … //tömbérték-hivatkozás … tömb[ind]=kif;//tömbérték-módosítás … Szlávi-Zsakó: Programozási alapismeretek 3. 29/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

30 Tömbök (C++ kódban – áttekintés)
Programozási alapismeretek Tömbök (C++ kódban – áttekintés) Tömb beolvasása (ellenőrzéssel): Algoritmikusan: Be: N [HelyesN(N))] bool hiba; //van-e hiba? … do{ cout << "Elemszám:"; cin >> 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. L. még korábban! Szlávi-Zsakó: Programozási alapismeretek 3. 30/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

31 Tömbök (C++ kódban – áttekintés)
Programozási alapismeretek Tömbök (C++ kódban – áttekintés) Tömb beolvasása (ellenőrzéssel): Térjünk vissza a kérdésre… Algoritmikusan: Be: v(1..N) [Helyes(v(1..N))] bool hiba; //van-e hiba? … do{ cout << "Elemszám:"; cin >> N; hiba=!HelyesN(N); if (hiba) { cout << "hibaüzet" << endl; } }while (hiba); for (int i=0;i<N;++i) { do{ cout << i+1 << ".:"; cin >> v[i]; hiba=!Helyes(v[i]); if (hiba) { cout << "hibaüzenet" << endl; }; }while (hiba); } A Helyes-be beleértem a szintaktikus és szemantikus ellenőr-zést is. Persze, ha 0. elemet nem használó filozófiát valljuk az egyszerűbb kódolás érdekében, akkor a ciklus szervezése változik: for (int i=1; i<=N; ++i) L. még korábban! Szlávi-Zsakó: Programozási alapismeretek 3. 31/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

32 Szlávi-Zsakó: Programozási alapismeretek 3.
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] Szlávi-Zsakó: Programozási alapismeretek 3. 32/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás 32

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

34 Konstans tömbök alkalmazása
Programozási alapismeretek Konstans tömbök alkalmazása Feladat: Írjunk 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… Szlávi-Zsakó: Programozási alapismeretek 3. 34/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

35 Konstans tömbök alkalmazása
Programozási alapismeretek 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=10 N=20 N{10,20} S:=”tíz” S:=”húsz” S:=tizes[N Div 10] egyes[N Mod 10] A szövegek közötti + művelet hamarosan szóba kerül. Szlávi-Zsakó: Programozási alapismeretek 3. 35/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

36 Konstans tömbök alkalmazása
Programozási alapismeretek Konstans tömbök alkalmazása Feladat: Írjunk 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 Szlávi-Zsakó: Programozási alapismeretek 3. 36/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

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

38 Konstans tömb – mit tárolunk?
Programozási alapismeretek 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: Szlávi-Zsakó: Programozási alapismeretek 3. 38/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

39 Konstans tömb – mit tárolunk?
Programozási alapismeretek 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 előfel-tétel is módosul.) S:=N i=1..H–1 S:=S+hó[i] Szlávi-Zsakó: Programozási alapismeretek 3. 39/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

40 Konstans tömb – mit tárolunk?
Programozási alapismeretek 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? Szlávi-Zsakó: Programozási alapismeretek 3. 40/41 Szlávi-Zsakó: Programozási alapismeretek 3. előadás

41 Programozási alapismeretek
Programozási alapismeretek 3. előadás vége Szlávi-Zsakó: Programozási alapismeretek 3. előadás


Letölteni ppt "Programozási alapismeretek 3. előadás"

Hasonló előadás


Google Hirdetések