Sunteți pe pagina 1din 53

JAVA

1. Fie urmãtorul bloc de instrucþiuni Java:


{
int x = 12;
q=1;
{
int q = 96;
// Both x & q available
x=q;
}
q=x;
x=1;
}

Care afirmatie este adevarata:


a. instructiunea x=q; este corecta;
b. instructiunea q=x; este corecta;
c. instructiunea x=1; este incorecta;
d. instructiunea q=1; este corecta;

2. Fie urmãtorul bloc de instrucþiuni Java:


{
int x = 10;
x=1;
{
int x = 100;
}
x=2;
}

Care afirmatie este adevarata:


a. instructiunea x=1; este incorecta;
b. instructiunea int x = 100; este incorecta;
c. instructiunea x=2; este incorecta;
d. instructiunea int x = 10; este incorecta;

3. Fie urmatoarea clasa Java:


class D {
int i;
float f;
boolean b;
}

Care afirmatie este adevarata:


a. instructiunea D d = new D(1); este corecta;
b. instructiunea D d = new D(1,1); este corecta;
c. instructiunea D d = new D(); este corecta;
d. instructiunea D d = new D(1,1,1); este corecta;

4. Fie urmatoarea metoda Java:


int storage(String s) {
return s.length() * 2;
}
si instructiunea
int i=storage(”Java”);

Care afirmatie este adevarata:


a. instructiunea este incorecta;
b. i va primi valoarea 4;
c. i va primi valoarea 16;
d. i va primi valoarea 8;
5. Fie urmãtoarea clasã Java:
class C{
public static int i=1;
}
si instrucþiunile:
C x=new C();
C y=new C();
x.i =x.i ?+1;

Care afirmatie este adevarata:


a. Dupa executarea instructiunii x.i =x.i ?+1; avem x.i = 2 si y.i=2;
b. Dupa executarea instructiunii x.i =x.i ?+1; avem x.i = 2 si y.i=1;
c. Dupa executarea instructiunii x.i =x.i ?+1; avem x.i = 1 si y.i=2;
d. Dupa executarea instructiunii x.i =x.i ?+1; avem x.i = 1 si y.i=1;

6. Fie urmãtoarea clasã Java:


class C{
public static void main(String args[]){
System.out.println(args[0]);
System.out.println(args[1]);
}
}

Daca se executa linia de comanda:


>java C Curs Java An 3
atunci se va afisa:
a. Curs Java An
b. Curs
Java
c. Java An 3
d. Curs
Java
An
3

7. Fie urmãtoarea clasã Java:


class C{
public static void main(String args[]){
for(int i=0;i<args.length; i++)
System.out.println(“ “ + args[i]);
}
}

Daca se executa linia de comanda:


>java C Curs Java An 3
atunci se va afisa:
a. Curs
Java
b. Curs Java An
c. Curs
Java
An
3
d. Java An 3

8. Fie urmãtoarea clasã Java:


public class Person{
public Person(String p){name=new String(p);
System.out.println(++nr);
}
public static void main(String[] args){
while(true)f();
}
private static void f(){Person p =
new Person("Ionescu");
// obiectele NU se acumuleaza
// in heap si NU blocheaza executarea, spre deosebire de C++
}
private String name;
private static long nr=0;
};

Care afirmatie este adevarata:


a. Programul nu se opreste din executare;
b. Programul se termina, cu mesaj de eroare, deoarece la un moment
dat nu mai exista memorie suficienta pentru crearea obiectelor
Person;
c. Programul are erori de sintaxa;
d. Programul se termina, fara mesaj de eroare.

9. Fie urmatoarele clase Java:


class Overflow extends Exception{
public Overflow(Stack o){source=o;}
public Stack getSource(){return source;}
private Stack source;
}
class Underflow extends Exception{
public Underflow(Stack o){source=o;}
public Stack getSource(){return source;}
private Stack source;
}
class Stack{
public Stack(int n, String s){
dim=n; name=s; top=-1;
v= new Object[dim];
}
public void insert(Object o) throws Overflow{
if(top < dim-1) v[++top]=o;
else throw new Overflow(this);
}
public void delete() throws Underflow{
if(top >=0) top--;
else throw new Underflow(this);
}
public Object item() throws Underflow{
if(top >=0) return v[top];
else throw new Underflow(this);
}
public String getName(){return name;}
private Object v[];
private int dim;
private int top;
private String name;
}
public class StackDriver{
public static void main(String args[]){
Stack s1,s2;
s1=new Stack(2, "stiva Tudor");
s2=new Stack(2, "stiva Andrei");
try{
s1.insert("aa");
s1.delete();
s1.item();
} catch (Overflow e){
System.out.println("Overflow la " +
e.getSource().getName());
} catch (Underflow e){
System.out.println("Unnderflow la " +
e.getSource().getName());
}
}
}

Care afirmatie este adevarata:


a. Programul afiseaza: Overflow la stiva Tudor
b. Programul afiseaza: Underflow la stiva Tudor
c. Programul afiseaza: Overflow la stiva Andrei
d. Programul afiseaza: Underflow la stiva Andrei

10. Fie urmatoarele clase Java:


class Overflow extends Exception{
public Overflow(Stack o){source=o;}
public Stack getSource(){return source;}
private Stack source;
}
class Underflow extends Exception{
public Underflow(Stack o){source=o;}
public Stack getSource(){return source;}
private Stack source;
}
class Stack{
public Stack(int n, String s){
dim=n; name=s; top=-1;
v= new Object[dim];
}
public void insert(Object o) throws Overflow{
if(top < dim-1) v[++top]=o;
else throw new Overflow(this);
}
public void delete() throws Underflow{
if(top >=0) top--;
else throw new Underflow(this);
}
public Object item() throws Underflow{
if(top >=0) return v[top];
else throw new Underflow(this);
}
public String getName(){return name;}
private Object v[];
private int dim;
private int top;
private String name;
}
public class StackDriver{
public static void main(String args[]){
Stack s1,s2;
s1=new Stack(2, "stiva Tudor");
s2=new Stack(2, "stiva Andrei");
try{
s2.insert("aa");
s2.delete();
s2.item();
} catch (Overflow e){
System.out.println("Overflow la " +
e.getSource().getName());
} catch (Underflow e){
System.out.println("Unnderflow la " +
e.getSource().getName());
}
}
}
Care afirmatie este adevarata:
a. Programul afiseaza: Underflow la stiva Andrei
b. Programul afiseaza: Underflow la stiva Tudor
c. Programul afiseaza: Overflow la stiva Tudor
d. Programul afiseaza: Overflow la stiva Andrei

11. Fie urmatoarele clase Java:


class Overflow extends Exception{
public Overflow(Stack o){source=o;}
public Stack getSource(){return source;}
private Stack source;
}
class Underflow extends Exception{
public Underflow(Stack o){source=o;}
public Stack getSource(){return source;}
private Stack source;
}
class Stack{
public Stack(int n, String s){
dim=n; name=s; top=-1;
v= new Object[dim];
}
public void insert(Object o) throws Overflow{
if(top < dim-1) v[++top]=o;
else throw new Overflow(this);
}
public void delete() throws Underflow{
if(top >=0) top--;
else throw new Underflow(this);
}
public Object item() throws Underflow{
if(top >=0) return v[top];
else throw new Underflow(this);
}
public String getName(){return name;}
private Object v[];
private int dim;
private int top;
private String name;
}
public class StackDriver{
public static void main(String args[]){
Stack s1,s2;
s1=new Stack(2, "stiva Tudor");
s2=new Stack(2, "stiva Andrei");
try{
s1.insert("aa");
s1.delete();
s2.insert("aa");
s2.insert( new Integer(10));
s2.insert("aa");
} catch (Overflow e){
System.out.println("Overflow la " +
e.getSource().getName());
} catch (Underflow e){
System.out.println("Unnderflow la " +
e.getSource().getName());
}
}
}

Care afirmatie este adevarata:


a. Programul afiseaza: Overflow la stiva Tudor
b. Programul afiseaza: Overflow la stiva Andrei
c. Programul afiseaza: Underflow la stiva Tudor
d. Programul afiseaza: Underflow la stiva Andrei

12. Fie urmatoarele clase Java:


