Aula prática 4

Sumário

Objectivos

Os alunos no final desta aula deverão conhecer:

  1. As diferenças entre passagem de argumentos por valor e por referência.
  2. A diferença entre definição e declaração.

Deverão também ser capazes de:

  1. Modularizar programas simples com rotinas usando passagem de argumentos por referência onde necessário.
  2. Alterar a ordem da definição das rotinas de um programa usando declarações právias onde necessário.

A aula serve ainda para os alunos avançarem na resolução do Problema 1.

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

Em todos os exercícios deve fazer um pequeno programa de teste que permita testar as rotinas implementadas.  As rotinas implementadas não devem escrever mensagens no ecrã nem ler entradas do teclado (excepto quando tal for o seu objectivo).

Para todos os exercícios que se seguem deve explicitar claramente a pré-condição e a condição objectivo, i.e., o contrato, de todas as rotinas desenvolvidas.


1.a)  Defina todas as variáveis e preencha os parâmetros e tipos de devolução das funções necessárias para o bom  funcionamento do programa ex1.C, que pode encontrar no directório ~/IP/Aula4.  

Lembre-se que as variáveis devem ser definidas, tanto quanto possível, imediatamente antes da sua primeira utilização e de modo a terem o menor âmbito (ou zona de visibilidade) possível, excepto se forem constantes universais.

1.b)  Transfira as definições de todas as funções do programa acima para depois da função main().  Compile o programa.  Interprete os erros e corrija-os sem alterar a posição relativa das definições das funções.


2.a)  Crie uma função que devolva a média de três números de vírgula flutuante passados como argumentos.

2.b)  Crie um procedimento que divida três números de vírgula flutuante pela sua média.  Use a função criada acima para calcular a média.


3.a)  Crie um procedimento que, quando lhe forem passados dois argumentos do tipo char, troque os seus valores.  Coloque o procedimento no programa ex3.C, que se encontra no directório ~/IP/Aula4.

3.b)  Alternativamente, use o procedimento swap() da biblioteca padrão do C++, acrescentando para isso acrescente 

#include <algorithm>

ao início do programa.


4.a)  Escreva um programa que leia uma linha de texto introduzida pelo utilizador e a escreva invertida.  Por exemplo:

Introduza uma linha: gana seca
Ao contrário é: "aces anag"

Use o tipo string para guardar a palavra lida.

4.b)  Escreva uma função bool contem(string const cadeia, char const caractere) que devolva o valor lógico da afirmação "a cadeia cadeia contém o caractere caractere".

4.c)  Escreva uma função numeroDeOcorrencias() que devolva o número de ocorrências de um dado caractere numa dada cadeia.

4.d)  Escreva um procedimento que coloque um dado caractere numa dada cadeia de caracteres em todas as posições em que outro caractere dado ocorra numa outra cadeia de caracteres dada, que tem de ter o mesmo comprimento da cadeia a alterar.  O procedimento pode-se chamar registaAcerto().

4.e)  Escreva uma função que devolva a cadeia de caracteres recebida como argumento mas invertida.  Altere o programa da alínea 4.a) de modo a usar a função.


5.  Desenvolva uma função int notaFinal(int const p1, int const p2, int const tf, int const f, int const e) que, dadas como argumentos as notas parciais de um aluno de Introdução à Programação (i.e., as notas dos problemas, do trabalho final, da frequência e do exame), devolva a sua classificação final na disciplina.  A classificação final da disciplina é calculada como se segue.  A nota da avaliação periódica é a soma ponderada da média das notas dos problemas (com peso 0,2), da nota do trabalho final (peso 0,4) e da nota da frequência (peso 0,4).  A nota final é a maior de entre: (a) a nota da avaliação periódica, (b) a nota da avaliação periódica usando a nota do exame como se da nota da frequência se tratasse, e (c) a nota do exame.  Ou seja, o exame pode ser usado isoladamente ou para melhorar a nota da frequência, optando-se pela solução mais favorável para o aluno.  Se uma prova não tiver sido realizada pelo aluno a nota dessa prova é 0 (zero).


6.  Escreva uma função que permita somar de 0 a 5 valores inteiros dependendo do número de argumentos passados pelo programador consumidor (a soma de zero valores inteiros é zero!).

Para este exercício precisa de saber que é possível criar rotinas cujos parâmetros têm valores por omissão.  Por exemplo, o procedimento

void f(int x, int y, int z = 1)
{
    ...
}

pode ser invocado de duas maneiras:

f(5, 3);  // x é inicializado com o argumento 5, y é inicializado com o
          // argumento 3 e z, à falta de argumento correspondente, é
          // inicializado com valor por omissão 1.

ou

f(5, 3, 4); // x é inicializado com o argumento 5, y é inicializado com o
            // argumento 3 e z é inicializado com o argumento 4.


7.  Crie um procedimento com dois argumentos inteiros que divida ambos os seus parâmetros de entrada por 2.  Ao retornar, o valor do primeiro argumento passado ao procedimento deve ter sido modificado mas o segundo deve manter o seu valor.  Este procedimento serve para alguma coisa?


8.  Defina o procedimento pedeValorPara(), em falta no ficheiro ex8.C do directório ~/IP/Aula4, de modo a que o resultado da execução do programa seja

Introduza o 1º número: 4.0
Introduza o 2º número: 5.3
Introduza o 3º número: 4.2
Introduza o 4º número: 2.1
Introduza o 5º número: 1.7
O resultado é: 17.3.


9.  Desenvolva uma função int operacao(char const operador, int const primeiro_operando, int const segundo_operando) que execute uma das quatro operações aritméticas básicas usando x e y como operandos.  Segue uma lista de possíveis chamadas da função e o seu resultado:

operacao('+', 6, 3) devolve 9.
operacao('-', 6, 3) devolve 3.
operacao('/', 6, 3) devolve 2.
operacao('*', 6, 3) devolve 18.