computação e programação - fenix.tecnico.ulisboa.pt · aula 4 - construir scripts aula 5 -...
TRANSCRIPT
Computação e Programação 2017/2018
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 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
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 colunas 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 =
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).