class Stack{
public Stack(int n, String s){
dim=n; name=s; top=-1;
v= new Object[dim];
}
public void insert(Object o) {
v[++top]=o;
}
public void delete(){
top--;
}
public Object item(){
return v[top];
}
public String getName(){return name;}
private Object v[];
private int dim;
private int top;
private String name;
}
public class StackDriver{
public static void main(String args[]){
Stack s1,s2;
s1=new Stack(2, "stiva Tudor");
s1.insert("aa");
s1.insert( new Integer(10));
System.out.println("Varful stivei: " + s1.item());
}

Care afirmatie este adevarata:


a. Programul afiseaza:
Varful stivei: aa
b. Programul afiseaza: stiva Tudor
c. Programul afiseaza:
Varful stivei: 10
d. Programul afiseaza: 2

13. Fie urmatoarele clase Java:


class Stack{
public Stack(int n, String s){
dim=n; name=s; top=-1;
v= new Object[dim];
}
public void insert(Object o) {
v[++top]=o;
}
public void delete(){
top--;
}
public Object item(){
return v[top];
}
public String getName(){return name;}
private Object v[];
private int dim;
private int top;
private String name;
}
public class StackDriver{
public static void main(String args[]){
Stack s1,s2;
s1=new Stack(2, "stiva Tudor");
s1.insert("aa");
s1.insert( new Integer(10));
s1.delete();
System.out.println("Varful stivei: " + s1.item());
}

Care afirmatie este adevarata:


a. Programul afiseaza: stiva Tudor
b. Programul afiseaza:
Varful stivei: 10
c. Programul afiseaza: 2
d. Programul afiseaza:
Varful stivei: aa

14. Fie urmatoarele clase Java:


class Stack{
public Stack(int n, String s){
dim=n; name=s; top=-1;
v= new Object[dim];
}
public void insert(Object o) {
v[++top]=o;
}
public void delete(){
top--;
}
public Object item(){
return v[top];
}
public String getName(){return name;}
private Object v[];
private int dim;
private int top;
private String name;
}
public class StackDriver{
public static void main(String args[]){
Stack s1,s2;
s1=new Stack(2, "stiva Tudor");
s1.insert("aa");
s1.insert( new Integer(10));
s1.delete();
System.out.println("Varful stivei: " + s1.item());
}

Care afirmatie este adevarata:


a. Programul afiseaza:
Varful stivei: aa
b. Programul afiseaza:
Varful stivei: 10
c. Programul afiseaza: stiva Tudor
d. Programul afiseaza: 2

15. Fie urmatoarele clase Java:


class Stack{
public Stack(int n, String s){
dim=n; name=s; top=-1;
v= new Object[dim];
}
public void insert(Object o) {
v[++top]=o;
}
public void delete(){
top--;
}
public Object item(){
return v[top];
}
public String getName(){return name;}
private Object v[];
private int dim;
private int top;
private String name;
}
public class StackDriver{
public static void main(String args[]){
Stack s1,s2;
s1=new Stack(2, "stiva Tudor");
s2=new Stack(2, "stiva Andrei");
s1.insert("aa");
s2.insert( new Integer(10));
System.out.println("Varful stivei: " + s1.item());
}
}

Care afirmatie este adevarata:


a. Programul afiseaza: stiva Tudor
b. Programul afiseaza:
Varful stivei: aa
c. Programul afiseaza: 2
d. Programul afiseaza:
Varful stivei: 10

16. Fie urmatoarele clase Java:


class CoadaCirculara{
public CoadaCirculara(int n, String s){maxDim=n; nume=s; v= new Object[maxDim];}
public boolean esteGoala(){return numarElemente==0;}
public boolean estePlina(){return numarElemente==maxDim;}
public void adauga(Object ob){
numarElemente++;
ultim= (ultim+1)%maxDim;
v[ultim]=ob;
}
public void elimina(){
numarElemente--;
prim=(prim+1)%maxDim;
}
public Object element(){
return v[prim];
}
// specializarea metodei Object.equals
// doua cozi sunt egale daca au aceleasi elemente
// chiar daca ele au dimensiuni maxime sau nume diferite
public boolean equals(Object obiectOarecare) {
if (obiectOarecare instanceof CoadaCirculara) {
CoadaCirculara cc= (CoadaCirculara)obiectOarecare;
boolean b=true;
b=b && (cc.numarElemente==numarElemente);
int i=prim;
int nr=numarElemente;
while(b && (nr !=0)){
b=b && cc.v[i].equals(v[i]);
nr--; i=(i+1)%maxDim;
}
return b;
}
return false;
}
public String nume(){return nume;}
private Object v[];
private int maxDim; // numarul maxim de elemente
private int prim=0;//pozitia primului element din lista
private int ultim=-1; //pozitia elementului adaugat ultima data
//lista are elementele in vectorul v, de la prim la ultim,
//in sensul acelor de ceasrnic
private int numarElemente=0; // numarul de elemente din coada
private String nume;// numele cozii
}
public class TestCoadaCirculara{
public static void main(String[] args){
CoadaCirculara x=new CoadaCirculara(3,"X");
CoadaCirculara y=new CoadaCirculara(3,"Y");
x.adauga("aa");
y.adauga("aa");
if(x.equals(y)) System.out.println("X=Y");
y.adauga("aa");
if(x.equals(y)) System.out.println("X=Y");
}
}
Care afirmatie este adevarata:
a. Programul afiseaza:
X=Y
X=Y
b. Programul nu afiseaza nimic
c. Programul afiseaza:
X=Y
d. Programul afiseaza: 3

17. Fie urmatoarele clase Java:


class CoadaCirculara{
public CoadaCirculara(int n, String s){maxDim=n; nume=s; v= new
Object[maxDim];}
public boolean esteGoala(){return numarElemente==0;}
public boolean estePlina(){return numarElemente==maxDim;}
public void adauga(Object ob){
numarElemente++;
ultim= (ultim+1)%maxDim;
v[ultim]=ob;
}
public void elimina(){
numarElemente--;
prim=(prim+1)%maxDim;
}
public Object element(){
return v[prim];
}
public String nume(){return nume;}
private Object v[];
private int maxDim; // numarul maxim de elemente
private int prim=0;//pozitia primului element din lista
private int ultim=-1; //pozitia elementului adaugat ultima data
//lista are elementele in vectorul v, de la prim la ultim,
//in sensul acelor de ceasrnic
private int numarElemente=0; // numarul de elemente din coada
private String nume;// numele cozii
}
public class TestCoadaCirculara{
public static void main(String[] args){
CoadaCirculara x=new CoadaCirculara(3,"X");
CoadaCirculara y=new CoadaCirculara(3,"Y");
x.adauga("aa");
y.adauga("aa");
if(x.equals(y)) System.out.println("X=Y");
y.adauga("aa");
if(x.equals(y)) System.out.println("X=Y");
}
}

Care afirmatie este adevarata:


a. Programul afiseaza: 3
b. Programul afiseaza:
X=Y
X=Y
c. Programul afiseaza:
X=Y
d. Programul nu afiseaza nimic

18. Fie urmatoarele clase Java:


class CoadaCirculara{
public CoadaCirculara(int n, String s){maxDim=n; nume=s; v= new
Object[maxDim];}
public boolean esteGoala(){return numarElemente==0;}
public boolean estePlina(){return numarElemente==maxDim;}
public void adauga(Object ob){
numarElemente++;
ultim= (ultim+1)%maxDim;
v[ultim]=ob;
}
public void elimina(){
numarElemente--;
prim=(prim+1)%maxDim;
}
public Object element(){
return v[prim];
}
public String nume(){return nume;}
private Object v[];
private int maxDim; // numarul maxim de elemente
private int prim=0;//pozitia primului element din lista
private int ultim=-1; //pozitia elementului adaugat ultima data
//lista are elementele in vectorul v, de la prim la ultim,
//in sensul acelor de ceasrnic
private int numarElemente=0; // numarul de elemente din coada
private String nume;// numele cozii
}
public class TestCoadaCirculara{
public static void main(String[] args){
CoadaCirculara x=new CoadaCirculara(3,"X");
x.adauga("a");
x.adauga("b");
x.adauga("c");
x.adauga("d");
x.adauga("e");
x.adauga("f");
System.out.println(x.element());
}
}

Care afirmatie este adevarata:


a. Programul afiseaza: b
b. Programul afiseaza: d
c. Programul afiseaza: c
d. Programul afiseaza: a

19. Fie urmatoarele clase Java:


public interface Actualizare{
public void actualizareNume(String nume);
public void actualizareVarsta(int varsta);
}
interface Afisare{
public void afisare();
public void actualizareVarsta(int varsta);
}
public class Persoana{
public Persoana(String nume, int varsta){
this.nume=nume; this.varsta=varsta;
}
public Persoana(){}
protected String nume="XXXX";
protected int varsta=0;
}
class PersoanaSpecializata extends Persoana
implements Actualizare, Afisare{
public void actualizareNume(String nume){this.nume=nume;}
public void actualizareVarsta(int varsta){this.varsta=varsta;}
public void afisare(){
System.out.println("nume= "+nume);
System.out.println("varsta= " + varsta);
}
}
public class Client{
public static void main(String args[]){
PersoanaSpecializata p=new PersoanaSpecializata();
Actualizare act=p;
Afisare afis=p;
act.actualizareNume("Ionescu");
act.actualizareVarsta(58);
afis.afisare();
}
}

Care afirmatie este adevarata:


a. Programul este incorect deoarece o clasa nu poate implementa dou ã
interfete
b. Programul este incorect deoarece metoda public void afisare() nu
face parte din clasa Persoana
c. Programul afiseaza:
nume= Ionescu
varsta= 58
d. Programul este incorect deoarece metoda public void actualizareVarsta(int
varsta) nu face parte din clasa PersoanaSpecializata

20. Fie urmatorul program Java:


import java.awt.*;
import java.awt.event.*;
class Model{
private int x=0;
public Model(){};
public void actiune(){x++;System.out.println(x);};
}
public class View extends Frame{
private Button b;
private Model m;
private Controller c;
public static void main(String args[]){
Frame f= new View();
}
public View(){
setTitle("Exemplu Model-View-Controller");
b= new Button("Actiune");
add(b);
m=new Model();
c=new Controller(m);
b.addActionListener(c);
setSize(100,50);
setVisible(true);
}
}
class Controller implements ActionListener{
private Model md;
public Controller(Model p){
md=p;
}
public void actionPerformed(ActionEvent e){
md.actiune();
}
}

Care afirmatie este adevarata, dacã se face de douã ori click pe butonul stang mouse
asupra butonului Actiune:
a. Programul nu afiºeazã nimic
b. Programul afiºeazã:
1
2
c. Valoarea atributului f.m.x rãmâne mereu la valoarea 0
d. Programul afiºeazã:
0
1

21. Fie urmatorul program Java:


import java.awt.*;
import java.awt.event.*;
class Model{
private int x=0;
public Model(){};
public void increment(){x++;}
public int get_x(){return x;}
}
public class View extends Frame{
private Button b;
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");
b= new Button("Actiune");
add("North",b);
m=new Model();
c=new Controller(this);
b.addActionListener(c);
tf=new TextField(10);
add("Center",tf);
setSize(100,250);
setVisible(true);
}
}
class Controller implements ActionListener{
private View vw;
public Controller(View v){
vw=v;
}
public void actionPerformed(ActionEvent e){
vw.m.increment();
vw.tf.setText(String.valueOf(vw.m.get_x()));
}
}

Care afirmatie este adevarata, dacã se face de douã ori click pe butonul stang mouse
asupra butonului Actiune:
a. În câmpul de text f.tf este afiºatã valoarea 1
b. Programul nu afiºeazã nimic
c. În câmpul de text f.tf este afiºatã valoarea 2
d. Valoarea atributului f.m.x rãmâne mereu la valoarea 0

22. Fie urmatorul program Java:


import java.util.Observer;
import java.util.Observable;
import java.awt.*;
import java.awt.event.*;
public class Observator extends Frame
implements WindowListener, Observer{
static protected ModelObservabil m=new ModelObservabil();
protected Button exitB, actB;
protected TextField field;
private ButtonController buttonC;
public static void main(String args[]){
Frame fn=new Observator(0);// nu observa pe m
Frame f01=new Observator(1);// observa pe m
Frame f02=new Observator(1);// observa pe m
}
public Observator(int i){
if (i==1)m.addObserver(this);
Panel p= new Panel();
buttonC=new ButtonController(this);
exitB= new Button("Exit");
exitB.addActionListener(buttonC);
actB= new Button("modifica");
actB.addActionListener(buttonC);
field= new TextField("MyTextField");
field.setEditable(true);
p.add(exitB);
p.add(actB);
add(field);
add("North",p);
addWindowListener(this);
setSize(160,110);
setVisible(true);
}
public void windowClosed(WindowEvent e){}
public void windowOpened(WindowEvent e){}
public void windowIconified(WindowEvent e){}
public void windowDeiconified(WindowEvent e){}
public void windowActivated(WindowEvent e){}
public void windowDeactivated(WindowEvent e){}
public void windowClosing(WindowEvent e){dispose();
//System.exit(0);
}
public void update(Observable observ, Object ob){
field.setText(m.afis);
}
}
class ButtonController implements ActionListener{
Observator view;
public ButtonController(Observator win){
view=win;
}
public void actionPerformed (ActionEvent e){
Object source=e.getSource();
if (source == view.exitB) System.exit(0);
else {
view.m.modifica();
};
}
}
class ModelObservabil extends Observable{
protected int i=0;
protected String afis=" ";
public ModelObservabil(){
setChanged();
notifyObservers();
}
public void modifica(){
i++;
afis= " "+ i;
setChanged();
notifyObservers();
}
}

Care afirmatie este adevarata, dacã se face de click pe butonul stang mouse asupra
butonului „modifica” din fereastra fn:
a. Doar in câmpul de text field al ferestrei fo2 este afiºatã valoarea actualizata a
atributului Observator.m.i
b. În câmpul de text field al tuturor ferestrelor este afiºatã valoarea actualizata a
atributului Observator.m.i
c. Doar in câmpul de text field al ferestrei fo1 este afiºatã valoarea actualizata a
atributului Observator.m.i
d. Doar in câmpul de text field al ferestrelor fo1 si fo2 este afiºatã valoarea
actualizata a atributului Observator.m.i

23. Fie urmatorul program Java:


import java.util.Observer;
import java.util.Observable;
import java.awt.*;
import java.awt.event.*;
public class Observator extends Frame
implements WindowListener, Observer{
static protected ModelObservabil m=new ModelObservabil();
protected Button exitB, actB;
protected TextField field;
private ButtonController buttonC;
public static void main(String args[]){
Frame fn=new Observator(0);// nu observa pe m
Frame f01=new Observator(1);// observa pe m
Frame f02=new Observator(1);// observa pe m
}
public Observator(int i){
if (i==1)m.addObserver(this);
Panel p= new Panel();
buttonC=new ButtonController(this);
exitB= new Button("Exit");
exitB.addActionListener(buttonC);
actB= new Button("modifica");
actB.addActionListener(buttonC);
field= new TextField("MyTextField");
field.setEditable(true);
p.add(exitB);
p.add(actB);
add(field);
add("North",p);
addWindowListener(this);
setSize(160,110);
setVisible(true);
}
public void windowClosed(WindowEvent e){}
public void windowOpened(WindowEvent e){}
public void windowIconified(WindowEvent e){}
public void windowDeiconified(WindowEvent e){}
public void windowActivated(WindowEvent e){}
public void windowDeactivated(WindowEvent e){}
public void windowClosing(WindowEvent e){dispose();
//System.exit(0);
}
public void update(Observable observ, Object ob){
field.setText(m.afis);
}
}
class ButtonController implements ActionListener{
Observator view;
public ButtonController(Observator win){
view=win;
}
public void actionPerformed (ActionEvent e){
Object source=e.getSource();
if (source == view.exitB) System.exit(0);
else {
view.m.modifica();
};
}
}
class ModelObservabil extends Observable{
protected int i=0;
protected String afis=" ";
public ModelObservabil(){
setChanged();
notifyObservers();
}
public void modifica(){
i++;
afis= " "+ i;
setChanged();
notifyObservers();
}
}

Care afirmatie este adevarata, dacã se face de click pe butonul stang mouse asupra
butonului „modifica” din fereastra fo1 sau fo2:
a. Doar in câmpul de text field al ferestrelor fo1 si fo2 este afiºatã valoarea
actualizata a atributului Observator.m.i
b. În câmpul de text field al tuturor ferestrelor este afiºatã valoarea actualizata a
atributului Observator.m.i
c. Doar in câmpul de text field al ferestrei fo1 este afiºatã valoarea actualizata a
atributului Observator.m.i
d. Doar in câmpul de text field al ferestrei fo2 este afiºatã valoarea actualizata a
atributului Observator.m.i
C++
1. Fie urmatorul program:
// Public redeclarat private
// #include <iostream.h>
class A{
public:
void m(){cout<<"A:m()"<<endl;};
virtual void v(){cout<<"A:v()"<<endl;};
};
class B: public A{
private:
void m(){cout<<"B:m()"<<endl;};
virtual void v(){cout<<"B:v()"<<endl;};
};
void main(){
A a,*p;
B b;
b.m();
b.v();
// obiect de tip A
p=&a; p->m(); p->v();
// obiect de tip B
p=&b; p->m(); p->v();
}
Care expresie este incorecta:
a. b.v();
b. p=&a;
c. p->m();
d. p->v();

2. Fie urmatorul program:


// Public redeclarat private
#include <iostream.h>
class A{
public:
void m(){cout<<"A:m()"<<endl;};
virtual void v(){cout<<"A:v()"<<endl;};
};
class B: public A{
private:
void m(){cout<<"B:m()"<<endl;};
virtual void v(){cout<<"B:v()"<<endl;};
};
void main(){
A a,*p;
B b;
b.m();
b.v();
// obiect de tip A
p=&a; p->m(); p->v();
// obiect de tip B
p=&b; p->m(); p->v();
}
Care expresie este corecta:
a. b.m();
b. b.v();
c. p->f();
d. p->m();

3. Fie urmatorul program:


// Public redeclarat private
#include <iostream.h>
class A{
public:
void m(){cout<<"A:m()"<<endl;};
virtual void v(){cout<<"A:v()"<<endl;};
};
class B: public A{
private:
void m(){cout<<"B:m()"<<endl;};
virtual void v(){cout<<"B:v()"<<endl;};
};
void main(){
A a,*p;
B b;
b.m();
b.v();
// obiect de tip A
p=&a; p->m(); p->v();
// obiect de tip B
p=&b; p->m(); p->v();
}
Care expresie este corecta:
a. b.m();
b. b.v();
c. p->f();
d. p->v();

4. Fie urmatorul program:


// Public redeclarat private
// Metoda PRIVATE DEVINE ACCESIBILA PRIN MECANISMUL DE LEGARE DINAMICA
#include <iostream.h>
class A{
public:
void m(){cout<<"A:m()"<<endl;};
virtual void v(){cout<<"A:v()"<<endl;};
};
class B: public A{
private:
void m(){cout<<"B:m()"<<endl;};
virtual void v(){cout<<"B:v()"<<endl;};
};
void main(){
A a,*p;
B b;
b.m();
b.v();
// obiect de tip A
p=&a; p->m(); p->v();
// obiect de tip B
p=&b; p->m(); p->v();
}
Care expresie este incorecta:
a. b.m();
b. p=&a;
c. p->m();
d. p->v();

5. Fie urmatorul program:


#include <iostream.h>
class Cerc{
public:
Cerc(float r):raza(r){}
float getRaza(){return raza;}
Cerc operator++(){raza++;return *this;}// return by value
Cerc& operator--(){raza--;return *this;}// return by reference

private:
float raza;
};

void main(){
Cerc c(1.0);
cout<<(++(++c)).getRaza()<<” ”;
cout<<c.getRaza()<<” ”;
cout<<(--(--c)).getRaza()<<” ”;
cout<<c.getRaza()<<” ”;

}
Programul afiseaza:
a. 3300
b. 3201
c. 3200
d. 3211

6. Fie urmatorul program, in care se utilizeaza clase abstracte:


// abselem.h
#ifndef ABSTRACTELEM_H
#define ABSTRACTELEM_Hclass AbstractElem
{
public: virtual void display()=0; virtual void process()=0;
};
#endif
//LIST.h
#ifndef LIST_H
#define LIST_H
#include "abselem.h"
class LIST
{
public: LIST(int nrmax=0);
void put(AbstractElem *);
AbstractElem* get();
void remove();
private: int nrmax; int nrelem; int first; int free;
AbstractElem* *support;
};
#endif
//LIST.cpp
#include "LIST.h"
LIST::LIST(int nrmax):nrmax(nrmax)
{
first=free=nrelem=0; support = new AbstractElem* [nrmax-1];
}
void LIST::put(AbstractElem * pe)
{
support[free]=pe; free= ++free % nrmax; nrelem++;
}
AbstractElem* LIST::get()
{
return support[first];
}
void LIST::remove()
{
first= ++first % nrmax; --nrelem;
}
Care afirmatie este adevarata:
a. 3200
b. 3301
c. 3311
d. 3212
7. Fie programul:
#include <iostream.h>
class Cerc{
public:
Cerc(float r):raza(r){}
float getRaza(){return raza;}
Cerc operator++(){raza++;return *this;}// return by value
Cerc operator--(){raza--;return *this;}// return by value

private:
float raza;
};

void main(){
Cerc c(1.0);
cout<<(++(++c)).getRaza()<<” ”;
cout<<c.getRaza()<<” ”;
cout<<(--(--c)).getRaza()<<” ”;
cout<<c.getRaza()<<” ”;

}
Programul afiseaza :
a. 3201
b. 3200
c. 3301
d. 3211

8. Fie programul:
// 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();
}
Programul afiseaza:
a. Matematica Informatica 1
b. Informatica Informatica 1
c. Informatica Informatica 2
d. Matematica Informatica 2

9. Se considera clasa:
#include "iostream.h"
template <class T>
class C{
public:
C(int nrmax=0);
void put(T);
T get();
void remove();

private:
int nrmax;
int nrelem;
int first;
int free;
T* support;
};

template <class T>C<T>::C(int nrmax):nrmax(nrmax){


first=free=nrelem=0;
support = new T [nrmax-1];
}
template <class T> void C<T>::put(T e){
support[free]=e; free= ++free % nrmax; nrelem++;
}
template <class T> T C<T>::get(){
return support[first];
}
template <class T> void C<T>::remove(){
first= ++first % nrmax;
--nrelem;
}
a. Clasa C defineste o structura de tip coada (FIFO)
b. Clasa C defineste o structura de tip stiva (LIFO)
c. Clasa C este un vector
d. Clasa C este abstracta

10. Fie urmatorul program, in care se utilizeaza clase abstracte:


// abselem.h
#ifndef ABSTRACTELEM_H
#define ABSTRACTELEM_H
class AbstractElem{
public:
virtual void display()=0;
virtual void process()=0;
};
#endif

//LIST.h
#ifndef LIST_H
#define LIST_H
#include "abselem.h"

class LIST{
public:
LIST(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 "LIST.h"
LIST x(3);
void main(){
x.put(new Person("Tudor"));
x.put(new Person("Andrei"));
x.put(new Car("B-39-TDR"));
x.get()->process(); x.remove();
x.get()->process(); x.remove();
x.get()->process(); x.remove();
}

//LIST.cpp
#include "LIST.h"
LIST::LIST(int nrmax):nrmax(nrmax){
first=free=nrelem=0;
support = new AbstractElem* [nrmax-1];
}
void LIST::put(AbstractElem * pe){
support[free]=pe; free= ++free % nrmax; nrelem++;
}
AbstractElem* LIST::get(){
return support[first];
}
void LIST::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();
}

Programul afiseaza datele in ordinea:


a. Tudor Andrei B-39-TDR
b. B-39-TDR Andrei Tudor
c. Andrei B-39-TDR Tudor
d. B-39-TDR Tudor Andrei

11. Fie programul:


// destructor static,
#include <iostream.h>
class B{
public:
~B(){cout<<"~B()"<<endl;}
};
class D: public B{
public:
~D(){cout<<"~D()"<<endl;}
};
void main(){
clrscr();
B *pb;
D *pd;
pd= new D();
pb=new D();
delete pb;
delete pd;
}
Programul afiseaza :
a. ~ B() ~B() ~D()
b. ~ B() ~D()
c. ~ B()~D()~B() ~D()
d. ~ B() ~D() ~B()

12. Fie urmatorul program:


// Constructor cu semantica prin referinta
// Operatorul = este cel implicit

#include <iostream.h>
class C{
public:
C(int n=0, int v[]);
void set(int i, int val){pi[i]=val;}

friend ostream& operator<<(ostream &o, const C&);

private:
int dim;
int *pi;
};

C::C(int n, int v[]) {


dim=n;
pi= v;

ostream& operator<<(ostream &o, const C &m){


for(int j=0; j<m.dim; j++)o<< m.pi[j]<<" ";
return o;
}

void main(){
int a[]={1,2,3}, b[]={10,20};
C x(3,a),y(2, b);
x=y;
y.set(0,-1000);
cout<<x<<endl;
}
Programul afiseaza:
a. -100 20
b. -1000 20
c. 100 2 3
d. 1 20 30

13. Fie programul:


#include <iostream.h>
class B{
public:
void st(){cout<< "static method st() of B"<<endl;}
virtual void v(){cout<< "virtual method v() of B"<<endl;}
};
class D: public B{
public:
void st(){cout<< "static method st() of D"<<endl;}
virtual void v(){cout<< " virtual method v() of D"<<endl;}
};
int main(){
B *pb;
D d;
// pointing to a subclass
pb=&d;
((D*)pb)->v();
((D*)pb)->st();
return 0;
}
Programul afiseaza:
a. virtual method v() of D
static method st() of D
b. virtual method v() of B
static method st() of D
c. virtual method v() of D
static method st() of B
d. virtual method v() of B
static method st() of B

14. Fie programul:


#include <iostream.h>
class B{
public:
void st(){cout<< "static method st() of B"<<endl;}
virtual void v(){cout<< "virtual method v() of B"<<endl;}
};
class D: public B{
public:
void st(){cout<< "static method st() of D"<<endl;}
virtual void v(){cout<< " virtual method v() of D"<<endl;}
};

int main(){
B b, *pb;
D d, *pd;
pb=&d;
pb->st();
pb->v();
return 0;
}
Programul afiseaza:
a. static method s() of D
virtual method v() of D
b. static method s() of B
virtual method v() of B
c. static method s() of D
virtual method v() of B
d. static method s() of B
virtual method v() of D

15. Fie programul


#include <string.h>#include <iostream.h>class Person{public: Person(char *p){nr=0; name=new
char[strlen(p)+1]; strcpy(name,p); nr++; cout<<nr<<endl; } ~Person(){delete[] name;}private: char
*name; long nr;};void f(){Person *p = new Person("Balanescu"); delete p;}void main(){ for (int i=0;
i<5; i++)f();}
Programul afiseaza: 11111

16. Fie programul :


// constructor de copiere in clasa de baza; dar absent in clasa derivata
// compilatorul creeaza un constructor de copiere implicit
// care apeleaza constr de copiere al clasei de baza pentru copierea atributelor din clasa de baza
// si copiaza membru cu membru atributele din D
#include <iostream.h>
class B{
public:
B(){cout<<"B()"<<endl;}
B(B &b){cout<<"B(B &b)"<<endl;}
};
class D: public B{
public:
D(){cout<<"D()"<<endl;}
};
void main(){
B b; // apel B()
B b1(b); // apel B(B & ); nu se mai utilizeaza B()!
D d; // apel B();D()
D d1(d);
B bd(d); // conversie implicita la clasa de baza;
getch();
}
Programul afiseaza :
a. B() B() B(B&b) B() D() B(B &b) B(B &b)
b. B() B() B(B&b) B() D() B(B &b) D() B(B &b)
c. B() B(B&b) B() D() B(B &b) B(B &b)
d. B() B(B&b) D() B(B &b) D() B(B &b)

17. Fie programul:


//destructor explicit
#include <string.h>
#include <iostream.h>
class Person{
public:
Person(char *p){name=new char[strlen(p)+1]; strcpy(name,p);}
~Person(){delete[] name;}
private:
char *name;
};
void f(){Person *p =
new Person("Balanescu");
delete p;
// fara aceasta instructiune, obiectele se acumuleaza
// in heap si blocheaza executarea, spre deosebire de Java
}
void main(){
while(1)f();
}
a. La iesirea din functia f(), spatiul alocat pentru sirul de caractere “Balanescu” nu este eliberat
si memoria va fi epuizata
b. La iesirea din functia f(), spatiul alocat pentru sirul de caractere “Balanescu” este eliberat
c. Programul se termina datorita epuizarii memoriei
d. Programul se termina dupa primul apel al functiei f()

18. Fie urmatorul program:


#include <iostream.h>
class A{
public:

void s(){cout<<"void A::s()"<<endl;}


void s(int i){i++;cout<<"void A::s(int)"<<endl; }
virtual void v(){cout<<"virtual void A::v()"<<endl;}
virtual void v(int i){i++;cout<<"virtual void A::v(int)"<<endl;}
};
Care afirmatie este corecta:
a. Definitia virtual void v()supraincarca definitia virtual void v(int i)
b. Definitia virtual void v(int i) este incorecta deoarece exista o definitie pentru metoda v.
c. void v() este metoda ce va fi legata static.
d. in expresia p->v(); metoda v este legata static

19. Fie urmatorul program:


// Constructor cu semantica prin referinta// Operatorul = este cel implicit
#include <iostream.h>
class C{
public:
C(int n, int v[]);
friend ostream& operator<<(ostream &o, const C&);
private: int dim; int *pi;
};
C::C(int n, int v[]) {
dim=n;
pi= v;
}
ostream& operator<<(ostream &o, const C &m){
for(int j=0; j<m.dim; j++)o<< m.pi[j]<<" ";
return o;
}
void main(){
int a[]={1,2,3}, b[]={10,20};
C x(3,a),y(2, b);
a[0]=-100;
cout<<(x=y)<<endl;
}
Programul afiseaza:
a. instructiunea int=100; este incorecta
b. . instructiunea int=10; este incorecta
c. . instructiunea int=1; este incorecta
d. . instructiunea int=2; este incorecta
e. . 10 20

20. Fie programul :


#include <iostream.h>
class Cerc{
public:
Cerc(float r):raza(r){}
float getRaza(){return raza;}
void operator++(){raza++;}
private:
float raza;
};
class Cilindru: public Cerc{
public:
Cilindru(float raza, float inaltime):Cerc(raza), inaltime(inaltime){};
void operator++(){inaltime++;}
float getInaltime(){return inaltime;}
private:
float inaltime;
};
void main(){
Cerc *pc;
Cilindru c(1,5);
pc=&c;
++ *pc;
cout<<pc->getRaza()<<" "<<c.getInaltime()<<endl;
getch();

}
Programul afiseaza :
a. 1 6
b. 2 5
c. 2 6
d. 1 5

21. Fie programul:


#include <string.h>
#include <iostream.h>
class Person{
public:
Person(char *p){name=new char[strlen(p)+1]; strcpy(name,p);
nr++; cout<<nr<<endl;
}

private:
char *name;
static long nr;
};
long Person::nr=0;
void f(){Person *p =
new Person("Balanescu");
delete p;
}
void main(){
while(1)f();
}
Care afirmatie este adevarata:
a. Programul afiseaza un sir finit de numere 1 2 3 4...etc. pana memoria este epuizata
b. Programul afiseaza secventa infinita 1 2 3 4...etc. deoarece memoria nu este epuizata
c. Programul nu afiseaza nimic
d. Programul afiseaza 1 apoi se opreste

22. Fie programul


//static atribut
#include <conio.h>
#include <string.h>
#include <iostream.h>
class Person{
public:
Person(char *p){name=new char[strlen(p)+1]; strcpy(name,p);
nr++; cout<<nr<<endl;
}
~Person(){nr--; delete[] name;}
private:
char *name;
static long nr;
};
long Person::nr=0;
void f(){Person *p =
new Person("Balanescu");
}
void main(){
for (int i=0; i<5; i++)f();
getch();
}
Programul afiseaza:
a. 1 2 3 4 5
b. 1 1 1 1 1
c. 0 0 0 0 0
d. 0 1 2 3 4

23. Fie programul:


class Persoana{
public:
Persoana(char * n){nume=n;}
void afisare(){cout<<nume<<endl;}
char *nume;

};
Constructorul Persoana(char *) poate fi utilizat pentru:
a. Conversia obiectelor Persoana in siruri de caractere
b. Conversia sirurilor de caractere in obiecte Persoana
c. Construirea de siruri de caractere
d. Conversia obiectelor Complex in obiecte Persoana

24 Fie programul :
// destructor virtual,
#include <iostream.h>
class B{
public:
virtual ~B(){cout<<"~B()"<<endl;}
};
class D: public B{
public:
virtual ~D(){cout<<"~D()"<<endl;}
};
void main(){
B *pb;
D *pd;
pd= new D();
pb=new D();
delete pb;
delete pd;
}
Programul afiseaza:
a. ~ B()~D()~B() ~D()
b. ~ B() ~B() ~D()
c. ~ B() ~D()
d. ~ D()~B()~D() ~B()

25. Fie programul:


#include
class A{
public:
// supraincaracre void s()
void s(){cout<<"void A::s()"<<ENDL;}
void s(int i){i++;cout<<"void A::s(int)"<
// supraincarcare void v()
virtual void v(){cout<<"virtual void A::v()"<<ENDL;}
virtual void v(int i){i++;cout<<"virtual void A::v(int)"<<ENDL;}

};
class B:public A{
public:
// 1. supraincarcare metoda statica
int s(){cout<<"int B::s()"<
// 2. specializare metoda statica
void s(int i){i++;cout<<"void B::s(int)"<

// 3. specializare metoda virtuala


virtual void v(int i){i++;cout<<"virtual void B::v(int)"<<ENDL;}
};

void main(){
A *pa;
B b;
pa=&b; pa->s(); pa->v(1);
}
Prin executarea sa, programul afiseaza:
a) void B::v()
void A::v(int)
b) void A::v()
void B::v(int)
c) void A::s()
void B::v(int)
d) void A::v()
void A::v(int)

