Computação e Programação - fenix.tecnico.ulisboa.pt · Usar expressões numéricas. Problema 1...

25
Computação e Programação 2018/2019 Aulas de Problemas Aula 1 - Introdução ao ambiente MATLAB Aula 2 - Funções pré-definidas e expressões Aula 3 - Vectores e matrizes Aula 4 - Construir scripts Aula 5 - Definir funções Aula 6 - Ficha 1 Aula 7 - Selecção Aula 8 - Iteração Aula 9 - Ficha 2 Aula 10 - Strings, gráficos, e desenvolvimento de programas Aula 11 - Estruturas de dados Aula 12 - Entrada e saída a partir de ficheiros Aula 13 - Ficha 3 Aula 14 - Linguagens compiladas (C++) E ainda…

Transcript of Computação e Programação - fenix.tecnico.ulisboa.pt · Usar expressões numéricas. Problema 1...

Computação e Programação 2018/2019

Aulas de Problemas

Aula 1 - Introdução ao ambiente MATLAB

Aula 2 - Funções pré-definidas e expressões

Aula 3 - Vectores e matrizes

Aula 4 - Construir scripts

Aula 5 - Definir funções

Aula 6 - Ficha 1

Aula 7 - Selecção

Aula 8 - Iteração

Aula 9 - Ficha 2

Aula 10 - Strings, gráficos, e desenvolvimento de programas

Aula 11 - Estruturas de dados

Aula 12 - Entrada e saída a partir de ficheiros

Aula 13 - Ficha 3

Aula 14 - Linguagens compiladas (C++)

E ainda…

Aula 1 - Introdução ao ambiente MATLAB

Objectivos

Usar o MATLAB como calculadora.

Usar o comando format.

Atribuir valores a variáveis do tipo double.

Usar funções pré-definidas.

Usar expressões numéricas.

Problema 1

A função pré-definida sin calcula, e retorna, o seno de um ângulo em radianos. Introduza o

comando help elfun para descobrir a função pré-definida que permite obter o seno de um

ângulo em graus. Teste se essa função devolve o valor 1 quando recebe o valor 90.

Problema 2

Escreva as seguintes expressões em MATLAB, e teste-as:

a) √23

b) 43.2

c) tan 𝜋

Problema 3

Experimente fazer:

>> pi

>> format long

>> pi

>> format short

>> pi

Compare os resultados. Use o comando doc format para obter ajuda. Procure, e utilize, a

opção para format que permitirá depois obter o seguinte resultado:

>> 5/16 + 2/7

ans =

67/112

Problema 4

Crie uma variável que guarde o valor da sua altura. Em seguida, retire 10 centímetros ao valor

guardado. Por fim, adicione meio metro ao valor guardado.

Problema 5

Considere a seguinte função 𝑧 = 𝑓(𝑥, 𝑦):

𝑧 = 𝑥3 − (𝑥 − 𝑦)3

𝑥2 − (𝑥 − 𝑦)2

Crie as variáveis x e y, atribuindo-lhes valores à sua escolha. Depois crie a variável z com o valor

resultante da avaliação da função f para os valores guardados em x e y.

EXERCÍCIOS COMPLEMENTARES

Exercício 1

Prima F1, ou faça:

>> doc

e explore a organização da documentação disponibilizada pelo MATLAB, com particular ênfase

para a informação acedida a partir do tópico MATLAB.

Exercício 2

Tome conhecimento de dois valores especiais no MATLAB, verificando o que acontece ao fazer:

>> 1/0

>> log(0)

>> exp(1000)

>> 0/0

>> inf/inf

Exercício 3

Tome conhecimento de alguns cuidados a ter na identificação de variáveis, verificando o que

acontece ao fazer:

>> sin(pi/2)

>> pi = 0

>> sin(pi/2)

>> sin = 0

>> sin(pi/2)

Para repor a situação original, faça:

>> clear pi sin

Exercício 4

Comece por criar várias variáveis. Faça:

>> save as_minhas_variaveis

Repare que na sua área de trabalho (Current Folder) existe agora um ficheiro chamado

as_minhas_variaveis.mat. Apague as variáveis criadas, fazendo:

>> clear

Confirme que o seu espaço de dados (Workspace) ficou vazio. Faça agora:

>> load as_minhas_variaveis

