lab3.docx

14
Ministerul Educaţiei al Republicii Moldova Universitatea Tehnică a Moldovei Catedra Automatica si Tehnologii Informationale Specialitatea Ingineria Sistemelor Biomedicale REFERAT La Lucrare de laborator nr.3 la disciplina: Programarea in limbajul C++ Tema: Supraincarcarea operatorilor A efectuat: st. gr. ISBM-131 Moroi Ion A verificat: lector asistent Balan M.

Upload: ion-moroi

Post on 23-Dec-2015

27 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Lab3.docx

Ministerul Educaţiei al Republicii MoldovaUniversitatea Tehnică a Moldovei

Catedra Automatica si Tehnologii InformationaleSpecialitatea Ingineria Sistemelor Biomedicale

REFERATLa Lucrare de laborator nr.3

la disciplina: Programarea in limbajul C++Tema: Supraincarcarea operatorilor

A efectuat: st. gr. ISBM-131 Moroi Ion

A verificat: lector asistent Balan M.

Chişinău 2014

Page 2: Lab3.docx

1 Scopul si sarcina lucrării

1.1 Scopul lucrării:

studierea necesităţii supraîncărcării operatorilor;

studierea sintaxei de definire a operatorilor;

studierea tipurilor de operatori;

studierea formelor de supraîncărcare.

1.2 Sarcina lucrării:

Să se creeze clasa 3-D de coordonate în spaţiu. Să se definească operatorii "+", "-", "=", ca metode ale clasei, iar operatorii de comparare – ca funcţii prietene. De prevăzut posibilitatea realizării de operaţii atît între coordonate cît şi între coordonate şi numere obişnuite.

2 Indicaţii teoretice

Prin supraîncărcarea unui operator se înţelege că acesta este utilizat în contexte diferite, avînd

aceeaşi semnificaţie sau o semnificaţie diferită. Astfel operatorul „+” este supraîncărcat pentru

adunarea întregilor şi a realilor; operatorul „<<” este supraîncărcat cu semnificaţia de deplasare la

stînga, dacă termenii sunt întregi sau inserare în flux, dacă un termen este un flux de date, iar celălalt

un obiect.

Programatorul poate asocia noi semnificaţii operatorilor existenţi prin supraîncărcarea

operatorilor. Anumiţi operatori pot fi utilizaţi cu orice tip de termeni (sunt deja supraîncărcaţi global

de către compilator). Aceştia sunt: new, delete, sizeof, ::, =, &, ->*, .*, ., ->.

Pot fi supraîncărcaţi următorii operatori:

+; -; *; /; %; ^; &; |; ~; !; =; < >; +=; -=; *=; /=; %=; ^=; &=; |=; >>=; <<=; ==; !=; <=; >=;

&&; ||; ++; --; ->* , ->; << >>; []; (); new; new[]; delete; delete[].

Nu pot fi supraîncărcaţi operatorii: ::, ., .*, ?:, sizeof.

Prin supraîncărcarea unui operator nu i se poate modifica aritatea astfel operatorul ! este unar şi

poate fi redefinit numai ca operator unar. De asemenia asociativitatea şi precedenţa operatorului se

menţin.

La supraîncărcarea unui operator nu se pot specifica argumente cu valori implicite.

Operatorii supraîncărcaţi într-o clasă sunt moşteniţi în clasele derivate (excepţie face operatorul de

atribuire =).

Semnătura unei funcţii în care se supraîncarcă un operator este:

tip_rezultat operator#(listă_argumente);

Restricţii la supraîncarcare:

pot fi supraîncarcate numai operatorii existenţi şi la care li se permite;

Page 3: Lab3.docx

nu se poate modifica precedenţa şi asociativitatea operatorului;

nu se poate supraîncărca operatorii pentru tipurile predefinite;

funcţiile operatorilor nu pot avea argument implicite;

nu putem supraîncarca concomitent doi operatori.

Operatorii pot fi supraîncărcaţi în clasă şi-n afar clasei. În clasă parametrii operatorului va fi cu

unul mai puţin, deoarece primul parametru este însuşi obiectul care activează această operaţie. În

afara clasei este ca o funcţie globală, atunci ea trebuie să fie declarată ca prietenă a clasei.

3 Realizarea sarcinii

3.1 Realizarea sarcinii

La scrierea programului urmăm paşii:

- Declarăm clasa TriD cu nivelul de acces public.

