Defiíció: Az alsó egészrész függvéy Az alsó egészrész függvéy mide valós számhoz egy egész számot redel hozzá, éppe azt, amely a tőle em agyo egészek közül a legagyo. Az alsó egészrész függvéy jele: x, ahol x valós szám. Tömöre: x max kx kz k (3) Más szavakkal formálisa: x = k, ahol k olya egész szám, hogy k x < k+. példa: x x 5,2 5 5 5,2 6 5 5 5 Defiíció: A felső egészrész függvéy A felső egészrész függvéy mide valós számhoz egy egész számot redel hozzá, éppe azt, amely a tőle em kise egészek közül a legkise. A felső egészrész függvéy jele: x, ahol x valós szám. Tömöre: x mi kx kz k (4) Más szavakkal formálisa: x = k, ahol k olya egész szám, hogy k- < x k. példa: x x 5, 2 5 5 5 5 5 5,2 6 Az alsó és felső egészrész függvéyek fotos tulajdoságait az alái tálázata foglaljuk össze: (Lássuk e, hogy ezek valóa teljesülek!). Ha a egész szám, akkor a a, a a, 2. Ha x valós, a egész szám, akkor x a x a, x a x a, 3. Ha x és y valós számok, akkor x y x y, x y x y 4. Ha x valós szám, akkor x x, x x, 5. Ha x y valós számok, akkor x y, x y, Defiíció: A kerekítő függvéy A kerekítő függvéy mide valós számhoz a hozzá legközele eső egész számot redeli hozzá. Ha a legközelei egész szám em egyértelmű, akkor a agyoat választja. A kerekítő függvéy jele: Roud(x), ahol x valós szám. Roud ( x) x 2 (5)
A legközelei egészre kerekít. Pozitív számok eseté, ha a tizedesrész 5/0, vagy aál agyo, akkor felfelé, kise esete lefelé kerekít. Negatív számok eseté ha a tízes számredszer szeriti felírása a tizedesrész kise, mit 5/0, vagy egyelő vele, akkor felfelé, egyékét lefelé kerekít. példa: x Roud(x) 6 6 5,8 6 5,5 5 5,2 5 5 5 5 5 5,2 5 5,5 6 5,8 6 6 6 Defiíció: A törtrész függvéy A törtrész függvéy mide valós számhoz azt a számot redeli hozzá, amely azt mutatja meg, hogy a szám meyivel agyo az alsó egészrészéél. A törtrész, ahol x valós szám. Tömöre: függvéy jele: x x x x. (6) Midig feáll a 0 x egyelőtleség. példa: x x 5,8 0,2 5,2 0,8 5 0 5 0 5,2 0,2 5,8 0,8 Felhívjuk a figyelmet két műveletre: Defiíció: Az egész háyados képzése, a div művelet Legye a és egész szám, 0. Defiíció szerit az egész osztás műveleté az a/ osztás eredméyéek alsó egész részét értjük. Tömöre: példa: 9 div 4 3, 9 div 4 2 Defiíció: Az egész maradék képzése, a mod művelet Legye a és egész szám. Defiíció szerit a div a / (7) def a mod a a, a / a adiv, ha ha 0 0 (8) példa: 9 mod 4 3, 9 mod 4, 9 mod ( 4), 9 mod ( 4) 3 Speciális jeletése va az a mod jelölések. Ezt mide valós a-ra értelmezzük és jeletése az a valós szám törtrésze, azaz def a a mod (9)
Egy szám lejegyzésekor a haszált számredszer alapszámát midig tizes számredszere adjuk meg és a szám jo alsó sarkához írjuk idexkét. Ha a számredszer alapja a 2 egész szám, akkor az x pozitív egész szám számjegyei: ahol kifejezve: 0 c k c, c,, c c (0), 0, k 0,,, és az x szám értéke ezekkel a számjegyekkel és az alappal x c 0 c c c0 () Az értékét úgy határozzuk meg, hogy legye, és mide, ha. Ha a számredszer alapszáma tízél agyo, akkor a 0,,2,...,9 számjegyek mellett új számjegyeket kell evezeti a tíz, tizeegy,..., a lati áécé agyetűit haszáljuk eze célra. Ilye módo tehát az A=0, B=, C=2,..., Z=35 jelek haszálatosak. (Lehet találkozi vegyes jelöléssel is, ahol a számjegyeket tizes számredszere jegyzik le. Mi em fogjuk ezt alkalmazi.) c 0 c k 0 k számértékekre. Kéyelmi és yomdatechikai okok miatt példa: 2006 számjegyei tizes számredszere 2006 20 00 00 60 3 2 0. c 3 2, c 2 0, c 0, c 0 6. Itt =3 és Nyílvávalóa: c 0 x mod és c c c c x div 2. A következő séma alkalmas a számjegyek egymást követő fordított iráyú előhozására: x x x div c x mod 0 x2 x div c x mod x x xk div c k xk mod x div c x mod 0 c x mod k (2) példa: Írjuk fel a 2006-ot kettes (= iáris) számredszere és 6-os (= hexadecimális) számredszere. 2006 2 2006 6 Tehát 20060=00002=7D66 003 0 25 6 50 7 3=D6 250 0 0 7 25 0 62 3 0 5 7 3 0
Átírás tizes alapra a () formula átredezésével törtéik az úgyevezett Horer séma szerit. c c c c0 x (3) Ezzel azt érjük el, hogy kevés műveletet kell haszáli, a műveletek azoos jellegűek, másrészt a műveleteket végezhetjük tizes számredszere. példa: 7D66=((7) 6+3) 6+6=2006 00002=(((((((((() 2+) 2+) 2+) 2+) 2+0) 2+) 2+0) 2+0) 2+) 2+0 20060=(((2) 0+0) 0+0) 0+6 Kellemes az átváltás a két számredszereli árázolás között, ha törtéetese a iáris és a hexadecimális számredszerről va szó. Ekkor hexadecimális alakról iárisra törtéő átírás eseté mide hexadecimális jegyet a jegy iáris megfelelőjével helyettesítük. Biárisról hexadecimálisra törtéő átírásál pedig a törtvesszőtől jora is és alra is égyes csoportokra osztva a iáris szám számjegyeit, mide csoportot helyettesítük a hexadecimális megfelelőjével. A megfeleltetés a hexadecimális számjegyek és a iáris égyjegyű csoportok között az alái tálázata látható: 0000 0 000 4 000 8 00 C 000 00 5 00 9 0 D 000 2 00 6 00 A 0 E 00 3 0 7 0 B F (Lássuk e, hogy a javasolt módszer helyes eredméyre vezet!) Módszerükkel kikerüljük egyrészt a tizes számredszerre törtéő átmeeti átalakítást, másrészt em kell em tizes alapú számredszere műveleteket végezi Pozitív egész szám alapú logaritmusa és a szám alapú számredszereli számjegyei számáak a kapcsolatát világítja meg az alái tétel. 3. Tétel: A számjegyek számáról Pozitív x egész szám számjegyeiek a száma alapú számredszere eggyel tö, mit a szám alapú logaritmusáak az alsó egészrésze, azaz ha a szám számjegyei c, c,, c, c0, akkor a jegyek száma log x (4) Bizoyítás x c c c c c / / 0 / y c 0 c c Világos, hogy y. Ie az y logaritmusára kapjuk, hogy c y 0 (5)
0 log y (6) (5)-ől logaritmálással adódik. Azaz log x log log y log y (7) log y log x (8) (8) midkét oldalá az alsó egészrészt véve log x adódik, mivel egész szám és (6) feáll. Egyet hozzáadva midkét oldalhoz kapjuk az állításukat. Általáa em fog miket érdekeli, hogy a taulmáyuk tárgyai, ojektumai hogya valósíthatók meg fizikailag (hogya realizálhatók). Eek elleére em árt egy kis kitekités a számítástechikára. Az egyik fotos dolog, hogy az egész számok hogya kerülek tárolásra a számítógép memóriájáa. A memóriát úgy lehet elképzeli, mit egymás mellett lieárisa felsorakoztatott tárolórekeszek sorozata. A rekeszeket egymástól a sora elfoglalt helyük külöözteti meg, amit egy idexszel (címmel) íruk le. A rekesz fogalom szemléletes, de fizikailag em potos. A fizikai rekesz ma a yte (= 8 it). A yte a memória legkise fizikailag címezhető egysége. A memóriáól kiolvasi, vagy oda eíri egy yte-ál kevese adatmeyiséget em lehet. Ha csak egy itet akaruk megváltoztati, akkor is ki kell olvasi az őt tartalmazó yte-ot, a kívát itet átíri, majd a yte-ot visszaíri a memóriáa. A yte tartalmát a jo áttekithetőség miatt hexadecimális számredszere szoktuk megadi. Például az 00002 tartalmú yte hexadecimális alaka C96. A yte itjeit joról alra idexeljük. A joszélső it a ullás idexű it (a legkevésé szigifikás it, Least Sigificat Bit, LSB), tőle alra áll az egyes idexű it, és így tová. A yte alszélé áll a hetes it (a legszigifikása it, a legagyo helyiértékű it, Most Sigificat Bit, MSB). MSB LSB it7 it6 it5 it4 it3 it2 it it0 itidex 7 6 5 4 3 2 0 Byte és itjei Már egyetle yte is alkalmas szám tárolására, csak a számtartomáy kicsi. A yolc it midegyike lehet zérus, vagy egy. Eek megfelelőe 2 8 = 256 egymástól külööző yte létezhet. Mide ilye itvariációhoz hozzáredelük egy számot. Természetes módo kíálkozott és a gyakorlat is ezt részesítette előye, hogy előjel élküli (emegatív) illetve előjeles számokat külööztessük meg. A yte tartalmát aszerit iterpretáljuk, hogy milye típusú adatot akaruk ee láti. Előjel élküli esete a hozzáredelés a yte tartalomhoz a itsorozat kettes számredszere leírt számkét való értelmezése. Ekkor a legkise szám a zérus lesz (tiszta zérus itek), a legagyo a 255 (tiszta egyes itek). Ha előjeles számokat szereték tároli, akkor az úgyevezett kettes komplemes árázolást szokás előyei miatt alkalmazi. Ekkor az előjeles egész szám hozzáredelése úgy törtéik, hogy ha a MSB=0, akkor a yte tartalmat az előjelmetes esetek megfelelőe értelmezzük. Ha MSB=, akkor ayival kell töet teük, hogy a kapott előjelmetes számól kivojuk a 2 8 = 256 számot, ami iztosa egatív lesz. Eze a módo a legkise szám 28 lesz (MSB=, a töi it zérus), a
legagyo szám 27 lesz (MSB=0, a töi it egyes). Egy adott itmitázathoz tartozó kettes komplemesek a meghatározására egy egyszerű szaály a következő: a mitázat jovégétől alfelé haladva leírjuk az összes itet változatlaul az elsőkét előforduló egyes ittel ezárólag, majd ezutá mide továi itet elletétesre változtatuk. (Lássuk e, hogy a módszer valóa helyes! Va-e olya itmitázat, amelyek a kettes komplemese saját maga, és ha va, akkor háy va és melyek ezek?) Egy yte tartalmát értelmezhetjük azoa karakterkét is. A karakter gyűjtőfogalom, a etű, számjegy, írásjel, vezérlőjel összefoglaló eve. Ha egy yte tartalmát karakterkét kívájuk iterpretáli, akkor haszálhatjuk a szaváyos és elterjedt ASCII kódtálázatot, amely a C. Függeléke megtalálható. Nem céluk most itt elemei eek az egyszerű dologak a gyakorlat által törtéő elarokkosításáa, amikoris a karakter milyesége függhet az eszköztől, amire azt kiküldjük (képeryő, yomtató, st.), a yelvi megállapodástól st. Bármilye meglepő ezekutá, egy yte-ot yolc itek is lehet iterpretáli, amikor az egyes itekek más és más a jeletése. Ilyekor jelzőitekről (flag-ek) eszélük. Az egyes itek szemafor szerepet játszaak, pillaatyi értéküktől függőe dötük. Visszatérve az egész számok árázolására azoal látszik, hogy az egyetle yte agyo szűk mozgásteret eged, kicsi az átfogott számtartomáy. A fizikai eszközeik (a hardware) lehetőséget iztosítaak tö yte összekapcsolására. Ez azoa a software útjá is megvalósítható, csak az kevésé hatékoy. Két yte már 6 itet ad, ami 2 6 =65536 külööző szám megadhatóságát jeleti. A yte-párt szóak (word) evezik. A szóa a MSB a szó alszélé a 5-ös idexű it. MSB LSB it 5 Bit 4 it 3 it 2 it it 0 it 9 it 8 it 7 it 6 it 5 it 4 it 3 Bit 2 it it 0 Magas helyiértékű yte Alacsoy helyiértékű yte Szó és itjei Előjel élküli számok eseté a legkise érték 0 (6 zérus it) a legagyo szám 2 6 - = 65535 (6 egyes it). Előjeles számok eseté ha MSB=, akkor kivoi a 2 6 =65536-ot kell. A legkise szám -2 5 = -32768 (MSB=, a töi it zérus), a legagyo 2 5 - = 32767 (MSB=0, a töi it egyes). Mód va égy yte összekapcsolására. Ez a dupla szó (doule word). A dupla szóa a MSB it idexe 3. MSB LSB 3 24 23 6 5 8 7 0 3. yte 2. yte. yte 0. yte Duplaszó yte-jai és itjei A lehetőségek száma 2 32 = 4294967296. Előjel élküli számok eseté a legkise szám a zérus, a legagyo 2 32 - = 4294967295. Előjeles esete ha MSB=, akkor kivoi a 2 32 = 4294967296 számot kell. A legkise szám a -2 3 = -247483648, a legagyo 2 3 - = 247483647. Ha a yte-okat az egyik számítógépről valamely másikra visszük át, akkor em léyegtele, hogy az összekapcsolt yte-ok eseté mi a helyes yte-sorred. Az Itel processzorok az összekapcsolt yte-okat fordított sorrede rakják le egymás utá a memóriáa, ami azt jeleti, hogy elöl a legalacsoya helyiértékeket tartalmazó yte áll, majd azt követik az egyre magasa helyiértékeket adó yte-ok. (A Motorola processzorok az egyees sorred hívei, először a legmagasa helyiértékű yte, majd a csökkeő helyiérték szeritiek következek.) Szó yte-jai Duplaszó yte-jai memória...... 0. yte. yte...... 0. yte. yte 2. yte 3. yte...... Itel yte sorred övekvő yte címek
Szó yte-jai Duplaszó yte-jai memória....... yte 0. yte...... 3. yte 2. yte. yte 0. yte...... Motorola yte sorred övekvő yte címek Az egész számokkal végzett műveletek potos eredméyt adak, ha a végeredméy és az összes részeredméy az árázolási tartomáya esik. Összefoglalva a számtartomáyokat: előjel élküli szám előjeles szám legkise legagyo legkise legagyo yte 0 2 8 - -2 7 2 7 - szó 0 2 6 - -2 5 2 5 - dupla szó 0 2 32 - -2 3 2 3 - Más a helyzet a valós számokkal. Eze a tére ma már szaváy létezik, az IEEE 754-es szaváy, amely 985 óta érvéyes és William Kaha a Berkeley egyetem professzora evéhez fűződik. A szaváy potos előírásokat ad a valós számok árázolására. Potosaa em is valós számokak evezik az ílymódo kezelhetö számokat, haem leegőpotos számokak. Eze árázolási formát em tárgyaljuk teljes részletezettséggel, de a két együtt ismertethető esetről - az egyszeres potosság és a dupla potosság esete - szóluk éháy szót. Előtte azoa meg kell ismerkedi egy a tizedes törteket más alapú számredszere törtéő lehetséges átírási módszerrel. Tekitsük egy szám törtrészéek a tizes számredszereli felírását. A szám legye 0, c c 2 c 3 alakú, ahol c, c 2, c 3 a törtrész egymást követő tizedesjegyei. Ha 0-zel szorzuk, akkor az első tizedesjegy kicsúszik az egészek helyére, amit levághatuk. Továi szorzásokkal a töi jegy is előjö egymás utá. Ha miket egy alapú számredszereli felírás jegyei érdekelek, akkor világos, hugy a 0 helyett -vel kell szorozgati. A tevékeység egy sémáa foglalható, a számjegyek egyees sorrede keletkezek: c c x x x x mod 2 x x2 x mod c k xk xk xk mod A visszaalakítás pedig törtéhet szité egy Horeres séma szerit. Az értelmezése ugyais x 0, c c c c szám 2 3 x / 2 3 c / c2 / c3 / c (9) Ez úgy is számolható, hogy x... c / c / c2 / c / (20) A séma kéyelmes, felváltva kell számjegyekét osztást és összeadást végezi.
2. példa: Írjuk fel a 0,52734375-öt kettes (= iáris) számredszere és 6-os (= hexadecimális) számredszere. 2 0,52734375 6 0,52734375 Tehát 0,527343750=0,00002=0,876 0,0546875 8 0,4375 0 0,09375 7 0,0 0 0,2875 0 0,4375 0 0,875 0,75 0,5 0,0 3. példa: Visszaírás tizes számredszerre: 0,876=0+((7)/6+8)/6=0,52734375 0,00002=0+(((((((()/2+)/2+0)/2+0)/2+0)/2+0)/2+)/2 0,527343750=0+((((((((5)/0+7)/0+3)/0+4)/0+3)/0+7)/0+2)/0+5)/0 A tizedes törtek átalakításáak va egy a számítógép oldaláról tekitve kellemetle oldala. Az ugyais, hogy ami véges tizedes tört az egyik alap mellett, az em iztos, hogy szité véges lesz a másik alap mellett. Például 0,0 iárisa végtele sok törtjegyet tartalmaz. (Elleőrizzük!) Tároli viszot midig csak véges sok itet tuduk. Valahol a végtele sorozatot el kell vági. Ez azt jeleti, hogy az átalakított szám már em fog megegyezi értékét tekitve az eredetivel. Tehát például, ha egy program ekér egy leegőpotos számot és 0,-et illeytűzük e, akkor az kettes számredszerelivé átalakítva értékét tekitve em fog megegyezi az eredeti tízes számredszereli 0,-del. Ha egy törtjegyeket tartalmazó számak az egészek helyé álló része em zérus, akkor először átalakítjuk az egészek részét, majd a törtrészt és a kettőt egy törtvesszővel elválasztva egymás mellé helyezzük. 4. példa: 2006,527343750=0000,00002=7D6,876 A szaváy szeriti leegőpotos számárázolás égy yte-o törtéik egyszeres potosság eseté és yolc yte-o dupla potosság eseté. A kettő között eltérés igazá csak a potossága és az átfogott számtartomáya va, az árázolás elve azoos. Tekitsük először a ormalizált szám esetét. Legye a szám emzérus. Ekkor a iárisa felírt számot átalakítjuk olya formára, hogy a törtvesszőt a legelső egyes jegyet közvetleül követőe helyezzük el és megjegyezzük, hogy eze művelethez a törtvesszőt háy itpozícióval kellett alra mozgati. Ez a szám alra mozgásál pozitív, jora mozgásál egatív lesz és azt mutatja, hogy az átalakítás utái számot a 2 milye kitevőjű hatváyával kell megszorozi, hogy a kiiduló számot megkapjuk. A törtvesszőt követő itek sorozatáak eve: szigifikás. Eze iformációkat kell elhelyezük a redelkezésre álló égy illetve yolc yte-o. A itek kiosztása az egyszeres potosság eseté: előjelit kitevő 8 ite szigifikás 23 ite 3. yte 2. yte. yte 0. yte Egyszeres potosságú leegőpotos szám Az előjelit pozitív szám eseté zérus, egatív szám eseté. A kitevő részére fetartott 8 ites mezőe a kitevő 27-tel megövelt (eltolt) értékét helyezzük el előjel élküli egész
számkét. A szigifikás (a vezető egyes élkül, implicit egyes it) kerül a hátramaradt 23 ites mezőe. 5. példa:példa: 2006,52734375 hogya éz ki egyszeres potosságú leegőpotos számkét? A szám iárisa, ahogy már kiszámoltuk: 0000,00002. Normalizált alaka:,00000000 ahol a kitevő decimálisa 0, ami 27-tel eltolva 0+27=37=000002. (Negatív kitevőt 8 ite kettes komplemes módo tároluk, majd így adjuk hozzá a 27-et.) A szigifikás 23 itre zérusokkal kiegészítve: 0000000000000. Végül az egyszeres potosságú leegőpotos árázolás 32 itje 000 00 0 00 00 0000 0 0000, vagy hexadecimálisa 45 7A 50 E0. A szám ee a formáa törtéő árázolása csak akkor megegedett, ha az eltolt kitevő em zérus és em 255. Ez a két szélső eset más célra va fetartva. A tiszta zérus iteket tartalmazó kitevő mező és a zérus szigifikás együtt zéruskét va defiiálva. Va pozitív zérus és egatív zérus az előjeltől függőe, de valójáa a leegőpotos processzor (koprocesszor) ezeket azooskét kezeli. Ha a kitevő mező zérus, de a szigifikás mező em zérus, akkor em ormalizált (deormalizált) leegőpotos számról eszélük. Ekkor az implicit egyes it is tárolásra kerül, mit a szigifikás része, mivel a törtvessző mögé kerül. Deormalizált tárolásál komoly jegyveszteségre lehet számítai! Például a 2-26 még ormalizált módo tárolódik, de a tőle kise kitevőjűekél már az eddig elhagyott egyes itet is tároljuk. Az alái tálázat illusztrál éháy esetet. Szám Byte-ok iárisa Byte-ok hexáa 2-26 0000 0000 000 0000 0000 0000 0000 0000 00 80 00 00 2-27 0000 0000 000 0000 0000 0000 0000 0000 00 40 00 00 2-28 0000 0000 000 0000 0000 0000 0000 0000 00 20 00 00 2-49 0000 0000 0000 0000 0000 0000 0000 000 00 00 00 0 A kitevő mező legmagasa értékéhez szité két eset tartozik. Ha a szigifikás mező zérus, akkor a tárolt iformáció előjeles végtelekét va defiiálva. Szimólum Byte-ok iárisa Byte-ok hexáa + 0 000 0000 0000 0000 0000 0000 7F 80 00 00-000 0000 0000 0000 0000 0000 FF 80 00 00 A végtele kezelése sorá a processzor a végteleel végezhető műveletek tulajdoságait megtartja. Például végtele plusz véges eredméye végtele, vagy véges osztva végteleel zérust ad. Ha a szigifikás rész em zérus, akkor ezt a szituációt em számkét defiiálták (NaN=Not a Numer). Szimólum NaN NaN Byte-ok iárisa 0 xxx xxxx xxxx xxxx xxxx xxxx xxx xxxx xxxx xxxx xxxx xxxx A sémáa az x-szel jelölt itek em lehetek egyszerre mid zérusok. Ilye eset (NaN) lehet például a végtele osztva végteleel művelet eredméye. Azok a számok, értékek, állapotok, amelyek a feti sémáa em férek ele, em árázolhatók, velük közvetle módo számoli em tuduk.
A dupla potosságú esete a yolc yte-a a kitevő mező ites, a szigifikás mező 52 ites. A kitevő eltolás mértéke 023. A kitevő mező két kitütetett értéke a zérus és az 2047. Egy tálázata mellékeljük a leegőpotos aritmetika lehetőségeit, korlátait: Jellemzők Egyszeres potosság Dupla potosság Előjelitek száma Kitevő itek száma 8 Törtrész itek száma 23 52 Összes itek száma 32 64 Kitevő árázolása 27-es eltolás 023-as eltolás Kitevő tartomáya -26 - +27-022 - +023 Legkise ormalizált szám 2-26 2-022 Legagyo ormalizált szám k. 2 28 k. 2 024 Decimális számtartomáy k. 0-38 - 0 38 k. 0-308 - 0 308 Értékes decimális jegyek száma k. 6-7 k. 5-6 Legkise em ormalizált szám k. 0-45 k. 0-324 A számítógép programozásáról A számítógépes programozás területéről tö fogalomra lesz szükségük aak elleére, hogy igazá egyetle programozási yelv mellett sem kötelezzük el magukat. A számításaik, adatoko végzett tevékeységeik elvégzéséhez gépi utasítások, paracsok rögzített sorozatára lesz szükségük. Ezeket összefogva programak fogjuk evezi. A programot valamilye magas szitű programozási yelve (az emer godolkodásmódjához közel álló yelve) írjuk meg, majd azt a gép yelvére egy fordítóprogram (compiler) segítségével fordítjuk le (remélhetőe jól). Ha va iterpreter program, akkor azzal is megoldható a feladatvégzések a gépre törtéő átvitele. A programok általáa procedúrák (eljárások) sokaságát tartalmazzák. Ezek a zárt programegységek egy-egy kise feladat elvégzésére specializáltak. A program töi részével csak a paramétereik révé tartják a kapcsolatot. Fekete doozak kell őket tekiteük. A doozra rá va írva, hogy miől mit csiál. Vaak (lehetek) emeő (iput) és vaak (lehetek) kimeő (output) paraméterei. A emeetet alakítják át a kimeetté. Ha ismerjük a procedúra első szerkezetét mert modjuk mi készítettük, akkor fehér dooz a eve, ha em ismerjük mert em vagyuk kívácsiak rá, vagy másoktól kaptuk, akkor fekete dooz szerkezet a eve. Például készíthetük olya procedúrát, amely ekéri (iput) az a,, c három valós számot, melyeket egy ax 2 +x+c kifejezés (itt x valós szám, változó) kostas együtthatóiak tekit, majd eredméyül (output) meghatározza a kifejezés valós gyökeiek a számát és ha va(ak) gyök(ök), akkor az(oka)t is megadja. Példa egy lehetséges másik procedúrára: egy file evéek ismeretée a procedúra a file rekordjait valamilye szempot szerit megfelelő sorrede rakja (redezi). A procedúrák által haszált memóriarekeszek a paramétereket kivéve a zártságak köszöhetőe lokálisak a procedúrára ézve. Csak addig foglaltak, míg a procedúra dolgozik, aktív. A procedúrát mukára fogi az aktivizáló utasítással lehet. Ezt eljáráshívásak is evezik. Az aktivizált procedúra lehet saját maga az aktivizáló is, ekkor rekurzív hívásról eszélük, a procedúrát pedig rekurzív procedúráak evezzük. A procedúra mukája végé a vezérlés visszaadódik az aktivizáló utasítást követő utasításra. Ezt a mechaizmust a verem (stack) révé valósítjuk meg. A verem a memória egy erre a célra kiválasztott része. A procedúra aktivizálásakor ide kerülek eírásra a procedúra paraméterei és a visszatérési cím (az aktivizáló utasítást követő utasítás címe). A procedúráól való visszatéréskor eze cím és iformációk alapjá tudjuk
folytati a mukát, a programot. A visszatéréskor a veremől az aktivizálási iformációk törlődek. Ha a procedúra aktivizál egy másik procedúrát, akkor a vereme a koráiakat követőe az új aktivizálási iformációk is ekerülek, azt modjuk, hogy a verem mélyül, a veremmélység szitszáma eggyel ő. Kezdete a verem üres, a szitszám zérus, procedúrahíváskor a szitszám ő eggyel, visszatéréskor csökke eggyel. A dolog pikatériájához tartozik, hogy a procedúra a lokális változóit is a vereme szokta helyezi, csak ezt közvetleül em érzékeljük, mivel a visszatéréskor ezek oa törlődek, a helyük felszaadul. Időkét azoa a hatás sajálatosa látváyos, amikor verem túlcsordulás (stack overflow) miatt hiajelzést kapuk és a program futása, a feladat megoldásáak meete megszakad. Adódhat azoa úgy is, hogy mideféle hiajelzés élkül lefagy a gép. A veremek a valósága va egy felső mérethatára, amelyet agyo em taácsos túllépi. Nézzük egy példát a veremhaszálatra. Tegyük fel, hogy va még olya elvetemült iformatikus, aki em tudja, hogy 2 3, és ezért egy kis procedúrát ír 2 eek kiszámítására. Ameyie az illető a fet említett hiája mellett teljese ormális, akkor ige agy eséllyel az alái módo oldja meg a prolémát. A procedúra eve legye Summa és legye egy paramétere az, hogy -től kezdve meddig törtéje az összeadás. Feltételezzük a procedúra jóhiszemű haszálatát és így az pozitív egész szám kell legye. (Nem írjuk meg a procedúrát első lépése még olodiztosra.) Kirészletezzük egy kissé a procedúra teedőit. Szükség lesz egy gyűjtőrekeszre, ahol az összeget fogjuk képezi és tároli. Legye eek a eve s. A procedúra mukájáak végé ez lesz a végeredméy, ezt kapjuk vissza, ez lesz a procedúra output paramétere. Szükség lesz továá egy számlálóra, legye a eve k, amellyel egytől egyesével elszámoluk -ig és mide egyes értékét az s-hez a számlálás köze hozzáadjuk. Az s-et a muka kezdeté természetese ki kell ullázi, hisze em tudjuk, hogy mi va ee az iduláskor. Ezek utá a kósza meggodolások utá egy kissé redezette alaka is írjuk le a teedőket. Összefoglaló adatok a procedúráról: A Summa procedúra leírása A procedúra eve: Summa. Bemeő paraméter:, megadja, hogy -től meddig kell az összeadást elvégezi. Kijövő paraméter: s, tartalmazza az összeget a végé. Lokális változó: k, számláló, amely egytől elszámol -ig egyesével. A procedúra tevékeysége:. lépés: s kiullázása 2. lépés: k eállítása -re, ie idul a számlálás 3. lépés: s megövelése k-val (s-hez hozzáadjuk a k-t és az eredméy s-e marad. 4. lépés: Eggyel megöveljük a k számláló értékét 5. lépés: Elleőrizzük, hogy a k számláló em lépett-e túl az -e, a végértéke. Ha még em, akkor folytatjuk a mukát a 3. lépésél. Ha ige, akkor pedig a 6. lépéshez megyük. 6. lépés: Késze vagyuk, az eredméy az s-e található. Ezutá ha szükségük va, modjuk, -től 5-ig a számok összegére, akkor csak leírjuk, hogy Summa(Iput:5, Output s), vagy rövidee Summa(5,s). Esetleg függvéyes alakot haszálva
az s=summa(5) is írható. Az aktivizálás hatására a vereme ekerül az 5-ös szám, valamit az s rekesz memóriaeli címe és a visszatérési cím, hogy a procedúra mukája utá hol kell folytati a tevékeységet. Miutá most ics tö teedő, ezért ez a cím olya lesz, amelyől ez a téy kiderül. Jelezhetjük ezt formálisa modjuk egy STOP-pal. Valahogy így éz ki a verem formálisa: 5 s címe STOP Kezdete üres volt a verem, most egy szit került ele ejegyzésre. Amikor a procedúra mukája véget ér, akkor ez a ejegyzés a veremől törlődik, így az újra üres lesz. (Tulajdoképpe a számláló számára lefoglalt helyet is fel kellett vola tüteti a ejegyzése, de ez a számukra most em fotos.) Mide agyo szép, mide agyo jó, mideel meg vagyuk elégedve, és akkor jö egy rekurzióval megfertőzött agyú emer, aki így godolkodik. Egytől -ig összeadi a számokat az ugyaaz, mit az egytől --ig összeadott számok összegéhez az -et hozzáadi. A feladatot visszavezettük saját magára, csak kise mérete. Egytől --ig persze megit úgy aduk össze, hogy az -2-ig képezett összeghez adjuk az --et. Ez a rekurzió. Arra kell vigyázi, hogy valahol eek a visszavezetések véget kell veti. Amikor már csak egytől egyig kell az összeget képezi, akkor azt em vezetjük vissza tová, hisze ott tudjuk az eredméyt, ami triviálisa éppe egy. Tehát a rekurzív agyú emer egy függvéyt alkot, modjuk RekurzívSumma éve, és az alái módo defiiálja azt:, ha R ekurzívsumma (24) RekurzívSumma, ha Ha most leirjuk, hogy s=rekurzívsumma(5), akkor ezt úgy kell kiszámoli, hogy: s=rekurzívsumma(5) = RekurzívSumma(4)+5 =(RekurzívSumma(3)+4)+5 =((RekurzívSumma(2)+3)+4)+5 =(((RekurzívSumma()+2)+3)+4)+5 =((+2)+3)+4)+5 =((3+3)+4)+5 =(6+4)+5 =0+5 =5 Lássuk ezekutá hogya alakul a verem törtéete. A RekurzívSumma(5) hatására az üres vereme egy ejegyzés kerül: 5 eredméy Az eredméy s-e írási címe A továiaka pedig a verem az egyes rekurzív hívások hatására a következőképpe alakul: RekurzívSumma(5): 5 eredméy Az eredméy s-e írási címe RekurzívSumma(4): 4 eredméy Összeadás helye RekurzívSumma(3): 3 eredméy Összeadás helye RekurzívSumma(2): 2 eredméy Összeadás helye
RekurzívSumma(): eredméy Összeadás helye Itt a rekurzió megakad, továi rekurzív hívás már em lesz, a végleges veremmélység 5, a rekurzív hívások száma 4 (a legelső aktivizálás még em rekurzív hívás). A legutolsó hívás már tud számoli, és az eredméy lesz, ami a vereme meg is jeleik: RekurzívSumma(5): 5 eredméy Az eredméy s-e írási címe RekurzívSumma(4): 4 eredméy Összeadás helye RekurzívSumma(3): 3 eredméy Összeadás helye RekurzívSumma(2): 2 eredméy Összeadás helye RekurzívSumma(): Összeadás helye Ezutá az utolsó előtti híváseli összeadás (+2) elvégezhető, a hívás efejeződik és a veremől a legutolsó ejegyzés törlődik. A továiaka redre az alái veremállapotok állak elő: RekurzívSumma(5): 5 eredméy Az eredméy s-e írási címe RekurzívSumma(4): 4 eredméy Összeadás helye RekurzívSumma(3): 3 eredméy Összeadás helye RekurzívSumma(2): 2 3 Összeadás helye RekurzívSumma(5): 5 eredméy Az eredméy s-e írási címe RekurzívSumma(4): 4 eredméy Összeadás helye RekurzívSumma(3): 3 6 Összeadás helye RekurzívSumma(5): 5 eredméy Az eredméy s-e írási címe RekurzívSumma(4): 4 0 Összeadás helye RekurzívSumma(5): 5 5 Az eredméy s-e írási címe Ie a visszatérés az értékadáshoz, az s-e törtéő eredméy elhelyezéshez törtéik, miáltal a verem kiürül. Az elmodottak alapjá látszik, hogy a feladat elvégzéséhez szükséges maximális veremmélység 5 és összese 4 rekurzív hívás törtét. Itt akár fel is lélegezheték, de ekkor egy úja, még súlyosa állapota lévő fazo jeleik meg, aki azt modja, hogy lehet ezt még szee is csiáli. Ő a rekurziót arra építi, hogy az összeg képezhető úgy is, hogy az összeadadó számok halmaza első feléek összegéhez hozzáadja a halmaz második feléek összegét. A felezést továi felezéssel számolja, mígcsak az aprózódás révé el em jut egytagú ősszegekig. Rövide és tömöre ő egy másik függvéyt defiiál, amely kétváltozós, eve RekSum(m,), és m-től -ig adja össze a számokat. Ezzel az általáosa függvéyel egytől -ig összeadi RekSum(,)-el lehet. Speciálisa a mi feti prolémák esetée : RekSum(;5) számoladó. Az ő defiíciója így éz ki: m, ha m RekSum m, m m (25) RekSum m, RekSum,, ha m 2 2 Nézzük csak hogya is számol ez a ravasz mődszer a mi speciális s=reksum(;5) esetüke? s=reksum(;5) =RekSum(;3) + RekSum(4;5)
=(RekSum(;2) + RekSum(3;3)) + (RekSum(4;4) + RekSum(5;5)) =((RekSum(;) + RekSum(2;2)) + 3) + (4 + 5)) =(( + 2) + 3) + (4 + 5)) =(3 + 3) + (4 + 5) =(6 + 9) =5 Hogya alakul a verem sorsa ee az esete? Az első aktivizáló hívás utá a verem: 5 eredméy Az eredméy s-e írási címe Ezutá következik a RekSum(;3) hívás. A hatása: RekSum(,5) 5 eredméy Az eredméy s-e írási címe RekSum(,3) 3 eredméy Összeadásjel Most jö a RekSum(;2) hívás a RekSum(;3)-o elül. A hatás: RekSum(,5) 5 eredméy Az eredméy s-e írási címe RekSum(,3) 3 eredméy Összeadásjel RekSum(,2) 2 eredméy Összeadásjel Ez megit em számolható közvetleül, tehát jö a RekSum(;), mire a verem új képe: RekSum(,5) 5 eredméy Az eredméy s-e írási címe RekSum(,3) 3 eredméy Összeadásjel RekSum(,2) 2 eredméy Összeadásjel RekSum(,) eredméy Összeadásjel Itt már va eredméy, átmeetileg ics tö rekurzív hívás. Az eredméy. RekSum(,5) 5 eredméy Az eredméy s-e írási címe RekSum(,3) 3 eredméy Összeadásjel RekSum(,2) 2 eredméy Összeadásjel RekSum(,) Összeadásjel A hívás efejezte utá a veremől kiürül a legutolsó ejegyzés, visszatérük az összeadásjelhez, amely utá azoa egy úja rekurzív hívás keletkezik, a RekSum(2;2). hatására a verem képe: RekSum(,5) 5 eredméy Az eredméy s-e írási címe RekSum(,3) 3 eredméy Összeadásjel RekSum(,2) 2 eredméy Összeadásjel RekSum(2,2) 2 2 2 eredméy Összeadás efejezése Az ie törtéő visszatérés utá a verem képe: RekSum(,5) 5 eredméy Az eredméy s-e írási címe RekSum(,3) 3 eredméy Összeadásjel RekSum(,2) 2 3 Összeadásjel
Az összeadás elvégzéséhez itt azoa egy úja rekurzív hívás szükséges, a RekSum(3;3). Ie RekSum(,5) 5 eredméy Az eredméy s-e írási címe RekSum(,3) 3 eredméy Összeadásjel RekSum(3,3) 3 3 3 eredméy Összeadás efejezése RekSum(,5) 5 eredméy Az eredméy s-e írási címe RekSum(,3) 3 6 Összeadásjel következik, majd pedig egy úja hívás, a RekSum(4;5). A veremállapot: RekSum(,5) 5 eredméy Az eredméy s-e írási címe RekSum(4,5) 4 4 5 eredméy Összeadásjel Úja hívás szükséges a RekSum(4;4). A veremállapot: RekSum(,5) 5 eredméy Az eredméy s-e írási címe RekSum(4,5) 4 5 eredméy Összeadás vége RekSum(4,4) 4 4 eredméy Összeadásjel Eek efejezte utá és a veremől törtéő törlést követőe még kell egy hívásak leie, ez pedig a RekSum(4;4). A veremállapot: RekSum(,5) 5 eredméy Az eredméy s-e írási címe RekSum(4,5) 4 4 5 eredméy Összeadás vége RekSum(5,5) 5 5 5 eredméy Összeadás vége Ietől kezdve a verem már csak ürül, továi rekurzív hívásokra ics szükség. A feladat elvégzéséhez kevese szitől álló verem is elég volt, mit az előző esete, most a maximális veremmélység csak 4 volt. A rekurzív hívások száma azoa megőtt, összese yolc rekurzív hívás volt. Ee a rekurzióa mide hívás, kivéve a legalsó szite levőket két újaat eredméyezett, de ezek a veremek ugyaazo szitjét haszálták. A hívások szerkezetét egy úgyevezett hívási fa sémával tudjuk árázoli, melye csak a paraméter értékeket tütetjük fel. Íme:
(,5) (,3) (4,5) (,2) (3,3) (4,4) (5,5) Az árá jól látszik a verem égy szitje. A legfelső szit kivételével a töi szite lévő hívások rekurzívak. Az azoos szite lévő hívások a verem azoos szitjét haszálják csak eltérő időe. (,) (2,2)
FELADATOK. Töltsük ki az alái tálázatot! (Soro elül ugyaaz a szám más számredszere) Számredszer alapszáma és a szám 2 3 8 0 2 6 36 000 2020 234567 973 234 9AB XYZ 2. Töltsük ki az alái tálázatot! (Soro elül ugyaaz a szám más számredszere) Számredszer alapszáma és a szám 2 3 8 0 2 6 36 00, 20, 4567, 973, 234, AB, YZ, 8. a. Az! ( faktoriális) fogalmát pozitív egész számokra az alái rekurzív formulával defiiáljuk:, ha!!, ha Procedúrahívással kiszámítottuk a 7! értékét. Hogya alakult a verem felépítése, mélysége? Mekkora a miimális méretű verem, amely a feladat elvégzéséhez szükséges? Háy rekurzív hívás volt a számolás sorá?. Defiiáljuk egy P m, függvéyt, amely pozitív egész m és argumetumokra va defiiálva és m fe kell, hogy álljo. m, ha m Pm, m m Pm, P,, ha m 2 2 Világos (de azért lássuk is e), hogy! ezzel a függvéyel kiszámítható a P, paraméterezéssel. Procedúrahívással számíttassuk ki a 7! számot! Hogya alakul a verem felépítése, mélysége? Mekkora a miimális méretű verem, amely a feladat elvégzéséhez szükséges? Háy rekurzív hívás lesz a számolás sorá?
c. def! A iomiális együttható szimólum defiíciója:. A szimólum k k! k! kiolvasása alatt a k. A szimólumot emegativ egész és k értékekre defiiáljuk, ahol 0 k Bizoyítsuk e, hogy módszert k fö kell álljo, továá megegyezés szerit.. Ezt felhaszálva adjuk rekurzív k k k kiszámítására. Kokréta határozzuk meg 7 3 0 def! értékét rekurzíva! Hogya alakul a verem felépítése, mélysége? Mekkora a miimális méretű verem, amely a feladat elvégzéséhez szükséges? Háy rekurzív hívás lesz a számolás sorá? Tudák-e ugyaeze kérdésekre általáos választ is adi? d. A emegatív egész számoko értelmezzük a következő függvéyt rekurzív módo: F F 0,, F 2, ha ha ha 0 Procedúrahívással számíttassuk ki az F(7) számot! Hogya alakul a verem felépítése, mélysége? Mekkora a miimális méretű verem, amely a feladat elvégzéséhez szükséges? Háy rekurzív hívás lesz a számolás sorá? e. Legye az alái kétváltozós függvéyük, amelyet emegatív egész argumetumokra értelmezük rekurzíva: 0, ha 0 Pa, P2a, div 2, ha 0 és páros a P a,, egyékét Procedúrahívással számíttassuk ki a P(2,5) számot! Hogya alakul a verem felépítése, mélysége? Mekkora a miimális méretű verem, amely a feladat elvégzéséhez szükséges? Háy rekurzív hívás lesz a számolás sorá? 9. a. Töltsük ki az alái tálázatot! Jegyek száma Számredszer 2 0 6 Szám 2 2 0 0 6 6. Ha egy pozitív egész szám 34 jegyű 2-es számredszere, háy jegyű 6-osa? Adható-e általáos formula iáris -jegyű számok esetére? Ha ige, adjo ilyet, ha em, idokolja meg, miért em! c. Ha egy pozitív egész szám 9 jegyű 6-os számredszere, háy jegyű 2-es számredszere? Adható-e általáos formula hexadecimális -jegyű számok esetére? Ha ige, adjo ilyet, ha em, idokolja meg, miért em!