CURS 3 Limbajul C dezvoltat ntre anii 1969
CURS 3 Limbajul C - dezvoltat între anii 1969 -1973 (D. M. Ritchie), o dată cu dezvoltarea sistemului de operare Unix. (Ken Thompson & D. M. Ritchie); - 1972 - anul "naşterii" limbajului C. - 1973 - elementele esenţiale limbajului C au fost complete - 1977 -1979 schimbari majore - 1978 – apare cartea "The C programming language" scrisă de către B. W. Kernighan, D. M. Ritchie - 1983 incepe standardizarea limbajului C de către ANSI (American National Standards Institute) - 1989 - a apărut ANSI C.
Avantaje 1. limbaj de programare de scop general => dezvoltarea de aplicaţii diverse: soft ştiinţific, soft pentru gestiunea bazelor de date, editoare de texte, jocuri, etc. - nu este specializat pe un domeniu particular de aplicaţii - control modern al funcţiilor şi al structurilor de date - set bogat de operatori 2. permite o foarte bună portabilitate a programelor 3. permite programarea structurată (modulară) 4. permite scrierea softului de bază (programare de sistem) 5. oferă posibilitatea lucrului pe biţi şi a calculului adreselor
Elementele limbajului C Exemple
Categorii de elemente Comentarii - note explicative (adnotări) în program - complet ignorate de către compilator - şiruri de caractere (pot fi şi caractere speciale sau cuvinte cheie) cuprinse între /* */ sau care se găsesc pe un singur rând după caracterele //
Cuvinte cheie - cuvinte rezervate limbajului de programare, cu utilizare predefinită - nume cu destinaţii speciale - se scriu cu litere mici Exemple
Identificatori (nume) - folosiţi pentru a denumi variabile, constante, funcţii, structuri de date, etc. - = succesiuni de caractere alfanumerice, primul caracter trebuind să fie literar - in C, de ex. , S s - un identificator poate conţine oricâte caractere dar sunt luate în considerare doar primele 32 caractere - nu pot conţine caractere speciale: + - / ^ < > ( ) [ ] { }. , : ; ' # $ @ - spatiu Recomandare - sa fie sugestivi - x 2: x 2, xx, xla 2, xp, etc. Exemple: a, suma, SUMA, m 2, nr_stud_an 1 f, Nr. Stud. An 1 F 2 x, a*b, if Obs. Identificatorii care încep cu _ sau conţin _ _ sunt folositi pentru implementare şi pentru librăriile standard în C şi C++.
Variabile - nume simbolice asociate unor locaţii de memorie - valorile lor pot fi modificate prin instrucţiuni ale programului - declararea (definirea) variabilelor constă în precizarea tipului şi numelui lor. Exemple:
Variabile globale - variabile declarate in afara functiei main - se initializeaza automat cu zero Exercitiu Scrieti programul pentru transformarea o. C->o. F
Constante - valori care nu pot fi modificate în decursul programului constante simbolice constante obiect Constante simbolice - se definesc cu directiva define - constante fara tip Directiva define - stabileşte (defineşte) un nume simbolic pentru o anumită valoare - se compune din: cuvântul cheie #define, o denumire simbolică, o valoare - nu se termină cu ; - autorizează substituţia pe care o defineşte din punctul în care este scrisă până la sfârşitul fişierului sursa sau până la întâlnirea unei directive undef.
Constantele obiect - constante cu tip - Se declara folosind cuvântul cheie const urmat de tipul constantei şi de un identificator iniţializat. - declararea acestor constante se termină cu caracterul ; Exemplu O constantă de tip char (caracter) este un întreg, scris ca un singur caracter între două simboluri '. Valoarea constantei caracter este valoarea caracterului respectiv în setul de caractere ASCII (American Standard Code for Information Interchange). Astfel, de exemplu, '0' are valoarea 48, 'A' are valoarea 65, iar 'a' are valoarea 97.
Instrucţiuni - părţi (linii) de program care prin compilare produc acţiuni (coduri) executabile - se termină cu caracterul ; - terminator de instrucţiune - lipsa caracterului ; este semnalata la începutul liniei următoare
Exemple ► In urma execuţiei programului se tipăresc valorile de la 5 la 105 ► Dacă nu se pun acolade la while se va tipări doar valoarea 105
Expresii - construcţii formate din operanzi şi operatori. - au valori şi tipuri - valorile şi tipurile expresiilor sunt determinate de către valorile şi tipurilor operanzilor şi de către operatorii care compun expresia. Exemplu b*b-4*a*c expresie a , b , c operanzii expresiei *, - operatorii expresiei delta = b*b - 4*a*c ; instrucţiune prin care se atribuie variabilei delta rezultatul evaluarii expresiei b 2 - 4 ac Operanzii pot fi : - constante - identificatori (nume) de variabile - nume de tipuri de date - apeluri de funcţii - expresii cuprinse între paranteze rotunde
Funcţii - grupuri de instrucţiuni recunoscute sub un anumit nume - realizează acţiuni şi întorc (returnează) valori programului principal (funcţiei principale) sau altei funcţii apelante. - se apelează prin nume şi lista lor de parametri. Ø Parametrii funcţiilor sau valorile cu care sunt apelate transferă informaţia din exteriorul funcţiilor în interiorul lor. Ø Valorile pe care le returnează funcţiile nu trebuie folosite în mod obligatoriu (vezi de ex. funcţiile scanf() şi printf()) Ø Funcţia principală returnează valori sistemului de operare, acesta fiind programul apelant al ei. Ø Anumite funcţii standard sunt gata scrise şi prototipurile lor se găsesc în bibliotecile limbajului (header files). <stdio. h> - conţine funcţii standard de intrare ieşire (I/O): printf, scanf, getch, . . . <stdlib. h> - conţine funcţii standard precum: abort, exit, rand, atoi, itoa, . . . <string. h> - conţine funcţii pentru prelucrarea şirurilor de caractere: strcpy, strlen, strcmp, strcat, . . . <math. h> - conţine funcţii matematice: cos, sin, pow, fabs, . . . <graphics. h> - conţine funcţii pentru gestiunea ecranului în mod grafic (initgraph, putpixel, line, outtextxy , cleardevice, . . . ) <conio. h> - conţine funcţii standard de intrare ieşire de la consolă (clrscr, getche, gotoxy, putch, wherex, wherey, . . . ) <time. h> - conţine funcţii pentru gestiunea orei şi a datei sistemului de calcul (gettime, settime, ctime, . . . ) <dos. h> - conţine funcţii pentru interacţiunea cu sistemul de operare DOS (setdrive, inport, outport) … etc.
Funcţia itoa (nu este suportată de toate compilatoarele)
Structura funcţiilor Antetul - tipul valorii pe care o returnează funcţia + numele funcţiei + lista parametrilor funcţiei (tipul şi numele variabilelor funcţiei) Corpul de instructiuni - grupul de instrucţiuni care se execută la apelul funcţiei respective.
Apelul functiilor - prin nume şi lista de parametri. La apelul funcţiei, controlul programului este pasat acelei funcţii. La întâlnirea instrucţiunii return în interiorul unei funcţii se face saltul în afara funcţiei, controlul fiind preluat de către funcţia main, din locul imediat următor celui în care a fost apelată funcţia din care se face saltul.
Funcţia main - partea principală a unui program C - este apelată şi lansată în execuţie de către sistemul de operare. Funcţii recursive - functii care se autoapelează - se folosesc la definirea proceselor recursive. Proces este recursiv - proces care o parte care se defineşte prin el însuşi.
Exemple Funcţia factorial dacă n==0 fact(n)=1 <- aceasta este partea apelului recursiv care nu se defineşte prin el însuşi (partea definită direct) altfel fact(n)=n*fact(n-1) <- se defineşte funcţia fact prin ea însăşi Funcţia fact recursivă: Cel mai mare divizor comun dacă a%b==0 cmmdc(a, b)=b altfel cmmdc(a, b)=cmmdc(b, a%b) Funcţia cmmdc recursivă: Recursivitatea nu conduce la coduri mai rapide şi nici la necesităţi de memorie mai mici. - convenabila pentru structuri de date definite recursiv (arbori) Codurile recursive sunt mai compacte şi uneori mai uşor de înţeles.
Tablouri - colecţii de valori de acelaşi tip - plasate in zone contigue de memorie - elementele - pot fi referentiate si accesate individual folosind un index - sunt indexate de la 0 la n-1 unde n reprezintă dimensiunea tabloului Exemple Este declarat un tablou unidimensional de 5 elemente şi elementele tabloului sunt apoi iniţializate cu valoarea 0. int a[5]; int i; for(i=0; i<5; i++) a[i]=0; float medii[10]; medii[10]=9. 85; float x[6]; x[1] = 12; x[2]=34; … x[5] = 14; //x[0] = nedefinit !! float x[6] = {12, 34, 1, 9, 14} //rezultă: x[0] = 12; . . . x[4] = 14; şi x[5] = nedefinit !!
Care va fi output-ul urmatorului program
Care va fi output-ul urmatorului program Fara _kbhit() si fara <conio. h>
Tema: Modificati programul de mai sus astfel incat sa se tipareasca notatia tablei de sah:
Şiruri de caractere - tablouri cu elemente de tip char (caractere). Exemple: char nume[20], prenume[20]; char nume[20] = "Popescu"; Şirurile de caractere trebuie cuprinse între " ". Dacă avem declaraţia: char nume[20] = "Popescu" Atunci o reiniţializare de forma: nume = "Ionescu" va produce o eroare. Iniţializare şirurilor: - la declararea lor - folosind funcţia strcpy (string copy) # include <stdio. h>. . . . char nume[20] = "Popescu"; . . . . strcpy (nume, "Ionescu"); . . . . Citirea şi tipărirea şirurilor - cu funcţiile gets( ) şi puts( ) #include <string. h>. . . . . char nume[20]; . . gets(nume); . . puts(nume); . .