Aula prática 11

Sumário

Objectivos

Os alunos no final das aulas 10 a 12 deverão conhecer:

  1. O conceito de TAD (Tipo Abstracto de Dados) e classe C++.
  2. Os vários tipos de características e operações de uma classe C++.
  3. O conceito de enumerado em C++.

Deverão também ser capazes de:

  1. Definir completa e disciplinadamente pequenos TAD.
  2. Usar TAD em pequenos programas.
  3. Implementar TAD através de classes C++, incluindo a respectiva documentação, usando programação por contrato e fazendo testes de unidade.
  4. Definir e usar tipos enumerados C++.
  5. Usar a biblioteca Slang++ para desenvolver pequenos programas interactivos.

Adicionalmente a aula destina-se a treinar a utilização da comunicação entre processos da biblioteca IPC++, necessária para o Trabalho Final

Caso os alunos sintam que os objectivos não foram atingidos na totalidade deverão concluir/repetir os exercícios desta aula autonomamente e ou recorrer aos horários de dúvidas.

Resumo

O resumo da matéria abordada nesta aula prática pode ser consultado aqui.

Exercícios

1.  Termine os exercícios da Aula 10.


2.  Escreva um programa que permita jogar um pequeno jogo.  A ideia é simples.  Cada jogador escolhe um inteiro ao acaso entre 0 e 3.  Depois mostra-o ao seu opositor.  Ganha o jogador que tiver escolhido um inteiro com a mesma paridade que a soma dos dois inteiros dividida por dois (divisão inteira, descartando parte fraccionária).  Se ambos os jogadores estiverem nessas circunstâncias ou se nenhum deles o estiver, considera-se um empate e o jogo continua até algum ganhar.

Cada jogador executa o programa do jogo, pelo que há durante o jogo dois programas em execução (programas em execução chamam-se processos).  Os processos comunicam um com o outro através de um mensageiro.  Para usar mensageiros deve incluir as linhas

#include <IPC++/mensageiro.H>

using namespace IPC;

no início do seu código.  Para definir um mensageiro de nome mensageiro pode usar a seguinte definição:

Mensageiro mensageiro; // Definição de variável do tipo Mensageiro.

A construção de um mensageiro num processo só fica completa quando consegue estabelecer uma comunicação com outro mensageiro nas mesmas circunstâncias.

Pode enviar e receber mensagens ao e do processo com quem está a jogar.  Essas mensagens podem ser inteiros, caracteres simples ou cadeias de caracteres.  Neste caso bastam mensagens de inteiros.  Para enviar um número inteiro (e.g., 13) usar:

mensageiro.envia(13);

para receber um inteiro usar:

mensageiro.leMensagem();

int valor = mensageiro.mensagemLida<int>();

Na tabela abaixo vê-se um exemplo de interacção.  Em cada coluna vê-se a interacção de um dos processos com o respectivo jogador.
 
Aguardando...
Comunicação estabelecida! 
Indique um inteiro entre 0 e 3: 5
Fora do intervalo!
Indique um inteiro entre 0 e 3: 1
Ele escolheu 3.
Empataram...
Indique um inteiro entre 0 e 3: 3
Ele escolheu 2.
Perdeste...
Aguardando...
Comunicação estabelecida! 
Indique um inteiro entre 0 e 3: 3
Ele escolheu 1.
Empataram...
Indique um inteiro entre 0 e 3: 2
Ele escolheu 3.
Ganhaste!

Para compilar programas com mensageiro usar:

c++ outras_opções -o programa programa.C -lIPC++ -lUtilitarios

Em caso de dificuldade de comunicação entre os dois processos, dê o comando

ipcrmall

antes de executar o programa.