Rendszer⇒
A rendszer egymással kapcsolatban álló elemek összessége, amelyek adott cél érdekében együttműködnek egymással, és működésük során erőforrásokat használnak fel. (Példák rendszerekre: az ember, egy szervezet, egy autó vagy egy repülőgép, egy számítógép, egy elektronikus könyvtár stb.)
- A számunkra fontos rendszerek esetében (például számítógépek vagy egy automatizált gyártósor esetén) a rendszer működése megadható egy meghatározott algoritmus⇒ segítségével.
A rendszer működése során felhasznált erőforrások legfontosabb típusai a következők:
- additív erőforrások (pl. anyag, energia, idő)
- kapacitív erőforrások (pl. emberek, adatok vagy információk, eszközök, infrastruktúra)
A számunkra legfontosabb példa rendszerre egy digitális számítógép, amelynek egyik legfontosabb képessége az, hogy (legalábbis elvileg) bármilyen adatfeldolgozási feladat elvégzésére képes.
Egy számítógépes rendszer legfontosabb komponensei a következők:
- alkatrészek (pl. logikai áramkörök, nyomtatott áramköri lapok, huzalok, kábelek, csatlakozók stb.)
- kapcsolatban álló, egymással együttműködő elemek
- alrendszerek, modulok (pl. a processzor, a memória, a háttértárak, az input/output perifériák stb., valamint a számítógépet működtető szoftver modulok)
- a rendszer struktúrája, felépítése ("architektúrája"): az egyes alrendszerek típusa és kapcsolatrendszere (pl. IBM 360/370 nagyszámítógépes architektúra, Windows NT architektúra (emeljük ki az x86-os sorozatról az x64-es sorozatra való átállást, "generációváltást"), Android mobil architektúra stb.)
Egy számítógépcsalád a digitális számítógépek egy olyan csoportja, amelyek architektúrája egymáshoz hasonló abban az értelemben, hogy az újabb számítógépek a régiekkel "felülről kompatibilisek". Egy számítógépcsaládhoz a számítógépek egymást követő generációi (ill. egy generáción belül a számítógépek egymást követő verziói) tartoznak. (vö. Oxford 1989: 90)
A mérnöki munka és a hardvertervezés szempontjából az architektúra kifejezés egy számítógép konfigurációjának és az azt alkotó fő elemek (központi vezérlő egység, aritmetikai és logikai egység, központi tár, a bemeneti és kimeneti csatornák vezérlői stb.) egymással való kapcsolatának a leírását jelenti. A pontos specifikáció a számítógépek (hardver- és szoftverszintű) kompatibilitása szempontjából rendkívül lényeges. (vö. Oxford 1989: 21-22)A felhasználó szempontjából a közös architektúra a kompatibilitás alapja. (Oxford 1989: 21)A számítógépes rendszer működésének absztrakt leírása: fekete doboz
- bemenet, input
- az input feldolgozása és az output előállítása
- meghatározott eljárás, algoritmus⇒ végrehajtása
- a tárolt adatokon meghatározott műveletek végrehajtása: processor (a végrehajtandó műveleteket meghatározott utasításokkal vagy parancsokkal adjuk meg, amit a számítógép processzora végrehajt)
- adatok, részeredmények tárolása: storage
- a részeredmények ideiglenes tárolása (pl. a processzor regisztereiben, a számítógép memóriájában stb.)
- a később is felhasználható adatok permanens ("tartós") tárolása (pl. a számítógép háttértárain, egy fájlban vagy adatbázisban)
- kimenet, eredmény, output; a működés célja
- adatok dekódolása (például a bináris számok átalakítása decimális számokká, vagy a bináris karakterkódok helyettesítése a képernyőn, ill. nyomtatott formában megjeleníthető karakterekkel)
A számítógép univerzális, automatikus működésű, kívülről vezérelhető, műszakilag megvalósított rendszer.⇒
Számrendszerek
A digitális számítógépekben az adatokat kettes számrendszerben, bináris számokként ábrázoljuk. Mivel a bináris számok nehezen kezelhetőek, legtöbbször 16-os számrendszerben, hexadecimális számokként jelenítjük meg őket.
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. (Nyakóné Juhász 2011: 4)
- Egy számrendszer alapja egy 1-nél nagyobb természetes szám (például 2, 10 vagy 16). Ennek alapján beszélünk például kettes (bináris), tízes (decimális) vagy tizenhatos (hexadecimális) számrendszerről.
- A számrendszerek lényegét a számjegyek és a számjegyek helyi értékének fogalma alapján lehet megérteni.
Például
- kettes számrendszerben a számjegyek halmaza {0, 1}, és a helyi értékek 2 egész kitevős hatványai;⇒
- a kettes számrendszer számjegyeit biteknek nevezzük
- tízes számrendszerben a számjegyek halmaza {0, 1, 2, ..., 9}, és a helyi értékek 10 egész kitevős hatványai;
- tizenhatos számrendszerben a számjegyek halmaza {0, 1, 2, ..., 9, A, B, ..., F}, és a helyi értékek 16 egész kitevős hatványai.⇒ (Jegyezzük meg, hogy az A, B, ..., F számjegyek tízes számrendszerben rendre a 10, 11, ..., 15 számoknak felelnek meg.⇒)
- Egy számrendszerben egy számot számjegyek sorozataként adunk meg.
- Nem egész (racionális, valós) számok esetén pont ('.') választja el a számok egész részét és tört részét. (Néha használatos a vessző (',') is, pl. MS Excel esetében.)
- Egy szám értékét úgy kapjuk meg, hogy az egyes számjegyek értékét megszorozzuk a helyi értékükkel, és a kapott szorzatokat összeadjuk. (Megjegyzés: tízes számrendszerben az egyes helyi értéket 100=1, az tízes helyi értéket 101=10, a százas helyi értéket 102=100, stb. jelenti.)
Például ha egy megadott egész számot ('N') tízes számrendszerben akarunk kifejezni, akkor a következőképpen járhatunk el (vö. Nyakóné Juhász 2011: 4):
(0) vegyünk (pl. képzeletben) pontosan 'N' darab korongot;
(1) csoportosítsuk a korongokat 10-es csoportokba; a kimaradt korongok száma (a0) lesz a szám tízes számrendszerbeli alakjában az egyes helyi értékű számjegy
[vegyük észre, hogy ha N=10*k+d teljesül (ahol 'k' és 'd' egész számok, 0≤d<10), akkor a 10-es csoportok száma éppen k0=k, és a0=d teljesül; ezekkel a jelölésekkel N=10*k0+a0 teljesül];
(2) csoportosítsuk a korongokból az előző lépésben képzett, 10 korongot tartalmazó csoportokat 10-es csoportokba (ekkor egy csoportban 100 korong lesz); a kimaradt csoportok száma (a1) lesz a szám tízes számrendszerbeli alakjában a tízes helyi értékű számjegy;
[az előző jelöléseket használva k0=10*k1+a1 teljesül, ahol k1 a 100-as csoportok száma és 0≤a1<10 a kimaradt 10-es csoportok száma];
(3) csoportosítsuk a korongokból az előző lépésben képzett, 100 korongot tartalmazó csoportokat ismét 10-es csoportokba (ekkor egy csoportban 1000 korong lesz); a kimaradt csoportok száma (a2) lesz a szám tízes számrendszerbeli alakjában a százas helyi értékű számjegy;
[az előző jelöléseket használva k1=10*k2+a2 teljesül, ahol k2 az 1000-es csoportok száma és 0≤a2<10 a kimaradt 100-as csoportok száma];
(4) folytassuk a korongokból képzett csoportok 10-es csoportokba való csoportosítását addig, amíg már nem tudunk újabb 10-es csoportot képezni belőlük.
(5) ha pontosan 'n+1' lépést hajtottunk végre, akkor a szám tízes számrendszerbeli alakját
N = anan−1...a2a1a0
adja, mivel az utolsó lépésben már nem tudtunk újabb 10-es csoportokat képezni.Általánosan egy 'b' alapszámú számrendszerben a számok a következő formában írhatók le ("ábrázolhatóak"):
Példák:
(1) egy valós szám decimális számrendszerben (b=10):
314.610 = 3*102+1*101+4*100 + 6*10−1(2) egy egész szám bináris számrendszerben (b=2):
1010112 = 1*25+1*23+1*21+1*20 = 4310(3) egy valós szám bináris számrendszerben (b=2):
101011.1012 = 1*25+1*23+1*21+1*20 + 1*2−1+1*2−3 = 43.62510(4) egy egész szám hexadecimális számrendszerben (b=16):
1C416 = 1*162+12*161+4*160 = 45210(5) egy valós szám hexadecimális számrendszerben (b=16):
1C4.416 = 1*162+12*161+4*160 + 4*16−1 = 452.2510
Az algoritmus fogalma. Példák algoritmusokra:⇒
Az informatikában alapvető az algoritmus fogalma.
Az algoritmus több azonos jellegű, egymástól csak a kiinduló adatokban különböző feladat megoldására szolgáló eljárás, amelynek során előre meghatározott, véges számú lépést adott sorrendben végrehajtva jutunk el a feladat megoldásához.A számunkra fontos algoritmusok azok, amelyek egy számítógépes program segítségével leírhatók ("kódolhatók"). Ekkor az algoritmus egyes lépéseinek meghatározott műveleteket végrehajtó utasításokat feleltetünk meg.
A programok segítségével leírható algoritmusok a főbb jellemzői a következők:
- végesség: a program egy idő után befejeződik
- egyértelműség: minden utasítás végrehajtása után egyértelműen meg tudjuk mondani, mi lesz a következő utasítás
- teljesség: a program a bemeneti (input) adatok minden lehetséges értéke mellett előállítja a megfelelő kimenetet (output)
Egy algoritmus rendszerint nem egy egyedi probléma megoldására szolgál, hanem több, egymáshoz valamilyen szempontból hasonló probléma megoldására (amelyek csak a bemeneti adatokban különböznek egymástól). Az algoritmusok létrehozásakor mindig törekedjünk arra, hogy az algoritmus minél általánosabb legyen, azaz a megoldandó probléma által megengedett bemeneti (input) adatok minél szélesebb körére szolgáltasson megoldást.
Az ebben a fejezetben ismertetett algoritmusok formális leírására számos programot is meg fogunk adni. Az alábbiakban ezeknek a legfontosabb összetevőit tekintjük át. A példákat JavaScript programozási nyelven adjuk meg.
Kiinduló példa: egy bináris szám átalakítása decimális számmá.⇒A legegyszerűbb programok a következő utasításokból épülnek fel:
- változókat létrehozó ún. deklarációs utasítások; a változók a programok legfontosabb összetevői, amelyek egyedi névvel rendelkeznek és különböző típusú értékeket tárolhatnak; például
- var n; // az 'n' nevű változó deklarálása
- var i=1; // az 'i' nevű változó deklarálása, és 1 kezdőérték beállítása
- a változók értékét megváltoztató ún. értékadó utasítások; ezek rendszerint egy vagy több művelet eredményét tárolják el egy változóban; például
- i=i+1; /* az 'i' nevű változó aktuális értékéhez 1 hozzáadása, és a művelet eredményének eltárolása ugyanabban az 'i' változóban (amelynek az értéke innentől kezdve az eggyel megnövelt érték lesz, a korábbi érték törlődik) */
- kerulet=2*r*3.14; /* az 'r' nevű változó megszorzása először 2-vel, majd 3.14-gyel (π), és a szorzat eltárolása a 'kerulet' nevű változóban */
- a változók értékét beolvasó vagy kiíró i/o (input-output) utasítások; például
- writeln("a kerület értéke: "+kerulet); /* a 'kerulet' nevű változó kiírása a képernyőre a "a kerület értéke: " szöveg után */
- writeln("____________"); /* a "____________" szöveg kiírása a képernyőre (a megadott példaprogramokban így jelöljük majd a program végét) */
- az utasítások végrehajtásának sorrendjét meghatározó vezérlési szerkezetek (szekvencia, szelekció és iteráció); például
- a=2; b=3; c=a+b; writeln(c); /* legyen az 'a' nevű változó értéke 2, majd a 'b' nevű változó értéke 3, ezután az 'a' és 'b' összegét (a+b) számítsuk ki és tároljuk a 'c' nevű változóban, majd a 'c' értékét írassuk ki */ → szekvencia
- if(i==1) { writeln("igaz"); } else { writeln("hamis"); } /* az 'i' nevű változó aktuális értékétől függően "igaz" (ha 'i' értéke 1) vagy "hamis" (ha 'i' értéke nem 1) kiírása */ → (kétirányú) szelekció vagy elágazás
- i=3; if(i<10) { write("0"); } writeln(i); /* ha az 'i' nevű változó aktuális értéke 10-nél kisebb (ha 'i' egy számjegyű természetes szám), akkor egy "vezető" nulla (0) kiírása */ → (egyirányú) szelekció
- var j="5"; switch(j) { case "1": writeln("elégtelen"); break; case "2": writeln("elégséges"); break; default: writeln("rendben"); } /* ha a 'j' változó értéke '1', akkor "elégtelen", ha '2', akkor "elégséges", egyébként pedig "rendben" kiírása */ → (többirányú) szelekció
- var i=1; while(i<=n) { writeln(i); i=i+1; } /* az 'i' (ciklus)változó értékének a kiírása addig, amíg az 'i' értéke az 'n' változó aktuális értékénél kisebb vagy egyenlő */ → iteráció vagy (elöltesztelő) ciklus
!! a ciklusblokk utolsó utasítása (i=i+1;) nélkül végtelen ciklust kapunk !!
- for(var i=1;i<=n;i=i+1) { writeln(i); } /* az 'i' nevű ciklusváltozó értékének a kiírása addig, amíg az 'i' értéke az 'n' változó aktuális értékénél kisebb vagy egyenlő; ebben a példában a 'for' ciklus egyenértékű a fenti 'while' ciklussal */ → iteráció vagy (rögzített lépésszámú) ciklus
Az utasítások sorrendjét meghatározó három legfontosabb strukturált programszerkezet vagy vezérlési szerkezet a következő:
- szekvencia
- elágazás vagy szelekció
- ciklus vagy iteráció
Az algoritmusok szemléltetésére folyamatábrákat használhatunk. A fenti strukturált programszerkezetek folyamatábrák segítségével a következőképpen szemléltethetők (vö. Vég József: Folyamatábra, 2022-09-24):
A szekvencia egymás utáni utasítások sorozata (amelyeket például pontosvesszővel választhatunk el egymástól).
Az ábrán szereplő kétirányú elágazást (vagy elágaztatást) például JavaScript nyelven a következő utasítással tudjuk kódolni:
if(feltétel) { utasítás(ok) } else { utasítás(ok) }Ez a következőképpen fordítható le:
"Ha a feltétel teljesül (vagyis igaz), akkor hajtsd végre az 'if' után kapcsos zárójelben megadott utasítás(oka)t; egyébként pedig (vagyis ha a feltétel nem teljesül) hajtsd végre az 'else' után kapcsos zárójelben megadott utasítás(oka)t."Az ábrán szemléltetett előltesztelő ciklust pedig JavaScript nyelven a következő utasítással tudjuk kódolni:
while(feltétel) { utasítás(ok) }Ez a következőképpen fordítható le:
"Mindaddig, amíg a feltétel teljesül (vagyis igaz), (újra és újra) hajtsd végre a 'while' után kapcsos zárójelben megadott utasítás(oka)t."Például az első 'n' szám kiíratását a következő algoritmussal tudjuk megvalósítani:
Az algoritmust JavaScript nyelven például a következőképpen kódolhatjuk:
// az első 'n' szám kiíratása var n=10; var i=1; while(i<=n) { writeln(i); i=i+1; } writeln("_____________");Vegyük észre, hogy az 'n' változó és az 'i' változó aktuális értéke határozza meg a 'while' ciklus ismétlődéseinek számát. Az 'n' változó kezdeti értéke 10, és az 'i' kezdeti értéke 1. Mivel a ciklus minden végrehajtásakor 'i' értéke eggyel nő, a tizedik végrehajtás után a ciklus befejeződik (ugyanis ekkor az 'i' értéke 11 lesz, ami már nagyobb 'n' értékénél).
Mivel a kódban szereplő ciklusszerkezet a gyakorlatban sokszor előfordul, a JavaScript nyelvben rendelkezésre áll ennek egy tömörebb formája, az ún. rögzített lépésszámú ciklus. Ezzel az algoritmus a következőképpen írható le:
// az első 'n' szám kiíratása (második változat) var n=10; for(var i=1;i<=n;i=i+1) { writeln(i); } writeln("_____________");A 'for' ciklus fejrésze "magába olvasztotta" az előző program var i=1; és i=i+1; utasításait, amelyeket a ciklusfeltétel előtt és után adunk meg. Bár két sor megtakarítása nem tűnik soknak, "sok kicsi sokra megy", és a tömörebb írásmód összetettebb programok esetén áttekinthetőbb programkódot eredményezhet. (Az i=i+1; utasítást rövidíthetjük i++; módon.)
Algoritmusok a számrendszerek köréből
Az alábbiakban konkrét algoritmusokat mutatunk be a számrendszerek köréből. A következő algoritmusokkal fogunk foglalkozni:
- bináris szám átalakítása decimális számmá⇒
- egész szám átváltása
- kettedestört formájában adott törtszám átváltása⇒
- hexadecimális szám átalakítása decimális számmá⇒
- decimális szám átalakítása bináris számmá⇒
- bináris szám átalakítása hexadecimális számmá⇒
- hexadecimális szám átalakítása bináris számmá⇒
- decimális szám átalakítása hexadecimális számmá⇒
- végtelen szakaszos tizedes tört átalakítása racionális törtszámmá⇒
- két egész szám legnagyobb közös osztójának meghatározása (euklideszi algoritmus)⇒
- alapműveletek kettes számrendszerben⇒
- számábrázolás⇒
Az algoritmusok végrehajtását interaktív feladatok megoldásával is gyakorolhatjuk.⇒
Egyes algoritmusok leírását a legtöbb esetben rövid JavaScript programokkal is bemutatjuk. A példák kipróbálásához felhasználható online JavaScript interpreter:
Online JavaScript Interpreter by Peter Jipsen, Chapman University (January 2013).
http://math.chapman.edu/~jipsen/js/ (2020-11-19)Megjegyzés: Ha a fenti link valamilyen oknál fogva nem működik, használjuk az alábbi linket.
A JavaScript programok folyamatábráját megjeleníthetjük az alábbi webes alkalmazás segítségével:
Live code editor. Created by Bogdan Lyashenko.
https://bogdan-lyashenko.github.io/js-code-to-svg-flowchart/docs/live-editor/index.html (2022-10-02)A folyamatábra a 'for' ciklust nem megfelelően ábrázolja, ezért érdemes ezeket mindig átírni 'while' ciklusra, mielőtt megjelenítenénk a program folyamatábráját.
A homeosztát olyan rendszer, amely bizonyos paraméterek között próbálja tartani a rendszer állapotát.(Pléh 1998: 38-39)
Általánosan egy 'b' alapszámú számrendszerben a számok a következő formában írhatók le ("ábrázolhatóak"):
A képletben
Például legyen az ábrázolt szám 314 a tízes számrendszerben (ezt 31410 módon jelölhetjük, ha egyszerre több számrendszerrel is dolgozunk). A fenti képlet alapján a számot
31410 = 3*102+2*101+4*100
= 300+20+4
formában írhatjuk fel.
Egy másik példaként legyen az ábrázolt szám 2.718 a tízes számrendszerben. A fenti képlet alapján a számot
2.71810 = 2*100+7*10−1+1*10−2+8*10−3
= 2+7/10+1/100+8/1000
formában írhatjuk fel.
Az alábbiakban a számrendszerek közötti átváltást öt típusfeladat segítségével gyakorolhatjuk:
16 | = | 0 | = | 0 | = | 10 |
---|
16 | = | 0 | = | 0 | = | 10 |
---|
2 | = | 0 |
---|---|---|
0 | ||
0 | ||
0 | ||
0 | ||
10 |
Egy adott számrendszerbeli számot átválthatunk decimális számmá az ún. Horner-elrendezést használva is. Legyen például 111001102 az átváltandó szám.
1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|
2 | 1 | 2*1+1=3 | 2*3+1=7 | 2*7+0=14 | 2*14+0=28 | 2*28+1=57 | 2*57+1=115 | 2*115+0=230 |
A Horner-táblázat felépítése:
– a táblázat két sorból áll;
– a táblázat első sora a második cellától kezdve az átváltandó szám számjegyeit tartalmazza;
– a táblázat második sorának első cellájába az átváltandó szám számrendszerének alapja kerül;
– a táblázat második sorának második cellájába a felette levő számjegyet másoljuk be.
Az algoritmus lényege, hogy
– a táblázatban balról jobbra haladva és
– a második sor harmadik cellájától kezdve egymás után kitöltjük a táblázat második sorának celláit.
Az egyes cellák értékét úgy számítjuk ki, hogy
– az előző cella értékét (pl. 1) szorozzuk a számrendszer alapjával (pl. 2-vel) és
– a szorzathoz hozzáadjuk a cella felett (az első sorban) levő cellában levő számjegyet (pl. 1-et).
Az első sorban ábrázolt, megadott számrendszerbeli szám tízes számrendszerbeli értékét a második sor utolsó (jobb szélső) cellájának értéke adja.
Próbáljuk ki egy tetszőleges (2-16 alapú) számrendszerbeli, max. 8 számjegyből álló szám megadásával a Horner-elrendezést:
A számrendszerbeli szám:
1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|
2 | 1 | 3 | 7 | 14 | 28 | 57 | 115 | 230 |
Egy decimális szám kettes számrendszerbeli alakját megkaphatjuk úgy, hogy
(1) a számot elosztjuk 2-vel, és leírjuk az osztás eredményeként kapott hányadost és maradékot;
(2) a leírt hányadost elosztjuk 2-vel, és ismét leírjuk az osztás eredményeként kapott hányadost és maradékot;
(3) és ezt addig folytatjuk, míg a hányados értéke 0 nem lesz.
A kettes számrendszerbeli alakot a kapott maradékok szolgáltatják, fordított sorrendben felírva (azaz az utoljára kapott maradék lesz a kettes számrendszerbeli szám legmagasabb helyi értékű számjegye).
hányados | osztás | maradék |
---|---|---|
átváltandó decimális szám:
bináris helyi érték és számjegy hexadecimális érték | összeg | |||||||||||
2048 | 1024 | 512 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | |
256 | 16 | 1 |
(1) a hexadecimális számrendszer számjegyei
hexadecimális számjegy |
---|
decimális érték |
bináris érték |
(2) 2 hatványai
hatvány | érték |
---|
(3) 16 hatványai
hatvány | érték |
---|
további információk:
Számrendszer - Wikipédia. (2021-02-21)
Számrendszerek az informatikában - Wikipédia. (2021-02-21)