Ao final desta disciplina, os alunos serão capazes de:
• Compreender alguns conceitos fundamentais de lógica de programação e algoritmos
• Desenvolver raciocínio lógico estruturado para resolução de problemas
• Criar e executar algoritmos simples utilizando o VisuAlg
• Implementar estruturas de controle (condicionais e repetições)
• Trabalhar com variáveis, tipos de dados e operadores
• Analisar e otimizar algoritmos básicos
A lógica é a ciência que estuda as formas válidas de raciocínio e argumentação.
Ela é fundamental em várias áreas do conhecimento, incluindo a matemática, a filosofia e a ciência da computação.
Lógica é a base do pensamento estruturado e racional.
Na programação, a lógica é essencial para a criação de algoritmos e para a resolução de problemas de forma eficiente.
Usando a Lógica para criar um ambiente de estudo organizado.
-Para estudar, é necessário um local adequado.
-Uma mesa organizada ajuda a manter o foco.
-Ter os materiais necessários à disposição evita distrações.
-Um ambiente silencioso facilita a concentração
A lógica de programação (ou, por extensão, lógica computacional) é uma forma de organizar pensamentos que permite a tradução do raciocínio lógico humano para a linguagem das máquinas, permitindo que elas realizem alguma determinada tarefa.
Lógica por associação de ideias.
-Um celular sem bateria não pode ser usado.
-Um carro sem combustível não anda.
-Um aluno sem estudar pode ter dificuldades na prova.
Relação lógica entre elementos.
-Todos os smartphones são dispositivos eletrônicos.
-O celular que você usa é um smartphone.
-Logo, seu celular é um dispositivo eletrônico.
A decomposição consiste em quebrar um problema complexo em partes menores e mais gerenciáveis. Isso facilita a análise e a resolução, pois fica mais fácil lidar com cada parte separadamente.
Isso mostra que algoritmo não nasce no computador — nasce na organização do pensamento.
A abstração é o processo de remover detalhes desnecessários e focar apenas no que realmente importa para resolver um problema.
Quero saber se o aluno foi aprovado.
Aplicando abstração: para saber aprovação, só importa a nota. Todo o resto é descartado.
Quando você faz uma ligação,Você não pensa em:
Isso também é abstração.Abstrair é enxergar apenas o que resolve o problema.
O reconhecimento de padrões consiste em identificar semelhanças entre problemas diferentes para reutilizar soluções já conhecidas.
Problemas diferentes
Aprendendo um padrão, você resolve vários exercícios.
Um algoritmo é uma sequência lógica,
finita e bem definida de passos que devem ser seguidos para resolver um problema ou realizar uma tarefa.
Algoritmo é organizar o pensamento em passos.
Consistem em uma série de instruções, raciocínios ou operações que visam um objetivo, em geral a solução de um problema.
Algoritmo é a aplicação da lógica para resolver um problema específico.
Para isso, essa série de instruções deve ser finita e operada de maneira sistemática; é um processo sistemático para a resolução de um problema ou uma sequência
ordenada de passos a ser observada para a realização de uma tarefa.
Não é só no ambiente digital que os algoritmos estão presentes.
Você provavelmente já os usou em diversos momentos da sua vida.
Consiste em :
1- Analisar a descrição do problema;
2- Escrever em uma linguagem natural o passo a passo a ser seguido para a resolução do problema.
A vantagem da utilização desse tipo de algoritmo está na facilidade, pois usa uma língua natural, como o português.
A desvantagem é que, a língua natural é passível de interpretações diferentes, o que pode dificultar na transcrição do algoritmo para o programa.
Consiste em:
1- Analisar a descrição do problema e escrever o passo a passo
2- Criar uma solução através de símbolos gráficos pré-definidos.
A vantagem do uso desse tipo de algoritmo está no entendimento facilitado pela utilização de elementos gráficos.
Pseudocódigo ou Linguagem de Programação é uma linguagem escrita e formal que especifica um conjunto de instruções e regras usadas para gerar programas (software / aplicativos). Um software pode ser desenvolvido para rodar em um computador, dispositivo móvel ou em qualquer equipamento que permita sua execução.
Lógica: Para escovar os dentes, é necessário usar pasta de dente e uma escova.
Algoritmo:
1-Pegar a escova de dentes.
2-Colocar pasta de dente na escova.
3-Escovar os dentes por alguns minutos.
4-Enxaguar a boca.
5-Guardar a escova de dentes.
Lógica: Você sabe que, para cozinhar qualquer macarrão, precisa de água quente e um tempo de cozimento adequado.
Algoritmo:
1-Pegar um pacote de miojo.
2-Esquentar a água.
3-Colocar o miojo na panela.
4-Esperar 3 minutos.
5-Adicionar o tempero e misturar.
6-Comer desesperadamente.
Podemos dizer que a lógica ajuda a entender o problema e encontrar soluções e algoritmo organiza essas ideias em passos organizado para resolver o problema e/ou atingir o objetivo .
Fazer café
Esquentar a água.
Colocar o filtro no suporte.
Colocar o pó de café no filtro.
Despejar a água quente no filtro.
Esperar o café coar.
Servir na xícara e beber.
Tomar banho
Ligar o chuveiro.
Pegar a roupa.
Ensaboar o corpo.
Pegar a toalha.
Secar o corpo.
Vestir a roupa limpa.
Lavar o carro
Passar o pano no carro.
Ligar a mangueira.
Pegar o material de uso na lavagem.
Molhar o carro.
Secar o carro.
Podemos transformar qualquer rotina em um algoritmo, pois ele é apenas uma sequência lógica de passos para alcançar um objetivo.
No entanto, a ordem dos passos é fundamental para que o algoritmo funcione corretamente. Para ilustrar esse conceito, alteramos propositalmente a sequência dos passos em algumas rotinas, como "Tomar Banho" e "Lavar o Carro".
Em alguns algoritmos, a ordem dos passos pode ser alterada sem prejudicar o resultado final.
Mas, existem casos em que, se a sequência das ações não for respeitada, o resultado pode ser inesperado ou até mesmo desastroso.
Imagine tomar banho antes de tirar a roupa...
Passar o pano no carro antes de enxaguá-lo...
Calçar o tênis antes das meias...
Essas inversões tornam a execução do processo incorreta ou sem sentido.
Isso mostra que um algoritmo bem estruturado não é apenas uma lista de ações, mas sim uma sequência lógica que deve ser seguida corretamente para alcançar o resultado esperado.
O algoritmo deve ter um fim, ou seja, não pode entrar em um loop infinito.
Exemplo: Se você quer um algoritmo para somar dois números, ele precisa chegar a um resultado final.
Cada passo do algoritmo deve ser claro e sem ambiguidades.
Exemplo ruim: “Colocar um pouco de açúcar no café” (quanto é “um pouco”?)
Exemplo bom: “Adicionar 2 colheres de chá de açúcar no café.”
O algoritmo deve resolver o problema de forma rápida e com menos recursos possíveis.
Exemplo: Se você quer encontrar um nome em uma lista de 10.000 nomes, um algoritmo que busca nome por nome seria lento. Mas se estiver organizada alfabeticamente, a busca será mais rápida.
Bem estruturado e ordenado
O algoritmo deve ter uma sequência lógica de passos.
Exemplo ruim: “Adicionar pó de café, depois colocar a água, depois esquentar a água.” (A ordem está errada!)
Exemplo correto: Primeiro esquenta a água, depois coloca o pó de café e então despeja a água.
Um bom algoritmo deve funcionar para diferentes entradas de dados e não apenas para um único caso específico.
Exemplo ruim: Um algoritmo que só calcula a soma de 2 + 2.
Exemplo bom: Um algoritmo que recebe qualquer dois números e retorna a soma.
1-Ligar o celular.
2-Desbloquear a tela.
3-Entrar no aplicativo Ifood.
4-Escolher um restaurante ou um item.
5-Realizar o pagamento na aba do carrinho.
1-Escolha o aplicativo que quer usar.
2-Abra a loja de aplicativos do seu dispositivo.
3-Procure ele na loja.
4-Baixe o aplicativo.
5-Abra o aplicativo de comida.
6-Crie uma conta.
7-Escolha um restaurante.
8-Olhe o cardápio.
9-Escolha o prato.
10-Coloque no carrinho.
11-Finalize o pedido.
12-Coloque o endereço.
13-Coloque a forma de pagamento.
14-Pague o pedido
espere o pedido chegar.
15-Pegue o pedido com o entregador
16-Coma a comida.
1-Ligar o aparelho. 2-Escolher o idioma.
3-Conectar a internet.
4-Fazer login na conta.
5-Aceitar os termos de uso.
6-Restaurar dados (opcional).
7-Finalizar a configuração.
1- Abra a caixa do smartphone.
2-Pressione o botão de ligar.
3-Coloque o idioma da sua preferência.
4-Conecte a uma rede wifi ou dados móveis.
5-Insira ou configure um cartão SIM.
6-Transfira os dados de um outro aparelho (opcional).
7-Fazer o login na conta Google ou ID Apple.
8-Configurar segurança ou biometria.
9-Atualizar o sistema e aplicativos.
10-E por fim, personalizar o aparelho.
Lógica: Para pedir comida é necessário um aparelho celular com internet.
Algorítimo:
1-Abrir o aplicativo "iFood".
2-Escolher a comida de sua preferência.
3-Adicionar a sacola.
4-Editar o pedido.
5-Adicionar seu endereço.
6-Adicionar forma de pagamento.
7-Realizar o pagamento.
8-Aguardar o recebimento do pedido em seu endereço.
1- Pego o celular
2-Escolho o idioma.
3-Conecto o telefone a internet.
4-Copio os dados do aparelho antigo e passo para o novo.
5-Faço login na minha conta no google.
6-Defino a senha do celular novo.
Após olharmos algumas respostas .....
Nem sempre temos todas as informações e na maioria dos casos precisamos usar a entrada de dados através de variáveis.
No processo de pedir comida, precisamos saber o que a pessoa quer pedir, certo?
E se ela quiser um hambúrguer ao invés de pizza ?
E o local de entrega do lanche ? Ele não é fixo ( constante ) , certo ?
Essa informação precisa ser flexível ! E é aí que entram as variáveis !
Na lista de músicas , as músicas escolhidas são sempre as mesmas ? Claro que não.
Observem que nos exercícios respondidos a maioria respondeu :
"Abrir o app, selecionar o lanche - a comida e confirmar o pedido."
Não tivemos respostas assim :
"Abrir o app, selecionar uma PIZZA e confirmar o pedido."
Na atividade anterior, vocês descreveram os passos para habilitar um celular novo. Agora, vamos analisar quais informações podem mudar de uma pessoa para outra.
Lógica:
O smartphone é novo ,já está com o usuário, possui um número ( chip ).
Algoritmo:
1-Ligar o celular.
2-Escolher o idioma.
3-Conectar-se a uma rede Wi-Fi.
4-Inserir o chip e desbloqueá-lo.
5-Fazer login com uma conta (Google, Apple, etc.).
6-Restaurar ou configurar como novo.
As variáveis são espaços , lugares na memória do computador para guardamos "valores" ( caracteres , números, booleanos e datas ).
qtde_pessoas_churrasco
qtde_horas_de_churrasco
acompanhamentos
As variáveis também podem receber valores após o cálculo de uma fórmula :
- total_gasto
- troco
Em um algoritmo computacional , temos :
Informações de Entrada ,
Processamento da lógica , Informações de Saída.
Escreval("Preço Sanduiche")
Leia(preco_sanduiche)
Escreval("Qtde Sanduiche")
Leia (qtde_de_sanduiche)
Observe que NÃO tivemos ainda um processamento mas , somente entrada e saída. Certo ?
Leia(preco_sanduiche)
Leia(preco_liquido)
Leia(qtde_de_sanduiche)
Leia(qtde_de_liquido)
As variáveis (algoritmo computacional) guardam informações que podem ser dos tipos :
inteiro: define variáveis numéricas do tipo inteiro, ou seja, sem casas decimais.
real: define variáveis numéricas do tipo real, ou seja, com casas decimais.
caractere: define variáveis do tipo string, ou seja, cadeia de caracteres.
lógico: define variáveis do tipo lógico, ou seja, com valor VERDADEIRO ou FALSO.
Informações sobre ...
Uma escola quer um algoritmo para calcular a média das notas dos alunos. As disciplinas são semestrais e possuem 2 notas a serem computadas.
Lógica ...
Precisaremos de entrar com 2 notas, que podem tem casas decimais e com essas notas calcular a média.
Para pintar uma parede, sabemos que 1 litro de tinta cobre 5m². Precisamos criar um algoritmo que mostre a quantidade de tinta que precisaremos compra.
Os engenheiros frequentemente precisam calcular o peso de barras de aço para projetos estruturais.
Para simplificar esse cálculo, podemos usar a seguinte fórmula: P = 0,00617 x d² x h
Pela lógica
Para calcular a quantidade de areia temos algumas variáveis. Pela lógica , precisaremos de cimento , areia e brita. Pela lógica devemos conhecer a quantidade média usada para ser usada em 1 m³.
Vamos definir como se os sacos de cimento fossem vendidos em padrões de 50 kg, ok ?
Vamos fazer ,inicialmente , o mais simples e aos poucos iremos melhorar , dentro do nosso conhecimento.
Ok ?!
Vamos tentar juntos criar um algoritmo computacional , um pequeno programa de computador para calcular a quantidade de tijolos necessários para construir uma parede.
Os valores lógicos / booleanos são um conceito fundamental na lógica computacional e na programação. O termo "booleano" vem do matemático George Boole, que desenvolveu a "Álgebra Booleana" no século XIX. Esse sistema de lógica usa apenas dois valores:
Verdadeiro (True)
Falso (False)
Na computação, os valores booleanos são essenciais para tomada de decisões, pois permitem comparar valores e controlar o fluxo do programa.
Como exemplo, suponha que a, b e c sejam variáveis do tipo inteiro.
Então, temos que a =2, a>b e c<=b são todos exemplos de expressões relacionais.
Na expressão
a =2,
estamos comparando o valor da variável a com a constante 2. O resultado desta comparação é
o valor lógico verdadeiro se o valor de a é igual a 2; caso contrário, o resultado é o valor lógico
falso.
Na expressão
a >b,
estamos comparando os valores das variáveis a e b. O resultado desta comparação é o valor lógico
verdadeiro se o valor de a é maior do que o de b. Caso contrário, o resultado é o valor lógico
falso.
Na expressão
c <=b,
estamos comparando os valores das variáveis c e b. O resultado desta comparação é o valor lógico
verdadeiro se o valor de c é menor ou igual ao valor de b. Caso contrário, o resultado é o valor
lógico falso.
Responda apenas "Verdadeiro" ou "Falso" para as seguintes questões:
a) O Brasil está na América do Sul.
b) Vocês são alunos de Odontologia.
c) Banana é um legume.
d) Uma semana tem 7 dias.
e) Dia 25 de dezembro é comemorado o Natal.
Cada uma dessas perguntas permite apenas duas respostas: Verdadeiro ou Falso. Isso significa que elas são expressões booleanas, pois resultam em um dos dois valores possíveis.
As expressões booleanas podem ser formadas através de comparadores:
a expressão 5 = 5 tem como resultado booleano "verdadeiro".
a expressão 5 > 6 tem como resultado booleano "falso".
a expressão 8 > 4 tem como resultado booleano "verdadeiro".
a expressão 7 <> 2 tem como resultado booleano "verdadeiro".
Comparadores em algoritmos:
= (igual)
<> (diferente) ou != (diferente)
> (maior que)
< (menor que)
>= (maior ou igual)
<= (menor ou igual)
Exemplo prático: Comparando notas
Agora, vamos aplicar o conceito de valores booleanos em um programa simples. Suponha que queremos verificar se um aluno obteve nota suficiente para ser aprovado. Para isso, definimos uma média mínima e comparamos a nota do aluno com essa média.
O resultado dessa comparação será um valor booleano (Verdadeiro ou Falso).
A media <- 6.0 e a nota <- 5.0 , então nota > media terá qual valor booleano ?
a - Crie um algoritmo que leia um número inteiro e mostre na tela o seu dobro e a sua terça parte.
b- Faça um algoritmo que leia o salário de um funcionário, calcule e mostre o seu novo salário, com 15% de aumento.
c-Faça um algoritmo que leia a largura e altura de uma parede, calcule e mostre a área a ser pintada e a quantidade de tinta necessária para o serviço, sabendo que cada litro de tinta pinta uma área de 2 m quadrados.
d-Crie um programa que leia o número de dias trabalhados em um mês e mostre o salário de um funcionário, sabendo que ele trabalha 8 horas por dia e ganha R$ 35,00 por hora trabalhada
e- Crie um programa que leia o preço de um produto, peça quanto de desconto será dado no preço total , calcule e mostre o novo valor do produto com desconto
Agora que vimos um sobre os valores booleanos, podemos usar essa informação para tomar decisões em programas.
Para isso, utilizamos a estrutura SE (ou if em algumas linguagens de programação).
Nesse exemplo, atribuímos 2 valores a 2 variáveis ( linha 5 e linha 6 )
Na linha 7 , usando o comando Se ( desvio condicional ) e usando uma expressão booleana ( nota >= media ) , condicionamos o nosso programa a escrever "Aprovado" se o valor de nota for maior ou igual ao valor da media.
Nesse novo exemplo, mantivemos o mesmo código até a linha 8.
Diferentemente do exemplo anterior que o programa somente mostrava "APROVADO" caso a condição booleana (nota>=media) fosse VERDADEIRA, nesse exemplos caso a condição booleana seja FALSA a palavra "Reprovado" será mostrada na tela.
Desafio 1
Verificar se um número é positivo ou negativo. O algoritmo deve mostrar "POSITIVO" ou "NEGATIVO".
Desafio 2
Determinar se um aluno passou ou não com base em duas notas de uma disciplina. O algoritmo deve dizer se foi "APROVADO" ou "REPROVADO".
Desafio 3
No algoritmo do troco , altere para verificar se o valor pago é suficiente, caso não seja avise "Valor Insuficiente".
Devemos entender que, ao criarmos alguma "condição" para desviar nosso "caminho" de nosso algoritmo, algumas tarefas serão executadas - realizadas e outras não.
Se estiver sem chuva ,irei de bicicleta elétrica para o trabalho, senão irei de carro. Veja que a pessoa criou uma condição ( estar sem chuva ) para definir de qual modo irá para o trabalho : de bicicleta OU de carro.
O algoritmo agora criou outras 'condições' depois que alguma condição ocorreu. Na linha 12 se a condição media_aluno >= media_escola o program irá executar o que está na linha 13 ( deixando de executar as linhas 17,18,19,20,21 e22 ok ?).
Na linha 13 existe outra "condição booleana" a ser verificada , certo ? Nessa linha já sabemos que a media_linha é maior ou igual a media_escola, certo ?! Então o algoritmo quer mostrar se o aluno(a) é ou não excelente e para isso foi criado uma "condição booleana" que determina que "se a média do aluno(a) for maior que 9,00 (nove)" devemos dizer "Média Excelente".
A condição única determina que a linha 14 só será executada "Se (media_aluno>9)".
Depois o programa , sem nenhuma "condição" executa a linha 16 e escreve "Aluno Aprovado", ok ?
Fizemos um desvio condicional onde verificamos apenas 1 condição para determinar se o aluno está ou não APROVADO. Verificamos se a Média do aluno é maior ou igual a Média da Escola :
Se (media_aluno >= media_escola)
Observem que no exercício das notas podemos melhorar. Podemos colocar o algoritmo para verificar se as notas são válidas. Notas válidas , em um sistema escolar, são notas que os valores são maior ou igual a 0 e menor ou igual a 10.
Se (Nota1 >=0) E (Nota1 <=10) , também podemos fazer a verificação com a Nota2 :
Se (Nota1 >=0) E (Nota1 <=10).
Compare as duas observações: Para definir se o aluno está ou não APROVADO precisamos de apenas 1 condição ( usando uma expressão booleana ). Ok ? Mas , para definirmos se as notas (nota1 e nota2) são ou não válidas , precisamos de 2 condições. Ok ?
- Para a nota ( nota1 e nota2 ) ser válida , ela precisa ser maior ou igual a 0 E menor ou igual a 10.
- Percebam que se 1 das 2 condições for FALSA , a nota não será válida.
Agora que aprendemos a usar o SE para tomar decisões com base em uma única condição, chegou o momento de aumentar o poder do nosso raciocínio lógico.
Imagine que queremos validar duas condições ao mesmo tempo: por exemplo, que uma nota esteja entre 0 e 10, ou que uma pessoa tenha mais de 18 anos e tenha carteira de motorista.
Nesses casos, usamos os operadores lógicos para combinar condições dentro do comando SE. Com isso, conseguimos criar decisões mais completas e realistas nos nossos algoritmos.
O operador "E" exige que todas as condições sejam verdadeiras para o resultado ser verdadeiro. Lembra das notas válidas de um sistema escolar ? Para que elas fossem válidas existem 2 condições : ser maior ou igual a 0 zero E ser menor ou igual a 10. Então , as 2 condições devem ser verdadeiras pois se uma delas NÃO for o resultado será FALSO.
Nota maior ou igual a zero E menor ou igual a dez RESULTADO
--------------------------------------------------------------------------------
4,0 VERDADEIRO VERDADEIRO VERDADEIRO
11,0 VERDADEIRO FALSO FALSO
-5,0 FALSO VERDADEIRO FALSO
7,5 VERDADEIRO VERDADEIRO VERDADEIRO
O operador OU exige que pelo menos uma condição seja verdadeira para o resultado ser verdadeiro.
Vamos dar como exemplo uma entrada no ônibus. Digamos que a lei estabeleça que pessoas com menos de 7 anos e mais de 60 anos possa andar de ônibus de graça.
Idade menor que 7 anos OU maior ou igual a 60 anos RESULTADO
---------------------------------------------------------------------------------
18 FALSO FALSO FALSO
6 VERDADEIRO FALSO VERDADEIRO
61 FALSO VERDADEIRO VERDADEIRO
3 VERDADEIRO FALSO VERDADEIRO
Nesta aula, vamos aprender um novo recurso muito importante na programação: os laços de repetição, também chamados de loops.
Imagine que você precise repetir uma mesma tarefa várias vezes: "Somar 3 números digitados pelo usuário".
Se não tivermos um comando de repetição, teríamos que escrever várias vezes o mesmo bloco de comandos, o que não é prático.
Para resolver isso, usamos os laços de repetição, que fazem o computador executar um bloco de comandos várias vezes automaticamente, conforme as condições que definirmos.
Loop Para Até
Enquanto Faça.
Repita até
O primeiro tipo de loop que vamos estudar é o
Para ... Ate ... Faça,
que é usado quando sabemos exatamente quantas vezes queremos repetir uma tarefa.
Ou variável contadora, é um tipo de variável que usamos para obter uma contagem de um valor conhecido ( 1 , 2 , 3 etc ).
Ou variável acumuladora, é um tipo de variável que usamos para acumular valores desconhecidos.
Esta estrutura repete uma sequência de comandos enquanto uma determinada condição (especificada através de uma expressão lógica) for satisfeita.
enquanto < expressão lógica >
fimenquanto
O comando fimenquanto Indica o fim da
Esta estrutura repete uma sequência de comandos até que uma determinada condição (especificada através de uma expressão lógica) seja satisfeita.
repita
ate < expressão lógica >
Um vetor é uma estrutura utilizada para armazenar vários valores do mesmo tipo em uma única variável. Cada valor ocupa uma posição identificada por um índice.
Imagine que precisamos armazenar as notas de 5 alunos. Sem utilizar um vetor, teríamos que criar cinco variáveis diferentes: nota1, nota2, nota3, nota4 e nota5. Com um vetor, podemos armazenar todas essas notas em uma única estrutura chamada notas.
Os vetores facilitam a organização dos dados e permitem utilizar estruturas de repetição, como o comando PARA, para preencher, consultar e processar suas posições.
Para utilizar um vetor no VisuAlg, precisamos declará-lo na área de variáveis, informando seu nome, a quantidade de posições e o tipo de dado que será armazenado.
Observe a declaração de um vetor capaz de armazenar cinco números inteiros:
var
notas: vetor[1..5] de inteiro
Nesse exemplo:
notas: é o nome do vetor.
[1..5]: indica que o vetor possui cinco posições, numeradas de 1 até 5.
inteiro: indica que cada posição armazenará um número inteiro.
Os tipos de dados mais comuns utilizados em vetores são inteiro, real, caractere e logico.
Cada posição do vetor pode ser acessada pelo nome da variável seguido do índice entre colchetes.
Por exemplo, para armazenar a nota 8 na primeira posição e a nota 9 na segunda posição, utilizamos:
notas[1] <- 8
notas[2] <- 9
Para exibir o valor armazenado na primeira posição:
escreval(notas[1])
O resultado será 8.
Atenção: o índice identifica a posição do elemento, e não o valor armazenado nela. Neste exemplo, o índice é 1 e o valor armazenado é 8.
Quando precisamos preencher várias posições, podemos utilizar uma estrutura de repetição. Assim, evitamos escrever um comando de leitura para cada posição do vetor.
O exemplo a seguir solicita cinco números inteiros e armazena cada um deles em uma posição do vetor.
algoritmo "PreencherVetor"
var
numeros: vetor[1..5] de inteiro
i: inteiro
inicio
para i de 1 ate 5 faca
escreva("Digite um numero: ")
leia(numeros[i])
fimpara
fimalgoritmo
A variável i controla a repetição. Em cada execução, ela assume um valor de 1 até 5 e indica qual posição do vetor receberá o número digitado.
Na primeira repetição, o valor é armazenado em numeros[1]. Na segunda, em numeros[2]. O processo continua até preencher numeros[5].
Depois de preencher um vetor, podemos percorrer suas posições para consultar os valores armazenados. Para isso, utilizamos novamente a estrutura PARA.
para i de 1 ate 5 faca
escreval("Posicao ", i, ": ", numeros[i])
fimpara
Esse trecho exibe os valores das cinco posições do vetor, um por linha. Observe que a mesma variável de controle i é utilizada para acessar cada posição.
O algoritmo abaixo solicita cinco notas, armazena os valores em um vetor e, em seguida, exibe todas as notas informadas.
algoritmo "NotasDosAlunos"
var
notas: vetor[1..5] de real
i: inteiro
inicio
para i de 1 ate 5 faca
escreva("Digite a nota do aluno ", i, ": ")
leia(notas[i])
fimpara
escreval("Notas cadastradas:")
para i de 1 ate 5 faca
escreval("Aluno ", i, ": ", notas[i])
fimpara
fimalgoritmo
Nesse algoritmo, o primeiro PARA realiza a leitura das notas e o segundo PARA percorre o vetor para exibir os valores. Cada estrutura de repetição executa uma tarefa diferente, utilizando o mesmo vetor.
Ao utilizar vetores no VisuAlg, lembre-se de algumas regras importantes:
• O vetor deve ser declarado antes de ser utilizado.
• Todas as posições armazenam dados do tipo declarado.
• O índice deve estar dentro dos limites definidos na declaração.
• Um vetor declarado como vetor[1..5] possui cinco posições, de 1 até 5.
• A estrutura PARA pode ser utilizada para percorrer todas as posições de um vetor.
• O índice pode ser uma variável, como i, ou um número fixo, como notas[3].
Conclusão: os vetores permitem armazenar e manipular conjuntos de dados de forma organizada. Quando combinados com estruturas de repetição e controle, tornam os algoritmos mais simples, reutilizáveis e fáceis de compreender.
Na aula anterior, aprendemos a declarar, preencher e percorrer
um vetor utilizando a estrutura de repetição PARA.
Agora vamos avançar: aprenderemos a utilizar os valores
armazenados no vetor para resolver problemas.
Para isso, vamos trabalhar com quatro conceitos importantes:
contador, acumulador, estruturas de decisão SE...FIMSE
e repetição REPITA...ATE.
O objetivo é entender como um algoritmo pode analisar vários
valores armazenados, contar quantos atendem a uma condição,
somar resultados e tomar decisões.
Embora sejam utilizados frequentemente juntos, contador e
acumulador possuem funções diferentes.
CONTADOR: utilizado para contar quantas vezes
determinada situação acontece.
ACUMULADOR: utilizado para somar ou acumular
valores ao longo da execução do algoritmo.
Imagine uma turma com cinco alunos. Queremos saber quantos
foram aprovados e qual foi a soma de todas as notas.
Precisaremos de duas variáveis diferentes.
contador <- 0
soma <- 0
contador <- 0: inicia a contagem em zero.
soma <- 0: inicia o acumulador em zero.
Atenção: contador e acumulador precisam ser inicializados
antes de começarmos a utilizá-los.
ENUNCIADO:
Uma escola deseja armazenar as notas de cinco alunos em um
vetor. Após o preenchimento, o algoritmo deverá verificar
quantos alunos obtiveram nota maior ou igual a 6.
Ao final, deverá apresentar a quantidade de alunos aprovados.
Vamos analisar a lógica antes de escrever o código.
Primeiro precisamos criar um vetor para armazenar as cinco
notas. Depois, precisamos percorrer esse vetor e verificar
cada nota.
Quando uma nota for maior ou igual a 6, aumentaremos o
contador em uma unidade.
algoritmo "ContarAprovados"
var
notas: vetor[1..5] de real
i, contador: inteiro
inicio
contador <- 0
para i de 1 ate 5 faca
escreva("Digite a nota: ")
leia(notas[i])
fimpara
para i de 1 ate 5 faca
se notas[i] >= 6 entao
contador <- contador + 1
fimse
fimpara
escreval("Quantidade de aprovados: ", contador)
fimalgoritmo
Explicando cada trecho:
1. Declaração do vetor:
notas: vetor[1..5] de real
Criamos um vetor com cinco posições para armazenar as notas.
Utilizamos REAL porque uma nota pode possuir casas decimais.
2. Inicialização:
contador <- 0
Começamos a contagem em zero porque ainda não analisamos
nenhum aluno.
3. Preenchimento:
O primeiro PARA solicita as cinco notas e armazena cada
valor na posição correspondente do vetor.
4. Análise:
O segundo PARA percorre todas as posições do vetor.
5. Decisão:
se notas[i] >= 6 entao
Verificamos se a nota da posição atual é maior ou igual a 6.
6. Contagem:
contador <- contador + 1
Se a condição for verdadeira, acrescentamos uma unidade
ao contador.
7. Resultado:
Ao terminar a repetição, o contador informa quantos alunos
foram aprovados.
Considere que o vetor recebeu os seguintes valores:
notas[1] = 8
notas[2] = 4
notas[3] = 7
notas[4] = 5
notas[5] = 9
Observe o que acontece durante a análise:
Aluno 1: nota 8 -> aprovado -> contador = 1
Aluno 2: nota 4 -> reprovado -> contador = 1
Aluno 3: nota 7 -> aprovado -> contador = 2
Aluno 4: nota 5 -> reprovado -> contador = 2
Aluno 5: nota 9 -> aprovado -> contador = 3
Resultado final: 3 alunos aprovados.
Perceba que o contador só aumenta quando a condição do SE
é verdadeira. Ele não aumenta simplesmente porque o PARA
executou uma repetição.
ENUNCIADO:
Uma escola deseja armazenar as notas de cinco alunos em
um vetor. Após o preenchimento, deverá calcular a soma
de todas as notas e apresentar a média da turma.
Nesse problema, precisamos utilizar um acumulador.
Diferentemente do contador, que aumenta uma unidade,
o acumulador recebe os valores que desejamos somar.
algoritmo "MediaDaTurma"
var
notas: vetor[1..5] de real
i: inteiro
soma, media: real
inicio
soma <- 0
para i de 1 ate 5 faca
escreva("Digite a nota: ")
leia(notas[i])
fimpara
para i de 1 ate 5 faca
soma <- soma + notas[i]
fimpara
media <- soma / 5
escreval("Soma das notas: ", soma)
escreval("Media da turma: ", media)
fimalgoritmo
Explicando cada trecho:
1. Inicialização:
soma <- 0
O acumulador começa em zero. Assim, não carregamos nenhum
valor anterior para a soma.
2. Preenchimento:
O primeiro PARA armazena as cinco notas no vetor.
3. Acumulação:
soma <- soma + notas[i]
Essa é a instrução mais importante do exemplo.
Ela significa: pegue o valor que já está armazenado em soma,
acrescente a nota da posição atual e guarde o novo resultado
novamente em soma.
4. Cálculo da média:
media <- soma / 5
Depois de somar todas as notas, dividimos o resultado pela
quantidade de alunos.
5. Exibição:
Apresentamos a soma e a média calculada.
Agora vamos combinar os dois conceitos em um único problema.
ENUNCIADO:
Uma turma possui cinco alunos. O algoritmo deverá armazenar
suas notas em um vetor e calcular:
• A quantidade de alunos aprovados.
• A soma das notas dos aprovados.
• A média das notas dos aprovados.
Considere aprovado o aluno que obtiver nota maior ou igual
a 6.
algoritmo "AprovadosComMedia"
var
notas: vetor[1..5] de real
i, contador: inteiro
soma, media: real
inicio
contador <- 0
soma <- 0
para i de 1 ate 5 faca
escreva("Digite a nota do aluno: ")
leia(notas[i])
fimpara
para i de 1 ate 5 faca
se notas[i] >= 6 entao
contador <- contador + 1
soma <- soma + notas[i]
fimse
fimpara
se contador > 0 entao
media <- soma / contador
escreval("Aprovados: ", contador)
escreval("Soma das notas: ", soma)
escreval("Media dos aprovados: ", media)
senao
escreval("Nenhum aluno foi aprovado.")
fimse
fimalgoritmo
O que acontece nesse algoritmo?
Quando uma nota é maior ou igual a 6, duas operações
acontecem:
contador <- contador + 1
Contabiliza mais um aluno aprovado.
soma <- soma + notas[i]
Acrescenta a nota desse aluno ao acumulador.
Observe que as duas instruções estão dentro do SE.
Isso significa que somente as notas dos aprovados serão
contabilizadas e somadas.
Por que existe outro SE depois do PARA?
Porque precisamos verificar se contador é maior que zero
antes de dividir a soma pela quantidade de aprovados.
Se ninguém for aprovado, não podemos realizar uma divisão
por zero.
Até agora, utilizamos principalmente a estrutura PARA.
Entretanto, existe outra estrutura de repetição que permite
controlar melhor quando uma repetição deve terminar:
REPITA...ATE.
O REPITA executa os comandos primeiro e verifica a condição
de encerramento depois.
Isso significa que os comandos dentro do REPITA são
executados pelo menos uma vez.
Observe a estrutura:
repita
comandos
ate condicao
A repetição continua enquanto a condição do ATE for falsa.
Quando a condição se torna verdadeira, o algoritmo sai
da repetição.
Atenção: no REPITA...ATE, a condição representa a situação
em que devemos PARAR, e não continuar.
ENUNCIADO:
Uma escola deseja armazenar cinco notas em um vetor.
Utilize a estrutura REPITA...ATE para preencher todas
as posições.
Depois de preencher o vetor, exiba todas as notas
armazenadas.
algoritmo "VetorComRepita"
var
notas: vetor[1..5] de real
i: inteiro
inicio
i <- 1
repita
escreva("Digite a nota: ")
leia(notas[i])
i <- i + 1
ate i > 5
escreval("Notas cadastradas:")
para i de 1 ate 5 faca
escreval(notas[i])
fimpara
fimalgoritmo
Explicando cada trecho:
1. Inicialização do índice:
i <- 1
Começamos na primeira posição do vetor.
2. Início da repetição:
repita
O algoritmo começa a executar os comandos.
3. Leitura:
leia(notas[i])
O valor digitado será armazenado na posição indicada
pela variável i.
4. Avanço do índice:
i <- i + 1
Depois de armazenar uma nota, avançamos para a próxima
posição.
5. Condição de encerramento:
ate i > 5
Quando i se torna 6, significa que as cinco posições
já foram preenchidas e a repetição termina.
6. Exibição:
Depois do preenchimento, utilizamos um PARA para percorrer
e exibir os cinco valores.
ENUNCIADO:
Uma escola deseja registrar as notas de cinco alunos.
O algoritmo deverá utilizar REPITA...ATE para preencher
o vetor e, depois, percorrer suas posições para contar
quantos alunos foram aprovados.
A aprovação acontece quando a nota é maior ou igual a 6.
algoritmo "ContagemComRepita"
var
notas: vetor[1..5] de real
i, aprovados: inteiro
inicio
i <- 1
aprovados <- 0
repita
escreva("Digite a nota do aluno: ")
leia(notas[i])
i <- i + 1
ate i > 5
i <- 1
repita
se notas[i] >= 6 entao
aprovados <- aprovados + 1
fimse
i <- i + 1
ate i > 5
escreval("Quantidade de aprovados: ", aprovados)
fimalgoritmo
Um detalhe muito importante:
Observe que utilizamos REPITA duas vezes.
O primeiro REPITA é responsável por preencher o vetor.
Depois, reiniciamos a variável i:
i <- 1
Isso é necessário porque o primeiro REPITA terminou com
i igual a 6. Se não reiniciarmos o índice, não conseguiremos
percorrer novamente as cinco posições.
O segundo REPITA percorre o vetor e utiliza o SE para
identificar os aprovados.
Esse exemplo demonstra que podemos utilizar uma mesma
estrutura de repetição em diferentes etapas do algoritmo.
Um algoritmo pode apresentar erros mesmo quando sua estrutura parece correta. Vamos analisar alguns problemas frequentes e entender como evitá-los.
ERRO 1 – Não inicializar o contador ou acumulador.
Código incorreto:
para i de 1 ate 5 faca
se notas[i] >= 6 entao
contador <- contador + 1
fimse
fimpara
Por que está errado?
A variável contador não recebeu um valor inicial.
O resultado pode ser incorreto porque não sabemos
com qual valor a contagem começou.
Correção:
contador <- 0
para i de 1 ate 5 faca
se notas[i] >= 6 entao
contador <- contador + 1
fimse
fimpara
ERRO 2 – Esquecer de avançar o índice no REPITA.
Código incorreto:
i <- 1
repita
leia(notas[i])
ate i > 5
Por que está errado?
A variável i nunca aumenta. O algoritmo continuará
armazenando valores na primeira posição e a condição
i > 5 nunca será verdadeira.
Correção:
i <- 1
repita
leia(notas[i])
i <- i + 1
ate i > 5
ERRO 3 – Ultrapassar o limite do vetor.
Código incorreto:
notas: vetor[1..5] de real
para i de 1 ate 6 faca
leia(notas[i])
fimpara
Por que está errado?
O vetor possui somente cinco posições. Quando i chegar
a 6, estaremos tentando acessar uma posição inexistente.
Correção:
para i de 1 ate 5 faca
leia(notas[i])
fimpara
ERRO 4 – Somar os valores fora da condição.
Código incorreto para somar somente as notas dos aprovados:
se notas[i] >= 6 entao
contador <- contador + 1
fimse
soma <- soma + notas[i]
Por que está errado?
A soma está fora do SE. Portanto, todas as notas serão
acumuladas, inclusive as dos alunos reprovados.
Correção:
se notas[i] >= 6 entao
contador <- contador + 1
soma <- soma + notas[i]
fimse
ERRO 5 – Utilizar a condição errada no ATE.
Código incorreto:
i <- 1
repita
leia(notas[i])
i <- i + 1
ate i < 5
Por que está errado?
No REPITA...ATE, a repetição termina quando a condição
do ATE se torna verdadeira.
Como i começa em 1 e aumenta, a condição i < 5 já será
verdadeira depois da primeira leitura. O algoritmo
terminará antes de preencher o vetor.
Correção:
ate i > 5
Assim, a repetição continuará enquanto ainda houver posições para preencher.
Ao trabalhar com vetores, podemos utilizar diferentes
recursos da lógica de programação.
CONTADOR
Utilizado para contar ocorrências.
contador <- contador + 1
ACUMULADOR
Utilizado para somar valores.
soma <- soma + vetor[i]
SE...FIMSE
Utilizado para verificar condições e tomar decisões.
se vetor[i] >= 6 entao
escreval("Aprovado")
fimse
REPITA...ATE
Utilizado para repetir comandos até que determinada
condição seja verdadeira.
repita
i <- i + 1
ate i > 5
CONCLUSÃO:
Um vetor não serve apenas para guardar informações.
Seu verdadeiro potencial aparece quando utilizamos
estruturas de repetição, decisões, contadores e
acumuladores para processar os dados armazenados.
Aprender a combinar esses recursos é um passo importante
para desenvolver algoritmos capazes de resolver problemas
reais.
Agora é sua vez de desenvolver um algoritmo!
ENUNCIADO:
Uma escola deseja cadastrar as notas de dez alunos
utilizando um vetor.
Desenvolva um algoritmo no VisualG que:
1. Declare um vetor capaz de armazenar dez notas.
2. Utilize REPITA...ATE para preencher todas as posições.
3. Percorra o vetor para identificar os alunos aprovados,
considerando nota maior ou igual a 6.
4. Utilize um contador para informar quantos alunos
foram aprovados.
5. Utilize um acumulador para somar as notas dos alunos
aprovados.
6. Calcule a média das notas dos aprovados.
7. Caso ninguém seja aprovado, apresente uma mensagem
informando que não existem notas para calcular a média.
ATENÇÃO: utilize corretamente o SE...FIMSE,
o contador, o acumulador e o REPITA...ATE.
Não esqueça de inicializar as variáveis e verificar os
limites do vetor.
Objetivo do desafio: demonstrar que você
consegue combinar os conceitos estudados em um único
algoritmo.
Sub-rotinas são blocos de comandos separados dentro de um algoritmo, criados para realizar uma tarefa específica. Elas recebem esse nome porque são partes menores de um algoritmo maior. Existem dois tipos principais de sub-rotinas: procedimentos e funções.
Você pode pensar em uma sub-rotina como uma receita dentro de outra receita. Em vez de repetir os mesmos passos várias vezes, você os coloca uma vez só dentro da sub-rotina e chama quando precisar.
Subprograma é um programa que auxilia o programa principal através da realização de uma determinada subtarefa. Também costuma receber os nomes de sub-rotina, procedimento, função, método ou módulo. Os subprogramas são chamados dentro do corpo do programa principal como se fossem comandos. Após seu término, a execução continua a partir do ponto onde foi chamado. É importante compreender que a chamada de um subprograma simplesmente gera um desvio provisório no fluxo de execução.
Há um caso particular de subprograma que recebe o nome de função. Uma função, além de executar uma determinada tarefa, retorna um valor para quem a chamou, que é o resultado da sua execução. Por este motivo, a chamada de uma função aparece no corpo do programa principal como uma expressão, e não como um comando.
Cada subprograma, além de ter acesso às variáveis do programa que o chamou (são as variáveis globais), pode ter suas próprias variáveis (são as variáveis locais), que existem apenas durante sua chamada.
Ao se chamar um subprograma, também é possível passar-lhe determinadas informações que recebem o nome de parâmetros (são valores que, na linha de chamada, ficam entre os parênteses e que estão separados por vírgulas). A quantidade dos parâmetros, sua seqüência e respectivos tipos não podem mudar: devem estar de acordo com o que foi especificado na sua correspondente declaração.
Para se criar subprogramas, é preciso descrevê-los após a declaração das variáveis e antes do corpo do programa principal. O VisuAlg possibilita declaração e chamada de subprogramas nos moldes da linguagem Pascal, ou seja, procedimentos e funções com passagem de parâmetros por valor ou referência. Isso será explicado a seguir.
1-compr (c : caracter) : Retorna um inteiro contendo o comprimento (quantidade de caracteres) da expressão. Observe que o que está dentro do parênteses é chamado de parâmetro e deve ser do tipo caracter
nome <- "UENF"
escreval(compr(nome))
2-copia (c : caracter ; p, n : inteiro) : Retorna uma string(palavra) contendo uma cópia parcial do parâmetro c; a partir do caracter p, contendo n caracteres. Os caracteres são numerados da esquerda para a direita, começando de 1.
texto<-"Engenharia da UENF"
escreval(copia( texto, 7, 10))
3-maiusc (c : caracter) : Retorna um valor caracter contendo a expressão em maiúsculas.
texto <- "engenharia da uenf"
escreval(maiusc(texto))
4-minusc (c : caracter) : Retorna um valor caracter contendo a expressão em minúsculas
texto <- "UENF"
escreval(minusc(texto))
5-pos (subc, c : caracter) : Retorna um inteiro que indica a posição em que a cadeia subc se encontra em c, ou zero se subc não estiver contida em c.
textooriginal<- "O melhor açaí do Brasil está no ...."
procurado <- "Brasil"
escreval(pos(procurado,textooriginal))
6-int (Int( expressão) - Retorna a parte inteira do valor representado por expressão
algumnumero <- 6.7944
escreva(int(algumnumero)
Esse comando possui um bug em algumas versões do software :
Algoritmo "Caso"
Var
t:caracter
Inicio
leia(t)
t<-maiusc(t)
escolha t
caso "Pix"
escreva("Você fez pix")
caso "Din"
escreva("Você pagou em din")
outrocaso
escreva("forma de pagamento inválido")
fimescolha
Fimalgoritmo
O VisuAlg implementa (com certas variações) o comando case do Pascal. A sintaxe é a seguinte:
escolha < expressao de selação >
caso < valor1 > , < valor2>, < valor3 >
< sequencia de comandos que deseja executar >
caso < valor3 > , < valor4>, < valor5 >
< sequencia de comandos que deseja executar >
outrocaso
fimescolha