Bevezetés a programozásba középiskolásoknak



Hasonló dokumentumok
ÁTVÁLTÁSOK SZÁMRENDSZEREK KÖZÖTT, SZÁMÁBRÁZOLÁS, BOOLE-ALGEBRA

Harmadik gyakorlat. Számrendszerek

SZÁMRENDSZEREK KÉSZÍTETTE: JURÁNYINÉ BESENYEI GABRIELLA

Segédlet az Informatika alapjai I. című tárgy számrendszerek fejezetéhez

Bevezetés az informatikába gyakorló feladatok Utoljára módosítva:

Assembly programozás: 2. gyakorlat

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

SZÁMÉRTÉKEK (ÁT)KÓDOLÁSA

Bevezetés az informatikába gyakorló feladatok Utoljára módosítva:

Programzás I gyakorlat

3. gyakorlat. Kettes számrendszer: {0, 1} Tízes számrendszer: {0, 1, 2,..., 9} 16-os (hexadecimális számrendszer): {0, 1, 2,..., 9, A, B, C, D, E, F}

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

1. Alapok. #!/bin/bash

4. Fejezet : Az egész számok (integer) ábrázolása

5.1.4 Laborgyakorlat: A Windows számológép használata hálózati címeknél

LEBEGŐPONTOS SZÁMÁBRÁZOLÁS

1. előadás. Lineáris algebra numerikus módszerei. Hibaszámítás Számábrázolás Kerekítés, levágás Klasszikus hibaanalízis Abszolút hiba Relatív hiba

2. Fejezet : Számrendszerek

Kedves Diákok! A feladatok legtöbbször egy pontot érnek. Ahol ettől eltérés van, azt külön jelöljük.

Bevezetés a programozásba

5. Fejezet : Lebegőpontos számok. Lebegőpontos számok

II. Mérés SZÉCHENYI ISTVÁN EGYETEM GYŐR TÁVKÖZLÉSI TANSZÉK

SZÁMÍTÓGÉPEK BELSŐ FELÉPÍTÉSE - 1

Dr. Oniga István DIGITÁLIS TECHNIKA 2

Gyakorló feladatok. /2 Maradék /16 Maradék /8 Maradék

Számrendszerek. Bináris, hexadecimális

Brósch Zoltán (Debreceni Egyetem Kossuth Lajos Gyakorló Gimnáziuma) Számelmélet I.

7. Laboratóriumi gyakorlat: Vezérlési szerkezetek II.

5. Fejezet : Lebegőpontos számok

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

Fixpontos és lebegőpontos DSP Számrendszerek

Programozás I. gyakorlat

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

Matematikai alapok. Dr. Iványi Péter

Informatika érettségi vizsga

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

4. Laborgyakorlat. A fájlokról ezeket az adatokat, a fájlrendszer tárolja. Számunkra az 1, 3, 4. oszlopok lesznek az érdekesek.

A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.

18. Szövegszerkesztők

Informatikai Rendszerek Alapjai

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

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

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

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

The Architecture of Computer Hardware and Systems Software: An InformationTechnology Approach 3. kiadás, Irv Englander John Wiley and Sons 2003

C programozás. 1 óra Bevezetés

C programozási nyelv

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

Programozás alapjai (ANSI C)

ELSŐ LÉPÉSEK A SZÁMÍTÓGÉPEK RODALMÁBA AMIT A SZÁMÍTÓGÉPEKRŐL TUDNI ÉRDEMES

Programozás alapjai 2.Gy: A C nyelv alapjai P R O

INFORMATIKAI ALAPISMERETEK

A PiFast program használata. Nagy Lajos

Bevezetés az informatikába Tételsor és minta zárthelyi dolgozat 2014/2015 I. félév

Számrendszerek. A római számok írására csak hét jelt használtak. Ezek segítségével, jól meghatározott szabályok szerint képezték a különböz számokat.

Szkriptnyelvek. 1. UNIX shell

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

Webprogramozás szakkör

Bevezetés a számítástechnikába

Amit a törtekről tudni kell 5. osztály végéig Minimum követelményszint

Regionális forduló november 18.

Programozási segédlet

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

A C programozási nyelv I. Bevezetés

Aritmetikai utasítások I.

Webprogramozás szakkör

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

Amit a törtekről tudni kell Minimum követelményszint

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

Máté: Számítógép architektúrák

A programozás alapjai előadás. A C nyelv típusai. Egész típusok. C típusok. Előjeles egészek kettes komplemens kódú ábrázolása

Digitális technika VIMIAA01 9. hét Fehér Béla BME MIT

Digitális technika VIMIAA01 9. hét

BASH SCRIPT SHELL JEGYZETEK

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Előfeldolgozó rendszer Tömbök. Dr. Bécsi Tamás 4. Előadás

A C programozási nyelv I. Bevezetés

Írjon olyan programot a standard könyvtár alkalmazásával, amely konzolról megadott valós adatokból meghatározza és kiírja a minimális értékűt!

M-Fájlok létrehozása MATLAB-ban

az Excel for Windows programban

Készítette: Nagy Tibor István

Adatbázis és szoftverfejlesztés elmélet

A számrendszerekrl általában

I. ALAPALGORITMUSOK. I. Pszeudokódban beolvas n prim igaz minden i 2,gyök(n) végezd el ha n % i = 0 akkor prim hamis

Elemi matematika szakkör

1. fogalom. Add meg az összeadásban szereplő számok elnevezéseit! Milyen tulajdonságai vannak az összeadásnak? Hogyan ellenőrizzük az összeadást?

POSZEIDON dokumentáció (1.2)

A feladatok legtöbbször egy pontot érnek. Ahol ettől eltérés van, azt külön jelöljük.

I+K technológiák. Számrendszerek, kódolás

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

SZÁMÍTÁSOK A TÁBLÁZATBAN

1. tétel. A kommunikáció információelméleti modellje. Analóg és digitális mennyiségek. Az információ fogalma, egységei. Informatika érettségi (diák)

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

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

Hardverközeli programozás 1 1. gyakorlat. Kocsis Gergely

WebResponder információs füzetek

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

Minden egész szám osztója önmagának, azaz a a minden egész a-ra.

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

A továbbiakban Y = {0, 1}, azaz minden szóhoz egy bináris sorozatot rendelünk

A 2016/2017 tanévi Országos Középiskolai Tanulmányi Verseny első forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

Átírás:

1 I. Bevezeto ismeretek Fazekas Ildikó Bevezetés a programozásba középiskolásoknak mobidiák könyvtár

2 I. Bevezeto ismeretek mobidiák könyvtár SOROZATSZERKESZTO Fazekas István

3 I. Bevezeto ismeretek Fazekas Ildikó Bevezetés a programozásba középiskolásoknak mobidiák könyvtár Debreceni Egyetem

4 I. Bevezeto ismeretek Copyright Fazekas Ildikó, 2005 Copyright elektronikus közlés mobidiák könyvtár, 2005 mobidiák könyvtár Debreceni Egyetem Informatikai Kar 4010 Debrecen, Pf. 12 http://mobidiak.inf.unideb.hu/ A mu egyéni tanulmányozás céljára szabadon letöltheto. Minden egyéb felhasználás csak a szerzo elozetes írásbeli engedélyével történhet. A mu A mobidiák önszervezo mobil portál (IKTA, OMFB-00373/2003) projekt keretében készült.

5 I. Bevezeto ismeretek Tartalomjegyzék Bevezetés 5 I. Bevezeto ismeretek 6 I. 1 Elvi felépítés...6 I. 2 Neumann-elvek...8 I. 3 Adatok tárolása...9 I. 4 Numerikus adatok tárolás...11 I. 4. 1 Fixpontos számábrázolás...11 I. 4. 2 Túlcsordulás és alulcsordulás...12 I. 4. 3 Lebegopontos számábrázolás...15 I. 5 Karakteres adatok ábrázolása...16 II. Algoritmizálás és bevezetés a C nyelvbe...17 II.1 Algoritmusok...17 II.2 Algoritmusleíró eszközök...20 II.2.1 Folyamatábra...20 II.2.2 Mondatszeru leírás...23 II.2.3 Stuktogram...24 II.3 Ismerkedés a C nyelvvel...26 II.3.1 A programozási nyelvekrol...26 II.3.2 A BORLANDC keretrendszere...27 II.3.3 Mit kell tudni a C programokról?...27 II.3.4 A printf() függvény...31 II.3.5 Változók...33 II.3.6 A C nyelv típusai...34 II.3.7 Adatok bevitele billentyuzetrol...36 II.3.8 Operátorok...40 II.4 Elágazások a C nyelvben...42 II.4.1 Az if utasítás...42 II.4.2 Gyakorló feladatok elágazásokra...47 III. Megoldások...49 III.1 Bevezeto ismeretek...49 III.2 Ismerkedés a C nyelvvel...52 III.3 Elágazások a C nyelvben...55

