exercícios de computação2 feup — licenciatura em eng. civil — computação •os exercícios...

36
Exercícios de Computação Secção de Matemática Departamento de Engenharia Civil FEUP 2005–2006

Upload: others

Post on 16-Nov-2020

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

Exercícios de

Computação

Secção de Matemática

Departamento de Engenharia Civil

FEUP

2005–2006

Page 2: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

2 FEUP — Licenciatura em Eng. Civil — Computação

• Os exercícios marcados com o símbolo � foram retirados de exames da disciplina.

• Os exercícios marcados com o símbolo † são complementares à aula.

Page 3: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

1. Algoritmos 3

1 Algoritmos

1.1 Para cada uma dos seguintes algoritmos, simule a sua execução e indique qual o con-teúdo final das variáveis em causa.

(a) a← 3b← 2

c←√

a2 + b2

(b) a← 2b← 7t← aa← bb← t

(c) x← 3y ← (x− 1)× (x + 2)y ← (y − 1)× (y + 1)

(d) x← 2x← 1/(1 + x)x← 1/(2 + x)x← 1/(3 + x)

(e) x← 0.5y ← x + 1y ← y × x + 2y ← y × x + 3y ← y × x + 4

(f) N ← 567a← mod(N, 10)N ← int(N/10)b← mod(N, 10)c← int(N/10)

(g) a← 2b← 1c← −3d← b2 − 4acse d < 0 então

escreve “equação impossível”senão

x1 ← (−b +√

d)/(2a)

x2 ← (−b−√

d)/(2a)escreve x1, x2

fim

(h) N ← 123M ← 0enquanto N 6= 0 fazer

M ← 10×M + mod(N, 10)N ← int(N/10)

fim de ciclo enquanto

(i) f ← 1para n desde 2 até 7 fazer

f ← f × nfim de ciclo em n

(j) n← 1f ← 1enquanto f < 1000 fazer

n← n + 1f ← f × n

fim de ciclo enquanto

1.2 Para trocar os valores de duas variáveis a e b basta usar uma terceira variável “tempo-rária” t e efectuar as atribuições t← a, a← b, b← t.

Escreva uma sequência de acções que troque os valores de quatro variáveis (a, b, c, d)entre si de forma a obter (b, c, d, a). Dito de outra forma, o valor final de a deveráser o valor original de b, etc. Tente usar o menor número de atribuições e variáveistemporárias.

Page 4: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

4 FEUP — Licenciatura em Eng. Civil — Computação

1.3 Escreva um algoritmo correspondente a cada um dos seguintes problemas:

(a) Escreva os múltiplos pares de 7 menores do que 2000.

(b) Dado um número detectar se é múltiplo par de 7.

(c) Escreva as capicuas pares com 3 algarismos.

(d) Dado um número com 3 algarismos detectar se é capicua.

(e) Dado um número inteiro detectar se é capicua.

1.4 O algoritmo de Euclides permite calcular o máximo divisor comum de dois númerosnaturais a, b: o maior número inteiro que divide simultaneamente a e b. Recorde aindaque “mod(a, b)” é o resto da divisão inteira de a por b (a ≥ b).

Algoritmo de Euclides: máximo divisor comum entre a e b(o resultado é o valor final de b)r ← mod(a, b)enquanto r 6= 0 fazer:

a← bb← rr ← mod(a, b)

fim de ciclo enquanto

(a) Utilize o algoritmo indicado para calcular o mdc(76,34) e mdc(224,7). Quantasvezes executou o ciclo “enquanto. . . ” no algoritmo em cada um dos casos?

(b) Modifique o algoritmo para determinar se os dois números a, b são primos entresi, i.e., se o seu máximo divisor comum é 1.

(c) Modifique o algoritmo para calcular o mínimo múltiplo comum entre a e b, usandoa relação mmc(a, b) = (a× b)/mdc(a, b).

1.5 O algoritmo seguinte compara dois valores dados em a, b e coloca em m o maior deles:

ler a, bse a > b então m← a senão m← bfim

Baseando-se neste algoritmo escreva outros algoritmos que:

(a) Dados três valores a, b, c coloque em m o maior deles.

(b) Dados três valores a, b, c colocar em m1 o maior deles e em m2 colocar o menordeles.

(c) Dados três valores a, b, c coloque em m o valor do meio (por exemplo: se fossea ≤ b ≤ c então deveria ficar m = b).

Page 5: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

1. Algoritmos 5

1.6 Escreva um algoritmo correspondente a cada um dos seguintes problemas:

(a) Determinar o maior de 2 valores dados em a e b.

(b) Determinar o maior de 3 valores.

(c) Determinar o maior de n valores.

1.7 Escreva um algoritmo correspondente a cada um dos seguintes problemas:

(a) Adicionar 2 valores dados em a e b.

(b) Adicionar 3 valores.

(c) Adicionar n valores.

1.8 Escreva um algoritmo correspondente a cada um dos seguintes problemas:

(a) Multiplicar 2 valores dados em a e b.

(b) Multiplicar 3 valores.

(c) Multiplicar n valores.

1.9 Escreva um algoritmo que determine o produto escalar de 2 vectores com:

(a) 3 componentes.

(b) n componentes.

1.10 Escreva um algoritmo que, dada uma sequência com n números, indique quantos equais os elementos (ordem na sequência) que são maiores do que a soma dos seusvizinhos.

(a) Considere que os extremos não estão incluídos.

Exemplo: 8, 2, 4, 1, 6, 12, 5, 9 (Resposta: 2, o 3oe o 6o)

(b) Considere que os extremos estão incluídos e que só têm um vizinho.

Exemplo: 8, 2, 4, 1, 6, 12, 5, 9 (Resposta: 4, o 1o, o 3o, o 6oe o 8o)

1.11 Escreva um algoritmo que, dada uma sequência de n inteiros positivos, a reordene demodo a obter os pares à direita e os ímpares à esquerda.

1.12 Escreva um algoritmo que resolva um sistema:

(a) triangular inferior.

(b) triangular superior.

Nota: Comece por resolver o sistema

2x1 = 2x1 −x2 = 0x1 +x2 +2x3 = 4

Page 6: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

6 FEUP — Licenciatura em Eng. Civil — Computação

2 Matlab

2.1 Diga quais dos seguintes nomes são válidos para variáveis Matlab, justificando a suaresposta:

Velocidade João Maria alpha

1z2 z12 alpha_12 N/4

Este_nome_tem_muitas_letras X-1 _1G X&Y

Albert Einstein X$ PI 1.23E14

2.2 Em Matlab foram atribuidas as variáveis seguintes:

a=2, b=3, c=5, d=7

Qual o valor de cada uma das expressões:

(a) a*b/c/c

(b) a*b/c*c

(c) a*(b/c)/c

(d) a*b/(c*c)

(e) a^b*c+d

(f) a^(b*c)+d

(g) a^b*(c+d)

(h) d+c*a^b

2.3 Escreva cada uma das expressões algébricas seguintes como uma atribuição em Ma-

tlab. Escolha nomes adequados para variáveis.

(a) z = 1x+y

(b) Ec = 12mv2

(c) T = 2π√

L/g

(d) a = sin y√x2+y2

(e) r = A sin(θ − t)

(f) x = sin 2πL

(g) z = 3√

x + y

(h) z = n√

x, n ∈ N

(i) r = log10 x

(j) α = log(

tan−1√

a2+b2

|c|

)

2.4 Escreva cada uma das seguintes condições como expressões lógicas, em Matlab:

(a) A > 0 ∧ B > 0

(b) B > A ≥ 0

(c) 14

< |A| < 12

(d) |A−B| ≤ 10−3

(e) N = M ∨ N = L

(f) N = M = L

(g) N = M = L = 2

(h) int(A + B) = N

(i) N é múltiplo de 2 ou 3

(j) M 6= 0 e N é múltiplo de M

2.5 Qual é o resultado escrito pelas seguintes instruções Matlab? Responda à questãoantes de tentar obter o resultado num computador!

(a) pi, pi/2, pi/3

(b) a=2; b=3; r = sqrt(a^2 + b^2)

