1.87k likes | 2.17k Views
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
E N D
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
Primul program C #include <stdio.h> int main(void) { printf(“Salut!\n”); printf(“Iata primul program C!”); return 0; } G. Grigoras
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
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
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
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
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
Î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
Î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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Valoarea expresiilor relaţionale G. Grigoras
Valoarea expresiilor logice || G. Grigoras
Valoarea expresiilor logice && G. Grigoras
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
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
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
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
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
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
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
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
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
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
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
Precedenţa operatorilor G. Grigoras
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
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
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
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
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
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
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
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
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
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
“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