• Nenhum resultado encontrado

3ª Lista de Exercícios de Paradigmas de Linguagens Computacionais Professores: Fernando Castor, Márcio Cornélio e Paulo Borba Monitores: Ciência da computação: Alberto Rodrigues Costa Junior (arcj), Diego Correia

N/A
N/A
Protected

Academic year: 2019

Share "3ª Lista de Exercícios de Paradigmas de Linguagens Computacionais Professores: Fernando Castor, Márcio Cornélio e Paulo Borba Monitores: Ciência da computação: Alberto Rodrigues Costa Junior (arcj), Diego Correia"

Copied!
8
0
0

Texto

(1)

3ª Lista de Exercícios de Paradigmas de Linguagens Computacionais Professores: Fernando Castor, Márcio Cornélio e Paulo Borba

Monitores:

Ciência da computação: Alberto Rodrigues Costa Junior (arcj), Diego Correia

Aragao (dca), Luana Martins dos Santos (lms7), Luiz Fernando Sotero (lfss2)

Hugo Bessa (hrba), Joao Victor de Figueiredo Leite (jvfl), Vítor Antero (vham)

.

CIn-UFPE – 2013.1 Disponível desde: 13/08/2013

Entrega: 27/08/2013

A lista deverá ser respondida em dupla. A falha em entregar a lista até a data estpulada implicará na perda de 0,25 ponto na média da disciplina para os membros da dupla. Considera-se que uma lista na qual menos que 5 das respostas estão corretas não foi entregue. A entrega da lista com pelo menos 9 das questões corretamente respondidas implica em um acréscimo de 0,125 ponto na média da disciplina para os membros da dupla. A resolução da últma questão (11) e da primeira (0)é obrigatória. Se qualquer situação de cópia de respostas for identficada, os membros de todas as duplasenvolvidas perderão 0,5 ponto na média da disciplina. O mesmo vale para respostas obtdas a partr da Internet. As respostas deverão ser entregues exclusivamente em formato texto ASCII (nada de .pdf, .doc, .docx ou .odt) e deverão ser enviadas para o monitor responsável por sua dupla, sem cópia para o professor. Devem ser organizadas em arquivos separados, um por questão, entregues em um único formato compactado, ou seja, um único arquivo zipado contendo as respostas para todas as questões.

0) Faça um programa em java que dado um número N calcula se este número é primo. Um

número primo tem apenas dois divisores: um e ele mesmo. O programa deve dividir o N pelos números de 2 a N, para descobrir a primalidade por força bruta. Faça também duas versões deste programa onde o calculo deverá ser realizado paralelamente por várias threads: uma onde a divisão de trabalho é feita dinamicamente e outra onde essa divisão é estátca. A realização do cálculo deverá ser dividida entre as threads criadas de modo que em um processador com X cores, o programa com X threads consiga ser mais rápido que o programa sequencial. O número de threads criadas será um parâmetro X do programa. Observe e descreva, em um arquivo texto, os tempos de execução do programa sequencial e para X igual a 2, 100, 500, 1000, 10000. A partr de qual valor de X a execução do programa ficou mais lenta que a sequencial? Explique porque.

(2)

terminal de caixa eletrônico serão dados n arquivos (“terminal0.txt”, “terminal1.txt”,..., “terminaln.txt”) cada arquivo possui linhas que têm a seguinte forma:

[operação] [conta1] [conta2_se_existr] [valor] exemplo de um arquivo “terminal0.txt”: debitar “ola” 34

depositar “mundo” 10 transferir “ola” “mundo” 24

Caso haja uma operação com uma Conta que ainda não foi cadastrada você deve criar a Conta e depois adicionar essa conta à lista de contas (certfique-se de que não há várias contas com o mesmo nome na lista de contas). Toda Conta começa inicialmente zerada e é permitdo saldo negatvo, sem limite. Ao final da execução, devem ser impressos o saldo de todas as contas na tela. O problema deverá ser resolvido utlizando apenas synchronized para definir a zona de exclusão mutua. Para o arquivo acima, o resultado deve ser um dos dois abaixo:

ola -58 mundo 34

ou isto:

mundo 34 ola -58

2) Seja tSeq o tempo da execução sequencial de um método de multplicação matricial e nThr o número de máximo de threads que podem ser executadas simultaneamente de forma paralela na máquina a ser utlizada. Implemente um método que execute a multplicação matricial em um tempo o mais próximo possível de tSeq/nThr e implemente um método main() que mostre que, de fato, seu programa se beneficia do processamento paralelo. Escreva explicitamente as propriedades de segurança e vivacidade que seu programa de respeitar. Inclua-as junto com o código na forma de comentários. Após ter implementado o programa, forneça um argumento formal para mostrar que seu programa de fato respeita essas propriedades para todas as suas possíveis execuções. Essa prova de corretude também deve ser enviada como comentário associado à resposta da questão.