para confirmar que acabou de recuperar as variáveis guardadas no ficheiro e posteriormente

apagadas. Faça alguns cálculos com elas.

Exercício 5

Comece por fazer:

>> diary aula1

Dê várias instruções na janela de comandos, e faça:

>> diary off

Repare que na sua área de trabalho (Current Folder) existe agora um ficheiro aula1. Abra-o para

confirmar que acabou de gravar uma sessão de trabalho.

Exercícios no livro adoptado

Resolva os seguintes exercícios propostos no livro adoptado:

2ª edição: Capítulo 1 - Exercícios 1 a 13, e 15.

3ª edição: Capítulo 1 - Exercícios 1 a 15, 19, e 29 a 34.

Aula 2 - Funções pré-definidas e expressões

Objectivos

Usar as funções de arredondamento.

Conhecer as capacidades de representação dos tipos numéricos e as possibilidades

para a conversão de valores entre estes tipos de dados.

Usar números pseudoaleatórios.

Usar os códigos inteiros ASCII dos caracteres, e conhecer as conversões implícitas que

os podem envolver.

Usar expressões lógicas.

Problema 1

Utilize o comando help elfun e faça experiências na linha de comando (prompt) do MATLAB

de modo a identificar a eventual diferença de resultado entre:

a) fix(3.5) e floor(3.5)

b) fix(3.4) e fix(-3.4)

c) fix(3.2) e floor(3.2)

d) fix(-3.2) e floor(-3.2)

e) fix(-3.2) e ceil(-3.2)

Problema 2

Utilize intmin e intmax para determinar o intervalo de valores que os tipos uint32 e

uint64 permitem representar.

Problema 3

Utilize help para descobrir se existem equivalentes a intmin e intmax para os tipos que

permitem representar números reais.

Problema 4

Guarde um valor com casas decimais numa variável de tipo double (acontece por omissão).

Converta o valor guardado na variável para o tipo int32 e guarde o resultado numa nova

variável.

Problema 5

Crie um número (pseudo)aleatório:

a) real pertencente a [0, 1];

b) real pertencente a [0, 20];

c) real pertencente a [20, 50];

d) inteiro pertencente a [1, 10];

e) inteiro pertencente a [50, 100].

Problema 6

As letras do alfabeto encontram-se ordenadas na tabela de códigos ASCII, ou seja, o 'a' está

antes do 'b' e o 'A' está antes do 'B'. Qual a ordem entre maiúsculas e minúsculas? As

minúsculas estão antes ou depois das maiúsculas?

Problema 7

Antecipe quais os resultados das seguintes expressões? (confirme depois no MATLAB):

a) 'b' >= 'c' – 1

b) 3 == 2 + 1

c) (3 == 2) + 1

d) xor(5 < 6, 8 > 4)

EXERCÍCIOS COMPLEMENTARES

Exercício 1

Tome conhecimento de algumas limitações das representações habituais dos números reais

(neste caso, do tipo double), verificando o que acontece ao fazer:

>> 0.7 - 0.6 == 0.1

>> sin(pi) == 0

>> sin(pi) - 0 < eps

>> help eps

Exercício 2

Tome conhecimento de alguns perigos na utilização de números inteiros guardados em tipos

inteiros (neste caso, no tipo int32), verificando o que acontece ao fazer:

>> numReal = int32(3) / 2

>> whos numReal

Exercícios no livro adoptado

Resolva os seguintes exercícios propostos no livro adoptado:

2ª edição: Capítulo 1 - Exercícios 14, e 16 a 21; Capítulo 3 - Exercício 1.

3ª edição: Capítulo 1 - Exercícios 16 a 18, e 20 a 28.

Aula 3 - Vectores e matrizes

Objectivos

Usar o operador “dois pontos” ou a função linspace para criar um vector.

Criar uma matriz.

Alterar ou apagar elementos de um array (vector ou matriz).

Referenciar uma parte de um array.

Usar um array como argumento numa chamada a uma função pré-definida.

Usar operadores "elemento a elemento" (ou de array).

Usar vectores lógicos e indexação lógica.

Problema 1

Crie os seguintes vectores linha usando o operador “dois pontos” e a função linspace.

a) -5 -4 -3 -2 -1

b) 5 7 9

c) 8 6 4

Problema 2

Escreva uma expressão para obter (apenas) os elementos em posições ímpares de um vector v.