Page 7: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

3. Escalares 7

3 Escalares

3.1 A área de um qualquer triângulo cujos lados medem a, b, c pode ser calculada pelafórmula A =

s(s− a)(s− b)(s− c), onde s = (a + b + c)/2.

Escreva um programa em Matlab que, dados os valores de a, b, c, calcule a área dotriângulo correspondente.

3.2 Sabendo que o volume V e superfície exterior S de um cilindro de altura h e diâmetrode base d são dados pelas fórmulas

V =hπd2

4S = hπd +

πd2

2

escreva um programa Matlab que, dados os valores de h e d, calcule o volume esuperfície do cilindro.

3.3 Em engenharia electrotécnica é comum exprimir a relação entre dois valores de potênciaem decibeis, ou dB, dada pela equação

dB = 10 log10

P2

P1

onde P2 é o valor de potência a ser medido e P1 é um valor entendido como referência.

Utilizando o valor de referência convencional (1 watt), escreva um programa em Ma-

tlab que dado o valor de P2 o converta em dB.

3.4 A força de atracção gravitacional entre dois corpos de massas m1 e m2 é dada pelaequação

F =Gm1m2

r2

onde G é a constante de gravitação (6.672 × 10−11 Nm2/kg2), m1, m2 são as massasem quilogramas e r é a distância entre os dois corpos em metros.

Escreva um programa em Matlab que, dados os valores de massas e distância, calculea força de atracção entre os dois corpos. Teste o seu programa calculando a forçaexercida pela a Terra sobre um satélite de 800 kg em órbita a 38000 km (a massa daTerra é 5.98× 1024 kg).

3.5 Numa conta a prazo com capitalização automática o valor do juro é acumulado aocapital inicial no final de cada período. Assim, o capital acumulado ao fim de Nperíodos é dado pela equação

Capital final = Capital inicial× (1 + t)N

onde t é a taxa de juro aplicada (0 < t < 1).

Por exemplo: com um capital inicial de 1000e e uma taxa anual de 5% o capitalacumulado ao fim de dois anos será 1000e ×(1 + 0.05)2 = 1102.5e.

Escreva um programa em Matlab que tenha como dados o Capital inicial, a taxa dejuro anual t e o número de anos N e que calcule o Capital acumulado no final dessesanos.

Page 8: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

8 FEUP — Licenciatura em Eng. Civil — Computação

3.6 Para pequenas oscilações, o período dum pêndulo é independente da sua massa eamplitude de oscilação, dependendo apenas do comprimento L do fio em que estásuspenso (por esta razão os pêndulos foram usados para marcar o tempo nos primeirosrelógios mecânicos).

A relação entre a frequência (número de oscilações por segundo) e o comprimento dofio é dada pela expressão

f =1

g

L

onde g ≈ 9.80 m/s2 é a constante de aceleração gravitacional ao nível do mar.

O período T de cada oscilação é então o inverso da frequência: T = 1/f .

(a) Escreva um programa em Matlab que, dado o valor do comprimento do fio,calcule a frequência e o período da oscilação.

(b) Re-escrevendo as expressões dadas, escreva um outro programa que, dado o valordo período desejado, calcule qual o comprimento do fio necessário.Teste esse programa calculando qual o comprimento do fio para obter oscilaçõesde 1/2 s, 1 s e 2 s.

3.7 Uma equação do 2o grau tem a forma genérica ax2 + bx + c = 0 com a 6= 0. Podemosachar as suas raízes usando a conhecida fórmula resolvente

x =−b±

√b2 − 4ac

2a

Escreva um programa em Matlab que leia os valores dos parâmetros a, b, c e determineas duas raízes da equação. Nota: As raízes podem ser complexas.

Page 9: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

4. Arrays 9

4 Arrays

4.1 Quais as instruções Matlab para gerar as seguintes sequências:

(a) 0.00001, 0.00010, 0.00100, 0.01000, 0.10000

(b) 9, 4, 1,−3,−7

(c) Um milhão de números igualmente espaçados entre 1 e 2

(d) 9, 5, 1,−3,−7

4.2 O factorial dum número natural n é n! = 1 × 2 × 3 × · · · × n. Por exemplo: 5! =1× 2× 3× 4× 5 = 120. Note ainda que (por convenção) 0! = 1! = 1.

(a) Escreva uma instrução em Matlab que calcule o factorial de um número n ≥ 0dado.

(b) Escreva uma instrução em Matlab que tabela a função factorial de 0 até 15.

Sugestão: use a função cumprod do Matlab.

4.3 Escreva uma instrução Matlab que, partindo dum array unidimensional x, calcule:

(a) a média aritmética = x1+x2+···+xN

N= 1

N

∑Ni=1 xi

(b) a média geométrica = (x1 · x2 · · · xN)1/N =(

∏Ni=1 xi

)1/N

.

(c) a média harmónica = N/ (1/x1 + 1/x2 + · · ·+ 1/xN) = N/(

∑Ni=1 1/xi

)

.

(d) o desvio padrão =

NP

N

i=1x2

i−(P

N

i=1xi)

2

N(N−1)

Sugestão: use a função length do Matlab.

4.4 Qual a instrução Matlab que permite determinar a semi-soma entre o maior e menorelementos dum array?

� 4.5 Na disciplina de Programação Transcendental I a nota final é dada em função dostrabalhos realizados ao longo do ano segundo este critério: desprezando a pior nota,faz-se a média aritmética das restantes. Por exemplo: com as notas 10, 11, 7 e 9, anota final será 10 (exactamente).

Escreva um programa em Matlab que leia uma sequência de notas (inteiros entre 0 e20) e calcule a nota final correspondente.

� 4.6 Sabendo queπ

4= 1− 1

3+

1

5− · · · =

∞∑

i=0

(−1)i 1

2i + 1

escreva um programa em Matlab que calcule uma aproximação a π somando os 50primeiros termos da série.

Page 10: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

10 FEUP — Licenciatura em Eng. Civil — Computação

4.7 Em Matlab as funções trigonométricas operam sempre com ângulos em radianos.Para operar com graus é necessário converter primeiro o argumento para radianos.

(a) Escreva um programa que tabele os valores de senos e cosenos para argumentosde 0◦ até 45◦ por intervalos de 1o.

(b) Modifique o programa anterior para tabelar o valor da tangente mas entre 0◦ e15◦ por intervalos de 15′ (recorde que 1′ = 1

60

◦).

4.8 Um objecto com peso 100 kg deve ser suspenso de uma haste horizontal de 2.5 m (cujopeso é desprezável). A haste está fixa na parede e é suportada por um cabo de 2 m(ver figura).

A tensão T no cabo é dada pela equação

T =W × g × l × lc

d√

l2c − d2

onde W é o peso do objecto, g é a acele-ração da gravidade, l é o comprimento dahaste, lc é o comprimento do cabo e d é adistância na haste onde fixamos o cabo.

d =?

lc = 2 m

l = 2.5 m

W = 100 Kg

Escreva um programa em Matlab que determine a distância d que minimiza a tensãono cabo. O programa deve calcular a tensão para d de 0.50 m até 1.95 m por incre-mentos de 5 cm para localizar a posição de tensão mínima.Sugestão: use a função min do Matlab.

4.9 Sem utilizar, para este exercício, as funções norm do Matlab diga:

(a) Qual a instrução Matlab que calcula a norma euclidiana de um vector x ∈ Rn:

||x|| =√

x21 + · · ·+ x2

n = (∑n

i=1 x2i )

1/2?

(b) Qual a instrução Matlab que calcula a norma de Hölder : ||x||p = (∑n

i=1 |xi|p)1/p,

com p ≥ 1?(Note que a norma euclidiana corresponde ao caso particular p = 2.)

(c) Determine a norma de Hölder do vector x = (1, 1, 1) ∈ R3 para p = 1, p = 3/2,

p = 2 e p = 3.

Page 11: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

4. Arrays 11

4.10 Numa sessão Matlab foram criadas os seguintes arrays (ou variáveis indexadas):

» whos

Name Size Bytes Class

A 10x10 800 double array

B 5x5 200 double array