3) A pequena cidade de 情 報 セ ン ター utliza votação por urna eletrônica que funciona da seguinte maneira:

(3)

-Depois os dados de cada urna são extraídos em arquivos separados, de modo que em cada linha de cada arquivo estão armazenados os nomes votados. Portanto o nome que aparecer mais vezes juntando todos os arquivos é o ganhador da eleição. Em caso de empate o desempate é feito pela ordem Lexicografia (ordem alfabétca) dos nomes.

-Para agilizar o processo de contagem dos votos você decidiu criar um programa em Java, utlizando programação concorrente de modo que cada arquivo extraído por uma urna seja lido por uma thread diferente.

-A entrada será um número “n” que é o numero de urnas e uma string “s” que é o caminho até a pasta onde os arquivos extraídos de cada urna estão e os arquivos serão nomeados como “urna0.txt” , “urna1.txt” até “urna”(n-1)”.txt”.

-Não será admitdo o uso de Locks, Monitores, Blocos Guardados, synchronized, etc., apenas estruturas de alto nível definidas em java.util.concurrent ponderam ser usadas para garantr a integridade e a corretude dos dados.

-No final deverá ser mostrado o nome do vencedor na tela, além de escrever no arquivo “final.txt” na pasta cujo caminho é “s” o nome de cada candidato votado, um espaço, sua quantdade de votos e um ‘\n’(as linhas deste arquivo devem estar ordenadas pela colocação do candidato na eleição).

- Escreva explicitamente as propriedades de segurança e vivacidade que seu programa de respeitar. Inclua-as junto com o código na forma de comentários. Após ter implementado o programa, forneça um argumento formal para mostrar que seu programa de fato respeita essas propriedades para todas as suas possíveis execuções. Essa prova de corretude também deve ser enviada como comentário associado à resposta da questão.

4) Está acontecendo uma competção de tro ao alvo, onde X(definido pelo usuário) duplas (atrador/ajudante) partciparão da prova. Considere as seguintes informações:

- Cada dupla possui um ID.

- Um Atrador leva 350ms para carregar a arma (a arma e carregada com apenas uma munição) e atrar (para fazer as duas ações e não cada uma), tendo 50% de chance de acertar o alvo. Se o atrador não tver munição ele espera até que ajudante produza mais balas.

- O Atrador começa com dois cartuchos de munição e pode ficar com no máximo 5.

- Um Ajudante produz uma munição no tempo entre 100ms e 700ms se o atrador tver menos que 5 munições em sua posse, caso contrário ele espera.

- A competção acaba assim que se passarem K segundos de prova (definido pelo usuário). Utlizando os conceitos de programação concorrente desenvolva uma solução para simular a competção. Imprima o ranking das duplas pela quantdade de tros que acertaram o alvo.

(4)

Existem P pessoas. Cada uma tem um tonel de L litros que precisa ser enchido e cada um possui um balde que suporta X mililitros de água. Existem K torneiras disponíveis, onde as pessoas podem encher seus baldes. Porém, a quantdade de torneiras é sempre menor que a quantdade de pessoas, fazendo com que elas disputem pelas torneiras.

Como as pessoas correm de uma torneira para outra se a atual estver ocupada, não existe fila para esperar em uma torneira. Implemente a brincadeira "encher o tonel" em java usando trava explícita não bloqueante. A brincadeira termina quando alguém estver com seu tonel cheio, após isso imprima a quantdade de litros (ou mililitros) que cada pessoa conseguiu encher, de forma ordenada. Escreva explicitamente as propriedades de segurança e vivacidade que seu programa de respeitar. Inclua-as junto com o código na forma de comentários. Após ter implementado o programa, forneça um argumento formal para mostrar que seu programa de fato respeita essas propriedades para todas as suas possíveis execuções. Essa prova de corretude também deve ser enviada como comentário associado à resposta da questão.

6) Em uma casa moram 3 irmãs: Carminha, Regiane e Carlotcha. Mulheres são muito vaidosas e demoram muito para se arrumar. Certa noite, as três foram convidadas para um baile de formatura. Para se produzirem utlizam sempre alguns acessórios:

1. Pente de cabelo 2. Batom

3. Blush 4. Sombra 5. Rímel 6. Base

