Introdução à Lógica de Programação

PARTE 1 - INTRODUÇÃO

Lógica: é uma disciplina que estuda os princípios do raciocínio válido e da inferência (dedução ou conclusão) correta. Se preocupa com as regras formais que governam a validade dos argumentos, independentemente do conteúdo específico desses argumentos. Procura estabelecer padrões e estruturas que garantam a consistência e a validade do pensamento. Em resumo, é uma ferramenta fundamental para analisar e avaliar argumentos de maneira lógica e coerente. A Lógica tem suas raízes na Filosofia, sendo uma disciplina que se desenvolveu ao longo da história como parte do pensamento filosófico. Hoje em dia, é estudada tanto na Filosofia e em áreas como a Matemática, Linguística, Ciência da Computação, etc. sendo utilizada como ferramenta fundamental para análise de argumentos e raciocínio em diversas disciplinas.

Lógica de Programação: é a Técnica de encadear pensamentos para atingir determinado objetivo.

Sequência Lógica: são passos executados até atingir um objetivo ou solução de um problema.

Instruções: são um conjunto de regras ou normas definidas para a realização ou emprego de algo. Em Informática, é o que indica a um computador qual ação executar.

Algoritmo: é uma sequência finita de passos que levam a execução de uma tarefa ou solução de um problema. Qualquer tarefa que siga determinado padrão pode ser descrita como um Algoritmo. Até mesmo as soluções para os problemas cotidianos mais simples podem ser descritas por sequencias lógicas de atividades: um Algoritmo. Exemplo: Como fazer arroz doce. Para estruturar um Algoritmo descrevemos uma sequência de instruções, de maneira simples e objetiva. Exemplo: Somar dois números:

  1. Escreva o primeiro número no retângulo A
  2. Escreva o segundo número no retângulo B
  3. Some o número do retângulo A com número do retângulo B e coloque o resultado no retângulo C

Obs.: um algoritmo elaborado é apenas uma das muitas soluções possíveis para um problema apresentado. Um algoritmo indica uma dentre várias possíveis sequências de passos para solucionar um problema. 

==> Para a criação de um Algoritmo que visa executar uma tarefa, utilizamos a Lógica de Programação a partir da qual ordenamos Instruções escritas em uma Sequência Lógica específica. 

Programas de Computadores: para criar um programa de computador, tendo um algoritmo pronto faz-se a codificação para determinada linguagem de computador (Pascal, C, Java, etc.) produzindo um Código com base nos comandos da referida linguagem de computador, por fim este código é interpretado e executado por um computador.

PARTE 2 - DESENVOLVENDO CÓDIGOS

Pseudocódigo: é um método genérico de se escrever algoritmos. Nesta linguagem não existe formalismo rígido de como deve ser escrito o algoritmo. Tem como objetivo fornecer uma representação visual da lógica da solução de programação, sem se preocupar com os detalhes mais técnicos. Neste sentido existe o Portugol, que é um exemplo de pseudocódigo projetado para ser compreensível por pessoas que estão aprendendo lógica de programação, oferecendo uma transição suave para linguagens de programação mais formais posteriormente. Essa abordagem facilita o entendimento dos conceitos fundamentais sem a necessidade de aprender a sintaxe complexa de uma linguagem de programação específica.

Fases: para montar a ideia de um Algoritmo, precisamos primeiro dividir o problema em 3 fases fundamentais:

Entrada ==> Processamento ==> Saída

Entrada: são os dados de entrada do Algoritmo.
Processamento: são os procedimentos utilizados para chegar ao resultado final.
Saída: são os dados já processados, resultantes do Algoritmo.

Exemplo de Algoritmo: calcular a média final dos alunos. Os alunos realização 4 provas.

Dados de Entrada: Os dados de entrada são P1, P2, P3 e P4.
Processamento: O procedimento será somar todos os dados de entrada e dividi-los por 4 (quatro).
Dados de Saída: O dado de saída será a média final.

Segue Algoritmo: 

  1. Receba a nota da prova1
  2. Receba a nota de prova2
  3. Receba a nota de prova3
  4. Receba a nota da prova4
  5. Some todas as notas e divida o resultado por 4
  6. Mostre o resultado da divisão

Teste de Mesa: é um processo manual que é utilizado para validar a lógica de um determinado algoritmo, seguindo as instruções do Algoritmo de maneira precisa para verificar se o procedimento está correto ou não. É utilizado principalmente quando a linguagem utilizada não possui nenhuma ferramenta automatizada de depuração. Como as linguagens de programação costumam possuir tais ferramentas, é mais comum utilizá-las a fazer o teste de mesa propriamente dito, mas é indicado para iniciantes.

