Programozás (NGB_SZ019_1)
Programozás villamosmérnököknek (NGB_SZ002_1)
Takács Gábor
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 I
A számítógép legfontosabb logikai alkotóelemei a processzor, a memória és a perifériák.
I
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.
I
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
I
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).
I
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 4
8b 04 25 90 08 60 00 # másolás a 600890 memóriacímről # az eax regiszterbe
5 6 7
8b 1c 25 94 08 60 00 # másolás a 600894 memóriacímről # az ebx regiszterbe
8 9 10
01 c3
# eax és ebx értékének összeadása, # és az eredmény beírása ebx-be
11 12 13 14
89 1c 25 98 08 60 00 # ebx tartalmának másolása # a 600898 memóriacímre ...
4 / 92
Programozási alapfogalmak
I
Algoritmus: Valamely probléma megoldására alkalmas véges hosszú lépéssorozat.
I
Adatszerkezet: Adatelemek tárolására, rendszerezésére és hatékony használatára szolgáló séma (példa: tömb).
I
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.
I
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 I
Bemenet: forraló, csésze, teafilter, cukor
I
Kimenet: egy csésze tea Lépések:
I
1. Önts vizet a forralóba! 2. Kapcsold be a forralót! 3. Forr már a víz? I I
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? I
Ha igen, akkor tegyél bele!
6 / 92
vs. „keyboard monkey”
„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. I
A C nyelv közvetlen elődje a BCPL (1966) és a B (1969).
I
1969: Ritchie és Thompson elkezdenek dolgozni a nyelven.
I
1973: A UNIX rendszermagját újraírják C-ben.
I
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 I
Általános célú programozási nyelv.
I
Kevés nyelvi elem és tömör utasításformák jellemzik.
I
Megtalálhatók benne a strukturált programozáshoz szükséges vezérlési szerkezetek.
I
Alacsony szintű, ezért nagy hatékonyságú programok készíthetők benne és hardverprogramozásra is alkalmas.
I
Nem korlátozza a programozó szabadságát.
„C is quirky, flawed, and an enormous success.”
10 / 92
Prominens alkalmazások I
C: - operációs rendszer kernelek (pl. Windows, OS X, Linux, Android, iOS) - rengeteg eszközmeghajtó és beágyazott szoftver - CPython, PostgreSQL - ...
I
C/C++: -
Chrome, Firefox, Internet Explorer MS Office, Photoshop, Acrobat, VLC HotSpot JVM, Oracle Database, MySQL ...
11 / 92
C fordítók I
GCC: GNU Compiler Collection. Tartalmaz C, C++, Objective-C, Fortran, Java, Ada valamint Go fordítót.
I
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.
I
Visual C++: A Microsoft integrált fejlesztői környezete, amely C és C++ fordítót is tartalmaz.
I
Intel C++: Az Intel C és C++ fordítója, amely Intel processzorokra optimalizált kódot készít.
I
... 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. I
K&R C (Kernighan és Ritchie 1978-as könyve alapján)
I
ANSI C (ANSI X3.159-1989 szabvány)
I
C90 (ISO/IEC 9899:1990 szabvány)
I
C99 (ISO/IEC 9899:1999 szabvány)
I
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 I
Nehézsúlyú: -
I
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 I
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.
I
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 2 3 4 5
#include <stdio.h> int main() { printf("Hello, World!\n"); return 0; } hello.c
I
#include <stdio.h>: Lehetővé teszi a printf kiíró függvény használatát.
I
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.
I
printf("Hello, World!\n");: Kiírja a standard kimenetre a „Hello, World!” szöveget valamint egy újsor karaktert.
I
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
I 1
clang hello.o -o hello
Az összes fázis futtatása: clang hello.c -o hello
17 / 92
18 / 92
Azonosítók I
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.
I
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: I
signed, unsigned (egész típusokhoz)
I
short, long (egész típusokhoz + long double)
20 / 92
Egyszerű adattípusok Az adattípusok méretének feltérképezése: 1 2 3 4 5 6 7 8 9 10
#include <stdio.h> int main() { printf("char: %d\n", sizeof(char)); printf("short: %d\n", sizeof(short)); printf("int: %d\n", sizeof(int)); printf("long: %d\n", sizeof(long)); printf("float: %d\n", sizeof(float)); printf("double: %d\n", sizeof(double)); return 0; }
21 / 92