Recibo, Frequência, 2º semestre, 1998/1999, Programação II/Programação Orientada por Objectos, ISCTE:
Nome: _______________________________________________
Nº ______________________
Ass. Docente: ________________________________________

Identificação

Nome: _______________________________________________
Nº ________________
Turma: ____________

ISCTE - IGE/ETI

Programação II /Programação Orientada por Objectos

Frequência

1998/1999, 2º semestre


Notas:


 
 
Questão 1
Assinale com V (Verdadeiro) as expressões que estão correctas e com F (Falso) as que estão incorrectas.

Deve preencher todos os espaços indicados por um sublinhado (___) com V ou F.  Qualquer espaço não preenchido será considerado como uma resposta errada.

Em geral as alíneas podem ter zero ou mais respostas correctas.  Cada resposta correctamente assinalada vale 0,5 valores.

Nas alíneas em que apenas uma resposta está correcta (estão assinaladas no texto), responder com mais do que um V anula a cotação, a resposta correcta corresponde à cotação completa.  Qualquer outra resposta corresponde a zero valores.

Em todos os casos em que não é explicitamente referida a localização de uma instrução, considere que esta é dada na função main() do programa seguinte:

#include <iostream>

class A {
    int a;
  public:
    A(int aa) : a(aa) {}
    void g() {
        std::cout << "Execução de A::g(). ";
    }
};

class B : public A {
  public:
    int bx;
    B(int, int);  // Não há construtor por omissão.
    void g() {
        A::g();
        std::cout << "Execução de B::g(). ";
    }
};

inline B::B(int aa, int bb) ...

int main() {
    ...
}

Questão 1.1
Quais das seguintes sequências de instruções estão correctas? (Têm de estar correctas as duas instruções!)
__ B* p = new B; p->bx = 1;
__ B b(1, 2); b->bx = 1;
__ B* p; B->bx = 1;
__ B& b; b.bx = 1;
 [2 valores]
 
 
 
 
Questão 1.2
Quais dos seguintes construtores da classe B inicializam correctamente as variáveis membro A::a e B::bx?
__ B::B(int aa, int bb) : a(aa), bx(bb) {}
__ B::B(int aa, int bb) : A(aa), bx(bb) {}
__ B::B(int aa, int bb) : bx(bb) { A(aa); }
 [1.5 valores]
Questão 1.3
 Dado o seguinte código:
B b(1, 2);
A* pa = &b;
pa->g();
o que apareceria no ecrã (só uma opção verdadeira)?
__ Execução de A::g(). 
__ Execução de A::g(). Execução de B::g(). 
__ Execução de B::g().
 [1.5 valores]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Questão 2
Assuma que está completamente definida a classe Tarefa:
class Tarefa {
  public:

    // Construtor (não há construtor por omissão):
    Tarefa(string descrição, string notas);

    // Destrutor virtual:
    virtual ~Tarefa() {}

    // Acesso à descrição e às notas:
    string descrição() const;
    string notas() const;

    // Devolve duração da tarefa (em dias):
    virtual int duração() const = 0;

    // Devolve custo total da tarefa (em escudos):
    virtual int custo() const = 0;

    // Devolve a mão de obra necessária para a execução da tarefa em cada dia (em operários):
    virtual int mãoDeObra() const = 0;

  private:
    string descrição_;
    string notas_;
};


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Questão 2.1
Defina uma classe concreta (não abstracta) TarefaMecanizada, derivada da classe Tarefa, que não necessita de mão de obra nem de material.  Esta tarefa deverá guardar o custo por dia de funcionamento do equipamento associado à tarefa, o tipo de equipamento que necessita (e.g., "Soldadora Omron"), bem como a duração da tarefa.  O custo total deste tipo de tarefa é dado apenas pelo custo de funcionamento do equipamento durante os dias de execução da tarefa.

Não é necessário nesta alínea definir qualquer um dos métodos da classe TarefaMecanizada.

 [4 valores]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Questão 2.2
Defina o construtor da TarefaMecanizada com os argumentos necessários à inicialização da classe base Tarefa e das variáveis privadas da própria classe TarefaMecanizada.

 [3 valores]
 
 
 
 
 
 

Questão 2.3
Defina o método int TarefaMecanizada::mãoDeObra() const.

 [3 valores]
 
 
 
 

Questão 3
Seja o seguinte modelo Pilha para pilhas de itens de tipo arbitrário:
template <typename I>
class Pilha {
  public:
    // Construtor da classe:
    Pilha();
    // Coloca cópia de item no topo da pilha:
    void põe(const I& item);
    // Retira o item que está no topo da pilha:
    void tira();
    // Devolve cópia do item que está no topo da pilha:
    I topo() const;
    // Devolve true sse a pilha estiver vazia:
    bool vazia() const;
    // Devolve o número de itens na pilha:
    int altura() const;
  private:
    ...
};
Admita que a definição acima se encontra num ficheiro pilha.h.

Escreva um pequeno programa, utilizando o modelo de pilha fornecido, que peça ao utilizador para introduzir um texto e verifique se os seus parênteses estão correctamente balanceados.  Preveja apenas parêntesis de dois tipos: curvos (()) e rectos ([]).  Admita que o texto termina no primeiro ponto final (.) encontrado.   O programa deve ignorar o texto em si: só os parânteses são importantes.  Por exemplo, dadas as seguintes expressões, o programa deve escrever os erros indicados a itálico:

) Aqui ( há ) ( [ gato ] ) .
Fecho sem correspondente abertura.
( Aqui ] também .
Fecho com tipo de parênteses errado.
( Oops .
Parênteses por fechar.
[ este ) ( ] ] ) é ( ) [ ( comprido ) ( ) ] ( (.
Fecho com tipo de parênteses errado.
Fecho com tipo de parênteses errado.
Fecho sem correspondente abertura.
Fecho sem correspondente abertura.
Parênteses por fechar.
Parênteses por fechar.

 
 
 
 
 
 
 

Utilize o seguinte esqueleto de programa (não precisa de o reproduzir, basta identificar os três troços de programa a escrever: A, B e C):

#include <iostream>

#include "pilha.h"

int main() {
    std::cout << "Introduza um texto terminado por um ponto final."
              << std::endl;

    ... // A preencher.  Troço A.

    char c;
    while(std::cin.get(c) && c != '.')
        if(c == '(' || c == ')' || c == '[' || c == ']') {
           ... // A preencher.  Troço B.
        }

    ... // A preencher.  Troço C.
}

 [3 valores]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Questão 4
Explique sucintamente em que circunstâncias um método (função ou procedimento membro de instância) deve ser puramente virtual e quais as consequências da declaração de um método desse tipo para a respectiva classe.

 [2 valores]