Documente Academic
Documente Profesional
Documente Cultură
Limbaje de Programare
Limbaje de Programare
Cuprins
Funcții C
Tipuri de date in C
Operatori și expresii in C
Conversii de tipuri
Constante numerice
Variabile
Bibliografie selectivă
Funcții C
Funcții:
Date de
Prelucrare date Rezultate
intrare
#include <stdio.h>
int main( void )
{
printf("Hello world!\n");
return 0;
}
Funcții C
Să analizăm puțin programul: #include <stdio.h>
int main( void )
Linia #include <stdio.h> se folosește pentru a include fișierul {
antet stdio. Fişierele antet au prin convenţie extensia .h printf("Hello world!\n");
Stdio.h conţine prototipurile unei serii de funcţii de intrare şi return 0;
ieşire folosite de majoritatea programelor C }
int32_t Cu semn 32 4 −231 = −2 147 483 648 231 − 1 = 2 147 483 647
−263 = 263 − 1 =
int64_t Cu semn 64 8
−9 223 372 036 854 775 808 9 223 372 036 854 775 807
264 − 1 =
uint64_t Fără semn 64 8 0
18 446 744 073 709 551 615
Operatori și expresii
Un operator este un simbol care arată ce operaţii se execută asupra unor
operanzi (termeni)
Un operand este o constantă, o variabilă, un nume de funcţie sau o subexpresie
a cărei valoare este prelucrată direct de operator sau suportă în prealabil o
conversie de tip
Operatorii, după numărul de operanzi asupra cărora se aplică pot fi: unari, binari
şi ternari
Operatori și expresii
În C există 45 de operatori diferiţi dispuşi pe 15 niveluri de prioritate
În funcţie de tipul operanzilor asupra cărora se aplică, operatorii pot fi:
aritmetici, relaţionali, binari, logici, etc.
Operatorii sunt împărţiţi în clase de precedenţă (sau de prioritate)
În fiecare clasă de precedenţă este stabilită o regulă de asociativitate, care indică
ordinea de aplicare a operatorilor din clasa respectivă: de la stânga la dreapta
sau de la dreapta la stânga în cazul în care operatorii sunt din aceeași clasă.
Precedenţă Operator Descriere Asociativitate
[] Indexare
Selecţie membru (prin
. şi -> structură, respectiv
1 stanga-dreapta
pointer)
Postincrementare/post
++ şi --
decrementare
! Negare logică
Complement faţă de 1
~
pe biţi
Preincrementare/prede
++ şi --
crementare
2 dreapta-stânga
+ şi - + şi - unari
* Dereferenţiere
& Operator adresă
(tip) Conversie de tip
sizeof() Mărimea în octeţi
Precedenţă Operator Descriere Asociativitate
* Înmulţire
/ Împărţire
3 stânga-dreapta
% Restul împărţirii
4 + şi - Adunare/scădere stânga-dreapta
Deplasare
5 << si >> stânga-dreapta
stânga/dreapta a biţilor
< Mai mic
= Atribuire
Atribuire cu
+= şi -=
adunare/scădere
Atribuire cu
*= şi /=
multiplicare/împărţire
14 dreapta-stânga
%= Atribuire cu modulo
Atribuire cu SAU-
^=
EXCLUSIV
Atribuire cu deplasare
<<= şi >>=
de biţi
15 , Operator secvenţa stânga-dreapta
Operatori și expresii
Operatori aritmetici:
Operatorii aritmetici folosiţi în limbajul C sunt:
+ adunarea a două numere;
- scăderea a două numere;
* înmulţirea a două numere;
/ împărţirea a două numere (rezultatul împărţirii pentru reale, câtul împărţirii pentru întregi);
% modulo (restul împărţirii a două numere întregi);
++ incrementarea (mărirea unei valori cu o unitate);
-- decrementarea (micşorarea unei valori cu o unitate);
Operatori și expresii
În C:
◦ O expresie este o combinaţie de operanzi, separaţi între ei prin operatori.
◦ Operatorii aritmetici + - * și / au aceeași semnificație, asociativitate și precedență ca
în matematică.
◦ Toți operatorii sunt indicați explicit: în loc de 2n sau n(n + 1) trebuie scris 2*n și
respectiv n*(n+1)
◦ Parantezele ( ) se pot folosi pentru a grupa subexpresii în modul dorit.
4+6
Ex. se va scrie (4+6)/(3+2)
3+2
◦ Prin evaluarea unei expresii se obţine o valoare rezultat.
◦ Tipul valorii rezultat depinde de tipul operanzilor şi a operatorilor folosiţi. Astfel
operațiile cu întregi vor da ca rezultat întregi.
Operatori și expresii
Operația de împărțire diferă pentru operatorii întregi și cei reali, restul operațiilor aritmetice
fiind la fel.
Pentru operatorii reali împărțirea / se efectuează exact, iar pentru cei întregi are loc o
împărțire cu rest. Astfel, operatorul / aplicat întregilor va avea ca rezultat câtul împărțirii.
Operatorul % (modulo) se poate aplica doar pentru întregi și are ca rezultat restul împărțirii.
Ex. pentru:
9.0/ 2.0 => 4.5 9/2 => 4 9%2 => 1
9.0/-2.0 => -4.5 9/-2 => -4 9%-2 => 1
-9.0/2.0 => -4.5 -9/2 => -4 -9%2 => -1 (semnul restului este dat de
semnul deîmpărțitului)
Operatori și expresii start
Exemple:
x,y
Media a două numere reale:
medie : R×R→R medie(x,y) = (x + y)/2
rezultat=(a+b)/2
rezultat
stop
Operatori și expresii start
O variantă de implementare în C a mediei este:
x,y
double medie ( double x , double y)
{
return (x+y )/2;
}
rezultat=(a+b)/2
rezultat
stop
Operatori și expresii start
Exemple:
x
f : Z→Z f (x) = 2x + 1
va fi in C:
rezultat
stop
Conversii de tipuri
Conversii implicite
Ce se întâmplă cand avem o expresie cu operanzi de tipuri diferite?
Când un operator acționează asupra unor variabile de tipuri diferite, acestea sunt
convertite automat la un tip comun
În general conversiile automate, aduc un operand de la un tip cu un domeniu de valori mai
restrâns la un tip cu un domeniu de valori mai larg
Ex.
int x = 10; // declararea unei variabile x de tip intreg si initializarea acesteia cu valoarea 10
float z = x + 1.0; //in acest caz se face automat conversia lui x la tipul real
Conversii de tipuri
Conversii implicite
char
short int
int
unsigned int
long
unsigned long
float
double
Conversii de tipuri
Atenție: În cazul expresiilor prin care se poate pierde informație compilatorul va da doar
mesaje de avertisment (nu rezultă erori de compilare!).
Ex.
long x = 2147483646;
short y;
y = x;
Nu va rezulta o eroare de compilare in acest caz, dar valoarea lui y va fi alta decat cea a lui x
Conversii de tipuri
Conversii explicite
Se pot face conversii explicite, folosind următoarea sintaxă:
(tip) expresie
Ex.
int x=5, y=2;
float z;
z = x/y; //in acest caz z primeste valoarea 2.0
z = (float) x/y; //in acest caz z primeste valoarea 2.5
În al doilea caz se face o conversie explicită a lui x la tipul float
Constante numerice
Operanzii unei expresii pot fi reprezentați și de către constante numerice
Uneori avem nevoie să utilizăm în programul nostru astfel de constante
Tipul constantei este dat de modul în care scriem această constantă
Ex.
5 – întreg (int)
5.0 – real (double)
5L – întreg lung (long int)
5U – număr natural (unsigned int).
Constante numerice
Constantele întregi pot fi date in bazele:
◦ 10: 257, -65, +4928 - au prefix semnul sau nu au prefix
◦ 8: 0125, 0177 - conțin un 0 ca prefix
◦ 16: 0x1ac, 0XBF3 - conțin 0x sau 0X ca prefix
Constantele reprezentând:
◦ numere întregi lungi se scriu cu sufixul L: 125436L
◦ numere naturale (fără semn/ unsigned) se scriu cu sufixul U: 123U
◦ numere reale conțin fie punct (.) fie exponent (ex. 1e-2)
Sufixele U și L pot fi aplicate și constantelor ce reprezintă numere în baza 8 sau 16
Zona rezervată Argumente pe linie de comandă
și variabile de mediu
Variabile Stiva
Exemple:
int x:
int x=5; //aici x primește o valoare inițială
Variabile
Reguli pentru denumirea unei variabile:
◦ Numele unei variabile este alcătuit din caractere alfanumerice și simboluri
speciale ca _
◦ Numele unei variabile nu poate începe cu o cifră
◦ Nu pot face parte din numele unei variabile spațiile libere
◦ Cuvintele cheie nu pot constitui nume de variabile
◦ Limbajul C, face diferență între majuscule (litere mari) și minuscule (litere
mici)
Variabilele locale:
◦ se declară în interiorul funcției …
◦ se rețin pe stivă
Segmentul de cod
Variabile - Domeniu de vizibilitate
int m, n, p; float x, y, z; /* m1, n1, p1, x1, y1, z1 */
int f(int n, int x)
{ /* n2, x2: alt n, alt x */
int i; float y = 1; /* i1, y2 */
m = p; p = n; /* m1 = p1; p1 = n2; */
return z += x + y; /* z1 += x2 + y2 */
}
Variabile – Atribuirea unei valori
Scopul atribuirii este de a modifica valoarea memorată într-o variabilă.
Sintaxa:
nume-variabila = expresie;
Exemple:
int a = 2 , b=3, c ;
c=a+b;
Observație: ”=” reprezintă în acest caz operatorul de atribuire, nu cel de
egalitate matematică (care se notează ”==” ) !
Variabile – Atribuirea unei valori start
Exemple: x
Funcția pătrat definită în acest curs, poate
fi scrisă și în modul următor:
int f ( int x)
int patrat { patrat=x*x
◦ este o variabilă locală a cărei valoare va fi int patrat;
returnată de funcție patrat = x∗x;
return patrat;
◦ nu este necesar să fie inițializată cu o
} patrat
valoare constantă, deoarece i se atribuie
valoarea x*x, înainte să fie returnată sau
utilizată în alte expresii
stop
Variabile – Atribuirea unei valori
Atribuirea unei valori are ca efecte:
◦ Evaluarea expresiei din dreapta operatorului
◦ Atribuirea valorii rezultate, variabilei din stânga operatorului
Exemple:
c = sqrt(2);
n = n-1;
r = r * n;
Atribuirea în lanț:
a = b = x+3 (a și b primesc aceeași valoare)
Variabile – Atribuirea unei valori
O variabilă se poate modifica doar prin atribuire.
NU se modifică prin alte expresii (excepție fac operatorii ++ și --), sau transmisă
ca parametru (prin valoare)!
n + 1;
sqr(x);
calculează dar NU modifică!
n = n + 1;
x = sqr(x);
modifică (prin atribuire)
Variabile – Atribuirea unei valori
Există și operatori care combină operația de atribuire cu unele operații aritmetice:
Pentru mai multe informații cu privire la subiectele acoperite de acest curs, accesați:
http://staff.cs.upt.ro/~marius/curs/lp/old/notes1.pdf
Bibliografie selectivă
◦ Kernighan, B. W., & Ritchie, D. ”The C programming language - Second
edition”, 1988 Prentice Hall Software Series
◦ Minea, M., Limbaje de programare, materiale de curs
http://staff.cs.upt.ro/~marius/curs/lp/index.html
◦ Holotescu, C., Limbaje de programare, materiale de curs
http://labs.cs.upt.ro/~oose/pmwiki.php/LP/Lectures
◦ Iorga,V., Programarea Calculatoarelor, materiale de curs
http://andrei.clubcisco.ro/cursuri/anul-1/semestrul-1/programarea-
calculatoarelor.html