PARTE 3 - DIAGRAMA DE BLOCO

Diagrama de Bloco: é uma forma padronizada e eficaz para representar os passos lógicos de um dado processo. Facilita a visualização dos passos de um processamento.

Simbologia: são diversos os símbolos do Diagrama de Bloco, os principais são:




Exemplo de Diagrama de Bloco: Calcular a média de 4 notas:


PARTE 4 - CONSTANTES, VARIÁVEIS E TIPOS DE DADOS

Constantes: é um elemento de valor fixo, que não pode ser modificado durante a execução de um programa. Pode ser classificada como numérica, lógica e literal.

Variáveis: é um espaço reservado na memória (uma posição de memória) do computador para armazenar um tipo de dado determinado, cujo conteúdo pode ser alterado durante a execução de um programa. Só pode armazenar um valor a cada instante. Tipos podem ser, por exemplo inteiros, reais, caracteres, etc. Possuem nomes para serem identificadas. Podem ser modificadas quando necessário. 

Tipos de Variáveis: variáveis e constantes podem ser basicamente de 4 tipos:

  1. Inteiro
  2. Real
  3. Caractere
  4. String (cadeia: sequencia de caracteres)
  5. Lógico

Declaração de Variáveis e Constantes: há uma forma mais comum de declarar variáveis e constantes na Lógica de Programação:

var
 nome_da_variavel: tipo_da_variavelx
 nome_da_variavel1, nome_da_variavel2: tipo_da_variavely

O termo var é utilizada para indicar o início do bloco de declaração de variáveis de um algoritmo. Essa palavra é escrita apenas uma vez, independente do número de variáveis a serem declaradas.

const
  nome_da_constante <- valor

O termo const é utilizado para indicar o início do bloco de declaração de constantes de um algoritmo. Como o termo var, const também é escrita apenas uma vez, independente do número de constantes a serem declaradas.

Nomeação de Variáveis: veja as principais regras:


Estas regras também são aplicadas às Constantes.

Expressões: é uma combinação de valores, variáveis, operadores, e chamadas de funções, que calcula e, em seguida, produz um valor. O propósito de uma expressão é especificar um valor a ser calculado. Exemplo: 2+3 é uma expressão aritmética e de programação, que avalia a 5. Já a expressão de atribuição x = 2+3 também avalia a 5 e é uma expressão de programação. Uma variável é uma expressão, porque é um ponteiro para um valor na memória, então y+6 é uma expressão. Um exemplo de uma expressão de programação relacional seria 4 == 4, que avalia para o valor booleano verdadeiro.

PARTE 4.5 - COMANDOS DE ATRIBUIÇÃO, ENTRADA, SAÍDA

Comandos de Atribuição: após declarar uma variável, utilizamos que elas armazenarão um determinado valor durante a execução do programa. A depender da dialética utilizada para criar o algoritmo, temos por exemplo:

  • =  Igual
  • <- Seta para a esquerda

Forma geral: 

identificador <- expressão

identificador: Nome da variável ou constante a ser utilizada.

expressão: Valor ou expressão (expressões aritméticas ou expressões lógicas) a ser armazenado.

Comando de Entrada de Dados: ao solicitar uma entrada de dados no Algoritmo, utilizamos a sintaxe:

  • leia(variável)
Este comando lê um dado informado e o armazena na variável.

Comando de Saída de Dados: utilizado para exibir mensagens ou valores ao usuário. Utilizamos a sintaxe:

  • escreva(expressão)

Onde expressão é o conteúdo a ser exibido/enviado ao usuário.

PARTE 4.6 - COMENTÁRIOS E ESTRUTURA GERAL DE UM ALGORITMO

Comentários: Os sinais /* e */ indicam o início e o fim de um comentário, que pode ocupar mais de uma linha. Os sinais // indicam um comentário que vai até o fim da linha.

Em programação utilizamos comentários para explicar a lógica utilizada em nossos algoritmos.

Estrutura Geral de um algoritmo em Portugol:

algoritmo nome_do_algoritmo
const

/*Aqui devem ser declaradas todas as constantes do algoritmo. Caso não necessite de constantes, esta seção não deve existir.*/
var
/*Aqui devem ser declaradas todas as variáveis do algoritmo. Caso não necessite de variáveis, esta seção não deve existir.*/
inicio
/*Aqui ficará o corpo do algoritmo, ou seja, o conjunto de comandos que formará o algoritmo em si.*/
fim

Exemplo básico de um Algoritmo:

