Programozás 1. Dr. Iványi Péter 1
C nyelv B.W. Kernighan és D.M. Ritchie, 1978 The C Programming language 2
C nyelv Amerikai Szabványügy Hivatal (ANSI), 1983 X3J11 bizottság a C nyelv szabványosítására 1989, ANSI X3.159-1989 a végleges szabvány Az addigi programok lefordíthatóak legyenek A C forráskód hordozható legyen Nem hordozható, rendszerfüggő részek C nyelv szellemisége" 3
C nyelv 4
C nyelv szellemisége Kernigan és Ritchie A C nyelv azt a filozófiát követi, hogy a programozó tudja mit csinál, csak explicit módon fogalmazza meg mit akar. Kicsi, de egyszerű nyelv Egy dolgot csak egyféle képpen lehessen végrehajtani 5
C++ Bjarne Stroustrup, Bell Laboratórium Első implementáció, 1983 Ötletek: Simula67: osztályok, származtatott osztályok Algol68: operátor kiterjesztés Ada: templétek Egyéb Minden C program lefordítható C++-ban, de nem biztos hogy ugyanaz a tárgykód lesz. 6
C nyelv ISO 9899:1999 melyet C99-es szabványnak is nevezünk Változók bárhol definiálhatók Új adattípusok, pl. long long int, boolean, complex Változó hosszúságú tömbök Egy soros megjegyzés bevezetése Új könyvtári függvények Makrók javítása Bizonyos értelemben szigorúbb is lett 7
Alacsony szintű nyelv Típusok C nyelv jellemzői Karakterek, egész és lebegőpontos számok különböző formái Származtatott típusok Mutatók, címaritmetika Tartalmazza a struktúrális programozás vezérlőszerkezeteit 8
C nyelv jellemzői Függvények visszatérési értéke, valamelyik típus Bármely függvény rekurzíven hívható Függvénydefiníciók nem ágyazhatók egymásba Explicit memória kezelés, nincs garbage collection Adatbevitel és kivitel nem a nyelv része hanem standard könyvtár tartalmazza A programot le kell fordítani!!! 9
Alapismeretek Egy program készítése, mely kinyomtatja: Hello World! 10
Hello World 1. #include <stdio.h> void main() { printf( Hello World!\n ); } 11
Fordítás programozó szövegszerkesztő forrás modul hello.c 12
Fordítás Előfeldolgozó program Elvégzi a szöveghelyettesítéseket Kifejti a makrókat forrás modul forrás könyvtár előfeldolgozó program hello (belső reprezentáció) előfeldolgozó forrás 13
Fordító (compiler) Fordítás Elemzi a magas szintű nyelv utasításait (gépfüggetlen) Kódot generál (függ a processzor utasításaitól) előfeldolgozó forrás fordító tárgy kód hello.o 14
Fordítás Összefűző-szerkesztő program Feloldja a kereszthivatkozásokat hello.o tárgy kód összefűzőszerkesztő program futtatható program libc.lib libc.dll... modul könyvtár hello.exe 15
C program Bármennyi SPACE karakter vagy üres sor lehet a programban A C program függvényekből és változókból áll A függvény utasításokat tartalmaz main függvény speciális a program futása mindig itt kezdődik!!! Minden programban kell legyen main függvény 16
Üres program main() { } Nem csinál semmit és csak az alap utasításokat lehet használni. Kapcsos zárójelek közé kell tenni egy utasításblokkot. 17
Argumentumok Függvények közötti kommunikáció a hívó függvény adatokat ad át a hívott függvénynek Adatok argumentumok A függvény neve után zárójelek között szerepel Nincs argumentum ha üres, például main() 18
Függvénykönyvtár Fordítóprogramot értesítjük, hogy mely függvényekre lesz szükségünk: #include <stdio.h> stdio.h A file definiálja az egyes bemeneti és kimeneti függvényeket..h kiterjesztés (head=fej), fejléc vagy header file 19
Utasítások A függvény utasításait a kapcsos zárójelek közé kell tenni. Például: printf( Hello World!\n ); A függvényt a nevével és az azt követő argumentum listával kell meghívni. printf : függvény neve Hello World!\n : argumentum Pontosvesszővel zárjuk az utasításokat, függvényhívásokat!!! 20
Szöveg Karakterlánc, szöveg, sztring, string Idézőjelek közötti karakterek Állandó, konstans Nem módosítható közvetlenül Speciális karakter: \n : új sor karakter, egy sort emel printf csak azt nyomtatja amit megadtunk 21
Hello World 2. #include <stdio.h> void main() { printf( Hello ); printf( World! ); printf( \n ); } 22
Mejegyzések, leírások /* ide kerül a megjegyzés */ Bármi tehető a két jel közé. C++ megjegyzés: // Csak egy sornyi megjegyzés Ha lehet ne használjuk még, majd ha C++ -t tanulunk 23
Hello World 3. #include <stdio.h> void main() { /* kiiratás */ printf( Hello ); printf( World! ); printf( \n ); } 24
Változók Adat: Valamely tény vagy fogalom olyan egyezményesen ábrázolt alakja, amely alkalmas arra, hogy emberek vagy automatikus eszközök továbbítsák, értelmezzék vagy feldolgozzák. Információ: Az adat jelentése. Típus: értelmezési tartomány. 25
Adattípusok A memória byte-okra oszlik. A memóriabeli objektumok egy vagy több byteot foglalnak el. Minden byte 8 bitből áll. Az értékeket a bitek mintája határozza meg. A bit minta értelmezése függ az adat típusától. 26
Adattípusok Definíció char int float double Byte 1 2 4 8 Értelmezés Karakter Egész szám Valós szám, egyszeres pontosság Valós szám, kétszeres pontosság 27
Változók MINDEN változó típusát definiálni kell és nem lehet menet közben változtatni!!! típus név ; Név: Karakterek Számok Aláhúzás karakter, _ Kis-és nagybetű különböző!!! Blokk elején, kapcsos zárójel után áll!!! 28
Változók példa void main() { int a; int b, c; a = 1; b = 3; c = a+b; } 29
Beszédes változó nevek void main() { int ho, nap; float testsuly; double fizetes; }... 30
Nem használható nevek asm, auto, break, case, catch, char, class, const, continue, default, do, double, else, enum, extern, float, for, goto, if, inline, int, long, register, return, short, signed, sizeof, static, struct, void, volatile, while,... 31
Rossz példa void main() { int a; a = 1; } int b, c; b = 3; c = a+b; 32
Utasítás blokk void main() { int a; a = 1; { int b, c; b = 3; c = a+b; } } 33
Értékadás Változók értékének beállítása: a = 1; Pontosvesszővel zárjuk le Lehet többet is felsorolni: a = b = 1; 34
short: rövid Minösítő szimbólumok long: hosszú unsigned: előjel nélküli Például: long double : 10 byte-ban van reprezentálva 35
Típusok char signed char unsigned char int long int short int unsigned int unsigned long int 36
Értelmezése tartományok, 32 bit típus char unsigned char int unsigned int long int unsigned long float double long double alsó határ -128 0-32 768 0-2 147 483 648 0 3.4E -38 1.7E -308 1.2E -4932 felső határ +127 255 32 767 65 535 2 147 483 647 4 294 967 295 3.4E + 38 1.7E + 308 1.2E + 4932 37
Változó típusa A változó típusának mindig azt a legkisebb típust választjuk, amelyik az adott feladatot problémamentesen megoldja. int ev = 2008; float testsuly=71.1; double fizetes = 40500.5; 38
Konstansok Karakter: a Egész szám: 231, -123 Oktális: 034 Hexadecimális: 0x1f Long: 134L Lebegőpontos: 0.34, -0.34, 1.5e-2 Egész vagy tört rész elhagyható, de csak az egyik pont vagy e,e elhagyható de csak az egyik Sztring: szoveg 39
Ellenőrzés Mi a különbség? 7 7 7 40
Ellenőrzés, melyik helyes -236-5000 0.0567e-7 5,67 1/3 3,456.83 0. Helyes Helyes Helyes Hibás Hibás Hibás Helyes.15 Helyes 41
Kiíratás még egyszer printf(<formátum>, [argumentumok]); formátum: egy szöveg, formátum karakterekkel A formátum karakterek helyére az argumentumok értékét írja ki Formátum karakterek száma = argumentumok száma!!! Formátum karakter típusa argument típusa Argumentumokat vesszővel választjuk el. 42
Formátum karakterek formátum karakter %d %x %o %f %lf %c %s típus integer hexadecimális szám oktális szám float double karakter sztring 43
Mezőszélesség %nd : n számjegy szélességben írja ki az egész számot %6d 123 %+d : előjelet mindig jelezze %x.yf : hány egész és hány tizedes jegyet írjon ki x : teljes szélesség y : tizedesek száma %8.2 123.45 44
#include <stdio.h> Adattípusok kiíratása 1. void main() { int a; int b, c; a = 1; b = 3; c = a+b; printf( Két szám összege: %d + %d = %d\n, a, b, c); } 45
Adattípusok kiíratása 2. #include <stdio.h> void main() { int a; int b; a = 1; b = 3; printf( Két szám összege: %d + %d = %d\n, a, b, a+b); } 46
Adattípusok kiíratása 3. #include <stdio.h> void main() { printf( Értékek: %d %lf %s\n, 11, 23.45, hello ); } 47
Speciális karakterek Alakja \ \\ \n \r \t \b \0 \10 \x1f Jelentése idézőjel backslash új sor carriage return tabulátor visszatörlés nullás karakter oktális szám hexadecimális szám 48
Példa1. Hogyan nyomtassuk ki: > Nevem Peter >Hello #include <stdio.h> void main() { printf( Nevem \ Peter\ \nhello ); } 49
Példa2. Hogyan nyomtassuk ki: > c:\windows\win32 > #include <stdio.h> void main() { printf( c:\\windows\\win32\n ); } 50
Beolvasás scanf(<formátum>, [változók címei]); A bemenetről karaktereket olvas be és a formátumban megadott specifikáció szerint értelmezi azokat, majd az eredményt eltárolja a változókban. Például: scanf( %f, &szam); 51
Változók címe A beolvasott értékeket a változókban akarjuk tárolni, így a változó címét kell megadni. A változó címét a változó neve elé írt & karakter segítségével tudjuk előállítani. 52
Példa int x, y, z; scanf("%d,%d,%d", &x, &y, &z); Beolvasás: 2,3,4 <ENTER> 53
Kezdjék átolvasni a fejezeteket Kernighan-Ritchie: A C programozási nyelv 1.1. 1.3. Alfejezetek 3. Fejezet Benkő Tiborné: Programozzunk C nyelven! 3.1. 3.2. Alfejezetek 3.5. Alfejezet 54
Ellenőrző kérdések Mit jelent a változók deklarálása? Mit ad meg a változó típusa? Mire ügyeljünk a C nyelvben használt változók elnevezésénél? Miért nem lehet változónévként használni az alábbi szavakat: break, void. Milyen konstansokat használhatunk a C nyelvben? Hogyan lehet ezeket deklarálni? Miben különbözik a 'w' és a "w" konstans? Az A betű (nagy A) kódja 65. Azonosak-e az alábbi konstansok: 65, 'A', 0101, 0x41 Írja fel az alábbi számokat lebegőpontos konstansként: 0,157-1 56000 65,897 Milyen típusú konstansokat használunk a C nyelvben? Írjon fel mindegyikre egyegy példát. Az alábbi felsorolásban melyek karakter konstansok: 'a', b, "c", 89, "89", '8' Mi a stringliterál? Írjon fel egy példát. 55
Ellenőrző kérdések Mire szolgál a formátumstring a printf és a scanf függvényeknél? Az argumentumlistában szerepelhetnek-e konstansok? Mi a hatása a printf függvény formátum-stringjében elhelyezett \n escape szekvenciának? Adjon meg három escape szekvenciát, melyet a printf utasítás formátumstringjében gyakran használhatunk. A printf függvény hívásának általános formája. Mi történik, ha a scanf utasításban az argumentumlista elemeinél a változónevek elé nem tesszük ki a & operátort? 56