#!/usr/bin/env python
# coding: utf-8
# ##
Introdução à Lógica de Programação
# ### Um curso prático para estudantes das Ciências da Vida
# ---
# ## Aula 3. Estruturas Condicionais
# ##### Instrutor: Pedro C. de Siracusa
# Condicionais são estruturas de decisão fundamentais nas linguagens de programação que permitem que um programa altere seu comportamento em tempo de execução, dependendo do estado em que se encontra.
# Podemos imaginar um programa em execução como um trem viajando sobre um trilho. Algumas bifurcações podem existir ao longo do percurso, e o caminho tomado pelo trem nestes pontos deve ser selecionado através de manivelas de controle. Dependendo da posição em que se encontra a manivela, o trem pode tomar um ou outro caminho, mas nunca seguir nos dois ao mesmo tempo.
#
#
# Estruturas condicionais permitem alterar o fluxo de execução de um programa através da verificação de **condições**, que podem ser codificadas em nosso programa por meio de **expressões lógicas**.
# ### Objetivos.
#
# Após esta aula você deverá ser capaz de:
# * Reconhecer os principais **operadores lógicos** e de **comparação**;
# * Construir e computar **expressões lógicas**;
# * Construir **estruturas condicionais**.
# ## 1. Expressões lógicas
# Expressões lógicas são aquelas cuja avaliação resulta em valores do tipo **booleano**: verdadeiro (**True**) ou falso (**False**).
# Os dois principais tipos de operadores para construir expressões lógicas são:
# * **operadores de comparação**: permitem comparar os valores de um par de objetos, e retornam `True` caso sejam equivalentes e `False` caso contrário;
# * **operadores lógicos**: úteis para combinar resultados booleanos obtidos de várias comparações, permitindo construir estruturas de decisão mais complexas.
# | Operador | Descrição |
# | -------- | --------- |
# | **Operadores de comparação** | |
# | `==` | `True` se valores de dois operandos são iguais |
# | `!=` | `True` se valores de dois operandos são diferentes |
# | `<` | `True` se valor do operando à esquerda é menor que o da direita |
# | `<=` | `True` se valor do operando à esquerda é menor ou igual ao da direita|
# | `>` | `True` se valor do operando à esquerda é maior que o da direita |
# | `>=` | `True` se valor do operando à esquerda é maior ou igual ao da direita |
# | **Operadores lógicos**| |
# | `and` | Operador lógico "E" |
# | `or` | Operador lógico "OU" |
# | `not` |Operador lógico "NÃO" |
# Vamos escrever algumas expressões lógicas.
# In[ ]:
# Agora que já sabemos codificar **condições**, podemos de fato construir estruturas condicionais.
# ## 2. Construindo Condicionais
# Estruturas condicionais podem ter diferentes níveis de complexidade, dependendo do conjunto de condições
# ### A construção `if`
# A construção `if` é a estrutura mais simples de escrevermos um bloco de código $A$ que somente deve ser executado caso uma determinada condição **seja satisfeita** (ou seja, avaliada como `True`). Caso contrário, o código $A$ é simplesmente ignorado.
#
# In[ ]:
# ### A construção `if` `else`
# Um `if` pode ser associado a um `else`, contendo um bloco de código que é executado casa a condição do `if` **não seja satisfeita** (ou seja, avaliada como `False`).
#
#
# In[ ]:
# As duas construções tratadas acima se baseiam na verificação de apenas uma condição, que dependendo de como for avaliada (`True` ou `False`), desencadeia um dentre dois possíveis comportamentos.
# Mas e se desejarmos construir uma estrutura condicional que permita **mais do que apenas dois "caminhos" diferentes**?
# Neste caso precisamos verificar mais do que uma única condição.
# ### Condicionais aninhadas
# A primeira forma de incluir mais mais do que uma condição a ser testada na estrutura condicional é por **aninhamento**. Como resultado, teremos uma estrutura hierárquica, em que a execução de uma segunda condição depende do resultado de uma primeira condição.
# Não há limites para o número de níveis hierárquicos em uma estrutura condicional, apesar de que muitos níveis hierárquicos podem tornar o código mais difícil de entender.
#
# **Cuidado!** Em *Python* é fundamental respeitar o nível de indentação dos blocos de código em cada nível hierárquico!
#
# In[ ]:
# ### A construção `if` `elif` `else`
# Uma sequência de vários `if` e `else` aninhados pode inserir muitos níveis de indentação no código, tornando-o confuso. Para evitar este problema, usamos a construção podemos inserir novas condições a serem verificadas usando a palavra `elif`. Pense no `elif` como uma fusão entre um `else` e um `if`. O `else` no final captura qualquer caso em que nenhuma das condições anteriores foram satisfeitas.
# In[ ]:
# ---
# ## Exercícios
# **Ex 1.** Verifique se as igualdades abaixo são verdadeiras:
# **(a)** $2 \times 2.0 = 4$
# In[ ]:
# **(b)** $2 \times 3 = 5$
# In[ ]:
# **(c)** $4a + 3 = b$, para $a=3$ e $b=15$ (primeiro declare as variáveis `a` e `b`)
# In[ ]:
# **Ex 2.** Complete o código na célula abaixo para imprimir uma mensagem informando se um aluno foi aprovado ou reprovado em uma disciplina com base em sua nota final. A nota mínima necessária para aprovação é $5$.
# In[ ]:
notaAluno = 0 # insira aqui a nota do aluno
# Complete o código abaixo
if :
print(" ")
else:
print(" ")
# **Ex 3.** Construa uma função que calcule a média final e menção dos alunos com base nas notas das três provas (com pesos de 20% para as duas primeiras e 60% para a terceira). Divida o problema em duas etapas. Primeiro, você deverá calcular a média das provas com os devidos pesos. Depois, atribuir a menção conforme a seguinte regra:
#
# $
# se \quad média \ final \geq 9 : menção = SS \\
# se \quad 7 \leq média \ final < 9 : menção = MS \\
# se \quad 5 \leq média \ final < 7 : menção = MM \\
# se \quad 3 \leq média \ final < 5 : menção = MI \\
# se \quad média \ final < 3 : menção = II \\
# $
# In[ ]:
def calculaMencao( p1,p2,p3 ):
# seu código aqui
return
# **Ex 4.** Construa uma pequena **chave dicotômica** para identificar uma determinada planta como membro de um dos principais grupos: *Bryophyta*, *Pteridophyta*, *Gymnospermae* ou *Angiospermae*.
# A identificação se dá com base na presença (1) ou ausência (0) de três caracteres: **vascularização**, **sementes** e **flores**.
# Utilize a tabela abaixo como referência.
# | Grupo | Vascularização| Sementes| Flores |
# |--|--|--|--|
# | Bryophyta | 0 | 0 | 0 |
# | Pteridophyta | 1| 0 | 0 |
# | Gymnospermae | 1 | 1 | 0 |
# | Angiospermae | 1 | 1 | 1 |
#
# In[ ]:
# Estas variáveis armazenam a presença (1) ou ausência (0) de cada caractere
vasc = 0
sem = 0
flor = 0
# Seu código aqui
# **Ex 5.** Encapsule o código que você construiu no exercício anterior. Para isso, construa uma função de nome `chave`, que recebe como argumentos cada um dos caracteres e retorna o nome do devido grupo botânico.
# In[ ]:
def chave(vasc, sem, flor):
# seu código aqui
return