algoritmo exemplo1
var
  nome: string
inicio
  escreva("Digite seu nome")
  leia(nome)
  escreva("Bom dia", nome)
fim

algoritmo exemplo2
var
  num1, num2, mult: inteiro
inicio
  escreva("Digite o 1º número")
  leia(num1)
  escreva("Digite o 2º número")
  leia(num2)
  mult <- num1 * num2
  escreva("O resultado é: ", mult)
fim

PARTE 5 - OPERADORES

Operadores: são meios pelo qual incrementamos, decrementamos, comparamos e avaliamos dados em programa de computador. 3 tipos de Operadores:

  1. Operadores Aritméticos
  2. Operadores Relacionais
  3. Operadores Lógicos

Operadores Aritméticos: são utilizados para obter resultados numéricos. Os mais utilizados são:

  • Adição + 
  • Subtração -
  • Multiplicação *
  • Divisão /
  • Exponenciação **
  • Resto da Divisão Inteira %

Hierarquia das operações aritméticas (em ordem):

  • 1º ( ) Parênteses
  • 2º Exponenciação
  • 3º Multiplicação, divisão (o que aparecer primeiro)
  • 4º + ou – (o que aparecer primeiro)

Exemplos:

  • 1 + 7 * 2 ** 2 –1 = 28
  • 3 * (1 – 2) + 4 * 2 = 5

Operadores Relacionais: são utilizados para comparar 2 valores de um mesmo tipo de dado. Podemos comparar variáveis ou caracteres. Retornam Verdadeiro ou Falso (True ou False). Uma forma de estabelecer prioridades com estes operadores é utilizar parênteses. São eles:

  • Igual a =
  • Diferente de <> ou !=
  • Maior que >
  • Menor que <
  • Maior ou igual a >=
  • Menor ou igual a <=

Exemplo: 

Tendo duas variáveis A = 5 e B = 3; Os resultados das expressões seriam:

A =  B  Falso
A <> B  Verdadeiro
A >  B  Verdadeiro
A <  B  Falso
A >= B  Verdadeiro
A <= B  Falso

Na utilização do Diagrama de Blocos, utilizamos o símbolo abaixo para demonstrar Operadores Relacionais (comparação entre Expressões):


Operadores Lógicos: são usados para combinar resultados de expressões, retornando se o resultado final é verdadeiro ou falso. Os operadores lógicos retornam verdadeiro (V) ou falso (F) de acordo com seus operandos. Os operadores lógicos também são conhecidos como conectivos, pois são utilizados para formar novas proposições a partir da junção de duas outras. Os mais utilizados são:

  • E (AND)
  • OU (OR)
  • NÃO (NOT)

Uma expressão AND é verdadeira se todas as condições forem verdadeiras.
Uma expressão OR é verdadeira se pelo menos uma condição for verdadeira.
Uma expressão NOT inverte o valor da expressão ou condição, se verdadeira inverte para falsa e vice-versa.

A tabela abaixo mostra todos os valores possíveis criados pelos 3 operadores lógicos:


Exemplo: suponha que temos três variáveis A = 5, B = 8 e C =1. Os resultados das expressões seriam:

  • A = B AND B > C     Falso
  • A <> B OR B < C     Verdadeiro
  • A > B NOT           Verdadeiro
  • A < B AND B > C     Verdadeiro
  • A >= B OR B = C     Falso
  • A <= B NOT          Falso

Tabela-Verdade dos Operadores Lógicos:


Precedência de Operadores: determina a ordem em que os operadores são processados. Operadores com maior precedência são processados primeiro. O operador de multiplicação (*) tem maior precedência que o operador de adição (+) e por isso será executado primeiro. Operadores Aritméticos são processados antes dos Operadores Relacionais, que são processados antes dos Operadores Lógicos. Mais: 

  • Operadores aritméticos (seguindo a ordem de precedência indicada)
  • Operadores relacionais
  • Operador lógico NÃO
  • Operador lógico E
  • Operador lógico OU

Exemplo de Algoritmo e Precedência de Operadores:

algoritmo teste
  var NUM1, NUM2, NUM3, NUM4: inteiro
inicio
  NUM1⇐10
  NUM2⇐5
  NUM3⇐200
  NUM4⇐200
  escreva((NUM1 + NUM2 > 10 E NUM1 + NUM3 > NUM4)) //saída: True
fim

PARTE 6 - OPERAÇÕES LÓGICAS

Operações Lógicas são utilizadas quando é necessário tomar decisões em um Diagrama de Bloco. Toda decisão terá como resposta resultado VERDADEIRO ou FALSO.