6 I. Bevezeto ismeretek Bevezetés Ez a segédanyag azoknak a középiskolásoknak szól, akik még semmit nem tudnak a programozásról, de szeretnének vele megismerkedni. Az anyag elso része olyan ismereteket tartalmaz, amely ismeretek nem feltétlenül szükségesek az anyag további részeinek megértéséhez, de jelentosen megkönnyíthetik a megértést. A programozási ismeretek elsajátításához a C nyelvet használjuk. Természetesen a segédanyag azoknak is hasznos lehet, akik már jártasak a programozásban, és a C nyelvvel szeretnének megismerkedni.

6 I. Bevezeto ismeretek I. Bevezeto ismeretek I.1 Elvi felépítés A számítógépet napjainkban az élet nagyon sok területén használják az emberek. Nemcsak munkájukhoz, hanem egyre gyakrabban szórakozásra, kikapcsolódásra is. Lehetetlen elvárni tolük, hogy ismerjék a számítógépet teljes egészében: felépítését, muködését, a muködését vezérlo elveket, a számítógép programozását. Nagyon sokan csak azt tudják, hogyan kell bekapcsolni, és hogyan tudják elindítani a számukra szükséges programot (programokat), és hogyan használják azt. És ez így is van rendjén. Ahhoz, hogy tudjunk kávét fozni, nem szükséges ismerni sem a kávéfozo muködési elvét, sem a szerkezetét. Azért mégis jó lenne tisztázni, mi is a számítógép és mire lehet használni. Ahány embert megkérdezünk, annyiféle választ fogunk hallani. Lesz, aki munkaeszközként beszél róla, lesz, aki játékeszközként határozza meg, lesz, aki a szórakoztató eszközök közé sorolja. Mindenki a saját felhasználása szempontjából fog róla beszélni. Többen lesznek olyanok, akik megemlítik, hogy problémáik megoldásához hívják segítségül a számítógépet. A számítógép azonban nem tud problémát megoldani. Minden probléma még a legegyszerubb megoldásához is gondolkodásra van szükség. A számítógép, bármennyire intelligensnek nevezik is, nem tud gondolkodni. Csak azokat a feladatokat tudja megoldani, amelyekre megtanították. Kétségtelen azonban, hogy nagyon sok ilyen feladat van. Ahhoz, hogy a számítógép megoldja a feladatokat megfelelo formában kell a megoldás lépéseit közölni vele. A megoldás menetét olyan rendszerben kell közölni vele, amelyet a számítógép értelmezni tud. A megoldás menete az algoritmus, azaz a megoldás lépéseinek egymást követo rendje. Fontos, hogy az algoritmust pontosan írjuk le, hiszen a számítógép azokat a parancsokat hajtja végre, amelyeket közölnek vele. Hibás algoritmusnak kiszámíthatatlan következményei lehetnek. Ahhoz, hogy megfelelo algoritmust írjunk, nem kell muszaki pontossággal ismernünk a számítógépet, de a számítógép felépítésével legalább elméleti modell szintjén tisztában kell lennünk. Többféle felépítésu számítógép van. Tekintsük az eléggé elterjedt sín- v. buszrendszeruét: 1. ábra Számítógép elvi felépítése

7 I. Bevezeto ismeretek A feladatmegoldások szempontjából a számítógép muködését érdemes más szempontból megközelíteni: 2. ábra A számítógép felépítése a programok bonyolultsága alapján Mielott a feladatok megoldásának a módszereire térnénk, azaz algoritmusok készítésének problémáival foglalkoznánk, elevenítsünk fel néhány dolgot! I.2 Neumann elvek A számítógép legyen soros muködésu A számítógép legyen teljesen elektronikus és a kettes számrendszert használja! A számítógép belso memóriát tartalmazzon! Érvényesüljön a tárolt program elve! A számítógép legyen univerzális!

8 I. Bevezeto ismeretek I.3 Adatok tárolása Ismételjük át az adatok tárolásáról tanultakat: A számítógépen a legkisebb tárolási egység a byte, amely 8 bitbol áll. Lehet a byte-nál nagyobb egységeket szervezni: o félszó - 2 byte o szó - 4 byte o dupla szó - 8 byte Az adatok bináris (kettes számrendszerben felírt) formában kerülnek tárolásra, ezért nézzük át a kettes számrendszerrol tanultakat! Tetszoleges n jegyu, k alapú számrendszerbeli szám felírható a alakban, ahol 0 a i < k, a szám számjegyei. n 1 n 2 2 1 0 k +a k +... +a k +a k +a k 1 2 n 2 n 1 n Enne megfeleloen egy bináris szám a 1. 2 n-1 + a 2. 2 n-2 + + a n-1. 2 + a n alakban írható fel, ahol a i = 0 vagy a i = 1. Pl.: az 1101101 bináris szám fent említett alakja 1. 2 6 + 1. 2 5 + 0. 2 4 + 1. 2 3 + 1. 2 2 + 0. 2 + 1 Ezt használjuk fel számoknak egyik számrendszerbol másikba valóátírásához. Ha a fenti, kijelölt muveleteket végrehajtjuk, megkapjuk az 1101101 bináris szám decimális (tízes számrendszerbeli) alakját: 64 + 32 + 8 + 4 + 1 = 109 Ellenkezo irányú átalakítás: a decimális számot addig osztjuk kettovel, amíg hányadosként 0-t nem kapunk, s a maradékokat fordított sorrendben felírva áll elo a szám bináris alakja: 109 1 1101101 54 0 27 1 13 1 6 0 3 1 1 1 0 A törtek átalakítása is hasonló módon történik. A bináris törtet is helyi érték helyesen írjuk fel. Pl.: a bináris 0,101 = 1. 2-1 + 0. 2-2 + 1. 2-3. Elvégezve a kijelölt muveletet, a 0,625 decimális számot kapjuk. A decimális törtet pedig 2-vel való szorzás segítségével alakíthatjuk át bináris törtté. A tört részt szorozzuk 2-vel és maradékként az egész részt tekintjük, s ez adja majd a bináris törtet. Az esetek túlnyomó részében végtelen törtet fogunk kapni. 1. példa Alakítsuk át a 0,63 decimális törtet bináris törtté! 0,63. 2 = 1,26 0,26. 2 = 0, 52 0,52. 2 = 1, 04 0,04. 2 = 0,08.

9 I. Bevezeto ismeretek 1 0 1 0 a bináris alak 0,1010 1. feladat a) Alakítsa át az alábbi decimális számokat bináris számokká: 23,48 45,5 b) Alakítsa át az alábbi bináris számokat decimális számokká: 11101110111,1101 1100110011,111 Az elozoekben elmondott elvet követjük akkor is, ha az átalakítást a decimális és a hexadecimális (16-os számrendszerbeli) számok között végezzük. A hexadecimális számok leírására 16-féle jelet használunk: 0,, 9, A, B, C, D, E, F, ahol a betuk rendre 10-et, 11-et, 12-ot, 13-at, 14-et, 15-öt jelölnek. Pl.: az 1496 decimális szám hexadecimálissá való átalakítása: 1496 8 5D8 93 D 5 5 0 A 8E13 hexadecimális szám decimálissá alakítása: 8. 16 3 + E. 16 2 + 1. 16 1 + 3. 16 0 = 8. 4 096 + 14. 256 + 16 + 3 = 36 371 Gyakran elofordul, hogy az átalakítást bináris és hexadecimális számok között kell elvégezni. Megoldásként adódik, hogy közbeiktatjuk a decimális számmá való átalakítást, de ez kissé hosszadalmas megoldás. Kihasználhatjuk a 2 4 = 16 összefüggést. A hexadecimális számnak binárissá való átalakításakor a hexadecimális szám minden számjegyét négyjegyu bináris számmá írjuk át, s ezeket egymás mellé írva kapjuk végül a kívánt bináris számot. 2. példa Alakítsuk bináris számmá a 8E13 hexadecimális számot! 8 E 1 3 1000 1110 0001 0011? 1000111000010011 Az ellenkezo irányú átalakításnál binárisból hexadecimálist a bináris számot jobbról kezdve négyes csoportokba osztjuk, s minden csoportot átírunk egy hexadecimális számjeggyé, majd ezeket egymás mellé leírva kapjuk a számot. 3. példa Alakítsuk hexadecimális számmá az 1101011100111 bináris számot! 1 1010 1110 0111 1 A E 7? 1AE7

