2.26. Exemplos
Exemplo 01. Uma reta pode ser representada por uma equação geral da seguinte forma:
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.
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!
.
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:
ou,
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:
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
import os
listagem = os.listdir('C:\\')
for f in listagem:
print(f)
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)