2.26. Exemplos

Exemplo 01. Uma reta pode ser representada por uma equação geral da seguinte forma:

(2.6)\[ax + by + c = 0\]

Considere a reta com os seguintes coeficientes: \(a = 3\), \(b = -2\) e \(c = -6\) (Figura 2.25). Faça um programa que pergunte ao usuário os valores de um par de coordenadas \((x,y)\), aplique a Equação 2.6 e verifique o resultado.

Ilustração de uma reta com coeficientes: a = 3, b = -2 e c = -6

Figura 2.25 - Ilustração de uma reta com coeficientes: \(a = 3\), \(b = -2\) e \(c = -6\).

Solução:
# coeficientes da equação geral da reta:
# Ax + By + C = 0
A = 3.0
B = -2.0
C = -6.0

# realiza a leitura das coordenadas de um ponto (x, y)
x = float(input('x: '))   # lê x
y = float(input('y: '))   # lê y

# se a equação resultar em 0.0,
# significa que o ponto encontra-se sobre a reta
r = A*x + B*y + C

print("Resultado da equação para o ponto ({0}, {1}): {2}".format(x, y, r))

Exemplo 02. Altere o programa da equação geral de uma reta para incluir um teste condicional que escreva na tela a mensagem “Sobre a Reta”, caso o ponto informado esteja sobre a reta; caso o ponto encontre-se acima da reta, deverá ser escrita a mensagem “Acima da Reta”; e, caso o ponto encontra-se abaixo da reta, deverá ser escrita a mensagem “Abaixo da Reta”.

Solução:
# coeficientes da equação geral da reta:
# Ax + By + C = 0
A = 3.0
B = -2.0
C = -6.0

# realiza a leitura das coordenadas de um ponto (x, y)
x = float(input('x: '))   # lê x
y = float(input('y: '))   # lê y

y0 = (-A*x - C) / B

if y > y0:
    print("Acima!")
elif y < y0:
    print("Abaixo!")
else:
    print("Sobre a reta!")

Exemplo 03. Dada a Figura 2.26 abaixo, faça um programa que avalie se as geometrias dos casos 1, 2 e 3 satisfazem o relacionamento espacial TOUCHES. Se os três casos satisfazerem esse relacionamento espacial, então, escreva a mensagem Três casos do relacionamentos touches!, caso contrário, escreva o resultado de cada um deles com mensagens como: Caso 1 satisfaz! ou Caso 1 não satisfaz!.

A geometria A toca a geometria B?

Figura 2.26 - A geometria A toca a geometria B?

Solução:
from shapely import from_wkt

l1 = from_wkt('LINESTRING( 1 7, 1 9, 3 9 )')
l2 = from_wkt('LINESTRING( 1 9, 3 7 )')

caso1 = l1.touches(l2)

l3 = from_wkt('LINESTRING( 1 4, 2 6 )')
l4 = from_wkt('LINESTRING( 2 6, 3 4 )')

caso2 = l3.touches(l4)

l5 = from_wkt('LINESTRING( 5 6, 5 8, 7 8 )')
l6 = from_wkt('LINESTRING( 6 6, 6 9 )')

caso3 = l5.touches(l6)


if caso1 and caso2 and caso3:
    print('Três casos do relacionamentos touches!')
else:
    if caso1:
        print('Caso 1 satisfaz!')
    else:
        print('Caso 1 não satisfaz!')

    if caso2:
        print('Caso 2 satisfaz!')
    else:
        print('Caso 2 não satisfaz!')

    if caso3:
        print('Caso 3 satisfaz!')
    else:
        print('Caso 3 não satisfaz!')

Exemplo 04. Escreva um programa em Python que leia um número inteiro \(n\) entre \(1\) e \(10\) e compute o fatorial desse número. Lembre-se que o fatorial de um número \(n\) é definindo como:

(2.7)\[n! = \prod_{i=1}^{n} i\]

ou,

(2.8)\[\begin{split}\begin{cases} fat(1) = 1, & \text{se $n = 1$}\\ fat(n) = n \times fat(n - 1), & \text{se $n > 1$} \end{cases}\end{split}\]
Solução:
n = int(input("Digite um número no intervalo [1, 10]: "))

if (n >= 1) and (n <= 10):

    fat = 1
    while n > 1:
        fat = fat * n
        n = n - 1
        print('variavel fat', fat)
        print('variavel n', n)

    print("fatorial:", fat)

else:
    print("Número fora do intervalo [1, 10].")
    print("Rode o programa novamente!")