26. Fie următorul program C++:


#include <iostream.h>
class A{
public:
void m(){cout<<"A:m()"<<endl;};
virtual void v(){cout<<"A:v()"<<endl;};
};
class B: public A{
private:
void m(){cout<<"B:m()"<<endl;};
virtual void v(){cout<<"B:v()"<<endl;};
};
void main(){
A a,*p;
B b;
a.m();
p=&b;
p->v();
}

Care din afirmatiile următoare sunt adevărate:


a. Expresia p->v()este incorectă deoarece metoda v este inaccesibilă
b. Programul afiseaza mesajul:
A:m()
B:(v)
c. Programul afisează mesajul: A:v()
d. Expresia a.m() este incorectă deoarece metoda m este inaccesibilă

27. Fie următorul program C++:


#include <iostream.h>
class A{
public:
void s(){cout<<"void A::s()"<<endl;}
void s(int i){i++;cout<<"void A::s(int i)"<<endl; }
virtual void v(){cout<<"virtual void A::v()"<<endl;}
virtual void v(int i){
i++;cout<<"virtual void A::v()"<<endl;
}
};
class B:public A{
public:
// 1.
int s(){
cout<<"int A::s()"<<endl;
return 1;
}
// 2.
void s(int i){
i++;cout<<"void A::s(int i)"<<endl;
}
// 3.
virtual void v(int i){
i++;cout<<"virtual void A::v()"<<endl;
}
// 4.
virtual int v(){
cout<<"int A::v()"<<endl; return 1;
}
};

