Aula prática 7

Sumário

Objectivos

Os alunos no final desta aula deverão conhecer:

  1. As instruções de controlo de fluxo iterativas while, for e do while.
  2. A noção de invariante de um ciclo.

Deverão também ser capazes de:

  1. Resolver pequenos problemas usando ciclos.
  2. Seleccionar a instrução de iteração apropriada a cada ciclo.
  3. Deduzir asserções directa ou inversamente para instruções de atribuição e de controlo de fluxo.
  4. Demonstrar semi-formalmente a correcção de ciclos.

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.

Resumo

O resumo da matéria abordada nesta aula prática pode ser consultado aqui.

Exercícios

Demonstre a correcção de todos os ciclos desenvolvidos (veja a secção Prova de correcção de um ciclo do Resumo).  

Se conseguir, use demonstração inversa (partindo da condição objectivo de uma instrução, obtém-se a sua pré-condição mais fraca e depois demonstra-se que esta é implicada pela pré-condição da instrução).  

Se não conseguir, use demonstração directa (partindo da pré-condição de uma instrução, demonstra-se informalmente a condição objectivo dessa mesma instrução).  Faça um pequeno programa de teste para todas as rotinas desenvolvidas.


1.  Escreva uma função que devolva a soma dos primeiros n naturais.  E.g., a invocação somaDosPrimeirosNaturais(2) devolve o valor 3.


2.a)  Escreva uma função que calcule a multiplicação inteira de dois números recorrendo apenas aos operadores aritméticos + e -.  Admite-se que o primeiro argumento passado à função é não-negativo.  (Pode interpretar o produto como um somatório.)

2.b)  Haverá forma mais rápida de progredir no ciclo?  Como?


De ora em diante use sempre demonstração inversa.


3.a)  Escreva uma função que devolva a soma dos primeiros n naturais ímpares.  E.g., a invocação somaDosPrimeirosNaturaisÍmpares(2) devolve o valor 4.

3.b)  Compare o resultado das chamadas às funções desenvolvidas nos exercícios 1. e 3.a) com o resultado das fórmulas n × (n + 1) / 2 e n2.  Conseguirá simplificar as funções?  Que conclui?


4.  Exercícios de contagem simples.  Use, sempre que possível, guardas com o operador !=.  Desenvolva um programa que leia três inteiros m, n e s do teclado (assuma que m <= n e que 0 < s) e construa vários ciclos diferentes de modo a que apareçam sucessivamente no ecrã:

4.a) os números inteiros de m a n exclusive;
4.b) os números inteiros de n a m (ordem decrescente);
4.c) os números inteiros de m a n exclusive de s em s.

Não precisa de demonstrar a correcção dos ciclos.  

4.d)  Conseguiu usar a guarda != em todos estes exercícios?  Porquê?