10 I. Bevezeto ismeretek 2. feladat a) Alakítsa át az alábbi hexadecimális számokat bináris számokká! 8F12 D4C9 b) Alakítsa át az alábbi bináris számokat hexadecimális számokká! 1011111001100111 1110001011011111101 A bináris és hexadecimális számok körében a négy alapmuveletet ugyanolyan elv alapján végezhetjük, mint a tízes számrendszerben. Mivel a szorzás, osztás és kivonás is visszavezetheto az összeadásra, ezért csak az összeadás muveletét nézzük meg az említett két számrendszerben. Az összeadás elve: az összeadandó számok azonos helyi értéku számjegyeit összeadjuk, az összeget elosztva a számrendszer alapjával a maradék lesz az adott helyi értéku szám, az egész részt pedig továbbvisszük a következo helyi értékre. 4. példa Tekintsük az alábbi bináris összeadást, és az alábbi hexadecimális összeadást! 3. feladat a) Végezze el az alábbi bináris összeadásokat! 1011011 1100110 1101001 1011101 10101 1101 +1001101 +1110111 b) Végezze el az alábbi hexadecimális muveleteket! 4F96 1234 3C82 F849 +B9DA +ABCD 1011 +1101 11000 94B6 +8C27 120DD Tehát számítógépen minden adatot bináris formában tárolunk. Az adatok tárolását szokás az adatok ábrázolásának is nevezni. Az adatokat az adatokat leíró jelek alapján két nagy csoportba oszthatjuk: numerikus adatok csak számjegyeket tartalmaznak és matematikai muveleteket lehet velük végezni. alfanumerikus karakteres adatok tetszoleges jeleket tartalmazhatnak.

11 I. Bevezeto ismeretek I.4 Numerikus adatok ábrázolása A numerikus, azaz számadatokon belül külön foglalkozunk az egész és a valós számokkal, mivel a számítógépen való ábrázolásuk is különbözo módon történik. Tekintsük eloször az egész számok ábrázolását! I.4.1 Fixpontos számábrázolás Az elnevezés onnan ered, hogy a bináris pont fix, azaz rögzített helyen van, általában az utolsó pozíció után. A pozitív számokat bináris alakjukban ábrázoljuk, és ha a szám az adott szóhosszt nem tölti ki, akkor a bináris jelsorozatot balról 0-kkal kell kiegészíteni. Pl.: ábrázoljuk a 35 decimális számot 1 byte-on! 35? 10011? 0 0 1 0 0 0 1 1 Tegyük meg ugyanezt félszón, azaz 2 byte-on! 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 Egész szám lehet pozitív és negatív is. Ezek megkülönböztetésére az elojel bit szolgál. Minden szóhosszúság esetén a bal szélso bit az elojel bit. Ennek tartalma pozitív számok esetén 0, negatív számok esetén 1. Határozzuk meg ezek után, hogy 1 byte-on melyik a legnagyobb ábrázolható pozitív szám! 0 A 0. bit ebben az esetben is az elojel bit lesz (a bitek számozása balról jobbra történik és 0-val kezdodik), tehát 7 bit marad magára a szám ábrázolására. Minden biten 2 jelet ábrázolhatunk, 0-át és 1-et. Tehát egy biten két szám ábrázolható, a 0 és az 1. Két biten a 00, 01, 10 és 11 számokat ábrázolhatjuk, tehát már összesen 4 számot. Három biten pedig a 000, 001, 010, 011, 100, 101, 110, 111 számokat, tehát már nyolc számot. Ha megfigyeljük, akkor látjuk, hogy 4 = 2 2, 8 = 2 3. Így 7 biten 2 7- féle számot ábrázolhatunk, azaz összesen 128-at. Melyik lesz a legnagyobb szám? A 127 (hiszen a 0-át is kell ábrázolni), azaz amikor mind a 7 bit tartalma 1. Tehát 1 byte-on 2 7-1-féle számot tudunk ábrázolni. Ennek megfeleloen fél szó hosszúságon 2 15-1 = 32 767 szó hosszúságon 2 31-1 = 2 147 483 647 dupla szó hosszúságon 2 63-1 = 9 223 372 036 854 775 807 A negatív számokat kettes komplemensükkel ábrázoljuk. Ehhez tisztázzuk, mi is az a komplemens! Tekintsük a decimális 234 számot és vonjuk ki 1 000-bol! Az eredmény 766. 234 +766 1000 A 766-ot a 234 szám tízes komplemensének nevezzük. Tehát a decimális számok körében egy szám tízes komplemense a számot úgy egészíti ki, hogy a számhoz legközelebbi, tole nagyobb 10 hatványt kapjuk. Pl.: a 2 tízes komplemense 8, mert 2 + 8 = 10; 43 tízes komplemense 57, mert 34 + 57 = 100; 8342 tízes komplemense 1658, mert 8342 + 1658 = 10 000.

12 I. Bevezeto ismeretek Általában egy p alapú számrendszerben egy szám p-s komplemense a számot úgy egészíti ki, hogy a számhoz legközelebbi, tole nagyobb p hatványt kapjuk. Tehát egy bináris szám 2-es komplemense a számot úgy egészíti ki, hogy a számhoz legközelebbi, tole nagyobb 2 hatványt kapjuk. Pl.: 1 2-es komplemense 1, mert 11 2-es komplemense 1 mert 101 2-es komplemense 11, mert 11010 2-es komplemense 110, mert 1 +1 10 11 +1 100 101 + 11 1000 11010 + 110 100000 Láthatjuk, hogy egy bináris szám 2-es komplemensét úgy kapjuk meg, hogy a szám minden bitjét az ellenkezojére változtatjuk (azaz 0-ból 1 lesz, 1-bol pedig 0), majd az így kapott számhoz hozzáadunk 1-et. 5. példa Ábrázoljuk ezek után a -29-et egy byte-on! Eloször a szám elojel nélküli alakját ábrázoljuk binárisan: 00011101, majd képezzük a 2-es komplemensét! Változtassuk meg minden bit tartalmát az ellenkezojére és adjunk hozzá 1-et! 11100010 + 1 11100011 Ellenorzés képen, ha ezt hozzáadjuk az eredeti számhoz, a kívánt eredményt kapjuk. 11100011 + 11101 100000000 4. feladat Ábrázolja az alábbi decimális számokat a megadott hosszúságon! a) -54-et félszó hosszúságon b) -113-at egy byte-on

13 I. Bevezeto ismeretek c) -342-ot félszó hosszúságon 5. feladat Mely decimális számokat ábrázoltuk? a) 00011100 b) 11011001 c) 00010110 11001011 d) 11111010 10111010 I.4.2 Túlcsordulás és alul csordulás 6. példa Ábrázoljuk egy byte-on a decimális 123-at és 71-et, majd a bináris formákat adjuk össze szintén egy byte-on! 123? 01111011 + 71? + 01000111 194 11000010 A 0. bit tartalma 1, tehát az ábrázolt szám negatív, azaz rossz az eredmény. Ok: az eredmény nem fér el egy byte-on. Ha az összeadást elvégezzük, az eredmény 9 jegyu szám lesz, ami nem fér el egy byte-on. Az ilyen esetekben a bal oldali számjegyek maradnak le. Ez okozta a hibás eredményt. Ezt a jelenséget túlcsordulásnak nevezzük. Tehát, ha egy szám nagyobb, mint az adott tárolási egységen ábrázolható legnagyobb szám, akkor a számítógép nem jelez hibát, hanem balról a fölösleges számjegyeket elhagyja. Ez gyakran elofordul számtani muveletek esetén kezdo programozók körében. Erre az esetre az a megoldás, ha nagyobb tárolási egységen ábrázoljuk a számot. Miért is foglalkozunk a komplemensekkel és a túlcsordulással? Ha még nem felejtettük el, az eredeti kiindulásunk az volt, hogy minden muveletet az összeadásra vezetünk vissza, s ezt próbáltuk tenni a kivonással is. 7. példa Végezzük el a decimális számrendszerben a háromjegyu számok körében (csak három számjegyet ábrázolhatok, a többi elvész) a következo kivonást. 723 132 = Az eredmény 591. Másképpen is megtehetem ezt: 723 132 = 723 + (1000-132) 1000 = 723 + 868 = 1591 ez 132 tízes komplemense Azt mondtuk, hogy csak három számjegyet ábrázolhatunk, így az 1 elvész, s az eredmény helyes lesz. Tehát a kivonás helyett a kivonandó komplemensét adtuk a kisebbítendohöz. Ilyen módon a kivonást visszavezettük az összeadásra. A fentiek természetesen minden számrendszerben igazak. Fontos!!!! Ez a módszer csak a túlcsordulás miatt alkalmazható. 8. példa Végezzük el 1 byte-on a következo bináris kivonást!

