Informatika2-2013/Eloadas

A MathWikiből
(Változatok közti eltérés)
49. sor: 49. sor:
  
 
A C programozási nyelv egy általános célú nyelv, melyet eredetileg Dennis Ritchie fejlesztett az AT&T Bell laboratóriumában 1969-1973 között. A nyelv néhány tulajdonsága:
 
A C programozási nyelv egy általános célú nyelv, melyet eredetileg Dennis Ritchie fejlesztett az AT&T Bell laboratóriumában 1969-1973 között. A nyelv néhány tulajdonsága:
 +
* Gépi kódra fordul
 +
* Hordozható
 +
* Hatékony programok írására alkalmas
 +
* Egyszerű nyelv, tömör szintaktika
 +
* Előfeldolgozó
 +
* Szabványos könyvtári függvények
 +
* Nagyon sok nyelv "alapja"
 +
 +
A nyelv lényeges részei, melyekről részletesebben lesz szó:
 +
* Adatok (változók, konstansok)
 +
* Adattípusok
 +
* Operátorok
 +
* Vezérlő struktúrák
 +
* Kulcsszavak
 +
* Paraméterek, argumentumok
 +
* Láthatóság
 +
* Kifejezések
 +
* Függvények, függvény könyvtárak
 +
* Pointerek
 +
* Struktúrák
 +
 +
===Kódolás, fordítás a gyakorlatban===
 +
==== Forráskód ====
 +
A nyelv elemeinek részletes elemzése előtt érdemes tanulmányozni a népszerű "Hello World!" program C-ben írt forráskódját:
 +
<source lang="c">
 +
#include <stdio.h>
 +
 +
int main(void)
 +
{
 +
  printf("Hello world!\n");
 +
  return 0;
 +
}
 +
</source>
 +
 +
A program első sora egy <code>#include</code> utasítás, hatására az előfeldolgozó (preprocesszor) erre a helyre bemásolja a megnevezett állomány tartalmát. Ebben az esetben ez a stdio.h állomány. A hegyes zárójel (kisebb, nagyobb jel, „kacsacsőr”) arra utal, hogy az stdio.h állomány a fordító részére megadott ún. „include path” által definiált helyen van.
 +
 +
A következő nem üres sor a „main” függvény definíciója. A main függvény egy speciális függvény a C programokban, amely a program indításakor legelőször hívódik meg.
 +
Az „int” megadja, hogy a „main” függvény egy [[integer]] (egész szám) típusú adatot ad vissza. A „void” azt jelenti, hogy a függvény nem vár paramétereket vagy adatokat az őt meghívó rutintól.
 +
A kapcsos zárójel a függvény törzsének kezdetét jelzi.
 +
 +
A következő sor „meghívja”, vagy futtatja a <code>printf</code> függvényt. Az „include”-olt állomány, a stdio.h tartalmazza a printf függvény meghívásának leírását („prototípusát”, „deklarációját”). Ebben az esetben, a printf függvényt mindössze egyetlen paraméterrel hívjuk meg, mégpedig egy fix szöveggel („string literal”): <code>„Helló, világ!\n”</code>. A <code>\n</code> új sort jelent. A <code>printf</code> függvény ugyan ad vissza értéket (a kiírt karakterek számát), de ez jelen esetben nem érdekel minket, ezért nem is foglalkozunk vele.
 +
 +
A <code>return</code> utasítás jelenti a kilépést az aktuális függvényből (ami ebben az esetben a main), és megadja a hívónak visszaadandó értéket (esetünkben nullát, ami a program hibátlan lefutását jelzi). (Mivel ebben az esetben az aktuális függvény a <code>main</code>, a hívó maga a programbetöltő program, pontosabban egy olyan speciális könyvtári függvény (tipikus neve: <code>_init</code>), amivel a felhasználói programozónak általában nem kell foglalkoznia). Végül a záró kapcsos zárójellel jelezzük a „main” függvénytörzs végét.

A lap 2013. február 17., 12:43-kori változata

Tartalomjegyzék

Bevezetés

Gyakran egy matematikai probléma megoldását, vagy a megoldás egy lépését számítógép segítségével határozhatjuk meg. A probléma megfogalmazása után először a megoldáshoz vezető algoritmust kell megadnunk. Ezután következik az algoritmus implementálása, beprogramozása a számítógépbe.

Algoritmusok

Az algoritmusnak nincs egységesen elfogadott definíciója, így az alábbi megfogalmazás sem definícióként értendő.

Algoritmus: (Cormen, T., Leiserson, C. E., Rivest, R. L., Stein, C. Introduction to Algorithms) Bármely jól meghatározott számítási eljárás, amelynek bemenete egy bizonyos érték vagy értékhalmaz, és amely létrehoz valamilyen értéket vagy értékhalmazt kimenetként.

Egy algoritmust sokféleképp jellemezhetünk. Knuth könyvében az alábbi, 5 fontos tulajdonságot emeli ki: (Knuth, D. E. - The Art of Computer Programming)

  • Végesség: Az algoritmus véges sok lépés után befejeződik.
  • Meghatározottság: Az algoritmus minden lépése pontosan definiált.
  • Bemenet (Input): Az algoritmus igényelhet olyan értékhalmazt (adatokat), amiket elindítása előtt meg kell adnunk.
  • Kimenet (Output): Az algoritmushoz tartozhat olyan kimeneti értékhalmaz, mely meghatározott kapcsolatban van a bemenettel.
  • Elvégezhetőség: Elvárjuk, hogy az algoritmust végre lehessen hajtani