Teste a expressão com um vector de tamanho par e outro de tamanho ímpar (quaisquer).

Escreva uma instrução para apagar os elementos nas posições pares de um vector v. Teste-a.

Problema 3

Crie a seguinte matriz sem escrever todos os valores directamente:

mat =

7 8 9 10

12 10 8 6

Escreva as expressões para referenciar as seguintes partes da matriz:

a) elemento na primeira linha e na terceira coluna;

b) segunda linha;

c) primeiras duas colunas.

Problema 4

Crie uma matriz 3 x 5 com números reais aleatórios. Escreva uma instrução para remover a

terceira linha.

Problema 5

Crie um vector x com 21 valores igualmente espaçados entre 𝛑 e –𝛑. Crie um vector y com os

valores do seno para os valores correspondentes no vector x.

Nota: É frequente a construção de um gráfico 2D começar desta maneira, sendo que os vectores

x e y contêm as coordenadas dos pontos a representar. Repare que, neste caso (como em muitos

outros) seria sempre conveniente escolher um número ímpar de pontos. Para o confirmar, faça

plot(x, y).

Problema 6

Crie uma matriz 3 x 5 com números inteiros aleatórios entre –10 e 5. Crie outra matriz que

guarde em cada elemento o valor absoluto do elemento correspondente na primeira matriz.

Problema 7

Usando apenas uma instrução, determine o resultado da soma abaixo, começando por criar um

vector para os numeradores e outro para os denominadores.

3

10 +

5

9 +

7

8 +

9

7

Problema 8

Crie um vector com cinco números inteiros aleatórios entre -10 e 5. Escreva as expressões para

obter desse vector:

a) todos os elementos subtraídos de três unidades;

b) a contagem de quantos elementos são positivos;

c) todos os elementos em valor absoluto;

d) o valor máximo;

e) o somatório dos elementos positivos.

EXERCÍCIOS COMPLEMENTARES NO LIVRO ADOPTADO

Nota prévia: Os arrays tridimensionais (“three-dimensional matrices”, no livro) não fazem parte

do programa na sua vertente prática. Em todo o caso, a sua utilização segue a lógica dos arrays

bidimensionais (as matrizes). Se os alunos quiserem praticar esta matéria não perdem nada com

isso.

Resolva os seguintes exercícios propostos no livro adoptado:

2ª edição: Capítulo 1 - Exercícios 22 a 42 (o exercício 41 é sobre arrays

tridimensionais).

3ª edição: Capítulo 1 - Exercício 23; Capítulo 2 - Exercícios 1 a 44 (os exercícios 18 e 19

são sobre arrays tridimensionais).

Aula 4 - Construir scripts

Objectivos

Usar a função input.

Usar a função fprintf.

Construir gráficos 2D.

Construir um script.

Usar as funções load e save para ler e escrever em ficheiros de texto.

Problema 1

A função input pode ser usada para receber um vector. Por exemplo:

>> vec = input(['Introduza um vector ' ...

'usando uma expressão válida em MATLAB: '])

Introduza um vector usando uma expressão válida em MATLAB: 4:7

vec =

4 5 6 7

Experimente a entrada de vectores e matrizes usando a função input.

Nota: Salvo situações muito excepcionais, este tipo de utilização da função input é uma

péssima opção, porque o programador está a contar que o utilizador conheça a linguagem

MATLAB. Por outro lado, só num contexto didáctico é que faz sentido usar a função input na

janela de comandos.

Problema 2

Experimente a função fprintf para mostrar números reais com diferentes formatações para

o número total de casas utilizadas e número de casas decimais mostradas. Faça as suas

experiências com a notação decimal e com a notação científica.

Problema 3

Mostre em dois gráficos separados a função seno no domínio entre 0 e 𝛑. Um dos gráficos deve

resultar da utilização para as abcissas de um vector com 11 valores, e o outro gráfico de um

vector com 101 valores.

Nota: Recorda-se a habitual conveniência em se escolher um número ímpar de pontos (a que

corresponderá um número par de intervalos).

Problema 4

Um ficheiro reais.dat foi criado para ser usado numa experiência. No entanto, o ficheiro contém

números reais, quando o que se desejava era que fossem inteiros. Por outro lado, o ficheiro não

está no formato correcto; os valores estão organizados por colunas em vez de por linhas. Por

