Física Computacional - FSC-5705

só um divisor

Blocos de repetição

A estrutura de repetição padrão do python é o while (condição): bloco. A condição é alguma condição lógica válida a qual pode ser até mesmo só um True transformando esse bloco em um "loop" infinito, nesse caso devemos colocar um if que quando seja verdeiro execute um break do loop. A fim de entender melhor vejamos o seguinte exemplo que calcula a sequencia de fibonacci até que um número o próximo número da sequência seja maior do que 10000

            #!/usr/bin/env python
            #-*- coding:  utf-8 -*-

            f1 = 1
            f2 = 1

            proximo = f1 + f2

            while (proximo <= 10000):
              print proximo
              f1      = f2
              f2      = proximo
              proximo = f1 + f2  
          

Observe que podemos ter feito essa mesma sequência utilizando loop infinito

            #!/usr/bin/env python
            #-*- coding:  utf-8 -*-

            f1 = 1
            f2 = 1

            proximo = f1 + f2

            while True:
              print proximo
              f1      = f2
              f2      = proximo
              proximo = f1 + f2
              if (proximo > 10000):
                break
          

Além do while o python disponibiliza o for que é ótimo para percorrer elementos de um objeto complexo, tipo arquivos, vetores, etc. A função range() é uma função ótima para ser utilizada junto com for já que ela gera uma sequência de números que vão de zero até o valor colocado entre as chaves, vejamos uns exemplos

            #!/usr/bin/env python
            #-*- coding:  utf-8 -*-

            import numpy as np

            sigma = 1.0  #desvio standard
            ro    = 0.0  #media


            y = np.random.normal(ro, sigma, 1000) #sera criada um matriz de 1
                                                  # dimensao com 1000 elementos

            print type(y)  #type devolve o tipo do objeto, no caso numpy.ndarray
            print y.shape  #shape devolve a forma da matriz, no  caso(1000, )
            print y.ndim   #ndim devolve a quantidade de dimensoes da matriz
                           #no caso 1
            
            
            for i in range(y.shape[0]):     #shape[0] diz a quantidade de elemento
                                            #na dimensao 0 do objeto y
              print y[i]    #imprime o i esimo elemento do objeto
          
[usuario@pclabfis: ]# python exemplo03.py
(1000,)
1
-1.29235459449
-0.752640416846
-0.696618566703
.
.
.
-0.0366610523126
0.435891805209
-0.53997139387
-0.970165442125

No exemplo acima são gerados 1000 números aleatórios e armazenados num objeto numpy.ndarray. Utilizando a função range obtemos a quantidade de dados na dimensão 0 da matriz y y logo é impresso cada dado do vetor. Outro uso comum do for é para ler as linhas de um arquivo aberto.

Além do uso dado a range no exemplo previo, ele pode simplesmente ser utilizado para gerar uma sequência de números desde inicio até fim com um incremento, segundo: range(inicio, fim, incremento, se o inicio é omitido o primeiro número gerado é zero, se omitimos incremento, ele é escolhido como sendo 1.

            #!/usr/bin/env python
            #-*- coding: utf-8 -*-
            
            ini = 1
            fim = 10
            inc = 2
            
            for i in range(ini, fim, inc):
              print i
          
[usuario@pclabfis: ]# python exemplo04.py
1
3
5
7
9

Existe uma outra função similar chamada xrange que se diferencia da primeira no fato dela gera número a numero, enquanto que range gera uma lista (vetor) que fica em memoria, isso é ruim se a lista é muito grande

Exercícios

  1. Escreva um programa que converta galões para litros sabendo que $l = 3.785 g$, onde $l$ é o volume em litros e $g$ em galões. O programa devera imprimir na tela a conversão de 10 até 20 galões, de 1 em 1.
  2. Escreva um programa que converta de pês para metros sabendo que $m = p / 3.28$. O programa deverá imprimir na tela o resultado da conversão para valores que vão desde 2 até 30 metros, de 3 em 3.
  3. O valor da constante de Euler, $e$, pode ser aproximada utilizando a equação \[ e = 1 + 1/1! + 1/2! + 1/3! + 1/4! + 1/5!\cdots \nonumber \] Escreva um programa que calcule dita constante utilizando um loop while o qual deve parar sua execussão quando as diferencia entre duas aproximações sucessiva seja menor do que $1.0\times 10^{-6}$.
  4. A probabilidade de que um ligação telefônica tenha uma duração de $t$ minutos pode ser aproximada pela função exponencial \[ P(< t) = 1.0 - e^{-\frac{t}{a}} \nonumber \] onde $a$ é valor médio que dura uma ligação. Supondo que $a=2.4$ minutos calcule a probabilidade de que a camada dure menos do que $t$ minutos e imprima na tela todas as probabilidades desde $0$ até $t$ minutos, com incremento de $1$ em $1$ minutos (o $t$ deverá ser informado pelo usuário)
  5. Construa um programa que leia continuamente (loop infinito) as notas de um aluno (entre 0.0 e 10.0). Se o numero digitado for negativo o programa deverá terminar de ler os dados e imprimir o valor médio das notas digitadas.
  6. Calcule a raiz quadrada $X$ de um número $Y$ por aproximação sucessiva. Use como chute inicial o seguinte valor \[ X_1 = \frac{Y}{2} \nonumber \] e a sucessivas aproximações serão \[ X_{n+1}=\frac{X^2_n+Y}{2X_n} \nonumber \] Note que primeiro se usa $Y$ para calcular $X_1$, depois $X_1$ se utiliza para calcular $X_2$ ($n=2$) esse valor se utiliza para calcular $X_3$ ($n=3$) e assim sucessivamente. O programa deverá parar de calcular quando $X_{n+1} - X_n<1.0\times 10^-6$
  7. O cometa Halley tem um período de 76 anos. Se a última aparição dele foi em 1986, construa um programa que imprima as próximas 10 aparições.
  8. Um método para se determinar o máximo comum divisor (MDC) de dois números $N$ e $M$ é extraindo sucessivamente o menor dos números do maior e esse processo deve ser mantido até que os dois valores se tornem iguais, como exemplo tomemos $M=20$ e $N=15$, nesse caso:
    20-15=5 $\;\;\;$ 15
    5 $\;\;\;$ 15-5=10
    5 $\;\;\;$ 10-5=5 --> MDC
    Crie um programa que dados dois números inteiros quaisquer calcule o MDC e imprima em tela.
  9. Escreva um programa que calcule o fatorial de um número inteiro. Lembre que por definição \[ N! = 1 * 2 * 3 * 4 *\cdots * (N-1) * N \nonumber \] e \[ N! = 1; \;\;\;N = 0 \nonumber \]
  10. Escreva um programa que leia um número e verifique se é ou não um número primo. Para fazer essa verificação, calcule o resto da divisão $%$ de número por $2$ e depois por todos os números impares o número lido Se o resto de uma dessas divisões for igual a zero, o número não é primo. Observe que $0$ e $1$ não são números primos e que $2$ é o único primo que é par.