Care din afirmatiile următoare sunt adevărate:


a. //1. este incorectă
b. //2. este incorectă
c. //3. este incorectă
d. //4. este incorectă

28. Fie următorul program C++, în care operatorul de insertie << este supraîncărcat.
Operatorul de atribuire = este cel predefinit, cu semantica prin referinta.
#include <iostream.h>
class C{
public:
C(int n, int v[]);
void set(int i, int val){pi[i]=val;}
friend ostream& operator<<(ostream &o, const C&);
private:
int dim;
int *pi;
};
C::C(int n, int v[]) {
dim=n;
pi= new int[dim];
for(int j=0; j<dim; j++){pi[j]=v[j];}
}
ostream& operator<<(ostream &o, const C &m){
for(int j=0; j<m.dim; j++)o<< m.pi[j]<<" ";
return o;
}
void main(){
int a[]={1,2,3}, b[]={10,20};
C x(3,a),y(2, b);
cout<<(x=y)<<endl;
y.set(0,1000);
cout<<x<<endl;
}
Care din afirmatiile următoare sunt adevărate:
a. Programul afisează:
10 20
10 20
b. Programul afisează:
10 20
1000 20
c. Programul afisează:
1000 20
10 20
d. Programul afisează:
1000 20
1000 20

29. Fie următorul program C++, în care operatorul de insertie << si operatorul de atribuire =
sunt
supraîncărcati.
Prin supraîncărcare, operatorul de atribuire are semantica prin valoare (el înlocuieste pe cel
predefinit, care are semantica prin referintă). Rersursele obiectului destinatie d din expresia d=s
sunt eliberate chiar si în cazul de autoatribure d=d.
#include <iostream.h>
class C{
public:
C(int n, int v[]);
void set(int i, int val){pi[i]=val;}
C& operator=(C&);
friend ostream& operator<<(ostream &o, const C&);
private:
int dim;
int *pi;
};
C::C(int n, int v[]) {
dim=n;
pi= new int[dim];
for(int j=0; j<dim; j++){pi[j]=v[j];}
}
// supraincarcare cu semantica prin valoare
C& C::operator=(C& x){
// incepe prin dezalocare resursa *pi
// fara verificarea cazului de autoatribuire d=d
delete[] pi;
dim=x.dim;
pi=new int[dim];
for(int j=0; j<dim; j++){pi[j]=x.pi[j];}
return *this;
}
ostream& operator<<(ostream &o, const C &m){
for(int j=0; j<m.dim; j++)o<< m.pi[j]<<" ";
return o;
}
void main(){
int a[]={1,2,3}, b[]={10,20};
C x(3,a),y(2, b);
cout<<(x=y)<<endl;
y.set(0,1000);
cout<<x<<endl;
cout<<(x=x)<<endl;
}

