Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Introducere
Marius Minea
29 septembrie 2009
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
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
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
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
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
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
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
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)
Marius Minea
Introducere
15
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
16
sgn : Z Z {1, 0, 1}
sgn(x) =
0 1
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)
0 1
Marius Minea
Introducere
17
sgn(x) =
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
Introducere
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