Exemplo 05. A sequência de Fibonacci é uma sequência de números inteiros, começando por \(0\) e \(1\), onde cada termo subsequente corresponde a soma dos dois anteriores:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

A seguinte fórmula recursiva define esta sequência:

(2.9)\[\begin{split}\begin{cases} F_n = F_{n-1} + F_{n-2} \\ F_1 = 1 \\ F_0 = 0 \end{cases}\end{split}\]

Faça um programa em Python que compute a sequência para um número \(n\) qualquer.

Solução:
n = int(input("Digite um número > 1: "))

if n <= 1:
    exit("Entre com um número > 1.")

a = 0
print(a)

b = 1
print(b)

i = 2

while i <= n:
    proximo = b + a

    print(proximo)

    a = b
    b = proximo

    i = i + 1

Exemplo 06. Escreva um programa em Python que leia dois números, \(x\) e \(y\), e calcule a função potência \(x^y\), sem utilizar o operador ** de Python ou alguma função da biblioteca padrão.

Solução:
x = int(input("Digite um número (X): "))
y = int(input("Digite um número (Y): "))
print(x**y)

pot = 1

while y >= 1:
    pot = pot * x

    y = y - 1

print("X^Y:", pot)

Exemplo 07. Escreva um programa em Python que verifique se um número é primo ou não.

Solução:
n = int(input("Digite um número: "))

primo = True

i = 2

while i < n:

    if (n % i) == 0:
        print(i)
        primo = False
        break

    i = i + 1

if primo:
    print(n, "é primo!")
else:
    print(n, "não é primo!")

Exemplo 08. Escreva um programa em Python que gere a tabela de multiplicação dos números de \(1\) a \(10\).

Solução:
i = 1

while i <= 10:
    print("Tabuada:", i)

    j = 1

    while j <= 10:
        print(i, "x", j, "=", i * j)

        j = j + 1

    i = i + 1

    print("")

Exemplo 09. Dada a lista de valores de NDVI:

serie_ndvi = [0.3, -0.3, 0.2, None, 0.9, 0.8, 0.8, None, 0.2, 0.2]

Apresente as seguintes informações:

  • Quantidade de valores inválidos (neste caso: None).

  • Quantidade de valores válidos.

Solução:


Vamos utilizar um laço do tipo for para atravessar os elementos da lista e um comando condicional para contarmos a quantidade de valores válidos e inválidos:

serie_ndvi = [0.3, -0.3, 0.2, None, 0.9, 0.8, 0.8, None, 0.2, 0.2]

validos = 0

invalidos = 0

for v in serie_ndvi:
    if v is None:
        invalidos = invalidos + 1
    else:
        validos = validos + 1

print('Quantidade de valores válidos..:', validos)
print('Quantidade de valores inválidos:', invalidos)

Exemplo 10. O produto MOD13Q1, em geral, armazena os valores dos pixels multiplicados por 10.000. Desta forma um valor 5.000 (inteiro) representa o valor real 0.5 (ponto flutuante) e ocupa menos espaço na memória. Dada uma lista de valores de uma das bandas no produto MOD13Q1:

serie_mod13q1 = [7000, 6000, 3000, 3000, 10000, 2000, 5000, 500, 7500, 3000]

Calcule e apresente a lista de valores reais (divididos por 10.000).

Solução:
serie_mod13q1 = [7000, 6000, 3000, 3000, 10000, 2000, 5000, 500, 7500, 3000]

serie_mod13q1_float = []

for v in serie_mod13q1:
    serie_mod13q1_float.append(v / 10000.0)

print(serie_mod13q1_float)

Exemplo 11. Considere a seguinte lista:

