Os alunos no final das aulas 10 a 12 deverão conhecer:
Deverão também ser capazes de:
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.
O resumo da matéria abordada nesta aula prática pode ser consultado aqui.
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
no início do seu código. Para definir um mensageiro de nome mensageiro pode usar a seguinte definição:
#include <IPC++/mensageiro.H>
using namespace IPC;
A construção de um mensageiro num processo só fica completa quando consegue estabelecer uma comunicação com outro mensageiro nas mesmas circunstâncias.
Mensageiro mensageiro; //
Definição de variável do tipoMensageiro
.
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:
para receber um inteiro usar:
mensageiro.envia(13);
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.
mensageiro.leMensagem();
int valor = mensageiro.mensagemLida<int>();
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:
Em caso de dificuldade de comunicação entre os dois processos, dê o comando
c++ outras_opções -o programa programa.C -lIPC++ -lUtilitarios
ipcrmall
antes de executar o programa.