Sunteți pe pagina 1din 5

PCLP Laboratorul 4

Asist.drd.ing. Ana-Maria SUDUC

Laboratorul 4
Operatori speciali. Pointeri

1. Noţiuni teoretice
1.1 Operatorul ?
Operatorul ? este un operator foarte puternic şi comod de folosit care înlocuieşte declaraţiile cu
forma if-then-else (dacă – atunci - altfel). Operatorul ternar ? are forma generală:
Exp1 ? Exp2: Expr3
Modul de lucru al operatorului ? este:
- se evaluează expresia Exp1.
- daca este adevărată, se evaluează Exp2 şi devine valoarea expresiei
- dacă Exp1 este falsă, se evaluează Exp3 şi valoarea acesteia devine valoarea expresiei. Exemplu:
x = 10;
y = x>9 ? 100 : 200;
În acest caz, lui y i se atribuie valoarea 100. Daca x ar fi fost mai mic decât 9, lui y i s-ar fi atribuit
valoarea 200. Scris cu o declaraţie de tip if – else, fragmentul de program ar fi arătat astfel:
x= 10;
if (x>9) y = 100;
else y = 200 ;

1.2. Operatorii de pointer & si *


Un pointer este o variabilă care conţine o adresă de memorie. Aceasta adresă reprezintă locaţia unui
alt obiect (cel mai adesea o alta variabilă) din memorie. O variabilă pointer este o variabilă despre care s-a
precizat în mod explicit că păstrează un pointer al unui obiect de tipul specificat al acelei variabile.
Cunoaşterea adresei unei variabile poate fi de mare ajutor în anumite rutine.
Operatorul & este un operator unar care returnează operandului său adresa de memorie. Exemplu:
m= &cont;
În m este plasată adresa de memorie a variabilei cont. Aceasta adresă reprezintă localizarea internă
a variabilei în interiorul calculatorului şi nu are nici o legătură cu valoarea variabilei cont. Presupunând că
variabila cont se află la locaţia de memorie 2000 şi valoarea 100, m va avea valoarea 2000.
Operatorul * reprezintă complementul lui &. Operatorul * calculează valoarea variabilei localizate
la adresa care urmează. De exemplu, daca m conţine adresa variabilei de memorie cont,
q = *m
amplasează valoarea lui cont în q. Acum q are valoarea 100
Obs. Operatorul de pointer & nu are nici o legătură cu operatorul pe biţi & (SI).
Operatorul de poninter * nu are nici o legătură cu operatorul de multiplicare *.
Declaraţia unui pointer constă dintr-un tip de bază, un asterisc şi numele variabilei . Forma generală
de declarare a unei variabile pointer este:
tip *nume;
De exmplu, pentru a declara ch ca pointer pentru un caracter, scrieţi:
char *ch
În acest caz, ch nu este un caracter, ci un pointer la caracter. Tipul de date indicat de pointer este
denumit tipul de bază al pointerului. Un pointer trebuie să indice numai spre date de acelaşi tip cu tipul său
de bază. Într-o declaraţie se pot combina variabile pointer cu variabile nonpointer. De exemplu:
int x, *y, cont;
declară x şi cont ca variabile întregi şi y ca pointer spre o variabila de tip întreg.

1.3. Operatorul virgulă


Operatorul virgulă se foloseşte pentru evaluarea succesivă a mai multor expresii. Partea stângă a
operatorului virgulă este întotdeauna considerată de tip void. Aceasta înseamnă că expresia din dreapta
devine valoarea totală a întregii expresii separate prin virgulă. De exemplu:

1
PCLP Laboratorul 4
Asist.drd.ing. Ana-Maria SUDUC

x = (y=3, y+1)
mai întâi atribuie lui y valoarea 3 şi apoi îi atribuie lui x valoarea 4. Parantezele sunt necesare întrucât
operatorul virgulă are o prioritate mai redusă decât operatorul de atribuire.
Operatorul virgulă are oarecum aceeaşi semnificaţie ca a cuvântului „şi" folosit în expresia „fă asta
şi asta şi ailaltă".

1.4. Alţi operatori


Operatorul sizeof este un operator unar activ la compilare, care calculează lungimea în octeţi a
variabilei sau a specificatorului de tip, încadrat între paranteze, pe care îl precede. De exemplu,
presupunând ca întregii au 2 octeţi şi variabilele în virgulă mobilă au 8 octeţi, programul:
float f;
cout<<sizeof f;
cout<<sizeof (int);
va afişa pe ecran un 4 şi un 2 sau doi de 4.
Operatorul punct (.) este folosit atunci când se lucrează cu o structură sau uniune. Operatorul
săgeată (->) este folosit la utilizarea unui pointer de structură sau uniune.
Parantezele sunt operatori care determină creşterea prioritarii operaţiilor dintre acestea.
Parantezele drepte efectuează indexarea tablourilor.
Cu prioritate maximă () [] ->
!~++ -- - * & sizeof
*/%
+-
<< >>
< <= > =>
= = !=
&
^
|
&&
||
?:
Cu prioritate minimă ,

