Exame de CASS

Propaganda
Exame de CASS
20 Fevereiro 2008
(duração: 2h:30m)
I
Considere o seguinte fragmento de um programa em Java
int mean(int buf1[], int LIM) {
int s = 0;
while( s != LIM) {
val += buf[s];
s = s+1;
};
return val / LIM;
}
1. Indique para a função mean a pré-condição mais fraca e a pós-condição mais forte que
achar conveniente. (Nota: na linguagem de asserções, pode usar o valor constante
inteiro b.length() que indica o número de elementos alocados num vector b dado).
2. Mostre que a função mean apresentada acima garante de facto a pós-condição sempre
que os seus argumentos verifiquem a pre-condição (use as condições que indicou na
alı́nea anterior). Em particular, indique todas as asserções intermédias que considerou
em todos os pontos do programa, incluindo a condição invariante do ciclo while.
II
Considere a seguinte especificação da função strcat disponı́vel nas bibliotecas standard da
linguagem C.
NAME
strpbrk - scan a string for a byte
SYNOPSIS
#include <string.h>
char *strpbrk(const char *s1, const char *s2);
DESCRIPTION
The strpbrk() function shall locate the first occurrence in the string pointed
to by s1 of any byte from the string pointed to by s2.
RETURN VALUE
Upon successful completion, strpbrk() shall return a pointer to the byte or a
null pointer if no byte from s2 occurs in s1.
ERRORS
No errors are defined.
1
1. Defina um modelo (isto é, um programa equivalente) da função strpbrk na linguagem
imperativa base usada nas aulas, que não tem apontadores. Para substituir os apontadores, use ı́ndices inteiros para vectores de caracteres: por exemplo, algo como *p
poderá ser representado por s[i] onde s é um vector de caracteres e i um inteiro.
O valor retornado por strpbrk poderá também ser o indice da string encontrada (se
existir).
2. Para o modelo que construiu na alı́nea anterior, defina a pré-condição e a pós-condição
que achar mais adequada.
3. Mostre, justificando, que o seu modelo de strpbrk satisfaz a pós-condição se for executado num estado que satisfaça a pré-condição.
III
Este exercı́cio trata de controlo de concorrência usando monitores programados correctamente em Java. Considere o problema de definir uma classe ConcVect que implementa vectores de números inteiros, de uso concorrente. O vector possui um construtor ConcVect(int
n), um método set(int i), e um método iterate(Acceptor o). A interface Acceptor)
implementa apenas um método accept(int i). O construtor indica o número máximo
de elementos do vector, quando um vector é criado, os seus elementos são todos zero.
O método set(int pos, int v) atribui o valor v à posição pos do vector. O método
iterate(Acceptor o), passa em sequência os vários valores guardados no vector ao método
accept do objecto o. Todos os métodos podem ser invocados concorrentemente, e só retornam depois de executar completamente a operação respectiva. Pretende-se que sempre que
apenas um thread possa estar a alterar o conteúdo do vector, caso em que nenhum thread
pode estar a iterar no conteúdo, mas vários possam estar a iterar (já que se trata apenas de
leituras).
1. Apresente o código Java da sua solução, que obviamente tem que garantir que nunca
existem acessos ilegı́timos por vários threads a uma mesma variável. Explique que
variáveis-condição são necessárias para definir o monitor, e qual é a asserção associada
a cada uma. Indique também para cada método pré-condições adequadas.
2. Exprima a propriedade de que “sempre que um thread está a alterar o conteúdo do
vector, não existam threads a ler o conteúdo do vector ” através de uma condição
invariante, e argumente que ela é verdadeira da forma mais rigorosa possı́vel.
IV
Considere a noção de subtipo comportamental estudada nas aulas.
1. Explique o que a noção de subtipo comportamental trás de novo em relação à noção de
subtipo sintático conhecido nas linguagens de programação por objectos, como Java e
C++.
2. Considere as classes Java seguintes:
class Cowboy {
// invariant: even(x);
int x;
Cowboy() { x = 0; }
// pre: odd(y)
void draw(int y) { x = 0; }
void move() { x = x + 2; }
}
class Point {
int x;
// invariant: x >= 0;
Cowboy() { x = 2; }
void draw(int y) { x = y+1; }
void move() { x = 2*x; }
}
Indique, justificando, se Cowboy é um subtipo comportamental de Point, viceversa,
ou se Comboy e Point não são relacionáveis através de subtipificação.
2
Download