Elas se produzem seguindo as seguintes regras:

- Na casa existe uma bancada onde ficam os acessórios.

- Cada uma delas tem uma sequência própria de itens que vai usar para se produzir. Todas sempre usam todos os itens para poder se aprontar e é possível que uma delas use um item mais de uma vez (por exemplo, use o batom e, depois de usar rímel, base e sombra, use o batom de novo).

- Cada uma pega apenas um item por vez, mas só os utliza quando está com os dois nas mãos. - Elas usam dois itens por vez. Se um dos itens ou ambos não estverem disponíveis, ela espera até que ele apareça na bancada Ela libera os itens de uma vez quando acaba de usar.

(5)

7) Escreva um programa que garanta que as três irmãs da questão anterior terminem de se produzir a tempo de chegarem ao baile. Utlizem travas explícitas não-bloqueantes.

obs: Não é permitdo alterar as regras descritas no problema.

8) Altere o programa abaixo de tal maneira que não entre em deadlock, mas sem modificar o main e mantendo a lógica do programa. Observação: Não utlize blocos ou métodos sincronizados nem as classes do pacote java.util.concurrent.atomic.

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

public class Questao1 {

public static void main(String[] args) {

Objeto o1 = new Objeto("creme", new ReentrantLock()); Objeto o2 = new Objeto("talco", new ReentrantLock()); Baba baba1 = new Baba(o1, o2, 1);

Baba baba2 = new Baba(o2, o1, 2); baba1.start();

baba2.start(); }

}

class Objeto { String tipo; Lock id;

Objeto(String tipo, Lock id){ this.tipo = tipo;

this.id = id; }

public void pegarObjeto(){ id.lock();

}

public void soltarObjeto(){ id.unlock();

} }

class Baba extends Thread{ Objeto obj1;

Objeto obj2;

(6)

Baba(Objeto obj1, Objeto obj2, int numero){ this.obj1 = obj1;

this.obj2 = obj2; this.numero = numero; numeroDeBebes = 0; }

@Override

public void run() { while(true){

try {

obj1.pegarObjeto(); obj2.pegarObjeto(); numeroDeBebes++;

System.out.println("Baba " + numero + ": " + numeroDeBebes);

sleep(1000);

obj2.soltarObjeto(); obj1.soltarObjeto();

} catch (InterruptedException e) { e.printStackTrace();

} }

} }

9) Uma máquina de café no CIn funciona da seguinte maneira:

Sempre que um café é feito, são usados 30 gramas de café em pó, 20 ml de água, 10 ml de leite, e 5 gramas de açúcar. Porém a máquina tem capacidade apenas de 500 gramas de café, 300 ml de água, 200 ml de leita e 100 gramas de açúcar. Um café só pode ser produzido se na máquina houver uma quantdade de cada ingrediente maior ou igual a quantdade necessária para produzi-lo. Os ingredientes só podem ser repostos se houver menos que 91% deles na máquina, pois eles são repostos de 10% em 10%. Suponha que a todo momento, alguém está querendo tomar café e que além disso sempre estão tentando repor os ingredientes da máquina ( Os ingredientes não são repostos todos de uma única vez, cada um é colocado separadamente ). Porém a máquina só pode ser usada por uma pessoa de cada vez. Implemente em java usando apenas os tpos disponíveis no pacote da java.util.concurrent.atomic o sistema que simula o uso da máquina de café do CIn no dia-a-dia.

(7)

fato respeita essas propriedades para todas as suas possíveis execuções. Essa prova de corretude também deve ser enviada como comentário associado à resposta da questão.

10) Blefar é uma arte!

Implemente um programa que simule o Poker Texas Hold'em. Nesta implementação cada jogador deve possuir uma thread única para avaliar se deve efetuar check/fold, call ou raise. Como blefar é uma arte, um jogador não precisa avaliar a jogada dos outros jogadores, pois seria bastante difcil verificar se é um blefe ou não; basta avaliar as próprias cartas, o fop, o turn e o river (e, lógico, todas as outras cartas do baralho). Embora cada jogador não precise esperar pelos outros jogadores para começar a avaliar sua futura decisão, cada um deve esperar sua vez de jogar. Quem será o vencedor (o único com dinheiro)?

Implemente duas soluções diferentes, uma com blocos guardados (escopos sincronizados) e outra com variáveis de condição (e travas) explícitas.

