vod do jazyka C Funkcie Jazyk C je

  • Slides: 42
Download presentation
Úvod do jazyka C

Úvod do jazyka C

Funkcie Jazyk C je založený na funkciách. Jednou zo základných funkcií je funkcia main()

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 menom main. 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á. 2

Funkcie Funkcia je časť programu, ktorá má svoju definíciu (hlavičku a telo funkcie). V

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. 3

Funkcie Základná funkcia, ktorú musí obsahovať každý program, je funkcia main(). Program začína volaním

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é. 4

#include <stdio. h> Hlavička funkcie Telo funkcie float odpor(float u, float i) { float

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

#include <stdio. h> Hlavička funkcie Telo funkcie float odpor(float u, float i) { float

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

Deklarácia a definícia funkcie Deklarácia funkcie špecifikuje len hlavičku funkcie, t. j. jej meno,

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; } 7

Deklarácia a definícia funkcie Deklarácia funkcie špecifikuje len hlavičku funkcie, t. j. jej meno,

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

Funkcie dobre si pamätať Hlavička funkcie nie je ukončená bodkočiarkou. Všetky parametre sú volané

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; alebo return (výraz); ktorý priradí návratovú hodnotu menu funckie a ukončí funkciu. 9

Volanie funkcií Funkcie sú volané použitím bežnej konvencie x = min (4 , 5);

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

Volanie funkcií Funkcie sú volané použitím bežnej konvencie x = min(10 * i, j

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(); 11

#include <stdio. h> int scitaj() { int a, b; printf("Zadaj cislo a: "); scanf("%d",

#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; } 12

#include <stdio. h> int scitaj(int a, int b) { int c; c=a+b; return c;

#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; } 13

#include <stdio. h> #define PI 3. 14 Funkcia nemusí vracať len typ int. double

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

Umiestnenie definície funkcie Funkcia nesmie byť definovaná vo vnútri inej funkcie, ale volaná byť

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!!! 15

Umiestnenie definície funkcie #include <stdio. h> int min(int a, int b); main() { int

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

#include <stdio. h> #define PI 3. 14 double obvod(double r); int main() { float

#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: %. 2 f. ", r); o=obvod(r); printf(" Obvod je: %. 2 fn", o); while(1); } double obvod(double r) { return (2*PI*r); } 17

Parametre funkcií Jazyk C umožňuje len odovzdávanie parametrov hodnotou, tzn. skutočné parametre nemôžu byť

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. 18

int vypocet(int a, int b) { a = a * a; // tieto premenne

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 } 19

Typy premenných Pozor na prekrývanie premenných. Globálna premenná môže byť prekrytá vo funkcii lokálnou

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!! 20

#include <stdio. h> int a=3; // tato premenna bude zdielana medzi funkciami void funkcia

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

#include <stdio. h> int a=4; // tato premenna bude prekryta int funkcia 1(int cislo)

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

Rekurzívne funkcie Rekurzívna funkcia je taká funkcia, ktorá sa odvoláva sama na seba. #include

Rekurzívne funkcie Rekurzívna funkcia je taká funkcia, ktorá sa odvoláva sama na seba. #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: %dn", fakt(i)); return 0; } 23

Procedúry V C nie sú definované procedúry. Tento nedostatok je možné riešiť: Funkcia sa

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

Procedúry Typ void sa používa i v prípade, že funkcia nemá formálne parametre int

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

Pamäťové triedy určujú, v ktorej časti pamäti bude premenná kompilátorom umiestnená a taktiež kde

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: n auto n extern n static n register 26

Trieda auto Je implicitnou pamäťovou triedou pre lokálne premenné. Keď je premenná definovaná vo

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() { auto int i; auto int j = 5; . . } func() { int i; int j = 5; . . } 27

Trieda extern Je implicitná pre globálne premenné. Tieto premenné sú uložené v dátovej oblasti.

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 p 1. c int suma; súbor p 2. c extern int suma; 28

Trieda static Neexistuje pre ňu žiadna implicitná definícia, tzn. kľúčové slovo static musí byť

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. 29

Premenné typu static void cislo(void) { static int i=0; printf("Hodnota i je: %dn", i);

Premenné typu static void cislo(void) { static int i=0; printf("Hodnota i je: %dn", i); i++; } int main() { cislo(); return 0; } 31

s 1=v 1. t s 2=v 2. t Úloha: za akú dobu sa stretnú

s 1=v 1. t s 2=v 2. t Úloha: za akú dobu sa stretnú ( zadané v 1, v 2, s) s = s 1 + s 2 36

int main() { float v 1, v 2, s, t; printf("n Zadat rychlost v

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

Prehľad používaných pojmov: Deklarácia identifikátora – špecifikácia (danie na vedomie) mena identifikátora a jeho

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ý) 39

Typy premenných 1. Statické 2. Dynamické 3. Na hromade (heap variables) 40

Typy premenných 1. Statické 2. Dynamické 3. Na hromade (heap variables) 40

Základné pojmy Dynamická alokácia pamäti – miesto premennú v pamäti, ktorá sa alokuje (určuje)

Základné pojmy Dynamická alokácia pamäti – miesto 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. 41

Základné pojmy Statická globálna premenná – má rovnaký význam ako globálna premenná, len má

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. 42

Alokácia pamäti Každá premenná musí mať v priebehu svojej existencie pridelený pamäťový priestor, ktorý

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á. 43

Statická alokácia sa používa veľmi často a to v prípadoch, keď vieme vopred definovať

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 programu do jeho konca (odovzdania riadenia späť operačnému systému, ktorý všetky alokácie naraz zruší. 44

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

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

Dynamická alokácia V prípade, že vopred nepoznáme požiadavky na pamäťové nároky programu využíva sa

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. 46

Dynamická alokácia v zásobníku – je využívaná pri alokácii lokálnych premenných. Táto premenná vzniká

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. 47

Príklad alokácie #include <stdio. h> int global 1=0; int f 1() { int count

Príklad alokácie #include <stdio. h> int global 1=0; int f 1() { int count 1 = 0; // dynamicka premenna static int count 2; // staticka premenna printf(“nr Count 1: %d Count 2: %d”, count 1, count 2); } main() { while(1) { f 1(); } } 48