exemplo, se o ficheiro tiver o conteúdo:

90.5792 27.8498 97.0593

12.6987 54.6882 95.7167

91.3376 95.7507 48.5376

63.2359 96.4889 80.0280

9.7540 15.7613 14.1886

o que se pretende é:

91 13 91 63 10

28 55 96 96 16

97 96 49 80 14

Comece por criar um ficheiro reais.dat no formato "reais por colunas". Seguidamente, escreva

um script que leia os dados de reais.dat para uma matriz, arredonde os números, e escreva a

matriz no formato "inteiros por linhas" num ficheiro chamado inteiros.dat.

EXERCÍCIOS COMPLEMENTARES NO LIVRO ADOPTADO

Resolva os seguintes exercícios propostos no livro adoptado:

2ª edição: Capítulo 2 - Exercícios 1 a 22, e 38 a 40.

3ª edição: Capítulo 3 - Exercícios 1 a 23, e 42.

Aula 5 - Definir funções

Objectivos

Definir uma função.

Invocar uma função previamente definida a partir de um script.

Problema 1

Defina uma função meiasDuzias que receba dois inteiros positivos, e devolva (retorne) uma

matriz com o número de linhas coincidente com o primeiro valor recebido e o número de

colunas coincidente com o segundo valor recebido, e em que todos os seus elementos sejam

iguais a 6.

Problema 2

Desenvolva um predicado divisivelPor5 que receba um inteiro, e retorne (devolva) o valor

lógico true se o valor recebido for divisível por 5, ou o valor lógico false se não o for. Não

utilize instruções de selecção.

Problema 3

Defina uma função para receber um vector e devolver (retornar) um dos valores guardados no

vector, escolhido aleatoriamente.

Problema 4

O custo C de produção de n unidades de um determinado produto numa fábrica é dado pela

seguinte equação:

𝐶(𝑛) = 5 𝑛2 + 44 𝑛 + 11

Escreva uma função calculaCusto para receber o número de unidades a produzir e retornar

(devolver) o respectivo custo. Escreva um script progCalculaCusto para:

Obter do utilizador o número n de unidades a produzir.

Chamar a função calculaCusto para obter o custo de produzir as n unidades.

Dar o resultado ao utilizador tal como se mostra em baixo.

>> progCalculaCusto

Introduza o número de unidades: 100

O custo para produzir 100 unidades é 54411.00 €.

EXERCÍCIOS COMPLEMENTARES NO LIVRO ADOPTADO

Resolva os seguintes exercícios propostos no livro adoptado:

2ª edição: Capítulo 2 - Exercícios 23 a 37; Capítulo 3 - Exercícios 18 a 20.

3ª edição: Capítulo 3 - Exercícios 24 a 41.

Aula 6 - Ficha 1

Objectivos

Incentivar os alunos a distribuir o seu estudo autónomo ao longo de todo o semestre.

Fornecer aos alunos uma oportunidade para avaliarem o estado actual dos seus

conhecimentos.

Ficha 1

Veja aqui o enunciado de uma ficha-tipo.

Aula 7 - Selecção

Objectivos

Usar as instruções de selecção if e switch.

Usar a função menu.

Problema 1

Escreva uma função calculaCateto que, aplicando o teorema de Pitágoras, receba os

valores de um cateto e da hipotenusa, e que calcule e retorne o valor do outro cateto. Teste a

função. Escreva um script cujo propósito essencial é:

Obter do utilizador os valores de um cateto e da hipotenusa.

Chamar a função calculaCateto.

Mostrar o resultado da função ao utilizador.

No entanto, se o utilizador tiver fornecido algum dos valores igual ou inferior a zero, em vez do

resultado da função, o script deverá mostrar ao utilizador uma mensagem de erro. Teste o script.

Nota: Quando um algoritmo interage com o utilizador e este lhe fornece dados inapropriados, a

forma correcta do algoritmo lidar com isso é informar o utilizador sobre o que aconteceu e pedir-

lhe os dados de novo; e não mostrar uma mensagem de erro e terminar.

Problema 2

Escreva um script que comece por pedir ao utilizador um valor para a variável x. A seguir, usando

a função menu, o script deverá fornecer ao utilizador a possibilidade de escolher uma das

seguintes opções: “sin(x)”, “cos(x)”, ou “tan(x)”. Finalmente, o script deverá imprimir o valor da