x 10x1 80 double array

Grand total is 135 elements using 1080 bytes

Escreva uma expressão ou sequência de instruções em Matlab que calcule cada umdos seguintes valores:

(a) a soma dos elementos na 2a linha deA;

(b) a média aritmética dos elementos na3a coluna de A;

(c) a contagem do no de elementos posi-tivos de A;

(d) a soma dos inversos dos elementos po-sitivos nas duas primeiras linhas de A;

(e) a média dos elementos positivos de A;

(f) a média do maior e menor valor de A;

(g) o produto dos módulos dos elementosde X;

(h) a soma das raízes quadradas dos ele-mentos de B;

(i) o número de elementos pares em B;

(j) o número de elementos de A maioresque a média aritmética do vector X;

(k) valor lógico: existe algum elementopar em B?

(l) valor lógico: serão todos os elementosde B maiores que 0?

4.11 Em álgebra linear é possível definir várias normas de matrizes que traduzem o “tama-nho” duma matriz de forma análoga à norma dum vector.

Escreva instruções Matlab que calculem as seguintes normas duma matriz A ∈ R2

com dimensões N ×M :

(a) a norma de Frobenius: ||A||F =

(

N∑

i=1

M∑

j=1

a2ij

)1/2

(b) a norma-1: ||A||1 = max1≤j≤M

N∑

i=1

|aij|

(c) a norma-∞: ||A||∞ = max1≤i≤N

M∑

j=1

|aij|

Nota: neste exercício não utilize as funções norm do Matlab.

Page 12: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

12 FEUP — Licenciatura em Eng. Civil — Computação

4.12 Escreva uma instrução em Matlab que determine o ângulo entre dois vectores x, y ∈R

3. Para tal, pode usar a relação

cos θ =x · y|x||y|

onde θ é o ângulo entre os dois vectores, x · y é o seu produto interno e |x| é a normade x. Para determinar θ sabendo o seu co-seno, pode usar a função acos do Matlab.

4.13 Programe o Matlab para escrever a tabuada de um qualquer inteiro dado.

4.14 O código seguinte pretende calcular o raio r de um círculo, sabendo o perímetro dacircunferência, L. Infelizmente, o código contém um erro. Analise o código e corrija-o.Finalmente, copie o código para um ficheiro .m-script e experimente o programa, porexemplo, para L = 2π.

L = input(’Introduza o perímetro da circunferência, L’)

r=L/2*pi

4.15 Re-escreva o programa que resolve o exercício 3.5 num ficheiro .m-script.

� 4.16 Escreva um ficheiro .m-script em Matlab que calcule o valor da resistência eléctricaRE equivalente a um circuito em paralelo de resistências R1, R2, . . . , RN :

RE =1

(

1R1

+ 1R2

+ · · ·+ 1RN

)

O programa deve ler os valores de resistências Ri > 0 e escrever a resistência equivalenteRE.

4.17 Para converter uma temperatura de graus Celsius para graus Fahrenheit podemos usara relação TF = (1.8 × TC + 32), onde TC é a temperatura em graus Celsius e TF atemperatura em graus Fahrenheit.

Escreva um programa que forneça uma tabela de conversão de temperatura desde 0◦Caté 100◦C com intervalos de 10◦C.

Page 13: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

4. Arrays 13

4.18 As taxas de conversão entre o Euro e algumas moedas europeias são as seguintes:

1e corresponde a:

200.482 Escudos40.3399 Francos belgas6.55957 Francos franceses1.95583 Marcos

166.386 Pesetas2.20371 Florins

1936.27 Liras

(a) Usando esta informação escreva um programa em Matlab que permita conver-ter um valor em Euros para uma destas moedas. O programa deve começar porapresentar uma lista para o utilizador escolher a conversão desejada.Sugestão: Represente a tabela de conversão com os nomes e as taxas de con-versão usando variáveis indexadas.

(b) Modifique o programa anterior de forma a permiter converter entre qualquer umadestas moedas (i.e., de Francos franceses para Escudos, por exemplo) usando ocâmbio com o Euro.Procure evitar ter de guardar mais taxas de conversão do que as declaradas noprograma anterior. . .

� 4.19 Um quadrado mágico é uma matriz quadrada de inteiros em que a soma de qualquerlinha, coluna, diagonal principal ou secundária é sempre a mesma (ver exemplo nafigura 1).

6 1 87 5 32 9 4

28 19 10 1 48 39 3029 27 18 9 7 47 3837 35 26 17 8 6 4645 36 34 25 16 14 54 44 42 33 24 15 1312 3 43 41 32 23 2120 11 2 49 40 31 22

Figura 1: Dois quadrados mágicos de 3× 3 e 7× 7.

Escreva um programa em Matlab que leia uma matriz quadrada A e determine se Aé ou não um quadrado mágico.

Sugestão: Use as funções intrínsecas sum e all.

Page 14: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

14 FEUP — Licenciatura em Eng. Civil — Computação

� 4.20 Dado um conjunto de n pontos de coordenadas (Xi, Yi), o método de regressão

linear permite determinar os coeficientes da recta Y = A · X + B que se aproximamelhor do conjunto de pontos dado1; os coeficientes são determinados por

A =nSXY − SXSY

nSXX − (SX)2B =

SY − ASX

n

onde SX =∑n

i=1 Xi , SXY =∑n

i=1 XiYi , etc.

Escreva um programa em Matlab que leia dois vector X e Y com as coordenadas dosn pontos e calcule os coeficientes A e B.

1No sentido dos “mínimos quadrados”.

Page 15: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

5. Instruções de salto, ciclos e repetição 15

5 Instruções de salto, ciclos e repetição

5.1 Qual é o resultado escrito pelas seguintes instruções Matlab? Simule a sua execuçãocom papel e lápis antes de os tentar executar num computador!

(a) (-1-sqrt(5))/2

(-1-sqrt(5))/2;

disp((-1-sqrt(5))/2)

disp((-1-sqrt(5))/2);

(b) Graus=input(’Graus’);

Rads = Graus/180*pi

(c) x=input(’x’);

y=input(’y’);

if(x>=0)

if(y>=0)

disp(’1o. Q.’);

else

disp(’4o. Q.’);

end

else

if(y>=0)

disp(’2o. Q.’);

else

disp(’3o. Q.’);

end

end

(d) f = 1

for n=2:7,

f = f*n;

end

disp(f);

(e) for i=0:10,

x = 1+0.1*i

disp([x, log(x)]);

end

(f) n=0;f=1;y=1;

while (f<1000 & y<1000)

disp([n, f, y])

n = n+1

f = f*n

y = exp(n)

end

5.2 Escreva um programa que:

– Peça ao utilizador que introduza um número

– Se o número for negativo, escreve que o número é negativo

– Se o número for maior que 100, escreve que o número é grande demais

– Caso contrário, mostra o número e a sua raíz quadrada

5.3 Escreva um programa em Matlab que leia os valores dos três ângulos de um triânguloe o classifique como equilátero (três ângulos iguais), isósceles (dois ângulos iguais) ouescaleno (caso contrário).

Além disso, se algum dos ângulos for 90◦ o programa deve ainda indicar que o triânguloé rectângulo.

5.4 (a) Escreva um programa Matlab que leia as coordenadas (x, y) dum ponto no planoe indique em que quadrante (1o, 2o, 3o ou 4o) este se encontra.

(b) Modifique o programa anterior para indicar também qual o semi-quadrante ondese encontra o ponto (1o, 2o, . . . , 8o).

Page 16: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

16 FEUP — Licenciatura em Eng. Civil — Computação

5.5 A tabela seguinte apresenta factores de conversão entre algumas unidades de compri-mento, volume e massa:

Converter de para Factor

Polegada Centímetros ×2.54Pés Metros ×0.3048

Libras Quilogramas ×0.45359237Galões E.U.A Litros ×3.785411784

(a) Escreva um programa em Matlab para converter estas unidades. O programadeve começar por apresentar uma lista com as opções de unidades para converter(por exemplo, numeradas de 1 a 4) e só depois pedir o valor a converter.