Számítási módszernek nevezünk egy olyan eljárást, mely a végességet leszámítva teljesíti a fenti feltételeket.

Egy példa algoritmusra - Euklideszi algoritmus:

  • A feladat: Adott két pozitív egész szám, m és n, keresendő legnagyobb közös osztójuk.
  • Az Euklideszi algoritmus lépései:
    • E0 Ha m < n , akkor cseréljük meg a két számot:  m \leftrightarrow n
    • E1 Osszuk el m-et n-nel, legyen a maradék r.
    • E2 Ha r = 0, akkor az algoritmus véget ért, az eredmény n.
    • E3 Legyen  m \leftarrow n és  n \leftarrow r és menjünk vissza E1 lépésre.

Programozás, programozási nyelvek

Célunk algoritmusok beprogramozása a számítógépbe. Ehhez először a számítógép fogalmát kell megértenünk. A mai számítógépek Neumann János 1946-ban kidolgozott elvei szerint működnek. Felépítésük az ún. Neumann és Harvard architektúrák felépítését követi. Leegyszerűsített felépítésük a következő:

  • Processzor (CPU): beolvassa a memóriából az utasításokat és az adatokat, az utasítások alapján műveleteket végez, az eredményt visszaírja a memóriába; valamint vezérli a perifériákat - adatokat olvas belőlük, és ír ki
  • Memória: általános tároló, mely utasításokat és adatokat tartalmaz
  • Perifériák: háttértárolók, beviteli eszközök, monitor, ...

Egy algoritmust programozási nyelv használatával adjuk meg a számítógépnek.

  • Egy programozási nyelvvel képesek vagyunk vezérelni, utasítások sorozatát előírni a számítógép processzorának.
  • Az egyes nyelvek között compiler-ek fordítják át az utasításokat.
  • Gépi kódnak nevezzük azon nyelvet, mellyel a számítógép processzora közvetlenül vezérelhető.

Egy algoritmus programozásakor a választott programozási nyelvvel képesnek kell lennünk:

  • az algoritmus álltal használt adatok tárolására/kezelésére.
  • az algoritmus utasítás sorozatának megadására.

Példák programozási nyelvekre: Assembly, C, C++, Java, Python, ...

A C programozási nyelv

Bevezetés

A C programozási nyelv egy általános célú nyelv, melyet eredetileg Dennis Ritchie fejlesztett az AT&T Bell laboratóriumában 1969-1973 között. A nyelv néhány tulajdonsága:

  • Gépi kódra fordul
  • Hordozható
  • Hatékony programok írására alkalmas
  • Egyszerű nyelv, tömör szintaktika
  • Előfeldolgozó
  • Szabványos könyvtári függvények
  • Nagyon sok nyelv "alapja"

A nyelv lényeges részei, melyekről részletesebben lesz szó:

  • Adatok (változók, konstansok)
  • Adattípusok
  • Operátorok
  • Vezérlő struktúrák
  • Kulcsszavak
  • Paraméterek, argumentumok
  • Láthatóság
  • Kifejezések
  • Függvények, függvény könyvtárak
  • Pointerek
  • Struktúrák

Kódolás, fordítás a gyakorlatban

Forráskód

A nyelv elemeinek részletes elemzése előtt érdemes tanulmányozni a népszerű "Hello World!" program C-ben írt forráskódját:

<source lang="c">

  1. include <stdio.h>

int main(void) {

  printf("Hello world!\n");
  return 0;

} </source>

A program első sora egy #include utasítás, hatására az előfeldolgozó (preprocesszor) erre a helyre bemásolja a megnevezett állomány tartalmát. Ebben az esetben ez a stdio.h állomány. A hegyes zárójel (kisebb, nagyobb jel, „kacsacsőr”) arra utal, hogy az stdio.h állomány a fordító részére megadott ún. „include path” által definiált helyen van.

A következő nem üres sor a „main” függvény definíciója. A main függvény egy speciális függvény a C programokban, amely a program indításakor legelőször hívódik meg. Az „int” megadja, hogy a „main” függvény egy integer (egész szám) típusú adatot ad vissza. A „void” azt jelenti, hogy a függvény nem vár paramétereket vagy adatokat az őt meghívó rutintól. A kapcsos zárójel a függvény törzsének kezdetét jelzi.

A következő sor „meghívja”, vagy futtatja a printf függvényt. Az „include”-olt állomány, a stdio.h tartalmazza a printf függvény meghívásának leírását („prototípusát”, „deklarációját”). Ebben az esetben, a printf függvényt mindössze egyetlen paraméterrel hívjuk meg, mégpedig egy fix szöveggel („string literal”): „Helló, világ!\n”. A \n új sort jelent. A printf függvény ugyan ad vissza értéket (a kiírt karakterek számát), de ez jelen esetben nem érdekel minket, ezért nem is foglalkozunk vele.

A return utasítás jelenti a kilépést az aktuális függvényből (ami ebben az esetben a main), és megadja a hívónak visszaadandó értéket (esetünkben nullát, ami a program hibátlan lefutását jelzi). (Mivel ebben az esetben az aktuális függvény a main, a hívó maga a programbetöltő program, pontosabban egy olyan speciális könyvtári függvény (tipikus neve: _init), amivel a felhasználói programozónak általában nem kell foglalkoznia). Végül a záró kapcsos zárójellel jelezzük a „main” függvénytörzs végét.

Személyes eszközök