Introdução à Programação - minor João Pedro PEDROSO Departamento de Ciência de Computadores Faculdade de Ciências da Universidade de Porto Ano lectivo de 2012/2013 [email protected] Aula número 4 Revisões 1. Escreva uma função sumTo(n) cujo resultado é a soma dos inteiros até n, inclusive. Utilize a fórmula Pn n(n+1) . i=1 i = 2 onde s = (a + b + c)/2 é o semi-perímetro do triângulo. Implemente uma função area_triang(a,b,c) que calcule a área de um triângulo usando esta fórmula. 2. A distância no plano entre dois pontos de coordenadas (x0 , y0 ) e (x1 , y1 ) é dada pela norma Euclidiana do vetor diferença p entre os dois pontos, i.e. |(x1 , y1 ) − (x0 , y0 )| = (x1 − x0 )2 + (y1 − y0 )2 . Implemente uma função dist(x0, y0, x1, y1) que calcule esta distância. 4. A área de um polígono regular com n lados inscrito num círculo de raio r é:1 3. A área de um triângulo cujos lados medem a, b e c pode ser calculada usando a fórmula de Heron: p área∆ = s(s − a)(s − b)(s − c) Implemente uma função area_poligono(n,r) que calcule a área dum polígono regular usando esta fórmula. área(n, r) = 1 n sin(2π/n)r2 2 Iteração, padrão acumulador 5. Reescreva a função sumTo(n) (cujo resultado é a soma dos inteiros até n, inclusive) utilizando o padrão do ciclo com acumulador. 6. A constante de uma mola pode ser determinada por regressão linear: dada uma lista de n observações da extensão da mola ei quando nela são suspensos pesos pi , a constante é estimada por Pn e Pni=1 i . p i=1 i Escreva a função mola(e,p) que, dadas listas com observações e e p retorna a constante da mola. (Nota: pode assumir que ambas as listas têm o mesmo número de observações.) 7. A fórmula de Leibniz para aproximar π é: ∞ X 1 1 1 1 π (−1)n = 1 − + − + + ... = 2n + 1 3 5 7 9 4 n=0 Implemente a função leibniz(k) que resulta no somatório dos primeiros k termos desta série. Documente a sua função com uma docstring. 8. Implemente uma função que calcule o factorial de um número (a) de forma recursiva (b) com um ciclo (c) teste as suas funções com os seguintes argumentos: 0, 1, 2, 3, 10, 1000, ’zero’ e 3.14159. (d) complete a definição de cada uma das funções para que, quando o argumento da função não é válido, imprima uma mensagem de erro. (Nota: use a função type.) Turtle 9. Em Python no modo interativo, crie uma tartaruga, e atribua-a a uma variável. Verifique qual é o tipo dessa variável (utilizando type). 10. Um biólogo esteve a observar uma tartaruga, que no seu percurso fez o seguinte: deu 10 passos, depois rodou um ângulo aleatório, voltou a dar 10 passos, rodou de novo um ângulo aleatório, etc. O biólogo 1 Nota para os craques em cálculo infinitesimal: mostre que lim 2 n→∞ área(n, r) = πr , isto é, quando o número de lados tende para infinito, a área do polígono tende para a área do círculo que o circunscreve. registou os ângulos em cada paragem, sendo os seus dados experimentais [160, -43, 270, -97, -43, 200, -940, 17, -86] (ângulos positivos são contrários ao sentido dos relógios). (a) Utilize o módulo turtle para desenhar o percurso da tartaruga. (b) Complete o programa, para que informe a direção (ângulo) da tartaruga no final. (c) Repita o exercício para o caso em que os ângulos são valores aleatórios, com distribuição uniforme entre -120 e 120 graus. 12. Escreva um programa para desenhar a figura abaixo. Assuma que o lado do quadrado mais pequeno tem dimensão 20, e os dos outros têm dimensão sucessivamente maior em 20 unidades. 11. Implemente uma função (sem valor de retorno) para desenhar um quadrado; o argumento da função deverá ser o comprimento do lado. Utilize-a para desenhar a seguinte figura (assuma que o lado de cada quadrado tem dimensão 20): Expressões lógicas e condições 13. Avalie as seguintes expressões: (a) 3 == 3 (b) 3 != 3 (c) 3 >= 4 (d) not (3 < 4) 14. Sem utilizar o operador not, escreva expressões que sejam o contrário (i.e., a negação) das que se seguem: (a) a > b (b) a >= b (c) a >= 18 and day == 3 (d) a >= 18 and day != 3 15. Escreva uma função que, dada a pontuação obtida num exame (em percentagem), devolve uma string com a nota, de acordo com o esquema: Pontuação Nota ≥ 90 A [80, 90[ B [70, 80[ C [60, 70[ D < 60 F 16. Um ano é bissexto se for divisível por 4, exceto se for múltiplo de 100 e não for divisível por 400. Escreva a função bissexto(n) que resulta em True se n for um ano bissexto e False no caso contrário. 17. Escreva a função ret(a,b,c) que dados os comprimentos dos três lados de um triângulo determina se é retângulo. Assuma que o terceiro argumento corresponde sempre o lado maior. A função deve retornar True se o triângulo for retângulo, e False no caso contrário (utilize uma tolerância de 0.000001). 18. A aritmética em vírgula flutuante (com precisão finita) não é sempre exata; experimente, por exemplo, o teste 0.1 + 0.2 == 0.3. Por essa razão, não é seguro testar a igualdade de floats. Tendo isto em conta, implemente a função is_sqrt(x,y) que devolve True se y for (aproximadamente) a raiz quadrada de x. Para testar a igualdade (aproximada), utilize no seu programa uma construção do seguinte tipo: if abs(a-b) < 0.000001: # ’a’ é aproximadamente igual a ’b’ ... Use o valor aí proposto (0.000001) como tolerância para o erro. Exercício a apresentar: um os seguintes, indicados a itálico, a ser sorteado. 19. ImplementeP a função is_sqr_sum(n,k) que devolve n 2 True caso i=1 i seja igual a k, False no caso contrário. 1 numa série de Maclaurin é dada 20. A expansão de 1−x 2 3 por 1 + x + x + x + x4 + . . . Implemente a função maclaurin(x,n) que devolve a soma dos primeiros n termos da série avaliados em x. 21. Considere a soma x1 + x12 + x13 . Implemente a função is_approx(x,z) que devolve True caso essa soma avaliada em x seja igual a z, False no caso contrário. Nota: como tolerância para o erro utilize o valor 0.000001.