Exemplo: com o Diagrama de Bloco abaixo responda as questões a seguir:


Em seguida:


PARTE 7 - ESTRUTURA DE DECISÃO E REPETIÇÃO

Comandos de Decisão: são técnicas de programação que conduzem a estruturas de programas que não são totalmente sequenciais. Com instruções de Salto ou Desvio pode-se fazer com que o programa proceda de uma maneira ou outra maneira, de acordo com as decisões lógicas tomadas em função dos dados apresentados. As principais Estruturas de Decisão são:

  • SE ENTÃO (IF...THEN)
  • SE ENTÃO SENÃO (IF...THEN...ELSE)
  • CASO SELECIONE (SELECT CASE)

Veja os Diagramas de Blocos e Código Exemplo para cada Estrutura:

SE ENTAO:

SE MEDIA >= 5 ENTÃO
  Text1 = “APROVADO”
FIM-SE

SE ENTAO SENAO:

SE MEDIA >= 5 ENTÃO
  SE MEDIA >= 7.0 ENTÃO
    Text1 = “Aluno APROVADO”
  SENÃO
    Text1 = “Aluno Necessita fazer outra Avaliação”
  FIM-SE
SENÃO
  Text1 = “Aluno REPROVADO”
FIM-SE

CASO SELECIONE:

TITULO = “”
OP = LEIA(“DIGITE A OPÇÃO”)
SELECIONE CASO OP
  CASO 1
    TITULO = “OPÇÃO 1”
  CASO 2
    TITULO = “OPÇÃO 2”
  CASO 3
    TITULO = “OPÇÃO 3”
  CASO 4
    TITULO = “OPÇÃO 4”
  CASO 5
    TITULO = “OPÇÃO 5”
  CASO SENÃO
    TITULO = “OPÇÃO ERRADA”
FIM-SELECIONE



Comandos de Repetição: são usados quando desejamos que um conjunto de instruções sejam executados um número finito ou infinito de vezes, ou enquanto determinado estado permanecer ou até que seja alcançado. São eles:

  • ENQUANTO
  • REPITA
  • PARA

Veja os Diagramas de Blocos para cada comando:

ENQUANTO: indicado quando o código possuir uma quantidade de repetições indefinidas e dependendo de uma ou mais condições para parar o laço.

Nr = 0
ENQUANTO Nr <= 100 FAÇA 
  Nr = Nr + 1
FIM-ENQUANTO



REPITA: indicado quando for obrigatório que o laço execute pelo menos uma vez. O bloco de código dentro do laço vai rodar a primeira vez sem que a condição seja verificada.

Nr = 0
REPITA
  Nr = Nr + 1
ATÉ Nr >= 100

Obs.: a Estrutura de Repetição REPITA é tratada por alguns autores e linguagens de programação como a estrutura DO-WHILE, mas com inversão da condição. Veja: 

Nr = 0
FAÇA
  Nr = Nr + 1
ENQUANTO Nr <= 100


PARA: indicado para uma quantidade de repetições já definidas, ou mesmo quando precisar contar as repetições, e até mesmo ler um vetor.

PARA contador = 0 ATE 5 PASSO 1 FAÇA
 <Bloco de instruções>
FIM-PARA
// a variável contador é incrementada pelo valor de PASSO


PARTE 8 - ARQUIVO DE DADOS

Até agora, lidamos com dados disponíveis apenas na memória do computador. Também podemos guardar dados e manipulá-los utilizando arquivos. 

Conceitos básicos:

Campo: é um espaço reservado em memória para receber dados. 

Exemplo: Campo Nome - Campo Endereço

Registro: é um conjunto de Campos.

Exemplo: Registro de Clientes

Arquivo: é um conjunto de Registros.

Exemplo: Arquivo de clientes da empresa (contém todos os dados dos clientes da empresa)

Abertura de Arquivos: toda vez que for necessário trabalhar com arquivo, primeiramente precisamos ABRIR o arquivo. Isso significa alocar o periférico (HD, disquete, etc.) em que o arquivo se encontra, e deixá-lo disponível para acesso.

Fechamento de Arquivos: após abrir um arquivo, ao concluir a tarefa, faz-se necessário FECHAR o arquivo, para que suas informações não possam ser violadas ou danificadas. Isso significa liberar o periférico que estava sendo utilizado. 

Leitura de Arquivos: após abrir um arquivo é necessário LER os dados em disco e transferi-los para a memória. Essa transferência é feita registro por registro. Esse procedimento é gerenciado pelo sistema operacional.



