Informatika2-2012/Eloadas01
Tartalomjegyzék |
1. előadás: A C nyelv alapjai
A C nyelv tulajdonságai
A C általános célú magas szintű nyelv (valójában a magasszintű és az alacsonyszintű nyelvek között helyezkedik el), melyet a Unix operációs rendszerhez Dennis Ritchie fejlesztett ki. 1989-ban szabványosítva lett: ANSI C (American National Standards Institute).
- Strukturált nyelv
- Szabványos könyvtári függvények
- Hordozható (a C kód számtalan gépen lefordítható és futtatható)
- Hatékony programok írására alkalmas (a magas szintű nyelvek közül a leghatékonyabbak egyike)
- Egyszerű nyelv, tömör szintaktika
- Előfeldolgozó (makroprocesszor)
A nyelv gyengéi: könnyű nehezen olvasható kódot írni, nehéz a hibák megtalálása, nincs automatikus memóriakezelés, tömbből kiírás veszélye,...
Matematikusként miért tanulunk C-t?
- A C nyelv több programnyelv alapja (C++, C#, Java,...)
- Más programnyelven írt kódok hatékonnyá tehetők, ha a legtöbb gépidőt használó függvényeket C-ben újra írjuk.
Egy C program futtatása
A forrás egyszerű szövegfájl .c kiterjesztéssel, mely bármely szövegszerkesztővel szerkeszthető (pl gedit, kate, emacs, vi,...). Például a hello.c program kódja a következő:
#include <stdio.h> int main(void) { printf("Hello, World!\n"); return 0; }
Ez kiírja, hogy ,,Hello, World!". Miután elmentettük a programot, fordítsuk le, majd futtassuk:
$ gcc -Wall -o hello hello.c $ hello Hello, World! $
Elhagyható a -o kapcsoló, ekkor egy a.out nevű fájl lesz a futtatható program, a -Wall figyelmeztető hibaüzeneteket is kiír.
Egy C program elemei
Az előző kód meglepően hosszú. Mit jelentenek a sorai?
int main(void)
vagy
int main()
vagy
main()
minden C programban kötelező, minden programban van egy main nevű függvény, és ennek meghívásával indul a program végrehajtása. Ha 0 a visszatérési értéke, akkor a program normálisan lefutott -- ez jelzés a külvilágnak. Ezt jelzi a return 0; parancs. Az
#include <stdio.h>
sorral azt jelezzük, hogy a ,,standard input-output" függvények valamelyikét használni szeretnénk (itt pl. printf, azaz formázott kiírás).
A következő haromxmegegy.c programban aritmetikai számítást is végzünk:
#include <stdio.h> int main(void) { int n; n = 5; printf("az eredmeny: %d\n", 3*n + 1); return 0; }
Itt változót deklarálunk, és értéket adunk neki. Ez egy sorban is elvégezhető:
int n = 5;
A kiírásban az idézőjelbe tett szöveg mellett a kiírandó kifejezés értékének formátumát is megadjuk: %d az egész számok kiírását jelenti.
Következzen a standard bemenet egyszerű használata, olvassunk be az 'n' nevű változóba egy számértéket, és ezzel számoljunk (kód: haromxmegegy.c)
#include <stdio.h> int main(void) { int n; printf("legyen n = "); scanf("%d", &n); printf("ekkor 3n + 1 = %d\n", 3*n + 1); return 0; }
És akkor következzen egy program, amiről nem is tudjuk, hogy véges időben leáll-e minden bemenetre, a Collatz-probléma collatz.c:
#include <stdio.h> int main(void) { int x; printf("legyen x = "); scanf("%d", &x); while (x>1) { if (x % 2) x = 3*x + 1; else x /= 2; printf("%d ", x); } printf("\n"); return 0; }
Ebben szerepel egy elöl tesztelős while ciklus és egy elágazás!
A C program formázása
A C programok olvashatóvá tétele sokat segít a kód későbbi megértésében, erre vonatkozó tanácsokat érdemes betartani. Egy ilyen leírás pl. itt található: http://www.gidnetwork.com/b-38.html
#include <stdio.h> main() { printf("Hello, World!\n"); }
A behúzás nem része a szintaktikának, a kód folyamatosan is írható, de ezt sose tegyük:
#include <stdio.h> int main(){printf("Hello, World!\n");return(0);}
Egy szándékosan elrettentő példa mistery.c
#include <stdio.h> main(t,_,a) char *a; {return!0<t?t<3?main(-79,-13,a+main(-87,1-_, main(-86, 0, a+1 )+a)):1,t<_?main(t+1, _, a ):3,main ( -94, -27+t, a )&&t == 2 ?_<13 ?main ( 2, _+1, "%s %d %d\n" ):9:16:t<0?t<-72?main(_, t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+\ ,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/\ +k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){n\ l]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#\ n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \ ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;\ #'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/") :t<-50?_==*a ?putchar(a[31]):main(-65,_,a+1):main((*a == '/')+t,_,a\ +1 ):0<t?main ( 2, 2 , "%s"):*a=='/'||main(0,main(-61,*a, "!ek;dc \ i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}
Algoritmus átalakítása strukturált programmá
Számítsuk ki 2 négyzetgyökét a 4 alapművelet segítségével, valamely iterációval.