42
Úvod do jazyka C

Úvod do jazyka C

  • Upload
    livi

  • View
    52

  • Download
    0

Embed Size (px)

DESCRIPTION

Ú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() - PowerPoint PPT Presentation

Citation preview

Page 1: Úvod do jazyka C

Úvod do jazyka C

Page 2: Úvod do jazyka C

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

Page 3: Úvod do jazyka C

3

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

Page 4: Úvod do jazyka C

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

Page 5: Úvod do jazyka C

5

Hlavička funkcie

#include <stdio.h>

float odpor(float u, float i){ float r=0; r=u/i; return (r);}

Telo funkcie

main(){ float i=0.15, u=5,r; r=odpor(u,i); printf("Odpor je: %.2f ",r);}

Volanie funkcie s parametrami u a i

Page 6: Úvod do jazyka C

6

Hlavička funkcie

#include <stdio.h>

float odpor(float u, float i){ float r=0; r=u/i; return (r);}

Telo funkcie

main(){ float i=0.15, u=5,r; printf("Odpor je: %.2f ",odpor(u, i));}

Volanie funkcie s parametrami u a i

Page 7: Úvod do jazyka C

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

Page 8: Úvod do jazyka C

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;

}

Page 9: Úvod do jazyka C

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

Page 10: Úvod do jazyka C

10

Volanie funkcií

Funkcie sú volané použitím bežnej konvencie

x = min (4 , 5);

x = min(10 * i, j – 15);

Page 11: Úvod do jazyka C

11

Volanie funkcií

Funkcie sú volané použitím bežnej konvenciex = 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();

Page 12: Úvod do jazyka C

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

Page 13: Úvod do jazyka C

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

Page 14: Úvod do jazyka C

14

Funkcia nemusí vracať len typ int.

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

Page 15: Úvod do jazyka C

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

Page 16: Úvod do jazyka C

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;

}

Page 17: Úvod do jazyka C

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

Page 18: Úvod do jazyka C

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.

Page 19: Úvod do jazyka C

19

int vypocet(int a, int b){

a = a * a; // tieto premenne sa zmenia len vo funkciib = b * b;return a + b;

}

int main(){

int a, b, c;a=3; b=4;

c = vypocet(a,b); // a, b tu zostanu zachovane}

Page 20: Úvod do jazyka C

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

Page 21: Úvod do jazyka C

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

}

Page 22: Úvod do jazyka C

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

}

Page 23: Úvod do jazyka C

23

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: %d\n", fakt(i));

return 0;}

Page 24: Úvod do jazyka C

24

ProcedúryV C nie sú definované procedúry. Tento

nedostatok je možné riešiť:

Funkcia sa definuje ako funkcia, ktorá vracia typ void

void tlac_int(int i){

printf(“Tlac cisla %d”, i);}

Page 25: Úvod do jazyka C

25

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("Ahoj\n");}

int main(){ pozdrav();}

Page 26: Úvod do jazyka C

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

Page 27: Úvod do jazyka C

27

Trieda autoJe 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; ....}

Page 28: Úvod do jazyka C

28

Trieda externJe 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.c súbor p2.c

int suma; extern int suma;

Page 29: Úvod do jazyka C

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.

Page 30: Úvod do jazyka C

31

void cislo(void){ static int i=0; printf("Hodnota i je: %d\n",i); i++;}

int main(){ cislo(); cislo(); cislo(); return 0;}

Premenné typu static

Page 31: Úvod do jazyka C

36

v1 v2

s

s1=v1.t s2=v2.t

Úloha: za akú dobu sa stretnú ( zadané v1, v2, s)

s = s1 + s2

21 vv

st

Page 32: Úvod do jazyka C

38

#include <stdio.h>

double cas(float v1, float v2, float s){ float t; t = s / (v1 + v2); return (t);}

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

Page 33: Úvod do jazyka C

39

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

Page 34: Úvod do jazyka C

40

Typy premenných

1. Statické

2. Dynamické

3. Na hromade (heap variables)

Page 35: Úvod do jazyka C

41

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.

Page 36: Úvod do jazyka C

42

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.

Page 37: Úvod do jazyka C

43

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

Page 38: Úvod do jazyka C

44

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

Page 39: Úvod do jazyka C

45

Statická alokácia

Statická alokácia premenných vymedzuje priestor v dátovej oblasti.

Globálne premenné môžu byť alokované len staticky.

Page 40: Úvod do jazyka C

46

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.

Page 41: Úvod do jazyka C

47

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.

Page 42: Úvod do jazyka C

48

Príklad alokácie

#include <stdio.h>

int global1=0;

int f1(){

int count1 = 0; // dynamicka premennastatic int count2; // staticka premennaprintf(“\n\r Count1: %d Count2: %d”, count1,count2);

}

main(){

while(1){

f1();}

}