class TriD{int x;int y;int z;

- Definim constructorii TriD();TriD(int,int,int);~TriD();TriD(TriD &);

- Operatorii “+”, “-!”, “=” îi scriem ca metode a clasei iar operatorii “==”, “!=”, “<”,”>” ca

funcţii prietene.

TriD & operator = (TriD &);TriD & operator + (TriD &);TriD & operator - (TriD &);friend istream & operator >>(istream &, TriD &);friend ostream & operator <<(ostream &, TriD &);friend bool operator !=(TriD &, TriD &);friend bool operator ==(TriD &, TriD&);friend bool operator >(TriD &, TriD &);friend bool operator <(TriD &, TriD &);

- Scriem funcţiile pentru supraîncarcarea operatorilor.

Supraincarcarea operatorului”=”TriD & TriD::operator =(TriD & obj){if(this==&obj) return*this;this->x=obj.x;this->y=obj.y;this->z=obj.z;return *this;}Supraincarcarea operatorului”+”

Page 4: Lab3.docx

TriD & TriD::operator+(TriD & obj){this->x+=obj.x;this->y+=obj.y;this->z+=obj.z;return*this;}

Supraincarcarea operatorului”-”

TriD & TriD::operator-(TriD & obj){this->x-=obj.x;this->y-=obj.y;this->z-=obj.z;return*this;}

- Scriem funcţia principală main(), în care am organizat programul. Executăm programul.

In functia principala main() am format si afisare unui meniu pentru introducerea

vizualizarea si efectuarea operatiilor cu coordonatele spatiale.

Concluzii

Efectuînd această lucrare de laborator am acumulat noi cunoştinţe în limbajul de programare

C++ acumulind cunostinte noi la tema “Supraîncărcarea operatorilor”. In cadrul programului am

supraincarcat operatorii atit ca functii ale clase cit si ca functii prietene .Am creat clasa TriD de

coordinate spatiale si cu ajutorul operatorilor supraincarcati am efectuat diverse operati cu acestea.

Efectuind aceasta lucrare de laborator am insusit modul de supraincarcare a operatorilor si directiile

de utilizare a acestei proceduri.

Bibliografie

1. „Totul despre C şi C++. Manualul fundamental de programare de C şi C++” Dr. Kris Jamsa & Lars

Klander. Traducere de Eugen Dumitrescu

2. Sergiu G. Istrati “Programare. Iniţializare în limbajele C şi C++. Ciclu de prelegeri la disciplina

“Programare”” Chişinău U.T.M. 2003

Page 5: Lab3.docx

Intrebari de control:

1. Являются ли операторы абсолютно необходимыми?Nu

2. Какие зарезервированные слова используются для определения операторов?operator dupa care merge simbolul operatiei. In rest este osimpla functie cu rezultat si parametric.

3. Могут ли операторы не возвращать результат?Nu

4. Как классифицируются операторы?Exista operatori unari si binari. Operatorii unari sunt acei care au unul si numai unul operator, binarii au 2 operatori.

5. Как компилятор различает префиксную и постфиксную запись унарных операторов?Complex operator++(int); // постфиксная формаComplex operator++(int); // постфиксная форма

6. Какие операторы нельзя перегружать?“.”, “.*”, “?:”, “::”, “sizeof”, “#”, “##”.

7. Каков синтаксис вызова операторов?

8. Как используется оператор "()"?Оператор круглые скобки используется для определения функциональных объектов.1

9. Как используется оператор "->"?->, при его перегрузке переменная начинает себя вести как указатель, что подводит нас к идиоме умных указателей

10. Зачем нужны две формы перегрузки (как метод класса и как дружественная функция)?

Причина этого состоит в том, как вызываются методы класса. Практически всегда передается объект, используя скрытый указатель this. Если нужно еще что-нибудь передать, то используются обычные параметры. То есть первый операнд обязательно должен быть представителем данного класса. В случае оператора << первый операнд типа ostream а не определяемого нами. Другими словами если нужно сложить комплексное с целым то это может сделать как оператор-метод класса, так и друг, а сложить целое и комплексное – только друг. То есть в данном случае от перемены мест слагаемых все меняется.

11. Какому типу принадлежит оператор вывода в поток "<<"?Дружественный

12. В каких случаях обязательно определять оператор присваивания?

1

Page 6: Lab3.docx

Anexa A

Codul sursă al programului

#include <iostream>#include<conio.h>#include<stdio.h>#include<stdlib.h>

using namespace std;

class TriD{int x;int y;int z;

public:TriD();TriD(int,int,int);~TriD();TriD(TriD &);TriD & operator = (TriD &);TriD & operator + (TriD &);TriD & operator - (TriD &);friend istream & operator >>(istream &, TriD &);friend ostream & operator <<(ostream &, TriD &);friend bool operator !=(TriD &, TriD &);friend bool operator ==(TriD &, TriD&);friend bool operator >(TriD &, TriD &);friend bool operator <(TriD &, TriD &);

};

TriD::TriD(){x=0;y=0;z=0;};TriD::TriD(int x,int y, int z):x(x),y(y),z(z){}TriD::TriD(TriD & obj):x(obj.x),y(obj.y),z(obj.z){}TriD::~TriD(){x=0;y=0;z=0;}TriD & TriD::operator =(TriD & obj){if(this==&obj) return*this;this->x=obj.x;this->y=obj.y;this->z=obj.z;return *this;}TriD & TriD::operator+(TriD & obj){this->x+=obj.x;this->y+=obj.y;

Page 7: Lab3.docx

this->z+=obj.z;return*this;}TriD & TriD::operator-(TriD & obj){this->x-=obj.x;this->y-=obj.y;this->z-=obj.z;return*this;}istream &operator >>(istream & in , TriD & obj){cout<<"Introduceti dimensiunea x:";in>>obj.x;cout<<"Introduceti dimensiunea y:";in>>obj.y;cout<<"Introduceti dimensiunea z:";in>>obj.z;return in;}ostream &operator <<(ostream & out, TriD & obj){out<<"Componenta x:"<<obj.x;out<<" Componenta y:"<<obj.y;out<<" Componenta z:"<<obj.z<<endl;return out;}bool operator ==(TriD & a, TriD & b){return (a.x==b.x)&&(a.y==b.y)&&(a.z==b.z);}bool operator!=(TriD & a, TriD & b){return (a.x!=b.x)||(a.y!=b.y)||(a.z!=b.z);}

int main(){TriD a,b;TriD d;char ch='0';char ch1='0';int nr=0;init:system("cls");cout<<" MENIU"<<endl;cout<<"1. Introducerea coordonatelor spatiale"<<endl;cout<<"2. Operatii cu coordonatele"<<endl;cout<<"3. Afisarea coordonatelor"<<endl;cout<<"4. Iesire din program"<<endl;ch=getch();

switch(ch){ case '1' :{cin>>a;

Page 8: Lab3.docx

goto init;}break;case '2': {

cout<<"1.Adunarea coordonatelor cu un numar"<<endl;cout<<"2.Adunarea a doua puncte cu coordonate spatiale"<<endl;cout<<"3.Scaderea din coordonate a unui numar"<<endl;cout<<"4.Scadera a 2 puncte cu coordonate spatiale"<<endl;cout<<"5.Compararea a doua puncte cu coordonate spatiale"<<endl;ch1=getch();switch(ch1){case '1':{cout<<"Introduceti numarul pentru adunare"<<endl;

cin>>nr;TriD b(nr,nr,nr);a=a+b;

cout<<"Coordonatele modificate sunt:";cout<<a;getch();

goto init;}break;case'2':{cout<<"Introduceti coordonatele punctului pentru adaugare"<<endl;

cin>>d;a=a+d;cout<<"Coordonatele modificate sunt"<<endl;cout<<a; getch();

goto init;}break;case '3':{cout<<"Introduceti un numar pentru scaderea din coordonate:"<<endl;

cin>>nr;TriD c(nr,nr,nr);a=a-c;cout<<"Coordonatele modificate sunt:"<<endl;cout<<a;getch();

goto init;}break;

case'4':{cout<<"Introduceti coordonatele punctului pentru scadere:"<<endl;cin>>d;a=a-d;cout<<"Coordonatele modificate:"<<endl;cout<<a;getch();goto init;} break;

case '5':{cout<<" Introduceti coordonatele puntului pentru a vedea daka este egal sau nu cu coordonatele aflate in memorie"<<endl;

cin>>b;if(a==b)cout<<"Punctele au aceleasi coordonate"<<endl;if(a!=b)cout<<"Punctele sunt diferite"<<endl;getch();goto init;

}break;}break;

Page 9: Lab3.docx

case '3':{cout<<a<<endl;getch();

goto init;}break;case '4':return 0; break;

}

}

return 0; }

Anexa B

Afisarea rezultatelor:

Meniul

Introducerea datelor

Page 10: Lab3.docx

Afisarea rezultatelor

Operatii cu coordonatele

Page 11: Lab3.docx

Adunarea unui numar la coordonate