În afirmatiile de mai jos, xx si yy sunt valori arbitrare, rezultate prin referirea prin pointerul pi la o
zona de memorie *pi neinitializată
Care din afirmatiile următoare sunt adevărate:
a. Programul afisează:
10 20
10 20
xx yy
b. a) Programul afisează:
10 20
1000 20
xx yy
c. Programul afisează:
1000 20
10 20
xx yy
d. Programul afisează:
10 20
10 20
10 20

30. Fie următorul program C++,


în care operatorul de insertie << si operatorul de atribuire = sunt supraîncărcati. Prin
supraîncărcare, operatorul de atribuire are semantica prin valoare (el înlocuieste pe cel
predefinit, care are semantica prin referintă). Rersursele obiectului destinatie d din expresia d=s
sunt eliberate numai dacă d?s.
#include <iostream.h>
class C{
public:
C(int n, int v[]);
void set(int i, int val){pi[i]=val;}
C& operator=(C&);
friend ostream& operator<<(ostream &o, const C&);
private:
int dim;
int *pi;
};
C::C(int n, int v[]) {
dim=n;
pi= new int[dim];
for(int j=0; j<dim; j++){pi[j]=v[j];}
}
C& C::operator=(C& x){
// incepe prin dezalocare resursa *pi
// numai daca destinatia difera de sursa
if(this!=&x){
dim=x.dim;
delete[] pi;
pi=new int[dim];
for(int j=0; j<dim; j++){pi[j]=x.pi[j];}
}
return *this;
}
ostream& operator<<(ostream &o, const C &m){
for(int j=0; j<m.dim; j++)o<< m.pi[j]<<" ";
return o;
}
void main(){
int a[]={1,2,3}, b[]={10,20};
C x(3,a),y(2, b);
cout<<(x=y)<<endl;
y.set(0,1000);
cout<<x<<endl;
cout<<(x=x)<<endl;
}

În afirmatiile de mai jos, xx si yy sunt valori arbitrare, rezultate prin referirea prin pointerul pi la o
zona de memorie *pi neinitializată
Care din afirmatiile următoare sunt adevărate:
a. Programul afisează:
10 20
10 20
xx yy
b. Programul afisează:
10 20
1000 20
xx yy
c. Programul afisează:
1000 20
10 20
xx yy
d. Programul afisează:
10 20
10 20
10 20

31. Fie următorul program C++, unde functia abs calculează valoarea absolută a unui număr
real:
#include <iostream.h>
void abs(float &x){if (x<0)x=-x;}
void main(){
float a=-1;
abs(a);
cout<<"a="<<a<<endl;
int i=-1;
abs(i); //temporary used for parameter x
cout<<"i="<<i<<endl; // i=-1
}

La compilare a fost emis următorul mesaj de avertizare:


Warning: temporary used for parameter ‘x’ in call to ‘abs(float &)
Care din afirmatiile următoare sunt adevărate:
a. Programul afisează:
a =1
i = -1
b. Programul afisează:
a =1
i=1
c. Programul afisează:
a = -1
i = -1
d. Programul afisează:
a = -1
i=1

32. Fie următorul program C++:


#include <iostream.h>
class Punct{
public:
Punct(int=0, int=0); //constructor
protected:
int x,y;
friend ostream& operator<<(ostream&, const Punct&);
};
class Cerc: public Punct{
public:
Cerc(double r=0.0, int x=0, int y=0);// constructor
protected:
float raza;
friend ostream& operator<<(ostream&, const Cerc&);
};
//implementare Punct
Punct::Punct(int a, int b):x(a),y(b){} // constructor
ostream& operator<<(ostream& output, const Punct& p){
output<<"Punct"<<'['<<p.x<<", "<<p.y<< ']';
return output;
}
//implementare Cerc
Cerc::Cerc(double r, int a, int b):Punct(a,b), raza(r){}
ostream& operator<<(ostream& output, const Cerc& c){
output <<"Centru= "<< (Punct)(c)
<<"; Raza= "<<c.raza;
return output;
};
void main(){
Punct *punctPtr=0, p(30,50);
Cerc *cercPtr=0, c(2.7,120,89);
cout<<p<<endl;
cout<<c<<endl;
// Cerc tratat ca Punct (prin pointer la clasa de baza):
punctPtr=&c;
cout<< *punctPtr << endl;
/* Cerc tratat ca Cerc (prin pointer la clasa de baza, dar
cu conversie explicita de la Punct la clasa derivata Cerc
*/
cercPtr= (Cerc *)(punctPtr);
cout<< *cercPtr<<endl;
/*Punct tratat ca Cerc: programatorul isi asuma responsabilitatea
unor erori: anumite atribute sunt nedefinite
*/
punctPtr= &p; // punctPtr refera un Punct
//Urmeaza conversie asumata de programator,
//de la clasa de baza la clasa derivata
cercPtr=(Cerc *)(punctPtr);
// cercPtr refera p ca pe un cerc
//dar acest asa-zis cerc are raza nedefinita
cout<< *cercPtr <<endl;
}

Prin xx este desemnată o valoare nedefinită.


