Laborator 7 - Stream-uri

Documente similare
Laborator 2 - Încapsularea Programare Orientată pe Obiecte Tema 2.1 Să se analizeze programul EX2.C Indicatii 2.1 A nu se uita de fisierul EX2.H Tema

Microsoft Word - CarteC.doc

Programarea şi utilizarea calculatoarelor

Limbaje de Programare Curs 6 – Functii de intrare-iesire

L7

SUBPROGRAME

Limbaje de Programare Curs 8 – Fisiere

Laborator 2 Incompatibilităţi/Diferenţe între C şi C++ Completări C++ Supraîncărcarea (redefinirea) numelui de funcţii În C nu este permisă existenţa

Top

Microsoft Word - CarteC.doc

Microsoft PowerPoint - ImplementareLimbaj [Read-Only] [Compatibility Mode]

Limbaje de Programare Curs 5 – Siruri de caractere

Slide 1

Microsoft PowerPoint - Curs_SDA_9_RO_2019_v2.pptx

PROGRAMARE ORIENTATA PE OBIECTE

Microsoft PowerPoint - Curs_SDA_4_RO_2019_v2.pptx

Laborator 2: Instrucţiuni Java şi lucru cu şiruri de caractere Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 18 octombrie 2011

Microsoft Word - PCLP2_Curs_4_2019.doc

Procesarea Imaginilor - Laborator 1: Introducere în utilizarea bibliotecii OpenCV 1 1. Introducere în utilizarea bibliotecii OpenCV 1.1. Introducere S

Paradigme de programare

Diapositive 1

C++ Probleme

Slide 1

Propunator: Morar Florin Colegiul National Silvania Zalau Discipina: Informatica Nivel liceal, cls. XII 1.Să se scrie în limbajul C/C++ definiţia comp

Laborator 3

1. Operatii cu matrici 1 Cerinte: Sa se realizeze functii pentru operatii cu matrici patratice (de dimensiune maxima 10x10). Operatiile cerute sunt: A

Slide 1

Laborator 4: Continuare Programare Orientată pe Obiecte Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 29 octombrie 2011

LUCRAREA NR

Limbaje de programare Pointeri. Alocare dinamică (continuare) 26 noiembrie 2012

Lab6LCD

Laborator 9: Fire de execuţie Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 20 noiembrie 2011

E_d_Informatica_sp_SN_2014_bar_10_LRO

Object Oriented Programming

Interfețe și Protocoale de Comunicații Arduino-Port Paralel Arduino. Laborator 1- Portul Paralel 1 Caracteristici generale Arduino UNO este o placă de

Paradigme de Programare

EXCEL FĂRĂ SECRETE Grafice şi diagrame

Microsoft Word - O problema cu bits.doc

E_d_Informatica_sp_MI_2015_bar_02_LRO

Microsoft PowerPoint - Curs_SDA_10_RO_2019_v1.pptx

Subiectul 1

Programarea calculatoarelor. Note de curs Marius Minea 1 Introducere în programarea în C 1.1 Funcţii în limbajul C Calcule şi funcţii La origine, rolu

Microsoft Word _POO_Lab_1_Modificari_v01.htm

1 Lucrarea nr. 8 - Structuri de date de tip liste sortate O listă sortată reprezintă un aranjament al înregistrărilor din cadrul listei în funcţie de