(b) Modifique o programa anterior para permitir também as conversões no sentidoinverso. Consegue evitar calcular novos factores de conversão?

5.6 Escreva um programa em Matlab que leia o número de um mês (inteiro de 1 a 12) edum ano (inteiro, por exemplo: 1998) e determine quantos dias tem esse mês seguindoa seguinte informação:

Abril, Junho, Setembro e Novembro: 30 diasFevereiro: 28 dias ou 29 dias (ver nota)restantes: 31 dias

Se o mês introduzido não for válido, o programa deve escrever uma mensagem de erroapropriada (e não escrever o número de dias).

Nota: o mês de Fevereiro tem 29 dias nos anos bissextos e 28 nos anos normais. Umano é bissexto se e só se verifica a condição:

(mod(ano, 4) = 0 ∧ mod(ano, 100) 6= 0)) ∨ mod(ano, 400) = 0

5.7 Escreva um programa em Matlab que leia uma letra e escreva “Vogal” ou “Consoante”conforme o tipo da letra lida. Tenha a atenção de considerar as maiúsculas e minús-culas.

Se o caracter lido não for uma letra válida (‘a’, ‘b’, . . . , ‘z’ ou ‘A’, ‘B’, . . . , ‘Z’) entãoo programa deve escrever uma mensagem de erro!

Sugestão: Utilize as funções Matlab isletter e lower

5.8 O custo do aluguer dum automóvel é 0.75e por km até aos primeiros 50 km, 0.65epor km para os 100 km seguintes e 0.50e por km acima de 150 km.

Escreva um programa Matlab que leia a distância em quilómetros e calcule o valortotal a pagar e o custo médio por quilómetro.

Page 17: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

5. Instruções de salto, ciclos e repetição 17

� 5.9 As tarifas de um parque de estacionamento, aberto das 8h às 24h, são as seguintes:

1a hora: 0.50e2a e 3a horas: 0.65e

4a hora e seguintes: 1.00e

O número de horas a pagar é sempre inteiro (por exemplo, 70 min. corresponde a 2horas) e não superior a 16h (i.e., os automóveis não podem pernoitar no parque).

Escreva um programa em Matlab que leia a hora e minuto (números inteiros) deentrada e saída do parque e calcule o preço a pagar.

5.10 O imposto sobre rendimento de uma pessoa singular é gradativo em diferentes escalõesconforme o rendimento colectável. Suponha que os escalões são dados pela tabelaseguinte

Rendimento Imposto

<8 000e 15% do rendimentode 8 000e até 15 000e 1 200e + 28% acima de 8 000e

>15 000e 3 160e + 35% acima de 15 000e

Por exemplo: uma pessoa com 12 000e de rendimento estaria no 2o escalão e pagaria1 200e+ 0.28(12 000e− 8 000e) = 2 320e de imposto.

Escreva um programa em Matlab que leia o valor de rendimento e calcule qual oimposto a pagar. O programa deve ainda indicar qual a taxa de imposto do escalãocorrespondente.

� 5.11 Um número natural n diz-se triangular se n = 1 + 2 + · · · + k para algum k ∈ N.Exemplos: 6 é triangular porque 6 = 1 + 2 + 3, mas 5 não é triangular (porquê. . . ?).

(a) Escreva um programa em Matlab que tabele todos os número triangulares me-nores que 100.

(b) Escreva um outro programa que leia um número n natural e diga se é triangularou não.

Sugestão: use a função cumsum do Matlab.

5.12 Um número inteiro diz-se um quadrado perfeito se é o quadrado de um outro inteiro.Por exemplo: 25 é um quadrado perfeito porque 25 = 52.

(a) Escreva uma instrução que liste os inteiros entre 1 e 100 que não são quadradosperfeitos.

Sugestão: use a função setdiff do Matlab.

(b) Dado um inteiro, como verificar se ele é um quadrado perfeito?

Page 18: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

18 FEUP — Licenciatura em Eng. Civil — Computação

� 5.13 Se lançarmos verticalmente um projéctil da superfície da Terra com velocidade v esteatingirá uma altura máxima dada pela fórmula

h =v2/(2g)

1− v2/(2gR)

se v2 < 2gR e, caso contrário, afastar-se-á para sempre com velocidade final

vfinal =√

v2 − 2gR

Nestas expressões R é o raio da Terra (aproximadamente 6.366 × 106 m) e g é aaceleração gravitacional à superfície (aproximadamente 9.80 m/s2).

Escreva um programa em Matlab que tabele o resultado obtido (altura máxima ouvelocidade final, indicando de qual se trata) para valores de velocidade inicial v =10 m/s, 100 m/s, . . . 106 m/s.

5.14 Na sequência de Fibonacci cada termo (excepto os dois primeiros) é a soma dos doistermos anteriores; os dois primeiros termos são 1:

1, 1, 2, 3, 5, 8, 13, . . .

(a) Escreva um programa em Matlab que leia um número n ≥ 0 e escreva n termosdesta sequência.

(b) Modifique o programa para que leia um número k e diga se este pertence à sequên-cia de Fibonacci e, em caso afirmativo, indique qual o seu número de ordem nasequência. Em caso negativo, o programa deve indicar que k não é um númerode Fibonacci.

� 5.15 De todos os números naturais diferentes de 1 há apenas quatro que podem ser escritoscomo a soma dos cubos dos seus algarismos. Um destes números é 153 = 13 + 53 + 33.Sabendo que estes números se encontram entre 100 e 999, escreva um programa emMatlab que os determine.

5.16 Podemos decompor um número natural nos seus algarismos decimais fazendo sucessivasdivisões por dez: os restos sucessivos da divisão dão-nos os algarismos do número;quando o quociente for zero, o processo termina.

Vamos, como exemplo, decompor 354 emalgarismos: efectuando divisões por 10, osrestos sucessivos são os algarismos (dasunidades até às centenas); o processo ter-mina quando o quociente é zero.

354 104 35 10

5 3 103 0

Sugestão: use as funções int e mod do Matlab.

(a) Usando esta propriedade, escreva um programa em Matlab que leia um númeronatural e calcule a soma dos seus algarismos.

Page 19: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

5. Instruções de salto, ciclos e repetição 19

(b) Modifique o programa de forma a ler o número natural e calcular o número reverso,i.e., com os algarismos pela ordem contrária.

(c) Agora é fácil fazer um programa que verifique se um número natural qualquer éuma capicua: basta verificar se é ou não igual ao seu reverso.Modifique o programa da alínea anterior para testar se um número qualquer é ounão capicua usando este método.

5.17 Re-escreva o programa 4.6 de modo a calcular uma aproximação de π, somando ostermos da série enquanto os seus valores absolutos sejam ≥ 10−5.

Sugestão: Note que dois termos consecutivos estão relacionados de modo simples.

5.18 As funções trigonométricas como seno, co-seno, tangente, etc. são intrínsecas em Ma-

tlab. No entanto, mesmo que assim não fosse, não seria muito difícil conseguir calculá-las usando as as suas expansões em séries de Taylor:

sin x = x− x3

3!+

x5

5!− · · ·+ (−1)n x2n+1

(2n + 1)!+ · · ·

cos x = 1− x2

2!+

x4

4!− · · ·+ (−1)n x2n

(2n)!+ · · ·

(a) Escreva um programa em Matlab que leia um valor do argumento x ∈ R (ânguloem radianos) e calcule o seno e co-seno de x usando 10 termos das séries de Tayloracima.Tente evitar o cálculo desnecessário de potências de x e factoriais escrevendo cadaparcela da soma em função da anterior.

(b) Modifique o programa da alínea anterior para somar as parcelas da série até que oseu valor absoluto seja < 10−6. O programa deve também indicar quantas parcelasforam somadas até satisfazer este critério (note que o no de parcelas somadas serádiferente para valores diferentes de x).

(c) Note que quanto menor for |x| mais rapidamente as séries convergem. Assim,modifique o seu programa de forma a tirar partido da periodicidade do seno eco-seno para reduzir o valor do ângulo x.

Page 20: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

20 FEUP — Licenciatura em Eng. Civil — Computação