Care din afirmatiile următoare sunt adevărate:
a. Programul afisează:
Punct[30,50]
Centru=Punct[30,50]; Raza=2.7
Punct[120,89]
Centru=Punct[120,89]; Raza=2.7
Centru=Punct[30,50]; Raza=xx
b. Programul afisează:
Punct[30,50]
Centru=Punct[120,89]; Raza=2.7
Punct[120,89]
Centru=Punct[120,89];
Centru=Punct[30,50]; Raza=xx
c. Programul afisează:
Punct[30,50]
Centru=Punct[30,50];
Punct[120,89]
Centru=Punct[120,89]; Raza=2.7
Centru=Punct[30,50]; Raza=xx
d. Programul afisează:
Punct[30,50]
Centru=Punct[120,89]; Raza=2.7
Punct[120,89]
Centru=Punct[120,89]; Raza=2.7
Centru=Punct[30,50]; Raza=xx

33. Fie următorul program C++:


// constructor de copiere in clasa de baza;
// dar absent in clasa derivata
#include <iostream.h>
class B{
public:
B(){cout<<"B();";}
B(B &b){cout<<"B(B &b);";}
};
class D: public B{
public:
D(){cout<<"D();";}
};
void main(){
B b;
B b1(b);
D d;
D d1(d);
B bd(d);
}
Care din afirmatiile următoare sunt adevărate:
a. Programul afisează:
B() B(B &b) B() D() B(B &b) B(B &b)
b. Programul afisează:
B() B() B() D() B(B &b) B(B &b)
c. Programul afisează:
B() B() B(B &b) D() B(B &b) B(B &b)
d. programul afisează:
B() B(B &b) B() D() B() B()

34. Fie următorul program C++:


// destructor static
#include <iostream.h>
#include <conio.h>
class B{
public:
B(){cout<<"B()"<<endl;}
~B(){cout<<"~B()"<<endl;}
};
class D: public B{
public:
D(){cout<<"D()"<<endl;}
~D(){cout<<"~D()"<<endl;}
};
void main(){
clrscr();
B *b=new B(); // apel B()
delete b;
b=new D(); // apel B();D()
delete b;
}
Care din afirmatiile următoare sunt adevărate:
a. Programul afisează:
B() ~B() B() D() ~D()
b. Programul afisează:
B() ~B() B() D() ~B()
c. Programul afisează:
B() ~B() B() ~B()
d. Programul afisează:
B() ~B() D() ~B()

35. Fie următorul program C++:


// destructor virtual
#include <iostream.h>
class B{
public:
B(){cout<<"B()"<<endl;}
virtual ~B(){cout<<"~B()"<<endl;}
};
class D: public B{
public:
D(){cout<<"D()"<<endl;}
virtual ~D(){cout<<"~D()"<<endl;}
};
void main(){
clrscr();
B *b=new B(); // apel B()
delete b;
b=new D(); // apel B();D();
// destructorii, in ordine inversa
delete b;
}
Care din afirmatiile următoare sunt adevărate:
a. Programul afisează:
B() ~B() B() D() ~D() ~B()
b. Programul afisează:
B() ~B() B() D() ~B() ~B()
c. Programul afisează:
B() ~B() B() D() ~B() ~D()
d. Programul afisează:
B() ~B() B() D() ~B()

36. Fie următorul program C++:


#include <string.h>
#include <iostream.h>
class Person{
public:
Person(char *p){
name=new char[strlen(p)+1];
strcpy(name,p);
}
~Person(){delete[] name;}
private:
char *name;
};
void f(){
// obiect nou, alocare dinamica in memoria heap
Person *p =new Person("Balanescu");
delete p;
}
void main(){
while(1)f();
}
Care din afirmatiile următoare sunt adevărate:
a. Programul se termină, deoarece instructiunea delete p eliberează memoria
alocată pentru obiectul referit de p
b. Programul se termină, deoarece la iesirea din functia f se eliberează memoria
alocată pe stivă pentru obiectul referit de p
c. Programul nu se termină, deoarece conditia de continuare din instructiunea while
este mereu îndeplinită
d.Programul se blochează la epuizarea memoriei heap

37. Fie următorul program C++:


#include <iostream.h>
class Persoana{
public:
Persoana(char * n){nume=n;}
void afisare(){cout<<nume<<endl;}
char *nume;
};
Persoana q="Balanescu";
void fvalue(Persoana p){p.afisare();}
void faddress(Persoana *p){p->afisare();}
void freference(Persoana &p){p.afisare();}
void main(){
fvalue(q);
faddress(&q);
freference(q);
fvalue("Tudor");
freference("Tudor");// Warning: temporary used for p
}
Care din afirmatiile următoare sunt adevărate:
a. Expresia faddress(&q); este eronată;
b. Instructiunea de declarare Persoana q="Balanescu"; este eronată;
c. Expresia p->afisare() este eronată;
d. Programul afisează:
Balanescu
Balanescu
Balanescu
Tudor
Tudor

38. Fie următorul program C++:


#include <iostream.h>
class B{
public:
B(int i):i(i){}
protected:
int i;
};
class D1: public B{
public:
D1(int i):B(i){}
void inc(){i++;}
};
class D2: public B{
public:
D2(int i):B(i){}
void afisare(){cout<<”i=”<<i<<endl;}
};
class D: public D1, public D2{
public:
D(int i):D1(i),D2(i){}
};
void main(){
D d(0);
d.inc();
d.afisare();
}
Care din afirmatiile următoare sunt adevărate:
a. Programul afisează i=-1
b. Programul afisează i=2
c. Programul afisează i=0
d. Programul afisează i=1

39. Fie următorul program C++:


#include <iostream.h>
class B{
public:
B(int i=-1):valB(i){}
B& operator=(const B &b){
valB=b.valB;
cout<<"B::op= ";
return *this;
}
private:
int valB;
};
class D:public B{
public:
D(int i, int j):B(i),valD(j){}
D& operator=(const D &d){
valD=d.valD;
cout<<"D::op= ";
return *this;
}
private:
int valD;
};
void main(){
B b(0), b1(1);
B *pB;
D d(0,0), d1(1,1);
b=b1;
d=d1;
b=d;
pB=&d;
*pB=d;
pB->operator=(d);
}
Care din afirmatiile următoare sunt adevărate:
a. Programul afisează :
B::op= D::op= D::op= B::op= D::op=
b. Programul afisează:
B::op= D::op= B::op= B::op= B::op=
c. Programul afisează:
B::op= D::op= B::op= D::op= D::op=
d. Programul afisează:
B::op= D::op= D::op= D::op= B::op=

40. Fie următorul program C++:


class A{
int x;
public:
A(int x):x(x){};
};
class B{
protected:
int x;
public:
B(int x):x(x){};
};
class D:public B{
A a;
B b; // 1
B b(1); // 2
public:
void m(){
x=1; // 3
//b.x=1; //x nu este accesibil obiectelor
}
};
void main(){
B b(1); // 4
}
Care din următoarele instructiuni sunt eronate:
a. B b; // 1
b. B b(1) ; // 2 (din clasa D)
c. x=1; // 3
d. B b(1); // 4 (din functia main)

41. Fie urmatorul program


class A{
int x;
public:
A(int x):x(x){};
};
class B{
protected:
int x;
public:
B(int x):x(x){};
};
class D:public B{
A a;
B b; // 1
public:
void m(){
x=1; // 2
b.x=1; //3
}
};
void main(){
B b(1); // 4
}
Care din următoarele instructiuni sunt eronate:
a. B b; // 1
b. x=1 // 2
c. b.x=1; // 3
d. B b(1); // 4 (din functia main)

42. Fie urmatorul program:


#include <iostream.h>
class A{
public:
// supraincaracre void s()
void s(){cout<<"void A::s()"<<endl;}
void s(int i){i++;cout<<"void A::s(int)"<<endl; }
// supraincarcare void v()
virtual void v(){cout<<"virtual void A::v()"<<endl;}
virtual void v(int i){i++;cout<<"virtual void A::v(int)"<<endl;}
};
class B:public A{
public:
// 1. supraincarcare metoda statica
int s(){cout<<"int B::s()"<<endl; return 1;}
// 2. specializare metoda statica
void s(int i){i++;cout<<"void B::s(int)"<<endl; }
// 3. specializare metoda virtuala
virtual void v(int i){i++;cout<<"virtual void B::v(int)"<<endl;}
// 4. supraincarcare metoda virtuala, neacceptata:
// B::v() conflicts with base class A
// virtual int v(){cout<<"int B::v()"<<endl; return 1;}
};
void main(){
A a, *pa;
B b;
pa=&a; pa->s(); pa->s(1); pa->v(); pa->v(1);
pa=&b; pa->s(); pa->s(1); pa->v(); pa->v(1);
}
Care din rezultatele urmatoare sunt afisate prin executarea programului?
a. void A::s()
void A::s(int)
virtual void A::v()
virtual void A::v(int)
void A::s()
void A::s(int)
virtual void A::v()
virtual void B::v(int)
b. void A::s()
void A::s(int)
virtual void A::v()
virtual void A::v(int)
void A::s()
void A::s(int)
virtual void A::v()
virtual void A::v(int)
c. void A::s()
void A::s(int)
virtual void A::v()
virtual void A::v(int)
void A::s()
void A::s(int)
virtual void B::v()
virtual void B::v(int)
d. void A::s()
void A::s(int)
virtual void A::v()
virtual void A::v(int)
int B::s()
void B::s(int)
virtual void B::v()
virtual void B::v(int)

43. Fie programul urmator:


#include <iostream.h>
class Calculator{
private:
int value;
int keep;
char toDo;
public:
void add(){
keep=value; //keep first operand
value=0; //get ready for the second operand
toDo='+'; // what to do later
}
void subtract(){
keep=value; //keep first operand
value=0; //get ready for the second operand
toDo='-'; // what to do later
}
void multiply(){
keep=value; //keep first operand
value=0; //get ready for the second operand
toDo='*'; // what to do later
}
void compute(){
if (toDo=='+') value += keep;
else if (toDo == '-') value = keep-value;
else if (toDo == '*') value *= keep;
}
void clear(){value=keep=0;}
void digit (int x){value=value*10+x;}
int display(){ return value;}
Calculator(){clear();}
};
void main(){
Calculator c;
c.digit(1); c.digit(0);
c.add();
c.digit(2); c.digit(0);
c.compute();
c.add();
c.digit(5);
c.compute();
cout<<c.display()<<endl;
c.clear();
c.digit(1); c.digit(0);
c.subtract();
c.digit(2); c.digit(0);
c.compute();
c.multiply();
c.digit(5);
c.compute();
cout<<c.display()<<endl;
};
Se cere sa indicati care din rezultatele urmatoare sunt afisate prin executarea acestui program:
a. 25
-10
b. 35
50
c. 35
-50
d. 35
-20