função de x que o utilizador tiver escolhido. Depois de testar o script com sucesso, redefina-o

utilizando a instrução if se antes utilizou switch, ou vice-versa.

Problema 3

Escreva (e teste) uma função para receber dois vectores numéricos (do mesmo tipo) e devolver

uma matriz. Esta matriz deverá ser composta por duas linhas. Os elementos na primeira linha

da matriz deverão coincidir com os do primeiro vector recebido e os da segunda linha com os

do segundo vector. Se os vectores não tiverem o mesmo tamanho, então deverão ser

acrescentados zeros para preencher os últimos elementos necessários na linha da matriz

correspondente ao vector mais pequeno.

EXERCÍCIOS COMPLEMENTARES NO LIVRO ADOPTADO

Resolva os seguintes exercícios propostos no livro adoptado:

2ª edição: Capítulo 3 - Exercícios 1 a 37.

3ª edição: Capítulo 4 - Exercícios 1 a 35.

Aula 8 - Iteração

Objectivos

Usar as instruções de ciclo for e while.

Usar ciclos com inicialização.

Usar ciclos aninhados.

Problema 1

Desenvolva um script para pedir o valor do raio de um círculo ao utilizador e mostrar-lhe a área

desse círculo, assegurando que o utilizador introduz um valor positivo.

Problema 2

O inverso da constante matemática e pode ser aproximado através de:

1

𝑒≈ (1 −

1

𝑛)

𝑛

Escreva um script que percorra (itere) os valores de n até que a diferença entre a aproximação

e o valor pré-definido seja inferior a 0.0001. O script deverá então imprimir no ecrã, com quatro

casas decimais, o valor de e-1 pré-definido e a aproximação encontrada. Deverá também

imprimir o valor de n necessário para obter a precisão requerida.

Problema 3

Escreva uma função que receba um vector e que mostre os seus elementos ao utilizador mas

usando uma frase. Por exemplo, se a função tiver recebido o vector:

>> vec = [5.5, 11, 3.45];

o resultado seria este:

O elemento 1 é 5.50.

O elemento 2 é 11.00.

O elemento 3 é 3.45.

Problema 4

Desenvolva um script para mostrar no ecrã a matriz transposta de uma matriz guardada na

variável mat, sem recorrer à transposição disponível no MATLAB.

Nota: A menos de versões provisórias, ainda com o código incompleto, um script não deve operar

sobre variáveis definidas fora do seu código.

EXERCÍCIOS COMPLEMENTARES

Exercício 1

Desenvolva uma função sem parâmetros (equivale a um script, mas com variáveis locais) que

use a função menu para apresentar ao utilizador duas opções: “Lançar um dado” (i.e., gerar um

pseudo-aleatório entre 1 e 6, que será imediatamente mostrado na janela de comandos), e

“Sair” (i.e., terminar a execução da função). O menu deverá permanecer disponível para o

utilizador lançar o dado quantas vezes quiser.

Nota: Nesta cadeira as funções sem parâmetros são preferidas aos scripts. Esta troca, para além

de “forçar” a utilização de variáveis locais (não interferindo com eventuais dados guardados no

workspace), permite incluir funções locais directamente (o que, em muitos casos, pode ser

conveniente).

Exercícios no livro adoptado

Nota prévia: A vectorização é a resolução de problemas que requerem iteração sem recurso a

instruções de repetição (as instruções for e while). Na vectorização, a iteração é executada

de um modo implícito através da utilização de funções e operadores pré-definidos adequados.

Regra geral, a vectorização é mais eficiente, mas é específica da linguagem MATLAB. Nesta

cadeira, os conhecimentos mais avançados sobre vectorização são considerados secundários.

Resolva os seguintes exercícios propostos no livro adoptado:

2ª edição:

o Capítulo 4 - Exercícios 1 a 34 (o exercício 15 é sobre vectorização);

o Capítulo 5 - Exercícios 1 a 19 (com excepção do exercício 17, todos os

exercícios são sobre vectorização).

3ª edição: Capítulo 5: Exercícios 1 a 9 e 12 a 48 (os exercícios 31 a 36 são sobre

vectorização).

Aula 9 - Ficha 2

Objectivos

Incentivar os alunos a distribuir o seu estudo autónomo ao longo de todo o semestre.

