Sei sulla pagina 1di 19

Programarea calculatoarelor

Introducere

Marius Minea

29 septembrie 2009

Programarea calculatoarelor. Curs 1

Marius Minea

Introducere

Despre limbajul C
dezvoltat n 1972 la AT&T Bell Laboratories de Dennis Ritchie folosit pentru scrierea de sisteme de operare si utilitare (C dezvoltat init ial sub UNIX, apoi UNIX a fost rescris n C)
carte: Brian Kernighan, Dennis Ritchie: The C Programming Language (1978)

Un limbaj vechi, dar n evolut ie standardul ANSI C, 1988 (American National Standards Institute) versiunea curent a: C99 (standard ISO 9899) De ce folosim C? foarte versatil : acces direct la reprezentarea binar a a datelor, libertate n lucrul cu memoria, bun a interfat a cu hardware limbaj matur , baz a mare de cod (biblioteci pentru multe scopuri) ecient : compilatoare bune, genereaz a cod compact, rapid ATENT IE : foarte u sor de f acut erori !
Programarea calculatoarelor. Curs 1 Marius Minea

Introducere

Calcule, funct ii si programe


Ce face un program? cite ste ni ste date de intrare le prelucreaz a prin ni ste calcule (matematice) produce (scrie) ni ste rezultate

In matematic a, efectu am calcule cu ajutorul funct iilor : cunoa stem diverse funct ii (sin, cos, etc.) denim funct ii noi (depinz and de problem a) combin am funct iile existente si denite de noi si le folosim ntr-o anumit a ordine Toate aceste aspecte le nt alnim si n programare

Programarea calculatoarelor. Curs 1

Marius Minea

Introducere

Funct ii n matematic a si n C
Exemplu: funct ia de ridicare la p atrat pentru ntregi int sqr(int x) sqr : Z ZZ Z { return x * x; sqr(x) = x x } Denit ia unei funct ii cont ine: antetul funct iei: specic a un domeniu de valori ( ntregi), numele funct iei si parametrii acesteia (un singur parametru, ntreg) corpul funct iei: aici, o singur a instruct iune (return) cu o expresie care d a valoarea funct iei (pornind de la parametri) Limbajul are reguli precise de scriere (sintaxa): diversele elemente scrise ntr-o anumit a ordine ; se folosesc separatori pentru a le delimita precis: ( )
Programarea calculatoarelor. Curs 1

{ }
Marius Minea

Introducere

O a doua funct ie
Ridicarea la p atrat pentru numere reale float sqrf(float x) sqrf : I RI R { return x * x; sqrf (x) = x x } o alt a funct ie dec at cea dinainte: alt domeniu de denit ie si de valori trebuie s a-i d am alt nume dac a o folosim n acela si program strict vorbind si operat ia * e alta, ind denit a pe alt a mult ime Cuvintele int, float denot a tipuri . Un tip e o mult ime de valori mpreun a cu un set de operat ii permise pentru aceste valori. Alt tip pentru reali: double (dubl a precizie) recomandabil fat a de float ( si folosit de funct iile standard).
Programarea calculatoarelor. Curs 1 Marius Minea

Introducere

Intregi, reali si operat ii matematice

Exist a diferent e importante ntre tipuri numerice n C si matematic a. n matematic a, Z ZI R, ambele sunt innite, I R e dens a n C, int si float sunt tipuri nite; realii au precizie nit a Constantele numerice au tip determinat de modul de scriere: 2 e un ntreg, 2.0 e un real putem scrie un real n notat ie stiint ic a: 1.0e-3 n loc de 0.001 sunt echivalente scrierile 1.0 si 1. respectiv 0.1 si .1 unele operat ii sunt diferite pentru ntregi si reali: Imp art irea ntreag a e mp art ire cu rest !!! 7 / 2 d a valoarea 3, pe c and 7.0 / 2.0 d a valoarea 3.5 -7 / 2 d a valoarea -3, deci la fel cu - (7 / 2) Operatorul modulo (scris %) e denit doar pentru ntregi. 9 / 5 este 1 9 % 5 este 4 9 / -5 este -1 9 % -5 este 4 -9 / 5 este -1 -9 % 5 este -4 -9 / -5 este 1 -9 % -5 este -4 semnul restului e acela si cu semnul de mp art itului e valabil a egalitatea a == a / b * b + a % b (ecuat ia mp art irii cu rest)
Programarea calculatoarelor. Curs 1 Marius Minea

Introducere

Put in a terminologie

