{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "##
Introdução à Lógica de Programação
\n", "###
Um curso prático para estudantes das Ciências da Vida
\n", "---\n", "##
Aula 3. Estruturas Condicionais
\n", "#####
Instrutor: Pedro C. de Siracusa
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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. \n", "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.\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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**." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Objetivos. \n", "\n", "Após esta aula você deverá ser capaz de:\n", "* Reconhecer os principais **operadores lógicos** e de **comparação**;\n", "* Construir e computar **expressões lógicas**;\n", "* Construir **estruturas condicionais**." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Expressões lógicas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Expressões lógicas são aquelas cuja avaliação resulta em valores do tipo **booleano**: verdadeiro (**True**) ou falso (**False**).\n", "Os dois principais tipos de operadores para construir expressões lógicas são:\n", "* **operadores de comparação**: permitem comparar os valores de um par de objetos, e retornam `True` caso sejam equivalentes e `False` caso contrário; \n", "* **operadores lógicos**: úteis para combinar resultados booleanos obtidos de várias comparações, permitindo construir estruturas de decisão mais complexas." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "| Operador | Descrição |\n", "| -------- | --------- |\n", "| **Operadores de comparação** | |\n", "| `==` | `True` se valores de dois operandos são iguais |\n", "| `!=` | `True` se valores de dois operandos são diferentes |\n", "| `<` | `True` se valor do operando à esquerda é menor que o da direita |\n", "| `<=` | `True` se valor do operando à esquerda é menor ou igual ao da direita|\n", "| `>` | `True` se valor do operando à esquerda é maior que o da direita |\n", "| `>=` | `True` se valor do operando à esquerda é maior ou igual ao da direita |\n", "| **Operadores lógicos**| |\n", "| `and` | Operador lógico \"E\" |\n", "| `or` | Operador lógico \"OU\" |\n", "| `not` |Operador lógico \"NÃO\" |" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vamos escrever algumas expressões lógicas." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Agora que já sabemos codificar **condições**, podemos de fato construir estruturas condicionais." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Construindo Condicionais" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Estruturas condicionais podem ter diferentes níveis de complexidade, dependendo do conjunto de condições" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### A construção `if`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### A construção `if` `else`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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`).\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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. \n", "Mas e se desejarmos construir uma estrutura condicional que permita **mais do que apenas dois \"caminhos\" diferentes**? \n", "Neste caso precisamos verificar mais do que uma única condição." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Condicionais aninhadas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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", "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.\n", "\n", "**Cuidado!** Em *Python* é fundamental respeitar o nível de indentação dos blocos de código em cada nível hierárquico!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### A construção `if` `elif` `else`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercícios" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ex 1.** Verifique se as igualdades abaixo são verdadeiras:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**(a)** $2 \\times 2.0 = 4$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**(b)** $2 \\times 3 = 5$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**(c)** $4a + 3 = b$, para $a=3$ e $b=15$ (primeiro declare as variáveis `a` e `b`)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**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$." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "notaAluno = 0 # insira aqui a nota do aluno\n", "\n", "# Complete o código abaixo\n", "if :\n", " print(\" \")\n", "else:\n", " print(\" \")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**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:\n", "\n", "$\n", "se \\quad média \\ final \\geq 9 : menção = SS \\\\\n", "se \\quad 7 \\leq média \\ final < 9 : menção = MS \\\\ \n", "se \\quad 5 \\leq média \\ final < 7 : menção = MM \\\\ \n", "se \\quad 3 \\leq média \\ final < 5 : menção = MI \\\\ \n", "se \\quad média \\ final < 3 : menção = II \\\\ \n", "$" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def calculaMencao( p1,p2,p3 ):\n", " # seu código aqui\n", " return" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**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*.\n", "A identificação se dá com base na presença (1) ou ausência (0) de três caracteres: **vascularização**, **sementes** e **flores**. \n", "Utilize a tabela abaixo como referência." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "| Grupo | Vascularização| Sementes| Flores |\n", "|--|--|--|--|\n", "| Bryophyta | 0 | 0 | 0 |\n", "| Pteridophyta | 1| 0 | 0 |\n", "| Gymnospermae | 1 | 1 | 0 |\n", "| Angiospermae | 1 | 1 | 1 |\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Estas variáveis armazenam a presença (1) ou ausência (0) de cada caractere\n", "vasc = 0\n", "sem = 0\n", "flor = 0\n", "\n", "# Seu código aqui" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**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." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def chave(vasc, sem, flor):\n", " # seu código aqui\n", " return" ] } ], "metadata": { "kernelspec": { "display_name": "Python [default]", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.6" } }, "nbformat": 4, "nbformat_minor": 2 }