1.5. Expresii
Operatorii, constantele şi variabilele reprezintă componentele expresiilor. În C/C++, o expresie este
orice combinaţie validă a acestor elemente. Deoarece majoritatea expresiilor tind să se conformeze
principiilor generale ale algebrei, acestea sunt respectate adesea. Cu toate acestea, câteva aspecte ale
expresiilor sunt specifice limbajelor C/C++.
Standarul ANSI C nu specifică ordinea în care sunt evaluate subexpresiile din cadrul unei expresii.
Aceasta lasă compilatorului de C libertatea de a rearanja o expresie în vederea unei utilizări optime a
codurilor. Cu toate acestea, o altă semnificaţie a acestui fapt este că în realizarea unui program nu trebuie
niciodată sa contez pe o anumită ordine de evaluare a subexpresiilor. De exemplu, expresia:
x= f1() + f2();
nu ne asigura de faptul ca f1() va fi apelată înaintea lui f2().

2. Aplicaţii
2.1.Lansaţi în execuţie aplicaţia Visual C++ 2010 Express Edition:
a) Din meniul Start-> Programs-> Microsoft Visual C++ 2010 Express Edition, executaţi clic pe
opţiunea Microsoft Visual C++ 2010 Express Edition.
2.2. Creaţi un nou proiect, Proiect1 şi un nou fişier File1.cpp:
a) Din meniul File->New, alegeţi opţiunea Project;

2
PCLP Laboratorul 4
Asist.drd.ing. Ana-Maria SUDUC

b) În fereastra New Project selectaţi opţiunea Win32 şi verificaţi să fie selectat Win32 Console
Application;
c) În câmpul Name introduceţi Proiect1 şi apăsaţi OK;
d) În fereastra deschisă apăsaţi Next şi apoi selectaţi opţiunea Empty Project şi apăsaţi Finish;
e) În secţiunea Solution Explorer executaţi clic dreapta pe directorul Source File şi alegeţi opţiunea
New-> Item;
f) În fereastra Add New Item selectaţi categoria Code şi verificaţi să fie selectată opţiunea C++
File (.cpp);
g) În câmpul Name tastaţi numele File1 şi apăsaţi Add.

2.3. În fişierul File1.cpp introduceţi şi testaţi următorul program:


#include <iostream>
using namespace std;

void main()
{
int x, i;
cout<<"Introduceti un numar: ";
cin>>i;
x = i>0 ? i*i : -(i*i);
cout<<i<<" la patrat este "<<x<<endl;
}
a) Tastaţi programul dat, respectând liniile de cod;
b) Compilaţi programul executând clic dreapta pe numele fişierului din secţiunea Solution Explorer
şi executând clic pe opţiunea Compile;
c) Corectaţi eventualele erori semnalate în secţiunea Output conform indicaţiilor din laboratorul
anterior;
d) După rezolvarea eventualelor erori, rulaţi programul selectând, din meniul Debug, opţiunea Start
Without Debugging;
Obs. Acest program foloseşte operatorul ? pentru a ridica la pătrat o valoare întreagă dată de către
utilizator, conservând semnul.
Pentru a compila un program se poate folosi combinaţia de taste Ctrl+F7, iar pentru a rula programul
Ctrl+F5.

2.4. Creaţi un nou proiect, Proiect2, şi un nou fişier File2.cpp. Introduceţi în fişierul creat şi testaţi
următorul program:
#include <iostream>
using namespace std;

void main()
{
int destinatie, sursa;
int *m;
sursa = 10;
m = &sursa;
destinatie = *m;
cout<<destinatie<<endl;
}
a) Urmaţi paşii prezentaţi la punctele 2.2 şi 2.3.
Obs. Programul foloseşte operatorii * şi & pentru a memora valoarea 10 într-o variabilă denumită
destinatie. Programul afişează pe ecran valoarea 10.

2.5. Creaţi un nou proiect, Proiect3, şi un nou fişier File3.cpp. Introduceţi în fişierul creat şi testaţi
următorul program:

3
PCLP Laboratorul 4
Asist.drd.ing. Ana-Maria SUDUC

#include <iostream>
using namespace std;

