1 / 180

Programare in limbaj C

Programare in limbaj C. Bibliografie Brian W. Kernighan, Dennis M. Ritchie Programarea in limbaj C Al Kelley, Ira Pohl: A Book on C - Programming in C, Addison Wesley, Reading Herbert Schildt: C Manual Complet, Bucuresti, Ed. Teora 1998

gyan
Download Presentation

Programare in limbaj C

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programare in limbaj C • Bibliografie • Brian W. Kernighan, Dennis M. RitchieProgramarea in limbaj C • Al Kelley, Ira Pohl: A Book on C - Programming in C, Addison Wesley, Reading • Herbert Schildt: C Manual Complet, Bucuresti, Ed. Teora 1998 • E. Horowitz, S. Sahni, S. Anderson - Freed: Fundamentals of Data Structures in C, Computer G. Grigoras

  2. Primul program C #include <stdio.h> int main(void) { printf(“Salut!\n”); printf(“Iata primul program C!”); return 0; } G. Grigoras

  3. Caracterele limbajului C • Litere: A B C D … X Y Z a b c d … x y z • Cifre: 0 1 2 3 4 5 6 7 8 9 • Alte caractere: + - * / = ( ) { } [ ] < > ‘ “ ! # % & _ |^ ~ \ . , ; : ? • Caractere spaţiu: blank, newline,tab, etc. G. Grigoras

  4. Tipuri standard • Tipul char • Tipurile standard întregi: • 5 tipuri întregi cu semn: signed char, short int, int, long int, şi long long int. • 5 tipuri întregi fără semn: desemnate de cuvântul unsigned (tipuri ce ocupă aceeaşi cantitate de memorie) • Tipuri reale flotante: float, double,şi longdouble. G. Grigoras

  5. Tipuri de date standard ECHIVALENTE signed short int  short unsigned short int  unsigned short signed int  int unsigned int  unsigned signed long int  long unsigned long int  unsigned long G. Grigoras

  6. Declaraţii • Forma unei declaraţii: tip variabila; tip var1, var2, …, varn; tip variabila = expresie_constanta; • Variabile globale: declararea lor se face la începutul programului, în afara oricarei funcţii. • Variabile locale: declararea se face în corpul funcţiei, la început. char c; signed char sc; int i; int suma = 0; long j; float x; float pi = 3.14; double y; G. Grigoras

  7. Tipul întreg • int sizeof(int) = 2 sau 4 octeti • short int sau short sizeof(short)=2, {-32768,…,32767} • long int sau long sizeof(long) = 4 {-2 147 483 648, …, 2 147 483 647} • signed int, signed short int, signed long int G. Grigoras

  8. Întregi fără semn • unsigned int • unsigned short int {0,…,65535} • unsigned long int • Nu există overflow (depăşire) – calculul se efectuează modulo 2n, unde n este numărul de biţi G. Grigoras

  9. Întregi “foarte scurţi”: char • Tipul char este o submulţime a tipului int • char reprezintă, în funcţie de maşină, domeniul de valori: {-128, …, 127} sau {0,…,256} • unsigned char {0,…,256} • signed char {-128, …, 127} sizeof(char) = 1 G. Grigoras

  10. Constante întregi în <limits.h> 16 biti 32 biti INT_MAX215-1 231-1 INT_MIN-215-231 LONG_MAX 231-1 263-1 LONG_MIN -231-263 Atenţie la reprezentarea circulară! • INT_MAX + 1 == INT_MIN • INT_MIN – 1 == INT_MAX • LONG_MAX + 1 == LONG_MIN • LONG_MIN – 1 == LONG_MAX G. Grigoras

  11. Citiri, afişări • citirea unui int printf(“a: ”); scanf(“%d”, &a); • afişarea unui int int a = 10; printf(“a = %d”, a); • citirea unui char printf(“a: ”); scanf(“%c”, &a); • afişarea unui char char a = ‘a’; printf(“a = %c”, a); G. Grigoras

  12. Constante - exemplu /*Exemple de constante caracter */ #include <stdio.h> int main(){ char a, b, c, d; a = 'A'; b = 65; c = '\101'; d = '\x41'; printf("%c %c %c %c\n", a, b, c, d); printf("%c %d %o %x\n", a, a, a, a); return 0; } /* A A A A A 65 101 41 */ G. Grigoras

  13. Codurile ASCII # include <stdio.h> int main (void){ short c; for(c=0; c<= 127; c++){ printf("cod ASCII:%d",c); printf(" caracter:%c\n",c); } return 0; } /* for(c=‘a’; c<=‘z’; c++) */ G. Grigoras

  14. Macrourile getchar() si putchar() • Sunt definite in <stdio.h> • Citire caracter de la tastatură • Scriere caracter pe ecran #include <stdio.h> int main(void){ char c; while ((c=getchar()) != EOF) {putchar(c); putchar(c);} return 0; } //123456abcd //112233445566aabbccdd G. Grigoras

  15. Operaţii, Funcţii în biblioteci • Operaţii pentru tipurile întregi: + - * / % == != < <= > >= ++ -- • Funcţii: • cele de la tipul flotant • cele din biblioteca <ctype.h>: tolower, toupper, isalpha, isalnum, iscntrl, isdigit, isxdigit, islower, isupper, isgraph, isprint, ispunct, isspace G. Grigoras

  16. Operatorii ++ şi -- • Se aplică doar unei expresii ce desemnează un obiect din memorie (L-value): Expresie: ++i i++ --i i-- Valoare: i+1 i i-1 i i dupa evaluare: i+1 i+1 i-1 i-1 ++5 --(k+1) ++i++ nu au sens G. Grigoras

  17. Tipul flotant (real) • float • Numere reale în simplă precizie • sizeof(float) = 4 • 10-37 <= abs(f) <= 1038 • 6 cifre semnificative • double • Numere reale în dublă precizie • sizeof(double) = 8 • 10-307 <= abs(f) <= 10308 • 15 cifre semnificative G. Grigoras

  18. Tipul flotant (real) • long double • Numere reale în “extra” dublă precizie • sizeof(float) = 12 • 10-4931 <= abs(f) <= 104932 • 18 cifre semnificative • Limitele se găsesc în <float.h> • Operaţii: + - * / == != < <= > >= G. Grigoras

  19. Constante reale • Constantele reale sunt implicit double 125.435 1.12E2 123E-2 .45e+6 13. .56 • Pentru a fi float trebuie sa aiba sufixul f sau F .56f 23e4f 45.54E-1F • Pentru long double trebuie sa aiba sufixul l sau L 123.456e78L G. Grigoras

  20. Funcţii (în biblioteca <math.h> ) sin cos tan asin acos atan sinh cosh tanh exp log log10 pow sqrt ceil floor fabs ldexp frexp modf fmod G. Grigoras

  21. Citire, afişare • citirea unui float printf(“x: “); scanf(“%f”, &x); • afişarea unui float float pi = 3.14; printf(“pi = %f”, pi); • citirea unui double printf(“x: “); scanf(“%lf”, &x); • afisarea unui double double pi = 3.14L; printf(“pi = %lf”, pi); G. Grigoras

  22. Utilizare typedef • Mecanism prin care se asociază un tip unui identificator: typedef char litera_mare; typedef short varsta; typedef unsigned long size_t; • Identificatorul respectiv se poate utiliza pentru a declara variabile sau funcţii: litera_mare u, v=‘a’; varsta v1, v2; size_t dim; G. Grigoras

  23. Date booleene (logice) • Nu exista un tip special pentru date logice; • Domeniul de valori: {false, true} • false = 0 • true = orice întreg nenul • Operaţii: ! && || == != • O declaraţie posibilă: typedef enum {false = 0, true = 1} bool; bool x, y; G. Grigoras

  24. Expresii logice expresie_relationala::= expr < expr | expr > expr | expr <= expr | expr >= expr | expr == expr | expr != expr expresie_logica ::= ! expr | expr || expr | expr && expr G. Grigoras

  25. Valoarea expresiilor relaţionale G. Grigoras

  26. Valoarea expresiilor logice || G. Grigoras

  27. Valoarea expresiilor logice && G. Grigoras

  28. Exemple • O condiţie de forma a  x  b se scrie în limbajul C: (x >= a) && (x <= b) sau a <= x && x <= b • O condiţie de forma a > x sau x > b se scrie în limbajul C: x < a || x > b sau !(x >= a && x <= b) G. Grigoras

  29. Operatorul condiţional ?: exp1 ? exp2 : exp3 • Se evalueazăexp1 • Dacăexp1 are valoare nenulă (true) atunci valoarea expresiei este valoarea lui exp2; exp3 nu se evaluează • Dacă exp1 are valoare nulă (false) atunci valoarea expresiei este valoarea lui exp3; exp2 nu se evaluează • Operatorul ?: este drept asociativ G. Grigoras

  30. Operatorul condiţional ?: Exemple x >= 0 ? x : y x > y ? x : y x>y ? x>z ? x :z : y>z ? y : z #include <stdio.h> int main(void){ int a=1, b=2, c=3; int x, y, z; x = a?b:c?a:b; y = (a?b:c)?a:b; /* asociere stanga */ z = a?b:(c?a:b); /* asociere dreapta */ printf("x = %d, y = %d, z = %d\n", x, y, z); } /* x = 2, y = 1, z = 2 */ G. Grigoras

  31. Operatorul “=“ (Expresia de atribuire) • Expresia de atribuire: exp1 = exp2 • exp1 este o “L-value” (obiect din memorie: variabilă, variabilă tablou cu indici, etc.) • Tipul expresiei este tipul lui exp1 • Se evaluează exp2 apoi exp1 capătă valoarea lui exp2,eventual convertită. • Aşadar, operatorul = modifică valoarea operandului stâng • Valoarea expresiei este valoarea lui exp1 după evaluare • Operatorul = este drept asociativ G. Grigoras

  32. Operatorul “=“ (Expresia de atribuire) • Exemple: x = sqrt(9) a = ( b = 2) + ( c = 3) a = b = c = 0 echivalenta cu a = (b = (c = 0)) while((c = getchar()) != EOF) putchar(c); • Nu confundaţi e1 = e2 cu e1 == e2 a = 22; if ( a == 0)printf(“nul”) else printf(“nenul”); /* nenul */ if ( a = 0)printf(“nul”) else printf(“nenul”); /* nul */ G. Grigoras

  33. Operatori de atribuire compusă • O expresie de atribuire compusă are forma: exp1op= exp2 unde op= este unul din: += -= *= /= %= &= |= ^= >>= <<= • Expresia este echivalentă cu exp1 = exp1op (exp2) cu precizarea căexp1 se evaluează o singură dată. j *= k + 3 echivalentă cu: j = j*(k+3) j *= k = m + 5 echivalentă cu: j = (j * (k = (m + 5))) G. Grigoras

  34. Operatorul virgulă, expresia_virgula ::= expresie,expresie • Se evaluează prima expresie apoi cea de-a doua. • Valoarea şi tipul întregii expresiii este valoarea şi tipul operandului drept. • Operatorul virgulă are cea mai mică precedenţă. • Exemple: a = 1, b = 2 i = 1, j = 2, ++k + 1 k != 1, ++x * 2.0 + 1 for(suma = 0, i = 1; i <= n; suma += i, ++i); G. Grigoras

  35. Tipul void • Conversia în tip void a unei expresii semnifică faptul că valoarea sa este ignorată • Utilizat pentru tipul pointer; nu se face controlul tipului la un pointer de tip void • Utilizat pentru funcţii fără valoare returnată sau pentru funcţii fără parametri • Este un tip incomplet ce nu poate fi completat G. Grigoras

  36. Operatorul sizeof() • Operator unar ce permite găsirea numărului de octeţi pe care se reprezintă un obiect ( tip, expresie) sizeof(int), sizeof(double) sizeof(b*b-4*a*c), sizeof(i) sizeof(char)<=sizeof(short)<=sizeof(int)<=sizeof(long) sizeof(signed)=sizeof(unsigned) = sizeof(int) sizeof(float)<=sizeof(double)<=sizeof(long double) G. Grigoras

  37. Operatorul sizeof() #include<stdio.h> int main(void){ int x=1; double y=9; long z=0; printf("Operatorul sizeof()\n\n\n"); printf("sizeof(char) = %2u\n",sizeof(char)); printf("sizeof(int) = %2u\n",sizeof(int)); printf("sizeof(short) = %2u\n",sizeof(short)); printf("sizeof(long) = %2u\n",sizeof(long)); printf("sizeof(float) = %2u\n",sizeof(float)); printf("sizeof(double) = %2u\n",sizeof(double)); printf("sizeof(long double) = %2u\n",sizeof(long double)); printf("sizeof(x +y + z) = %2u\n",sizeof(x+y+z)); printf("sizeof(void) = %2u\n",sizeof(void)); return 0; } G. Grigoras

  38. Operatorul sizeof() Rezultatul executiei Visual C++ (Djgpp): sizeof(char) = 1 sizeof(int) = 4 sizeof(short) = 2 sizeof(long) = 4 sizeof(float) = 4 sizeof(double) = 8 sizeof(long double) = 8 ( 12 Djgpp) sizeof(x +y + z) = 8 sizeof(void) = 0 (1 Djgpp) G. Grigoras

  39. Precedenţa operatorilor G. Grigoras

  40. Forţarea tipului - cast • Conversia explicită la tipul numetip: (numetip) expresie • Exemple: (long)(‘A’ + 1.0) (int)(b*b-4*a*c) (double)(x+y)/z (float)x*y/z x/(float)2 G. Grigoras

  41. Exemplu cast #include <stdio.h> int main(void){ int i, j; double x, y, z, t; i=5/2; x=5/2; y=(double)(5/2); j=(double)5/2; z=(double)5/2; t=5./2; printf(“%d, %g, %g, %d, %g, %g\n”, i, x, y, j, z, t); } /* 2, 2, 2, 2, 2.5, 2.5 */ G. Grigoras

  42. Fişiere în bibliotecă relative la tipuri • <limits.h> - pentru tipurile întregi • Întregul min/max: INT_MIN, INT_MAX • Numărul de biţi pe caracter CHAR_BIT • Etc. • <float.h> - pentru tipurile flotante: • Exponentul maxim • Precizia zecimală, etc. • <stdlib.h> - conţine funcţii de conversie: • Şir de caractere în int : atoi(const char*) • Şir de caractere în float:atof(const char*) G. Grigoras

  43. Instrucţiuni • Expresii: ; expresie; • Compuse (bloc): {declaraţiiinstrucţiuni} • Condiţionale: if if-else switch-case • Iterative: for while do-while • Intreruperea secvenţei: continue; break; return expr; • Salt necondiţionat: goto G. Grigoras

  44. Instrucţiunea expresie instr_expresie ::= {expresie}opt ; • Exemple: a = b; a + b + c; ; printf("a= %d\n", a); scanf("%d%f%c", &i, &x, &c); G. Grigoras

  45. Instrucţiunea compusă (bloc) instr_compusa ::= {{lista_declaratii}0+{lista_instructiuni}0+} • Grupează instrucţiuni într-o unitate executabilă. • Dacă sunt şi declaraţii la început, instrucţiunea compusă se numeşte şi bloc. • O instrucţiune compusă este ea insăşi o instrucţiune:oriunde poate să apară o instrucţiune, este corect săaparăşi o instrucţiune compusă. G. Grigoras

  46. Instrucţiunea compusă - Exemple { a += b += c; printf(“a = %d, b = %d, c = %d\n, a, b, c); } if(x > y){ int temp; temp = x; x = y; y = temp; } { int a, b, c; { b = 2;c = 3;a = b += c; } printf(“a= %d”, a); } G. Grigoras

  47. Instrucţiunile condiţionale if şi if-else instr_if ::= if(expr)instructiune instr_if-else ::= if(expr)instructiune else instructiune expr este o condiţie construită cu: • Expresii aritmetice • Comparatori: ==, !=, <, <=, >, >= • Conectori logici: &&, ||, ! G. Grigoras

  48. Instrucţiunile condiţionale if şi if-else Exemple: if(b == a) aria = a*a; if(x < y) min = x; else min = y; if(a%2) if(b%2) p = 1; else p = 2; if(a%2){ if(b%2) p = 1; }else p = 2; G. Grigoras

  49. Instrucţiunile if şi if-else - Exemple if (i>j) if(k>l) if(i>k) max = i; else max = k; else if(i>l) max = i; else max = l; else if(k>l) if(j>k) max = j; else max = k; else if(j>l) max = j; else max = l; G. Grigoras

  50. “Dangling else Problem” if (a == 1) if (b == 2) printf("*****\n"); else printf("ooooo\n"); • Nu lăsaţi forma codului să vă ducăîn eroare! Regula este: else este ataşat celui mai apropiat if. G. Grigoras

More Related