Aula prática 9

Sumário

Objectivos

Os alunos no final desta aula deverão conhecer:

  1. Os vários tipos de agregados de itens de um mesmo tipo disponibilizados pelo C++.
  2. As vantagens e desvantagens de representar agregados através de matrizes clássicas, vectores ou cadeias de caracteres.

Deverão também ser capazes de:

  1. Definir e utilizar matrizes clássicas, vectores e cadeias de caracteres.
  2. Resolver problemas usando usando matrizes, vectores e cadeias de caracteres.
  3. Desenvolver semi-formalmente, usando a metodologia de Dijkstra, ciclos correctos recorrendo a matrizes clássicas, vectores ou cadeias de caracteres.
  4. 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

Faça programas para testar cada rotina desenvolvida.


1.a)  Crie um procedimento que, dada uma matriz (unidimensional) e a sua dimensão, mostre no ecrã os valores de todos os seus elementos.  Por exemplo, para uma matriz com 4 elementos (com valores 10, 2, 5, -12), o procedimento deve mostrar:

10 2 5 -12

1.b)  Crie um procedimento que, dado um vector de inteiros, mostre no ecrã os valores de todos os seus itens.

1.c)  Crie um procedimento que, dada uma matriz e a sua dimensão, a preencha com valores lidos do teclado.  Teste este procedimento usando o procedimento desenvolvido da alínea 1.a).

1.d)  Crie uma função que dado um número inteiro, que corresponde à dimensão do vector que será devolvido, preencha um vector de inteiros com valores lidos do teclado e o devolva.  Teste esta função usando o procedimento desenvolvido na alínea 1.b).

Não é boa ideia usar uma função na alínea 1.d)!  São de evitar as rotinas dois em um: lê e devolve...  O enunciado destina-se a demonstrar a possibilidade de devolução de vectores.


Use a metodologia de Dijkstra para desenvolver todos os ciclos deste ponto em diante.


2.a)  Desenvolva  uma função que, dada uma matriz de dimensão n, devolva o índice da primeira ocorrência de um dado valor k, sabendo que esse valor existe na matriz (e que portanto 0 < n).

2.b)  Implemente a mesma função da alínea 2.a) usando um vector.

2.c)  Desenvolva uma função que, dado um vector, devolva o índice da primeira ocorrência de um dado valor k, ou o numero de itens no vector caso o valor procurado não exista.  A única diferença entre esta função e a da alínea anterior é que na alínea anterior se garante a existência do valor na matriz.

Repare que os vectores podem variar de tamanho (push_back() acrescenta um item e pop_back() retira um item, ambos no final do vector).  Consegue usar esta informação para simplificar o ciclo usado?


3.  Depois de testar o programa exemplo_slang.C (que pode encontrar em ~/IP/Aula9/exemplo_slang.C) use a biblioteca Slang++ (tal como no exercício da aula anterior) para equipar o programa escrito na exercício 1. da Aula prática 8 com uma interface mais atractiva (e.g., deve escrever apenas 20 primos de cada vez, parando a listagem antes de continuar, pedindo ao utilizador para premir uma tecla).

Não precisa de usar a metodologia de Dijkstra neste exercício.


4.  Use a biblioteca Slang++ para criar um MenuSimples e fazer uma de duas opções: caso escolha a primeira o programa deve fazer um quadrado (como no exercício 3. da Aula prática 8), caso escolha a segunda deve sair.  Caso seja escolhida a opção de fazer um quadrado deve usar uma CaixaDeTexto para pedir ao utilizador o valor do lado do quadrado.

Não precisa de usar a metodologia de Dijkstra neste exercício.


5.  Desenvolva uma função que, dado um vector de inteiros, devolva o maior valor que existe nesse vector.


6.  Desenvolva uma função que, dada um vector de inteiros, devolva verdadeiro caso os valores dos seus itens estejam por ordem crescente no sentido lato (a dimensão do vector pode ser nula ou unitária, pois sequências com 0 ou 1 elementos estão, por definição, por qualquer ordem que se deseje).


Não precisa de usar a metodologia de Dijkstra nos exercícios que se seguem.


7.  Crie um programa que leia do teclado uma frase completa e a mostre no ecrã.  Uma frase é uma sequência de caracteres terminada por um ponto ('.').  A frase escrita no ecrã não deve possuir qualquer fim-de-linha.  Substitua-os por espaços.  Faça uso do método get() para ler um caractere:

char c;
cin.get(c);

cout << "O caractere lido foi: '" << c << "'." << endl;

A frase só deve ser escrita no ecrã depois de se ler o ponto.


8.  Escreva um programa que preencha uma matriz de dimensão n × n dos seguintes modos (os exemplos são para o caso particular de n = 4):

a)

  1  2  3  4
  5  6  7  8
  9 10 11 12
 13 14 15 16

b)

  1  5  9 13
  2  6 10 14
  3  7 11 15
  4  8 12 16

c)

  4  3  2  1
  8  7  6  5
 12 11 10  9
 16 15 14 13

O programa deve mostrar cada uma das matrizes depois de as preencher.  Use o manipulador setw para alinhar os valores (inserir setw(10) no canal de saída cout leva a que a próxima inserção seja ajustada de modo a usar no mínimo 10 caracteres, sendo acrescentados espaços se necessário).