Programozás alapjai

Programozás alapjai

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Linux alapismeretek (Bevezets az informatikba) UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Linux alapismeretek Mirt? Egy informatikus szmtgpekkel dolgozik, gy nem engedheti meg magnak, hogy ne tudja kezelni azt. Mirt pont Linux? Van Windows is, csak msik kurzuson. Minl tbb rendszert ismer valaki, annl tfogbb kpet kap, s knnyebben ismerkedik jakkal. Mirt ezen a kurzuson van Linux s msik kurzuson Windows?

Trtnelmileg gy alakult Programozs Alapjai (2007) 2 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Linux alapismeretek A linux egy POSIX szabvnyokat kvet Unix opercis rendszer Tbbtaszk, tbbfelhasznls, virtulis memrival, vdett zemmddal, korszer memriakezelssel, megosztott programknyvtrakkal, demand paging mechanizmussal, szles kr TCP/IP hlzati tmogatssal, stb. s ez mit jelent? Programozs Alapjai (2007) 3

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Opercis rendszer Olyan programrendszer, amely kzvett szerepet tlt be a szmtgp hardver erforrsai s a felhasznl kztt Fbb funkcii: programok betltse s vgrehajtatsa input/output mveletek vgzse httrtrakon trolt adatrendszerek kezelse billentyzetrl kiadott parancsok rtelmezse s vgrehajtsa a mkds kzben fellpett hibk lekezelse Programozs Alapjai (2007)

4 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Adatok, programok Az adatok (szvegek, kpek, hangok, programok, stb.) hossztv trolsra a httrtrak szolglnak. Trolsi egysgek bit: A legkisebb trolsi egysg, 0 vagy 1 rtkkel bjt: 8 bitnyi informci 28=256 rtkkel fjl: A szorosan egymshoz tartoz bjtokat a httrtroln egy fjlban troljuk knyvtr: A fjlokat a httrtroln knyvtrakban troljuk Programozs Alapjai (2007) 5 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Knyvtrszerkezet A httrtroln trolt adatok logikailag egy fa szerkezetben vannak trolva Gykr (root) knyvtr Alknyvtrak Fjlok Aktulis knyvtr / / bin /bin bash cp /bin/bash /bin/cp

boot dev etc home /boot /dev /etc /home gertom /home/gertom .bashrc gyakorlat h531674 lib root tmp usr var Programozs Alapjai (2007)

/home/gertom/.bashrc /home/gertom/gyakorlat /home/h531674 /lib /root /tmp /usr /var 6 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fogalmak Aktulis knyvtr Ebben dolgozunk. Brmely kiadott parancs itt hajtdik vgre, a relatv tvonalak innen indulnak Relatv tvonal Egy fjl vagy knyvtr nevnek megadsa az aktulis knyvtrhoz kpest

gyakorlat, .., ../h531674 Abszolt tvonal Egy fjl vagy knyvtr nevnek megadsa a gykrknyvtrbl kiindulva /home/gertom/gyakorlat, /home, /home/h531674 Programozs Alapjai (2007) 7 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Specilis jelents nevek A knyvtrhierarchia gykere / A hierarchiban egy szinttel feljebb lv knyvtr .. Az aktulis knyvtr

. Rejtett fjl vagy knyvtr .-tal kezdd nv Programozs Alapjai (2007) 8 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Knyvtrszerkezet mveletei pwd ls cd mkdir rmdir mv cp rm ln

aktulis knyvtr lekrdezse knyvtr tartalmnak kilistzsa knyvtrvlts knyvtr ltrehozsa knyvtr trlse fjl/knyvtr mozgatsa/tnevezse fjl (vagy knyvtr) msolsa fjl (vagy knyvtr) trlse fjl (vagy knyvtr) linkelse Programozs Alapjai (2007) 9 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Parancsok (knyvtrak) pwd Kirja az aktulis knyvtr abszolt nevt cd Ezentl a lesz az aktulis knyvtr Ha nem adunk meg paramtert, akkor a home

knyvtrunk lesz az aktulis Programozs Alapjai (2007) 10 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Parancsok (knyvtrak) ls Kilistzza a listban megadott fjlokat s knyvtrakat Ha nincs lista az olyan, mintha a . lett volna a paramter Lehetsges kapcsolk -l

-a -d -R rszletes lista a rejtett fjlokat is kirja a knyvtrakat ugyangy mint a fjlokat a knyvtrakat rekurzvan Programozs Alapjai (2007) 11 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Parancsok (knyvtrak) mkdir Ltrehozza a listban megadott knyvtrakat Lehetsges kapcsolk -p

a teljes megadott tvonalat megprblja ltrehozni rmdir Trli a listban megadott knyvtrakat Lehetsges kapcsolk -p a teljes megadott tvonalat megprblja trlni Programozs Alapjai (2007) 12 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Parancsok (knyvtrak) mv tnevezi az nev fjlt vagy knyvtrat az nvre (ha ilyen nev knyvtr mg nem ltezett)

mv tmozgatja a elemeit az knyvtrba (aminek ekkor mr lteznie kell) Lehetsges kapcsolk: -f -i -u ktes esetben sem krdez vissza brmely ktes esetben megerstst vr csak a rgebbi fjlokat rja fell Programozs Alapjai (2007) 13 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Parancsok (knyvtrak) cp Ltrehoz az nev fjlbl egy msolatot nven (ha nem ltezik ilyen nev knyvtr) cp tmozgatja a elemeit az knyvtrba (aminek ekkor mr lteznie kell) Lehetsges kapcsolk: -f -i -u -r ktes esetben sem krdez vissza

brmely ktes esetben megerstst vr csak a rgebbi fjlokat rja fell ha knyvtrat tall, rekurzvan tmsolja azt is Programozs Alapjai (2007) 14 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Parancsok (knyvtrak) rm Trli a listban megadott fjlokat Lehetsges kapcsolk: -f -i -r

ktes esetben sem krdez vissza brmely ktes esetben megerstst vr ha knyvtrnevet tall a listban, trli azt Programozs Alapjai (2007) 15 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szvegfjlok kezelse cat A teljes tartalmt egyszerre kirja a kpernyre more A teljes tartalmt oldalanknt kirja a kpernyre head - A els sort kirja a kpernyre

tail - A utols sort kirja a kpernyre Programozs Alapjai (2007) 16 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szvegfjlok kezelse grep Kirja a azon sorait, amelyekben megtallhat a szvegrszlet wc Kirja a -ban tallhat bjtok/sorok/szavak szmt Lehetsges kapcsolk:

-c -w -l a fjl mrett rja ki a szavak szmt rja ki a sorok szmt rja ki Programozs Alapjai (2007) 17 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyb parancsok file megadja a tpust du

sszeszmolja a knyvtrban tallhat fjlok mrett Lehetsges kapcsolk: -s -m -h csak a vgsszeget rja ki kilobjtok helyett megabjtokban szmol az ember szmra knnyen olvashat mretkirs Programozs Alapjai (2007) 18 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyb parancsok echo Kirja a -et man

Elhozza a rszletes lerst passwd A jelsz megvltoztatsra szolgl Programozs Alapjai (2007) 19 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Jogosultsgok A linux tbbfelhasznls rendszer. Nyilvnval, hogy a fjlokhoz hozzfrst valamilyen mdon korltozni kell. A korltozshoz rendelkezsre ll 3 osztly Tulajdonos (User), Csoport (Group), Tbbiek (Others) 3 fle jog Olvass (Read), rs (Write), Vgrehajts (eXecution)

Programozs Alapjai (2007) 20 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Jogosultsgok Osztlyok Minden egyes felhasznl tbb csoportba tartozhat Minden egyes fjl vagy knyvtr pontosan egy felhasznlhoz s pontosan egy csoportba tartozik Minden egyes fjlhoz el van trolva nmi plusz informci, mint pldul: tulajdonos csoport utols mdosts dtuma

a fjlhoz tartoz adat helye (inode) Programozs Alapjai (2007) 21 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Jogosultsgok $ ls ld out.txt Gyakorlat -rw-rw---1 gertom inf2000 drwxr-xr-x 5 gertom inf2000 19 May 1024 Feb 7 12:03 out.txt 7 2004 Gyakorlat

Mret Utols mdosts Csoport Tulajdonos dtuma Brmely ms felhasznl jogai A csoport tagjainak jogai A tulajdonos jogai A bejegyzs tpusa Programozs Alapjai (2007) 22 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Jogosultsgok rtelmezse Jog r olvass w rs x vgrehajts

Knyvtr Fjl A knyvtr tartalma kilistzhat A fjl tartalma olvashat A knyvtrban a bejegyzsek mdosthatak A fjl tartalma mdosthat A hozzfrs engedlyezett, e nlkl nem lehet A fjl futtathat pldul belpni sem a knyvtrba Programozs Alapjai (2007)

23 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Jogosultsgok megvltoztatsa chmod : a (All), u (User) , g (Group), o (Other) : + (megads), - (megvons), = (bellts) : r (Read), w (Write), x (eXecute) mindegyik egy oktlis szmjegy 4 (read), 2 (write), 1 (execute) pl: chmod go-w out.txt chmod 640 out.txt

Programozs Alapjai (2007) 24 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Linkek ln -s Ltrehoz egy a -ra mutat softlink-et ln Ltrehoz egy a -ra mutat hardlink-et Knyvtrra nem alkalmazhat ln s out.txt out2.txt rm out.txt out2.txt @out.txt out.txt @6553641

ln out.txt out2.txt rm out.txt out2.txt @6553641 Adat az 6553641-es inode-hoz out.txt @6553641 Adat az 6553641-es inode-hoz Programozs Alapjai (2007) 25 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Shell

A shell is csak egy program, de ez teszi lehetv, hogy az opercis rendszer magjval, a kernellel kommuniklni tudjunk Egy gyakori bra: Shell Kernel Programozs Alapjai (2007) 26 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Shell Sokfle van belle sh, bash, ksh, csh, zsh Fbb funkcik

kapcsolattarts a kernel s a felhasznl kztt mintailleszts programok indtsa krnyezeti vltozk be- s kimenet kezels Az eddig ltott parancsokat is a shell rtelmezi Programozs Alapjai (2007) 27 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Prompt A Shell egy gynevezett prompt-tal jelzi, ha ksz a parancsaink fogadsra Ez ltalban tartalmazza:

A felhasznl nevt A gp nevt Az aktulis knyvtrat de egyni zls szerint megvltoztathat A pldinkban a promptot a sor eleji $ jel jelli Programozs Alapjai (2007) 28 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Mintailleszts Mindig fjlokra s knyvtrakra prblja illeszteni a megadott mintt (szkezd pont nem illeszkedik) ? egy tetszleges karaktert helyettest * akrhny tettszleges karaktert helyettest

[...] a [ s ] jelek kztt felsorolt karaktereket helyettestheti \c a c specilis karaktert jelenti, ahol c lehet: \, szkz, , , ?, *, [, ], ` Programozs Alapjai (2007) 29 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Mintailleszts Pldk mintkra:

alfa.? start??.xml *.html *vector* [Kk]epek gcc-3.[0-3] Egy\ nev\* ?s\ [Ee]zek\ komb*t?ak?[a-z]okf*k?ppen \?x\\* Programozs Alapjai (2007) 30 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Mintailleszts A Shell a minta helyre beilleszti az sszes, a mintra illeszted fjl vagy knyvtr nevt:

$ ls -l *.occ -rw-r----- 1 gertom inf2000 12366 jn 20 13:19 504.occ -rw-r----- 1 gertom inf2000 764 pr 23 08:03 plex.occ $ ls -l ?ba* ls: ?ba*: Nincs ilyen fjl vagy knyvtr $ ls -l .ba* -rw------- 1 gertom inf2000 7075 sze 1 22:23 .bash_history -rw-r--r-- 1 gertom inf2000 24 sze 25 2001 .bash_logout -rw-r--r-- 1 gertom inf2000 256 okt 5 2002 .bash_profile -rw-r--r-- 1 gertom inf2000 135 dec 10 2003 .bashrc Programozs Alapjai (2007) 31 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Programok indtsa, paramterezse Programokat a program (esetleg tvonallal

elltott) nevnek bersval indthatunk type Egy program helynek megkeresse A programnak paramtereket adhatunk, melyeket szkz karakterek vlasztanak el egymstl Az ilyen szkzk szma lnyegtelen $ echo Az eredmeny ugyanaz Az eredmeny ugyanaz $ echo Az eredmeny Az eredmeny ugyanaz ugyanaz Programozs Alapjai (2007) 32 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Paramterezs, jra Mi van akkor, ha a pldul szkz is rsze annak, amit t akarunk adni paramterknt? Tbb lehetsgnk is van: $ echo harom $ echo harom $ echo harom $ echo harom\ harom\ \ \ szokoz szokoz "harom szokoz" szokoz 'harom szokoz' szokoz 'harom\ \ \ szokoz' \ \ szokoz

Programozs Alapjai (2007) 33 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szveghatrolk : nhny behelyettests mkdik "x\"ab"y\" -> x"aby" "$HOME" -> /home/gertom : semmit sem helyettest 'x\'ab'y\' -> x\aby\ '$HOME' -> $HOME Programozs Alapjai (2007) 34 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Krnyezeti vltozk A vltozk klnfle rtkeket vehetnek fel ltalnos alakjuk: $NEV Elre definilt vltozk $HOME A felhasznl sajt knyvtra, hasznlhat a ~ is $PATH Keressi tvonal, a shell az itt felsorolt knyvtrakban keresi a futtatand programot $PS1 A prompt kinzett rja le Programozs Alapjai (2007) 35 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Krnyezeti vltozk Sajt magunk is definilhatunk vltozkat $ echo $NEV $ export NEV=ertek $ echo $NEV ertek $ NEV=mas $ echo $NEV mas $ unset NEV $ echo $NEV $ A set parancs megmutatja a belltott vltozkat Programozs Alapjai (2007) 36 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Programok be- s kimenete Egy kis magyarzat a tovbbiakhoz Ha egy szvegfjlokkal dolgoz programot gy indtunk el, hogy nem adunk meg neki fjlnevet, akkor az ltalban automatikusan a standard inputjt fogja hasznlni, azaz neknk kell ott helyben begpelnnk a feldolgozand szveget. Ez a gpels a -d billentyzetkombinci lenyomsig tart (amit ^d vel szoks jellni). A ^d vel vigyzzunk, mert a shell is egy ilyen program! Programozs Alapjai (2007) 37 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Programok be- s kimenete Alaphelyzetben az elindtott program bemenete

a billentyzet, kimenete a terminlablak Ami ms szn, az a program kimenete $ cat Ha a cat programot paramter nlkl Ha a cat programot paramter nlkl akkor a standard inputot hasznlja, akkor a standard inputot hasznlja, a billentyzet. a billentyzet. ^d $ Programozs Alapjai (2007) indtjuk el, indtjuk el, ami jelenleg ami jelenleg 38 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Programok be- s kimenete A program kimenett a > jellel lehet egy fjlba irnytani. Ami ms szn, az a program kimenete $ cat >kimenet.txt Ha a cat programot paramter nlkl akkor a standard inputot hasznlja, a billentyzet. ^d $ more kimenet.txt Ha a cat programot paramter nlkl akkor a standard inputot hasznlja, a billentyzet. $ Programozs Alapjai (2007) indtjuk el, ami jelenleg indtjuk el, ami jelenleg 39

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Programok be- s kimenete A program kimenett a >> jellel lehet egy fjl eddigi tartalma mg fzni. Ami ms szn, az a program kimenete $ cat >kimenet.txt Most elveszik az elz szveg. ^d $ cat >>kimenet.txt Most viszont az elz is megmarad. $ more kimenet.txt Most elveszik az elz szveg. Most viszont az elz is megmarad. $ Programozs Alapjai (2007) 40 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Programok be- s kimenete A program bemenetre a < jellel lehet egy fjl tartalmt rirnytani. Ami ms szn, az a program kimenete $ echo 'Mg egy sor, hogy hrom legyen.' >>kimenet.txt $ cat k2.txt $ tail -1 k3.txt $ cat k3.txt Most viszont az elz is megmarad. $ Programozs Alapjai (2007) 41 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Pipe - Cs Egy program kimenett a | jellel lehet a kvetkez program bemenetre irnytani. Ami ms szn, az a cat program kimenete $ cat ki.txt $ cat ki.txt Most viszont az elz is megmarad. $ Programozs Alapjai (2007) 42 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Multitasking A linux egyszerre tbb programot is kpes futtatni A programok alaphelyzetben indulskor eltrben kezdenek futni, azaz amg nem vgeznek, addig nem kapjuk vissza a prompt-ot Az ilyen programokkal kt dolgot lehet csinlni ^c : azonnal megszaktja a program futst, a vgrehajts befejezdik ^z : lelltja a program futst, de az ksbb jraindthat Programozs Alapjai (2007) 43 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Multitasking Indtsunk egy munkt az eltrben A yes folyamatosan y karaktereket r a kimenetre

A tr y n a bemenetben tallhat y karaktereket nre cserli A /dev/null egy olyan fjl, ami mindent lenyel $ yes | tr y n >/dev/null ^z [1]+ Stopped $ fg %1 yes | tr y n >/dev/null ^c $ Elindtottunk egy mveletet az eltrben Lelltjuk a futst yes | tr y n >/dev/null jra elindtjuk szintn az eltrben Vgl megszaktjuk Programozs Alapjai (2007) 44 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Multitasking Egy programot el lehet egybl a httrben indtani: a parancssor vgre egy & jelet kell tenni Httrben csak olyan programok futhatnak, amelyeknek a standard inputon nincs szksgk adatra, vagy ezt egy fjlbl tirnytssal kikszbltk ltalban grafikus programokat, tmrtseket vagy nagyobb msolsokat szoks gy indtani Programozs Alapjai (2007) 45 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Multitasking $ yes | tr y n >/dev/null & [1] 11503 $ jobs [1]+ Running

$ ps PID TTY TIME CMD 11288 pts/5 00:00:00 bash 11502 pts/5 00:00:26 yes 11503 pts/5 00:00:04 tr 11504 pts/5 00:00:00 ps $ kill %1 $ [1]+ Flbeszaktva $ jobs $ Elindtottunk egy job-ot a httrben Ami az 1-es munkaszmot kapta Ezutn megnzzk, milyen job-jaink vannak yes | tr y n >/dev/null & Ez az egy Most megnzzk a processeket Az 1-es munkaszmhoz tartoz folyamatok

Vgezznk az 1-es job-bal yes | tr y n >/dev/null Itt a visszajelzs Van-e job-unk? Nincs Programozs Alapjai (2007) 46 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Job-ok Egy job nem ms, mint a valami miatt egymstl fgg programok sszessge Az eltrben egyetlen aktv job lehet A httrben tettszleges szm job futhat vagy vrakozhat A httrben lv job-okra a sorszmukkal

hivatkozhatunk A sajt job-jainkat s llapotaikat a jobs paranccsal listzhatjuk ki Programozs Alapjai (2007) 47 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Job-ok Ha n egy lelltott (stopped) job szma fg %n az eltrben jraindtja a job-ot bg %n a httrben jraindtja a job-ot Ha n egy fut vagy lelltott job szma kill %n megszaktja a job-ot

kill s STOP %n lelltja a job-ot Programozs Alapjai (2007) 48 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Process-ek Egy fut vagy vrakoz programot hvunk processnek Minden process rendelkezik egy pid szmmal, ez azonostja Egy job-hoz tbb process is tartozhat A process-eket a ps paranccsal lehet kilistzni A sajt processeket a pid alapjn a kill paranccsal lehet megszaktani Programozs Alapjai (2007) 49

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tbb program indtsa sorban Tbb programot sorban egyms utn szeretnnk vgrehajtatni Egyms eredmnyeitl fggetlenl $ rm out.txt ; cp afonya.tex Gyakorlat A msodikat csak akkor, ha az els sikerlt (s) $ cp out.txt Gyakorlat && rm out.txt A msodikat csak akkor, ha az els nem sikerlt (vagy) $ mv out.txt Gyakorlat || mv in.txt Gyakorlat Programozs Alapjai (2007) 50 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Felhasznlk Mint arrl mr volt sz, a linux egy tbbfelhasznls rendszer Egy gpet tbb ember jogosult hasznlni Egy gpet egy idben tbben is hasznlhatnak A finger, who s w parancsok szolglnak a felhasznlk lekrdezsre Programozs Alapjai (2007) 51 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk finger finger Megadja, hogy ezen a gpen kik vannak bejelentkezve

finger nv Felsorolja azokat a felhasznlkat, akiknek a neve vagy azonostja megegyezik a nv paramterrel finger @host Megadja, hogy a host gpen kik vannak bejelentkezve A kabinetben ez le van tiltva Programozs Alapjai (2007) 52 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk who, w, last who Megadja, hogy ki van bejelentkezve a gpre A finger-nl kicsit kevesebb adatot szolgltat w Mint a who, de megmondja azt is, hogy ki min

dolgozik last Megadja az utols nhny bejelentkezett felhasznlt Programozs Alapjai (2007) 53 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hlzat A vilg szmtgpeinek nagyrsze az interneten keresztl TCP/IP protokollok segtsgvel kapcsoldik egymshoz. Ez azt (is) jelenti, hogy ha valakinek 2 ilyen gpre is van azonostja, akkor az egyikrl a hlzaton keresztl elrheti a msik gpet, ugyangy be tud jelentkezni r, s dolgozni tud rajta, mintha ott lenne mellette.

Programozs Alapjai (2007) 54 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hlzat Az interneten egy gp azonostsa IP-cm alapjn trtnik, ez 4 darab, egyenknt egybjtos szmbl ll, melyeket ponttal elvlasztva runk le. Az SZTE gpeinek pldul 160.114.*.* alak az IP cmk. E mellett ltezik a domain nv. Ez a mr emltett, emberek ltal knnyebben megjegyezhet formj www.inf.u-szeged.hu alak hierarchikus nv. A kt azonost kztti megfeleltetst a host programmal tudjuk ellenrzni. Programozs Alapjai (2007) 55

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Secure SHell Ha be vagyunk jelentkezve egy gpre, az ssh program segtsgvel tudunk onnan egy msikra bejelentkezni Az ssh hasznlata: ssh [email protected] Az [email protected] rsz csak akkor kell, ha az a kt gpen nem egyezik meg A tvoli gpre ugyangy jelszval kell bejelentkeznnk. Ha ez sikerlt, akkor a tvoli gpen is elindul egy shell, ami a helyi gptl kapja a bemenett, s a helyi gpre kldi a kimenett (az ssh programon keresztl) A kapcsolatot az exit paranccsal zrhatjuk (vagy ^d) Programozs Alapjai (2007) 56 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk SSH Monitor Billentyzet Erforrsok Erforrsok Shell Helyi Gp Monitor Billentyzet ssh Hlzat Shell Programozs Alapjai (2007) Tvoli Gp 57

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Secure File Transfer Protocol Ha be vagyunk jelentkezve egy gpre, az sftp program segtsgvel tudunk onnan fjlmozgats cljbl egy msikra bejelentkezni Az sftp hasznlata: sftp [email protected] Az [email protected] rsz csak akkor kell, ha az a kt gpen nem egyezik meg A tvoli gpre ugyangy jelszval kell bejelentkeznnk. Ha ez sikerlt, akkor ltrejn a kapcsolat a tvoli gppel, amin keresztl fjlokat mozgathatunk a kt gp kztt A kapcsolatot az exit vagy bye paranccsal zrhatjuk Programozs Alapjai (2007) 58 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk SFTP Monitor Httrtr Httrtr Billentyzet Shell Helyi Gp sftp Hlzat Programozs Alapjai (2007) FTP szerver program Tvoli Gp 59

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk SSH s SFTP ssh val bejelentkezve a tvoli gpre csak azok az erforrsok rhetek el, amik a tvoli gpen elrhetek, gy a kt gp kztt nem tudunk fjlokat mozgatni sftp vel bejelentkezve a tvoli gpre annak csak a httrtroljt tudjuk elrni, cserbe a helyi gp httrtrolja is a rendelkezsnkre ll, gy tudunk a kt gp kztt fjlokat msolni Programozs Alapjai (2007) 60 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

SFTP parancsok A bejelentkezs hasonlt az ssh hoz, de a tvoli gpen nem shell indul Kiadhat parancsok: pwd, lpwd: tvoli s helyi aktulis knyvtr ls, lls: tvoli s helyi aktulis knyvtr tartalma cd, lcd: tvoli s helyi knyvtrvlts Programozs Alapjai (2007) 61 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk SFTP parancsok Kiadhat parancsok: mkdir, lmkdir:

tvoli s helyi knyvtr ltrehozs rm, rmdir: tvoli fjl s knyvtrtrls bye, exit: kapcsolat megszaktsa Programozs Alapjai (2007) 62 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk SFTP parancsok Kiadhat parancsok: get msols a tvoli gprl a helyi gpre, paramterezse a cphez hasonl put msols helyi gprl a tvoli gpre, paramterezse a cphez hasonl

ascii, binary szveges s binris mdok kztti vlts Programozs Alapjai (2007) 63 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Secure CoPy scp gy mkdik, mint a cp parancs, csak a forrsknt s/vagy clknt egy tvoli gp knyvtra is megadhat Az tvonalat ki lehet egszteni a [email protected]: eltaggal, ez relatv tvonal esetn ez a tvoli gpen lv home knyvtrat jelenti $ scp Gyakorlat/in.txt linux.cab.u-szeged.hu: $ scp linux.cab.u-szeged.hu:in.txt vissza.txt Programozs Alapjai (2007)

64 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Programozs alapjai Elmlet s gyakorlat UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A kurzus cljai Absztrakt algoritmikus gondolkodsmd kialaktsa A vals letbl vett dolgok matematikai lersa (a lehet legegyszerbb, de a clnak tkletesen megfelel mdon). Mivel egy gp csak szmolni tud, a problmkra vgs soron matematikai megoldst adunk. Ne jelentsen gondot egy egyszerbb problma

matematikai lersa, illetve magasabb szint matematikai struktrk hasznlata egy problma lersra. Programozs Alapjai (2007) 66 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A kurzus cljai Programozsi struktrk megismerse Az imperatv programozs adatokbl s rajtuk vgzett mveletekbl ptkezik. Ahhoz, hogy egy problmt rszekre bontsunk, tudnunk kell, hogy ezt milyen mdon tehetjk meg. Ahhoz, hogy valamit adatknt modellezni tudjunk szintn ismernnk kell, hogy milyen alapelemekbl hogyan ptkezhetnk. Ne jelentsen gondot eldnteni, hogy mikor s hogyan kell egy (tgabb rtelemben vett) problmt rszekre bontani, vagy mikor lehet trivilisan

megoldhatnak tekinteni. Programozs Alapjai (2007) 67 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A kurzus cljai A C programozsi nyelv megismerse Egy problma megoldsa akkor teljes, ha azt a szmtgp szmra rthet formban le tudjuk rni, ennek eszkze a programozsi nyelv. A C egy igen elterjedt, alacsony s magasabb szint programozsra is alkalmas nyelv. Ne jelentsen gondot egy megtervezett program implementlsa, illetve annak eldntse, hogy egy problma megoldsa kzvetlenl lerhat-e C nyelven vagy sem. Programozs Alapjai (2007) 68

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fogalmak Programozs Vals problmk szmtgpes megoldsa Szmtgp tulajdonsgai ltalnos cl (univerzlis) A hatrok egyre inkbb elmosdnak (pl. Java-s mobil) Automatikus vezrls A programjt kls beavatkozs nlkl kpes vgrehajtani Elektronikus Az ramkr kapcsols nem mechanikus Digitlis Kt rtkbl (0,1) felptett jl elklnthet llapotok Programozs Alapjai (2007) 69

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A szmtgp modellje Hogyan szmol az ember? Olvassa az utastsokat rtelmezi Vgrehajtja Rtr a kvetkez utastsra, vagy arra, amit elrnak Milyen utastsok vannak?

Bemeneti/kimeneti (input/output) Adatkezelsi Aritmetikai Dntsi Programozs Alapjai (2007) 70 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A szmtgp modellje (folyt.) A szmolsi tevkenysget vgz ember szmra magyar nyelven lehet olyan utastsokat adni, amit kpes vgrehajtani. A szmtgp szmra a vezrl egysg ltal rtelmezhet s vgrehajthat utastsok (parancsok) adhatk. Kezdetben az ember megtanulta ezeket az utastsokat (a szmtgp nyelvt). A kommunikci ezen a nyelven lass, nehzkes, sok hibval jr. Programozs Alapjai (2007)

71 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A szmtgp modellje (folyt.) Mirt nem tanul meg inkbb a szmtgp magyarul? Valakinek meg kell r tantani A nyelv ktrtelmsge Szvegkrnyezettl val fggsg Szemantika (el kellene magyarzni a szavak jelentst) Az ember is s a szmtgp is tanuljon meg egy nyelvet! Programozs Alapjai (2007)

72 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A szmtgp modellje (folyt.) A nyelv egy kifejez eszkz valaminek a lersra. De mit akarunk a szmtgp szmra lerni? Azt, hogy mit csinljon, vagyis milyen tevkenysget hajtson vgre. Egy szmtgp csak azt tudja megcsinlni, amit megmondunk neki. Amirl meg tudjuk mondani, hogy hogyan kell csinlni, azt a szmtgp meg tudja csinlni. Programozs Alapjai (2007) 73 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Algoritmus Alapveten azt kell megmondani a szmtgpnek, hogy milyen adatokon milyen mveleteket kell elvgezni. Ezt pontosan meg kell fogalmazni, vagyis el kell kszteni a problmt megold algoritmust. Az algoritmus Adott tpus sszes feladat megoldsra vonatkoz pontos elrs, amely megmondja, hogy a kezdeti adatokon milyen mveleteket milyen sorrendben kell elvgezni Programozs Alapjai (2007) 74 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Algoritmus Tulajdonsgai

meghatrozott vges mdon lerhat, mindig ugyanazt eredmnyezi szleskr egsz feladatosztlyra vonatkozik vges vges lpsben vget r potencilisan megvalsthat a technika fejldsvel Nincs olyan algoritmus, amelyik el tudja dnteni, hogy egy tetszleges program a kezdadatokkal vgrehajtva vges lps utn megll-e? Programozs Alapjai (2007) 75 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fogalmak

Programozsi nyelv A problmt megold algoritmus lersra szolgl Lehet az emberi nyelvhez kzel ll (magas szint) vagy a szmtgp nyelvhez kzel ll (alacsony szint) Program Egy algoritmusnak egy adott programozsi nyelven trtn lersa Programozs Alapjai (2007) 76 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fogalmak (folyt.) Hardver A szmtst vgz fizikai-technikai rendszer Szoftver A hardvert mkdtet programok s parancsok

sszessge Adatok A hardver s a szoftver ltal feldolgozott informci Programozs Alapjai (2007) 77 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hardver krnyezet Nagyon sokfle hardver ltezik, de az alapfelptse mindnek nagyon hasonl Kzponti feldolgoz egysg (CPU, Processzor) felpts (CISC, RISC), sebessg (MHz, GHz) Ftr (Memria) tpus (ROM, RAM), mret (bit, bjt(byte), KB, MB, GB) Httrtr (Winchester, CD, DVD, Flash) mret (MB, GB, TB)

Felhasznli terminl s perifrik billentyzet, egr, kperny, hanggenertor nyomtat, modem, hlzati csatol, specilis eszkzk Programozs Alapjai (2007) 78 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szoftver krnyezet Egy hierarchikus felpts programrendszer Fbb szintjei felhasznl szemszgbl felhasznli programok programfejleszti rendszerek opercis rendszer

gpi alapszoftver Programozs Alapjai (2007) 79 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Gpi alapszoftver BIOS Basic Input Output System A ROM-ba (EPROM, EEPROM) getett programok. Ezek funkcija A hardver tesztelse Az opercis rendszer betltse s indtsa Gpi szint be- s kimenet megvalstsa Ezt a feladatot a modern opercis rendszerek az elindtsuk utn rszben vagy teljesen tveszik Programozs Alapjai (2007)

80 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Opercis rendszer Olyan programrendszer, amely kzvett szerepet tlt be a szmtgp hardver erforrsai s a felhasznl kztt Fbb funkcii: programok betltse s vgrehajtatsa erforrsok elosztsa input/output mveletek vgzse httrtrakon trolt adatrendszerek kezelse a felhasznl ltal kiadott parancsok rtelmezse s vgrehajtsa

a mkds kzben fellpett hibk lekezelse Programozs Alapjai (2007) 81 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Programfejleszt rendszer Feladata, hogy tmogassa a programozs sorn a programok (programrendszerek) ltrehozst, mdostst s vgrehajtst; f funkcii: knyvtrazs szvegszerkeszts

fordts vgrehajts hibakeress rendszerparamterezs tudakozds Programozs Alapjai (2007) 82 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Felhasznli program(rendszer) A megoldand problma szmtgpes megoldst szolgltatja Programozs Alapjai (2007) 83 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk A programozs fzisai A szmtgpes problmamegolds (a programozs) egymstl jl elklnthet fzisokbl pl fel, amelyek sajtos klcsnhatsban vannak egymssal; ezt a kapcsolatot fejezi ki a szoftverfejlesztsi modell A vilgon tbbfle modell ltezik, ezek kzl nincs j vagy rossz, csak adott feladathoz jobban vagy kevsb alkalmas vzess-modell, V-modell, spirl-modell, O-modell, extrm programozs, stb Programozs Alapjai (2007) 84 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A programozs fzisai (folyt.) Az egyik els s legegyszerbb a vzess

modell Kvetelmny-specifikci (Problmafelvets, Specifikci) Tervezs (Algoritmustervezs) Megvalsts Integrci Ellenrzs (Helyessgigazols, Kltsgelemzs, Tesztels) Telepts Fenntarts (Vgrehajts, Fenntarts) Programozs Alapjai (2007) 85 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A vzess modell Az modellben az elbbi fzisokat sorban egyms utn hajtjuk vgre Kvetelmny-specifikci Tervezs Megvalsts

Integrci Ellenrzs Telepts Fenntarts Programozs Alapjai (2007) 86 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Kvetelmny-specifikci A (ksbbi) felhasznl a sajt szakterletnek megfelel nyelven meg tudja fogalmazni a megoldand problmt (problmafelvets), ez viszont az algoritmus elksztshez nem elg; ahhoz pontosan meg kell hatrozni, hogy milyen felttelt elgtenek ki a problma bemen adatai, s hogy adott bemen adatok esetn milyen felttelt kell kielgteni a kiszmtott adatoknak (specifikci)

Programozs Alapjai (2007) 87 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Kvetelmny-specifikci (folyt.) A specifikci teht egy (B,K) bemenetikimeneti felttelpr: akkor fogadjuk el az algoritmust a problma megoldsnak, ha valahnyszor a B felttel teljesl a bemen adatokra, mindannyiszor a K felttel teljesl a kiszmtott adatokra Programozs Alapjai (2007) 88 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Tervezs Itt trtnik a specifikcit kielgt algoritmus ltrehozsa (algoritmustervezs) A fellrl lefel halad mdszer lnyege: A kiindulsi P problmt P1, ... ,Pn rszproblmkra bontjuk Minden Pi-nek valamely Mi megoldst adjuk Az Mi mveleteket alkalmas mdon sszetve P-t megold algoritmushoz jutunk Ezt addig folytatjuk, amg a vlasztott programozsi nyelv elemi mveletvel kzvetlenl meg nem adhat problmkhoz jutunk Programozs Alapjai (2007) 89 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Megvalsts Megvalstson az algoritmustervezs sorn kifejlesztett algoritmusnak egy adott programozsi nyelven trtn lerst rtjk

(kdols) A lps eredmnye a program Programozs Alapjai (2007) 90 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Integrci Amennyiben az ltalunk megoldott problma egy nagyobb, sszetettebb problma rsze, gy a programunknak is szksgkppen illeszkednie kell egy a nagyobb problma egyb komponenseinek megvalstshoz Ilyen esetekben ez a lps szolglja a sajt kdunk nagyobb programrendszerbe trtn beillesztst, s a beilleszts sorn esetleg felvetd problmk megoldst Programozs Alapjai (2007)

91 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Ellenrzs Az ellenrzs rsze a helyessgigazols, minek sorn megmutatjuk, hogy a kifejlesztett algoritmus valban a kiindulsi problma megoldst adja (nincs tervezsi hiba) kltsgelemzs, ami az algoritmus id- s trignynek (kltsgnek) a bemen adatok fggvnyben trtn meghatrozsa tesztels, amivel a program megvalstsa sorn elkvetett hibk egy rszt tudjuk felderteni a helyessgigazols s kltsgelemzs kivltsra nem alkalmas, de segthet ezek elvgzsben is Programozs Alapjai (2007) 92 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Telepts Amennyiben szksges a programot telepteni kell, azaz el kell helyezni s mkdkpess kell tenni a felhasznl ltal kvnt krnyezetben Programozs Alapjai (2007) 93 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fenntarts A programkszts vgs clja az, hogy a megoldand problma konkrt bemen adataira vgrehajtsuk a kifejlesztett algoritmust A program fenntartsn a vgrehajts sorn felmerlt problmk megoldst rtjk, ide

tartozik pldul: A hasznlat sorn felmerl hibk kijavtsa Aprbb mdostsok elvgzse Programozs Alapjai (2007) 94 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Dokumentci Nagyon fontos, hogy a teljes folyamat dokumentlva legyen, s ne csak ott, ahol ez nyilvnvalan szksges

A specifikci nmagban dokumentum A tervek valamilyen formj lersa Megjegyzsek a kdban Integrci sorn trtnt mdostsok lersa Szmtsok eredmnye, teszt-jegyzknyv Teleptsi kziknyv Felhasznli kziknyv, hibajavtsok, mdostsok rgztse Programozs Alapjai (2007) 95 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A programok f komponensei Minden programnak kt f komponense van: Az adatok Az adatokon vgzett mveletek Az adatok is s a mveletek is lehetnek sszetettek. Adatokbl (amelyek vgs soron elemiek) adatsszetteli, mveletekbl (amelyek vgs

soron elemiek) mveletkpzsi szablyokkal sszetett adatok illetve mveletek gyrthatk. Programozs Alapjai (2007) 96 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Az algoritmus vezrlse Az algoritmusnak, mint mveletnek a legfontosabb komponense az az elrs, amely az algoritmus minden lpsre (rszmveletre) kijelli, hogy a lps vgrehajtsa utn melyik lps vgrehajtsval folytatdjk (esetleg fejezdjk be) az algoritmus vgrehajtsa. Ezt az elrst nevezzk az algoritmus vezrlsnek. Programozs Alapjai (2007)

97 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Vezrlsi mdok A vezrlsi md azt fejezi ki, hogy egyszerbb mveletekbl hogyan ptnk fel sszetett mveletet s ennek milyen lesz a vezrlse. Ngy f vezrlsi mdot klnbztetnk meg: Szekvencilis vezrlsi md Szelekcis vezrlsi md Ismtlses vezrlsi md Eljrs vezrlsi md Programozs Alapjai (2007) 98

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Vezrlsi mdok rviden Szekvencilis vezrls Vges sok adott mvelet rgztett sorrendben egyms utn trtn vgrehajtsa Szelekcis vezrls Vges sok rgztett mvelet kzl adott felttel alapjn valamelyik vgrehajtsa Ismtlses vezrls Adott mvelet adott felttel szerinti ismtelt vgrehajtsa Eljrsvezrls Adott mvelet alkalmazsa adott argumentumokra, ami az argumentumok rtknek pontosan meghatrozott vltozst eredmnyezi Programozs Alapjai (2007)

99 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A C nyelv A C egy nagyon kicsi nyelv. Szintaxisa a K&Rben csupn nhny oldal. A nyelv rzkeny a kis- s nagybetkre! Nincs beptve I/O kezels String kezels Matematikai fggvnyek Viszont gazdagon knl standard fggvnyknyvtrakat. Programozs Alapjai (2007) 100 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk A C nyelv tulajdonsgai Kis mret Fggvnyhvsok szleskr hasznlata A tpus hanyagolsa Struktrlt nyelv Alacsony szint programozs olvashat elrse Pointer szleskr hasznlata: memria, tmb, struktra, fggvny Programozs Alapjai (2007) 101 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A C nyelv tulajdonsgai Mirt vlt a C szleskren hasznlt profi programozsi nyelvv?

Magas szint konstrukcii vannak. Alacsony szint tevkenysgeket is kezelni tud. Hatkony programot ksztenek a fordtk. A szmtgpek sok vltozatn tallunk C fordtt. Programozs Alapjai (2007) 102 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A C nyelv rvid trtnete UNIX fejlesztse 1969 krl az AT&T Bell Labratriumban Ken Thomson s Dennis Ritchie Els vltozat Assembly nyelven DEC PDP-7 gpen. BCPL felhasznlbart opercis rendszer fejleszt nyelv

Legfbb jellemzje, hogy tpustalan. Unalmasan hossz kd sok hibval. Egy j nyelv, a "B", a msodik ksrlet 1970 krl Programozs Alapjai (2007) 103 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A C nyelv rvid trtnete 1971: teljesen j nyelv, a "C", a "B" leszrmazottja 1973-ban a UNIX opercis rendszert trtk "C"-re. Az AT&T "hivatalos" vltozata a System V (System Five), amely a 4. Release-nl tart, rvidtve SVR4) 1988-89: ANSI C American National Standards Institute 1999: ISO C 99

International Organization for Standardization Programozs Alapjai (2007) 104 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A C nyelv rvid trtnete A C nyelv s a UNIX sszefondsa miatt C shell (csh) parancsrtelmez C-szer szintaxissal man cc, man gcc, man a.out, man ldd, stb. sok man oldal van a 3-as szekciban, pl. man 3 printf, man 3 scanf, stb. A hrcsoportok (newsgroup) kzl rdemes megemlteni: comp.lang.c comp.lang.c.moderated Programozs Alapjai (2007)

105 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Anyag a C nyelvhez A GNU project dokumentcii a gyakran hasznlt lersok, kziknyvek kztt tallhatk: http://www.cab.u-szeged.hu/local/m/doku.html vagy kzvetlenl a http://www.cab.u-szeged.hu/local/m/gnu.html oldalon. Megtallhatjuk a dokumentcik .dvi s .ps vltozatait is a /pub/doku/dvi/ illetve /pub/doku/ps/ alknyvtrakban. Programozs Alapjai (2007) 106 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk C fejleszti krnyezetek MSVC Microsoft Visual C Integrlt fejleszti rendszer Windows al fordt Programozs Alapjai (2007) 107 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk C fejleszti krnyezetek GNU C

gcc fordt programok linux alatt is gcc, ld, as i386-linux targetre fordt anjuta fejleszti rendszer sokfle programnyelvhez Programozs Alapjai (2007) 108 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fordts Linux rendszerben C fordts $ gcc program.c $ ./a.out Jobb megolds, ha a programnak nevet adunk

$ gcc -o program program.c $ ./program Programozs Alapjai (2007) 109 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk C fjlok A szablyos vgzdsek: file.c file.h file.i file.s file.o a.out C source (forrs) file C header (fejlc) file preprocessed C (preprocesszlt) file assembly language file

object file link edited output Programozs Alapjai (2007) 110 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A C forrs fordtsnak folyamata A fordtsi folyamat sok lpsbl is llhat, de 4 olyan lps van, ahol a folyamatot elkezdeni illetve befejezni lehet. preprocessing elfeldolgozs compilation fordts (assembly nyelvre) assembly fordts (gpi kdra) linking szerkeszts

Programozs Alapjai (2007) 111 A fjl vgzdse utal a programozsi nyelvre s arra, hogy mit kell vele csinlni: gcc -E p.c >p.i p.i gcc -S p.i p.s gcc -S p.c gcc -c p.s as p.s gcc p.s .o linker

p.c .s assembler .h .i C fordt .c preprocesszor UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A C forrs fordtsnak folyamata a.out

p.o gcc p.o ld p.o ... a.out gcc -c p.c gcc p.i gcc -c p.i gcc p.c Programozs Alapjai (2007) 112 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Minimlis C program /* * Minimlis C program, ami nem csinl semmit

* Ksztette: Dvnyi Kroly, [email protected] * 1998. Februr 26. */ main() { } Programozs Alapjai (2007) 113 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hello World C nyelven /* * Hell Vilg! * Ksztette: Gergely Tams, [email protected] * 2004. November 3. */

#include int main() { printf ("Hell Vilg!\n"); } Programozs Alapjai (2007) 114 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egy kicsit bonyolultabb C program main(l ,a,n,d)char**a;{ for(d=atoi(a[1])/10*80atoi(a[2])/5-596;n="@NKA\ CLCCGZAAQBEAADAFaISADJABBA^\ SNLGAQABDAXIMBAACTBATAHDBAN\ ZcEMMCCCCAAhEIJFAEAAABAfHJE\ TBdFLDAANEfDNBPHdBcBBBEA_AL\ H E L L O, W O R L D! "

[l++-3];)for(;n-->64;) putchar(!d+++33^ l&1);} Programozs Alapjai (2007) 115 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk s a futsnak eredmnye $ ./where 46 20 !!!!!!!!!!! !!! ! !!!!!!!!!!!!!!!!! !!!!! ! !!!!!!!!!!!!!!!!!!! !!!! !!!!!!!!!!!!!! !!!!!!!!! ! !!!! ! !!!!! !!!!! !!!!!!!!

!!!!!! !!!! !! ! $ !!! !!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!"!! !!!!!!!!!!!!!!!!! !! ! !! ! !!!!!!!!!!!!!!!!!!!! ! !!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!! !!! !!! ! !!!!!!!!!! ! ! ! ! !!!!! !! !!!! !

!!!!! !! !!!!!!!! !! !! ! Programozs Alapjai (2007) 116 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A C nyelv alapjai Egy C programozsi nyelven rt forrsfjl programegysgek deklarcijbl s defincijbl ll. Deklarlhatunk

Konstanst Tpust Vltozt Fggvnyt #define N 42 egyben N defincija is typedef unsigned long ui32; int magassag; double mertani_kozep(double, double); Programozs Alapjai (2007) 117 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Deklarci Egy programkomponens deklarcija egy azonost hozzrendelse az adott

komponenshez. Ezzel az azonostval hivatkozhatunk a program tovbbi rszben az adott komponensre. A program egy adott pontjn csak azok a komponensek hasznlhatk (hivatkozhatk), amelyeket e pontot megelzen mr deklarltunk, ellenkez esetben fordtsi hiba lp fel. Programozs Alapjai (2007) 118 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Definci Egy programkomponens defincija egy (a komponens deklarcijban meghatrozott tpus) rtk hozzrendelse a komponens azonostjhoz. A program egy adott pontjn csak azoknak a komponenseknek az rtkt szabad felhasznlni, amelyeket e pontot megelzen

mr definiltunk, ellenkez esetben a program nem fordthat, nem szerkeszthet, vagy mkdse vletlenszer, akr hibs is lehet. Programozs Alapjai (2007) 119 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Adattpus Az adattpus olyan egysge a programnak, amely kt sszetevje ltal meghatrozott: rtkhalmaz Az rtkhalmaz elemein vgezhet mveletek Minden adattpus vagy elemi, vagy ms adattpusokbl kpzett sszetett adattpus. Programozs Alapjai (2007) 120

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Vltoz A vltoz olyan programegysg, amely a hozz rendelt adattpus rtkhalmazbl mveletek hatsra tetszleges rtket felvehet, s rtkt a program vgrehajtsa sorn akrhnyszor megvltoztathatjuk. A vltoz rtke kezdetben definilatlan, s az marad, amg valamilyen mvelettel rtket nem adunk neki. Programozs Alapjai (2007) 121 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Vltoz (folyt.)

A vltozk alapveten gynevezett rtkad mvelet vgrehajtsval kaphatnak rtket. Ennek jellse: V = E magassag = 100; magassag = (magassag + 83); ahol V egy meghatrozott adattpus vltoz E ezen adattpus egy rtke Felttelezhetjk, hogy az rtkad mvelet minden elemi adattpus mveletei kztt szerepel. Programozs Alapjai (2007) 122 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Konstans

A konstans olyan komponense a programnak, amely a defincijban megadott rtket azonostja, s ez az rtk a program vgrehajtsa sorn nem vltoztathat meg. Tpusa a defincija ltal meghatrozott adattpus. Programozs Alapjai (2007) 123 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvny A fggvny a matematikai rtelemben vett fggvny ltalnostsa, gyakorlatilag egy (rsz-)algoritmus megvalstsa. A fggvny deklarcija azt mondja meg, hogy milyen tpus rtkekbl milyen tpus rtket llt el. A fggvny defincija megmondja, hogy a fggvny vgrehajtsa sorn milyen algoritmust

kell vgrehajtani. A fggvny meghvsakor azt adjuk meg, hogy milyen konkrt rtkeken hajtsuk vgre a fggvny ltal lert algoritmust. Programozs Alapjai (2007) 124 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvny (folyt.) A C nyelvben a fggvny fogalma bvebb, mint a matematikban Vannak olyan fggvnyek, amiknek valamilyen jl definilt mellkhatsa is van a visszatrsi rtk kiszmtsa mellett, ilyenek pldul a szveget megjelent (pl. printf), vagy adatbevitelt kezel (pl. scanf) fggvnyek. Adott esetben az is elfordulhat, hogy egy fggvnynek csak a mellkhatsa fontos, ilyenkor lehet, hogy a fggvny (matematikai rtelemben) nem is szmt ki semmilyen visszatrsi rtket. Az

ilyen fggvnyeket nevezhetjk eljrsnak. Programozs Alapjai (2007) 125 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Deklarcik, defincik C-ben Vltozk deklarcija: tpusmegads azonost; int i; double f; Konstansok defincija: #define azonost rtk Programozs Alapjai (2007) #define N 42 #define EPS 1e-10

126 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szintaxis A kommunikci ember s gp kztt vges jelhalmazbl (bc) vett, meghatrozott formai szablyokat kielgt, vges hosszsg jelsorozatokkal trtnik. Ezek a jelsorozatok alkotjk a kommunikci nyelvt. Szintaxis Formai szablyok olyan rendszert, amely meghatrozza, hogy egy adott kommunikcis nyelvben melyek a szablyos jelsorozatok, a nyelv szintaxisnak nevezzk. Programozs Alapjai (2007) 127 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Szintaxisdiagram Szintaxis megadsra szmos mdszer ismeretes, mi szintaxis diagramokat hasznlunk. Ebben minden szintaktikus egysg egyedi elnevezst kap, s a szintaktikus egysghez tartoz szablyos jelsorozatokat egy diagram (bra) definilja Az brban a szintaktikus egysgneveket tartalmaz dobozokat (tglalapokat) s konkrt jelsorozatokat irnytott vonalak ktik ssze Minden diagramnak egy bemenete s egy kimenete van Programozs Alapjai (2007) 128 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Szintaxisdiagram (folyt.) Szintaxis diagramok egy (vges) rendszerben egy diagram azokat s csak azokat a jelsorozatokat hatrozza meg, amelyek gy kaphatk, hogy a diagram bemenetrl indulva az irnytott vonalak mentn haladva a kijratig, valahnyszor rintnk egy egysget, egyms utn rjuk az ton rintett egysg ltal meghatrozott jelsorozatok egy elemt. A diagramban a konkrt jelsorozatok nmagukat definiljk. Programozs Alapjai (2007) 129 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szintaxis Azonost Bet _

Bet Szmjegy _ Programozs Alapjai (2007) 130 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szintaxis Bet A 0 Z 1 2 a

3 z Szmjegy 4 5 6 7 Programozs Alapjai (2007) 8 9 131 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A C nyelv elemi adattpusai int

Egsz float Vals A C-ben nincs logikai tpus, de logikai igaz s hamis rtkek keletkeznek, s logikai mveletek is vannak Programozs Alapjai (2007) 132 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Logikai mveletek Egy operandus mveletek (logikai -> logikai) ! Tagads mvelet

!a Kt operandus mveletek (logikai x logikai -> logikai) && || 's' mvelet 'vagy' mvelet Programozs Alapjai (2007) a && b a || b 133 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Logikai mveletek Relcis mveletek (logikai x logikai -> logikai)

== != < > <= >= Egyenlsg Nemegyenl Kisebb Nagyobb Kisebb vagy egyenl Nagyobb vagy egyenl Programozs Alapjai (2007) a == b a != b

a < b a > b a <= b a >= b 134 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Az int adattpus A C nyelv eleve definilt elemi adattpusa. Egsz rtkek trolsra alkalmas. rtkkszlete [INT_MIN, INT_MAX] zrt intervallumba es egsz szmok halmaza Az INT_MIN s INT_MAX eleve definilt konstans azonostk, hasznlatukhoz a program elejre be kell szrni az albbi sort: #include Programozs Alapjai (2007)

135 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Az int adattpus mveletei Egy operandus mveletek (int -> int ) - Eljel vlts -a Kt operandus mveletek (int x int -> int)

+ * / % sszeads Kivons Szorzs Egszoszts hnyadosa Egszoszts maradka Programozs Alapjai (2007) a + 8 7 - a 6 * 7 a / 3 42 % a 136 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Az int adattpus mveletei Relcis mveletek (int x int -> logikai) == != < > <= >= Egyenlsg Nemegyenl Kisebb Nagyobb Kisebb vagy egyenl Nagyobb vagy egyenl

Programozs Alapjai (2007) 3 == a a != 7 a < 42 a > 77 0 <= a 8 >= a 137 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Az int adattpus mveletei Az int adattpus mveleteire teljeslnek az aritmetika ismert azonossgai, feltve, hogy a mvelet eredmnye az adattpus rtkhalmazba esik. 2 * (3 * 7 + 5 * 4) == 4 * 2 * 5 + 3 * 2 * 7 Ha a mvelet eredmnye nem esne az adattpus rtkhalmazba, tlcsordulsrl

beszlnk. 2147483647 + 1 == -2147483648 Programozs Alapjai (2007) 138 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A float adattpus A C nyelv eleve definilt elemi adattpusa. A matematikai vals szmok s mveleteik szmtgpes modellezsre hasznlhat. A matematikai vals szmok megkzelthetk az adattpus rtkeivel, a matematikai mveletek pedig az adattpus mveleteivel. A kzelts mrtke a konkrt gpi megvalststl fgg. A float adattpust vals tpusnak is hvjuk. Programozs Alapjai (2007) 139

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A float adattpus rtkkszlete Az adattpus rtkei egy adott intervallumba esnek gy, hogy minden vals szm ebbl az intervallumbl adott relatv pontossggal megkzelthet float adattpusbeli rtkkel. Ez azt jelenti, hogy brmely a vals szmhoz van olyan x float tpus rtk, hogy |(x-a)/a| < relatv pontossg Programozs Alapjai (2007) 140 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

A float adattpus mveletei Egy operandus mveletek (float -> float) - Eljel vlts -3.1415 Kt operandus mveletek (float x float -> float) + * / sszeads Kivons Szorzs Oszts

Programozs Alapjai (2007) 41.3 + 0.7 a 2.7172 0.5 * a a / 2.0 141 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A float adattpus mveletei Relcis mveletek (float x float -> logikai)

== != < > <= >= Egyenlsg Nemegyenl Kisebb Nagyobb Kisebb vagy egyenl Nagyobb vagy egyenl Programozs Alapjai (2007) 3.0 == a a != 7.2 a < 1e-10 a > 0.2E3 0.33 <= a 42.0 >= a 142

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A float adattpus mveletei A matematikai fggvnyek s konstansok, mint pldul a sin cos M_PI log exp double sin(double x); double cos(double x); #define M_PI 3.14159265358979323846 double log(double x); double exp(double x);

nem rszei a nyelvnek, de egy knyvtrban ssze vannak gyjtve. Hasznlatukhoz szksges a matematikai fggvnyknyvtr #include include-olsa Programozs Alapjai (2007) 143 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Numerikus adattpusok Az int s a float adattpusokat sszefoglalan numerikus adattpusoknak nevezzk. Numerikus adattpus rtkeinek lersra szmlerst, rviden szmokat hasznlunk. Az int adattpus rtkeit nyolcas, tzes vagy tizenhatos szmrendszerbeli lerssal adhatunk meg. (Tizenhatos szmrendszerben a szmjegyek rtke decimlisan: A=10, B=11, C=12, D=13, E=14,

F=15.) Vals szmok lersra tizedes trtet hasznlhatunk, kiegsztve tzes exponenssel. Programozs Alapjai (2007) 144 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szintaxis Szm + - Eljeltelen szm Eljeltelen szm Eljeltelen egsz szm Eljeltelen vals szm Eljeltelen egsz szm

Nem 0 szmjegy Szmjegy 0 Oktlis szmjegy 0x Hexadecimlis szmjegy Programozs Alapjai (2007) 145 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szintaxis Eljeltelen vals szm Szmjegy . E +

e - Szmjegy Szmjegy Hexadecimlis szmjegy Szmjegy AaBbCcDdEeF f Programozs Alapjai (2007) 42 052 0x2a -3.1415 3e5 3E+6 271.72e-2 146

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Kifejezs Kifejezsen olyan programkomponenst rtnk, amely egy adattpus rtknek olyan jellse, amely mveleteket is tartalmazhat. A kifejezs ltal jellt rtket a kifejezs kirtkelse hatrozza meg. A kifejezs szintaxisa (egyelre) Numerikus kifejezs Logikai kifejezs Programozs Alapjai (2007) 147 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Kifejezs szintaxisa Numerikus kifejezs Numerikus tag + - Numerikus tag Numerikus tnyez * / % Programozs Alapjai (2007) 148 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Kifejezs szintaxisa Numerikus tnyez Konstans azonost Numerikus vltoz

Eljeltelen szm ( Numerikus kifejezs + - ) Numerikus tnyez Numerikus fggvnyhvs Programozs Alapjai (2007) 149 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Kifejezs szintaxisa Logikai kifejezs Logikai tag

|| Logikai tag Logikai tnyez && Programozs Alapjai (2007) 150 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Kifejezs szintaxisa Logikai tnyez Logikai konstans azonost Logikai vltoz ( Logikai kifejezs ! )

Logikai tnyez Logikai fggvnyhvs Relcis kifejezs Programozs Alapjai (2007) 151 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Kifejezs szintaxisa Relcis kifejezs Kifejezs == != < > <= >=

Kifejezs (sin(M_PI + alfa) < 0.2 * alfa + 1e-1) && (beta != M_PI) Programozs Alapjai (2007) 152 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Kifejezsek kirtkelse A kifejezs kirtkelst kt elrs egyttesen hatrozza meg A kifejezs szerkezetn alapul prioritsi elrs A halads irnyra vonatkoz elrs Programozs Alapjai (2007) 153 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Prioritsi elrs A mveletek kztt definilva van egy erssgi sorrend, az gynevezett priorits. Ez azt jelenti, hogy egy A m1 B m2 C alak kifejezsben, ahol m2 magasabb priorits mvelet, mint m1, az A m1(B m2 C) zrjelezsnek megfelelen rtkeldik ki. a < b && a + - 5 * b < 7 || c != b ((a < b) && ((a + ((- 5) * b)) < 7)) || (c != b) Programozs Alapjai (2007) 154 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Mveletek prioritsa Priorits cskken sorrendben: a prefix mvelet (prefix -, prefix +, ! ) a multiplikatv mveletek ( *, /, % ) az additv mveletek ( +, - ) a kisebb-nagyobb relcis mveletek ( <=, >=, <, > ) az egyenl-nem egyenl mveletek ( ==, != ) a logikai 's' mvelet ( && ) a logikai 'vagy' mvelet ( || ) Programozs Alapjai (2007) 155 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Mveletek asszociativitsa Azonos priorits mveletek esetn a kirtkelst az asszociativits irnya szerint kell elvgezni. Ez azt jelenti, hogy egy A m1 B m2 C alak kifejezs, ahol m1 s m2 azonos priorits mveletek, a balrl-jobbra asszociativits esetn (A m1 B) m2 C jobbrl-balra asszociativits esetn A m1 (B m2 C) zrjelezsnek megfelelen rtkeldik ki. Az eddig ismertetett mveletek balrl-jobbra a + 5 b 7 + c asszociatvak. (((a + 5) b) 7) + c Programozs Alapjai (2007) 156 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Logikai kifejezsek A logikai kifejezsek kirtkelse mindig a rvidtett kirtkels szerint trtnik, vagyis Az A || B kifejezs rvidtett kirtkelse sorn elszr kirtkeldik az A logikai tag, ha ennek rtke igaz, akkor a B tag kirtkelse elmarad s termszetesen a kifejezs rtke igaz lesz. Az A && B kifejezs rvidtett kirtkelse sorn elszr kirtkeldik az A logikai tnyez, ha ennek rtke hamis, akkor a B tnyez kirtkelse elmarad s termszetesen a kifejezs rtke hamis lesz. Programozs Alapjai (2007) 157 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Numerikus kifejezsek tpusa Minden numerikus kifejezs int vagy float tpus. A kifejezs tpusnak meghatrozsa a kifejezs felptse szerinti indukcival a kvetkez Tnyez tpusa: ha a tnyez vltoz, akkor a deklarcijban megadott tpus konstans, akkor a szmlers szerinti tpus (K), akkor a K kifejezs tpusa +T , akkor a T tnyez tpusa -T , akkor a T tnyez tpusa fggvnyhvs, akkor a fggvnymvelet eredmnytpusa Programozs Alapjai (2007) 158 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Numerikus kifejezsek tpusa (folyt.) Tag tpusa: legyen A m B alak a tag, ahol A s B tnyezk, m pedig multiplikatv mveleti jel. Ha m %, akkor A s B tpusa csak int lehet, s a tag tpusa is int /, s A s B tpusa is int, akkor az eredmny is int, s a mvelet az egszoszts hnyadosa /, s A vagy B float, akkor a tag tpusa is float, s a mvelet a vals oszts *, akkor az eredmny tag tpusa csak akkor lesz int, ha mindkt operandus tpusa int, egybknt pedig float Kifejezs tpusa: ha a tagok mindegyike int tpus, akkor a kifejezs tpusa is int, egybknt float. Programozs Alapjai (2007) 159 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk A / mvelet A / lehet maradkos oszts de vals oszts is 15 15.0 15 15.0 / / / / 6 6 6.0 6.0 == == == ==

2 2.5 2.5 2.5 Programozs Alapjai (2007) 160 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Konverzik Az int adattpus nem rsze a float adattpusnak. float tpus vltoz vagy konstans akkor sem szerepelhet olyan mveletben, amely csak az int tpus mvelete (%), ha az rtke egsz szmrtek. Megengedett azonban, hogy a float tpus egy mveletnek egyik argumentuma float, a msik argumentuma pedig int tpus legyen. A mvelet eredmnynek tpusa ekkor float

lesz. Programozs Alapjai (2007) 161 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Konverzik (folyt.) Az ilyen mvelet vgrehajtsa eltt az int tpus argumentum automatikusan tkonvertldik float tpusv. Ez a konverzi azonban tnyleges mveletet jelent s gy idt ignyel. Ajnlatos a 2*x mvelet helyett 2.0*x mveletet hasznlni, ha x float tpus (mg akkor is, ha a fordtprogramok az ilyen tpus konverzit mr fordtsi idben el tudjk vgezni). Programozs Alapjai (2007) 162

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk rtkad mvelet Az rtkads jele az = De ez mvelet, s nem utasts, vagyis a vltozazonost = kifejezs mvelet eredmnye a kifejezs aktulis rtke, amit a megfelel programkomponensben is eltrolunk. Termszetesen nincs akadlya a mvelet i = j = k = 1; tbbszri alkalmazsnak Az = mvelet jobb-asszociatv, priortsa az eddig ismertetett mveletek utn kvetkezik. Programozs Alapjai (2007) 163 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Utastsok A ; zrja le mveletek sorozatt, teht utastst csinl a kifejezsbl. A C-ben szoksos plda: kifejezs i = 1 utasts i = 1; Programozs Alapjai (2007) 164 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk sszetett utastsok kpzse Tudunk teht kifejezsekbl egyszer utastsokat gyrtani.

Most mlyebb magyarzat nlkl tnzzk, hogy a C nyelv milyen lehetsgeket ad sszetett utastsok kpzsre. Programozs Alapjai (2007) 165 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Utastsok sorozata Ha az utastsokat adott sorrendben kell vgrehajtani, akkor egyszeren { s } jelek kztt az adott sorrendben egyms utn lerjuk ket. Szmoljuk ki, melyik rban (o), percben (p) melyik msodperc (m) lesz a nap 54321. msodperce. { e o

e p m = = = = = 54321; e / 3600; e % 3600; e / 60; e % 60; } Programozs Alapjai (2007) 166 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Fggvnyek Egy C nyelven rt program tulajdonkppen nem ms, mint fggvnyek (megfelelen struktrlt s rendezett) sszessge. Egy-egy fggvny valamilyen bemen adatok alapjn kiszmol egy rtket, mint ahogyan azt a matematikban mr megszokhattuk. Fggvnyeket lehet deklarlni, definilni s meghvni. Programozs Alapjai (2007) 167 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnyek (folyt.) Deklarcinl csak azt mondjuk meg, hogy mennyi s milyen tpus paramterekbl milyen tpus rtket fog kiszmolni a fggvnynk.

Defincinl azt is meg kell adnunk, hogy hogyan szmoljon. A fggvnyhvsnl pedig konkrt rtkekre alkalmazzuk a fggvnyt, s a kiszmtott rtket felhasznlhatjuk tovbbi szmolsainkhoz. Programozs Alapjai (2007) 168 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnyek szintaxisa C-ben Fggvny deklarci Fggvny fejlc int f(int a, int b); ; Fggvny definci (egyben deklarci is)

Fggvny fejlc { Utastsok int f(int a, int b) { return a+b; } } Fggvny fejlc Tpus Azonost ( Azonost Tpus )

, Programozs Alapjai (2007) 169 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A return utasts A return utasts return Kifejezs ; int f(int a, int b) { return a+b; }

Minden fggvnyben szerepelnie kell legalbb egy return utastsnak. Ha a fggvnyben egy ilyen utastst hajtunk vgre, akkor a fggvny rtknek kiszmtsa befejezdik. A hvs helyn a fggvny a return ltal kiszmtott rtket veszi fel. Programozs Alapjai (2007) 170 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnyhvs szintaxisa C-ben Fggvnyhvs Azonost ( Kifejezs )

, Termszetesen egy fggvnynek a hvskor pontosan annyi s olyan tpus paramtert kell tadni, amennyi s amilyen paramterekkel deklarlva lett. int c; c = f(3,5); Programozs Alapjai (2007) 171 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnyek A C nyelvben van a main fggvnynek kitntetett szerepe van. Amikor elindtjuk a programot, a vezrls a main fggvny elejn indul, teht ez a fggvny viselkedik fprogramknt.

Az opercis rendszertl ez a fggvny is kaphat paramtereket, de ezekkel egyelre nem foglalkozunk. A main ltal kiszmtott rtket szintn az opercis rendszer rtelmezi (miutn befejezdtt a program), de errl is ksbb lesz sz. Programozs Alapjai (2007) 172 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnyek rjunk egy programot, ami ra, perc, msodperc alapjn egy fggvny segtsgvel kiszmolja az jfl ta eltelt msodperceket. int masodpercek(int ora, int perc, int masodperc) { return 3600 * ora + 60 * perc + masodperc; } int main()

{ int mp1, mp2; mp1 = masodpercek(12, 5, 7); mp2 = masodpercek(6, 45, 0); } Programozs Alapjai (2007) 173 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Az if utasts Ha valamilyen felttel alapjn egyik vagy msik utastst akarjuk vgrehajtani Szintaxis if ( Logikai kifejezs

) Utasts else Utasts Programozs Alapjai (2007) 174 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Az if utasts Vgre kell-e hajtani valamit? Szmoljuk ki f abszoltrtkt! if(f < 0) f = -f; if(f < 0) { f = -f; }

Kt utasts kzl az egyiket hajtsuk vgre! a s b kzl melyik a kisebb rtk? if(a <= b) k = a; else k = b; if(a <= b) { k = a; } else { k = b; } Programozs Alapjai (2007) 175 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A switch utasts Ha egy kifejezs rtke alapjn tbbfle

utasts kzl kell vlasztanunk Szintaxis switch ( Kifejezs ) case Konstans : default Utasts { : break Programozs Alapjai (2007)

; } 176 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A switch utasts Megadhatjuk, hogy hol kezddjn s meddig tartson az utasts-sorozat vgrehajtsa Gyakorlati jegybl csinljunk hromfokozat minstst! switch (gy) { case 5: case 4: printf("jl "); case 3: case 2: printf("megfelelt");

break; case 1: printf("nem felelt meg"); break; default: printf("nincs ilyen jegy"); break; } Programozs Alapjai (2007) 177 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A while utasts Ha valamilyen mveletet mindaddig vgre kell hajtani, amg egy felttel igaz. Ha a felttel kezdetben hamis volt, a mveletet egyszer sem hajtjuk vgre. (A felttel ellenrzse a mvelet eltt trtnik.) Szintaxis while

( Logikai kifejezs Programozs Alapjai (2007) ) Utasts 178 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A while utasts A mvelet vgrehajtsa nem szksges a felttel kirtkelshez Adjuk meg, hogy 0 fokrl indulva adott mrtk pozitv irny forgs utn milyen irnyban ll egy mutat. while (360 <= szog) {

szog = szog 360; } Programozs Alapjai (2007) 179 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A do while utasts Ha valamilyen mveletet mindaddig vgre kell hajtani, amg egy felttel igaz. A mveletet legalbb egyszer vgrehajtjuk akkor is, ha a felttel kezdetben hamis volt. (A felttel ellenrzse a mvelet utn trtnik.) Szintaxis do Utasts while

( Programozs Alapjai (2007) Logikai kifejezs ) 180 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A do while utasts A mvelet vgrehajtsa szksges a felttel kirtkelshez Krjnk egy 0 s 999 kztti vletlenszmot, de zrjuk ki a 100 s 200 kztti szmokat do { x = random() % 1000; } while ((100 <= x) && (x <= 200)) Programozs Alapjai (2007)

181 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A for utasts Ha valamilyen mveletet sorban tbb rtkre is vgre kell hajtani, akkor ezt rdemes hasznlni. Szintaxis for ( Kifejezs ; Kifejezs ;

Kifejezs ) Programozs Alapjai (2007) Utasts 182 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A for utasts A C-ben a for utasts ltalnos alakja gy nz ki: for (kif1; kif2; kif3) utasts ami egyenrtk a kif1; while (kif2) { utasts kif3;

} alakkal. Programozs Alapjai (2007) 183 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A for utasts Tbbnyire kif1 s kif3 rtkads vagy fggvnyhvs, kif2 pedig relcis kifejezs. A hrom kifejezs brmelyike elhagyhat, de a pontosvesszknek meg kell maradniuk. Ha kif1 vagy kif3 marad el, akkor a ; egyszeren elmarad a kifejtsbl. Ha a kif2 vizsglat nem szerepel, akkor llandan igaznak tekintjk, gy for (;;)ciklus, { /* ... */ } vgtelen amelybl

ms mdon kell kiugrani (pl. return vagy break rvn). Programozs Alapjai (2007) 184 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A for utasts Hajtsunk vgre egy mveletet adott szm alkalommal s most bntetsbl szzszor lerod a nevedet! for(i=0; i<100; i++) { printf("neved\n"); } Egy vltozt lpsenknt ugyangy vltoztatunk rassuk ki egy mrtani sorozat elemeit a kezdelem dupljig for(x = a0; x < 2.0 * a0; x = q * x) { printf("%lf\n", x);

} Programozs Alapjai (2007) 185 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A break s continue utastsok A C nyelvben a ciklusmag folyamatos vgrehajtsnak megszaktsra kt utasts hasznlhat: break Megszaktja a ciklust, a vezrls a ciklusmag utni els utastssal foglalkozik continue Megszaktja a ciklus aktulis lefutst, a vezrls a ciklus felttelnek kirtkelsvel folytatdik Programozs Alapjai (2007) 186

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyszer ki- s bevitel Ahhoz, hogy egyszer pldt mutassunk be, szksgnk van beviteli s kiviteli utastsokra is. A nyelv nem tartalmaz ilyen utastsokat, de minden implementciban vannak standard fggvnyknyvtrak ezek megvalstsaival. Programozs Alapjai (2007) 187 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyszer ki- s bevitel A ki- s bevitel hasznlathoz szksgnk van

az #include sorra a program elejn Ezek utn hasznlhatjuk az albbi kt fggvnyt: scanf(const char *, ...) a bemenetrl tudunk olvasni printf(const char *, ...) a kimenetre tudunk rni Programozs Alapjai (2007) 188 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyszer ki- s bevitel Anlkl, hogy a kt fggvnyt rszletesen elmagyarznnk, egyelre megmutatjuk, hogyan lehet int illetve float rtkek

beolvassra, valamint ugyanilyen tpus rtkek s tettszleges szveg kiratsra hasznlni ket. Programozs Alapjai (2007) 189 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyszer ki- s bevitel Mindkt fggvny els paramtere egy gynevezett formtumsztring, ami tulajdonkppen egy specilis szvegkonstans. Szveg (szvegkonstans): Karakter, kivve s \ \

\\ Programozs Alapjai (2007) 190 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyszer ki- s bevitel A printf hasznlata: printf ( Szveg ) Kifejezs , A szvegben az egyes kifejezsek helyt a %d

(int) s %f (float) karakterkombincik jelzik: printf("Hello world\n"); printf("Pi rtke kb. %f\n", 3.1415926); printf("%d + %d = %d\n", 2, 3, 2+3); A \n hatsra a kirs vgn j sor kezddik Programozs Alapjai (2007) 191 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyszer ki- s bevitel A scanf hasznlata: scanf ( Szveg ,

& Vltoz ) Az egyes beolvasand szmok tpust szintn %d (int) s %f (float) karakterkombincik jelzik: scanf("%d", &egesz); scanf("%f %f", &valos1, &valos2); Programozs Alapjai (2007) 192 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyszer ki- s bevitel Nagyon fontos, hogy a beolvasand rtkek illetve a kirand kifejezsek szmt s tpust

sorban s pontosan adjuk meg. Egy float tpus kifejezs vagy vltoz esetn teht akkor sem a %d kombincit hasznljuk, ha tudjuk, hogy maga az rtk egsz, s int tpus kifejezs illetve vltoz esetn sem hasznlhatjuk a %f et. Az albbi pldk teht hibsak: printf("%d", 10.0); printf("%f", 10); Programozs Alapjai (2007) 193 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egy C program felptse Egy egyszer C program gy nz ki: /* A program adatai */ #include main() { Vltozdeklarcik

Utastsok } Programozs Alapjai (2007) 194 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egy C program felptse Egy kevsb egyszer pedig gy: /* A program adatai */ #include Fggvnydefincik main() { Vltozdeklarcik Utastsok } Programozs Alapjai (2007) 195

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eltelt id Problmafelvets Kiszmtand a nap kt idpontja kztt eltelt id. Specifikci A bemen adat kt idpont ra s perc formban, jelljk ezeket O1, P1 illetve O2, P2-vel. A bemeneti felttel: (0 <= O1 < 24) s (0 <= P1 < 60) (0 <= O2 < 24) s (0 <= P2 < 60) (O1 < O2) vagy (O1 == O2) s (P1 <= P2) A kimen adatok O s P. A kimeneti felttel: Az els idponttl a msodikig O ra s P perc telt el Programozs Alapjai (2007) 196

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eltelt id (folyt.) Algoritmustervezs Az eltelt id percben kifejezve (O2 * 60 + P2) - (O1 * 60 + P1) Teht O, P akkor s csak akkor megolds, ha O * 60 + P == (O2 * 60 + P2) - (O1 * 60 + P1) 0 <= P < 60 Ez tulajdonkppen a kimeneti felttelek formlis megadsa, de az els felttel mr mindenkppen az algoritmustervezs fzishoz kapcsoldik Programozs Alapjai (2007) 197 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Szerkezeti bra Az algoritmus tervezse sorn le kell rnunk valamilyen nyelvezetet hasznlva azt, hogy a problmt milyen rszproblmkra dekomponltuk, s a megoldsukat milyen mdon raktuk ssze. Mi erre gynevezett szerkezeti brt (structure diagram, struktradiagram) hasznlunk. Minden vezrlsi mdhoz bevezetnk egy szerkezeti bra jellst. Programozs Alapjai (2007) 198 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szerkezeti bra tulajdonsgai A szerkezeti bra egyszerre fejezi ki az algoritmustervezs folyamatt s a kifejlesztett

algoritmust is. Egy rszproblma megoldst ler szerkezeti brarsz klnll brval is kifejezhet, amelynek gykerben a rszproblma megnevezse ll. Programozs Alapjai (2007) 199 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szekvencilis vezrls A P problmt P1, ... , Pn P rszproblmkra bontjuk, s ezek megoldsait ebben a P1 P2 Pn sorrendben egyms utn

vgrehajtva kapjuk P megoldst P1, ... , Pn elemi mveletek, vagy rszproblmk megnevezse. Utbbi esetben a rszproblmt tovbb kell bontani. Programozs Alapjai (2007) 200 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eltelt id (folyt.) Szerkezeti bra Eltelt id Beolvass Szmols K = eltelt percek Kirats O s P kiszmolsa

K = (O2 * 60 + P2) - (O1 * 60 + P1) O = K/60 egszrsze Programozs Alapjai (2007) P = K/60 maradka 201 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eltelt id (folyt.) Az Eltelt id algoritmusban hasznlt vltozk O1, P1, O2, P2, O, P, K: valamennyi egsz tpus, rtkk tetszleges egsz szm lehet Az egsz rtkeken a kvetkez mveleteket alkalmaztuk

sszeads (+) Kivons (-) Szorzs (*) Oszts egszrsze (/) Oszts maradka (%) Programozs Alapjai (2007) 202 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szekvencilis vezrls C nyelven Kdolsa C nyelven: P { P1; P2; . .

. Pn; P1 P2 Pn } Programozs Alapjai (2007) 203 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eltelt id /* * Egy nap kt idpontja kztt mennyi id telt el. * Ksztette: Dvnyi Kroly, [email protected] *

1997. Szeptember 26. Pntek */ #include main() { int o1,p1; int o2,p2; int o,p; int k; /* az els idpont /* a msodik idpont /* az eltelt id /* az eltelt id percben */ */ */ */ >>> Programozs Alapjai (2007) 204

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eltelt id /* beolvass */ printf("Krem az els idpontot ra perc formban\n"); scanf("%d %d", &o1, &p1); printf("Krem a msodik idpontot ra perc formban\n"); scanf("%d %d", &o2, &p2); /* szmts */ /* klnbsg szmts */ k = 60 * o2 + p2 - (60 * o1 + p1); o = k / 60; p = k % 60; /* kirats */ printf("Az eltelt id: %d ra %d perc.\n", o, p); } Programozs Alapjai (2007) 205

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eljrsvezrls Adott mvelet alkalmazsa adott argumentumokra, ami az argumentumok rtknek pontosan meghatrozott vltozst eredmnyezi Az eljrsvezrls fajti Eljrsmvelet Fggvnymvelet Programozs Alapjai (2007) 206 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eljrsvezrls megvalstsa Vannak olyan programozsi nyelvek, ahol a

fggvny s eljrsmveletek meg vannak klnbztetve. Mivel azonban e kurzus keretben csak a C nyelvrl lesz sz, egyelre csak a fggvnymvelettel foglalkozunk, s a szerkezeti brn is igazodni fogunk a C nyelvhez. Programozs Alapjai (2007) 207 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnymvelet A matematikai fggvny fogalmnak ltalnostsa. Ha egy rszproblma clja egy rtk kiszmtsa adott rtkek fggvnyben, akkor a megoldst megfogalmazhatjuk fggvnymvelettel.

Programozs Alapjai (2007) 208 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvny specifikcija A fggvnymvelet specifikcija tartalmazza: A mvelet elnevezst A formlis argumentumok felsorolst Mindegyik argumentum adattpust A fggvnymvelet eredmnytpust A mvelet hatsnak lerst Programozs Alapjai (2007)

209 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnymvelet A fggvnymvelet jellsre a T F(T1 X1, ... ,Tn Xn) formt hasznljuk, ahol T a fggvnymvelet eredmnytpusa F a fggvnymvelet neve Ti az i-edik formlis argumentum adattpusa Xi az i-edik formlis argumentum azonostja A zrjeleket res paramterlista esetn is ki kell tenni.

Programozs Alapjai (2007) 210 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnymvelet A C jellsmdhoz igazodva, a fggvny algoritmusa egy olyan szerkezeti brval adhat meg, melynek a feje gy nz ki: T F(T1 X1, ... ,Tn Xn) Tovbb a szerkezeti brban lennie kell (legalbb) egy olyan return utastsnak, amely visszaadja a fggvny ltal kiszmtott rtket. Programozs Alapjai (2007) 211 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Fggvnymvelet A fent jellt fggvnymveletnek adott A1, ..., An aktulis argumentumokra trtn vgrehajtst fggvnyhvsnak nevezzk s az F(A1, ... ,An) jellst hasznljuk. A fggvnyhvs kifejezs. A zrjeleket paramter nlkli fggvny hvsa esetn is ki kell tenni. Programozs Alapjai (2007) 212 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnyek szintaxisa C-ben

Fggvny deklarci Fggvny fejlc ; Fggvny definci (egyben deklarci is) Fggvny fejlc { Utastsok } Fggvny fejlc Tpus Azonost ( Tpus Azonost

) , Programozs Alapjai (2007) 213 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnyek szintaxisa C-ben A return utasts return Kifejezs ; Minden fggvnyben szerepelnie kell legalbb egy return utastsnak, amely kiszmtja a megadott kifejezs rtkt, majd visszatr a fggvnybl.

A hvs helyn a fggvny a return ltal kiszmtott rtket veszi fel. Programozs Alapjai (2007) 214 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnyhvs szintaxisa C-ben Fggvnyhvs Azonost ( Kifejezs ) , Termszetesen egy fggvnynek a hvskor

pontosan annyi s olyan tpus paramtert kell tadni, amennyi s amilyen paramterekkel deklarlva lett. Programozs Alapjai (2007) 215 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvny megvalstsa Ha a fggvny szerkezeti brja ez: T F(T1 X1, ... ,Tn Xn) M Akkor a fggvnydefinci C-ben: T F(T1 X1, ..., Tn Xn) { M; } Programozs Alapjai (2007)

216 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnymvelet Pldul float atlag(float a, float b) { return (a + b)/2; } Rgen C-ben a gy kellett fggvnyt deklarlni: float atlag(a,b) float a, float b; { return (a + b)/2; } Programozs Alapjai (2007) 217

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eltelt id Szerkezeti bra int eltelt_percek(int ora1, int perc1, int ora2, int perc2) eltelt percek kiszmtsa return (ora2 * 60 + perc2) - (ora1 * 60 + perc1) Programozs Alapjai (2007) 218 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eltelt id (folyt.) Szerkezeti bra Eltelt id Beolvass

Szmols Kirats O s P kiszmolsa O = eltelt_percek(O1, P1, O2, P2) /60 egszrsze P = eltelt_percek(O1, P1, O2, P2) /60 maradka Programozs Alapjai (2007) 219 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eltelt id /* * Egy nap kt idpontja kztt mennyi id telt el. * Ksztette: Gergely Tams, [email protected] * 2007. Augusztus 30. */

#include int eltelt_percek(int ora1, int perc1, int ora2, int perc2) { return 60 * o2 + p2 - (60 * o1 + p1); } >>> Programozs Alapjai (2007) 220 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eltelt id main() { int o1,p1; int o2,p2; int o,p; /* az els idpont */

/* a msodik idpont */ /* az eltelt id */ /* beolvass */ printf("Krem az els idpontot ra perc formban\n"); scanf("%d %d", &o1, &p1); printf("Krem a msodik idpontot ra perc formban\n"); scanf("%d %d", &o2, &p2); /* szmts */ /* klnbsg szmts */ o = eltelt_percek(o1, p1, o2, p2) / 60; p = eltelt_percek(o1, p1, o2, p2) % 60; /* kirats */ printf("Az eltelt id: %d ra %d perc.\n", o, p); } Programozs Alapjai (2007) 221 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Szelekcis vezrlsek Szelekcis vezrlssel azt rjuk el, hogy vges sok rgztett mvelet kzl, vges sok adott felttel alapjn, melyik mvelet kerljn vgrehajtsra. Tpusai: Egyszer Tbbszrs Esetkivlasztsos A fenti hrom egybknt ggal Programozs Alapjai (2007) 222 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Egyszer szelekcis vezrls Egyszer szelekci esetn egy felttel s egy mvelet van. Legyen F logikai kifejezs, A pedig tetszleges mvelet. Az F felttelbl s az A mveletbl kpzett egyszer szelekcis vezrls a kvetkez vezrlsi elrst jelenti: 1.) rtkeljk ki az F felttelt s folytassuk a 2.) lpssel. 2.) Ha F rtke igaz, akkor hajtsuk vgre az A mveletet s fejezzk be az sszetett mvelet vgrehajtst. 3.) Egybknt, vagyis ha F rtke hamis, akkor fejezzk be az sszetett mvelet vgrehajtst. Programozs Alapjai (2007) 223 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyszer szelekcis vezrls A vezrls bvthet gy, hogy a 3. pontban res mvelet helyett egy B mveletet hajtunk vgre.

Legyen F logikai kifejezs, A s B pedig tetszleges mvelet. Az F felttelbl s az A s B mveletbl kpzett egyszer szelekcis vezrls a kvetkez vezrlsi elrst jelenti: 1.) rtkeljk ki az F felttelt s folytassuk a 2.) lpssel. 2.) Ha F rtke igaz, akkor hajtsuk vgre az A mveletet s fejezzk be az sszetett mvelet vgrehajtst. 3.) Egybknt, vagyis ha F rtke hamis, hajtsuk vgre B-t s fejezzk be az sszetett mveletet vgrehajtst. Programozs Alapjai (2007) 224 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyszer szelekcis vezrls Az egyszer szelekcis vezrls szerkezeti brja F i

n A Programozs Alapjai (2007) 225 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyszer szelekcis vezrls Az egybknt ggal kiegsztett egyszer szelekcis vezrls szerkezeti brja F i A n

B Programozs Alapjai (2007) 226 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyszer szelekcis vezrls A vezrls lnyege: Ha az F felttel igaz, hajtsuk vgre az A mveletet. Ha az F felttel hamis, hajtsuk vgre a B mveletet. Programozs Alapjai (2007) 227 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Tbbszrs szelekcis vezrls Ha a szelekcis vezrlsben a felttelek szma nagyobb, mint egy, akkor tbbszrs szelekcirl beszlnk. Ekkor minden kivlaszt felttelhez tartozik egy alternatv mvelet. Legyenek Fi logikai kifejezsek, Ai pedig tetszleges mveletek (1<=i<=n). Programozs Alapjai (2007) 228 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tbbszrs szelekcis vezrls Az Fi kivlaszt felttelekbl valamint az Ai mveletekbl kpzett tbbszrs szelekcis vezrls a kvetkez vezrlsi elrst jelenti: 1.) Az Fi felttelek kirtkelsvel adjunk vlaszt a kvetkez krdsre: Van-e olyan i (1<=i<=n), amelyre teljesl, hogy az F i felttel igaz s az sszes Fj (1<=j

a 2.) lpssel. 2.) Ha van ilyen i, akkor hajtsuk vgre az Ai mveletet s fejezzk be az sszetett mvelet vgrehajtst. 3.) Egybknt, vagyis ha minden Fi felttel hamis, akkor fejezzk be az sszetett mvelet vgrehajtst. Programozs Alapjai (2007) 229 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tbbszrs szelekcis vezrls Bvthetjk a tbbszrs szelekcis vezrlst azzal, hogy a 3.) pontban ne az res mvelet, hanem egy elre megadott B tetszleges mvelet vgrehajtst rjuk el. Legyenek Fi logikai kifejezsek, Ai s B pedig tetszleges mveletek (1<=i<=n). Programozs Alapjai (2007)

230 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tbbszrs szelekcis vezrls Az Fi kivlaszt felttelekbl, valamint az Ai s B mveletekbl kpzett tbbszrs szelekcis vezrls a kvetkez vezrlsi elrst jelenti: 1.) Az Fi felttelek kirtkelsvel adjunk vlaszt a kvetkez krdsre: Van-e olyan i (1<=i<=n), amelyre teljesl, hogy az F i felttel igaz s az sszes Fj (1<=j

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tbbszrs szelekcis vezrls A tbbszrs szelekcis vezrls szerkezeti brja ? F1 F2 Fn A1 A2 An Programozs Alapjai (2007) 232

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tbbszrs szelekcis vezrls Az egybknt ggal kiegsztett tbbszrs szelekcis vezrls szerkezeti brja ? F1 F2 Fn A1 A2 An Programozs Alapjai (2007)

B 233 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tbbszrs szelekcis vezrls A vezrls lnyege Hajtsuk vgre a legels olyan Ai mveletet, aminek az Fi felttele igaz. Ha nincs olyan Fi ami igaz, akkor hajtsuk vgre a B mveletet. Programozs Alapjai (2007) 234 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Hromszgek osztlyozsa Problmafelvets Milyen hromszget hatroz meg hrom vals szm, mint a hromszg hrom oldalhosszsga? Specifikci A problma inputja A,B,C vals szmok Outputja a kvetkez szvegek egyike nem hromszg, szablyos hromszg, egyenlszr hromszg, egyenlszr derkszg hromszg, derkszg hromszg, egyb hromszg Programozs Alapjai (2007) 235 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hromszgek osztlyozsa Algoritmustervezs: fogalmazzuk meg a

feltteleket magyarul s a matematika nyelvn nem hromszg szablyos hromszg egyenlszr hromszg egyenlszr derkszg hromszg derkszg hromszg egyb hromszg Programozs Alapjai (2007) 236 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hromszgek osztlyozsa

Algoritmustervezs A felttelek megfogalmazsa rdekben clszernek ltszik a bemen adatokat gy trendezni, hogy az A vltoz tartalmazza a legnagyobb rtket. Ekkor a felttelek rendre NP felttel: (A<=0) vagy (B<=0) vagy (C<=0) N felttel: A >= B + C Sz felttel: (A == B) s (B == C) E felttel: (A == B) vagy (B == C) vagy (A == C) D felttel: A2 = B2 + C2 Az osztlyozs eredmnyt kzvetlenl kirjuk. Programozs Alapjai (2007) 237 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Hromszgek osztlyozsa Struktradiagram Hromszgek osztlyozsa Beolvass trendezs Programozs Alapjai (2007) Osztlyozs 238 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hromszgek osztlyozsa Struktradiagram Osztlyozs

? NP N SZ E D Nem Nem Szablyos Egyenlszr Derkszg Egyb D i

n Egyenlszr derkszg Programozs Alapjai (2007) Egyenlszr 239 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hromszgek osztlyozsa Struktradiagram trendezs A s B trendezse A s C trendezse A

A

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Az if utasts Ha valamilyen felttel alapjn egyik vagy msik utastst akarjuk vgrehajtani Szintaxis if ( Logikai kifejezs ) Utasts else Utasts Programozs Alapjai (2007) 241

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyszer szelekcis vezrls Az egyszer szelekcis vezrls szerkezeti brja s C megvalstsa if ( F ) { A; } Programozs Alapjai (2007) F i n A 242

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyszer szelekcis vezrls Az egybknt ggal kiegsztett egyszer szelekcis vezrls szerkezeti brja s C megvalstsa if ( F ) { A; } else { B; } Programozs Alapjai (2007) F i A n

B 243 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tbbszrs szelekci megvalstsa C nyelvben nincs kln utasts a tbbszrs szelekci megvalstsra, ezrt az egyszer szelekci ismtelt alkalmazsval kell azt megvalstani. Ez azon az sszefggsen alapszik, hogy a tbbszrs szelekci levezethet egyszer szelekcik megfelel sszettelvel. Programozs Alapjai (2007) 244 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Tbbszrs szelekci megvalstsa Az albbi kt bra ugyanazt a vezrlsi elrst fejezi ki. F1 ? F1 F2 i n A1 Fn F2 i

A1 A2 An n B A2 Fn i An Programozs Alapjai (2007) n B 245 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Tbbszrs szelekci megvalstsa A tbbszrs szelekcis vezrls szerkezeti brja s C megvalstsa ? F1 F2 Fn A1 A2 An Programozs Alapjai (2007) if ( F1 ) {

A1; } else if ( F2 ) { A2; ... } else if ( Fn ) { An; } 246 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tbbszrs szelekci megvalstsa Az egybknt ggal kiegsztett tbbszrs szelekcis vezrls szerkezeti brja s C megvalstsa

? F1 F2 Fn A1 A2 An B Programozs Alapjai (2007) if ( F1 ) { A1; } else if ( F2 ) { A2; ... } else if ( Fn )

{ An; } else { B; } 247 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hromszgek osztlyozsa /* Milyen hromszget hatroz meg hrom pozitiv vals szm, * mint a hromszg hrom oldalhosszsga? * 1997. Oktber 13. Dvnyi Kroly */ #include main() { float A, B, C; /* a hromszg oldalhosszsgai */ float M;

/* munkavltoz a cserhez */ printf("Krem a hrom pozitv vals szmot!\n"); scanf("%f%f%f", &A, &B, &C); >>> Programozs Alapjai (2007) 248 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hromszgek osztlyozsa /* A,B,C trendezse gy, hogy A>=B,C legyen */ if (A < B) { /* A s B trendezse */ M = A; A = B; B = M; } if (A < C) {

/* A s C trendezse */ M = A; A = C; C = M; } /* osztlyozs */ if (A <= 0 || B <= 0 || C <= 0) { printf(" Nem hromszg!\n"); /* 1. alternatva */ >>> Programozs Alapjai (2007) 249 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hromszgek osztlyozsa } else if (A >= B + C) { printf(" Nem hromszg!\n"); /* 2. alternatva

} else if (A == B && B == C) { printf(" Szablyos hromszg.\n"); /* 3. alternatva } else if (A == B || B == C || A == C) { if (A * A == B * B + C * C) { /* 4. alternatva printf(" Egyenlszr derkszg hromszg.\n"); } else { printf(" Egyenlszr hromszg.\n"); } } else if (A * A == B * B + C * C) { printf(" Derkszg hromszg.\n"); /* 5. alternatva } else { printf(" Egyb hromszg.\n"); /* egybknt } /* vge a tbbszrs szelekcinak */ */ */ */ */ */

} Programozs Alapjai (2007) 250 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk if utastsok ismtelt alkalmazsa Az if utastsok ismtelt alkalmazsa esetn figyelembe kell venni, hogy a kvetkez utasts a mellette lthat vezrlsi szerkezet megvalstsa F1 if ( F1 ) if ( F2 ) A1; else A2; i

n F2 i A1 Programozs Alapjai (2007) n A2 251 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk if utastsok ismtelt alkalmazsa Az if utastsok ismtelt alkalmazsa esetn figyelembe kell venni, hogy a kvetkez utasts a mellette lthat vezrlsi szerkezet megvalstsa F1 if ( F1 ) {

if ( F2 ) A1; else A2; } i n F2 i A1 Programozs Alapjai (2007) n A2 252 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

if utastsok ismtelt alkalmazsa Az if utastsok ismtelt alkalmazsa esetn figyelembe kell venni, hogy a kvetkez utasts a mellette lthat vezrlsi szerkezet megvalstsa F1 if ( F1 ) { if ( F2 ) A1; } else { A2; } i F2 i n A2 n A1

Programozs Alapjai (2007) 253 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Esetkivlasztsos szelekcis vezrls A tbbszrs szelekci egy specilis esete az, amikor minden Fi (1<=i<=n) felttel gy szl: Egy adott K kifejezs aktulis rtke eleme-e az rtkek egy elre megadott Hi halmaznak? Vagyis legyen a K egy szelektor kifejezs, Hi kivlaszt halmazok, Ai pedig tetszleges mveletek (1<=i<=n). Ezekbl kpzett esetkivlasztsos szelekcis vezrls a kvetkez vezrlsi elrst jelenti: Programozs Alapjai (2007) 254

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Esetkivlasztsos szelekcis vezrls 1.) rtkeljk ki a K kifejezst s folytassuk a 2.) lpssel. 2.) Adjunk vlaszt a kvetkez krdsre: Van-e olyan i (1<=i<=n), amelyre teljesl, hogy a kiszmolt rtk eleme a Hi halmaznak s nem eleme az sszes Hj (1<=j

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Esetkivlasztsos szelekcis vezrls Bvthetjk az esetkivlasztsos szelekcis vezrlst azzal, hogy a 4.) pontban ne az res mvelet, hanem egy elre megadott B tetszleges mvelet vgrehajtst rjuk el. Legyen a K egy szelektor kifejezs, Hi kivlaszt halmazok, Ai s B pedig tetszleges mveletek (1<=i<=n). Ezekbl kpzett esetkivlasztsos szelekcis vezrls a kvetkez vezrlsi elrst jelenti: Programozs Alapjai (2007) 256 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Esetkivlasztsos szelekcis vezrls 1.) rtkeljk ki a K kifejezst s folytassuk a 2.) lpssel. 2.) Adjunk vlaszt a kvetkez krdsre: Van-e olyan i (1<=i<=n), amelyre teljesl, hogy a kiszmolt rtk eleme a Hi halmaznak s nem eleme az sszes Hj (1<=j

Az esetkivlasztsos szelekcis vezrls szerkezeti brja K ? H1 H2 Hn A1 A2 An Programozs Alapjai (2007) 258 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Esetkivlasztsos szelekcis vezrls Az egybknt ggal kiegsztett esetkivlasztsos szelekcis vezrls szerkezeti brja K ? H1 H2 Hn A1 A2 An Programozs Alapjai (2007) B 259 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Esetkivlasztsos szelekcis vezrls A vezrls lnyege rtkeljk ki a K kifejezst. Hajtsuk vgre a legels olyan Ai mveletet, aminek a Hi halmazban benne van a K rtke. Ha K rtke nem eleme egyetlen Hi halmaznak sem, akkor hajtsuk vgre a B mveletet. Programozs Alapjai (2007) 260 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Esetkivlasztsos szelekcis vezrls A kivlaszt halmazok megadsa az esetkivlasztsos szelekci kritikus pontja.

Algoritmusok tervezse sorn minden effektv halmazmegadst hasznlhatunk, azonban a tnyleges megvalstskor csak a vlasztott programozsi nyelv eszkzeit alkalmazhatjuk. Programozs Alapjai (2007) 261 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Dtum helyessge Problmafelvets Eldntend, hogy egy dtumknt megadott szmpr helyes dtum-e? Specifikci Input Egy (hnap, nap) alakban megadott dtum Output A dtum akkor s csak akkor helyes, ha 1 <= hnap <= 12

s a nap rtk is a megfelel intervallumba esik. Programozs Alapjai (2007) 262 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Dtum helyessge Algoritmustervezs Dtum Be(Hnap,Nap) Hnap Kirats ? 2 4,6,9,11

1,3,5,7,8,10,12 J= (1<=Nap) s (Nap<=28) J= (1<=Nap) s (Nap<=30) J= (1<=Nap) s (Nap<=31) Programozs Alapjai (2007) J=Hamis 263 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

A switch utasts Ha egy kifejezs rtke alapjn tbbfle utasts kzl kell vlasztanunk Szintaxis switch ( Kifejezs ) case Konstans : default Utasts { :

break Programozs Alapjai (2007) ; } 264 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A switch utasts A szelektor kifejezs s a konstansok tpusnak meg kell egyeznie. Egy konstans legfeljebb egyszer szerepelhet case mgtt egy switch utastsban. A default kulcssz csak egyszer szerepelhet egy switch utastsban. Programozs Alapjai (2007)

265 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Esetkiv. szelekci megvalstsa Az esetkivlasztsos szelekcis vezrls C megvalstsa K ? H1 H2 Hn A1 A2

An switch (K) { case H1 : A1; break; ... case Hn : An; break; } Programozs Alapjai (2007) 266 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Esetkiv. szelekci megvalstsa Az egybknt ggal kiegsztett esetkivlasztsos

szelekcis vezrls C megvalstsa K ? H1 H2 Hn A1 A2 An B switch (K) { case H1 : A1; break; ... case Hn :

An; break; default : B; break; } Programozs Alapjai (2007) 267 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A switch utasts tulajdonsgai C-ben a H1, ..., Hn halmazok csak egyelemek lehetnek, amelyeket gy egyszeren az elem megadsval jellhetnk. A hatkonyabb kdols rdekben azonban kihasznlhatjuk a switch utasts tulajdonsgt: A K kifejezs rtktl csak az fgg, hogy melyik helyen kezdjk el vgrehajtani a switch magjt.

Ha a vgrehajts elkezddik, akkor onnantl kezdve az els break utastsig, vagy a switch vgig sorban hajtdnak vgre az utastsok. Programozs Alapjai (2007) 268 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A switch utasts tulajdonsgai Tegyk fel, hogy a H1 halmaz elemei x1,x2, ... ,xm Ezt C-ben a case x1: case x2: ... case xm: A1; break; kdrszlettel tudjuk lekdolni.

Programozs Alapjai (2007) 269 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A switch utasts tulajdonsgai A default g olyan, mintha a K kifejezs sszes lehetsges de a switch-ben fel nem sorolt rtkt megadnnk egy-egy case ggal. gy a default g a switch magjn bell tetszleges helyen lehet, de csak akkor kezddik itt a vezrls, ha a kifejezs aktulis rtke egyetlen case-ben sem szerepel, belertve a default utn megadott case-eket is. ppen ezrt a default gban is mindig hasznljunk break utastst. Programozs Alapjai (2007) 270

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Logikai adattpus C nyelven Az algoritmustervezs sorn hasznltunk egy J nev vltozt, amely logikai rtket trolt. A C nyelvben nincs logikai tpus, de azrt logikai rtkek persze keletkeznek. Ezeket az rtkeket eltrolhatjuk egy int vltozban. Ha egy logikai rtket egy int tpus vltozba tettnk, akkor a logikai hamis rtk trolsa utn az int tpus vltoz rtke 0, az igaz rtk trolsa utn pedig nem 0. (Sok megvalstsban 1, de ezt nem hasznlhatjuk ki, ha gpfggetlen programot szeretnnk.) Programozs Alapjai (2007) 271 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Dtum helyessge /* Eldntend, hogy egy dtumknt megadott szmpr helyes dtum-e? * 1997. Oktber 4. Dvnyi Kroly, [email protected] */ #include main() { int Honap, Nap; int Jo; /* a Boolean rtk trolsra */ printf("Krem a dtumot (hnap, nap) !\n"); scanf("%d%d", &Honap, &Nap); switch (Honap) { case 2: Jo = (1 <= Nap && Nap <= 28); break; Programozs Alapjai (2007) >>>

272 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Dtum helyessge case 4: case 6: case 9: case 11: Jo = (1 <= Nap && Nap <= 30); break; case 1: case 3: case 5: case 7: case 8: case 10: case 12: Jo = (1 <= Nap && Nap <= 31); break; >>>

Programozs Alapjai (2007) 273 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Dtum helyessge default: Jo = 0; break; } /* switch */ /* Kirats printf("A dtum "); if (!Jo) { printf("nem "); } printf("helyes.\n"); */ /* Ezt mskppen szoktk */

} Programozs Alapjai (2007) 274 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Feltteles kifejezs A feltteles opertor a C nyelv egyetlen hromoperandus mvelete. A K&R knyv feltteles kifejezsnek emlti. kif1 ? kif2 : kif3 Elszr a kif1 kerl kirtkelsre, ha ez Igaz (nem 0), a kifejezs rtke kif2 lesz Hamis (0), a kifejezs rtke kif3 lesz Programozs Alapjai (2007) 275

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Feltteles kifejezs Az elz programban a kirats ez volt: printf("A dtum "); if (!Jo) { printf("nem "); } printf("helyes.\n"); Programozs Alapjai (2007) 276 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Feltteles kifejezs Ez lervidthet:

printf("A dtum "); printf(Jo ? " " : " nem "); printf("helyes.\n"); vagy printf(Jo ? "A dtum helyes.\n" : "A dtum nem helyes.\n"); Programozs Alapjai (2007) 277 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Feltteles kifejezs Illesszk be prioritsi sorba az = s a ?: mveleteket!

prefix mvelet (prefix -, ! ) multiplikatv mveletek ( *, /, % ) additv mveletek ( +, - ) kisebb-nagyobb relcis mveletek ( <=, >=, <, > ) egyenl-nem egyenl relcis mveletek ( ==, != ) logikai 's' mvelet ( && ) logikai 'vagy' mvelet ( || ) feltteles mvelet ( ? : ) rtkad mvelet ( = ) Programozs Alapjai (2007) 278 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Feltteles kifejezs

gy a kvetkez programrszlet if (a > b) { z = a; } else { z = b; } trhat gy: z = (a > b) ? a : b; vagy akr: z = a > b ? a : b; Programozs Alapjai (2007) 279 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Ismtlses vezrlsek Ismtlses vezrlsen olyan vezrlsi elrst rtnk, amely adott mveletnek adott felttel

szerinti ismtelt vgrehajtst rja el. Az ismtlsi felttel szerint t formjt klnbztetjk meg az ismtlses vezrlseknek 1. Kezdfeltteles 2. Vgfeltteles 3. Szmllsos 4. Hurok 5. Diszkrt Programozs Alapjai (2007) 280 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Ismtlses vezrlsek Az algoritmustervezs sorn a leginkbb megfelel ismtlses vezrlsi formt hasznljuk, fggetlenl attl, hogy a megvalstsra hasznlt programozsi nyelvben kzvetlenl megvalsthat-e ez a vezrlsi md.

Ismtlses vezrls kpzst ciklusszervezsnek is nevezik, gy az ismtlsben szerepl mveletet ciklusmagnak hvjuk. Programozs Alapjai (2007) 281 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Kezdfeltteles ismtlses vezrls Legyen F logikai kifejezs, M pedig tetszleges mvelet. Az F ismtlsi felttelbl s az M mveletbl (a ciklusmagbl) kpzett kezdfeltteles ismtlses vezrls a kvetkez vezrlsi elrst jelenti 1.) rtkeljk ki az F felttelt s folytassuk a 2.) lpssel. 2.) Ha F rtke hamis, akkor az ismtls s ezzel egytt az sszetett mvelet vgrehajtsa befejezdtt. 3.) Egybknt, vagyis ha az F rtke igaz, akkor hajtsuk vgre az M mveletet, majd folytassuk az 1.) lpssel.

Programozs Alapjai (2007) 282 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Kezdfeltteles ismtlses vezrls A kezdfeltteles ismtlses vezrls szerkezeti brja F M Programozs Alapjai (2007) 283 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Kezdfeltteles ismtlses vezrls

Az algoritmus tervezsekor a ciklusmag olyan rszproblma megoldsa is lehet, aminek a megoldst a tervezs adott stdiumban mg nem ismerjk. Ekkor a ciklusmag helyre a rszproblma megnevezst rjuk, majd ehhez kapcsoljuk a tervezs sorn a ciklusmagot megfogalmaz szerkezeti brarszt. Programozs Alapjai (2007) 284 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Kezdfeltteles ismtlses vezrls Ha az F rtke hamis, az sszetett mvelet vgrehajtsa befejezdik anlkl, hogy az M mvelet egyszer is vgrehajtsra kerlne Ha az F rtke igaz, s az M mvelet nincs hatssal az F felttelre, akkor F igaz is marad, teht az sszetett mvelet vgrehajtsa nem tud befejezdni. Ilyenkor vgtelen ciklus

vgrehajtst rtuk el. Fontos teht, hogy az M mvelet hatssal legyen az F felttelre. Programozs Alapjai (2007) 285 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Minimax program Problmafelvets Hatrozzuk meg egy vals szmsorozat legkisebb s legnagyobb elemt, valamint a sorozat tlagt! Specifikci A problma inputja a vals szmsorozat. Az input szmsorozat vgt egy vgjel fogja jelezni, amit a felhasznl ad meg inputknt, nyilvn a szmsorozat eltt. Az output a sorozat legkisebb s legnagyobb eleme, valamint az tlaga.

Programozs Alapjai (2007) 286 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Minimax program Algoritmustervezs Elsre taln az tnne a legegyszerbb megoldsnak, ha beolvasnnk az sszes szmot, majd ezek kztt keresglnnk. Ez a megolds egy sszetett adatszerkezetet (tmbt) ignyelne. Ha viszont vgiggondoljuk, a kvetkez elem beolvassakor elegend az eddigi sorozatbl csak a lnyeges informcikat trolni: a legkisebb elem rtkt, a legnagyobb elem rtkt,

az elemek sszegt, s az elemek darabszmt. Programozs Alapjai (2007) 287 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Minimax program Algoritmustervezs Inicializls Minimax Szm!=Vgjel Szm feldolgozsa sszeg=sszeg+Szm Db=Db+1 Kirats Be(Szm)

SzmMax i n Max=Szm Programozs Alapjai (2007) 288 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Minimax program Algoritmustervezs Inicializls

Be(Vgjel) Be(Szm) Min=Szm Max=Szm sszeg=0 Db=0 Kirats Db==0 i Ki(res sorozat) n Ki(Min,Max,tlag) Programozs Alapjai (2007) 289 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

A while utasts Ha valamilyen mveletet mindaddig vgre kell hajtani, amg egy felttel igaz. Ha a felttel kezdetben hamis volt, a mveletet egyszer sem hajtjuk vgre. (A felttel ellenrzse a mvelet eltt trtnik.) Szintaxis while ( Logikai kifejezs Programozs Alapjai (2007) ) Utasts 290 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

A kezdfeltteles ismtlses vez. megvalstsa A kezdfeltteles ismtlses vezrls szerkezeti brja s C megvalstsa while ( F ) { M; } F M Az M utasts tetszleges, sszetett utasts lehet. Programozs Alapjai (2007) 291 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A C rtkad mveletei Mieltt elhamarkodottan lekdolnnk a

szerkezeti brn tallhat programot, megismerkednk a C nyelv azon mveleteivel, amelyek hasznlata tmrr teszi a programok kdjt. Programozs Alapjai (2007) 292 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Inkrementl s dekrementl mv. A C nyelv tartalmaz kt opertort, amelyekkel vltozk inkrementlhatk s dekrementlhatk. A ++ inkrementl opertor az operandushoz 1-et ad hozz A -- dekrementl opertor az operandusbl 1-et von le A ++ s a -- egyarnt hasznlhat prefix opertorknt (++i, --i )

postfix opertorknt (i++, i--) Programozs Alapjai (2007) 293 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Inkrementl s dekrementl mv. Az i vltoz a prefix s postfix hasznlat esetn is pontosan eggyel n (cskken) A klnbsg a ktfle hasznlat kztt az, hogy prefix mvelet esetn a ++i (--i) kifejezs rtke az i vltoz j, azaz eggyel megnvelt (cskkentett) rtke postfix esetben az i++ (i--) kifejezs rtke az i eredeti rtke Teht ha nem csak a mvelet inkrementl (dekrementl) tulajdonsgt, hanem a kifejezs rtkt is felhasznljuk, akkor a pres postfix hasznlat kztt klnbsg van. Programozs Alapjai (2007)

294 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Inkrementl s dekrementl mv. Pldul, ha i rtke 5, akkor x = i++; az x-et 5-re lltja, de x = ++i; x-et 6-ra lltja. i rtke mindkt esetben 6 lesz. Ezek az opertorok csak vltozkra (l-value) alkalmazhatk; az olyan kifejezs, mint (i + j)++ nem megengedett! Programozs Alapjai (2007) 295

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk rtkad mveletek s kifejezsek Az olyan kifejezsek, mint pldul i = i + 2 a += rtkad opertor segtsgvel az i += 2 tmrtett alakban is rhatk. A C-ben a legtbb opertornak megvan az op= alak megfelelje, ahol az op egy mveleti szimblum. Az eddig megismertek kzl op lehet: + - * / % Programozs Alapjai (2007) 296

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk rtkad mveletek s kifejezsek Ha e1 s e2 kifejezs, akkor e1 op= e2 jelentse e1 = (e1) op (e2) gyeljnk az e2 krli zrjelekre: x *= y + 1 jelentse x = x * (y + 1) nem pedig x = (x * y) + 1 Programozs Alapjai (2007) 297 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk rtkad mveletek s kifejezsek Illesszk be a prioritsi sorba a ++ s -- valamint az rtkad mveleteket! a egyoperandus mveletek (prefix -, ++, --, ! ) a multiplikatv mveletek ( *, /, % ) az additv mveletek ( +, - ) a kisebb-nagyobb relcis mveletek ( <=, >=, <, > ) az egyenl-nem egyenl relcis mveletek ( ==, != ) a logikai 's' mvelet ( && ) a logikai 'vagy' mvelet ( || ) a feltteles mvelet ( ? : )

rtkad mvelet ( =, +=, -=, *=, /=, %= ) Programozs Alapjai (2007) 298 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk rtkad mveletek s kifejezsek Az rtkad mveletek termszetesen mind jobb-asszociatvak. vatosan s csak a cljnak megfelelen szabad hasznlni ezeket a mveleteket. Nzznk nhny pldt! Programozs Alapjai (2007) 299 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk rtkad mveletek s kifejezsek Mi lesz a kirt rtk? int i = 7; printf("%d\n", i-- * i++); Nlunk ez 49, de lehetne 42 vagy 56 is. Az ANSI szabvny szerint az aritmetikai rszkifejezsek kirtkelsnek sorrendje tetszleges. Teht i rtkt csak akkor inkrementljuk, ha i sehol mshol nem szerepel az egsz kifejezsben. Programozs Alapjai (2007) 300 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Minimax program /* Hatrozzuk meg egy vals szmsorozat legkisebb

* s legnagyobb elemt, valamint a sorozat tlagt! * 1997. Oktber 25. Dvnyi Kroly, [email protected] */ #include main() { double Vegjel, Szam, Osszeg, Min, Max, Atlag; int Db; /* az sszegzett elemek szma */ printf("Ez a program vals szmsorozat minimlis,\n"); printf("maximlis elemt s tlagt szmolja.\n"); printf("Az input sorozatot vgjel zrja.\n"); printf("Krem a vgjelet!\n"); /* inicializls */ scanf("%lf", &Vegjel); >>> Programozs Alapjai (2007) 301 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Minimax program printf("Krem az input szmsorozatot!\n"); printf("? "); scanf("%lf", &Szam); Min = Max = Szam; Osszeg = 0.0; Db = 0; while (Szam != Vegjel) { /* a ciklus kezdete Osszeg += Szam; /* sszegzs Db++; /* szmll nvels if (Szam < Min) { /* min-max szmts Min = Szam; } else if (Szam > Max) { Max = Szam; } /* a kvetkez szm beolvassa printf("? "); scanf("%lf", &Szam); }

/* a ciklus vge */ */ */ */ */ */ >>> Programozs Alapjai (2007) 302 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Minimax program if (Db == 0) { printf("res szmsorozat rkezett.\n"); } else { Atlag = Osszeg / Db;

printf("Minimum = %10.3f Maximum= %10.3f\n", Min, Max); printf("Az tlag = %10.3f\n", Atlag); } } Programozs Alapjai (2007) 303 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Vgfeltteles ismtlses vezrls Az F ismtlsi felttelbl s M mveletbl (ciklusmagbl) kpzett vgfeltteles ismtlses vezrls a kvetkez vezrlsi elrst jelenti 1.) Hajtsuk vgre az M mveletet majd folytassuk a 2.) lpssel. 2.) rtkeljk ki az F felttelt s folytassuk a 3.) lpssel. 3.) Ha F rtke igaz, akkor az ismtlses vezrls s ezzel egytt az sszetett mvelet vgrehajtsa befejezdtt. 4.) Egybknt, vagyis ha az F rtke hamis, akkor folytassuk az 1.) lpssel.

Programozs Alapjai (2007) 304 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Vgfeltteles ismtlses vezrls A vgfeltteles ismtlses vezrls szerkezeti brja F M Programozs Alapjai (2007) 305 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Vgfeltteles ismtlses vezrls

Lthat, hogy a vgfeltteles ismtlses vezrls alapveten abban klnbzik a kezdfeltteles ismtlses vezrlstl, hogy a ciklusmag legalbb egyszer vgrehajtdik. Programozs Alapjai (2007) 306 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Vgfeltteles ismtlses vezrls Ha az M mvelet nincs hatssal az F felttelre, akkor Ha az F rtke igaz, igaz is marad, gy az M mvelet egyszer kerlt vgrehajtsra s az sszetett mvelet vgrehajtsa befejezdik Ha az F rtke hamis, hamis is marad, teht az sszetett mvelet vgrehajtsa nem tud befejezdni. Ilyenkor vgtelen ciklus vgrehajtst rtuk el Fontos teht, hogy az M mvelet hatssal

legyen az F felttelre. Programozs Alapjai (2007) 307 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Ismtlses vezrlsek kapcsolata A kezd s vgfeltteles ismtlses vezrlsek kifejezhetek egyms segtsgvel. F F M M F i

M !F !F M M Programozs Alapjai (2007) n 308 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Ismtlses vezrlsek kapcsolata Az algoritmus tervezsekor elfordulhat, hogy mind a kezdfeltteles ismtlses vezrls, mind a vgfeltteles ismtlses vezrls

alkalmasnak ltszik a problma megoldsra. Ilyenkor rdemes megvizsglni, hogy az F felttel szksges felttele-e az M mvelet vgrehajtsnak? Ha igen, akkor a kezdfeltteles ismtlses vezrlst kell vlasztani. Programozs Alapjai (2007) 309 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szinusz Problmafelvets Szinusz(x) kzelt rtknek kiszmtsa Specifikci Input X vals szm Outputja

sin(X) Nem hvhatjuk meg a C standard sin(x) fggvnyt Programozs Alapjai (2007) 310 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szinusz Algoritmustervezs Ismeretes, hogy sin(x) rtke az x - x3/3! + x5/5! - ... +(-1)(i-1)*x(2i-1)/(2i-1)! +... vgtelen sor sszege. Ezen vgtelen sor kezdszeletnek sszegvel kzeltjk sin(x) rtkt, gy, hogy az sszegzs befejezdik, ha az utols tag abszolt rtke kisebb, mint a konstansknt megadott epsz pontossg. Programozs Alapjai (2007)

311 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szinusz Algoritmustervezs Nyilvnval, hogy nem clszer a szmolst gy szervezni, hogy i minden rtkre kln kiszmoljuk a tagot, hiszen az i. tag kiszmolhat az (i-1)-ik tagbl. A tag szmlljnak s nevezjnek kln szmolsa egybknt is pontatlann tenn a szmtst, mert mindkett, klnsen a nevez rohamosan nvekedik i fggvnyben. Programozs Alapjai (2007) 312 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Szinusz Struktradiagram Szinusz Inicializls Abs(Tag)

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szinusz A float tpus tulajdonsgai miatt nem rdemes abszolt rtkben nagy X rtkekkel szmolni. Kihasznljuk, hogy a sin(x) fggvny periodikus. Inicializls Be(X) X transzf. Xorig=X Osszeg=0.0 j=2 X<-Pi Pi

X-=2.0*Pi Programozs Alapjai (2007) Tag=X XX=X*X 314 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A do while utasts Ha valamilyen mveletet mindaddig vgre kell hajtani, amg egy felttel igaz. A mveletet legalbb egyszer vgrehajtjuk akkor is, ha a felttel kezdetben hamis volt. (A felttel ellenrzse a mvelet utn trtnik.) Szintaxis do

Utasts while ( Programozs Alapjai (2007) Logikai kifejezs ) 315 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A vgfeltteles ismtlses vezrls megvalstsa A vgfeltteles ismtlses vezrls szerkezeti brja s C megvalstsa do { M;

} while ( !F ) F M Az M utasts tetszleges, sszetett utasts lehet. Programozs Alapjai (2007) 316 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szinusz /* sin(x) kzelt rtknek kiszmtsa a beptett sin(x) * fggvny alkalmazsa nlkl. * X rtkt transzformljuk a (-Pi,Pi) intervallumba. * 1997. Oktber 25. Dvnyi Kroly, [email protected] */ #include #include #define EPSZ

main() { double double double double double int j; 1e-10 Osszeg; Tag; X; Xorig; XX; /* /* /* /* /* /* /* a kzelts pontossga */

a vgtelen sor kezdsszege */ a vgtelen sor aktulis tagja */ argumentum */ az argumentum rtknek megrzse*/ sqr(x) */ a nevez kiszmtshoz */ Programozs Alapjai (2007) >>> 317 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szinusz printf("Krem sin(x)-hez az argumentumot\n"); scanf("%lg%*[^\n]", &X); getchar(); /* ez most mr ReadLn */ Xorig = X;

while X } while X } (X < -M_PI) { += 2 * M_PI; /* transzformls */ (M_PI < X) { -= 2 * M_PI; Osszeg = 0.0; j = 2; /* inicializls */ Tag = X; XX = X * X; >>>

Programozs Alapjai (2007) 318 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szinusz do { /* ciklus kezdete */ Osszeg += Tag; Tag = -(Tag * XX / j / (j + 1)); /* kvetkez tag */ j += 2; } while (fabs(Tag) >= EPSZ); /* vgfelttel, ciklus vge */ printf("sin(%8.5f)= %13.10f\n", Xorig, Osszeg); } Programozs Alapjai (2007) 319

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eljrsvezrls Adott mvelet alkalmazsa adott argumentumokra, ami az argumentumok rtknek pontosan meghatrozott vltozst eredmnyezi Az eljrsvezrls fajti Eljrsmvelet Fggvnymvelet Programozs Alapjai (2007) 320 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eljrsmvelet Eljrsmveleten olyan tevkenysget rtnk,

amelynek alkalmazsa adott argumentumokra az argumentumok rtknek pontosan meghatrozott megvltozst eredmnyezi. Minden eljrsmveletnek rgztett szm argumentuma van, s minden argumentum rgztett adattpus. Az argumentumok lehetnek Bemen argumentumok Kimen argumentumok Be- s kimen argumentumok Programozs Alapjai (2007) 321 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Argumentumok kezelsi mdjai Bemen argumentum Ha a mvelet brmely vgrehajtsa nem vltoztatja meg az adott argumentum rtkt. Kimen argumentum

Ha a mvelet hatsa nem fgg az adott argumentumnak a vgrehajts eltti rtktl, azonban az adott argumentum rtke a mvelet hatsra megvltozhat. Be- s kimen argumentum Ha a mvelet hatsa fgg az adott argumentumnak a vgrehajts eltti rtktl, s az adott argumentum rtke a mvelet hatsra megvltozhat. Programozs Alapjai (2007) 322 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnymvelet A matematikai fggvny fogalmnak ltalnostsa. Ha egy rszproblma clja egy rtk kiszmtsa adott rtkek fggvnyben, akkor a megoldst megadhatjuk fggvnymvelettel.

A fggvnymvelet argumentumai ugyangy lehetnek kimen s be- s kimen mdak is, mint az eljrsmveletek esetn, teht a fggvnymvelet vgrehajtsa az aktulis argumentumok megvltozst is eredmnyezheti. Programozs Alapjai (2007) 323 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eljrs s fggvny specifikcija Eljrsmvelet specifikcija tartalmazza: A mvelet elnevezst A formlis argumentumok felsorolst Mindegyik argumentum adattpust s kezelsi mdjt A mvelet hatsnak lerst A fggvnymvelet specifikcija a fentieken tl tartalmazza mg:

A fggvnymvelet eredmnytpust Programozs Alapjai (2007) 324 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eljrsmvelet ltalnos jellse Eljrsmveletek (ltalnos) jellse: P(m1 X1:T1; ... ;mn Xn:Tn) ahol P az eljrsmvelet neve Xi az i-edik formlis argumentum azonostja mi az i-edik formlis argumentum kezelsi mdja -> bemen md <- kimen md <-> be- s kimen md. Ti az i-edik formlis argumentum adattpusa

Programozs Alapjai (2007) 325 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eljrsmvelet ltalnos jellse Az eljrsmveletnek adott A1, ... ,An aktulis argumentumokra trtn vgrehajtst eljrsutastsnak (eljrshvsnak) nevezzk Jellse P(A1, ... ,An) Ha az i-edik argumentum mdja kimen vagy be- s kimen, akkor az Ai aktulis argumentum csak vltoz lehet. Programozs Alapjai (2007) 326 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eljrsmvelet Algoritmustervezs sorn nem csak elemi (eleve definilt) eljrsmveleteket hasznlhatunk. Rszproblmk megoldst is kifejezhetjk olyan eljrsmveletekkel, melyek megvalstst rszprogrammal adjuk meg. A rszprogramot klnll szerkezeti brval rjuk le, amelynek feje P(m1 X1:T1; ... ;mn Xn:Tn) Programozs Alapjai (2007) 327 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnymvelet ltalnos jellse

Fggvnymveletek (ltalnos) jellse F(m1 X1:T1; ... ;mn Xn:Tn):T ahol F az fggvnymvelet neve Xi az i-edik formlis argumentum azonostja mi az i-edik formlis argumentum kezelsi mdja Ti az i-edik formlis argumentum adattpusa T a fggvnymvelet eredmnytpusa Programozs Alapjai (2007) 328 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnymvelet A fent jellt fggvnymveletnek adott A1, ... ,An aktulis argumentumokra trtn vgrehajtst fggvnyhvsnak nevezzk Jellse F(A1, ... ,An)

Rszproblmk megoldst fggvnymvelettel is kifejezhetjk, ekkor a szerkezeti bra feje F(m1 X1:T1; ... ;mn Xn:Tn):T Programozs Alapjai (2007) 329 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eljrsvezrls megvalstsa Vannak olyan programozsi nyelvek, ahol a fggvny s eljrsmveletek meg vannak klnbztetve, valamint a paramterek mdjaira sincs megkts. Mivel azonban e kurzus keretben csak a C nyelvrl lesz sz, a szerkezeti brn a tovbbiakban (is) igazodni fogunk a C nyelvhez.

Programozs Alapjai (2007) 330 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eljrsvezrls megvalstsa A C nyelvben lnyegben csak fggvnymvelet van. C nyelvben a fggvnymvelet argumentumai bemen mdak, teht alapveten a fggvnymvelet vgrehajtsa az aktulis argumentumok megvltozst nem eredmnyezheti. Programozs Alapjai (2007) 331 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Fggvnymvelet A fggvnymvelet jellsre a tovbbiakban a T F(T1 X1, ... ,Tn Xn) formt hasznljuk, ahol T a fggvnymvelet eredmnytpusa F a fggvnymvelet neve Ti az i-edik formlis argumentum adattpusa Xi az i-edik formlis argumentum azonostja A zrjeleket res paramterlista esetn is ki kell tenni. Programozs Alapjai (2007) 332 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnymvelet A C jellsmdhoz igazodva, a fggvnymvelet szerkezeti brjnak a feje gy nz ki: T F(T1 X1, ... ,Tn Xn) Tovbb a szerkezeti brban lennie kell (legalbb) egy olyan return utastsnak, amely visszaadja a fggvny ltal kiszmtott rtket. Programozs Alapjai (2007) 333 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnymvelet A fent jellt fggvnymveletnek adott

A1, ... ,An aktulis argumentumokra trtn vgrehajtst fggvnyhvsnak nevezzk s az F(A1, ... ,An) jellst hasznljuk. A fggvnyhvs kifejezs. A zrjeleket paramter nlkli fggvny hvsa esetn is ki kell tenni. Programozs Alapjai (2007) 334 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnyek szintaxisa C-ben Fggvny deklarci Fggvny fejlc ;

Fggvny definci (egyben deklarci is) Fggvny fejlc { Utastsok } Fggvny fejlc Tpus Azonost ( Azonost Tpus ) , Programozs Alapjai (2007)

335 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnyek szintaxisa C-ben A return utasts return Kifejezs ; Minden fggvnyben szerepelnie kell legalbb egy return utastsnak, amely kiszmtja a megadott kifejezs rtkt, majd visszatr a fggvnybl. A hvs helyn a fggvny a return ltal kiszmtott rtket veszi fel. Programozs Alapjai (2007)

336 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnyhvs szintaxisa C-ben Fggvnyhvs Azonost ( Kifejezs ) , Termszetesen egy fggvnynek a hvskor pontosan annyi s olyan tpus paramtert kell tadni, amennyi s amilyen paramterekkel deklarlva lett. Programozs Alapjai (2007)

337 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvny megvalstsa Ha a fggvny szerkezeti brja ez: T F(T1 X1, ... ,Tn Xn) M Akkor a fggvnydefinci C-ben: T F(T1 X1, ..., Tn Xn) { M; } Programozs Alapjai (2007) 338 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Fggvnymvelet Pldul float atlag(float a, float b) { return (a + b)/2; } Rgen C-ben a gy kellett fggvnyt deklarlni: float atlag(a,b) float a, float b; { return (a + b)/2; } Programozs Alapjai (2007) 339 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Eljrsmvelet Ha eljrst szeretnnk kszteni, akkor a fggvnymvelet eredmnytpusa void s ebben az esetben nem ktelez a return utasts, illetve ha mgis van ilyen, akkor nem adhat meg utna kifejezs. Programozs Alapjai (2007) 340 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Vegyes s kimen md arg. Mint emltettk, C-ben csak bemen md argumentumok vannak. De mi magunk kezelhetjk a be- s kimen illetve kimen md argumentumokat pointerek segtsgvel. Az albbiakban egy, az alaptpusokra mkd megoldst mutatunk.

Programozs Alapjai (2007) 341 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Vegyes s kimen md arg. Ha az i. paramtert kimen mdnak szeretnnk, akkor a fggvny deklarcijban Ti Xi helyett Ti *Xi deklarcit, a fggvnytrzsben pedig Xi helyett mindenhol (*Xi) vltozhivatkozst hasznlunk. Programozs Alapjai (2007)

342 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Vegyes s kimen md arg. Tovbb a fggvny meghvsakor az Ai paramter helyett az &Ai paramtert rjuk. Rszletesebb magyarzatot s sszetettebb tpusokra mkd megvalstst a pointerek megismerse utn adunk. Programozs Alapjai (2007) 343 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Kamatos-kamat szmts Problmafelvets Szmtsunk kamatos kamatot Specifikci Input Osszeg Kamatlb Ev vals, a betett sszeg egsz, az ves alapkamat egsz, az eltelt vek szma Output Ujosszeg a kamatos-kamattal nvelt rtk Programozs Alapjai (2007) 344

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Kamatos-kamat szmts Algoritmustervezs A kamatos-kamat szmtshoz ksztnk egy ltalnos hatvnyoz fggvnyt s ezt hvjuk meg a kamatos-kamat szmts alapkpletvel. double hatvany(double X, int n) return hatv ? n==0 hatv= 1.0 X==0 hatv= 0.0 X>0 hatv= exp(n*ln(X))

Odd(n) hatv= -exp(n*ln(-X)) Programozs Alapjai (2007) hatv= exp(n*ln(-X)) 345 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bitenknti logikai mveletek A C nyelvben tbb bitmanipulcis opertor van, ezek a float s double tpus vltozkra nem alkalmazhatk.

& | ^ << >> ~ bitenknti S, bitenknti megenged (inkluzv) VAGY, bitenknti kizr (exkluzv) VAGY, bitlptets (shift) balra, bitlptets (shift) jobbra, egyes komplemens (egyoperandus). Programozs Alapjai (2007) 346 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Bitenknti logikai mveletek A bitenknti S opertort gyakran hasznljuk valamely bithalmaz maszkolsra. Pldul a pratlan(x) fggvnyt az ((x & 1) == 1) valstja meg. A mveletekrl ksbb rszletesen is lesz sz. Programozs Alapjai (2007) 347 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bitenknti logikai mveletek Illesszk be prioritsi sorba a mveleteket!

a egyoperandus mveletek ( -, ++, --, !, ~ ) a multiplikatv mveletek ( *, /, % ) az additv mveletek ( +, - ) bitlptets ( <<, >> ) a kisebb-nagyobb relcis mveletek ( <=, >=, <, > ) az egyenl-nem egyenl relcis mveletek ( ==, != ) bitenknti 's' mvelet ( & ) bitenknti 'kizr vagy' mvelet ( ^ ) bitenknti 'vagy' mvelet ( | ) a logikai 's' mvelet ( && ) a logikai 'vagy' mvelet ( || ) a feltteles mvelet ( ? : ) rtkad mvelet ( =, +=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |= ) Programozs Alapjai (2007) 348

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Kamatos-kamat szmts /* Kamatos-kamat szmts a hatvnyozs fggvny segtsgvel. * 1997. Oktber 31. Dvnyi Kroly, [email protected] */ #include #include >>> Programozs Alapjai (2007) 349 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Kamatos-kamat szmts

double hatvany(double x, int n) { /* x n-edik hatvnyt kiszmt fggvny */ double hatv; if (n == 0) { hatv = 1.0; } else if (x == 0.0) { hatv = 0.0; } else if (x > 0.0) { hatv = exp(n * log(x)); } else if (n & 1) { hatv = (-exp(n * log(-x))); } else { hatv = exp(n * log(-x)); } return(hatv); } Programozs Alapjai (2007) >>> 350 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Kamatos-kamat szmts main() { double Osszeg, Ujosszeg; int Kamatlab, Ev; printf(" A kamatoz sszeg ? "); scanf("%lg%*[^\n]", &Osszeg); getchar(); printf(" A kamatlb ? "); scanf("%d%*[^\n]", &Kamatlab); getchar(); printf(" A kamatozsi vek szma ? "); scanf("%d%*[^\n]", &Ev); getchar(); Ujosszeg = Osszeg * hatvany(1.0 + Kamatlab / 100.0, Ev); printf("A kamatos kamattal nvelt sszeg:"); printf("%10.2f\n", Ujosszeg); } Programozs Alapjai (2007) 351 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Eljrsvezrls Adott mvelet alkalmazsa adott argumentumokra, ami az argumentumok rtknek pontosan meghatrozott vltozst eredmnyezi Az eljrsvezrls fajti Eljrsmvelet Fggvnymvelet Programozs Alapjai (2007) 352 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eljrsmvelet Eljrsmveleten olyan tevkenysget rtnk, amelynek alkalmazsa adott argumentumokra az argumentumok rtknek pontosan meghatrozott megvltozst eredmnyezi.

Minden eljrsmveletnek rgztett szm argumentuma van, s minden argumentum rgztett adattpus. Az argumentumok lehetnek Bemen argumentumok Kimen argumentumok Be- s kimen argumentumok Programozs Alapjai (2007) 353 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Argumentumok kezelsi mdjai Bemen argumentum Ha a mvelet brmely vgrehajtsa nem vltoztatja meg az adott argumentum rtkt. Kimen argumentum Ha a mvelet hatsa nem fgg az adott argumentumnak a vgrehajts eltti rtktl, azonban az adott argumentum rtke a mvelet

hatsra megvltozhat. Be- s kimen argumentum Ha a mvelet hatsa fgg az adott argumentumnak a vgrehajts eltti rtktl, s az adott argumentum rtke a mvelet hatsra megvltozhat. Programozs Alapjai (2007) 354 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnymvelet A matematikai fggvny fogalmnak ltalnostsa. Ha egy rszproblma clja egy rtk kiszmtsa adott rtkek fggvnyben, akkor a megoldst megadhatjuk fggvnymvelettel. A fggvnymvelet argumentumai ugyangy lehetnek kimen s be- s kimen mdak is, mint az eljrsmveletek esetn, teht a

fggvnymvelet vgrehajtsa az aktulis argumentumok megvltozst is eredmnyezheti. Programozs Alapjai (2007) 355 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eljrs s fggvny specifikcija Eljrsmvelet specifikcija tartalmazza: A mvelet elnevezst A formlis argumentumok felsorolst Mindegyik argumentum adattpust s kezelsi mdjt A mvelet hatsnak lerst A fggvnymvelet specifikcija a fentieken tl tartalmazza mg: A fggvnymvelet eredmnytpust Programozs Alapjai (2007)

356 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eljrsmvelet ltalnos jellse Eljrsmveletek (ltalnos) jellse: P(m1 X1:T1; ... ;mn Xn:Tn) ahol P az eljrsmvelet neve Xi az i-edik formlis argumentum azonostja mi az i-edik formlis argumentum kezelsi mdja -> bemen md <- kimen md <-> be- s kimen md. Ti az i-edik formlis argumentum adattpusa Programozs Alapjai (2007) 357

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eljrsmvelet ltalnos jellse Az eljrsmveletnek adott A1, ... ,An aktulis argumentumokra trtn vgrehajtst eljrsutastsnak (eljrshvsnak) nevezzk Jellse P(A1, ... ,An) Ha az i-edik argumentum mdja kimen vagy be- s kimen, akkor az Ai aktulis argumentum csak vltoz lehet. Programozs Alapjai (2007) 358 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Eljrsmvelet Algoritmustervezs sorn nem csak elemi (eleve definilt) eljrsmveleteket hasznlhatunk. Rszproblmk megoldst is kifejezhetjk olyan eljrsmveletekkel, melyek megvalstst rszprogrammal adjuk meg. A rszprogramot klnll szerkezeti brval rjuk le, amelynek feje P(m1 X1:T1; ... ;mn Xn:Tn) Programozs Alapjai (2007) 359 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnymvelet ltalnos jellse Fggvnymveletek (ltalnos) jellse F(m1 X1:T1; ... ;mn Xn:Tn):T

ahol F az fggvnymvelet neve Xi az i-edik formlis argumentum azonostja mi az i-edik formlis argumentum kezelsi mdja Ti az i-edik formlis argumentum adattpusa T a fggvnymvelet eredmnytpusa Programozs Alapjai (2007) 360 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnymvelet A fent jellt fggvnymveletnek adott A1, ... ,An aktulis argumentumokra trtn vgrehajtst fggvnyhvsnak nevezzk Jellse F(A1, ... ,An) Rszproblmk megoldst fggvnymvelettel is kifejezhetjk, ekkor a szerkezeti bra feje

F(m1 X1:T1; ... ;mn Xn:Tn):T Programozs Alapjai (2007) 361 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eljrsvezrls megvalstsa Vannak olyan programozsi nyelvek, ahol a fggvny s eljrsmveletek meg vannak klnbztetve, valamint a paramterek mdjaira sincs megkts. Mivel azonban e kurzus keretben csak a C nyelvrl lesz sz, a szerkezeti brn a tovbbiakban (is) igazodni fogunk a C nyelvhez. Programozs Alapjai (2007) 362

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eljrsvezrls megvalstsa A C nyelvben lnyegben csak fggvnymvelet van. C nyelvben a fggvnymvelet argumentumai bemen mdak, teht alapveten a fggvnymvelet vgrehajtsa az aktulis argumentumok megvltozst nem eredmnyezheti. Programozs Alapjai (2007) 363 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnymvelet

A fggvnymvelet jellsre a tovbbiakban a T F(T1 X1, ... ,Tn Xn) formt hasznljuk, ahol T a fggvnymvelet eredmnytpusa F a fggvnymvelet neve Ti az i-edik formlis argumentum adattpusa Xi az i-edik formlis argumentum azonostja A zrjeleket res paramterlista esetn is ki kell tenni. Programozs Alapjai (2007) 364 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Fggvnymvelet A C jellsmdhoz igazodva, a fggvnymvelet szerkezeti brjnak a feje gy nz ki: T F(T1 X1, ... ,Tn Xn) Tovbb a szerkezeti brban lennie kell (legalbb) egy olyan return utastsnak, amely visszaadja a fggvny ltal kiszmtott rtket. Programozs Alapjai (2007) 365 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnymvelet A fent jellt fggvnymveletnek adott A1, ... ,An aktulis argumentumokra trtn vgrehajtst fggvnyhvsnak nevezzk s az

F(A1, ... ,An) jellst hasznljuk. A fggvnyhvs kifejezs. A zrjeleket paramter nlkli fggvny hvsa esetn is ki kell tenni. Programozs Alapjai (2007) 366 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnyek szintaxisa C-ben Fggvny deklarci Fggvny fejlc ; Fggvny definci (egyben deklarci is) Fggvny fejlc

{ Utastsok } Fggvny fejlc Tpus Azonost ( Azonost Tpus ) , Programozs Alapjai (2007) 367

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnyek szintaxisa C-ben A return utasts return Kifejezs ; Minden fggvnyben szerepelnie kell legalbb egy return utastsnak, amely kiszmtja a megadott kifejezs rtkt, majd visszatr a fggvnybl. A hvs helyn a fggvny a return ltal kiszmtott rtket veszi fel. Programozs Alapjai (2007) 368 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnyhvs szintaxisa C-ben Fggvnyhvs Azonost ( Kifejezs ) , Termszetesen egy fggvnynek a hvskor pontosan annyi s olyan tpus paramtert kell tadni, amennyi s amilyen paramterekkel deklarlva lett. Programozs Alapjai (2007) 369

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvny megvalstsa Ha a fggvny szerkezeti brja ez: T F(T1 X1, ... ,Tn Xn) M Akkor a fggvnydefinci C-ben: T F(T1 X1, ..., Tn Xn) { M; } Programozs Alapjai (2007) 370 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnymvelet

Pldul float atlag(float a, float b) { return (a + b)/2; } Rgen C-ben a gy kellett fggvnyt deklarlni: float atlag(a,b) float a, float b; { return (a + b)/2; } Programozs Alapjai (2007) 371 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Eljrsmvelet Ha eljrst szeretnnk kszteni, akkor a fggvnymvelet eredmnytpusa void s

ebben az esetben nem ktelez a return utasts, illetve ha mgis van ilyen, akkor nem adhat meg utna kifejezs. Programozs Alapjai (2007) 372 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Vegyes s kimen md arg. Mint emltettk, C-ben csak bemen md argumentumok vannak. De mi magunk kezelhetjk a be- s kimen illetve kimen md argumentumokat pointerek segtsgvel. Az albbiakban egy, az alaptpusokra mkd megoldst mutatunk. Programozs Alapjai (2007) 373

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Vegyes s kimen md arg. Ha az i. paramtert kimen mdnak szeretnnk, akkor a fggvny deklarcijban Ti Xi helyett Ti *Xi deklarcit, a fggvnytrzsben pedig Xi helyett mindenhol (*Xi) vltozhivatkozst hasznlunk. Programozs Alapjai (2007) 374

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Vegyes s kimen md arg. Tovbb a fggvny meghvsakor az Ai paramter helyett az &Ai paramtert rjuk. Rszletesebb magyarzatot s sszetettebb tpusokra mkd megvalstst a pointerek megismerse utn adunk. Programozs Alapjai (2007) 375 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Kamatos-kamat szmts Problmafelvets Szmtsunk kamatos kamatot Specifikci Input Osszeg Kamatlb Ev vals, a betett sszeg egsz, az ves alapkamat egsz, az eltelt vek szma Output Ujosszeg a kamatos-kamattal nvelt rtk Programozs Alapjai (2007) 376 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Kamatos-kamat szmts Algoritmustervezs A kamatos-kamat szmtshoz ksztnk egy ltalnos hatvnyoz fggvnyt s ezt hvjuk meg a kamatos-kamat szmts alapkpletvel. double hatvany(double X, int n) return hatv ? n==0 hatv= 1.0 X==0 hatv= 0.0 X>0 hatv= exp(n*ln(X)) Odd(n) hatv=

-exp(n*ln(-X)) Programozs Alapjai (2007) hatv= exp(n*ln(-X)) 377 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bitenknti logikai mveletek A C nyelvben tbb bitmanipulcis opertor van, ezek a float s double tpus vltozkra nem alkalmazhatk. &

| ^ << >> ~ bitenknti S, bitenknti megenged (inkluzv) VAGY, bitenknti kizr (exkluzv) VAGY, bitlptets (shift) balra, bitlptets (shift) jobbra, egyes komplemens (egyoperandus). Programozs Alapjai (2007) 378 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bitenknti logikai mveletek A bitenknti S opertort gyakran hasznljuk valamely bithalmaz maszkolsra. Pldul a

pratlan(x) fggvnyt az ((x & 1) == 1) valstja meg. A mveletekrl ksbb rszletesen is lesz sz. Programozs Alapjai (2007) 379 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bitenknti logikai mveletek Illesszk be prioritsi sorba a mveleteket!

a egyoperandus mveletek ( -, ++, --, !, ~ ) a multiplikatv mveletek ( *, /, % ) az additv mveletek ( +, - ) bitlptets ( <<, >> ) a kisebb-nagyobb relcis mveletek ( <=, >=, <, > ) az egyenl-nem egyenl relcis mveletek ( ==, != ) bitenknti 's' mvelet ( & ) bitenknti 'kizr vagy' mvelet ( ^ ) bitenknti 'vagy' mvelet ( | ) a logikai 's' mvelet ( && ) a logikai 'vagy' mvelet ( || ) a feltteles mvelet ( ? : ) rtkad mvelet ( =, +=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |= ) Programozs Alapjai (2007) 380 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Kamatos-kamat szmts /* Kamatos-kamat szmts a hatvnyozs fggvny segtsgvel. * 1997. Oktber 31. Dvnyi Kroly, [email protected] */ #include #include >>> Programozs Alapjai (2007) 381 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Kamatos-kamat szmts double hatvany(double x, int n) { /* x n-edik hatvnyt kiszmt fggvny */ double hatv;

if (n == 0) { hatv = 1.0; } else if (x == 0.0) { hatv = 0.0; } else if (x > 0.0) { hatv = exp(n * log(x)); } else if (n & 1) { hatv = (-exp(n * log(-x))); } else { hatv = exp(n * log(-x)); } return(hatv); } Programozs Alapjai (2007) >>> 382 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Kamatos-kamat szmts

main() { double Osszeg, Ujosszeg; int Kamatlab, Ev; printf(" A kamatoz sszeg ? "); scanf("%lg%*[^\n]", &Osszeg); getchar(); printf(" A kamatlb ? "); scanf("%d%*[^\n]", &Kamatlab); getchar(); printf(" A kamatozsi vek szma ? "); scanf("%d%*[^\n]", &Ev); getchar(); Ujosszeg = Osszeg * hatvany(1.0 + Kamatlab / 100.0, Ev); printf("A kamatos kamattal nvelt sszeg:"); printf("%10.2f\n", Ujosszeg); } Programozs Alapjai (2007) 383 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Blokkstruktra a C nyelvben

A C nyelvben blokkon {} zrjelprba zrt blokkot rtnk. Egy C program blokkjai mellrendeltsgi s alrendeltsgi viszonyban vannak. Ezt a viszonyt az ide vonatkoz szablyokkal egytt blokkstruktrnak nevezzk. Programozs Alapjai (2007) 384 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Blokkstruktra a C nyelvben 1. Sorrendisgi szably A program egy adott helyn csak olyan azonostra hivatkozhatunk, amely a hivatkozs helyt megelzen deklarlva lett. Vltoz azonost, fggvny azonost s tpus azonost megjelense helyn deklarltnak minsl. 2. Egyedisgi szably

Egy adott blokkban deklarlt minden azonost csak egyszer deklarlhat, nem szmtva az alrendelt blokkokat. Programozs Alapjai (2007) 385 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Blokkstruktra a C nyelvben main() { int b, b; a = 0; printf("? "); scanf("%d", &b); b = f(b); printf("%d (%d)\n", b, a); } int a; int f(int n) { a++; return (n>1) ? f(n-1) + f(n-2) : 1;

} Programozs Alapjai (2007) Itt egyszerre kt vltozt deklarlunk, s mindkettnek a b nevet adjuk. Ha ezt megtehetnnk, hogy dnten el a fordt, hogy melyik esetben melyik vltozval kellene dolgoznia? Itt pedig hasznljuk az f s az a azonostkat, holott mg azt sem tudjuk, hogy melyik micsoda. Itt mr jogos az f s az a hasznlata is, mert ezeken a pontokon mr mindkett deklarlva van, mg ha f defincija mg nincs is teljesen befejezve. 386 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Blokkstruktra a C nyelvben

3. Lthatsgi szably Egy B1 blokkban deklarlt A azonost akkor s csak akkor lthat (hivatkozhat) egy B2 blokkban, ha teljesl az albbi kt felttel: a.) B1 megegyezik B2-vel, vagy B2 alrendeltje B1-nek s az A azonost elbb van deklarlva, mint B2 b.) Az A azonost nincs deklarlva egyetlen olyan C blokkban sem, amely alrendeltje B1-nek s amelynek B2 alrendeltje (belertve azt, hogy B2 vagy megegyezik Cvel) Programozs Alapjai (2007) 387 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Blokkstruktra a C nyelvben { } /* 1. BLOKK

int a, b, c; { /* 2. BLOKK float c; a = 2; } c = 1; { /* 3. BLOKK float b; { /* 4. BLOKK b = 3.4; } } */ */ */ */ A fent deklarlt a vltoz hasznlhat ezen a ponton, hiszen: - a 2. blokk alrendeltje az 1. blokknak, - a elbb van deklarlva mint a 2. blokk,

- nincs olyan blokk a kett kztt, amelyben a deklarlva lenne. Ezen a ponton az 1. blokkban deklarlt c vltoz hasznlhat. A 2. blokkban deklarlt c ezen a ponton NEM hasznlhat, hiszen az 1. blokk nem alrendeltje a 2. blokknak. gy az itt lert c az 1. blokkban deklarlt c vltozt jelenti. Az 1. blokkban deklarlt b ezen a ponton NEM hasznlhat, mert a 4. blokk ugyan alrendeltje az 1. blokknak, s ksbb fordul el, mint b 1. blokkbeli deklarcija, de van kzben egy 3. blokk, amelynek a 4. blokk szintn alrendeltje, s amiben b szintn deklarlva van. A 3. blokkban deklarlt b viszont hasznlhat, gy azutn a 4. blokkban lert b a 3. blokk vltozjt jelenti. Programozs Alapjai (2007) 388 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Blokkstruktra a C nyelvben Azon blokkok sszessgt, amelybl egy A azonost lthat, az A azonost hatskrnek

nevezzk. Egy azonostt loklisnak neveznk egy blokkra nzve, ha az azonost az adott blokkban van deklarlva. Azt mondjuk, hogy egy A azonost globlis egy B blokkra nzve, ha nem B-ben van deklarlva, de lthat B-ben. Programozs Alapjai (2007) 389 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Blokkstruktra a C nyelvben A blokkstruktra alapjn lthat, hogy a C nyelvben vannak gynevezett loklis vltozk, st ltalban ezeket hasznljuk. Lthat azonban az is, hogy a programfjlban deklarlt programegysgek globlisak az sszes fggvnydeklarcira nzve, vagyis ezek minden blokkban lthatak a

deklarlsuktl kezdve az jradeklarlsukig. Ezeket csak nagyon indokolt esetben szoktuk hasznlni. Programozs Alapjai (2007) 390 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Blokkstruktra a C nyelvben Megjegyzsek gcc-hez: A gcc nha elviseli, ha egy fggvnyt hamarabb hasznlunk, mint ahogyan deklarlnnk (teht megsrtjk a sorrendisgi szablyt). A hvsbl ugyanis ki tudja derteni a paramterek szmt s tpust, a visszatrsi rtket viszont ilyen esetekben int-knt kezeli. Az ansi C nem engedi meg a deklarcik s utastsok keveredst, teht mr a blokk elejn deklarlni kell az sszes vltozt. A gcc ennl rugalmasabb, mr warningot is csak a pedantic kapcsolval ad ilyen esetekre.

Programozs Alapjai (2007) 391 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Trolsi osztlyok auto Az auto az automatikus memriafoglalsra utal. Ezt az alapszt nem szoktuk kirni. static A loklis vltoz rtke megmarad a blokk vgrehajtsa utn is s az jabb fggvnymvelet vgrehajtsakor a megrztt rtk felhasznlhat. extern A programegysget csak deklarljuk, de nem ebben a fjlban kerl definilsra. A szerkesztprogram feladata lesz a kls hivatkozs feloldsa. Programozs Alapjai (2007)

392 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Trolsi osztlyok /* A static vltozt mutatjuk be. * 1997. November 7. Dvnyi Kroly, [email protected] */ #include void stat(); main() { int i; /* ciklusvltoz */ for (i = 0; i < 5; i++) { stat(); } } Programozs Alapjai (2007)

>>> 393 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Trolsi osztlyok void stat() { int ideiglenes = 1; static int allando = 1; printf("ideiglenes = %d allando = %d\n", ideiglenes, allando); ideiglenes++; allando++; } Programozs Alapjai (2007) 394

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Trolsi osztlyok A pldaprogram ezt rja ki: ideiglenes ideiglenes ideiglenes ideiglenes ideiglenes = = = = = 1 1 1 1 1

allando allando allando allando allando = = = = = 1 2 3 4 5 Programozs Alapjai (2007) 395 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Hanoi tornyai Problmafelvets: Egy oszlopon egyre cskken tmrj korongok vannak. Pakoljuk t a korongokat egy msik oszlopra gy, hogy Egyszerre csak egy korongot mozgatunk, amelyik valamelyik oszlop tetejn van Nagyobb tmrj korong nem kerlhet kisebbre Rendelkezsre ll egy kezdetben szabad oszlop is Programozs Alapjai (2007) 396 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hanoi tornyai Specifikci: Input Db pozitiv egsz szm, a torony magassga

Kt klnbz, pozitiv egsz szm: Honnan s Hova (1<=Honnan, Hova<=3), melyek jelentse, hogy melyik toronyrl melyik toronyra kell tpakolni. Output Egy tevkenysgsorozat szvegesen, amit mechanikusan vgrehajtva tnylegesen tpakolhatjuk a tornyot. Programozs Alapjai (2007) 397 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hanoi tornyai Algoritmustervezs: Ksztsnk egy rekurzv eljrst, amelyik az N magassg torony tpakolst visszavezeti az N-1 magassg torony tpakolsra. Az 1 magassg torony tpakolsa nem ignyel elkszletet, azonnal elvgezhet.

Programozs Alapjai (2007) 398 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hanoi tornyai Algoritmustervezs: Az N magassg torony tpakolst visszavezetjk az N-1 magassg torony tpakolsra. Programozs Alapjai (2007) 399 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hanoi tornyai Megjegyzs:

Mivel az X magassg torony, amit az egyik rdrl a msikra pakolunk mindig az X legkisebb korongbl ll, a harmadik rudat akkor is hasznlhatjuk segdrdknt, ha azon van korong, mivel ez biztosan nagyobb, mint a legnagyobb, amit mi t szeretnnk pakolni. Programozs Alapjai (2007) 400 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hanoi tornyai Algoritmustervezs: void Hanoi( int N, int Rol, int Ra) N==1 i n Mozgat(Rol, Ra)

N-1 magas tornyot tegyk a helyre N-1 magas tornyot tegyk a segdre Hanoi(N-1,Rol,6-Rol-Ra) Mozgat(Rol, Ra) Programozs Alapjai (2007) Hanoi(N-1,6-Rol-Ra,Ra) 401 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hanoi tornyai /* A Hanoi tornyai jtk megvalstsa rekurzv eljrssal. * 1997. Oktber 31. Dvnyi Kroly, [email protected] */ #include

int Honnan; int Hova; int Db; /* errl a toronyrl kell trakni */ /* erre a toronyra */ /* a torony ennyi korongbl ll */ void Mozgat(int Innen, int Ide) { /* trak egy korongot Innen Ide */ printf(" Tegynk t egy korongot"); printf(" a %d. oszloprl a %d. oszlopra!\n", Innen, Ide); } >>> Programozs Alapjai (2007) 402 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Hanoi tornyai void Hanoi(int N, /* int Rol, /* int Ra) /* { if (N == 1) { Mozgat(Rol, Ra); } else { Hanoi(N - 1, Rol, 6 - Ra Mozgat(Rol, Ra); Hanoi(N - 1, 6 - Ra - Rol, } } ilyen magas a torony */ errl a toronyrl */ erre a toronyra */ Rol); Ra); >>>

Programozs Alapjai (2007) 403 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hanoi tornyai main(int argc, char *argv[]) { printf("Krem adja meg a torony magassgt: "); scanf("%d%*[^\n]", &Db); getchar(); printf("Krem adja meg, hogy a torony hol ll? (1,2,3) "); scanf("%d%*[^\n]", &Honnan); getchar(); printf("Krem adja meg, hogy melyik oszlopra tegyk t? "); scanf("%d%*[^\n]", &Hova); getchar(); if (Db > 0 && 1 <= Honnan && Honnan <= 3 && 1 <= Hova && Hova <= 3 && Honnan != Hova) { Hanoi(Db, Honnan, Hova); } else {

printf("Hibs adat\n"); } } Programozs Alapjai (2007) 404 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Rekurzi Az elz pldban rekurzv fggvnydeklarcit lthattunk. A C nyelven brmelyik fggvny lehet rekurzv illetve rszt vehet rekurzv fggvnyrendszerben. Programozs Alapjai (2007) 405 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Vgrehajts Az F(A1, ... ,An) fggvnymvelet vgrehajtsa sorrendben a kvetkez tevkenysgeket jelenti 1.) Memria helyfoglals a fggvnyblokk paramterei s loklis vltozi szmra. E=2 F=8 int A(int X) { int i; ... i=3; X=5; ... } int E,F; int main() { ...

A(E+F); ... } Programozs Alapjai (2007) X i E=2 F=8 406 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Vgrehajts 2.) Paramtertads. Elszr tetszleges sorrendben kirtkeldnek az aktulis paramterek. Mivel mind rtkparamter, az i-edik kirtkelt aktulis paramter rtke taddik az i-edik formlis paramternek, vagyis az aktulis

paramter rtke bemsoldik a formlis paramter szmra foglalt memriahelyre. X i E=2 F=8 int A(int X) { int i; ... i=3; X=5; ... } int E,F; int main() { ... A(E+F); ... } Programozs Alapjai (2007)

X=10 i E=2 F=8 407 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Vgrehajts 3.) A fggvnyblokk utastsrsznek vgrehajtsa. X=10 i E=2 F=8 int A(int X) {

int i; ... i=3; X=5; ... } int E,F; int main() { ... A(E+F); ... } Programozs Alapjai (2007) X=5 i=3 E=2 F=8 408 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Vgrehajts 4.) A fggvnyblokk formlis paramterei s loklis vltozi szmra foglalt memria felszabadtsa. X=5 i=3 E=2 F=8 int A(int X) { int i; ... i=3; X=5; ... } int E,F; int main() {

... A(E+F); ... } Programozs Alapjai (2007) E=2 F=8 409 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Vgrehajts A C nyelven blokknak hvjuk a program {} zrjelek kztti rszt is, s itt is lehet programelemeket deklarlni. Egy ilyen blokk vgrehajtsa a kvetkez hrom tevkenysget jelenti: 1.) Memria helyfoglals a blokk loklis vltozi szmra.

2.) A blokk utastsrsznek vgrehajtsa. 3.) A blokk loklis vltozi szmra foglalt memria felszabadtsa. A memria azon rszt, ahol a fenti tevkenysgek lezajlanak, veremnek nevezzk. Programozs Alapjai (2007) 410 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnyek mellkhatsa Fggvny mellkhatsn azt rtjk, hogy a fggvnyhvs hatsra nem csak a fggvnyrtk szmtdik ki, hanem megvltozhat egy globlis vltoz rtke is. Mellkhats kvetkezmnye, hogy az sszeads kommutativitsa nem felttlenl teljesl, ha a tagok fggvnyhvsok. Programozs Alapjai (2007)

411 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnyek mellkhatsa Vegyk az albbi pldt int A,B,Z; int f(int x) { int r; r = x + A; A = x + 1; return r; } main () { A = 1; B = 2; Z = f(A) + f(B); /* f(A)+f(B) == 6 */ /* f(B)+f(A) == 9 */ }

Programozs Alapjai (2007) 412 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnyek mellkhatsa A mellkhatst kerlni kell! Egy vltozt teht vagy globlis vltozknt hasznljunk, vagy aktulis paramterknt, de egyszerre mindkt cllal ne! A C-ben nincs meghatrozva, hogy kt rszkifejezs kzl melyiket kell elbb kirtkelni, teht az sem vilgos, hogy ha mindkettben van fggvnyhvs, melyik hajtdik vgre elbb. Programozs Alapjai (2007) 413

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnyek elnyei Fggvnyek hasznlata programozs sorn a kvetkez elnyket biztostja Tbbszrs felhasznls. Hasonl rszproblmk megoldsra elg egy fggvnyt kszteni s a klnbz adatokra vgrehajtatni a rszalgoritmust. gy a program mrett cskkenteni lehet. Memria igny cskkentse. Az fggvnyek loklis vltozi szmra csak az fggvny vgrehajtsa idejre foglaldik memria. Fggvnyek hasznlatval a program ttekinthetbb lesz. A tervezs sorn a rszproblmk fggvnnyel trtn megoldsa lehetv teszi a figyelem lokalizlst. Fggvnyek alkalmazsa megknnyti a bizonytst, a program tesztelst, a hibakeresst, a javtst s a program mdostst. Programozs Alapjai (2007) 414

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szmllsos ismtlses vezrls Szmllsos ismtlses vezrlsrl beszlnk, ha olyan ismtlst runk el, amely szerint a ciklusmagot vgre kell hajtani egy vltoz minden olyan rtkre (nvekv vagy cskken sorrendben), amely egy adott intervallumba esik. Legyen a s b valamely egsz rtk i egsz tpus vltoz M tetszleges mvelet Programozs Alapjai (2007) 415 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Nvekv szmllsos vezrls Szerkezeti bra i = a -> b M A nvekv szmllsos ismtlses vezrls a kvetkez vezrlsi elrst jelenti Programozs Alapjai (2007) i=a i <= b M i++ 416 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Nvekv szmllsos vezrls Szoksos elnevezsek i vltoz, a ciklusvltoz a kifejezs, az ismtls kezdrtke b kifejezs, az ismtls vgrtke M utasts (mvelet), a ciklusmag i = a -> b az ismtlsi elrs Fontos, hogy az M mvelet nem lehet hatssal az ismtlsi elrs egyik elemre sem. Programozs Alapjai (2007) 417 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Cskken szmllsos vezrls Szerkezeti bra i = a <- b M A cskken szmllsos ismtlses vezrls a kvetkez vezrlsi elrst jelenti Programozs Alapjai (2007) i=b i >= a M i-418 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Cskken szmllsos vezrls Szoksos elnevezsek i vltoz, a ciklusvltoz b kifejezs, az ismtls kezdrtke a kifejezs, az ismtls vgrtke M utasts (mvelet), a ciklusmag i = a <- b az ismtlsi elrs Fontos, hogy az M mvelet nem lehet hatssal az ismtlsi elrs egyik elemre sem. Programozs Alapjai (2007) 419

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk n alatt k Problmafelvets n alatt k kiszmtsa Specifikci Input n s k nemnegatv egsz szmok Output n alatt k rtke Programozs Alapjai (2007) 420 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

n alatt k Algoritmustervezs Ksztsnk az n alatt k kiszmolsra egy fggvnydeklarcit Ismeretes, hogy n alatt k = n!/(k!*(n-k)!). Nyilvnval, hogy nem clszer a szmolst gy szervezni, hogy a faktorilisokat egyenknt kiszmoljuk, hiszen ezek nagy rtkek lehetnek s gy kilphetnk az Integer rtkkszletbl. A nevez egyik tnyezjvel egyszerstve egy trtet kapunk, amelynek a szmllja is s a nevezje is azonos szm tnyezbl ll szorzat. Ez indokolja a szmllsos ismtlses vezrls alkalmazst. Programozs Alapjai (2007) 421 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk n alatt k int nAlk(int n, int k)

(n>=k) && (k>=0) i nak =1 i = 1 -> k return nak n nak = 0 nak = nak*(n-i+1) / i Programozs Alapjai (2007) 422 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A for utasts

Ha valamilyen mveletet sorban tbb rtkre is vgre kell hajtani, akkor ezt rdemes hasznlni. Szintaxis for ( Kifejezs ; Kifejezs ; Kifejezs ) Programozs Alapjai (2007) Utasts 423

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A for utasts A C-ben a for utasts ltalnos alakja gy nz ki: for (kif1; kif2; kif3) utasts ami egyenrtk a kif1; while (kif2) { utasts kif3; } alakkal. Programozs Alapjai (2007) 424 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk A for utasts Tbbnyire kif1 s kif3 rtkads vagy fggvnyhvs, kif2 pedig relcis kifejezs. A hrom kifejezs brmelyike elhagyhat, de a pontosvesszknek meg kell maradniuk. Ha kif1 vagy kif3 marad el, akkor a ; egyszeren elmarad a kifejtsbl. Ha a kif2 vizsglat nem szerepel, akkor llandan igaznak tekintjk, gy for (;;)ciklus, { /* ... */ } vgtelen amelybl ms mdon kell kiugrani (pl. return vagy break rvn). Programozs Alapjai (2007) 425 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk A , mvelet Elfordulhat, hogy a ciklus elksztse nem egy kifejezs kirtkelsbl ll, illetve minden egyes ciklusmenetben tbb adminisztrativ lps is lehet. A for utastsban ekkor alkalmazhatjuk a , mveletet, (sequential expression) amely vglis szekvencilis vezrlst r el. Programozs Alapjai (2007) 426 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A , mvelet A for (kif11, kif12, kif13; kif2; kif31, kif32, kif33) {

utasts } egyenrtk a kif11; kif12; kif13; while (kif2) { utasts kif31; kif32; kif33; } utastssal. Programozs Alapjai (2007) 427 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A , mvelet A , mveletet nyilvnvalan a prioritsi sor aljra kell helyeznnk

a egyoperandus mveletek ( -, ++, --, !, ~ ) a multiplikatv mveletek ( *, /, % ) az additv mveletek ( +, - ) bitlptets ( <<, >> ) a kisebb-nagyobb relcis mveletek ( <=, >=, <, > ) az egyenl-nem egyenl relcis mveletek ( ==, != ) bitenknti 's' mvelet ( & ) bitenknti 'kizr vagy' mvelet ( ^ ) bitenknti 'vagy' mvelet ( | ) a logikai 's' mvelet ( && ) a logikai 'vagy' mvelet ( || ) a feltteles mvelet ( ? : )

rtkad mvelet ( =, +=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |= ) szekvencia mvelet ( , ) Programozs Alapjai (2007) 428 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk bc A feladat: rassuk ki felvltva az bc kis s nagybetit Egy karakter trolsra C-ben a char tpus hasznlhat. Programozs Alapjai (2007) 429 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk bc /* Az bc kis- s nagybetinek kiratsa sszefslve. * A for ciklusban a , mveletet alkalmazzuk. * 1997. November 7. Dvnyi Kroly, [email protected] */ #include main() { char cha; char chA; /* az bc kisbetinek */ /* az bc nagybetinek */ for ( cha = 'a', chA = 'A'; cha <= 'z'; cha++, chA++ ) { printf ( "%c%c", cha, chA ); } printf ( "\n" ); } Programozs Alapjai (2007) 430

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A for utasts A nvekv szmllsos ismtlses vezrls szerkezeti brja s megvalstsa C-ben for (i = a; i <= b; ++i) { M; } Programozs Alapjai (2007) i = a -> b M 431 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

A for utasts A cskken szmllsos ismtlses vezrls szerkezeti brja s megvalstsa C-ben for (i = b; i >= a; --i) { M; } Programozs Alapjai (2007) i = a <- b M 432 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk n alatt k int nAlk(int n, int k) { /* n alatt k rtke nem rekurzv fggvnnyel */ int i, nak;

if (n >= k && k >= 0) { /* input adatok jk-e? */ nak = 1; /* inicializls */ for (i = 1; i <= k; i++) { /* ciklus */ nak = nak * (n - i + 1) / i; } } else { nak = 0; } return nak; } Programozs Alapjai (2007) 433 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pascal hromszg Problmafelvets

Pascal hromszg kiszmolsa s megjelentse 0 0 1 0 2 0 3 0 1 1 1 2 1 3 1 1

2 2 3 2 1 3 3 1 Programozs Alapjai (2007) 1 2 3 1 3

1 434 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pascal hromszg Specifikci: Input n nemnegatv egsz szm, a kirand sorok szma Output (n+1) db sor, rendre a Pascal hromszg sorai Algoritmustervezs: A fprogram feladata a beolvass, input ellenrzse, majd a nAlk fggvnyt alkalmas paramterekkel aktivizlva a soronknti kirats. Programozs Alapjai (2007) 435

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pascal hromszg P3szog Be(N) Kifr a kpernyre? i I = 0 -> N Pozcionls J = 0 -> I Ki ((KepSz / 2) - (I + 1) * SZ / 2 - 1) db Programozs Alapjai (2007) n

Ki(Nem) Sortrs Ki(nAlk(I,J)) 436 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pascal hromszg /* n alatt k rtknek kiszmtsa egy nemrekurzv fggvnnyel s * az rtkek elrendezse a Pascal hromszgben. * 1997. Oktber 31. Dvnyi Kroly, [email protected] */ #include #define SZAMSZ #define KEPSZ 5 80

/* egy szm kirsi szlessge */ /* a kperny szlessge */ >>> Programozs Alapjai (2007) 437 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pascal hromszg int nAlk(int n, int k) { /* n alatt k rtknek kiszmtsa nemrekurzv fggvnnyel int i, nak; if (n >= k && k >= 0) { /* input adatok jk-e? nak = 1; /* inicializls for (i = 1; i <= k; i++) /* ciklus nak = nak * (n - i + 1) / i;

} else { nak = 0; } return (nak); } main() { int n; int i, j; */ */ */ */ /* a sorok szma */ /* ciklusvltozk */ >>> Programozs Alapjai (2007) 438 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Pascal hromszg printf("Krem a Pascal hromszg sorainak szmt\n"); scanf("%d%*[^\n]", &n); getchar(); /* beolvass */ /* kifr-e a kpernyre? */ if (0 <= n && n <= KEPSZ / SZAMSZ - 2) { for (i = 0; i <= n; i++) { /* pozicionls */ printf("%*c", KEPSZ / 2 - (i + 1) * SZAMSZ / 2 - 1, ' '); for (j = 0; j <= i; j++) { printf("%5d", nAlk(i, j)); /* kirats */ } putchar('\n'); } } else { /* hibazenet */ printf("%d sor nem fr ki a kpernyre\n", n);

} } Programozs Alapjai (2007) 439 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pascal hromszg Problmafelvets Pascal hromszg kiszmolsa s megjelentse Specifikci: Input n nemnegatv egsz szm, a kirand sorok szma Output (n+1) db sor, rendre a Pascal hromszg sorai Programozs Alapjai (2007) 440

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pascal hromszg Algoritmustervezs: Ksztsnk az n alatt k kiszmolsra egy rekurzv fggvnyt. Ehhez felhasznljuk, hogy a Pascal hromszg szln lv rtk 1, a belsejben lv rtk pedig a felete lv kt rtk sszege. A fprogram feladata a beolvass, input ellenrzse, majd a nAlk fggvnyt alkalmas paramterekkel aktivizlva a soronknti kirats. N-1 K-1 N-1 K N K Programozs Alapjai (2007)

441 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk n alatt k rekurzvan int nAlk(int n, int k) (n>=k) && (k>=0) i (n<=1) || (k==0) || (n==k) i nak = 1 return nak n nak = 0 n

nak = nAlk(n-1,k-1) + nAlk(n-1,k) Programozs Alapjai (2007) 442 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pascal hromszg /* n alatt k rtknek kiszmtsa egy rekurzv fggvnnyel s * az rtkek elrendezse a Pascal hromszgben. * 1997. Oktber 31. Dvnyi Kroly, [email protected] */ #include #define SZAMSZ #define KEPSZ 5 80 /* egy szm kirsi szlessge */

/* a kperny szlessge */ >>> Programozs Alapjai (2007) 443 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pascal hromszg int nAlk(int n, int k) { /* n alatt k rtknek kiszmtsa rekurzv fggvnnyel */ int nak; if (n >= k && k >= 0) { /* input adatok jk-e? */ if (n <= 1 || n == k || k == 0) { /* alapesetek */ nak = 1; } else { /* rekurzv hvs */ nak = (nAlk(n - 1, k - 1) + nAlk(n - 1, k));

} } else { nak = 0; } return (nak); } main() { int n; int i, j; /* a sorok szma */ /* ciklusvltozk */ Programozs Alapjai (2007) >>> 444 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pascal hromszg

printf("Krem a Pascal hromszg sorainak szmt\n"); scanf("%d%*[^\n]", &n); /* beolvass */ getchar(); /* kifr-e a kpernyre? */ if (0 <= n && n <= KEPSZ / SZAMSZ - 2) { for (i = 0; i <= n; i++) { /* pozicionls */ printf("%*c", KEPSZ / 2 - (i + 1) * SZAMSZ / 2 - 1, ' '); for (j = 0; j <= i; j++) { printf("%5d", nAlk(i, j)); /* kirats */ } putchar('\n'); } } else { /* hibazenet */ printf("%d sor nem fr ki a kpernyre\n", n); } } Programozs Alapjai (2007) 445

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hurok ismtlses vezrls Az ismtlses vezrlsnek azt a mdjt, amikor a ciklusmag ismtlst a ciklusmagon bell vezreljk, gy, hogy ha adott felttel, a kijrati felttel teljesl, akkor a ciklusmag s ezzel egytt az sszetett mvelet vgrehajtsa befejezdik, hurok ismtlses vezrlsnek nevezzk. A ciklusmagban tbb kijrati felttelt is megadhatunk. Legyenek Fi (1<=i<=n) logikai kifejezsek, Ki s Mi (0<=i<=n) pedig tetszleges, (esetleg res) mveletek. Programozs Alapjai (2007) 446 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Hurok ismtlses vezrls Az Fi kijrati felttelekbl, a Ki kijrati mveletekbl s az Mi mveletekbl kpzett hurok ismtlses vezrls a kvetkez vezrlsi elrst jelenti: 1.) A ciklusmag egysgei szekvencilis vezrlst kpeznek a felrsuk sorrendjben. 2.) Az ismtlses vezrls a ciklusmag els egysgnek vgrehajtsval kezddik. Programozs Alapjai (2007) 447 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hurok ismtlses vezrls 3.) A ciklusmag i-dik egysgnek vgrehajtsa azt jelenti, hogy

Ha az mvelet, akkor vgrehajtdik a mvelet, s a ciklusmag kvetkez egysge kap vezrlst. Ha az kijrat s a kijrati felttel igaz, akkor a Ki kijrati mvelet vgrehajtdik s a hurok ismtlses vezrls vgrehajtsa vget r Ha az kijrat s a kijrati felttel hamis, akkor a kijrat hatstalan s a ciklusmag kvetkez egysge kap vezrlst. 4.) Ha a ciklusmag utols egysgnek vgrehajtsa utn, az az elrs, hogy a kvetkez egysg kap vezrlst, akkor a ciklusmag els egysge kap vezrlst. Programozs Alapjai (2007) 448 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hurok ismtlses vezrls Szerkezeti bra

M0 F1 K1 M1 F2 K2 Programozs Alapjai (2007) Mn-1 Fn Mn Kn 449 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hurok ismtlses vezrls Ha egyetlen Mi mvelet sincs hatssal egyetlen felttelre sem, akkor Vagy van olyan Fj, amelynek rtke igaz, s gy az sszetett mvelet vgrehajtsa befejezdik mieltt minden Mi mvelet egyszer is vgrehajtsra kerlne. Vagy az sszes Fj rtke hamis, s mivel feltettk, hogy az Mi mveleteknek nincs hatsa az Fj felttelekre, ezrt az sszes Fj rtke hamis is marad, teht az sszetett mvelet vgrehajtsa nem tud befejezdni. Ilyenkor vgtelen ciklus vgrehajtst rtuk el. Fontos teht, hogy legyen olyan Mi, amelyik valamelyik kijrati felttelre hat. Programozs Alapjai (2007) 450 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Hurok ismtlses vezrls A kezd- s vgfeltteles ismtlses vezrlsek specilis esetei a hurok ismtlses vezrlsnek. F F M M M F Programozs Alapjai (2007) Not F M

451 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Legnagyobb kzs oszt Problmafelvets: Pozitv egsz szmok legnagyobb kzs osztjnak meghatrozsa Specifikci: Input Szmsorozat melyet a 0 szm zr Output A szmok legnagyobb kzs osztja Programozs Alapjai (2007) 452 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Legnagyobb kzs oszt Algoritmustervezs: Az algoritmus lnyege egy olyan ismtlses vezrls, amely ciklusmagjnak egyszeri vgrehajtsa kiszmtja a mr feldolgozott input szmsor s a beolvasott kvetkez szm legnagyobb kzs osztjt. Lthat, hogy a ciklusmag ismtlst clszer a ciklusmagban vezrelni, mert az ismtls befejezdhet gy, hogy Vgre rtnk az inputnak A feldolgozott sorozat legnagyobb kzs osztja 1 Programozs Alapjai (2007) 453 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Legnagyobb kzs oszt Szerkezeti bra LegNKOszt Be(a) Be(b) Ki(a) b==0 a=LegNKO(a,b) Programozs Alapjai (2007) a==1 454 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Legnagyobb kzs oszt Problmafelvets

Legnagyobb kzs oszt kiszmtsa Specifikci Fggvnymveletet ksztnk Input x s y nemnegatv egsz szmok (bemen argumentumok) Output Az LegNKO fggvnymvelet int tpus eredmnyt szolgltat Teht int LegNKO(int x, int y) Programozs Alapjai (2007) 455 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Legnagyobb kzs oszt Algoritmustervezs

Euklidesz algoritmust valstjuk meg. Mivel LegNKO(x,0)=x, gy a kvetkez algoritmus a problma megoldst adja. A ciklusmag helyes megoldsa biztostja, hogy az ismtls vges sok lpsben befejezdik. Programozs Alapjai (2007) 456 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Legnagyobb kzs oszt Szerkezeti bra int LegNKO(int x, int y) y!=0 return x x mdostsa s y cskkentse gy, hogy LegNKO(x,y) rtke ne vltozzon s y maradjon nem negatv

m=x%y x=y Programozs Alapjai (2007) y=m 457 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Legnagyobb kzs oszt A ciklusmag kivitelezshez vegyk figyelembe: LegNKO(x,y) = LegNKO(y,x % y), ha y>0 Ugyanis a % s / mveletek defincija miatt x = y * (x / y) + x % y Teht, Ha d osztja x-nek s y-nak, akkor osztja (x % y)nak is Ha d osztja y-nak s (x % y)-nak, akkor x-nek is,

Tovbb 0 <= (x % y) < y Ha a ciklusmagot gy finomtjuk, akkor a megfogalmazott felttelek teljeslnek. Programozs Alapjai (2007) 458 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hurok vezrls megvalstsa #1 A C nyelvben nincs olyan vezrlsi forma, amellyel kzvetlenl megvalsthatnnk a hurok ismtlses vezrlst, de a kezdfeltteles ismtlses vezrls felhasznlsval megtehetjk. A megvalsts lnyege, hogy vlasztunk egy logikai vltozt (legyen az a tovabb), ez lesz az ismtls felttele s a ciklusmagban a feltteles kijratokat gy alaktjuk t, hogy Ha a felttel igaz, akkor a tovabb hamis rtket kap Egybknt vgrehajtdik a ciklusmag tovbbi rsze

Programozs Alapjai (2007) 459 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hurok vezrls megvalstsa #1 A LNKOszt algoritmusban tovabb=true tovabb szerepl hurok ciklus teht a Be(B) B==0 i n kvetkezkppe n valsthat tovabb=false meg A=LegNKO(A,B)

A==1 i n tovabb=false Programozs Alapjai (2007) 460 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Legnagyobb kzs oszt #1 /* Pozitv egsz szmok legnagyobb kzs osztjnak meghatrozsa. * A hurok ismtlses vezrls megvalstsa break utastssal. * 1997. November 7. Dvnyi Kroly, [email protected] * 2006. Augusztus 8. Gergely Tams, [email protected] */ #include >>>

Programozs Alapjai (2007) 461 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Legnagyobb kzs oszt #1 int LegNKO(int x, int y) { /* x s y legnagyobb kzs osztjnak meghatrozsa * Euklidesz algoritmusval. */ int m; while (y != 0) { m = x % y; x = y; y = m; } return x; } >>>

Programozs Alapjai (2007) 462 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Legnagyobb kzs oszt #1 main() { int a, b; int tovabb; /* logikai vltoz a ciklus megvalstshoz */ printf("A program pozitv egsz szmok legnagyobb\n"); printf("kzs osztjt szmtja.\n"); printf("Krem a szmok sorozatt, amit 0 zr!\n"); printf("? "); scanf("%d%*[^\n]", &a); getchar(); >>> Programozs Alapjai (2007)

463 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Legnagyobb kzs oszt #1 tovabb = !0; while (tovabb) { /* a hurok ciklus kezdete printf("? "); scanf("%d%*[^\n]", &b); getchar(); if (b == 0) { /* els kijrat tovabb = 0; } else { a = LegNKO(a, b); if (a == 1) { /* msodik kijrat tovabb = 0; } }

} /* a hurok ciklus vge printf(" A szmok legnagyobb kzs osztja: %d\n",a); */ */ */ */ } Programozs Alapjai (2007) 464 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hurok vezrls megvalstsa #2 A hurok ismtlses vezrls msodik

megvalstsa a C nyelv break utastst hasznlja. A break utasts megtri az aktulis ismtlses (vagy mint lttuk, esetkivlasztsos szelekcis) vezrlst, s a vezrlsi szerkezet utni els utastsnl folytatja a programot. Programozs Alapjai (2007) 465 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hurok vezrls megvalstsa #2 M0 F1 K1 M1

Mn-1 F2 K2 while (1) { M0; if (F1) { K1; break; } M1; Fn Mn Kn ... if (Fn) { Kn; break; } Mn; }

Programozs Alapjai (2007) 466 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hurok vezrls megvalstsa #2 A while (1) {} vgtelen ciklus helyett alkalmazhatjuk a for (;;) {} vgtelen ciklus utastst is. Programozs Alapjai (2007) 467 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Legnagyobb kzs oszt #2 /* Pozitv egsz szmok legnagyobb kzs osztjnak meghatrozsa. * A hurok ismtlses vezrls megvalstsa break utastssal. * 1997. November 7. Dvnyi Kroly, [email protected] */ #include >>> Programozs Alapjai (2007) 468 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Legnagyobb kzs oszt #2 int LegNKO(int x, int y) { /* x s y legnagyobb kzs osztjnak meghatrozsa * Euklidesz algoritmusval.

*/ int m; while (y != 0) { m = x % y; x = y; y = m; } return x; } >>> Programozs Alapjai (2007) 469 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Legnagyobb kzs oszt #2 main() { int a, b;

printf("A program pozitv egsz szmok legnagyobb\n"); printf("kzs osztjt szmtja.\n"); printf("Krem a szmok sorozatt, amit 0 zr!\n"); printf("? "); scanf("%d%*[^\n]", &a); getchar(); >>> Programozs Alapjai (2007) 470 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Legnagyobb kzs oszt #2 while (1) { /* a hurok ciklus kezdete printf("? "); scanf("%d%*[^\n]", &b); getchar(); if (b == 0) {

/* els kijrat break; } a = LegNKO(a, b); if (a == 1) { /* msodik kijrat break; } } /* a hurok ciklus vge printf(" A szmok legnagyobb kzs osztja: %d\n",a); */ */ */ */ } Programozs Alapjai (2007) 471

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk break, continue A C nyelvben a ciklusmag folyamatos vgrehajtsnak megszaktsra kt utasts hasznlhat: break Megszaktja a ciklust, a vezrls a ciklusmag utni els utastssal foglalkozik continue Megszaktja a ciklus aktulis lefutst, a vezrls a ciklus felttelnek kirtkelsvel folytatdik Programozs Alapjai (2007) 472 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Diszkrt ismtlses vezrls Diszkrt ismtlses vezrlsrl beszlnk, ha azt a vezrlsi elrst tesszk, hogy az x ciklusvltoz egy adott H vges halmaz minden elemt tetszleges sorrendben felvve hajtsuk vgre az M ciklusmagot. Programozs Alapjai (2007) 473 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Diszkrt ismtlses vezrls Fontos, hogy az M mvelet nem lehet hatssal az ismtlsi elrs egyik elemre sem. A H halmaz szmossga hatrozza meg teht, hogy az M mvelet hnyszor hajtdik vgre. Ha a H az res halmaz, akkor a diszkrt ismtlses vezrls az M mvelet vgrehajtsa

nlkl befejezdik. Programozs Alapjai (2007) 474 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Diszkrt ismtlses vezrls x in H M A diszkrt ismtlses vezrlsnek nincs kzvetlen megvalstsa a C nyelvben. Programozs Alapjai (2007) 475 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Diszkrt vezrls megvalstsa A megvalsts elssorban attl fgg, hogy az ismtlsi felttelben megadott halmazt hogyan reprezentljuk. Algoritmustervezs sorn szabadon hasznljuk a diszkrt ismtlses vezrlst, ha erre van szksg a problma megoldshoz. A halmaz reprezentlsrl pedig akkor dntsnk, amikor elegend informci ll rendelkezsnkre, hogy a legmegfelelbbet kivlaszthassuk. Programozs Alapjai (2007) 476 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Folyamatbra Szerkezeti brval az algoritmusok tervezse sorn a lpsenknti finomtsokat s a

kifejlesztett algoritmust egyarnt kifejezhetjk. Ha csak a ksz algoritmus vezrlsi szerkezett akarjuk lerni, akkor hasznlhatjuk a folyamatbrt, mint ler nyelvezetet. Ez olyan bra, amelyben az algoritmus egyes lpseit s a lpsek kztti vezrlsi viszonyt szemlltethetjk irnytott vonalakkal. Programozs Alapjai (2007) 477 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Folyamatbra Legyen M={M1, ... ,Mk} mveletek s F={F1, ... ,Fl} felttelek. Az (M,F) feletti folyamatbrn olyan irnytott grfot rtnk, amelyre teljesl a kvetkez 5 felttel: 1.) Egy olyan pontja van, amely a Start res mvelettel van cmkzve s ebbe a pontba nem vezet l.

2.) Egy olyan pontja van, amely a Stop res mvelettel van cmkzve s ebbl a pontbl nem indul l. Programozs Alapjai (2007) 478 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Folyamatbra 3.) Minden pontja M-beli mvelettel vagy F-beli felttellel van cmkzve, kivve a Start s a Stop pontokat. 4.) Ha egy pont M-beli mvelettel van cmkzve, akkor belle egy l indul ki F-beli felttellel van cmkzve, akkor belle kt l indul ki s ezek az i(igen) illetve n(nem) cmkt viselik 5.) A grf miden pontja elrhet a Start cmkj pontbl. Programozs Alapjai (2007)

479 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Folyamatbra Egy folyamatbra a kvetkez sszetett vezrlsi elrst jelenti i.) A vgrehajts a Start pontbl indul. Az sszetett mvelet vgrehajtsa akkor r vget, ha a Stop pont kap vezrlst. ii.) A grf egy pontjnak vgrehajtsa azt jelenti, hogy Ha a pontban M-beli mvelet van, akkor a mvelet vgrehajtdik s a vezrls a grf azon pontjra kerl, amelybe a pontbl kiindul l vezet Ha a pont F-beli felttellel van cmkzve, akkor kirtkeldik a felttel. Ha rtke igaz, akkor az a pont kap vezrlst, amelybe az i(igen) cmkj l vezet, egybknt az a pont kap vezrlst, amelybe az n(nem) cmkj l vezet. Programozs Alapjai (2007)

480 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Folyamatbra Plda M={M1, M2} F={F1} Start M1 i M2 F1 n Stop Programozs Alapjai (2007)

481 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Folyamatbra s struktradiagram Nevezzk szablyosnak az eddig bevezetett vezrlsi mdokat, ezen bell alapvetnek a szekvencilis, egyszer szelekcis s a kezdfeltteles ismtlses vezrlst. Belttuk, hogy a szablyos vezrlsi mdok megvalsthatk az alapvet vezrlsi mdokkal. Programozs Alapjai (2007) 482 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Folyamatbra s struktradiagram Az alapvet vezrlsi mdokat hasznl algoritmusok kifejezhetk folyamatbrval is. Start Start Start M1 F F i Mn Stop n A

B Stop Programozs Alapjai (2007) i n M Stop 483 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Folyamatbra s struktradiagram Megmutatjuk, hogy fordtva is igaz, teht a folyamatbrval lert algoritmusok megadhatk szablyos s gy alapvet vezrlsi mdokat hasznlva, feltve, hogy bevezethetnk egsz tpus segdvltozt. Programozs Alapjai (2007)

484 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Folyamatbra s struktradiagram Legyen G egy folyamatbra (M,F) felett, amely pontjainak szma n. Sorszmozzuk meg a grf pontjait gy, hogy a Start pont sorszma 1 s a Stop pont sorszma n legyen. Vegynk fel egy olyan j egsz tpus vltozt. Legyen ennek az azonostja pont. Programozs Alapjai (2007) 485 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Folyamatbra s struktradiagram Tekintsk az albbi C programot { Pont = 1; while (pont != n) { switch (pont) { case 1 : U1; break; ... case n-1: Un-1; break; case n : /* Stop */ break; } /* switch */ } } Programozs Alapjai (2007) 486 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Folyamatbra s struktradiagram

Ahol az Ui utasts: Ha az i. pontban az Mi mvelet volt s a belle kiindul l a j. pontba vezetett: { Mi; pont = j; } Ha az i. pontban az Fi felttel volt s az igennel cmkzett l a j., a nemmel cmkzett l pedig a k. pontba vezetett { if (Fi) { pont = j; } else { pont = k; } } Az gy megalkotott program a G folyamatbrval adott algoritmussal ekvivalens algoritmus kdolsa lesz. Programozs Alapjai (2007) 487 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Adattpusok Szmtgpes problmamegolds sorn az adatkezelsnek klnbz szintjeit lehet

elklnteni. Ezek kztti vilgos klnbsgttelnek fontos szerepe van az algoritmustervezsben. Programozs Alapjai (2007) 488 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Adattpusok Az adatkezels szintjei egyttal klnbz absztrakcis szinteknek felelnek meg. Problma szintje Szaktudomnyos s matematikai szint Absztrakt adattpus szint

Virtulis adattpus szint Fizikai adattpus szint Programozs Alapjai (2007) 489 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Adattpusok Problma szintje. A felhasznl ezen a szinten fogalmazza meg a megoldand problmt, a bemen s kimen adatokat, valamint a bemeneti-kimeneti felttelt. Programozs Alapjai (2007) 490 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Adattpusok Szaktudomnyos s matematikai szint. A problma megoldshoz a kiindulpontot a szaktudomny s/vagy matematikai modell kpezi. Ezen a szinten azonban arra a krdsre kapunk vlaszt, hogy milyen adatok szerepelnek a problmban s hogy milyen sszefggsek rvnyeslnek. A hogyan krdsre az algoritmustervezs sorn kell vlaszolni. Programozs Alapjai (2007) 491 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Adattpusok Absztrakt adattpus szint. Az algoritmustervezs sorn hatrozzuk meg, hogy milyen mveleteket kell alkalmazni a problmban

szerepl adatokon ahhoz, hogy a megoldst megkapjuk. Ezt a szintet azrt nevezzk absztrakt szintnek, mert mg nem dntttnk arrl, hogy az adatokat hogyan troljuk s a mveleteket milyen algoritmusok valstjk meg. A trolsrl s a mveletek megvalstsrl csak akkor szabad dnteni, amikor a tervezsben az sszes informci rendelkezsnkre ll ahhoz, hogy a legmegfelelbb, leghatkonyabb megvalstst kivlasszuk. Programozs Alapjai (2007) 492 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Adattpusok Virtulis adattpus szint A problma megoldst ad algoritmust valamely programozsi nyelven rjuk le. A programozsi nyelvet virtulis gpnek tekinthetjk, amely rendelkezik eleve adott adattpusokkal s tpuskpzsekkel. Az absztrakt adattpusokat teht

virtulis adattpusok felhasznlsval valstjuk meg. Programozs Alapjai (2007) 493 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Adattpusok Fizikai adattpus szint Az adatokat vgs soron fizikai eszkz, a memria trolja s a mveleteket fizikai gpi mveletek valstjk meg. A memria a legtbb gp esetben bjtok vges sorozata, teht vgs soron minden adattpust e lineris szerkezet trolval kell reprezentlni. Programozs Alapjai (2007) 494

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Adattpusok A C nyelv virtulis adattpusait fogjuk ttekinteni, azonban az adattpusokat a legtbb esetben mint absztrakt adattpusokat vezetjk be. Ennek az az oka, hogy ezek olyan ltalnos programozsi fogalmak, amelyek akkor is hasznlhatk algoritmusok tervezse sorn, ha a megvalsts nyelve nem a C. Ekkor a vlasztott nyelv virtulis (vagy gpi) adattpusainak felhasznlsval kell az adattpusokat megvalstani. Programozs Alapjai (2007) 495 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Adattpusok A C (s sok ms hasonl programozsi) nyelv alapvet tulajdonsga, hogy rendelkezik nhny eleve definilt adattpussal tovbb tpuskpzsi mechanizmusokkal. gy a mr (eleve vagy a programoz ltal) definilt adattpusok felhasznlsval jabbakat definilhatunk. Programozs Alapjai (2007) 496 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Elemi adattpusok Az adattpusokat osztlyozhatjuk aszerint is, hogy az rtkhalmazuk elemei sszetettek-e vagy elemiek. Elemi adattpusok

Egsz tpusok (int, signed, unsigned, short, long) Karakter tpus (char, signed, unsigned) Felsorols (enum tpuskpzssel) Vals tpusok (float, double, long) Logikai tpus (C-ben nincs kzvetlen megvalstsa) Programozs Alapjai (2007) 497 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A C nyelv elemi adattpusai Az elemi s mdostott tpusok. C tpus mret(bjt)

als hatr fels hatr _______________________________________________________ char 1 ? ? signed char 1 -128 127 unsigned char 1 0 255 short int 2 -32768 32767 unsigned short int 2 0 65535 int 4

-2147483648 2147483647 unsigned int 4 0 4294967295 long int 4 -2147483648 2147483647 unsigned long int 4 0 4294967295 long long 8 -263 263-1 float 4 -+3.4028234663852886E+38 double 8 -+1.7976931348623157E+308 long double

8 -+1.7976931348623157E+308 Programozs Alapjai (2007) 498 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egsz tpusok a C nyelvben Egy n bites trterletnek 2n llapota van. Az rtkhalmaz szoksos kijellse a kvetkez: Ha negatv szmok nem szerepelnek az rtkhalmazban, akkor az rtkhalmaz 0..2n-1 Ha szerepelnek, akkor pedig -2n-1..2n-1-1 A C nyelv klnfle egsz adattpusai az rtkhalmazukban klnbznek egymstl, az rtelmezett mveletkben megegyeznek. Programozs Alapjai (2007) 499

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egsz tpusok a C nyelvben Egsz kifejezsben brmely egsz tpus tnyez (akr vegyesen tbbfle is) szerepelhet. Egsz konstans tpusa az az egsz tpus, amely a legszkebb olyan rtkhalmaz, amelynek eleme a kifejezs rtke. rtkad mvelet jobb oldaln ll kifejezs kirtkelse fggetlen attl, hogy a bal oldalon milyen tpus vltoz van. Programozs Alapjai (2007) 500 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

A C nyelv elemi adattpusai A mdostk signed eljeles unsigned eljeltelen short rvid long hossz Programozs Alapjai (2007) 501 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A C nyelv elemi adattpusai

Az egyes gpeken az egyes tpusok mrete ms-ms lehet, de minden C megvalstsban sizeof(short)<=sizeof(int) sizeof(int)<=sizeof(long) sizeof(float)<=sizeof(double) sizeof(double)<=sizeof(long double) Az int elhagyhat (de nem fogjuk megtenni) ugyanis mindentt, ahol tpust kell megadni, de ezt elfelejtettk, oda int-et gondol a fordt. Programozs Alapjai (2007) 502 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A C nyelv elemi adattpusai A limits.h-ban sok konstans van deklarlva, ha ezeket hasznlni szeretnnk, akkor #include sort kell beszrni valahov a program elejre.

Programozs Alapjai (2007) 503 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk A C nyelv elemi adattpusai Nhny konstans a limits.h-bl #define #define #define #define #define #define #define #define #define #define #define #define #define

#define #define CHAR_BIT SCHAR_MIN SCHAR_MAX UCHAR_MAX CHAR_MIN CHAR_MAX SHRT_MIN SHRT_MAX USHRT_MAX INT_MIN INT_MAX UINT_MAX LONG_MIN LONG_MAX ULONG_MAX 8 (-128) 127 255 SCHAR_MIN SCHAR_MAX

(-32768) 32767 65535 (-2147483647-1) 2147483647 4294967295 (-2147483647-1) 2147483647 4294967295 /* /* /* /* /* /* /* /* /* /* /* /* /* /* /*

Programozs Alapjai (2007) "char" */ "signed char" */ "signed char" */ "unsigned char" */ "char" */ "char" */ "short int" */ "short int" */ "unsigned short int" */ "int" */ "int" */ "unsigned int" */ "long int" */ "long int" */ "unsigned long int" */ 504 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Karakter adattpus a C nyelvben A char adattpus a C nyelv eleve definilt elemi adattpusa, rtkkszlete 256 elemet tartalmaz. A char adattpus egszknt is hasznlhat, de kimeneti eszkzn karakterknt jelenik meg. Hogy melyik rtkhez melyik karakter tartozik, az az alkalmazott kdtblzattl fgg. Bizonyos karakterek (ltalban a rendezs szerint els nhny) vezrl karakternek szmtanak, s nem megjelenthetk. Programozs Alapjai (2007) 505 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Karakter adattpus a C nyelvben A karaktereket aposztrfok (') kztt kell megadni.

A specilis karaktereket, illetve magt az aposztrfot (s vgs soron tetszleges karaktert is) escape-szekvencikkal lehet megadni. Az escape-szekvencikat a \ (backslash) karakterrel kell kezdeni. Programozs Alapjai (2007) 506 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Karakter adattpus a C nyelvben Karakterek escape-szekvencikkal. jsor vzszintes tab vissza-szkz kocsi-vissza lapdobs fordtott trtvonal aposztrf

tetszleges karakter NL (LF) HT BS CR FF \ Programozs Alapjai (2007) \n \t \b \r \f \\ \ \ddd 507 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Karakter adattpus a C nyelvben A \ddd escape-szekvencia egy fordtott trtvonalat s 1, 2 vagy 3 rkvetkez oktlis szmjegyet tartalmaz, amelyek a kvnt karakter rtkt hatrozzk meg. E konstrukci specilis esete a \0, amely a NUL karaktert jelli. Ha a fordtott trtvonalat kvet karakter nem az elbbiek egyike, a fordt a fordtott trtvonalat nem veszi figyelembe. Programozs Alapjai (2007) 508 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Karakter adattpus a C nyelven

A kdtblrl csak annyit ttelezhetnk fel, hogy 'a'<'b'< ... <'z', az angol bc 26 kisbetjre 'A'<'B'< ... <'Z', az angol bc 26 nagybetjre A szmjegy karakterek tnylegesen rkvetkezk, azaz '0'+1=='1', , '8'+1=='9' Mint emltettk a char adattpus egszknt is hasznlhat. A konverzi a ktfajta tpus rtk kztt automatikus ezrt pldul: '\nnn' == 0nnn Programozs Alapjai (2007) 509 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Karakter adattpus a C nyelven Konvertljunk egy tetszleges szmjegy karaktert (ch) a neki megfelel egsz szmm s egy egyjegy egszet (i) karakterr.

ch - '0' i + '0' Konvertljunk kisbett nagybetv s nagybett kisbetv. ch - 'a' + 'A' ch - 'A' + 'a' Programozs Alapjai (2007) 510 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bitenknti logikai mveletek A C nyelvben tbb bitmanipulcis opertor van, ezek a float s double tpus vltozkra nem, de int s char tpusokra alkalmazhatk.

& | ^ << >> ~ bitenknti S, bitenknti megenged (inkluzv) VAGY, bitenknti kizr (exkluzv) VAGY, bitlptets (shift) balra, bitlptets (shift) jobbra, egyes komplemens (egyoperandus). Programozs Alapjai (2007) 511 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Bitenknti logikai mveletek A bitenknti S opertort gyakran hasznljuk valamely bithalmaz maszkolsra. Pldul azt, hogy pratlan-e x az ((x & 1) == 1) valstja meg. A bitenknti VAGY opertorral lehet biteket 1-re lltani: x = x | MASK; ugyanazokat a biteket lltja 1-be x-ben, mint amelyek 1-be vannak lltva MASK-ban. Programozs Alapjai (2007) 512 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Bitenknti logikai mveletek Gondosan meg kell klnbztetnnk az & s | bitenknti opertorokat az && s || logikai mveletektl, amelyek egy igazsgrtk balrl jobbra trtn kirtkelst rjk el. Ha pldul x rtke 1 s y rtke 2, akkor a C laza tpusossga miatt x & y == 0 x && y != 0 Programozs Alapjai (2007) 513 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bitenknti logikai mveletek A << s >> lptet (shift) opertorok bal oldali operandusukon annyi bitlptetst hajtanak vgre, ahny bitpozcit a jobb oldali operandusuk elr: x = x << 2;

az x bitjeit kt pozcival balra lpteti, a megrlt biteket pedig 0-val tlti fel: ez 4-gyel val szorzssal egyenrtk. Programozs Alapjai (2007) 514 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bitenknti logikai mveletek Az unsigned (eljeltelen) mennyisg jobbra lptetse esetn a felszabadul bitekre nullk kerlnek. Eljeles mennyisg jobbra lptetse esetn bizonyos gpeken a felszabadul bitekre az eljel kerl (aritmetikai lptets), ms gpeken 0 bitek (logikai lptets). Programozs Alapjai (2007)

515 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bitenknti logikai mveletek A ~ binris opertor egsz tpus mennyisg 1es komplemenst kpezi, vagyis minden bitet negl. Ezt az opertort leggyakrabban olyan kifejezsekben hasznljuk, mint x & ~077 amely x utols 6 bitjt 0-ra maszkolja. Vegyk szre, hogy x & ~077 fggetlen az x mrettl, s gy elnysebb, mint pl. x & 0177700, amely 16 bites x-et felttelez. A gpfggetlen alak nem nveli a futsi idt, mivel ~077 lland kifejezs, s gy fordtsi idben rtkeldik ki. Programozs Alapjai (2007) 516 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bitenknti logikai mveletek Pldk: ~0x08: ~((char) 0x08) == 0xf7 ~((short)0x08) == 0xfff7 ~((long) 0x08) == 0xfffffff7 0x16 ^ 0x3a == 0x2c 00010110 ^ 00111010 == 00101100 Programozs Alapjai (2007) 517 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Bitenknti logikai mveletek Pldk: 0x16 & 0x3a == 0x12 00010110 & 00111010 == 00010010 0x16 | 0x3a == 0x3e 00010110 | 00111010 == 00111110 Programozs Alapjai (2007) 518 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bitenknti logikai mveletek Pldk:

0x96 << 2 == 0x58 10010110 << 2 == 01011000 0x16 >> 2 == 0x05 00010110 >> 2 == 00000101 0x96 >> 2 == 0x25 / 0xe5 10010110 >> 2 == 00100101 10010110 >> 2 == 11100101 Programozs Alapjai (2007) 519 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bitenknti logikai mveletek Van-e eljeles lptets? Van-e eljeles char tpus? char a; unsigned char b; a = b = 128;

a >>= 1; b >>= 1; printf("Ezen a gpen%ssigned char van\n", ((a == b) ? " un" : " " )); Programozs Alapjai (2007) 520 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bitenknti logikai mveletek Kvetkez pldban nhny bitopertor mkdst szemlltetjk. A getbits(x, p, n) fggvny x-nek a pedik pozcin kezdd n-bites mezjt adja vissza (jobbra igaztva). Felttelezzk, hogy a 0. bitpozci a jobb szlen van n s p rtelmes pozitv rtkek. Pldul getbits (x,4,3) a 4, 3 s 2 pozcin lev hrom bitet szolgltatja, jobbra igaztva.

Programozs Alapjai (2007) 521 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bitenknti logikai mveletek int getbits(unsigned x, p, n) { return ((x >> (p + 1 - n)) & ~(~0 << n)); } x >> (p + 1 - n) A kvnt mezt a sz jobb szlre mozgatja. Az x argumentumot unsigned mennyisgnek deklarlva biztostjuk, hogy a jobbra lptetskor a felszabadul bitek biztosan nullkkal tltdjenek fel. Programozs Alapjai (2007) 522

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bitenknti logikai mveletek ~0 Csupa 1 bitet jelent ~0 << n Utasts segtsgvel n bitpozcival balra lptetve a ~0 rtket a jobb oldali n biten csupa nullkbl ll, a tbbi pozcin egyesekbl ll maszk jn ltre. ~(~0 << n) Olyan maszk keletkezik, amelyben a jobb oldali biteken llnak egyesek. Programozs Alapjai (2007) 523 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Bitenknti logikai mveletek Illesszk be prioritsi sorba a mveleteket! a egyoperandus mveletek ( -, ++, --, !, ~ ) a multiplikatv mveletek ( *, /, % ) az additv mveletek ( +, - ) bitlptets ( <<, >> ) a kisebb-nagyobb relcis mveletek ( <=, >=, <, > ) az egyenl-nem egyenl relcis mveletek ( ==, != ) bitenknti 's' mvelet ( & )

bitenknti 'kizr vagy' mvelet ( ^ ) bitenknti 'vagy' mvelet ( | ) a logikai 's' mvelet ( && ) a logikai 'vagy' mvelet ( || ) a feltteles mvelet ( ? : ) rtkad mvelet ( =, +=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |= ) Programozs Alapjai (2007) 524 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tpusdefinci C-ben A C nyelvben lehetsgnk van tpusok tetszsnk szerinti elnevezsre, azaz tpusdefincira melyet a typedef kulcssz vezet be, alakja: typedef tpus jnv; typedef unsigned short int u16;

Programozs Alapjai (2007) 525 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tpusdefinci C-ben A tpusdefincival lhetnk pldul akkor, mikor tbb helyen kell ugyanolyan tpus vltozt deklarlni, de ez a tpus a jvbeni fejlesztsek sorn esetleg vltozhat egy bonyolult mdon megadhat tpus, amit nehzkes lenne tbbszr lerni (s a tbbszri lers mellesleg hibaforrs is!) Programozs Alapjai (2007) 526 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Felsorols adattpusok Felsorols adattpus rtkhalmaza a tpuskpzsben felsorolt azonostk, mint konstans azonostk ltal meghatrozott rtkek. A < rendezsi relci a tpuskpzsben a felsorols ltal van definilva. A tpuskpzsben felsorolt azonost gy tekintend, mintha abban a blokkban deklarlt konstans azonost lenne, amelyik blokkban a tpusdefinci szerepel. Programozs Alapjai (2007) 527 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Felsorols adattpusok Felsorols adattpus definilsa az

enum kulcssz segtsgvel trtnik: enum {elem1, ..., elemn} enum {hetfo, kedd, szerda, csutortok, pentek, szombat, vasarnap} nap; /* vltozdeklarci */ typedef enum {hetfo, kedd, szerda, csutortok, pentek, szombat, vasarnap} Het; /* tpusdefinci */ Het nap; /* vltozdeklarci */ Programozs Alapjai (2007) 528 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Felsorols adattpusok Az els azonost rtke 0, a tbbi 1-gyel tbb az t megelznl, hacsak mst nem adunk meg.

enum {hetfo=1, kedd, szerda, csutortok, pentek, szombat, vasarnap} nap; enum {a=3, b, c, d=2, e, f} ertek; Felhasznlhat a nap vltoz pldul egy szmllt menet ismtlses vezrlsben for(nap = hetfo; nap <= vasarnap; nap++) { /* Ciklusmag ... */ } Programozs Alapjai (2007) 529 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Felsorols adattpusok A konverzi a felsorols tpus azonosti s az int tpus kztt automatikus, st, a felsorols tpust a fordt tulajdonkppen az int tpusra vezeti vissza, ezrt ennek a tpusnak a mveletei megfelel krltekintssel

hasznlhatak. Azrt kell a megfelel krltekints, mert pldul a vasarnap + 1 == 8 de a 8 rtk mr rtelmezhetetlen a tpus rtkeknt. Programozs Alapjai (2007) 530 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Felsorols adattpusok typedef enum {hetfo=1, kedd, szerda, csutortok, pentek, szombat, vasarnap} Het; Het nap; Het KovNap(Het n) { if(n == vasarnap) { return hetfo; } else { return n+1; } }

int main() { for (nap = hetfo; nap <= vasarnap; nap++) { /* ??? */ } } Programozs Alapjai (2007) 531 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Logikai adattpus C nyelven A C nyelvben nincs logikai (bool) tpus, de azrt logikai rtkek persze keletkeznek. Ha mgis szksgnk lenne logikai rtk trolsra, akkor ezt megtehetjk egy int vltozban is. Ha egy logikai rtket egy int tpus vltozba tettnk, akkor a logikai hamis rtk trolsa utn az int tpus vltoz rtke 0, az igaz

rtk trolsa utn pedig nem 0. (Sok megvalstsban 1, de ezt nem hasznlhatjuk ki, ha gpfggetlen programot szeretnnk.) Programozs Alapjai (2007) 532 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Logikai adattpus C nyelven C-ben nincs logikai konstans (false s true), ha mgis szksgnk lenne ezekre, akkor magunk definilhatjuk ket: #define FALSE 0 /* Boolean tpus hamis rtke */ #define TRUE 1 /* Boolean tpus igaz rtke */ #define TRUE (1) /* Tovbbi lehetsges

*/ #define TRUE (!FALSE) /* defincik, de ezek */ #define TRUE (!(FALSE)) /* kzl egyszerre csak */ #define TRUE (0==0) /* egy hasznlhat */ vagy #define TRUE (1==1) #define FALSE (!TRUE) Programozs Alapjai (2007) 533 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Logikai adattpus C nyelven C-ben bevezetnk egy nem ltez bool tpust: typedef enum {false, true} bool; de arra gyelni kell, hogy egy igaz logikai kifejezs rtke a true rtktl ilyen definci esetn (is) eltrhet. Programozs Alapjai (2007) 534 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk sszetett tpusok, tpuskpzsek Pointer tpus Tmb tpus Sztringek Rekord tpus Szorzat-rekord

Egyestsi-rekord Fggvny tpus Programozs Alapjai (2007) 535 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk sszetett adattpusok Elszr a pointer tpussal foglalkozunk, mert Ez a C nyelv egy igen hatkony eszkze Hasznlata tmr s hatkony kdot eredmnyez Bizonyos tevkenysgeket csak ezzel lehet megoldani Szles krben hasznlhat Programozs Alapjai (2007) 536

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointer tpus Mr a K&R is vatossgra int: "Azt szoktk mondani, hogy a mutat, csakgy, mint a goto utasts, csak arra j, hogy sszezavarja s rthetetlenn tegye a programot. Ez biztos gy is van, ha sz nlkl hasznljuk, hiszen knnyszerrel gyrthatunk olyan mutatkat, amelyek valamilyen nem vrt helyre mutatnak. Kell nfegyelemmel azonban a mutatkat gy is alkalmazhatjuk, hogy ezltal programunk vilgos s egyszer legyen." Programozs Alapjai (2007) 537 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Pointer tpus, dinamikus vltozk Az eddigi trgyalsunkban szerepelt vltozk statikusak abban az rtelemben, hogy ltezsk annak a blokknak a vgrehajtshoz kttt, amelyben a vltoz deklarlva lett. A programoznak nincs befolysa a vltoz ltestsre s megszntetsre. (Ez a fajta statikussg nem tvesztend ssze azzal, amit a static kulcsszval rhetnk el a C nyelvben) Programozs Alapjai (2007) 538 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointer tpus, dinamikus vltozk Az olyan vltozkat, amelyek a blokkok aktivizlstl fggetlenl ltesthetk s megszntethetk, dinamikus vltozknak nevezzk.

Dinamikus vltozk megvalstsnak ltalnos eszkze a pointer tpus. Egy pointer tpus vltoz rtke (els megkzeltsben) egy meghatrozott tpus dinamikus vltoz. Programozs Alapjai (2007) 539 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointer tpuskpzs C-ben Pointer tpus vltozt az albbi mdon deklarlhatunk: tpus * vltoznv; Pldul char tpus dinamikus vltoz deklarlsa char * pc; unsigned short int tpus dinamikus vltoz unsigned short int * pi;

Programozs Alapjai (2007) 540 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointer tpuskpzs C-ben Meg kell jegyezni, hogy a * a vltozhoz ktdik, vagyis int * p ktfle rtelmezse kzl: A *p egy int tpus (dinamikus) vltoz A p egy int* (int-re mutat pointer) tpus vltoz az els alkalmazsval lehet helyesen rtelmezni a kvetkez deklarcikat: int *p, r; Helyesen: *p s r mindketten int tpus vltozk Helytelenl: p s r mindketten int* tpus vltozk Ezrt szoks a tpusmdost *-ot szorosan a vltozhoz, s nem a tpushoz rni

Programozs Alapjai (2007) 541 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointer tpuskpzs C-ben Pointer tpust az albbi mdon definilhatunk: typedef tpus *jnv; vagyis egy vltozdeklarcihoz hasonlan, csak a vltoznv helyett az j tpus neve szerepel. Pldul typedef unsigned long int *ulip; ulip p; Programozs Alapjai (2007) 542 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hivatkozs, vltoz, rtk Els megkzeltsben teht egy pointer rtke egy dinamikus vltoz. Az eddigiek sorn lnyegben azonostottuk a vltozhivatkozst s a hivatkozott vltozt. A dinamikus vltozk megrtshez viszont vilgosan klnbsget kell tennnk az albbi hrom fogalom kztt: vltozhivatkozs hivatkozott vltoz vltoz rtke Programozs Alapjai (2007) 543 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Hivatkozs, vltoz, rtk A vltozhivatkozs szintaktikus egysg, teht meghatrozott formai szablyok szerint kpzett jelsorozat egy adott programnyelven. A vltoz a program futsa sorn a program ltal lefoglalt memriaterlet egy rsze, amelyen egy adott (elemi vagy sszetett) tpus rtk troldik. Programozs Alapjai (2007) 544 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hivatkozs, vltoz, rtk Klnbz vltozhivatkozsok hivatkozhatnak ugyanarra a vltozra, illetve ugyanaz a vltozhivatkozs a vgrehajts klnbz idpontjaiban klnbz vltozkra hivatkozhat. Egy vltozhivatkozshoz nem biztos, hogy

egy adott idben tartozik hivatkozott vltoz. Programozs Alapjai (2007) 545 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointer tpus mveletei Tegyk fel, hogy a mveletek definilsban szerepl p, q vltozk deklarcija a kvetkez: typedef E *PE; PE p, q; Programozs Alapjai (2007) 546 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Pointer tpus mveletei j dinamikus vltoz ltestse p=malloc(sizeof(E)) A malloc(S) fggvny lefoglal egy S mret memriaterletet a program szmra. A sizeof(E) megadja, hogy egy E tpus vltoz mekkora helyet ignyel a memriban. A malloc(sizeof(E)) hatsra teht ltrejn egy j E tpus rtk trolsra (is) alkalmas vltoz, s ez a vltoz lesz a p rtke. Programozs Alapjai (2007) 547 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointer tpus mveletei Pointer dereferencia *p

A * mvelet segtsgvel rhetjk el a p rtkt vagyis a dinamikus vltozt. A *p vltozhivatkozs a p rtkre, vagyis a dinamikus vltozra hivatkozik, teht a *p rtke a dinamikus vltoz rtke lesz. Programozs Alapjai (2007) 548 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointer tpus mveletei Dinamikus vltoz trlse free(p) A mvelet hatsra a p-hez tartoz memriaterlet felszabadul ezltal a dinamikus vltoz megsznik. A mvelet vgrehajtsa utn a p pointerhez nem tartozik rvnyes vltoz, ezrt a *p vltozhivatkozs vgrehajtsa jobb esetben azonnali futsi hibt eredmnyez. (Rosszabb esetben pedig olyan lappang hibt, aminek az

eredmnye a program egy teljesen ms pontjn jelenik meg.) Programozs Alapjai (2007) 549 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointer tpusmveletei A statikus vltozhivatkozshoz tartoz vltoz a blokk vgrehajtsnak megkezdstl a befejezsig ltezik. Dinamikus vltozhivatkozshoz tartoz vltozk a pointer tpus mveleteivel hozhatk ltre s szntethetk meg. Programozs Alapjai (2007) 550 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointer tpus mveletei A dimamikus vltoz ltrehozsra teht a malloc(), megszntetsre a free() fggvny szolgl: int *p; p = malloc(sizeof(int)); Vltoz p *p = 3; *p *p += 6; free(p); Programozs Alapjai (2007) rtk *p 9 3 551

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointer tpus mveletei Null-pointer, konstans rtk NULL Minden pointer adattpus rtkhalmaznak eleme a NULL rtk. Ha a p vltoz NULL, akkor biztos, hogy a *p vltozhivatkozshoz nem tartozik dinamikus vltoz. rtkads q=p A mvelet vgrehajtsa utn a *q is ugyanarra a dinamikus vltozra fog hivatkozni, mint *p. Programozs Alapjai (2007) 552 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Pointer tpus mveletei A dimamikus vltoz ltrehozsra teht a malloc(), megszntetsre a free() fggvny szolgl: int *p = NULL, *q = NULL; p = malloc(sizeof(int)); Vltoz rtk p din.v. NULL *p = 3; q din.v. NULL q = p; din.v. 9 3 *q += 6; free(q); Programozs Alapjai (2007) 553

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointer tpus A pointer tpus az rtkads s a dereferencia segtsgvel lehetv teszi dinamikus vltozk sszekapcsolst, ezltal komplex adatszerkezetek ltrehozst. Erre a ksbbiekben tbb pldt is lthatunk majd. Programozs Alapjai (2007) 554 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointer tpus mveletei Egyenlsg relcis mvelet p == q

A mvelet rtke akkor s csak akkor igaz, p s q rtke megegyezik, vagyis az *p s *q ugyanarra a vltozra hivatkozik, vagy mindkett NULL. Nem egyenl relcis mvelet p != q A mvelet rtke akkor s csak akkor igaz, ha p s q rtke nem egyezik meg, vagyis az *p s *q klnbz vltozkra hivatkoznak, vagy az egyik NULL. Programozs Alapjai (2007) 555 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointer tpus A pointer tpus msik megkzeltse a vltoz fogalmbl indul ki. A gpi megvalstst tekintve minden vltozhoz tartozik egy memriamez, ezrt a p pointer tpus vltoz rtke egy msik

vltozhoz tartoz memriamez cmeknt rtelmezhet. Ez az rtelmezs egybknt egybeesik a pointer tpus megvalstsval. Programozs Alapjai (2007) 556 Loklis vltozk Adminisztrcis elemek Dinamikus vltozk, szabad terlet Heap Statikus memria Linux alatt logikailag C0000000 minden programnak BF800000 sajt memriatartomnya van Pointer tpus vltoz 4 bjt hosszban a hozz 40000000 tartoz dinamikus vltozhoz foglalt

memriamez kezdcmt 08048000 tartalmazza. Verem UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointer tpus megvalstsa *p ??? p =0x40000000 Program kd 00000000 Programozs Alapjai (2007)

557 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointer tpus mveletei A cmkpz mvelet p = &i A mvelet meghatrozza egy vltozhoz tartoz memria mez cmt. Ha egy p pointer tpus vltoz rtke az i vltozhoz tartoz memria cme, akkor azt mondjuk, hogy a p i-re mutat. Programozs Alapjai (2007) 558 Az & mvelet teht egy vltoz memriacmt adja vissza, gy egy pointer rtke akr egy globlis vagy loklis statikus vltoz is lehet. Arra azrt figyeljnk, C0000000

hogy a loklis L vltozk csak addig BF800000 lteznek, mg az p1 =&L=0xBF8416F0 adott blokkbl p2 =&G=0x0804FD68 ki nem lpnk. G Verem Statikus memria UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointer tpus mveletei 08048000

Programozs Alapjai (2007) Program kd 559 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointer tpus mveletei Az & s a * jobbasszociatv mveletek s magas precedencijak. int i,j; int *p; /* a *p memria mezn int egy eleme trolhat */ /* lehetne egytt is deklarlni: int *p,i,j; */ p = &i; /* p i-re mutat */ j = *p; /* hatsa ua., mint j = i; */ *p = 2; /* hatsa ua., mint i = 2; */

j = *p + 1; /* hatsa ua., mint j = i + 1; */ *p += 1; /* hatsa ua., mint i += 1; */ ++*p; /* hatsa ua., mint ++i; */ (*p)++; /* hatsa ua., mint i++; */ Programozs Alapjai (2007) 560 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointer tpus A prioritsi elrs cskken sorrendben

a egyoperandus mveletek ( -, ++, --, !, ~, &, * ) a multiplikatv mveletek ( *, /, % ) az additv mveletek ( +, - ) bitlptets ( <<, >> ) a kisebb-nagyobb relcis mveletek ( <=, >=, <, > ) az egyenl-nem egyenl relcis mveletek ( ==, != ) bitenknti 's' mvelet ( & ) bitenknti 'kizr vagy' mvelet ( ^ ) bitenknti 'vagy' mvelet ( | ) a logikai 's' mvelet ( && ) a logikai 'vagy' mvelet ( || ) a feltteles mvelet ( ? : ) rtkad mvelet ( =, +=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |= ) szekvencia mvelet ( , )

Programozs Alapjai (2007) 561 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk void * A void tpust mr ismerjk: ez az amelynek az rtkkszlete 0 elem. Mirt van szksg void tpusra mutat pointerre vagy ilyen tpus dinamikus vltozra? A void* egy specilis, gynevezett tpustalan pointer. Az ilyen tpus pointerek csak memriacmek trolsra alkalmasak, a dereferencia mvelet alkalmazsa rjuk rtelmetlen. Viszont az rtkads mindkt oldaln hasznlhatak. Programozs Alapjai (2007) 562 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvny argumentumok A fggvnymveletnl a paramterek kezelse rtk szerint trtnik, amely csak bemen md paramter hasznlatt teszi lehetv. Ha kimen md paramterre is szksgnk van, akkor ennek kezelst neknk kell megoldani pointer segtsgvel. A csere fggvnymvelet feladata az argumentumok rtknek megcserlse. Programozs Alapjai (2007) 563 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvny argumentumok Ha csak gy deklarljuk a csere fggvnyt

csere { int m = x = y = } (int x, int y) m; x; y; m; akkor a csere(a, b); nem vgzi el a csert, hiszen csak az a s b vltoz rtkt kapta meg s ezeket hasznlta a loklis x, y, m vltozknl. Programozs Alapjai (2007) 564 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Fggvny argumentumok t kell teht adni az a s b vltozk cmt, hogy az rtkk tnylegesen megcserlhet legyen: csere (&a, &b); Ekkor a csere fggvnymvelet deklarcija: csere { int m *px *py } (int *px, int *py) m; = *px; = *py; = m; Programozs Alapjai (2007) 565

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvny argumentumok Ha nem hasznlunk globlis vltozkat, akkor kimen md argumentum kezelsre kielgt megoldst ad a kvetkez sma is: A loklis vltozban lv rtket a return utasts eltt adjuk t az aktulis paramternek csinalValamit (int *px, int *py) { int x, y; ... *px = x; *py = y; return; } Programozs Alapjai (2007) 566 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Fggvny argumentumok Ha nem hasznlunk globlis vltozkat, akkor be- s kimen md argumentum kezelsre kielgt megoldst ad a kvetkez sma is: Az aktulis paramterek rtkt loklis vltozba tesszk, majd ezek rtkt a return utasts eltt visszaadjuk aktulis paramternek csinalValamit (int *px, int *py) { int x, y; x = *px; y = *py; ... *px = x; *py = y; return; } Programozs Alapjai (2007) 567 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Msodfok egyenlet Problmafelvets: Msodfok egyenlet vals gykeinek meghatrozsa. Specifikci: Input a,b,c vals szm Output x,y vals szm, a msodfok egyenlet gykei, ha vannak, klnben egy szveg, hogy nincs vals gyk. Programozs Alapjai (2007) 568 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Msodfok egyenlet Algoritmustervezs: A problma megoldsa olyan fggvnymvelettel

adhat meg, amelynek hrom bemen paramtere van, az egyenlet egytthati, s kt kimen paramtere van, a kt vals gyk, tovbb a fggvny logikai rtket ad vissza, amely akkor s csak akkor lesz igaz, ha van vals gyk. A kzismert megoldkpletet hasznljuk. Programozs Alapjai (2007) 569 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Msodfok egyenlet bool megoldo( -> double a, -> double b, -> double c, <- double x1, <- double x2) Valos=true a==0.0 i b==0.0

i Valos=false n d= (b*b)-4*a*c n x1=-c/b; x2=x1 d<0.0 i Valos=false Programozs Alapjai (2007) n x1 s x2 kiszmolsa 570

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Msodfok egyenlet /* Msodfok egyenlet vals gykeinek meghatrozsa a * megoldo fggvnnyel. * 1998. mrcius 31. Dvnyi Kroly, [email protected] */ #include #include typedef enum {false, true} boolean; >>> Programozs Alapjai (2007) 571 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Msodfok egyenlet boolean megoldo(double a, double b, double c, /* egytthatk double *x1, double *x2) /* gykk { double d; /* a diszkriminns boolean valos; /* van-e megolds valos = true; if (a == 0.0) { if (b == 0.0) { /* az egyenlet elfajul valos = false; } else { *x1 = -(c / b); *x2 = *x1; } } else { */ */ */ */

*/ >>> Programozs Alapjai (2007) 572 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Msodfok egyenlet d = b * b - 4.0 * a * c; if (d < 0.0) { /* nincs vals gyke */ valos = false; } else { *x1 = (-b + sqrt(d)) / (2.0 * a); *x2 = (-b - sqrt(d)) / (2.0 * a); /* a gykk pontosabb kiszmolsa */ if (fabs(*x1) > fabs(*x2)) { *x2 = c / (*x1 * a); } else if (*x2 != 0) {

*x1 = c / (*x2 * a); } } } return valos; } >>> Programozs Alapjai (2007) 573 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Msodfok egyenlet main() { double a, b, c, x, y; /* a fprogram vltozi */ printf("Krem az els egyenlet egytthatit!\n"); scanf("%lg%lg%lg%*[^\n]", &a, &b, &c); getchar();

if (megoldo(a, b, c, &x, &y)) { printf("Az egyenlet gykei: %20.10f s %20.10f\n", x, y); } else { printf("Az egyenletnek nincs vals megoldsa!\n"); } >>> Programozs Alapjai (2007) 574 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Msodfok egyenlet printf("Krem a msodik egyenlet egytthatit!\n"); scanf("%lg%lg%lg%*[^\n]", &a, &b, &c); getchar(); if (megoldo(a, b, c, &x, &y)) { printf("Az egyenlet gykei: %20.10f s %20.10f\n", x, y); } else { printf("Az egyenletnek nincs vals megoldsa!\n");

} } Programozs Alapjai (2007) 575 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Msodfok egyenlet Az x1 s x2 kimen paramterek, ezrt talaktjuk a deklarcit. Ezt megtehetjk, hiszen nem hasznlunk globlis vltozkat. Programozs Alapjai (2007) 576 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Msodfok egyenlet boolean megoldo(double a, double b, double c, /* egytthatk double *x1, double *x2) /* gykk { double d; /* a diszkriminns boolean valos; /* van-e megolds double mx1, mx2; /* munkavltozk x1 s x2 helyett valos = true; if (a == 0.0) { if (b == 0.0) { /* az egyenlet elfajul valos = false; } else { mx1 = -(c / b); mx2 = mx1; } } else { d = b * b - 4.0 * a * c;

*/ */ */ */ */ */ >>> Programozs Alapjai (2007) 577 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Msodfok egyenlet if (d < 0.0) { /* nincs vals gyke */ valos = false; } else { mx1 = (-b + sqrt(d)) / (2.0 * a);

mx2 = (-b - sqrt(d)) / (2.0 * a); /* a gykk pontosabb kiszmolsa */ if (fabs(mx1) > fabs(mx2)) { mx2 = c / (mx1 * a); } else if (mx2 != 0) { mx1 = c / (mx2 * a); } } } *x1 = mx1; *x2 = mx2; return valos; } Programozs Alapjai (2007) 578 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tmb tpus Algoritmusok tervezsekor gyakran elfordul, hogy adatok sorozatval kell dolgozni, vagy

mert az input adatok sorozatot alkotnak, vagy mert a feladat megoldshoz kell. Tegyk fel, hogy a sorozat rgztett elemszm (n) s mindegyik komponensk egy megadott (elemi vagy sszetett) tpusbl (E) val rtk. Programozs Alapjai (2007) 579 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tmb tpus Ekkor teht egy olyan sszetett adathalmazzal van dolgunk, amelynek egy eleme A = (a0, ... ,an-1) ahol ai eleme E (i=0, ... ,n-1). Ha az ilyen sorozatokon a kvetkez mveleteket rtelmezzk, akkor egy (absztrakt) adattpushoz jutunk, amit Tmb tpusnak neveznk.

Jelljk a Tmb tpust T-vel, a 0..n-1 intervallumot pedig I-vel. Programozs Alapjai (2007) 580 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tmb tpus mveletei Kiolvas( -> A:T; -> i:I; <- x:E) Adott i eleme I -re az A sorozat i. komponensnek kiolvassa adott x, E tpus vltozba. Mdost( <-> A:T; -> i:I; -> y:E) Adott i eleme I -re az A sorozat i. komponensnek mdostsa adott y, E tpus rtkre. X=Y rtkad mvelet. Programozs Alapjai (2007)

581 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Riadlnc Problmafelvets: Adott n szm embert tartalmaz kzssg, akik riadlncot akarnak alkotni. A kzssg minden tagjra meghatrozott, hogy kit rtestsen. Eldntend, hogy egy ilyen hozzrendels valban riadlncot alkot-e? Programozs Alapjai (2007) 582 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Riadlnc

Specifikci: Azonostsuk a kzssg tagjait az [0..n-1] intervallum elemeivel. Input Egy n elem szmsorozat. Output Igen/Nem tetszleges szvegkrnyezetben. Programozs Alapjai (2007) 583 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Riadlnc Algoritmustervezs: A riadlnc egy Lnc nev szmsorozattal adhat meg, amelynek i. eleme annak az embernek a sorszma, akit az i-nek rtesteni kell. A Lnc sorozat akkor s csak akkor valdi riadlnc, ha brmelyik elemtl elindulva a Lnc szerinti

hozzrendelst kvetve visszajutunk i-be gy, hogy kzben minden elemet rintettnk. Ezt azonban elg egy tetszleges elemtl kezdve kiprblni. Programozs Alapjai (2007) 584 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Riadlnc Struktradiagramm: Riadlnc Beolvass Szm = Elstl az elsig rintett elemek szma Szm==n s Kv==Els i n Inicializls Jrtam mr itt?

Kv=0 Szm=0 Jrtam mr itt bejegyzse s szmols i=Kv Kiolvas(Lnc,i,Kv) Programozs Alapjai (2007) J Mdost(Lnc,i,n) Nem j Szm++ 585 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Riadlnc Struktradiagramm: Beolvass i = 0 -> n-1 Tjkoztats Ki(i) Be(e) (e<0) || (n<=e) Ki(Hibs adat) Mdost(Lnc,i,e) Be(e) Programozs Alapjai (2007) 586 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Tmb tpuskpzs C-ben Tmb tpus vltozt az albbi mdon deklarlhatunk: tpus vltoznv[elemszm]; Pldul char tpus elemekbl ll 5 elem tmb deklarlsa char ct[5]; unsigned short int tpus 20 elem tmb unsigned short int it[20]; Programozs Alapjai (2007) 587 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tmb tpuskpzs C-ben

Tmb tpust az albbi mdon definilhatunk: typedef tpus jnv[elemszm]; vagyis egy vltozdeklarcihoz hasonlan, csak a vltoznv helyett az j tpus neve szerepel. Pldul typedef int tomb20[20]; tomb20 t; Programozs Alapjai (2007) 588 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tmb tpus mveletei C-ben A Kiolvas s a Mdost mveletek megvalstsa a tmbelem-hivatkozssal trtnik. A tmbelem-hivatkozsra a []

zrjelprt hasznljuk Felfoghatjuk a []-t az indexels mvelet opertornak is, aminek az eddigi legmagasabb precedencival kell rendelkeznie s balasszociatv. Programozs Alapjai (2007) 589 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tmb tpus mveletei C-ben A prioritsi elrs cskken sorrendben

elemkivlasztsok ( [] ) a egyoperandus mveletek ( -, ++, --, !, ~, &, * ) a multiplikatv mveletek ( *, /, % ) az additv mveletek ( +, - ) bitlptets ( <<, >> ) a kisebb-nagyobb relcis mveletek ( <=, >=, <, > ) az egyenl-nem egyenl relcis mveletek ( ==, != ) bitenknti 's' mvelet ( & ) bitenknti 'kizr vagy' mvelet ( ^ ) bitenknti 'vagy' mvelet ( | ) a logikai 's' mvelet ( && ) a logikai 'vagy' mvelet ( || ) a feltteles mvelet ( ? : ) rtkad mvelet ( =, +=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |= ) szekvencia mvelet ( , ) Programozs Alapjai (2007)

590 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tmb tpus mveletei C-ben Kiolvas(a, i, x) x = a[i] Mdost(a, i, x) a[i] = x Ha az a s a b is tmb tpus vltoz, akkor az a = b rtkads nem megengedett, mert a baloldalon nem vltozhivatkozs ll. Errl ksbb mg bvebben lesz sz. Programozs Alapjai (2007) 591

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tmb tpus C-ben Meg kell jegyezni, hogy a C nyelvben a tmb indexelse minden esetben 0-val kezddik, azaz egy int t[20] deklarci esetn t[0],t[1],,t[19] lesznek a tmb elemei. A C nyelvben viszont nincs indexellenrzs, azaz egy int t[20] deklarci esetn hivatkozni lehet pldul a t[20] vagy t[-1] elemekre is, ez azonban nagyon csnya futsi hibkat eredmnyezhet. Programozs Alapjai (2007) 592 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Riadlnc /* Adott n szm embert tartalmaz kzssg. Eldntend, * hogy riadlncot alkotnak-e? * 2006. augusztus 9. Gergely Tams, [email protected] */ #include #define N 8 #define ELSO 0 main () { int A[N]; int e,i; int kov; int szam; /* a sorozat elemeinek szma */ /* az els vizsgland elem sorszma */ /* a sorozatot trol tmb /* munkavltozk /* a kvetkez vizsgland /* szmll

Programozs Alapjai (2007) */ */ */ */ >>> 593 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Riadlnc printf("Krem a %d elem sorozatot, amelyrl ", N); printf("eldntm, hogy riadlnc-e!\n"); for(i = 0; i < N; ++i) { /* beolvass */ printf("%d. kit rtest ? ", i); scanf("%d%*[^\n]", &e); getchar(); while((e < 0) || (N <= e)) { printf("Hibs adat!\nKrem jra: ");

scanf("%d%*[^\n]", &e); getchar(); } A[i] = e; } Programozs Alapjai (2007) >>> 594 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Riadlnc kov = ELSO; szam = 0; do { i = kov; kov = A[i]; A[i] = N; szam++;

} while (A[kov] != N); /* inicializss */ /* tovbblps */ /* jrtam mr itt bejegyzse */ /* jrtam mr itt? */ if ((szam == N) && (kov == ELSO)) { printf("A szmsorozat riadlnc.\n"); } else { printf("A szmsorozat nem riadlnc.\n"); } } Programozs Alapjai (2007) 595 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk ltalnos absztrakt tmb tpus

Legyen E tetszleges tpus Legyenek I1, ... ,Ik tetszleges sorrendi tpusok Legyen I=I1 ... Ik = { (i1, ... ,ik) | i1 in I1, ... ,ik in Ik), teht az I1, ... ,Ik halmazok direktszorzata. Kpezhetjk azt a T=Tmb(I1, ... ,Ik,E) j tpust, amelynek rtkhalmaza az I-bl E-be val fggvnyek halmaza, azaz: { A | A : I --> E } A k-t a tmb dimenzijnak nevezzk. Programozs Alapjai (2007) 596 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk ltalnos absztrakt tmb tpus A T=Tmb(I1, ... ,Ik,E) k dimenzis tmb tpus az albbi hrom mvelettel rendelkezik Kiolvas( -> A:T; -> i1:I1; ... ; -> ik:Ik; <- x:E) A mvelet vgrehajtsa utn x==A(i1, ... ,ik).

Mdost( <-> A:T; -> i1:I1; ... ; -> ik:Ik; -> x:E) A mvelet vgrehajtsa utn A(i1, ... ,ik)==x s a tbbi argumentumokra A rtke nem vltozik. Az X=Y rtkads rtelmezett, ha az X s Y vltozk tpusa T Programozs Alapjai (2007) 597 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk ltalnos absztrakt tmb tpus Vegyk szre, hogy a T=Tmb(I1, ... ,Ik,E) tpus felfoghat gy, mint T=Tmb(I1, T2), ahol T2=Tmb(I2, ... ,Ik,E). Tovbb az sem jelent megktst, hogy minden egyes Ij intervallum bal vgpontja a 0 legyen, hiszen az [n..m] intervallum elemei egyszeren transzformlhatk a [0..(m-n)] intervallumra.

Ezek alapjn a C nyelven mr ltre tudunk hozni tbbdimenzis tmbket is. Programozs Alapjai (2007) 598 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk ltalnos tmb tpus C nyelven Legyen T=Tmb(I1, ... ,Ik,E) ahol Ij a [0..Nj-1] intervallum Ennek a tpusnak a defincija C nyelven: typedef E T[N1][N2]...[Nk]; Programozs Alapjai (2007) 599

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk ltalnos tmb tpus C nyelven Pldul tpusdefincik typedef int tomb[100]; typedef double matrix[10][10]; typedef char szoveg[21]; vltozdeklarcik matrix m; /* az elz tpussal*/ char s[21]; int vector[20]; Programozs Alapjai (2007) 600 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk ltalnos tmb tpus C nyelven A tmbelem-hivatkozs itt is a [] zrjelprral trtnik gy, hogy minden indexet kln zrjelek kz tesznk: m[5][7] Ez tulajdonkppen nem ms, mint a [] opertor tbbszri alkalmazsa, hiszen: m egy tmb, aminek egy eleme tmb, aminek egy eleme double vltoz m[5] egy tmb, aminek egy eleme double vltoz m[5][7] egy double vltoz Programozs Alapjai (2007) 601 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Tmb tpus mveletei C nyelven A Kiolvas s a Mdost mveletek megvalstsa most is a tmbelemhivatkozssal trtnik. Kiolvas(a,i1, ... ,ik,x) x = a[i1]...[ik] Mdost(a,i1, ... ,ik,x) a[i1]...[ik] = x Ha az a s b is T tmb tpus vltoz, akkor az a = b rtkads nem megengedett, mert a baloldalon nem vltozhivatkozs ll. Errl ksbb mg bvebben lesz sz. Programozs Alapjai (2007) 602 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tmb gpi szint megvalstsa A lehetsges gpi megvalsts vizsglatnl abbl kell kiindulni, hogy a memria lineris

szerkezet. Tmb tpus vltoz szmra trtn helyfoglals azt jelenti, hogy minden tmbelem, mint vltoz szmra memrit kell foglalni. Feltehetjk, hogy egy adott tmb vltozhoz a tmbelemek szmra foglalt trterlet sszefgg mezt alkot. Programozs Alapjai (2007) 603 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tmb gpi szint megvalstsa A megvalsts teht azt jelenti, hogy a lefoglalt memriaterlet kezdcme s az i1, ... ,ik indexkifejezsek rtkbl ki kell szmtani az A[i1]...[ik] tmbelem Cm(A[i1]...[ik]) cmt. Ezt a hozzrendelst az A tmbvltozhoz tartoz cmfggvnynek nevezzk. Nyilvnval, hogy a Cm fggvny felrhat

t0+TCF(i1,...,ik) alakban, ahol t0 az A vltozhoz foglalt memriamez kezdcme, a TCF fggvny pedig a tmb tpus ltal meghatrozott s tmb-cmfggvnynek nevezzk. Programozs Alapjai (2007) 604 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tmb gpi szint megvalstsa Olyan TCF fggvnyt keresnk, amely egyszeren, gyorsan kiszmthat i1, ... ,ik fggvnyben, teht c0+c1*i1+...+ck*ik lineris alakban. Legyen a szbanforg tmb tpus defincija a kvetkez: typedef E T[N1]...[Nk]; T A; ahol N1, ... ,Nk konstansok.

Programozs Alapjai (2007) 605 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tmb gpi szint megvalstsa Legyen h=sizeof(E). Ekkor az A vltoz szmra foglaland memria mrete h*(N1*...*Nk). Alkalmas TCF fggvnyt kaphatunk gy, hogy az (i1,...,ik) indexrtkek halmazn definilunk egy < lineris rendezsi relcit s a Sorsz(i1,...,ik) sorszmfggvnnyel kpezzk a h*Sorsz(i1,...,ik) kifejezst, ahol Sorsz(i1,...,ik) a rendezsben az (i1,...,ik) elemet megelz elemek szma. A leggyakrabban rendezsknt az gynevezett lexikografikus rendezst hasznljk. Programozs Alapjai (2007)

606 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tmb gpi szint megvalstsa (i1, ... ,ik)

Szoftverfejleszts Tanszk Tmb gpi szint megvalstsa Ktdimenzis esetben a lexikografikus elrendezst sorfolytonos elrendezsnek is nevezik, mert egy A tmb elemei ekkor tblzatban gy rendezhetk el: +---------+-------+---+---------+---+-----------+ +------+-----+---+----------+---+------+ | A[0][0] |A[0][1]| | A[0][j] | | A[0][N-1] | | 0 | 1 | | j | | N-1 | |---------+-------+---+---------+---+-----------| |------+-----+---+----------+---+------| | A[1][0] |A[1][1]| | | | | | N | N+1 | |

| | | |---------+-------+---+---------+---+-----------| |------+-----+---+----------+---+------| | . | | | | | | | . | | | | | | | . | | | | |

| | . | | | | | | |---------+-------+---+---------+---+-----------| |------+-----+---+----------+---+------| | A[i][0] | |...| A[i][j] |...| A[i][N-1] | |(i-1)N| |...| (i-1)N+j |...| iN-1 | |---------+-------+---+---------+---+-----------| |------+-----+---+----------+---+------| | . | | | | | | | . | | | | |

| | . | | | | | | | . | | | | | | |---------+-------+---+---------+---+-----------| |------+-----+---+----------+---+------| |A[M-1][0]| | |A[M-1][j]| |A[M-1][N-1]| |(M-1)N| | | (M-1)N+j | | MN-1 | +---------+-------+---+---------+---+-----------+ +------+-----+---+----------+---+------+

Programozs Alapjai (2007) 608 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tmb tpus megvalstsa A C is a lexikografikus rendezs szerint szmtja a cmfggvnyt. Tmbk hasznlata nagy krltekintst ignyel, mert a program vgrehajtsa kzben nincs indexhatr-ellenrzs, gy double m[10][10]; deklarci esetn m[0][10]; ugyanaz mint m[1][0]; Programozs Alapjai (2007) 609

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tmb tpus megvalstsa Plda: int i, j, a[3][3]; for(i=0; i<9; ++i) a[0][i]=i; for(i=0; i<3; ++i) { for(j=0; j<3; ++j) printf("%d ", a[i][j]); printf("\n"); } Az output: 0 1 2 3 4 5 6 7 8 Programozs Alapjai (2007) 610

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Ciklikus A Riadlnc algoritmusban a bemen adatot trol tmb az algoritmus vgrehajtsa sorn mdosul. Ez elkerlend akkor, ha a bemen adaton ms mveletet is kell vgeznnk. Ezt a kvetelmnyt is kielgt megoldst lthatunk a Ciklikus nev fggvnyben. Az elnevezs arra utal, hogy az ilyen sorozatokat a matematikban ciklikus permutciknak nevezik. Programozs Alapjai (2007) 611 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Ciklikus Konvenci: Problma megoldst program helyett kifejezhetjk eljrs vagy fggvny formjban is, ekkor azonban fel kell tntetni az eljrs/fggvny hasznlathoz szksges globlis programegysgeket. Programozs Alapjai (2007) 612 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Ciklikus Struktradiagramm: bool Ciklikus(-> A : Sorozat) Inicializls Kv=Els; Szm=0 Szm==N || Kv==Els Kv=A[Kv]

return (Szm==N && Kv==Els) Szm++ Programozs Alapjai (2007) 613 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tmb mint paramter Egy fggvny paramtere lehet tmb tpus is. Ilyen esetben azonban csak a tmb cme, vagyis egy pointer kerl tadsra, gy a tmb elemein vgzett brmely mdosts kihat az eredeti tmbre. Programozs Alapjai (2007) 614

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Ciklikus /* Globlis programegysgek a Ciklikus fggvnyhez */ #define N ??? /* a sorozat elemeinek szma */ #define ELSO 1 typedef int bool; bool ciklikus(int A[] /* A paramter egy tmb */) /* Eldnti, hogy az A sorozat ciklikus permutci-e? * 2005. oktber 13. * Gergely Tams, [email protected] */ { int kov = ELSO, szam = 0; /* kvetkez s szmll */ do { kov = A[kov]; szam++; /* tovbblps */ } while((Kov != ELSO) && (Szam != N)); return (kov == ELSO) && (Szam == N);

} Programozs Alapjai (2007) 615 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tmb mint paramter Mivel C-ben nincs indexhatr-ellenrzs, s a paramterknt tadott tmbnek csak a cmt kapja meg a fggvny, ezrt ha a fggvny T paramtertpusa E tpus elemekbl ll egydimenzis tmb, ennek a pontos mrett a fggvny deklarcijban nem kell megadni. Programozs Alapjai (2007) 616 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Tmb mint paramter Az E tpus mrett viszont pontosan ismerni kell, teht ha a T tbbdimenzis tmb tpus, azaz E is legalbb egydimenzis tmb tpus, akkor E minden dimenzijnak a mrett pontosan fel kell tntetni, azaz csak T legels dimenzijnak mrete hagyhat el. Pl: int fgv(int tomb[][10][3]); Ez az egyes elemek cmnek pontos kiszmtsa vgett szksges. Programozs Alapjai (2007) 617 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egy komplexebb adatszerkezet A grf megvalsthat tmbk segtsgvel tbbfle mdon is, attl fggen, hogy milyen

mveleteket fogunk vgezni rajta: Kt adott pont kztt van-e l? Adott pontbl hny l vezet ki, s hov? Kell-e trlni leket vagy elg ha a bemen lek szmt cskkentjk? 1 2 3 4 1 2 3 4 +---+---+---+---+ | 0 | 1 | 0 | 1 | | 0 | 0 | 0 | 1 | | 1 | 1 | 0 | 0 | | 0 | 0 | 1 | 1 | +---+---+---+---+ 1 2 3 4

Ki +--+ | 2| | 1| | 2| | 2| +--+ Programozs Alapjai (2007) +---+---+---+---+ | 2 | 4 | | | | 4 | | | | | 1 | 2 | | | | 3 | 4 | | |

+---+---+---+---+ Be +--+ | 1| | 2| | 1| | 3| +--+ 618 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Sztringek C-ben C-ben, karaktersorozatot egyszeren egy karakteres tmbbel ksztnk. char str[h]; A char str[h] vltoz szmra h bjt foglaldik s maximum h-1 karakter hossz szveg trolhat benne.

A szveg maximlis hosszra (a fizikai korltokon kvl) nincs korltozs. Programozs Alapjai (2007) 619 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Sztringek C-ben Az str szveg i. karakterre az str[i-1] vltozhivatkozssal hivatkozhatunk. A szveg vgt a szveghez tartoz utols karakter utn elhelyezett '\0' karakter jelzi. Ezrt van, hogy egy h hosszsg karaktertmbben maximum h-1 rtkes karaktert, ezltal maximum h-1 karakter hossz szveget trolhatunk. Programozs Alapjai (2007) 620

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Sztringek C-ben Legyen char str[6]; Ekkor az "egy", "alma" s "krte" szavak s az res sztring ("") gy troldnak el str ben: e g y \0 a l m a \0 k r t e \0 \0

Programozs Alapjai (2007) 621 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Sztringek C-ben Lthat teht, hogy a karaktertmb szmra lefoglalt hely valjban csak egy fels korltot jelent a sztring hosszra nzve. A sztring aktulis rtke ettl a korlttl lefel brmikor eltrhet. A sztringek hossznak meghatrozsa viszont gyakran szksges. Ezt a kvetkez mdokon tehetjk meg. Programozs Alapjai (2007) 622 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Sztringek A karaktersorozat hossznak meghatrozsra egy fggvnymveletet runk: int strlen(char s[]) /* s hossznak kiszmtsa */ { int i = 0; while (s[i] != '\0') { ++i; } return i; } Programozs Alapjai (2007) 623 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Sztringek Vagy a C nyelv automatikus konverziit kihasznlva: int strlen(char s[]) /* s hossznak kiszmtsa */ { int i = 0; while (s[i] != 0) { ++i; } return i; } Programozs Alapjai (2007) 624 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Sztringek Mg tbb automatikus konverzit kihasznlva: int strlen(char s[])

/* s hossznak kiszmtsa */ { int i = 0; while (s[i]) { ++i; } return i; } Programozs Alapjai (2007) 625 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Sztringek megadsa A sztringek valban karaktertmbk, teht megadhatk gy, mint egy tmb: {'s','z','t','r','i','n','g','\0'} Van azonban egy egyszerbb forma is: "sztring"

Az ilyen mdokon megadott sztringkonstansok hasznlhatk inicializlsra, azaz: char str[20] = "sztring"; vagy akr char str[] = "sztring"; Programozs Alapjai (2007) 626 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Sztringek megadsa Hogyan adjunk meg olyan sztringet, amelyben szerepel az idzjel? {'_', '"', '_', '\'', '_', '\0'} Mint a karaktereknl, itt is hasznlhat az escape karakter: "_\"_'_"

Az sszes escape szekvencia hasznlhat, ami a karaktereknl. Az egyetlen klnbsg, hogy a ktfajta hatrol karakter kzl csak sajtot kell escape szekvencival megadni. Programozs Alapjai (2007) 627 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Mveletek sztringekkel A sztringeken rtelmezett alapvetbb mveletek: Hossz A sztring hossznak meghatrozsa rtkads A sztring rtknek egyenlv ttele egy msik sztringgel sszefzs

Kt sztring sszefzse sszehasonlts Kt sztring lexikografikus sszeahsonltsa Karakter elrse A sztring egy betjnek kzvetlen elrse Programozs Alapjai (2007) 628 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Mveletek sztringekkel Mivel a sztring nem elemi tpus, hanem egy specilisan rtelmezett tmb, a mveleteit fggvnyekkel valstottk meg. Ezeket a fggvnyeket az #include sor megadsa utn tudjuk hasznlni.

Programozs Alapjai (2007) 629 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Mveletek sztringekkel Hossz size_t strlen(const char *s); Visszaadja az s hosszt. rtkads strcpy(char *dest, const char *src); tmsolja az src rtkt a dest-be. A sima rtkads mvelet (=) tmbkrl lvn sz nem mkdik. Az a programoz felelssge, hogy a dest tmb elg hossz legyen ahhoz, hogy az src rtkt trolni tudja. Programozs Alapjai (2007)

630 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Mveletek sztringekkel sszefzs strcat(char *dest, const char *src); Hozzfzi az src rtkt a dest-hez. Az a programoz felelssge, hogy a dest tmb elg hossz legyen ahhoz, hogy az sszefztt rtket trolni tudja. sszehasonlts int strcmp(const char *s1, const char *s2); Lexikografikusan sszehasonltja a kt sztringet, s -1, 0 vagy 1 rtkkel tr vissza attl fggen, hogy s1lexs2. Programozs Alapjai (2007) 631

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Mveletek sztringekkel Karakter elrse Ez a tmbknl szoksos [] opertorral valsthat meg. Egyb mveletek is meg vannak valstva a string.h ban, ezeket is lehet hasznlni. Linux alatt meg lehet nzni ezeket a fggvnyeket: man string Programozs Alapjai (2007) 632 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Pointerek s tmbk A programok megrtshez beszlnnk kell a pointerek s a tmbk kapcsolatrl. A C nyelvben szoros kapcsolat van a mutatk s a tmbk kztt: valamennyi mvelet, amely tmbindexelssel vgrehajthat, mutatk hasznlatval ppgy elvgezhet. ltalban az utbbi vltozat gyorsabb, de klnsen a kezdk szmra els rnzsre nehezebben rthet. Programozs Alapjai (2007) 633 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointerek s tmbk Az int a[10]; deklarci definil egy 10*sizeof(int)

bjtos memriaterletet, melynek egyes elemeire hivatkozhatunk az a[0], a[1], ... , a[9] vltozhivatkozsokkal. Programozs Alapjai (2007) 634 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointerek s tmbk Ha pa deklarcija int *pa; akkor a pa = &a[0]; rtkads gy lltja be pa-t, hogy az az a nulladik elemre mutasson, vagyis pa az a[0] elem cmt tartalmazza.

Ekkor az x = *pa; rtkads a[0] tartalmt x-be msolja. Programozs Alapjai (2007) 635 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointerek s tmbk Ha pa egy tmb adott elemre mutat, akkor definci szerint pa+1 a tmb kvetkez elemre mutat. ltalban pa-i a pa eltti i. elemre, pa+i a pa mgtti i. elemre mutat.

Programozs Alapjai (2007) 636 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointerek s tmbk gy ha pa az a[0]-ra mutat, akkor *(pa + 1) a[1] tartalmt szolgltatja, pa+i az a[i] elem cme *(pa+i) az a[i] elem rtke Ezek a megllaptsok a tmbben elhelyezked vltozk tpustl vagy mrettl fggetlenl mindig igazak. Programozs Alapjai (2007) 637

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointerek s tmbk A pointeraritmetika alapdefincija, hogy a nvekmny mrtkegysge annak az objektumnak a trbeli mrete, amire a mutat mutat. Az indexels s a pointeraritmetika kztt lthatan nagyon szoros kapcsolat van. Gyakorlatilag a tmbre val hivatkozst a fordt a tmb kezdett megcmz mutatv alaktja t. Programozs Alapjai (2007) 638 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Pointerek s tmbk Ennek hatsra a tmb neve nem ms, mint egy mutatkifejezs, amibl szmos hasznos dolog kvetkezik. Mivel a tmb neve ugyanaz, mint az illet tmb nulladik elemnek cme, a pa = &a[0]; rtkads gy is rhat, mint pa = a; Programozs Alapjai (2007) 639 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointerek s tmbk Ez azt jelenti, hogy az a[i] hivatkozs rhat

*(a+i) alakban is: a[i] kirtkelsekor a C fordt azonnal talaktja ezt *(a+i)-v; a kt alak teljesen egyenrtk. Programozs Alapjai (2007) 640 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointerek s tmbk Ha mindkt elemre alkalmazzuk az & opertort, akkor azonnal kvetkezik, hogy &a[i] s a+i szintn azonosak: a+i az a-t kvet i-edik elem cme. Programozs Alapjai (2007)

641 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointerek s tmbk Msrszrl, ha pa mutat, s pa = a; akkor azt kifejezsekben indexelhetjk: pa[i] ugyanaz mint *(pa+i) Programozs Alapjai (2007) 642

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointerek s tmbk Rviden: brmilyen tmb vagy indexkifejezs lerhat, mint egy mutat plusz egy eltols s viszont. Van azonban egy fontos klnbsg a tmbnv s a mutat kztt: A mutat vltozhivatkozs, gy pa=a, pa++ rtelmes mveletek. A tmbnv azonban nem vltozhivatkozs, gy a=pa, a++ vagy p=&a nem megengedettek! Programozs Alapjai (2007) 643 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Pointerek s tmbk Amikor a tmbnv egy fggvnynek addik t, a fggvny valjban a tmb kezdetnek cmt kapja meg. A hvott fggvnyen bell a formlis paramter teht egy cmet tartalmaz vltoz. gy mr rthet a sztringkezel fggvnyek defincija. Programozs Alapjai (2007) 644 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointerek s tmbk A fggvnydefinciban char s[]; s char *s;

egyarnt szerepelhet formlis paramterknt; azt, hogy melyiket hasznljuk, nagymrtkben az dnti el, hogy miknt rjuk le a kifejezseket a fggvnyen bell. Programozs Alapjai (2007) 645 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointerek s tmbk Amikor a tmbnv addik t valamelyik fggvnynek, a fggvny tetszse szerint hiheti azt, hogy tmbt vagy mutatt kapott, s ennek megfelelen kezelheti azt. Akr mindkt tpus mveletet hasznlhatja, ha ez clszernek s vilgosnak ltszik. Lehetsg van arra, hogy a tmbnek csupn egy rszt adjuk t valamelyik fggvnynek oly mdon, hogy a rsztmb kezdett megcmz mutatt adunk t.

Programozs Alapjai (2007) 646 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointerek s tmbk Ha pl. a egy tmb neve, akkor f(&a[2]) s f(a+2) is az a[2] elem cmt adja t a fggvnynek, mivel &a[2] s a+2 egyarnt mutatkifejezs, mindkett az a tmb harmadik elemre mutat. Programozs Alapjai (2007) 647

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointerek s tmbk A fggvny deklarcijban akr f(int arg[]) { ... } akr f(int *arg) { ... } is lehet. Ami f-et illeti, az a tny, hogy az argumentum valjban egy nagyobb tmb egy rszre vonatkozik, semmifle kvetkezmnnyel sem jr. Programozs Alapjai (2007) 648 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Pointerek s tmbk Hogyan adhatunk meg ktdimenzis tmbt paramterknt? A sorok szma nem rdekes, de az oszlopok szmt meg kell adni a helyes cmszmts rdekben. Tekintsk az a[5][35] tmbt. Lehet gy megadni a formlis paramter tpust f(int a[][35]) { ... } vagy gy f(int (*a)[35]) { ... } Programozs Alapjai (2007) 649 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointerek s tmbk

A zrjelezs szksges, mert [] magasabb priorits mvelet, mint a * mvelet. Vagyis int (*a)[35]; egy a pointert deklarl, ami egy tmbre mutat amelyik 35 egszbl ll. int *a[35]; egy a tmbt deklarl, ami 35 pointerbl ll s a pointerek egszekre mutatnak. Programozs Alapjai (2007) 650 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointerek s tmbk A kvetkez plda taln rvilgt tmbk s mutatk kztt meglv kis klnbsgre. Tekintsnk a kvetkez deklarcit! char *honap[12]; char Honap[12][20];

Szablyos vltozhivatkozsok a honap[3][4] is s Honap[3][4] is. Programozs Alapjai (2007) 651 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointerek s tmbk A Honap sszesen 240 karakterbl ll. A honap 12 pointerbl ll, amelyek mutathatnak 20 hossz sztringekre, ekkor neki is 240 karaktere van, plusz a 12 mutat. De lehet kevesebb karaktere is. Programozs Alapjai (2007)

652 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointerek s tmbk Deklarlhatunk gy is azonnal kezdrtket adva a vltozknak: char *honap[] = { "nincs 0. hnap", "janur", "februr", ... , "december" }; char Honap[][20] = { "nincs 0. hnap", "janur", "februr", ... , "december" }; Lthat, hogy a honap pointerei klnbz hosszsg szvegekre mutathattak. Programozs Alapjai (2007) 653 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Pointerek s tmbk char Honap[][20] n j f m m j j a s o n d i a e p

u z k o e n n b r r j n l g e t v c c u r

c i u i i u p e e s u i l s u u s t b m m

r u i \0 s s z e e b b 0 \0 r s s . \0 \0 \0 \0

\0 t m r e e u b \0 r r h n a p \0 s \0 e r \0 \0 \0 Programozs Alapjai (2007) 654 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointerek s tmbk char *honap[] r j g k m 0 5 10 h \0 m u s u s t b e n

\0 z b r a r j t e \0 1 6 11 p \0 c i n u s r \0 j u i \0

n a s u s o 2 7 12 n u \0 s \0 z e v e 3 8 p j p m

n r r t b Programozs Alapjai (2007) i \0 i l e e n f l i m r 4 9

c e i u b \0 s b s s e d r \0 \0 r e 0 u m a \0

c . u o e 655 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointerek s tmbk Ha tmbt kezdrtkkel szeretnnk deklarlni, akkor elhagyhat az els dimenzi megadsa, mert a kezdrtkek szmbl ez addik. Ha kevesebb kezdrtket adunk meg, mint amekkora tmbre ksbb szksgnk van, akkor termszetesen minden mretet meg kell adni.

Programozs Alapjai (2007) 656 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointerek s tmbk int t[][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; /* A t tmb 3x3-as lesz. */ int t[4][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; /* A t tmb 4x3-as lesz s az utols sor minden eleme 0 lesz. */ int t[][3] = { { 1 },

{ 4 }, { 7 }, { 9 } }; /* A t tmb 4x3-as lesz, az els oszlopot adtuk meg, a tbbi elem 0 lesz. */ Programozs Alapjai (2007) 657 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointeraritmetika Ha p mutat, akkor p++ (p--) oly mdon inkrementlja p-t, hogy az a megcmzett tetszleges tpus objektum kvetkez (elz) elemre, p += i (p -= i) pedig gy, hogy az a pillanatnyilag megcmzett elem utni (eltti) i-edik elemre mutasson.

Alkalmazhatjuk teht a pointerekre az egsz hozzads s kivons mveleteket. Programozs Alapjai (2007) 658 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointeraritmetika Mutatk kivonsa szintn megengedett: ha p s q ugyanannak a tmbnek az elemeire mutatnak, akkor p-q a p s q kztti elemek darabszma, ami csak akkor egyezik meg a kt memriacm tnyleges klnbsgvel, ha az elemek egy bjtosak. Programozs Alapjai (2007) 659

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointeraritmetika E tnyt kihasznlva megrhatjuk a strlen jabb vltozatt: int strlen (char *s) /* kiszmtja az s karakterlnc hosszt */ { char *p = s; while (*p != '\0') { p++; } return (p - s); } Programozs Alapjai (2007) 660 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Pointeraritmetika A deklarciban p kezdeti rtkeknt s-et adtuk meg, vagyis p kezdetben az s els karakterre mutat. A while ciklusban addig vizsgljuk az egymst kvet karaktereket, amg a vget jelz '\0' el nem kerl. Programozs Alapjai (2007) 661 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointeraritmetika Mivel '\0' rtke nulla, s ez a hamis rtknek felel meg, elhagyhat az explicit vizsglat. Az ilyen ciklusokat gyakran az albbi alakokban rjk:

while (*p) { p++; } while (*p) p++; Minthogy p karakterekre mutat, p++ minden alkalommal a kvetkez karakterre lpteti p-t, s p - s az tlpett karakterek szmt, vagyis a karakterlnc hosszt adja meg. Programozs Alapjai (2007) 662 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointeraritmetika Az emltett mveleteken kvl (mutat s integer sszeadsa s kivonsa, kt mutat kivonsa s sszehasonltsa) minden ms mutatmvelet tilos! Nincs megengedve kt mutat sszeadsa, szorzsa, osztsa, mutatk lptetse, maszkolsa, sem pedig float vagy double mennyisgeknek mutatkhoz trtn

hozzadsa. Programozs Alapjai (2007) 663 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Pointeraritmetika Emltst kell tenni a tpustalan pointerrl is: void *p; Ekkor a p++ egy bjttal val nvelst jelent. A NULL konstans gy lehet deklarlva a stdio.h-ban: #define NULL 0 vagy #define NULL ((void*)0) Programozs Alapjai (2007)

664 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Rekord tpus A tmb tpus nagyszm, de ugyanazon tpus adat trolsra alkalmas. Problmk megoldsa sorn viszont gyakran elfordul, hogy klnbz tpus, de logikailag sszetartoz adatelemek egyttesvel kell dolgozni. Az ilyen adatok trolsra szolglnak a rekord tpusok, ezek ltrehozsra pedig a rekord tpuskpzsek Programozs Alapjai (2007) 665 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Szorzat-rekord tpus Ha az egyes tpus adatokat egyszerre kell tudnunk trolni, szorzat-rekordrl beszlnk. Legyenek T1, ... ,Tk tetszleges tpusok. A T1, ... ,Tk tpusokbl kpezzk a T= T1x ... xTk ={(a1, ... ,ak) | a1 in T1, ... ,ak in Tk} rtkhalmazt, teht a T1, ... ,Tk tpusok direktszorzatt. Programozs Alapjai (2007) 666 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szorzat-rekord tpus A T halmazon is rtelmezhetnk kiolvas s mdost mveletet, mint a tmb tpus esetn, de most nem adhatunk meg index rtket, mert

a klnbz sorszm elemek itt eltr tpusak lehetnek. Ehelyett bevezetnk k szm kiolvas s mdost mveletet. Az j adattpusra a T=Rekord(T1, ... ,Tk) jellst hasznljuk s szorzat-rekordnak vagy csak egyszeren rekordnak nevezzk. Programozs Alapjai (2007) 667 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szorzat-rekord mveletei Kiolvasi( -> A:T; <- X:Ti), (i in 1..k) A mvelet vgrehajtsa utn X=ai, ha A=(a1, ... ,ak). Mdosti( <-> A:T; -> X:Ti), (i in 1..k) Ha a mvelet vgrehajtsa eltt A=(a1, ... ,ai-1,ai,ai+1, ... ,ak), akkor a mvelet vgrehajtsa utn A=(a1, ... ,ai-1,x,ai+1, ... ,ak).

Az X=Y rtkads rtelmezett, ha az X s Y vltozk tpusa T. Programozs Alapjai (2007) 668 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szorzat-rekord C nyelven A T=Rekord(T1, ... ,Tk) tpust C-ben a struct kulcsszval definiljuk: typedef struct T { T1 M1; ... Tk Mk; } T; A fenti tpuskpzsben az M1,,Mk azonostkat mezazonostknak (tagnak, member-nek) hvjuk s loklisak a

tpuskpzsre nzve. Programozs Alapjai (2007) 669 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szorzat-rekord C nyelven Az absztrakt tpus mveletei mezhivatkozsok segtsgvel valsthatak meg, aminek mveleti jele a . Minden T tpus A vltoz esetn lteznek az A.M1, ... ,A.Mk mezhivatkozsok gy, hogy A=(A.M1, ... ,A.Mk), tovbb A.Mi (i in 1..k) kznsges Ti tpus vltoznak tekintdik. A . balasszociatv s a legmagasabb priorits. Programozs Alapjai (2007)

670 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szorzat-rekord C nyelven A prioritsi elrs cskken sorrendben

elemkivlasztsok ( [], . ) a egyoperandus mveletek ( -, ++, --, !, ~, &, * ) a multiplikatv mveletek ( *, /, % ) az additv mveletek ( +, - ) bitlptets ( <<, >> ) a kisebb-nagyobb relcis mveletek ( <=, >=, <, > ) az egyenl-nem egyenl relcis mveletek ( ==, != ) bitenknti 's' mvelet ( & ) bitenknti 'kizr vagy' mvelet ( ^ ) bitenknti 'vagy' mvelet ( | ) a logikai 's' mvelet ( && ) a logikai 'vagy' mvelet ( || ) a feltteles mvelet ( ? : ) rtkad mvelet ( =, +=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |= ) szekvencia mvelet ( , ) Programozs Alapjai (2007) 671 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Szorzat-rekord C nyelven Kiolvasi(A,X) X=A.Mi Mdosti(A,X) A.Mi=X A mezlista szintaxisa lehetv teszi, hogy az azonos tpus mezket sszevonva deklarljuk gy, hogy vesszvel elvlasztva felsoroljuk a mezazonostkat (mint a vltozdeklarcinl). Programozs Alapjai (2007) 672 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szorzat-rekord pldk typedef struct DatumTip {

short ev; char ho; char nap; } DatumTip; typedef char Szoveg20[21]; typedef struct CimTip { Szoveg20 varos, utca; short hazszam; short iranyitoSz; } CimTip; typedef struct SzemelyTip { struct { Szoveg20 csaladi, uto; } nev; int szemelyiSzam; Szoveg20 szulHely; Datumtip szulIdo; CimTip lakcim; } SzemelyTip; Programozs Alapjai (2007) 673

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Szorzat-rekord pldk Deklarljuk az x-t SzemelyTip tpus vltoznak! SzemelyTip x; Ekkor az x vltozban trolt adatok kzl pldul a szemly vezetknevre az x.nev.csaladi mezhivatkozssal hivatkozhatunk, szletsi vt pedig az x.szulIdo.ev mez tartalmazza. Programozs Alapjai (2007) 674 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Szorzat-rekord gpi megvalstsa A struct tpus vltoz szmra foglalt memria mrete, amely a sizeof fggvnnyel lekrdezhet: sizeof(E) = sizeof(T1) + ... + sizeof(Tk) + igazts Valamennyi vltozati mez egymst (az esetleges igaztst is figyelembe vve) kvet, nvekv memriacmen kezddik. Programozs Alapjai (2007) 675 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyestett-rekord

Ha az egyes tpus adatokat nem kell egyszerre trolni, egyestett-rekordrl beszlnk. Legyenek T1, ... ,Tm tetszleges tpusok. A T1, ... ,Tm tpusokbl kpezzk az E= T1+ ... +Tm = {1}xT1 U ... U {m}xTm = {(i,a) | i in 1..m, a in Ti} rtkhalmazt, teht a T1, ... ,Tm tpusok rtkhalmazainak diszjunkt egyestst. Programozs Alapjai (2007) 676 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyestett-rekord E elemei teht olyan rendezett prok, amelyeknek els komponense meghatrozza, hogy a msodik komponens melyik tpusbl val rtk. ltalban a kvetkez konstrukcit

alkalmazhatjuk. Legyen T0 olyan tpus, amely tartalmazza a c1,...,cm klnbz rtkeket, tovbb legyenek T1,...,Tm tetszleges tpusok. Programozs Alapjai (2007) 677 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyestett-rekord Kpezzk az E = {c1}xT1 U ... U {cm}xTm = {(ci,a) | ci in T0, a in Ti, i in 1..m} halmazt. A E rtkhalmazt a kvetkezkben definilt mveletekkel a T0 vltozati tpusbl s a T1, ... ,Tm egyestsi-tag tpusbl kpzett egyestett rekord tpusnak nevezzk.

Programozs Alapjai (2007) 678 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyestett-rekord mveletek Vltozat( -> A:E; <- v:T0) A mvelet vgrehajtsa utn v=ci, ha A=(ci,a). Kiolvasi( -> A:E; <- X:Ti), (i in 1..m) A mvelet vgrehajtsa utn X=a, ha A=(ci,a). A mvelet hatstalan, ha A els komponense nem ci. Mdosti( <-> A:E; -> X:Ti) , (i in 1..m) A mvelet vgrehajtsa utn A=(ci,x). Programozs Alapjai (2007) 679

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyestett-rekord C nyelven Az egyestett-rekord tpust C-ben az union tpuskpzssel valstjuk meg. Mivel az union konstrukciban nincs lehetsg a jelzmez megadsra, ezrt ha szksgnk van a jelzmezre is, akkor a C-ben az elz konstrukcihoz folyamodunk. C-ben jelzmeznek alkalmas az int, vagy a char tpus valamelyik vltozata, vagy az ltalunk definilt enum tpus. Programozs Alapjai (2007) 680 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Egyestett-rekord C nyelven Az E egyestett-rekord tpust a kvetkezkppen kell definilni: typedef ... T0; typedef struct E { T0 Milyen; union { T1 V1; ... Tm Vm; }; } E; Programozs Alapjai (2007) 681 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyestett-rekord C nyelven ahol

Milyen azonost a vltozati (jelz) mezazonost T0 a vltozati (jelz) tpus azonostja V1, ... ,Vm az egyestsi tag mezazonostk T1, ... ,Tm az egyestsi tag tpusok Programozs Alapjai (2007) 682 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyestett-rekord C nyelven A mveletek megvalstsa itt is mezhivatkozssal trtnik. Vltozat(A,v) v = A.Milyen Kiolvasi(A,x)

x = A.Vi Mdosti(A,x) { A.Milyen=ci; A.Vi=x } Programozs Alapjai (2007) 683 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyestett-rekord C nyelven Az egyestett-rekord C-ben trtn megvalstsban mindig hivatkozhatunk az A.Vi egyestsi tag mezre, fggetlenl attl, hogy az A.milyen vltozat mez aktulis rtke ci vagy sem. Ha a tpuskpzsben nem adunk meg vltozati mezazonostt, akkor nincs lehetsgnk az aktulis vltozatrl informci trolsra s lekrdezsre; ekkor a struct konstrukci el is maradhat s csupn az union rsz marad.

Programozs Alapjai (2007) 684 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyestett-rekord pldk typedef enum { kor, haromszog, negyszog } Sikidom; typedef union Szam { double Valos; long int Egesz; } Szam; Programozs Alapjai (2007) 685 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Egyestett-rekord pldk typedef struct Idom { Sikidom Fajta; union { double Sugar; struct { double A, B, C; } U1; struct { double D1, D2, D3, D4; } U2; } UU; } Idom; typedef struct Alakzat { double x, y; /* a koordintk */ Sikidom forma; union { double sugar; struct { double alfa, oldal1, oldal2; }; struct {

double hossz, szel; }; }; } Alakzat; Programozs Alapjai (2007) 686 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Egyestett-rek. gpi megvalstsa Az union tpus vltoz szmra foglalt memria mrete, amely a sizeof fggvnnyel lekrdezhet: sizeof(E) = Max{sizeof(T1), ,sizeof(Tm)} Ha az egyestett-rekord vltozati mezt is tartalmaz, ennek mrett a struct gpi megvalstsa szerint hozz kell adni ehhez. Valamennyi vltozati mez ugyanazon

memriacmen kezddik. Programozs Alapjai (2007) 687 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk struct, union Mint az a pldkbl lthat volt, a struct s az union deklarcik egymsba gyazhatak. Ilyen esetekben a rekord tpus mez mezazonostja elhagyhat, ekkor ezen mez mezazonosti gy ltszanak, mintha a kls rekord tpus mezazonosti lennnek: Idom I; I.UU.U1.B; Alakzat A; A.alfa; /* /* /*

/* Vannak mezazonostk a */ rekord mezkhz: UU,U1,U2 */ Nincsenek mezazonostk */ a rekord mezkhz */ Programozs Alapjai (2007) 688 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk struct, union A struct vagy az union kulcsszt struktracmke (struktranv) kvetheti. Ez egy nv, amely megnevezi az adott tpus struktrt, vagy unit s a tovbbiakban rvidtsknt hasznlhat a {}-ben lv rszletes deklarci helyett. A struktranv s a tpusnv meg is egyezhet,

mint a fenti pldkban, gy a legrugalmasabb a felhasznlsuk. Pl.: struct Alakzat a1, a2; Alakzat b1, b2; Programozs Alapjai (2007) 689 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk struct, union A struct s az union tpus vltozk esetn megengedett az rtkads mvelet, gy fggvnyargumentumknt hasznlhatjuk ezeket (rtk fajtj paramterkezels) illetve a fggvnymvelet eredmnynek tpusa is lehet struct vagy union. Megengedett az & mvelet hasznlata is, gy a struct s az union tpus vltozk vltoz fajtj paramterknt is kezelhetk.

Programozs Alapjai (2007) 690 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk struct, union A struct s union tpus vltozk is kaphatnak kezdrtket. Ha minden tagot inicializlunk, akkor a {} elmaradhatnak, klnben pedig ugyanott vannak, ahol a stuktra deklarcijban. Az union tpusnak csak az els tagja inicializlhat. Programozs Alapjai (2007) 691 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Bitmezk A C nyelv lehetv teszi egy bjton belli bitek elrst magas szinten, bitmezs struktrk segtsgvel. A megvalsts nagyon gpfgg. Felhasznlhatjuk pl. hardver-programozshoz szksges bitsorozatok magas szint kezelse (driverek rshoz), vagy jelzbitek (flag-ek) tmr elhelyezsre. Programozs Alapjai (2007) 692 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bitmezk A bitmez a struktrhoz hasonlt, csak az egyes tagok utn a szksges bitek szma is meg van adva. Pl.

struct { unsigned int flag1 : 1; unsigned int flag2 : 1; unsigned int flag3 : 2; } jelzok; jelzok.flag1 = jelzok.flag2 = 0; jelzok.flag3 = 1; if (jelzok.flag1 == 0 && jelzok.flag3 == 1) { /* ... */ } Programozs Alapjai (2007) 693 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bitmezk Mirt j ez? struct { unsigned unsigned unsigned

unsigned unsigned unsigned } jelzok; short short short short short short int int int int int int flag1 flag2 flag3 flag4 flag5 flag6

: : : : : : 1; 1; 2; 4; 2; 6; Bitmezk nlkl ez legalbb 6 bjt lenne, gy viszont csak 2. Programozs Alapjai (2007) 694 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Vltozhivatkozs Az alapvetbb tpuskonstrukcik megismerse utn visszatrhetnk a dinamikus vltozknl megemltett hrom fogalomhoz: vltozhivatkozs hivatkozott vltoz vltoz rtke A C nyelvben a vltozhivatkozs neve: l-value rtkads bal oldaln vagy pldul a ++ opertor operandusaknt csak ilyen l-value szerepelhet. Programozs Alapjai (2007) 695 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Vltozhivatkozs

A vltozhivatkozs szintaktikus egysg, teht meghatrozott formai szablyok szerint kpzett jelsorozat egy adott programnyelven. A C nyelvben egy vltozhivatkozs nagyon bonyolult is lehet, s alapveten nem ms, mint egy kifejezs. Azt, hogy mely kifejezsek tekinthetk (szintaktikailag) rvnyes vltozhivatkozsnak, az albbi szablyok alapjn dnthet el. Programozs Alapjai (2007) 696 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Vltozhivatkozs Minden olyan vltoz azonost, amely az adott blokkban lthat egyben hivatkozs is, s a tpusa a vltoz deklarcijban megadott tpus. Ha L egy T nem tmb tpus hivatkozs, akkor

egyben T tpus rvnyes vltozhivatkozs is. Ha L egy T tpus hivatkozs vagy T tpus rvnyes vltozhivatkozs, akkor egyben T tpus kifejezs is. Programozs Alapjai (2007) 697 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Vltozhivatkozs Ha X egy T tpus rvnyes vltozhivatkozs, s T struct vagy union, valamint m a T egyik E tpus mezje, akkor T.m hivatkozs, tpusa pedig E. Ha X egy T struct vagy union tpus kifejezs, valamint m a T egyik E tpus mezje, akkor T.m

E tpus kifejezs. Programozs Alapjai (2007) 698 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Vltozhivatkozs Ha X egy T* vagy T[] tpus kifejezs, s i egy int tpus kifejezs, akkor *X, X[i] rvnyes T tpus hivatkozsok, tovbb X+i, X-i T* tpus kifejezsek. Ha L egy T* tpus rvnyes vltozhivatkozs, akkor ++X, --X, X++, X--, X+=i, X-=i T* tpus kifejezsek.

Programozs Alapjai (2007) 699 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Vltozhivatkozs Ha L egy T tpus rvnyes vltozhivatkozs, akkor &L egy T* tpus kifejezs. Ha L egy T[n] tpus hivatkozs, s L nem vltoz azonost, akkor &L egy T(*)[n] tpus kifejezs, azaz egy T[n] tpusra mutat pointer kifejezs. Programozs Alapjai (2007) 700

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnyre mutat pointer Eddig ktflekppen kzeltettk meg a pointer tpus vltozt: Els kzeltsben egy p pointer tpus vltoz rtke egy meghatrozott tpus dinamikus vltoz. A msik szerint a p pointer tpus vltoz rtke egy msik vltozhoz tartoz memria mez cme. A harmadik megkzeltsben a pointer egy rszalgoritmusra is mutathat, amelyet aktulis paramterekkel vgrehajtva a megadott tpus eredmnyhez jutunk. Programozs Alapjai (2007) 701 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Fggvnyre mutat pointer Minden, a pointerekre megengedett mvelet elvgezhet: szerepelhet rtkadsban, elhelyezhet egy tmbben vagy rekordban, tadhat egy fggvnynek aktulis paramterknt, lehet egy fggvny visszatrsi rtke, stb. Ilyen tpust egyszeren gy deklarlhatunk, hogy a megfelel fggvnyfejben a fggvny azonostjt pointerre cserljk, vagyis a tpus azonostja el *-t runk. Programozs Alapjai (2007) 702 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnyre mutat pointer Mivel a * alacsonyabb priorts, mint a (),

ezrt a dereferencit zrjelprba kell tenni. Legyen pl.: double Sin2x(double x) { return sin(2.0 * x); } egy ilyen fggvnyre mutat pointer tpus: typedef double (*FuggvenyTip)(double x); vagy typedef double (*FuggvenyTip)(double); Programozs Alapjai (2007) 703 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Fggvnyre mutat pointer Egy vltozdeklarci kezdrtk megadsval FuggvenyTip f = Sin2x;

s a hasznlata double x, y; y = (*f)(x); Programozs Alapjai (2007) 704 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hatrozott integrl Problmafelvets: Adott fggvny hatrozott integrljt kzeltsk egy beolvasott intervallumon a felhasznl ltal megadott szm rszre osztva az intervallumot. Specifikci: Input Az A,B intervallum vgpontjai A rszek szma

Output Vals szm, a hatrozott integrl rtke Programozs Alapjai (2007) 705 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hatrozott integrl Algoritmustervezs: A f algoritmusban csak az input adatokat kell beolvasni, az integrland fggvnyt az aktulis paramterekkel meghvni, vgl az eredmnyt kiiratni. Programozs Alapjai (2007) 706 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Integrlt kiszmt fggvny Problmafelvets: A paramterknt megadott fggvny hatrozott integrljt szmoljuk egy paramterknt adott intervallumon. Paramterknt adott az is, hogy az intervallumot hny rszre kell osztani a kzeltsnl. Specifikci: Input: Az integrland fggvny Az a,b intervallum vgpontjai Az, hogy hny rszre osszuk fel az intervallumot Output: Vals szm, a hatrozott integrl rtke Programozs Alapjai (2007) 707 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Integrlt kiszmt fggvny Algoritmustervezs A trapz mdszer szerint trtnik a kzelts. A kplet egyszer talaktsval egy szmllt menet ismtlses vezrlst kapunk. A B Programozs Alapjai (2007) 708 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Integrlt kiszmt fggvny Algoritmustervezs double Trapez(FuggvenyTip F, double a, double b, int n)

Inicializls i = 1 -> (n-1) h=(b-a)/n; Int=0.0 Int += (*F)(a + i * h) return (Int * h + ((*F)(a) + (*F)(b)) / 2.0 * h) Programozs Alapjai (2007) 709 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hatrozott integrl /* Kzelt integrls a trapz szably segtsgvel. * Az integrland fggvnyt paramterknt kapjuk. * 1998. prilis 14. Dvnyi Kroly, [email protected] * 2006. Augusztus 14. Gergely Tams, [email protected]

*/ #include #include /* Az integrland fggvny tpusa */ typedef double (*FuggvenyTip)(double x); >>> Programozs Alapjai (2007) 710 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hatrozott integrl static double Trapez(FuggvenyTip F, /* F(x)-t integrljuk az double a, double b, /* a,b intervallumon int n) /* n rszre osztva az interv.-t { /* Kzelt integrls a trapz szably segtsgvel.

double Int, h; int i; /* a ciklusvltoz h = (b - a) / n; Int = 0.0; for (i = 1; i < n; i++) { /* fgv. rtkek sszegzse Int += (*F)(a + i * h); /* Int += F(a + i * h); <- gy is lehetne } return (Int * h + ((*F)(a) + (*F)(b)) / 2.0 * h); /*return (Int * h + (F(a) + F(b)) / 2.0 * h);<- gy is lehetne } */ */ */ */ */ */ */

*/ >>> Programozs Alapjai (2007) 711 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hatrozott integrl static double Eadxperx(double x) { /* az els integrland fggvny */ return (exp(x) / x); } static double Sin2x(double x) { /* a msodik integrland fggvny */ return sin(2.0 * x); } main()

{ double A, B; int n; printf("Az exp(x)/x fggvny kzelt integrlja.\n"); printf("Krem az integrlsi intervallumot "); >>> Programozs Alapjai (2007) 712 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Hatrozott integrl printf("s az osztspontok szmt (A,B,n)!\n"); printf("A:? "); scanf("%g%*[^\n]", &A); getchar(); printf("B:? "); scanf("%g%*[^\n]", &B); getchar(); printf("n:? "); scanf("%d%*[^\n]", &n); getchar(); printf("A integrl kzelt rtke: "); printf("%10.5f\n", Trapez(Eadxperx, A, B, n)); printf("Az sin(2x) fggvny kzelt integrlja.\n"); printf("Krem az integrlsi intervallumot ");

printf("s az osztspontok szmt (A,B,n)!\n"); printf("A:? "); scanf("%g%*[^\n]", &A); getchar(); printf("B:? "); scanf("%g%*[^\n]", &B); getchar(); printf("n:? "); scanf("%d%*[^\n]", &n); getchar(); printf("A integrl kzelt rtke: "); printf("%10.5f\n", Trapez(Sin2x, A, B, n)); } Programozs Alapjai (2007) 713 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Parancssori argumentumok A C nyelvet tmogat krnyezetekben lehetsg van arra, hogy a vgrehajts megkezdsekor a programnak parancssori argumentumokat vagy paramtereket adjunk t. Programozs Alapjai (2007)

714 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Parancssori argumentumok Amikor az opercis rendszer elindtja a programot, azaz meghvja a main-t, a hvsban kt argumentum szerepelhet: Az els (ltalban argc) azoknak a parancssori argumentumoknak a darabszma, amelyekkel a programot meghvtuk. A msodik argumentum (ltalban argv) egy mutat egy sztring-tmbre, amely a parancssori argumentumokat tartalmazza. Egy karakterlnc egy argumentumnak felel meg. Programozs Alapjai (2007) 715 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Parancssori argumentumok Megllapods szerint argv[0] az a nv, amellyel a programot hvtk, gy az argc rtke legalbb 1. Szmthatunk arra is, hogy argv[argc]==NULL. Mivel argv mutattmbt megcmz mutat, tbbflekppen is megrhatjuk azt a programot, amely kirja a parancssorban lv argumentumokat. Programozs Alapjai (2007) 716 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Parancssori argumentumok

/* Kirjuk a parancssorban lv argumentumokat. * 1998. prilis 16. Dvnyi Kroly, [email protected] */ #include main(int argc, char **argv) /* vagy gy is lehet az argv-t deklarlni main(int argc, char *argv[]) */ { int i; printf("argc = %d\n\n",argc); for (i=0; i

Mentsk el a fenti programot arg.c nven s fordtsuk le! $ gcc -o arg arg.c $ ./arg alma korte szilva barack palinka argc = 6 argv[0]: argv[1]: argv[2]: argv[3]: argv[4]: argv[5]: ./arg alma korte szilva barack palinka Programozs Alapjai (2007) 718 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Parancssori argumentumok Problmafelvets: Hatrozott integrl kiszmtsa. Adott fggvny hatrozott integrljt szmoljuk egy beolvasott intervallumon a felhasznl ltal megadott szm rszre osztva az intervallumot. Specifikci: Input: A fggvny neve Az A,B intervallum vgpontjai A rszek szma. Mindegyiket a parancssorban adjuk meg. Programozs Alapjai (2007) 719

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Parancssori argumentumok Specifikci: Output: Vals szm, a fggvny rtke az A vgponton. Vals szm, a fggvny rtke az B vgponton. Vals szm, a hatrozott integrl rtke. Ha az argumentumok szma nem megfelel, akkor hibazenetet runk ki. A fggvny neve lehet az, hogy help, s ekkor csak tjkoztat szveg jelenik meg a vlaszthat fggvnyek nevrl. Programozs Alapjai (2007)

720 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Parancssori argumentumok Algoritmustervezs: A f algoritmusban Ellenrizzk a parancssorban megadott argumentumok szmt. Megkeressk a fggvny nevt a vlaszthat fggvnyek kzl. Ha nincs meg, akkor tjkoztat s ksz. Ha help, akkor msik tjkoztat s ksz. Ha kevs a parancssorban megadott argumentumok szma, akkor hibazenet s ksz. Argumentumok konvertlsa s a kiratsban a megfelel fggvnyek meghvsa s sikeres befejezs. Programozs Alapjai (2007) 721

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk -> opertor A megvalsts sorn szksgnk lesz olyan hivatkozsokra, mint (*tp).nev (*tp).fuggveny ahol tp egy struktrra mutat pointer. A zrjelezsre szksg van, mivel a mezkivlaszts (.) magasabb precedencij, mint a dereferencia (*). Programozs Alapjai (2007) 722 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

-> opertor Mivel a C nyelvben sokszor van szksg az ilyen jelleg hivatkozsokra, ezrt egy j mveletet vezetnk be. Ennek mveleti jele -> s egy pointer ltal megmutatott struktra egy mezjnek kivlasztsra alkalmas. A prioritsi sorban legfell, a . mvelet mellett helyezkedik el. Programozs Alapjai (2007) 723 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk -> opertor Az opertor segtsgvel teht a (*tp).nev (*tp).fuggveny

alak hivatkozsok egyszerbben tp->nev tp->fuggveny alakban rhatak. Programozs Alapjai (2007) 724 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Parancssori argumentumok /* * * * * * */

Kzelt integrls a trapz szably segtsgvel. Az integrland fggvny nevt a parancssorbl kapjuk. Meg kell adnunk az intervallumot is s a finomsgot is. Krhet help is. 1998. prilis 14. Dvnyi Kroly, [email protected] 2006. Augusztus 14. Gergely Tams, [email protected] #include #include #include #include typedef struct Tablaelem { char *nev; /* A fggvny neve szvegesen */ double (*fuggveny)(); /* A fggvnyre mutat pointer */ } Tablaelem; Programozs Alapjai (2007)

>>> 725 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Parancssori argumentumok static double help(); static double ExPx(); static double Sin2x(); Tablaelem tablazat[] = { { "sin", sin }, { "tan", tan }, { "cos", cos }, { "ExPx", ExPx }, { "Sin2x", Sin2x }, { "help", help },

{ NULL, NULL } }; /* A tblzat vgt jelzi */ Programozs Alapjai (2007) >>> 726 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Parancssori argumentumok static double ExPx(double x) { return (exp(x) / x); } static double Sin2x(double x) { return sin(2.0 * x);

} Programozs Alapjai (2007) >>> 727 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Parancssori argumentumok double help(Tablaelem *tp) { printf("Krem vlasszon a kvetkez fggvnyek kzl: "); for ( ; tp -> nev; tp++) { printf("%s ", tp -> nev); } printf("\nMeg kell adnia az intervallumot s a finomsgot.\n"); exit(EXIT_SUCCESS); } /* Az integrland fggvny tpusa */ typedef double (*FuggvenyTip)(double x);

Programozs Alapjai (2007) >>> 728 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Parancssori argumentumok static double Trapez(FuggvenyTip F, /* F(x)-t integrljuk az double a, double b, /* a,b intervallumon int n) /* n rszre osztva az interv.-t { /* Kzelt integrls a trapz szably segtsgvel. double Int, h; int i; /* a ciklusvltoz h = (b - a) / n; Int = 0.0;

for (i = 1; i < n; i++) { /* fgv. rtkek sszegzse Int += (*F)(a + i * h); } return (Int * h + ((*F)(a) + (*F)(b)) / 2.0 * h); } */ */ */ */ */ */ >>> Programozs Alapjai (2007) 729 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Parancssori argumentumok main(int argc, char **argv) { Tablaelem *tp; double A, B; int n; char *kiiratasFormaja = { "\n %s(%s)= %g\n %s(%s)= %g\n %s integrlja= %g\n" }; if ( argc > 5 ) { errno = E2BIG; perror ( "A hiba az, hogy" ); exit(EXIT_FAILURE); } Programozs Alapjai (2007) >>> 730 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Parancssori argumentumok for ( tp = tablazat; /* a fggvny nevt keressk */ (tp -> nev && strcmp(tp -> nev, argv[1])); tp++ ); /* res ciklusmag */ if (tp -> nev == NULL) { /* nem talltuk meg */ printf("%s fggvny mg nincs megvalstva\n", argv[1]); exit(EXIT_SUCCESS); } if (tp -> fuggveny == help) { help(tablazat); } if ( argc < 5 ) { perror("A hiba az, hogy kevs az argumentum"); exit(EXIT_FAILURE); } Programozs Alapjai (2007) >>> 731

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Parancssori argumentumok A = atof(argv[2]); /* Konvertl string-rl double-re B = atof(argv[3]); n = atoi(argv[4]); /* Konvertl string-rl int-re printf(kiiratasFormaja, /* Pointer a formtum stringre argv[1], /* Pointer a fggvny nevre argv[2], /* Pointer az els szmra (*tp -> fuggveny)(A), /* A fggvny rtke A-nl argv[1], /* Pointer a fggvny nevre argv[3], /* Pointer a msodik szmra (*tp -> fuggveny)(B),

/* A fggvny rtke B-nl argv[1], /* Pointer a fggvny nevre Trapez(*tp -> fuggveny, A, B, n) /* A fggvny integrlja ); exit(EXIT_SUCCESS); */ */ */ */ */ */ */ */ */ */ */ } Programozs Alapjai (2007) 732

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Halmaz tpus A programozsban szmtalan formban elfordulhatnak halmazok s halmazokkal vgzett mveletek. Legyen U egy egsz tpus, amit univerzumnak neveznk. Tekintsk azt az rtkhalmazt, amelynek elemei az U univerzum rszhalmazai, ez lesz a Halmaz(U) j adattpus rtkhalmaza. Programozs Alapjai (2007) 733 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Halmaz mveletei (A Halmaz(U) adattpusra a tovbbiakban a Halmaz azonostt hasznljuk.) rest( <- H : Halmaz); A mvelet vgrehajtsa utn a H vltoz rtke az res halmaz. Bvt( <-> H : Halmaz; -> x : U); A mvelet a H vltoz rtkhez hozzveszi az x elemet. Trl( <-> H : Halmaz; -> x : U); A mvelet a H vltoz rtkbl trli az x elemet. Programozs Alapjai (2007) 734 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Halmaz mveletei Eleme( -> x : U; -> H : Halmaz) : bool; A fggvnymvelet akkor s csak akkor ad igaz

rtket, ha x eleme a H halmaznak. Egyests( -> H1,H2 : Halmaz; <- H : Halmaz); A mvelet eredmnyeknt a H vltoz rtke a H1 s H2 halmaz egyestse lesz. Metszet( -> H1,H2 : Halmaz; <- H : Halmaz); A mvelet eredmnyeknt a H vltoz rtke a H1 s H2 halmaz kzs rsze lesz. Programozs Alapjai (2007) 735 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Halmaz mveletei Klnbsg( -> H1,H2 : Halmaz; <- H : Halmaz); A mvelet eredmnyeknt a H vltoz azokat s csak azokat az x in U rtkeket tartalmazza, amelyre x in H1, de x nem eleme a H2 halmaznak.

Egyenl( -> H1,H2 : Halmaz) : bool; Az egyenlsg relcis mvelet. Rsz( -> H1,H2 : Halmaz) : bool; Akkor s csak akkor ad igaz rtket, ha a H1 halmaz minden eleme a H2 halmaznak is eleme. Programozs Alapjai (2007) 736 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Halmaz mveletei rese( -> H : Halmaz) : bool; Akkor s csak akkor ad igaz rtket, ha H rtke az res halmaz. rtkads( <- H1, -> H2 : Halmaz); A mvelet hatsra a H1 vltoz felveszi a H2 rtkt.

Programozs Alapjai (2007) 737 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Halmaz megvalstsa A C nyelvben a halmaznak nincs nyelvi megvalstsa. A halmazok reprezentlshoz induljunk ki abbl, hogy tetszleges U univerzum esetn az U rszhalmazai megadhatk karakterisztikus fggvnykkel. Ha H az U rszhalmaza, akkor karakterisztikus fggvnye: kH : U ---> {0,1}, kH(x)=1 <==> x in H Programozs Alapjai (2007) 738 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Halmaz megvalstsa A karakterisztikus fggvnyek s U rszhalmazai kztt klcsnsen egyrtelm megfeleltetst ad az elbbi sszefggs. Ha U egsz tpus, a karakterisztikus fggvnyeket meg tudnnk valstani a bool[U] tpussal, de ez nem hatkony megolds, mert U minden elemhez a logikai bool tpus megvalststl fggen legalbb egy (de inkbb 4) byte szksges. Az 1 bit/elem hatkonysgot el is tudjuk viszont rni, a bitmveletek segtsgvel. Programozs Alapjai (2007) 739 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Halmaz megvalstsa A mdszer lnyege, hogy pldul egy int tpus vltozban 32 bitet trolhatunk, azaz egy 32 elem kis halmaz reprezentlsra idelis. 31 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 2526 27 28 2930 31 vagy inkbb: 31 0 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Melyik jobb? Programozs Alapjai (2007) 740 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Halmaz megvalstsa Az egyes biteket a bitmveletekkel rhetjk el. 31 0 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 = 31 1 << 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 = 31 1 << 1

0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 = 1 << 31 A bit trlse, belltsa s lekrdezse az &, | s ~ mveletek segtsgvel trtnik. Programozs Alapjai (2007) 741 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Halmaz megvalstsa Nagyobb halmazt sszerakhatunk kis halmazokbl a kvetkezkppen. Logikailag K-1 2K-1 ...

... (i+1)K-1 ... N ... MK-1 ... Fizikailag 0 K Kishalmaz sorszm 0 1 K-1 K-1 iK i=(N / K)

K-1 (M-1)K M-1 K-1 Programozs Alapjai (2007) ... ... ... (N % K) ... 0 0 ... 0

0 742 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Halmaz megvalstsa Kpezzk az albbi tpusokat: #define K (8*sizeof(KisHalmaz)) #define M ??? #define H_MAX (M*K) typedef int KisHalmaz; typedef KisHalmaz Halmaz[M]; Programozs Alapjai (2007) 743 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Halmaz megvalstsa Minden x termszetes szm egyrtelmen meghatrozott az (x / K, x % K) szmprral. Teht x akkor s csak akkor eleme a H vltoz ltal reprezentlt halmaznak, ha teljesl, hogy a H[x / K] KisHalmaznak eleme az (x % K), azaz a megfelel KisHalmaz megfelel bitje 1. Az univerzum halmaz ekkor a 0..H_MAX-1 intervallum lesz. Programozs Alapjai (2007) 744 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Halmaz mveletei

rest( <- H : Halmaz); void Uresit(Halmaz H) { long int i; for(i = 0; i < M; ++i) H[i] = 0; } Programozs Alapjai (2007) 745 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Halmaz mveletei Bvt( <-> H : Halmaz; -> x : U); void Bovit(Halmaz H, unsigned long int x) { if(x < H_MAX) H[x / K] |= (1 << (x % K)); }

Programozs Alapjai (2007) 746 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Halmaz mveletei Trl( <-> H : Halmaz; -> x : U); void Torol(Halmaz H, unsigned long int x) { if(x < H_MAX) H[x / K] &= ~(1 << (x % K)); } Programozs Alapjai (2007) 747 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Halmaz mveletei Eleme( -> x : U; -> H : Halmaz) : bool; int Eleme(unsigned long int x, Halmaz H) { return (x < H_MAX) && (H[x / K] & (1 << (x % K))); } Programozs Alapjai (2007) 748 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Halmaz mveletei Egyests( -> H1,H2 : Halmaz; <- H : Halmaz); void Egyesites(Halmaz H1, Halmaz H2, Halmaz H) {

long int i; for(i = 0; i < M; ++i) H[i] = H1[i] | H2[i]; } Programozs Alapjai (2007) 749 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Halmaz mveletei Metszet( -> H1,H2 : Halmaz; <- H : Halmaz); void Metszet(Halmaz H1, Halmaz H2, Halmaz H) { long int i; for(i = 0; i < M; ++i) H[i] = H1[i] & H2[i]; } Programozs Alapjai (2007)

750 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Halmaz mveletei Klnbsg( -> H1,H2 : Halmaz; <- H : Halmaz); void Kulonbseg(Halmaz H1, Halmaz H2, Halmaz H) { long int i; for(i = 0; i < M; ++i) H[i] = H1[i] & ~(H2[i]); } Programozs Alapjai (2007) 751 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Halmaz mveletei Egyenl( -> H1,H2 : Halmaz) : bool; int Egyenlo(Halmaz H1, Halmaz H2) { long int i; for(i = 0; (i H1,H2 : Halmaz) : bool; int Resz(Halmaz H1, Halmaz H2)

{ long int i; for(i = 0; (i H : Halmaz) : bool; int Urese(Halmaz H1, Halmaz H2) { long int i; for(i = 0; (i

Programozs Alapjai (2007) 754 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Halmaz mveletei rtkads( <- H1, -> H2 : Halmaz); void Ertekadas(Halmaz H1, Halmaz H2) { long int i; for(i = 0; i < M; ++i) H1[i] = H2[i]; } Programozs Alapjai (2007) 755 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Halmaz tpus Azltal, hogy az univerzum egsz tpus, lehetv vlik a diszkrt ismtlses vezrls megfogalmazsa ezekre a halmazokra. Legyen Umin, Umax az univerzum minimlis illetve maximlis eleme. x= Umin -> Umax x in H x in H i n M M Programozs Alapjai (2007) 756 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Halmaz tpus

Ebben az esetben teht a diszkrt ismtlses vezrls megvalstsa C nyelven: for(x=Umin; x<=Umax; ++x) { if(Eleme(x,H)) { M; } } Programozs Alapjai (2007) 757 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Klikkek Problmafelvets: Egy kzssgben az emberek kztti bartsgi kapcsolat alapjn meg kell hatroznunk a klikkeket. Specifikci: Sorszmozzuk 1-tl N-ig az embereket s olvassuk be az R bartsgi relcit.

Input: Szmprokat olvasunk be. Az input vge: 0 0. Az i,j pr azt jelenti, hogy az i. szemly bartsgban van a j. szemllyel. Output: Soroljuk fel a barti csoportokat. Programozs Alapjai (2007) 758 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Klikkek Algoritmustervezs: A matematika nyelvn: Tegyk fel, hogy a bartsg reflexv, szimmetrikus s tranzitv relci. Meg kell hatrozni az R relcit tartalmaz legszkebb ekvivalencia relci szerinti osztlyozst. Induljunk ki abbl, hogy minden szemly csak sajt magval van bartsgban; teht kpezzk az {i} egyelem halmazokat. Ha az input szmprokat

valameddig feldolgozva meghatroztuk az osztlyozst, a kvetkez (i,j) szmprt beolvasva ssze kell vonni azt a kt rszhalmazt, amelybe i illetve j tartozik, hisz mindenki, aki i-vel bartsgban van, az bartsgban van mindenkivel, akivel j bartsgban van. Programozs Alapjai (2007) 759 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Klikkek Az algoritmus C megvalstsa teht az absztrakt Halmaz(U) adattpus mveleteivel. /* A beolvasott R relcit tartalmaz legszkebb ekvivalencia relci szerinti osztlyozst hatrozzuk meg. Vzlat, nem fordthat C program. 2006. Augusztus 14. Gergely Tams, [email protected] */ #include #define N 10

/* maximlis elemszm */ typedef Halmaz(U) Halmaz; /* EZ GY NEM C !!!*/ >>> Programozs Alapjai (2007) 760 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Klikkek int main() { Halmaz H[N]; unsigned short i,j, ti,tj; for(i = 1; i <= N; ++i) { Uresit(H[i-1]); Bovit(H[i-1], i); }

/* inicializls */ printf("Krem a relciban lv szmprokat!\n"); scanf("%hd%hd%*[^\n]", &i, &j); getchar(); Programozs Alapjai (2007) >>> 761 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Klikkek while(i != 0) { for(ti=0; !Eleme(i, H[ti]); ti++); /* amelyik H[ti] halmazban van i ? */ for(tj=0; !Eleme(j, H[tj]); tj++); /* amelyik H[tj] halmazban van j ? */ if(ti != tj) {

/* H[ti] s H[tj] sszevonsa */ Egyesites(H[ti], H[tj], H[ti]); Uresit( H[tj] ); } scanf("%hd%hd%*[^\n]", &i, &j); getchar(); } >>> Programozs Alapjai (2007) 762 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Klikkek printf("Az osztlyok: \n"); for (i = 1; i <= N; i++) { if (! Urese(H[i - 1])) { for (j = 1; j <= N; j++) { if (Eleme(j, H[i - 1])) printf("%4hd,", j);

} putchar('\n'); } } /* az osztlyok kiratsa */ } Programozs Alapjai (2007) 763 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Klikkek Mivel N < 32, elg egy KisHalmaz. /* A beolvasott R relcit tartalmaz legszkebb ekvivalencia relci szerinti osztlyozst hatrozzuk meg. 1997. December 6. Dvnyi Kroly, [email protected] 2006. Augusztus 14. Gergely Tams, [email protected] */

#include #define N 10 typedef int Halmaz; /* maximlis elemszm */ /* N kicsi, ezrt elegend az int */ >>> Programozs Alapjai (2007) 764 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Klikkek main(int argc, char *argv[]) { Halmaz H[N];

unsigned short i, j, ti, tj; for (i = 1; i <= N; i++) H[i - 1] = 1 << i; /* inicializls */ printf("Krem a relciban lv szmprokat!\n"); scanf("%hd%hd%*[^\n]", &i, &j); getchar(); Programozs Alapjai (2007) >>> 765 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Klikkek while (i != 0) { /* While */

for(ti = 0; ((1 << i) & H[ti]) == 0; ti++); /* azon ti index keresse, amelyik H[ti] halmazban van i */ for(tj = 0; ((1 << j) & H[tj]) == 0; tj++); /* azon tj index keresse, amelyik H[tj] halmazban van j */ if (ti != tj) { H[ti] |= H[tj]; H[tj] = 0; } /* H[ti] s H[tj] sszevonsa */ scanf("%hd%hd%*[^\n]", &i, &j); getchar(); } >>> Programozs Alapjai (2007) 766 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Klikkek printf("Az osztlyok: \n"); for (i = 1; i <= N; i++) { /* az osztlyok kiratsa */ if (H[i - 1] != 0) { for (j = 1; j <= N; j++) { if (j < 32 && ((1 << j) & H[i - 1]) != 0) printf("%4hd,", j); } putchar('\n'); } } } Programozs Alapjai (2007) 767 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Prmszmok

Problmafelvets: Hatrozzuk meg az adott N termszetes szmnl nem nagyobb prmszmokat. Specifikci: Az N legyen konstans. Input: Nincs Output: Soroljuk fel a prmszmokat N-ig Programozs Alapjai (2007) 768 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Prmszmok Algoritmustervezs: A jl ismert Erathosztenszi szita algoritmust valstjuk meg.

A halmazt kezdetben feltltjk az egynl nagyobb pratlan szmokkal. Megkeressk a halmaz mg nem feldolgozott legkisebb elemt (ez prmszm lesz) s trljk a tbbszrseit. Az elz pontot addig ismteljk, mg el nem rjk az N gykt. Az eredmnyhalmaz csak a prmszmokat fogja tartalmazni. Programozs Alapjai (2007) 769 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Prmszmok /* * Hatrozzuk meg az adott N termszetes szmnl nem nagyobb * prmszmokat. * Ksztette: Dvnyi Kroly, [email protected] * 1997. December 6.

* Mdostotta: Gergely Tams, [email protected] * 2006. Augusztus 15. */ #include #define K (8*sizeof(KisHalmaz)) #define M 100 #define N (M*K) typedef int KisHalmaz; typedef KisHalmaz Halmaz[M]; Programozs Alapjai (2007) >>> 770 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Prmszmok int main() { Halmaz szita; KisHalmaz kicsi; long int p,s,lepes,i,j;

/* a szita inicializlshoz */ kicsi = 0; /* a szita inicializlsa */ for(i = 0; i <= ((K-1) / 2); ++i) { kicsi |= (1 << (2*i+1)); } for(i = 0; i < M; ++i) { szita[i] = kicsi; } szita[0] &= ~2; /* 2 == (1 << 1) */ szita[0] |= 4; /* 4 == (1 << 2) */ Programozs Alapjai (2007) >>> 771 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Prmszmok p = 3; /* az els szitland prm while(p*p < N) { /* P tbbszrseinek kiszitlsa lepes = 2 * p; /* lpskz = 2*p s = p*p; /* s az els tbbszrs while(s < N) { szita[s / K] &= ~(1 << (s % K)); s += lepes; } do { /* a kvetkez prm keresse p += 2; } while( (p < N) && ! (szita[p / K] & (1 << (p % K))) } */ */ */

*/ */ ); >>> Programozs Alapjai (2007) 772 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Prmszmok j = 0; /* a prmszmok kiratsa kpernyre */ printf("A prmszmok %d-ig:\n", N); for(p = 2; p < N; ++p) { if(szita[p / K] & (1 << (p % K))) { printf("%8d", p); if(++j == 9) {

j = 0; putchar('\n'); } } } putchar('\n'); } Programozs Alapjai (2007) 773 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Dinamikus tmb tpus Ha a programban deklarlunk egy tmbt, azzal az lehet a baj, hogy a mrett fordtsi idben meg kell adni. Ez viszont nem mindig ismert, gy elfordulhat, hogy a tmb szmra kevs helyet foglaltunk, de az is, hogy feleslegesen sokat. A megolds: tmb helyett pointert deklarlunk,

s ha tudjuk a kvnt mretet, memrit mr a megfelel szm elemnek foglalunk. Programozs Alapjai (2007) 774 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Dinamikus tmb tpus Mivel a pointert tmbknt kezelhetjk, a programban kdjban ez semmilyen ms vltozst nem eredmnyez: int tomb[MAX]; for(i=0; i

tomb=malloc(n*sizeof(int)); for(i=0; i

(s ha kell mozgatja) t. Ez sem hasznlhat viszont, ha a memria tlsgosan szttredezett, azaz nincsenek benne nagy egybefgg rszek. Programozs Alapjai (2007) 776 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Flexibilis tmb tpus Egy megolds a problmra a flexibilis tmb adattpus, ami a dinamikus tmb ltalnostsa. Ennek van olyan mvelete amivel az indextpus fels hatrt mdosthatjuk, ezltal vltoz elemszm sorozatokat kezelhetnk, tovbb a megvalstsa kis mret tmbkkel dolgozik. Adott E elemtpus esetn a flexibilis tmb (FTmb) adattpus rtkhalmaza az sszes A : 0..N ---> E fggvny.

Programozs Alapjai (2007) 777 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Flexibilis tmb mveletei Kiolvas( -> A:FTmb; -> i:int; <- X:E) Az A fggvny rtknek kiolvassa Mdost( <-> A:FTmb; -> i:int; -> X:E) Az A fggvny rtknek mdostsa X=Y rtkads, ha X s Y FTmb tpus vltozk. Ltest( <-> A:FTmb; -> N:int) N elem flexibilis tmbt ltest. Megszntet( <-> A:FTmb) Trli az A flexibilis tmbhz foglalt memrit. Programozs Alapjai (2007)

778 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Flexibilis tmb mveletei Fels( -> A:FTmb): int A fels hatr lekrdezse Nvel( -> A : FTmb; d:int) Az aktulis indextpus fels hatrt a d rtkkel nveli. Cskkent( -> A : FTmb; d:int) Az aktulis indextpus fels hatrt a d rtkkel cskkenti. Programozs Alapjai (2007) 779 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Flexibilis tmb megvalstsa A megvalstshoz vlasszunk egy L konstanst. L elemszm dinamikuss tett tmbkbl, amiket lapoknak neveznk, lltsuk ssze a nagy tmbt gy, hogy felvesznk egy LT laptrkp tmbt, amelynek elemei lapokra mutat pointerek. Programozs Alapjai (2007) 780 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Flexibilis tmb megvalstsa Ezt szemllteti az bra.

LT 0 1 0 0 ... ... L-1 L-1 L 0 ... ... 2L-1 L-1 (N-1)/L ((N-1)/L)L 0

... ... N-1 (N-1)%L Programozs Alapjai (2007) N ... ((N-1)%L)+1 ... L-1 781 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Flexibilis tmb megvalstsa /* Globlis elemek a flexibilis tmb megvalstshoz */ #define L ???

/* lapmret */ typedef enum {false, true} bool; typedef ??? elemtip; typedef elemtip *laptip; typedef laptip *lapterkeptip; typedef struct ftomb { lapterkeptip lt; unsigned int hatar; } ftomb; /* logikai tpus */ /* a tmb elemtpusa */ /* laptrkp */ /* aktulis indexhatr */ Programozs Alapjai (2007) >>> 782

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Flexibilis tmb megvalstsa /* A mveletek megvalstsa: */ void kiolvas(ftomb a, unsigned int i, elemtip *x) { if(i < a.hatar) { *x = a.lt[i / L][i % L]; } } void modosit(ftomb a, unsigned int i, elemtip x) { if(i < a.hatar) { a.lt[i / L][i % L] = x; } } Programozs Alapjai (2007)

>>> 783 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Flexibilis tmb megvalstsa void letesit(ftomb *a, unsigned int n) { int j; if(n) { a->hatar = n; a->lt=(elemtip**)malloc( (1+((n-1)/L))*sizeof(lapterkeptip)); for(j=0; j<=((n-1) / L); ++j) { a->lt[j]=(elemtip*)malloc(L*sizeof(elemtip)); /* lapok ltestse */ } } else { a->hatar = 0; a->lt = NULL; }

} >>> Programozs Alapjai (2007) 784 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Flexibilis tmb megvalstsa void megszuntet(ftomb *a) { int j; if(a->hatar) { for(j=0; j<=((a->hatar-1) / L); ++j) { free(a->lt[j]); /* lapok trlse */ } free(a->lt); a->hatar=0; }

} unsigned int felso(ftomb a) { return a.hatar; } Programozs Alapjai (2007) >>> 785 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Flexibilis tmb megvalstsa void novel(ftomb *a, unsigned int d) { int j; a->lt = (elemtip**)realloc(a->lt, (1+((a->hatar+d-1)/L))*sizeof(lapterkeptip)); for(j=(a->hatar ? ((a->hatar-1)/L)+1 : 0) ; j<=(a->hatar+d-1)/L; ++j) {

a->lt[j]=(elemtip*)malloc(L*sizeof(elemtip)); } a->hatar += d; } Programozs Alapjai (2007) >>> 786 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Flexibilis tmb megvalstsa void csokkent(ftomb *a, unsigned int d) { int j; if(d <= a->hatar) { for(j=(a->hatar-d-1)/L +1; j<=(a->hatar-1)/L; ++j) { free(a->lt[j]); /* lapok trlse */ }

a->hatar -= d; a->lt = (elemtip**)realloc(a->lt, (1+((a->hatar-1)/L))*sizeof(lapterkeptip)); } } Programozs Alapjai (2007) 787 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Rendezs tbb szempont szerint Problmafelvets A beolvasott adatokat rendezzk tbb szempont szerint is egy egyszer rendezsi algoritmussal s minden rendezs utn legyen kirats is. Specifikci Flexibilis tmbbel dolgozzunk Input A tmb elemei.

Output A klnbz szempontok szerint rendezett tmb. Programozs Alapjai (2007) 788 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Rendezs tbb szempont szerint Algoritmustervezs: A f algoritmusban csak az elemeket kell beolvasni egy vgjelig, majd rendre aktivizlni kell a klnbz szempontok szerinti rendezst, vgl az eredmnyt kiratni. A rendezs a beszrrendezs lesz. Programozs Alapjai (2007) 789

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Beszr rendezs Problmafelvets Rendezzk egy tmb elemeit Specifikci Input Egy tmb melynek elemtpusn rtelmezett egy rendezsi relci. Output A relci alapjn rendezett tmb. Programozs Alapjai (2007) 790 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Beszr rendezs Algoritmustervezs: A tmbt logikailag egy mr rendezett s egy mg rendezetlen rszre osztjuk, s a rendezetlen rsz els elemt beszrjuk a rendezett elemek kz gy, hogy azok rendezettek maradjanak. 3 1 5 4 Programozs Alapjai (2007) 2 791 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Rendezs tbb szempont szerint /* Rendezzk nvsorba illetve tlag szerint a hallgatkat! * Flexibilis tmbbel trtnik a megvalsts, teht a * nvsor hosszt nem kell elre megmondani. * Ksztette: Dvnyi Kroly, [email protected] * 1998. Februr 16. * Mdostotta: Gergely Tams, [email protected] * 2006. Augusztus 15. */ #include #include #define L 10 /* lapmret */ >>> Programozs Alapjai (2007) 792

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Rendezs tbb szempont szerint typedef enum {false, true} bool; typedef struct elemtip { char nev[21]; float adat; } elemtip; /* logikai tpus */ /* a tmb elemtpusa */ typedef elemtip *laptip; typedef laptip *lapterkeptip; typedef struct ftomb { lapterkeptip lt; unsigned int hatar; } ftomb;

/* laptrkp */ /* aktulis indexhatr */ typedef bool (*RendRelTip)(elemtip, elemtip); Programozs Alapjai (2007) >>> 793 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Rendezs tbb szempont szerint /* A mveletek megvalstsa: */ void kiolvas(ftomb a, unsigned int i, elemtip *x) { if(i < a.hatar) { *x = a.lt[i / L][i % L];

} } void modosit(ftomb a, unsigned int i, elemtip x) { if(i < a.hatar) { a.lt[i / L][i % L] = x; } } Programozs Alapjai (2007) >>> 794 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Rendezs tbb szempont szerint void letesit(ftomb *a, unsigned int n) { int j; if(n) {

a->hatar = n; a->lt=(elemtip**)malloc( (1+((n-1)/L))*sizeof(lapterkeptip)); for(j=0; j<=((n-1) / L); ++j) { a->lt[j]=(elemtip*)malloc(L*sizeof(elemtip)); /* lapok ltestse */ } } else { a->hatar = 0; a->lt = NULL; } } >>> Programozs Alapjai (2007) 795 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Rendezs tbb szempont szerint

void megszuntet(ftomb *a) { int j; if(a->hatar) { for(j=0; j<=((a->hatar-1) / L); ++j) { free(a->lt[j]); /* lapok trlse */ } free(a->lt); a->hatar=0; } } unsigned int felso(ftomb a) { return a.hatar; } Programozs Alapjai (2007) >>> 796 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Rendezs tbb szempont szerint void novel(ftomb *a, unsigned int d) { int j; a->lt = (elemtip**)realloc(a->lt, (1+((a->hatar+d-1)/L))*sizeof(lapterkeptip)); for(j=(a->hatar ? ((a->hatar-1)/L)+1 : 0) ; j<=(a->hatar+d-1)/L; ++j) { a->lt[j]=(elemtip*)malloc(L*sizeof(elemtip)); } a->hatar += d; } Programozs Alapjai (2007) >>> 797 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Rendezs tbb szempont szerint void csokkent(ftomb *a, unsigned int d) { int j; if(d <= a->hatar) { for(j=(a->hatar-d-1)/L +1; j<=(a->hatar-1)/L; ++j) { free(a->lt[j]); /* lapok trlse */ } a->hatar -= d; a->lt = (elemtip**)realloc(a->lt, (1+((a->hatar-1)/L))*sizeof(lapterkeptip)); } } Programozs Alapjai (2007) >>> 798 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Rendezs tbb szempont szerint void beszuroRend(ftomb t, RendRelTip kisebb) { /* A Kisebb rendezsi relci szerinti helyben rendezs */ int i,j; elemtip e,f; for(i = 1; i < felso(t); ++i) { kiolvas(t, i, &e); j = i-1; while(true) { if(j<0) break; kiolvas(t, j, &f); if(kisebb(f, e)) break; modosit(t, ((j--)+1), f); } modosit(t, j+1, e); } } /* BeszuroRend */ >>>

Programozs Alapjai (2007) 799 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Rendezs tbb szempont szerint bool NevSzerint(elemtip X, elemtip Y) { /* a nvsor szerinti rendezsi relci return strcmp(X.nev, Y.nev) <= 0; } bool AdatSzerint(elemtip X, elemtip Y) { /* az adat szerinti rendezsi relci return X.adat <= Y.adat; } bool CsokAdatSzerint(elemtip X, elemtip Y) { /* az adat szerint cskken rendezsi relci return X.adat >= Y.adat; }

Programozs Alapjai (2007) */ */ */ >>> 800 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Rendezs tbb szempont szerint int main() { ftomb sor; elemtip hallg; int i; letesit(&sor, 0);

/* beolvasshoz */ /* a flexibilis tmb ltestse */ /* beolvass */ printf("Krem az adatsort, kln sorban nv s adat!\n"); printf("A vgt a * jelzi.\n"); scanf("%20[^\n]%*[^\n]", hallg.nev); getchar(); i = 0; /* az i. helyre fogunk berni */ while(strcmp(hallg.nev, "*")) { novel(&sor, 1); /* a flexibilis tmb bvtse */ scanf("%f%*[^\n]", &hallg.adat); getchar(); modosit(sor, i++, hallg); scanf("%20[^\n]%*[^\n]", hallg.nev); getchar(); } >>> Programozs Alapjai (2007) 801 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS

SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Rendezs tbb szempont szerint beszuroRend(sor, NevSzerint); /* Rend. nvsor szerint printf("Nvsor szerint rendezve:\n"); for(i = 0; i < felso(sor); ++i) { /* Kirats kiolvas(sor, i, &hallg); printf("%6.2f %s\n", hallg.adat, hallg.nev); } beszuroRend(sor, AdatSzerint); /* Rend. adat szerint printf("Adat szerint rendezve:\n"); for(i = 0; i < felso(sor); ++i) { /* Kirats kiolvas(sor, i, &hallg); printf("%6.2f %s\n", hallg.adat, hallg.nev); } beszuroRend(sor, CsokAdatSzerint); /* Rendezs jra printf("Adat szerint cskken sorba rendezve:\n"); for(i = 0; i < felso(sor); ++i) { /* Kirats kiolvas(sor, i, &hallg);

printf("%6.2f %s\n", hallg.adat, hallg.nev); } megszuntet(&sor); /* a flexibilis tmb trlse */ */ */ */ */ */ */ } Programozs Alapjai (2007) 802 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Lncok Tekintsk azonos tpus adatelemek sorozatt. Ha a sorozat brmely pozcijra vonatkoz bvts s trls mveletet is akarunk vgezni, akkor a tmbs reprezentls nem lehet hatkony, ehelyett a sorozatnak lncolssal trtn reprezentlsa ajnlott. Lncolson olyan adatszerkezetet rtnk, amely a troland sorozat minden elemt egy olyan rekordban (cellban) trolja, amely a sorozat kvetkez elemnek elrst biztost informcit is tartalmazza. Programozs Alapjai (2007) 803 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Lncok Az elrsi informci lehet egy pointer rtk, amely a sorozat kvetkez elemt tartalmaz

cellra (dinamikus vltozra) mutat pointer. A sorozatot az els elemre mutat pointerrel adhatjuk meg. Sorozat 1. Adat 2. Adat 3. Adat 4. Adat Elrsi informci Elrsi informci Elrsi informci NULL Programozs Alapjai (2007)

804 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Lncok C-ben gy hozhatunk ltre lncolt lista tpust: typedef ??? elemtip; /* a sorozat elemtpusa */ typedef struct cellatip { elemtip adat; /* adatelem */ struct cellatip *csat; /* a kvetkez elem celljra */ } cellatip; typedef struct cellatip *pozicio; Programozs Alapjai (2007) /* pointer */

805 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Lncok Deklarljuk a p pointert! Lehet a kvetkez mdokon: cellatip *p; struct cellatip *p; pozicio p; A p pointer ltal megmutatott cella egyes mezire gy hivatkozhatunk: p->adat p->csat Programozs Alapjai (2007) 806 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Lncok A -> s . struktraopertorok a precedenciahierarchia cscsn llnak, s ezrt nagyon szorosan ktnek. A ++p->adat nem p-t, hanem az adat mezt inkrementlja, mivel az alaprtelmezs szerinti zrjelezs: ++(p->adat) Programozs Alapjai (2007) 807 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Lncok Zrjelek hasznlatval a kts megvltoztathat:

(++p)->adat az adat-hoz val hozzfrs eltt nveli p-t, mg (p++)->adat azt kveten inkrementl. Lncok esetn vigyzzunk ezekkel a mveletekkel, mert egyltaln nem biztos, hogy kt cellatip tpus lncelem kzvetlenl egyms utn helyezkedik el a memriban! Programozs Alapjai (2007) 808 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Lncok A lnc soron kvetkez elemt a p->csat pointeren keresztl a

*p->csat hozza be. Programozs Alapjai (2007) 809 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Lncok *p->csat++ azutn inkrementlja csat-t, miutn hozzfrt ahhoz, amire mutat (ekkor a lnc megszakadhat!) (*p->csat)++ azt nveln, amire csat mutat, (de ezt most nem lehet, mert ez egy struct) *p++->csat

azutn inkrementlja p-t, hogy hozzfrt ahhoz, amire csat mutat (de ekkor nem biztos, hogy p tovbbra is a lnc valamelyik elemre mutat). Programozs Alapjai (2007) 810 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Lncok Lncok bejrsra rhatunk olyan fggvnyt amelynek paramtere az elvgzend mvelet: typedef void (*muvelettip)(elemtip*); void bejar(pozicio lanc, muvelettip muv) { pozicio p; for(p = lanc; p != NULL; p = p->csat) { /* mvelet a sorozat elemn */ muv(&(p->adat)); } }

Programozs Alapjai (2007) 811 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tpusokrl C-ben A kvetkezkben a C tpusokhoz, tpuskpzsekhez, deklarcikhoz tartoz nhny tudnivalt tekintnk t. Programozs Alapjai (2007) 812 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Struct, Union, Enum Vltozdeklarcik:

struct { int a, b; } vstruct; union { long long l; double d; } vunion; enum { nulla, egy, ketto, harom } venum; Programozs Alapjai (2007) 813 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Struct, Union, Enum A struct, union s enum a tpusdeklarci, tpusdefinci szempontjbl hasonlan mkdik, gy amit a kvetkezkben a struct tpusrl elmondunk, az analg mdon a union

s enum tpusokra is rvnyes. Programozs Alapjai (2007) 814 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Struct, Union, Enum Ha ugyanilyen tpus vltozkat szeretnnk ksbb is deklarlni akkor rdemes elnevezni a struktrt: struct s { int a, b; } vstruct; ... struct s masodik; ... struct s harmadik; Programozs Alapjai (2007)

815 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Struct, Union, Enum De megtehetjk azt is, hogy egyszeren csak definiljuk a struktrt (vltozdeklarci nlkl), s ksbb hasznljuk fel: struct s { int a, b; }; ... struct s masodik; ... struct s harmadik; Programozs Alapjai (2007) 816 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM

Szoftverfejleszts Tanszk Struct, Union, Enum St, megtehetjk azt is, hogy egyelre csak deklarljuk a struktrt, s csak ksbb definiljuk (de a definci NEM maradhat el!): struct s; ... struct s masodik; ... struct s harmadik; ... struct s { int a, b; } vstruct; Programozs Alapjai (2007) 817 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk

Struct, Union, Enum Vltozdeklarci helyett kszthetnk tpusdefincit is: typedef struct { int a, b; } S; ... S masodik; S harmadik; Programozs Alapjai (2007) 818 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Struct, Union, Enum Akr gy is: struct s { int a, b; } vstruct;

typedef struct s S; ... struct s masodik; S harmadik; s negyedik; /* ROSSZ !!! */ struct S otodik; /* ROSSZ !!! */ Programozs Alapjai (2007) 819 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Struct, Union, Enum Vagy gy: typedef struct s { int a, b; } S; ... struct s masodik;

S harmadik; s negyedik; /* ROSSZ !!! */ struct S otodik; /* ROSSZ !!! */ Programozs Alapjai (2007) 820 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Struct, Union, Enum De adhatjuk a struktrnak s a tpusnak ugyanazt a nevet is: typedef struct st { int a, b; } st; ... struct st masodik; st harmadik; Programozs Alapjai (2007)

821 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bonyolultabb deklarcik A C nyelvben az sszetett tpusok megadsakor megismert mveleteket vges sokszor ismtelhetjk. Mivel a deklarci nem olvashat egyszeren balrl jobbra s mivel a * mvelet alacsonyabb priorits a [] s () mveleteknl, ezrt rdemes nhny pldval megvilgtani a bonyolultabb eseteket. Programozs Alapjai (2007) 822 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Bonyolultabb deklarcik A prioritsi elrs cskken sorrendben B elemkivlasztsok s fgv. ( [], ., ->, () ) J a egyoperandus mveletek ( -, ++, --, !, ~, &, *, sizeof ) B a multiplikatv mveletek ( *, /, % ) B az additv mveletek ( +, - ) B bitlptets ( <<, >> )

B a kisebb-nagyobb relcis mveletek ( <=, >=, <, > ) B az egyenl-nem egyenl relcis mveletek ( ==, != ) B bitenknti 's' mvelet ( & ) B bitenknti 'kizr vagy' mvelet ( ^ ) B bitenknti 'vagy' mvelet ( | ) B a logikai 's' mvelet ( && ) B a logikai 'vagy' mvelet ( || ) J a feltteles mvelet ( ? : ) J rtkad mvelet ( =, +=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |= ) B szekvencia mvelet ( , ) Programozs Alapjai (2007) 823 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bonyolultabb deklarcik Br a prioritsi elrst a mveletek elvgzsnl vezettk be, de ugyanezt az elrst hasznljuk a deklarcinl is. A mveletek elvgzsnek sorrendjt zrjelek

hasznlatval befolysolhatjuk. Ezt tehetjk a deklarciknl is. Pl: int *p /* int x[10] /* int (*x)[10] /* int *x[10] /* int-re mutat pointer */ tmb 10 int-bl */ pointer mutat egy tmbre, ami 10 int-bl ll */ tmb 10 pointerbl, melyek int-re mutatnak */ Programozs Alapjai (2007) 824 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Bonyolultabb deklarcik void (*f)(int) /* pointer egy fggvnyre, aminek paramtere int s nincs visszaadott rtke */ int (*f)(void) /* pointer egy fggvnyre, aminek nincs paramtere s a visszaadott rtk tpusa int */ int (*x[])(int) /* tmb, amelyik pointerekbl ll. Ezek olyan fggvnyre mutatnak, melynek paramtere is s visszaadott rtknek tpusa is int. */ Programozs Alapjai (2007) 825 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts

Tanszk Bonyolultabb deklarcik Lehet-e ennl bonyolultabbakat is? char (*(*f())[])() fggvny visszatr pointerrel, ami egy tmbre mutat s pointerekbl ll, amelyek olyan fggvnyre mutatnak, aminek visszaadott rtknek tpusa char char (*(*x[3])())[5] 3 pointerbl ll tmb. A pointerek olyan fggvnyre mutatnak, amely pointerrel tr vissza. Ezek 5 char-bl ll tmbre mutatnak. Programozs Alapjai (2007) 826 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bonyolultabb deklarcik Mit lehet tancsolni, ha bonyolult deklarcit

kell elkszteni? Pldul hogyan kell deklarlni egy N elem tmbt, amely fggvnyre mutat pointerekbl ll. A fggvny olyan pointerrel tr vissza, amely fggvnyre mutat, s a fggvny karakterre mutat pointerrel tr vissza. Hrom mdszert szoktak ajnlani: Prbljuk meg felrni: char *(*(*a[N])())(); Programozs Alapjai (2007) 827 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bonyolultabb deklarcik Tpusdefincit hasznlva ptsk fel lpsenknt a deklarcit. A megjegyzsekben a megfelel angol terminologit is bevezetjk: typedef char *pc;

typedef pc fpc(); typedef fpc *pfpc; typedef pfpc fpfpc(); typedef fpfpc *pfpfpc; pfpfpc a[N]; /* pointer to char */ /* function returning pointer to char */ /* pointer to ... */ /* function returning ... */ /* pointer to ... */ /* array of ... */ Programozs Alapjai (2007) 828 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bonyolultabb deklarcik

Hasznljuk a cdecl programot, amelyik angolrl C-re s megfordtva kpes deklarlni illetve a deklarcit elmagyarzni. cdecl> declare a as array of pointer to function returning pointer to function returning pointer to char char *(*(*a[])())() cdecl> explain char *(*(*a[])())() declare a as array of pointer to function returning pointer to function returning pointer to char Programozs Alapjai (2007) 829 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bonyolultabb deklarcik s ez mg mind semmi, mert a fggvnyek paramtereirl nem mondtunk semmit! A paramterek tpusa ugyanis megadhat s

minden paramternek a tpusa az elzekhez hasonl bonyolultsg lehet. Azt is szoktk tancsolni, hogy egy bonyolult deklarci megrtst kezdjk bentrl kifel. Programozs Alapjai (2007) 830 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bonyolultabb deklarcik A C nyelvben nemcsak arra van szksg, hogy egy azonostt vltozazonostv vagy tpusazonostv deklarljunk, hanem arra is, hogy magt a tpust adjuk meg. Ezt kell tenni fggvnydeklartoroknl a paramterek tpusnak megadsakor, sizeof argumentumaknt, tpusknyszertsnl. A tpus megadsa szintaktikailag ugyangy trtnik, mint a vltoz deklarlsa, csak az azonost marad el.

Programozs Alapjai (2007) 831 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Bonyolultabb deklarcik int int * int [10] int (*)[10] /* /* /* /* int *[10] /* void (*)(int)

/* int (*)(void) /* int (*[])(int) /* egsz */ int-re mutat pointer */ tmb 10 int-bl */ pointer mutat egy tmbre, ami 10 int-bl ll */ tmb 10 pointerbl, melyek int-re mutatnak */ pointer egy fggvnyre, melynek paramtere int s nincs visszaadott rtke */ pointer egy fggvnyre, melynek nincs paramtere s a visszaadott rtk tpusa int */ tmb, amelyik pointerekbl ll. Ezek olyan fggvnyre mutatnak, melynek paramtere is s

visszaadott rtknek tpusa is int. */ Programozs Alapjai (2007) 832 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tpusknyszerts A tpusknyszerts egy konverzis mvelet, amelyet egy ()-be zrt tpusmegadssal runk el. A prioritsi elrs cskken sorrendben

B elemkivlasztsok s fgv. ( [], ., ->, () ) J a egyoperandus mveletek ( -, ++, --, !, ~, &, *, sizeof ) J tpusknyszerts ( () ) B a multiplikatv mveletek ( *, /, % ) B az additv mveletek ( +, - ) B bitlptets ( <<, >> ) B a kisebb-nagyobb relcis mveletek ( <=, >=, <, > ) B az egyenl-nem egyenl relcis mveletek ( ==, != ) B bitenknti 's' mvelet ( & ) B bitenknti 'kizr vagy' mvelet ( ^ ) B bitenknti 'vagy' mvelet ( | ) B a logikai 's' mvelet ( && ) B a logikai 'vagy' mvelet ( || ) J a feltteles mvelet ( ? : ) J rtkad mvelet ( =, +=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |= ) B szekvencia mvelet ( , )

Programozs Alapjai (2007) 833 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tpusknyszerts Plda tpusknyszertsre: Kt int tpus vltoz osztsa egszoszts s int eredmnyt ad. int i = 7; j = 2; double x; x = i / j; /* x rtke 3.0 lesz */ Ha nem egszosztst szeretnnk, akkor knyszertsk az egyik operandust valamelyik vals tpusv: x = (double) i / j; /* x rtke 3.5 lesz */

Programozs Alapjai (2007) 834 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tpusknyszerts Plda tpusknyszertsre: A dinamikus vltozk szmra leggyakrabban a malloc() fggvnnyel foglalunk helyet. A fggvny a malloc.h-ban van deklarlva: typedef unsigned size_t; void *malloc(size_t); void free(void *); void *realloc(void *, size_t); void *calloc(size_t, size_t); Programozs Alapjai (2007) 835

UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tpusknyszerts A fggvny lefoglalja a megadott bjtszm terletet s a cmt visszadja. Ha nem sikerl a trterlet lefoglalsa, akkor a visszaadott rtk NULL. A malloc() fggvny alkalmazsnl tpusknyszertst kell hasznlni. Pl. int *p; p = (int *) malloc(100 * sizeof(int)); Programozs Alapjai (2007) 836 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tpusknyszerts Hasonlan kell eljrni bonyolultabb tpusok

esetn: typedef struct cellatip { Elemtip adat; /* adatelem */ struct cellatip *csat; /* a kvetkez elem celljra */ } cellatip; typedef struct cellatip *pozicio; /* pointer tpus */ pozicio p; p = (cellatip *) malloc(sizeof(cellatip)); Programozs Alapjai (2007) 837 UNIVERSITAS SCIENTIARUM SZEGEDIENSIS SZEGEDI TUDOMNYEGYETEM Szoftverfejleszts Tanszk Tpusknyszerts A tpusknyszerts egy konverzis mvelet, teht nem alkalmazhat mindig. Pl. Van egy void * p pointer. Tudom, hogy most intre mutat. Szeretnm a pointert lptetni. Lehet-e gy?

((int *)p)++; gy nem lehet, de gy mr igen: p = (void *)((int *)p + 1); vagy egyszeren gy p += sizeof(int); Programozs Alapjai (2007) 838

Recently Viewed Presentations

  • Open up your laptops, go to MrHyatt.rocks, and

    Open up your laptops, go to MrHyatt.rocks, and

    John Young, Commander of the Apollo 16 mission . John Young, Commander of the Apollo 16 mission saluting the flag. The Lunar Module is behind Young, with the Lunar Roving Vehicle parked next to it. This picture shows several interesting...
  • Text-classification using Latent Dirichlet Allocation

    Text-classification using Latent Dirichlet Allocation

    Text-classification using Latent Dirichlet Allocation - intro graphical model Lei Li [email protected] Outline Introduction Unigram model and mixture Text classification using LDA Experiments Conclusion Text Classification What class can you tell given a doc?
  • Introduction to Java programming

    Introduction to Java programming

    print & println. System.out.println("…") As you know, prints the contents inside to the console. What you may not have realised is this is done on the current line (last cursor position - see later), it does . NOT. move to...
  • Norske lysark 2001 - NTNU

    Norske lysark 2001 - NTNU

    Dr.ing. LCA in high energy consuming industries Post.doc., Small scale power and heating systems based on hydrogen/fuel cells Post.doc., Laser-measurements in flames
  • The Nurse View: Top Ten Things to Know About Immune-Mediated ...

    The Nurse View: Top Ten Things to Know About Immune-Mediated ...

    Types of Endocrinopathies. Detection of Thyroid Dysfunction. Management of Thyroid Dysfunction. Detecting Hypophysitis and Adrenal Insufficiency. Patient Education on Thyroid Dysfunction. ASCO® Guidelines on Hypothyroidism. Detection and Management of Rare imAEs.
  • Day 01 - Lesson 4

    Day 01 - Lesson 4

    The building blocks of an O-O program A program that uses O-O is basically a collection of objects Objects interact much like things in the real world do 6/16/09 Python Mini-Course: Lesson 25 * What is an object? ... A...
  • County Transportation 101 Emily Pugh Transportation & Infrastructure

    County Transportation 101 Emily Pugh Transportation & Infrastructure

    Local Option Sales Tax. Rate: Up to ½ of 1 percent on retail sales within the county, and $20 per vehicle excise tax . Use: A specific transportation project, transit capital expenditures as well as operating costs. How Enacted: by...
  • EXERCISE PHYSIOLOGY THE EFFECTS OF EXERCISE ON THE

    EXERCISE PHYSIOLOGY THE EFFECTS OF EXERCISE ON THE

    The ATP-CP System. The ATP- PC system. uses a chemical fuel reserve, Creatine Phosphate, which is stored in the muscle. This process is anaerobic meaning it does not require the use of oxygen for it to work. CP is broken...