Documente Academic
Documente Profesional
Documente Cultură
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
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.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.
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