/*

Tablouri unidimensionale Problema 1 Să se determine mulţimea cifrelor unui număr natural n > 0, dat. Exemplu: n= Cifre = {1,2,3,7} Se cere să s

tehnologii web

CURS

Utilizare Internet

Microsoft PowerPoint - Curs_SDA_3_RO_2019_v2.pptx

Propunator: Morar Florin Colegiul National Silvania Zalau Discipina: Informatica Nivel liceal, cls. XI 1.Fişierul text bac.in conţine cel mult 1000 de

Operatorii in C Expresii Operatori aritmetici Operatori de asignare Operatori de incrementare si decrementare Operatori relationali Operatori logici O

Addendum Syllabus 6 Microsoft Word 2016 REF Syllabus 6.0 Crearea unui document nou pe baza unor șabloane disponibile local sau online Microsoft

Microsoft Word - c6.doc

proiectarea bazelor de date

PHP (II)

-

PowerPoint Presentation

1. Găsiți k numerele cele mai apropiate într-un şir nesortat Dându-se un şir nesortat și două numere x și k, găsiți k cele mai apropiate valori de x.

Laborator Activities În sistemul Android activitățile reprezintă echivalentul ferestrelor din Windows, fiind clase care extind clasa Activity. Spre de

Microsoft Word - lab4.doc

Programarea şi utilizarea calculatoarelor

Slide 1

Programarea şi utilizarea calculatoarelor

PCLPII-C16(9)

Microsoft Word - Software pentru ordonarea multirang a componentelor unei colectivitati.doc

Capitole Speciale de Informatică Curs 2: Determinarea vocabularului de termeni şi a listelor de postări 4 octombrie 2018 Reamintim că listele de indec

Slide 1

ALGORITMICĂ. Seminar 3: Analiza eficienţei algoritmilor - estimarea timpului de execuţie şi notaţii asimptotice. Problema 1 (L) Să se determine număru

1

SIRURI DE CARACTERE in C++ O constanta de tip sir de caractere de declara intre doua caractere. In memoria interna, o constanta de acest tip este reti

Microsoft Word - Raspunsul la niste provocari. Partea III..doc

Microsoft Word - Programarea Portului Paralel - IBM-PC. .doc

Poo Laboratoare 1 Contents Laborator7 2 1 Colecţii de obiecte în Java Interfaţa Iterator Interfaţa C

Microsoft PowerPoint - Curs_TPI_22_v01.ppt

Manual de utilizare Room Booking System

Logică și structuri discrete Limbaje regulate și automate Marius Minea marius/curs/lsd/ 24 noiembrie 2014

Declararea variabilelor

/*

Logică și structuri discrete Logică propozițională Marius Minea marius/curs/lsd/ 3 noiembrie 2014

Structuri de date pentru partiţii de mulţimi O partiţie finită a unei mulţimi nevide S este o mulţime finită de submulţimi ale lui S: {S 1, S 2,..., S

7. Alinierea robustă a densităţilor de puncte 3D Măsurarea distanţei dintre diferite forme geometrice 3D Estimarea rotaţiei şi a translaţiei optime în

ALGORITMII ŞI REPREZENTAREA LOR Noţiunea de algoritm Noţiunea de algoritm este foarte veche. Ea a fost introdusă în secolele VIII-IX de către Abu Ja f

Lucrarea nr. 4 - Algoritmi de sortare şi ordonare Breviar teoretic Un algoritm de sortare este o metoda prin care se aranjează elementele unui tablou

Scrieţi pe foaia de examen răspunsul pentru fiecare dintre cerinţele următoare

Laborator 1-Teoria probabilitatilor si statistica matematica Sef lucrari dr.mat. Daniel N.Pop Departamentul de calculatoare si inginerie electrica 1 P

Gestionarea I/E

Adresarea memoriei Modurile de adresare constituie un instrument principal pentru reprezentarea în memorie a imaginii datelor, aşa cum este ace

Laborator 1 suport teoretic Mediul de dezvoltare Eclipse GLOSAR - Aplicaţie: program obţinut în urma aplicării operației BUILD asupra unui proiect (ve

Microsoft Word - Cuprins_LP.doc

Preprocesorul C Funcţii cu numǎr variabil de argumente 6 decembrie 2005 Programarea calculatoarelor 2. Curs 10 Marius Minea

Aggregating Data

PowerPoint-Präsentation

Microsoft Word - lab1_2007.doc

Gestiunea serviciilor de recuperare a sănătăţii în sanatorii şi preventorii

Evaluarea unităţilor de dializă publice si private

Microsoft Word - Curs_07.doc

Microsoft Word - lab_access.doc

Metode de programare Proiectarea algoritmilor

Transcriere:

Laborator 7 Stream-uri Tema 7.1 Analizaţi programul din fişierele EX7.CPP, EX7.H, CLASE.CPP, CLASE.H din anexa 7. Tema 7.2 Să se implementeze operatorii de inserţie << care să permită, la apăsarea tastei 5 (având codul 5 ), salvarea într-un stream a obiectului de tip MULŢIME (şi a celor de tip FIGURA incluse). Se va folosi ca stream un obiect de tip ofstream mapat pe fisierul FISIER.CFG. Consideraţii teoretice 7.2 La baza bibliotecii de streamuri stă redefinirea operatorilor << şi >> care, în acest context, se numesc operatori de inserţie (<<) şi respectiv de extracţie (>>). Această denumire sugerează, împreună cu simbolul, semnificaţia operatorului: variabila respectivă se inserează în respectiv se extrage din streamul respectiv. Deşi nu vom putea prezenta o descriere completă a ierarhiilor de clase ale bibliotecii I/O prezentăm în figura următoare o parte a acestor ierarhii, cu notaţia consacrată în UML în care sensul săgeţilor indică spre clasa părinte. ios fstreambase istream ostream strstreambase ifstream ofstream iostream istrstream ostrstream fstream strstream Inserţia formatată a tipurilor standard După cum se cunoaşte, pentru operaţiile de ieşire cu format se folosesc operatorii de inserţie <<, definiţi pentru fiecare din tipurile de date standard existente în limbaj. Declaraţiile acestora se găsesc în <iostream.h> şi le prezentăm în continuare: class ostream : virtual public ios // inserează un caracter - 1 -

ostream& operator<< ( signed char); ostream& operator<< (unsigned char); // inserează reprezentarea ascii a valorii numerice ostream& operator<< (short); ostream& operator<< (unsigned short); ostream& operator<< (int); ostream& operator<< (unsigned int); ostream& operator<< (long); ostream& operator<< (unsigned long); ostream& operator<< (float); ostream& operator<< (double); ostream& operator<< (long double); // inserează un şir ostream& operator<< (const signed char *); ostream& operator<< (const unsigned char *); // inserează reprezentarea ascii a valorii pointerului ostream& operator<< (void *); Cele de mai sus justifică posibilitatea inserării tipurilor standard pe stream ca în exemple binecunoscute: cout<< x= <<x<< c= <<c; //evident x si c sunt variabile definite anterior Inserţie pe stream pentru tipuri definite de utilizator O altă facilitate a bibliotecii de streamuri este că permite (pe lângă inserţia tipurilor standard) în mod unitar inserţia tipurilor definite de utilizator. Deşi mecanismul nu este prea complicat, având la bază simpla redefinire a operatorilor de inserţie pentru tipul definit de utilizator, eleganţa acestui mecanism face ca această facilitate să fie una foarte răspândită. Exemplificăm în cele ce urmează acest mecanism pentru o clasă proprie PUNCT (simplificată): #include <iostream.h> class PUNCT int x,y; friend ostream& operator<<(ostream& o, PUNCT& ob) o<<ob.x<<" "<<ob.y; return o; // inserare membrii PUNCT situaţie în care este posibil următorul cod: PUNCT un_punct;... cout<<un_punct;... //insertia tipului propriu pe stream Facem următoarele observaţii: - 2 -

operatorul de inserţie s-a redefinit ca şi funcţie friend pentru clasa PUNCT. Redefinirea prin funcţie friend este esenţială pentru a permite utilizarea operatorului cu stream-ul în partea stângă şi PUNCT-ul în dreapta, fapt care nu ar fi putut fi posibil dacă redefinirea s-ar fi făcut prin metodă (când PUNCT-ul era obligatoriu operandul stâng). Necesitatea posibilităţii redefinirii operatorilor şi prin funcţii friend este încă o dată justificată (programatorul nu are acces la codul stream-urilor pentru a defini acolo operatorul prin metodă). inserţia obiectului un_punct s-a realizat simplu şi elegant. Avantajul este şi mai vizibil pentru clase mai complexe (cum ar fi tablouri, liste, arbori, etc.) şi pentru streamuri de tip fstream. deşi nu apare vizibil în acest exemplu, inserţia tipurilor predefinite şi a celor definite de utilizator poate fi făcută amestecat, în orice succesiune. Streamuri şi fişiere Pentru lucrul cu streamuri reprezentate pe fişiere există, în cadrul ierarhiilor din bibliotecă, clase speciale. Pentru utilizarea acestora este necesară includerea antetului <fstream.h>. Acesta, la rândul său, include implicit <iostream.h> care nu mai trebuie inclus explicit (dar clasele descrise în el sunt vizibile). Prezentăm în continuare un exemplu minimal de cod care instanţiază un stream de tip ofstream (mapat pe fişier) şi inserează un obiect de tip definit de programator (de exemplu PUNCT) în acest stream. Pentru alte detalii privind aceste stream-uri (alte metode, de exemplu pentru tratarea erorilor) se poate consulta help-ul. // insereaza un punct in stream (fisier) ofstream ofs("fisier.txt"); // instantiere un ofstream mapat pe fisier.txt ofs<<un_punct; // inserare a PUNCT-ului un_punct pe stream ofs.close(); // inchidere stream Indicaţii 7.2 Trebuie redefiniţi operatorii de inserţie pentru clasele FIGURA şi MULTIME Clasa MULTIME îşi va salva complet starea (numărul de figuri, figura curentă şi fiecare figură din mulţime). Pentru a înţelege mai uşor conţinutul fişierului recomandăm scrierea pe prima linie a caracteristicilor MULTIMII iar apoi, pe liniile următoare, caracteristicile fiecărei figuri. Pentru trecerea la linia următoare se poate folosi manipulatorul endl. Pentru a verifica funcţionarea se poate urmării de fiecare dată conţinutul fişierului rezultat Atenţie: pentru a putea ulterior separa câmpurile salvate e important să se insereze câte un separator de tip spaţiu între valorile salvate. Tema 7.3 Să se implementeze operatorii de extracţie >> care să permită la apăsarea tastei 6 (având codul 6 ) restaurarea dintr-un stream a obiectului de tip MULTIME (şi a celor de tip FIGURA incluse). Se va folosi ca stream un obiect de tip ifstream mapat pe fişierul FISIER.CFG. Consideraţii teoretice 7.3 Extracţia formatată a tipurilor standard După cum se cunoaşte, pentru operaţiile de intrare cu format se folosesc operatorii de extracţie >> definiţi pentru fiecare din tipurile de date standard existente în limbaj. Declaraţiile acestora se găsesc în <iostream.h> şi le prezentăm în continuare: - 3 -

class istream : virtual public ios // extrage un caracter istream& operator>> ( signed char &); istream& operator>> (unsigned char &); // extrage valori numerice din reprezentarea lor ascii istream& operator>> (short &); istream& operator>> (unsigned short &); istream& operator>> (int &); istream& operator>> (unsigned int &); istream& operator>> (long &); istream& operator>> (unsigned long &); istream& operator>> (float &); istream& operator>> (double &); istream& operator>> (long double &); // extrage un şir istream& operator>> ( signed char *); istream& operator>> (unsigned char *); Facem următoarea remarcă referitoare la operaţiile de intrare cu format: la extragerea unui singur caracter se extrage primul caracter din istream diferit de caracter de tip spaţiu - deci se sar caracterele de tip spaţiu. Faptul este explicabil deoarece acum avem de a face cu o extragere formatată. Amintim că, conform funcţiei isspace, caracterele de tip staţiu sunt: horizontal tab ( \t,9), newline ( \n,10), vertical tab ( \v,11), formfeed ( \f,12), carriage return ( \r,13), space (,32). Cele de mai sus justifică posibilitatea extracţiei tipurilor standard de pe stream ca în exemple binecunoscute: cin>>x>>c; //evident x si c sunt variabile definite anterior Extracţie de pe stream pentru tipuri definite de utilizator Reluăm exemplul clasei PUNCT exemplificând de această dată extracţia sa: #include <iostream.h> class PUNCT int x,y; friend istream& operator>>(istream& i, PUNCT& ob) i>>ob.x; i>>ob.y; return i; // extractie membrii PUNCT situaţie în care este posibil următorul cod: PUNCT un_punct;... cin>>un_punct;... //extractia tipului propriu pe stream - 4 -

Streamuri şi fişiere Asemănător cu exemplul prezentat în consideraţiile teoretice 7.2 prezentăm în continuare un exemplu minimal de cod care instanţiază un stream de tip ifstream (mapat pe fişier) şi extrage un obiect de tip definit de programator (de exemplu PUNCT) din acest stream. // extrage un punct din stream (fisier) ifstream ifs("fisier.txt"); // instantiere un ifstream mapat pe fisier.txt ifs>>un_punct; // extragere a PUNCT-ului un_punct de pe stream ifs.close(); // inchidere stream Atragem atenţia că, în mod normal (deşi nu obligatoriu), inserţia şi extracţia sunt gândite în pereche, pentru a putea ulterior extrage de pe stream obiectul inserat. Indicaţii 7.3 Se va goli mulţimea înainte de restaurare. La restaurare nu cunoaşte tipul clasei obiectului care a fost salvat. Toate obiectele se vor considera ca fiind de tip CERC. Atenţie ca prin inserţie şi extracţie a mulţimii să nu schimbăm ordinea figurilor din mulţime. Tema 7.4 Să se modifice inserţia-extracţia astfel încât să se corecteze problema anterioară. Indicaţii 7.4 Se va implementa la clasa FIGURA o metodă virtuală care să întoarcă (sub forma unui caracter) tipul obiectului respectiv. La extracţia MULTIMII se vor instanţia corespunzător CERC-uri şi PATRAT-e. Tema 7.5 Să se modifice programul astfel încât fişierul folosit să fie un fişier binar. Consideraţii teoretice 7.5 Pe lângă inserţia şi extracţia formatată bazată pe operatorii << şi >> există şi un mod de lucru fără format. Pentru aceste operaţii clasele istream respectiv ostream pun la dispoziţie un set de metode publice de citire respectiv scriere descrise în continuare (conform <iostream.h>): class istream : virtual public ios // extrage caractere într-un vector istream& read( signed char *, int); // extrage vector istream& read(unsigned char *, int); // - - // extragere un singur caracter istream& get(unsigned char &); // extrage caracter istream& get( signed char &); // - - int get(); // - - class ostream : virtual public ios - 5 -

ostream& put(char); ostream& write(const signed char *, int); ostream& write(const unsigned char *, int); // - - // inserează caracter // inserează vector După cum se constată transferul datelor se face fără a ţine cont de semnificaţia acestora, metodele disponibile fiind echivalente cu cele existente în C (getc, putc, read, write), numite acolo de nivel coborât. Aceste operaţii sunt specifice situaţiilor în care datele sunt binare (şi, de cele mai multe ori, fluxul implicat este un fişier). În legătură cu metodele prezentate anterior mai facem următoarele remarci: metodele read şi write au ca şi parametrii adresa vectorului care reţine datele ce se transfera şi numărul de octeţi care se transferă. metodele get de extragere a unui singur caracter extrag primul caracter din istream indiferent care este acesta, chiar dacă este caracter de tip spaţiu. ca şi în C, operaţiile de intrare-ieşire fără format se folosesc mai ales când avem de a face cu fişiere binare. Indicaţii 7.5 Verificaţi după salvare lungimea fişierului. Pentru a simplifica extracţia recomandăm ca scrierea şirurilor (numelui figurilor) să se facă într-un format de tip PASCAL adică să precedăm şirul de lungimea sa. Tema 7.6 Să se execute aplicaţia pas cu pas pentru inserţia şi extracţia mulţimii m. Consideraţii teoretice 7.6 Se vor revedea consideraţiile teoretice de la 3.8-6 -

Anexa 7 ex7.h #define TAB 9 #define ESC 27 #define LEFT 75 #define RIGHT 77 #define UP 72 #define DOWN 80 #define UNU '1' #define DOI '2' #define TREI '3' #define PATRU '4' #define CINCI '5' #define SASE '6' #define SAPTE '7' #define OPT '8' // prototipuri de functii void OurInitGraph(void); ex7.cpp #include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include "ex7.h" #include "clase.h" MULTIME m; void main() //********* int gata=0; OurInitGraph(); m += new CERC; m = m + new PATRAT(500,300,75,RED,"red"); m += new CERC(100,100,25,BLUE,"blue"); m = m + new PATRAT; m = m + new PATRAT(400,200,100,YELLOW,"yellow"); m += new CERC; m.afiseaza(); while(!gata) switch(getch()) case ESC: gata=1; break; - 7 -

case TAB: ++m; break; case UNU: m.get()->creste( +10 ); m.afiseaza();break; case DOI: m.get()->creste( -10 ); m.afiseaza();break; case TREI: if(m.nrelem()<max_figuri) if(m.nrelem()%2) m += new CERC; else m += new PATRAT; m.afiseaza(); break; case PATRU: m.elimina(); m.afiseaza(); break; case 0: switch(getch()) case LEFT: m.get()->muta( -10, 0 ); break; case RIGHT: m.get()->muta( 10, 0 ); break; case UP: m.get()->muta( 0,-10 ); break; case DOWN: m.get()->muta( m.afiseaza(); closegraph(); 0, 10 ); break; void OurInitGraph() //***************** int gdriver = DETECT, gmode, errorcode; initgraph(&gdriver,&gmode,""); errorcode = graphresult(); if (errorcode!= grok) printf("graphics error: %s\n", grapherrormsg(errorcode)); printf("press any key to halt:"); getch(); exit(1); settextjustify(center_text,center_text); clase.h class LOCATION LOCATION(); LOCATION(int x0,int y0); void Muta(int dx,int dy); protected: int x; int y; class FIGURA : public LOCATION protected: int r; - 8 -

int c; char *Nume; char Tip; FIGURA(); FIGURA(int x0,int y0,int r0,int c0,char *n0); ~FIGURA(); void Muta(int dx,int dy); void Creste(int dr); virtual void Afiseaza()=0; virtual void Sterge()=0; class CERC : public FIGURA CERC(); CERC(int x0,int y0,int r0,int c0,char *n0); void Afiseaza(); void Sterge(); class PATRAT : public FIGURA PATRAT(); PATRAT(int x0,int y0,int r0,int c0,char *n0); void Afiseaza(); void Sterge(); #define MAX_FIGURI 20 class MULTIME int NrFiguri; int FiguraCurenta; FIGURA *pe[max_figuri]; MULTIME(); void Goleste(); void Afiseaza(); void Elimina(); FIGURA* Get(); int NrElem(); void operator ++(); void operator += ( FIGURA* f ); MULTIME& operator + ( FIGURA* f ); clase.cpp #include <graphics.h> #include <string.h> #include <alloc.h> #include "clase.h" //~~~~~~~~~~~~~~~~~~ // clasa LOCATION //~~~~~~~~~~~~~~~~~~ - 9 -

LOCATION::LOCATION() //****************** x = 320; y = 240; LOCATION::LOCATION(int x0,int y0) //******************************* x = x0; y = y0; void LOCATION::Muta(int dx,int dy) //******************************** x+=dx; y+=dy; //~~~~~~~~~~~~~~~~ // clasa FIGURA //~~~~~~~~~~~~~~~~ FIGURA::FIGURA():LOCATION() //************************* r = 50; c = WHITE; Nume = NULL; FIGURA::FIGURA(int x0,int y0,int r0,int c0, char *n0):location(x0,y0) //******************************************************************* r = r0; c = c0; Nume = (char*)malloc(strlen(n0)+1); // aloca memorie suplimentara strcpy(nume,n0); FIGURA::~FIGURA() //*************** free(nume); // elibereaza memoria suplimentara alocata void FIGURA::Muta(int dx,int dy) //****************************** Sterge(); //stergere LOCATION::Muta(dx,dy); //mutare Afiseaza(); //afisare in noua pozitie void FIGURA::Creste(int dr) //************************* Sterge(); r+=dr; Afiseaza(); //stergere //redimensionare //afisare cu noua dimensiune - 10 -

//~~~~~~~~~~~~~~ // clasa CERC //~~~~~~~~~~~~~~ CERC::CERC():FIGURA() //******************* CERC::CERC(int x0,int y0,int r0,int c0, char *n0):figura(x0,y0,r0,c0,n0) //********************************************************************** void CERC::Sterge() //***************** setcolor(black); circle(x,y,r); if(nume!=null) outtextxy(x,y,nume); void CERC::Afiseaza() //******************* setcolor(c); circle(x,y,r); if(nume!=null) outtextxy(x,y,nume); //~~~~~~~~~~~~~~~~ // clasa PATRAT //~~~~~~~~~~~~~~~~ PATRAT::PATRAT():FIGURA() //*********************** PATRAT::PATRAT(int x0,int y0,int r0,int c0, char *n0):figura(x0,y0,r0,c0,n0) //************************************************************************** void PATRAT::Sterge() //******************* setcolor(black); rectangle(x-r,y-r,x+r,y+r); if(nume!=null) outtextxy(x,y,nume); void PATRAT::Afiseaza() //********************* setcolor(c); rectangle(x-r,y-r,x+r,y+r); if(nume!=null) - 11 -

outtextxy(x,y,nume); //~~~~~~~~~~~~~~~~~ // clasa MULTIME //~~~~~~~~~~~~~~~~~ MULTIME::MULTIME() //**************** NrFiguri=0; FiguraCurenta=0; void MULTIME::Goleste() //********************* int k; for(k=0;k<nrfiguri;k++) pe[k]->sterge(); // stergere de pe ecran delete pe[k]; // stergere din memorie NrFiguri=0; FiguraCurenta=0; void MULTIME::Afiseaza() //********************** int k; for(k=0;k<nrfiguri;k++) pe[k]->afiseaza(); FIGURA* MULTIME::Get() //******************** return(pe[figuracurenta]); int MULTIME::NrElem() //******************* return(nrfiguri); void MULTIME::operator++() //************************ FiguraCurenta++; FiguraCurenta%=NrFiguri; void MULTIME::operator += ( FIGURA* f) //************************************ if(nrfiguri==max_figuri) return; // nu mai putem insera memmove(&pe[figuracurenta]+1,&pe[figuracurenta], (NrFiguri-FiguraCurenta)*sizeof(pe[0]) ); // facem loc pe[figuracurenta]=f; // inserare figura noua NrFiguri++; - 12 -

MULTIME& MULTIME::operator + ( FIGURA* f) //*************************************** if(nrfiguri==max_figuri) return(*this); // nu mai putem insera memmove(&pe[figuracurenta]+1,&pe[figuracurenta], (NrFiguri-FiguraCurenta)*sizeof(pe[0]) ); // facem loc pe[figuracurenta]=f; // inserare figura noua NrFiguri++; return(*this); // returnam multimea void MULTIME::Elimina() //********************* if(nrfiguri==1) return; // lista sa nu fie vida pe[figuracurenta]->sterge(); // stergere de pe ecran delete pe[figuracurenta]; // distrugere element memmove(&pe[figuracurenta],&pe[figuracurenta]+1, (NrFiguri-FiguraCurenta)*sizeof(pe[0]) ); // mutare in multime NrFiguri--; if(figuracurenta==nrfiguri) FiguraCurenta--; - 13 -