Documente Academic
Documente Profesional
Documente Cultură
//fifo.h
#ifndef FIFO_H
#define FIFO_H
#include "abselem.h"
class Fifo{
public:
Fifo(int nrmax=0);
void put(AbstractElem *);
AbstractElem* get();
void remove();
private:
int nrmax;
int nrelem;
int first;
int free;
AbstractElem* *support;
};
#endif
//elements.h
#include "abselem.h"
#include "iostream.h"
class Person: public AbstractElem{
public:
Person(char *name);
virtual void display();
virtual void process();
private:
char *name;
};
class Car: public AbstractElem{
public:
Car(char *name);
virtual void display();
virtual void process();
private:
char *name;
};
//driver.cpp
#include "elements.h"
#include "fifo.h"
Fifo queue(3);
void main(){
queue.put(new Person("Tudor"));
queue.put(new Person("Andrei"));
queue.put(new Car("B-39-TDR"));
queue.get()->process(); queue.remove();
queue.get()->process(); queue.remove();
queue.get()->process(); queue.remove();
}
//fifo.cpp
#include "fifo.h"
Fifo::Fifo(int nrmax):nrmax(nrmax){
first=free=nrelem=0;
support = new AbstractElem* [nrmax-1];
}
void Fifo::put(AbstractElem * pe){
support[free]=pe; free= ++free % nrmax; nrelem++;
}
AbstractElem* Fifo::get(){
return support[first];
}
void Fifo::remove(){
first= ++first % nrmax;
--nrelem;
}
//elements.cpp
#include "elements.h"
Person::Person(char *name):name(name){};
void Person::display(){cout<<name<<endl;}
void Person::process(){
cout<<"A Person: ";
display();
}
Car::Car(char *name):name(name){};
void Car::display(){cout<<name<<endl;}
void Car::process(){
cout<<"A Car:";
display();
}
private:
int nrmax;
int nrelem;
int first;
int free;
T* support;
};
class Person {
public:
Person(char *name);
Person(); //necesar pentru a intializa tablouri
virtual void display();
virtual void process();
private:
char *name;
};
class Car {
public:
Car(char *name);
Car();
virtual void display();
virtual void process();
private:
char *name;
};
Person::Person(char *name):name(name){};
Person::Person(){};
void Person::display(){cout<<name<<endl;}
void Person::process(){
cout<<"A Person: ";
display();
}
Car::Car(char *name):name(name){};
Car::Car(){};
void Car::display(){cout<<name<<endl;}
void Car::process(){
cout<<"A Car:";
display();
}
Fifo<Person> queuePerson(3);
Fifo<Car> queueCar(3);
void main(){
queuePerson.put(Person("Tudor"));
queuePerson.put(Person("Andrei"));
queueCar.put(Car("B-39-TDR"));
queuePerson.get().process(); queuePerson.remove();
queueCar.get().process(); queueCar.remove();
queuePerson.get().process(); queuePerson.remove();
}
39. Explicati de ce in programul urmator este creat doar un singur obiect, chiar daca exista doua
expresii S::create().
//singleton
// constructor private
#include <iostream.h>
#include <conio.h>
class S{
public:
static S* create(){
if(i==0){
refS=new S(); i++;
}
return refS;
}
void setName(char *s){name=s;}
char* getName(){return name;}
static int getNr(){return nr;}
private:
static S* refS;
static int i;
static int nr;
S(){nr++;}
char *name;
};
int S::i=0;
int S::nr=0;
S* S::refS=0;
void main(){
S *o1, *o2;
o1=S::create();
o2=S::create();
o1->setName("Matematica");
o2->setName("Informatica");
cout<<o1->getName()<<endl;
cout<<o2->getName()<<endl;
cout<<S::getNr()<<endl;
getch();
}
#include <math.h>
#include <iostream.h>
class complex{
public:
complex(double r){real=r; imag=0;}
void assign (double r, double i){real= r; imag=i;}
void print(){cout<<real<<"+"<<imag<<"i"<<endl;}
double give_real(){return real;}
double give_imag(){return imag;}
complex operator +( complex z) {
real+=z.real;imag+=z.imag; return *this;
}
private:
double real, imag;
};
void main(){
complex z(1), y(1);
z.assign(2,3); y.assign(3,4);
cout<<"start"<<endl;
z.print(); y.print();
(y+z).print();
(y+1).print();
(1+y).print();
(y-1).print();
(1-y).print();
}
41.
Fie clasa
class deque{
public:
void reset(){top=bottom=MAX_LEN/2; top--;}
private:
char s[MAX_LEN];
int bottom, top;
};
care descrie o coada cu doua capete.
Declarati si implementati metodele
adauga_dreapta, adauga_stanga, elimina_dreapta, elimina_stanga, este_vida, este_plina
43.
Explicati diferenta dintre structura
struct A{int i,j,k;};
si clasa
class A{int i,j,k;};
De ce nu este utila clasa A?
Folosind cuvantul cheie public, adaptati declararea clasei A
astfel incat ea sa fie echivalenta cu structura A.
44.
Explicati erorile semnalate la compilarea urmatorului program
class Punct{
public:
Punct(){x=0; y=0;}
Punct(int xx=0){x=xx;y=0;}
Punct(int xx, int yy=0){x=xx; y=yy;}
private:
int x,y;
};
void main(){
Punct p;
Punct p1(1);
Punct p2(1,2);
}
45.
Explicati erorile la executarea programului urmator
Modificati constructorul de copiere pentru a elimina aceste erori
#include <iostream.h>
class X{
public:
X(int i=0){p=new int; if(p) *p=i;}
X(const X &r){p=r.p;}
~X(){if(p){delete p; p=0;}}
void show(){cout<<*p<<endl;}
private:
int *p;
};
void main(){
X *o1,*o2;
o1=new X(1);
o2=new X(*o1);
o1->show(); delete o1;
o2->show(); delete o2;
}
46.
In programul urmator, supradefiniti operatorul << astfel incat cout<<i sa afiseze
valoarea atributului i.x
Precizati si explicati rezultatele afisate la executarea programului astfel obtinut
#include <iostream.h>
class C{
public:
C(int i=0){x=i;}
C& operator++(){++x; return *this;}
C operator--(){--x; return *this;}
private:
int x;
};
void main(){
C i;
cout<<i<<endl;
cout<<++(++i)<<endl<<i<<endl;
cout<<--(--i)<<endl<<i<<endl;
}
47.
Inlocuiti . . . in clasa Stack, astfel incat metodele push si pop sa asigure tratarea
exceptiilor. Numarul maxim de elemente din vectorul supporteste dat de expresia
suport.length.
Scrieti o aplicatie in care sa tratati exceptiile lansate de push si pop.
class Stack{
int varf;
Object suport[];
void push(Object x). . .{. . .}
Object pop(). . .{. . .}
void init(int s){
varf=0;
support=new Object[s];
}
Stack(int s){. . .}
}
48.
Se consideră următorul program C++, în formă incompletă:
#include <iostream.h>
class E{
public:
E(int i=0):i(i){}
int i;
};
class B{
public:
B(E *pe):pe(pe){cout<<"B::B(E*)"<<endl;}
B& operator=(const B &b){
pe->i=b.pe->i;
cout<<"B::op="<<endl;
return *this;
}
// 1…?
private:
E *pe;
};
class D:public B{
public:
D(E *pe, E *pf):B(pe),pf(pf){cout<<"D::D(E*,E*)"<<endl;}
// 2...?
private:
E *pf;
};
void main(){
E e0(0),e1(1), e10(10), e11(11);
B b0(&e0), b1(&e1);
cout<<b0; // instr 1
cout<<endl<<b1<<endl;
cout<<"----"<<endl;
D d0(&e0,&e10), d1(&e1,&e11);
cout<<d0 ; // instr 2
cout<<endl<<d1<<endl;
cout<<"----"<<endl;
d0=d1;
cout<<d0<<endl<<d1<<endl;
cout<<"----"<<endl;
e10.i=100; e11.i=111;
cout<<d0<<endl<<d1<<endl;
cout<<"----"<<endl;
}
1. Se cere să supraîncărcaŃi operatorul de inserŃie << astfel ca prin executarea
instrucŃiunilor //instr 1 şi //instr 2 să se afişeze 0 şi respectiv 0;10
2. SupraîncărcaŃi in clasa D operatorul de atribuire astfel ca prin executarea
programului să se obŃină următoarele rezultate:
B::B(E*)
B::B(E*)
0
1
----
B::B(E*)
D::D(E*,E*)
B::B(E*)
D::D(E*,E*)
0;10
1;11
----
B::op=
D::op=
1;11
1;11
----
1;111
1;111
49. Se consideră următoarea interfaŃă Java, în care sunt definite câteva operaŃii
elementare asupra listelor de obiecte:
interface ListOperations{
public void add(Object o);// adauga un obiect in lista
// returneaza, fara a sterge,
// elementul curent din lista
public Object currentElement();
public void delete();// sterge elementul curent
}
Se cere să implementaŃi această interfaŃă printr-o clasă Queue ale cărei obiecte sunt
liste eterogene First In First Out (cozi circulare, în care elementul current are cea mai
mare vechime în listă şi este indicat de cursor).
Aceste liste sunt observabile în sensul următor: când cursorul este deplasat, noul
element curent este transmis către toate obiectele observatoare (aici includem şi cazul
în care se adugă un element într-o listă vidă).
Obiectele observatoare sunt din clasa QueueObserver, pe care trebuie de asemenea s-o
definiŃi.
Completând corespunzătot //…1, //…2, //…3 şi //…4, programul test de mai jos
trebuie să afişeze rezultatele următoare:
100
100
Tudor
Andrei
//. . .2
//atributes
private int free=0; //pozitia libera
private int cursor=0;// pozitia cu elementul util
// 0<=numberOfElements<=maxDim,
//numarul real de elemente din coada
private int numberOfElements=0;
private Object v[];
private int maxDim;
}
// atributes
private Queue obsQ; // coada observabila
}
}
50.
Definiti clasa NumereRationale, ale carei obiecte sunt numere rationale. DefiniŃi
metode şi operatori astfel încât executarea programului următor:
#include “rational.h”
void main(){
NumereRationale x(10, -20);
cout<< x << “ ; “ << 3 * x << “ ; “ << x * 2 << “ ; “<< x * x<< endl;
}
să afişeze linia:
51.
Completati specificarea clasei C si implementati metodele si operatorii astfel incat
prin executarea programului sa se obtina rezultatele indicate prin comentarii.
#include <iostream.h>
class C{
public:
void set_x(int x){
*px=x;
}
void set_y(int y){
*py=y;
}
private:
int *px;
int *py;
};
void main(){
C m, n(1,2);
cout<<m<<endl; // x=0; y=0;
cout<<n<<endl; //x=1; y=2;
m=n*100;
cout<<n*100<<endl; // x=100; y=200;
cout<<n<<endl; //x=1; y=2;
m=n;
n.set_x(100);n.set_y(200);
cout<<m<<endl; //x=100; y=2
52. }
Se consideră clasa următoare:
class C{
public:
C(int n=1, int v[]);
void set(int i, int val){
pi[i]=val;
}
// alte metode si operatori
private:
int dim;
int *pi;
};
şi programul:
void main(){
int a[]={1,2,3}, b[]={10,20};
C x(3,a),y(2, b);
// prima afisare
cout<<x<<endl; //1; 2; 3;
a[0]=10;
// a doua afisare
cout<<x<<endl; //1; 2; 3;
// a treia afisare
cout<<(x=y)<<endl;
y.set(0,1000);
// a patra afisare
cout<<x<<endl;
cout<<(x=x)<<endl;
}
53.
Fie următoarea specificare a clasei Stiva_forma_preliminara:
class Stiva_forma_preliminara{
public:
Stiva_forma_preliminara (int n);
// constructor, construieste o stiva
// ce poate contine maximum n caractere
void adauga( char c); // modificator, adauga un caracter in stiva
char varf(); // interogare, da caracerul din varful stivei
protected:
int i;
private:
int n;
char *s;
};
Stiva_forma_preliminara s(5);
void main(){
adauga(‘C’);
cout<<s.varf();
adauga(‘+’);
cout<<s.varf();
adauga(‘+’);
cout<<s.varf()<<endl;
}
să afişeze rezultatul următor:
C++
54.
Se cere să se specifice şi să se implementeze o clasa Stiva astfel încât următorul
program de încercare:
Stiva s(5);
void main(){
adauga(‘C’);
cout<<s.varf();
adauga(‘+’);
cout<<s.varf();
adauga(‘+’);
cout<<s.varf()<<endl;
s.elimina();
s.elimina();
cout<<s.varf()<<endl;
}
să afişeze rezultatul următor:
C++
C
55.
Să se utilizeze arhitectura Model View Controller pentru a crea o interfaŃă grafică ce
conŃine:
• un buton prin acŃionarea căruia este incrementat cu o unitate un număr natural
de maximum 3 cifre;
• o linie în care este afişată valoarea obŃinută prin incrementare.
Dacă prin incrementare este atinsă valoarea 1000, este semnalată o excepŃie. După
aceasta acŃionarea butonului nu mai modifică valoarea afişată.
Se impun următoarele cerinŃe:
• obiectele Controller pot avea ca atribute obiecte Model şi View
• obiectele View nu pot avea atribute de tip Model sau Controller.
IndicaŃie. Clasa principală este:
// file MVC.java
public class MVC{
public static void main(String[] args){
View v=new View();
Model m= new Model();
Controller c= new Controller(v,m);
}
}
56.
Completati specificarea clasei C si implementati metodele si operatorii astfel incat
prin executarea programului sa se obtina rezultatele indicate prin comentarii.
#include <iostream.h>
class C{
public:
void set_x(int x){
*px=x;
}
void set_y(int y){
*py=y;
}
private:
int *px;
int *py;
};
void main(){
C m, n(1,2);
cout<<m<<endl; // x=0; y=0;
cout<<n<<endl; //x=1; y=2;
m=n*100;
cout<<n*100<<endl; // x=100; y=200;
cout<<n<<endl; //x=1; y=2;
m=n;
n.set_x(100);n.set_y(200);
cout<<m<<endl; //x=100; y=2
}
import java.awt.*;
import java.awt.event.*;
class Model{
private int x=0;
public Model(){};
public void increment(){x++;}
public void decrement(){x--;}
public int get_x(){return x;}
}
public class View extends Frame{
protected Button binc;
protected Button bdec;
protected Model m;
private Controller c;
protected TextField tf;
public static void main(String args[]){
Frame f= new View();
}
public View(){
setTitle("Exemplu Model-View-Controller");
m=new Model();
c=new Controller(this);
//
//
tf=new TextField(10);
add("Center",tf);
setSize(100,250);
setVisible(true);
}
}
Se cere:
a) Implementati clasa Controller astfel incat
prin actionarea butonului A sa se mareasca cu o unitate atributul vw.m.x iar la
actionarea butonului B atributul vw.m.x sa sa devina zero (valorile vor fi afisate in
campul tf).
b) Adaugati instructiuni de instalare a evenimentelor, utilizand obiectul c.
c) Descrieti dispunerea in fereastra a componentelor
58.
Fie următoarea schiŃă a unui program Java ce implementează un cronometru. Se
intenŃionează ca pe monitor să fie afişat, din 5 în 5 secunde, timpul scurs de la
pornirea sa (măsurat tot în secunde), sub forma următoare:
0 5 10 15 20 25 ...
Se cere să indicaŃi instrucŃiunile pe care le propuneŃi în locurile 1-????, 2-???? şi 3-
???? pentru ca programul să funcŃioneze conform acestei descrieri.
// fisier Cronometru.java
import java.util.*;
class Oscilator extends Thread {
long secunda=0;
public void run(){
while(true){
try {sleep (1000);} catch (Exception e){}
secunda++;
}
}
public long getSecunda(){return secunda;}
}
}
}
}
}
interface Afisare{
public void afiseaza(long i);
}
}
59.
Se consideră următoarea interfaŃă Java, în care sunt definite câteva operaŃii elementare
asupra listelor de obiecte:
interface ListOperations{
public void add(Object o);// adauga un obiect in lista
// returneaza, fara a sterge,
// elementul curent din lista
public Object currentElement();
public void delete();// sterge elementul curent
}
Se cere să implementaŃi această interfaŃă printr-o clasă Queue ale cărei obiecte sunt
liste eterogene First In First Out (cozi circulare, în care elementul current are cea mai
mare vechime în listă şi este indicat de cursor).
Aceste liste sunt observabile în sensul următor: când cursorul este deplasat, noul
element curent este transmis către toate obiectele observatoare (aici includem şi cazul
în care se adugă un element într-o listă vidă).
Obiectele observatoare sunt din clasa QueueObserver, pe care trebuie de asemenea s-o
definiŃi.
Completând corespunzătot //…1, //…2, //…3 şi //…4, programul test de mai jos
trebuie să afişeze rezultatele următoare:
100
100
Tudor
Andrei
//. . .2
//atributes
private int free=0; //pozitia libera
private int cursor=0;// pozitia cu elementul util
// 0<=numberOfElements<=maxDim,
//numarul real de elemente din coada
private int numberOfElements=0;
private Object v[];
private int maxDim;
}
// atributes
private Queue obsQ; // coada observabila
}
}
60.
şi programul de test:
void main(){
int a[]={1,2,3}, b[]={10,20};
C x(3,a),y(2, b);
a[0]= -100;
cout<<x<<endl;
cout<<(x=y)<<endl;
y.set(0,-1000);
cout<<x<<endl;
cout<<(x=x)<<endl;
}
Se cere:
1. să implementaŃi operatorul de inserŃie, astfel încat prin:
int a[]={1,-2,-30}; C x(3,a); cout<<x;
să se afişeze: (1, –2, -30)
2. să precizaŃi ce se afişează prin executarea programului şi să explicaŃi rolul
constructorului implementat prin referinŃă şi al operatorului de atribuire la
obŃinerea acestor rezultate; (răspunsul fără explicaŃii nu este luat în
considerare)
3. Să presupunem că operatorul = este supraîncărcat prin:
int main(){
typedef struct{
int x;
int y;
}complex;
int x,y;
complex c,d;
swap(x,y);
swap(c,d);
return 0;
}
62.
Să se utilizeze arhitectura Model View Controller pentru a crea o interfaŃă grafică ce
conŃine:
• un buton prin acŃionarea căruia este incrementat cu o unitate un număr natural
de maximum 3 cifre;
• o linie în care este afişată valoarea obŃinută prin incrementare.
Dacă prin incrementare este atinsă valoarea 1000, este semnalată o excepŃie. După
aceasta acŃionarea butonului nu mai modifică valoarea afişată.
Se impun următoarele cerinŃe:
• obiectele Controller pot avea ca atribute obiecte Model şi View
• obiectele View nu pot avea atribute de tip Model sau Controller.
IndicaŃie. Clasa principală este:
// file MVC.java
public class MVC{
public static void main(String[] args){
View v=new View();
Model m= new Model();
Controller c= new Controller(v,m);
}
}
63.
Fie următorul program C++:
#include <iostream.h>
// legare statica versus legare dinamica
class A{
public:
void main(){
A *p;
cout<<"Obiect A"<<endl;
p=new A();
p->st();
p->vrt();
p->stafis();
p->vrtafis();
cout<<"Obiect B"<<endl;
p=new B();
p->st();
p->vrt();
p->stafis();
p->vrtafis();
}
64.
Să se specifice şi să se implementeze, în C++ sau Java, o clasă ale carei obiecte sunt
persoane cu o anumită identitate. Identitatea nu este încă bine precizată, dar ar putea
conŃine elemente precum nume, prenume, adresă, CNP etc. ce urmează a fi stabilite
ulterior.
Clasa dispune de o metodă void afisare() prin care este afişată identitatea unei
persoane.
65.
Fie urmatorul program Java:
import java.awt.*;
import java.awt.event.*;
class Model{
private int x=0;
public Model(){};
public void increment(){x++;}
public void decrement(){x--;}
public int get_x(){return x;}
}
public class View extends Frame{
protected Button binc;
protected Button bdec;
protected Model m;
private Controller c;
protected TextField tf;
public static void main(String args[]){
Frame f= new View();
}
public View(){
setTitle("Exemplu Model-View-Controller");
m=new Model();
c=new Controller(this);
binc.addActionListener(c);
bdec.addActionListener(c);
tf=new TextField(10);
add("Center",tf);
setSize(100,250);
setVisible(true);
}
}
Se cere:
a. Descrieti dispunerea in fereastra a componentelor si efectul actionarii
butoanelor A si B.
b. Descrieti procedeul Model-View-Controller
c. Modificati programul,folosind interfata WindowListener si metoda sa
public void windowClosing(WindowEvent e), astfel incat actionarea
butonului x din coltul din dreapta sus sa inchida fereastra.
66.
Completati specificarea clasei C si implementati metodele si operatorii astfel incat
prin executarea programului sa se obtina rezultatele indicate prin comentarii. Ce se
afisează prin ultima instrucŃiune?_
#include <iostream.h>
class C{
public:
C(C &c){
*c.px=0;
*c.py=0;
}
void set_x(int x){
*px=x;
}
void set_y(int y){
*py=y;
}
private:
int *px;
int *py;
};
void f(C c){}
void main(){
C m, n(1,2);
cout<<m<<endl; // x=0; y=0;
cout<<n<<endl; //x=1; y=2;
m=100*n;
cout<<100*n<<endl; // x=100; y=200;
cout<<n<<endl; //x=1; y=2;
m=n;
n.set_x(100);n.set_y(200);
cout<<m<<endl; //x=100; y=2
f(m);
cout<<m<<endl; // ce afiseaza ?
}
67.
a. ImplementaŃi următoarea schiŃă a claselor CoadaCirculara, DepasireCapacitate şi
ListaVida şi completaŃi blocurile catch astfel încât prin executarea programului
TestCoadaCirculara să se obŃină efectul specificat prin comentarii.
Obiectele clasei CoadaCirculara sunt cozi (fifo) asupra cărora se fac operaŃii de
adăugare-extragere-interogare.
ObservaŃie. Locurile în care se intervine sunt
//?? 1 …//?? 8
b.ImplementaŃi o interfaŃă grafică alcătuită din trei butoane (adaugă, elimina şi
element) prin care sa se realizeze interacŃiunea cu o coada. Elementele cozii
sunt siruri de caractere ce vor fi preluate şi afişate în alte componente ale
interfeŃei (TextField). La implementarea metodei actionPerformed nu se vor
folosi instrucŃiuni if sau switch.
// programul TestCoadaCirculara
public class TestCoadaCirculara{
public static void main(String [] args){
CoadaCirculara a=new CoadaCirculara(3, "LISTA A");
CoadaCirculara b=new CoadaCirculara(4, "LISTA B");
try{
a.adauga("1");
a.adauga(b);
a.adauga(new Integer(-10));
// In acest moment, a=("1",b,-10)
// si "1" este primul element
System.out.println(a.element());
// s-a afisat "1"
a.elimina(); //a=(b,-10)
System.out.println(((CoadaCirculara)a.element()).nume());
// s-a afisat "LISTA B"
a.adauga("1"); //a=(b,-10,"1")
a.elimina();
a.elimina();
a.elimina();
b.adauga("X");
// a=() si b=("X")
System.out.println(a.element() );
// Se afiseaza mesajul:
// Exceptie ListaVida in LISTA A
// si programul se termina
System.out.println(b.element() );
}
catch(DepasireCapacitate e){
System.out.println //?? 7
}
catch(ListaVida e){
System.out.println //?? 8
}
}
}
68.
69. In urmatorul program (incomplet):
a. Implementati constructorul Cilindru
b. Implementati operator-- astfel ca efectul sa fie
decrementarea razei si inaltimii cilindrului
c. Se poate inlocui expresia lungime()*inaltime prin
2*PI*raza*inaltime?
d. Explicati rezultatele afisate de liniile //1, //2, //3, //4 si //5
#include <iostream.h>
#define PI 3.14
class Cerc{
public:
Cerc(float r):raza(r){}
virtual float arie(){return PI*raza*raza;}
float lungime(){return 2*PI*raza;}
Cerc operator++(){raza++;return *this;}
Cerc& operator--(){raza--;return *this;}
private:
float raza;
};
class Cilindru: public Cerc{
public:
Cilindru(float raza, float inaltime);
virtual float arie(){return lungime()*inaltime;}
Cilindru& operator--();
private:
float inaltime;
};
void main(){
Cerc c(1.0), *pc;
pc=new Cilindru(0.0,5.0);
cout<<(++(++c)).lungime()<<endl; //1
cout<<c.lungime()<<endl; //2
cout<<(--(--c)).lungime()<<endl; //3
cout<<c.lungime()<<endl; //4
cout<<(++(*pc)).arie()<<endl; //5