Definição de Lógica
O uso corriqueiro da palavra lógica está normalmente relacionado à coerência e à racionalidade. Frequentemente se associa lógica apenas à matemática, não se percebendo sua aplicabilidade e sua relação com as demais ciências.
Podemos relacionar a lógica com a correção do pensamento, pois uma de suas preocupações é determinar quais operações são válidas e quais não são, fazendo análises das formas e leis do pensamento. Com arte ou técnica, ela nos ensina a usar corretamente as leis do pensamento.
Poderíamos dizer também que a lógica é a "arte de bem pensar", que é a "ciência das formas do pensamento". Visto que a forma mais complexa do pensamento é o raciocínio, a lógica estuda a "correção do raciocínio". Podemos ainda dizer que a lógica tem em vista a "ordem da razão". Isso dá a entender que a nossa razão pode funcionar desordenadamente. Por isso, a lógica estuda e ensina a colocar "ordem no pensamento".
Definição de Lógica de Programação
Significa o uso correto das leis do pensamento, da "ordem da razão" e de processos de raciocínio e simbolização formais na programação de computadores, objetivando a racionalidade e o desenvolvimento de técnicas que cooperem para a produção de soluções logicamente válidas e coerentes, que resolvam com qualidade os problemas que se deseja programar.
O raciocínio é algo abstrato, intangível. Os seres humanos têm capacidade de expressá-lo através da palavra falada ou escrita, que por sua vez se baseia em um determinado idioma, que segue uma série de padrões (gramática). Um mesmo raciocínio pode ser expresso em qualquer um dos inúmeros idiomas existentes, mas continuará representando o mesmo raciocínio, usando apenas outra convenção.
tempo, representar mais fielmente o raciocínio da lógica de programação, utilizamos os algoritmos.
Algoritmos
O objetivo principal do estudo da lógica de programação é a construção de algoritmos coerentes e válidos. Mas o que é um algoritmo?
Um algoritmo pode ser definido como uma sequencia de passos que visam a atingir um objetivo bem definido.
Na medida em que precisamos especificar uma sequencia de passos, é necessário utilizar ordem, ou seja, "pensar com ordem", portanto precisamos utilizar lógica.
Apesar do nome pouco usual, algoritmos são comuns em nosso cotidiano, como, por exemplo, uma receita de bolo. Nela está descrita uma série de ingredientes necessários e uma sequencia de diversos passos (ações) que devem ser fielmente cumpridos para que se consiga fazer o alimento desejado, conforme se espera antes do início das atividades (objetivo bem definido).
Quando elaboramos um algoritmo, devemos especificar ações claras e precisas, que a partir de um estado inicial, após um período de tempo finito, produzam um estado final previsível e bem definido. Isso significa que o algoritmo fixa um padrão de comportamento a ser seguido, uma norma de execução a ser trilhada, com vistas a alcançar, como resultado final, a solução de um problema, garantindo que sempre que executado, sob as mesmas condições, produza o mesmo resultado.
Tipos de Dados
Tipo primitivo: São tipos de dados predefinidos pela
linguagem e correspondem a dados mais simples ou escalares. Os tipos primitivos utilizados por um computador são numéricos (inteiros ou reais), caracteres e lógicos.
Tipo de Dado Inteiro: São caracterizados como tipos
Tipo Inteiro Mínimo Máximo
int -32.768 32.767
long (int) -2.147.483.648 2.147.483.647
unsigned int 0 65.535
unsigned long (int) 0 4.292.967.295
Tipo de Dado Real: São caracterizados como tipos reais
os dados numéricos positivos, negativos e números fracionários e também inteiros. Em linguagem C, este tipo de dado pode ser referenciado por um dos seguintes identificadores:
Tipo Inteiro Mínimo Máximo
float 3.4 e-38 3.4 e+38
double 1.7 e-308 1.7 e+308
long double 3.4 e-4932 1.1 e+4932
Tipo de Dado Caractere: São caracterizados como tipo
caractere letras (a..z, A..Z), números (0..9) e símbolos especiais (! @ # $ % ^...) delimitados entre os símbolos de aspas simples (' '), para as sequencias (Strings) de letras, números e símbolos especiais, utilizamos aspas duplas (" "). Este tipo de dado é referenciado pelo identificador: char, podendo armazenar caracteres da tabela ASCII de 0 até 255.
Tipo de Dado Lógico: A Linguagem C não possui um tipo
de dado lógico ou booleano, ou seja, não existe valor lógico "Falso" ou "Verdadeiro" para um determinado tipo de dado, de forma predefinida. EM linguagem C qualquer valor igual a 0 (zero) é considerado um valor lógico do tipo falso, e qualquer valor diferente de zero, será considerado um valor lógico verdadeiro.
Uso de Variáveis e Constantes
Constante: Uma constante é qualquer dado que não sofre
alteração ou variação durante a execução de um programa, ou seja, seu valor é constante do início até o fim da execução.
Variável: Uma variável representa a unidade básica de
O objetivo de uma variável é armazenar um dado de determinado tipo primitivo, podendo ser alterado durante a execução do programa.
Exemplo:
int notaAluno = 8
Operadores e Expressões Matemáticas Computacionais
Operadores Matemáticos: são utilizados para a
realização de operações matemáticas com operandos de tipos numéricos, do mesmo modo como são aplicados na álgebra.
Operação Função
+ Adição
- Subtração
* Multiplicação
/ Divisão
% Módulo (resto da divisão)
Geralmente o operador de módulo (%) é menos conhecido do que os operadores de multiplicação e divisão. Este operador retorna o resto de uma divisão.
Exemplo:
10 |3 1 3
Em linguagem C, a sintaxe é a seguinte: int a;
a = 10 % 3;
Comandos de Leitura e Escrita
Entrada de dados: Para que o programa possa receber
dados de que necessita, iremos utilizar a função scanf(), cuja finalidade é efetuar entrada de dados via teclado. A sintaxe desta função se caracteriza por ser uma expressão de controle seguida de uma lista de argumentos separados por vírgula, sendo que seus argumentos são endereços de variáveis.
scanf("expressão de controle", "lista de args");
A expressão de controle se caracteriza por conter códigos de formatação para o tipo de dado a ser processado, precedidos pelo sinal de percentagem %. Veja a seguir, a tabela com os códigos de formatação para a função scanf().
Formatação Descrição
%c Leitura de apenas um caractere
%d Leitura de números inteiros
%e Leitura de números em notação científica
%f Leitura de números reais (ponto flutuante)
%ld Leitura de números inteiros longos
%lf Leitura de números reais longos (double)
%o Leitura de números octais
%s Leitura de um conjunto de caracteres (String)
%u Leitura de números decimais sem sinal
%x Leitura de números hexadecimais
A lista de argumentos é a indicação dos endereços das variáveis em uso, por meio do operador de endereço &, que possibilita retornar o conteúdo da variável. Caso não seja usado o operador de endereço &, será retornado o endereço de memória em que se encontra a variável.
Exemplo:
#include <stdio.h>
int main(int argc, char *argv[]) {
int a;
float b;
char string[64];
printf("Digite um número inteiro: "); scanf("%d", &a);
printf("Digite um número em ponto flutuante: "); scanf("%f", &b);
printf("Digite uma frase: "); scanf("%s", &string);
Saída de dados: Para que o programa possa mostrar os
dados que processou, como resposta ao problema que resolveu, usaremos a função printf(), cuja finalidade é efetuar a saída de informações no vídeo. A sintaxe desta função é:
printf("expressão de controle", "lista de argumentos");
A expressão de controle se caracteriza por conter códigos de formatação para o tipo de dado a ser processado, precedido pelo sinal de percentagem %. Veja abaixo a tabela com os códigos de formatação para a função printf().
Formatação Descrição
%c Escrita de apenas um caractere
%d Escrita de números inteiros
%e Escrita de números em notação científica
%f Escrita de números reais (ponto flutuante)
%o Escrita de números octais
%s Escrita de um conjunto de caracteres (String)
%u Escrita de números decimais sem sinal
%x Escrita de números hexadecimais
Exemplo:
#include <stdio.h>
int main(int argc, char *argv[]) {
int a;
float b;
char string[64];
printf("Digite um numero inteiro: "); scanf("%d", &a);
printf("Digite um numero em ponto flutuante: "); scanf("%f", &b);
printf("Digite uma frase: "); scanf("%s", &string);
a = a + 10; b = b + 0.5;
printf("A variavel a foi acrescida em 10: %d\n", a); printf("A variavel b foi acrescida em 0.5: %f\n", b); printf("A variavel string recebeu a frase: %s\n", string); getch();
Operadores Relacionais
Os operadores relacionais possibilitam comparar valores ou expressões retornando sempre um resultado lógico true (verdadeiro) ou false (falso). Em linguagem C, um resultado lógico false será interpretado como 0 (zero). Já um resultado lógico true será interpretado como algo diferente de 0 (zero).
A tabela abaixo resume os operadores relacionais disponíveis na linguagem C. Operador Função == Igual a != Diferente de > Maior que < Menor que >= Maior ou igual a <= Menor ou igual a
O programa abaixo exemplifica a utilização destes operadores relacionais para tipos primitivos.
#include <stdio.h>
int main(int argc, char *argv[]){
int it1 = 10, it2 = 15, it3 = 10, it4 = 15; int b1, b2, b3, b4, b5, b6, b7, b8;
b1 = it1 == it2;
printf("it1 == it2 eh: %d\n", b1);
b2 = it1 == it3;
printf("it1 == it3 eh: %d\n", b2);
b3 = it1 != it2;
printf("it1 != it2 eh: %d\n", b3);
b4 = it1 != it3;
printf("it1 != it3 eh: %d\n", b4);
b5 = it2 > it4;
printf("it2 > it4 eh: %d\n", b5);
b6 = it2 >= it4;
printf("it2 >= it4 eh: %d\n", b6);
b7 = it3 < it4;
printf("it3 < it4 eh: %d\n", b7);
b8 = it2 <= it4;
printf("it2 <= it4 eh: %d\n", b8); getch();
Saída gerada pela execução do programa acima:
it1 == it2 eh: 0 it1 == it3 eh: 1 it1 != it2 eh: 1 it1 != it3 eh: 0 it2 > it4 eh: 0 it2 >= it4 eh: 1 it3 < it4 eh: 1 it2 <= it4 eh: 1
Operadores Lógicos
Utilizamos três operadores básicos para a formação de novas proposições lógicas compostas a partir de outras proposições lógicas simples. Os operadores lógicos estão descritos na tabela abaixo.
Operador Função
não Negação
e Conjunção
ou Disjunção
Tabela Verdade: É o conjunto de todas as possibilidades combinatórias entre os valores de diversas variáveis lógicas, as quais se encontram em apenas duas situações (V ou F), e um conjunto de operadores lógicos.
Construiremos uma tabela verdade com o objetivo de dispor de uma maneira prática os valores lógicos envolvidos em uma expressão lógica.
Operação de Disjunção A B A ou B V V V V F V F V V F F F
Operadores Lógicos na Linguagem C
Os operadores lógicos são utilizados para construir expressões que retornam um resultado zero (false) ou diferente de zero (true).
A linguagem C fornece operadores lógicos que podem ser utilizados para formar condições mais complexas combinando condições simples.
A tabela abaixo resume os operadores lógicos disponíveis na linguagem C.
Operador Função
|| ou (or) lógico condicional
&& e (and) lógico condicional
! negação (not)
Operador Lógico condicional E (&&)
Para o operador && o operando da direita somente será avaliado se o operando da esquerda for avaliado como verdadeiro.
Operador Lógico condicional OU (||)
O programa C abaixo exemplifica a utilização dos operadores lógicos condicionais para tipos primitivos.
#include <stdio.h> #include <conio.h>
int main(int argc, char *argv[]) {
int a = 5, b = 7, c = 10;
int b1, b2, b3, b4;
b1 = (a > 3) && (b < 8);
printf("(a > 3) && (b < 8): %d\n", b1);
b2 = (a > 3) && (b < 8) || (c < 20);
printf("(a > 3) && (b < 8) || (c < 20): %d\n", b2);
b3 = (a > 3) || (b > 8) && (c < 20);
printf("(a > 3) || (b > 8) && (c < 20): %d\n", b3);
b4 = !(c > 5 || !(b > 10));
printf("!(c > 5 || !(b > 10)): %d\n", b4); getch();
}
Abaixo temos a saída gerada pelo programa acima:
(a > 3) && (b < 8): 1
(a > 3) && (b < 8) || (c < 20): 1 (a > 3) || (b > 8) && (c < 20): 1 !(c > 5 || !(b > 10)): 0
Vamos analisar mais um exemplo da utilização dos operadores lógicos
#include <stdio.h> #include <conio.h> int op1(){
printf("Dentro de op1\n");
return 0; }
int op2(){
printf("Dentro de op2\n");
return 1; }
int main(int argc, char *argv[]){
printf("==== Testando o operador && =======\n\n"); if (op1() && op2())
printf("Ambos verdadeiros\n"); else
printf("Um dos operandos eh falso\n");
printf("\n\n==== Testando o operador || =======\n\n"); if (op1() || op2())
printf("Um dos operandos eh verdadeiro\n"); else
getch(); }