Bevezetés az informatikába

Dr. Nyakóné dr. Juhász, Katalin

Dr. Terdik, György

Biró, Piroska

Dr. Kátai, Zoltán

Debreceni Egyetem, Informatikai Kar
Sapientia EMTE, Műszaki és Humántudományok Kar

Új Széchenyi Terv logó.

A tananyag a TÁMOP-4.1.2-08/1/A-2009-0046 számú Kelet-magyarországi Informatika Tananyag Tárház projekt keretében készült. A tananyagfejlesztés az Európai Unió támogatásával és az Európai Szociális Alap társfinanszírozásával valósult meg.

A Kelet-magyarországi Informatika Tananyag Tárház logója.

Magyarország megújul logó.

Nemzeti Fejlesztési Ügynökség http://ujszechenyiterv.gov.hu/ 06 40 638-638

Az EU logója.

2011


Tartalom

1. Bevezetés
2. Számrendszerek
A számolás története, a számrendszerek kialakulása
A számítástechnikában használatos számrendszerek
Aritmetikai műveletek különböző számrendszerekben
3. A számítógép mint adatfeldolgozó eszköz
Történeti áttekintés
Számítógép generációk
4. Adatábrázolás a számítógépen
Számábrázolás
Fixpontos számábrázolás
Lebegőpontos számábrázolás
Kódolt számábrázolás
Műveletek a számítógépen
5. A számítógép felépítése
A memóriák
Perifériák
Háttértárolók
Bemeneti perifériák
Egyéb beviteli eszközök
Kimeneti perifériák
6. Számítógéphálózatok
Vezetékes adatátviteli közegek
Vezeték nélküli adatátviteli közegek
Adatátviteli vezérlő egységek
Az Internet
7. A szoftver
A szoftverek csoportosítása
Szoftverek osztályozása kereskedelmi szempontból
8. Az operációs rendszer
Személyi számítógépek operációs rendszerei
9. Algoritmusok
Elemi algoritmusok
Nevezetes algoritmusok
A programozás alapjai
10. Programozás C nyelven
11. Alkalmazások
Szövegszerkesztés
Bibliográfia

A táblázatok listája

2.1. Táblázat 1
2.2. Táblázat 2
2.3. Táblázat 3
6.1. Táblázat 4
11.1. Táblázat 5

Az egyenletek listája

2.1. 1_egyenlet
2.2. 2_egyenlet
2.3. 3_egyenlet
2.4. 4_egyenlet
2.5. 5_egyenlet
2.6. 6_egyenlet
2.7. 7_egyenlet
2.8. 8_egyenlet
2.9. 9_egyenlet
2.10. 10_egyenlet
2.11. 11_egyenlet
2.12. 12_egyenlet
2.13. 13_egyenlet
2.14. 14_egyenlet
2.15. 15_egyenlet
2.16. 16_egyenlet
2.17. 17_egyenlet
2.18. 18_egyenlet
2.19. 19_egyenlet
2.20. 20_egyenlet
2.21. 21_egyenlet
2.22. 22_egyenlet
2.23. 23_egyenlet
2.24. 24_egyenlet
2.25. 25_egyenlet
2.26. 26_egyenlet
2.27. 27_egyenlet
2.28. 28_egyenlet
3.1. 29_egyenlet
3.2. 30_egyenlet
4.1. 31_egyenlet
4.2. 32_egyenlet
4.3. 33_egyenlet

1. fejezet - Bevezetés

Az informatikában használt alapfogalmak megfogalmazására, az alkalmazott eszközök bemutatására számtalan jegyzet, tankönyv található a könyvesboltokban, érhető el az interneten. Felmerülhet a kérdés, hogy miért van szükség egy újabb, sokadik bevezető informatika jegyzetre? A válasz nagyon egyszerű. „Ahány ház, annyi szokás! – tartja a közmondás, azaz minden oktatási intézmény a saját értékrendje, hagyományai alapján tanít. A Debreceni Egyetem Informatika Karán is kialakult egy tematika, ami szerint felkészítjük a hallgatókat azoknak az alapfogalmaknak az elsajátítására, melyek a további tanulmányaikhoz szükségesek.

Ez a jegyzet a teljesség igénye nélkül a számrendszerektől, a számítógép felépítésén át az algoritmusok, programozási alapfogalmak, alkalmazások témakörökig fogja át azokat az ismereteket, amelyekre az elsőéves hallgatók tudnak építeni későbbi tanulmányaik során. Igyekszünk sok példával, mintafeladattal, feladattal segíteni a hallgatókat a tananyag alapos elsajátításában. Reméljük sikerrel!

A szerzők

2. fejezet - Számrendszerek

A számolás története, a számrendszerek kialakulása

Ma Magyarországon arab számokat használunk, és tízes számrendszerben számolunk. De a történelem ennél többféle számrendszert és különböző írásmódokat ismer. Ezekből ad ízelítőt az alábbi ábra:

Az ősember az ujjait használta a számoláshoz. (Az ujj latin neve digitus, innen származik a számjegy angol digit neve.) Nagyobb számok kezelésére az ókorban köveket használtak. (A kövecske latin neve calculus, innen származik a mai kalkulátor szó.)

Egyiptomban az i.e. 2000 körüli időkben már jól kialakult tízes számrendszer volt, melynek elterjedését a mezőgazdaság és a csillagászat szükségletei mozdították elő. Minden magasabb tízes egységre külön jelet használtak, tehát a helyi érték fogalmát még nem ismerték. Egy pálcika: 1; két pálcika: 2; három pálcika: 3; és így tovább. Egy hajtű: 10; két hajtű: 20; három hajtű: 30; és így tovább. Egy csavar: 100; két csavar: 200; három csavar: 300; és így tovább. Egy lótuszvirág: 1000; két lótuszvirág: 2000, és így tovább, millióig. A milliót a csodálkozó, térdeplő emberalak fejezte ki. Ezek a jelek láthatók az alábbi ábrán:

Mezopotámiában, a késői sumér korszakban, ahol a csatornázás és építkezés bonyolult számítást kívánt, fejlett helyi értékes hatvanas számrendszert találunk, amely még árulkodik az előző tízes számrendszer használatáról, hiszen 1-től 60-ig a régebbi tízes számrendszer segítségével írták le a számjegyeket. Ékírásos jeleiket agyagba nyomták, az agyagtáblát tüzes kemencében kiégették, s ezzel olyan időtállóvá tették azt, hogy csak meg kell találni a táblát, megfejteni az ékírás titkát, és az az idők végezetéig olvasható marad. Egy agyagtábla képét és a számok ékírásos megfelelőit láthatjuk az alábbi ábrán:

A számolásra utaló legrégibb kínai jelek az i.e. XIV. - XI. századból származó – jósláshoz használt – csontokon, valamint az i.e. X. - III. századi cserép- vagy bronztárgyakon és pénzeken maradtak fenn, és nem helyi értékes, de tízes számrendszerről tanúskodnak. A számpálcikás számrendszer a tízes alapú helyi értékes rendszerek legrégebbike, azonban az ebből kialakult írásbeli rendszert nem egészítették ki a nulla jelével, ezért a számítások többségét még a papír feltalálása után is számolótáblán végezték. Az idők folyamán többször átdolgozott és kibővített kínai matematikai értekezés, a Matematika kilenc könyvben VIII. könyvében a tudomány történetében először találkozunk a pozitív és negatív számok megkülönböztetésével, és itt fogalmazták meg a negatív számokkal végzett műveletek legegyszerűbb szabályait is. A táblázat pozitív elemeit piros pálcikákkal ábrázolták, a negatívokat feketével. Az ábrázolás ilyen módját a könyvnyomtatásban is alkalmazták. Régi számábrázolási formákat láthatunk az alábbi ábrán:

Az ókori görögök számírása az i.e. V. század tájékán nem helyi értékes tízes számrendszerben történt. Az első 9 számjegyet ábécéjük első 9 betűje, a 9 darab tízest a következő 9 betű, és a 9 százast a további 9 betű jelentette. A 999-nél nagyobb számok leírására betű-számjegyeik mellett külön jeleket használtak. Ilyen alfabetikus számjegyírást találunk az ószláv, a héber és az arab népeknél is:

Tízes számrendszerre használatára utalnak a római számjegyek is. A tízes számrendszerre mutató 1, 10, 100 és 1000 jeleket kibővítették az 5, 50 és 500 jelével, így az általuk használt számjegyek:

I = 1, V = 5, X = 10, L = 50, C = 100, D = 500, M = 1000,

amelyekből a többi számot a következő módon tudták előállítani: a számok írásánál az egymás mellé írt egyenlő jegyeket össze kell adni; az egymás mellé írt különböző jegyeknél a kisebb számot a nagyobbhoz kell adni, ha ettől jobbra áll, és levonni belőle, ha balra áll tőle.

Például: IX=10-1=9, XI=10+1=11.

Mivel a rómaiak nem ismerték a számok helyi értékét, a nagy számok leírása kényelmetlen, és a számolás reménytelenül nehéz volt.

Az indiai népek legnagyobb tudományos és általános kultúrtörténeti vívmánya a helyi érték elvén alapuló tízes számrendszer megteremtése volt, amelynek kiteljesedése hosszú időt vett igénybe, és még távolról sem ismert fejlődésének minden állomása. Az indiai számolási mód már ősidők óta tízes alapú volt, bár egyes időszakokban és egyes vidékeken a négyes alapszám nyomai is megtalálhatók. A mi arab számjegyeket használó helyi értékes tízes vagy dekadikus számrendszerünk arab közvetítéssel, de Indiából származik. A régi tízes számrendszer és a helyi érték használata itt forrt össze, valószínűleg a III. - IV. században. Brahmagupta-hoz fűződik a kis körrel jelölt 0 feltalálása és használata a számok írásmódjában (lásd a következő ábra), valamint a negatív számokkal végzett műveletek kiterjesztése is az ő műveiben szerepel először.

Az ősmagyarok a történelmi időkben már tízes számrendszert használtak. Ez azonban az előző idők hatos és hetes számrendszerén át, hosszú fejlődés eredménye volt. A hetes számrendszerre lehet következtetni például a mesék hétfejű sárkányáról, a hetedhét országról, a hét rőf hosszú szakállról, a hétmérföldes csizmáról, a hétpecsétes titokról. A később keletkezett nyolc és kilenc számneveinkben a szóvégi c, régiesen írva z, valószínűleg a tíz számnév végződése. Ebből úgy sejtjük, hogy a nyolcat és a kilencet a tízből származtatták őseink. A nyelvészeti kutatások szerint a finnugor nyelvekben közös gyökere van a két, három, négy, öt, hat és száz tőszámneveknek. Ezek kialakulásakor még a finnugor népek együtt voltak és hatos számrendszert használtak. A hét számnév már a szűkebb ugor családra utal (magyar, vogul, osztják). E népek nyelvében a hét szó nemcsak számnév, hanem jelenti a hétnapos időtartamot is. Az ősi rovásírás számjegyei és azok írásmódja (lásd a következő ábra) már a tízes számrendszerre utalnak. Nemcsak a számok alakját, hanem elnevezését is az indiaiaktól vették át. Később az arab számok alakja folyamatosan változott.

Egy számrendszer (vagy számábrázolási rendszer) egységes szabályok alapján határozza meg, hogy a számjegyek sorozata milyen számokat jelenít meg. Például, a tízes számrendszer azt jelenti, hogy egy adott mennyiség kifejezésekor a csoportosítást 10-esével végezzük. Először tízes csoportokat hozunk létre az adott mennyiségből, majd az így kapott csoportokat is tízesével csoportosítjuk mindaddig, amíg újabb nagyobb csoport létrehozható. Ebből elsősorban az következik, hogy 10 különböző jelet kell használnunk a számok leírására: a 0-t a „nem maradt” kifejezésére, az 1, 2, 3, 4, 5, 6, 7, 8, 9 jeleket pedig a csoportosításból kimaradt 9 lehetséges állapot jelzésére. A lényeges újítás abban állt, hogy a számjegyek a helyüktől függően más értéket vesznek fel. Az első csoportosítás végén megmaradtak száma kerül a szám jobb szélére, tőle balra a második csoportosítás végén megmaradtak száma, és így tovább.

A számrendszerek lényegét a helyi érték fogalma alapján lehet megérteni. A szám értékét úgy kapjuk, hogy az egyes számjegyek értékét szorozzuk a helyi értékükkel, és mindezt összeadjuk.

Tízes számrendszerben:

2.1. egyenlet - 1_egyenlet


ahol

2.2. egyenlet - 2_egyenlet


Általában egy

2.3. egyenlet - 3_egyenlet


alakú szám felírása polinom alakban, tízes számrendszerben

2.4. egyenlet - 4_egyenlet


Tetszőleges p alapú (p>1) számrendszerben a használt számjegyek

2.5. egyenlet - 5_egyenlet


a helyi értékek pedig a p szám hatványai:

2.6. egyenlet - 6_egyenlet


A számítástechnikában használatos számrendszerek

A számítástechnikában leggyakrabban a tízes (decimális, p = 10), a kettes (bináris, p = 2) és a tizenhatos (hexadecimális, p = 16) számrendszerrel dolgozunk. A kettes számrendszerben csak kétféle jelet használunk (0,1), míg a tizenhatosban 16 különbözőt, ezért betűkre is szükség van (0, 1, …, 9, A, B, C, D, E, F). Az alábbi táblázat mutat néhány példát a különböző alapú számrendszerekre:

2.1. táblázat - Táblázat 1

Bináris p=2Tetrális p=3Kvantilis p=5Oktális p=10Decimális p=10Duodecimális p=12Hexadecimális p=16
0100100
1111111
10222222
111033333
1001144444
10112105555
11020116666
11121127777
1000221310888
10011001411999
1010101201210aA
1011102211311bB
110011022141210C
110111123151311D
111011224161412E
111112025171513F
100001212620161410


A tízes számrendszer alkalmazása a más területen való mindennapi használatból nyilvánvaló. A kettes számrendszer használata a digitális számítógép tulajdonságaiból adódik. A tizenhatos számrendszer pedig a tömörebb írásmódot teszi lehetővé, hiszen szoros kapcsolatban van a kettes számrendszerrel. A tizenhatos számrendszer számjegyei négy kettes számrendszerbeli számjeggyel írhatók fel, ugyanis 24= 16.

2.2. táblázat - Táblázat 2

Kettes számrendszerTizenhatos számrendszerTízes számrendszer
000000
000111
001022
001133
010044
010155
011066
011177
100088
100199
1010A10
1011B11
1100C12
1101D13
1110E14
1111F15


A számokat különböző számrendszerekben írhatjuk fel. A q alapú számrendszerből p alapúba történő átszámolásnál az egész részt p-vel való osztással, a tört részt p-vel való szorzással határozzuk meg.

Példák 1.

1. Mi lesz 123,4510 kettes, illetve tizenhatos számrendszerbeli alakja?

Megoldás:

A 123,4510 konverziója kettes, illetve tizenhatos számrendszerbe az alábbiak szerint történik:

2.3. táblázat - Táblázat 3

Egészrész Törtrész
/2 /16 *2 *16
1231 123B 0,450 0,457
611 77 0,91 0,23
300 0  0,81 0,23
151    0,61 ... 
71    0,20   
31    0,40   
11    0,81   
0     ...    


Tehát

2.7. egyenlet - 7_egyenlet


A kapott értékeket kettes, illetve tizenhatos számrendszerből tízesbe az alábbiak szerint írjuk vissza:

2.8. egyenlet - 8_egyenlet


2.9. egyenlet - 9_egyenlet


2. Általában: Adott az

2.10. egyenlet - 10_egyenlet


q (q=10) alapú számrendszerbeli szám és keressük azokat a bi együtthatókat, amelyekre

2.11. egyenlet - 11_egyenlet


Megoldás:

A feladatot két részre bontjuk. Először a

2.12. egyenlet - 12_egyenlet


egész részt vizsgáljuk. A p-vel való osztás eredménye:

2.13. egyenlet - 13_egyenlet


a maradék pedig b0. A fenti kifejezést tovább osztjuk p-vel, a maradék b1, és így tovább. Véges számú (N+1) lépésben eljutunk a bN maradékig. A maradékokat fordított sorrendben felírva megkapjuk a p alapú számrendszerbeli szám egész részét:

2.14. egyenlet - 14_egyenlet


A

2.15. egyenlet - 15_egyenlet


tört rész átalakítása során mindkét oldalt szorozzuk p-vel. Eredményül a

2.16. egyenlet - 16_egyenlet


kifejezést kapjuk. Mivel b-1 lehetséges értékei 0,1,...,p-1,

a

2.17. egyenlet - 17_egyenlet


pedig kisebb, mint 1, ezért a

2.18. egyenlet - 18_egyenlet


egész része b-1, a tört része pedig

2.19. egyenlet - 19_egyenlet


Ha ez utóbbit p-vel szorozzuk, az eredmény egész része b-2. Ezt az eljárást addig folytatjuk, míg a tört rész nulla lesz vagy a b-i együtthatók szakaszos ismétlődést mutatnak.

3. A konkrét példában az átírást egy véges tizedes törttel rendelkező számra végeztük, ami racionális, és tudjuk, hogy egy racionális szám nem lehet más, mint véges vagy végtelen szakaszos tört. A szakaszos ismétlődésre példa a 123,4510 konverziója hármas számrendszerbe:

123,4510=11120.1100,1100,...3.

Az eredmény végtelen szakaszos harmados tört. Természetes követelmény, hogy a végtelen szakaszos előállításból is vissza tudjuk állítani a szám pontos értékét.

Megoldás:

Csak a tört résszel foglalkozunk, és használjuk a végtelen geometriai sor összegképletét. Nevezetesen, ha p < 1, akkor

2.20. egyenlet - 20_egyenlet


Az ismétlődő szakasz 1100, tehát a periódusa 4, ezért

2.21. egyenlet - 21_egyenlet


2.22. egyenlet - 22_egyenlet


Ebben a számolásban a p értéke (1/3)4 volt. Nem véletlenül, hiszen a periódus 4.

Megjegyzés: A tört rész nem kezdődik általában a periódussal. Például a .01, 1100, 1100, …2 esetében a kettedes pont utáni .01-gyel külön kell foglalkozni.

4. A fenti gondolatmenetet megismételjük általánosan. Adott egy végtelen szakaszos q-ados tört előállítás:

.b-1b-2 … b-u, a-(u+1)a-(u+2) … a-(u+K), a-(u+K+1)a-(u+K+2) … a-(u+2*K), …

ahol az első u darab b-j szám nem tarozik a szakaszhoz, és a K periódus szerint ismétlődő számokra teljesül, hogy a-(u+K) = a-(u+K).

Általában a-i = a-j, ha i-u-nak és j-u-nak a K-val való osztási maradéka megegyezik. A .01, 1100, 1100, …2 tört esetében például u = 2, K = 4, b-1 = 0, b-2 = 1 és a-(u+1) = 1, a-(u+2) = 1, a-(u+3) = 0, a-(u+K) = 0.

Ha a periódusból a második elemet tekintjük, akkor kapjuk, hogy

2.23. egyenlet - 23_egyenlet


2.24. egyenlet - 24_egyenlet


Ezt megismételve a többi periódusban szereplő együttható esetére, azt kapjuk, hogy

2.25. egyenlet - 25_egyenlet


A .01, 1100, 1100, …2 példára ezt a képletet alkalmazva kapjuk:

2.26. egyenlet - 26_egyenlet


Feladatok 1.

1. Egyértelműek-e az u, K, b-i, a-j számok a felírásban?

Vegyük észre, hogy

.01, 1100, 1100, …2= .011, 1001, 1001, …2 = .01, 11001100, 11001100,…2.

2. Az 1 táblázatban mi a tízes számrendszerbeli értéke a 10-nek a különböző oszlopokban?

Az alábbi példákban és a feladatokban csak a számítástechnikában használatos számrendszerekre szorítkozunk.

Példák

1. Mi lesz a tizenhatos számrendszerbeli alakja az 1111010011111110102 számnak?

Megoldás:

A kettes számrendszerbeli szám számjegyeit jobbról balra haladva négyes csoportokra osztjuk, és megadjuk a csoportokhoz tartozó tizenhatos számrendszerbeli számokat. (Ha az utolsó számnégyes nem teljes, akkor nullákkal egészítjük ki az elejét.)

0011.1101.0011.1111.10102 2 → 3D3FA16

2. Mi lesz a kettes számrendszerbeli alakja az 1AC9516 számnak?

Megoldás:

Megadjuk a tizenhatos számrendszerbeli szám számjegyeinek megfelelő kettes számrendszerbelieket:

1AC9516 → 1.1010.1100.1001.01012

A fenti példákban a bináris és a hexadecimális számok közötti azon speciális kapcsolatot (egy hexadecimális szám 4 biten ábrázolható) alkalmaztuk, miszerint a számjegyek átírása egyben a szám konverzióját is jelenti. (Egyszerű ellenpéldával igazolhatjuk, hogy a bináris és decimális számok között nincs ilyen kapcsolat.) Az átírás jogosultságát az alábbiakban igazoljuk:

2.27. egyenlet - 27_egyenlet


Feladatok

  1. Felvetődik a kérdés, hogy milyen más esetekben működik az utóbbi módszer? Próbáljuk ki az oktális esetet!

  2. Tetszőleges számrendszerben adott számú pozíción melyik a legnagyobb és legkisebb leírható szám?

  3. A (11_egyenlet) összegeit írjuk fel a Σ jel segítségével!

  4. Bizonyítsuk be, hogy

    2.28. egyenlet - 28_egyenlet


    minden 0 ≤ bi < p esetén!

  5. Konvertáljuk tízes számrendszerbe az alábbi számokat:

    1011.012; 123.4516; 1A9.DB16.

  6. Konvertáljuk kettes számrendszerbe a tizenhatos számrendszerbeli, illetve tizenhatos számrendszerbe a kettes számrendszerbeli számokat:

    BABA16; ABBA16; DADA16; ECCE16;

    1011011100112; 11101111000101112.

  7. Konvertáljuk bináris számrendszerbe az alábbi decimális számokat:

    3492,326; 1000; 1512,1533; 112,3.

  8. Konvertáljuk hexadecimális számrendszerbe az alábbi decimális számokat:

    12438,964; 3096,123; 12345,678; 9977.

  9. Bizonyítsuk be, hogy bináris és oktális szám között is alkalmazható a számjegyenkénti átírás! Milyen csoportokat kell képezni?

Aritmetikai műveletek különböző számrendszerekben

Az aritmetikai műveleteket a tízes számrendszerben megszokott módon végezzük minden más számrendszerben.

Példák

  1. Végezzük el az alábbi műveleteket a bináris számok körében:

    1001.01 + 1001.10; 1001.11 - 1001.10.

    Megoldás:

  2. Végezzük el az alábbi műveleteket a hexadecimális számok körében:

    Megoldás:

Feladatok

  1. Végezzük el az alábbi műveleteket a bináris számok körében:

    10111.01 + 1111.11;

    100010.111 + 101110.111;

    1000.11 - 111.00;

    10000.1110 - 1001.1111.

  2. Végezzük el az alábbi műveleteket a hexadecimális számok körében:

    CCC.CC + DDD.DD;

    1000.010 + A111.013;

    AAA.AA - AA.AB;

    10000.100 - 1111.111.

3. fejezet - A számítógép mint adatfeldolgozó eszköz

Történeti áttekintés

Az ember mindig arra törekedett, hogy életét technikai segédeszközökkel megkönnyítse. Így volt ez a számlálás és a számolás esetében is. Nehézkes számrendszerük miatt a rómaiak használtak először számolólécet. Később jelentek meg a saun-pan, soroban, scso ti, stb. Az abakusz pedig a számítógép ősének tekinthető.

Európában még a középkorban is számolóléccel számoltak. Adam Riese (1492-1559) német matematikus fejlesztette ki a számolóléc vonalain való számolást, a vonalak közötti számolás helyett. Ő fedezte fel, hogy a negatív hatványok segítségével tíznek a törtrészei is képezhetők.

Talán az első igazi újkori matematikai fogalomalkotás, amely a görögök és az arabok számára elképzelhetetlen lett volna, a logaritmus fogalmának megadása volt. Egyszerre két tudós is foglalkozott vele, egymástól függetlenül: John Napier (1550–1617) skót báró és Jobst Bürgi (1552-1623) svájci órásmester és matematikus. Jost Bürgi készítette az első logaritmustáblázatot, de nem publikálta időben, így Napier táblázata vált előbb ismertté.

A logaritmus fogalma létrejöttének köszönhető mechanikus segédeszköz a logarléc. 1622-ben William Oughtred (1574-1664) alkalmazott először logaritmus skálát a két, egymáson elcsúsztatható vonalzókon. 1650-ben készítette Pattridge az első mai formájú logarlécet. 1851-ben vezették be a csúszóablakot, amelynek segítségével több skálát is lehetett egyszerre használni.

1623-ban Wilhelm Schickard (1592-1635), tübingeni professzor egyszerű, négyalapműveletes masinát szerkesztett. A gép működésének elve a John Napier által készített Napier-csontok számolási eljárásait követi. A szorzás műveletének megkönnyítésére Napier feltalált egy, elefántcsont rudakból álló számolószerkezetet, amelyet Napier-pálcáknak, vagy Napier-féle csontoknak neveztek. Ez a logarléc elődjének tekinthető. Schickard gépe (lásd a következő ábrát) számtárcsákkal tárolja a részeredményeket, és a túlcsordulást egy kis csengő megszólaltatásával jelzi.

Blaise Pascal (1623-1662) 1642-ben összeadó-kivonó gépet (lásd a következő ábrát) készített. A kivonáshoz komplemenst kellett képezni.

Gottfried Wilhelm Leibnitz (1646-1716) német tudós 1672-ben mechanikus számológépet (lásd a következő ábrát) épített. Az első, valódi négyalapműveletes gépet alkotta meg kézi forgató meghajtással, mozgatható beállító művel. Leibnitz nevéhez még két felfedezés fűződik, melynek nagy szerepe van a számítások korszerűsítésében: 1666-ban bebizonyítja, hogy egy számolási művelet egymás után elvégezhető egyszerű lépések sorozatára bontható; 1679-ben pedig ismerteti a kettes számrendszert.

