Fundamentos de Algoritmos e Lógica de Programação
Classificado em Computação
Escrito em em
português com um tamanho de 137,07 KB
O que é Algoritmo?
Formalmente, um algoritmo é uma sequência finita de passos que levam à execução de uma tarefa. Como exemplos de algoritmos, podemos citar os das operações básicas (adição, multiplicação, divisão e subtração) de números reais decimais.
Características Importantes de um Algoritmo
- Finito
- Definição (Clareza)
- Entradas
- Saídas
Formas de Representação de Algoritmos
- Descrição Narrativa
- Fluxograma Convencional
- Pseudocódigo (ou Linguagem Estruturada/Portugol)
Estruturas Básicas de Controle
- Sequência Simples
- Alternativas (Condicional)
- Repetição (Laços)
Símbolos Convencionais de Fluxograma
Terminal
- Indica o ponto onde começa ou termina o fluxo de um programa.
Processamento
- Indica a operação aritmética, cálculo de uma fórmula, atribuições de valores, etc.
Display
- Representa informações exibidas no vídeo.
Teclado (Entrada de Dados)
- Representa informações recebidas por um computador (entrada manual).
Decisão
- Indica verificação ou comparação em forma de pergunta, resultando em uma das respostas: sim ou não.
Setas (Linhas de Fluxo)
- Indicam o sentido do fluxo.
Conector
- Utilizado quando é preciso particionar o diagrama (ligar partes distantes).
Armazenamento de Dados na Memória
- Cada célula de memória ocupa 1 byte.
- Cada tipo de dado necessita de uma certa quantidade de memória para armazenar a informação.
- Para recuperar uma determinada informação na memória, seria necessário saber o tipo de dado desta informação (ou seja, o número de bytes que ela ocupa na memória) e a posição inicial deste conjunto de bytes na memória. Por exemplo: para recuperar a informação "banana", temos que saber que são 6 bytes e que ela se inicia na posição 18.
- Para contornar este problema, foi criado o conceito de variável. Uma variável contém uma referência ao endereço inicial e o número de bytes que ocupa na memória é determinado através de seu tipo de dado.
Variáveis e Tipos de Dados Básicos
Todas as variáveis pertencem a um tipo de dado que define o conjunto de valores que ela pode receber (armazenar).
Classificação dos Tipos de Dados
- Numérico: Inteiro e Real.
- Literal ou Caractere: Sequências de texto.
- Lógico (Booleano): Verdadeiro ou Falso.
Fases Fundamentais para o Desenvolvimento de um Algoritmo
Para desenvolver um algoritmo, precisamos primeiro dividir o problema em três fases fundamentais:
- Entrada (Recebimento de dados)
- Processamento (Manipulação dos dados)
- Saída (Exibição dos resultados)
Formas Comuns de Representação
Dentre as formas de representação de algoritmos mais conhecidas, destacam-se:
- Descrição Narrativa
- Fluxograma Convencional
- Pseudocódigo (também conhecido como Linguagem Estruturada ou Portugol)
Estrutura Básica do Pseudocódigo
- Algoritmo <nome_do_algoritmo>
- A palavra
Algoritmoindica o início da definição de um algoritmo em pseudocódigo. - <nome_do_algoritmo>
- É um nome simbólico dado ao algoritmo com a finalidade de distingui-lo dos demais.
- Declaração de Variáveis (
Var) - Consiste em uma porção opcional onde são declaradas as variáveis globais usadas no algoritmo principal e, eventualmente, nos subalgoritmos.
- Subalgoritmos
- Consiste em uma porção opcional do pseudocódigo onde são definidos os subalgoritmos (funções/procedimentos).
- Início
- É a palavra que delimita o início do conjunto de instruções do corpo do algoritmo.
- Corpo do Algoritmo
- São as instruções (comandos) a serem executadas.
- FimAlgoritmo
- É a palavra que delimita o final do conjunto de instruções do corpo do algoritmo.
Detalhes dos Tipos de Dados
- Tipos Inteiros
- Dados numéricos positivos ou negativos, excluindo-se qualquer número fracionário. Exemplo: 35, 0, -56, 1024.
- Tipos Reais
- Dados numéricos positivos e negativos, incluindo números fracionários. Exemplo: 35, 0, -56, 1.2, -45.987.
- Tipos Caracteres (String/Literal)
- Sequências contendo letras, números e símbolos especiais. Uma sequência de caracteres deve ser indicada entre aspas (
" "). Também conhecido como alfanumérico, string, literal ou cadeia. Exemplo: "Programação", "Rua Alfa, 52 Apto 1". - Tipos Lógicos (Booleanos)
- Dados que assumem valor Verdadeiro ou Falso.
Regras para Criar Nomes (Identificadores) de Variáveis e Constantes
As variáveis e as constantes têm um nome (rótulo) que as identificam dentro do código/pseudocódigo. Esse nome deve ser criado conforme as seguintes regras:
- O primeiro caractere deve ser sempre uma letra.
- Os nomes devem ser formados por caracteres pertencentes às letras do alfabeto e aos números. Se o identificador for composto por mais de uma palavra, podemos separá-las com o underline (sublinhado).
- Não pode haver espaços em branco entre os caracteres do identificador.
- Os nomes escolhidos devem ser explicativos do seu conteúdo.
- Nomes de variáveis longos podem dificultar a codificação (verificar o tamanho máximo dependendo da linguagem de programação).
- Não se deve utilizar acentuação ou cedilha.
- Os nomes dados às variáveis não podem ser os mesmos nomes das palavras reservadas da linguagem que será utilizada.
Operadores em Algoritmos
Operadores Aritméticos
Operadores Lógicos (Booleanos)
Os operadores lógicos ou booleanos são usados para combinar expressões relacionais. Eles devolvem como resultado valores lógicos (verdadeiro ou falso).
Tabela Verdade
Instruções Primitivas
Instruções primitivas são os comandos básicos que efetuam tarefas essenciais para a operação dos computadores, como entrada e saída de dados (comunicação com o usuário e com dispositivos periféricos) e movimentação de dados na memória. Estes tipos de instrução estão presentes na maioria das linguagens de programação.
Comando de Atribuição
O comando de atribuição é a principal maneira de armazenar uma informação em uma variável. A seguir, temos um exemplo de um algoritmo utilizando o comando de atribuição:
Algoritmo exemploAtribuição
Var
preço_unit, preço_tot : real
quant : inteiro
Início
preço_unit := 5.0
quant := 10
preço_tot := preço_unit * quant
FimAlgoritmo.Comando de Saída de Dados (ESCREVA)
Os comandos de saída de dados são o meio pelo qual informações contidas na memória dos computadores são exibidas nos dispositivos de saída, para que os usuários possam visualizá-las. Exemplo:
Algoritmo exemplo_comando_de_saída_de_dados
Var
preço_unit, preço_tot : real
quant : inteiro
Início
preco_unit := 5.0
quant := 10
preço_tot := preço_unit * quant
Escreva ( preço_tot )
FimAlgoritmo.Comando de Entrada de Dados (LEIA)
O comando LEIA é o meio pelo qual as informações dos usuários são transferidas para a memória dos computadores, para que possam ser usadas nos programas. Exemplo:
Algoritmo exemplo_comando_de_entrada_de_dados
Var
preço_unit, preço_tot : real
quant : inteiro
Início
Leia( preco_unit, quant)
preço_tot := preço_unit * quant
Escreva( preço_tot)
FimAlgoritmoObservação sobre Atribuição: No Visualg, o comando de atribuição := deve ser alterado para <-, dependendo da versão ou configuração utilizada.
Estruturas de Controle do Fluxo de Execução
As estruturas de controle definem a ordem em que as instruções de um algoritmo são executadas:
- Estruturas Sequenciais
- Estruturas de Decisão (Condicionais)
- Estruturas de Repetição (Laços)
Estrutura Sequencial
Na estrutura sequencial, os comandos de um algoritmo são executados numa sequência pré-estabelecida. Cada comando é executado somente após o término do comando anterior.
Estruturas de Decisão (Condicionais)
Neste tipo de estrutura, o fluxo de instruções a ser seguido é escolhido em função do resultado da avaliação de uma ou mais condições. Uma condição é uma expressão lógica. A classificação das estruturas de decisão é feita de acordo com o número de condições que devem ser testadas para decidir qual caminho seguir.
Tipos de Estruturas de Decisão
- Estrutura de Decisão Simples: (Se ... então)
- Estrutura de Decisão Composta: (Se ... então ... senão)
- Estrutura de Decisão Múltipla do Tipo Escolha/Caso: (Escolha ... Caso ... Senão ou Caso ... Fim_Caso ... Senão)
A estrutura de decisão do tipo Caso é uma generalização da construção Se, permitindo testar múltiplas condições e associar um comando diferente a cada uma delas.
Conceitos Fundamentais
Passos para a Construção de um Algoritmo
Os principais passos são:
- Entendimento do problema: Compreender o objetivo.
- Identificar as Entradas: Quais dados devem ser fornecidos para a resolução do problema.
- Identificar as Saídas: Quais resultados devem ser gerados.
- Determinar o Processamento: Definir o que deve ser feito para transformar as entradas em saídas.
- Construir o Algoritmo: Utilizar uma forma de representação (pseudocódigo, fluxograma, etc.).
O que é Lógica de Programação?
Lógica de programação é a forma de se estruturar e organizar a ordem das instruções de um programa para atingir um objetivo específico.
Tipo de Dados e Variáveis
- Tipo de Dados
- Está relacionado ao tipo de informação que desejamos armazenar na memória do computador (exemplo: número inteiro, número real, caractere ou lógico).
- Variáveis
- Do ponto de vista da programação, uma variável é uma região de memória previamente identificada, cuja finalidade é armazenar dados ou informações de um programa por um determinado espaço de tempo.
A memória do computador se organiza como um armário com várias divisões, cada uma identificada por um endereço (geralmente hexadecimal). As linguagens de programação permitem nomear esses endereços, facilitando a referência. O conteúdo de uma variável pode ser alterado, mas somente um dado por vez pode ser armazenado naquela divisão. Uma variável é composta por dois elementos básicos: o conteúdo (o valor armazenado) e o identificador (o nome dado à variável).
Análise de Algoritmos (Testes de Mesa)
Analise os algoritmos abaixo e diga o que será impresso na tela ao serem executados:
Algoritmo "teste01"
algoritmo "teste01"
var
A, B: inteiro
inicio
A <- 10
B <- 20
Escreval(B)
B <- 5
Escreval(A, B)
FimalgoritmoResposta: Valores impressos:
- Escreval(B): 20
- Escreval(A, B): 10 e 5
Algoritmo "teste02"
algoritmo "teste02"
var
A, B, C: inteiro
inicio
A <- 30
B <- 10
C <- 50
Escreval(C)
B <- 10
Escreval(B, C)
C <- 40
Escreval(A, B, C)
FimalgoritmoResposta: Valores impressos:
- 50 (Impressão do valor C)
- 10 50 (Impressão dos valores B e C)
- 30 10 40 (Impressão dos valores A, B, C)
Algoritmo "teste03"
algoritmo "teste03"
var
X: inteiro
Z, Y: real
inicio
X <- 5
Y <- 6.0
Z <- 2.0
Escreval(Z)
Escreval(X, Y, Z)
FimalgoritmoResposta: Valores impressos:
- 2.0 (Valor impresso de Z)
- 5 6.0 2.0 (Valores impressos de X, Y, Z)
Exercícios de Lógica de Programação
Exercício 1: Cálculo de Crédito Especial
Um banco concederá um crédito especial aos seus clientes, variável com o saldo médio no último ano. Faça um algoritmo que leia o saldo médio de um cliente e calcule o valor do crédito de acordo com a tabela abaixo. Mostre uma mensagem informando o saldo médio e o valor do crédito.
Tabela de Crédito
| Saldo Médio | Percentual de Crédito |
|---|---|
| De 0 a 200 | Nenhum crédito |
| De 201 a 400 | 20% do valor do saldo médio |
| De 401 a 600 | 30% do valor do saldo médio |
| Acima de 601 | 40% do valor do saldo médio |
Pseudocódigo "SaldoMédio"
Algoritmo "SaldoMédio"
Var
Salmedio, Vlrcred: real
Nome: caracter
Inicio
Escreval("Entre com o nome do cliente:")
Leia (Nome)
Escreval ("Entre com o saldo médio:")
Leia (Salmedio)
Se Salmedio <= 200 entao
Vlrcred <- 0.0
Senao
Se Salmedio <= 400 entao
Vlrcred <- Salmedio * 0.20
Senao
Se Salmedio <= 600 entao
Vlrcred <- Salmedio * 0.30
Senao
Vlrcred <- Salmedio * 0.40
Fimse
Fimse
Fimse
Escreval("Nome Cliente: ", Nome)
Escreval("Saldo médio: ", Salmedio)
Escreval("Valor do Crédito: ", Vlrcred)
FimalgoritmoExercício 2: Cálculo de Média de Alunos (Repetição)
algoritmo "MediaAluno"
// Função: Calcular a média aritmética de 30 alunos
Var
NOTA1, NOTA2, MEDIA: REAL
CONT: inteiro
Inicio
CONT <- 0
repita
CONT <- CONT + 1
escreval("--- Aluno ", CONT, " ---")
escreval("Digite a 1ª nota: ")
leia(NOTA1)
escreval("Digite a 2ª nota: ")
leia(NOTA2)
MEDIA <- (NOTA1 + NOTA2) / 2
escreval("Média = ", MEDIA)
ate CONT = 30 // Para testar com menos alunos, altere o valor 30 (ex: 5)
FimalgoritmoExercício 3: Pseudocódigo de Alistamento (Baseado em Fluxograma)
Pseudocódigo "Alistamento"
Algoritmo Alistamento
Var
nome, saude, sexo: caracter
idade: inteiro
Inicio
Escreval ("Entre com o nome:")
Leia (nome)
Escreva ("Entre com o sexo F/M:")
Leia (sexo)
Se sexo = "F" entao
Escreval ("Não está apto por ser do sexo feminino")
Senao
Escreval ("Entre com a idade:")
Leia (idade)
Se (idade = 20) entao
Escreval ("Não está apto pelo motivo da idade")
Senao
Escreval("Entre apto para Saúde S/N:")
Leia (saude)
Se saude = "S" entao
Escreval ("Está apto")
Senao
Escreval ("Não está apto pelo motivo de saúde")
Fimse
Fimse
Fimse
FimalgoritmoEstruturas de Repetição
Diferença entre REPITA/ATÉ, ENQUANTO/FIM ENQUANTO e PARA/FIM PARA
- REPITA / ATÉ: Executa um bloco de instrução até que a condição seja VERDADEIRA. A condição é testada após a execução do bloco, garantindo que o bloco seja executado pelo menos uma vez.
Exemplo:
Repita // Instruções Até RESP = "S" - ENQUANTO / FIM ENQUANTO: Executa um bloco de instrução enquanto a condição for VERDADEIRA. A condição é testada antes da execução do bloco. Se a condição for falsa inicialmente (Exemplo: RESP = "N"), o bloco não será executado nenhuma vez.
Exemplo:
ENQUANTO RESP = "S" FACA // Instruções FIM ENQUANTO - PARA / FIM PARA: Executa um bloco de instrução um número determinado de vezes. O número de vezes é definido através do valor inicial e valor final da variável de controle.
Exemplo:
PARA contador de 1 ate 10 faca // Instruções fimpara
Vetores e Matrizes (Arranjos)
Definição de Vetores
Vetores são estruturas de dados homogêneas que permitem trabalhar com várias informações em uma mesma variável. As informações armazenadas em um vetor devem obrigatoriamente ser do mesmo tipo (por isso são chamadas estruturas homogêneas), sendo também conhecidos como matrizes de uma dimensão.
Exemplo de Declaração e Atribuição em Vetor
Algoritmo Atribuicao
Var
vet: vetor[1..5] de inteiro
Inicio
vet[3] <- 10 // Atribui o valor 10 à terceira posição do vetor
FimalgoritmoConceitos e Nomenclaturas
- Definição de Vetores e Matrizes
- Estruturas de dados homogêneas permitem agrupar diversas informações dentro de uma mesma variável, obedecendo sempre ao mesmo tipo de dado.
- Outras Nomenclaturas
- Variáveis indexadas, variáveis compostas, arranjos, tabelas em memória ou arrays.
Declaração de Vetores
Como fica a declaração de dois vetores para armazenar 20 produtos e 20 preços?
PRODUTOS: vetor [1..20] de caracter
PRECO: vetor [1..20] de realExercício 5: Cálculo de Combustível em Viagem
Efetuar o cálculo da quantidade de litros de combustível gastos em uma viagem, usando um automóvel que faz 12 KM por litro. O usuário deverá fornecer o tempo gasto e a velocidade média durante a viagem.
- Fórmula da Distância:
DISTANCIA = TEMPO * VELOCIDADE - Fórmula dos Litros:
LITROS_GASTOS = DISTANCIA / 12
Dados do Algoritmo
- Entrada: TEMPO e VELOCIDADE_MEDIA
- Processamento: Calcular DISTÂNCIA e LITROS_GASTOS.
- Saída: TEMPO, VELOCIDADE_MEDIA, DISTÂNCIA, LITROS_GASTOS.
Pseudocódigo "Tempo e Velocidade"
algoritmo "Tempo e Velocidade"
// Função: Calcular a distância e o gasto de combustível
Var
tempo, velocidade_media, litros_gastos, distancia: real
Inicio
// Entrada de Dados
escreval("Digite a velocidade média (Km/h)")
leia(velocidade_media)
escreval("Digite o tempo gasto (horas)")
leia(tempo)
// Processamento
distancia <- tempo * velocidade_media
litros_gastos <- distancia / 12
// Saída
escreval("A distância percorrida foi ", distancia, " Km")
escreval("Os litros gastos foram ", litros_gastos, " L")
FimalgoritmoExercício 6: Cálculo de Salário por Produtividade
O salário base de um operário é de R$ 240,00. O adicional de produtividade é calculado com base na quantidade de peças fabricadas por mês, conforme os critérios abaixo:
- Até 500 peças: Apenas o salário base. Adicional = R$ 0,00.
- Entre 501 e 750 peças: R$ 0,50 por peça fabricada acima de 500.
- Acima de 750 peças: R$ 350,00 (fixo) mais R$ 0,75 por peça fabricada acima de 750.
Pseudocódigo "Cálculo de Salário"
algoritmo "Cálculo de Salário"
// Função: Calcular o Salário Ganho no Mês
Var
salario_base, adicional, salario_final: real
quantidade_de_pecas: inteiro
Inicio
// Atribuição de Valores Iniciais
salario_base <- 240.00
adicional <- 0.0
// Entrada de Dados
escreval("Digite a Quantidade de Peças Fabricadas no Mês")
leia(quantidade_de_pecas)
Se (quantidade_de_pecas <= 500) entao
adicional <- 0.0
salario_final <- salario_base + adicional
escreval("O valor final é R$", salario_final)
senao
Se (quantidade_de_pecas <= 750) entao
adicional <- (quantidade_de_pecas - 500) * 0.50
salario_final <- salario_base + adicional
escreval("O valor final é R$", salario_final)
senao
// quantidade_de_pecas > 750
adicional <- 350.00 + (quantidade_de_pecas - 750) * 0.75
salario_final <- salario_base + adicional
escreval("O valor final é R$", salario_final)
fimse
fimse
FimalgoritmoExercício 7: Cálculo de Mensalidade de Plano de Saúde
Crie um algoritmo que calcule o valor da mensalidade de um plano de saúde com base na idade do cliente, utilizando a tabela de preços fornecida.
Tabela de Preços
- Até 10 anos: R$ 30,00
- Acima de 10 até 29 anos: R$ 60,00
- Acima de 29 até 45 anos: R$ 120,00
- Acima de 45 até 59 anos: R$ 150,00
- Acima de 59 até 65 anos: R$ 250,00
- Acima de 65 anos: R$ 400,00
Pseudocódigo "Plano de Saúde"
algoritmo "Plano de Saúde"
// Função: Calcular o valor de acordo com a idade
Var
nome: caracter
idade: inteiro
valor: real
Inicio
// Entrada de Dados
escreval("Digite o nome do cliente")
leia(nome)
escreval("Digite a idade")
leia(idade)
Se (idade <= 10) entao
valor <- 30.00
senao
Se (idade <= 29) entao
valor <- 60.00
senao
Se (idade <= 45) entao
valor <- 120.00
senao
Se (idade <= 59) entao
valor <- 150.00
senao
Se (idade <= 65) entao
valor <- 250.00
senao
// Idade > 65
valor <- 400.00
fimse
fimse
fimse
fimse
fimse
escreval("Cliente: ", nome)
escreval("O valor a ser pago é R$", valor)
FimalgoritmoExercício 8: Pesquisa de Satisfação de Produto
Uma empresa realizou uma pesquisa coletando o sexo (M/F), idade e resposta (S/N) sobre um novo produto. O algoritmo deve calcular e informar os seguintes contadores:
- a) Número de pessoas que responderam SIM (
cont1) - b) Número de pessoas que responderam NÃO (
cont2) - c) Número de pessoas maiores ou iguais a 18 anos que responderam SIM (
cont3) - d) Número de pessoas menores de 18 anos que responderam NÃO (
cont4) - e) Número de pessoas maiores ou iguais a 18 anos, do sexo feminino que responderam NÃO (
cont5) - f) Número de pessoas menores de 18 anos, do sexo masculino que responderam SIM (
cont6)
Pseudocódigo "Pesquisa sobre nosso produto"
algoritmo "Pesquisa sobre nosso produto"
// Função: Calcular estatísticas da pesquisa de satisfação
Var
cont1, cont2, cont3, cont4, cont5, cont6, idade: inteiro
resposta, sexo, continua: caracter
Inicio
// Inicialização dos Contadores
cont1 <- 0; cont2 <- 0; cont3 <- 0; cont4 <- 0; cont5 <- 0; cont6 <- 0
continua <- "S"
enquanto continua = "S" faca
escreval("--- Pesquisa de Satisfação ---")
escreva("Digite o Sexo (F para feminino ou M para masculino): ")
leia(sexo)
sexo <- Maiusculo(sexo) // Padroniza a entrada
enquanto (sexo <> "F") e (sexo <> "M") faca
escreva("Essa pesquisa aceita somente F ou M: ")
leia(sexo)
sexo <- Maiusculo(sexo)
fimenquanto
escreva("Digite a sua idade: ")
leia(idade)
escreva("Você gostou de nosso novo produto? (S/N): ")
leia(resposta)
resposta <- Maiusculo(resposta)
enquanto (resposta <> "S") e (resposta <> "N") faca
escreva("Essa pesquisa aceita somente S para sim ou N para não: ")
leia(resposta)
resposta <- Maiusculo(resposta)
fimenquanto
// Lógica de Contagem
se (resposta = "S") entao
cont1 <- cont1 + 1
se (idade > 17) entao
cont3 <- cont3 + 1 // >= 18, SIM
senao // idade <= 17
se (sexo = "M") entao
cont6 <- cont6 + 1 // < 18, M, SIM
fimse
fimse
senao // resposta = "N"
cont2 <- cont2 + 1
se (idade <= 17) entao
cont4 <- cont4 + 1 // < 18, NAO
senao // idade > 17
se (sexo = "F") entao
cont5 <- cont5 + 1 // >= 18, F, NAO
fimse
fimse
fimse
escreva("Você deseja responder a pesquisa novamente? (S/N): ")
leia(continua)
continua <- Maiusculo(continua)
enquanto (continua <> "S") e (continua <> "N") faca
escreva("Essa resposta aceita somente S para sim ou N para não: ")
leia(continua)
continua <- Maiusculo(continua)
fimenquanto
fimenquanto
// Saída dos Resultados
escreval("--- Resultados da Pesquisa ---")
escreval("a) Número de pessoas que responderam SIM: ", cont1)
escreval("b) Número de pessoas que responderam NÃO: ", cont2)
escreval("c) Número de pessoas maiores ou iguais a 18 anos que responderam SIM: ", cont3)
escreval("d) Número de pessoas menores de 18 anos que responderam NÃO: ", cont4)
escreval("e) Número de pessoas >= 18 anos, do sexo feminino que responderam NÃO: ", cont5)
escreval("f) Número de pessoas < 18 anos, do sexo masculino que responderam SIM: ", cont6)
Fimalgoritmo