14 I. Bevezeto ismeretek 1011001-10111 Az elozo gondolatmenetet követve eloször képezzük a kivonandó 2-es komplemensét! 00010111 11101000 + 1 11101001 Majd a komplemenst adjuk hozzá az eredeti számhoz! túlcsordul 01011001 + 11101001 1 01000010 Ellenorzés képen alakítsuk át a bináris számokat decimális számokká és ellenorizzük az elvégzett muveletet! Tehát jól számoltunk. 6. feladat 1011001? 89-10111? - 23 1000010? 66 Végezzük el az alábbi kivonásokat 2-es számrendszerben azon a tárolási egységen, amelyen a számok ábrázolhatóak. (a)-ban és c)-ben decimális, b)-ben hexadecimális számok olvashatóak.) a) 342 b) F9 c) 256-289 -8A -92 I.4.3 Lebegopontos számábrázolás Ezt a fajta ábrázolást a valós számok ábrázolására használjuk. A valós számoknak van egész és tört része. A kérdés az, mennyi helyet hagyjunk az egész résznek és mennyit a tört résznek? Minden decimális szám felírható normál alakban: N = m. 10 k, ahol N a decimális szám m a mantissza, amelyre teljesül, hogy 0 m < 1 k a karakterisztika, amely azt mutatja meg, hogy a tizedesvesszot merre és mennyivel toljuk el. (Ha k > 0, akkor jobbra, ha k < 0, akkor balra) Pl.: 3934 = 0,3934. 10 4 42,68 = 0,4268. 10 2 0,00029 = 0,29. 10-3 - 76 = - 0,76. 10 2

15 I. Bevezeto ismeretek - 0,0075 = - 0,75. 10-2 A normál alakot bármely számrendszerben használhatjuk, úgy, hogy m-re igaz : 0 m < 1 és k-ra igaz : a számrendszer alapja k Pl.: a bináris számok körében 0,000101 = 0,101. 2-3 - 10111 = - 0,10111. 2 5 111,001 = 0,111001. 2 3-0,001001 = - 0,1001. 2-2 A valós számok ábrázolásához legalább 2 byte szükséges, mert külön byte kell a karakterisztikának és külön byte(-ok) a mantisszának. 2 byte-on való ábrázolás: elojel bit elojel bit m k Az ábrázolás lépései: 1. A decimális számot felírjuk bináris alakban 2. Az így kapott bináris számot normál alakra hozzuk. 3. Ábrázoljuk a mantisszát úgy, hogy a 0. bit az elojel bit, de magát a számot jobbra igazítjuk, azaz ha a szám nem tölti ki az egész tároló helyet, akkor balról feltöltjük 0- kkal. 4. A karakterisztikát is bináris alakra hozzuk, és a 3. lépésben leírtakhoz hasonlóan ábrázoljuk 9. példa Ábrázoljuk 0 decimális 113,625 számot! A szám bináris alakja: 1110001,101. A normálalak: 0,11100001101. 2 7. A karakterisztika bináris kódja : 111 A mantissza 11 számjegybol áll, így az ábrázolásához legalább két byte szükséges. elojel bit 0 0 0 0 0 1 1 1 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 1 elojel bit m k Megjegyzés: a gyakorlatban nincs olyan tárolási egység, amely 3 byte-ból áll, ezt csak a példa kedvéért tekintettük. Ha a fenti mantisszát egy byte-on próbálnánk ábrázolni, a 11 számjegybol 4-et elveszítenénk. A karakterisztika változatlanul maradna és az eredeti számtól eltéro számot kapnánk eredményül. Azt az esetet, amikor a valós szám mantisszája nem fér ki az adott tárolási egységre, alulcsordulásnak nevezzük. Ez legalább olyan veszélyes bár ritkábban eloforduló hiba, mint a túlcsordulás.

16 I. Bevezeto ismeretek I.5 Karakteres adatok ábrázolása Mint korábban említettük, a számítógépen minden adatot bináris formában tárolunk. Ezért az alfanumerikus jeleket is kódolni kell bináris jelsorozattá. Kérdés, hány biten tároljunk egy karaktert? kevés hely kevés jelet tudunk tárolni sok hely pazarlás Az asztali számítógépeken leggyakrabban eloforduló kódrendszer az ASCII kódrendszer: Jellemzoi: American Standard Code for Information Interchange 8 bites rendszer 256 különbözo jel kódolására használható kétszer 128 jelre oszlik: elso 128 jel rögzített második 128 jel változhat, a különbözo országok speciális karaktereit tartalmazhatja. (Pl.: a magyar ékezetes betuket) Mára ez a 256 jel kevésnek bizonyult, ezért inkább kezd elterjedni a UNICODE kódrendszer. Ebben a kódrendszerben minden karaktert két byte-on ábrázolnak és így 65 536 jel ábrázolására van lehetoség.

17 Algoritmizálás és bevezetés a C nyelvbe II. Algoritmizálás és bevezetés a C nyelvbe II. 1 Algoritmusok A bevezeto részben már szóltunk arról, a számítógépet azért találták ki, hogy segítségével problémákat lehessen megoldani. A számítógép nem helyettünk oldja meg a problémát, hiszen nem képes gondolkodni. Arra alkalmas, hogy egyszeru muveletek sorát (a programot) nagy sebességgel és nagy megbízhatósággal végrehajtsa. Az ember feladata az, hogy pontosan határozza meg a feladatot, és ha lehet még pontosabban határozza meg a feladat megoldásához vezeto lépések sorozatát. Azaz tanítsuk meg a számítógépet a megoldás módjára, mondjuk meg neki, hogy lépésrol lépésre mit csináljon. A feladat megoldásához vezeto lépéssorozatot nevezzük algoritmusnak. Az algoritmust valamelyik programnyelvre átírva készítünk programot, amit már a számítógép is ért. 10. példa Paprikás krumplit akarunk fozni és ennek a lépéseit azaz algoritmusát írjuk le! Ha nincs meg otthon minden hozzávaló, akkor menjünk el vásárolni, egyébként készítsük elo a hozzávalókat! Tisztítsuk meg és vágjuk fel a hagymát és a krumplit! Egy elég nagy edénybe tegyünk olajat és tegyük bele a felvágott hagymát! Gyújtsuk meg a gázt! Tegyük fel az edényt! Ismételjük, amíg nem pirul meg a hagyma kavarjuk meg és várjunk fél percet! Tegyük pele a piros paprikát! Kavarjuk össze! Tegyük bele a krumplit és a fuszereket! Öntsük fel vízzel! Ismételjük, amíg nem fott meg a krumpli Kavarjuk meg! Várjunk 2 percet! Tegyük bele a kolbászt (virslit)! Ismételjük, amíg nem fott meg a kolbász (virsli) Kavarjuk meg! Várjunk egy percet! Zárjuk el a gázt! Tálaljunk! A fenti algoritmus alapján megfogalmazhatjuk az algoritmussal szemben támasztott elvárásokat: egyértelmuen meghatározott lépések sorozatából álljon, azaz minden lépésnek legyen egyértelmu rákövetkezoje;

18 Algoritmizálás és bevezetés a C nyelvbe véges számú lépés után véget kell, hogy érjen; általános érvényu legyen, azaz ha a problémák csak a bemeno adatokban térnek el, akkor ugyanazzal az algoritmussal megoldhatóak legyenek; ugyanarra a bemeno adatra mindig ugyanazt a megoldást szolgáltassa. Mit is jelentenek ezek az elvárások az elobbi algoritmusunk esetében? egyértelmuen meghatározott lépések sorozatából álljon, azaz minden lépésnek legyen egyértelmu rákövetkezoje; Mindig pontosan tudjuk, hogy mi lesz a következo lépés. Pl.: Nem tehetem eloször a vizet az edénybe és csak utána az olajat és a hagymát, mert akkor elég rossz ízu kotyvalékot kapunk. véges számú lépés után véget kell, hogy érjen; Ez látszólag ellent mond az elozo feltételnek, azaz hogy minden lépésnek legyen egyértelmu rákövetkezoje. Az utolsó lépésnek az az egyértelmu rákövetkezoje, hogy nincs több lépés utána. Nem hagyhatjuk félbe az algoritmust, hogy addig kavarjuk, amíg nem fott meg a kolbász, mert ha nem zárjuk el a gázt, akkor annak beláthatatlan következményei lehetnek. Jobb esetben csak szénné ég az egész, rosszabb esetben a szomszédok hívják a tuzoltókat. általános érvényu legyen, azaz ha a problémák csak a bemeno adatokban térnek el, akkor ugyanazzal az algoritmussal megoldhatóak legyenek; Ha nem krumpli, hagyma, kolbász és fuszerek vannak otthon, hanem mondjuk marha lábszár, zöldség, fuszerek és leves tészta, akkor a fenti algoritmussal a paprikás krumpli helyett igen finom húslevest tudunk fozni. ugyanarra a bemeno adatra mindig ugyanazt a megoldást szolgáltassa. Krumpli, hagyma, kolbász és fuszerek esetén a fenti algoritmus eredménye mindig paprikás krumpli legyen és ne mondjuk kelkáposzta fozelék. A fenti algoritmusban láttuk, hogy a lépéseket különbözo módon hajtottuk végre. Volt, hogy a lépések egymás után szépen sorban következtek: Tegyük pele a piros paprikát! Kavarjuk össze! Tegyük bele a krumplit és a fuszereket! Az algoritmusokban az ilyen jellegu végre hajtást szekvenciának nevezzük. Tehát a szekvencia a lépések, utasítások egymás utáni végrehajtását jelenti. Volt olyan, amikor egy lépést egy feltételtol függoen hajtottunk végre vagy nem hajtottunk végre: Ha nincs meg otthon minden hozzávaló, akkor menjünk el vásárolni, egyébként készítsük elo a hozzávalókat! Az algoritmusban az ilyen jellegu végrehajtást elágazásnak (szelekció) nevezzük. Az elágazás tehát azt jelenti, hogy az algoritmust egy feltételtol függoen folytatjuk tovább valamilyen lépéssel. Az elágazás nem feltétlenül csak két irányú lehet, ha a feltétel kiértékelésének több eredménye is elképzelheto.