Fornecer aos alunos uma oportunidade para avaliarem o estado actual dos seus

conhecimentos.

Ficha 2

Veja aqui o enunciado de uma ficha-tipo.

Aula 10 - Strings, gráficos e programas

Objectivos

Manipular strings.

Usar a função plot.

Desenvolver programas recorrendo a decomposição funcional.

Problema 1

Escreva uma função converte para receber uma frase e devolver uma palavra composta pelas

letras iniciais de cada palavra na frase recebida. Por exemplo:

>> frase = 'Maria acha importante ler';

>> m = converte(frase)

m =

Mail

Problema 2

Escreva uma função sem parâmetros de entrada e com um parâmetro de saída. A função deverá

obter do utilizador um inteiro maior do que zero, e devolver esse valor. Garanta que o utilizador

é obrigado a introduzir um inteiro maior que zero.

Nota 1: Esta é uma das poucas situações (casos semelhantes à função input) onde uma função

a operar simultaneamente por retorno e por efeito colateral pode ser considerada uma boa

opção.

Nota 2: Este algoritmo tem muitas semelhanças com o do Problema 1 da Aula 8.

Problema 3

O valor total V acumulado (juros + capital) a pagar no final de um empréstimo E contraído por n

anos, cujo juro é capitalizado anualmente a uma taxa t, é calculado por:

𝑉 = 𝐸 (1 + 𝑡)𝑛

Escreva uma função que receba o capital emprestado, a taxa de juro, e o número máximo de

anos possível de ser considerado para a duração do empréstimo. A função deverá mostrar num

gráfico a evolução do valor acumulado a pagar no final em função da duração do empréstimo,

começando em um e terminando na duração máxima recebida.

Problema 4

Utilizando as duas funções anteriores, desenvolva um programa para pedir ao utilizador um

montante inicial, uma taxa de juro, e uma duração máxima (inteiro positivo), e que, como

resultado, mostre um gráfico com a evolução do valor acumulado a pagar no final em função da

duração do empréstimo, começando em um e terminando na duração máxima introduzida.

Nota: No livro adoptado está escrito que, tipicamente, um programa em MATLAB consiste num

script que chama funções. De um modo mais geral, um programa pode ser um qualquer

algoritmo (script ou função) que possa ser executado independentemente, quer chame ou não

outros algoritmos (scripts ou funções).

EXERCÍCIOS COMPLEMENTARES NO LIVRO ADOPTADO

Nota prévia 1: Não sendo variáveis globais, as variáveis persistentes acabam por ser uma forma

restrita de “globalizar” variáveis. No plano didáctico, entende-se que a utilização prática de

variáveis globais, ou qualquer aproximação a isso, é inconveniente numa cadeira deste tipo. Em

todo o caso, os alunos podem praticar esta matéria, se o entenderem.

Nota prévia 2: Nos exercícios sobre gráficos, e por ser essa a matéria considerada mais

importante para a cadeira, privilegie os exercícios que envolvem as funções plot, subplot, e

bar.

Resolva os seguintes exercícios propostos no livro adoptado:

2ª edição:

o Capítulo 6 - Exercícios 1 a 38 (os exercícios 35 a 38 envolvem variáveis

persistentes);

o Capítulo 7 - Exercícios 1 a 35 (os exercícios 33 e 34 envolvem variáveis

persistentes);

o Capítulo 11 - Exercícios 1 a 37.

3ª edição:

o Capítulo 5 - Exercícios 10 e 11;

o Capítulo 6 - Exercícios 1 a 35 (os exercícios 26 a 29 envolvem variáveis

persistentes);

o Capítulo 7 - Exercícios 1 a 37 (os exercícios 8 e 9 envolvem variáveis

persistentes);

o Capítulo 11 - Exercícios 1 a 32.

Aula 11 - Estruturas de dados

Objectivos

Utilizar arrays de células (tipo cell).

Utilizar estruturas (tipo struct).

Problema 1

Considere três variáveis para guardar três arrays de células de strings, contendo: (1) nomes de

pessoas, (2) verbos (e preposições), e (3) substantivos. Por exemplo:

nomes = {'Maria', 'João', 'Carlota'};

verbos = {'come', 'gosta de'};

substantivos = {'caracóis', 'peixes-aranha', 'minhocas'};

Escreva um script para inicializar estas variáveis e para mostrar uma frase composta por um

