Programozás alapjai GEIAL 312BL. Wagner György Általános Informatikai Tanszék. Programozás alapjai (C)



Hasonló dokumentumok
Programozás alapjai 9. előadás. Wagner György Általános Informatikai Tanszék

Programozás alapjai. 2. előadás

Programozás alapjai. Wagner György Általános Informatikai Tanszék

Programozás alapjai. 8. előadás

Programozás alapjai GEIAL 312BL. Wagner György Általános Informatikai Tanszék. Programozás alapjai (C)

Adatszerkezetek. Nevezetes algoritmusok (Keresések, rendezések)

Programozás alapjai. 5. előadás

Programozás alapjai GEIAL316G, GEIAL312B-BP

C programozás. 1 óra Bevezetés

Adatbázis rendszerek Gy: Algoritmusok C-ben

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés

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

Programozás alapjai GEIAL316G, GEIAL312B-BP

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

Java II. I A Java programozási nyelv alapelemei

Bánsághi Anna 2014 Bánsághi Anna 1 of 68

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

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

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)

Kifejezések. Kozsik Tamás. December 11, 2016

Webprogramozás szakkör

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

Adatszerkezetek Adatszerkezet fogalma. Az értékhalmaz struktúrája

1. Jelölje meg az összes igaz állítást a következők közül!

Járműfedélzeti rendszerek II. 1. előadás Dr. Bécsi Tamás

Programzás I gyakorlat

Operációs rendszerek. 11. gyakorlat. AWK - szintaxis, vezérlési szerkezetek UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Kifejezések. Kozsik Tamás. December 11, 2016

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

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós augusztus 29. Széchenyi István Egyetem, Gy r

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

Occam 1. Készítette: Szabó Éva

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 alapjai (ANSI C)

OOP I. Egyszerő algoritmusok és leírásuk. Készítette: Dr. Kotsis Domokos

Vezérlési szerkezetek

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

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

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

INFORMATIKA javítókulcs 2016

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

A programozás alapjai

Java II. I A Java programozási nyelv alapelemei

AWK programozás, minták, vezérlési szerkezetek

A C# programozási nyelv alapjai

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

Adatszerkezetek 1. előadás

Programozás I gyakorlat

IT - Alapismeretek. Feladatgyűjtemény

Szoftvertervezés és -fejlesztés I.

Programozási segédlet

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

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

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Bemutatkozás. Bemutatkozás. Bemutatkozás. Bemutatkozás. 1. előadás. A tárgy címe: A programozás alapjai 1

Kinek szól a könyv? A könyv témája A könyv felépítése Mire van szükség a könyv használatához? A könyvben használt jelölések. 1. Mi a programozás?

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós szeptember 27. Széchenyi István Egyetem, Gy r

Információk. Ismétlés II. Ismétlés. Ismétlés III. A PROGRAMOZÁS ALAPJAI 2. Készítette: Vénné Meskó Katalin. Algoritmus. Algoritmus ábrázolása

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

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

BASH script programozás II. Vezérlési szerkezetek

Adatszerkezetek Tömb, sor, verem. Dr. Iványi Péter

Algoritmizálás és adatmodellezés tanítása 1. előadás

A programozás alapjai előadás. Amiről szólesz: A tárgy címe: A programozás alapjai

Felvételi tematika INFORMATIKA

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

Programozás II. 2. Dr. Iványi Péter

AWK programozás, minták, vezérlési szerkezetek

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Karakterkészlet. A kis- és nagybetűk nem különböznek, a sztringliterálok belsejét leszámítva!

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

Készítette: Nagy Tibor István

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

Pásztor Attila. Algoritmizálás és programozás tankönyv az emeltszintű érettségihez

Algoritmizálás. Horváth Gyula Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Programozási tételek. Dr. Iványi Péter

A PROGRAMOZÁS ALAPJAI 3. Készítette: Vénné Meskó Katalin

Algoritmusok pszeudókód... 1

Objektumorientált Programozás III.

sallang avagy Fordítótervezés dióhéjban Sallai Gyula

Algoritmusok és adatszerkezetek I. 1. előadás

Labor gyakorlat Mikrovezérlők

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

Java programozási nyelv

Felvételi vizsga mintatételsor Informatika írásbeli vizsga

Rendezések. A rendezési probléma: Bemenet: Kimenet: n számot tartalmazó (a 1,a 2,,a n ) sorozat

3 A C programozási nyelv szintaktikai egységei

Algoritmusok Tervezése. 4. Előadás Visual Basic 1. Dr. Bécsi Tamás

Összeadás BCD számokkal

C programozási nyelv

Labor gyakorlat Mikrovezérlők

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

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

Bevezetés az informatikába

Programtervezés. Dr. Iványi Péter

Készítette: Nagy Tibor István

Szoftvertechnológia alapjai Java előadások

Adatszerkezetek 1. Dr. Iványi Péter

Adatok ábrázolása, adattípusok

Átírás:

Programozás alapjai GEIAL 312BL Wagner György Általános Informatikai Tanszék

