Programozás (NGB_SZ019_1) Programozás villamosmérnököknek (NGB_SZ002_1) Takács Gábor <gtakacs@sze.hu> Széchenyi István Egyetem Matematika és Számítástudomány Tanszék 1 / 92
A számítógép felépítése A számítógép legfontosabb logikai alkotóelemei a processzor, a memória és a perifériák. A processzor utasításokat és adatokat olvas be a memóriából, végrehajtja az utasításokat az adatokon, és esetenként az eredményt visszaírja a memóriába. A perifériák (pl. háttértár, billentyűzet, képernyő) kibővítik a számítógép képességeit, és lehetővé teszik a külvilággal való kommunikációt. 2 / 92
A memória A számítógép memóriája címezhető memóriaelemekből (rekeszekből) tevődik össze. A memóriaelemek mérete a legtöbb mai számítógépben 1 bájt (= 8 bit). A memóriacímeket és a memóriatartalmat általában hexadecimális formában szokás megadni (pl. mondhatunk olyat, hogy a 4b00 címen található érték 1f). 3 / 92
Milyen nyelven ért a számítógép? 1... 2 3 8b 04 25 90 08 60 00 # másolás a 600890 memóriacímről 4 # az eax regiszterbe 5 6 8b 1c 25 94 08 60 00 # másolás a 600894 memóriacímről 7 # az ebx regiszterbe 8 9 01 c3 # eax és ebx értékének összeadása, 10 # és az eredmény beírása ebx-be 11 12 89 1c 25 98 08 60 00 # ebx tartalmának másolása 13 # a 600898 memóriacímre 14... 4 / 92
Programozási alapfogalmak Algoritmus: Valamely probléma megoldására alkalmas véges hosszú lépéssorozat. Adatszerkezet: Adatelemek tárolására, rendszerezésére és hatékony használatára szolgáló séma (példa: tömb). Programozási nyelv: Szigorú szabályokra épülő nyelv, melynek segítségével az ember képes a számítógép felé kommunikálni az utasításait. Programozás: Algoritmusok és adatszerkezetek megtervezése illetve megvalósításuk valamilyen programozási nyelven (kódolás). 5 / 92
A teafőzés algoritmusa Bemenet: forraló, csésze, teafilter, cukor Kimenet: egy csésze tea Lépések: 1. Önts vizet a forralóba! 2. Kapcsold be a forralót! 3. Forr már a víz? Ha nem, akkor várj 1 percet, és folytasd a 3. lépéstől! Ha igen, akkor folytasd a 4. lépéstől! 4. Töltsd meg a csészét forró vízzel! 5. Tedd bele a teafiltert! 6. Kérsz hozzá cukrot? Ha igen, akkor tegyél bele! 6 / 92
keyboard monkey vs. igazi programozó 7 / 92
A C nyelv története A kezdeti fejlesztések az AT&T Bell Laboratóriumában történtek. A nyelv története szorosan kapcsolódik a UNIX operációs rendszer történetéhez. A C nyelv közvetlen elődje a BCPL (1966) és a B (1969). 1969: Ritchie és Thompson elkezdenek dolgozni a nyelven. 1973: A UNIX rendszermagját újraírják C-ben. 1978: Megjelenik Kernighan és Ritchie C bibliája. 8 / 92
Dennis Ritchie (jobbra) és Ken Thompson, a C nyelv megalkotói. 9 / 92
A C nyelv jellemzői Általános célú programozási nyelv. Kevés nyelvi elem és tömör utasításformák jellemzik. Megtalálhatók benne a strukturált programozáshoz szükséges vezérlési szerkezetek. Alacsony szintű, ezért nagy hatékonyságú programok készíthetők benne és hardverprogramozásra is alkalmas. Nem korlátozza a programozó szabadságát. C is quirky, flawed, and an enormous success. 10 / 92
Prominens alkalmazások C: - operációs rendszer kernelek (pl. Windows, OS X, Linux, Android, ios) - rengeteg eszközmeghajtó és beágyazott szoftver - CPython, PostgreSQL -... C/C++: - Chrome, Firefox, Internet Explorer - MS Office, Photoshop, Acrobat, VLC - HotSpot JVM, Oracle Database, MySQL -... 11 / 92
C fordítók GCC: GNU Compiler Collection. Tartalmaz C, C++, Objective-C, Fortran, Java, Ada valamint Go fordítót. Clang: Az LLVM projekt C, C++, Objective-C és Objective C++ fordítója. A GCC-nél kevésbé elterjedt, de felhasználóbarátabbak a hibaüzenetei. Visual C++: A Microsoft integrált fejlesztői környezete, amely C és C++ fordítót is tartalmaz. Intel C++: Az Intel C és C++ fordítója, amely Intel processzorokra optimalizált kódot készít.... A kurzus során Clanget fogunk használni. 12 / 92
Szabványos C Kezdetben annyiféle C nyelv létezett, ahány C fordító. Idővel megkezdődött a nyelv szabványosítása. K&R C (Kernighan és Ritchie 1978-as könyve alapján) ANSI C (ANSI X3.159-1989 szabvány) C90 (ISO/IEC 9899:1990 szabvány) C99 (ISO/IEC 9899:1999 szabvány) C11 (ISO/IEC 9899:2011 szabvány) A kurzus során ANSI C-t fogunk használni, néhány C99 kiterjesztéssel. 1 1 Pl. egysoros komment, nem blokk eleji változódeklaráció. 13 / 92
Fejlesztőkörnyezetek Nehézsúlyú: - Visual Studio - NetBeans - Eclipse - Code::Blocks -... Könnyűsúlyú: - Emacs - Vim - SciTE - Notepad++ -... A kurzus során Code::Blocks-ot fogunk használni. 14 / 92
Telepítés Linux alatt a Clang és a Code::Blocks csomagkezelővel telepíthető. Telepítés után be kell állítani, hogy a Code::Blocks alapértelmezett C fordítója a Clang legyen. Windows alatt a Clang fordítót használó Code::Blocks hivatalos forrásokból történő telepítése meglehetősen bonyolult, ezért készítettem egy egyedi csomagot a kurzus hallgatói számára, amely a www.sze.hu/~gtakacs/oktatas/cprog/codeblocks.zip címen érhető el. Letöltés után a CodeBlocks.zip tartalmát a C meghajtó gyökerébe kell kicsomagolni. (Megjegyzés: GCC-t használó Windows-os Code::Blocks-ot a www.codeblocks.org/downloads/binaries weboldalról szerezhetünk be). 15 / 92
Hello, World! 1 #include <stdio.h> 2 int main() { 3 printf("hello, World!\n"); 4 return 0; 5 } hello.c #include <stdio.h>: Lehetővé teszi a printf kiíró függvény használatát. int main() {: A C nyelvű programok végrehajtása a main függvény elejétől indul. Az int azt jelzi, hogy a függvény egész számot ad vissza. printf("hello, World!\n");: Kiírja a standard kimenetre a Hello, World! szöveget valamint egy újsor karaktert. return 0;: Kilép a programból, 0-ás kilépési kóddal. 16 / 92
Előfeldolgozás Fordítás Linkelés 1. Előfeldolgozás: Forráskódból forráskódot készít. 1 clang -E hello.c > hello_preprocessed.c 2. Fordítás: Forráskódból tárgykódot készít. 1 clang -c hello_preprocessed.c -o hello.o 3. Linkelés: Tárgykódokból futtatható állományt készít. 1 clang hello.o -o hello Az összes fázis futtatása: 1 clang hello.c -o hello 17 / 92
18 / 92
Azonosítók Az azonosítók (állandók, változók, függvények, adattípusok nevei) alfanumerikus karaktereket valamint aláhúzást tartalmazhatnak, és nem kezdődhetnek számjeggyel. - Alfanumerikus karakternek az angol ABC kis és nagybetűi valamint a számjegyek számítanak. - A nagy- és kisbetűk különbözőnek számítanak! - Néhány érvényes azonosító: line1, _getfirst, MAX_SIZE. - Néhány érvénytelen: $foo, 7UP, get-first. A nyelv kulcsszavai nem használhatók azonosítóként. - Az ANSI C kulcsszavak listája: auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void, volatile, while. 19 / 92
Egyszerű adattípusok A C nyelv alapvető adattípusai: char Egyetlen bájt. int Egész szám (mérete architektúrafüggű). float Egyszeres pontosságú lebegőpontos szám. double Kétszeres pontosságú lebegőpontos szám. Típusminősítők: signed, unsigned (egész típusokhoz) short, long (egész típusokhoz + long double) 20 / 92
Egyszerű adattípusok Az adattípusok méretének feltérképezése: 1 #include <stdio.h> 2 int main() { 3 printf("char: %d\n", sizeof(char)); 4 printf("short: %d\n", sizeof(short)); 5 printf("int: %d\n", sizeof(int)); 6 printf("long: %d\n", sizeof(long)); 7 printf("float: %d\n", sizeof(float)); 8 printf("double: %d\n", sizeof(double)); 9 return 0; 10 } 21 / 92