elemento de cada array escolhida aleatoriamente (por exemplo, “Maria gosta de caracóis”).

Problema 2

Um número complexo tem a forma 𝑎 + 𝑖𝑏, onde a representa a parte real, b a parte imaginária,

e 𝑖 = √−1. Escreva um script que peça, separadamente, para o utilizador introduzir os valores

das partes real e imaginária de um número complexo, e que as armazene numa só variável,

utilizando uma estrutura. Depois, usando a estrutura criada, o script deve mostrar o valor da

parte real, seguido de “+ i”, e do valor da parte imaginária. Por exemplo, se o script se chamar

numComplexoEstrutura, executá-lo pode resultar no seguinte:

>> numComplexoEstrutura

Introduza a parte real: 2.1

Introduza a parte imaginária: 3.3

O número complexo é 2.1 + i3.3

Nota: Embora esteja fora do âmbito desta cadeira, o MATLAB permite lidar directamente com

números complexos sem ser necessário usar estruturas para os representar.

Problema 3

Modifique o script anterior para que este (1) invoque uma função para pedir os dados ao

utilizador e criar a estrutura com o número complexo, e (2) invoque outra função para mostrar

o número complexo no ecrã. Escreva as duas funções utilizadas pelo script.

EXERCÍCIOS COMPLEMENTARES NO LIVRO ADOPTADO

Resolva os seguintes exercícios propostos no livro adoptado:

2ª edição: Capítulo 8 - Exercícios 1 a 29.

3ª edição: Capítulo 8 - Exercícios 1 a 28.

Aula 12 - Entrada e saída a partir de ficheiros

Objectivos

Desenvolver programas com entrada e saída a partir de ficheiros de texto simples.

Problema 1

Escreva um script para pedir ao utilizador o nome de um ficheiro válido para leitura. O objectivo

do script será, utilizando um ciclo, garantir que o ficheiro indicado poderá de facto ser aberto

com sucesso.

Nota: Este algoritmo tem muitas semelhanças com o do Problema 1 da Aula 8 e com o do

Problema 2 da Aula 10.

Problema 2

No contexto de uma experiência médica, os nomes e pesos de alguns pacientes foram guardados

num ficheiro pacientesPesos.dat. Por exemplo, o ficheiro pode guardar a seguinte informação:

João Ratão 88.8

Ana Rita 66.6

Rita João 55.5

João Rita 77.7

Primeiro, crie este ficheiro. Depois, escreva um script lerPacientesPesos que comece por

tentar abrir o ficheiro. Se não for possível, deverá ser mostrada uma mensagem de erro. Se for

possível, usando a função fgetl ou a função fgets, o ficheiro deverá ser lido linha a linha.

Para cada linha lida, os dados lidos deverão ser apresentados no ecrã, mas utilizando o formato:

Último_nome, Primeiro_nome Peso

O peso médio deverá ainda ser mostrado no final.

Problema 3

Altere o Problema 2 por forma a que os dados apresentados no ecrã passem a ser enviados para

um ficheiro de texto pacientesPesos2.dat.

Problema 4

Altere o Problema 3 por forma a que os dados deixem de ser lidos linha a linha e passem a ser

lidos, de uma só vez, com a função textscan.

Nota: Quando se usa a função textscan para ler uma coluna de números inteiros é habitual

usar-se o especificador %d para o efeito. Como consequência, a respectiva coluna fica num array

do tipo int32. A utilização de tipos inteiros pode trazer problemas, o que será facilmente evitado

se se usar antes o especificador %f.

EXERCÍCIOS COMPLEMENTARES

Exercício 1

Altere o Problema 4 por forma a incorporar nele o Problema 1. Pretende-se agora que o novo

script peça ao utilizador o nome do ficheiro a ler até que o consiga abrir com sucesso. O ficheiro

escrito deverá ter um nome semelhante ao ficheiro lido.

Exercício 2

Altere o Exercício 1 por forma a que o utilizador possa agora introduzir o nome do ficheiro sem

extensão desde que esta seja .dat (assuma que, em qualquer caso, o ficheiro terá sempre uma

extensão).

Exercício 3

Altere o Exercício 2 por forma a que a obtenção do nome do ficheiro esteja a cargo de uma

função local (o que implica que o script tenha de passar a ser uma função sem parâmetros).

Exercícios no livro adoptado