44. Se considera programul:


#include <iostream.h>
class C{
public:
C(){i=0;};
void set_i(int pi){cout << "C::set_i (int)"<<endl;i=pi;}
//void set_i(int pi)const{i=pi;} // error: cannot modify a const object
int get_i (){cout << "C::get_i ()"<<endl; return i;}
int get_i()const {cout << "C::get_i ()const"<<endl;return i;}
int i;
};
void main(){
int j;
C x;
const C y;
x.i=1;
x.set_i(2);
j= x.get_i();
//y.i=1; // error: cannot modify a const object
//y.set_i(2); // warning: non-const function called for a const object
j= y.get_i();
}
Ce rezultate afiseaza acest program?
a. C ::set_i(int)
C::get_i() const
C::get_i()
b. C ::set_i(int)
C::get_i()
C::get_i()
c. C ::set_i(int)
C::get_i()
C::get_i()const
d. C ::set_i(int)
C::get_i() const
C::get_i()const

45. Se considera urmatoarele clase:


class B{
public:
int i;
protected:
int j;
private:
int k;
public:
B(){i=j=k=0;}
void set_j(int pj){j=pj;}
int get_j(){return j;}
void set_k(int pk){k=pk;}
int get_k(){return k;}
};
class D: public B{
public:
D(){
i=1;
j=1;
k=1; // 1
set_k(1); // 2
}
};
class C{
public: C(){
b.i=2;
b.j=2; // 3
b.set_j(2); // 4
b.k=2; // 5
b.set_k(2); // 6
}
private:
B b;
};
Care din afirmatiile urmatoare sunt adevarate?
a. instructiunile // 1, // 3 si // 5 sunt toate incorecte
b. doar instructiunile // 2, si // 4 sunt incorecte
c. doar instructiunile // 3 si // 4 sunt incorecte
d. instructiunile // 2, // 3 si // 4 sunt toate incorecte

46. Care este varianta corecta de completare a urmatoarei specificari (incomplete ) a clasei
Data
#include <iostream.h>
class Data{
public:
// metode si operatori
private:
int zi,luna, an;
};
astfel incat programul urmator
void main(){
Data d, e(31,12,2002);
cout<<d<<" "<<e<<endl;
}
sa afiseze rezultatele:
1/1/2001 31/12/2002
a. dupa comentariul metode si operatori, se adauga:
Data(int zi=1, int luna=1, int an=2001);
friend ostream& operator<<(ostream&, Date &);
b. dupa comentariul metode si operatori, se adauga:
Data(int zi=31, char *luna=”XII”, int an=2002);
friend ostream& operator<<(ostream&, Date &);
c. dupa comentariul metode si operatori, se adauga:
Data(int zi=31, int luna=12, int an=2002);
friend ostream& operator<<(ostream&, Date &);
d. dupa comentariul metode si operatori, se adauga:
Data(int zi=1, int luna=1, int an=2001);
ostream& operator<<(ostream&, Date &);

47. Fie următorul program C++, unde funcŃia abs calculează valoarea absolută a unui
număr real:
#include <iostream.h>
void abs(float &x){if (x<0)x=-x;}
void main(){
float a=-1;
abs(a);
cout<<"a="<<a<<endl;
int i=-1;
abs(i); //temporary used for parameter x
cout<<"i="<<i<<endl; // i=-1
}
La compilare a fost emis următorul mesaj de avertizare:
Warning: temporary used for parameter ‘x’ in call to ‘abs(float &)
Care din afirmaŃiile următoare sunt adevărate:
a. Programul afisează:
a =1
i = -1
b. Programul afisează:
a =1
i=1
c. Programul afisează:
a = -1
i = -1
d. Programul afisează:
a = -1
i=1

48.Fie următorul program C++:


#include <iostream.h>
class Punct{
public:
Punct(int=0, int=0); //constructor
protected:
int x,y;
friend ostream& operator<<(ostream&, const Punct&);
};
class Cerc: public Punct{
public:
Cerc(double r=0.0, int x=0, int y=0);// constructor
protected:
float raza;
friend ostream& operator<<(ostream&, const Cerc&);
};
//implementare Punct
Punct::Punct(int a, int b):x(a),y(b){} // constructor
ostream& operator<<(ostream& output, const Punct& p){
output<<"Punct"<<'['<<p.x<<", "<<p.y<< ']';
return output;
}
//implementare Cerc
Cerc::Cerc(double r, int a, int b):Punct(a,b), raza(r){}
ostream& operator<<(ostream& output, const Cerc& c){
output <<"Centru= "<< (Punct)(c)
<<"; Raza= "<<c.raza;
return output;
};
void main(){
Punct *punctPtr=0, p(30,50);
Cerc *cercPtr=0, c(2.7,120,89);
cout<<p<<endl;
cout<<c<<endl;
// Cerc tratat ca Punct (prin pointer la clasa de baza):
punctPtr=&c;
cout<< *punctPtr << endl;
/* Cerc tratat ca Cerc (prin pointer la clasa de baza, dar
cu conversie explicita de la Punct la clasa derivata Cerc
*/
cercPtr= (Cerc *)(punctPtr);
cout<< *cercPtr<<endl;
/*Punct tratat ca Cerc: programatorul isi asuma responsabilitatea
unor erori: anumite atribute sunt nedefinite
*/
punctPtr= &p; // punctPtr refera un Punct
//Urmeaza conversie asumata de programator,
//de la clasa de baza la clasa derivata
cercPtr=(Cerc *)(punctPtr);
// cercPtr refera p ca pe un cerc
//dar acest asa-zis cerc are raza nedefinita
cout<< *cercPtr <<endl;
}
Prin xx este desemnată o valoare nedefinită.
Care din afirmaŃiile următoare sunt adevărate:
a. Programul afisează:
Punct[30,50]
Centru=Punct[30,50]; Raza=2.7
Punct[120,89]
Centru=Punct[120,89]; Raza=2.7
Centru=Punct[30,50]; Raza=xx
b. Programul afisează:
Punct[30,50]
Centru=Punct[120,89]; Raza=2.7
Punct[120,89]
Centru=Punct[120,89];
Centru=Punct[30,50]; Raza=xx
c. Programul afisează:
Punct[30,50]
Centru=Punct[30,50];
Punct[120,89]
Centru=Punct[120,89]; Raza=2.7
Centru=Punct[30,50]; Raza=xx
d. Programul afisează:
Punct[30,50]
Centru=Punct[120,89]; Raza=2.7
Punct[120,89]
Centru=Punct[120,89]; Raza=2.7
Centru=Punct[30,50]; Raza=xx

49. Fie următorul program C++:


// constructor de copiere in clasa de baza;
// dar absent in clasa derivata
#include <iostream.h>
class B{
public:
B(){cout<<"B();";}
B(B &b){cout<<"B(B &b);";}
};
class D: public B{
public:
D(){cout<<"D();";}
};
void main(){
B b;
B b1(b);
D d;
D d1(d);
B bd(d);
}
Care din afirmaŃiile următoare sunt adevărate:
a. Programul afisează:
B() B(B &b) B() D() B(B &b) B(B &b)
b. Programul afisează:
B() B() B() D() B(B &b) B(B &b)
c. Programul afisează:
B() B() B(B &b) D() B(B &b) B(B &b)
d. programul afisează:
B() B(B &b) B() D() B() B()

50. Fie următorul program C++:


#include <iostream.h>
class B{
public:
B(int i):i(i){}
protected:
int i;
};
class D1: public B{
public:
D1(int i):B(i){}
void inc(){i++;}
};
class D2: public B{
public:
D2(int i):B(i){}
void afisare(){cout<<”i=”<<i<<endl;}
};
class D: public D1, public D2{
public:
D(int i):D1(i),D2(i){}
};
void main(){
D d(0);
d.inc();
d.afisare();
}
Care din afirmaŃiile următoare sunt adevărate:
a. Programul afisează i=-1
b. Programul afisează i=2
c. Programul afisează i=0
d. Programul afisează i=1

51. Fie următorul program C++:


class A{
int x;
public:
A(int x):x(x){};
};
class B{
protected:
int x;
public:
B(int x):x(x){};
};
class D:public B{
A a;
B b; // 1
B b(1); // 2
public:
void m(){
x=1; // 3
//b.x=1; //x nu este accesibil obiectelor
}
};
void main(){
B b(1); // 4
}
Care din următoarele instrucŃiuni sunt eronate:
a. B b; // 1
b. B b(1); // 2 (din clasa D)
c. x=1; // 3
d. B b(1); // 4 (din funcŃia main)

52. Fie urmatoarea specificare de clasa:


// file abslist.h
#ifndef ABSLIST_H
#define ABSLIST_H
#include "d:\tudor\c_cpp\abstract\abselem.h"
class AbstractList{
public:
virtual void erase()=0;
virtual void put(AbstractElem* ae){};
virtual AbstractElem* get(){};
virtual int isEmpty(){};
virtual int isFull(){};
};
#endif

Care afirmatie este corecta:


a. isEmpty() este metoda virtuala pura
b.AbstractList este o clasa concreta
c. AbstractList este o clasa abstracta
d. obiectele clasei pot fi construite cu AbstractList();

53. Fie urmatoarea specificare de clase:


class Complex;
class Punct{
public:
Punct(float x=0, float y=0):x(x),y(y){}
operator Complex();
operator float(){return x;}
private:
float x,y;
};
class Complex{
public:
Complex(float x=0, float y=0):x(x),y(y){}
operator Punct(){return Punct(x,y);}
operator float(){return x;}
private:
float x,y;
};
Punct::operator Complex(){ return Complex(x,y);}

Metoda Punct:: operator Complex() nu a fost implementat inline, precum operator Punct()
deoarece
a. Construcorul Complex(float, float) trebuie declarat inaintea metodei Punct:: operator Complex()

b. Constructorul Punct (float, float) trebuie declarat inaintea metodei Punct:: operator Complex()
c. Este metoda friend a clasei Complex ????
d. Este metoda friend a clasei Punct
54. Fie programul:
// file Calc.h
class Calculator{
private:
int value;
int keep;
char toDo;
public:
void add();
void multiply();
void compute();
void clear();
void digit (int x);
int display();
Calculator();
};

//file Calc.cpp

