Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)



Hasonló dokumentumok
Programozás 5. Dr. Iványi Péter

Bevezetés a C++ programozási nyelvbe

Információs Technológia

Országzászlók (2015. május 27., Sz14)

Programozás I gyakorlat. 5. Struktúrák

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

Programozás 3. Dr. Iványi Péter

Bevezetés a C programozási nyelvbe. Az Általános Informatikai Tanszék C nyelvi kódolási szabványa

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

A PROGAMOZÁS ALAPJAI 1. Függvény mint függvény paramétere. Függvény mint függvény paramétere. Függvény mint függvény paramétere

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

2.3. A C nyelv utasításai

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Bevezetés a C++ programozásba

Információs Technológia

Programozás alapjai C nyelv 10. gyakorlat. Standard függvények. Union

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE

PROGRAMOZÁS ALAPJAI (ANSI C NYELVEN)

Feladat: Hogyan tudunk létrehozni egy olyan vector nevű tömb típust, amely egy háromdimenziós térbeli vektort reprezentál?

7/8. gyakorlat Karaktertömbök és sztringkezelés

C programnyelv 1. Kedves Kollegina, Kolléga!

Programozás II. Fájlkezelés

117. AA Megoldó Alfréd AA 117.

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

C# gyorstalpaló. Készítette: Major Péter

3. Gyakorlat Ismerkedés a Java nyelvvel

S z á m í t ó g é p e s a l a p i s m e r e t e k

C programozás. { Márton Gyöngyvér, 2009 } { Sapientia, Erdélyi Magyar Tudományegyetem }

INFORMATIKAI ALAPISMERETEK

Elôszó a magyar kiadáshoz A Kiadó Elôszó

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

C programozási nyelv Pointerek, tömbök, pointer aritmetika

Körkörös listák. fej. utolsó. utolsó. fej

Programozási módszertan. Dinamikus programozás: Nyomtatási feladat A leghosszabb közös részsorozat

10. gyakorlat Tömb, mint függvény argumentum

Programozás alapjai C nyelv 9. gyakorlat. Rekurzió. Rekurzív algoritmus

0.1. Mi az a standard be- és kimenet? A két mintafeladat leírása

Internet programozása. 3. előadás

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

A C# programozási nyelv alapjai

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

Szövegek C++ -ban, a string osztály

Rekurzió. Programozás alapjai C nyelv 9. gyakorlat. Rekurzív algoritmus. Rekurzív algoritmus fajtái. Példa: n! (2) Példa: n!

Függvény pointer. Feladat: Egy tömbben soroljunk fel függvényeket, és hívjuk meg valahányszor.

Vezérlési szerkezetek

Programozás alapjai 5. gyakorlat Vezérlési szerkezetek egymásba ágyazása

Programozás II gyakorlat. 6. Polimorfizmus

Egyszerű RISC CPU tervezése

C# feladatgyűjtemény Kovács Emőd, Radványi Tibor, Király Roland, Hernyák Zoltán

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

