Curso de Pascal
Lógica
Você está em: MarMSX >> Cursos >> Pascal
A lógica diz respeito à coerencia de raciocínio e de ideias.
O conhecimento de lógica é importante na solução de problemas que envolvam decisões e caminhos a tomar em programas.
1. Operações lógicas
As operações lógicas podem ser feitas a partir de um até infinito operandos, sempre resultando em apenas uma saída. Normalmente, utilizamos um ou dois operandos.
Os operadores lógicos do Pascal são os seguintes:
- AND - Faz operação lógica E, onde a saída é sempre verdadeira quando todas as entradas são verdadeiras.
- OR - Faz operação lógica OU, onde a saída é sempre verdadeira quando pelo menos uma das entradas é verdadeira.
- NOT - Faz operação lógica NÃO, onde a saída é a inversão da atribuição de verdadeiro ou falso da entrada.
- XOR - Faz operação lógica OU EXCLUSIVO, onde a saída é sempre verdadeira quando exatamente uma das entradas é verdadeira. Testa se ambas as entradas são diferentes.
A seguir, serão apresentadas as tabelas-verdade para cada tipo de operação lógica citada. Uma tabela verdade é uma tabela contendo todas as combinações de valores possíveis para as entradas (operandos) e a respectiva saída.
A atribuição de falso é representada pelo valor 0, enquanto que o verdadeiro vale 1.
Tabelas-verdade para duas entradas (exceto o not):
NOT |
Entrada |
Saída |
A |
S |
0 |
1 |
1 |
0 |
|
AND |
Entradas |
Saída |
A |
B |
S |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
|
OR |
Entradas |
Saída |
A |
B |
S |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
|
XOR |
Entradas |
Saída |
A |
B |
S |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
|
Para entender melhor o conceito de lógica, vamos trazer para a linguagem formal.
Suponhamos que eu tenha um ingresso promocional de casal para um encontro de anime, e que só posso entregá-lo a um casal onde ambos gostem de anime e estejam disposto a ir.
Assim, só posso dar o ingresso (saída verdadeira) para o casal que o homem E a mulher gostem de anime.
Observando o exemplo a seguir:
var homem_gosta_anime, mulher_gosta_anime, dou_ingresso : boolean;
begin
dou_ingresso := homem_gosta_anime and mulher_gosta_anime;
end.
Ao atribuirmos as quatro combinações de entradas (A e B) da tabela-verdade do AND, só obteremos verdadeiro para a variável "dou_ingresso", quando ambas as entradas forem verdadeiras, ou seja, ambos gostem de anime.
Um exemplo para o OU seria o seguinte: eu necessito de uma caneta para escrever e peço a dois colegas. Se pelo menos um deles me emprestar, poderei escrever.
var amigo1_empresta, amigo2_empresta, posso_escrever : boolean;
begin
posso_escrever := amigo1_empresta or amigo2_empresta;
end.
OPERAÇÕES EM CASCATA
Podemos fazer operações em cascata, respeitando as regras de precedência mencionadas no capítulo de operadores.
As operações do mesmo nível são feitas da esquerda para a direita. Somente o operador NOT tem precedência pelos demais.
Ex:
A and B or C
Primeiramente, fazemos a operação "A and B" e obtemos uma saída S1. A saída S1 servirá de entrada de dados para combinar com C e obter a saída final S. Vamos montar a tabela-verdade:
A AND B |
Entradas |
Saída |
A |
B |
S1 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
|
S1 OR C |
Entradas |
Saída |
S1 |
C |
S |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
|
Para entender melhor a tabela resultante, veremos como funciona a formação das possíveis combinações das entradas dessa tabela.
Para formar a tabela das entradas, faz-se o produto cartesiano entre todos os valores dos operandos de entrada.
No caso de A e B (visto até agora), cada entrada possui dois valores: 0 e 1. Primeiro, combina-se o valor 0 de A com os valores 0 e 1 de B. Depois, combina-se o valor 1 de A com os valores 0 e 1 de B.
A saída S1 da operação "A and B" irá gerar 4 valores: 0, 0, 0 e 1. Em seguida, S1 será utilizada como entrada para a próxima operação: "S1 or C".
Será feito então, o produto cartesiano dos elementos de S1 com C. O número de elementos resultante é sempre a multiplicação do número de elementos de cada membro do produto. No caso, temos 4x2 = 8.
Uma vez montada a tabela de entrada, conforme visto acima, consulta-se a tabela do OR e preenchem-se os valor correspondentes de S, de acordo com cada entrada S1 e C.
O programa a seguir gerar a tabela verdade da expressão "A and B or C". Observe que ele obtém o resultado diretamente.
var A, B, C : integer;
begin
for a:=0 to 1 do
begin
for b:=0 to 1 do
begin
for c:=0 to 1 do
begin
writeln(a, ' and ', b, ' or ', c, ' = ', a and b or c);
end;
end;
end;
end.
OPERAÇÕES LÓGICAS EM NÚMEROS - BIT A BIT
As operações lógicas podem ser aplicadas a números, geralmente com a finalidade de filtragem de dados.
Quando fazemos uma operação lógica de um número em relação a outro, convertemos os números para o sistema de numeração binário e, em seguida, aplicamos a operação lógica bit a bit.
O exemplo a seguir demonstrará como é feito o processo.
13 and 6
O primeiro passo é converter os números para o sistema binário.
1101 and 0110
Em seguida, aplicamos a operação lógica a cada posição de bit correspondente entre os números, conforme é mostrado a seguir, ilustrado em cores diferentes.
3210 -> Número do bit
1101 -> 1 1 0 1
0110 -> 0 1 1 0
Aplica-se a operação lógica E aos números assinalados em vermelho, 1 and 0, e obtém-se o valor 0 para o bit mais significativo.
Depois, aplica-se a operação lógica E para os números assinalados em verde, 1 and 1, obtendo-se 1.
Aplica-se a operação lógica E para os números assinalados em azul, 0 and 1, obtendo-se 0.
Finalmente, aplica-se a operação lógica E para os números assinalados em preto, 1 and 0, obtendo-se 0 para o número menos significativo.
Assim:
1101 -> 1 1 0 1
and 0110 -> 0 1 1 0
----
0100 -> 0 1 0 0
O valor binário 0100 corresponde ao número 4 em decimal. Assim, 13 and 6 é igual a 4.
Conforme dito anteriormente, uma das utilizades da operação lógica com números é a filtragem de dados.
De acordo a tabela-verdade do E (and), observa-se que, quando o valor 0 está presente, o resultado é sempre 0. Quando o valor 1 está presente, o resultado depende do outro operando. Dessa forma, podemos criar uma máscara de modo a "zerar" os bits que desejarmos e manter os demais.
O exemplo a seguir, obtém o valor puro dos bits 0, 1 e 2, quaisquer sejam os valores dos demais bits.
10100011 -> Número
and 00000111 -> Máscara
--------
00000011 -> Resultado
Na seção de operadores, há um exemplo de filtragem de um código de cores da screen 8 do MSX.
2. Testes lógicos
Os operadores de teste lógicos no Pascal são os seguites:
- = - igual
- <> - diferente
- > - maior
- < - menor
- >= - maior ou igual
- <= - menor ou igual
O teste é realizado a partir de dois operandos, resultando sempre em um resultado booleano (verdadeiro ou falso). Ex:
var teste : boolean;
begin
teste := 4 > 3;
end.
O resultado para o teste acima é verdadeiro (ou 1). Poderíamos fazer também o seguinte teste:
teste := 4 < 3;
Onde o resultado é falso (ou 0).
O objetivo dos testes lógicos em programas é de tomar decisões e mudar o caminho de execução. Exs:
if (peso > 80) then ... { Se = decisão }
while (loop = true) do ... { Enquanto loop é verdadeiro ou SE loop é verdadeiro = decisão }
Os testes lógicos podem ser combinados com os operadores lógicos and, or, not e xor. Ex:
if (idade <= 10) and (altura <= 1.20) then
begin
writeln('Pode brincar no parquinho');
end;
Vendo a tabela-verdade do E (and) em um exemplo prático, observamos que se uma criança tiver mais de 10 anos ou for mais alta que 1,20 metros, não poderá entrar no parquinho. Somente quando atender as duas requisições.