[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

Faça um programa em Python que realize a soma dos valores nessa lista e escreva o valor da soma.

Solução:
l = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

soma = 0

for v in l:
    soma = soma + v

print("Soma:", soma)

Exemplo 12. Considere a série temporal mostrada abaixo, extraída de dados do produto MOD13Q1 gerado a partir do sensor MODIS, para a localização (-54,-12) no período de 01/01/2015 a 19/12/2015:

red_values = (
    168, 398, 451, 337, 186, 232, 262, 349,
    189, 204, 220, 220, 207, 239, 259, 258,
    242, 331, 251, 323, 106, 1055, 170
)

nir_values = (
    2346, 4431, 4638, 4286, 2752, 3521, 2928, 3087,
    2702, 2685, 2702, 2865, 2835, 2955, 3019, 3391,
    2986, 4042, 3050, 3617, 2478, 3361, 2613
)

timeline = (
    "2015-01-01", "2015-01-17", "2015-02-02", "2015-02-18",
    "2015-03-06", "2015-03-22", "2015-04-07", "2015-04-23",
    "2015-05-09", "2015-05-25", "2015-06-10", "2015-06-26",
    "2015-07-12", "2015-07-28", "2015-08-13", "2015-08-29",
    "2015-09-14", "2015-09-30", "2015-10-16", "2015-11-01",
    "2015-11-17", "2015-12-03", "2015-12-19"
)

Faça um programa que:

  • Crie a série temporal do NDVI.

  • Calcule a média do NDVI dessa série temporal.

  • Obtenha o maior e menor valores de NDVI e escreva a data em que eles ocorrem.

Solução:


A computação do NDVI pode se realizada usando-se um laço do tipo for para atravessar cada um dos elementos das duas listas ou usando-se uma expressão geradora ou list comprehension. A solução abaixo utiliza uma laço do tipo for, criando uma nova lista denominada ndvi_values, inicialmente vazia, e, em seguida, dentro do laço, o valor de NDVI é computado a partir dos valores correspondentes nas listas red_values e nir_values, sendo esse novo valor adicionado à nova lista:

 1red_values = (
 2    168, 398, 451, 337, 186, 232, 262, 349,
 3    189, 204, 220, 220, 207, 239, 259, 258,
 4    242, 331, 251, 323, 106, 1055, 170
 5)
 6
 7nir_values = (
 8    2346, 4431, 4638, 4286, 2752, 3521, 2928, 3087,
 9    2702, 2685, 2702, 2865, 2835, 2955, 3019, 3391,
10    2986, 4042, 3050, 3617, 2478, 3361, 2613
11)
12
13ndvi_values = []
14
15for red, nir in zip(red_values, nir_values):
16    ndvi = (nir - red) / (nir + red)
17
18    ndvi_values.append(ndvi)

A média do NDVI pode ser calculada de maneira simples pela seguinte expressão:

media_ndvi = sum(ndvi_values) / len(ndvi_values)

print('Média NDVI:', media_ndvi)

Para a última parte da questão, podemos obter o maior e menor valores de NDVI da seguinte forma:

ndvi_min = min(ndvi_values)
ndvi_max = max(ndvi_values)

O operador index das sequencias permite identificar a localização da primeira ocorrência do valor, de maneira que podemos fazer:

pos_ndvi_min = ndvi_values.index(ndvi_min)
pos_ndvi_max = ndvi_values.index(ndvi_max)

print('Mínimo do NDVI:', ndvi_min, 'Data:', timeline[pos_ndvi_min])
print('Máximo do NDVI:', ndvi_max, 'Data:', timeline[pos_ndvi_max])


Nota

Tente refazer o exercício acima usando apenas laços, sem usar as funções len, sum e index.


Exemplo 13. Leitura e Escrita de Arquivos.

13.1 Abrindo o arquivo focos24h_brasil.txt e lendo todo o seu conteúdo para a memória:

arq = open('focos24h_brasil.txt', 'r')

try:
    conteudo = arq.read()

    print(conteudo)

finally:
    arq.close()

13.2 Abrindo o arquivo focos24h_brasil.txt usando o comando with:

with open('focos24h_brasil.txt', 'r') as arq:
    conteudo = arq.read()

    print(conteudo)

13.3. Abrindo o arquivo focos24h_brasil.txt e lendo as duas primeiras linhas:

with open('focos24h_brasil.txt', 'r') as arq:
    linha1 = arq.readline()
    print(linha1, end='')

    linha2 = arq.readline()
    print(linha2, end='')

13.4. Abrindo o arquivo focos24h_brasil.txt e iterando pelas linhas do arquivo:

with open('focos24h_brasil.txt', 'r') as arq:
    for linha in arq:
        print(linha, end='')

13.5. Abrindo o arquivo focos24h_brasil.txt e criando uma lista com todas as linhas do arquivo:

with open('termos.json', 'r') as arq:
    linhas = arq.readlines()
    print(linhas)

13.6. Adicionando uma nova linha ao final do arquivo focos24h_brasil.txt:

with open('focos24h_brasil.txt', 'a') as arq:
    arq.write('Nova linha...\n')

13.7. Escreva um programa para imprimir apenas as linhas com focos do Estado de Minas Gerais.

Solução:
with open('focos24h_brasil.txt', 'r') as arq:
    for linha in arq:

        if linha.find('"estado":"MINAS GERAIS"') != -1:
            print(linha, end='')


Dica

Para mais detalhes sobre as operações com arquivos texto, consulte a seção 7.2. Reading and Writing Files do manual do Python.


14. O módulo os da Biblioteca Padrão do Python fornece funcionalidades para interagir com o sistema de arquivos do sistema operacional. Por exempplo, a função getcwd fornece o diretório corrente da aplicação em execução:

import os

print(os.getcwd())

Saída:

/home/gribeiro/Temp/Aula

A função listdir retorna uma lista contendo nomes de entradas em um dado diretório. Por exemplo, supondo que queremos obter a lista de arquivos e diretórios na raiz do sistema de arquivos, podemos fazer:

import os

listagem = os.listdir('/')

for f in listagem:
    print(f)

Saída:

run
lib
etc
media
var
lib32
snap
lost+found
tmp
libx32
...
mnt
sbin

O módulo os.path fornece funcionalidades para manipulação de caminhos ou nomes de arquivos e diretórios. Por exemplo, o trecho de código abaixo recupera a lista de arquivos e sub-diretórios do diretório /home/gribeiro/CAP-349/PG-Shared-Data e imprime se o objeto setrata de um arquivo ou diretório:

import os

listagem = os.listdir('/home/gribeiro/CAP-349/PG-Shared-Data')

for objeto in listagem:

    path_objeto = os.path.join('/home/gribeiro/CAP-349/PG-Shared-Data', objeto)

    print('Objeto:', path_objeto)

    if os.path.isdir(path_objeto):
        print('\tDiretório:', objeto)
    elif os.path.isfile(path_objeto):
        basename = os.path.basename(path_objeto)

        par = os.path.splitext(path_objeto)

        print('\tNome do arquivo: {}, Extensão Arquivo:{}'.format(basename, par[1]))

15.1 Faça um programa que pergunte ao jogador uma palavra secreta e depois escreva essa palavra na saída padrão.

Solução:
palavra_secreta = input('Entre com a palavra secreta: ')

print(palavra_secreta)


15.2. Considerando o módulo Python getpass, refaça o exercício 14.1, só que sem “ecoar” o texto digitado pelo jogador ao entrar com a palavra secreta.

Solução:
import getpass

palavra_secreta = getpass.getpass(prompt='Entre com a palavra secreta: ')

print(palavra_secreta)


15.3. Faça um programa que peça ao jogador 1 para fornecer uma palavra secreta e peça ao jogador 2 para fornecer uma letra que possa estar presente na palavra secreta fornecida pelo jogador 1. Para isso, faça uma função que verifique a ocorrência da letra na palavra secreta. Exemplo:

>>> palavra_secreta = 'sensoriamento'

>>> print( ocorre('o', palavra_secreta) )
True

>>> print( ocorre('u', palavra_secreta) )
False
Solução:

Uma possível solução seria:

import getpass


def ocorre(letra, segredo):
    return letra in segredo


palavra_secreta = getpass.getpass(prompt='Jogador 1, por favor, entre com a palavra secreta: ')

letra = input('Jogador 2, por favor, adivinhe uma letra da palavra secreta do Jogador 1: ')

print( ocorre(letra, palavra_secreta) )

Outra solução possivel, sem utilizar o operador in de sequências, consiste no uso de um laço para percorrer cada caracter da palavra com o segredo até que a letra seja encontrada ou o laço termine sem encontrar a ocorrência dessa letra:

def ocorre(letra, segredo):
    for l in segredo:
        if l == letra:
            return True

    return False


15.4. Suponha a existência de uma lista de letras, por exemplo, [ 'o', 't,', 'z', 'e', 'a' ]. Faça uma função que escreva uma palavra omitindo as letras que não pertençam a essa lista, usando um símbolo de _ (sublinhado). Veja o exemplo de uso:

>>> palavra_secreta = 'sensoriamento'

>>> letras = [ 'o', 't', 'z', 'e', 'a' ]

>>> palavra_oculta = ocultar(letras, palavra_secreta)

>>> print(palavra_oculta)
_ e _ _ o _ _ a _ e _ t o
Solução:
import getpass

def ocorre(letra, segredo):
    return letra in segredo


def ocultar(letras, palavra_secreta):
    palavra_oculta = ''

    for c in palavra_secreta:

        if c in letras:
            palavra_oculta = palavra_oculta + c
        else:
            palavra_oculta = palavra_oculta + '_'

    return palavra_oculta


palavra_secreta = getpass.getpass(prompt='Jogador 1, por favor, entre com a palavra secreta: ')

letras = [ 'o', 't', 'z', 'e', 'a' ]

palavra_oculta = ocultar(letras, palavra_secreta)

print(palavra_oculta)


15.5. Faça um programa que peça ao usuário uma letra e inclua essa letra em uma lista. Caso a letra já tenha sido digitada, o programa deve avisar o usuário e pedir uma nova letra. A cada iteração desse programa, escreva o conteúdo da lista. O programa deve parar após 06 iterações.

Solução:
contador = 0

letras = []

while contador < 6:
    l = input('Entre com uma letra: ')

    if l not in letras:
        letras.append(l)
    else:
        print('A letra "{}" já foi digitada!'.format(l))

    print('Letras digitadas: {}'.format(letras))

    contador = contador + 1


15.6. Agora podemos escrever o programa completo do jogo:

  • O programa inicialmente pede ao jogador 1 a palavra secreta.

  • O jogador 2 terá no máximo 06 chances para propor letras que ocorram na palavra secreta fornecida pelo jogador 1.

  • Portanto, a cada rodada, o jogador 2 irá propor uma nova letra.

  • O programa deverá testar se a nova letra já foi sugerida. Caso tenha sido, o programa deverá avisar ao jogador 2 e este perderá uma chance. Se o jogador ainda tiver chances, uma nova letra deverá ser solicitada.

  • Se a nova letra ocorrer na palavra secreta, o programa deverá escrever todas as letras já descobertas da palavra secreta.

  • Se a nova letra não ocorrer na palavra secreta, o jogador perderá uma chance.

Veja um exemplo de interação do programa esperado:

Jogador 1, por favor, entre com uma palavra secreta:
(vamos supor que a palavra seja 'sensoriameto')

Número de chances: 6
Jogador 2, por favor, entre com uma letra da palavra secreta: s
A letra 's' ocorre na palavra secreta: s _ _ s _ _ _ _ _ _ _ _ _
---------

Número de chances: 6
Jogador 2, por favor, entre com uma letra da palavra secreta: u
A letra 'u' não ocorre na palavra secreta: s _ _ s _ _ _ _ _ _ _ _ _
---------

Número de chances: 5
Jogador 2, por favor, entre com uma letra da palavra secreta: e
A letra 'e' não ocorre na palavra secreta: s e _ s _ _ _ _ _ e _ _ _
---------

...

Ao final, caso o número de tentativas tenha se esgotado, o programa deverá avisar:

Fim do jogo! Você não descobriu a palavra secreta: sensoriamento

Se o jogador 2 tiver acertado todas as letras, o programa deverá terminar com a seguinte saudação:

Parabéns! Você descobriu a palavra secreta: sensoriamento
Solução:
import getpass

def ocorre(letra, segredo):
    return letra in segredo


def ocultar(letras, palavra_secreta):
    palavra_oculta = ''

    for c in palavra_secreta:

        if c in letras:
            palavra_oculta = palavra_oculta + c
        else:
            palavra_oculta = palavra_oculta + '_'

    return palavra_oculta


palavra_secreta = getpass.getpass(prompt='Jogador 1, por favor, entre com uma palavra secreta: ')

chances = 6

letras_ja_digitadas = []

texto_oculto = ocultar(letras_ja_digitadas, palavra_secreta)

while (chances > 0) and (texto_oculto != palavra_secreta):

    print('Número de chances:', chances)

    l = input('Jogador 2, adivinhe uma letra da palavra secreta: ')

    if l in letras_ja_digitadas:
        texto_oculto = ocultar(letras_ja_digitadas, palavra_secreta)
        print('A letra "{}" já foi digitada! {}'.format(l, texto_oculto))
        chances = chances - 1
    elif not ocorre(l, palavra_secreta):
        letras_ja_digitadas.append(l)
        texto_oculto = ocultar(letras_ja_digitadas, palavra_secreta)
        print('A letra "{}" não ocorre na palavra secreta! {}'.format(l, texto_oculto))
        chances = chances - 1
    else: # Caso a letra não tenha sido digitada previamente e faça parte da palavra secreta
        letras_ja_digitadas.append(l)
        texto_oculto = ocultar(letras_ja_digitadas, palavra_secreta)
        print('A letra "{}" ocorre na palavra secreta! {}'.format(l, texto_oculto))

    print('---------')
    print()


if chances > 0:
    print('Parabéns! Você descobriu a palavra secreta:', palavra_secreta)
else:
    print('Fim do jogo! Você não descobriu a palavra secreta:', palavra_secreta)