Resolva os seguintes exercícios propostos no livro adoptado:

2ª edição: Capítulo 9 - Exercícios 1 a 31.

3ª edição: Capítulo 9 - Exercícios 1 a 35.

Aula 13 - Ficha 3

Objectivos

Incentivar os alunos a distribuir o seu estudo autónomo ao longo de todo o semestre.

Fornecer aos alunos uma oportunidade para avaliarem o estado actual dos seus

conhecimentos.

Ficha 3

Veja aqui o enunciado de uma ficha-tipo.

Aula 14 - Linguagens compiladas (C++)

Objectivos

Aprender a usar o Code::Blocks para desenvolver programas de consola em C++.

Desenvolver um programa de consola.

Usar entrada e saída de dados com a consola.

Definir e invocar uma função.

Usar a instrução if.

Usar as instruções while e for.

Usar a classe “vector” da “Standard Library.”

Desenvolver programas recorrendo a decomposição funcional.

Executar um programa a partir do sistema operativo.

Problema 1 (adaptado de Aula 7 - Problema 1)

Escreva uma função calculaCateto que, aplicando o teorema de Pitágoras, receba os

valores de um cateto e da hipotenusa, e que calcule e retorne o valor do outro cateto. Escreva

um programa para:

Obter do utilizador os valores de um cateto e da hipotenusa.

Chamar a função calculaCateto.

Mostrar o resultado da função ao utilizador. Se o utilizador tiver fornecido algum dos

valores igual ou inferior a zero, então, em vez do resultado, deverá ser-lhe mostrada

uma mensagem de erro.

Teste o programa (e a função). Execute o programa a partir do sistema operativo.

Nota 1: Em C++, para o código ter acesso às funções matemáticas elementares (e.g., a função

sqrt) é necessário escrever a directiva

#include <cmath>

Nota 2: Repetindo o que já ficou escrito antes, quando um algoritmo interage com o utilizador e

este lhe fornece dados inapropriados, a forma correcta do algoritmo lidar com isso é informar o

utilizador sobre o que aconteceu e pedir-lhe os dados de novo; e não mostrar uma mensagem de

erro e terminar.

Problema 2 (adaptado de Aula 8 - Problema 1)

Desenvolva um programa para pedir o valor do raio de um círculo ao utilizador e mostrar-lhe a

área desse círculo, assegurando que o utilizador introduz um valor positivo. Execute o programa

a partir do sistema operativo.

Nota: Em C++, o valor da constante matemática π não está disponível directamente. Para o

poder usar pode-se definir uma constante pi através da instrução

const double pi = 3.1415926535897;

Problema 3 (adaptado de Aula 8 - Problema 3)

Escreva uma função que receba um vector e que mostre os seus elementos ao utilizador mas

usando uma frase. Por exemplo, se a função tiver recebido o vector:

std::vector<double> v(3, 0); v[0] = 5.5; v[1] = 11; v[2] = 3.45;

o resultado seria este:

O elemento 1 é 5.50.

O elemento 2 é 11.00.

O elemento 3 é 3.45.

Nota: Em C++, para o código poder usar vectores de um modo cómodo está definida uma classe

vector na biblioteca padrão. Para se poder usar esta classe, tem de se escrever a directiva

#include <vector>

Uma vez incluída a classe vector, o tamanho de um vector é obtido através do método size.

Por exemplo, o tamanho do vector vec é dado por vec.size().

EXERCÍCIOS COMPLEMENTARES

Alguns dos exercícios do livro adoptado podem ser adaptados para ser desenvolvidos em C++.

Por outro lado, é muito fácil encontrar na internet tutoriais de C++.

E ainda…

Os exercícios do livro adoptado atrás recomendados cobrem quase toda a matéria prática para

os exames. Ficou a faltar apenas a matéria avançada sobre funções. Assim, faz-se ainda a

seguinte recomendação aos alunos:

EXERCÍCIOS COMPLEMENTARES NO LIVRO ADOPTADO

Resolva os seguintes exercícios propostos no livro adoptado:

2ª edição: Capítulo 10 - Exercícios 1 a 30 (com especial relevo para os exercícios 1 a 5,

e 8, sobre funções anónimas);

3ª edição: Capítulo 10 - Exercícios 1 a 30 (com especial relevo para os exercícios 1 a 6,

sobre funções anónimas).