Hirdetmények (2) Jegyzet: Ami az előadáson elhangzik Ajánlott irodalom: Elérhetőség: Tel: (46)565-111/17-56 Tel: (30)9383-669 E-mail: wagner@iit.unimiskolc.hu Benkő Tiborné, Benkő László, Tóth Bertalan: Programozzunk C nyelven (ComputerBooks kiadó, Budapest, ISBN 963-618-090-3

Alapfogalmak (1) Adat: implicit jelentéssel rendelkező ismeretek, tények. Információ: olyan közlés, amely valamely értelemben fennálló bizonytalanságot szüntet meg. Bit: - bináris számjegy memóriarekesz információ egység Byte: - 8 bitből álló számjegycsoport memóriarekesz Word (szó): CPU függő Character (karakter): egy adott karakterkészlet valamely eleme Code (kód): egyezményes jel, szimbólum, kapcsolt jelentéssel

Alapfogalmak (2) Pl: ASCII: American Standard Code for Information Interchange 0-127-ig kötött, felette különböző ajánlások még: ECMA, EBCDIC, stb.

A számítástechnika tárgya A számítástechnikai eszközök tervezésével üzemeltetésével alkalmazásával (!) összefüggő ismeretek, törvényszerűségek, tapasztalatok gyűjtése, rendszerezése és fejlesztése.

Csoportosítások (1) Működési elv szerint: analóg: az informácókat folytonos értéktartományban hordozzák digitális: az információk és utasítások (!) kettes számrendszerben vannak tárolva. hibrid: analóg és digitális vegyesen

Csoportosítások (2) Teljesítmény szerint: home (Commodore, ZX 81, Sony PSX,...) personal (PC-k) mini (PDP, TPA, VAX,...) nagy (IBM, Cray,...) szuper (Hitachi, Cray)

Csoportosítások (3) Cél szerint: célszámítógép (blokkolás gátló, motorvezérlő, varrógépbe, ) univerzális számítógép Fizikai fejlettség szerint: 1. generációs (1946-) 2. generációs (1955-) 3. generációs (1966-) 4. generációs (1975-),...

Az ENIAC 180 KW áramfelvétel 18.000 elektroncső volt hogy 20 percig (!) hibamentesen számolt ballisztikus számításokhoz használták 5000 * gyorsabban számolt mint az ember huzalozott programozású volt Neumann Jánost kérték meg, tekintse át Javaslata: ne fix huzalozás legyen!

A számítógép jellemzői (1) elektronikus (elektronikus eszközökből áll) digitális (diszkrét állapotok jellemzik) automatikus (külső beavatkozás nélkül működik) tárolt programú (eleinte fix huzalozású, majd számvezérlésű) programvezérlésű (olyan berendezés, amely végesszámú, különféle műveletfajta végrehajtására alkalmas. Ezen műveletek elemeiből kell egy összetett folyamat végrehajtására szolgáló időrendi vezérlést készíteni, a programot.)

A számítógép klasszikus funkcionális rendszervázlata Beviteli egység Tároló egység (adat + program) Kiviteli egység Aritmetikai Logikai Egység (ALU) Tényleges műveletvégzés Vezérlő egység (időrendi vezérlés a tárolt program alapján)

Meghatározás Számítógép: olyan technikai rendszer, amely adatok, információk feldolgozására képes, közvetlen emberi beavatkozás nélkül a benne letárolt utasítások alapján. Erőforrás: a rendeltetésszerű használathoz szükséges komponensek összessége.

Erőforrások (1) Hardware A számítógép fizikai megvalósítása 1. Központi egység (CPU) 2. Központi memória (adatok és utasítások tárolására) 3. Áramkörök az adattovábbításra (sin, busz, ) Software Programok, utasítások összessége 1. Rendszerszoftverek (a szgéppel együtt megvásárolhatók, a felhasználó munkáját könnyítik) a) Vezérlő szoftver (operációs rendszer, amely az erőforrások optimális kihasználtságát maximalizálja) b) Feldolgozó szoftver (szövegszerk., segédprg.,...)

Erőforrások (2) 4. Perifériák: a). Tömegtárolók (mágneslemez,.) b). Kapcsolattartás a felhasználóval (keyboard, display, mouse, tablet, plotter, printer, ) c). Más rendszerekkel való kapcsolattartás eszközei (hálózati kártya, modem,...) 2. Alkalmazói szoftverek (egyedi célra írottak, pl.: Word, Photoshop, )

Az OS spec. része (Command Interpreter) Erőforrások (3) Felhasználó Egyéb rendszerprogramok (Compiler) Alkalmazói szoftverek (TP) Kis programok, az OS-sel tudnak kapcsolatot tartani Adatbáziskezelő Hálózatkezelő mag Programok együttese, a hardware-t kezelik OS mag (KERNEL) Hardware

A számítógépes feladatmegoldás eszközei Adatok (Amiken utasításokat hajtunk végre) Utasítások (Amiket végrehajtunk) Program struktúra

Adatok Konstans (a programon belül végig állandó) Változó (a program során más és más értéket vehet fel) Adattípusok (felvehető értékük szerint) numerikus egész valós szöveges karakter sztring logikai

Algoritmus (definíció) Egy meghatározott cél elérésére irányuló, egymástól elkülönített tevékenységek alkalmas sorozata, melynek segítségével bizonyos kiindulási helyzetből, végesszámú közbenső állapoton keresztül, előírt feltételeknek eleget tevő véghelyzethez jutunk.

Példa egyszerű numerikus algoritmusra c = a + b vedd a-t vedd b-t képezd a+b -t legyen c = a+b -vel tedd c-t vége

Numerikus algoritmus jellemzői Diszkrét jellegű: Véges sok elemi lépés. (A leírása!!) Determinált (meghatározott): Mindig tudjuk, a következő lépésben mi lesz a teendő. Elemiek a lépések: Már nem függ külső paraméterektől. Célra irányított (teljes): Van egy értékrendszer, ami ezt a célt kifejezi. Ezt akarjuk elérni. Véges: Véges számú lépésben eléri célját. (A megoldása!) Egész feladatosztályra érvényes: A bemenő adatok értelmezési tartománya: minden lehetséges adat.

Algoritmus leírási módok (1) - természetes nyelv (vagy más néven verbális.) Gyors, mindenki által könnyen érthető, de pontatlan. Pl.: kerékcsere: Labilis mozgást érzékelek; jelzek jobbra;leállok; kulcs kikapcs; kézifék be. Amíg nem szállhatok ki, hátranézek. Kiszállok,, szükséges szerszámokat előveszem; Dísztárcsa le, rögzítőcsavart lazít,, emelek, kereket le. Ha van pótkerék, akkor: kiveszem pótkereket, kereket be, pótkereket fel,,légnyomást ellenőriz. Ha megfelel semmit, különben míg meg nem felel pumpál, ellenőriz. Ha nincs, ragaszt, majd pumpál, stb.., majd elindul