void main()
{
int x;
int *p;

p = &x;

cout<< p<<endl;
}
a) Urmaţi paşii prezentaţi la punctele 2.2 şi 2.3.
Obs. Programul afişează adresa de memorie a variabilei x. Adresa de memorie e exprimată în hexazecimal.

2.6. Realizaţi un nou proiect, Proiect4, şi un nou fişier File4.cpp. Introduceţi în fişierul creat şi testaţi
următorul program:
#include <iostream>
using namespace std;

void main()
{
int x;
int *p1, *p2;

p1 = &x;
p2 = p1;

cout<< p2<<endl;
}
a) Urmaţi paşii prezentaţi la punctele 2.2 şi 2.3.
Obs. Programul afişează adresa variabilei x.

2.7.Creaţi un nou proiect, Proiect5, şi un nou fişier File5.cpp. Introduceţi în fişierul creat şi testaţi
următorul program:
#include <iostream>
using namespace std;

void main()
{
float f;
cout<<"Tipul de date float este reprezentat pe "<<sizeof f<<" octeti"<<endl;
cout<<"Tipul de date int este reprezentat pe "<<sizeof (int)<<" octeti"<<endl;
}
a) Urmaţi paşii prezentaţi la punctele 2.2 şi 2.3.
Obs. Următorul program afişează lungimea în octeţi a tipurilor de date float şi int.

2.8. Modificaţi programul anterior pentru a afla şi numărul de octeţi pe care sunt reprezentate tipurile de
date char şi double.
a) Introduceţi două instrucţiuni cout pentru a afişa sizeof(char) şi sizeof(double);
b) Compilaţi programul şi rezolvaţi eventualele erori;
c) Când la compilare nu mai sunt returnate erori rulaţi programul;

2.9. Creaţi un nou proiect, Proiect6, şi un nou fişier File6.cpp. Introduceţi în fişierul creat şi testaţi
următorul program:

4
PCLP Laboratorul 4
Asist.drd.ing. Ana-Maria SUDUC

#include <iostream>
using namespace std;

void main()
{
int a,b,c;
cout<<"a= "; cin>>a;
cout<<"b= "; cin>>b;
cout<<"c= "; cin>>c;
(a<b+c && b<a+c && c<a+b) ? cout<<"Nr pot fi laturile unui triunghi": cout<<"Nr
nu pot fi laturile unui triunghi";
}
a) Urmaţi paşii prezentaţi la punctele 2.2 şi 2.3.
Obs. Următorul program testează dacă trei numere introduse de utilizator pot constitui sau nu laturile unui
triunghi.

2.10. Creaţi un nou proiect, Proiect7, şi un nou fişier File7.cpp. Introduceţi în fişierul creat şi
testaţi următorul program:
#include <iostream>
using namespace std;

void main()
{
int a=91,b=77, c;
c=a&b;
cout<<c;
}
2.11. Modificaţi programul anterior pentru a calcula a|b, pentru a şi b citite de la tastatură.
2.12. Să se scrie un program care afişează dacă un număr, citit de la tastatură, e par sau impar
(Indicaţii: a) se foloseşte operatorul &, b) un număr e impar atunci când bitul zero e 1 şi par când
bitul zero e 0).
2.13. Să se scrie un program care afişează maximul dintre două numere citite de la tastatură.
a) Folosiţi ca bază de pornire programul anterior;
b) Vor fi declarate şi se vor citi de la tastatură doar variabilele a şi b;
c) Se va folosi operatorul ? pentru a testa dacă a > b. Când expresia este adevărată se va afişa
concluzia că a este mai mare decât b; în caz contrar se va afişa mesajul că b este mai mare decât
a;
d) Compilaţi (Ctrl+F7) şi rulaţi programul (Ctrl+F5).
2.14. Să se scrie un program care citeşte trei numere, a, b şi c, testează şi afişează dacă acestea
sunt în progresie aritmetică.
a) Folosiţi ca bază de pornire programul de la punctul 2.9;
b) Modificaţi condiţia. Indicaţie: a, b, c sunt în progresie aritmetică dacă: b=(a+c)/2 sau a=(b+c)/2
sau c=(a+b)/2;
c) <Modificaţi mesajele ce vor fi afişate în cele două cazuri (când sunt în progresie aritmetică şi
când nu pot fi în progresie aritmetică);
d) Compilaţi (Ctrl+F7) şi rulaţi programul (Ctrl+F5).
2.15. Să se scrie un program care să citească de la tastatură un an, să testeze şi să afişeze dacă anul
este bisect sau nu (anul trebuie să fie divizibil cu 4, să nu fie divizibil cu 100, mai puţin anii care
sunt divizibili cu 400).

Bibliografie
http://msdn.microsoft.com/en-us/library/ms859264.aspx