Programação de Computadores I UFOP DECOM 2013–2 Aula prática 5 Revisão: Variáveis, Expressões, Matrizes, Comandos de Desvio Tarefa 1: Lei de Gravitação Universal A Lei de Gravitação Universal de Newton, nos diz que quaisquer dois corpos no universos se raem com uma força proporcional ao produto de suas massas e o inverso do quadrado da distância entre eles, como ilustrado na a figura. Se m1 e m2 são as massas dos dois corpos, em kg, e r é a distância entre eles, em metros, a força é dada em Newtons e o valor da constante de gravitação universal g é 6.674 × 10 −11 N.m/kg2 . Escreva um programa que leia os valores das massas de dois corpos, em unidades de 1024 kg, e a distância entre eles, em km, e calcule a força de atração gravitacional entre eles, em Newtons. No exemplo abaixo, os dados de entrada são, respectivamente, a massa da terra, a massa da Lua e a distância entre esses dois astros. Exemplo de execução da aplicação Força Gravitacional -------------------------------Informe a massa do corpo 1 (em 10^24 kg): 5.9742 Informe a massa do corpo 2 (em 10^24 kg): 0.0736 Informe a distância entre eles (em km): 384402 Força gravitacional = 1.98597e+20 Newtons 1 Tarefa 2: Excentricidade de uma elipse A excentricidade de uma elipse é definida como: r b^2 1− a onde a é o semieixo maior e b é o semieixo menor da elipse. Escreva um programa que leia os comprimentos dos semieixos de uma elipse, como um vetor de 2 valores, e calcule e imprima a excentricidade da elipse. O programa deve verificar se o dado de entrada é válido, isto é, se é um vetor com exatamente 2 valores, ambos positivos. Caso contrário, deve imprimir a mensagem valor inválido. Dois valores apenas representam os semieixos de uma elipse se satifazem a relação 0 < b2 /a ≤ 1, onde a é o maior e b é o menor desses valores. Se isso não ocorrer, o programa deverá imprimir a mensagem não é uma elipse. Obs: Excentricidade igual a 1 significa que o objeto é um círculo. Exemplo de execução da aplicação Excentricidade da elipse -------------------------------Digite os comprimentos dos semieixos da elipse: [3 12] Excentricidade = 0.5 Exemplo de execução da aplicação Excentricidade da elipse -------------------------------Digite os comprimentos dos semieixos da elipse: [3 8] Não é uma elipse Dicas: 1. O comando input pode ser usado para ler um vetor. Por exemplo, se for usado o comando v = input("Digite um vetor:"), e a entrada for [2 8] (ou [2,8]), o valor de v será este vetor. 2. O comando if-then-else pode ser usado para determinar qual, dentre 2 elementos, é o maior e qual é o menor. Entretanto, uma maneira mais fácil de fazer isso, em Scilab, é usando as funções pré-definidas max e min, que determinam, respectivamente., o máximo e o mínimo de um vetor (ou matriz). 3. Outra alternativa, ainda mais eficiente e elegante, é ordenar o vetor lido em ordem decrescente (ou crescente) e obter o menor e o maior semieixo como o segundo (primeiro) e primeiro (segundo) elementos do vetor ordenado, respectivamente. Para ordenar o vetor de entrada, em Scilab, pode-se usar a função pré-definida gsort. Por exemplo, se A = [4,2,9,1] e for executado o comando B = gsort(A), o valor de B será o vetor [9,4,2,1]. A função gsort implementa um algoritmo sofisticado e eficiente para ordenação de matrizes, chamado quicksort. Mais à frente, neste curso, você irá aprender um algoritmo para ordenar vetores, embora um pouco mais simples e menos eficiente. 4. Procure implementar uma das soluções sugeridas acima. Como exercício adicional, tente, mais tarde, implementar as outras versões do mesmo programa. Compare os códigos obtidos do ponto de vista de clareza, concisão e elegância. 2 Tarefa 3: Usando operações sobre vetores Considere a função definida por: f (x) = (x 2 × e x/2 ) k √ onde k = 2 + 0, 02. Escreva um programa que calcule e imprima a tabela de valores de f (x) para x variando no intervalo de -5 a 5, em incrementos de 1. Imprima também o valor máximo de f (x) para x variando neste intervalo, e para qual valor de x este valor máximo ocorre. Exemplo de execução da aplicação Tabela de valores de f(x) para x=-5:1:5 -------------------------------------x f(x) -5 2.8039 -4 3.0285 -3 2.7182 -2 1.7402 -1 0.4882 0 0.0000 1 2.0485 2 30.6446 3 200.8603 4 939.0901 5 3648.5652 --------------------------------------Valor mínimo de f(x) = 0.0000, para x = 6 Dica: Você não deve preocupar-se muito com a formatação da tabela de valores da função. O objetivo deste exercício é que você aprenda a usar operações e funções sobre vetores. De qualquer modo, se você quiser imprimir a tabela exatamente como no exemplo acima, basta usar os comandos: printf("\n--------------------------------------\n") printf(" x f(x)\n"); printf("%2.0f %9.4f \n",[xs’ fxs’]) printf("---------------------------------------\n") onde T é a tabela de valores a serem impressos, com 2 colunas, a primeira contendo os valores de de x e a segunda os valores correspondentes de f (x). Como você poderia criar esta tabela, a partir dos vetores de valores de x e de f (x)? 3 Tarefa 4: Dias decorridos no ano Escreva um programa que leia uma data, como um vetor no formato [d m a] onde d é o dia, m é o mês e a é o ano, e calcula o número de dias decorridos desde o início do ano até esta data. Seu programa deve verificar se a data informada é válida, isto é, se a > 0, 1 ≤ m ≤ 12 e 1 ≤ d ≤ Dm , onde Dm é o número de dias do mês m. Caso a data informada não seja váida, o programa deve terminar, imprimindo data inválida. Para verificar se a data é válida e calcular o número de dias decorridos desde o início do ano, será necessário saber o número de dias de cada mês. Como você pode manter tal informação no seu programa? Também será necessário saber se o ano é bissexto ou não, para determinar corretamente o número de dias do mês de fevereiro. Para determinar se um ano é bissexto ou não, é usada a seguinte regra: um ano é bissexto somente se ele é divisível por 400, ou se ele não é divisível por 100 mas é divisível por 4. Exemplo de execução da aplicação Cálculo de dias decorridos -------------------------------Digite a data no formato [d m a]: [3 3 2013] Número de dias decorridos = 62 Exemplo de execução da aplicação Cálculo de dias decorridos -------------------------------Digite a data no formato [d m a]: [3 3 400] Número de dias decorridos = 63 Exemplo de execução da aplicação Cálculo de dias decorridos -------------------------------Digite a data no formato [d m a]: [3 3 1300] Número de dias decorridos = 62 Dicas: 1. Uma boa maneira de armazenar a informação sobre o número de dias de cada mês é usando um vetor. O número de dias de um dado mês pode então ser obtido por meio de indexação neste vetor, com o índice apropriado. 2. Você pode usar um comando if para determinar se um ano é bissexto ou não. Entretanto, a maneira mais elegante e concisa de fazer isso é usando uma expressão lógica. 3. O que você deve fazer para calcular o número de dias decorridos até uma data [d m a] válida? Você precisará somar o número de dias de todos os meses de 1 a m − 1 e depois somar d, não é? Para obter a primeira parcela, você pode usar a função sum, aplicada ao subvetor apropriado do vetor de dias de cada mês. 4