Algoritmus leírási módok (2) - folyamat ábra: többféle elterjedt jelölésrendszer létezik. START STOP i>3 true false i=2 false i=1 i>3 true i=2 x=3*j+i 1 1 be i, j x, y ki

Algoritmus leírási módok (3) Pszeudonyelv: elemi utasítások összessége. Olyan vezérlő vagy keret utasítások, amelyek az algoritmus logikai vázát adják. (Pszeudo azért, mert nem programnyelv, hanem viszonylag kötetlen, programnyelvszerű jelölésrendszer. Gyakran emlegetik PDL, azaz Problem Definition Language - probléma leíró nyelv - néven is.) Pl.: program átvált olvas dollár forint = dollár * árfolyam kiír forint vége átvált

Algoritmus leírási módok (4) Hiánya: kódoláskor nem derül ki az adatokról semmi (méret, cél, típus), ezért a PDL leíráshoz mindig hozzátartozik egy ADATLEÍRÁS. Felépítése: azonosító méret típus jelentés Pl.: spoz = x i (i=1...n), ha x i > 0 azonosító n integer az elemek száma spoz real a pozitív elemek összege x(n) real az adatok tömbje i integer ciklusváltozó méret és típus egyben jelentés

Algoritmus leírási módok (5) Metanyelv (a nyelv nyelve ): Sajátos szókészlettel és nyelvtannal rendelkező nyelv, melynek segítségével egy nyelv formai és tartalmi elemzése elvégezhető. Pl.: Backus-Naur Forma (BNF) Egy szimbólumrendszer a PASCAL nyelv leírásához Szimbólumok: ::= szabály (definíció szerint) választás (vagy), - ismétlés nullaszor vagy többször < > szintaktikai egység

Algoritmus leírási módok (6) Bármely magasszintű programozási nyelv: PL/1, ADA, FORTRAN, APL, C, C++, JAVA, PASCAL, LISP, stb PROGRAM CNSUME END CHARACTER * 50 BUF DATA NEXT /1/, BUF / / BUF(NEXT:NEXT) = C IF (C.NE. ) END IF WRITE(*, (A) ) BUF SAVE BUFFER, NEXT

A program Számítógépi program: kezelt adatok leírása elvégzendő tevékenységek Programozási nyelv: szimbólumrendszer, melynek segítségével programot írhatunk. Progr. nyelv fő összetevői: karakterkészlet nyelvi elemek kulcsszavak, operátorok azonosítók, konstansok, utasítások szintaktika (nyelvtan) szemantika (jelentéstan) (A repülőgép ezután hajszálait tépdesve kockásan ráugrott a levegőre.)

A C nyelv története 1963: BCPL (Basic Combined Programming Language). Kifejlesztője: Martin Richards 1970: B nyelv (B Bell) Kifejlesztője: Ken Thompson (AT&T Bell Labs) Célja: a Unix OS kernelének megírására Nem volt elég hatékony 1971: C nyelv Kifejlesztője: Dennis Ritchie

A C nyelv története (2) Nem volt pontos leírása a nyelvnek. Használni csak az AT&T által készített UNIX-okban lehetett, tanulása autodidakta módon Feladat: lehessen más környezetbe is implementálni Megoldás: Kernighan Ritchie: The C Programming Reference (1978, magyarul: Műszaki Könyvkiadó, 1985)

A C nyelv története (3) Nem volt teljes körű a definíció, ezért elég eltérő változatok készültek el. Probléma: a különböző gépeken készült C programok máshol nem voltak futtathatók Cél: egységesítés, a portabilitás érdekében Megoldás: 1983: ANSI X3J11 bizottság (tagjai különböző számítógépes cégek alkalmazottjai) 6 évvel később: ANSI C X3.159-1989

ANSI C Kidolgozásának fontosabb szempontjai: A forráskód legyen hordozható De nem baj, ha nem hordozható Tartsa meg a C szellemiségét: Bízz a programozóban! Ne akadályozd a programozót a munkájában, hiszen ő tudja mi az, amit tennie kell! A nyelv legyen kicsi és egyszerű! Valamely művelet elvégzésére csak egy utat biztosíts! Tedd gyorssá a programot, még akkor is, ha ez nem biztosítja a kód hordozhatóságát!

A C nyelv Érvényes karakterkészlet: A z! # % & ` ( ) + - * /, ; < > =? [ ] \ { } ~ ^

Azonosítók Mire: konstansok, típusok, változók, függvények jelölésére. Szintaxisuk: betűvel kezdődő alfanumerikus karaktersorozat. Az _ (aláhúzásjel) betűnek számít, de azzal NEM kezdődhet! ( ) Hatáskörük: használatuk hatáskörükön belül egyértelmű és kizárólagos. (később pontosítjuk) A kis és nagy betűk megkülönböztetődnek! pl.: x, y, x2, valtozo, Valtozo, var5, Osszeg, (Standard függvény azonosítók pl.: printf, scanf, exp, cos, acos, fopen, fgetc, ) Fontos! Vannak foglalt azonosítók kulcsszavak pl.: auto, break, const, do, if, int, static, void, while,

Megjegyzés (komment) // Ez egy megjegyzés, és nem lehet több soros. // Ha több soros kell, akkor minden sor // elejére ki kell tenni /* ez is egy megjegyzés, de ez lehet több soros is, mert van lezárója */

Operátorok!!= % %= & && &= ~ * *= + ++ += - -- -= ->. /, /= < << <= <<= = == ^ ^= > >> >= >>= [ ] = sizeof

C program szerkezete (1) Blokkokat használunk A C program függvényekből áll Minden programban lennie kell 1 db main nevű függvénynek A függvények meghívhatják egymást Meghívhatják önmagukat is (rekurzió) Mindenről nyilatkozni kell (definiálni illetve deklarálni kell)

C program szerkezete (2) Jellemző sorrend: deklarációk main() függvény függvénydefiníciók

Példa program #include <stdio.h> int main (void) { printf ("indulunk..."); return 0; }