Az olasz Giovanni Polenus és Antonius Braun a bordáskerekes (mozgatható fogú fogaskerék) gép feltalálói. Ennek segítségével 1774 és 1790 között készített számítógépet Philipp Matthäus Hahn plébános.

1820-as évek elején Charles Babbage (1782-1871) megtervezte a Difference Engine-t (differenciagépet), amely logaritmus táblázatok pontos és gyors elkészítését tette lehetővé. A bal oldali képen a Differencial Engine számolóművének 1832-ben összeszerelt részlete látható, a jobb oldalin pedig a londoni Science Museum-ban látható replika, mely Babbage eredeti tervei szerint épült:

Az első működő gépet azonban csak 1853-ban Pehr Georg Scheutz (1785 - 1873) svéd nyomdász és fia, Edvard Scheutz készítette el (lásd a következő ábrát), mert Babbage a szükséges közel 50000 alkatrészt nem tudta legyártatni. A differenciagépet egészen 1940-ig használták matematikai táblázatok elkészítéséhez. Ennek lényege a szukcesszív differencia (successive difference), azaz az egymást követő különbségek képzése, amit a fejezet végén egy példán keresztül mutatunk be.

1833-ban Babbage megtervezte az Analytical Engine-t (analitikus gépet), ami a történelem első számoló automatája lett volna. 1847-ig ezen a gépen dolgozott, bár az építése már kezdetben megakadt: a kor finommechanikai lehetőségeivel ezt a gépet nem lehetett elkészíteni.

Augusta Ada King (született Lovelace Byron) grófnő (1815–1852) főként arról ismert, hogy leírást készített a Charles Babbage által tervezett Analitycal Engine-hez.

1850-ben szabadalmaztatták az első billentyűs vezérlésű összeadó gépet. 1885-ben Stevens Borroughs (1857-1898) elkészítette az első billentyűzettel, nyomtatóval ellátott összeadó gépet.

Konrad Zuse (1910-1985) német építészmérnök 1938-ban elkészített Z1 nevű elektromechanikusnak mondható gépe már kettes számrendszerben számolt, és egy úgynevezett fénymátrixon (szintén kettes számrendszerben) jelenítette meg az eredményeket. A Z1 24 bites szavakkal dolgozott, memóriájában 16 adatot tudott tárolni, és decimális-bináris átalakítót is tartalmazott.

Konrad Zuse készülékeit Z2 (16 bites fixpontos adatokkal dolgozott és 16 szavas tárolója volt) és Z3 néven fejlesztette tovább. Az 1941-ben elkészült Z3 egy jelfogókból felépített gép, amely lebegőpontos aritmetikai egységgel, program- és adattárolási lehetőséggel rendelkezett.

Az első teljesen automatikusan működő számítógépet az Egyesült Államokban, a Harvard Egyetemen készítették el Howard H. Aiken (1900-1973), az egyetem professzora vezetésével, és 1944-ben az egyetemnek adományozták a Harvard Mark I nevű elektromechanikus gépet (lásd a következő ábrát), amely Babbage elvei alapján épült.

Példa

Ha az n2–et akarjuk kiszámítani, akkor a szorzás műveletet kiválthatjuk az n-nél kisebb négyzetszámok különbségeivel.

Megoldás:

Tekintsük a négyzetszámokat: 0, 1, 4, 9, 16, 25, .... Ezek különbsége rendre: 1, 3, 5, 7, 9, …. Nem nehéz észrevenni, hogy ha az így kapott sorozat különbségei vesszük, mindig 2 lesz az eredmény. Ez általában is igaz:

3.1. egyenlet - 29_egyenlet


Ebből n2–et kifejezve kapjuk, hogy

3.2. egyenlet - 30_egyenlet


Konkrétan legyen 52 = 42 + 7 + 2 = 25. A képletünket alkalmazhatjuk a 42–re is, majd a 32–re, és így tovább, míg el nem jutunk a 0-nak és az 1-nek a négyzetéhez. Az algoritmus persze a 0-nak és az 1-nek a négyzetéből indul és számítja a 22–t és így tovább. A többszörös differencia képzés módszerét gyakran használják függvények értékeinek kiszámítására is. Többek között a polinomok értékeit tudjuk így számítani.

Feladatok

  1. Az n3 kiszámításához adjuk meg a szukcesszív differencia algoritmust! (Képezzük a differenciát háromszor!)

  2. Az n2–hez 2-szer kell differenciát képezni és a konstans 2, az n3 kiszámításához háromszor és a konstans 6. Mi a kapcsolat a hatvány, a differenciálás rendje és a konstans között?

Számítógép generációk

Az elektronikus számítógépeket felépítési elvük, az alkalmazott logikai elemek működési elve, illetve az alkalmazott áramkörök integráltsági foka alapján generációkba soroljuk. A generációkhoz tartozó időintervallumokat csak hozzávetőlegesen lehet meghatározni, ezért a szakirodalomban többféleképpen adják meg ezeket. Az alábbiakban egy lehetséges besorolást ismertetünk.

Első generációs számítógépek

A számítógépek első generációi az elektroncsöves digitális gépek. Kialakulásukat az tette lehetővé, hogy Lee de Forest (1873-1961) 1906-ban feltalálta az elektroncsövet. Az első generáció időszaka 1940 és 1954 közé tehető. A háború és a háborús kutatások nagy lendületet adtak a számítógépipar fejlődésének.

1939-ben az Egyesült Államokban az Iowa State College-ban John Atanasoff (1903-1995) és Cliffor Berry (1918-1963) megépítették egy elektronikus gép prototípusát. Az építők nevének kezdőbetűiből a számítógép az ABC (Atanasoff-Berry Computer) nevet kapta.

1943 decemberére a britek elkészítették a Colossus nevű számítógép első, 1944-ben pedig a második verzióját, melyek a németek kódoló gépén elküldött üzenetek megfejtésére szolgáltak a II. világháború alatt. 1946-ban fejezték be az ENIAC (Electronic Numerical Integrator and Computer) építését az amerikai Pennsylvaniai Egyetemen. John William Mauchly (1907–1980) vezetésével végezték a fejlesztést, amiben részt vett John Presper Eckert (1919-1995) az egyetem, valamint Hermann Heine Goldstine (1913-2004) a hadsereg részéről. Az ENIAC-ot ballisztikai és szélcsatorna-számításokra használták, és 1955-ig működött sikeresen.

A korszak egyik legjelentősebb tudósa az alábbi képen látható Neumann János (Budapest, 1903. december 28. – Washington D. C., 1957. február 8.) magyar származású matematikus volt, aki több tudományterületen is kimagasló eredményeket ért el.