†� 5.19 Considere o seguinte jogo: n pessoas, numeradas de 1 a n são dispostas num círculo.Começando na 1a pessoa, vamos removendo do círculo “pessoa-não-pessoa-sim” e ocírculo aperta-se. O jogo termina quando resta apenas uma pessoa.

Por exemplo, para n = 10 a ordem das eli-minações é: 2, 4, 6, 8, 10, 3, 7, 1, 9 e 5 é osobrevivente (ver figura).

Escreva um programa em Matlab queleia n e escreva a ordem das eliminaçõese o sobrevivente de acordo com este algo-ritmo.

12

3

4

56

7

8

9

10

Sugestão: Represente o círculo de pessoas com uma variável indexada.

† 5.20 Considere uma folha de papel presa na base. Dobre a folha, colocando o topo sobre abase e fazendo um vinco a meio.Repita o processo de dobrar a folha para baixo até um total de n operações.Agora observe o perfil esquerdo. Na figura pode ver o resultado de 3 operações dedobragem.

��� C

CC �

��CCC �

��

Vamos codificar cada vinco “para baixo” como um 1 e cada vinco para cima como um0. Assim, a codificação do exemplo da figura será: 1 1 0 0 1 0 0.Escreva um programa em Matlab que, dado um número natural n, escreva a sequênciade vincos produzidas por n dobragens de acordo com a codificação acima.

5.21 A sequência habitualmente designada de Collatz é definida como:inicia-se com um qualquer natural; o próximos número da sequência obtém-se do an-terior dividindo-o por 2 se ele for par ou adicionando 1 ao seu triplo se ele for ímpar.

n0 ∈ N

ni+1 =