Javasolt PC-s fejlesztőrendszer DEV C++ 4.9.9.2 (ingyenes) Letölthető: http://www.bloodshed.net/

PC-s memóriamodellek Tiny Small Medium Compact Large Huge (Windows alatt ezek már nem használatosak)

Egy futtatható program előállításának menete Forráskód (fv-ek.c) Compiler Tárgykód (fv-ek.obj) Tárgykód könyvtár (fv-ek.lib) Forráskód (valami.c) Compiler Tárgykód (valami.obj) Futtatható program (valami.exe)

Konstans definíció Azonosítót rendelünk konstans értékhez, kifejezéshez. Ez az azonosító - a konstans neve - szolgáltatja a fordítás alatt a konstans értéket. A program futása alatt nem változtatható!

Szám: Konstans lehet decimális egészek (int): 325, +325, -400, 0 (nem nullával kezdődik) Hexadecimális egészek: 0x5F Oktális egészek: 037 (nullával kezdődik, utána 0..7 közötti érték lehet) valósok (real): fixpontos: 0.1, +0.1, -0.012 lebegőpontos: 0.1E0, +0.1e-1, 0.0012E+1 Karakter: `a` `1` `ab` (aposztrófok közé írt 1 vagy több karakter) a több karakteres konstans nem szabványos!! Karakterlánc (sztringkonstans): (idézőjelek közé írt karakterek) ez egy meglehetősen hosszú sztring ez rövid

Utasítás Függvényhívó utasítás: (pl.: scanf(), printf(), ) Értékadó utasítás: (az a tevékenység, melynek során egy változó értékét módosítjuk) <változó> = <kifejezés>; Nem BNF!! kifejezés: (konstans vagy változó) operandusokból és operátorokból álló kiértékelhető szerkezet. (pl.: a = 30.0 * 3.1415 / 180.0; )

Változó definíció A memória egy része, ahol a program futása közben más - és más (változó) értékek jelenhetnek meg. Minden változónak van: Neve: a tárolóhely címére utal. Ez a cím egyelőre elérhetetlen. Címe: a memória területet azonosítja. Típusa: a névvel címzett memóriarész értelmezése (a programozó szemszögéből!) Aktuális értéke (tartalma): a névvel címzett memóriarész (tároló) tartalma egy adott időpillanatban. Érvényességi köre: a program azon része, amelyben a változóra a nevével érvényesen hivatkozni lehet.

Valós számok kiíratása (1) A mezőszélesség fogalma: Azoknak a karaktereknek a száma, amelyek egy szám adott tizedesjeggyel történő kiíratásához szükségesek. Pl.: 3.1415927 tizedesjegyek száma (7) tizedespont (1) egészek száma (1) előjelhely (1) Mezőszélesség: 1+1+1+7=10 printf( Pi = %10.7f, a);

Valós számok kiíratása (2) A tizedesjegyek számának maximális értéke a választott típustól függ. Ha a tizedesjegyek számának megadása elmarad, akkor még duplapontos típus esetén is csak 6 tizedesjeggyel történik a kiírás. Pl.: 0,1234567890123456 0,123457 [ -] <egész>. <tizedesjegyek> e [+ -] <kitevő> 1 1 1 min. 1 1 1 3 = min 9 Lebegőpontos ábrázolási forma esetén a mezőszélesség minimum 9 karakter, és a tizedesjegyek számának növekedésének megfelelően nő. A mezőszélességet célszerű kicsit megnövelni. Így az egymás melletti számok nem olvadnak össze.

Gyakorlás Egyelőre papíron, folyamatábra jelekkel oldjuk meg a feladatokat

Vezérlési szerkezetek (1) i>3 true false i>3 true false i=2 i=1 i=2 Működése: if (logkif) szerkezet esetén ha az if utáni logikai kifejezés értéke igaz, akkor a () utáni utasítás végrehajtódik. Egyébként az if UTÁNI első utasítás hajtódik végre. if (logkif) else szerkezet esetén a logikai kifejezés hamis értékénél nem a következő utasítás, hanem az else utáni utasítás hajtódik végre.

Vezérlési szerkezetek (2) if utasítás példa: if (n<0) printf( az érték negatív ); if else utasítás példa: if (n<0) printf( az érték negatív ); else printf( az érték 0 vagy pozitív );

Vezérlési szerkezetek (3) Megjegyzések: Else ág esetében utasítás1 után VAN pontosvessző! Egymásba ágyazott If utasításnál vigyázni, hogy az Else ág hova tartozik! utasítás és utasítás1 csak 1(!) utasítást jelent.

Összetett utasítás Összetett utasítás vagy utasítás zárójel: { utasítás; } Az összetett utasítás 1 utasításnak számít, így többnyire olyan helyen használatos, ahol egyébként csak 1 utasítás lenne használható. A { } párban van, emiatt célszerű egymás alá írni.

If problémák (1) if (a < b) if (a < d) utasítás1; else utasítás2; Hova tartozik az else? (Első, vagy második if?) if (a < b) if (a < d) utasítás1; else utasítás2; 1 utasítás, így a második if-hez tartozik Így olvashatóbb: if (a < b) if (a < d) utasítás1; else utasítás2; Nem az számít, hova írom az else-t: if (a < b) if (a < d) utasítás1; else utasítás2;

If problémák (2) if (a < b) {if (a < d) utasítás1;} else utasítás2; Hova tartozik az else? (Első, vagy második if?) if (a < b) { if (a < d) utasítás1; } else utasítás2; Így olvashatóbb: if (a < b) { } if (a < d) Utasítás zárójel! Záródik az utasítás, tehát az elsőhöz tartozik. utasítás1; else utasítás2; Nem a tagolástól kerül jó helyre az else ág. Az csak segít a hibakeresésekor!