Neumann és Goldstine személyesen először 1944-ben találkozott. 1948-ban megfogalmazták az elektronikus digitális számítógépekkel, az úgynevezett Neumann-elvű gépekkel szembeni követelményeket. (John von Neumann, First Draft of a Report on the EDVAC, M.D. Godfrey and D.F. Hendry, The Computer as von Neumann Planned It," IEEE Annals of the History of Computing, Vol. 15, No. 1, 1993, pp. 11-21.)

A Neumann-elv:

  • A számítógép legyen soros működésű, teljesen elektronikus. A gép egyszerre csak egy műveletet vesz figyelembe és hajt végre, és mindezt igen gyorsan.

  • A gép a bináris számrendszert használja.

  • Az adatok és a programok a gép belső tárolójában helyezkedjenek el.

  • A vezérlőegység emberi beavatkozás nélkül értelmezze és hajtsa végre az utasításokat.

  • A számítógép tartalmazzon egy olyan egységet, ami képes elvégezni az alapvető logikai műveleteket.

Második generációs számítógépek

A második generációs számítógépek építésének időszaka az 1955 és 1965 közötti évek. Tranzisztorokat, ferritgyűrűs tárakat tartalmaztak. Az előzménye az volt, hogy Walter Houser Brattain (1902-1987), John Bardeen (1908-1991) és William Bradford Shockley (1910-1989) amerikai fizikusok feltalálták a tranzisztort (1948). Ebben az időben jelent meg az operációs rendszer ősének tekinthető MONITOR. Ez egy, a memóriában tartózkodó program volt, amely a számítógépet vezérelte, az operátor csak a perifériákat kezelte. Megjelentek az első programnyelvek is (1954 - FORTRAN, 1958 - ALGOL, 1959 - COBOL, 1964 – Thomas E. Kurtz (1928-) és Kemény János (1926-1992) megalkották a BASIC (Beginner’s All-purpose Symbolic Instruction Code) nyelvet).

Harmadik generációs számítógépek

A harmadik generációs számítógépek már integrált áramköröket használtak. Az integrált áramkör feltalálását 1959-ben jelentették be. Kialakult a multiprogramozás és a párhuzamos működtetés, melynek segítségével lehetőség nyílt egy számítógépet egy időben több feladatra is használni. A harmadik generáció korszakát az 1965-1974-es évekre lehet tenni. Erre az időszakra az SSI, MSI (Small & Medium Scale Integration) áramkörök használata volt jellemző.

Negyedik generációs számítógépek

A számítógépek negyedik generációját az 1970-es évek elejétől napjainkig számíthatjuk. (Vannak, akik az 1990-es évek elejére teszik e korszak végét, és a miniatürizálást már új korszaknak tekintik.) A gépek igen nagy integráltságú (LSI, VLSI – Very Large Scale Integration) áramkörökből épülnek fel. Nincsenek alapvető változások a számítógépek szervezésében. A korábban bevett megoldásokat tökéletesítik. A negyedik generáció jellemzője, hogy a szoftvergyártás óriási méretűvé válik. A szoftverek árai meghaladhatják a hardverét.

Akik a számítástechnika, informatika iránt valamilyen formában érdeklődnek, tudják, hogy mennyi feltáratlan területe van még ennek a tudománynak. A kutatásokban a jövő felé vezető út a mesterséges intelligenciához kapcsolódik.

Ötödik generációs számítógépek

Az ötödik generációra való előrejelzések elég sok bizonytalanságot hordoznak, mert ezek a változások épp csak megkezdődtek. Bár már 1981-ben, egy Japánban tartott konferencián új állami kutatási tervet jelentettek be, aminek a célja egy ilyen számítógép elveinek lerakása volt, melynek fontos alkotórésze a mesterséges intelligencia, a szakértői rendszerek, a szimbólumokkal való műveletvégzés. A távlati cél tehát olyan intelligens számítógép létrehozása, mely lát, hall, beszél és gondolkodik. A számítógép felépítése is változni fog: a többprocesszoros, párhuzamos, elosztott (grid) adatfeldolgozású gépek veszik át lassan a Neumann-típusú gépek szerepét. A hardver és szoftver mellett egyre inkább a firmware (még magyar írásmódja sincs) kerül előtérbe, ami egy olyan szoftverfajta, amely a hardvereszközbe van beépítve, és a hardver működtetéséhez szükséges legalapvetőbb feladatokat látja el.

4. fejezet - Adatábrázolás a számítógépen

Az adat az objektumok mérhető és nem mérhető tulajdonsága, vagy - ahogyan az értelmező szótár definiálja - valakinek vagy valaminek a megismeréséhez, jellemzéséhez hozzásegítő (nyilvántartott) tény, részlet. Az adatnak önmagában nincs sem jelentése, sem bármilyen szövegösszefüggése. Tengernyi adat születik minden egyes intézményben, és az adatok nyilvántartása, feldolgozása, továbbítása igen sokféle eszközt igényel.

Az információ az értelmezett adat, amelynek legfontosabb jellemzője, hogy bizonytalanságot, határozatlanságot oszlat el. Az adatból akkor lesz információ, ha valamilyen jelentést kap, s annak alapján valamiféle ítélet alkotható. Információnak nevezünk mindent, amit a rendelkezésünkre álló adatokból nyerünk. Az információ olyan tény, amelynek megismerésekor olyan tudásra teszünk szert, ami addig nem volt a birtokunkban.

A számítástechnikában az információ legkisebb egysége a bit - binary digit. A programok is 1 bites információkból épülnek fel. A bit lehet 0 vagy 1, hamis vagy igaz; azaz bármely kettő, egymást kölcsönösen kizáró állapot.

A bit ugyanakkor az információt hordozó közlemény hosszának egyik alapegysége is. Egy hírforrás valamely p valószínűséggel (relatív gyakorisággal) kibocsátott h hírének az információtartalma: I(h) = − log2p bit. Egy eldöntendő kérdésre adott válasz információtartalma 1 bit, ha mindkét válasz egyformán valószínű.

A byte bitek csoportja, leggyakrabban 8 bit. A számítógépi adattárolás legkisebb, címezhető eleme, illetve a tárolókapacitás mértékegysége. A számítógép az adatokat kódolt formában tárolja, kezeli és képezi.

A számítógépnek tudnia kell, hogy az adott adat az éppen szám, szöveg, utasítás vagy valami más. A következőkben ehhez meg kell ismerni a különféle adatok tárolási módját, vagyis a belső adatábrázolást.

Számábrázolás

Ha az adatokkal aritmetikai műveleteket akarunk végezni, akkor azok reprezentálására fixpontos vagy lebegőpontos számábrázolási formát kell választanunk.

Fixpontos számábrázolás

Ez a számábrázolási mód minden számot tizedes vessző (kettedes pont) nélküli egész számként kezel. Az előjeles abszolútértékes ábrázolást két byte segítségével mutatjuk be. Minden bithez a kettes számrendszer helyi értékeit rendeljük. A legnagyobb helyi értéken álló bit az előjelbit. Negatív szám esetén értéke 1, pozitív számoknál 0.

Például:

A példában ábrázolt szám tízes számrendszerbeli alakja:

210+29+28+27= 1024+512+256+128=1920

Törtszámokat is ábrázolhatunk így, ha valamelyik helyi érték elé kettedes pontot képzelünk:

A kettedes ponttól jobbra eső helyi értékek rendre 1/2, 1/4, 1/8, 1/16, stb. Így, ha az előbbi számot 11.11 törtként értelmezzük, akkor annak tízes számrendszerbeli értéke 2+1+1/2+1/4=3,75.

Az eltolt nullpontú (vagy többletes) ábrázolásnál a kettes számrendszerbeli értékből ki kell vonnunk egy megállapodás szerinti értéket.

Például 8 bit esetén:

00000000= -128

00000010=-126

10000000=0

11000000=64

Komplemens vagy egyes komplemens ábrázolás esetén a pozitív számot binárisan adjuk meg, a negatívot bitenként negáljuk.

Például 8 bit esetén: 11111110= -1

A kettes komplemens ábrázolás esetén a pozitív számot binárisan adjuk meg, a negatívot bitenként negáljuk, majd hozzáadunk 1-et.

Például 8 bit esetén: 11111111= -1

Az előjeles abszolútérték és az egyes komplemens esetén a 0 kétféleképpen ábrázolható, továbbá a műveletek elvégzése is nehézkes. A kettes komplemens ábrázolás megoldja ezeket a problémákat. Nézzük először a 0 egyértelműségét. Ha összeadunk egy n bites bináris számot az inverzével, akkor eredményként egy olyan számot kapunk, amelynek minden bitje 1. A bináris szám inverzét úgy képezzük, hogy a bitek tartalmát ellenkezőjére változtatjuk: a 0-át 1-re, az 1-et 0-ra.

Példa

Legyen N egy természetes szám, ami a bináris alakjából

4.1. egyenlet - 31_egyenlet


Az egyes komplemense

4.2. egyenlet - 32_egyenlet


az összegük pedig

4.3. egyenlet - 33_egyenlet


Tehát, ha a bináris számhoz hozzáadjuk az egyes komplemensét és még 1–et, akkor egy olyan bináris számot kapunk, amelyiknek az (n+1). helyén 1-es áll, a többi helyen nulla.

Végezzük ezt el 8 biten, ahol a 8. bit az előjelbit. A N szám, a komplemense és még 1 összeadásának eredménye egy olyan szám, amelyben a 8. biten 1-es, a többi helyen nulla áll. Ha a komplemens + 1-et negatív N-nek (-N) definiáljuk, és az előjel bitjét 1-esre állítjuk, az összeadás eredménye csupa nulla lesz (a túlcsordulás miatt!). A helyes definiciója a -N–nek tehát a N egyes komplemense 7 biten + 1, és az előjelbit 1-es. A -N ábrázolása a N-nek megfelelő bitsorozatból úgy is elvégezhető, hogy jobbról indulva az első 1-es bitig, azt is beleértve, másoljuk, a további biteket pedig az ellenkezőjére változtatjuk.

Ha például N = 25, akkor

2510 = 000110012,

az egyes komplemense 111001102

a kettes komplemense pedig -2510 = 111001112.

A kettes komplemens esetén a nulla egyértelműen ábrázolható. A legkisebb ábrázolható szám 8 biten -128, a legnagyobb 127. Az összeadás bináris számrendszerben jegyenkénti átvitellel ugyanúgy végezhető el, mint a decimális esetben:

Az összeadás szabálya érvényesült. Például: 3-6=3+(-6).

Lebegőpontos számábrázolás

A fixpontos számábrázolás hátránya, hogy a nagy és a kis számok is sok biten ábrázolhatók. A lebegőpontos számábrázolás alkalmazásánál a számokat

szám = (-1)S M pk

alakban adjuk meg, ahol S az előjel, M a mantissza, p az alap és k a karakterisztika, illetve 1/p < M < 1.

A lebegőpontos számábrázolás a különböző architektúrák esetén különböző módokon történhet. Napjaink számítógépein az Institute of Electrical and Electronics Engineers (IEEE) által a nyolcvanas években kiadott IEEE 754 nevű szabvány a meghatározó. E szabvány szerint az egyszeres pontosságú (32 bites) számokat például

szám = (-1)S (1.M) (2k-127)

alakban adjuk meg, és az alábbi módon ábrázoljuk:

Az előjel 1 bit hosszúságú. Negatív számok esetén értéke 1, pozitív számok esetén 0.

A karakterisztika 8 bit hosszúságú; ez jelöli ki a számban a kettedes pont helyét. A karakterisztikát eltolt nullpontú (vagy többletes) formában szokás tárolni. Ha a karakterisztika mező hossza k bit, akkor az eltolási érték e = 2k-1-1. Esetünkben e = 127.

A mantissza 23 bit, ami egy egészre normált törtszám, melynek első jegye mindig 1. Ezt a bitet a formátum nem tárolja, csak a törtrészt.

A tárolt számot az alábbi módon számolhatjuk ki:

szám = (-1)S (1+M) (2k-127)

ahol S az előjelbit, M a mantissza, k a karakterisztika és e az eltolás.

A mantissza számára fenntartott bitek száma a számábrázolás pontosságát, míg a karakterisztika mérete az ábrázolható számok nagyságrendjét határozza meg.

Példa

Mely x számot ábrázoltuk 1 10000111 10100000000000000000000 módon, 32 biten?

Megoldás:

Látható, hogy

s = 1;

k = 100001112 = 13510;

M = 0.1012 = 0,62510,

tehát

x = -1,625*28 =- 1,625*256 = -416.

Feladatok

  1. Mely számot ábrázoltuk 32 biten az alábbi módokon?

    0 01111111 00000000000000000000000

    0 01110101 01010100000000000000000

    0 10110000 10101000000000000000000

    1 00101010 11100000000000000000000

    1 10000010 00010100000000000000000

  2. Ábrázoljuk a következő decimális számokat: 1; 300; -8,625; -16,125; 32,25.

Kódolt számábrázolás

Binárisan kódolt decimális (Binary Coded Decimal - BCD)

Ennél a módszernél a szám tízes számrendszerbeli számjegyeit ábrázolják számjegyenként 4 (pakolt) vagy 8 (pakolatlan) biten. Ez pazarló tárolási mód, de előnye, hogy nagyon könnyű a bitsorozatból a tízes számrendszerbeli alakot előállítani, hátránya viszont, hogy a műveletvégzés nagyon nehézkes.

Pakolt:

9613 —> 10010110 00010011 (2 byte)

Pakolatlan (1 karakter=1byte):

9613 —> 00001001 00000110 00000001 00000011 (4 byte)

Nem-numerikus karakterek, kódtáblázatok

Egy karaktert (számot, betűt, egyéb írásjelet) többnyire egy byte-on tárolnak. Ebből következően 256 lehetséges állapot van, ami elég a kis- és nagybetűk, számjegyek, írásjelek tárolására. Azt, hogy milyen byte-értékek milyen karaktert jelentenek, kódtáblázat tartalmazza. A használt kódtáblázat megállapodás kérdése, azonban a számítógépek közötti adatcsere miatt fontos, hogy az egyik gép ugyanolyan karakterként értelmezze a byte-okat, mint a másik. Ezért alakultak ki a szabványos kódtáblák, a legismertebb az ASCII (American Standard Code for Information Interchange) kódrendszer.

Eredetileg az ASCII kódrendszer 7 bites volt, 128 karaktert tartalmazott. (Ma ez a szabványos része a kódtáblának.) Ezek közül is a 0-tól 31-ig terjedő értékek az úgynevezett vezérlő karakterek, és a 32-től 127-ig terjedő értékek jelentenek megjeleníthető karaktereket. A 8 bites byte-ok használata óta az ASCII táblázat második, 128-tól 255-ig terjedő értékeket tartalmazó része alkalmazásfüggő, nem szabványos. Itt tárolhatók például az ASCII szabványban nem szereplő magyar ékezetes karakterek.

A szabványos ASCII kódtábla:

Példa egy kiterjesztésre: A 437-es kódlap

A szoftverek nemzetközivé válása során kiderült, hogy a sokféle karakterkészlet a számítástechnika fejlődésének egyik gátlója. Megoldást egy olyan kódolás adhat, amely képes az összes nyelv összes karakterét ábrázolni. Ezért született meg a 16 bites Unicode (UCS - Universal Character Set).

Az összes korábbi 8 bites kódkészletben megtalálható karakter belefért a Unicode kezdeti alsó 65536-os tartományába, amelyet Basic Multilingual Plane-nek (BMP) is neveznek. Az alsó 128 érték megegyezik a hagyományos ASCII-val. Sőt, az alsó 256 megegyezik a Latin-1-gyel (az ASCII ékezetes betűs bővítése). A magyar ő és ű betűk tehát 256-nál nagyobb azonosítót kaptak. A Unicode értékeket általában hexadecimálisan, nagy ritkán decimálisan adjuk meg. A különféle egzotikusabb betűírásokon (cirill, héber, arab stb.) túl tartalmazza a kínai, japán, koreai (ezeket együtt szokták angolul CJK-nak rövidíteni) írásjeleket, és számos vezérlő karaktert, melyekkel például a jobbról balra írás kapcsolható be és ki, vagy éppen a sortörés lehetséges helyei adhatók meg.

Műveletek a számítógépen

A digitális számítógépeket a kettes számrendszer alapján építik, mivel egy számjegy egy kétállapotú egységgel megvalósítható. A digitális logikai szintet a kapuáramkörök alkotják, amik analóg alkatrészekből épülnek fel, de működésükkel a bináris rendszer alapját képezik. A két állapot megkülönböztetésére két jelszintet alkalmaznak: az alacsony a hamis vagy 0 értéket, a magas az igaz vagy 1 értéket jelenti.

Minden kapunak van egy vagy több digitális bemenete és egy kimenete. A kapuk kombinációjából felépített áramkörök leírására egy olyan algebrára van szükség, amiben a változók és a függvények csak 0 vagy 1 értéket vehetnek fel. A George Boole (1815-1864) által kitalált és róla elnevezett Boole-algebra ilyen. A Boole-algebrában összesen két szám van: a 0 és az 1. Itt már a szokásos összeadás műveletét sem definiálhatjuk, új műveletekre van szükség.

Egy n változós Boole-függvény bemeneti értékeinek 2n lehetséges kombinációja, 2n kimenete van, amik egy 2n soros táblázattal adható meg, amit igazságtáblának nevezünk. Az egyváltozós művelet, ami megfordítja a bemenet (A) értékét, azaz a kimenet (Q) 0-ra 1-et, 1-re 0-t ad, a negáció, NEM, vagy angolul NOT, függvény logikai áramköri rajzjele és igazságtáblája az alábbi:

A kétváltozós műveletek mindkét bemenete kétféle lehet. A bemenetek közötti műveletek az ÉS, VAGY és KIZÁRÓ VAGY. Az ÉS, vagy angolul AND művelet a konjunkció, ami csak akkor ad egyet, ha az egyik (A) és a másik (B) bemenete is egy.

A másik művelet a diszjunkció, a VAGY, vagy angolul OR, ami akkor ad egyet, ha vagy az egyik (A) vagy másik (B) bemenete egy.

Ezekkel az alapműveletekkel már a többi kétváltozós művelet is megadható. Például az előző műveletekkel kifejezve a KIZÁRÓ VAGY, vagy XOR művelet akkor ad 1-et, ha a két bemenete (A, B) különböző:

A XOR B = (A AND NOT B) OR (NOT A AND B).

Az XOR művelet jelentősége az összeadás műveletének logikai kapukkal történő megvalósításában mutatkozik meg. Ha összeadunk két egy-egy biten ábrázolt digitalis értéket x–et és y-t akkor az eredmény s (sum) megjelenik egy biten és kapunk még egy c (carry) továbbvivendő bitet. Az alábbi táblázat s oszlopa pontosan az XOR műveletnek felel meg.

Az alábbi ábra pedig mutatja a teljes összeadás egy lépését, amikor nemcsak a két összeadandó van hanem a korábbi összeadásból származó c is.

32 biten az összeadás a fenti áramkörök összefűzéséből végezhető el

Az utolsó sorban a c a túlcsordulás áldozata lesz. Ha c nem 0 akkor értékes jegy vész el és az eredmény természetesen hibás lesz.

Feladat:

1. Igaz-e, hogy A XOR B = (A+B)*NOT(A*B)

2. Adjuk meg a teljes összeadás logikai sémáját.

5. fejezet - A számítógép felépítése

A számítógép működésének megértéséhez szükséges, hogy ismerjük a hardver felépítését, és tisztában legyünk a hardverelemek funkcióival. A következő ábra a számítógép funkcionális felépítését, a Neumann-modellt mutatja:

A be- és kimeneti (I/O) egység feladata értelemszerűen a kommunikáció biztosítása a számítógép felé, illetve felől. A CPU (Central Processing Unit) feladata az operatív tárban (memóriában) elhelyezkedő program feldolgozása és végrehajtása. Minden, ami a rendszerben történik, innen származik, mint parancs, vagy ide fut be, mint jelzés. A műveletvégrehajtó egység az ALU (Arithmetic and Logical Unit).

A korszerű számítógépekben a központi feldolgozó egység a processzor. Olyan elektronikai alkatrész, nagy bonyolultságú félvezető eszköz, mely ma már egyetlen, nagy integráltságú lapkán tárolófelület, vezérlő-, illetve input-output funkciókat ellátó elemeket tartalmaz. Dekódolja az utasításokat, vezérli a műveletek elvégzéséhez szükséges belső adatforgalmat és a csatlakozó perifériális berendezések tevékenységét.

A processzor teljesítménye alatt azt az időt értik, amelyre a processzornak szüksége van egy bizonyos feladat végrehajtásához. A processzornak két lényeges jellemzője, amelyek utalnak a teljesítményre: a szóhossz (bitszám vagy bitszélesség) és az órajelfrekvencia.

A szó hosszát, amellyel a processzor dolgozik, belső szóhossznak nevezzük. Emellett fontos még a buszrendszer szóhossza is: az adatbusz és a címbusz bitszélessége. Az adatbusz szélessége azt jelenti, hogy a processzor hány bitet tud egyidejűleg a hozzá kapcsolt perifériákra küldeni. A címbusz közvetíti azokat a jeleket, amelyek a tárolóhelyek eléréséhez szükségesek. A címbusz szélessége határozza meg a közvetlenül megcímezhető címtartomány nagyságát.

Az órajelfrekvenciát a vezérlőkvarc (órajeladó) hozza létre, amely vagy közvetlenül integrálva van a processzorba, vagy azon kívül helyezkedik el. A rendszeróra folyamatosan, periódikusan jeleket szolgáltat. Két ilyen jel ad ki egy processzorciklust. Az egyszerű utasításokat kevesebb, míg a bonyolultabbakat több processzorciklus alatt hajtja végre a processzor. Két processzorciklus alkot egy buszciklust, melyek során a processzor a memóriához fordul. Az első ciklus során a memória címzése történik meg, a második ciklus alatt a processzor az utasítást közli.

Az órajelet megahertzben (MHz) mérik. Egy Hertz az a frekvencia, amely 1 másodperc alatt egy rezgést végez. A 8 MHz tehát azt jelenti, hogy a kvarc másodpercenként 8 milliószor rezeg. Ez a rezgés határozza meg az utasítások végrehajtásának gyorsaságát. Általában azt lehet mondani, hogy minél magasabb az órajel, annál gyorsabban tud a számítógép dolgozni. Ha a rendszeróra frekvenciáját növeljük, akkor a processzor gyorsabban fogja végrehajtani az utasításokat. A processzor sebességét a MIPS (Million Instruction Per Second) és a FLOPS (Floating Point Operation per Second) mutatja meg, azaz, hogy mennyi utasítást képes a processzor elvégezni másodpercenként.

Egy processzor utasításkészlete gépi kódú (elemi) utasítások összessége, melyek végrehajtására a processzor hardver szinten alkalmas. A számítástechnika fejlődése során a processzorok tervezésében két irányvonal alakult ki.

Kezdetben a CISC (Complex Instruction Set Computer = bonyolult utasításkészletű számítógép) architektúrájú gépek voltak többségben. Ezek főbb jellemzői:

  • sok utasítás, akár néhány száz, közöttük több összetett;

  • bonyolult címzési módok lehetségesek, így viszont változó hosszúságúak az utasítások, ami nehezen optimalizálható;

  • a gépi utasítások változó vagy több ciklusidőt igényelnek;

  • az assembly programozás egyszerűbb, mert a bonyolult utasítások bonyolult feladatokat oldanak meg;

  • csak a szükséges néhány regiszterrel rendelkezik;

  • ismertebb CISC processzorok: Intel 286/386/486, Pentium; Motorola 68000; DEC VAX.

A RISC (Reduced Instruction Set Computer = csökkentett utasításkészletű számítógép) architektúrájú gépek főbb jellemzői:

  • csak a legalapvetőbb utasítások léteznek gépi szinten;

  • sok regiszter van, ezért kevesebb a tárművelet, több a regiszterművelet, ezért gyors;

  • fix a kódhosszúság, ezért egyszerűek a címzési módok;

  • egyszerű és gyors a kódolás, így a ciklusok száma kicsi;

  • az egy feladatra eső utasítások száma kevés, mert az operációs rendszerhez, illetve a compiler-ekhez tervezik;

  • az egyszerű utasítások egyforma hosszúságúak, azonos ciklusidejűek;

  • a bonyolult feladatok programozása bonyolult, hosszú;

  • ismertebb RISC processzorok: DEC Alpha; HP PA-RISC; SUN SPARC; IBM PowerPC és RISC6000.

Egy új megoldás az EPIC (Explicitly Parallel Instruction Computing = teljes párhuzamosságú utasításokon alapuló számítógép) technológia, amely támogatja a nagy párhuzamosságot: 20 művelet végrehajtását teszi lehetővé órajelenként. Az EPIC architektúra számos olyan új jellemzőt is magába foglal, amelyek tovább növelik a processzor teljesítményét. Ezek olyan megoldások, amelyek csökkentik a processzor megállásait, illetve folyamatosabbá teszik működését. Az alkalmazások képesek előtölteni az adatok jelentős részét a virtuális memóriába, így lehetővé téve a processzor villámgyors elérését. Ez csökkenti az adatok virtuális memóriába töltésének idejét, valamint a keresést, olvasást, írást a tárolóeszközre, így téve lehetővé az alkalmazásoknak, hogy gyorsabban és hatásosabban fussanak. Ilyen EPIC processzor az Intel Itanium (IA-64).

Jellemzői:

  • új utasításkészlet;

  • 128-bites utasításcsomag;

  • 3 db 41-bites utasítás (=123 bit);

  • a maradék 5 bit határozza meg az utasítások típusát a csomagban;

  • 128 db 64-bites általános használatú regiszter;

  • 128 db 82-bites lebegőpontos regiszter;

  • Intel X86-os utasítások végrehajtása;

  • az utasítások párhuzamos végrehajthatósága.

A memóriák

A számítógép memóriájának legkisebb címezhető egysége a byte, így a memóriakapacitás mértékegysége is a byte, illetve annak többszörösei:

1 kbyte (kilobyte) = 1024 byte (210byte ≈ 103 byte);

1 Mbyte (megabyte) = 1024 kbyte (1024 x 1024 byte = 1 048 576 byte ≈ 106 byte);

1 Gbyte (gigabyte) = 1024 Mbyte (1024 x 1024 x 1024 byte = 1 073 741 824 byte ≈ 109 byte);

1 Tbyte (terabyte) = 1024 Gbyte (1024 x 1024 x 1024 x 1024 byte = 1 078 036 791 296 byte ≈ 1012 byte).

Írhatóság szerint a memóriákat két csoportba osztjuk. A RAM (Random Access Memory – Megjegyzés: Az elnevezés helytelen, mert ma már minden memória véletlen elérésű, de annyira elterjedt ez az elnevezés, hogy zavart okozna a megváltoztatása.) írható és olvasható memória, mely az áram kikapcsolásával teljes tartalmát elveszti. Tartalma tetszőlegesen módosítható, akárhány alkalommal. Feladata, hogy munka közben a változó adatokat tartalmazza.

A RAM memóriák között felépítés szerint megkülönböztetünk dinamikus (Dynamic RAM vagy DRAM) és statikus (Static RAM vagy SRAM) memóriát. A DRAM kondenzátorokból áll, melyek töltésüket idővel elvesztik, ezért a DRAM-ot meghatározott időközönként frissíteni kell. Az SRAM integrált áramköri tranzisztorokból épül fel, nem kell frissíteni, gyorsabb a DRAM-nál.

A ROM (Read Only Memory) csak olvasható memória, mely kikapcsoláskor sem „felejt”. Feladata, hogy tartalmazza azokat az adatokat és programokat, melyekre már a gép bekapcsolásakor szükség van. A ROM-ot többnyire a számítógéppel együtt szállítják.

Eredetileg a ROM-ba gyárilag „égetik be” a programot. A technológia fejlődésével létrehoztak olyan ROM-okat, melyeket egy egyszerű eszköz segítségével a felhasználó maga programozhat (PROM, Programmable ROM). Az EPROM (Erasable PROM) UV fény segítségével törölhető, majd újraégethető. Az EEPROM (Electrononically Erasable PROM) elektromos úton, a processzor utasításai alapján törölhető és programozható át, tehát nem kell a gépből kiszerelni az átprogramozáshoz. Az EEPROM egy speciális típusa a Flash memória, melynek törlése és újraprogramozása nem byte-onként, hanem blokkonként történik.

A processzoron belül is vannak memóriatípusú elemek. A regiszter a processzorba beépített nagyon gyors elérésű, kisméretű memória. A regiszterek ideiglenesen tárolják az információkat, utasításokat addig, amíg a processzor dolgozik velük. A regiszterek között nem csak adattároló elemek vannak, hanem a processzor működéséhez elengedhetetlenül szükséges számlálók és állapotjelzők is.

A modern processzorok fontos része a cache (gyorsítótár). A cache a processzorba vagy a processzor környezetébe integrált memória, ami az operatív tár (RAM, ROM) viszonylag lassú elérését hivatott kiváltani azoknak a programrészeknek és adatoknak előzetes beolvasásával, amikre a végrehajtásnak közvetlenül szüksége lehet. A gyorsítótár mérete ma már Mbyte-os nagyságrendű.

A RAM, a ROM, a cache és a regiszter az úgynevezett fő vagy elsődleges memória típusai. A másodlagos memóriák a nagy tárolókapacitással rendelkező háttértárolók. (Egyes szakirodalmak csak a gyors mágneses háttértárolókat sorolják ide, és harmadlagos tárolóknak nevezik az optikai és a mágnesszalagos eszközöket, mint tipikusan archiválásra használt berendezéseket.)

Perifériák

A számítógéphez nagyon sokféle eszköz, úgynevezett periféria csatlakoztatható. Vannak beviteli célú eszközök, más eszközök pedig kivitelre valók. A háttértárak mind a két célt szolgálják. Az átvitel vagy az adatoknak az operatív memóriából a periféria felé való kiküldését, vagy a periféria felől érkező adatok memóriába való tárolását jelenti. A háttértárolók esetén ez a folyamat kétirányú: az adatokat tárolni is és visszaolvasni is tudjuk.

I/O vezérlő

A perifériák és a központi egység közötti adatforgalom vezérlésére, a sebességkülönbség áthidalására perifériavezérlő (I/O vezérlő) alrendszert alkalmaznak, ami a processzor feltartása nélkül bonyolítja le az adatátvitelt. A processzor csak elindítja a folyamatot, aminek a befejezésről a perifériavezérlő megszakítással értesíti azt. Egy ilyen alrendszer általában egyidejűleg több periféria kiszolgálására is képes.

Párhuzamos és soros adatátvitel

A bitek továbbítása alapvetően két különböző módon történhet. A legegyszerűbb eset, amikor a biteket sorban egymás után egy csatornán elküldjük a vevőnek. Ezt az átviteli módot nevezik soros adatátvitelnek.

A másik lehetőség, hogy az adó és a vevő között annyi vonalat alakítunk ki, amennyi bitet egyszerre át szeretnénk vinni. Ebben az esetben tehát bitcsoportok átviteléről van szó. Ezt az adatátviteli módot párhuzamos adatátvitelnek nevezik.

Mindkét módszernek van előnye és hátránya. A soros átvitel kialakítása olcsó, mivel kevés számú kapcsolódásra van szükség, de ezzel együtt az átvitel sebessége a párhuzamos átvitelhez képest lényegesen kisebb. A soros kapcsolattal nagyobb távolság hidalható át, mint a párhuzamossal. Azt, hogy melyik módszert alkalmazzák, egyértelműen a feladat dönti el. Általában mikroszámítógépek belső áramköreinek az összekapcsolására párhuzamos módot választanak a kis távolságok és a nagy átviteli sebesség miatt. A külső eszközök összekapcsolása a számítógépekkel már mindkét módszer szerint történhet (például az egér soros, a nyomtató viszont párhuzamos átvitelt használ).

USB

Az USB (Universal Serial Bus) olyan csatolási szabvány perifériák számára, amely függetlenül attól, hogy milyen berendezésről, operációs rendszerről vagy platformról van szó, lehetővé teszi a kapcsolódást. Átviteli sebessége kellően nagy, hogy szinte bármilyen kis vagy közepes adatforgalmú külső egységet használhassunk vele, előállítása pedig kellően olcsó, hogy megérje gyártani.

Az USB eszközök valóban megvalósítják a Plug&Play elvét, azaz amint csatlakoztatjuk az eszközt, már működik is. A régebbi rendszereken a Plug&Play azt jelentette, hogy a legközelebbi újraindításnál ismeri fel az operációs rendszer az új hardver elemet.

FireWire

A FireWire egy nagysebességű, soros adattovábbító technológia a különböző kiegészítő eszközöknek a számítógéphez való illesztésére. Az Apple által kifejlesztett rendszer ma már ipari szabvány, melyet az IEEE 1394 néven jegyeztek be. A FireWire-t úgy tervezték, hogy könnyedén továbbítsa a különböző, magas átviteli képességet igénylő multimédia adatokat az eszközök között (kamerák, szintetizátorok stb. és/vagy merevlemezek). Kiemelkedő teljesítményével, üzem közbeni illeszthetőségével, az illesztett eszközök önműködő beállításával kategóriájában egyedülálló illesztési szabvány.

Háttértárolók

A mágneses háttértárolók

A mágneses háttértárolás esetén egy nem mágnesezhető felületre (alumínium, műanyag) vékony rétegben felhordott ferromágneses anyagot meghatározott módon, a tárolandó információnak megfelelően változó irányú mágneses térrel átmágneseznek úgy, hogy a kialakult maradandó (remanens) mágnesesség elegendő erejű legyen ahhoz, hogy a tárolt információ kiolvasásakor a felület felett elhaladó olvasófejben változó irányú áramot indukáljon. A kódolást, dekódolást speciális vezérlő áramkörök végzik.

Az adatokat közvetlen (direkt) elérhető módon tárolják a mágneslemezeken. A lemezek alapanyaga szerint megkülönböztetünk hajlékony (floppy) vagy merev (winchester) mágneslemezeket. A rögzítés elve mindkét esetben ugyanaz – az adatokat a lemez felszínén koncentrikus körök (sávok = track-ek) mentén rögzítik -, de az elérhető adatsűrűség a merevlemezen nagyságrendekkel nagyobb, mint a hajlékony lemezen. Az adatokat a sávokon belül szektorokban tárolják. A tárolás logikai egysége a klaszter, ami rendszerektől függően eltérő számú szektorból állhat. Gyárilag rögzített szektorok esetén hardszektoros, egyébként szoftszektoros lemezekről beszélhetünk. A legjellemzőbb szektorméret 512 byte.

A mágnesszalagos tárolók soros elérésűek, mivel egy bizonyos adat megkereséséhez az összes előtte levő adaton végig kell haladni. A mágnesszalagokon az adatokat blokkokban tárolják, amiket egy üres, adatot nem tartalmazó rész, úgynevezett gap választ el egymástól. Az írássűrűséget a szalag egységnyi hosszúságán elhelyezhető bitek számával jellemezzük.

Az optikai háttértárolók

Az optikai elven működő háttértárak esetén egy polírozott üveglemezre fotoérzékeny agyagot visznek fel, az adatokat lézersugár segítségével írják, illetve olvassák. Fajtái:

  • CD-ROM: gyárilag rögzített tartalommal rendelkezik, csak olvasható. A lézerfény visszaverődési és kioltási (interferencia) tulajdonságait használják a lemezen tárolt adatok olvasásához.

  • CD-MO (Magneto-Optical): írható, törölhető és újraírható. A fény mágneses térben való viselkedését használják ki az adattárolás érdekében.

  • CD-R (Recordable) vagy WORM (Write Once Read Many): egyszer írható, sokszor olvasható.

  • CD-RW (ReWritable): írható, törölhető és újraírható.

  • DVD, DVD-RAM, DVD-RW: működése lényegében megegyezik a CD-ével, a sávok azonban sokkal sűrűbben helyezkednek el.

  • A Blu-ray Disc (BD vagy BR) nagy tároló kapacitású digitális optikai tárolóeszköz-formátum. Az elnevezésben a „blue” (kék) a használt lézer színére utal, a „ray” pedig az optikai sugárra. (Az „e” betűt a „blue” szóból azért hagyták el, mert egy hétköznapi szót nem lehet levédeni.)

A CD, DVD és BD írásának összehasonlítása:

A processzorok teljesítménye évről évre megsokszorozódik, míg a háttértárolók kapacitása csak kisebb mértékben növekszik. A felvetődő problémák megoldására különböző megoldásokat dolgoztak ki. A RAID (Redundant Array of Inexpensive Disks vagy Redundant Array of Independent Disks) egy olyan technika, melyet a háttértárolók nagyobb megbízhatósága és a tárolókapacitás növelése érdekében fejlesztettek ki. A lemezekre írt adatokhoz redundáns információkat is társítva lehetővé teszi azoknak helyreállítását bizonyos mennyiségű adat megsérülése esetén. A RAID technológia lényege a nevében is benne van: több független merevlemez összekapcsolásával egy nagyobb méretű és megbízhatóságú logikai lemezt hozunk létre.

Pendrive, flashdrive

A félvezető technika fejlődésének köszönhetően ma már egyre kisebb méretű, de egyre nagyobb tárolási kapacitású adathordozókat gyártanak. Ilyen például a pendrive, illetve flashdrive ami egy USB csatlakozóval egybeépített flash memória.

Bemeneti perifériák

Az input egységek (beviteli eszközök) segítségével visszük be a számítógépbe mindazokat az információkat, amelyekre a feldolgozáshoz szükség van, tehát a feldolgozandó adatokat és programokat. Ezek az eszközök nem csak az adatmozgatást végzik, hanem az adatokat az ember által értelmezhető formáról átalakítják a gép által értelmezhető formára.

Billentyűzet

A billentyűzet (keyboard, klaviatúra, konzol) az elsődleges bemeneti periféria. A billentyűzet több részre tagolódik. Az alfanumerikus rész az írógépekre hasonlít, amely a karakteres billentyűket tartalmazza.

A váltóbillentyűk csoportjába sorolható az Alt jelentésmódosító (funkcióváltó) gomb, ami csak valamilyen más billentyűvel együtt lenyomva hatásos. (Az Alt Gr a Windows-os klaviatúrák jelentésmódosító gombja. Így a Shift-tel és az Alt Gr-rel egy-egy gombhoz három különböző jelet is hozzárendeltek.) A Ctrl (vezérlőváltó) gomb szintén jelentésmódosításra szolgál, és más billentyűvel együtt lenyomva van hatása. (Érdemes megjegyezni, hogy az Alt és a Del gombok lenyomásával egy időben használva a számítógép újraindul; Windows rendszerben a Windows Feladatkezelő ablak aktiválását váltja ki ez a művelet.) A Shift. speciális váltógomb, amelyre azért van szükség, hogy a billentyűzeten minél több karakter helyet kapjon. Így bizonyos gombokat megosztottak, azaz két különböző jel megjelentetésére is képessé tettek. A Shift-et lenyomva a billentyűk felső részére festett jelet aktivizálhatjuk, míg betűk esetén a nagy- és kisbetű közötti váltást eredményezi.

A kapcsolóbillentyűk csoportjába tartozik a Caps Lock, amelyet kikapcsolva kisbetűket, bekapcsolva nagybetűket írhatunk. A Num Lock bekapcsolásával számbillentyűzetként, kikapcsolásakor kurzorblokként használható a a külön blokkban elhelyezett numerikus billentyűzet. A Scroll Lock ritkán használt billentyű, amelyet a képernyőn történő szöveggörgetés módosítására (ki- és bekapcsolására) terveztek.

A szerkesztőbillentyűk csoportjába tartozó Ins vagy Insert billentyű a beszúrás/felülírás váltására szolgál. A Del vagy Delete az aktuális pozícióban levő karakter, a Back Space vagy pedig az aktuális pozíció előtti karakter törlésére való.

A numerikus billentyűket a gyorsabb adatbevitel érdekében hozták létre a billentyűzet jobb oldalán. (Megfigyelhető, hogy az úgynevezett origógomb az 5-ös felirattal kézzel tapintható jelzéssel van ellátva azok számára, akik „vakon” szeretnék a numerikus padot kezelni).

A kurzormozgató billentyűk (↑,↓,←,→, Page Up, Page Down, Home, End) értelemszerűen a kurzor mozgatását szolgálják.

A funkcióbillentyűk (F1 - F12) olyan vezérlőgombok, melyekhez a futó program rendelhet értelmet, így a programok kezelése is egyszerűbbé válik segítségükkel.

Az Esc az aktuális feladat törlésére, abból való kilépésre szolgál.

Az Enter billentyű a bevitelt, az utasítás értelmezését, a végrehajtást kezdeményező billentyű. Bizonyos alkalmazásokban az új sor jelzésére szolgál.

A pillanatstop gomb a Pause vagy Break, amivel egy éppen futó feladat felfüggesztését kezdeményezhetjük.

A Print Screen gomb a képernyő teljes tartalmát a vágólapra teszi, ahonnan az kinyomtatható.

A képen egy João Sabino által tervezett billentyűzet táska látszik:

Egér

A bemeneti perifériák közül a második legfontosabb az egér (mouse) egy úgynevezett egérkurzort használ, amely a képernyőn pontosan követi az elmozdulás irányát. Ennek segítségével lehet rámutatni a megfelelő objektumra (például ikon, menüpont, nyomógomb) majd az egér gombjával aktivizálni. (Ezt a műveletet a számítástechnikai szlengben „klikkelésnek” hívják, ugyanis a műveletet egy kattanó hang jelzi, amely az egér gombjának lenyomásával keletkezik). Nyomógombokból, alapértelmezés szerint kettő található. Sok modell azonban hárommal rendelkezik, de a középsőt csak speciális programozással lehet használhatóvá tenni. A manapság használatos egerek középső gombja azonban görgető funkcióval is rendelkezik, ami jelentősen meggyorsítja például a dokumentumon belüli mozgást.

A mechanikus típusú egér esetén egy gumival bevont fémgolyó mozgását követi két érzékelő korong (az egyik a függőleges-, míg a másik a vízszintes elmozdulás állapotát figyeli). Az ilyen egerekhez speciális alátétet (úgynevezett egérpadot) árusítanak, amely csúszásmentes felületet biztosít az egér golyójának. Az optikai típusú egér alján egy kis optikai érzékelő figyeli az elmozdulás irányát és sebességét.

Az optikai típusú egér alján egy kis optikai érzékelő figyeli az elmozdulás irányát és sebességét.

Egyéb beviteli eszközök

A lapolvasó (scanner) képek, illetve írógéppel írt vagy nyomtatott szövegek bevitelére alkalmas.

A vonalkódolvasókat főként a kereskedelemben használják, de már terjedőben van olyan helyeken (például raktárakban, könyvtárakban), ahol sok különböző tárgyat kell gyorsan, egyszerűen azonosítani.

A digitalizáló táblát egy adatbeviteli eszköz, amely lehetővé teszi, hogy közvetlenül, kézzel vigyünk be adatokat a számítógépbe úgy, mintha papírra írnánk vagy rajzolnánk.

Az interaktív tábla mind az üzleti szférában, mind az oktatásban használt olyan bemeneti eszköz, amely egy szoftver segítségével kapcsolja össze a táblát egy számítógéppel (és egy projektorral) úgy, hogy annak vezérlése a tábláról is történhet, illetve a táblára került tartalmak háttértárolóra menthetővé válnak.

A videokamera és mikrofon a multimédiás kommunikáció (pl. videokonferencia) lebonyolításának elengedhetetlen hardver eszközei.

A digitális fényképezőgép a látható világ képpontokká történő leképzését végzi. Az eredmény annál inkább közelíti a valóságot, minél több képpontból (pixel) áll össze a keletkezett kép.

Kimeneti perifériák

Az output egységek (kiviteli eszközök) a gép által végrehajtott feladatok eredményeinek megjelenítésére valók, vagyis a géptől a felhasználó felé közvetítenek információkat.

Monitor, videokártya

A monitor (megjelenítő, képernyő, display) a számítógépek elsődleges kimeneti perifériája, az információk megjelenítésére szolgál. Alaphelyzetben minden szöveg, ábra és egyéb megjeleníthető információ a képernyőre kerül. A gép a memóriájából viszi át az adatokat a monitorra, tehát itt is egyirányú, de a billentyűzettel ellentétes adatáramlásról van szó. Az adatfeldolgozás eredményei, a gép üzenetei, a billentyűzeten begépelt szöveg is kikerül a képernyőre, és ezen láthatjuk minden egérrel végzett műveletünk folyamatát és eredményét is.

A videokártya tartalmazza azt az elektronikát, amely a monitort illeszti számítógépünkhöz. A kártya paraméterei (típusa) határozzák meg azt a monitortípust, melyet használnunk kell, ha a kártyánk képességeit ki akarjuk használni. A PC-k hőskorában csak monokróm adapterek voltak. Ezek egyik legelterjedtebb típusa az MDA (Monochrome Display Adapter) kártya volt. Ez a kártya csak szöveg kiírására volt alkalmas, grafikus ábrát nem tudott megjeleníteni. Később a Hercules Corporation kifejlesztette a népszerű Hercules videokártyát (HGC, Hercules Graphics Controller). Ez a kártya már képes volt monokróm grafikus ábrákat is megjeleníteni. A színes szövegek és képek előállításához kifejlesztették a CGA (Color Graphics Adapter) színes grafikus videókártyákat. Ez a kártya 640 x 200 képpontos (pixel) felbontással csak két színt, 320 x 200-as felbontással a létező 16 színből egyszerre már négy színt tett láthatóvá. Az EGA (Enhanced Graphics Array) videokártya 640 x 350-es felbontással és 64 színnel dolgozott, de ebből csak 16 színt tudott megjeleníteni egyidejűleg a képernyőn. Ezek a kártyák még digitális videojelet szolgáltattak a monitorok számára. Ezeken kívül még számos videokártya jelent meg a piacon. 1987-től kezdték gyártani az első VGA (Video Graphics Array) adaptereket, amelyek már analóg videojelet szolgáltatnak. A felbontásuk 640 x 480 képpont. Ennek a kártyatípusnak a továbbfejlesztésével a fejlesztők eljutottak napjaink legelterjedtebb SVGA (Super Video Graphics Array) videokártyájához, melynek felbontása rugalmasan változtatható a monitor és a felhasználó igényei szerint. A jelenleg használt SVGA kártya felbontása 640 x 480; 800 x 600; 1024 x 768, 1152 x 864 vagy 1280 x 1024 képpont.

A videokártya felbontása a képernyőn megjelenő pixelek számát jelenti. Ha nagyobb a kártya felbontása, nagyobb a pixelek száma is, így élesebb a képernyőn megjelenő kép. Az ideális videokártyának nagy felbontása van, és ezzel a felbontással képes sok szín megjelenítésére. Az, hogy egy kártya hány színt tud megjeleníteni a különböző képfelbontások esetén, a kártyán elhelyezett, úgynevezett videó memória nagyságától függ.

Működési elvük szerint a képernyők lehetnek:

  • katódsugárcsöves (CRT);

  • plazmakijelzős (LED);

  • folyadékkristályos(LCD);

  • vékonyfilm tranzisztoros(TFT).

Fontos jellemzője a képernyőknek a képátló mérete, amelynek mértékegysége az inch (coll), jele a " (1 inch = 2,54 cm).

Nyomtatók

Amióta számítógépek vannak, azóta használnak hozzájuk nyomtatókat (printer) is. A nyomtatók feladata az információ papírra rögzítése az ember által olvasható formában. A nyomtatókat különböző szempontok szerint csoportosíthatjuk.

A nyomtatási technikák szerint lehetnek:

  • impact (érintéses vagy ütő) nyomtatók, melynél a rögzítés az érintés hatásán alapul (mátrix, gömbfejes, margarétakerekes, íróhengeres, íróláncos, írórudas nyomtatók);

  • non-impact (érintés nélküli) nyomtatók (hő-, tintasugaras, elektrosztatikus, mágneses nyomtatók).

A kinyomtatott karakterek megjelenítési módja szerint:

  • teljes karaktert író;

  • pontokból összeállított karaktert író.

Az egyszerre kinyomtatott karakterek száma alapján:

  • karakternyomtatók;

  • sornyomtatók;

  • lapnyomtatók.

Az írásminőség alapján:

  • levélminőségű (LQ = Letter Quality);

  • közel levélminőségű (NLQ = Near Letter Quality);

  • piszkozati minőségű (Draft).

A napjainkban leggyakrabban használt nyomtatók a mátrix-, a tintasugaras és a lézernyomtatók.

A mátrixnyomtató működésének alapja egy apró tűket tartalmazó írófej, amelyen függőlegesen 9 (7, 12, 18, 24) tű helyezkedik el egymás alatt (a 24 tűs modellek esetében kettő ilyen 12 darabos oszlop található). A nyomtató vezérlőelektronikája minden egyes kinyomtatandó karakter képét pontokból állítja össze, és ennek megfelelően nyomja rá a tűket a festékszalagra. A mátrixnyomtatóknál az úgynevezett traktor alkalmassá teszi a berendezést arra, hogy leporellós papírlapokra nyomtathassunk. További fontos jellemzőjük az eltérő nagyságú (A3, A4), és a kettő-, illetve hárompéldányos, önindigós papír használata. A mátrixnyomtatóknál megjelentek a színes szalagok. Ezek olyan osztott két- vagy háromszínű szalagok, amelyeknél az egyik szín a fekete, míg a másik a piros vagy a zöld (esetleg mindkettő).

A tintasugaras nyomtató a nyomtatófejben található fúvókán (kis átmérőjű lyukon) keresztül finom tintacseppeket juttat a papírra a tintapatronból. A patronban található egy kisebb kamra, amelyben a nyomtatáshoz szükséges festékmennyiség található. (A teljes festékmennyiséget egy szivacsszerű anyag hordozza, ezáltal elérhető a szivárgásmentesség.) A kamra hátulján levő piezoelektromos kristály a rá adott feszültség hatására megváltoztatja méretét, aminek hatására egy csepp tinta lökődik a fúvókán keresztül a papírra. A feszültség megszüntetése után a piezoelektromos elem alakváltozása szívó hatást fejt ki, amelynek eredményeképpen újabb adag tintát szív a kamrába.

A lézernyomtató a mai legmodernebb nyomtató. Működésének alapja egy gumihenger, amely vegyi anyaggal, szelénnel van bevonva. Egy lézerberendezés is található a készülékben, amely folyamatosan sugarakat bocsát ki. Egy lézersugár egy tükörrendszer segítségével a hengerre pontokat rajzol, a pontok helyén feszültség keletkezik, és így a szintén töltéssel rendelkező szilárd festékpor (toner) a megfelelő helyekről lelökődik. A hengeren csak a nyomtatandó helyen marad festék, mely egy ellentétes tér hatására a hengerről a papírra tapad. A festék papírra égetését a felfűtött hengerek közötti átvezetéssel érik el.

Tintasugaras- és lézernyomtatók nyomtatási minőségét DPI-ben (Dot Per Inch) mérik. Ez a kinyomtatott információ finomságát jelenti, azaz azt, hogy milyen közel vannak egymáshoz azon pontok, amelyekből a kívánt adat összeáll.

Egyéb kiviteli eszközök

Plotter A plotter (rajzgép) a nyomtatók mintájára készült berendezés, amely teljes mértékben műszaki rajzok készítésére alkalmas. A CAD (Computer Aided Design) rendszerek előszeretettel használják.

Hangszóró

A hangszóró hangkártyára csatlakozik. A hangszórókat sok esetben egyes monitorokba be is építik.

6. fejezet - Számítógéphálózatok

A számítógéphálózatokat kommunikációs csatornákkal összekötött, egymással kommunikálni tudó számítástechnikai eszközök vagy csomópontok alkotják. A csomópontok számítógépek, terminálok, munkaállomások vagy különböző kommunikációs eszközök lehetnek a térben tetszőlegesen elosztva. A kommunikáció különböző átviteli közegeken keresztül történik a csomópontok között.

A hálózat célja a feladatok ésszerű megosztása a tagok között, ami nyilvánvaló kölcsönös előnyökkel jár: kommunikáció; távoli hozzáférés; rendszerfelügyelet; közös adatok, állományok elérése; költséges perifériák használata; nagyobb megbízhatóság.

A hálózatoktól elvárt legfontosabb tulajdonságok:

  • összeköthetőség (a különböző hardver- és szoftverelemek kompatibilitása);

  • egyszerűség (a felhasznált hardver és szoftver elemek könnyen installálhatók és működtethetők);

  • modularitás (a különböző gyártóktól származó elemekből mint építőkockákból felépíthető az igényeknek megfelelő hálózat);

  • megbízhatóság (hibamentes adatátvitel biztosítása);

  • hajlékonyság (lehetőség a továbbfejlesztésre az igények bővülésekor);

  • sokoldalúság (sokféle szolgáltatás egyszerű hozzáféréssel).

A hálózatok fontos jellemzője a topológia, ami a csomópontok geometriai elrendezését és összeköttetését jelenti. Az összeköttetés lehet teljes vagy részleges.

Sín vagy busz topológia

A legegyszerűbb és legolcsóbb hálózati elrendezés a sín vagy busz topológia. Ez az elrendezés egyetlen, busznak nevezett átviteli közeget használ. A buszon lévő mindegyik számítógépnek egyedi címe van, ez azonosítja a hálózaton.

Egy busz topológiájú hálózat esetén a számítógépeket az esetek többségében koaxiális kábellel csatlakoztatják egymáshoz. Nem egyetlen hosszú kábel, hanem sok rövid szakaszból áll, amelyeket T-csatlakozók segítségével kötnek össze. Ezen kívül a T-csatlakozók lehetővé teszik a kábel leágazását, hogy más számítógépek is csatlakozhassanak a hálózathoz. Egy speciális hardverelemet kell használni a kábel mindkét végének lezárásához, hogy ne verődjön vissza a buszon végighaladó jel, azaz ne jelenjen meg ismételt adatként. Ahogy az adat végighalad a buszon, mindegyik számítógép megvizsgálja, hogy eldöntse, melyik számítógépnek szól az üzenet. Az adat vizsgálata után a számítógép vagy fogadja az adatot, vagy figyelmen kívül hagyja, ha az nem neki szól.

A busz topológiával az a probléma, hogy ha a buszkábel bárhol megszakad, akkor a szakadás egyik oldalán lévő számítógépek nem csak az összeköttetést veszítik el a másik oldalon lévőkkel, hanem a szakadás következtében mindkét oldalon megszűnik a lezárás. A lezárás megszűnésének hatására a jel visszaverődik és meghamisítja a buszon lévő adatokat.

A busz topológiájú hálózatot kialakításakor korlátozott a buszhoz köthető gépek száma. Ez azért van, mert ahogy a jel a kábelen halad, egyre inkább gyengébb lesz. Ha több számítógépet csatlakoztatnunk a hálózathoz, akkor használnunk kell egy jelerősítőnek (repeater) nevezett speciális hálózati eszközt, amely a busz mentén meghatározott helyeken felerősíti a jeleket.

Előnye az egyszerűsége és olcsósága, hátránya viszont, hogy érzékeny a kábelhibákra. Az alábbi ábra példa egy busz topológiájú hálózatra:

Csillag topológia

A legelső topológiák közé a csillag topológia tartozik, mivel segítségével könnyen megoldható volt már korábban is a központosított vezérlés. A csillag topológia esetén a munkaállomások közvetlenül tartanak kapcsolatot a csillag középpontjában levő szerverrel, így a központi erőforrások gyorsan és egyszerűen elérhetők. Ha nincs szükség folyamatos adatátvitelre, akkor a csomagkapcsolt eljárást alkalmazzák, különben pedig a klasszikus vonalkapcsolást. Ha az egyik számítógép kapcsolatba akar lépni a hálózat egy másik számítógépével, akkor a központi vezérlő (HUB) létrehozza az összeköttetést, vagy legalábbis kijelöli a másik berendezés elérési útvonalát, s miután ez megtörtént, elkezdődhet a kommunikáció. Az összeköttetést követően az információcsere úgy bonyolódik le, mintha közvetlen kapcsolatban állna egymással a két számítógép. Ekkor a központi vezérlőnek már nincs feladata, tehát mintegy közvetítőként működik.

A csillag topológia esetén az adatcsomagok az egyes csatlakozási pontoktól a központi HUB felé haladnak. A központi HUB az adatcsomagokat rendeltetési helyük felé továbbítja. Egy HUB-ot használó rendszerben nincs közvetlen összeköttetés a számítógépek között, hanem az összes számítógép a HUB-on keresztül kapcsolódik egymáshoz. Mindegyik gép külön kábelen csatlakozik a HUB-hoz, ezért meglehetősen sok hálózati kábelre van szükség, ami adott esetben drágává teheti a telepítést.

A csillag topológia legfőbb előnye, hogy ha megszakad a kapcsolat a HUB és bármelyik számítógép között, az nem befolyásolja a hálózat többi csomópontját, mert mindnek megvan a saját összeköttetése a HUB-bal. A topológia hátránya, hogy a központ meghibásodásával az egész hálózat működésképtelenné válik. Másik hátránya, hogy ha az egyik gép üzen a másiknak, előbb a központi gép kapja meg a csomagot, majd azt a célállomásnak továbbítja. Emiatt a központi gép gyakran túlterhelt. Az alábbi ábra példa egy csillag topológiájú hálózatra:

Gyűrű topológia

Minden állomás, beleértve a szervert is, két szomszédos állomással áll közvetlen kapcsolatban. Az összeköttetés körkörös, folyamatos gyűrű (megszakítás nélküli, de szükségszerűen kört képező), ebből következően a hálózatnak nincs végcsatlakozása. Bármely pontról elindulva végül visszatérünk a kiindulóponthoz, hiszen az adat csak egy irányban halad.

Az üzeneteket a gépek mindig a szomszédjuknak adják át, s ha az nem a szomszédnak szólt, akkor az is továbbítja. Addig vándorol az üzenet gépről gépre, amíg el nem érkezik a címzetthez. Mindegyik csomópont veszi az adatjelet, elemzi az adatokat, és ha az üzenet másik gép részére szól, akkor az adatokat a gyűrű mentén a következő géphez továbbítja. Az adatfeldolgozás cím alapján történik, azaz csak a címzett dolgozza fel az adatot, a többiek csak továbbítják.

A csillag topológiától eltérően a gyűrű topológia folyamatos útvonalat igényel a hálózat összes számítógépe között. A gyűrű bármely részén fellépő meghibásodás hatására a teljes adatátvitel leáll. A hálózattervezők a meghibásodások ellen néha tartalék útvonalak kialakításával védekeznek. Ezen kívül hátránya még az is, hogy az adat a hálózat minden számítógépén keresztülhalad, és a felhasználók illetéktelenül is hozzájuthatnak az adatokhoz.

A gyűrű alakú topológia esetén a hálózati kommunikáció lehet csomagkapcsolt és vezérjel (Token Ring) elve alapján működő. Ez utóbbi esetben egy vezérjel kering körbe a vonalon, és csak az a gép küldhet üzenetet, amelynél éppen a vezérjel van. A küldő gép csak az üzenetküldés után továbbítja a vezérjelet. Az alábbi ábra példa egy gyűrű topológiájú hálózatra:

Fa topológia

A fa topológiájú hálózat jellemzője a központi, kiemelt szerepkört betöltő számítógép. A központi gép úgynevezett közvetítő gépekkel vagy munkaállomásokkal van összekötve. Van egy gyökér, amelyre rákapcsolódnak a kisebb központok, a kisebb központokra kapcsolódnak a kliens gépek vagy még kisebb szerverek. Tehát a munkaállomások hierarchikus rendben kapcsolódnak egy vagy több másik munkaállomáshoz. Egy-egy ilyen ágat alhálózatnak is nevezünk. Minden összekötött gép között csak egyetlen út van. Előnye a kis kábelezési költség, valamint, hogy nagyobb hálózatok is kialakíthatók. Hátránya viszont, hogy egy kábel kiesése egy egész alhálózatot tönkretehet. Az alábbi ábra példa egy fa topológiájú hálózatra:

A hálózatokat csoportosíthatjuk térbeli kiterjedésük szerint. Ilyen értelemben megkülönböztetünk:

  • helyi hálózatokat (LAN - Local Area Network), a néhány méteres kiterjedéstől az általában egy épületen belüli méretekig;

  • városi hálózatokat (MAN - Metropolitan Area Network), amelyek több LAN-t köt(het)nek össze;

  • nagykiterjedésű hálózatokat (WAN - Wide Area Network), melyek mérete az 50 km-t meghaladja és a vezetékes összeköttetést felvált(hat)ja a rádiós vagy mikrohullámú adatátvitel.

A fizikai távolság (processzorok közti távolság, illetve a processzorok elhelyezkedése) szerinti osztályozás:

6.1. táblázat - Táblázat 4

TávolságHelyHálózat típusa
0.1 megy kártyánadatfolyam gép
1 megy rendszerbenmultiprocesszor
10 m - 1000 megy szobában, épületben, egyetemenhelyi hálózat
10 kmegy városbanvárosi hálózat
100 km - 10000 kmegy országban, kontinensen, bolygónnagykiterjedésű hálózat


Az ISO (International Standards Organization) – modell logikailag rétegekre bontja a hálózatot az alábbi elvek szerint:

  • Hasonló funkciókat azonos rétegbe kell gyűjteni.

  • Lényegesen különböző funkciókat különböző rétegekbe kell csoportosítani.

  • A réteghez tartozó funkciók és protokollok cseréjét engedélyezni kell anélkül, hogy más rétegeket befolyásolnának.

  • A réteg teljes mértékben újratervezhető és protokolljai cserélhetők legyenek úgy, hogy az architektúra a hardver- vagy szoftver-technológia előnyeit kihasználhassa a felső szomszédos réteg számára szükséges szolgálatok maradéktalan biztosítása mellett.

  • Új réteget kell létrehozni ott, ahol az adat kezelése különböző szintű absztrakciókat igényel.

  • Minden réteg csak a közvetlen szomszédjával határos.

  • Meg kell hagyni azokban a pontokban a határokat, amelyeket a gyakorlati tapasztalat régebbről indokol.

  • Határvonalat kell létrehozni abban a pontban, ahol a szolgálatok leírása rövid és a határon keresztüli interakciók száma minimális.

  • Határvonalat kell létrehozni ott, ahol a szükséges interfészre szabványosítási igény van kilátásban.

  • Ne legyen olyan sok réteg, hogy a rendszerintegrációs leírások és a rétegek integrációja bonyolultabbá váljon, mint amennyire az szükséges.

A számítógépes hálózat, tekinthető úgy, mint egy bizonyos számú réteg. Minden egyes szint, amely egyben hardver, és szoftver segítségével megvalósított funkcionális réteg, egy funkció készletet biztosít.

Az adatok továbbítása a fizikai hálózaton protokollok szerint történik. A kommunikációs rendszer minden egyes szintjén egy jól definiált szabály halmazt kell használni ahhoz, hogy a kommunikáció sikeres legyen. Egy adott rétegen a szabályok összességét protokollnak nevezzük.

Az OSI (Open System Interconnection) modell logikailag hét rétegre bontja a hálózatot:

  1. A fizikai réteg (physical layer) a bitek kommunikációs csatornára való kibocsátásáért felelős. Biztosítania kell, hogy az adó által küldött jeleket a vevő is azonosként értelmezze (ha 1-t adnak, akkor a vevő is 1-et vegyen).

  2. Az adatkapcsolati réteg (data link layer) alapvető feladata a hibamentes átvitel biztosítása a szomszéd gépek között, vagyis a hibás, zavart, tetszőlegesen kezdetleges átviteli vonalat hibamentessé transzformálja az összeköttetés fennállása alatt. Az adatokat adatkeretekké (data frame) tördeli, továbbítja, a nyugtát fogadja, hibajavítást és forgalomszabályozást végez. Repeater (jelismétlő) vagy bridge (hídaló) tartozik ide és az Ethernet/IEEE 802.3

  3. A hálózati réteg (network layer) a kommunikációs alhálózatok működését vezérli, feladata az útvonalválasztás a forrás és acélállomás között. Ez lehet statikus vagy dinamikus. Fontos a torlódás megakadályozása. E réteg feladata bizonyos számlálási és számlázási feladatok biztosítása. Ha az útvonalban eltérő hálózatok vannak, akkor fregmentálást, protokoll átalakítást is végez. Az utolsó olyan réteg, amely ismeri a hálózat topológiáját. IP (Internet Protocol) Ez a protokoll gondoskodik a csomagok átviteléről a hálózaton. Ez egy kapcsolat nélküli protokoll, azaz a kommunikációhoz nem szükséges előzetes kapcsolatfelvétel. Ebből adódik, hogy tartalmaznia kell a kézbesítéssel összefüggő információkat, a teljes és pontos címet. Adatátvitel szempontjából nem megbízható, a csomagokkal bármi megtörténhet: elveszhetnek, megsérülhetnek, sorrendjük összekeveredhet. Még nagyobb gond, hogy ha nem sikerült az adatok továbbítása, akkor nem értesíti a küldő alkalmazást.

  4. A szállítási réteg (transport layer) alapvető feladata üzenetek fogadása a viszonyrétegtől, ezek széttördelése, elküldése (különböző csomagok különböző útvonalon), és annak biztosítása, hogy minden darab hibátlanul megérkezzék. Már nem ismeri a topológiát, csak a két végpontban van rá szükség. Feladata az összeköttetések felépítése, bontása, csomagok sorrendbe állítása. A TCP (Transmission Control Protocol - átvitelvezérlő protokoll), a megbízható protokoll, az IP-t használja az adatok továbbításához. A protokollok tervezői a TCP-be építik be azokat a megbízhatósági jellemzőket, amelyek az IP-bõl hiányoznak. Egy másik protokoll ami ide tartozik az UDP (User Datagram Protocol).

  5. A viszonyréteg (session layer) lehetővé teszi, hogy két számítógép felhasználói kapcsolatot létesítsenek egymással. Jellegzetes feladata a logikai kapcsolat felépítése és bontása, a párbeszéd szervezése. Ellenőrzési pontok beépítésével szinkronizációs feladatokat is ellát.

  6. A megjelenítési réteg (presentation layer) az átviendő információ szintaktikájával és szemantikájával foglalkozik. Az egyetlen olyan réteg, amely megváltoztathatja az üzenet tartalmát. Tömörít, rejtjelez (adatvédelem és adatbiztonság miatt), kódcserét (pl.: ASCII - EBCDIC) végez el.

  7. Az alkalmazási réteg (application layer) a felhasználóknak nyújt közvetlen szolgáltatásokat. Protokollokat tartalmaz. Tipikus alkalmazási rétegfeladatok pl. az állománytovábbítás, elektronikus levelezés, távoli munkabevitel. LAN-ok esetén ezt a munkaállomásokra és a szerverre telepített hálózati alkalmazások biztosítják.

Vezetékes adatátviteli közegek

Csavart érpár

A csavart vagy sodrott érpár (Unshielded Twisted Pair - UTP) két szigetelt, egymásra spirálisan felcsavart rézvezeték. Ha ezt kívülről egy fémszövet burokkal is körbevesszük, árnyékolt csavart érpárról (Shielded Twisted Pair - STP) beszélünk. Régi és ma is kedvelt módszer. A sodrott érpár két szigetelt, általában 1 mm vastag rézhuzalból áll. A két eret spirálisan összetekerik, hogy az egymás mellett lévő erek villamos kölcsönhatását kiküszöböljék. Minél sűrűbb a csavarás, annál nagyobb az átviteli sebesség. Általában több csavart érpárt fognak össze közös védőburkolatban. A sodrott érpár alkalmas analóg és digitális jelek átvitelére egyaránt. Jelerősítés nélkül is több kilométer távolságra használhatók, nagyobb távolságok áthidalására ismétlőket vesznek igénybe. A sávszélesség függ a távolságtól, a csavarástól és a huzal vastagságától, 10 Mbit/s-tól 100Mbit/s-ig terjedhet.

Koaxiális kábelek

Széles körben két fajtáját használják: az egyik az alapsávú, melyet digitális jelátvitelre, a másik a szélessávú koaxiális kábel, melyet az analóg jelek átvitelére használnak. A kábel közepe tömör rézhuzalmag, amely körül szigetelő van. A szigetelőt sűrűn szőtt, hengeres vezető veszi körül. Végül az egészet egy műanyag védőburkolat öleli körül. A kábel szerkezete nagy sávszélességet, kitűnő zajvédelmet eredményez. A sávszélesség a kábel hosszától függ. Egy kilométer távolságon 10 Mbit/s, kisebb távolságokon nagyobb átviteli sebesség valósítható meg.

Üvegszálas kábel

Az optikai kutatások eredményeképpen lehetővé vált az adatok fényimpulzusokkal történő átvitele üvegszálas kábellel. A fényimpulzus a logikai 1, az impulzus hiánya a logikai 0. A látható fény frekvenciája közel 108 MHz, így egy optikai adatátviteli rendszer sávszélessége potenciálisan óriási. A rendszer három összetevőből áll: fényforrás, átviteli közeg, fényérzékelő. Az átvitel közeg hajszálvékony, üvegből vagy szilikátból készült szál. A fényforrás vagy LED (Light Emitting Diode - fényemittáló dióda) vagy lézerdióda, mely villamos áram hatására fényimpulzusokat bocsát ki magából. A fényérzékelő egy fotodióda, amely fény hatására villamos jeleket állít elő. Az optikai szál egyik végére LED-et vagy lézerdiódát, a másik végére fotodiódát téve adatátviteli rendszerhez jutunk. A jelenleg kapható optikai szálak 1 km-es távolságon 1000 Mbit/s átviteli sebességet érnek el. A nagyobb teljesítményű lézerek 100 km-es távolságot képesek áthidalni erősítés nélkül.

Vezeték nélküli adatátviteli közegek

Bár a legtöbb kommunikációs rendszer rézhuzalt vagy optikai szálat használ átviteli közegként, vannak olyanok is, melyek vezeték nélküliek, melyek a levegőt használják. Alkalmazásuk különböző helyzetekben történik. Adódhat olyan helyzet, amikor kábelek, optikai szálak elhelyezése csak utcák feltörésével, árkok ásásával volna lehetséges. Ez nemcsak költséges, egyes esetekben lehetetlen is. Másfelől a vezeték nélküli hálózatok teszik lehetővé, hogy a mozgó munkaállomások is kapcsolatba léphessenek a hálózattal.

Infravörös, lézer átvitel

A lézer és infravörös fényt alkalmazó adó-vevő párok könnyen telepíthetők magas épületek tetejére. Teljesen digitális kommunikációt tesz lehetővé, nagyobb távolságokon is lehetséges energiakoncentrálás védetté teszi a külső lehallgatás ellen. Sajnos a légköri zavarok (eső, köd, por) az átvitelt zavarják.

Rádióhullám

Nagyobb távolságok áthidalására gyakran használják a mikrohullámú átvitelt. A kiemelkedő adó- és vevőantennák egymásnak sugárnyalábokat küldenek, melyek több száz kilométert is átfoghatnak. A jelismétlést reléző állomásokkal oldják meg, a vett jelet egy más frekvencián sugározzák a következő állomás felé. A rossz légköri viszonyok itt is problémaként jelentkeznek.

Lokálisan nagyon elterjedt a WIFI. A Wi-Fi (WiFi, Wifi vagy wifi) az IEEE által kifejlesztett vezeték nélküli mikrohullámú kommunikációt (WLAN) megvalósító, széleskörűen elterjedt szabvány IEEE 802.11 (semmilyen angol kifejezésnek nem rövidítése, csupán szójáték a hifi szó analógiájára).

Szórt spektrumú sugárzás

Lokális hálózatoknál, 1 km távolságig használható megoldás. Más vevők az adást fehér zajnak (azonos amplitúdó minden frekvencián) észlelik, a vevő viszont felismeri és érti az adást.

Műhold

A távközlési műholdakat nagy, világűrben lévő mikrohullámú ismétlőknek foghatjuk fel. A frekvencia spektrumnak csak egy részét figyelik, felerősítik a vett jeleket, és a beérkező hullámokkal való interferencia elkerülése érdekében más frekvencián adják azokat újra. Hogy a földön lévő antennákat ne kelljen mozgatni, geostacionárius pályára állított műholdakat használnak. Az egyenlítő felett 36000 km magasan keringő műholdak sebessége megegyezik a Föld forgási sebességével, így állónak látszanak. Átlagos sávszélesség: 12 db 50 MB/s-os transzponder, vagy 800 db 64 kbit/s-os hangcsatorna.

Adatátviteli vezérlő egységek

Repeater

A repeater (jelismétlő) helyi hálózat egy szegmenséről kapott jeleket újraidőzíti és felerősíti, majd továbbítja a következő szegmensnek.

Bridge

A bridge (híd) két azonos típusú hálózat összekapcsolására szolgál adatkapcsolati szinten. A felhasználó nem érzékeli a jelenlétét. Egy kommunikációs számítógép, mely egymásba alakítja az eltérő keretformátumokat.

Router

A router (forgalomirányító vagy útvonalválasztó) kapcsolat hálózati szinten jön létre. Az összekötendő hálózatok különböző hálózati, de azonos szállítási réteggel rendelkeznek.

Gateway

A gateway (átjáró) különböző szoftver és hardver elemű összekapcsolódó hálózatok közötti kapcsolatot hozza létre felhasználói szinten, jelenléte a felhasználó számára is érzékelhető lehet.

Az Internet

Az internet Az internet sok millió számítógép világméretű hálózata. Gerincét az a több százezer nagy teljesítményű számítógép, szerver alkotja, amelyeket műhold, üvegszál, mikrohullám és egyéb adatátviteli technikák kapcsolnak össze egymással. Ezekhez a gépekhez közvetlenül vagy internetszolgáltatókon keresztül csatlakoznak az egyes felhasználók, a kliensek. A hálózati technológiának köszönhetően bármely kliens - a szervereket összekötő gerinchálózaton keresztül - el tudja érni a hálózat bármely másik pontját függetlenül attól, hogy az egymással kapcsolatba került számítógépek fizikailag hol helyezkednek el. A gépek és a rajtuk tárolt anyagok hihetetlenül sokfélék.

Az internet története

A történet az Egyesült Államokban kezdődött az 1960-as évek elején, a hidegháborús kutatások keretén belül. A RAND Corporation foglalkozott azzal a stratégiai problémával, hogyan lehetne létrehozni egy olyan információs struktúrát, amelynek segítségével az amerikai állam és hadvezetés központjai és alközpontjai egy esetleges atomtámadás esetén is fenn tudják tartani egymással a kapcsolatot, vagyis Amerika szervezett és irányítható maradjon.

Abból indultak ki, hogy egy országos információs és irányító hálózat egyetlen központja elsődleges célpontja lenne a támadásnak, tehát azonnal megsemmisülne. A megoldás a decentralizáció. Olyan rendszert kell tehát létrehozni, amelynek nincs egyetlen kitüntetett központja, hanem eleve kis alegységek formájában működik. Fontos követelmény, hogy a keletkező struktúra szabadon konfigurálható legyen abban az értelemben, hogy új csomópontok felvétele, illetve eltávolítása egyszerűen elvégezhető műveletek legyenek, de akár néhány csomópont megsemmisülése se legyen katasztrofális a rendszer egésze szempontjából.

A csomópontok az alapegységek, melyek tökéletesen egyenrangúak. Szabadon küldhetnek, fogadhatnak és továbbíthatnak adatokat az összes többi felé. Az üzeneteket a küldő csomópont kicsi, megcímzett csomagokra bontja, melyeket a fogadó állít újra össze. Ezek a csomagok nem feltétlenül egyazon útvonalon közlekednek, csupán a végcéljuk azonos.

A 60-as évek második felében a RAND Corporation, a Massachusetts Institute of Technology (MIT) és a University of California at Los Angeles (UCLA) kísérletezett a csomagokra bontott információ átviteli módszereinek a kifejlesztésével. Az első próbahálózatot a National Physical Laboratory brit intézet hozta létre 1968-ban. Majd a Pentagon hatáskörébe tartozó Advanced Research Project Agency (ARPA) is bekapcsolódott a kísérletekbe. Az ARPA kutatói olyan rendszert képzeltek el, amelynek csomópontjait nagyteljesítményű szuperszámítógépek alkotják. A tervezés és kivitelezés során gondoltak arra, hogy ez a hálózat békeidőben is kitűnő lehetőséget teremthet egymástól távol eső erőforrások elérésére.

  • Az első hálózatot 1969 őszén építették ki az UCLA-n négy csomópontból, melyet ARPANET-nek neveztek el.

  • 1971-ig 15-re nőtt a bekapcsolt helyek száma. A kutatók szélesítették a felhasználás körét: ekkor kezdett megjelenni az elektronikus levelezés.

  • 1973-ban fejlesztették ki a hálózati protokolloknak nevezett kommunikációs szabványokat, melyek lehetővé tették a bővítést, újabb gépek bekapcsolását. A kezdetben néhány gépet összekötő zárt rendszerből a bővítés lehetőségét magában hordozó nyílt rendszer lett.

  • A földrajzi terjeszkedés innentől kezdve egyre gyorsult. Az 1980-as évekre az USA minden egyeteme rácsatlakoztatta helyi számítógépeit az immár országos méretű hálózatra.

  • A 80-as évek második felében Nyugat-Európában indult meg a bekapcsolódott gépek számának növekedése, a 90-es évekre ez a hullám elérte Kelet-Európát, köztük Magyarországot is.

Csomagkapcsolt átvitel

A csomagkapcsolt átvitel lényege, hogy az adatok csomagokra bontva jutnak el egyik gépről a másikra. A csomagok a továbbítandó információ feldarabolásával keletkeznek, amit fejléccel látunk el. A fejléc az útvonalinformációt, a prioritást, a csomag sorszámát, a hibajavítás információit és egyéb járulékos információt tartalmaz. A vevőoldalon a fejlécet leválasztjuk, majd a csomagokból visszaállítjuk az eredeti információt.

RFC

Az RFC a Request For Comment rövidítése. Az RFC dokumentumok az internet protokollok és alkalmazások szabványgyűjteménye. Minden egyes RFC-nek van egy száma, amely az RFC-t azonosítja.

IP Címzés

A TCP/IP hálózatokban a számítógépeket egységes címzési rend alapján azonosítjuk. Minden egyes gép egyedi hálózati címmel, az ún. IP-címmel rendelkezik. A címek 32 bitesek. A felírás 4 darab 8 bites decimális szám formájában történik. (Az internet dokumentációkban a byte helyett az oktett kifejezést használják a 8 bites számokra. Ez azért van így, mert a TCP/IP-t olyan számítógépek is használják, amelyek architektúrájába a byte nem 8 bites számot jelöl.) A 4 byte-os, IPv4 - cím byte-jait pontokkal választjuk el egymástól (pl. 192.168.50.130). Az egyes elemek értéke 0-255-ig terjedhet. Az IP-címekben a 0 és a 255 speciális jelentéssel bír. A 0 az olyan gépek számára van fenntartva, amelyek nem tudják a hálózati címüket. Az IP-címek nem kezdődhetnek se 0-val, se 127-tel, se 223-nál nagyobb számmal. Az ezeket a szabályokat megszegő címekre marslakókként hivatkoznak, mert elterjedt, hogy a Mars Központ Egyeteme a 225-ös hálózatot használja. A gép elsődleges azonosítója valójában az IP-cím. A számok nevekre való lefordítását az ún. domain name szerverek (DNS) végzik. Az IPv6-os 128 bites címzésstruktúrája szemben az IPv4 32 bites címeivel végtelen címzésterületet jelent, amelyek nem kötött struktúrájúak, "osztálymentesek". IPv4 - címek nem elegendőek a várhatóan egymilliárd új csomóponthoz (pl. mobilkészülékek). Az IPv6 meglehetősen új fogalmat honosít meg az összeköttetés mentes IP világban, a folyam fogalmát, ami egy irányba haladó, azonos feladójú és címzetű IP csomagok sorozatát jelenti. Minden IP csomagba kerül egy azonosító, ami azonosíthatja a folyamot, amihez a csomag tartozik. Ezzel nemcsak a route-olás egyszerűsödik, de lehetővé válik a folyamok számára utat kiépíteni, erőforrásokat lefoglalni, továbbá a QoS (Quality of Service).

Fontosabb szolgáltatások

Elektronikus levelezés

Az elektronikus leveleket az angol „electronic mail” kifejezésből e-mail-nek szokás nevezni. Az e-mail a legrégebbi, a legalapvetőbb az internet szolgáltatásai közül. Levelezőprogramokkal üzenetek küldhetők a világ más tájaira vagy akár a szomszéd szobába, ahol a címzett néhány másodperc múlva olvashatja a levelet.

Az e-mail lényegét tekintve olyan, mint a hagyományos levelezés: mindenki, akinek internet előfizetése van, saját e-mail címmel és elektronikus postafiókkal rendelkezik. Az e-mail cím név@hol alakú. Itt a ”név” a már említett felhasználói név, a ”hol” pedig annak a számítógépnek az internet-azonosítója, amelyre az üzenetet küldjük.

A levelezést két fő protokoll irányítja: az SMTP (Simple Mail Transfer Protocol) a feladó oldalon, míg a POP (Post Office Protocol) a fogadó oldalon.

Távoli gépre bejelentkezés

A számítógéphálózatok kialakulásának jelentős előnye, hogy saját számítógépünkről távoli gépeket ugyanúgy elérhetünk, mintha annak egyik terminálja előtt ülnénk. Az interneten a távoli bejelentkezésre a TELNET program szolgál, amely egyben annak az alkalmazási protokollnak a neve is, amely a helyi és a távoli gép közötti párbeszédet megteremti.

A TELNET azonban elavult, ma már annak minden funkcióját megvalósító, de adattitkosítást és tömörítést is tartalmazó, fejlettebb SSH-t (Secure Shell) használják erre a célra. Előfordulhat például, hogy közbülső gépek lehallgathatják az adatforgalmat, beleértve a jelszavakat is, amit a TELNET nem titkosít, de sok egyéb módszer is van a jogosulatlan hozzáférés megszerzéséhez. Az SSH megakadályozza ezt úgy, hogy titkosít minden adatforgalmat a terminál és a szerver között.

Adatállományok átvitele

Az állománytovábbítási protokoll az FTP (File Transfer Protocol), aminek szolgáltatása az állományok mozgatása egyik számítógépről a másikra, függetlenül a számítógép típusától, földrajzi elhelyezkedésétől.

Az FTP helyekhez kétféle módon lehet hozzájutni: teljes hozzáférési joggal vagy korlátozott, úgynevezett anonymous hozzáférési joggal. Ha van azonosítónk olyan számítógépen, amelyen az FTP szerver fut, akkor a teljes hozzáférési jogú FTP-t használhatjuk. Az anonymus FTP az állományok nyilvános elérését korlátozott hozzáférési joggal teszi lehetővé. Bejelentkezési névként hagyományosan az anonymous-t használjuk, s jelszóként az e-mail, azaz az elektromos levelezési cím vált elterjedtté.

Az interneten folyamatosan hatalmas mennyiségű információ halmozódott fel, és a rendelkezésre álló állományok nevéről és méretéről nem történt semmilyen központi nyilvántartás. A felhasználók munkájának megkönnyítésére fejlesztették az Archie nevű indexelő programot, ami az FTP helyeken található állományokból indexelt adatbázist hoz létre. Az így létrejött adatbázis az állomány nevét, méretét, típusát, egyéb állományinformációt tartalmaz. Ennek segítségével lényegesen gyorsabban megtalálható a keresett állomány az FTP szervereken.

A TELNET esetében ismertetett okokból az FTP helyett ma már az SFTP-t (Secure FTP) használják.

World Wide Web

A World Wide Web (WWW vagy Web) az elektronikus levelezés után az internet legfontosabb alkalmazása, amely az egész világot behálózó információkezelő rendszer. A Web egymással kapcsolatban álló dokumentumok millióinak gyűjteménye, melyeket a világ legkülönbözőbb helyein lévő számítógépek tárolnak.

A Web 1989 márciusában született meg. Megalkotója Tim Berners-Lee, aki a genfi székhelyű Európai Részecskegyorsító Intézetben (CERN) dolgozott, információkat akart megosztani a kutatásban résztvevő, földrajzilag egymástól távoli kutatók között. A CERN támogatta a Web létrehozását, és világméretűvé bővítette. Első nyilvános használatára 1992 januárjában került sor.

A kommunikáció a hypertext technológia alkalmazására épül. Az információkat a böngésző programok segítségével jeleníthetjük meg. A böngészők a webszerverekkel HTTP protokollon keresztül kommunikálnak. A HTTP segítségével a böngészők adatokat küldhetnek a szervereknek, valamint weblapokat tölthetnek le róluk.

A lapokat a böngésző az URL segítségével találja meg, mely a lap címét jelöli. Az URL a címhez tartozó protokollal kezdődik, például a http: a HTTP protokoll jelölése. Sok böngésző több más protokollt is támogat, mint például az ftp: az FTP.

A weblaphoz tartozó fájl formátuma többnyire HTML (HyperText Markup Language). A HTML a böngészőkkel együtt fejlődött, a „hivatalos” HTML-változatokat a W3C (World Wide Web Consortium, mely nyílt szoftver szabványokat alkot a világhálóra) hagyta jóvá, illetve készítette el. A böngészők sokfélesége és a cégek saját HTML módosításai kompatibilitási problémákhoz vezettek.

7. fejezet - A szoftver

Az előző fejezetekben már tárgyaltuk a számítógép hardverét, de magát a fogalmat még nem határoztuk meg.

A hardver (hardware) a számítógépet alkotó mechanikus és elektronikus alkatrészek összessége.

A számítógéphez tartozó másik összefoglaló fogalom a szoftver (software), ami a hardver elemeinek működtetését végző programok, a gép használatához szükséges szellemi termékek összessége. A szoftver teszi használhatóvá a számítógépet, mert a hardver önmagában nem működőképes. Szükség van programokra, amelyek biztosítják a számítógép egységeinek összehangolt működését és a felhasználó igényeinek lehető leghatékonyabb kielégítését.

A szoftverek csoportosítása

A szoftvertermékeket attól függően, hogy milyen feladatokat látnak el, illetve milyen számítógépes rendszerekhez, környezethez készülnek, többféle szempont szerint lehet csoportosítani. Az osztályozásra egységes elvet nehéz meghatározni, de a legtöbb szakirodalomban az alábbi csoportosítást találjuk.

Rendszer- és rendszerközeli szoftverek

A rendszer- és rendszerközeli szoftvereket jellemzően a számítógépet gyártó cégtől vagy szoftverfejlesztőktől vásároljuk meg. Ezek a szoftverek biztosítják a számítógép összehangolt vezérlését, megkönnyítik az operációs rendszerek használatát, illetve segítik a programfejlesztést.

BIOS

A BIOS (Basic Input/Output System) lényegében egy rendszerprogram, amelynek a segítségével a programok szabványos módon tudnak kommunikálni a ki- és bemeneti eszközökön keresztül. A BIOS a számítógépgép ROM típusú memóriájában található.

A BIOS feladata ma már két pontban foglalható össze. Az egyik a számítógép indításához kapcsolódó beállítások és ellenőrzések elvégzése. A BIOS ekkor vizsgálja meg, hogy milyen eszközeink, milyen típusú processzorunk és mennyi memóriánk van, illetve beállítja ezek alap működési módját, majd mindegyik hardverelemen elvégez egy rövid tesztet. Ezt a folyamatot egységesen POST-nak (Power On Self Test) hívjuk.

A BIOS másik fontos feladata az operációs rendszer behúzójának, a merevlemez Master Boot Recordjának betöltése a memóriába, majd a vezérlés átadása erre a kódrészletre. A merevlemezről behúzott kód, az operációs rendszer betöltője, hamarosan teljesen átveszi az irányítást, és saját meghajtó programjaira váltva már a BIOS nélkül fut tovább.

Operációs rendszer

Az operációs rendszer, a hozzátartozó segédprogramokkal és könyvtárakkal, olyan szoftver, amely a számítógép működtetéséhez szükséges parancsokat értelmezi, és végre is hajtja.

Programfejlesztő rendszerek

A programfejlesztő rendszerek olyan rendszerközeli szoftverek, amelyek lehetővé teszik a felhasználók igényeinek megfelelő programok készítését, fordítását a gép által közvetlenül végrehajtható utasításokra, valamint e programoknak vagy részeinek szerkesztését és ellenőrzését.

Felhasználói vagy alkalmazói szoftverek

A felhasználói vagy alkalmazói szoftvereket a számítógépet üzemben tartó külön vesz meg, fejleszt ki, vagy dolgoztat ki saját feladatainak megvalósításához.

Standard felhasználói szoftverek

A standard felhasználói szoftvereket általános, sok helyen előforduló feladatok megoldásához készítenek (szövegszerkesztők, táblázatkezelők, adatbáziskezelők, tudományos szubrutingyűjtemények, termelésirányítási rendszerek, stb.).

Egyedi felhasználói szoftvereket

Az egyedi felhasználói programok egy vállalat, intézmény vagy magánszemély számára készült szoftvertermékek, ahol jobban érvényesíthetők az egyéni igények, elvárások. Az ilyen programokat legtöbbször kisebb szoftvercégek vagy önálló szakemberek fejlesztik. Nagyelőnyük a módosíthatóság, igények szerinti átalakíthatóság.

Az egyedi szoftverfejlesztés lépései:

  • A megoldandó probléma meghatározása, elemzése: az igények meghatározása.

  • Tervezés, modellezés: specifikáció.

  • Kivitelezés: programozás, folyamatos dokumentálás.

  • Ellenőrzés, tesztelés, szükség szerinti módosítás.

  • Installáció, átadás: felhasználó kézikönyv elkészítése.

Szoftverek osztályozása kereskedelmi szempontból

Vásárolt szoftver

Valamilyen adathordozón példányonként, többnyire egyedi vagy személyes felhasználásra megvett szoftver.

Szoftvercsomag

Több felhasználót foglalkoztató vállalatok, intézmények számára kedvező áron beszerezhető programok összessége. Az ár rendszerint függ a felhasználók számától, illetve összetételétől. (Például a különböző szoftvergyártó cégek az oktatási intézmények számára rendszeresen állítanak össze kedvezményes árú programcsomagokat.)

Shareware szoftver

Egy adott időintervallumban ingyenesen kipróbálható szoftver. A meghatározott idő letelte után a felhasználó vagy megvásárolja a programot, vagy nem tudja tovább használni.

Freeware szoftver

Többnyire az internetről ingyenesen letölthető szoftver, amelyet nincs jogunk kereskedelmi céllal tovább adni, más szoftverbe beépíteni vagy módosítani, licence megjelölés nélkül.

Public-domain szoftver

Teljesen ingyenes, szabadon másolható és felhasználható szoftverek. Általában a fejlesztésének korai fázisaiban minden szoftver ilyen, hiszen a kezdeti verziókat érdemes ingyenesen hozzáférhetővé tenni. Egy szoftver public domain volta nem jár együtt a forráskódjának nyilvánossá tételével, és a szerzők bármikor úgy dönthetnek, hogy egy adott verziótól kezdve a szoftver már ne legyen ingyenes.

8. fejezet - Az operációs rendszer

Kezdetben a számítógépek megépítése, a hardverelemek működésének biztosítása volt az elsődleges cél. Miután a számítógépek biztonságosan működtek, egyre nagyobb volt az igény a hatékonyság növelésére. Olyan, egymással jól együttműködő programokat (rendszerszoftver) fejlesztettek ki, amelyek felügyelik az egyes hardveregységeket, összehangolják működésüket, biztosítják a számítógép erőforrásainak hatékony kihasználását, és segítik a programok végrehajtását. Ezeket operációs rendszereknek nevezték.

Az operációs rendszer feladata, hogy felhasználóbarát módon elégítse ki a felhasználó és a számítógép közötti kapcsolatot, lássa el a felhasználói programok kezelését, futtatását, vezérlését, illetve gondoskodjon a számítógép erőforrásainak a különböző programok közötti hatékony elosztásáról.

Az operációs rendszerek sok tekintetben különbözhetnek egymástól, és számos szempont szerint csoportosíthatók. Egy általánosan elfogadott osztályozás különbséget tesz gyártóspecifikus és nyílt operációs rendszerek között. Kezdetben egy adott számítógépcsaládra hoztak létre speciális operációs rendszereket, ma már a különböző hardverekre telepíthető operációs rendszerek a jellemzőek.

Az osztályozás további lehetséges szempontjai lehetnek:

  • a hardver mérete (nagy-, kis- és mikrogépes);

  • a felhasználók száma (egy- vagy többfelhasználós);

  • a multiprogramozás foka (egy- vagy többprogramozható);

  • az elérés módja (kötegelt, interaktív és valós idejű);

  • a rendszer struktúrája (centralizált, elosztott vagy hálózati);

  • a kommunikáció módja (utasításvezérelt, menüvezérelt, grafikus).

A számítógépes rendszer hatékonyságának biztosítására az operációs rendszerek különböző technikákat alkalmaznak.

A megszakítás (interrupt) kezelése

A megszakítások a számítógép munkájának összehangolásában játszanak fontos szerepet. A megszakítási rendszer a folyamatok közben keletkező események feldolgozására szolgál. Ezen események lehetnek szinkron jellegűek, melyek keletkezése egy program futása közben meghatározható helyen és időpontban várható (például túlcsordulás), aszinkron események, melyek várhatóak, de időpontjuk előre nem ismert (például adatbeolvasás), valamint váratlan aszinkron események, amelyek keletkezése nem várható (ilyen lehet egy hardverhiba). A megszakítási kérelem jelzi a processzornak valamely esemény bekövetkeztét, amely egy kiszolgáló folyamatot indít el egy későbbi időpontban (megszakítás időpontja). A megszakítás tulajdonképpen a futó folyamat felfüggesztése annak kiszolgálása céljából.

Különbséget kell tenni a külső eredetű megszakítások (interrupt) és az utasítások végrehajtását megállító kivételek (exception) között. Míg az elsőnél a processzor a végrehajtás alatt levő utasítást befejezve kiszolgálja a megszakítást, majd folytatja a feldolgozást a következő utasítással, addig kivétel esetén a kiváltó esemény kiszolgálása után a processzor megkísérli a megszakított utasítást újra végrehajtani.

Megszakítások kiszolgálásánál a rendszernek meg kell állapítania a keletkezés helyét, szabályoznia a megszakítási lehetőségeket (egyes utasítások megszakításkérelmi lehetőségének maszkolása). Szükség van a prioritás szabályozására több, egy időben bekövetkező kérelem kiszolgálási sorrendjének meghatározására, valamint a kiszolgáló folyamat közben beérkező kérelmek kezelése is.

A kérelem keletkezési helyének megállapítása történhet szoftver, illetve hardver segítségével is. A szoftveres módszert lekérdezési eljárásnak nevezik. Egy program, ami általában az operációs rendszer része, meghatározott időközönként megvizsgálja az eszközök megszakítási kérelemre vonatkozó állapotjelzőjét, és ahol megszakítási igényt detektál, elindítja a kiszolgáló rutint. Ezt a módszert csak egyszerűbb esetekben alkalmazzák.

A hardveres módszer esetén egy megszakításvezérlő áramkör szabályozza a megszakítások kiszolgálását. A kérelem elfogadását visszaigazolás követi. Egy megszakítási vonal esetén a hely meghatározása úgy történik, hogy a visszaigazoló jel a kiszolgálást kérő eszköztől már nem halad tovább, és ez elindítja a kiszolgáló rutint. Több megszakítási vonal esetén pedig a kérelem helye egyértelműen megállapítható (minden eszköznek saját vezetéke van). A legáltalánosabb hardveres módszer a vektoros, ahol a kérelmező eszköz a kiszolgáló rutin címét határozza meg a vezérlő és a processzor számára.

Lehetőségek:

  • az eszköz a kiszolgáló rutint elindító hívó utasítást átadja a processzornak;

  • az eszköz a kiszolgáló rutint elindító hívó utasítás tárolóhelybeli címét adja át a processzornak;

  • az eszköz a kiszolgáló rutinnak a kezdőcímét adja át a processzornak;

  • a leggyakrabban alkalmazott módszer, amikor az eszköz az őt kiszolgáló rutin sorszámát adja át, amely alapján a processzor a megszakítási vektortáblából kikeresi a kiszolgáló rutin kezdőcímét. (Ennek létezik egy úgynevezett autóvektoros változata, ahol a vektortáblázatot a processzor a belső táblázatában tárolja.)

A kiszolgálási eljárást a processzor indítja el, amely az alábbi lépésekből áll:

  • Az eszközvezérlő megszakítást kér a processzortól.

  • Az aktuális gépi ciklus befejezésekor a processzor nyugtázza a kérést.

  • A nyugtázás után az eszközvezérlő kiadja a saját megszakítási vektorát.

  • A processzor fogadja azt és elmenti.

  • A processzor elmenti a programszámlálót és a legfontosabb regisztereket a verembe.

  • A processzor megkeresi a megszakítási vektorhoz tartozó kiszolgáló rutint.

  • A processzor lefuttatja a megszakítási rutint, melynek megszakítását csak magasabb prioritású esemény számára engedélyezi.

  • A megszakítási rutin végrehajtása után a processzor visszaállítja a használt regisztereket és végrehajtja a „visszatérés a megszakításból” utasítást.

  • A processzor visszaolvassa a veremből a mentett regisztereket a programszámlálóval együtt, és a program a megszakítást megelőző állapotba kerül.

A megszakítási kérelmeket általában prioritási elv felhasználásával szolgálják ki. Többszintű megszakítási rendszerek esetében a kiszolgáló rutin is megszakítható. Ekkor a kiszolgáló rutin:

  • a vele egyező vagy nála alacsonyabb prioritású kérelmeket letiltja;

  • ideiglenesen alacsonyabb prioritású szintre lép;

  • a kiszolgálás idejére új prioritási szinteket rendel az egyes eszközökhöz.

Spooling technika

A spooling technika a lassú perifériák (például nyomtatók) esetén úgy küszöböli ki a központi egység tétlenségét, hogy a kivitel először egy gyorsabb háttértárra történik viszonylag rövid idő alatt, és maga a nyomtatás más feladatokkal párhuzamosan, a központi egység "hulladék idejében" hajtódik végre. (A SPOOL egy betűszó, amely az IBM-től ered: a "Simultaneous Peripheral Operation On-Line" rövidítése.)

Perifériák ütemezése

A perifériák hatékony kihasználására a dedikált hozzárendelés valósítható meg, ami azt jelenti, hogy a perifériát viszonylag hosszabb időre adott programhoz rendeli az operációs rendszer.

Tárkezelési problémák

Több felhasználót kiszolgáló, illetve több feladatot egyidejűleg kezelő rendszerek esetén természetesnek tűnik, hogy a futtatandó programoknak áthelyezhetőknek kell lenniük. Ezt a logikai és a fizikai címtartományok bevezetésével lehet megoldani. A kulcskérdés a kettő közötti leképezés.

Megoldható a multiprogramozás úgy is, hogy egyidejűleg csak egy feladatot tartunk a tárban, ami így az operációs rendszer által szabadon hagyott teljes területet uralhatja. Az ilyen esetben használt technikát swapping-nak (cserebere) nevezik. A swapping lényege, hogy feladatváltáskor a felfüggesztett feladathoz tartozó teljes tárterületet a háttértárra másolják, és onnan behozzák a következő feladatot.

Amikor a swapping-nál bevezették a több puffer használatát, eljutottak a többpartíciós multiprogramozáshoz. A tárat több, különböző méretű, egybefüggő részre (partíciókra) osztották, melyek mindegyikében egy végrehajtásra váró feladat foglalt helyet. Attól függően, hogy a felosztás rögzített vagy változtatható, beszélünk fix vagy változó particionálásról. Bármilyen ügyes algoritmusokat is dolgoztak ki a particionált tár kezelésére, a tár elaprózódása ellen nem lehetett hatásosan védekezni. Egy bizonyos idő elmúltával, a tárban sok, össze nem függő, apró terület alakult ki, melyeket bár együttes méretük számottevő volt, mégsem lehetett hasznosítani.

A megoldást a virtuális tárkezelés megvalósításával bevezetett lapkezelés jelentette. A tárat azonos méretű lapokra osztják. Minden feladathoz annyi -- nem szükségképpen folytonos fizikai címeken elhelyezkedő -- lapot rendelünk, amennyit igényel. A lapkezelő alrendszer fő feladata a felhasználó logikai tárigényét leképezni a fizikai lapokra.

A lapkezelés általánosítása a szegmentálás, ami tulajdonképpen változó méretű lapokkal folytatott gazdálkodást jelent. Bevezetésének másik oka az, hogy a lapozás néha az algoritmusokat kellemetlen ponton vágja ketté, így a programrésznek állandóan két lap között kell ugrálnia. Egy új szegmens használatával biztosítható, hogy a kritikus rutin egy lapra kerüljön.

Processzor időbeosztás

A processzor ütemezése a számítógép legfontosabb erőforrásával való gazdálkodást jelent. Az alapelv az időszeletelés (time slicing), ami a következőt jelenti:

  • a processzor idejét azonos hosszúságú időszeletekre bontják;

  • egy időszelet alatt egy programon dolgozik a processzor;

  • az időszelet lejártát követően az operációs rendszer dönti el, hogy melyik programhoz rendelje a processzort.

Az egyes megvalósítások abban különböznek, hogy milyen elv szerint történik a processzor hozzárendelése a következő programhoz. Néhány ezek közül:

  • egyenlő részesedés (equal share): minden program sorra megkapja az időszeletet;

  • processzoridő-igény szerinti prioritás: a kevesebb processzoridőt igénylő kapja a nagyobb prioritást (shortest job first), vagy a sok processzoridőt igénylő kapja meg gyakrabban a processzort (longest job first);

  • perifériaigény szerinti prioritások: I/O igényes vagy CPU igényes feladatok;

  • fizetett, illetve irányított prioritások (felhasználói account alapján).

Személyi számítógépek operációs rendszerei

A személyi számítógépek operációs rendszerei a nagyszámítógépekétől elvárt funkciókkal és képességekkel rendelkeznek, sőt bizonyos értelemben a felhasználói felületek és a felhasználóbarát alkalmazói szoftverek vonatkozásában túl is mutatnak a mainframe-es rendszereken. A fejlődés iránya a klasszikus operációs rendszerek hagyományos szemléletétől egyre inkább a felhasználóbarát felületek biztosítása irányába tart, és így az operációs rendszer magja, működése valójában a felhasználó előtt ma már szinte teljesen rejtve marad.

Parancsvezérelt (DOS alapú) operációs rendszerek

A Seattle Computer Products 1979-ben fejlesztette ki az MS-DOS-t, majd a Microsoft megvásárolta a szoftver terjesztésének és továbbfejlesztésének jogát. Az IBM 1981-ben jelent meg a PC-DOS operációs rendszerrel, amely az MS-DOS egy változata. Később a Microsoft kapta meg a jogot, hogy a különböző gyártók által készített személyi számítógépek MS-DOS operációs rendszerének hivatalos szállítója legyen.

Az MS-DOS operációs rendszer egyfelhasználós, egyfeladatos üzemmódú szoftver. Az operációs rendszer programjait két csoportba sorolhatjuk: az egyik a rezidens programok, amelynek rutinjai állandóan az operatív memóriában vannak; a másik csoportba azok a rendszerprogramok tartoznak, amelyek igény szerint töltődnek be a memóriába.

Grafikus felületű operációs rendszerek

A grafikus felhasználói felületek kifejlesztésére először a 80-as évek elején az első lépéseket az Apple tette meg, és szállította a számítógépeit ilyen operációs rendszerrel. Az Apple után a Microsoft is hamarosan nyilvánosságra hozta a Windows-nak nevezett grafikus felület-szoftvert. Az első verzióknak nem volt túl nagy sikere, de az 1992-ben bejelentett 3.1-es verzió üzembiztosabb és gyorsabb működésével jobban megnyerte a felhasználók tetszését. Szigorúan véve a Windows 3.1 valójában nem egy önálló operációs rendszer, hanem egy olyan – DOS-ra épülő – grafikus felület, amely megkönnyíti a rendszer és az alkalmazások használatát. Az IBM-mel közös OS/2-ből kiindulva 1992-ben a Microsoft egy új, saját fejlesztésű operációs rendszert Windows NT néven hozott forgalomba.

A rendszerek számtalan lehetőséget kínálnak, amelyekkel a felhasználó a számítógéppel interaktív módon, egyszerűen, könnyen kezelhetően végezheti munkáját. Az ablaktechnika lehetővé teszi, hogy az egyes funkciókra vonatkozó lehetőségeket láthassuk, egyidejűleg akár többet is. Menü funkciókat kínál fel kis szöveges ablakokban vagy gombokkal. A valós világot szimbolizáló objektumok, ikonok egyszerűsítik a kezelést, a képecskék (nyitott könyv, grafikon szimbólum, stb.) a végzendő funkcióra utalva. Ha pedig a felhasználó elakad, akkor súgók (helpek) állnak rendelkezésre és segítenek a probléma megoldásában, a hiba elhárításában.

A Microsoft a Windows 3.1 grafikus felület, valamint a Windows NT sikeréből kiindulva azt a célt tűzték ki, hogy olyan átfogó operációs rendszert fejlesztenek ki, amely egyszerűbbé teszi a személyi számítógépek használatát, segíti a hálózatok elérését és biztosítja a kompatibilitást a korábbi operációs rendszerekkel. Így születtek meg a Windows különböző verziói (Windows 95, 98, 2000, XP, 7, 8, Vista).

UNIX rendszerek

A számítógépek operációs rendszerei között az egyik legjelentősebb, központi szerepet betöltő operációs rendszer a UNIX. Kedvelt, sok változatban ingyenes változata a Linux. A UNIX-ot eredetileg nagyszámítógépes, hálózatos környezetre szánták, de manapság rohamosan terjed a személyi számítógépek világában is. Fő előnye a hatékony hardverkihasználás biztosítása és a különböző hardverkomponensek egységes rendszerbe illesztésének lehetősége. A UNIX volt az első olyan operációs rendszer, amelynek fejlesztése során figyelembe vették a nyílt rendszerek felépítésének alapelveit. A UNIX belső felépítésére jellemző a rétegszerkezet. Az alapfunkciókat az operációs rendszer állandóan futó magja, a kernel valósítja meg. A felhasználói interfészt a független shell biztosítja. Több párhuzamosan fejlesztett shell létezik, közös jellemzőjük a hatékony felhasználói környezet megteremtése. Multiprogramozott operációs rendszer, amely támogatja az alkalmazások párhuzamos futását is.

Személyi számítógépekre fejlesztett első UNIX-szerű operációs rendszert a MINIX volt, amit egy holland professzor, Andrew S. Tanenbaum (1944 -) fejlesztett.

A Linux fejlesztését a finn Linus Torvalds kezdte 1991-ben, aki akkor másodéves hallgató volt a Helsinki Egyetemen. A 80386 processzor védett módú (protected mode), feladat-váltó (task-switching) lehetőségeivel szeretett volna megismerkedni, és ehhez kezdett programot (rendszermagot, más néven kernelt) írni MINIX alatt, eleinte assembly-ben, majd C-ben. Az internet révén később többen bekapcsolódtak a Linux fejlesztésébe, ami a kilencvenes évek végére egyértelműen bebizonyította a létjogosultságát szabad szoftverek kategóriájában. A képen a Linux emblémája látható:

Nagyon sok Linux disztribúció létezik, köztük több magyar fejlesztésű. Néhány az ismertebbek közül: Debian, Red Hat, SuSe.

9. fejezet - Algoritmusok

Az algoritmus szó Abu Abdalláh Muhammad ibn Musa al-Khwarizmi taskenti bölcs (780?-850?) latin nyelvre lefordított, Algoritmi de numerus indorum (magyarul: al-Khwarizmi az indusok számjegyeiről) könyvének címében szereplő algoritmi szóból (Khwarizm városából való), nevének elferdítéséből ered.

A modern algoritmuselmélet atyjának Alan Mathison Turing (1912-1954) angol matematikust tekintjük, aki az 1930-as években alkotta meg és tette közzé az algoritmus matematikailag pontos fogalmát. Elkészített egy absztrakt (elméleti) gépet, a Turing-gépet, aminek segítségével algoritmuselméleti problémák szimbolikusan kezelhetők, ebben a témakörben tételek mondhatók ki és bizonyíthatók.

Az algoritmus fogalom meghatározására sok „konyhanyelvi” leírás található a különböző szótárakban, lexikonokban, irodalmakban:

  • Az algoritmus legáltalánosabb értelemben nem más, mint tervszerűség. Ha egy elvégzendő cselekvéssorozatot lépésről lépésre előre átgondolunk, megtervezünk, úgy is mondhatjuk, hogy algoritmust adunk egy adott cél elérésére.

  • Az algoritmus egy olyan előírás, amely alapján egy adott feladat véges számú lépésben megoldható.

  • Véges számú, egymást meghatározott sorrendben követő lépésekkel a probléma megoldásához vezető módszer, eljárás.

  • Műveletek tartalmát és sorrendjét meghatározó egyértelmű utasításrendszer, amely a megfelelő kiinduló adatokból a kívánt eredményre vezet.

  • Egy adott feladat megoldásán azt a műveletsorozatot értjük, amellyel a kiindulási adatokból véges számú lépésben eljutunk a keresett eredményadatokhoz.

Minden meghatározásból leszűrhetők az algoritmus tulajdonságai:

  • egy értékhez vagy ezek egy halmazához (input) hozzárendel egy értéket vagy ezek egy halmazát (output)

  • egyértelmű (az algoritmust alkotó utasítások egyértelmű, meghatározott sorrendben követik egymást);

  • determinisztikus (ugyanazon kiindulási adatokra tetszőleges számú végrehajtás esetén ugyanazt az eredményt szolgáltatja);

  • véges (véges számú lépés után befejeződik, és eredményre vezet);

  • redundáns lépéseket (ismétlődéseket, felesleges utasításokat) nem tartalmaz;

  • teljes (nemcsak egy konkrét esetre alkalmazható, hanem az összes azonos jellegű feladatra).

Egy algoritmus elemi (azonnal végrehajtható) és összetett (elemi tevékenységekből felépülő) műveletek sorozata. Például a rendező algoritmus, lásd később. Az algoritmus struktúráját szekvenciák, szelekciók, illetve iterációk adják, amelyek tetszőleges mélységben egymásba skatulyázhatók.

A szekvencia egymás után végrehajtandó elemi tevékenységek sorozata. Lehet, hogy a megoldás bizonyos pontokon nem látható előre, és feltételektől függően más és más utat kell választanunk (szelektálunk). A szelekció esetén egy feltétel igaz vagy hamis voltától függ, hogy bizonyos utasítások végrehajtódnak-e vagy sem. Előfordulhat, hogy a megoldás érdekében valamely tevékenységet többször is végre kell hajtani, vagy ismételni (iterálni) kell. Az iteráció lehetővé teszi meghatározott utasítások tetszőleges számú ismételt végrehajtását. Lehet, hogy az iterációk számát előre tudjuk, lehet, hogy az ismételt végrehajtásnak feltétele van.

Az algoritmusok tervezésére, szemléltetésére, megadására, áttekinthető formában történő leírására sokféle eszköz létezik. A leggyakrabban használt a folyamatábra, amelynek alapelveit Neumann és Goldstine a programozás kapcsán dolgozta ki. (A folyamatábra szabványban meghatározott szimbólumok rendezett sorozata, amelyben az egyes elemek a probléma meghatározásának, elemzésének vagy megoldásának a résztevékenységeit - lépéseit - jelentik.) Az egyes szerkezeti elemek között nyilakkal jelöljük a végrehajtási irányt, sorrendet. A folyamatábra alapalakzatai:

Az algoritmus kezdetét és végét jelölik.

Feltétel nélkül végrehajtható utasítást jelöl. Feltételes utasítás jelöl.

Input/output műveletet jelöl. A folyamatábra megszakítását és folytatását jelölik.

Egy másik eszköz a pszeudokód (leíró nyelv – „álnyelv”, „mondatszerű leírás”), melynek segítségével megfogalmazott algoritmus könnyen átírható általános célú programozási nyelvre. A beszélt nyelvhez hasonló, de annál tömörebb strukturált leírási mód. Annyiban tér el a folyamatos írástól, hogy bizonyos szabályokat be kell tartanunk, a struktúrák képzésére megállapodás szerinti formákat és szavakat használunk.

Példák

Beolvasás és kiíratás:

read (input file) változók listája;

write (output file) kifejezések listája.

Szekvencia:

utasítás_1;

utasítás_2;

. . .

utasítás_n.

Szelekció:

if [ha] feltétel then [akkor]

utasítás[ok]

endif [elágazás vége]

if feltétel then

utasítás[ok]1

else [egyébként]

utasítás[ok]2

endif [elágazás vége].

Iteráció (hátul tesztelős, elől tesztelős, előírt lépésszámú):

repeat [ismétlés]

utasítás[ok]

until [amíg] feltétel.

while [amíg] feltétel do [végezd]

utasítás[ok]

endwhile [vége ismétlés].

for [minden] i:=1, n do [végezd]

utasítás[ok]

endfor [vége ismétlés].

Az Algoritmusok című referencia mű behúzást alkalmazva jelzi, hogy mely utasítások képezik a szelekció, illetve az iterációk utasításmagvait. Amint fentebb láthattuk, a jobb áttekinthetőség kedvéért (főleg, ha a kód átnyúlik a következő oldalra is), mi le is zárjuk a szelekciókat és az iterációkat. Hasonló módon járunk el az eljárások (procedure) és függvények (function) esetében is.

További jellegzetességei az általunk használt pszeudokódnak:

Értékadás: változó: = kifejezés (a változó felveszi a kifejezés értékét).

Aritmetikai operátorok: +, -, *, /, DIV (egész osztás), MOD (osztási maradék), [ ] (egész rész), √ (négyzetgyökvonás).

Összehasonlítási operátorok: =, ≠, <, <=, >, >=.

Logikai operátorok: AND (logikai ÉS), OR (logikai VAGY), NOT (logikai NEM).

Tömbök:

a[1..n] (n elemű tömb 1-től n-ig indexelve);

a[i] (az a töm i-edik eleme).

A harmadik eszköz a struktogram (NSD, Nassi-Shneiderman diagram), amelyet Ike Nassi és Ben Shneiderman vezetett be a hetvenes évek elején, a strukturált programozás algoritmusleíró eszköze. Az egyes szerkezeti elemeket téglalapba foglalható ábrákkal jelöljük. A szerkezetek egymásba ágyazhatók, de vonalaik nem keresztezhetik egymást. Az ábrát felülről lefelé haladva kell olvasni.

Példák

Szekvencia:

Szelekció:

Iteráció (repeat-until):

Elemi algoritmusok

Programozás során gyakran oldunk meg olyan feladatokat, amelyekben előfordulnak több programban is alkalmazható utasításcsoportok. Az alábbiakban ilyen elemi algoritmusok pszeudokódját adjuk meg.

Példák

  1. Két változó tartalmának kicserélése

    • harmadik változó segítségével:

      c := a;

      a := b;

      b := c.

    • harmadik változó nélkül:

      a := a + b;

      b := a – b;

      a := a – b.

  2. Adott egy osztályzat az 1...5 intervallumból. Határozzuk meg a megfelelő szöveges minősítést.

    read jegy;
    if jegy = 1 then write “elégtelen” else
    	if jegy = 2 then write “elégséges” else
    	if jegy = 3 then write “közepes” else
    			if jegy = 4 then write “jó” else
    				write “jeles”
    			endif
    		endif
    	endif
    endif
    
    
  3. Adott egy n elemű számsorozat. Számítsuk ki a számsorozat elemeinek összegét.

    összeg := 0;
    read n;
    for i := 1 to n do
    	read szám;
    	összeg := összeg + szám;
    endfor
    write összeg.
  4. Adott egy természetes szám. Határozzuk meg a szám számjegyeinek szorzatát.

    szorzat := 1;
    read szám;
    while szám > 0 do
    	szorzat := szorzat * (szám MOD 10);
    	szám := szám DIV 10;
    endwhile
    write szorzat.
  5. Természetes számokat olvassunk be nulla végjelig. Számítsuk ki a számsorozat páros elemeinek átlagát.

    számláló := 0;
    összeg := 0;
    read szám;
    while szám ≠ 0 do
    	if szám MOD 2 = 0 then
    		összeg := összeg + szám;
    		számláló := számláló + 1;
    	endif
    	read szám;
    endwhile
    if számláló > 0 then
    	write összeg/számláló;
    else
    	write "Nincs páros szám";
    endif.
    
  6. Adott az n érték, illetve egy n elemű számsorozat. Határozzuk meg a számsorozat maximumának értékét.

    read n;
    read szám;
    max := szám;
    for i := 2 to n do
    	read szám;
    	if szám > max then
    		max := szám;
    	endif
    endfor
    write max.
    
  7. Adott két nullától különböző természetes szám. Határozzuk meg a legnagyobb közös osztójukat.

    read szám1, szám2;
    while szám1 ≠ szám2 do
    	if szám1 > szám2 then
    		szám1 := szám1 – szám2
    	else
    		szám2 := szám2 – szám1;
    	endif
    endwhile
    write szám1.
    
  8. Adott két nullától különböző természetes szám. Határozzuk meg a legkisebb közös többszörösüket.

    read szám1, szám2;
    összeg1 := szám1;
    összeg2 := szám2;
    while összeg1 ≠ összeg2 do
    	if összeg1 < összeg2 then
    		összeg1 := összeg1 + szám1;
    	else
    		összeg2 := összeg2 + szám2;
    	endif
    endwhile
    write összeg1.
    
  9. Adott az n érték, illetve egy n elemű számsorozat. Számoljuk meg a számsorozat prím-értékeit.

    Megjegyzés: A 0 és 1 számok nem prímek. Egy 1-nél nagyobb szám akkor prím, ha nincs 2 és a gyöke közt egyetlen osztója sem.

    számláló := 0;
    read n;
    for i:=1 to n do
    	read szám;
    	if szám = 0 then prím := 0;
    	else if szám = 1 then prím := 0;
    		else
    		prím := 1; j := 2;
    		while (j ≤ [√szám]) AND (prím = 1) do
    			if szám MOD j = 0 then
    				prím := 0;
    			endif
    			j := j + 1;
    		endwhile
    	endif
    	endif
    	if prím = 1 then számláló = számláló + 1;
    	endif
    endfor
    write számláló.
    

Feladatok

  1. Készítse el a fenti algoritmusok folyamatábráját.

  2. Készítsen algoritmust sorba kötött ellenállások értékeinek (ri, i = 1 ,2, …) file-ból való nulla végjelig történő beolvasására, majd az eredő ellenállás (R) kiíratására.

    Megjegyzés: R = ∑ri.

  3. Készítsen algoritmust sorba kötött kondenzátorok kapacitásának (ci, i = 1, 2, …) file-ból való nulla végjelig történő beolvasására, majd az eredő kapacitás-érték (C) kiíratására.

    Megjegyzés: 1/C = ∑1/ci.

  4. Legyártunk n darab, P paraméter értékű „identikus” tranzisztort. Készítsen algoritmust, amely file-ból beolvassa az n és P értékeket, valamint a tranzisztorok valós (mért) értékeit (pii, i = 1, 2, …, n), és meghatározza, hogy hány százalékuk selejt.

    Megjegyzés: Az a tranzisztor selejt, amelynek a valós (mért) értéke a P elvárt értékéhez képest az 5%-os tűréshatáron kívül esik.

  5. Mit ír ki az alábbi algoritmus, ha n értékeként 10-et olvasunk be?7

    read n;
    k := 0;
    i := 1;
    while (k < n) do
    	j := 1;
    	while (k < n) AND (j ≤ i) do
    		write j;
    		j := j + 1;
    		k:= k + 1;
    	endwhile
    	i := i + 1;
    endwhile.
    
    
  6. Mekkora összeggé gyarapodik h hónap alatt egy T kezdőtőke, ha minden következő hónapban hozzáadódik az előző havi összeg k kamatlábnyi százaléka?

    Megjegyzés: Mivel éves kamatlábat szokás megadni, ezért a havi kamatláb k/12.

  7. Adott egy kör a síkban középpontjának koordinátáival és sugarával. Számoljuk meg, hogy hány darab egész koordinátákkal jellemezhető koordinátapont esik a körön belülre.

  8. Számítsuk ki és másodpercenkénti bontásban táblázatosan adjuk meg a v0 kezdősebességű, a gyorsulással egyenletesen gyorsuló mozgást végző test által t idő alatt megtett utat.

    Megjegyzés: A v0, az a és a t bemenő adatok.

  9. Olvassuk be egy sakkfigura (vezér, király, bástya, futó, huszár, gyalog) aktuális koordinátáit a sakktáblán. Írassuk ki a sakkfigura által támadható mezők koordinátáit.

Nevezetes algoritmusok

Gyakori programozási feladat egy tömb elemeinek bizonyos szempont(ok) szerinti rendezése (esetleg eleve rendezett tömb létrehozása), illetve bizonyos feltétel(ek)nek eleget tevő tömbelem keresése, kiválasztása. Az alábbiakban néhány ilyen alapalgoritmust ismertetünk.

Kereső algoritmusok

Keresést rendezetlen és rendezett tömbökön egyaránt végezhetünk. Rendezetlen tömb esetén a keresés nehézkesebb, lassúbb, de az egyéb tömbkezelő műveletek (pl. új elem beszúrása) egyszerűbbek. Rendezett tömb esetén gyorsabb a keresés, viszont a kapcsolódó tömbműveletek bonyolultabbak, hiszen pl. egy új elem beszúrása után is meg kell tartani a tömb rendezettségét.

Lineáris keresés

A legegyszerűbb keresési algoritmus, amely rendezetlen tömbön dolgozik. A tömb első elemétől kezdve összehasonlítjuk a tömbelemeket a keresendő elemmel. A keresési ciklus akkor ér véget, ha valamelyik tömbelem megegyezik a keresettel, vagy, ha a tömb végére érünk. Az utóbbi esetben a keresett elem nincs a tömbben. Az algoritmus onnan kapta nevét, hogy a keresések száma, és így a futási idő, lineáris függvénye a tömb elemszámának.

Megjegyzés: A n jelöli a számsorozat elemeinek számát, az a[1..n] tömb tárolja a számsorozat elemeit, x a keresett érték. Eredményként a keresett elem tömbbeli indexét írassuk ki, amennyiben az elem megtalálható.

i := 1;
while (i ≤ n) AND (a[i] ≠ x) do
     i := i + 1;
endwhile
if i ≤ n then write i
else write “A keresett szám nem található meg a számsorozatban.”
endif.

Logaritmikus (bináris) keresés

A logaritmikus vagy bináris keresési algoritmus rendezett tömbön működik, így az előző módszernél lényegesen gyorsabb keresést tesz lehetővé. A keresendő elemet először a tömb középső eleméhez hasonlítjuk. Ha a két elem egyezik, megtaláltuk a tömbelemet, ha nem, a keresést abban a tömbfélben folytatjuk, amelyet a középső és a keresett elem viszonya kijelöl. Ha a tömb növekvő sorrendbe rendezett és a keresendő elem nagyobb, mint a középső elem, akkor a második tömbrészben, egyébként pedig az elsőben folytatjuk a keresést. A keresést akkor fejezzük be, ha megtaláltuk a keresett tömbelemet, vagy a tömbrész elfogyott. Az összehasonlítások száma, s így a futási idő, az elemszám kettesalapú logaritmusával arányos, ami nagy elemszámok esetén lényegesen kisebb lehet, mint a lineáris keresés esetén.

Megjegyzés: A n jelöli a számsorozat elemeinek számát, az a[1..n] tömb tárolja a számsorozat elemeit, x a keresett érték. Eredményként a keresett elem tömbbeli indexét írassuk ki, amennyiben az elem megtalálható.

eleje := 1;
vége := n;
repeat
   közepe := (eleje + vége) / 2;
   if x < a[közepe] then vége := közepe – 1
      else if x > a[közepe] then eleje := közepe + 1
           endif
   endif
until (x = a[közepe]) OR (eleje > vége);
if x = a[közepe] then write közepe
else write “A keresett szám nem található meg a számsorozatban.”
endif.

Rendező algoritmusok

Beszúrás

Van egy n elemű rendezett tömbünk. Be akarunk szúrni egy n+1-edik elemet a rendezettség megtartásával. Egyik lehetőség, hogy végigszaladunk a halmazon, és betesszük a beszúrandó elemet az elé az elem elé, ami már nem előzi meg. Átlagosan (n+1)/2, de a legrosszabb esetben n összehasonlításra van szükség. Másik lehetőség, hogy a kérdéses elemet a középső elemmel hasonlítjuk össze. Ha az új elem megelőzi a középsőt, akkor a továbbiakban a halmaz első felében keressük a helyét, stb. A lépésszám log2n, vagy az erre következő első egész szám, azaz [log2n]+1, ha n nem 2 hatványa.

Megjegyzés: A n jelöli a számsorozat elemeinek számát, az a[1..n] tömb tárolja a számsorozat elemeit, x a beszúrandó érték. A kereséséhez a logaritmikus algoritmust használjuk.

eleje := 1;
vége := n;
repeat
   közepe := (eleje + vége) / 2;
   if x < a[közepe] then vége := közepe – 1
      else if x > a[közepe] then eleje := közepe + 1
           endif
   endif
until (x = a[közepe]) OR (eleje > vége);
if x ≤ a[közepe] then helye := közepe;
else helye := közepe + 1;
endif
for i := n downto helye do
   a[i+1] := a[i];
endfor
a[helye] := x.

Beszúrásos rendezés

A rendezés során sorrendbeli hibát keresünk egy tömbben. Ennek során használhatunk lineáris, illetve bináris keresést. A kialakult sorrendtől eltérő helyen levő elemet kiemeljük, majd megkeressük a sorrendnek megfelelő helyét. Amikor a helyét megtaláltuk, akkor a közbeeső elemeket eltoljuk, majd az imént kiemelt elemet a felszabaduló helyre beszúrjuk. Ez a rendezés túl sok mozgatást igényel.

Megjegyzés: A n jelöli a számsorozat hosszát, az a[1..n] tömb tárolja a számsorozat elemeit.

for i := 2 to n do
   x := a[i];
   eleje := 1; 
   vége := i - 1;
   repeat
      közepe := (eleje + vége) / 2;
      if x < a[közepe] then vége := közepe – 1
         else if x > a[közepe] then eleje := közepe + 1
              endif
      endif
   until (x = a[közepe]) OR (eleje > vége);
   if x ≤ a[közepe] then helye := közepe;
   else helye := közepe + 1;
   endif
   for j := i-1, helye downto
      a[j+1] := a[j];
   endfor
   a[helye] := x;
endfor.

Shell rendezés

A beszúrásos módszer lépésenként finomított változata. A tömbnek csak minden d-edik elemét vizsgáljuk, azaz d lépésközzel végezzük el a beszúrásos rendezést. Ha a rendezettség nem alakul ki, akkor csökkentjük a lépésközt, és úgy végezzük el a rendezést. A folyamat addig tart, amíg a rendezettség ki nem alakul, vagy a lépésköz 1 nem lesz.

Megjegyzés: A n jelöli a számsorozat hosszát, az a[1..n] tömb tárolja a számsorozat elemeit. A belső while ciklus lineáris beszúrást alkalmaz.

d := n / 2;
while d ≥ 1 do
   for j := d + 1 to n do
      i := j – d;
      while (i ≥ 1) AND (a[i+d] < a[i]) do
         c := a[i];
         a[i] := a[i+d];
         a[i+d] := c;
         i := i – d;
      endwhile
   endfor
   d := d / 2;
endwhile.

Rendezés közvetlen kiválasztással és cserével (minimum [maximum] elven alapuló rendezés)

Egy adott résztömbben (kezdetben a teljes tömb) megkeressük a legkisebb (legnagyobb) elemet, és ezt tesszük az első helyre. A következő lépésben a második elemtől kezdve vizsgáljuk és ismét a legkisebb (legnagyobb) elemet visszük előre, és így tovább. A mindenkori legkisebb elem keresése lineáris kereséssel történik.

Megjegyzés: A n jelöli a számsorozat hosszát, az a[1..n] tömb tárolja a számsorozat elemeit.

for i := 1 to n-1 do
   min_index := i;
   for j := i+1 to n do
      if a[j] < a[min_index] then
         min_index := j;
      endif
   endfor
   c := a[i];
   a[i] := a[min_index];
   a[min_index] := c;
endfor

Buborékrendezés

Az egyik leggyakrabban használt rendező algoritmus. A rendezés a tömb elejéről és végéről is indulhat. Az a[1..n] tömböt legrosszabb esetben (n-1)-szer kell bejárni. A tömb elejéről induló esetben az első bejárásban összehasonlítjuk az a[1]-t az a[2]-vel, majd az a[2]-t az a[3]-mal, …, végül az a[n-1]-et az a[n]-nel. Általánosan az a[j]-t hasinlítjuk az a[j+1]-gyel, ahol j = 1, 2 … , n-1. Valahányszor úgy találjuk, hogy a[j] > a[j+1], felcseréljük őket. A tömb elejéről induló rendezésnél a legnagyobb elem biztosan a helyére fog kerülni. A többi elem azonban még nem feltétlenül került a végleges helyére. (A tömb végéről induló rendezésnél mindig a legkisebb elem kerül biztosan az adott rendezési ciklusban a helyére.) A következő bejárásokban hasonlóképpen járunk el, és további elemek kerülnek a helyükre, ahhoz hasonlóan, ahogy a levegőbuborékok szoktak feljönni a víz felszínére. A rendezést folytatni kell mindaddig, míg a teljes tömb rendezett nem lesz. Előfordulhat, hogy a tömb már menet közben, a rendezési ciklus vége előtt, rendezetté válik, esetleg eleve rendezett volt. Ezt onnan vehetjük észre, hogy az adott rendezési ciklusban nem történik csere. Ha megjegyezzük az utolsó csere helyét (ucs), akkor a következő bejárás csak addig megy.

u := n;
repeat
   ucs := 0;
   for j := 1 to u-1 do
      if a[j] > a[j+1] then
         c := a[j];
         a[j] := a[j+1];
         a[j+1] := c;
         ucs = j;
      endif
   endfor
   u := ucs;
until ucs=0.

Összefésülés

Van két rendezett tömbünk, a[1..n] és b[1..m]. Ezeket kell összefésülni egy c[1..n+m] tömbbe. Az i változó az a tömb, a j pedig a b tömb elemein fog lépegetni. Az a[i] és b[j] elemek közül mindig a kisebbiket tesszük a c tömbbe, majd lepünk egyet abban a tömbben, amelyből „kikerült” az az elem, amelyet a c tömbbe helyeztünk.

i := 1;
j := 1;
k := 1;
while (i ≤ n) AND (j ≤ m) do
   if a[i] ≤ b[j] then
      c[k] := a[i];
      i := i + 1;
      k := k + 1;
   else
      c[k] := b[j];
      j := j + 1;
      k := k + 1;
   endif
endwhile
while i ≤ n do
   c[k] := a[i];
   i := i + 1;
   k := k + 1;
endwhile
while j ≤ m do
   c[k] := b[j];
   j := j + 1;
   k := k + 1;
endwhile.

Összefésüléses rendezés

Az eddig ismertetett rendező algoritmusoktól eltérő, rekurzív elven működik. A c[1..n] tömb rendezése rekurzívan visszavezethető a c[1..n/2] és a c[n/2+1..n] tömbszakaszok külön-külön történő rendezésére, és az ezt követő összefésülésükre. Az általános rendez eljárást egy c[i..j] tömbszakasz rendezésére kell megírnunk. A feladat akkor triviális, ha a rendezendő tömbszakasz egyelemű (i = j).

Megjegyzés: A rendez eljárást kezdetben a teljes tömbre hívjuk meg, rendez (c[1..n]);. Az összefésül eljárás az a és b segédtömböket használja.

procedure rendez (c[i..j]);
   if i < j then
      k := (i + j) / 2;
      rendez (c[i..k]);
      rendez (c[k+1..j]);
      összefésül (c[i..j]);
   endif
endprocedure
procedure összefésül (c[i..j])
   k := (i + j) / 2;
   for p := i to k do
      a[p] := c[p];
   endfor
   for p := k+1 to j do
      b[p] := c[p];
   endfor
   a[k+1] := ∞; b[j+1] := ∞; {strázsák}
   ii := i; jj := k+1;
   for p := i to j do
      if a[ii] < b[jj] then
         c[p] := a[ii];
         ii := ii + 1;
      else
         c[p] := b[jj];
         jj = jj + 1;
      endif
   endfor
endprocedure

Szétválogatás (előrendezés)

Az a[1..n] tömb elemeit válogassuk szét „az első eleme szerint” (az első elemnél kisebb elemek előtte, a nagyobbak mögötte legyenek). Egy i, illetve egy j változót a tömb elejére, illetve végére állítunk. Kezdetben az elem, amely szerint a szétválogatás történik (továbbiakban kulcselem), nyilván az i-edik pozícióban van. Miközben i áll, jövünk előre j-vel (magunk mögött hagyva a kulcselemnél nagyobb elemeket), míg nem találunk egy a[j]-t, ami kisebb, mint az a[i]. Felcserélve egymás közt az a[i]-t és az a[j]-t, a kulcselem hátra kerül a j-edik pozícióba, a nála kisebb elem pedig előre az i-edikbe. Ekkor „váltás” történik. Miközben j áll, i-vel megyünk hátrafele (magunk mögött hagyva a kulcselemnél kisebb elemeket), míg nem találunk egy a[i]–t, ami nagyobb, mint az a[j]. Ismét felcserélve egymás közt az a[i]-t és az a[j]-t, a kulcselem visszakerül az i-edik pozícióba, a nála nagyobb elem pedig hátra a j-edikbe. Most újra j-vel jövünk előre (1. eset), majd ismét i-vel megyünk hátra (2. eset) mindaddig, amíg i és j találkozik. A kulcselem mindig az álló index irányában van, az előre lepegető j a kulcselemnél nagyobb, a hátrafele mozgó i pedig a kulcselemnél kisebb elemeket hagyja maga mögött. A kulcselem a helyét, amelyet a rendezett számsorozatban foglalna el, ott találja meg, ahol találkoznak az i es j indexek.

i := 1; j := n;
eset := 1; 
   while i < j do
      if a[i] ≤ a[j] then
         if eset = 1 then j := j – 1
         else i := i + 1
         endif
      else
         c := a[i]; a[i] := a[j]; a[j] := c;
         if eset = 1 then eset := 2
         else eset := 1
      endif
   endif 
endwhile.

Gyorsrendezés (quick-sort)

Ez az algoritmus is rekurzív elven működik. Szétválogatjuk az aktuális tömbszakasz (a[i..j]) elemeit a szakasz első eleme (az a[i] kulcselem) szerint, majd folytatjuk a rendezést a szakasz kulcselem előtti, illetve mögötti elemei rendezésével.

Megjegyzés: A rendez eljárást kezdetben a teljes tömbre hívjuk meg, a szétválogat függvény adja vissza a helyére került kulcselem pozícióját.

procedure rendez (a[i..j])
   if i < j then
      k := szétválogat (a[i..j]);
      rendez (a[i..k-1]);
      rendez (a[k+1..j]);
   endif
endprocedure

function szétválogat (a[i..j])
   ii := i;
   jj := j;
   üzemmód := 1;
   while ii < jj do
      if a[ii] ≤ a[jj] then
         if üzemmód = 1 then jj := jj – 1
         else ii := ii + 1
         endif
      else
         veder=a[ii]; a[ii]=a[jj]; a[jj]=veder;
         if üzemmód = 1 then üzemmód := 2
         else üzemmód := 1
         endif
      endif
   endwhile
   return ii;
endfunction.

A programozás alapjai

A számítógép számára a feladat meghatározását programozásnak nevezzük. A programozás valamilyen a programozási nyelv segítségével történik. A programozási nyelv a számítástechnikában használt olyan, az ember által is olvasható és értelmezhető utasítások sorozata, amivel közvetlenül, vagy közvetve (például gépi kódra fordítás után) közölhetjük a számítógéppel egy adott feladat elvégzésének módját.

A programozás egy összetett folyamat, melynek célja és eredménye a programok előállítása. A programozás lépései:

  • a megoldandó feladat megfogalmazása, definiálása;

  • a megfelelő algoritmus kiválasztása, megtervezése;

  • az algoritmus logikai szerkezetének megtervezése;

  • az algoritmus szerkezeti lebontása;

  • az algoritmus kódolása;

  • a kész program futtatása, tesztelése;

  • a dokumentáció elkészítése;

  • a program karbantartása, felügyelete, nyomon követése.

A programozási nyelveket történeti fejlődésük alapján sokféleképpen lehet osztályozni, csoportosítani. A programnyelvek változásának egy-egy fontosabb állomását a programozási nyelvek generációjának nevezzük.

A programozási nyelvek első generációja, a legalacsonyabb szintű programnyelv, a gépi (bináris) kód. A gépi kódot tulajdonképpen nem is lehet igazi programnyelvnek tekinteni, hiszen erre a klasszikus értelemben vett programnyelvi elemek (utasítások, vezérlőszerkezetek, kifejezések) nem jellemzőek.

A számítógéppel való kapcsolat megteremtésének a legközvetlenebb módja viszont a gépi nyelv használata. A gépi nyelvek a számítógépek speciális műszaki tulajdonságait használják ki. Ez az a nyelv, amelyet a processzor közvetlenül megért. A gépi kódú programok az adott számítógép típusokhoz kötődnek, azok más felépítésű számítógépen nem futtathatók. A gépi utasításkészlet bináris számokból álló egyszerű utasítások csoportja, az utasítások pedig műveleti kódból és címrészből tevődnek össze.

A gépi kódban való programozás azonban rendkívül nehézkes, hisz az egyes műveletek kódjának és az utasítások szerkezetének az ismerete is szükséges hozzá. Ezért a gépi kódú programozást főként a számítógépek kezdeti időszakában használták (más lehetőség ekkor még nem is állt rendelkezésre).

A gépi kódú programozás kényelmetlenségeit kiküszöbölendő, az egyes utasításoknak néhány karakteres szimbólumokat, úgynevezett mnemonikokat feleltetnek meg, melyeket programmal gépi kódra fordítanak. A programnyelvek második generációját képviselik az ilyen alacsony szintű (gépközeli) nyelvek. Ezen nyelveknél megmarad a számítógép erőforrásainak (hardver, operációs rendszer) maradéktalan kihasználhatósága, a memóriacímek, a regiszterek, a verem és a megszakítások közvetlen elérhetősége, programozhatósága.

Ilyen második generációs nyelv az assembly, melynek fordítóprogramja az assembler. Az alacsony szintű nyelveknél minden gépi utasításnak megfelel egy nyelvi utasítás (egy nyelvi utasítás azonban állhat több gépi utasításból is). Megjelennek az adatok és az adatok helyfoglalását, a programkód memóriába helyezését definiáló utasítások. A memóriacímek azonosítóval való ellátására is van lehetőség. Elnevezhetjük az adatok kezdőcímét, ebből alakul ki később a változó fogalma, az utasítások címeinek elnevezésből pedig a címke fogalma.

Egy minden szempontból megfelelő assembly szintű program létrehozásához nem csak a processzor végrehajtható utasításait helyettesítő szimbólumok, hanem a program szerkesztését, javítását és dokumentálását megkönnyítő lehetőségek, úgynevezett direktívák is szükségesek. A direktívák csak az assembler számára hordoznak információt.

Azonban még ez a programozási mód is túl nehézkes, és nagyobb feladatok megoldására alkalmatlannak bizonyult. Ezért fejlesztették ki a magas szintű programozási nyelveket, melyek segítségével a megoldandó feladatot könnyebben és tömörebben lehet megfogalmazni. A programnyelvek harmadik generációját nevezzük magas szintű programozási nyelveknek, amelyeket gyakran a 3GL jelöléssel szokás ellátni (3rd Generation Language). A programnyelvek e generációjánál a változófogalom pontosabb megjelenése az egyik legfontosabb tulajdonság. A változó azonosítója nem memória-kezdőcímet, hanem egy egész memóriatartományt jelöl. A változófogalom mellett kialakul a típusfogalom, és lehetőség van arra, hogy a programozó saját típusokat is létrehozzon. Kialakulnak a strukturált programnyelvek, megjelennek az elágazások, a ciklusok, az eljárások és a függvények. Az eljárásoknak lehetnek név, illetve cím szerint átadott paraméterei is. A harmadik generációs programnyelveket feladatorientált vagy eljárásorientált nyelveknek is nevezzük, mivel felépítésükből fakadóan a programfejlesztő számára egy program adott részfeladatainak megoldására szolgáló struktúrákat (eljárásokat) kínálnak. Nagy előnye a magas szintű programnyelveknek, hogy a velük készült programok függetlenek a konkrét számítógéptől, hiszen az egyes gépek specialitásait a fordítóprogramnak kell figyelembe vennie a fordítás során.

Egy-egy magas szintű programnyelvhez minden géptípusra más-más fordítóprogram tartozik. A fordítóprogram (compiler) segítségével lehet a magas szintű programnyelv utasításait az adott számítógép gépi kódú utasításaira lefordítani. Az interaktív gépek megjelenésével kialakult a programozási nyelvek egy olyan csoportja, melyeknél a fordítási menet nem különül el a végrehajtástól, hanem a forrásprogram utasításait rögtön értelmezi és végre is hajtja a fordítóprogram. Az ilyen típusú fordítóprogram az értelmező (interpreter).

Ma már nagyon sok különböző nyelv létezik. Ezek kifejlesztése általában valamilyen típusú problémák, feladatok megoldására irányul - célorientált, problémaorientált. Az egyes programozási nyelvek önálló utasításkészlettel, szabályrendszerekkel rendelkeznek. Ezeket a szerkezeti, formai követelményeket a nyelv szintaxisának nevezzük. Az utasítások szerkezete a gépi kódú utasításokhoz viszonyítva sokkal összetettebb, képzési módjuk sokkal inkább követi az emberi gondolkodásmódot. A magas szintű programozási nyelvek utasításai több gépi utasítást, tehát egy teljes utasítássorozatot takarnak, nem veszik figyelembe a számítógép felépítését. Ennek megfelelően a magas szintű fordítóprogramok is bonyolultabbak. A magas szintű programozási nyelvek gépfüggetlenek, tehát átvihetőek a forrásprogramok az egyik gépről a másikra. Ennek csupán egyetlen feltétele van, az, hogy az adott gépen az adott operációs rendszer alatt legyen ugyanolyan fordító. Minden programozási nyelvnek létezik egy úgynevezett hivatkozási nyelve (például Standard Pascal), amelyet – ideális esetben - a nyelv implementációi (vagyis a konkrét fordítóprogramok illetve értelmezők) megvalósítanak. Ha csak a hivatkozási nyelv által definiált eszközöket használjuk, akkor a program - forrás szinten - változtatás nélkül átvihető az egyik típusú gépről a másikra, egyébként, ha kihasználjuk az implementációnak a hivatkozási nyelvtől eltérő (esetleg azzal ütköző) lehetőségeit, akkor a programot módosítani kell egy másik implementációra való átvitelhez.

Számítógépes program írásakor az adott nyelv szintaktikája alapján készítjük el a programot. A program kódolásától a végrehajtásáig vezető leggyakoribb utat a következő ábrán szemléltetjük:

A fordítást a programozó indítja el. A forrásprogramot a fordítóprogram szintaktikailag ellenőrzi. Ha hibátlan, előáll a tárgyprogram, ellenkező esetben hibajegyzéket kapunk. A hibajelzések alapján a programozó javít, és újraindítja a fordítást. Sok esetben többszöri próbálkozás után áll elő a tárgyprogram.

A tárgyprogram önmagában még nem végrehajtható. Ezt a szerkesztőnek más néven kapcsolatszerkesztőnek (linkage editor) össze kell szerkesztenie egyéb, a nyelv, illetve a rendszerszoftver által biztosított rutinokkal. Az esetleges további (strukturális) hibák kiküszöbölése után áll elő a végrehajtható program.

Ha a végrehajtható programot futtatjuk, elkezdjük a program tesztelését, azaz a szemantikai (logikai, tartalmi) hibák kiküszöbölését. A program szemantikailag hibás, ha elindul ugyan, de nem azt csinálja, amit kell, esetleg menet közben le is áll. Az ilyen hiba sok gondot okozhat a programozónak, mivel az poloska módjára rejtőzik a programban. Ezért a hiba neve a poloska angol megfelelője után bug, megtalálása és kiirtása a debuggolás, az erre alkalmas segédprogram a debugger.

A programfejlesztés során ezeket a feladatokat egyre inkább úgynevezett integrált fejlesztői környezetben (IDE - Integrated Development Environment) hajtják végre. Az IDE a programozást jelentősen megkönnyítő, részben automatizáló programok összessége. Tartalmaznak egy szövegszerkesztőt a program forráskódjának szerkesztésére, egy fordítóprogramot vagy értelmezőt, fordításautomatizálási eszközöket, valamint nyomkövetési, és gyakran grafikusfelület-szerkesztési és verziókezelési lehetőségeket sok egyéb mellett. A komolyabbakhoz kiegészítők tömege érhető el, amelyek a rendszerfejlesztés egyéb fázisaiban, például a dokumentálásban, projektmenedzsmentben stb. nyújtanak nagy segítséget.

Ma már nagyon sok magas szintű programozási nyelvet ismerünk. Ezek között van általános és speciális célú. Az alábbiakban néhány, az elsők közül való és valamilyen szempontból nevezetes, harmadik generációs programozási nyelvet ismertetünk.

A BASIC (Beginner's All-purpose Symbolic Instruction Code) programozási nyelv a magas szintűek közül az egyik legegyszerűbb. Első verzióját is oktatási célból készítette Kemény János (1926-1992) magyar-amerikai tudós. A BASIC-nek azóta nagyon sok különböző változata született meg.

1954-ben az IBM-nél egy kutatócsoport hozta létre a FORTRAN (FORmula TRANslation - formulafordítás) nyelvet, ami egyike a legrégebben használatos magas szintű programozási nyelveknek. Ennek megfelelően elég sok változata létezik, amelyek túlnyomórészt a korszerűsítések eredményei. Elsősorban matematikai számítások, fizikai kutatóintézetekben szükséges számítások elvégzésére fejlesztették ki.

Szintén a legkorábban kifejlesztett programozási nyelvek közé tartozik az ALGOL60 és az ALGOL68 (ALGOrithmic Language). Elsősorban algoritmikus problémák megoldására fejlesztették ki. Az ALGOL megjelenése annyiban volt hatással a programozási nyelvekre, hogy még ma is van sok ún. "ALGOL"-szerűnek nevezett nyelv.

A 60-as években fejlesztették ki az USA Hadügyminisztériumának megbízásából a COBOL (COmmon Business Oriented Language – általános üzletorientált nyelv) programnyelvet. A 60-as, 70-es években a magas szintű nyelven írt programok többségét COBOL-ban írták. Elsősorban adatfeldolgozásra készült, ezen a területen még ma is használják. Hasonlít a normál beszédhez, utasításai állítások.

Az IBM a 60-as évek közepén új nyelvet tervezett, ami a PL/1 nevet kapta. Ebben a nyelvben a korábbi programozási nyelvek előnyeit próbálták egyesíteni. A nyelv ezért eléggé univerzális, s ebből következően célszerű használatához nagyon nagy gépre volt szükség. Egyik legfontosabb erénye az adatállományok igen jó, rugalmas, magas logikai szintű definiálása és kezelése, illetve hibakezelése. Ma már kevésbé használatos nyelv, az ESzR gépek korszakában volt népszerű (1969-85).

Ken Thompson (1943-) 1970-ben dolgozta ki a B nyelvet, aminek segítségével az első UNIX operációs rendszer készült. Mivel a B nyelv nem volt elég hatékony, ezért 1971-ben Dennis Ritchie (1941-) kifejlesztette a C nyelvet, amiből 1983-ban létrejött az első szabványos C, majd 1989-ben megszületett az ANSI C szabvány végleges változata. (Megjegyzés: Ezt C89-ként, illetve C90-ként is szokták emlegetni, ugyanis az ISO egy évvel később fogadta el. Van C99 is azóta.) C nyelven írják a UNIX operációs rendszert, és ehhez általában hozzátartozik a C fordító is. A C nyelv elterjedését segítette, hogy nagyon hatékony programozási nyelv és a C forrásprogramok elég jól hordozhatóak a különböző platformok között. Ha egy C programban csak szabványos elemeket használunk, akkor valószínűleg mindenhol futni fog, minimális átalakítással. (Manapság a C nyelv szerepét a C++ veszi át, ami a C nyelv objektumorientált kiterjesztése. Általában a C programok gond nélkül használhatóak C++ rendszerben is, és a fordítók többsége ismeri mindkettőt.) Szokás a C nyelvet alacsony szintű programozási nyelvként is említeni. Ez azonban csak azt jelenti, hogy általában a számítógép által támogatott adattípusokkal dolgozik. Támogat olyan alacsony szintű műveleteket is, amelyet más magas szintű programozási nyelvek nem támogatnak, illetve sajátossága, hogy támogatja a bitstruktúrák kezelését is. (Ez utóbbi tulajdonságai miatt sokszor kiváltja az assembly nyelvet.) A C nyelv azonban nem tartalmaz I/O utasításokat. E műveletek elvégzésére függvénykönyvtárakat hoztak létre. A C nyelv nem tartalmaz sztringek (karakterláncok), halmazok és listák kezelésére szolgáló műveleteket sem. A függvénykönyvtárak segítségével azonban több hasznos eszközhöz juthatunk, mint más programozási nyelvekben.

A programnyelvek következő generációját nevezték el negyedik generációs (4GL = 4th Generation Language) nyelveknek, mivel az ezekkel az eszközökkel történő programfejlesztés merőben más technikákat és módszereket kívánt a fejlesztőktől, mint a magas szintű programozási nyelvek.

A 4GL eszközök magas szintű programozási nyelvre épülő komplex, objektumorientált programfejlesztői rendszerek. A 4GL rendszerek a hagyományos programozási nyelvektől eltérően nem igénylik az összes elemi - különösképp a felhasználói felületekre vonatkozó - tevékenység implementációját. A programozó készen kap olyan elemeket, objektumokat, amelyekkel ezeket a gyakran időrabló feladatokat gyorsan és hatékonyan képes megoldani. Így például nem szükséges a felhasználói felületet a részletek szintjén utasításonként programozni, elegendő csak a képernyőn megjelenő elemeket megadni, és a fejlesztőrendszer ez alapján már automatikusan generálni tudja az űrlap (ablak) egy alapértelmezés szerinti felépítését.

Ezzel a módszerrel a 4GL eszközökkel történő fejlesztés során a programozó magasabb szintű absztrakcióval készítheti a programjait. Erre az úgynevezett komponens alapú fejlesztési módszer teremti meg a lehetőséget. A komponensek olyan előre gyártott építőelemek, melyeket a fejlesztőkörnyezet tartalmaz. A programozó a vizuális tervezőfelületen ezekből összeállíthatja a programja vázát, felhasználói felületét. Ezen a szinten a programkód is automatikusan generálódik, tehát a fejlesztő idejének nagyobb hányadát fordíthatja a speciális algoritmusok elkészítésére. Manapság a nagyobb rendszereket szinte kizárólag ilyen 4GL környezetben fejlesztik, és olyan kisebb alkalmazásoknál is egyre jobban teret hódít ezek használata, mint például az adatbáziskezelő rendszerek.

A következő fejlődési szakasz a programozási nyelvek tekintetében az ötödik generációs nyelvek, vagy „intelligens nyelvek”, amelyek kutatása, fejlesztése még folyamatban van. Igen nagy számítógépkapacitást igényel: elvileg az emberi gondolkodás leírása történne meg, és a természetes, emberi nyelvet transzformálnák a számítógép által értelmezhető formára.

A programozási nyelvek számának növekedésével egyidejűleg változtak a programozási módszerek is, amely a nyelvek egy másik csoportosítását teszi lehetővé.

A kezdeti programozási nyelveknél alkalmazott, az építőkockák elvén alapuló programfejlesztési módszer a moduláris programozás, amikor a számítógéppel megoldandó feladatot egymástól független részfeladatokra osztják fel. Az egyes a modulokat külön-külön lehet megírni, átvenni már megírt programokból (rutingyűjteményből), és a tesztelés is modulonként történik. Második lépésként a kész, jól működő modulokat egy egységbe illesztjük, ellenőrizzük a modulok közötti információcserét, valamint a vezérlésátadások helyességét. A modulokat szubrutinnak szokás nevezni. A szubrutin nem más, mint az utasítások olyan sorozata, amely az adott program keretein belül önálló logikai és szerkezeti egységet alkot (azaz részfeladatot lát el), és a program futása során többször is meghívható. A program a szubrutinokat hívja meg a megfelelő sorrendben, és biztosítja a megfelelő paraméterátadást.

A strukturált programozás esetén a legelső dolgunk, hogy a feladatot (a problémát), amire programot szeretnénk írni, kielemezzük. A nagy feladatot mindig kisebb részekre bontjuk, azokat pedig még kisebbekre, egészen addig, amíg el nem érünk valamilyen, tovább már nem bontható részfeladatig. Az ilyen, tovább már nem bontható részfeladatokhoz már kidolgozhatjuk a megfelelő algoritmust. Az algoritmusban csak meghatározott vezérlési struktúrákat használhatunk, és megírjuk hozzá a megfelelő programrészleteket. Az így kapott program könnyen javítható, hiszen hamar kideríthető, hogy a hiba melyik programrészben fordult elő, és a program fejlesztése is viszonylag egyszerű. Az egyik legismertebb magas szintű programozási nyelv, amellyel a strukturált programozás elve megvalósítható, a Pascal, amit eredetileg nem a gyakorlatban használatos programnyelvnek szántak, hanem a strukturált programozási elv oktatására kidolgozott eszköznek.

Az objektumorientált programozás (OOP) sok tekintetben a moduláris programozás továbbfejlesztett változata, mely háttérbe szorítja a strukturált programozást. Az egyes elemeket itt nem moduloknak, hanem osztályoknak nevezzük. Az egyes osztályok a modellezett világ azonos fajta tulajdonságokkal és azonos viselkedéssel rendelkező objektumait írják le. Az objektumorientált programozás jobban közelíti, utánozza a valóságot, mint elődei, mert jobban igazodik a tárgyhoz. Az osztály létrehozásakor definiáljuk a szerkezetét, megadva objektumainak tulajdonságait, és a szubrutinokat, melyek leírják objektumainak a viselkedését, így a későbbiekben mindent együtt kezelhetünk, ami az adott objektumhoz tartozik. Az így létrejött nyelv sokkal strukturáltabb, sokkal modulárisabb, ami megmutatkozik az adatok szerkezetében, valamint a fölösleges hivatkozások elhagyásában is.

Főbb tulajdonságai:

  • Egy rekord összekapcsolása eljárásokkal és függvényekkel. Ez jellemzi az új adattípust, az osztályt.

  • Az osztályok a korábban definiált osztályoktól adatokat és módszereket vehetnek át (örökölhetnek). Egy adott típusú objektum kompatibilis a szülő típusok objektumaival.

Az aspektusorientált programozás (AOP) is a moduláris programozás továbbfejlesztett változata. Bár a legtöbb aspektusorientált nyelv egyben objektumorientált is, az AOP elvei függetlenek az objektumorientáltságtól. Lényege, hogy a program modulokra bontásakor egyidejűleg több szempontrendszert is érvényesíthetünk. Ezzel a módszerrel el tudunk különíteni (külön modulba tudunk kiemelni) olyan programrészeket is, amelyek a moduláris programozás hagyományos eszközeit használva több modulban szétszóródva jelennének meg. A hagyományos eszközökkel ugyanis a programot csak egyetlen, kitüntetett szempontrendszer szerint bonthatjuk modulokra, viszont emiatt azok a programrészek, amelyek egy másik szempontrendszer szerint logikailag összetartoznának (a program egy vonatkozását hordozzák), így több modulban szétszóródva jelennek meg. Ezzel egyidejűleg jellemző probléma, hogy a modulokban emiatt összekeverednek a program különböző vonatkozásait hordozó elemek.

Az AOP úgy küszöböli ki a vonatkozások szétszóródását és keveredését, hogy a szétszóródó elemek is kiemelhetők egy modulba. Ilyenkor a modulban le kell írni, hogy az így kiemelt elemek a program mely pontjaira illesztendők be. Az ilyen modulokat rendszerint aspektusnak nevezik, a beillesztést pedig szövésnek. Ez történhet már a program fordításakor, vagy csak a futtatásakor is.

10. fejezet - Programozás C nyelven

Egy számítógépes program alapvetően egy utasítássorozat (valamely programozási nyelv elemeiből összeállítva), amely a számítógépet a feladat megoldási algoritmusában előírt műveletek végrehajtására utasítja. Követve az alábbi példákban az algoritmusok lépései, és az algoritmusok szerint megírt C nyelvű programok utasításai közötti megfeleléseket, ízelítőt kaphatunk a C nyelv utasításkészletéből is.

Példák

1. Az „Elemi algoritmusok” című alfejezet 1. példája:

Megjegyzés: Egy C program fő része a main függvény. A függvények magját képező utasításokat kapcsos zárójelek közé tesszük. A return 0 utasítás azt jelzi, hogy hiba nélkül futott le a program. A változókat definiálni kell, megadva a típusukat (deklaráció). Az int egész típust jelöl. Az azonosítók csak az angol ABC kis- és nagybetűit, aláhúzás jelet és számjegyeket tartalmazhatnak, de nem kezdődhetnek számjeggyel. Az stdio.h header állomány a scanf és printf függvényeket tartalmazza, amelyek adatoknak a standard input eszközről való beolvasására, illetve a standard output eszközre való kiíratására szolgálnak. A % jellel bevezetett i formázó karakterek azt jelzik, hogy a megfelelő változók int típusúak. Egy változónév előtt az & jel a változó memória címére való hivatkozást teszi lehetővé.

read a, b;
c := a;
a := b;
b := c;
write a, b;	

#include <stdio.h>
main()
{
   int a, b, c;
   scanf(”%i%i”, &a, &b);
   c = a;
   a = b;
   b = c;
   printf(”%i, %i”, a, b);
   return 0;
}

2. Az „Elemi algoritmusok” című alfejezet 2. példája:

Megjegyzés: A C nyelv összehasonlító operátorai a <, >, <=, >=, == és !=. Ha egy többirányú elágazás ugyanazon egész kifejezés különböző értékei szerint történik, akkor használhatjuk a switch utasítást. A break lehetővé teszi a kiugrást switch, illetve ciklusutasításokból.

read jegy;
if jegy=1 then write “elégtelen”
else if jegy=2 then write “elégséges”
	else if jegy=3 then write “közepes”
		else if jegy=4 then write “jó”
			else write “jeles”
			endif
		endif
	endif
endif
	
#include <stdio.h>
main()
{
int jegy;
scanf (“%i”, &jegy);
if (jegy==1) printf (“elégtelen”);
else  if (jegy==2) printf (“elégséges”);
	else if (jegy==3) printf (“közepes”);
		else if (jegy==4) printf (“jó”);
			else printf (“jeles”);
return 0;
}

read jegy;
if jegy=1 then write “elégtelen”
else if jegy=2 then write “elégséges”
	else if jegy=3 then write “közepes”
		else if jegy=4 then write “jó”
			else write “jeles”
			endif
		endif
	endif
endif	

#include <stdio.h>
main()
{
int jegy;
scanf (“%i”, &jegy);
switch (jegy)
{
	case 1: printf (“elégtelen”); break;
	case 2: printf (“elégséges”); break;
	case 3: printf (“közepes”); break;
	case 4: printf (“jó”); break;
	case 5: printf (“jeles”); break;
	default printf (”Helytelen jegyérték.”);
}
return 0;
}

3. Adott az n érték, illetve egy n elemű számsorozat. Határozzuk meg a számsorozat maximumának értékét.

Megjegyzés: A ++i utasítás az i változó értékének 1-el való növelését jelenti.

read n;
read szám;
max := szám;
for i := 2 to n do
	
	read szám;
	if szám > max then
		max := szám;
	endif
endfor
	write max;	

#include <stdio.h>
main()
{
	int n, szam, i;
scanf (“%i”, &n);
scanf (“%i”, &szam);
max = szam;
for (i = 2; i <= n; ++i)
{
	scanf (“%i”, &szam);
	if (szám > max)
		max = szam;

}
printf (“A legnagyobb érték: %i”, max);
return 0;
}

4. Az „Elemi algoritmusok” című alfejezet 7. példája:

Megjegyzés: Ha egy változó értékéhez hozzá kell adni, vagy ki kell vonni belőle egy értéket, akkor használhatjuk a +=, illetve a –= összevont operátorokat.

read szám1, szám2;
while szám1 ≠ szám2 do
	if szám1 > szám2 then
		szám1 := szám1 – szám2
	else
		szám2 := szám2 – szám1;
	endif
endwhile
write szám1;
	
#include <stdio.h>
main()
{
int szam1, szam2;
scanf (“%i%i”, &szam1, &szam2);
while (szam1 != szam2)
	if (szam1 > szam2)
		szam1 –= szam2;
	else
		szam2 –= szam1;
printf (“%i”, szam1);
return 0;
}

5. Adott egy természetes szám. Ellenőrizzük, hogy prím-e.

Megjegyzés: A C nyelv logikai operátorai az && (ÉS/AND), a || (VAGY/OR) és a ! (NEM/NOT). Minden nem nulla érték a logikai IGAZ, a nulla pedig a logikai HAMIS. A math.h header állomány tartalmazza a matematikai függvényeket, így az sqrt négyzetgyök függvényt is.

számláló := 0;
read szám;
if szám = 0 then prím := 0;
else if szám = 1 then prím := 0;
	else
	prím := 1; j := 2;
	while (j ≤ [√szám]) AND (prím = 1) do
		if szám MOD j = 0 then
			prím := 0;
		endif
	j := j + 1;
	endwhile
	endif
endif
if prím = 1 then write “A szám prím!”
	else write “A szám prím!”
endif	

#include <stdio.h>
#include <math.h>
main()
{
	int szamlalo=0, szam, prim, j;
	scanf (“%i”, &szam);
	if (szam == 0) prim = 0;
	else if (szam == 1) prim = 0;
		else
		{
		prim = 1; j = 2;
		while (j ≤ sqrt(szám) && prim)
		{
			if (!(szam % j))
			prim = 0;
			++j;
		}
	}
	if (prim) printf (“A szám prím!”);
	else printf (“A szám prím!”);
	return 0;
}

6. Olvassunk be a kereses_be.txt input állományból egy n természetes számot (n≤100), majd egy n elemű számsorozatot egy egydimenziós tömbbe, és keressünk meg a számsorozatban egy x értéket, amelyet ugyancsak az állományból olvasunk be. A keresés eredményét a kereses_ki.txt állományba írjuk ki. (Lineáris keresés.)

Megjegyzés: A állománymutatókat FILE* típusúnak kell deklarálni. Mielőtt egy állományból/állományba olvasnánk/írnánk, meg kell nyitni olvasásra (r)/írásra (w). A C nyelvben a tömbök indexe 0-val kezdődik. A break utasítás lehetővé teszi a ciklusból való kiugrást.

read n;
for i := 1 to n do
	read a[i];
endfor
read x;
i := 1;
while (i ≤ n) AND (a[i] ≠ x) do
	i := i + 1;
endwhile

if i ≤ n the write i
else write “Nincs”
	endif	

#include <stdio.h>
main()
{
	int n, a[100], i, x;
	FILE *be, *ki;
	be = fopen (”kereses_be.txt”, ”r”);
	ki = fopen (”kereses_ki.txt”, ”w”);
	fscanf (be, “%i”, &n);
	for (i = 0; i < n; ++i) 
		fscanf (be, “%i”, &a[i]);
	fscanf (be, “%i”, &x);
	for (i = 0; i < n; ++i)
		if (a[i] == x) {
			fprintf (ki, ”%i”, i + 1); break;
			}
	if (i == n) fprintf (ki, “Nincs”);	
	fclose (be); fclose (ki);
	return 0;
}

7. Összefésüléses rendezés.

Megjegyzés: A program végrehajtása a main függvénnyel kezdődik. A main függvény meghívja a rendez eljárást. A rendez eljárás meghívja kétszer önmagát rekurzívan, majd az összefésül eljárást. Az eljárások (procedure) C nyelven void típusú függvények, amelyek elvégeznek egy részfeladatot. A valódi függvények (function) kiszámítanak egy eredményt, amit a hívó függvénynek adnak vissza. A hívó függvény paraméterlistán keresztül adhat át adatokat a meghívott függvénynek. Az INTMAX konstansa limits.h header állományban van.

procedure összefésül (x[i..j])

	k := (i + j) / 2;
	for p := i to k do
		a[p] := x[p];
	endfor
	for p := k+1 to j do
		b[p] := x[p];
	endfor
	a[k+1] := ∞; b[j+1] := ∞;
	ii := i; jj := k+1;
	for p := i to j do
		if a[ii] < b[jj] then
			x[p] := a[ii];
			ii := ii + 1;
		else
			x[p] := b[jj];
			jj = jj + 1;
		endif
	endfor
endprocedure

procedure rendez (x[i..j])
	if i < j then
		k := (i + j) / 2;
		rendez (x[i..k]);
		rendez (x[k+1..j]);
		összefésül (x[i..j]);
	endif
endprocedure
	
#include <stdio.h>
#include <limits.h>
void összefésül (int i, int j, int x[]){
	int k, a[100], b[100], p, ii, jj;
	k = (i + j) / 2;
	for (p = i; p <= k; ++p)
		a[p] = x[p];
	for (p = k +1; p <= j; ++p)
		b[p] = x[p];
	a[k+1] = b[j+1] = INTMAX;
	ii = i; jj = k+1;
	for (p = i; p <= j; ++p)
		if (a[ii] < b[jj])
		{
			x[p] = a[ii];
			ii = ii + 1;
		}
		else
		{
			x[p] = b[jj];
			jj = jj + 1;
		}
}

void rendez (int i, int j, int x[]) {
	int k;
	if (i < j) {
		k = (i + j) / 2;
		rendez (i, k, x);
		rendez (k + 1, j, x);
		összefésül (i, j, x);
		} 
	}

main()
{
	int n, a[100], i;
	FILE *be, *ki;
	be = fopen (”rendezes_be.txt”, ”r”);
	ki = fopen (”rendezes_ki.txt”, ”w”);
	fscanf (be, “%i”, &n);
	for (i = 0; i < n; ++i) 
		fscanf (be, “%i”, &a[i]);
	rendez (0, n – 1, a);	
	for (i = 0; i < n; ++i) 
		fprint (ki, “%i ”, a[i]);
	fclose (be); fclose (ki);
	return 0;
}

Feladatok

1. Írjunk C programot az „Elemi algoritmusok” és „Nevezetes algoritmusok” alfejezetekben szereplő további megoldott, illetve kitűzött feladatokra.

11. fejezet - Alkalmazások

A felhasználó a számítógép és az operációs rendszer szolgáltatásait legtöbbször nem közvetlenül veszi igénybe, hanem hozzá közelebb álló, egyszerűbben kezelhető úgynevezett felhasználói programokon keresztül. Ma már minden operációs rendszer lehetővé teszi mind a hálózati, mind a helyi alkalmazások elérését.

A hálózati alkalmazások elérését az alkalmazási réteg teszi lehetővé. Az összes olyan funkciót biztosítja, amelyet az alsóbb rétegek a rendszerek közötti kommunikációnál használnak. Ezekről már volt szó a számítógéphálózatokról szóló fejezetben.

A helyi alkalmazásokat azok a standard felhasználói programok teszik lehetővé, amelyek több felhasználói terület, felhasználói réteg vagy szakmacsoport által használt szoftvereket foglalják magukba. Ezeket a nagy vásárlói kör miatt általában nagy nemzetközi szoftvervállalatok készítik és forgalmazzák, és árulják olcsóbban, mint az egyedi fejlesztésű programokat.

Néhány fontosabb alkalmazási terület:

  • szövegszerkesztés;

  • táblázatkezelés;

  • bemutatókészítés;

  • adatbáziskezelés;

  • képkezelés;

  • hangkezelés.

A helyi alkalmazásokat biztosító szoftverek közötti adatátvitelt az operációs rendszer az úgynevezett vágólap (clipboard) segítségével biztosítja. A vágólap valójában egy átmeneti tároló, ami vagy a memóriában, vagy a rendszert tartalmazó lemezen tárolódik. A legtöbb operációs rendszerben a tartalma törlődik a számítógép kikapcsolása után.

Az adatátvitel nagyon egyszerű, mert az alkalmazói programokban csak néhány utasítást lehet használni a vágólap kezelésére. A vágólapra adatot helyezni a Kivágás (Cut) és a Másolás (Copy) utasításokkal, onnan visszaszedni a Beillesztés (Paste) utasítással lehet.

Szövegszerkesztés

Az alkalmazások közül külön figyelmet érdemel a szövegszerkesztés, mint a leggyakrabban használt eszköz. Szinte minden egyéb alkalmazás, programfejlesztés, levélírás, kiadvány készítéséhez, stb. nélkülözhetetlen eszköze.

A szövegszerkesztő programmal könnyen, gyorsan szép, esztétikus kiadványokat tudunk készíteni, amit bármikor módosíthatunk, reprodukálhatunk, kinyomtathatunk. Az egyszerű (ASCII) szövegszerkesztők használatakor a beírt szöveget nem lehet formázni. A formázást megengedő szövegszerkesztők segítségével formai beállítások is végezhetők (betűformázás, képbeillesztés, stb.).

Régebben a szövegszerkesztők nem tudták megmutatni a nyomtatási képet, azaz, hogy kinyomtatva milyen lesz a dokumentum. A szerkesztés közben a szövegben különféle kódok utaltak a formázásokra. A jelenleg használatos szövegszerkesztők szerkesztés közben azt a képet mutatják, amit nyomtatáskor kapunk. Ezek a WYSIWYG (What You See Is What You Get = amit látsz, azt kapod) szövegszerkesztők.

A szövegszerkesztés lépései

  1. megnyitás (új, régi);

  2. a szöveg begépelése;

  3. formázás;

  4. mentés (mentés másként);

  5. nyomtatás.

Tipográfiai ismeretek

  • a papír beállításai (oldalbeállítások - papírméret, margók, befűzés, tájolás);

  • szöveghelyek (szövegtükör, fejléc, lábléc, oldalszámozás);

  • tipográfiai egységek (karakter, szó, sor, bekezdés, szakasz, dokumentum);

  • a dokumentumban elhelyezhető objektumok (képek, rajzok, táblázatok).

    Jellemző formázási lehetőségek

    Feladatok

    1. Körlevélkészítés:

    a) Készítse el az alábbi táblázatot Excel-ben!

    11.1. táblázat - Táblázat 5

    NévLakóhelyCégTelephelyBeosztásFizetés
    Dombi ÁkosTéglásBeléndek Rt.Debrecenosztályvezető180000 Ft
    Kovács RóbertBudapestMikroklíma Bt.Győrmérnök153000 Ft
    Benke ZsoltHatvanParma Kft.Budapestosztályvezető186000 Ft
    Herczeg RichárdDebrecenBeléndek Rt.Debrecenigazgató240000 Ft
    Nagy LajosBudapestMikroklíma Bt.Budapestigazgató195000 Ft
    Koczka ÁrpásSiófokParma Kft.Győrigazgató205000 Ft
    Leveles EdeDebrecenBeléndek Rt.Debrecenmérnök84000 Ft
    Zsiga SándorPolgárMikroklíma Bt.Debrecenosztályvezető173000 Ft
    Kósa JánosMiskolcParma Kft.Miskolcszakmunkás950000 Ft
    Vadász MártonTiszaújvárosParma Kft.Miskolcigazgató2250000 Ft


    b.) Rendezze az adatokat cég szerint növekvő sorrendbe, ezen belül telephely szerint növekvő sorrendbe, ezen belül pedig név szerint növekvő sorrendbe!

    c.) A 100000,-Ft-nál kevesebb fizetéseket dinamikusan emelje meg 10 %-kal!

    d.) Gyűjtse ki azoknak a nevét, akiknek a lakhelye a cége telephelyén van!

    e.) Készítsen diagramot, amely összehasonlítja a cégenkénti átlagfizetéseket!

    A táblázat adatait adatforrásként felhasználva készítsen körlevelet A4-es méretben a következő minta alapján! A körlevelet a cégek igazgatóinak és osztályvezetőinek küldje el!

    2. Reprodukció:

    a.) Reprodukálja az alábbi meghívót szövegét a „Meghívó”-tól a „Tóth Balázs.”-ig!

    b.) Másolja át a kész szöveget még három új oldalra úgy, hogy egy négyoldalas dokumentumot kapjon!

    c.) A képet és a mellette levő címet helyezze el az oldalakon az alábbiak szerint:

    1. oldalon: két hasábban;

    2. oldalon: egysoros, kétoszlopos táblázatban;

    3. oldalon: a szöveg szövegdobozban kerüljön a kép mellé;

    4. oldalon: a szöveg képkörülírással kerüljön a kép mellé.

Bibliográfia

Alfred V. Aho – Jeffrey D. Ullman: Foundation of Computer Science, 1992, Computer Science Press, New York

Brookshear, J. Glenn: Computer science: an overview 9. ed. (International ed.), cop. 2007, Boston, MA: Pearson; Addison Wesley

Cormen, Leiserson, Rivest, Stein: Introduction to Algorithms, 1990, MIT Press and McGraw-Hill.

Csala Péter – Csetényi Arthur – Tarlós Béla: Informatika alapjai, 2001, ComputerBooks, Budapest

Efraim Turban – R. Kelly Rainer, Jr. –Richard E. Potter: Introduction to Information Technology, 2001, Wiley

[H1] W. Trede-A.Herkelmann-E-Schwarzer: Számítástechnikai alapismeretek, 1975, Műszaki Könyvkiadó, Budapest