Informatika2-2012/Eloadas01

A MathWikiből
(Változatok közti eltérés)
3. sor: 3. sor:
 
=== A C nyelv tulajdonságai ===
 
=== A C nyelv tulajdonságai ===
  
A C általános célú magas szintű (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. 1988-ban szabványosítva lett: ANSI C.
+
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
 
* Strukturált nyelv
 +
* Szabványos könyvtári függvények
 
* Hordozható (a C kód számtalan gépen lefordítható és futtatható)
 
* 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)
 
* 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)
  
==== Matematikusként miért tanulunk C-t? ====
+
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,...)
 
* 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.
 
* 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.
  
=== A C program felépítése ===
+
=== Egy C program futtatása ===
 
+
A forrás egyszerű szövegfájl .c kiterjesztéssel, mely bármely szövegszerkesztővel szerkeszthető. Például
+
  
 +
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 [http://www.math.bme.hu/~wettl/okt/info2/2012/hello.c hello.c] program kódja a következő:
 
<code lang="c">
 
<code lang="c">
 
  #include <stdio.h>
 
  #include <stdio.h>
  int main()  
+
  int main(void)
 
  {
 
  {
 
     printf("Hello, World!\n");
 
     printf("Hello, World!\n");
27. sor: 31. sor:
 
  }
 
  }
 
</code>
 
</code>
 +
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?
  
=== Első C program ===
+
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ő [http://www.math.bme.hu/~wettl/okt/info2/2012/haromxmegegy.c haromxmegegy.c] programban aritmetikai számítást is végzünk:
 +
<code lang="c">
 +
#include <stdio.h>
 +
int main(void)
 +
{
 +
    int n;
 +
    n = 5;
 +
    printf("az eredmeny: %d\n", 3*n + 1);
 +
    return 0;
 +
}
 +
</code>
 +
 
 +
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: [http://www.math.bme.hu/~wettl/okt/info2/2012/haromxmegegy.c haromxmegegy.c])
 +
<code lang="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;
 +
}
 +
</code>
 +
 
 +
É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 [http://www.math.bme.hu/~wettl/okt/info2/2012/collatz.c collatz.c]:
 +
<code lang="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;
 +
}
 +
</code>
 +
 
 +
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
  
  
41. sor: 120. sor:
 
</code>
 
</code>
  
 +
A behúzás nem része a szintaktikának, a kód folyamatosan is írható, de ezt sose tegyük:
 
<code lang="c">
 
<code lang="c">
 
  #include <stdio.h>
 
  #include <stdio.h>
  main() {printf("Hello, World!\n");}
+
  int main(){printf("Hello, World!\n");return(0);}
 
</code>
 
</code>
 +
 +
Egy szándékosan elrettentő példa [http://www.math.bme.hu/~wettl/okt/info2/2012/mistery.c mistery.c]
 +
<code lang="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);}
 +
</code>
 +
 +
 +
==== 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.

A lap 2012. február 8., 00:30-kori változata

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.

Személyes eszközök