Logikai kifejezés Mik képeznek logikai kifejezést? Relációs operátorok bármilyen kifejezésekkel ( a >= 5 ) logikai operátorok logikai kifejezésekkel. Logikai értéket képviselhetnek: Konstansok (pl.: #define TRUE 1) Változók: (pl.: int Logikai;) Ezek kiértékeléskor logikai értéket eredményezhetnek.

Relációs operátorok == < > <= >=!= 2 operandusú Precedenciájuk az aritmetikai operátorok után.

Precedencia (A műveletek végrehajtásának sorrendje) Alapszabályok: 1. Zárójelek közötti kifejezések kiértékelése, mintha a zárójelen belül egy operandus lenne. Mindig a legbelső zárójelen belül kezdődik meg a kiértékelés. Pl.: (x + 1) < ( (x - abs(x)) * 1.6) 2. Azonos precedenciájú operátorok kiértékelése balról-jobbra történik. (Általában, bár a compiler optimalizációs célból átrendezheti a kiszámítást.) Pl.: 7.0 + a - 1.0 3. Különböző precedenciájú operátorok esetén a magasabb precedenciájú értékelődik ki előbb. (Precedencia táblázat!) Pl.: 7 + a * 9 / abs (i)

Precedencia táblázat ( ) [ ]. ->! ~ - ++ -- & * (type cast) sizeof * / % + - << >> < <= > >= ==!= & ^ &&?: = += -= *= /= %= <<= >>= &= = ^= Jobbról balra Jobbról balra Jobbról balra

&&: (ÉS, logikai szorzás) Logikai operátorok : (VAGY, logikai összeadás)!: (NEM, logikai negáció) A logikai operátorokat háromféleképpen szokás tárgyalni: igazságtáblával kapcsolóáramkörrel Venn-diagrammal (halmazzal)

Igazságtáblával && F T F F F T F T Vagy: && F F F F T F T F F T T T F T F F T T T T F F F F T T T F T T T T! F T T F! F T T F

Kapcsolóáramkörrel && A lámpa ég, ha mindkettő be van kapcsolva A lámpa ég, ha legalább az egyik be van kapcsolva

Venn-diagrammal &&!

Vezérlési szerkezetek (3) while utasítás while (logikai kifejezés) utasítás; Működése: mindaddig ismétli a while utáni utasítást, amíg a zárójelben levő logikai kifejezés igaz.

Vezérlési szerkezetek (4) do while utasítás: do utasítás while (logikai kifejezés); Működése: Amíg a while utáni logikai kifejezés értéke igaz, addig ismétli a do utáni utasítást.

Folyamatábra jelekkel utasítás utasítás true lkif true lkif false false do while while

Példák #include <stdio.h> int main (void) { char valasz; printf("érthető?\n"); do scanf("%c",&valasz); while (valasz!= 'i'); printf("rendben\n"); return 0; } #include <stdio.h> int main (void) { } char valasz; printf("érthető?\n"); while (valasz!= 'i') scanf("%c",&valasz); printf("rendben\n"); return 0; Hibás!!! Úgy vizsgálja meg a valasz azonosítójú változó értékét, hogy az még nem kapott értéket!

Vezérlési szerkezetek Gyakorlás, írjunk kis programokat

Ciklusok (1) Meghatározás: egy adott tevékenységsor többszöri, egymás utáni végrehajtása. Fajtái: taxativ iterativ Fajtái: elöltesztelő hátultesztelő

Ciklusok (2) Részei: előkészítő rész ciklus mag végértékkel történő összehasonlítás döntés módosítás helyreállítás Ciklusszámláló esetében nem elfelejteni a kezdőértékadást!

Még a logikai operátorokról De Morgan-szabály: Not (A And B) Not (A Or B) (Not A) Or (Not B) (Not A) And (Not B) Pl.: 5 és 10 közötti szám beolvasása üzenettel:

Vezérlési szerkezetek (5) A FOR utasítás for ( init utasítás; feltétel; léptető utasítás) utasítás; Bármelyik rész (akár mindhárom egyszerre) elhagyható. Működése: 1. Végrehajtódik az init utasítás 2. Leellenőrződik a feltétel. 3. Ha igaz, vagy ha nem lett megadva, akkor először végrehajtódik az utasítás, majd azután a léptető utasítás. Ha hamis, akkor a program következő utasítása fog végrehajtódni. 4. Ezután ismétlés a 2. ponttól.

Vezérlési szerkezetek (6) Alkalmazási területe: elsősorban adatsorozatok feldolgozása esetén Folyamatábrával: init utasítás feltétel false true utasítás Léptető utasítás

Példa for (i=1; i<= 10; i++) printf( i= %d \n, i); s=0; for(i=1; i<= 100; i++) s=s+i; for(s=0, i=1; i<=100; s=s+i, i++);

Tömbök (1) Összetett adatobjektum, mely meghatározott számú komponensből áll. A tömb bármilyen típusú lehet. (kivéve void) Az elemek azonos típusúak. Az összetett objektum neve: a tömb neve Egyetlen komponense: a tömb eleme A tömb elemeire indexek segítségével hivatkozhatunk. Az index-ek típusa: egész. Az első elem sorszáma: 0 Deklarálása a változó deklarációs részben.

Tömbök (2) Pl.: t : int t [10 ]; 0 1 2 9 Pl.: double t [20 ]; 0 1 2 10 17 18 19

Tömbök (3) Hivatkozás a tömb elemeire: tömbnév [ indexkifejezés ] Sem az index-re, sem az index kifejezésre nincs ellenőrzés! Pl.: t [ 2 ] = 3.1415; t [ i + 1 ] = t [ i ] - 5; i = n-1 esetén az index n lesz! i értékét a rendszer előtte kiértékeli. Ciklus esetén vigyázni! for (i = 0; i <= n -1;...)

Tömbök (4) int i, t[10], j; j=5; for(i=1; i<=10; i++) t[i] = 0; Amikor i = 10, akkor valójában j értéke kerül módosításra!! i t*0+ t*1+ t*9+ j

Több dimenziós tömbök (1) 1 dimenziós mátrix: 1 2 3 4 5 double t[5]; 2 dimenziós mátrix: 3 dimenziós mátrix: 1 2 3 1 1 2 3 4 5 6 1 2 3 4 5 3 2 1 2 3 4 double t[3][5]; Sor Oszlop i = 0 5 j = 0 3 k = 0 2 T [2][3][0] A több dimenziós tömbök a memóriában sorfolytonosan kerülnek tárolásra.

Több dimenziós tömbök (2) Több dimenziós tömb kezeléséhez annyi egymásba ágyazott ciklusra van szükség, ahány dimenziós a tömb.

Alap algoritmusok Számlálás Összegzés Átlagolás Osztályba sorolás Minimum-maximum keresés

Számlálás #include <stdio.h> #define NMAX 100 int main (void) { int i, n, db; double t[ NMAX]; printf ( Kérem az elemek számát (Max 100): ); do scanf( %d, &n); while ((n < 1) (n > NMAX)); db = 0; for (i = 0; i < n; i++) { scanf ( %lf, &t * i +); if (t [ i ] >= 0) db = db + 1; } printf( Összesen %d elem volt pozitív\n, db); return 0; }

Összegzés #include <stdio.h> #define NMAX 100 int main (void) { int i, n; double szumma, t[ NMAX]; printf ( Kérem az elemek számát (Max 100): ); do scanf( %d, &n); while ((n < 1) (n > NMAX)); szumma = 0; for (i = 0; i < n; i++) { scanf ( %lf, &t * i +); if (t [ i ] >= 0) szumma = szumma + t [ i ]; } printf( A pozitív elemek összege: %lf \n, szumma); return 0; }

Átlagolás #include <stdio.h> #define NMAX 100 int main (void) { int i, n, db; double szumma, t[ NMAX]; printf ( Kérem az elemek számát (Max 100): ); do scanf( %d, &n); while ((n < 1) (n > NMAX)); db = 0; szumma = 0; for (i = 0; i < n; i++) { scanf ( %lf, &t * i +); if (t [ i ] >= 0) { szumma = szumma + t [ i ]; db++; } } printf( A pozitív elemek átlaga: %lf \n, szumma / db); return 0; }

Minimum-maximum keresés #include <stdio.h> int main (void) { int i, mini, t[100]; for (i = 0; i < 100; i++) scanf ( %d, &t * i +); mini = 0; for (i = 1; i < 100; i++) if (t [ i ] < t [ mini ]) mini = i; printf( A legkisebb elem indexe: %d,és értéke: %d \n, mini, t * mini +); return 0; }

Osztályba sorolás Tipikus példa, év végi átlagok: AH FH Osztály 2.00 2.50 elégséges 2.51 3.50 közepes 3.51 4.50 jó 4.51 5.00 jeles Megvalósítása egyszerű esetben IF-ekkel, de ügyesebb, ha tömbben tároljuk az osztályok határait...

Cserélve kiválasztásos rendezés (1) A minimum-maximum keresés elvére épül. Ismétlés: minimum keresés A halmazból egy tetszőleges elemet kinevezünk legkisebb elemnek (általában az elsőt), majd az összes többit sorban összehasonlítjuk azzal. Minden alkalommal, amikor kisebbet találunk, megjegyezzük annak a sorszámát, és a továbbiakban már azt tekintjük a legkisebbnek. A keresés legvégén megkaptuk a legkisebb elem sorszámát.

Cserélve kiválasztásos rendezés (2) A rendezés elve: A rendezett halmazban első elem a legkisebb elem. A második elem a második legkisebb, vagyis az elsőtől jobbra levő elemek közül a legkisebb. A harmadik a másodiktól jobbra levő elemek közül a legkisebb Minden elem a tőle jobbra levő elemek közül (beleértve saját magát) a legkisebb. Ügyelni! Az utolsó elemtől jobbra már nincs elem!!

Ciklus az 1. elemtől az utolsó előttiig Cserélve kiválasztásos rendezés (3) for (i = 0; i <= n 2; i++) { Állítás Minimum keresés Csere mini = i; for (j = i + 1; j <= n - 1; j++) if (t [ j ] < t [ mini ]) mini = j; s = t [ i ]; t [ i ] = t [ mini ]; t [ mini ] = s; }

Pointer-függvény - táblán

Vége a C anyagának

Keresések Általános feltétel: N rekordból álló halmazból a rekordok egyikének lokalizálása. További feltétel: Minden rekord tartalmazzon egy kulcsmezőt. Feladat: Megtalálni azt a rekordot, amelynek kulcsa megegyezik a keresett kulccsal. Két eset: A keresés sikeres vagy sikertelen lehet.

Szekvenciális keresések 1. Adott az R 1, R 2,, R n rekordok halmaza, ahol K 1, K 2,, K n jelöli a megfelelő kulcsokat. Feltétel: n >= 1 Megoldás: az első rekord kulcsának összehasonlítása a keresett kulccsal. Ha megegyezik, a keresésnek sikeresen vége. Ha nem egyezik meg, vizsgálat a file végére. Ha vége, a keresésnek sikertelenül van vége. Ha nincs vége, akkor a következő rekord kulcsának a vizsgálata...

Szekvenciális keresések (2) 2. Gyors szekvenciális keresés: Elv: az előző algoritmusban 2 vizsgálat történik: kulcs egyezés van-e? file vége van-e? Ha az egyik feltétel elvethető, akkor a keresés felgyorsul. Megoldás: egy fiktiv (ál)rekord a file végére R n+1 -ikként, amelyre nézve K n+1 = K. Így a file vége vizsgálat kimaradhat.

Szekvenciális keresések (3) 3. Javított gyors szekvenciális keresés: Elv: Megpróbálni egy cikluslépésen belül két rekordot megvizsgálni. Megoldás: továbbra is a fiktiv rekordot felvenni R n+1 rekordként, majd a ciklust i = -1-ről indítva, és a ciklusváltozót kétszer növelve (Inc(i); Inc(i);) összehason-lítani az R i, R i+1 rekordok K i, K i+1 kulcsait K-val. Eredmény: az 1. algoritmushoz képest kb. 30 %-kal gyorsabb!

Szekvenciális keresések (4) 4. Rendezett táblában szekvenciálisan keresni: Elv: Az előző algoritmusok csak akkor tudták eldönteni a sikertelen keresést, haa file végére értek. Egy rendezett táblában ha a K j kulcs nagyobb K-nál, akkor belátható, hogy a keresett rekord nincs a táblában. Eredmény: sikertelen keresés esetén átlagosan kétszer gyorsabb!

Szekvenciális keresések (5) 5. A tábla rendezettségi szempontját megváltoztatni: Elv: feltehető, hogy a kulcsokra nem egyforma gyakorisággal hivatkozunk. Ekkor: Megoldás: K i kulcs p i valószínűséggel fordul elő, ahol: p 1 + p 2 + + p n = 1 (100 %) Azokat a rekordokat előre tenni a táblában, melyeknek a gyakorisága nagyobb.

Rendezések Javasolt irodalom: D. E. Knuth: A számítógép programozás művészete III. kötet

Rendezések Alapelvek: Beszúró rendezés: egyesével tekinti a rendezendő számokat, és mindegyiket beszúrja a már rendezett elemek közé. (Kártyalapok rendezése) Cserélő rendezés: ha két elem nem a megfelelő sorrendben követi egymást, akkor felcserélésre kerülnek. Ez az eljárás ismétlődik mindaddig, míg további cserére már nincs szükség. Kiválasztó rendezés: először a legkisebb (vagy legnagyobb) elemet határozzuk meg, és a többitől valahogy elkülönítjük. Majd a következő legkisebbet választja ki, stb Leszámoló rendezés: minden elemet összehasonlítunk minden elemmel. Az adott elem végső helyét a nála kisebb elemek száma határozza meg.

Algoritmusok Leszámoló: - Beszúró: közvetlen beszúrás bináris beszúrás Shell rendezés lista beszúró rendezése címszámító rendezés Cserélő: buborék rendezés Batcher párhuzamos módszere gyorsrendezés (Quick sort) számjegyes cserélés aszimptotikus módszerek Kiválasztó: közvetlen kiválasztás finomítása elágazva kiválasztó rendezés kupacrendezés legnagyobb be, első ki összefésülő rendezés szétosztó rendezés

Általános cél Adott R 1, R 2,, R n rekordokat K 1, K 2,, K n kulcsaik nem csökkenő sorrendjébe kell rendezni lényegében egy olyan p(1), p(2),, p(n) permutáció megkeresésével, amelyre K p(1) <= K p(2) <= <= K p(n) fennáll. Ideiglenes feltétel: Tekintsünk olyan halmazt, amelynek rendezése a memóriában megvalósítható.

Célszerű adatszerkezetek 1. Ha a rekordok mindegyike több szót foglal el a tárban, akkor célszerű a rekordokra mutató láncolt címek új táblázatának létrehozása és ezeknek a kezelése a rekordok mozgatása helyett. Ez a CÍMTÁBLÁZATOK rendezése. R e k o r d 89 37 41 R S O Kiegészítő D T E információk Rendezés előtt Kisegítő táblázat Rendezés után

Célszerű adatszerkezetek (2) 2. Ha a kulcs rövid, de a rekord kiegészítő információja hosszú, akkor a nagyobb sebesség elérése érdekében a kulcs a láncoló címmel együtt tárolható. Ez a KULCSOK rendezése.

Célszerű adatszerkezetek (3) 3. Ha a láncoláshoz az egyes rekordokhoz csatolt segédmezőt alkalmaznak úgy, hogy a rekordok együtt egy lineáris listát alkotnak, amelyben minden láncoló cím a következő rekordra mutat, akkor az a LISTA rendezése. 89 37 41 R S O D T E Lista feje

Leszámoló rendezés Elve: a rendezett listában a j-ik kulcs pontosan j-1 kulcsnál lesz nagyobb. (Ezért ha egy kulcsról tudjuk, hogy 27 másiknál nagyobb, akkor a neki megfelelő rekord sorszám a rendezés után a 28 lesz.) A kulcsokat minden lehetséges párosításban össze kell hasonlítani, és megszámolni, hogy az éppen vizsgált kulcsnál hány kisebb van. Variációk: 1. Hasonlítsuk össze K j -t K i -vel 1 j N esetén, ha 1 i N de felesleges: minden számot önmagával is összehasonlítani K a -t K b -vel, majd utána K b -t K a -val összehasonlítani 2. Hasonlítsuk össze K j -t K i -vel 1 j i esetén, ha 1 i N Fontos! Az algoritmus nem jár együtt a rekordok mozgatásával, inkább a címtáblázat-rendezéshez hasonlít. Futási ideje: 13 N + 6 A + 5 B - 4, ahol: N 2 N = a rekordok száma, A =, B = az olyan indexpárok száma, amelyekre j < i, és K j > K i

Beszúró rendezés (1) ( Bridzsező módszer ) Feltétel: Az R j rekord vizsgálata előtt a megelőző R 1,, R j-1 rekordok már rendezettek. Ekkor az R j rekordot beszúrjuk az előzőleg már rendezett rekordok közé. Változatok: Közvetlen beszúrás, v. szitáló technika: Tegyük fel, hogy 1 < j N, és hogy R 1,, R j rekordok rendezettek úgy, hogy K 1 K 2 K j-1. Ekkor a K j kulcsot összehasonlítjuk a K j-1, majd a K j-2 kulcsokkal mindaddig, míg R j be nem szúrható R i és R i+1 közé. Bináris beszúrás: Nem sorosan, hanem binárisan kell megkeresni az R j rekord helyét a már rendezett rekordok között. (N > 128 esetén már (!) nem javasolt) Előnye: kevesebb összehasonlítás Hátránya: megtalált hely esetén továbbra is nagy mennyiségű rekordot kell megmozgatni a beszúráshoz.

Kétirányú beszúrás: Beszúró rendezés (2) Bináris kereséssel a hely megkeresése, majd beszúrásnál abba az irányba mozgatjuk a már rendezett rekordokat, amerre kevesebbet kell mozgatni. (Jellemzője a nagyobb memória igény!). SHELL (v. fogyó növekményes) rendezés: Eddig a rekordok rendezéskor rövid lépésekkel kerültek helyükre. Most: rövid lépések helyett hosszú ugrások legyenek. Megalkotója: Donald L. Shell. (1959. július). Elve: A rekordokat először (pl.) kettesével csoportokba osztjuk. Ezeket a rekord csoportokat rendezzük (a két elem vagy jó sorrendben követi egymást, vagy felcseréljük őket). Ezután négyesével képezzük a csoportokat és rendezzük, majd újabb csoportokat képzünk, rendezzük,, míg a végén már csak egy csoport lesz, a teljes rekordhalmaz. Addigra az már rendezett részhalmazokból áll.

Beszúró rendezés (3) Shell rendezés folyt: minden közbenső fázisra igaz, hogy vagy viszonylag kicsi a csoport, vagy viszonylag jól rendezett, ezért a rekordok gyorsan mozognak végső helyük felé. Hatékonysága nagy mértékben függ az alkalmazott növekmények sorozatától. Erre táblázatban találhatók meg a javasolt növekménysorozatok. Ha ez nincs kéznél, akkor: n 1 =1,, n s+1 = 3 n s + 1 és akkor legyen vége, ha: n s+2 > N

Lista beszúró rendezése (A közvetlen beszúrás javítása.) Az alapalgoritmus 2 alapvető műveletet alkalmaz: - rendezett file átnézése adott kulcsnál kisebb vagy egyenlő kulcs megtalálása céljából. - új rekord beszúrása a rendezett file meghatározott helyére Kérdés: melyik az az adatszerkezet, amely erre a legalkalmasabb? A file egy lineáris lista, amelyet ez az algoritmus szekvenciálisan kezel, ezért minden beszúrási művelethez átlagosan a rekordok felét kell megmozgatni. Beszúráshoz az ideális adatszerkezet a láncolt lista, mivel csak néhány címet kell átírni a beszúráshoz. Ehhez elegendő az egyirányú láncolt lineáris lista. Várható futási ideje: 7B+14N-3A-6 időegység, ahol N = a rekordok száma A = a jobbról-balra maximumok száma, B = az eredeti permutációban levő inverziók száma (kb. 1/4 N 2 )

Címszámító rendezés Elve: könyvek vannak a padlón. Ezeket kell abc sorrendben egy polcra helyezni. Meg kell becsülni a könyv végső helyét. Ezzel lecsökkenthető az elvégzendő összehasonlítások száma, valamint a rekord beszúrásához szükséges mozgatások száma. Hátránya: általában N-nel arányos további tárterületet igényel azért, hogy a szükséges mozgatások száma lecsökkenjen.

Cserélő rendezések Buborék rendezés: Elve: hasonlítsuk össze K 1, K 2 kulcsokat. Helytelen sorrend esetén cseréljük fel R 1, R 2 rekordokat, aztán ugyanezt hajtsuk végre R 2, R 3, majd R 3, R 4, R 4, R 5, rekordokkal. Az eljárás az R N, R N-1, R N-2,... rekordokat juttatja a megfelelő helyre. Függőleges ábrázolás esetén látható, hogy a nagy számok fognak először felbuborékolni a helyükre. Más neve: cserélve kiválasztás v. terjesztés. Futási ideje: 8A + 7B + 8C +1, ahol A = a menetek száma, B = a cserék száma, C = az összehasonlítások száma Max értéke: 7.5 N 2 + 0.5 N + 1 (N 2 -tel arányos idő )

A buborék rendezés algoritmusa (Nem azért mert jó, hanem mert elterjedt ) Lépések: 1. Legyen korlát = N (korlát a legnagyobb index, amelyhez tartozó rekordról nem tudjuk, végső helyén van-e. 2. t = 0. Végezzük el a 3. lépést a j = 1, 2,, korlát-1 értékekre, aztán menjünk a 4. lépésre. (Ha korlát = 1, akkor közvetlenül a 4. lépésre) 3. R j és R j+1 összehasonlítása. Ha K j > K j+1, akkor cseréljük fel R j -t R j+1 -gyel, és legyen t = j. (Ez jelzi, hogy volt csere ) 4. Történt-e csere? Ha t = 0, akkor nem, és az algoritmusnak így vége. Egyébként korlát = t, és visszatérni a 2. lépésre. (A közvetlen beszúrással összehasonlítva, kétszer lassúbb!!)

Batcher párhuzamos módszere (Leginkább a Shell-rendezéshez hasonlítható.) Elve: összehasonlításra ne szomszédos párokat válasszunk ki, hanem általánosan felírva: K i+1 -et K i+d+1 -gyel, ahol d meghatározására van(!) algoritmus.

Kiválasztó rendezés Elve: 1. Keressük meg a legkisebb kulcsot. A neki megfelelő rekordot tegyük a kimenő területre, majd helyettesítsük kulcsát végtelennel. 2. Ismételjük meg az 1. lépést. Ekkor a 2. legkisebb kulcsot találjuk meg, mivel az elsőt végtelennel helyettesítettük. 3. Az 1. lépést ismételni mindaddig, míg az összes N rekord kiválasztásra nem került. Feltétel: a rendezés megkezdése előtt minden elem jelen legyen. Hátránya: - a végső sorozatot egyesével generálja - minden egyes elem kiválasztásához N-1 összehasonlítást végez el. - külön output területet igényel.

Nem vesszük (sajnos...) gyorsrendezés (Quicksort) kupacrendezés legnagyobb be, első ki összefésülés szétosztó rendezés (De aki gondolja, utánanézhet) Házi feladat: Tessék megpróbálni megkeresni a cserélve történő kiválasztás helyét a tanult rendezési alapelvek között! (vajon cserélő, vagy kiválasztó-e?)