210 likes | 345 Views
Programare in limbajul C – Cursul 2 Tipuri de date elementare şi operatori Prof. univ. dr. Constantin Popescu. Agenda. Numele variabilelor in C Tipuri de baza in C Declararea variabilelor Constante Declararea constantelor Operatori aritmetici Operatorul de a tribuire A peluri de funcţii.
E N D
Programare in limbajul C – Cursul 2Tipuri de date elementare şi operatoriProf. univ. dr. Constantin Popescu
Agenda • Numele variabilelor in C • Tipuri de baza in C • Declararea variabilelor • Constante • Declararea constantelor • Operatori aritmetici • Operatorul de atribuire • Apeluri de funcţii
Numele variabilelor in C (1) Nume de variabile: • Numele poate contine litere, cifre si liniuta de subliniere • Primul caracter trebuie sa fie o litera sau liniuta de subliniere. • Atentie la liniuta de subliniere • Cuvintele cheie C nu pot fi utilizate ca nume de variabile: present, hello, y2x3, r2d3, ... /* OK */ Hello#there /* ilegal */ double /* ilegal */ 2fartogo /* ilegal */
Numele variabilelor in C (2) Sugestii pentru numele variabilelor: • DA: utilizati nume de variabile ce sunt descriptive • DA: adoptati si mentineti un standard de numire • Este folositor mai ales pentru aplicatii mari • EVITATI: numele de variabile care incep cu liniuta de subliniere (underscore) • Acestea sunt utilizate adesea de sistemul de operare • EVITATI: utilizarea literelor mari pentru nume de variabile • In general acestea sunt folosite pentru pre-procesor
Tipuri de baza C (1) • În C există doar 4 tipuri de bază: • char – un caracter (un octet sau byte) • int – un întreg cuprins în intervalul [–32768, 32767], (de ex. 32 sau 64 biti) • float – un număr real, simpla precizie • double – un număr real, cu dubla precizie şi domeniu mai mare decât float.
Tipuri de baza C (2) • Exista si alte tipuri ce deriva din tipurile de baza: • lungimea datelor • short int: - intreg "scurt", <= numarul de biti dintr-un int -se poate scrie doar "short" • long int: - intreg "lung", >= numarul de biti dintr-un int - un întreg cuprins în intervalul [–214743648, 2147483647] - adesea are acelasi numar de biti dintr-un int - se poate scrie doar "long" • long double - precizie extinsa pentru float • cu semn si fara semn • unsigned int - tipul int fara semn - daca int are 32-biti, se afla in 0..232-1 - se poate folosi cu long si short • unsigned char - un numar intre 0 si 255 • signed char - un numar intre –128 si 127 (valoare de 8-biti) -similar cu byte in Java
Tipuri de baza C (3) • Toate tipurile au o marime fixa asociata cu ele: • Aceasta marime poate fi determinata in timpul compilarii • Exemple • Aceste numere sunt variabile intre compilatoarele C si arhitectura computerului. • Atentie la portabilitate DATEOcteti necesari Litera x (char) 1 Numarul 100 (int) 4 Numarul 120.145 (double) 8
Tipuri de baza C (4) Pentru computere pe 32 biti Tip Cuvint cheie Octeti Interval character char 1 -128...127 integer int 4 -2 147 483 648...2 147 438 647 short integer short 2 -32768...32367 long integer long 4 -2 147 483 648...2 147 438 647 long long integer long long 8 -9223372036854775808 … 9223372036854775807 unsigned character unsigned char 1 0...255 unsigned integer unsigned int 2 0...4 294 967 295 unsigned short integer unsigned short 2 0...65535 unsigned long integer unsigned long 4 0...4 294 967 295 single-precision float 4 1.2E-38...3.4E38 double-precision double 8 2.2E-308...1.8E308
Declararea variabilelor (1) • Forma generala: numetip numevar1, numevar2, ...; • Exemple: int count; float a; double percent, total; unsigned char x,y,z; long int aLongInt; long AnotherLongInt; unsigned long a_1, a_2, a_3; unsigned long int b_1, b_2, b_3; typedef long int32; int32 n; • Declaratiile variabilelor afecteaza scopul si vizibilitatea • Variabilele declarate in afara oricarei functii sunt variabile globale • De ex. Chiar inainte de rutina main
Initializarea variabilelor (2) Initializarea variabilelor: • INTOTDEAUNA se initializeaza o variabila inainte de utilizare • Altfel apar erori • Valoarea unei variabile neinitializata este nedefinita in standardul C • Exemple: int count; /* Aloca spatiu pentru variabila count */ count = 0; /* Initializeaza count cu 0 */ • Initializarea se poate face la definitie: int count = 0; double percent = 10.0, rate = 0.56; • Atentie: la iesirea din interval (“out of range errors”) unsigned int value = -2500; • Compilatorul C nu detecteaza aceasta ca o eroare • Limbajul C face distincţie între literele mari şi mici: identificatorii variabila, Variabila, VARIABILA sau variAbila vor fi diferiţi.
Constante (1) • Cele mai simple sunt constantele întregi în baza 10, de ex. 0, 1, 2, 123. • Câteodată e necesară specificarea constantelor în baza 8 sau baza 16 (octal sau hexazecimal) • Pentru ca o constantă să fie interpretată ca un număr în baza 8 acesta se precede cu 0, iar pentru a fi interpretată în baza 16 se precede cu 0x sau 0X: constantele 100, 0144 şi 0x64 toate reprezintă acelaşi număr. (Dacă scrieţi 0123 această constantă va fi interpretată ca şi o constantă în baza 8 a cărei valoare în baza 10 este 1x82 + 2x81 + 3x80 = 83). • O constantă poate fi forţată a fi de tip long int dacă folosim sufixul L (litera mare sau mică, deşi e recomandat a se folosi litera L mare pentru că litera l mic se confundă cu cifra 1). • O constantă ce conţine un punct sau litera e (sau ambele) este o constantă reală: 3.14, 10., .01, 123e4, 123.456e7. • O constantă caracter este doar un caracter cuprins între apostrofuri: ‘A’, ‘.’, ‘%’. Valoarea numerică a unei constante caracter este valoarea caracterului în setul de caractere al maşinii. (În ASCII caracterul ‘A’ are codul 65). • Un şir de caractere este reprezentat în C printr-o succesiune de caractere. Un şir de caractere constant este o succesiune de zero sau mai multe caractere delimitate de ghilimele: “hello”, “world”, “John”. În cadrul constantelor caracter şi şir de caractere, caracterul \ (backslash) are un sens special; el este folosit pentru a reprezenta caractere ce nu se pot introduce de la tastatură sau care din anumite motive nu se pot reprezenta altfel în cadrul constantelor.
Constante (2) • Cele mai folosite astfel de “secvenţe escape” sunt: Secventa Ce reprezinta \a Bell (alertare) \b Backspace \n Newline (linie noua) \t Tab orizontal \\ Backslash \' Apostrof \" Ghilimele \xhhCaracterul ASCII specificat de hh \oooCaracterul ASCII specificat de ooo
Constante (3) • De exemplu, “el a spus \”Salut\”” este un şir constant ce conţine ghilimele iar ‘\’’ este o constantă caracter ce conţine caracterul apostrof. • De reţinut: constanta ‘A’ este diferită de şirul de caractere “A”. • Exemplu: Funcţia care urmează returnează lungimea unui şir de caractere: #include <stdio.h> int strlen(char s[]); int main() { char s[100]; printf("Introduceti sirul: \n"); gets(s); printf("Lungimea sirului este: %d\n", strlen(s)); return 0; } int strlen(char s[]) { int i; i=0; while(s[i]!=’\0’) ++i; return i; }
Declararea constantelor (1) Constante • Se pot declara variabile ca fiind constante: • Utilizind const: const double pi=3.1415926; const int maxlength=2356; const int val=(3*7+6)*5; • Constantele sunt utile deoarece: • Arata programatorului ca o valoare nu se schimba • Codul poate fi citit mai usor • Spune compilatorului ca o valoare nu se schimba • Compilatorul poate astfel compila codul mai rapid • Este bine sa se aleaga nume de constante cit mai elocvente Nota: simple calcule sunt permise – se evalueaza in momentul compilarii
Declararea constantelor (2) Constante Preprocesor • Forma Generica: #define CONSTNAME identificator • In general constantele pre-processor se scriu cu litere mari (prin conventie). • Exemplu: #define PI 3.14159 • Ce se intimpla?: • Preprocesorul C ruleaza inaintea compilatorului. • Cind intilneste simbolul PI, il substituie cu valoarea 3.14159. • Compilatorul ruleaza apoi cu acest cod C “pre-procesat”.
Declararea constantelor (3) • Exemplu: #include <stdio.h> #define GRAMS_PER_POUND 454 const int FARFARAWAY = 3000; int main () { int weight_in_grams, weight_in_pounds; int year_of_birth, age_in_3000; printf ("Enter your weight in pounds: "); scanf ("%d", &weight_in_pounds); printf ("Enter your year of birth: "); scanf ("%d", &year_of_birth); weight_in_grams = weight_in_pounds * GRAMS_PER_POUND; age_in_3000 = FARFARAWAY - year_of_birth; printf ("Your weight in grams = %d\n", weight_in_grams); printf ("In 3000 you will be %d years old\n", age_in_3000); return 0; }
Operatori aritmetici Operatorii aritmetici din limbajul C sunt : + adunare – scădere * înmulţire / împărţire % rest • Operatorul – poate fi utilizat în două moduri: pentru a face diferenţa dintre două numere (a - b), sau ca operator unar (-a sau a + - b). • Când operatorul de împărţire este aplicat numerelor întregi, nu se va ţine cont de restul împărţirii aşa că 1/2 va fi 0 iar 7/4 va fi 1. Dar, când unul din operanzi este de tip real (float sau double), operatorul de împărţire va genera un rezultat care este număr real cu o parte fracţionară diferită de zero de cele mai multe ori. Aşadar 1 / 2.0 va avea valoarea 0.5 şi 7.0 / 4.0 va avea valoarea 1.75. • Operatorul rest % va genera restul împărţirii a doi întregi: 1 % 2 are valoarea 1, 7 % 4 are valoarea 3. (Operatorul poate fi aplicat doar asupra întregilor). • Înmulţirea, împărţirea şi restul sunt operatori cu precedenţă mai mare decât adunarea şi scăderea.
Operatorul de atribuire • Operatorul de asignare atribuie o valoare unei variabile. De exemplu, x = 1 • stabileşte valoarea lui x la 1, şi a = b • atribuie variabilei a valoarea lui b. • Expresia: i = i + 1 • Este o expresie standard în programare pentru incrementarea valorii unei variabilei cu 1. • Expresia ia valoarea veche a lui i, îi adaugă 1 şi salvează noua valoare în variabila i. Semnul egal a fost numit “operator de asignare” iar expresiile în care apare se numesc expresii de asignare. Semnul egal este un operator în limbajul C la fel cum sunt + şi -. • Limbajul C nu are o instrucţiune de asignare; o asignare de genul a = b este o expresie şi poate fi folosită oriunde poate să apară o expresie. Fiind o expresie, asignarea a = b are o valoare şi anume aceeaşi valoare care se asignează variabilei a. Această valoare poate fi folosită în alte expresii; de exemplu, putem scrie: c = a = b, care este o expresie echivalentă cu c = (a = b) • Valoarea lui b este atribuită atât lui a cât şi lui c.
Exemplu • Următorul program tipăreşte un tabel cu temp. Fahrenheit şi echivalentul lor în grade Celsius, utiliz. formula C=(5/9)(F-32). #include <stdio.h> int main() { int lower, upper, step; float fahr, celsius; lower = 0; /*limita de jos a tabelei de temperaturi*/ upper = 300; /* limita de sus a tabelei de temperaturi */ step = 20; /* marimea pasului*/ fahr=lower; while(fahr <= upper) { celsius = 5 * (fahr - 32)/9; printf(“%4.0f\t%6.1f\n", fahr, celsius); fahr = fahr + step; } return 0; }
Apeluri de funcţii • Exemple de apeluri de funcţii: printf("Hello, world!\n") printf("%d\n", i) sqrt(144.) getchar() • Parametri unei funcţii pot fi şi expresii. Prin urmare nu trebuie să folosim cod de genul: int sum = a + b + c; printf("sum = %d\n", sum); • În locul celor două linii de cod de mai sus putem scrie una singură: printf("sum = %d\n", a + b + c); • Multe funcţii returnează o valoare, iar apelurile acelor funcţii pot fi introduse în expresii: c = sqrt(a * a + b * b); x = r * cos(theta); i = f1(f2(j));
Exemplu-calculul ipotenuzei #include <stdio.h> #include <conio.h> #include <math.h> int main() { float cateta1, cateta2, ipotenuza; printf(“Calculul ipotenuzei\n"); printf("---------------------\n\n"); printf(“Introduceti o cateta: "); scanf("%f", & cateta1); printf(" Introduceti a doua cateta : "); scanf("%f", & cateta2); ipotenuza = sqrt ( pow(cateta1,2) + pow(cateta2,2) ); printf("\n\n O cateta este: %10.3f\n", cateta1); printf(" Cealalta cateta este : %10.3f\n", cateta2); printf(“Ipotenuza este: %10.3f\n", ipotenuza); printf("\nApasa orice tasta..."); getch(); return 0; }