Aula prática 8

Sumário

Objectivos

Os alunos no final desta aula deverão conhecer:

  1. O essencial da metodologia de desenvolvimento de ciclos de Dijkstra.

Deverão também ser capazes de:

  1. Resolver problemas usando ciclos.
  2. Desenvolver semi-formalmente ciclos correctos usando a metodologia de Dijkstra.
  3. Usar a biblioteca Slang++ para desenvolver pequenos programas interactivos.

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

Utilize sempre a metodologia de desenvolvimento de ciclos de Dijkstra.


1.a)  Desenvolva uma função que devolva true se o valor do argumento natural (i.e., um inteiro positivo) for primo e false no caso contrário.  Recorda-se que um número primo é todo o natural superior a 1 que apenas é divisível por 1 e por si mesmo.

1.b)  Implemente um procedimento que escreva no ecrã todos os números naturais primos entre até n (inclusive), sendo n passado como argumento do procedimento.  Escusa de usar a metodologia de Dijkstra.

1.c)  Escreva um programa que teste as rotinas das alíneas anteriores.

1.d)  Haverá outras formas de escrever o ciclo?  Como?


2.  Desenvolva um programa que calcule e mostre o máximo de um conjunto de n números introduzidos pelo utilizador (o valor n também é introduzido pelo utilizador e assume-se positivo).


3.  Esta é a primeira experiência que fará com a biblioteca Slang++ (ver Manual dos Pacotes), que permite manipular o cursor, o ecrã, o teclado e fazer alguns menus e caixas de diálogo simples.  Para usar esta biblioteca deve incluir no inicio do ficheiro a directiva #include <Slang++/slang.H>.  Neste caso pode excluir a directiva #include<iostream>, dado que o cout e o cin não serão utilizados.  Deve também incluir da directiva de utilização using namespace Slang;.

Para compilar um programa usando a biblioteca Slang++ (assumindo que o seu programa se encontra num ficheiro fonte chamado teste.C) deve substituir no Emacs o comando

make -k teste

por

c++ opções_de_compilação -o teste teste.C -lSlang++ -lUtilitarios -lslang

Tal como na biblioteca padrão do C++, existem os canais para inserção de valores no ecrã e extracção de valores do teclado (cout e cin), também na biblioteca Slang++ existem duas entidades que representam o ecrã e o teclado e que se chamam respectivamente ecra e teclado.

O objectivo deste primeiro exercício é escrever no ecrã, na posição (10, 10) um quadrado de lado 7, feito com caracteres '+'.  Tenha em atenção que, ao contrário da biblioteca normal do C++, neste caso é possível movimentar e posicionar o cursor no ecrã (ou mesmo fora dele), por exemplo:

// Posiciona o cursor na linha 2 coluna 3 a contar do canto superior esquerdo, com
// coordenadas (0,0):
ecra << cursor(2, 3);

// Move o cursor no ecrã na direcção indicada:
ecra << sobeCursor;
ecra << baixaCursor;
ecra << recuaCursor;
ecra << avancaCursor;

// Escreve no ecrã o caracter '+' e avança uma posição:
ecra << '+';
// Escreve no ecrã o caracter '+' e mantém a posição do cursor:
ecra << parado << '+';

// Pára até que seja premida uma tecla e põe a tecla na variável tecla:
teclado.leProximaTeclaDisponivel();
Tecla tecla = teclado.teclaLida();

Para mais exemplos de utilização veja a documentação.

Deve executar os programas escritos usando a biblioteca Slang++ numa consola Xterm.  Prima <alt-f2> e dê o comando xterm.  O manual completo desta biblioteca pode ser consultado em Manual dos Pacotes.  Pode também testar os programas de exemplo que se encontram listados na documentação e que estão disponíveis na distribuição do código fonte (Pacotes-1.0.tar.gz) das bibliotecas que compõe o pacote Pacotes.

Pode também testar o programa exemplo_slang.C em ~/IP/Aula8/exemplo_slang.C para ver como funcionam alguma outras características da biblioteca Slang++.


4.a)  Desenvolva uma função que devolva true caso exista algum múltiplo de k nos inteiros entre m e n e false caso contrário. Assuma que 0 <= m <= n e que 0 < k.

4.b)  Haverá alguma forma mais simples de resolver este problema, sem que seja necessário recorrer a nenhum ciclo?


5.  Desenvolva uma função que permita ao utilizador inserir caracteres sucessivos, terminando com o caractere '!', e devolva quantos dos caracteres introduzidos pelo utilizador são asteriscos ('*').  Crie um pequeno programa para testar esta função.  Exemplo:

Introduza um conjunto de caracteres (termine com '!'):
qwe*98*8w    er*we 112rwq!
Contei 3 asteriscos.

Não precisa de desenvolver o ciclo pela metodologia de Dijkstra.  Limite-se a dizer qual a sua condição invariante.