Você está na página 1de 3

Algoritmos e Estruturas de Dados ISCTE Instituto Universitrio de Lisboa Licenciatura em Informtica e Gesto de Empresas (IGE)

23 de Fevereiro de 2010

Algoritmos e Estruturas de Dados 1 Mini - Teste


Considere a seguinte declarao de tipos Java correspondente a alunos identificados pelo seu nmero mecanogrfico:
public class ALUNO{ private String nome; private float nota; public ALUNO(String nome, float nota){this.nome=nome; this.nota=nota;} public String getnome(){return nome;} public float getnota() {return nota;} }

(1) (6 valores) Desenvolva, pela metodologia de Dijkstra, o mtodo boolean notasordenadas(ALUNO[] pauta, int n) que dada uma pauta de n alunos, verifica se esto todos ordenados por ordem crescente de notas. Justifique todos os passos do desenvolvimento. (2) (8 valores) Prove a correco do comando desenvolvido. (3) (6 valores) Recorrendo ao Clculo de Hoare, mostre que o desenvolvimento proposto pela metodologia de Dijkstra suporta o desenvolvimento de comandos iterativos correctos face sua especificao. Anexo: Regras de Hoare (RV) (RATRIB) (RCS) (RCA) (RCAS) (RCI) (RA) {A};{A} {A[X ]} X = ; {A} {A1} c1 {A2}, ... , {An} cn {An+1} {A1} { c1 ... cn } {An+1} {(AG)} c1 {B}, {(A(G))} c2 {B} {A} if (G) c1 else c2 {B} {(AG)} c {B}, ((A(G)) B) {A} if (G) c {B} {(CIG)} c {CI} {CI} while (G) c {(CI(G))} (A B), {B} c {D} {A} c {D} A, (RC) {A} c {B}, (B D) {A} c {D} (n>0)

(RT)

A teorema da lgica de predicados.

Algoritmos e Estruturas de Dados ISCTE Instituto Universitrio de Lisboa Licenciatura em Informtica e Gesto de Empresas (IGE)

23 de Fevereiro de 2010

Resoluo do 1 Mini - Teste


(1) 1. 2. 3.

4. 5.

6. 7.

{True} notasordenadas {sim=i=1..n-1 pauta[i-1].getnota() pauta[i].getnota()} boolean sim; comando iterativo e portanto: notasordenadas {inic while(G){aco progresso}} CI: CO[n-1 k] 0 k n-1 CI: sim=i=1..k pauta[i-1].getnota() pauta[i].getnota() 0 k n-1 int k; PS: 0 para facilitar a inicializao. inic: {k=0; sim=true;} justificao: {True}inic {CI} G: k == n-1 || !sim justificao: (CIG) CO G: k != n-1 && sim progresso: k = k +1; justificao: para garantir a terminao do ciclo aco: if(pauta[k].getnota()>pauta[k+1].getnota()) sim = false; ou sim = sim && pauta[k].getnota()<=pauta[k+1].getnota(); justificao: {CIG} {aco progresso} {CI}

(2) ?

{True}inic {CI} RATRIB RATRIB RCS 1,2 RT RA 3,4

1. {CI[sim true]} sim=true; {CI} 2. {CI[sim true] [k 0]} k=0; {CI[sim true]} 3. {CI[sim true] [k 0]} {k=0; sim=true;} {CI} 4. True CI[sim true] [k 0] 5. {True} {k=0; sim=true;} {CI}

(CIG) CO RT

1. (CIG) CO

Algoritmos e Estruturas de Dados ISCTE Instituto Universitrio de Lisboa Licenciatura em Informtica e Gesto de Empresas (IGE)

23 de Fevereiro de 2010

{CIG} {aco progresso} {CI}

1. {CI[k k+1]} k=k+1; {CI} RATRIB 2. {CI[k k+1] [sim false]} sim=false; {CI[k k+1]} RATRIB 3. (CIG pauta[k].getnota()>pauta[k+1].getnota())CI[k k+1] [sim false] RT 4. {CIG pauta[k].getnota()>pauta[k+1].getnota()} sim=false; {CI[k k+1]} RA 2,3 5. (CIG pauta[k].getnota() pauta[k+1].getnota())CI[k k+1] RT 6. {CIG} if (pauta[k].getnota()>pauta[k+1].getnota()) sim=false; {CI[k k+1]} RCAS 4,5 7. {CIG} {if (pauta[k].getnota()>pauta[k+1].getnota()) sim=false; k=k+1;} {CI} RCS 1,6

(3) De facto a seguinte argumentao vlida, para uma condio invariante CI escolhida, {CD} inic {CI}, {CIG} {aco prog} {CI}, ((CI (G)) CO) {CD} {inic while(G){aco progresso}} {CO} como se demonstra recorrendo ao Clculo de Hoare: 1 2 3 4 5 6 {CD} inic {CI} {CI G} {aco progresso} {CI} ((CI (G)) CO) {CI} while(G){aco progresso} {CI(G)} {CI} while(G){aco progresso} {CO} {CD} {inic while(G){aco progresso}} {CO} hiptese hiptese hiptese 2, RCI 3, 4, RC 1,5, RCS

Você também pode gostar