Programação de Computadores I UFOP DECOM 2013–2 Exercícios de Revisão Comandos de Repetição Sumário 1 Testes de Compreensão 1 2 Exercícios de Programação 2 1 Testes de Compreensão 1. Determine o valor de n ao final de cada um dos trechos de programa a seguir, e determine também o número de iterações executadas em cada loop. n=1; while modulo(n,10)<>0 n=n+1; end n=2; while n <= 200 n=n^2; end n=2; while ir > 200 n=n^2; end 2. Determine os valores das variáveis v1, v2 e v3 ao final da execução de cada um dos trechos de programa a seguir. v = [2 5 8 3]; [L,C] = size(v) for i=1:C v1(1,i) = v(1,i)+10 v2(1,i) = v(1,L-i); v3(1,i) = v(1,i) > 3 end m = [1 5 3 8; 2 4 0 1; 0 1 2 3]; [L,C] = size(v) for i=1:C v1(1,i) = v(1,i)+v(2,i) v2(1,i) = v(1,i) > v(2,i); v3(1,i) = v(i,1) + v(i,2) end 1 2 Exercícios de Programação 1. Quando um resistor (R), um capacitor (C ), e uma bateria (V ) são conectadas em série, a carga no capacitor (Q) aumenta ao longo do tempo, de acordo com a fórmula a seguir, se o capacitor estiver completamente descarregado, no instante de tempo t = 0: Q(t) = CV (1 − e −t /RC ) Escreva um programa para monitorar a carga no capacitor, até que uma determinada carga seja atingida. Seu programa deve ler os seguintes dados: a voltagem da bateria (V ), os valores da resistência (R) do resistor e da capacitância (C) do capacitor, e o valor da carga (Q) a ser obtida no capacitor. O programa deve imprimir uma tabela da carga do capacitor em cada instantes de tempo, a partir do instante inicial t = 0, em intervalos de 0.1, até que seja atingida a carga desejada no capacitor. Exemplo de execução da aplicação Carga de capacitor ---------------------Voltagem da bateria: 9 Valor da resistência: 4 Valor da capacitância: 3 Carga desejada: 2 Tempo 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 Carga 0.00 0.22 0.45 0.67 0.89 1.10 1.32 1.53 1.74 1.95 2. Você vai construir um programa para controlar o congelador da sua geladeira para gelar sua cerveja na temperatura que você gosta – super gelada! A idéia é que o congelador tem sensores de temperatura interna e de temperatura externa, e você pode programar a temperatura desejada para a cerveja. O visor do congelador exibe uma mensagem avisando quando a cerveja está na temperatura desejada, e quanto tempo foi necessário para atingir essa temperatura. Ele também avisa quando a cerveja está prestes a congelar, ou seja, quando a temperatura da cerveja chaga a 0o C. Como não dispomos aqui desses sensores, seu programa deverá ler 3 valores de temperatura: a temperatura interna TC , a temperatura externa TE , isto é, a temperatura da cerveja no momento em que ela é colocada no congelador, e a temperatura desejada TD . Vamos supor que a cerveja é colocada no congelador no momento em que é informada a temperatura desejada. A partir daí, a temperatura da cerveja Ti , depois de decorridos i minutos após a cerveja ser colocada na geladeira, é calculada do seguinte modo: T0 = TE Ti+1 = Ti − K (Ti − TC ) onde K é uma constante de resfriamento, cujo valor vamos supor que seja K = 0.05. O programa deve exibir as duas mensagens solicitadas, como mostra o exemplo a seguir. 2 Exemplo de execução da aplicação Cerveja gelada! ---------------Temperatura externa: 27 Temperatura do congelador: -3 Temperatura desejada da cerveja: 4 Sua cerveja está gelada! Temperatura = 4 C, tempo = 29 min Sua cerveja congelou! Temperatura = -0 C, tempo = 45 min 3. Suponha que você deposita R$ 500,00 reais em uma conta de investimento, no início de cada mês. No final de cada mês, é creditado um rendimento de 1% do saldo total da conta. Por exemplo, no final do do primeiro mês, o saldo da conta seria R$ 505,00, e ao final do segundo mês seria R$ 1015,10. Escreva um programa que calcule e imprima o saldo da conta, ao final de cada mes, ao longo do período de 1 ano, a partir do mes em que é feito o primeiro depósito. Exemplo de execução da aplicação Conta de Investimento -----------------------Mês Saldo 1 505.00 2 1015.10 3 1530.20 \vdots 12 6404.70 4. Os plano de cargos e salários de uma determinada empresa consiste de 7 diferentes níveis de salário mensal: 1.500,00, 2.400,00, 3.500,00, 5.000,00 7.000,00, 9.000,00 e 12000. O número de empregados da empresa em cada um desses níveis de salário é, respectivamente: 3000, 2500, 1500, 1000, 400, 100 e 25. Escreva um programa que imprima uma tabela com os valores dos níveis de salário e o número de empregados em cada nível, e calcule e imprima também os seguintes dados: (a) O salário mensal médio (b) O número de empregados com salário acima e abaixo do salário médio. (c) O salário médio pago (i.e., a soma dos salários mesnsais pagos a todos os funcionários dividido pelo número de funcionários). Exemplo de execução da aplicação Plano de Salários -----------------------Nível Valor Empregados 1 1500.00 3000 2 2400.00 2500 3 3500.00 1500 \vdots 7 12000,00 25 Salário médio: 4900.00 Empregados com salário acima do médio: 577 Empregados com salário abaixo do médio: 7000 Média de pagamentos mensais: 3 5. As tabelas a seguir apresentam dados de produção e venda mensal de minério em duas mineradoras pertences à companhia Ouro Preto Minas S.A. Escreva um programa que leia os dados dessas tabelas na forma de 2 matrizes, M1 e m2 , respectivamente. O programa deve então calcular o lucro de cada uma das mineradoras, em cada mês, assim como o lucro total no período, de toda a companhia. Para efeito deste cálculo, considere que todo o minério produzido em um mês é vendido neste mesmo mês. Determine também qual das duas mineradoras deu maior lucro no período. Produção (ton) Custo (R$/ton) Venda (R$/ton) 1200 4,00 4,50 Mineradora Cachoeira 1000 1500 2100 1800 4,50 3,90 3,50 3,80 4,50 5,00 4,80 4,50 Produção (ton) Custo (R$/ton) Venda (R$/ton) 1800 4,00 4,50 Mineradora Itabirito 1500 1500 2000 1700 5,00 4,00 3,80 4,10 4,50 4,80 4,50 4,70 1500 4,00 4,10 2000 3,50 4,50 1900 3,50 4,70 1600 4,00 4,10 2100 3,60 4,60 1900 3,70 4,70 6. Uma sequência é um palíndromo se ela é igual ao seu reverso. Por exemplo, as seguintes sequeências de numeros inteiros são palíndromos: 010 123321 3247423 Escreva um programa que leia, repetidamente, uma sequência de números (como um vetor de linha) e determine se a sequência lida é um palíndromo ou não, conforme exemplificado a seguir. O programa deve terminar quando for digitada uma sequência vazia. Exemplo de execução da aplicação Palíndromo -----------------------Digite uma sequência de números: É um palíndromo [1 3 5 4 5 3 1] Digite uma sequência de números: Não é um palíndromo [1 3 5 4] Digite uma sequência de números: Tchau [ ] 7. Escreva um programa que leia um vetor de algarismos decimais e obtenha o número decimal correspondente, conforme exemplificado a seguir. Seu programa deve verificar se cada elemento do vetor dado como entrada é um algarismo decimal. Exemplo de execução da aplicação Algarismos -> Número -----------------------Digite uma sequência de algarismos: Entrada inválida! Digite uma sequência de algarismos: Número decimal = 34531 [3 12 31] [3 5 4 5 3 1] 8. Escreva um programa que leia um número inteiro não negativo e determine a sequência de algarismos que compõem esse número. Seu programa deve verificar se a anetrada é um valor válido, isto é, um número inteiro ≥ 0, conforme exemplificado a seguir: 4 Exemplo de execução da aplicação Número -> Algarismos -----------------------Digite um número inteiro >=0: 3.56 Entrada inválida! Digite um número inteiro >=0: 34531 Número decimal = [3 5 4 5 3 1] 9. Escreva um programa que leia um número inteiro positivo n e determine todos os divisores de n, exceto o próprio n. Por exemplo: Exemplo de execução da aplicação Divisores de n -------------Digite um número inteiro positivo: 220 Divisores: 1 2 4 5 10 11 20 22 44 55 110 10. Dois números inteiros positivos n1 e n2 são ditos amigos se a soma dos divisores de n1 é igual a n2 e vice-versa.1 Por exemplo, 220 e 284 são números amigos, pois a soma dos divisores de 220 é 1+2+4+5+10+11+20+22+44+55+110=284 e a soma dos divisores de 284 é 1+2+4+71+142=220. A tabela a seguir relaciona alguns outros pares de números amigos: n1 220 2620 12285 17296 69615 n2 284 2924 14595 18416 87633 Exemplo de execução da aplicação Números amigos -------------Digite n1: 220 Digite n2: 284 São amigos Exemplo de execução da aplicação Números amigos -------------Digite n1: 756 Digite n2: 41 Não são amigos 11. Um número é primo se ele não é divisor de nenhum outro número exceto ele próprio e 1. Escreva um programa que leia um número inteiro positivo n e determine se ele é primo. Exemplo de execução da aplicação Números primos ---------------Digite um número inteiro positivo: 4058879 Não é primo 1 Veja, por exemplo: http://www.shyamsundergupta.com/amicable.htm. 5 Exemplo de execução da aplicação Números primos ---------------Digite um número inteiro positivo: 2147483647 É primo Dica: A solução natural para este problema consiste em testar se o número lido, n, é divisível por 2, 3, 4 · · · , e assim sucessivamente, até encontrarmos um número k, tal que n seja divisível por k, ou concluirmos que n é primo. Para que valores de k devemos testar se n divide k? Naturalmente, poderíamos testar para valores de k = 2, 3, . . . (n − 1). Entretanto, podemos restringir essa faixa de valores, de modo a tornar nosso programa √ mais eficiente: k = 2, 3, . . . , b nc. As seguintes estratégias podem também ser adotadas para tornar o programa ainda mais eficiente: (a) Teste inicialmente se n é par, isto é, se n é divisível por 2. Em caso afirmativo, o programa termina imediatamente, informando que n não é primo. (b) Se n não for par, podemos testar a divisibilidade de n apenas para números ímpares, √ isto é, para k = 3, 5, 7, . . . , b nc. 12. O valor de π pode ser aproximado pela seguinte série: π 1 1 1 = + + +... 8 1x3 5x7 9x11 A tabela a seguir mostra como o valor calculado considerando-se n termos da série aproximase de π, à medida que n cresce. n 1 2 3 .. . π-aprox 2.666666666667 2.895238095238 2.976046176046 10 .. . 3.091623806668 20 .. . 3.116596556794 100 .. . 3.136592684839 1000 .. . 3.141092653621 10000 3.141542653590 Escreva um programa que leia um valor n ≥ 1 e calcule um valor aproximado para π, usando n termos da série acima. Exemplo de execução da aplicação Valor aproximado de pi -----------------------Número de iterações: 100 pi = 3.136592684839 13. Em Análise Numérica, o Método de Newton-Raphson é um método para encontrar aproximações sucessivas para os zeros de uma função f : R → R.2 Este método pode ser 2 Para saber mais sobre este método veja, por exemplo http://en.wikipedia.org/wiki/Newton%27s_method. 6 usado para o cálculo de aproximações sucessivas para a raiz quadrada de um número real r, conforme explicado a seguir. Começamos "adivinhando"um valor x 0 qualquer como √ √ uma aproximação para r. A partir daí, obtemos valores cada vez mais próximos de r , por meio de iterações sucessivas, onde, em cada iteração n ≥ 1, calculamos um valor √ aproximando x n para r, do seguinte modo: x n = x n−1 − x 2n−1 − r 2x n−1 √ Por exemplo, considere o cálculo de uma aproximação para 10, começando √ com x 0 = 5. Por meio de iterações sucessivas, obtemos as seguintes aproximações para 10: n xn 0 x0 = 5 1 x1 = x0 − 2 x2 = x1 − 3 x3 = x2 − 4 x4 = x3 − .. .. . . x 02 −10 2x 0 x 12 −10 2x 1 x 22 −10 2x 2 x 32 −10 2x 3 52 −10 2.5 = 3.5 2 −10 3.5 − 3.5 2.3.5 = 3.1785714 2 −10 3.1785714 − 3.1785714 2.3.1785714 = 2 −10 3.1623194 − 3.1623194 2.3.1623194 = =5− = = = 3.1623194 3.1622777 Escreva um programa para cálculo de um valor aproximado para a raiz quadrada de um número real r, usando o método de Newton. Você pode usar como uma aproximação inicial o valor x 0 = r/2. Você vai construir duas diferentes versões do programa: (a) O programa deve ler o número real r e um número inteiro positivo n e calcular um √ valor aproximado para r, usando n iterações do método de Newton-Raphson. Exemplo de execução da aplicação Cálculo de raiz quadrada ------------------------Número: 10.5 Iterações: 10 Raiz de 10.5 = 3.240370349204 (b) O programa deve ler o número real r e um erro de aproximação desejado δ e calcular √ um valor aproximado para r tal que o erro de aproximação seja ≤ δ. Em outras √ palavras, o programa deve calcular valores aproximados para r em sucessivas iterações, até que a diferença entre os valores calculados em iterações consecutivas – x n − x n−1 – seja menor ou igual a δ. Imprima também o número de iterações √ requeridas para se obter uma aproximação para r com o erro desejado. Exemplo de execução da aplicação Cálculo de raiz quadrada ------------------------Número: 10.5 Erro: 0.000001 Raiz de 10.5 = 3.240370349204 Número de iterações = 5 14. Uma matriz quadrada M é um quadrado mágico se todos os seguintes cálculos resultam em um mesmo valor, o qual é chamado de constante mágica da matriz M: 3 • a soma de todos os valores, em cada linha de M 3 Veja http://en.wikipedia.org/wiki/Magic_square. 7 • a soma de todos os valores, em cada coluna de M • a soma de todos os valores na diagonal de M • a soma de todos os valores na diagonal secundária de M É possível construir um quadrado mágico n × n para qualquer valor de n, exceto para n = 2. A figura a seguir ilustra um quadrado mágico 3 × 3: Escreva um programa que leia um matriz e verifique se ela é ou não um quadrado mágico. Se a matriz dada como entrada não for uma matriz quadrada, o programa deve simplesmente responder que ela não é um quadrado mágico. Exemplo de execução da aplicação Quadrado mágico ----------------Digite uma matriz quadrada: [2 7 6; 9 5 1; 4 3 8] É um quadrado mágico: k = 15 Dica: (a) O operador de comparação de igualdade (==) pode também ser usado para verificar se todos os valores de uma matriz ou vetor são iguais ao um determinado valor. Uma expressão da forma M == n, onde M é uma matriz de números e n é um número, resulta em uma matriz de valores lógicos (%t ou %t), em que cada elemento é o resultado de comparar o elemento correspondente de M com o valor n. Por exemplo: -->M = [1 2 1; 2 2 1] M = 1. 2. 2. 2. 1. 1. -->K = M == 1 K = T F T F F T (b) A função and recebe como argumento uma matriz de valores lógicos M e retorna como resultado a conjunção de todos os valores de M. Por exemplo, supondo que K é a matriz do exemplo acima, teríamos: -->and(K) ans = F -->and([%t %t %t]) ans = T 8