Toda vez que abrimos um arquivo ele posiciona o ponteiro no primeiro registro, ou seja, no início do arquivo. Para que possamos trabalhar com os dados é necessário saber onde está o Ponteiro do Registro. Para isso podemos descobrir testando se o ponteiro está no início (BOF - Bottom Of File) ou no final do arquivo (EOF - End Of File). Esse é sempre executado após a leitura do registro (mudança da posição do ponteiro). Veja a representação em Diagrama de Bloco.



Movimentação de Registros: quando um arquivo é aberto o ponteiro está no primeiro registro. A cada leitura do Arquivo, o ponteiro se movimenta para o próximo registro e assim por diante. Veja a figura:



Gravação de Arquivos: da mesma maneira que os registros são lidos de um arquivo, também devemos gravar registros em um arquivo. A gravação consiste na transferência de um registro da memória para um periférico (local do arquivo). 



Macro Fluxo: se trata da representação gráfica dos arquivos que serão processados em um programa.


Estes 2 exemplos de Macro Fluxo dão uma visão geral de como devemos proceder com cada um dos programas. O 1º diz que haverá um arquivo de entrada, um processamento e um arquivo de saída. O 2º diz que haverá um arquivo de entrada, um processamento e um relatório de saída.

PARTE 9 - RELATÓRIOS

A impressão de relatórios é o registro de informações processadas pelo computador em um meio de armazenamento de dados chamado Formulário. Para efetuar a impressão de relatório devemos nos preocupar com os seguintes aspectos: 

  • Características do formulário
  • Controle de linhas e salto de página
  • Impressão de cabeçalho e estética da página
  • Impressão de rodapé
  • Numeração de páginas

Características do Formulário: a maioria dos formulários possui formato padrão, isto é, a quantidade de linhas por página e de caracteres por linha são constantes.

Controle de Linhas e Salto de Páginas: Uma preocupação com impressão de relatórios é não permitir que a impressora imprima fora do papel, pois além de esteticamente não ficar bom, haveria perda de informações. Para controlar o número de linhas impressas, devemos criar um contador de linha e não deixar o valor desses contadores ultrapassarem o número desejado de linhas por páginas.

Impressão de Cabeçalho e Estética de Página: para termos uma ideia melhor da estética do formulário, veja o exemplo:



Área de Cabeçalho: Local onde devemos colocar um cabeçalho para identificarmos o assunto a que se refere o conteúdo da página como um todo, e um cabeçalho indicando o significado do conteúdo de cada coluna de informações. Pode haver outras linhas de cabeçalho de acordo com a necessidade.

Linha de Detalhe: São as linhas geradas a partir de dados lidos de um arquivo.

Área de Rodapé: Pode haver linhas contendo valores de totalizações de determinadas colunas, linhas de identificação da empresa, ou outras informações qualquer.

Veja abaixo um exemplo de diagrama de bloco para impressão de relatório:



PARTE 9 - ESTRUTURAS (UM POUCO MAIS) COMPLEXAS 

Trataremos de 2 estruturas mais elaboradas que as variáveis simples. Essas estruturas são fundamentais para lidar com conjuntos de dados mais complexos em programação, permitindo uma organização mais eficiente e um acesso mais flexível às informações armazenadas. São elas:

  • Vetores
  • Registros

Vetores (ou Arrays): são estruturas que permitem armazenar uma coleção de elementos do mesmo tipo sob um único nome. Tem como características:

  • Os elementos são acessados por meio de um índice (posição).
  • O índice geralmente começa em 0 (zero) para o primeiro elemento.
  • Têm tamanho fixo após a criação.

Exemplo (em pseudocódigo):

Vetor numeros[5]
numeros[0] = 10
numeros[1] = 20
numeros[2] = 30

Registros (Struct ou Record): são estruturas que permitem agrupar diferentes tipos de dados sob um único nome. Características:

  • Cada elemento dentro do registro é chamado de campo ou membro.
  • Cada campo pode ser de um tipo diferente.
  • Oferece uma forma de organizar dados relacionados.

Exemplo (em pseudocódigo):

Registro Pessoa
    Nome: Texto
    Idade: Inteiro
    Altura: Real
// Exemplo de uso
Pessoa individuo
individuo.Nome = "João"
individuo.Idade = 25
individuo.Altura = 1.75


Referências

Lógica de Programação – A Construção de Algoritmos e Estruturas de Dados – São Paulo:
    Forbellone, André Luiz Villar - MAKRON, 1993.

Lógica de Programação - Apostila Unicamp - Centro de Computação - DSC
Autor: Paulo Sérgio de Moraes - 2000.


Comentários