11) Na cidade de Raccoon, um vírus (chamado T-vírus) se espalhou pela cidade contaminando quase toda a população. O T-vírus depois de certo tempo transforma as pessoas infectadas em zumbis. A única saída para uma pessoa infectada é ir para a base militar da cidade, onde o governo montou N (definido pelo usuário) salas de descontaminação. Entretanto, é preciso enfrentar uma fila de prioridades na qual as pessoas mais infuentes têm a preferência1.

Considere as seguintes informações:

- Cada Infectado dever ser implementado como uma thread distnta e terá as seguintes característcas.

- Um inteiro representando a ordem de chegada do infectado à base (ID).

- Um inteiro (de 1 a 5) representando sua infuência (deve ser definido aleatoriamente nas seguintes probabilidades): 5-Magnata (5%), 4-Polítco (10%), 3-Celebridade (20%), 2 -Militar (25%), 1-Cidadão Comum (40%). Ex: se aleatoriamente fosse gerado um numero entre 0 e 1, e este numero ficasse entre 0 (inclusive) e 0,4 (exclusive) o infectado seria um cidadão comum, se ficasse entre 0,4(inclusive) e 0,65 (exclusive) o infectado seria um militar e assim por diante.

- Um inteiro (> 0 e < 100, deve ser defnido aleatoriamente) representando a grau de infecção do infectado ao chegar à base.

- Enquanto o tempo passa o infectado piora (incrementando seu grau de infeção em 10 a cada 1000ms) até chegar a um estado irreversível no qual ele vira um zumbi (Ocorre quando o grau de infecção fica maior ou igual a 100).

- A fila de espera será representada por um Heap, com capacidade X de infectados (definido pelo usuário). É obrigatória a implementação do seu próprio Heap e que ele seja seguro para threads.

(8)

- A cada 500ms um infectado entra na fila de espera (se existr espaço na fila, senão espera-se até que seja possível inserir novamente). Ao chegar à base militar o infectado passa por uma avaliação para que ele seja colocado em seu devido lugar na fila de espera, o primeiro critério de prioridade será a influencia (A prioridade será do maior Ex: Um polítco é atendido primeiro que um militar). Caso haja empate o infectado que teve maior grau de infecção inicial (no momento que entrou na fla) terá prioridade. Persistndo o empate, o infectado que chegou primeiro à base será atendido primeiro. Se o infectado conseguiu entrar na fila (base) imprima Infectado Y entrou na base, onde Y é o ID do infectado.

- Cada Sala de descontaminação dever ser implementada como uma thread distnta e terá a seguinte característca:

Quando uma sala de descontaminação estver livre (sem infectados) ela “consumirá” (liberando uma vaga) da fila de espera o infectado de maior prioridade a fim de curá-lo. Se o infectado ”consumido” estver com grau de infecção >= a 100 deve ser impresso Infectado Y virou zumbi, caso contrário deverá curá-lo a uma taxa (decrementando sua infecção) de 20 a cada 500ms até que grau de infecção chegue a zero (observe que mesmo na sala de descontaminação o infectado ainda sofre com sua “taxa de piora” até ser curado), chegando a zero o infectado esta curado e deve ser impresso Infectado Y foi curado pela Sala Z. Onde Y é o ID do infectado e Z (>0 e <=N) representando a sala que curou o infectado

-O programa irá parar assim que tverem entrado na fila K pessoas.

Referências

Documentos relacionados

Neste estudo foram estipulados os seguintes objec- tivos: (a) identifi car as dimensões do desenvolvimento vocacional (convicção vocacional, cooperação vocacio- nal,

Purpose: This thesis aims to describe dietary salt intake and to examine potential factors that could help to reduce salt intake. Thus aims to contribute to

Ademais, nota-se que o Brasil evoluiu nos últimos anos, aumentando a indignação com atos de corrupção e pessoas decididas a irem às ruas para manifestar, apesar de eventos como a

In the acute phase and in the chronic forms of Chagas disease, the etiological diagnosis may be performed by detection of the parasite using direct or indirect parasitological

Assim, para esclarecer os dados obtidos na tabela 1, é de fundamental importância a apreciação do contexto histórico de ocupação do Estado de Goiás de modo

Admitindo que a remoção de crómio total se faz, predominantemente, por adsorção com permuta iónica, do crómio(III) formado durante o processo de redução do

Os cálculos referentes ao volume de cada amostra adicionado à célula assim como o volume de padrão de As-(V) adicionado e as concentrações de As-(V) e As-(III) presentes

14) Seu Zé possui uma fábrica de chocolates muito boa, só que infelizmente, a demanda da fábrica é muito grande e ele não consegue supri-la. Sabendo disso, Seu Zé,