Úvod do jazyka C

Preview:

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

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

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.

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

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

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

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;

}

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.

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

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

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

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

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

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

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

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

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

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;

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.

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

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

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

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

40

Typy premenných

1. Statické

2. Dynamické

3. Na hromade (heap variables)

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.

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.

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

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ší.

45

Statická alokácia

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

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

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.

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.

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

}

Recommended