#include "Calc.h"
void Calculator::clear(){
value=keep=0;
}
int Calculator::display(){ return value;}
void Calculator::digit(int x){value=value*10+x;}
void Calculator::add(){
keep=value; //keep first operand
value=0; //get ready for the second operand
toDo='+'; // what to do later
}
void Calculator::multiply(){
keep=value; //keep first operand
value=0; //get ready for the second operand
toDo='*'; // what to do later
}
void Calculator::compute(){
if (toDo=='+') value += keep;
else if (toDo == '*') value *= keep;
}
Calculator::Calculator(){clear();}
//file testdriver.cpp
#include <iostream.h>
#include "Calc.h"
void main(){
Calculator c;
c.digit(1);c.digit(0);
c.add();
c.digit(2);c.digit(0);
c.compute();
c.add();
c.digit(5);
c.compute();
cout<<c.display()<<endl;
c.clear();
c.digit(1);c.digit(0);
c.multiply();
c.digit(2);c.digit(0);
c.compute();
c.add();
c.digit(5);
c.compute();
cout<<c.display()<<endl;

};
Programul afiseaza
a. 35 205
b.10 20
c. 205 35
d. 20 10

55. Fie programul:


#include "iostream.h"
template <class T>
class Fifo{
public:
Fifo(int nrmax=0);
void put(T);
T get();
void remove();

private:
int nrmax;
int nrelem;
int first;
int free;
T* support;
};

template <class T>Fifo<T>::Fifo(int nrmax):nrmax(nrmax){


first=free=nrelem=0;
support = new T [nrmax-1];
}
template <class T> void Fifo<T>::put(T e){
support[free]=e; free= ++free % nrmax; nrelem++;
}
template <class T> T Fifo<T>::get(){
return support[first];
}
template <class T> void Fifo<T>::remove(){
first= ++first % nrmax;
--nrelem;
}

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("Andrei"));
queuePerson.put(Person("Tudor"));
queueCar.put(Car("B-39-TDR"));
queuePerson.get().process(); queuePerson.remove();
queueCar.get().process(); queueCar.remove();
queuePerson.get().process(); queuePerson.remove();
}

Programul afiseaza:
a. A Person: Andrei
A Car:B-39-TDR
A Person: Tudor
b.
c.
d.

56.Fie programul
// constructor de copiere atat in clasa de baza cat si in clasa derivata
// constructorul de copiere din clasa derivata utilizeaza pe B() pentru
constructia // // subobiectului B
#include <iostream.h>
class B{
public:
B(){cout<<"B()"<<endl;}
B(B &b){cout<<"B(B &b)"<<endl;}
};
class D: public B{
public:
D(){cout<<"D()"<<endl;}
D(D &d){cout<<"D(D &d)"<<endl;}
};
void main(){
B b; // apel B()
B b1(b); // apel B(B & ); nu se mai utilizeaza B()!
D d; // apel B();D()
D d1(d); // nu se apeleaza B(B &b)
}
Programul afiseaza :
a. B() B(B&b) B() D() B(B &b) D(D &d)
b. B() B(B&b) B() D() B() D(D &d)
c. B() B() B(B&b) B() D() B(B &b) D() B(B &b)
d. B() B(B&b) D() B(B &b) D() B(B &b)

57. Fie urmatorul program:


// Constructor cu semantica prin referinta
// Operatorul = este cel implicit
#include <iostream.h>
class C{
public:
C(int n=0, int v[]);
friend ostream& operator<<(ostream &o, const C&);
private:
int dim;
int *pi;
};
C::C(int n, int v[]) {
dim=n;
pi= v;
}
ostream& operator<<(ostream &o, const C &m){
for(int j=0; j<m.dim; j++)o<< m.pi[j]<<" ";
return o;
}
void main(){
int a[]={1,2,3}, b[]={10,20};
C x(3,a),y(2, b);
a[0]= -100;
cout<<x<<endl;
}

Programul afiseaza:
a. -100 2 3
b. 1 2 3
c. 100 2 3
d. 1 20 30

58. Fie urmatorul program, in care se utilizeaza clase abstracte:


// abselem.h
#ifndef ABSTRACTELEM_H
#define ABSTRACTELEM_H
class AbstractElem{
public:
virtual void display()=0;
virtual void process()=0;
};
#endif
//LIST.h
#ifndef LIST_H
#define LIST_H
#include "abselem.h"
class LIST{
public:
LIST(int nrmax=0);
void put(AbstractElem *);
AbstractElem* get();
void remove();
private:
int nrmax;
int nrelem;
int first;
int free;
AbstractElem* *support;
};
#endif
//LIST.cpp
#include "LIST.h"
LIST::LIST(int nrmax):nrmax(nrmax){
first=free=nrelem=0;
support = new AbstractElem* [nrmax-1];
}
void LIST::put(AbstractElem * pe){
support[free]=pe; free= ++free % nrmax; nrelem++;
}
AbstractElem* LIST::get(){
return support[first];
}
void LIST::remove(){
first= ++first % nrmax;
--nrelem;
}
Care afirmatie este adevarata:
a. LIST este o structura de date de tip coada
b. LIST este o structura de date de tip stiva
c. LIST este o clasa abstracta
d. LIST este un vector

59. Fie urmatoarea specificare de clase:


class Complex;
class Punct{
public:
Punct(float x=0, float y=0):x(x),y(y){}
operator Complex();
operator float(){return x;}
private:
float x,y;
};
class Complex{
public:
Complex(float x=0, float y=0):x(x),y(y){}
operator Punct(){return Punct(x,y);}
operator float(){return x;}
private:
float x,y;
};
Metoda Complex:: operator float() este utilizata pentru
a. Conversia unui numar real in obiect Complex
b. Conversia unui obiect Complex in obiect Punct
c. Conversia obiectelor Complex in numere reale
d. Conversia unui obiect Punct in obiect Complex

60. Fie urmatorul program:


#include <iostream.h>
class A{
public:
// supraincaracre void s()
void s(){cout<<"void A::s()"<<endl;}
void s(int i){i++;cout<<"void A::s(int)"<<endl; }
// supraincarcare void v()
virtual void v(){cout<<"virtual void A::v()"<<endl;}
virtual void v(int i){i++;cout<<"virtual void A::v(int)"<<endl;}
};
class B:public A{
public:
// 1. supraincarcare metoda statica
int s(){cout<<"int B::s()"<<endl; return 1;}
// 2. specializare metoda statica
void s(int i){i++;cout<<"void B::s(int)"<<endl; }
// 3. specializare metoda virtuala
virtual void v(int i){i++;cout<<"virtual void B::v(int)"<<endl;}
};
void main(){
A *pa;
B b;
pa=&b; pa->v(); pa->s(1);
}
Prin executarea sa, programul afiseaza:
a. void B::v()
void A::v(int)
b. void A::v()
void B::v(int)
c. void A::v()
void A::v(int)
d. void B::v()
void A::s(int)

61. Fie programul:


#include <iostream.h>
class Cerc{
public:
Cerc(float r):raza(r){}
float getRaza(){return raza;}
Cerc& operator++(){raza++;return *this;}// return by reference
Cerc operator--(){raza--;return *this;}// return by value
private:
float raza;
};
void main(){
Cerc c(1.0);
cout<<(++(++c)).getRaza()<<” ”;
cout<<c.getRaza()<<” ”;
cout<<(--(--c)).getRaza()<<” ”;
cout<<c.getRaza()<<” ”;
}
Programul afiseaza:
a. 3 2 0 0
b. 3 2 0 1
c. 3 2 1 1
d. 3 3 1 2

62. Fie urmatorul program:


#include <iostream.h>
class A{
public:
// supraincaracre void s()
void s(){cout<<"void A::s()"<<endl;}
void s(int i){i++;cout<<"void A::s(int)"<<endl; }
// supraincarcare void v()
virtual void v(){cout<<"virtual void A::v()"<<endl;}
virtual void v(int i){i++;cout<<"virtual void A::v(int)"<<endl;}
};
class B:public A{
public:
// 1. supraincarcare metoda statica
int s(){cout<<"int B::s()"<<endl; return 1 ;}
// 2. specializare metoda statica
void s(int i){i++;cout<<"void B::s(int)"<<endl; }
// 3. specializare metoda virtuala
virtual void v(int i){i++;cout<<"virtual void B::v(int)"<<endl;}
};
void main(){
A *pa;
B b;
pa=&b; pa->s(); pa->v(1);
}
Prin executarea sa, programul afiseaza:
a. void B::v()
void A::v(int)
b. void A::v()
void B::v(int)
c. void A::s()
virtual void B::v(int)
d. void A::v()
void A::v(int)

63. Se considera clasa:


#include "iostream.h"
template <class T>
class C{
public:
C(int nrmax=0);
void put(T);
T get();
void remove();
private:
int nrmax;
int nrelem;
int first;
int free;
T* support;
};
template <class T>C<T>::C(int nrmax):nrmax(nrmax){
first=free=nrelem=0;
support = new T [nrmax-1];
}
template <class T> void C<T>::put(T e){
support[free]=e; free= ++free % nrmax; nrelem++;
}
template <class T> T C<T>::get(){
return support[first];
}
template <class T> void C<T>::remove(){
first= ++first % nrmax;
--nrelem;
}
a. Clasa C este o clasa generica
b. Clasa C este o clasa abstracta
c. Clasa C este derivata din clasa T
d. Clasa T este derivata din clasa C

JAVA
1- A ,2-B ,3-C ,4-A ,5-D ,6-B ,7-C ,8-A ,9-B ,10-A ,11-B ,12-C ,13-D ,14-A ,15-B,
16-C ,17-D ,18-B ,19-C ,20-B ,21-C ,22-D ,23-A

C++
1-A, 2-D, 3-D, 4-A, 5-C, 6-?, 7-A, 8-B, 9-A, 10-A, 11-D, 12-B, 13-A, 14-D, 15-?, 16-C,
17-B, 18-A, 19-E, 20-B, 21-A, 22-A, 23-?, 24-D, 25-C, 26A, 27-D, 28-B, 29-A, 30-D,
31-A, 32-D, 33-A, 34-B, 35-A, 36-C, 37-D, 38-C, 39-B, 40-B, 41-C, 42-A, 43-C, 44-C,
45-A, 46-A, 47-A, 48-D, 49-A, 50-C, 51-B, 52-C, 53-A,B?, 54-A, 55-A, 56-B, 57-A, 58-
A, 59-B 60-C, 61-D, 62-C, 63-A

S-ar putea să vă placă și