001 cursul5 spam
TRANSCRIPT
-
Programarea Calculatoarelor(limbajul C)
Curs 4 Operatori i Modul deEvaluare al Expresiilor
Universitatea Politehnica din BucuretiFacultatea de Electronic, Telecomunicaii i
Tehnologia Informaiei
.l. Bogdan IONESCUProf. Drago BURILEANUProf. Claudius DAN
2010-2011 2
Cuprins
4.1. Operatori i modul de evaluare al expresiilor
4.2. Instruciuni de scriere i citire
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 1/44
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 2/44
4.1. Operatori i modul de evaluare al expresiilor
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 3/44
Operatorii folosii n limbajul C
> Am vorbit pn acum de variabile i constante, precum i
de tipuri de date, dar cum ne folosim de valorile acestora
pentru efectuarea anumitor calcule ?
pe baza operatorilor
> n limbajul C, spre deosebire de alte limbaje de programare
n care operatorii sunt definii folosind cuvinte cheie, operatorii
sunt definii folosind simboluri ce nu fac parte din alfabet, dar
care sunt disponibile pe orice tip de tastatur.
acest lucru face ca limbajul C s fie mai compact,
precum i mai accesibil pentru toate limbile.
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 4/44
Operatorii folosii n limbajul C (continuare)
> Limbajul C propune urmtorii operatori:
A. operatorul de atribuire,
B. operatori aritmetici,
D. operatori de incrementare i decrementare,
E. operatori relaionali,
F. operatori logici,
G. operatorul virgul,
H. operatori de lucru cu bii,
I. operatorul de forare a tipului,
J. operatorul sizeof(),
C. operatori de atribuire mixt,
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 5/44
Operatorii folosii n limbajul C (continuare)
A. Operatorul de atribuire
Exemplu: a = 3;
a = b;
> n limbajul C atribuirea unei valori unei variabile se face
folosind =.
a ia valoarea 3
a ia valoarea lui b
B. Operatorii aritmetici
operatori clasici: + (adunare), - (scdere),
* (nmulire) i / (mprire),
operatorul modulo: % (restul mpririi ntregi, doar
pentru numere ntregi)Exemplu: 5 % 3 = 2
3 % 1 = 0
-
7Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 6/44
mprirea ntreag: / (acelai operator de mprire)
Cum se specific c este vorba de o mprire ntreag ?
Exemplu: 13 / 3 = 4
13.0 / 3 = 4.33
dac numerele sunt ntregi mprire ntreag, dac un numr este real mprire real.
Operatorii folosii n limbajul C (continuare)
B. Operatorii aritmetici (continuare)
Exemple:
...float x;x=23/3;...
???
...float x=3.5,y;y=x/5;...
???
x=7.00 y=0.7
8
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 7/44
Operatorii folosii n limbajul C (continuare)
C. Operatorii de atribuire mixt
> Exist o modalitate de scriere prescurtat a operaiilor de
atribuire pentru a facilita utilizarea lor direct n alte expresii.
Form general:
=
+, -, *, /, %
Rezultat:
=
Exemple: i+=3;
x*=y+2;
i=i+3;
a%=14;
x=x*(y+2);
a=a%14;
> Acetia sunt: ++ i respectiv --.
y++; este echivalentul scrierii y=y+1;
y--; este echivalentul scrierii y=y-1;
Operatorii folosii n limbajul C (continuare)
D. Operatorii de incrementare i decrementare
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 8/44
> Motivaie: sunt mai rapizi dect executarea clasic a
operaiei de atribuire.
> Pot fi utilizati att ca prefix ct i ca sufix, eficientiznd astfel
scrierea operaiilor (++x sau x++, --y sau y--).
Exemplu:
...x=((++z) (w--)) % 100;...
z=z+1;
x=(z-w) % 100;
w=w-1;10
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 9/44
Operatorii folosii n limbajul C (continuare)
E. Operatorii relaionali
> n limbajul C se folosesc urmtorii operatori relaionali:
operatori clasici: > (mai mare), 3) && (154) = 1 (Adevrat)
&&i logic -
0 && 0 = 01 && 0 = 00 && 1 = 01 && 1 =1
12Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 11/44
(10>3) || (154)) = 0 (Fals)
negarea - !
!0 = 1!1 = 0
-
13
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 12/44
Operatorii folosii n limbajul C (continuare)
F. Operatorii logici (continuare)
PEnun: i este o variabil ntreag i c este o variabil
alfanumeric (caracter). S se scrie condiia logic care
returneaz valoarea 1 dac i mai mic ca 10 i c diferit de
x, i respectiv valoarea 0 dac i mai mare sau egal cu
10 sau c are valoarea x:
(i=10 returneaz 0
c==x returneaz 0
14
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 13/44
Operatorii folosii n limbajul C (continuare)
G. Operatorul virgul
> Operatorul , este folosit pentru a separa dou sau mai
multe expresii ce sunt incluse ntr-o formulare n care de regul
se ateapt doar o expresie.
Exemplu:
a = (b=3, i=i+1, b+2);
Form general:
(, ..., ,);
> Se evalueaz toate expresiile, dar n cazul n care se
folosete valoarea operatorului atunci doar ultima expresie este
returnat.
b3, ii+1, ab+2=5
15
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 14/44
Operatorii folosii n limbajul C (continuare)
H. Operatorii de lucru cu bii
> Acetia modific variabilele pe baza modificrii valorilor
binare ce corespund acestora.
Operator Echivalent Descriere
& I operaia logic I pe bii
| SAU operaia logic SAU pe bii
^
^^
^ SAU excl. operaia logic SAU excl. pe bii
~
~ ~
~ negaie operaia de inversare bii
>
>> SHR operaia de shiftare pe bii
16
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 15/44
Operatorii folosii n limbajul C (continuare)
I. Operatorul de forare a tipului (casting)
> Acesta permite conversia temporar a unei date de un
anumit tip, ntr-un tip de baz ce este specificat de utilizator.
Form general:
()
Exemple:
int
intint
int i;
float
floatfloat
float f=3.14;i=(int)int)int)
int) f; i=3
float
floatfloat
float x;
int
intint
int y=9;x=(float)float)float)
float) y/4; x=2.25
sau C++
()
ex.: x=float(float(float(
float(y)))
)/4;
17
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 16/44
Operatorii folosii n limbajul C (continuare)
J. Operatorul sizeof()
> Acest operator accept un singur parametru i anume, fie
un tip de dat fie o variabil, i returneaz dimensiunea n
bytes a acestora.
> Este necesar la alocarea dinamic a memoriei pentru a
specifica dimensiunea datelor.
Exemple:
int a;a=sizeof(char);
a=1 int i;double a;i=sizeof(a);
i=8
18Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 17/44
> n limbajul C toi operatorii au o prioritate, iar operatorii cu
prioritate mai mare sunt evaluai naintea celor cu prioritate
mai mic.
> Operatorii cu aceeai prioritate sunt evaluai de la stnga
la dreapta.
a - b - cExemplu: este evaluat astfel: (a b) - c
Precedena operaiilor
Exemplu: a=5+7%2 este evaluat aa? 5+(7%2)
sau aa? (5+7)%2
corect
-
19Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 18/44
Precedena operaiilor (continuare)
> Prioritatea operatorilor n C (de la prioritatea maxim la
cea minim):
surs www.cplusplus.com
20
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 19/44
Precedena operaiilor (continuare)
> Exemplu:
> n general ca s fim siguri de execuia corect a operaiilor
este recomandat s folosim parantezele.
a < 10 && 2 * b < c ???
> S vedem care sunt prioritile:
nivelul 6 - * (nmulirea)
nivelul 9 - (relaii)
nivelul 14 - && (i logic)
(a < 10) && ((2 * b) < c)
21Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 20/44
Evaluarea expresiilor
> Din evaluarea unei expresii n C rezult o valoare. Tipul i
implicit valoarea rezultatului unei expresii se stabilesc pe baza
unor reguli de conversie.
> Vorbim de reguli de conversie n cazul n care n expresie
apar constante, variabile i funcii de tipuri diferite.
> Regulile de conversie de evaluare a unei expresii ce nu
implic operatorul de atribuire sunt urmtoarele:
R1. toate datele de tip char i short int sunt convertite la int.
Toate datele de tip float sunt convertite la double.
22Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 21/44
Evaluarea expresiilor (continuare)
> Regulile de conversie de evaluare a unei expresii ce nu
implic operatorul de atribuire sunt (continuare):
R2. pentru toate perechile de operanzi, dac unul dintre
operanzi este de tip long double, cellalt operand este
convertit la long double.
R3. dac unul dintre operanzi este de tip double, cellalt
operand este convertit la double.
R4. dac unul dintre operanzi este long, cellalt operand este
convertit la long.
R5. dac unul dintre operanzi este unsigned, cellalt operand
este convertit la unsigned.
23
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 22/44
Evaluarea expresiilor (continuare)
> Pentru operaia de atribuire, regula de conversie de tip este:
RA. valoarea din partea dreapt a operatorului de atribuire
(=) este convertit la tipul variabilei din partea stng. Dac
aceast conversie nu este posibil, compilatorul va semnala o
eroare.
Concluzie: ntotdeauna are loc evaluarea expresiei din partea
dreapt aplicndu-se regulile de conversie R1-R5 i dup
aceea se aplic regula RA pentru operaia de atribuire.
R1 R2 R3 R4 R5 RA
24
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 23/44
Evaluarea expresiilor (continuare)
> Exemplu:
char
charchar
char ch;
int
intint
int i;float f;double d, rezultat;
rezultat = (ch
rezultat = (chrezultat = (ch
rezultat = (ch / i
/ i/ i
/ i)
))
) + (f * d)
+ (f * d) + (f * d)
+ (f * d)
(f + i);
(f + i);(f + i);
(f + i);
int double double
int double double
double
double
double
-
25Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 24/44
4.2. Instruciuni de scriere i citire
26Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 25/44
> n aceast seciune vom discuta despre instruciunile clasice
de scriere i citire a datelor n limbajul C.
- instruciunea printf (scriere date),
- instruciunea scanf (citire date).
Instruciuni de scriere i citire a datelor
acestea se gsesc n biblioteca
> Vom vorbi despre:
27Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 26/44
Instruciuni de scriere a datelor
Instruciunea printf
int
intint
int printf (const char *format, a, b, 15, ... );
Prototipul funciei:
> Instruciunea printf scrie pe dispozitivul standard de ieire
(stdout, de regul ecran), o secven de date formatat.
format (ir de caractere) specific modul de afiare (formatare) ct i tipul datelor afiate
dup , se specific variabilele sau constantele
anunate n format.
28Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 27/44
Instruciuni de scriere a datelor (continuare)
Instruciunea printf (continuare)
printf(Acesta este un text simplu);
Exemplu simplu:
c:\>Acesta este un text simplu
> Modul de formatare (irul de caractere) este specificat
ntre i (precum un string),
> n cazul n care nu inserm variabile sau constante nu se mai
folosete enumerarea de dup ,.
> irul de caractere furnizat este afiat ntocmai (respectnd
spaiile existente).
29Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 28/44
Instruciuni de scriere a datelor (continuare)
Instruciunea printf (continuare)
> irul de caractere specificat poate conine att text ct i
parametri de afiare ce vor fi interpretai i substituii la
afiare cu argumentele specificate dup , (variabile, valori, ...).
> Modul de specificare al parametrilor de afiare este
urmtorul:
%[indicatori][lime][.precizie][lungime]specificator
caracterul special %: specific faptul c vrem s afim
o variabil sau constant. Este nlocuit la afiare cu valoarea
argumentului corespunztor de dup ,
[ ] nseamn opional
30Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 29/44
Instruciuni de scriere a datelor (continuare)
Instruciunea printf (continuare)
%[indicatori][lime][.precizie][lungime]specificator
specificator: (obligatoriu) specific tipul i modul de afiare
a valorii argumentului.
> Cei mai frecvent folosii specificatori sunt:
c tipul caracter (char)
d sau i tipul ntreg (decimal: signed int)
e sau E tipul real n scrierea tiinific
f tipul real (float) 3.9265eeee-2 = 3.9265x10-2
s tipul ir de caractere (string)
% se afieaz caracterul rezervat %
-
31Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 30/44
Instruciuni de scriere a datelor (continuare)
Instruciunea printf (continuare)
%[indicatori][lime][.precizie][lungime]specificator
indicatori: (opionali) specific s zicem detalii de afiare:
- - aliniere a textului la stnga pe limea specificat
(implicit este la dreapta)
0 - bordeaz numrul cu zerouri la stnga n loc de
spaii dac se specific limea de afiare.
lime: (opional) specific numrul minim de caractere pe
care va fi afiat valoarea argumentului. Surplusul de caractere
alocate nefolosite este bordat cu spaii.
+ - foreaz afiarea semnului chiar dac numrul
este pozitiv,
32Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 31/44
Instruciuni de scriere a datelor (continuare)
Instruciunea printf (continuare)
%[indicatori][lime][.precizie][lungime]specificator
.precizie: (opional)
- pentru valori ntregi: specific numrul minim de cifre (digii) cu care va fi afiat valoarea (nu trunchiaz),
- pentru valori reale: specific numrul de cifre (digii) de dup virgul (rotunjete),
- pentru iruri de caractere: specific numrul maxim de caractere ce vor fi afiate (trunchiaz),
lungime: (opional) specific mai precis tipul datei:
h - short int sau unsigned short int,
l - long int sau unsigned long int.
33Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 32/44
Instruciuni de scriere a datelor (continuare)
Instruciunea printf (continuare)
Exemple:
printf
printfprintf
printf("Caractere: %c%c%c
%c %c
%c%c
%c", 'a', 65);
c:\>Caractere: a A
printf
printfprintf
printf(Valori intregi: %%%
%i %%%
%ld", 1977, 650000);
c:\>Valori intregi: 1977 650000
printf
printfprintf
printf(Precedat de spatii: %%%
%10d", 1977);
c:\>Precedat de spatii: 1977
34Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 33/44
Instruciuni de scriere a datelor (continuare)
Instruciunea printf (continuare)
printf
printfprintf
printf(Precedat de zerouri: %%%
%010d", 1977);
c:\>Precedat de zerouri: 0000001977
printf
printfprintf
printf(Numere reale: %4.2f%4.2f%4.2f
%4.2f %+.0e
%+.0e%+.0e
%+.0e %E
%E %E
%E ", 3.1416, 3.1416, 3.1416);
c:\>Numere reale: 3.14 +3e+000 3.141600E+000
printf
printfprintf
printf( %
%%
%s, Un sir de caractere);
c:\> Un sir de caractere
Exemple (continuare):
35Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 34/44
Instruciuni de scriere a datelor (continuare)
Instruciunea printf (continuare)
> Exist i o serie de comenzi speciale de formatare:
\n - new line: la ntlnirea acestei comenzi cursorul trece pe
linie nou (echivalent tast Enter),
\t - tab: la ntlnirea acestei comenzi cursorul avanseaz
un anumit numr de caractere la dreapta (echivalent tast Tab),
Exemplu:
int i=10; float x=3.14;printf(i=%%%
%d \n x=%f%f%f
%f", i, x);
i=10x=3.14
36
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 35/44
Instruciuni de scriere a datelor (continuare)
Instruciunea printf (continuare)
PEnun: folosind instruciunea printf s se afieze pe
ecran valorile reale 3.12, 34.5, 400.0, 56.789, cu 3
zecimale, sub forma unui tablou (se folosete indentarea)
Soluie:
printf(Solutia este\n");printf("%8.3f \t %8.3f \n", 3.12, 34.5);printf("%8.3f \t %8.3f", 400.0, 56.789);
3.120 34.500400.000 56.789
-
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 36/44
Instruciunea scanf
int
intint
int scanf (const char *format, &a, &b, ... );
Prototipul funciei:
> Instruciunea scanf permite citirea datelor de pe dispozitivul
standard de intrare (stdin, de regul tastatur), i le stocheaz
n locaiile de memorie specificate de utilizator (pointeri).
Instruciuni de citire a datelor
dup , se specific unde vor fi stocate datele
(adrese de memorie)
format (ir de caractere) specific tipul datelor citite.
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 37/44
Instruciuni de citire a datelor (continuare)
Instruciunea scanf (continuare)
> Modul de formatare a datelor (irul de caractere format)
este specificat ntre i (precum un string),
scanf(%d, &a);
Exemplu simplu:- se ateapt introducerea de la tastatur a unui numr ntreg ce va fi stocat n variabila a.
> Dup , urmeaz specificarea locaiei de memorie unde va
fi stocat valoarea introdus.
00110010
n memorie:
10110111 00000000
adres 10 adres 11 adres 12
desemnat
de a (valoare)
desemnat
de &a (adres)
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 38/44
> irul de caractere format, ce specific tipul datelor citite,
poate conine urmtoarele informaii:
Instruciuni de citire a datelor (continuare)
Instruciunea scanf (continuare)
- spaii goale (whitespace): funcia va ignora toate
spaiile goale indiferent de cantitate (aceasta include
spaiile, tab i linie nou),
- alte caractere diferite de spaiu i % : orice alt caracter
ce nu este spaiu sau alt caracter ce face parte din
specificarea formatului datelor are ca efect:
citirea de la tastatur a unui caracter, i compararea acestuia cu caracterul n cauz, dac ==, nu este luat n calcul i funcia continu cu urmtorul caracter din irul format, dac != exit.
40
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 39/44
> irul de caractere format, ce specific tipul datelor citite,
poate conine urmtoarele informaii (continuare):
Instruciuni de citire a datelor (continuare)
Instruciunea scanf (continuare)
- specificatori de format: acetia specific tipul i modul n
care vor fi introduse datele:
%[*][lime][modificatori]tipdate
[ ] nseamn opional
caracterul special %: specific faptul c vrem s citim o
anumit valoare de la tastatur. Aceasta este stocat la adresa
specificat dup ,.
numrul de valori = numrul de adrese.
41
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 40/44
Instruciuni de citire a datelor (continuare)
Instruciunea scanf (continuare)
%[*][lime][modificatori]tipdate
caracterul asterix *: (opional) specific faptul c datele
primite de la dispozitivul de intrare vor fi ignorate (nu vor fi
stocate).
lime: (opional) specific numrul maxim de caractere
(alfanumerice) ce vor fi citite de la tastatur.
tipdate: (obligatoriu) specific tipul datelor ce vor fi citite. Se
folosete aceeai convenie ca la instruciunea printf:
c tip caracter (char), citete un caracter, dac [lime]
diferit de 1, funcia citete N=lime caractere i le stocheaz
n locaii succesive ale vectorului specificat ca argument.42
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 41/34
Instruciuni de citire a datelor (continuare)
Instruciunea scanf (continuare)
%[*][lime][modificatori]tipdate
tipdate: (continuare) :
d tip ntreg cu semn (decimal integer),
f, e, E tip real n forma standard sau tiinific (conversie
implicit la float),
s tip ir de caractere (char *).
modificatori: (opional) specific mai precis tipul datei:
h - short int sau unsigned short int,
l - long int sau unsigned long int sau double pentru f,e,E.
u tip ntreg fr semn (unsigned decimal integer),
-
43
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 42/44
Instruciuni de citire a datelor (continuare)
Instruciunea scanf (continuare)
Exemple:
int x,y;scanf(a%%%
%d %%%
%d", &x, &y);
printf(x=%%%
%d, y=%%%
%d", x, y);
c:\> (tastm b enter) ???
c:\> (tastm a enter 2 enter 4 enter) ???
int x=20;scanf(%*%*%*
%*d", &x);
printf(x=%%%
%d", x);
c:\> (tastm 33 enter) ??? x=20
x=2, y=4
stop
44
Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 43/44
Instruciuni de citire a datelor (continuare)
Instruciunea scanf (continuare)
Exemple:
int x;scanf(%2%2%2
%2d", &x);
printf(x=%%%
%d", x);
c:\> (tastm 12345 enter) ???
int a;float y;scanf(%%%
%d %f", &a, &y);
printf(a=%%%
%d, y=%f%f%f
%f", a,y);
c:\> (tastm 10 enter 13e-2 enter) ???
a=10, y=0.130000
x=12
45Curs Programarea Calculatoarelor, .l. Bogdan IONESCU, 2010-2011 44/44
Sfritul Cursului 4