cuvinte cheie : au un nt eles predenit (nu poate schimbat) Exemple: instruct iuni (return), tipuri (int, float, double), etc. identicatori (de ex. sqr, x) ale si de programator pentru a denumi funct ii, parametri, variabile, etc. Def.: Un identicator e o secvent a de caractere format a din litere (mari si mici), liniut a de subliniere _ si cifre, care nu ncepe cu o cifr a si nu este un cuv ant cheie Exemple: x3, a12_34, _exit, main, printf, int16_t constante (numerice: -2, 3.14; mai t arziu: caractere, siruri) semne de punctuat ie , cu diverse semnicat ii: * e un operator ; delimiteaz a sf ar situl unei instruct iuni parantezele ( ) grupeaz a parametrii unei funct ii sau o subexpresie acoladele { } grupeaz a instruct iuni sau declarat ii etc.
Programarea calculatoarelor. Curs 1 Marius Minea

Introducere

Funct ii cu mai mult i parametri


Exemplu: discriminantul ecuat iei de gradul II: a x2 + b x + c = 0 float discrim(float a, float b, float c) { return b * b - 4 * a * c; } Intre parantezele rotunde ( ) din antetul funct iei putem specica oric a ti parametri, ecare cu tipul propriu, separat i prin virgul a.

Programarea calculatoarelor. Curs 1

Marius Minea

Introducere

Apelul de funct ie

P an a acum, am denit funct ii, f ar a s a le folosim. Valoarea unei funct ii poate folosit a ntr-o expresie cu aceea si sintax a ca si n matematic a: funct ie(parametru, parametru, , parametru) Exemplu: n discriminantul dinainte, puteam scrie: return sqrf(b) - 4 * a * c; Sau putem deni: int cube(int x) { return x * sqr(x); } IMPORTANT: nainte de a folosi orice identicator (nume) n C, el trebuie s a e declarat (trebuie s a stim ce reprezint a) Exemplele sunt corecte dac a sqrf respectiv sqr sunt denite nainte de discrim, respectiv cube n program.
Programarea calculatoarelor. Curs 1 Marius Minea

Introducere

10

Un prim program C

int main(void) { return 0; } cel mai mic program: nu face nimic ! orice program cont ine functia main si e executat prin apelarea ei (programul poate cont ine si alte funct ii) n acest caz: funct ia nu are parametri (void) void e un cuv ant cheie pentru tipul vid (far a nici un element) cf. standard: main returneaz a un cod ntreg c atre sistemul de operare (convent ie: 0 pt. terminare cu succes, = 0 pt. cod de eroare)
Programarea calculatoarelor. Curs 1 Marius Minea

Introducere

Un program comentat

11

/* Acesta este un comentariu */ int main(void) // comentariu pana la capat de linie { /* Acesta e un comentariu pe mai multe linii obisnuit, aici vine codul programului */ return 0; } programele pot cont ine comentarii, nscrise ntre /* si */ sau ncep and cu // si termin andu-se la cap atul liniei orice cont inut ntre aceste caractere nu are nici un efect asupra gener arii codului si execut iei programului programele trebuie comentate pentru ca un cititor s a le nt eleag a (alt ii, sau noi, mai t arziu) ca documentat ie si specicat ie: funct ionalitate, restrict ii, etc. ce reprezint a parametrii funct iilor, rezultatul, variabilele, ce condit ii trebuie ndeplinite, cum se comport a la eroare
Programarea calculatoarelor. Curs 1 Marius Minea

Introducere

Tip arirea (scrierea)

12

#include <stdio.h> int main(void) { printf("hello, world!\n"); // tipareste un text return 0; } printf (de la print formatted): o funct ie standard (N.B.: printf nu este instruct iune sau cuv ant cheie ) e apelat a aici cu un parametru sir de caractere constantele sir de caractere: incluse ntre ghilimele " " \n este notat ia pentru caracterul de linie nou a prima linie e o directiv a de preprocesare , include sierul stdio.h cu declarat iile funct iilor standard de intrare / ie sire declarat ia = informat iile (nume, parametri) necesare pentru folosire implementarea (codul obiect, compilat): ntr-o bibliotec a din care compilatorul ia cele necesare pentru generarea programului executabil
Programarea calculatoarelor. Curs 1 Marius Minea

Introducere

Tip arirea unei valori numerice

13

#include <stdio.h> #include <math.h> int sqr (int x) { return x * x; } #include <stdio.h> int main(void) int main(void) { { printf("2 ori -3 la patrat e "); printf("cos(0) = "); printf("%d", 2 * sqr(-3)); printf("%f", cos(0)); return 0; return 0; } } Pentru a tip ari valoarea unei expresii, printf ia dou a argumente: un sir de caractere (specicator de format): %d ( ntreg, decimal ), %f (real, oating point ) expresia, al c arei tip trebuie s a e compatibil cu cel indicat (vericarea cade n sarcina programatorului !!!) Secvent ierea: instruct iunile unei funct ii se execut a una dup a alta except ii: instruct iunea return ncheie execut ia funct iei (dup a ea nu se mai execut a nimic)
Programarea calculatoarelor. Curs 1 Marius Minea