{

ni/2 ⇐ ni é par3ni + 1 ⇐ ni é ímpar

Repete-se o processo até se atingir o número 1. Por exemplo, se escolhermos partir donúmero 7, a sequência será:

7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

Escreva um programa em Matlab que leia um ponto de partida e gere a sequênciadai em diante até 1.Nota: um grupo de investigação da Universidade de Aveiro tem desenvolvido trabalhonesta área. Se desejar consulte www.ieeta.pt/~tos/3x+1.html

Page 21: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

5. Instruções de salto, ciclos e repetição 21

5.22 Podemos usar o seguinte algoritmo para gerar um quadrado mágico de n × n inteirospara n ímpar (ver os exemplos da figura 1):

1. Começe por colocar “1” no meio do 1a linha;

2. Mova-se na diagonal para cima e para a esquerda (se sair fora do quadrado, re-aparece pelo lado oposto como se todo o plano fosse preenchido por quadradosiguais). Coloque na nova casa o “2”;

3. Repita o processo para o “3”, “4”, . . . . Se atingir uma casa já preenchida, entãodesça uma casa e continue.

Escreva formalmente o algoritmo acima e codifique-o em Matlab num programa que,dado o n ímpar, gere e escreva um quadrado mágico.

Nota: há muitos quadrados mágicos diferentes para cada ordem: por exemplo, paran = 5 há 275305224 quadrados mágicos diferentes, excluindo rotações e reflexões.

† 5.23 O problema dos aniversários: Num grupo de n pessoas qual é a probabilidade deque duas ou mais pessoas façam anos no mesmo dia? Podemos usar simulação pararesponder a esta questão.

(a) Escreva um programa em Matlab que leia n e calcule a probabilidade de duasou mais pessoas em n fazerem anos num mesmo dia.O programa deve gerar aleatoriamente um vector de dimensão n com n datas deaniversário (inteiros de 1 a 365) usando rand; depois deve verificar se pelo menosduas datas coincidem.

Para estimar a probabilidade pretendida, o programa deve repetir este processo1000 vezes e calcular a frequência com que encontrou datas coincidentes, ou seja:“no de sequências com datas coincidentes/1000”.

(b) Re-escreva o programa abordando o problema de outra forma: construir um vectorcom dimensão 365 (uma entrada para cada dia do ano) e seguidamente gerar ndatas de aniversário aleatoriamente. A verificação de datas coincidentes torna-seentão mais expedita. . .

Teste os seus programas para 5, 10, 20 e 40 pessoas.

Page 22: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

22 FEUP — Licenciatura em Eng. Civil — Computação

†� 5.24 Pretende-se fazer a classificação das alturas de uma população de 1000 pessoas distribuindo-as por 10 intervalos:

1o intervalo: <1.55m2o intervalo: 1.55m – 1.60m3o intervalo: 1.60m – 1.65m

...9o intervalo: 1.90m – 1.95m

10o intervalo: ≥ 1.95m

Escreva um programa em Matlab que leia as alturas das 1000 pessoas e faça a con-tagem do número de pessoas em cada intervalo.

Sugestão: Represente as contagens por uma variável indexada pelo número do in-tervalo. O objectivo é não ter de escrever 10 instruções “IF...ENDIF”, uma por cadaintervalo!

†� 5.25 Em Portugal os deputados à Assembleia da República são eleitos segundo o Métodode Hondt. Este método consiste em dividir os votos expressos em cada partido pelonúmero de deputados já eleitos por esse partido mais um, e escolher o maior quocienteresultante. O método é aplicado sucessivamente até todos os lugares a eleger estarempreenchidos.

Exemplo: se quisermos eleger 7 deputados de entre os partidos A, B e C cujos votosexpressos são dados na 2a coluna da tabela seguinte

Partido Votos

A 2460 (1o) 1230 (3o) 820 (6o) 615 (7o)B 1830 (2o) 915 (5o) 610C 960 (4o) 480

então o partido A elege 4 deputados, B elege 2 e C elege apenas 1; os deputados sãoeleitos pela ordem indicada dentro de parêntesis.

Escreva um programa em Matlab que leia um vector V de votos expressos nos NPpartidos (i.e., NP = dimensão de V) bem como o número total de deputados a eleger(ND) e determine os deputados eleitos por cada partido.

Page 23: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

5. Instruções de salto, ciclos e repetição 23

5.26 Em muitas situações é conveniente ordenar uma sequência de valores de forma cres-cente ou decrescente.Um dos algoritmos clássicos para ordenar uma sequência x1, x2, . . . , xn de n valores nu-méricos por ordem crescente consiste em seleccionar sucessivamente o menor elementoe colocá-lo no início da sequência; este algoritmo é designado ordenação por selecção:

Ordenação dum vector (x1, x2, . . . , xn) por selecção:para i de 1 até n− 1

k ← ipara j de i + 1 até n

se xj < xk então k ← jfim de ciclo em jt← xi

xi ← xk

xk ← tfim de ciclo em i

Escreva um programa em Matlab que ordene um vector númerico usando este método.

5.27 Se o vector (x1, . . . , xn) estiver já quase ordenado então o algoritmo de ordenação“bubblesort” será mais eficiente do que o do exercício 5.26: a ideia é efectuar sucessivas“passagens” em que vamos trocando pares de elementos que não estão por ordem.

Ordenação dum vector (x1, x2, . . . , xn) por “bubblesort”:m← n− 1enquanto m > 0 fazer:

l← 0para j = 1 até m

se xj > xj+1 então:t← xj

xj ← xj+1

xj+1 ← xj

l← jfim de ciclo em jm← l

fim de ciclo enquanto

Escreva um programa Matlab que ordene um vector numérico usando este método.

5.28 Como poderia modificar os algoritmos e programas dos exercício 5.26 e 5.27 de formaa ordenarem por ordem decrescente?

Page 24: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

24 FEUP — Licenciatura em Eng. Civil — Computação

5.29 A procura de um elemento numa sequência ordenada é muito mais fácil do que numasequência desordenada. Por exemplo: compare o trabalho de procurar na lista telefó-nica um no de telefone dado o nome ou procurar o nome dado o no de telefone!

Podemos formalizar um processo de pesquisa dictómica parecido com o que usamosao procurar na lista telefónica: dividimos a lista a meio; se acertamos no elementoprocurado não há mais nada a fazer; se não, verificamos se o elemento procuradoé menor ou maior e continuamos o processo na metade da lista da esquerda ou dadireita, respectivamente.

Procura dictómica de y num vector (x1, x2, . . . , xn) ordenadoResultado: o índice l ∈ {1, 2, . . . , n} se o elemento foi encontrado;

caso contrário, l = 0i← 1, j ← n, l ← 0enquanto i < j

k ← int((i + j)/2)se xk = y então l← k e termina o algoritmo;senão se xk < y então i← k + 1senão j ← k − 1

fim de ciclo enquanto

Escreva um programa em Matlab para pesquisa dictómica num vector de inteirosusando o método descrito acima.

† 5.30 Numa situação de estabilidade a temperatura num qualquer ponto de uma placa me-tálica será a média das temperaturas dos pontos à sua volta. Este facto pode ser usadopara aproximar iterativamente a distribuição de temperaturas na placa.

A figura 2 representa a placa metálica quadrada dividida numa malha de 10× 10 nós.A temperatura em cada nó Tij é uma variável bi-indexada. Supomos que na fronteiraa temperatura é mantida constante igual 20◦ por um sistema de arrefecimento, e queno nó (3, 8) é de 100◦ pela exposição a água em ebulição.

20◦ 20◦ 20◦ 20◦ 20◦ 20◦ 20◦ 20◦ 20◦ 20◦

20◦ 20◦

20◦ 100◦ 20◦

20◦ 20◦

20◦ Tij 20◦

20◦ 20◦

20◦ 20◦

20◦ 20◦

20◦ 20◦

20◦ 20◦ 20◦ 20◦ 20◦ 20◦ 20◦ 20◦ 20◦ 20◦

Figura 2: Uma placa metálica dividida numa malha 10× 10.

Page 25: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

5. Instruções de salto, ciclos e repetição 25

Uma nova estimativa da temperatura no nó (i, j) pode ser obtida pela média dos nósvizinhos:

Tij =1

4(Ti+1,j + Ti−1,j + Ti,j−1 + Ti,j+1)

Para determinar a temperatura em cada nó, inicializamos a 50◦ todas as temperaturasnão constantes na figura 2. Em seguida aplicamos a estimativa acima aos nós nãoconstantes até que a diferença entre o valor de temperatura anterior e actual sejapequena. Nessa altura encontramos uma configuração estável.

Escreva um programa em Matlab que determine a configuração estável da malhana figura 2 aplicando a estimativa até que a máxima diferença de temperatura emqualquer nó entre duas iterações seja inferior a 0.01◦. Qual é a temperatura estável nonó (5, 5)?

† 5.31 O Jogo da Vida inventado pelo matemático J. H. Conway desenrola-se num tabuleiroquadrado com n casas de lado; o jogo é mais interessante para tabuleiros grandes (i.e.,n ≥ 10).

Cada casa do tabuleiro pode conter uma célula ou estar vazia. Consideram-se aindacélulas vizinhas de cada casa as células existentes nas 8 casas mais próximas, segundoas direcções cardeais e diagonais (ver figura 3). Note-se ainda que as casas da fronteirado tabuleiro têm menos vizinhos.

Figura 3: Casas vizinhas de algumas células num tabuleiro de 7× 7.

Partindo duma configuração inicial do tabuleiro, o jogo desenrola-se por gerações: napassagem duma geração para outra algumas células morrem (i.e., passam a uma casavazia), outras mantêm-se e outras nascem (i.e., numa casa vazia surge uma célula). Asregras que regulam essa evolução são:

– uma célula morre se tiver menos de 2 ou mais do que 3 células vizinhas;

– se uma casa vazia tiver exactamente 3 células vizinhas então nasce uma novacélula no seu lugar.

Dependendo da configuração de células inicial, a colónia pode extinguir-se ao fim depoucas gerações, pode estabilizar ou mesmo aumentar indefinidamente.

Pretende-se escrever um programa em Matlab que simule a evolução duma colónia:deve começar por distribuir aleatoriamente (usando a função rand) um certo número

Page 26: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

26 FEUP — Licenciatura em Eng. Civil — Computação

de células pelo tabuleiro; em seguida deve simular a passagem de gerações, desenhandoo tabuleiro após cada nova geração.

O número de células colocadas inicialmente no tabuleiro bem como o número de gera-ções devem ser dados pelo utilizador.

Nota: Tenha em atenção que a mudança de gerações deve ser efectuada simultanea-mente em todas as células, o que se torna mais fácil se dispuser de dois tabuleiros: umcom a situação actual e outro com a situação futura.

Page 27: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

6. Funções 27

6 Funções

6.1 Re-escreva o programa que resolve o exercício 3.5 num ficheiro .m-função.

6.2 Escreva, em linguagem matlab, a seguinte rotina:

function[a, v] = matriz(x)

x vector dado (parâmetro de entrada)

a matriz quadrada: a(i, j) = x(i)j (parâmetro de saída)

v vector: v(i) = maxj a(i, j) (parâmetro de saída)

6.3 Procura numérica de limites de funções.

Escreva uma função em matlab para procurar o limite limx→a =√

x+25−5x

, atendendoà seguinte sugestão:Sugestão: Para procurar numericamente o limx→a = f(x) (caso exista), pode avaliarf(x) para a seguinte sucessão:

a +h

b, a +

h

b2, . . . , a +

h

bn, . . .

Os valores de b (b > 1) e de n são dados e h convenientemente escolhido, por exem-plo h = 1. O procedimento deve fornecer os sucessivos valores aproximados dolimite pretendido. Experimente a função para b = 5 e n = 10, na procura delimx→0 =

√x+25−5

x.

6.4 Escreva um função matlab que permita avaliar um polinómio P (x) de qualquer graue a sua derivada P ′(x) num dado ponto x

function [px,pdx] = avalia(p,x)

onde p representa o vector completo dos coeficientes de P (x), px = P (x) e pdx = P ′(x).Aplique a função para avaliar, em x = 5, P (x) = x4 + 3x2 + 2x + 9 e P ′(x).

6.5 Uma matriz contém as notas de um grupo de alunos num teste, num trabalho e numexame. As notas estão todas em percentagem. Cada linha representa um aluno. Oteste vale 20% da nota final, o trabalho 20% e o exame 60%. Escreva uma função quetenha como parâmetro de entrada a matriz que contém as notas dos alunos e comoparâmetro de saída um vector com a nota final dos alunos. Por exemplo, se um alunotem 50 no teste, 60 no trabalho e 40 no exame, a sua nota final será 46.Nota: No vector de saída, cada linha deverá continuar a corresponder a um aluno.

Escreva um procedimento que pergunte ao aluno quais as suas notas no teste, trabalhoe exame e, utilizando a função anterior, retorne a sua nota final.

Page 28: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

28 FEUP — Licenciatura em Eng. Civil — Computação

6.6 Crie uma função que ache o valor de exp(x), através da definição

∞∑

n=0

xn

n!

Adicione termos até que a diferença entre dois termos consecutivos da soma seja menordo que 10−4.

� 6.7 Alguns integrais não podem ser resolvidos analiticamente mas podem ser convertidosnuma soma infinita; por exemplo:

F (x) =

∫ x

0

e−t2 dt = x− x3

3× 1+

x5

5× 2+ · · ·+ (−1)n x2n+1

(2n + 1)n!+ · · ·

Para obtermos uma aproximação numérica basta limitar o número de parcelas da soma;quando mais parcelas somarmos melhor será a aproximação obtida.

Dado um valor de x ∈ R, escreva uma função em Matlab que:

(a) Calcule uma aproximação de F (x) somando n (dado) termos da série.

(b) Calcule uma aproximação de F (x) de modo a que, dado um valor de tolerânciaε > 0, some os termos da série até que o valor absoluto do termo seja inferior a ε.Se a função tiver dois parâmetros de saída deve fornecer o número de parcelas.

Sugestão: Escreva o termo geral da sucessão em função do termo anterior, deforma a evitar re-calcular potências e factoriais.

Use as funções anteriores para calcular F (x) para x = 1, (0.05), 1.25.

6.8 A função rand é intrínseca em Matlab. Esta função pode ser usada para obter um nú-mero “pseudo-aleatório” no intervalo [0, 1). A sequência obtida por sucessivas chamadasdesta função é uniformemente distribuída e satisfaz outros critérios de “aleatoridade”;no entanto, não é verdadeiramente aleatória e é possível “configurar” a função para ge-rar sempre as mesmas sequências (ver um manual de Matlab para mais explicações).

Podemos usar esta função para fazer programas que simulam acontecimentos aleatórioscomo jogos de azar. A instrução seguinte simula o resultado de fazer dez lançamentosde um dado com seis faces (numeradas de 1 a 6):

1+fix(6*rand(1,10))

(a) Partindo desta instrução escreva um programa para contabilizar o número de ve-zes que saíram valores pares (2, 4 ou 6) ao longo de 100 lançamentos.(Note que havendo tantas faces pares como ímpares devemos esperar que aproxi-madamente 50% dos lançamentos saiam pares. . . )

(b) Altere o programa de forma a efectuar 100 lançamentos e contabilizar o númerode vezes que dois lançamentos sucessivos somaram 7 ou 11.

Page 29: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

6. Funções 29

6.9 Escreva uma função em Matlab para resolver cada um dos seguintes problemas:

(a) Determinar a média aritmética de quatro números w,x,y,z.

(b) Determinar a mediana de três valores reais x, y, z: neste caso, se os três valoresforem diferentes, a mediana é o valor do meio; se dois ou três forem iguais, amediana é um desses valores iguais. Nota: não utilize a função median doMatlab

(c) Calcular a área e perímetro de uma circunferência dado o raio.

(d) Calcular o volume de um cone dado o raio da base R e a altura h (Volume do cone =πR2h/3).

(e) Escrever a lista dos divisores de um número inteiro n (d é um divisor de n semod(n, d) = 0).

(f) Determinar se um número inteiro n é perfeito, i.e., se é igual à soma dos seusdivisores menores que n.

(g) Calcular a distância entre dois pontos (x1, y1) e (x2, y2) no plano.

(h) Converter coordenadas polares (r, θ) de um ponto no plano em coordenadas rec-tangulares (x, y).

As equações de conversão de coordenadas polares em cartesianas são:

{

x = r cos θy = r sin θ

� 6.10 Dois números naturais n e m dizem-se amigáveis se a soma dos divisores próprios de né igual à de m (os divisores próprios de um número são divisores d tais que 1 ≤ d < n).

(a) Escreva uma função em Matlab (chamada, por exemplo, “divisores”) que cal-cula a soma dos divisores próprios dum número.

(b) Usando a função da alínea anterior, escreva um programa que leia dois númerose diga se são ou não amigáveis.

6.11 Recorde a definição de duas funções importantes em combinatória: arranjos e combi-nações de n elementos p-a-p:

A(n, p) =n!

(n− p)!C(n, p) =

n!

p!(n− p)!

(a) Escreva duas funções em Matlab, “arr” e “comb”, que calculem respectivamenteestas duas funções.Tenha o cuidado de minimizar o número de operações aritméticas efectuadas,quer por uma questão de eficiência, quer para evitar “overflow” desnecessário.Por exemplo: A(100, 98) = 100!/98! = 100× 99 = 9900.

(b) Verifique as suas funções escrevendo um programa que resolve os seguintes pro-blemas:

Page 30: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

30 FEUP — Licenciatura em Eng. Civil — Computação

– Quatro livros são colocados à sorte numa prateleira. Quantas ordenaçõesexistem? R: A(4, 4)

– Quantas mãos distintas de 4 cartas é possível tirar de um baralho com 52cartas? R: C(52, 4)

– Qual a probabilidade de acertar no prémio máximo do Totoloto com uma sóaposta? R: 1/C(49, 6)

� 6.12 Para determinar o dia da semana a que corresponde uma data dada por três variáveisA, M , D, correspondendo respectivamente ao valor do ano, mês e dia (todas inteiras,com 1 ≤ D ≤ 31, 1 ≤M ≤ 12, A ≥ 1582) pode usar-se o seguinte algoritmo:

(Primeiro calculamos um valor FACTOR:)se o mês for Janeiro ou Fevereiro:

FACTOR = 365× A + 31× (M − 1) + D + int((A− 1)/100 + 1)para os restantes meses:

FACTOR = 365× A + 31× (M − 1) + D − int(0.4×M + 2.3)++int(A/4)− int(0.75× (int(A/100) + 1))

O dia da semana é então dado por SEMANA = mod(FACTOR,7)com a correspondência 0≡sábado, 1≡domingo, 2≡segunda,. . . 6≡sexta.

(a) Escreva uma função em Matlabque determina o dia da semana duma data ca-racterizada por A,M,D.

(b) Escreva um programa que use a função da alínea (a) para tabelar o dia de semanado Natal de 1980 até ao ano 2050.

† 6.13 O método de bissecções sucessivas permite obter uma aproximação à raiz dumaequação f(x) = 0: partindo dum intervalo [a, b] onde se encontrar a raiz, vamosdividimo-lo a metade e escolhemos aquela em que a função troca de sinal; o processotermina quando a amplitude do intervalo for inferior à tolerância ε. Ao considerar pararaiz o ponto médio desse intervalo garante-se uma tolerância de ε

2.

Método de bissecções sucessivas:f1 ← f(a)enquanto b− a > ε

m← (a + b)/2f2 ← f(m)se f1 × f2 < 0 então

b← msenão

a← m, f1 ← f2

fim de ciclo enquantosolução ← (a + b)/2

(a) Escreva uma função Matlab f(x) que implemente o método descrito para de-terminar a raiz de uma função real.

Page 31: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

6. Funções 31

(b) Escreva um programa que use a função anterior para determinar a raiz dex3 − x− 3 = 0 partindo do intervalo [1, 2] com uma tolerância 0.0005.

Nota: se preferir defina a função f(x) através de input e inline.

† 6.14 A regra dos trapézios é um método numérico que permite obter um valor aproxi-mado dum integral

∫ b

af(x) dx (que corresponde à área limitada pela gráfico da função

y = f(x) entre [a, b]).

O método consiste em dividir o intervalo [a, b] em n (n inteiro) sub-intervalos e aproxi-mar a função por um segmento de recta em cada sub-intervalo, deste modo o integralé aproximado pela soma de vários trapézios que é dada pela fórmula

∫ b

a

f(x) dx ≈ h

2

(

f(a) + f(b) + 2n−1∑

i=1

f(a + i× h)

)

onde h = (b− a)/n é a amplitude de cada sub-intervalo.

(a) Escreva uma função que aproxime o integral definido por outra função em Ma-

tlab f(x) usando a regra dos trapézios.

(b) Escreva um programa que use a função anterior para aproximar∫ 2

11/x dx com 2,

4, 8 e 16 sub-intervalos. Compare os diferentes resultados com o valor dado pelafunção intrínseca log(2).

� 6.15 A Alice e o Bob vão jogar um jogo de azar: lançam alternadamente uma moeda ao ar,cujo resultado pode ser “cara” ou “coroa” (representado por 0 ou 1). Assumimos que amoeda é equilibrada (i.e., “cara” e “coroa” têm a mesma probabilidade de sair) e que amoeda não pode cair em pé. . . A Alice ganha o jogo se a sequência “001” sair primeiroe o Bob ganha se a sequência “011” sair primeiro.

Pretende-se simular vários jogos e contabilizar quem ganha mais vezes. Para tal, podeusar a função rand do Matlab (ver o exercício 6.8).

Escreva um programa em Matlab que simula N jogos (onde N é dado pelo utilizador)e contabiliza os jogos ganhos por cada jogador. No final o programa deve apresentartambém a frequência com que cada jogador ganhou (=no jogos ganhos/no jogos total).

Nota: qual a frequência de vitórias que espera para cada um?

Page 32: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

32 FEUP — Licenciatura em Eng. Civil — Computação

† 6.16 Um curioso problema é o jogo 1-2-3. Neste jogo, com mais ou menos peripécias inter-médias, é solicitado ao concorrente que adivinhe qual de 3 armários contém um prémio.Após essa escolha o apresentador abre um armário que não tem o prémio e que não

foi o escolhido pelo concorrente.Depois é dada a oportunidade ao concorrente de manter ou mudar a sua “aposta” numdos armários remanescentes.Há duas perspectivas sobre o eventual interesse em modificar a aposta inicial 2:

– Tenho dois armários fechados logo há 50% de probabilidade para cada um. Tantofaz mudar ou não a “aposta”;

– Comecei com 1/3 de probabilidades para o armário em que apostei. Abrir outroarmário não modifica esse facto. Portanto o armário em que não apostei e quepermanece fechado deve ter uma probabilidade de 2/3. Vale a pena mudar a“aposta” inicial.

Utilizando a função rand, escreva uma função que simule este jogo, na estratégia “semmudar de aposta” e indique se ganhou ou perdeu.Escreva outra função semelhante para a estratégia “mudar sempre de aposta”.Depois jogue cada um dos jogos 1000 vezes e tire as suas conclusões.

6.17 Os polinómios de Chebyshev podem ser gerados pela fórmula de recorrência

Tn(x) = 2xTn−1(x)− Tn−2(x) n ≥ 2T0(x) = 1T1(x) = x

onde n é o grau do polinómio.

Escreva uma função para, dados x e n, determinar recursivamente Tn(x).

† 6.18 Considere o jogo designado Torres de Hanoi. Este consiste em três colunas nas quaisse podem encaixar N discos, todos de diâmetros diferentes. O jogo começa com todosos discos na torre 1, empilhados ordenadamente (o maior em baixo). Pretende-se movertodos os discos para a torre 3, obdecendo às seguintes regras:

(1) Só se pode mover um disco de cada vez; o do topo de uma qualquer coluna, parao topo de outra qualquer coluna;

(2) Temporariamente pode usar qualquer das 3 colunas para conter qualquer conjuntode discos;

(3) Por baixo de um qualquer disco só podem existir discos de diâmetro maior.

Experimente resolver o problema “à mão” com N=3 e N=4, antes de avançar para aconstrução de um algoritmo.

2quando, no 2o ano, frequentar a disciplina de Estatística, perceberá o problema, à luz do conceito de

probabilidade condicional

Page 33: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

7. Gráficos no plano 33

7 Gráficos no plano

7.1 Na Command Window dê as instruções necessárias para obter o gráfico dos polinómiosde Legendre P1(x) = x, P2(x) = (3x2− 1)/2 e P3(x) = (5x3− 3x)/2 tal como na figuraabaixo.

−1 −0.8 −0.6 −0.4 −0.2 0 0.2 0.4 0.6 0.8 1−1

−0.8

−0.6

−0.4

−0.2

0

0.2

0.4

0.6

0.8

1Polinómios de Legendre

P1

P2

P3

7.2 Escreva um programa que leia um número natural n e que gere os gráficos cartesiano3

e polar4 das n raizes de ordem n da unidade, exactamente como nas figuras abaixo.

−1 −0.5 0 0.5 1−1

−0.8

−0.6

−0.4

−0.2

0

0.2

0.4

0.6

0.8

1As 5 raizes de ordem 5 da unidade

Real

Imag

inár

ia

0.2

0.4

0.6

0.8

1

30

210

60

240

90

270

120

300

150

330

180 0

As 5 raizes de ordem 5 da unidade

3função plot4função polar, onde se representa um ponto como a extremidade dum vector na origem com comprimento

e ângulo com o eixo dos XXs dados

Page 34: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

34 FEUP — Licenciatura em Eng. Civil — Computação

7.3 Fizeram-se ensaios de tracção de uma mola e obtiveram-se os seguintes resultados:

carga(N) 0.5020 1.495 1.997 2.990 3.492 4.485deformação(cm) 4.0 12.5 17.7 24.5 30.8 38.7

Utilizando as funções polyfit e polyval do Matlab faça:

(a) Ajuste uma recta de regressão a estes dados, determinando também a incertezaestatística associada;

(b) Faça um gráfico com os pontos experimentais e a recta de regressão.

7.4 Escreva um programa que leia uma função (use o comando inline) e faça o seu gráficocartesiano entre 1 e 10, bem como o gráfico da função simétrica (na mesma figura). Ográfico deverá ser a preto e branco.Um exemplo do que se pretende é a figura abaixo, obtida para a função sinusoidal.

1 2 3 4 5 6 7 8 9 10−1

−0.8

−0.6

−0.4

−0.2

0

0.2

0.4

0.6

0.8

1

sin(x) −sin(x)

7.5 Escreva um programa que peça os parâmetros requeridos (a e nalguns casos b) e desenheas seguintes curvas:

(a) Espiral de Arquimedes: r = a ∗ θ

(b) Espiral de Pascal: r = a + b ∗ cos(θ)

(c) Cissóide de Diocles: y2 = x3

2a−x, com 0 ≤ x < 2a

(d) Ovais de Cassini: r4 + a4 − 2a2r2cos(2θ)) = b4

(e) Fólio de Descartes: x = 3at1+t3∧ y = 3at2

1+t3

Page 35: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

7. Gráficos no plano 35

7.6 Represente graficamente múltiplas iterações (e.g. 1000), para um qualquer ponto departida, dos sistemas:

(a) yn+1 = sin(yn), com yi ∈ R

(b) yn+1 = cos(yn), com yi ∈ R

(c) yn+1 = eyn , com yi ∈ R

(d) yn+1 = 3 ∗ yn ∗ (1− yn), com yi ∈]0, 1[

(e) yn+1 = 4 ∗ yn ∗ (1− yn), com yi ∈]0, 1[

(f) O caso anterior é um exemplo de um sistema caótico. Para esses sistemas arepresentação temporal não é a melhor. A estrutura do sistema pode ser melhorobservada no espaço de fase que, para um sistema discreto como este, é umarepresentação no plano presente-futuro ou seja yn vs yn+1. Represente nesse planoa evolução do sistema.

7.7 Resolva o problema 5.24 utilizando a função hist. Faça um gráfico apropriado (umhistograma).

Page 36: Exercícios de Computação2 FEUP — Licenciatura em Eng. Civil — Computação •Os exercícios marcados com o símbolo foram retirados de exames da disciplina. •Os exercícios

36 FEUP — Licenciatura em Eng. Civil — Computação

8 Gráficos tridimensionais

8.1 Faça um gráfico das curvas:

• x = (1− sin(t)) ∗ (2− cos(2t)), y = (2 + sin(t)) ∗ (1 + cos(2t)), z = t

• x = t ∗ cos(t)/10, y = t ∗ sin(t)/10, z =√

1− x2 − y2, com linha preta.

8.2 Sobre a última curva que desenhou represente graficamente a esfera unitária, sem grelhade construção (shading ...);

8.3 Faça o gráfico de superfície de z = sin(x) ∗ sin(y), com x, y ∈ [−2, 2]. Sobreponha-lhe5 curvas de nível, com legenda.

8.4 Faça o gráfico de superfície de z = sin(x+sin(y)), com x, y ∈ [−10, 10]. De igual modofaça a sua representação em planta, com linhas de nível e cor, simultaneamente.

8.5 Faça a representação gráfica, do modo que achar mais conveniente, da função f definidacomo: f(0, 0) = 0 e f(x, y) = xy(x2−y2)/(x2 +y2), para x, y ∈ [−2, 2]∧ (x, y) 6= (0, 0).

8.6 Faça a representação gráfica, do modo que achar mais conveniente, da função g definidacomo: g(x, y) = x2y/(x2 + y2), para x, y ∈ [−1, 1] ∧ (x, y) 6= (0, 0). Da análise gráficaestime

limx,y→0

g(x, y)

8.7 Faça a representação gráfica, do modo que achar mais conveniente, da função h definidacomo: h(x, y) = x2/(x2 + y2), para x, y ∈ [−1, 1] ∧ (x, y) 6= (0, 0). Da análise gráficaestime

limx,y→0

h(x, y)

8.8 Escreva as instruções necessárias para obter exactamente o gráfico abaixo.

−4

−2

0

2

4

−4

−2

0

2

4−3

−2

−1

0

1

2

3

parte real

Parte imaginária da raiz quadrada de complexos

parte imaginária

z