C változók. Feladat: Deklaralj egy valos, egy karakter es ket egesz tipusu valtozot! int main() {

Programozás alapjai 1. (BMEVIEEA100)

Mintavételes szabályozás mikrovezérlő segítségével

1. Feladat: beolvas két számot úgy, hogy a-ba kerüljön a nagyobb

Programozás C nyelven (13. ELŐADÁS) Sapientia EMTE

Programozás I. gyakorlat

Struktúrák (struct) A struktúra szerkezetét meghatározó deklaráció általános formája:

7. gyakorlat. Fájlkezelés IO haladó Függvények haladó

Programozás alapjai II. (1. ea) C++

Programozás alapjai II. (1. ea) C++

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

Mesterséges intelligencia 1 előadások

Bevezetés a programozásba. 12. Előadás: 8 királynő

Programozás alapjai 9.Gy: Struktúra 2.

Vezérlési szerkezetek. Szelekció Ciklusok

Programozás alapjai 3.Gy: C elágazások, ciklusok P R O

SZERVER OLDALI JAVASCRIPT. 3. hét Javascript nyelvi elemek

3 A C programozási nyelv szintaktikai egységei

1. Alapok. Programozás II

Programozás I gyakorlat. 10. Stringek, mutatók

Programozás 6. Dr. Iványi Péter

/* Az iter függvény meghívása és a visszatérő érték átadása a gyok változóba */ gyok = iter( n, a, e ) ;

Programozás C nyelven (3. ELŐADÁS) Sapientia EMTE

Programozás alapjai II. (2. ea) C++

Programozás alapjai II. (2. ea) C++

INFORMATIKAI ALAPISMERETEK

A C programozási nyelv I. Bevezetés

Fordítóprogramok felépítése, az egyes programok feladata. A következő jelölésmódot használjuk: program(bemenet)(kimenet)

hatására hátra lép x egységgel a toll

Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

Alkalmazott modul: Programozás

Programozás I. Metódusok C#-ban Egyszerű programozási tételek. Sergyán Szabolcs

Programozás II gyakorlat. 4. Öröklődés

S z á m í t ó g é p e s a l a p i s m e r e t e k

Programozás I gyakorlat

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

Példák tematikus csoportosításban

1. Az utasítás beolvasása a processzorba

Változók. Mennyiség, érték (v. objektum) szimbolikus jelölése, jelentése Tulajdonságai (attribútumai):

7. Strukturált típusok

B I T M A N B I v: T M A N

A C programozási nyelv I. Bevezetés

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

8. Mohó algoritmusok Egy esemény-kiválasztási probléma. Az esemény-kiválasztási probléma optimális részproblémák szerkezete

Mesterséges intelligencia, 7. előadás október 13. Készítette: Masa Tibor (KPM V.)

Objektumorientált programozás C# nyelven III.

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Átírás:

Programozás alapjai C nyelv 5. gyakorlat Szeberényi Imre BME IIT <szebi@iit.bme.hu> Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -1- Tömbök Azonos típusú adatok tárolására. Index mindig nullától indul, és csak egész típusú (char is egész) lehet. Pl: m[2][3] int alma[8]; float m[3][4]; m[0][0] alma[0] m[0][3] alma[7] m[2][0] Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -2- Tömbök (2) Értékkészlet - elemek értékkészletéből Konstansok - elemek konstansaiból Művelethalmaz indexelés (hivatkozás egy elemére) hivatkozhatunk a címére, így átadhatjuk fv. paraméterként (azaz leírjuk a nevét) tömb neve == tömb címe más művelete nincs!!! Írjunk ki fordítva! Feladat: Olvassunk be 10 valós számot a standard inputról és írjuk ki azokat a beolvasással ellentétes sorrendben! Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -3- Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -4- Írjunk ki fordítva! (2) Vázlat: Tárolni kell tömb for i, 0 to 9 olvas(i) for i, 9 to 0 kiir(i) Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -5- Írjunk ki fordítva! (3) #include <stdio.h> int main() float tomb[10]; int i; for (i = 0; i < 10; i++) scanf( %f, &tomb[i]); for (i = 9; i >= 0; i--) printf( %f, tomb[i]); return 0; Nem trükközünk a for ciklusban, mert így mindenkinek sokkal olvashatóbb!! Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -6-

Tömbök (3) Többdimenziós tömbök, for, register int tomb3d[100][100][100]; int i,j; register int k; for (i = 0; i < 100; i++) for (j = 0; j < 100; j++) for (k = 0; k < 100; k++) tomb3d[i][j][k]++; k-ra 1000000-szor hivatkozunk. Hogy gyors legyen a kód, CPU regiszterbe kérjük Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -7- Jellemző fordulat: Tömbök (4) int tomb[100]; int i, n = sizeof(tomb)/sizeof(int); for (i = 0; i < n; tomb[i++] = 0) ; a tömb méretét a fordító határozza meg; ha változtatunk, elég 1 helyen inicializáljuk a tömböt a for léptető részében, így üres a ciklusmag Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -8- Tömbök (5) Kezdeti értékadás tömböknek - elemkonstansok felsorolása: char sztring[] = hello ; int primek[] = 2,3,5,7,11,13; a tömb méretét a fordító határozza meg felsorolt elemkonstansok alapján ilyenkor nagyon fontos a sizeof(primek)/sizeof(int); fordulat az elemszám (logikai méret) megahtározásához Mekkora a sztring tömb? 6 karakteres a \0 miatt. Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -9- Összefoglalás A tömbök ugyanolyan típusú alapelembőlsokategy egységként tekintünk Pl. karakter tömbök, sztring-konstansok indexelés: 0-tól tömbméret-1-ig, csak egésszel többdimenziós tömbök fizikai tömbméret: sizeof(tombváltozó) logikai tömbméret (elemek száma): sizeof(tombváltozó)/sizeof(elemtípus) Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -10- Felsorolás v. enumeráció Elsősorban absztrakciós eszköz. Olyan egyedi típus, melynek értékkészlete a névvel megadott értékek halmaza. felsorolás_spec: enum felsorolás_tip_azon opc felsorolás_lista enum szinek piros, zold, tok = 13, makk; sz1, k23, kartya_szin; 0, 1, 13, 14 enum szinek s1 = makk; sz1 = zold; s1 = 0; k23 = 2;??? Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -11- Felsorolás v. enumeráció (2) Értékkészlet a névvel megadott értékek halmaza Konstansok a névvel megadott értékek halmaza + egészek halmaza Művelethalmaz egészekre vonatkozó műveletek Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -12-

ly számláló Készítsünk algoritmust és C programot, ami megszámolja a standard bemeneten fájl végéig érkező szövegben az ly sorozatotokat! Az lly sorozat kettőnek számít! Egyéb változat pl: llly esetén nem írjuk elő, hogy mit kell csinálni. Első változatban csak kisbetűket figyelünk. ly számláló (vázlat) sz = 0 while olvas(ch) begin ha ch = y, akkor az előzmények alapján növeljük a számlálót (sz) end (olvas(ch) beolvassa a következő karaktert és hamis fv.értékkel jelzi, ha fájl vége van) Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -13- Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -14- Az előzmények Mik azok az előzmények? Volt-e l betű? Ha volt, akkor hány l betű volt? Hogyan emlékezhetünk az előzményekre? Kóddal, azaz hol jár a program?. Adattal, vagyis egy változóban tároljuk. ly számláló algoritmusa sz = 0 while olvas(ch) begin if ch == l if olvas(ch) begin if ch == y sz = sz + 1 else if ch == l and olvas(ch) if ch == y sz = sz + 2 end end kiír(sz) Még nem jött l betű. Jött l betű. Két l betű jött Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -15- Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -16- ly számláló programja #include <stdio.h> #define olvas(c) (c = getchar())!= EOF main() int sz = 0, ch; while (olvas(ch)) if (ch == l ) if (olvas(ch)) if (ch == y ) sz += 1; Logikailag karakter, akkor miért int? else if ((ch == l ) && olvas(ch)) if (ch == y ) sz += 2; printf( ly-ok szama: %d\n, sz); Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -17- Állapot fogalma 3 állapot van nem jött l (alap) jött l (l_jott) ll jött (ll_jott) Az állapottól és a következő karaktertől függ a tevékenység és az új állapot. Az állapotinformáció is tárolható adatként. Állapotgép Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -18-

ly számláló állapottere ly számláló állapottáblával egyéb alap l y / +1 egyéb y / +2 l_jott l állapot l y egyéb alap l_jott alap alap l_jott ll_jott alap/+1 alap ll_jott ll_jott alap/+2 alap egyéb ll_jott l A gráf szemléletesebb, a táblázatból viszont nehezebb kihagyni átmenetet. Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -19- Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -20- Vázlat: ly számláló állapotgéppel sz = 0 all = alap while olvas(ch) sz_növelés_és_állapot_váltás(ch, all) kiír(sz) ly számláló állapotgéppel #include <stdio.h> #define olvas(c) (c = getchar())!= EOF void main() int sz = 0, ch; enum alap, l_jott, ll_jott all = alap; while (olvas(ch)) Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -21- Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -22- ly számláló állapotgéppel switch (all) case alap: if (ch == l ) all = l_jott; break; case l_jott: if (ch == l ) all = ll_jott; else all = alap; if (ch == y ) sz += 1; break; case ll_jott: if (ch!= l ) all = alap; if (ch == y ) sz += 2; /* end while */ printf( ly-ok szama: %d\n, sz); Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -23- Állapotgép előnyei Könnyebb átlátni, megérteni. Könnyebb módosítani. Mechanikus optimalizálási módszerekkel a felesleges állapotok könnyen kiszűrhetők. Mechanikus a kódolása. Az egész program táblázatok kitöltéséből áll. Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -24-

Megoldás általánosítása Állapot- és tevékenységtábla A beolvasott karaktertől és az állapottól függően két feladatunk van: tev.tábla tevékenység új állapot meghatározása tevékenység elvégzése Három fajta beolvasott karakterünk és 3 állapotunk van, azaz 3x3 adat határozza meg a következő állapotot, és a tevékenységet. input állapot áll.tábla új állapot Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -25- Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -26- Állapot- és tevékenységtábla(2) Táblázatvezérelt program álapot / típus alap l_jott ll_jott l y egyéb l_jott / ll_jott / ll_jott / betű típus +1 +2 Ötlet: Tegyük bele a tevékenységeket és az új állapotot is egy-egy táblázatba. Ebből egyszerű indexeléssel elérhető a köv. állapot ill. a tevékenység. Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -27- Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -28- Táblázatvezérelt program sz = 0; all = alap; while beolv(ch) begin tip = ch_típusa; sz = sz + tev_tab[all][tip]; all = all_tab[all][tip]; end; Megvalósítási kérdések Hogyan töltjük fel a táblázatokat? elemenként kezdeti értékadással Hogyan állapítjuk meg a ch típusát? elemi utasításokkal újabb tömbbel Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -29- Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -30-

ly számláló táblázatai typedef enum alap, l_jott, ll_jott all_t; typedef enuml_betu,y_betu,egyeb_betu betu_t; int all_tab[3][3] = l_jott, alap, alap, ll_jott, alap, alap, ll_jott, alap, alap ; int tev_tab[3][3] = 0, 0, 0, 0, 1, 0, 0, 2, 0 ; Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -31- ly számláló táblázattal void main() int sz = 0, ch; betu_t tip; all_t all = alap; while (olvas(ch)) switch (ch) case 'l': tip = l_betu; break; case 'y': tip = y_betu; break; default : tip = egyeb_betu; sz += tev_tab[all][tip]; all = all_tab[all][tip]; printf("ly-ok szama: %d\n", sz); Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -32- A típus is táblázattal A betűtípus meghatározása is lehetséges tömbbel. Gyakori, hogy a karakter osztályozó függvényeket is /isxxx()/ így valósítják meg. Ha az enum definícioját megváltoztatjuk, akkor kihasználhatjuk egyeb_betu==0. Így egyszerűbb a betu_tip globális a tömb feltöltése: typedef enumegyeb_betu, l_betu, y_betu betu_t; betu_t tip_tab[256]; /* ebben minden 0 */ Ez a változtatás sajnos a táblázatok feltöltését is érinti, hiszen megváltozott az index sorrend. Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -33- ly számláló tip. táblával void main() int sz = 0, ch; betu_t tip; all_t all = alap; tip_tab['l'] = l_betu; tip_tab['y'] = y_betu; while (olvas(ch)) tip = tip_tab[ch]; sz += tev_tab[all][tip]; all = all_tab[all][tip]; printf("ly-ok szama: %d\n", sz); Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -34- Mutatók és címek Indirekció Minden változó és függvény memóriában levő helye (címe) képezhető. (pl: &valtozo) Ez a cím ún. pointerben vagy mutatóban tárolható. A pointer egy olyan típus, amelynek az értékkészlete cím, és mindig egy meghatározott típusú objektumra mutat. int i; int *ip; *ip = 13; 13 i cime float f; float *fp; int i, *ip; float f, *fp; int-re mutató pointer float-ra mutató pointer ip = &i; fp = &f; ip = &i Memória Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -35- Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -36-

Mire jó? Bonyolultabban írjuk le az i =13-at? Lehet egy cél, de nem ez az igazi ok. Hardver közeli megoldások. Olvasható assembly. Memóriába ágyazott I/O. Dinamikus memóriakezelés. Nagyon fontos. Változó paraméter hiányának kiváltása. Legalább ennyire fontos. Pointer típus jellemzői Értékkészlet - adott objektum címe Konstansok - NULL (0) Művelethalmaz: értékadás indirekció címaritmetika relációk Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -37- Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -38- Címaritmetika C nyelv egyik jellegzetessége, és a gépközeli jelleget erősíti. Jelöljük i-vel az egész értéket, p-vel a pointert: p+i p p = p + i * sizeof(obj) p-i p p = p - i * sizeof(obj) p-p i p = (p - p) / sizeof(obj) Eggyel való növelés a következő objektum címzését eredményezi. (p = p + 1, p += 1, p++) Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -39- Címaritmetika példák int *ip, t[10]; for (ip = &t[0]; ip < &t[10]; *ip++ = 0); Már nem létezik float *fp, ft[10]; for (fp = &ft[0]; fp < &ft[10]; *fp++ = 0); Az ip++ ill. az fp++ elemről-elemre lép. Pont akkorát lép, amekkora az adott elem (int ill. float) mérete. Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -40- Címaritmetika példák (2) int *ip, t[10]; *(t+2) = 12; t[2] = 12; A tömb azonosítója a 0. elem címét jelenti. ip = &t[10] ip t== 10 t[i] *(t+i) &t[i] t+i A prioritásra, kötési szabályra és a sorrendre ügyelni!!! int *ip, i, t[10]; ip = t; *ip++ = 23; /* mi a fő- és mellékhatás? */ *++ip = 23; /* hova ír? */ (*ip)++; /* ez mit növel? */ /* Vigyázat a kiértékelés sorrendjét nem * határozza meg a prioritás */ *ip++ = *ip++; /* nem definiált működés!! */ t[i++] = i++; /* nem definiált működés!! */ *i = *ip+++*ip;/* ravasz, de nem jó */ Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -41- Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.17. -42-