19 Algoritmizálás és bevezetés a C nyelvbe Pl.: Adjuk meg egy hónap napjainak a számát és mondjuk meg, hogy melyik hónapról lehet szó! Ha nap = 28 vagy nap = 29, akkor hónap = február Ha nap = 30, akkor hónap = április vagy június vagy szeptember vagy november Ha nap = 31 akkor hónap = január vagy március vagy május vagy július vagy augusztus vagy október vagy december egyébként nincs olyan hónap, amelyben ennyi nap van Olyan is elofordult, hogy ugyanazt a lépést többször hajtottuk végre: Ismételjük, amíg nem fott meg a krumpli Kavarjuk meg! Várjunk 2 percet! Ha ugyanazt a lépést többször, egymás után hajtjuk végre ciklusról (iterációról) beszélünk. A ciklusoknak két része van. Egy ciklus feltétel és egy ciklus mag. A feltételben mondjuk meg, hogy meddig hajtsa végre a ciklus magban megadott utasításokat. A ciklusoknak három fajtája van: Meghatározott lépésszámú ciklus A ciklus feltételben pontosan megmondjuk hányszor hajtsa végre a ciklus magban szereplo utasításokat a program. Ciklus ismételd n-szer ciklus feltétel Utasítás(ok) ciklus mag Ciklus vége, ahol n pozitív egész szám. Elöltesztelo ciklus A ciklus elején van a ciklus feltétel, s mielott az utasítások végre hajtásra kerülnek, a program megvizsgálja a feltételt. A ciklus magban lévo utasítások addig kerülnek végrehajtásra, amíg a feltétel igaz. Ciklus amíg feltétel, addig ciklus feltétel Utasítás(ok) ciklus mag Ciklus vége Mivel az utasítások végrehajtása elott kerül a feltétel kiértékelésre, elofordulhat az is, hogy ha a feltétel hamis, az utasítások egyszer sem kerülnek végrehajtásra. Hátultesztelo ciklus A ciklus feltétel a ciklus végén van. Ciklus Utasítás(ok) ciklus mag Ciklus vége ha feltétel. ciklus feltétel Ebben az esetben a ciklus magban lévo utasítások legalább egyszer végrehajtódnak. A ciklus akkor fejezodik be, ha a feltétel igaz. A meghatározott lépésszámú ciklus biztosan véget ér meghatározott lépésszám után. A másik két ciklusnál azonban vigyáznunk kell! Kezdo programozóknál gyakori hiba, hogy a feltétel a ciklus muködése során nem változik, így a program nem tud a ciklusból kilépni. Ezt az esetet nevezzük végtelen ciklusnak. Gondoskodnunk kell tehát arról, hogy a feltétel véges sok lépés után hamisra ill. igazra váltson.

20 Algoritmizálás és bevezetés a C nyelvbe A paprikás krumpli fozés esetében feltételeztük, hogy ismerjük az étel elkészítésének a módját, a recept a fejünkben van, tehát nem volt szükség adatok bevitelére. Az algoritmusok túlnyomó többségében azonban adatokkal dolgozunk és ezeket az adatokat be kell vinni a számítógépbe. Az algoritmusok a bevitt adatokat feldolgozzák, az adatokat átalakítják, új adatokat hoznak létre belolük, s azokat meg kell orizniük, ill. ki kell íratniuk. Az adatok lehetnek olyanok, amelyeknek a tartalma állandó, és lehetnek olyanok, amelyeknek a tartalma az algoritmus során meg változik. Pl.: készítsünk egy iskola tanulóiról nyilvántartást, s szerepeljen benne a tanulók születési dátuma és az életkora. Ebben az esetben a születési dátum tartalma nem változik az adatfeldolgozás során, míg az életkor tartalma a feldolgozás során minden évben megváltozik. Az állandó tartalmú adatokat konstansoknak, a változó tartalmú adatokat változóknak nevezzük. Mind a konstansok, mind a változók kaphatnak értéket az adatok beolvasása során, ill. az algoritmus muködése közben értékadás során. Az értékadás jele az algoritmusok leírásánál a :=. Olvasva: legyen egyenlo. (Vigyázzunk erre a jelre, mert vannak programozási nyelvek, ahol szintén ez az értékadás jele, pl.: Pascal, és vannak olyan nyelvek, ahol az érték adás jele az = jel, pl.: C.) Az értékadás bal oldalán áll az a konstans vagy változó, aminek értéket akarunk adni, a jobb oldalán pedig az a kifejezés áll, amelynek az értékét át akarjuk adni. A kifejezés tartalmazhat konstanst, változót, ill. ezekbol alkotott matematikai muveleteket. Ha a kifejezés változót is tartalmaz, akkor annak a változónak már kell értékkel rendelkeznie! Pl.: Írjunk algoritmust, amelyik beolvas két számot és kiszámítja az összegük kétszeresét, majd az eredményt kiírja! Be: a,b (a két számot beolvassuk az a és b változókba) c := 2*(a+b) (a c változónak adjuk a és b összege kétszeresének az értékét. A * a szorzás jele.) Ki: c (kiíratjuk a c változó tartalmát) II.2 Algoritmus leíró eszközök Az algoritmusok leírására többféle eszköz létezik. Nézzünk meg közülük hármat: folyamat ábra mondatszeru leírás stuktogram II. 2. 1 Folyamat ábra A folyamat ábra nagyon szemléletes módszer. Geometriai alakzatok segítségével írja le az algoritmus muködését. Ellipszisbe írjuk a határszimbólumokat, azaz az algoritmus elejét és végét jelzik. START STOP A kezdo ellipszisbol csak egy nyíl vezethet ki, az algoritmust záró ellipszisbe csak egy nyíl vezethet be. Beolvasó, kiíró utasítások

21 Algoritmizálás és bevezetés a C nyelvbe Be: Ki: Ezekbe az alakzatokba pontosan egy nyíl vezethet be, és pontosan egy nyíl vezethet ki belolük. Muveletek végzése utasítás Egy téglalapba több utasítást is beírhatunk. Ennél a síkidomnál is egy be- és egy kivezeto nyíl szerepelhet. Elágazás feltétel igen nem A rombuszba egy bevezeto és két kivezeto nyíl lehet. Ha a feltétel igaz, akkor az algoritmus az igen ágon folytatódik, ha a feltétel hamis, akkor pedig a nem ágon. Elofordulhat, hogy a folyamat ábránk nem fér ki egy oldalra és másik oldalon kell folytatnunk. Erre szolgálnak a folytatás jelek: 1 1 Értelemszeruen az ugyanolyan sorszámú folytatás jelekbol pontosan ketto lehet. Az egyikbe egy bevezeto nyíl, a másikból egy kivezeto nyíl szerepelhet. Tekintsük most már a paprikás krumplifozo algoritmusunkat folyamat ábra segítségével leírva: Start Megvan hozzá minden? igen nem Menjünk el vásárolni! 1 2

22 Algoritmizálás és bevezetés a C nyelvbe 1 2 Készítsük elo a hozzávalókat! Tisztítsuk meg és vágjuk fel a hagymát és a krumplit! Egy elég nagy edénybe tegyünk olajat és tegyük bele a felvágott hagymát! Gyújtsuk meg a gázt! Tegyük fel az edényt! Megpirult a hagyma? nem Kavarjuk meg és várjunk fél percet! igen Tegyük bele a piros paprikát! Kavarjuk össze! Tegyük bele a krumplit és a fuszereket! Öntsük fel vízzel! Megfott a krumpli? nem Kavarjuk meg! Várjunk 2 percet! 3 igen

