1 / 42

Úvod do jazyka C

Úvod do jazyka C. Algoritmizácia úloh. Funkcie. Jazyk C je založený na funkciách. Jednou zo základných funkcií je funkcia main()

livi
Télécharger la présentation

Úvod do jazyka C

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Úvod do jazyka C Algoritmizácia úloh

  2. Funkcie Jazyk C je založený na funkciách. Jednou zo základných funkcií je funkcia main() Každý C-program musí mať definovanú len jednu funkciu s menommain. Jej postavenie je zvláštne v tom, že táto funkcia sa po odštartovaní preloženého programu začne vykonávať ako prvá.

  3. Funkcie Funkcia je časť programu, ktorá má svoju definíciu (hlavičku a telo funkcie). V hlavičke je definovaný typ a meno funkcie a jej formálne parametre a ich typy. Telo funkcie je uzatvorené do zložených zátvoriek a obsahuje kroky výpočtu funkcie. Výsledok výpočtu je uložený do premennej mena funkcie príkazom return. V zátvorke príkazu return je premenná, ktorá sa má priradiť menu funkcie. Volanie funkcie v programe sa uskutočňuje jej menom a v zátvorkách sa uvádzajú vstupné parametre funkcie. Pre prácu s funkciou platia rovnaké pravidlá, ako pre prácu s premennými.

  4. Funkcie Základná funkcia, ktorú musí obsahovať každý program, je funkcia main(). Program začína volaním tejto funkcie a končí jej opustením. Funkcia musí byť definovaná v základnej štruktúre programu. Vo funkciách nemôžu byť definované vnorené funkcie. Formálne parametre a lokálne premenné sú prístupné len vo funkcii, v ktorej sú definované.

  5. #include <stdio.h> float odpor(float u, float i) { float r=0; r=u/i; return (r); } Hlavička funkcie Telo funkcie Volanie funkcie s parametrami u a i main() { float i=0.15, u=5,r; r=odpor(u,i); printf("Odpor je: %.2f ",r); }

  6. #include <stdio.h> float odpor(float u, float i) { float r=0; r=u/i; return (r); } Hlavička funkcie Telo funkcie Volanie funkcie s parametrami u a i main() { float i=0.15, u=5,r; printf("Odpor je: %.2f ",odpor(u, i)); }

  7. Deklarácia a definícia funkcie Deklarácia funkcie špecifikuje len hlavičku funkcie, t.j. jej meno, typ návratovej hodnoty a typ a počet jej parametrov. Definícia funkcie určuje hlavičku funkcie a jej telo. int min(int a, int b) { int pom; if(a<b) pom=a; pom=b; return pom; }

  8. Deklarácia a definícia funkcie Deklarácia funkcie špecifikuje len hlavičku funkcie, t.j. jej meno, typ návratovej hodnoty a typ a počet jej parametrov. Definícia funkcie určuje hlavičku funkcie a jej telo. int min(int a, int b) { if(a<b) return a; else return b; } 8

  9. Funkcie dobre si pamätať Hlavička funkcie nie je ukončená bodkočiarkou. Všetky parametre sú volané hodnotou. Hodnoty a a b sa volajú formálne parametre funkcie Medzi menom funkcie a ľavou zátvorkou sa nerobí medzera – odlíšenie od makier s parametrami. Typ funkcie sa vždy uvádza pred menom funkcie. Telo funkcie je uzatvorené do zložených zátvoriek. Hodnota funkcie sa odovzdáva príkazom return výraz;aleboreturn (výraz); ktorý priradí návratovú hodnotu menu funckie a ukončí funkciu.

  10. Volanie funkcií Funkcie sú volané použitím bežnej konvencie x = min (4 , 5); x = min(10 * i, j – 15);

  11. Volanie funkcií Funkcie sú volané použitím bežnej konvencie x = min(10 * i, j – 15); Funkcia, ktorá nemá žiadne parametre musí byť definovaná i volaná vrátanie oboch guľatých zátvoriek int vypocet() { int a; a=3+4; return a; } Volanie funkcie: cislo = vypocet();

  12. #include <stdio.h> int scitaj() { int a, b; printf("Zadaj cislo a: "); scanf("%d", &a); printf("Zadaj cislo b: "); scanf("%d", &b); return (a + b); } int main() { int s; s=scitaj(); printf("Vysledok scitania: %d", s); return 0; }

  13. #include <stdio.h> int scitaj(int a, int b) { int c; c=a+b; return c; } int main() { int a=3, b=4; printf("Vysledok scitania: %d",scitaj(a,b)); return 0; }

  14. #include <stdio.h> #define PI 3.14 double obvod(double r) { return (2*PI*r); } int main() { float r; printf("\n Zadaj polomer: "); scanf("%f", &r); printf(" Polomeru kruhu: %.2f.",r); printf(" Obvod je: %.4f\n", obvod(r)); return 0; } Funkcia nemusí vracať len typ int.

  15. Umiestnenie definície funkcie Funkcia nesmie byť definovaná vo vnútri inej funkcie, ale volaná byť môže. Problémy nastanú v prípade, že funkcia, ktorá je volaná, má definíciu až za funkciou, ktorá ju používa (táto funkcia potom nemá informácie o volanej funkcii). Prekladaču sa musí definovať meno funkcie, jej návratový typ a počet a typ skutočných parametrov. K tomu sa používa tzv. funkčný prototyp. Pozor! Implicitný typ funkcie je int. Pokiaľ nebudeme typ funkcie deklarovať a má iný typ než int môže pri výpočte dôjsť k chybnému výsledku!!!

  16. Umiestnenie definície funkcie #include <stdio.h> int min(int a,int b); main() { int c1; c1=min(4,5); printf(“\n\r Minimum je: %d ”,c1); } int min(int a,int b) { if(a<b) return a; else return b; }

  17. #include <stdio.h> #define PI 3.14 double obvod(double r); int main() { float r,o; printf("\n Zadaj polomer: "); scanf("%f", &r); printf(" Polomeru kruhu: %.2f.",r); o=obvod(r); printf(" Obvod je: %.2f\n", o); while(1); } double obvod(double r) { return (2*PI*r); }

  18. Parametre funkcií Jazyk C umožňuje len odovzdávanie parametrov hodnotou, tzn. skutočné parametre nemôžu byť vo funkcii zmenené, ale len čítané. Zmena parametrov vo vnútri funkcie je len dočasná a po opustení funkcie sa strácajú. Zmeniť parametre z vnútra funkcie je možné len pomocou pointerov. Pokiaľ nie sú uvedené funkčné prototypy, nevykonáva C žiadnu kontrolu ani typu skutočných parametrov ani ich počet.

  19. int vypocet(int a, int b) { a = a * a; // tieto premenne sa zmenia len vo funkcii b = b * b; return a + b; } int main() { int a, b, c; a=3; b=4; c = vypocet(a,b); // a, b tu zostanu zachovane }

  20. Typy premenných Pozor na prekrývanie premenných. Globálna premenná môže byť prekrytá vo funkcii lokálnou premennou rovnakého mena. Po skončení funkcie má pôvodnú hodnotu!!! Lokálne premenné nie sú automaticky inicializované na nulu!! Globálne premenné majú implicitnú hodnotu 0. Nespoliehať na to!!

  21. #include <stdio.h> int a=3; // tato premenna bude zdielana medzi funkciami void funkcia1() { a=a+2; } void funkcia2() { printf(“\n\r Hodnota ‘a’ je %d”, a); } int main() { funkcia1(); funkcia2(); }

  22. #include <stdio.h> int a=4; // tato premenna bude prekryta int funkcia1(int cislo) { int a; a = cislo + 2; return a; } void funkcia2() { printf(“\n\r Hodnota ‘a’ je %d”, a); } int main() { funkcia1(5); funkcia2(); }

  23. Rekurzívne funkcie #include <stdio.h> int fakt(int n) { if(n==0) return 1; else return(n * fakt(n-1)); } int main() { int i=0; printf("Zadaj cislo: "); scanf("%d", &i); printf("Faktorial je: %d\n", fakt(i)); return 0; } Rekurzívna funkcia je taká funkcia, ktorá sa odvoláva sama na seba.

  24. Procedúry V C nie sú definované procedúry. Tento nedostatok je možné riešiť: Funkcia sa definuje ako funkcia, ktorá vraciatyp void void tlac_int(int i) { printf(“Tlac cisla %d”, i); }

  25. Procedúry Typ void sa používa i v prípade, že funkcia nemá formálne parametre void pozdrav(void) { printf("Ahoj\n"); } int main() { pozdrav(); } int scitaj(void) { int a, b; printf("Zadaj cislo a: "); scanf("%d", &a); printf("Zadaj cislo b: "); scanf("%d", &b); return (a + b); }

  26. Pamäťové triedy Pamäťové triedy určujú, v ktorej časti pamäti bude premenná kompilátorom umiestnená a taktiež kde všade bude premenná viditeľná. Jazyk C rozoznáva tieto pamäťové triedy: • auto • extern • static • register

  27. Trieda auto Je implicitnou pamäťovou triedou pre lokálne premenné. Keď je premenná definovaná vo vnútri funkcie bez určenia typu pamäťovej triedy, je jej implicitný typ auto, je uložená v zásobníku. Existuje od vstupu do funkcie a zaniká pri výstupe z funkcie. Pri každom vstupe do funkcie má náhodnú hodnotu. func() { int i; int j = 5; .... } func() { auto int i; auto int j = 5; .... } 

  28. Trieda extern Je implicitná pre globálne premenné. Tieto premenné sú uložené v dátovej oblasti. Kľúčové slovo extern sa používa pri oddelenom preklade súborov, keď je potrebné, aby viac súborov zdieľalo jednu premennú. Táto premenná je v jednom súbore definovaná bez kľúčového slova extern a vo všetkých ostatných musí byť deklarovaná s použitím extern. súbor p1.csúbor p2.c int suma; extern int suma;

  29. Trieda static Neexistuje pre ňu žiadna implicitná definícia, tzn. kľúčové slovo static musí byť uvedené. Použitie: pre globálne premenné – potom je premenná viditeľná len v module, kde bola definovaná pre lokálne premenné, kedy lokálne premenné triedy static si ponechávajú svoju hodnotu medzi jednotlivými volaniami tejto funkcie. Statická premenná existuje od prvého volania funkcie až do skončenia programu.

  30. Premenné typu static void cislo(void) { static int i=0; printf("Hodnota i je: %d\n",i); i++; } int main() { cislo(); cislo(); cislo(); return 0; }

  31. s1=v1.t s2=v2.t Úloha: za akú dobu sa stretnú ( zadané v1, v2, s) s = s1 + s2

  32. int main() { float v1, v2, s, t; printf("\n Zadat rychlost v1: "); scanf("%f", &v1); printf(" Zadat rychlost v2: "); scanf("%f", &v2); printf(" Zadat vzdialenost: "); scanf("%f", &s); t = cas(v1, v2, s); printf(" Stretnu sa za cas: %.1f min.", t); return 0; } #include <stdio.h> double cas(float v1, float v2, float s) { float t; t = s / (v1 + v2); return (t); }

  33. Prehľad používaných pojmov: Deklarácia identifikátora – špecifikácia (danie na vedomie) mena identifikátora a jeho typu. Alokácia pamäti sa nevykonáva. Definícia identifikátora – kompletná špecifikácia identifikátora vrátanie typu. Prekladač definuje požiadavky na lokáciu pamäti. Pole pôsobnosti identifikátora – časť programu, kde je identifikátor definovaný alebo deklarovaný (je viditeľný)

  34. Typy premenných • Statické • Dynamické • Na hromade (heap variables)

  35. Základné pojmy Dynamická alokácia pamäti – miesto pre premennú v pamäti, ktorá sa alokuje (určuje) v priebehu spustenia programu. Statická alokácia pamäti – miesto v pamäti sa alokuje v priebehu prekladu, pred spustením programu. Globálna premenná – premenná, ktorej existencia začína so spustením programu a končí s ukončením programu. Prekladač ju uloží do dátovej oblasti pamäti. Lokálna premenná – premenná, ktorej existencia začína pri vstupu do funkcie v ktorej je definovaná a končí s ukončením tejto funkcie. Prekladač ju uloží do zásobníku.

  36. Základné pojmy Statická globálna premenná – má rovnaký význam ako globálna premenná, len má uvedené kľúčové slovo static, ktoré obmedzuje jej viditeľnosť len na časť programu. Statická lokálna premenná – premenná, ktorej existencia začína pri vstupe do funkcie, v ktorej je definovaná a končí s ukončením programu a je dostupná len z funkcie, v ktorej bola definovaná. Prekladač ju uloží do dátovej oblasti pamäti.

  37. Alokácia pamäti Každá premenná musí mať v priebehu svojej existencie pridelený pamäťový priestor, ktorý veľkosťou odpovedá typu premennej. Meno premennej (identifikátor) je symbolická adresa tohto pamäťového priestoru. Akcia, ktorá vyhradzuje pamäťový priestor sa nazýva alokácia. Existuje alokácia statická a dynamická.

  38. Statická alokácia Statická alokácia sa používa veľmi často a to v prípadoch, keď vieme vopred definovať pamäťové nároky programu. Prekladač sám určí požiadavky na pamäť v čase začiatku spustenia programu. V priebehu vykonávania programu sa žiadna manipulácia s prideľovaním pamäti nevykonáva. Existencia staticky alokovaných globálnych premenných je od začiatku programudo jeho konca (odovzdania riadenia späť operačnému systému, ktorý všetky alokácie naraz zruší.

  39. Statická alokácia Statická alokácia premenných vymedzuje priestor v dátovej oblasti. Globálne premenné môžu byť alokované len staticky.

  40. Dynamická alokácia V prípade, že vopred nepoznáme požiadavky na pamäťové nároky programu využíva sa dynamická alokácia: Dynamická alokácia na hromade – vykonáva sa pomocou špeciálneho príkazu, kedy za behu programu volíme veľkosť požadovanej pamäti. Pamäť nie je pomenovaná (nemá identifikátor – meno) a pristupuje sa do nej pomocou pointerov.

  41. Dynamická alokácia Dynamická alokácia v zásobníku – je využívaná pri alokácii lokálnych premenných. Táto premenná vzniká v priebehu vykonávania programu, má svoje symbolické meno, jej existencia vzniká pri vstupe do funkcie a končí pri výstupe z tejto funkcie. Pamäť je ďalej využívaná inou premennou, preto pri novom volaní funkcie bude mať premenná inú náhodnú hodnotu. Premenné alokované týmto spôsobom sú umiestňované v zásobníku.

  42. Príklad alokácie #include <stdio.h> int global1=0; int f1() { int count1 = 0; // dynamicka premenna static int count2; // staticka premenna printf(“\n\r Count1: %d Count2: %d”, count1,count2); } main() { while(1) { f1(); } }

More Related