Introducere

14

Funct ii denite pe cazuri


abs : Z ZZ Z abs(x) = x x x0 altfel

Cu cele discutate p ana acum, nu putem deni aceast a funct ie n C. Valoarea funct iei nu e dat a de o singur a expresie, ci de una din dou a expresii diferite (x sau -x), n funct ie de o condit ie (x 0 sau nu) e necesar a o facilitate de limbaj pentru a decide valoarea pe care o ia o expresie n funct ie de valoarea unei condit ii (adev arat/fals)

Programarea calculatoarelor. Curs 1

Marius Minea

Introducere

15

Operatorul condit ional ? : n C


O expresie conditional a n C are sintaxa: condit ie ? expr1 : expr2 dac a condit ia e adev arat a, se evalueaz a doar expr1, si ntreaga expresie ia valoarea acesteia dac a e fals a, se evalueaz a doar expr2 si ntreaga expresie ia valoarea acesteia

int abs(int x) { return x >= 0 ? x : -x; }

// operator minus unar

Operatori de comparat ie n C: == (egalitate), != (diferit), <, <=, >, >= IMPORTANT! Testul de egalitate n C e == si nu = simplu !!! Obs.: Funct ia abs exist ca funct ie standard, declarat a n stdlib.h
Programarea calculatoarelor. Curs 1 Marius Minea

Introducere

Funct ii denite pe mai mult de dou a cazuri


1

16

sgn : Z Z {1, 0, 1}

sgn(x) =

0 1

x<0 x=0 x>0

Chiar cu operatorul condit ional nu putem transcrie funct ia direct n C (el permite doar decizia cu dou a ramuri (adev arat/fals), nu cu un num ar mai mare de condit ii / ramuri) trebuie s a descompunem calculul funct iei sgn (de fapt decizia asupra valorii parametrului x) descompunerea n subprobleme mai mici: principiu foarte important n rezolvarea de probleme Rescriem funct ia cu o singur a decizie n ecare punct: sgn(x) =
a x<0 dac altfel (x 0)

1 dac a x=0 altfel (x > 0)

0 1
Marius Minea

Programarea calculatoarelor. Curs 1

Introducere

17

Scrierea unei funct ii pe mai multe cazuri n C


a x<0 dac altfel (x 0)

sgn(x) =

1 dac a x=0 altfel (x > 0)

0 1

int sgn (int x) { return x < 0 ? -1 : x == 0 ? 0 : 1; } putem grupa arbitrar de mult i operatori ? : expr1 si expr2 pot la r andul lor expresii condit ionale ntr-o expresie scris a corect, un : corespunde univoc unui ?
Programarea calculatoarelor. Curs 1 Marius Minea

Introducere

18

S a nt elegem: apelul de funct ie


#include <stdio.h> int sqr(int x) { printf("Patratul lui %d e %d\n", x, x*x); x6 = ( x x2 ) 2 return x * x; In ce ordine se } scrie pe ecran ? int main(void) { printf("2 la a 6-a e %d\n", Patratul lui 2 e 4 sqr(2 * sqr(2))); Patratul lui 8 e 64 return 0; 2 la a 6-a e 64 } In C, transmiterea parametrilor la funct ii se face prin valoare se evalueaz a (calculeaz a valoarea) toate argumentele funct iei valorile se atribuie la parametrii formali (numele din def. fct.) apoi se ncepe execut ia funct iei cu aceste valori
Programarea calculatoarelor. Curs 1 Marius Minea

Introducere

S a nt elegem: apelul de funct ie

19

In exemplu: programul ncepe cu execut ia lui main, deci tip arirea printf printf are nevoie de valoarea argumentelor sale. Prima se stie (o constant a sir ), a doua trebuie calculat a: sqr(2 * sqr(2)) pentru a efectua apelul exterior al lui sqr trebuie stiut argumentul, adic a 2 * sqr(2). Deci se efectueaz a nt ai apelul interior, sqr(2) ordinea: sqr(2), apoi sqr(8), apoi printf din main Cum s-ar mai putea altfel, dar NU se face n C: NU: funct ia ncepe execut ia si si calculeaz a argumentele la nevoie printf ar tip ari nt ai 2 la puterea 6 e, apoi i trebuie valoarea ar apela sqr exterior care scrie Patratul lui, apoi i trebuie x ar apela sqr(2) care scrie Patratul lui 2 e 4, returneaz a 4, etc. NU: se substituie expresiile argument pentru parametrii funct iei din printf s-ar apela sqr exterior cu expresia 2 * sqr(2) pt. a calcula (2*sqr(2))*(2*sqr(2)) s-ar apela sqr(2) de dou a ori In C, o funct ie calculeaz a numai cu valori , niciodat a cu expresii
Programarea calculatoarelor. Curs 1 Marius Minea

Potrebbero piacerti anche