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