23 Algoritmizálás és bevezetés a C nyelvbe 3 Tegyük bele a kolbászt! Megfott a kolbász? nem Kavarjuk meg! Várjunk 1 percet! Zárjuk el a gázt! Tálaljunk! Stop 3. ábra Algoritmus folyamat ábrája Látjuk, hogy az algoritmus így elég szemléletes lett, de nem egyszeru dolog megszerkeszteni. II. 2.2 Mondatszeru leírás Az eredeti algoritmusunkat ezzel az eszközzel írtuk le, ezért most csak összefoglaljuk a használt jelöléseket: Az algoritmus kezdetét a Program név jelzi. A név helyére egy általunk adott nevet írhatunk. Az algoritmus végét a Program vége jelzi Adat bevitel: Be: Adat kiíratása: Ki: Értékadás. := olvasd: legyen egyenlo. Az értékadás baloldalán álló objektum felveszi az értékadás jobb oldalán álló értéket. Két irányú elágazás: Ha feltétel akkor utasítás(ok) különben utasítás(ok) elágazás vége Több irányú elágazás Ha feltétel 1. feltétel akkor utasítás(ok)

24 Algoritmizálás és bevezetés a C nyelvbe 2. feltétel akkor utasítások(ok) n. feltétel akkor utasítás(ok) különben: utasítás(ok) elágazás vége Elöltesztelo ciklus Ciklus amíg feltétel utasítás(ok ciklus vége Hátultesztelo ciklus Ciklus utasítás(ok) ciklus vége ha feltétel Meghatározott lépésszámú ciklus Ciklus ismételd n-szer Utasítás(ok) Ciklus vége Az utasításokat és feltételeket egyszeru mondatokkal írhatjuk le. II. 2. 3 Stuktogram Ennél az eszköznél az algoritmust egy téglalapba írjuk. A téglalapot felülrol lefelé haladva az algoritmusnak megfeleloen felosztjuk. Alkalmazható szimbólumok: Muveletek végzése Elágazás igaz feltétel hamis utasítás utasítás Elöltesztelo ciklusok feltétel ciklus mag

25 Algoritmizálás és bevezetés a C nyelvbe Hátultesztelo ciklus ciklus mag feltétel A paprikás krumpli fozés algoritmusa stuktogrammal szemléltetve: Megvan-e minden igen hozzávaló? nem Készítsük elo a Menjünk el vásárolni! Hozzávalókat! Tisztítsuk meg és vágjuk fel a hagymát és a krumplit! Egy elég nagy edénybe tegyünk olajat és tegyük bele a felvágott hagymát! Gyújtsuk meg a gázt! Tegyük fel az edényt! Megpirult e a hagyma? Kavarjuk meg és várjunk fél percet! Tegyük bele a piros paprikát! Kavarjuk össze! Tegyük bele a krumplit és a fuszereket! Öntsük fel vízzel! Megfott-e a krumpli? Kavarjuk meg! Várjunk 2 percet! Tegyük bele a kolbász! Megfott-e a kolbász? Kavarjuk meg! Várjunk 1 percet! Zárjuk el a gázt! Tálaljunk 4. ábra Algoritmus stuktogramja Ez sem túl egyszeru ábra. A továbbiakban az algoritmusok leírásánál az egyszerusége miatt mindig a mondatszeru leírást fogjuk alkalmazni.

26 Algoritmizálás és bevezetés a C nyelvbe II.3 Ismerkedés a C nyelvvel II. 3. 1 A programozási nyelvekrol Ahhoz, hogy az algoritmusokat a számítógép megértse, szükség van egy programozási nyelvre. A programozási nyelvek a számítógépekkel együtt fejlodtek. Eloször mindent gépi kódban írtak meg, azaz mindent 1-ekkel és 0-kkal kódoltak. Ez egy ido után egyre nehezebb és fáradtságosabb lett. Ezért a programozási nyelveket is fejlesztették. Eloször az assembly szintu nyelvek alakultak ki, ilyen pl. az ASSEMBLER. Ezeknél a nyelveknél az utasítások leírására már angol szavak rövidítéseit is használták, de ezek még mindig eléggé gépközeli nyelvek voltak. Ez azt jelenti, hogy egy program megírása során jól kellett ismerni a gép hardverjét, a memóriabeli címeket ahhoz, hogy hatékonyan muködo program születhessen. Sok probléma megoldására azonban még ma is hatékony eszköz az ASSEMBLER. Ezek után alakultak ki a magas szintu programozási nyelvek. Ezekben a nyelvekben az utasításokat már angol szavakkal vagy azok rövidítéseivel írják le. Ilyen nyelv pl. a BASIC, FORTRAN, PL1, COBOL, PASCAL, C, C++, JAVA, stb. Mivel az így megírt programok emberi nyelven íródtak, ezért ezeket a számítógép számára érthetové kell tenni. Két nagy csoportja alakult ki a programozási nyelveknek: az interpreterrel rendelkezo nyelvek a fordítókkal rendelkezo nyelvek Interpreterrel rendelkezo nyelvek: ezek a programozók által megírt programokat a forráskódot vagy forrásprogramot soronként értelmezik interpretálják, végrehajtják az adott sorban lévo utasítás(oka)t, és lépnek a következo sorra. Ha hibát találnak, hibaüzenetet küldenek és megállnak. Miután a programozó kijavította hibát, kezdodik az egész elölrol. Minden futtatásnál újra értelmezi a programot. Ezért az ilyen nyelven megírt programok csak olyan gépeken futtathatók, amelyek rendelkeznek az adott nyelv értelmezojével. Az állandó értelmezés miatt az így muködo programok lassúak, sok helyet foglalnak (az értelmezonek a futás során a memóriában kell tartózkodnia), de lehetoséget biztosítanak a programmal való párbeszédre. Interpreteres programozási nyelvek pl. a BASIC, PERL, JAVA SCRIPT. Fordítókkal rendelkezo nyelvek: a forráskódot a fordító program eloször gépi kódú tárgykóddá (tárgyprogrammá) alakítja át. Igaz, hogy a tárgykód már gépi kódú program, de a számítógép még nem tudja futtatni. A futtatáshoz még szükséges, hogy a tárgykódot kibovítsék a futáshoz szükséges információkkal, programrészletekkel. Ezt a muveletet nevezzük szerkesztésnek. A szerkesztés eredménye a futtatható program. Ezek kiterjesztése általában.exe. A szerkesztett program futtatásához már nem szükséges, hogy a fordító program is jelen legyen a memóriában. Az ilyen programok gyorsabbak az interpreteres programokhoz képest. Ilyen nyelv pl. a PASCAL, C, C++, stb. Érdekesség a JAVA nyelv. Ennél a nyelvnél a forráskódot eloször a fordító egy virtuális gépi kóddá fordítja le. A virtuális ebben az esetben azt jelenti, hogy egy elképzelt processzor gépi kódjává alakítja a forráskódot. Ezután egy értelmezo alakítja át az adott gép processzorának megfelelo gépi kódra, majd futtatja. (Már vannak azonban olyan JAVA fejleszto programok is, amelyek képesek a JAVA programokat közvetlenül futtatható gépi kódú programokká alakítani.) Nézzük most már ezek után a C nyelvet. Minden programozási nyelv fejlodésen megy keresztül. A fejlodés azt jelenti, hogy a nyelv készítoi egyre újabb lehetoségekkel bovítik a

27 Algoritmizálás és bevezetés a C nyelvbe nyelvet. A továbbiakban a BORLAND cég által fejlesztett BORLANDC-t használjuk a C programozási nyelv megismeréséhez. (Mielott tovább mennénk célszeru ezt a gépünkre feltelepíteni.) II. 3. 2 A BORLANDC keretrendszere Ahhoz, hogy meg tudjuk írni a programot, le tudjuk fordítani, meg tudjuk keresni az esetleges hibákat szükséges egy olyan valami, ami mindezt lehetové teszi. Ez lesz a keretrendszer. Indítsuk el a BORLANDC-t! Az indítás után a rendelkezésünkre áll az említett keretrendszer. Legfelül egy részben ismeros menüsor található. A középen lévo ablak a munkafelület, ahol majd írhatjuk a programjainkat. Ez tulajdonképpen egy szövegszerkeszto. A munkafelület alján látható az információs sor. Az ablak alján és jobb oldalán helyezkednek el a gördíto sávok, valamint itt található a kurzor helyzetjelzoje. Azt mutatja, hogy a kurzor hányadik oszlopban, ill. hányadik sorban van. Nézzük most végig a menü pontjait: File a szokásos file-muveletek végezhetok itt el. Edit a szokásos szövegszerkesztési muveletek találhatók ebben a pontban. Search megadott szövegre vagy hibára kereshetünk rá. Run az elkészült hibátlan forrásprogram különbözo futtatási lehetoségei vannak itt. Compile fordítási és szerkesztési lehetoségek. Debug nyomkövetési beállítási lehetoségek. Project projectek létrehozása, szerkesztése. Options megjelenítési, környezet beállítási lehetoségek. Window ablak.muveletek. Help segítség kérése. A menüt az F10 billentyu segítségével tehetjük aktívvá. Erre akkor lehet szükség, ha az egér rossz, ill. gyorsabb a billentyuket használni, mint az egeret. Az egyes menüpontok mellett szerepelnek azok a billentyu kombinációk, amelyekkel a parancsokat aktiválhatjuk. Az egyes menüpontok részleteivel a használat során fogunk megismerkedni, most a munkafelülettel ismerkedjünk! A munkafelületet szegélyezo keret bal felso sarkába kattintva az egérrel az aktív ablak bezáródik, de ugyanezt érjük el az Alt F3 billentyu-kombinációval is. Új ablakot a File menü New parancsával nyithatunk. Egyszerre több ablakot, munkafelületet is nyitvatarthatunk. Az ablakok között az F6 billentyuvel lépkedhetünk. 7. feladat: Zárjuk be a Noname00.cpp-t! Nyissunk meg újabb 3 ablakot és lépegessünk közöttük! Látjuk, hogy az aktív ablak kereti fehérek és dupla vonalúak, a többi halvány és egy vonallal szegélyezettek. A keret közepén az ablak, ill. a program neve áll. A C a NonameXX.cpp-t kínálja fel, de tetszolegesen új nevet adhatunk. A keret jobb sarkában egy sorszám és egy nyíl van. A sorszám azt mutatja, hányadik ablakot nyitottuk meg. Ha a nyíl alakú, akkor az ablakot nagyíthatjuk, ha? alakú, akkor kicsinyíthetjük. II. 3. 3 Mit kell tudni a C programokról? A BORLANDC a programok fordításához, szerkesztéséhez, futtatásához különbözo állományokat, függvényeket használ. Illetve vannak, a programozó munkáját megkönnyítendo, függvények. Ezeket a függvényeket a programozónak már nem kell

28 Algoritmizálás és bevezetés a C nyelvbe megírnia, hanem hivatkozhat rájuk a programjában. Ilyen pl. a négyzetgyök kiszámítására szolgáló függvény. Ezek az állományok, függvények különbözo könyvtárakban vannak. A BORLANDC könyvtárai az alábbiak: BGI a képernyo kezeléséhez szükséges állományokat tartalmazza. BIN a forrásprogram lefordításához, szerkesztéséhez szükséges állományokat tartalmazza. INCLUDE a beépített függvényeket tartalmazza. LIB egyéb lehetoségek könyvtára. CLASSLIB állományai az osztályok kezelését teszi lehetové. Minden C nyelvu program egy vagy több függvénybol (alprogramból) áll. A függvények általában meghatározott feladatot hajtanak végre. A függvények közül egyet kötelezoen a main névvel kell ellátni. A program végrehajtása ennek a függvénynek az aktiválásával kezdodik. A C nyelv megismerését kezdjük egy egyszeru program megírásával! 8. feladat: Írassuk képernyore az alábbi szöveget: Ez az elso programom. A forrásprogram az alábbi: main() { printf("ez az elso programom.\n"); A forrásprogramban látjuk, hogy szerepel a main függvény. Minden függvény, így a main felépítése is hasonló. A függvény neve után kerek zárójelek között szerepelnek a függvény argumentumai, majd kapcsos zárójelek között a függvény törzse. A kerek zárójeleket abban az esetben is mindig oda kell írni, ha a függvénynek nincsen argumentuma, mint a feladatban a main függvénynek. A függvény törzsében szerepelnek a végrehajtandó utasítások. Ezek a beépített függvények (pl. printf) nem jelennek meg. Szövegünk megjelenítésére szükség van egy függvényre, ez a printf beépített függvény. Minden beépített függvény deklarációját (leírását) egy állomány tartalmazza. Ezek az állományok az INCLUDE alkönyvtárban találhatók. A printf függvény deklarációja az stdio.h állományban van. Ahhoz, hogy ezeket a függvényeket programjainkban használni tudjuk, szükségünk van az #include elofordító utasításra. Az elofordító utasítás után a megfelelo állomány nevét a < > jelek közé kell írni. Minden C nyelvu programban, amelyben beépített függvényeket fogunk használni, hasonló módon kell gondoskodnunk a függvények elérhetoségérol. A printf függvényben a kiírandó szöveget mindig jelek közé kell tenni. Ahhoz, hogy a programot futtatni tudjuk, le kell fordítani. Ehhez néhány környezeti változót szükséges be állítani. Mielott a beállításhoz hozzá kezdenénk, mentsük el programunkat ELSO:CPP néven! A mentést a szokásos módon, a File menü Save parancsával tehetjük meg. (A programjainkat célszeru egy erre a célra létre hozott könyvtárba elmenteni. A mentés után legyen ez a könyvtár az aktuális. A könyvtárak közötti váltást a File menü Change dir parancsával hajthatjuk végre.) Most már beállíthatjuk a környezeti változókat az Options menü Directories parancsával. A megjeleno ablak elso két sorába azt az elérési utat kell beállítani, ahol a BOLRLANDC alkönyvtárai megtalálhatók. A második két sorba pedig annak a könyvtárnak az elérési útját írjuk be, ahová dolgozni szeretnénk. Erre azért van

29 Algoritmizálás és bevezetés a C nyelvbe szükség, mert a fordító az itt megadott könyvtárakba hozza létre a lefordított és az összeszerkesztett programot. Ezeknek a programoknak a neve ugyanaz lesz, mint amilyen néven a forrásprogramot elmentettük, de a kiterjesztésük.obj, ill..exe lesz. (Figyeljünk a továbbiakban arra, hogy fordítás elott mindig mentsük el a programunkat, mert egyébként nonamexx néven hozza létre a fordító az elobb említett két állományt!) A BORLANDC általában megorzi ezeket a beállításokat, de ha a fordítás nem sikerül, mindig az legyen az elso, hogy megnézzük ezeket a beállításokat. Különösen akkor, ha nem egyedül használjuk a számítógépet, ill. a BORLANDC-t. Fordítani a Compile menü Compile parancsával vagy az Alt F9 billentyu-kombinációval lehet. A fordítás eredményeként egy sereg információ jelenik meg egy ablakban. A lefordított program neve, az állomány mérete, figyelmeztetések és a hibák száma. Ha a fordító hibá(ka)t talál, az(oka)t a Message ablakban jeleníti meg. Felsorolja, hogy hányadik sorban milyen hiba található. Nem kell feltétlenül megijedni, ha sok hiba üzenet jelenik meg. A hibák között lehetnek úgynevezett következmény hibák is. A következmény hiba egy korábbi hibának a következménye, s ha azt kijavítjuk, a következmény hiba magától megszunik. Ha hibátlan a programunk, a Run menü Run parancsával vagy a Ctrl F9 billentyukombinációval futtathatjuk. Az eredményt, jelen esetben az Ez az elso programom. szöveget nem látjuk a képernyon. A felhasználói képernyore a Windows menü User screen parancsával vagy az Alt F5 billentyu-kombinációval léphetünk át. Onnan tetszoleges billentyu leütésével lehet visszatérni. (Az eredmény megtekintése nem lesz mindig ilyen nehézkes, van néhány trükk, amivel egybol láthatjuk eredményeinket.) Az ELSO nevu programunk hibátlanul lefutott ugyan, de a fordító küldött egy figyelmeztetést (Warning). Erre a késobbiek során visszatérünk.) Ha most átlépünk abba a könyvtárba, ahová a programunkat elmentettük (és amit a Directories ablakban beállítottunk), akkor három ELSO nevu programot találunk. Az ELSO.CPP a forrásprogramunk. Ez egy egyszeru szövegállomány, amely bármelyik szövegszerkesztoben megnyitható. A fordító ebbol készíti el az ELSO.OBJ tárgyprogramot. Ez még nem futtatható, mert nincs összeszerkesztve. A Run parancs hatására készül el az ELSO.EXE futtatható program. Ahogy korábban már említettük, ez bárhol futtatható. Nem szükséges, hogy a számítógépen legyen C fordító program. 9. feladat: Nyissunk új lapot és két sorba írjuk ki, hogy Én vagyok, most írom az elso programom! A kipontozott részre a nevünket írjuk, és a második tagmondat kerüljön új sorba! A programot mentsük el ELSO1.CPP néven! A forrásprogram: main() { printf("én vagyok Fazekas Ildikó,\n"); printf("most írom az elso programom."); Ha az elso printf()-ben elhagyjuk a \n jelet, akkor a szövegek egy sorban jelennek meg. Tehát a \n-nek az a szerepe, hogy az ot követo kiírás új sorban kezdodik. Egyszerubben is elérhetjük ugyanezt az eredményt.:

30 Algoritmizálás és bevezetés a C nyelvbe main() { printf("én vagyok Fazekas Ildikó,\nMost írom az elso programom."); Látjuk, hogy egy ilyen egyszeru feladatnak többféle jó megoldása is lehet. Ez a késobbiekben még inkább így lesz. Soha nem mondhatjuk egy feladat megoldására, hogy csak az a jó. A futtatás után, ha az eredményt meg akarjuk nézni, eddig át kellett lépni a felhasználói felületre. Ha a program utolsó soraként beírjuk: getch();, akkor a program futása mindaddig áll, amíg -t (Enter) nem ütünk, és így megnézhetjük az eredményt. A getch() függvény a billentyuzetrol olvas be karaktereket. (Késobb részletesen lesz róla szó.) A conio.h-ban található, tehát a forráslista elejére be kell írnunk: #include <conio.h>. A conio.h tartalmazza a képernyo kezeléséhez szükséges függvényeket is. Így többek között a képernyo törlését végzo clrscr() függvényt is. 10. feladat: Nyissunk új lapot és a következo programot írjuk be és futtassuk, majd mentsük ELSO2.CPP néven! /* szöveg tabulálás*/ #include <conio.h> void main() { clrscr(); printf("helló világ,\nén vagyok F.I.\n\tMost írom az\n\telso programot."); getch(); A program elején a /* */ közötti szöveg a program futását nem befolyásolja. Ide magyarázó szöveget írhatunk. A \t-vel tabulálhatjuk a megjelenítendo szöveget. A tabulálás ugyanazt jelenti, mint a szövegszerkesztésnél tanultak esetében, nem egy, hanem több szóköz van a szövegek között. (A C-ben 8 karakternyi hely marad ki.) Figyeljük meg, hogy a fordító most nem küldött figyelmeztetést. (A fordítás eredményét közlo ablakban nem jelent meg a Warning figyelmezteto szöveg.) Ennek oka, hogy az ELSO2.CPP-megadtuk a main() függvény ún. visszatérési értékét (void). A C nyelv ugyanis minden függvény esetében visszatérési értéket vár. Ez nem meglepo, hiszen matematikából is azt tanultuk, hogy a függvények valamilyen értéket adnak vissza. Pl.: az f(x) = x 2 függvény az x négyzetének az értékét adja vissza. Természetesen léteznek olyan függvények a programozásban, amelyeknek nincs visszatérési értékük, hanem az eredményük valamilyen muvelet elvégzése. Ilyen pl. a printf(), amelynek eredményeként valamilyen kiírás jelenik meg a képernyon, vagy a clrscr() függvény, amelynek eredménye a letörölt képernyo. Ha egy függvénynek nincs visszatérési értéke, akkor a fordító számára azt a void (üres) típussal jelöljük. 11. feladat: Írjon programot, amely egy vers egy versszakát a képernyo közepére írja ki!

31 Algoritmizálás és bevezetés a C nyelvbe A megoldásban szereplo forrásprogram természetesen nem az egyetlen megoldás. Kevesebb printf() függvénnyel is megoldható. Itt csak a program áttekinthetosége miatt használtunk négy függvényt. Biztosan voltak olyanok, akik úgy írták meg a programot, hogy egy már meglévo programból kitörölték a fölösleges sorokat és beírták a szükséges újakat. Ez az alapveto programozói lustaság a késobbiekben hasznos lehet. Most azonban még ne legyünk restek új ablakot nyitni és a forrásprogramot újból beírni. Ezzel egyrészt gyakoroljuk a programírást, másrészt nem fordul elo olyan hiba, hogy az átírt programból fölösleges dolgok maradnak ott. Ha mégis egy már meglévo program átírásával akarunk új programot írni, a File menü Open parancsával nyissuk meg a programunkat. Gyorsabb azonban az F3 billentyu használata. Új néven a Save as paranccsal menthetünk. A Save all parancs hatására az összes megnyitott ablakunkban lévo programot elmenthetjük. A Change dir paranccsal könyvtárat válthatunk. Érdemes beállítani aktuális könyvtárként azt a könyvtárat, ahová dolgozunk. A programok elmentésekor vagy megnyitásakor az aktuális könyvtárat kínálja fel a rendszer, és nem kell minden ilyen muveletnél hosszú elérési utakat beírnunk, ill. nem fordul elo, hogy forrásprogramunkat nem megfelelo könyvtárba mentjük. II. 3 4 A printf() függvény Ennyi kitéro után térjünk vissza a printf() függvényhez. Már láttuk, hogy a függvény az argumentumában megadott karaktersorozatot írja a képernyore. Megismertük a \n és \t ún. escape (nem látható) vagy vezérlo karaktereket. További vezérlo karakterek: \n új sor \t vízszintes tabulállás \v függoleges tabulálás \a figyelmezteto hangjelzés \b visszalépés egy karakterrel \\ ennek segítségével írhatunk a karaktersorozatba \ jelet \? ennek segítségével írhatunk a karaktersorozatba? jelet \ ennek segítségével írhatunk a karaktersorozatba jelet \ ennek segítségével írhatunk a karaktersorozatba jelet A vezérlo karakterek hatásait kipróbálhatjuk, ha sorba beírjuk oket valamelyik eddig megírt programunkba. Természetesen nemcsak szöveges, hanem numerikus adatokat is írni szeretnénk a képernyore. 12. feladat: Írjuk programot, amely 3 szám összegét írja a képernyore és a programot OSSZEG1.CPP néven mentsük el! /*összeg*/ #include <conio.h> void main() { printf("három szám összege: %d",1+2+3); getch(); Ahhoz, hogy a C valóban el is végezze a kijelölt muveletet és ne csak szövegként (karakterláncként) értelmezze az 1+2+3 kifejezést, meg kell adni a kiírandó adat típusát és formátumát. Ebben a példában a típus egész, és ezt szeretnénk kiíratni. Az argumentumban szereplo %d mutatja, hogy a kiírásban egy egész típusú adat fog következni, és majd az

32 Algoritmizálás és bevezetés a C nyelvbe idézojel után, attól vesszovel elválasztva következik a kiírandó érték. Ha itt egy muvelet szerepel, akkor a program a kiíratás elott elvégzi a kijelölt muveletet. Ha több numerikus értéket akarunk ugyanabban a printf() függvényben kiíratni, akkor azok típusainak megfelelo formátumokat az idézo jeleken belül a kiíratás sorrendjében kell felsorolnunk, a kiírandó adatokat pedig az idézo jelek után, egymástól vesszovel elválasztva soroljuk fel. Cseréljük most ki a %d formátumot %lf formátumra, és futtassuk a programot. Az eredmény helyett hibaüzenetet kapunk. Ennek oka, hogy a %lf hatására a printf() függvény valós típusú számot vár. A programban megadott szokásos formájú számokat viszont egész típusú számként érzékeli. (Ha véletlenül elfelejtették volna mi a különbség az egész és a valós típusú adatok ábrázolása között, lapozzanak vissza a bevezetésben a fix pontos és a lebego pontos számábrázoláshoz.) Kiküszöbölhetjük a hibát, ha legalább az egyik számot valós számként adjuk meg, azaz egy pontot (és egy 0-t) teszünk utána. Pl. a 2 helyett 2.0-t vagy 2.-t írunk. Alakítsuk át így a programunkat és mentsük el OSSZEG2.CPP néven. /*összeg2*/ #include <conio.h> void main() { printf("három szám összege: %lf",1+2.+3); getch(); 13. feladat: Írjunk programot, amely kiszámolja és képernyore írja három szám átlagát. Mentsük a programot ATLAG.CPP néven! Ezek után nézzük meg a printf() függvény általános alakját! printf( formátum sztring, argumentum lista); formátum sztring: a képernyore minden átalakítás nélkül kiírásra kerülo karaktersorozatokat és az argumentum listára vonatkozó konverziós eloírásokat tartalmaz. A konverziós eloírások meghatározzák az argumentumok értelmezési módját és megjelenítési formáját. Mindig % jellel kezdodnek és konverziós kóddal záródnak. A konverziós eloírás további részei elhagyhatók. % - 5.2 l f jelzo minimális mezoszélesség (a szám kiíratására felhasznált helyi érték a tizedes pontnak is számol egy helyet. Ha a szám nem fér el a kijelölt helyen, akkor bovíti a helyet és a szám a szükséges nagyságú helyen jelenik meg.) pontosság méret módosítás konverziós kód