Introdução ao comando de seleção e às expressões lógicas
[ Expressão em C | Expressão em Python | Operadores | Seleção | Seleções | Exemplo | Par ou ímpar ]
Como ler este texto. Aqui procuro explicar os fundamentos do comando de seleção if-else tanto para as linguagens C quanto Python. Em várias seções apresento os conceitos básicos ilustrando-os em tabelas, com uma coluna ou linha para cada linguagem. Mas existe uma seção em que apresento o conceito de expressão lógica separandamente, assim, se lhe interessar apenas uma das linguagens, leia apenas a seção correspondente. |
O que é um comando de seleção?
A existência de comando de seleção é essencial para a construção de algoritmos flexíveis no sentido de poder seguir uma sequência de instruções distintas de acordo com uma condição. Um exemplo simples poderia ser um algoritmo para computar a soma de todas as entradas de um extrato bancário, correspondente aos créditos separadas dos lançamentos de débito.Qualquer linguagem de programação dispõe de um comando para desvio de fluxo, geralmente esse tipo de comando é demominado comando if-else. Outra característica comum das linguagens de programação é possibilitar definir dois blocos de comandos subordinados ao if-else, um deles devendo ser executado sempre que a condição resultar verdadeira e o outro, que é opcional, devendo ser executado sempre que resultar falso.
A figura 1 ilustra as duas possibilidades de comando if-else, a figura 1.a apresenta um comando de seleção apenas com o bloco "verdadeiro", enquanto a 1.b ilustra um comando de seleção com os dois blocos.
Na figura 1.a, se o resultado da condição lógica for verdadeiro, segue o caminho indicado pela seta com rótulo
sim e se falso segue o caminho da seta com rótulo não, que é a próxima instrução após o
bloco "verdadeiro".
Na figura 1.b, está o esquema do if-else com os dois blocos:
se o resultado da condição lógica for verdadeiro, segue o caminho para o bloco "verdadeiro" (verde),
mas se resultar falso, segue para o bloco "falso" (laranja).
De modo esquemático, o comando é do tipo
Na linguagem C, qualquer expressão (mesmo que aritmética) dentro de abre e fecha parênteses (...) é interpretada como uma expressão lógica, como nos códigos 1 e 2 seguintes.
|
No código 1 existem duas expressões lógicas, uma subordinada a um comando if-else e a outra subordinada a um comando while.
Mas vale a pena notar que a linguagem C permite construções cujo processamento é um pouco mais rápido, mas menos intuitivo, é permitido usar qualquer expressão aritmética (como a-b) dentro do contexto de expressão lógica! Isso é possível a partir do seguinte "truque": calcula-se o resultado da expressão aritmética, se o seu resultado for diferente de 0, ele é interpretado como sendo o valor lógico verdeiro, caso contrário como falso. Desse modo, a condição lógica abaixo é equivalente à codição do if do código 1, pois sempre que a expressão i-N resultar valor não nulo, será "impresso" OK e se o valor for nulo será "impresso" NAO:
|
Desse modo, pode-se substituir a linha 1 do código 1 por:
|
|
Podemos explorar equivalências para entender a razão dos dois códigos serem equivalentes.
Observe que
!(a-b) é a mesma coisa que negar que a-b seja não nulo, ou seja, !(a-b != 0) e,
!(a-b != 0) é a mesma coisa que afirmar que a-b == 0, e
a-b == 0 é a mesma coisa que a == b.
O resultado de um comando como
Para descobrir este tipo de erro uma boa técnica é usar
bandeiras.
Expressão e valor lógicos em Python
Em Python existem um particular tipo de variável que é booleano, sendo que uma variável boleana pode ter apenas um dos valores: True ou False. Portanto, é possível definir variáveis que recebam o resultado de uma expressão lógica, que deve ser True ou False.
Assim, se em determinado código for necessário manter o resultado de uma expressão lógica e depois usar esse resultado em um comando
if-else, seria possível fazer de três formas distintas, sendo a mais à esquerda a mais eficiente:
|
|
|
Note que no exemplo acima mais à direita usamos not (varlog == False) que equivale a varlog == True, que portanto também equivale a varlog (pois está essa armazena valor booleano).
Operadores lógicos em C e em Python
Os operadores lógicos e relacionais básicos são os mesmo tanto em C quanto em Python. Os operadores relacionais (relações entre expressões aritméticas) são:
Operação | Operador | Exemplo |
---|---|---|
iguais | == | n1 == 4 |
diferentes | != | n1 != 4 |
maior | > | n1 > n2 |
menor | < | n2 < n1 |
maior ou igual | >= | n1 >= 3 |
menor ou igual | <= | n1 <= 33 |
Os operadores lógicos principais em C e em Python são
Operação | Operador | Exemplo | ||
---|---|---|---|---|
C | Python | C | Python | |
conjunção (e) | && | and | (n1 > 1 && n1 < 10) | (n1 > 1 and n1 < 10) |
disjunção (ou) | || | or | (n1 > 1) || (n1 < 10) | (n1 > 1) or (n1 < 10) |
negação (não) | ! | not | !(n1 > 1 || n1 < 10) | not(n1 > 1 or n1 < 10) |
Comando de seleção if-else em C e em Python
O comando de seleção é essencial para qualquer software, é ele que permite que o programa desvie seu fluxo de execução de acordo com os valores dos dados (as já citadas variáveis). Ele está presente em qualquer linguagem de programação e está baseado no cômputo de uma expressão lógica (EXPLOG), se o resultado dela for verdadeiro, o fluxo segue por um "caminho", senão segue por outro. Essa estrutura está ilustrada na figura abaixo:
Existem outras duas características de comando de seleção (em qualquer linguagem) que são:
Tanto a linguagem C quanto na linguagem Python, usam as masmas palavras reservadas (palavras que não podem ser usados como nomes para variáveis): as palavras if e o else. A sintaxe de ambas é ilustrada na tabela abaixo.
A tabela a seguir ilustra a sintaxe do comando de seleção tanto em C quanto em Python:
Linguagem | Apenas 1 comando | Vários comandos |
---|---|---|
C |
|
|
Python |
|
|
Vale destacar que o comando else é opcional (como já citado), ou seja, não existindo ação a ser executada caso
a condição seja falsa, não é necessário usar um else com algum comando.
Assim é correto em C escrever
Em Python os parênteses não são obrigatórios em expressões, quer dizer é válido redigir o comando
Outro item em que C e Python diferem é no modo como indicam a existência de um bloco de comandos subordinados a outro comando. Em C utiliza-se abre e fecha chaves, enquanto em Python usa-se a "indentação". Experimente em Python eliminar o deslocamento horizontal e deixe, e.g., o comando1 alinhado com o if e tente rodar o programa. Você receberá uma mensagem de erro.
Comandos de seleção if-else aninhados em C e em Python
Em geral, toda linguagem de programação de alto-nível permite que os comandos if-else sejam utilizados de modo aninhado, ou seja, qualquer dos comandos acima (comando1... comando4) podem ser um novo if-else. Por exemplo:
Linguagem | if aninhado |
---|---|
C |
|
Python |
|
Note que a regra para associar um else a um if é por proximidade (o else é associado ao if mais próximo), e em caso que precisamos que o else seja associado a um if mais "distante", somos obrigados a usar os blocos de comandos. Isso está ilustrado nos exemplos acima, o primeiro else está associado ao if (a<b) e não ao mais "próximo".
Um exemplo para decidir se uma variável inteira armazena um valor par ou ímpar
Utilizando a divisão inteira (quer dizer 7/2 resultando 3) pode-se conseguir determinar se um inteiro é ou não par. Por exemplo, dispondo de uma variável inteira n1, pode-se fazer a divisão inteira por 2 e multiplicar seu resultado também por 2, se recuperar o valor integral de n1, então esse é um valor par (e.g. 7/2 é 3 que multiplicado por 2 resulta "apenas" 6, concluindo daí que 7 não é par).
Nos códigos abaixo ilustramos este método, mas note que existe uma diferença sensível entre as versões Python 2 e Python 3, este último obriga o uso de "duas barras" (//) para indicar divisão inteira. Vejamos os códigos abaixo:
C | Python 2 | Python 3 |
---|---|---|
|
|
|
Mas pode-se obter o mesmo resultado utilizando o operador binário % que é "resto da divisão inteira". Este operador devolve o resto da divisão, por exemplo, 7%2 resulta 1 (o quociente é 3: 3 * 2 + 1 = 7). Assim o código fica:
C | Python |
---|---|
|
|
Mas por que razão "n1/2*2==n1" é suficiente para decidir se n1 é ou não par?
Bem, isso é um truque computacional baseado em como o computador interpreta e trata os valores numéricos de acordo com seu tipo. Quanto todos os valores (variáveis) são inteiros, é utilizada uma aritmética de precisão inteira, como examinamos ao final da seção sobre variáveis e expressões.
Lembre-se que em C sempre que fizer divisão entre inteiros o resultado é inteiro (ou seja, 7/2 resulta 3) e em Python é análogo, entretanto no Python 3 é preciso usar o operador // (7/2 resulta erro, deve-se usar 7//2) e no Python 2 pode-se usar 7/2 (resultando 3).
Novamente é o contexto determinando o resultado.
Leônidas de Oliveira Brandão
http://line.ime.usp.br