Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila de Algoritmos e Estruturas de Dados
Apostila de Algoritmos e Estruturas de Dados
ALGORITMOS E
ESTRUTURAS DE DADOS I
Lavras/MG
2011
2 CONSTRUÇÃO DE ALGORITMOS......................................................................................................... 14
6.4 Indentação.................................................................................................................................. 46
7 COMANDOS DE REPETIÇÃO................................................................................................................ 59
12 VETORES ......................................................................................................................................... 95
16 RECURSIVIDADE............................................................................................................................ 141
1 INTRODUÇÃO AO CURSO
O conteúdo de Algoritmo e Estrutura de Dados – AED é ensinado em cursos técnicos e
universitários como Ciência da Computação, Sistemas de Informação, Engenharias (de Software,
Elétrica, Civil, Mecânica, Mecatrônica,...), Programação, Analista de Sistemas, Informática,
dentre outros. A profundidade e abrangência do conteúdo dependem do foco de cada curso.
Geralmente, o conteúdo de AED divide-se em disciplinas denominadas AED I, AED II e
AED III nos cursos relacionados à computação. O aprendizado é acumulativo, sendo impossível
aprender AED II ou AED III sem aprender AED I, ou aprender AED III sem aprender AED I e
AED II.
O ensino das disciplinas de AED desenvolve o raciocínio lógico dos alunos, capacitando-os
para programação de computadores.
A seguir, o termo Algoritmo e o termo Estrutura de Dados são explicados separadamente,
facilitando a compreensão de seus significados.
1.1 Algoritmo
A primeira palavra relacionada a Algoritmo, algorism, foi criada no século 9 pelo
matemático persa islão Abu Abdullah Muhammad ibn Musa Al-Khwarizmi. Inicialmente, o termo
foi criado para nomear regras que ensinavam como realizar cálculos usando números hindu-
arábicos. No século 18, o termo foi traduzido para o Latin Europeu como Algorithm, e seu
significado passou a abranger todo procedimento definido (claro, preciso) para resolver
problemas e executar tarefas.
Veja a seguir algoritmo de Erastótenes para encontrar números primos de 2 até N e sua
execução.
Passo 1) N = 30;
Passo 2) Raiz (30) = 5,477. Para guardar parte inteira então raiz = 5;
Passo 4.1) para i=2, riscar todos os seus múltiplos de i²(=4) até N se não estiver riscado
02 03 04 05 06 07 08 09 10 11 12 13 14 15
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
Passo 4.1) i=3, riscar todos os seus múltiplos de i² (=9)até N se não estiver riscado
02 03 04 05 06 07 08 09 10 11 12 13 14 15
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
Passo 4.1) i=4, riscar todos os seus múltiplos de i²(=16) até N se não estiver riscado
02 03 04 05 06 07 08 09 10 11 12 13 14 15
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
Passo 4.1) i=5, riscar todos os seus múltiplos de i² (=25) até N se não estiver riscado
02 03 04 05 06 07 08 09 10 11 12 13 14 15
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
Os números primos de 2 a 30 são: 02, 03, 05, 07, 11, 13, 17, 19, 23 e 29.
alguém deseja encontrar os números primos em um intervalo de 2 até N, deve aplicar o algoritmo
de Erastótenes.
Em computação dizemos que instrução é uma informação que indica uma ação a ser
executada, por exemplo, por um computador. Deve-se considerar que uma instrução executada
em separado, pode não ter sentido. Para obtermos o resultado desejado precisamos executar um
conjunto de instruções na ordem correta.
Exemplificando...
Para fazer um bolo é preciso executar uma sequencia de instruções, como: separar os
utensílios e ingredientes a serem utilizados, pré-aquecer o forno e medir os ingredientes, untar a
forma, bater os ovos etc.
Entretanto estas instruções devem ser executadas em uma ordem adequada – não se deve
colocar o fermento após o bolo assado.
Exemplificando...
Na Figura 3, observa-se um formulário que deve ser preenchido para renovação ou
assinatura nova de uma revista. Nele, observa-se a necessidade de preencher campos como:
O usuário sabe que não pode colocar o valor em uma data, nem uma data em um campo de
nome, por exemplo. E que as informações devem ser preenchidas de acordo com o tamanho do
campo. Isto é uma estrutura de dados, onde se tem um conjunto de dados com tamanho e tipo de
dado para cada campo bem definidos.
Cliente {
nome [30]: literal; //
salario: real;
idade: inteiro;
}
Figura 4 – Estrutura de dados Cliente
Cliente {
nome [50]: literal;
telefone: literal;
sexo: caractere;
credito: real;
}
Figura 5 – Variação de uma Estrutura de dados Cliente
- Estrutura de dados define um conjunto de dados, seu tamanho e tipo de dado para cada
campo;
Após construir o(s) algoritmo(s) e definir a(s) estrutura(s) de dados, o profissional está apto
para programar o sistema que será entregue ao cliente.
algoritmo, pois seu raciocínio já está treinado para observar o problema, desenvolver o algoritmo
mentalmente e programá-lo no computador.
Ressalta-se que se o profissional não souber resolver o problema manualmente, ele não
conseguirá desenvolver o algoritmo, pois não será capaz de definir os passos que descrevem a
solução. Quando o profissional se encontrar nesta situação, caso comum, ele deve estudar e
aprender a desenvolver a solução manualmente para depois descreva o algoritmo. Quando estiver
desenvolvendo um sistema para uma empresa, ele deve procurar as pessoas que realizam aquela
atividade manualmente, a fim de aprender e passar o conhecimento daquelas pessoas para a
forma de algoritmo e programá-lo.
2 CONSTRUÇÃO DE ALGORITMOS
Para começar a construir algoritmos, deve-se primeiro aprender as notações mais utilizadas
para descrevê-los e conhecer as fases para seu desenvolvimento.
Exemplificando...
Algoritmo para fritar um ovo:
Passo 1 – Pegar a frigideira e colocar óleo;
Passo 2 – Levar a frigideira ao fogo;
Passo 3 – Pegar o ovo, quebrá-lo e colocar seu conteúdo na frigideira;
Passo 4 – Esperar a clara ficar branca e virar o ovo; e
Passo 5 – Se preferir, você pode estourar a gema para deixá-la firme.
Figura 6 - Exemplo de algoritmo usando Descrição Narrativa
O conjunto de símbolos descritos a seguir é utilizado para representar uma seqüência lógica
(algoritmo) denominada Fluxograma.
Tabela 3 – Simbologia utilizada em Fluxogramas
Exemplificando...
Exemplificando...
Algoritmo media;
Declare N1,N2 : inteiro;
media : real;
Inicio
Leia (N1);
Leia (N2);
media (N1+N2) / 2;
SE (media >= 60) ENTÃO
Escreva (“Aluno aprovado com média: ”, media);
SENÃO
Escreva (“Aluno reprovado com média: ”, media);
FIMSE;
Fim.
Figura 9 - Algoritmo Média em Pseudocódigo
Exemplificando...
# Algoritmo x y z Saída
1. algoritmo soma;
2. Declare x, y, z : inteiro;
3. Inicio
4. Leia(x); 8
5. Leia(y); 7
6. z x + y; 15
7. Escreva(z); 15
8. Fim.
Figura 10 – Execução de Teste de Mesa do Algoritmo Soma
Cria-se uma tabela sendo que: na primeira coluna insere-se o programa, na segunda coluna
até a penúltima inserem-se os dados de entrada (x e y) e processamento (z), e na última coluna os
dados de saída. Após montar a tabela, basta leia cada uma das linhas do programa e fazer o que
se pede.
A primeira linha apenas determina o nome do programa (soma). A segunda linha determina
os dados de entrada e processamento. A terceira linha informa onde o corpo principal do
algoritmo começa. Na quarta linha, o comando leia(x) implica em se determinar o valor de x que,
neste caso, foi atribuído o valor 8. Na quinta linha, o comando leia(y) implica em se determinar o
valor de y que, neste caso, foi atribuído o valor 7. Na sexta linha, o comando z x + y implica
em somar os dois números e guardar o resultado em z. O valor guardado foi 15. Na sétima linha,
o comando ESCREVA determina que o valor z deve ser escrito na tela do computador. E a
última linha encerra o algoritmo.
2ª Fase) Definição das Entradas: Identificar os dados que devem ser solicitados e lidos
pelo computador para a resolução do problema;
3ª Fase) Definição do Processamento: Definir quais operações devem ser realizadas nos
dados de entrada, gerando os dados de saída;
4ª Fase) Definição das Saídas: Identificar quais dados o usuário espera receber do
computador após ter fornecido os dados de entrada;
6ª Fase) Teste do algoritmo: Executar o algoritmo passo a passo, aplicando, por exemplo, o
teste de mesa.
Exemplificando...
Problema: Calcule e mostre a média aritmética simples das notas de um aluno, sabendo que foram
realizadas 4 provas P1, P2, P3 e P4.
1ª Fase – Compreensão do Problema: Devo obter as 4 notas do aluno, somá-las e dividir a soma por 4.
O resultado é a média. Logo, eu conheço a solução do problema e se é possível resolve-lo manualmente,
então deve-se buscar um algoritmo para ele.
2ª Fase – Definição das Entradas: Os dados de entrada são P1, P2, P3 e P4.
3ª Fase – Definição do Processamento: O procedimento será somar os 4 dados de entrada (P1, P2, P3,
P4) e dividir seu resultado por 4.
Algoritmo em Pseudocódigo
Algoritmo media;
Declare P1, P2, P3, P4, media: real;
Inicio
Leia(P1);
Leia(P2);
Leia(P3);
Leia(P4);
Media (P1+ P2+P3+ P4) / 4;
Escreva(“Média: ”, media);
Fim.
3 ALGORITMOS EM PSEUDOCÓDIGO
3.1 Estrutura Básica de um Algoritmo
Um algoritmo possui a estrutura básica representada a seguir. As representações indicadas
pela notação < > implicam que devem ser substituídas e o programador deve determinar o valor.
As representações indicadas pela notação [ ] implicam em estrutura facultativa, podendo-se fazer
um algoritmo sem utilizá-la.
Utiliza-se duas barras “//” para comentar uma linha. Para comentar um bloco que possua
mais de uma linha, utiliza-se barra e asterisco “/*” para abrir o comentário de bloco e asterisco e
barra “*/” para fechar o comentário de bloco.
O detalhamento para se construir o algoritmo e quais comandos podem ser usados consiste
no objetivo do restante deste livro.
4.1 Variáveis
Declara-se uma variável para determinar seu nome (salário, data, idade, nome, ...) e o tipo
de dado (número inteiro, número real, um caractere, texto, ...) a ser fornecido pelo usuário ou
calculado pelo algoritmo.
Algoritmo teste;
Declare idade : inteiro;
salario : real;
INICIO
<comandos>;
FIM.
Figura 13 - Exemplo de declarações de variáveis
Uma variável está associada a uma posição de memória, e seu conteúdo pode ser alterado
durante a execução de um programa. Embora uma variável possa assumir diferentes valores, ela
só pode armazenar um valor por vez.
Valor da variável
Algoritmo teste2;
Declare salario, comissao: real;
Nome da variável
Início
salario 1200,00;
Escreva (“Entre com valor da comissão: “); Alterando o valor
Leia (comissao); da variável
salario salario + comissao;
Escreva (“O salário atual é:”, salario);
Fim;
Figura 14 - Exemplo Alteração de valor de variável
1 2 3 4 5 6 7
1 700,00
2 comissao
3 1900,00
4
salario
Em um formulário, não se deve escreva uma data em um campo que se pede um valor
monetário. Não se deve escreva um número no campo que pede o nome da pessoa. Não se deve
escreva um valor monetário onde pede-se uma idade. Isto gera erro no preenchimento de
formulários porque o tipo de dado esperado possui um formato e o usuário escreve outro.
No computador não é diferente. Deve-se definir o tipo de dado para cada um dos campos.
O computador acusará erro, por exemplo, se você tentar escreva 12/03/2017 em uma idade.
Idade não aceita barras e é composto por apenas um número inteiro, ao contrário da data que
possui 2 números inteiros. O contrário também gera erro, pois um número inteiro não satisfaz a
necessidade de 3 números inteiros.
Podem-se fazer operações com os tipos de dados. Os números podem ser somados,
subtraídos dentre outras operações aritméticas. Literais podem ter parte de seus caracteres
retirados, outros inseridos etc.
4.2 Constantes
Denomina-se como constante dados que não se modificam no decorrer do algoritmo, por
isto o nome de constante.
Exemplos clássicos de constantes são número Pi, número de Euler (e), aceleração da
gravidade, dentre outros. Qualquer dado que possua um valor que não varie deve ser declarado
como uma constante. A declaração das constantes Pi e „e‟ (número de Euler) é exemplificado no
algoritmo a seguir.
valor da constante
Algoritmo teste;
Const pi = 3,1415;
e = 2,71828;
Declare idade : inteiro;
nome da constante
salario : real;
Início
<comandos>;
Fim.
Figura 16 - Exemplo de declarações de constantes
2) Deseja-se armazenar nota, nome, número da matrícula, sexo, data de nascimento, valor da
mensalidade de um aluno e se ele é bolsista. Declare as variáveis em portugol.
3) Assinale com C os nomes CORRETOS para algoritmos, variáveis e constantes e com I os
INCORRETOS. Explique o que está errado nos incorretos.
( ) 34 - 23 ( ) km/h ( ) 3notas
( ) nome aluno ( ) “nota” ( ) nota_bimestral
( ) _d20 ( ) cia3a3 ( ) e-mail
( ) Minimo ( ) xyz ( ) estado_civil( )
( ) aula_03 ( ) Data_Nascimento ( ) comissao%
( ) SALARIO ( ) achou! ( ) nota_bimestral
( ) nota*final ( )A+B ( ) 360hs
5 COMANDOS SEQUENCIAIS
Os comandos sequenciais são as estruturas mais simples utilizadas na construção de
algoritmos e subdividem-se em comandos de entrada, saída e atribuição.
Ela é formada por um conjunto de instruções (ou comandos) que executadas em uma
seqüência linear de cima para baixo e da esquerda para a direita, ou seja, da mesma forma como
foram escritas.
Exemplificando...
...
leia (raio); // O valor digitado pelo usuário será armazenado na variável raio.
...
leia (nome); // Os caracteres digitados pelo usuário serão armazenados na variável nome.
...
Exemplificando...
Escreva (“O aluno “, nome, “está aprovado”); /*Mostra a mensagem “O aluno “, logo depois o valor
armazenado na variável nome e em seguida o restante da mensagem “está aprovado” */
Exemplificando...
x “José”;
y 2.5;
y y + 1;
teste falso;
media (N1 + N2 + N3 + N4) / 4;
raio 2;
area PI * (raio * raio);
perimetro 3* PI * raio;
Exemplificando...
Algoritmo Comandos_Sequenciais;
Declare
X, Y : inteiro;
A, B : real;
nome : literal;
INÍCIO
Escreva (“Entre com o valor de X: ”) ;
Leia (X);
Escreva (“Entre com o valor de A: ”);
Leia (A);
Escreva (“Entre com o seu nome: ”);
Leia (nome);
Y X * 3;
B (A * 2,4) / 3;
Escreva (nome “, os valores de X e A agora valem: “,Y, B);
FIM.
Figura 17 – Exemplo de Comandos Sequenciais
Observe que todos os comandos entre INÍCIO e FIM estão com a margem mais a direita,
para facilitar a visualização. Isto se chama indentação e será explicada em mais detalhes em
outra seção. O mesmo pode ser observado com 3 linhas de declaração de variáveis, cuja margem
foi empurrada para a direita, sendo um subnível de Declare.
3) O computador trabalha com dados numéricos sem conhecer a unidade de medida ou o dado
representado. Assim, quando você digita 30 no teclado, o computador não sabe se 30 é a idade (anos),
a temperatura (C,F, K), a dimensão (mm, cm, m, km,...), pressão etc. Se você pedir para ele subtrair a
idade da pressão, ele o fará, pois para ele tudo é número. Cabe ao programador gerenciar e fazer
corretamente as contas, ficando atento as unidades de medida.
+ Adição
- Subtração
* Multiplicação
/ Divisão
* * ou ^ Exponenciação
1º ( ) parênteses
2º Exponenciação
3º Multiplicação ou divisão (o que vier primeiro)
4º Adição ou subtração (o que vier primeiro)
Exemplificando...
Entretanto, cada linguagem possui suas próprias funções pré-definidas e como veremos
adiante no tópico 15.2 o programador pode criar funções conforme necessidade.
Tabela 8 – Funções pré-definidas
Exemplificando...
A ABS (-4); // A 4
A TRUNC (2,78); // A 2
A INT (4,15); // A 4
A INT (-4,15); // A - 4
A FRAC (3.65); ;// A 0.65
A FRAC (-3.65); // A - 0.65
A SQRT(9); // A 3;
A ROUND (2.78); // A 3
A ROUND (-1,4); // A -1
A SQR(2); // A 4;
A 7 MOD 2 ; // A 1;
A 6 MOD 2 ; // A 0;
A 7 DIV 2; // A 3,5;
A 18 DIV 3; // A 6;
A CONCAT(“abc”, “def”) ; // A abcdef;
A CONCAT(“ana”, “rubelia”) ; // A anarubelia;
Exercícios Resolvidos:
1) Elabore um algoritmo para calcular o perímetro de um círculo dado o seu raio, considerando
que Perímetro = 2 * π * Raio.
Algoritmo perimetro_circulo;
Const pi = 3,1415;
Declare peri, raio : real;
INÍCIO
Escreva (“Programa para calcular o perímetro de um círculo dado seu raio”);
Escreva (“Entre com o valor do raio: ”);
Leia (raio);
peri 2 * pi * raio;
Escreva (“O perímetro do círculo segundo o raio “, raio, “informado é: ”, peri);
FIM.
Figura 18 – Algoritmo para calcular o perímetro de um círculo
2) Elabore um algoritmo para calcular consumo médio de um veículo, conhecidos a distância
total e a quantidade de combustível consumido para percorrer tal distância.
Algoritmo calc_consumo;
Declare consumo, distancia, qde_comb: real;
INÍCIO
Escreva (“Programa para calcular o consumo médio de combustível”);
Escreva (“Informe a distancia em Km percorrida pelo veiculo: ”);
Leia (distancia);
Escreva (“Informe a quantidade em litros de combustível gasto: ”);
Leia (qde_comb);
consumo qde_comb/ distancia;
Escreva (“O consumo médio de combustível para a distância de”, distancia, “km foi
de:” , consumo, “litros/km.”);
Escreva (“O carro fez ”, distancia/qde_comb, “ km por litro!”);
FIM.
Figura 19 – Algoritmo para calcular o consumo de combustível
3) Elabore um algoritmo para leia uma quantidade de chuva dada em polegadas e apresente o
equivalente em milímetros, considerando que 1 polegada = 25,4 milímetros (mm).
Algoritmo chuva_em_mm;
Declare pol, mm: real;
INÍCIO
Escreva (“Programa para converter um volume de chuva de polegadas para milímetros.”);
Escreva (“Informe a quantidade de chuva em polegadas: ”);
Leia (pol);
mmpol * 25,4;
Escreva (“volume de chuva em milímetros é: “, mm, “mm”);
FIM.
Figura 20 – Algoritmo para calcular o consumo de combustível
4) Elabore um algoritmo para calcular o estoque médio de uma peça, considerando que
EstoqueMedio = (QuantidadeMínima + QuantidadeMáxima) /2. Faça um Teste de Mesa
com dados definidos por você.
5) Elabore um algoritmo para leia uma temperatura em graus Fahrenheit, calcule e exiba a
temperatura convertida em graus Centígrados, considerando que C = (F - 32) * ( 5 / 9 ).
6) Elabore um algoritmo que leia o salário base de um funcionário, o número de horas extras
feitas, o valor de cada hora extra e o auxilio refeição. Imprima na tela o valor do salário
bruto (sem descontos). Na sequencia calcule o desconto do INSS de 10% sobre o salário
bruto e mostre o total a receber.
7) Elabore um algoritmo que leia três números e apresente o resultado da soma das
combinações destes números.
8) Elabore um algoritmo para leia uma temperatura em graus Celsius, calcule e exiba a
temperatura convertida em graus Kelvin, considerando que K = C + 273.
9) Elabore um algoritmo que dada a cotação do dólar e um valor em dólares, converta este
valor em Real e mostre o resultado.
10) Elabore um algoritmo que leia valores para X e Y respectivamente e calcule:
a) O resto da divisão de X / 3
3
b) X – 4
2
c) (X * Y)
Y
d) X + 2
e) Raiz quadrada de Y
6 COMANDOS CONDICIONAIS
Os comandos condicionais (decisão ou desvio) permitem a escolha de uma instrução ou
grupo de instruções a ser executado quando determinada condição é ou não satisfeita como
exemplificado na figura a seguir.
não
...
se (tiver dinheiro suficiente) então
almoçarei em um bom restaurante;
senão
comerei um lanche;
fim-se;
...
Figura 22 – Exemplo de Comando Condicional SE ENTÃO SENÃO
- Se salário for maior que 2400 reais então desconte 15% do imposto de renda na fonte;
- Se salário menor que 3 salários mínimos então salário família por dependente será 30
reais, senão 10 reais.
- Se comprador é de Minas Gerais então aplique 18% ICMS, senão aplique 12% de ICMS.
= Igual a
<> ou # Diferente de
> Maior que
< Menor que
>= Maior ou igual a
<= Menor ou igual a
Exemplificando...
Tabela 10 – Operadores Relacionais aplicados ao tipo INTEIRO
a) (X >= 2)
b) (X < 1) E (B >=D)
c) (A + B) > 10 OU (A + B) = (C + D)
d) (A >= C) E (D >= C)
e) NÃO (X > 3)
f) (X < 1) E NÃO (B > D)
g) NÃO (D < 0) E (C > 5)
h) NÃO (X > 3) OU (C < 7)
i) (A > B) OU (C > B)
Exemplificando...
Faça um algoritmo que leia a média de um aluno e escreva na tela “Aluno Aprovado” caso
a média dele seja igual ou superior a 6.
...
SE (media>=6) ENTÃO
escreva (“Aluno Aprovado”);
FIMSE;
...
Figura 24 – Exemplo de Algoritmo usando Comando Condicional Simples
...
SE (condição) ENTÃO
comando 1;
comando 2;
SENÃO
comando 3;
comando 4;
FIMSE;
...
Figura 25 – Sintaxe do Comando Condicional Composto
Exemplificando...
Faça um algoritmo que leia a média de um aluno e escreva na tela se ele foi aprovado ou
reprovado.
...
SE (media>=6) ENTÃO
escreva (“Aluno Aprovado”);
SENÃO
escreva (“Aluno Reprovado”);
FIMSE;
...
Figura 26 – Exemplo de Algoritmo usando Comando Condicional Composto
...
SE (media >= 6) E ( frequencia > 75% )
ENTÃO
escreva (“Aluno Aprovado”)
SENÃO
escreva (“Aluno Reprovado”);
FIMSE;
...
Figura 27 – Exemplo de Algoritmo usando Comando Condicional Simples
...
SE (NÃO tiver dinheiro) ENTÃO
almoçarei em casa;
SENÃO
irei a um restaurante;
FIMSE;
...
Figura 28 – Exemplo de Comando Condicional SE ENTÃO SENÃO, usando operador NÃO
...
SE (tiver dinheiro suficiente) OU (terminado o trabalho)
ENTÃO
irei ao cinema;
SENÃO
ficarei em casa;
FIMSE;
...
Figura 29 – Exemplo de Comando Condicional SE ENTÃO SENÃO, usando operador OU
Exercícios Resolvidos:
1) Elabore um algoritmo para calcular as raízes de uma equação de segundo grau, dados os
fatores a, b e c, Considerando , se d menor que zero as raízes não podem ser
calculadas (não existem raízes reais). Senão, é possível calcular as duas raízes.
...
leia (a);
leia (b);
leia (c);
d b * b – 4 * a * c;
SE (d < 0) ENTÃO
Escreva (“Não existem raízes reais”);
SENÃO
raiz1 ( -b + SQRT(d) ) / (2 * a );
raiz2 ( -b – SQRT(d) ) / (2 * a );
Escreva ( raiz1 );
Escreva ( raiz2 );
FIMSE;
...
2) Faça um algoritmo que receba um número inteiro e verifique se esse número é par ou
ímpar.
algoritmo par_impar;
declare num, r : inteiro;
INICIO
escreva (“Este algoritmo verifica se um número é par ou ímpar.”);
escreva (“Digite um número inteiro: ”);
leia (num);
r num MOD 2;
SE (r = 0) ENTÃO
escreva(“Este número é par”);
SENÃO
escreva(“Este número é ímpar”);
FIMSE;
FIM.
6.4 Indentação
Indentação (palavra adaptada do inglês, indentation) é uma técnica de recuo que aplicada
ao código de um programa facilita a visualização da organização dos comandos e sua estrutura.
Seu uso iniciou-se antes da programação com o nome de “tabulação de texto”, sendo utilizada
rotineiramente na escrita de livros, panfletos, cartazes etc.
Exemplificando...
Na Figura 30, nota-se que a margem do primeiro parágrafo não é seguida em todo texto. Há
dois níveis de indentação, além do alinhamento natural da margem esquerda do primeiro
parágrafo. O primeiro nível refere-se às palavras PAI, MÃE E FILHOS, o qual foi empurrado
para a direita, não seguindo o alinhamento original da margem esquerda. O segundo nível,
empurrado mais para a direita do primeiro nível, refere-se aos comprovantes médicos a serem
entregues pela MÃE. Observa-se que as palavras “Papa Nicolau” e “Mamografia” estão em um
alinhamento mais interno da folha. A indentação auxiliando no entendimento de quais
documentos devem ser entregues por cada um dos participantes segundo seu papel na família
(pai, mãe ou filho).
Um texto pode ter vários níveis de indentação e deve-se garantir uniformidade da margem
para os textos de mesmo nível. Portanto, os textos selecionados para compor o segundo nível de
indentação devem seguir o mesmo alinhamento de margem, sendo proibida variação de margem
para o mesmo nível.
Quando se deseja criar um novo nível de indentação, basta empurrar um pouco mais a
margem para a direita. Na prática, a técnica de indentação permite associar visualmente
informações específicas as informações genéricas.
Exemplificando...
Faça um algoritmo que leia um número e responda se ele é maior que 10.
Algoritmo Maior10;
declare x: inteiro; As 3 linhas de comando do
INÍCIO
ENTÃO foram indentadas para
Escreva (“Digite um número: ”);
facilitar a visualização. E o
Leia (x);
mesmo foi feito para o SENÃO.
SE (x>10) ENTÃO
escreva (x, “ é maior que 10”);
escreva (“Os comandos da indentação do ENTÃO foram executados”);
escreva(“A indentação facilita visualizar quais comandos estão dentro do ENTÃO”);
SENÃO
escreva (x, “ é menor que 10”);
escreva (“Os comandos da indentação do SENÃO foram executados”);
escreva(“A indentação facilita visualizar quais comandos estão dentro do SENÃO”);
FIMSE;
FIM.
Figura 31 – Exemplo de Indentação
Adote o hábito de utilizar a técnica de indentação mesmo que ela pareça difícil no início.
Após dominar seu uso, o programador observará que sua utilização facilita o trabalho, aumenta a
produtividade, facilita o entendimento do código, além de ser exigido nas empresas.
Exemplificando...
Faça um algoritmo que leia dois números inteiros e responda qual deles é o maior ou se
eles são iguais.
Algoritmo Maior;
declare x, y: inteiro;
INÍCIO
escreva (“Este algoritmo apresenta qual de 2 números inteiros, lidos do teclado, é o maior.”);
escreva (“Digite o primeiro número: ”);
leia (x);
escreva (“Digite o segundo número: ”);
leia (y);
Comando SE...ENTÃO...SENÃO dentro
SE (x>y) ENTÃO de outro comando SE...ENTÃO...SENÃO
escreva (x,“ é maior que “, y); denomina-se aninhamento.
SENÃO
SE (x<y) então
escreva (y,“ é maior que “, x);
SENÃO
escreva (x,“ é igual a “, y);
FIMSE;
FIMSE;
FIM.
Figura 32 – Exemplo de Aninhamento de Comandos SE...ENTÃO...SENÃO, Algoritmo Maior
O aninhamento pode ocorrer apenas com SE...ENTÃO e dentro dele outro SE...ENTÃO.
Outra forma seria ter um comando SE...ENTÃO dentro de um bloco SENÃO, bem como
outras variações. Havendo um comando dentro do outros, afirma-se ter aninhamento.
Exercícios Resolvidos:
1) Faça um algoritmo que leia a média final e frequencia de um aluno e imprima na tela se o
aluno está REPROVADO POR FREQUENCIA, APROVADO, RECUPERAÇÃO ou
REPROVADO POR NOTA, sabendo que:
Aluno precisa ter 75% ou mais de frequencia nas aulas, caso contrário ele está
reprovado por falta, independente da nota.
Aluno está de recuperação se a média for maior ou igual a 30 e menor que 60.
Aluno está reprovado por nota se a média for menor que 30 pontos.
Algoritmo Aprovacao_Aluno;
Declare media, frequencia: real;
INÍCIO
leia(frequencia);
leia (media);
2) Faça um algoritmo para leia três números inteiros X, Y e Z e verificar se eles formam um
triângulo, imprimindo na tela "X, Y e Z não formam um triângulo" ou "X, Y e Z formam um
triângulo". Se as medidas formarem um triângulo, imprimir na tela se o triângulo é
equilátero, isósceles ou escaleno.
Algoritmo triangulo;
Declare
x, y, z: inteiro;
INICIO
leia ( x, y, z );
FIM.
A Figura 35 representa que <variável> assumirá um valor e caso o valor seja igual ao valor
em opção1, então os comandos1 serão executados. Caso contrário, <variável> será comparada
com o valor em opção2 e, no caso de ser igual, executará comandos2, senão comparará com as
demais opções existentes. Se uma opção for satisfeita, então os comandos referente aquela opção
é executada e todas as demais opções são ignoradas.
ESCOLHA <variável>
CASO 1: < comandos >;
CASO 2: < comandos >;
CASO 3: < comandos >;
...
CASO n: < comandos >;
CASO CONTRÁRIO: < comandos >;
FIMESCOLHA;
Figura 36 – Sintaxe do Comando Condicional ESCOLHA CASO
...
leia (cargo);
SE (cargo=1) ENTÃO
escreva("Presidente")
SENÃO
SE (cargo=5) ENTÃO
escreva("Chefe de Seção")
SENÃO
SE (cargo=8) ENTÃO
escreva("Auxiliar de Serviços Gerais")
SENÃO
escreva("Esta operação não permite cargos diferentes de 1, 5 e 8");
FIMSE;
FIMSE;
FIMSE;
...
Figura 37 – Algoritmo Aplicando o Comando SE...ENTÃO...SENÃO
Observa-se na Figura 37 um trecho de algoritmo que solicita leia um valor para cargo. Se o
usuário digitar o valor 1, então aparecerá na tela "Presidente". Se o usuário digitar o valor 5,
então aparecerá na tela "Chefe de Seção". Se o usuário digitar o valor 8, então aparecerá na tela
"Auxiliar de Serviços Gerais". Se o usuário digitar um valor diferente de 1, 5 ou 8, então
aparecerá na tela "Esta operação não permite cargos diferentes de 1, 5 e 8".
...
leia (cargo);
ESCOLHA (cargo)
CASO 1: escreva("Presidente");
CASO 5: escreva("Chefe de Seção");
CASO 8: escreva("Auxiliar de Serviços Gerais");
CASOCONTRARIO escreva("Esta operação não permite cargos diferentes de 1, 5 e 8");
FIMESCOLHA;
...
Figura 38 – Algoritmo Aplicando o Comando ESCOLHA...CASO
Notação Descrição
Caso 1: Verifica se o valor é 1
Caso 3..6: Verifica se o valor é um número entre 3 e 6. Logo, o valor pode ser 3,4,5 ou 6.
Verifica se o valor é um dos valores contidos na lista 2, 7, 9, 21. Portanto, o valor
Caso 2, 7, 21:
pode ser 2 ou 7 ou 21.
...
Leia (opcao);
ESCOLHA (opção)
CASO 1: < comandos >;
CASO 2, 4: < comandos >;
CASO 3: < comandos >;
CASO 5 ..10: < comandos >;
CASO CONTRÁRIO: < comandos >;
FIMESCOLHA;
...
Figura 39 – Sintaxe do Comando Condicional ESCOLHA CASO – Outra sintaxe 2
Exemplificando...
No algoritmo a seguir o valor da variável mês é lido e testado. Caso o valor esteja entre os
valores entre 1 a 12 é executado o comando correspondente a opção. Caso contrário é executado
o comando que escreve mês inválido.
algoritmo descubra_mes;
declare mes : inteiro;
INICIO
escreva (“Digite o número do mês: “);
leia (mes);
ESCOLHA (mes)
CASO 1: escreva (“Janeiro“);
CASO 2: escreva (“Fevereiro“);
CASO 3: escreva (“Março“);
...
CASO 12: escreva (“Dezembro“);
CASO CONTRÁRIO: escreva (“Mês inválido!“);
FIMESCOLHA;
FIM.
Figura 40 – Exemplo de Algoritmo usando Escolha Caso
Exemplificando...
algoritmo faixa_etária;
declare idade : inteiro;
INICIO
escreva (“Digite a idade em anos: “);
leia (idade);
ESCOLHA (idade)
CASO 0..2: escreva (“Bebê“);
CASO 3..9: escreva (“Criança“);
CASO 10..19: escreva (“Adolescente”);
CASO 20..30: escreva (“Jovem“);
CASO 31..60: escreva (“Adulto“);
CASO CONTRÁRIO: escreva (“Idoso“);
FIMESCOLHA;
FIM.
Figura 41 – Exemplo de Algoritmo usando Escolha Caso
(X <> Y) OU (Y < Z)
b) X13; Y 2; Z5;
NÃO (X > Y)
c) X 4; Y 7; Z9;
(X < Y) E (Y > Z)
d) X 6; Y 4; Z4;
(X >= Y) OU (Y = Z)
e) X „a‟; Y „k‟; Z‟D‟;
NÃO (X <= Y)
f) X “Rosana”; Y “Roseane”; Z”Rosária”;
6) Elabore um algoritmo que leia um número inteiro e mostre uma mensagem indicando se este
número é par ou ímpar, e se é positivo ou negativo.
7) Um banco concederá um crédito especial a seus clientes dependendo de seu saldo médio. 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 a seguir. Mostre uma mensagem informando o saldo médio e o valor do crédito. (use
o comando ESCOLHA...CASO)
7 COMANDOS DE REPETIÇÃO
Para compreender a necessidade de comandos de repetição, é necessário examinar algumas
solicitações que um cliente pode fazer.
Nota-se que para fazer o algoritmo o comando escreva deve ser repetido várias vezes tendo
pequena alteração. Como a tabuada solicitada compreendia os valores entre os números 0 a 9
então o trabalho foi repetitivo, mas não tão grande.
Outro pedido poderia ser a solicitação do somatório de 1 até 1milhão. Pense em como seria
a solução para o somatório de 1 até 10, depois imagine ter que fazer o somatório até 10 milhões.
Invista um tempo para compreender a solução e o trabalho repetitivo imposto por esta
solicitação.
Nestes dois últimos exemplos, do seno e do somatório, muitas linhas de código seriam
escritas, em um trabalho puramente repetitivo, mas você chegaria a uma solução.
Entretanto, os clientes não gostam de soluções fixas como somatório e 1 a 1milhão, ele
preferiria digitar o primeiro e último números, esperando a resposta do somatório. Ou então,
digitar os valores iniciais e finais para o cálculo do seno.
Para soluções que exigem trabalho repetitivo, devem-se usar comandos de repetição.
O teste de condição do comando PARA fica no início de sua estrutura. Assim, o bloco de
comandos é repetido até atingir o número de repetições explicitadas. Quando a condição não for
mais satisfeita, a execução saltará os comandos que deveriam ser repetidos, deixando de executá-
los, e continuando a execução normal do algoritmo. Se a condição não for satisfeita logo na
primeira comparação, nenhuma instrução dentro da estrutura PARA será executada.
Na Figura 45, a variável i recebe um valor inicial, um valor final e um valor para
incrementar a variável i a cada repetição realizada. Se o incremento for 1, então a cada repetição
a variável i será acrescida automaticamente de 1. Se o incremento for 3, então a cada repetição a
variável i é incrementada de 3 automaticamente.
...
Declare contador: inteiro;
Contador
...
utilizado no
PARA contador DE <valor inicial> ATÉ <valor final> FAÇA
comando
<instruções>;
PARA...FAÇA
FIM -PARA;
...
Figura 46 – Pseudocódigo do Comando de Repetição PARA
No exemplo apresentado na Figura 47, foi declarada uma variável denominada CONT para
ser o contador utilizado no comando PARA...FAÇA. Observa-se que no comando
PARA...FAÇA que CONT inicia seu valor em 1, devendo ir até o valor 10. O incremento padrão
para CONT é 1, isto é, CONT começará seu valor em 1, e variará de 1 em 1, até atingir 10.
...
declare cont: inteiro;
...
PARA cont DE 1 ATÉ 10 FAÇA
escreva ( “o valor do contador é: ”, cont );
FIMPARA;
Escreva (“ Saiu das repetições do PARA...FAÇA”);
...
Figura 47 – Exemplo Do PARA...FAÇA Sem A Cláusula PASSO
Executando o algoritmo da Figura 47, cont inicia-se com o valor 1, em seguida o algoritmo
imprime a mensagem “o valor do contador é: 1” na tela.
E assim sucessivamente, até que o valor de cont atinja o valor 10. Neste caso, ele imprime
a mensagem na tela “o valor do contador é: 10”, o último valor descrito no comando, e passa a
executar a próxima linha após o FIMPARA. As mensagens impressas na tela serão:
o valor do contador é: 1
o valor do contador é: 2
o valor do contador é: 3
o valor do contador é: 4
o valor do contador é: 5
o valor do contador é: 6
o valor do contador é: 7
o valor do contador é: 8
o valor do contador é: 9
o valor do contador é: 10
Saiu das repetições do PARA...FAÇA
Figura 48 – Mensagens Impressas Na Tela Após Execução do Algoritmo da Figura 47
Determina o valor de
... variação do contador
Declare i : inteiro;
...
PARA i de <valor inicial> ATÉ <valor final> PASSO <valor de incremento>
FAÇA
<instruções>;
FIMPARA ;
...
Figura 49 – Pseudocódigo do Comando de Repetição PARA
Exemplificando...
...
Declare cont: inteiro;
...
PARA cont DE 1 ATÉ 10 PASSO 3 FAÇA
escreva ( “o valor do contador é: ”, cont );
FIMPARA;
Escreva (“ Saiu das repetições do PARA...FAÇA”);
...
Figura 50 – Exemplo Do PARA...FAÇA com A Cláusula PASSO
Executando o algoritmo da Figura 50, cont inicia-se com o valor 1, em seguida imprime a
mensagem “o valor do contador é: 1” na tela. Ao atingir o FIMPARA, o algoritmo retorna para a
primeira linha do comando PARA...FAÇA.
Como foi determinado o valor 3 para PASSO, então cont passa a valer 4 (1 de CONT + 3
do PASSO). Como cont ainda não chegou até 10, a linha escreva é executada novamente,
imprimindo a mensagem “o valor do contador é: 4” na tela. Ao atingir o FIMPARA, o algoritmo
retorna para a primeira linha do comando PARA...FAÇA.
Como foi determinado o valor 3 para PASSO, então cont passa a valer 7 (4 de CONT + 3
do PASSO). E assim sucessivamente, até cont valer mais que 10. As mensagens impressas na
tela serão:
o valor do contador é: 1
o valor do contador é: 4
o valor do contador é: 7
o valor do contador é: 10
Saiu das repetições do PARA...FAÇA
Figura 51 – Mensagens Impressas Na Tela Após Execução do Algoritmo da Figura 50
Exemplificando...
Faça um algoritmo que imprima na tela os números de 50 a 20.
Algoritmo Inverso_50_20;
Declare cont: inteiro;
...
PARA cont DE 50 ATÉ 20 PASSO -1 FAÇA
escreva ( “o valor do contador é: ”, cont );
FIM-PARA;
Escreva (“Saiu das repetições do PARA...FAÇA”);
...
Figura 52 – Exemplo Do PARA...FAÇA Sem A Cláusula PASSO
Como foi determinado o valor -1 para PASSO, então cont passa a valer 49 (50 de cont -1
do PASSO). Como cont ainda não chegou até 20, a linha escreva é executada novamente,
imprimindo a mensagem “o valor do contador é: 49”.
Isto ocorre sucessivamente até a última repetição da impressão com cont valendo 20. Após
isto, cont assa a valer 19 e então a repetição deixa de acontecer, considerando que a condição do
comando é “ATÉ 20”. Assim, o fluxo do programa passa para a primeira linha, imediatamente,
após o FIMPARA, imprimindo na tela “Saiu das repetições do PARA...FAÇA”. A saída na tela
será:
o valor do contador é: 50
o valor do contador é: 49
o valor do contador é: 48
...
...
o valor do contador é: 22
o valor do contador é: 21
o valor do contador é: 20
Saiu das repetições do PARA...FAÇA
Figura 53 – Mensagens Impressas Na Tela Após Execução do Algoritmo da Figura 52
Exercícios Resolvidos
1. Faça um algoritmo que leia nome, nota 1 e nota 2 de 20 alunos, e imprima na tela o nome do
aluno e a sua média.
...
Declare i : inteiro;
nome: literal;
n1, n2 : real;
...
PARA i de 1 ATÉ 20 passo 1 FAÇA
Escreva ("Nome: ");
Leia (nome);
Escreva ("Primeira nota:");
Leia (n1);
Escreva ("Segunda nota:");
Leia (n2);
media (n1+n2)/2;
Escreva ("O aluno ",nome," teve média igual a: ",media);
FIMPARA;
...
Figura 54 – Exemplo de Algoritmo usando Comando de Repetição PARA
Algoritmo Somatorio_1_50;
Declare i, total : inteiro;
Inicio
total 0;
PARA i de 1 ATÉ 50 FAÇA
total total + i;
FIMPARA;
Escreva ("O somatório de 1 a 50 é: “, total);
Fim.
Figura 55 – Exemplo de Somatório de 1 a 50 usando Comando de Repetição PARA
3. Faça um algoritmo que imprima na tela o valor do somatório de 1 até N, sendo N um valor
fornecido pelo usuário.
Algoritmo Somatorio_1_N;
Declare i, total, N : inteiro;
Inicio
Escreva ("Digite valor de N: ");
Leia (N);
total 0;
PARA i de 1 ATÉ N FAÇA
total total + i;
FIMPARA;
Escreva ("O somatório de 1 até “, N, “ é: “, total);
Fim.
Figura 56 – Exemplo de Somatório de 1 a N usando Comando de Repetição PARA
Algoritmo Somatorio_3_de_1_N;
Declare i, total, N : inteiro;
Inicio
Escreva ("Digite valor de N: ");
Leia (N);
total 0;
PARA i de 0 ATÉ N PASSO 3 FAÇA
total total + i;
FIMPARA;
Escreva ("O somatório dos múltiplos de 3 de 1 até “, N, “ é: “, total);
Fim.
Figura 57 – Exemplo de Somatório dos múltiplos de 3 de 1 a N Usando a Cláusula PASSO
Exercícios Resolvidos
1. Faça um algoritmo que calcule o somatório dos termos a seguir, sendo N lido do teclado:
Somatório = 1 + 1/3 + 1/5 + 1/7 + ...+ 1/N
Algoritmo Somatorio_fracao;
Declare cont: inteiro;
total : real;
Inicio
Escreva ("Digite valor de N: ");
Leia (N);
total 0;
PARA cont de 1 ATÉ N PASSO 2 FAÇA
total total + ( 1 / cont );
FIMPARA;
Escreva ("O somatório é: “, total);
Fim.
Figura 59 – Exemplo de Somatório de 1 a N usando Comando de Repetição PARA
2. Faça um algoritmo que calcule o somatório de N termos de fração, cujo denominador varia de
5 em 5 e o denominador de 2 em 2. N é lido do teclado:
Somatório = 1 + 6/3 +11/5 + 16/7 + ...
Algoritmo Somatorio_fracao;
Declare cont, N: inteiro;
Total, denominador, numerador : real;
Inicio
Escreva ("Digite o número de termos N: ");
Leia (N);
total 0;
numerador 1;
denominador 1;
PARA cont de 1 ATÉ N FAÇA
total total + ( numerador / denominador);
numerador numerador + 5;
denominador denominador + 2;
FIMPARA;
Escreva ("O somatório é: “, total);
Fim.
Figura 60 – Exemplo de Somatório de 1 a N usando Comando de Repetição PARA
Algoritmo tabuada;
Declare i, tab, num: inteiro;
INICIO
Escreva (“Tabuada do: ”)
Leia (tab);
Escreva (“Até o número: ”);
Leia (num);
PARA i de 1 ATÉ num FAÇA
Escreva (i, “ x ”, tab, “ = ”, i * tab);
FIMPARA;
FIM.
Figura 61 – Exemplo de Algoritmo Tabuada, usando PARA
Algoritmo atualizar_preco;
Declare i : inteiro;
descricao : literal;
preco, n_preco : real;
INICIO
Escreva (“Este programa permite a atualização do preço em 20% de 30
produtos.”);
PARA i de 1 ATÉ 30 FAÇA
Escreva(“Descrição: “);
Leia (descricao);
Escreva(“Preço Atual: “);
Leia (preco);
n_preco preco * 1.20;
Escreva(“O novo preço de “,descricao,” é = “, n_preco);
FIMPARA;
Fim.
Figura 62 – Algoritmo atualizar_preco, usando PARA
Exemplificando...
Como foi atribuído o valor 1 à cont, então pode-se afirmar que 1 é menor que 10, tornando
a condição verdadeira, implicando na execução das linhas de dentro do ENQUANTO. Logo,
seria impresso na tela a mensagem “o valor do contador é: 1”.
Na próxima linha, encontra-se o FIMENQUANTO que faz a execução mudar para a linha
“ENQUANTO (cont <=10) faça”. Analogamente, continua-se a execução até cont ser
incrementado valer 10. Considerando que a condição é “(cont <= 10)” e 10 é igual a 10, então o
algoritmo escreve na tela “o valor do contador é: 10” e, na linha seguinte, acrescenta mais 1 a
cont, resultando no valor 1. Quando a execução retornar a condição com cont valendo 11, a
condição se tornará falsa e a execução passará para a primeira linha após o FIMENQUANTO,
imprimindo na tela “Saiu das repetições do ENQUANTO...FAÇA”.
Define-se Loop infinito quando a execução entra num comando de repetição e não
consegue sair por erro no algoritmo, repetindo os comandos existentes dentro do laço
infinitamente. Por exemplo, na Figura 66, se o programador não escrevesse a linha “CONT
CONT + 1” dentro do ENQUANTO, então CONT teria sempre o mesmo valor. Portanto, como
CONT iniciou com o valor 1 e satisfaz a condição “(cont <= 10)”, então a execução entra no
comando ENQUANTO e nunca mais conseguirá sair.
Exercícios Resolvidos:
1. Faça um algoritmo que imprima na tela os números de 50 a 20.
Algoritmo Inverso_50_20;
Declare cont: inteiro;
Inicio
cont 50;
ENQUANTO ( cont >=20 ) FAÇA
escreva ( “o valor do contador é: ”, cont );
cont cont -1;
FIM-ENQUANTO;
Escreva (“Saiu das repetições do ENQUANTO...FAÇA”);
Fim
Figura 68 – Algoritmo que imprime de 50 a 20 aplicando ENQUANTO...FAÇA
2. Faça um algoritmo que leia nome, nota 1 e nota 2 de 20 alunos, e imprima na tela o nome do
aluno e a sua média.
Algoritmo Media_Aluno;
Declare cont : inteiro;
nome: literal;
n1, n2 : real;
Inicio
cont 1;
ENQUANTO (cont <= 20 ) FAÇA
Escreva ("Nome: ");
Leia (nome);
Escreva ("Primeira nota:");
Leia (n1);
Escreva ("Segunda nota:");
Leia (n2);
media (n1+n2)/2;
Escreva ("O aluno ",nome," teve média igual a: ",media);
cont cont + 1;
FIM-ENQUANTO;
Fim.
Figura 69 – Exemplo de Algoritmo, usando Comando de Repetição ENQUANTO
Algoritmo soma;
declare soma, i inteiro;
INICIO
soma 0;
i 1;
ENQUANTO i <= 10 FAÇA
soma soma + i;
i i + 1;
FIM-ENQUANTO;
Escreva (soma);
FIM.
Figura 70 – Algoritmo Soma usando ENQUANTO
4. Faça um algoritmo que imprima na tela o valor do somatório de 1 até N, sendo N um valor
fornecido pelo usuário.
Algoritmo Somatorio_1_N;
Declare i, total, N : inteiro;
Inicio
Escreva ("Digite valor de N: ");
Leia (N);
total 0;
i 1;
ENQUANTO ( i <= N ) FAÇA
total total + i;
i i + 1;
FIM-ENQUANTO;
Escreva ("O somatório de 1 até “, N, “ é: “, total);
Fim.
Figura 71 – Exemplo de Somatório de 1 a N usando Comando de Repetição ENQUANTO
Algoritmo Somatorio_3_de_1_N;
Declare i, total, N: inteiro;
Inicio
Escreva ("Digite valor de N: ");
Leia (N);
total 0;
i 0;
ENQUANTO ( i <= N ) FAÇA
total total + i;
i i + 3;
FIM-ENQUANTO;
6. Faça um algoritmo que calcule o somatório de N termos de fração, cujo denominador varia
de 5 em 5 e o denominador de 2 em 2. N é lido do teclado:
Somatório = 1 + 6/3 +11/5 + 16/7 + ...
Algoritmo Somatorio_fracao;
Declare cont, N: inteiro;
total, denominador, numerador : real;
Inicio
Escreva ("Digite o número de termos N: ");
Leia (N);
total 0;
numerador 1;
denominador 1;
cont 1;
ENQUANTO ( cont <= N ) FAÇA
total total + ( numerador / denominador);
numerador numerador + 5;
denominador denominador + 2;
cont cont + 1;
FIM-ENQUANTO;
Escreva ("O somatório é: “, total);
Fim.
Figura 73 – Exemplo de Somatório de 1 a N usando Comando de Repetição ENQUANTO
7. Faça um algoritmo que leia a senha de um usuário. O algoritmo somente deve permitir que o
usuário continue a executar o sistema se a senha digitada for correta, caso contrário, o
algoritmo deve pedir a senha ao usuário.
...
Escreva (“Digite a senha”);
Leia (senha);
ENQUANTO senha <> “xyz” FAÇA
Escreva (“Senha inválida”);
Escreva (“Digite a senha novamente”);
Leia (senha);
FIM-ENQUANTO;
Escreva (“Acertou a Senha”);
...
Figura 74 – Exemplo de Algoritmo, usando Comando de Repetição ENQUANTO
Neste exemplo, o usuário digita a senha, cuja primeira leitura está antes do
ENQUANTO...FAÇA, garantindo um valor inicial para que a senha possa ser comparada na
condição do ENQUANTO. Em seguida, a condição do ENQUANTO verifica se a senha é
diferente de “XYZ”. Se a senha digitada for diferente de “XYZ”, as linhas dentro do
ENQUANTO...FAÇA serão executadas. Essas linhas informam, nesta ordem, que a senha é
inválida e pede ao usuário digitá-la novamente.
Repare que enquanto a senha for diferente de “XYZ” o algoritmo ficará preso nestas
repetições e o usuário não conseguirá fazer mais nada no algoritmo. Quando o usuário digitar a
senha correta, a condição (senha <> “XYZ”) será falsa, e a execução continuará na linha
imediatamente após o FIM-ENQUANTO.
Exercícios Resolvidos:
1. Faça um algoritmo que leia a descrição e preço de um produto. Atualize o preço em 30%
e escreva na tela a descrição e o novo preço. Caberá ao usuário a decisão de quantos
produtos deseja atualizar. Portanto, após cada entrada de dados e impressão na tela, o
algoritmo deve solicitar ao usuário a pressionar “S” ou “s” caso queira entrar com novo
produto para cálculo. O algoritmo deve parar a execução somente se o usuário não digitar
“S” e nem ”s”.
Algoritmo atualizar_preco;
Declare resposta: caracter;
descricao : literal;
preco, n_preco : real;
INICIO
Escreva (“Digite S para atualizar o preço ou N para sair”);
resposta „S‟;
ENQUANTO ( resposta = „S‟ ) ou ( resposta = „s‟ ) FAÇA
Escreva(“Descrição: “);
Leia (descricao);
Escreva(“Preço Atual: “);
Leia (preco);
n_preco preco * 1.30;
Escreva(“O novo preço de “,descricao,” é = “, n_preco);
Escreva (“Digite S para atualizar o preço ou N para sair”);
leia (resposta);
FIM-ENQUANTO;
FIM.
Figura 75 – Algoritmo atualizar_preco, usando ENQUANTO
2. Faça um algoritmo que leia 20 números inteiros positivos e imprima na tela o maior.
Algoritmo atualizar_preco;
Declare i, num, maior : inteiro;
INICIO
i 1;
maior -1;
ENQUANTO ( i <=20 ) FAÇA
Escreva(“Digite um número: “);
Leia (num);
Se ( num > maior ) então
maior num;
Fim-se;
i i + 1;
FIM-ENQUANTO;
Escreva (“O maior número digitado é ”, maior);
FIM.
Figura 76 – Algoritmo Imprimir Maior Número usando ENQUANTO
O teste de condição do comando REPITA fica no fim de sua estrutura. Assim, primeiro
executa-se um conjunto de instruções e, somente depois, realiza-se o teste de condição. Se a
condição for falsa, o fluxo de programa retorna para a linha da instrução REPITA e repete os
comandos descritos dentro do REPITA...ATÉ. Se a condição for verdadeira, o fluxo do
programa sai da estrutura REPITA...ATÉ e continua a execução na primeira linha,
imediatamente, após a cláusula ATÉ.
REPITA
<instruções>;
ATÉ <condição>;
O comando REPITA ... ATÉ possui peculiaridades que, comumente, levam o programador
a erros por falta de atenção.
Em seguida, atinge-se a linha da condição “ATÉ (cont > 10)”. Como CONT vale 2, então
ele não é maior que 10, fazendo com que a execução volte para a linha REPITA. É impresso na
tela “o valor do contador é: 2” e CONT é incrementado de 1, passando a valer 3.
Logo após, atinge-se a linha da condição “ATÉ (cont > 10)”. Como CONT vale 3, então
ele não é maior que 10, fazendo com que a execução volte para a linha REPITA.
Analogamente, continua-se a execução, sucessivamente, até que CONT valha 11, tornando
a condição “ATÉ (cont > 10)” verdadeira.
Algoritmo Escreve_ate_10;
Obrigatório atribuir
Declare cont: inteiro; valor inicial ao contador
Inicio
cont 1;
REPITA
escreva ( “o valor do contador é: ”, cont );
Obrigatório adicionar
cont cont + 1;
algum valor ao
ATÉ ( cont > 10 );
Escreva (“Saiu das repetições do REPITA...ATÉ”); contador dentro do
Fim. REPITA
Exemplificando...
Se o programador se esquecer de inserir uma linha variando o valor da variável que está na
condição ATÉ, o algoritmo entra em Loop infinito dentro do comando REPITA...ATÉ.
Os comandos dentro do REPITA realmente poderão ser executados pelo uma vez
mesmo que a condição não seja satisfeita.
As variáveis presentes na condição do REPITA tem um valor inicial lido ou atribuído
antes de chegar na condição.
O local onde ocorre o incremento/decremento está correto, evitando que possa ocorrer
uma repetição a mais ou a menos do projetado e/ou cálculos errados.
Exemplificando...
Faça um algoritmo que imprima na tela os números de 50 a 20.
Algoritmo Inverso_50_20;
Declare cont: inteiro;
Inicio
cont 50;
REPITA
escreva ( “o valor do contador é: ”, cont );
cont cont -1;
ATÉ ( cont < 20 );
Escreva (“Saiu das repetições do REPITA...ATÉ”);
Fim
Figura 82 – Algoritmo que imprime de 50 a 20 aplicando REPITA...ATÉ
Observe que o teste da condição “cont < 20” é executado somente após a execução dos
comandos dentro do REPITA...ATÉ. O fluxo do programa repetirá os comandos dentro do
REPITA...ATÉ sempre que a condição for falsa. Quando a condição for verdadeira o fluxo é
desviado para a primeira linha imediatamente após a cláusula ATÉ.
Exercícios Resolvidos:
1. Faça um algoritmo que leia nome, nota 1 e nota 2 de 20 alunos, e imprima na tela o nome
do aluno e a sua média.
Algoritmo Media_Aluno;
Declare cont : inteiro;
nome: literal;
n1, n2 : real;
Inicio
cont 1;
REPITA
Escreva ("Nome: ");
Leia (nome);
Escreva ("Primeira nota:");
Leia (n1);
Escreva ("Segunda nota:");
Leia (n2);
media (n1+n2)/2;
Escreva ("O aluno ",nome," teve média igual a: ",media);
cont cont + 1;
ATÉ ( cont > 20 );
Fim.
Figura 83 – Exemplo de Algoritmo, usando Comando de Repetição REPITA...ATÉ
Algoritmo soma;
declare soma, i: inteiro;
INICIO
soma 0;
i 1;
REPITA
soma soma + i;
i i + 1;
ATÉ ( i > 10 );
Escreva (soma);
FIM.
Figura 84 – Algoritmo Soma, usando REPITA...ATÉ
Algoritmo Somatorio_1_N;
Declare i, total, N : inteiro;
Inicio
Escreva ("Digite valor de N: ");
Leia (N);
total 0;
i 1;
REPITA
total total + i;
i i + 1;
ATÉ ( i > N );
Escreva ("O somatório de 1 até “, N, “ é: “, total);
Fim.
Figura 85 – Exemplo de Somatório de 1 a N usando Comando de Repetição REPITA...ATÉ
Algoritmo Somatorio_3_de_1_N;
Declare i, total, N: inteiro;
Inicio
Escreva ("Digite valor de N: ");
Leia (N);
total 0;
i 0;
REPITA
total total + i;
i i + 3;
ATÉ ( i > N );
Escreva ("O somatório dos múltiplos de 3 de 1 até “, N, “ é: “,
total);
Fim.
Figura 86 – Exemplo de Somatório dos múltiplos de 3 de 1 a N Usando REPITA...ATÉ
Algoritmo Somatorio_fracao;
Declare cont, N: inteiro;
total, denominador, numerador : real;
Inicio
Escreva ("Digite o número de termos N: ");
Leia (N);
total 0;
numerador 1;
denominador 1;
cont 1;
REPITA
total total + ( numerador / denominador);
numerador numerador + 5;
denominador denominador + 2;
cont cont + 1;
ATÉ ( cont > N );
Escreva ("O somatório dos múltiplos de 3 de 1 até “, N, “ é: “,
total);
Fim.
Figura 87 – Exemplo de Somatório de 1 a N usando Comando de Repetição REPITA...ATÉ
6. Faça um algoritmo que leia a senha de um usuário. O algoritmo somente deve permitir
que o usuário continue a executar o sistema se a senha digitada for correta, caso
contrário, o algoritmo deve pedir a senha ao usuário.
...
Escreva (“Digite a senha”);
REPITA
Escreva (“Senha inválida”);
Escreva (“Digite a senha novamente”);
Leia (senha);
ATÉ (senha = “xyz”);
Escreva (“Acertou a Senha”);
...
Figura 88 – Exemplo de Algoritmo, usando Comando de Repetição REPITA...ATÉ
7. Faça um algoritmo que leia a descrição e preço de um produto. Atualize o preço em 30%
e escreva na tela a descrição e o novo preço. Caberá ao usuário a decisão de quantos
produtos deseja atualizar. Portanto, após cada entrada de dados e impressão na tela, o
algoritmo deve solicitar ao usuário a pressionar “S” ou “s” caso queira entrar com novo
produto para cálculo. O algoritmo deve parar a execução somente se o usuário não digitar
“S” e nem ”s”.
Algoritmo atualizar_preco;
Declare resposta: caracter;
descricao : literal;
preco, n_preco : real;
INICIO
Escreva (“Digite S para atualizar o preço ou N para sair”);
resposta „S‟;
REPITA
Escreva(“Descrição: “);
Leia (descricao);
Escreva(“Preço Atual: “);
Leia (preco);
n_preco preco * 1.30;
Escreva(“O novo preço de “,descricao,” é = “, n_preco);
Escreva (“Digite S para atualizar o preço ou N para sair”);
leia (resposta);
ATÉ (resposta = „N‟) ou (resposta = „n‟)
FIM.
Figura 89 – Algoritmo atualizar_preco, usando REPITA
8. Faça um algoritmo que leia 20 números inteiros positivos e imprima na tela o maior.
Algoritmo atualizar_preco;
Declare i, num, maior : inteiro;
INICIO
i 1;
maior -1;
REPITA
Escreva(“Digite um número: “);
Leia (num);
Se ( num > maior ) então
maior num;
Fim-se;
i i + 1;
ATÉ ( i > 20 );
Escreva (“O maior número digitado é ”, maior);
FIM.
Figura 90 – Algoritmo Imprimir Maior Número usando ENQUANTO
Algoritmo media;
Declare soma, num, media: real;
cont : inteiro;
INICIO
soma 0;
cont 1;
ENQUANTO cont <= 50 FAÇA
Escreva (“Digite um número: ”);
leia (num);
soma soma + num;
cont cont + 1;
Media soma / cont ;
FIMENQUANTO;
Escreva(“A média dos números digitados é: “, media);
FIM.
Usando o REPITA: Faça um algoritmo que leia 50 números fornecidos pelo usuário,
calcule e exiba a média.
Algoritmo media;
Declare soma, num, media: real;
cont : inteiro;
INICIO
soma 0;
cont 1;
REPITA
Escreva (“Digite um número: ”);
leia (num);
soma soma + num;
cont cont + 1;
Media soma / cont ;
ATÉ cont > 50;
Escreva(“A média dos números digitados é: “, media);
FIM.
Usando o PARA: Faça um algoritmo que leia 50 números fornecidos pelo usuário, calcule
e exiba a média.
Algoritmo media;
Declare soma, num, media: real;
cont : inteiro;
INICIO
soma 0;
PARA cont de 1 ATÉ 50 FAÇA
Escreva (“Digite um número: ”);
leia (num);
soma soma + num;
Media soma / cont ;
FIMPARA;
Escreva(“A média dos números digitados é: “, media);
FIM.
6) Construa um algoritmo que calcule a série descrita a seguir para um número de termo
informado pelo usuário via teclado. (12 + 1)/1 + (22 + 1)/3 + (32 + 1)/5 + (42 + 1)/7 + ...
Algoritmo Media_Aluno;
Declare cont : inteiro;
nome: literal;
n1, n2 : real;
Inicio
cont 1;
REPITA
Escreva ("Nome: ");
Leia (nome);
Escreva ("Primeira nota:");
Leia (n1);
Escreva ("Segunda nota:");
Leia (n2);
media (n1+n2)/2;
Escreva ("O aluno ",nome," teve média igual a: ",media);
cont cont + 1;
ATÉ ( cont > 20 );
Fim.
Figura 91 – Algoritmo Media_Aluno, usando Comando de Repetição REPITA...ATÉ
Uma pequena variação na saída do algoritmo pode torná-lo bem mais complexo. Por
exemplo, se fosse solicitado um algoritmo que lesse o nome, a nota 1 e a nota 2 de 20 alunos, e
imprimisse na tela a média geral dos alunos e depois o nome, notas e média de cada aluno.
Neste caso, o Comando de Repetição não seria suficiente para resolver o problema. Seria
necessário declarar várias variáveis para armazenar todos os nomes e notas, para calcular e
imprimir a média geral e os dados digitados no final. Uma possível solução considerando apenas
3 alunos seria:
Algoritmo Media_Geral;
Declare n1,n2,n3,n4,n5,n6, Media, MediaGeral: real;
nome1, nome2, nome3: literal;
Inicio
Escreva(“Nome: ”);
Leia(nome1);
Escreva(“Nota 1: ”);
Leia(n1);
Escreva(“Nota 2: ”);
Leia(n2);
Escreva(“Nome: ”);
Leia(nome2);
Escreva(“Nota 1: ”);
Leia(n3);
Escreva(“Nota 2: ”);
Leia(n4);
Escreva(“Nome: ”);
Leia(nome3);
Escreva(“Nota 1: ”);
Leia(n5);
Escreva(“Nota 2: ”);
Leia(n6);
MediaGeral (n1+n2+n3+n4+n5+n6)/6;
Escreva(“A Média Geral é ”, MediaGeral);
Media (n1+n2)/2;
Escreva(nome1, n1, n2, Media);
Media (n3+n4)/2;
Escreva(nome2, n3, n4, Media);
Media (n5+n6)/2;
Escreva(nome3, n5, n6, Media);
FIM.
Figura 92 – Algoritmo Media_Geral, usando Comando de Repetição REPITA...ATÉ
No caso da estrutura Vetor e Matriz, pode-se armazenar diversos dados de um mesmo tipo
em uma única variável. O fato de armazenar dados do mesmo tipo, somente inteiro ou somente
real ou somente lógico etc, dá aos vetores e matrizes a classificação de Estruturas de Dados
Homogêneas (homogênea quer dizer do mesmo tipo de dado).
12 VETORES
Considere o algoritmo apresentado na Figura 93 que solicita ao usuário a entrada dos nomes
de 20 alunos e os imprime na tela na medida em que o dado é digitado.
Algoritmo nomes_alunos;
Declare nome: literal;
i : inteiro;
INICIO
PARA i de 1 ATÉ 20 FAÇA
Escreva ("Digite o nome do aluno ",i,":");
Leia (nome);
Escreva ("Aluno", i, “: “, nome);
FIMPARA;
FIM.
Figura 93 – Exemplo de Algoritmo usando Comando de Repetição REPITA
Porém, se pedir para leia o nome de 20 alunos e depois de lido todos, imprimi-los na tela,
não haveria solução com o que foi aprendido até o momento, a não ser que se declarasse 20
variáveis para nome.
O algoritmo da Figura 94 mostra claramente esta limitação. Ele lê 20 nomes de alunos um
a um, conforme o usuário os digita. Neste caso usamos apenas de uma variável inteira que serve
como contador (i) e uma variável do tipo literal para armazenar o nome.
O nome do aluno é digitado, armazenado na variável nome, exibido ao usuário, e a variável
é liberada para armazenar o próximo nome de aluno. Se você solicitar ao programa que exiba o
conteúdo da variável nome após o comando PARA, verá que somente o último nome digitado
será exibido.
Faça o teste. Insira o comando Escreva ("Nome do Aluno: ", nome) após o comando
FIMPARA.
Algoritmo nomes_alunos;
Declare nome : literal;
i : inteiro; // declaração do contador
INICIO
PARA i de 1 ATÉ 20 FAÇA
Escreva ("Digite o nome do aluno ",i,":");
Leia (nome);
Escreva ("Aluno", i, “: “, nome);
FIMPARA;
FIM.
Escreva ("Nome do Aluno: ", nome); /* apresentará somente o último
nome de aluno digitado, que corresponde ao último valor armazenado na
variável nome. */
Figura 94 – Algoritmo nomes_alunos
Para que todos os nomes de alunos digitados sejam exibidos é preciso armazená-los em
uma estrutura de dados. Neste caso utiliza-se uma estrutura de dados homogênea
unidimensional, o vetor.
Um vetor é uma variável formada por vários espaços na memória, todos do mesmo tipo,
com o mesmo identificador (mesmo nome) e alocadas sequencialmente na memória.
V=
índices
1 2 3 4 5
A Figura 95 apresenta um vetor chamado V, que possui cinco posições. Pode-se armazenar
cinco valores neste vetor. Cada posição é representada pelo seu índice. Assim, para saber o valor
armazenado na primeira posição basta escreva V[1], na segunda posição, V[2], e assim
sucessivamente. Os números abaixo do vetor de 1 a 5 são denominados de índices e identificam
qual posição deseja-se manipular.
Algoritmo teste;
Declare <nome da variável>[tamanho]: tipo;
...
INICIO
<comandos>;
FIM.
Figura 96 – Declaração de Vetor em pseudocódigo
Onde: nome é o nome da variável tipo vetor, tamanho é a quantidade de dados que será
armazenada na variável e tipo é o tipo de dado que poderá ser armazenado.
Exemplificando...
Algoritmo teste;
Declare V[5]: inteiro;
...
INICIO
<comandos>;
FIM.
Figura 97 – Exemplo de Declaração de um Vetor de 5 posições do tipo inteiro
Após a execução destas três linhas acima, o vetor ficaria com a seguinte configuração:
V= 23 19 -4
1 2 3 4 5
...
Declare nome [20]: literal;
...
nome[1]
A primeira vez que o comando Leia for executado i valerá 1, implicando que o valor
digitado pelo usuário ficará na posição 1 do vetor, analogamente os valores serão lidos e
colocados um após o outro até a posição 20.
Exemplificando...
Algoritmo nomes_alunos;
Declare nome [20]: literal; /* trocamos a variável nome: literal por um
vetor de tamanho 20 do tipo literal */
i : inteiro;
Entrada dos
INICIO
dados Escreva ("Entre com o nome dos Alunos”);
Saída dos Escreva ("Aluno ", i, ":"); //solicita os nomes dos alunos um a um
Leia (nome[ i ]); //os dados são armazenados um a um, no vetor
dados FIMPARA;
Para exibir (Saída) dados o procedimento é o mesmo, utiliza-se outro comando PARA e
no comando Escreva coloca-se o nome do vetor seguido de “[ ]” e o contador i usado no PARA.
O mesmo raciocínio é válido para guardar a nota 1 e nota 2 de cada aluno, bastando criar
um vetor de 20 posições para Nota1 e outro de 20 posições para Nota2. Deste modo, é possível
armazenar todos os valores digitados pelo usuário.
Exemplificando...
Algoritmo Mult_tres;
Declare Num[10]: inteiro;
i : inteiro;
INICIO
Escreva ("Entre com os valores”);
PARA i de 1 ATÉ 10 FAÇA Processamento dos
Escreva ("Valor ", i, ":");
dados
Leia (Num[ i ]);
FIMPARA;
2) Faça um algoritmo que leia um vetor de 20 posições e uma variável inteira A. A seguir,
mostre o produto da variável A por cada valor do vetor.
3) Faça um algoritmo que leia dois vetores: F[20] e G[20]. Calcule e mostre, a seguir, a soma
dos valores de F com G, guardando o resultado em um 3º vetor H.
4) Faça um algoritmo que leia dois vetores: F[20] e G[20]. Calcule e mostre, a seguir, a soma
dos valores de F com G, guardando o resultado no vetor F.
5) Faça um algoritmo que leia um vetor de tamanho 20 e inverta seus elementos, trocando o
1º elemento com o último, o 2º elemento com o penúltimo. Mostre o vetor invertido.
6) Faça um algoritmo que leia um vetor de tamanho 6, conte quantos valores deste vetor são
negativos e mostre essa informação.
7) Faça um algoritmo que leia um vetor de 10 posições, substitua todos os valores iguais a
zero por 1 e escreva o vetor resultante.
8) Faça um algoritmo que leia um vetor de 20 posições e uma variável inteira A. Imprima na
tela “achou” se o valor A existe no vetor, e “não achou” se o valor não foi encontrado.
9) Faça um algoritmo que leia um vetor de 20 posições e uma variável inteira A. Imprima na
tela a(s) posição(ões) em que o valor A foi encontrado no vetor.
13 MATRIZES
Vimos que uma estrutura capaz de armazenar diversos dados de um mesmo tipo em uma
única variável é considerada uma Estrutura de Dados Homogênea, lembrando que homogênea
quer dizer do mesmo tipo de dado. E classificamos este tipo de estrutura em Vetores
(unidimensionais), visto na seção anterior, e Matrizes (bidimensionais).
Exemplificando...
Representação de uma Matriz M 5X10 da Figura 103:
M[1,1] M[1,2] M[1,10]
M 1
M[5,1] 5
M[5,10]
1 2 3 4 5 6 7 8 9 10
Onde:
Algoritmo teste;
Declare < nome da variável > [ <nº de linhas>, <nº de colunas>] : tipo;
...
INICIO
<comandos>;
FIM.
Figura 102 – Declaração de matriz em pseudocódigo
Exemplificando...
Declarando uma matriz M do tipo inteiro de 5 linhas e 10 colunas (5X10).
Algoritmo teste;
Declare M [5 , 10] : inteiro;
...
INICIO
<comandos>;
FIM.
Figura 103 – Exemplo de Declaração de uma Matriz 5X10 do tipo inteiro
Como no vetor o acesso a cada elemento de uma matriz é feito pela especificação de sua
posição por meio do seu índice.
Na Figura 103 apresenta a declaração de uma matriz M com 5 linhas e em cada linha 10
colunas que podem armazenar valores inteiros. No total, a matriz M pode armazenar 50 valores
inteiros.
Exemplificando...
Algoritmo teste;
Declare A [4] : Inteiro;
B [20 , 4] : Inteiro;
C [5, 20 , 4] : Inteiro;
D [2 ,5, 20 , 4] : Inteiro;
E [3 , 2 , 5, 20 , 4] : Inteiro;
F [2 ,3 , 2 , 5, 20 , 4] : Inteiro;
...
INICIO
<comandos>;
FIM.
Figura 104 – Declaração de Matrizes de diferentes dimensões
No exemplo da Figura 104, cada estrutura pode ser utilizada para armazenar informações
como:
M 1 24 3
2 14
3 44
4
5 38
1 2 3 4 5 6 7 8 9 10
Exemplificando...
Algoritmo entrada_matriz;
Entrada dos Declare num [3, 5] : inteiro;
dados i, j : inteiro;
INICIO
PARA i de 1 ATÉ 3 FAÇA
PARA j de 1 ATÉ 5 FAÇA
Escreva ("Digite os valores da posição[ ",i, " e “ ,j, “]:");
Leia (num[ i, j ];
FIMPARA;
FIMPARA;
FIM.
Figura 107 – Entrada de dados em uma Matriz 3X5
num 1 13 24000 2 -5 48
2 -6 0 100 -27 154
3 23 1 5 87 -51
1 2 3 4 5
Algoritmo entrada_e_saida_matriz;
Declare num [3, 5] : inteiro;
i, j : inteiro;
INICIO
PARA i de 1 ATÉ 3 FAÇA
PARA j de 1 ATÉ 5 FAÇA
Escreva ("Digite os valores da posição[ ",i, " e “ ,j, “]:");
Leia (num[ i, j ]);
FIMPARA;
Saída dos
FIMPARA;
dados
PARA i de 1 ATÉ 3 FAÇA
PARA j de 1 ATÉ 5 FAÇA
Escreva(num[ i , j ]);
FIMPARA;
FIMPARA;
FIM.
Figura 109 – Entrada e Saída de dados em uma Matriz 5X10
Na tela
13
24000
2
-5
48
-6
0
100
-27
154
23
1
5
87
-51
Exemplificando...
Elaborar um algoritmo para leia uma matriz NUM de 5 linhas por 10 colunas de inteiros. Depois
somar 100 a cada valor da matriz.
Algoritmo Soma_100;
Declare Num[5, 10] ,i ,j : inteiro;
INICIO
Escreva ("Entre com os valores”);
// Lê os valores da matriz
PARA i de 1 ATÉ 5 FAÇA
PARA j de 1 ATÉ 10 FAÇA
Escreva ("Digite os valores da posição[ ",i, " e “ ,j, “]:");
Leia (Num[ i, j ];
Processamento FIMPARA;
FIMPARA;
dos dados
// Soma o número 100 a cada valor armazenado
PARA i de 1 ATÉ 5 FAÇA
PARA j de 1 ATÉ 10 FAÇA
Num[ i, j] Num[ i, j] + 100;
FIMPARA;
FIMPARA;
// Imprime a saída
PARA i de 1 ATÉ 5 FAÇA
PARA j de 1 ATÉ 10 FAÇA
Escreva(“Posição[ “, i , “ “, j, “]:”, Num[ i, j] );
FIMPARA;
FIMPARA;
FIM.
Figura 110 – Algoritmo para somar número 5 a cada posição de uma matriz [5,10]
Exercícios Resolvidos:
1) Elaborar um algoritmo para leia uma matriz MAT de 3 linhas por 5 colunas de inteiros.
Depois somar os elementos da 2ª linha e armazenar em uma variável A, multiplicar os
elementos da 3ª coluna e armazenar em uma variável B.
Algoritmo matriz_com_soma_e_multipli;
Declare mat[3,5], i, j, A, B: inteiro;
INÍCIO
PARA i de 1 ATÉ 3 FAÇA
PARA j de 1 ATÉ 5 FAÇA
Escreva ("Digite os valores da posição[ ",i, " e “ ,j, “]:");
Leia (mat [i,j] );
FIMPARA;
FIMPARA;
A 0;
B 1;
PARA j de 1 ATÉ 5 FAÇA // fixando a linha 2
A A + mat [2,j];
FIMPARA;
2) Elaborar um algoritmo para leia uma Matriz 5x5 de inteiros, encontrar o maior valor
armazenado nela e multiplicar este valor pela matriz lida.
Algoritmo acha_maior_mult;
Declare M[5,5], RES[5,5], i, j, maior: inteiro;
INÍCIO
Leia (M [ i, j ] );
FIMPARA;
FIMPARA;
maior M [1,1];
FIM.
Figura 112 – Algoritmo para encontrar maior valor da matriz e multiplicá-lo pela matriz
3) Elaborar um algoritmo para somar duas matrizes 2x2 do tipo inteiro fornecidas pelo usuário.
Apresente as 2 matrizes lidas e o resultado em outra matriz.
Algoritmo soma_matrizes;
Declare A[2,2], B [2,2], RES[2,2], i, j: inteiro;
INÍCIO
FIM.
Figura 113 – Algoritmo para somar duas matrizes
Um Registro permite trabalhar com dados de tipos diferentes em uma mesma estrutura e
por isso é considerado heterogêneo.
Algoritmo registro;
Declare <nome_da_variável_registro> REGISTRO (<lista de campos e seus tipos>);
...
INICIO
<comandos>;
FIM.
Figura 114 – Declaração de Registro em pseudocódigo
Exemplificando ...
Considere um Registro com campos referentes a dados de alunos como: matrícula, nome, curso,
período e média.
Algoritmo registro_aluno;
Declare reg_aluno REGISTRO (matr, nome, curso: literal, periodo: inteiro, media: real);
...
INICIO
<comandos>;
FIM.
Figura 115 – Declaração de Registro Aluno
reg_aluno
produto
...
produto.cod ”B002”;
produto.descricao ”tomada”;
produto.preco 1.99;
...
Figura 119 – Exemplo de comandos para manipular o Registro produto
produto
B002 tomada 1.99
cod descricao preco
Exemplificando...
Algoritmo registro_produto;
Declare produto REGISTRO (cod, descricao:literal, preco: real);
INICIO
// Entrada de Dados no Registro Produto
Escreva(“Entre com o Código do Produto: ”);
Leia(produto.cod);
Escreva(“Entre com a Descrição do Produto: ”);
Leia(produto.descricao);
Escreva(“Entre com o Preço Unitário do Produto: ”);
Leia(produto.preco);
FIM.
Figura 121 – Entrada e Saída de Dados – Registro Produto
Exemplificando ...
Algoritmo registro_aluno;
Declare reg_aluno [20] REGISTRO (matr, nome, curso: literal, periodo: inteiro, media: real);
i: inteiro;
...
INICIO
<comandos>;
FIM.
Figura 122 – Declaração de um Vetor de Registros para Aluno
produto[100]
1 2 ... 99 100
Exemplificando...
Considere um algoritmo para leia 100 registros de produtos e imprimi-los na tela. Cada registro
deverá conter o código do produto, sua descrição e seu preço unitário.
Algoritmo registro_produto;
Declare produto[100] REGISTRO (cod, descricao:literal, preco: real);
i: inteiro;
INICIO
// Entrada de Dados de 100 Registros de Produto
PARA i DE 1 ATÉ 100 FAÇA
Escreva(“Entre com o Código do Produto: ”);
Leia(produto[ i ].cod);
Escreva(“Entre com a Descrição do Produto: ”);
Leia(produto[ i ].descricao);
Escreva(“Entre com o Preço Unitário do Produto: ”);
Leia(produto[ i ].preco);
FIMPARA;
Exercícios Resolvidos:
1. Elabore um algoritmo que leia informações de descrição, preço, quantidade e ano de
vencimento dos produtos de um supermercado. O algoritmo deverá fazer: a) o cadastro
de 100 produtos; b) listar todos os produtos cuja quantidade em estoque seja maior que
20 unidades; e c) listar todos os produtos cujo vencimento seja menor que 2011.
Algoritmo produto_supermercado;
Declare prod[100] REGISTRO (
descricao : literal
preco: real
qde: inteiro
venc:inteiro);
i: inteiro;
INICIO
PARA i DE 1 ATÉ 100 FAÇA
Escreva(“Entre com a Descrição do Produto: ”);
Leia(prod[ i ].descricao);
Escreva(“Entre com o preço: ”);
Leia(prod[ i ].preco);
Escreva(“Entre com a quantidade: ”);
Leia(prod[ i ].qde);
Escreva(“Entre com o ano de vencimento: ”);
Leia(prod[ i ].venc);
FIMPARA;
2. A prefeitura de uma cidade fez uma pesquisa entre seus habitantes, coletando dados sobre
o salário, sexo, idade e número de filhos. Considerando 100.000 habitantes na cidade,
faça um algoritmo que calcule e mostre:
a. A média do número de filhos da população;
b. A maior idade;
c. A média do salário das mulheres.
Algoritmo pesquisa;
Declare pesq[100000] REGISTRO (
sal: real;
sexo: caractere;
idade: inteiro;
filhos: inteiro;);
i, maior: inteiro;
MF, SalF, cont : real;
INICIO
PARA i DE 1 ATÉ 100000 FAÇA
Escreva(“Informe o salário: ”);
Leia(pesq[i].sal);
Escreva(“Informe o sexo, usando F para feminino e M para masculino: ”);
Leia(pesq[i].sexo);
Escreva(“Informe a idade: ”);
Leia(pesq[i].idade);
Escreva(“Informe o número de filhos: ”);
Leia(pesq[i].filhos);
FIMPARA;
MF 0;
PARA i DE 1 ATÉ 100000 FAÇA
MF MF + pesq[ i ].filhos; // acumula qde de filhos para calcular media
FIMPARA;
MF MF / 100000;
Escreva(“A média do número de filhos da população: ”, MF);
SalF 0;
cont 0;
PARA i DE 1 ATÉ 100000 FAÇA
SE (pesq[ i ].sexo = „F‟) E (pesq[ i ].sal > 2000)ENTÃO
SalF SalF + pesq[ i ].sal; // acumula salário feminino maior que 2000
para calcular media
cont cont +1;
FIMSE;
FIMPARA;
Algoritmo
Cada módulo, além de ter acesso às variáveis do algoritmo que o chamou (variáveis
globais), pode ter suas próprias variáveis (variáveis locais), que existem apenas durante sua
chamada.
A modularização pode ser feita declarando-se Procedimentos e Funções, chamados em
qualquer parte do algoritmo. Para entender a diferença entre procedimentos e funções e como
declará-las, necessita-se compreender os conceitos retorno de valor e parâmetro, melhor
explicado por meio de exemplos.
Vimos na seção 5.5.2 em Funções pré-definidas a função que calcula a raiz quadrada de um
número denominada SQRT(x). Portanto, quando se faz a chamada desta função usando a
expressão SQRT(25) no programa, espera-se obter a resposta da raiz quadrada de 25. A resposta,
o valor 5, é denominado de retorno de valor ou retorno da função. O valor 25 passado dentro
de parênteses na chamada da função SQRT denomina-se parâmetro ou argumento.
parâmetro ou
argumento
resp SQRT(25);
A função retorna o
valor 5
Figura 130 – Exemplo de retorno de valor e parâmetro
Uma função retorna um único valor e pode possuir vários parâmetros. Tendo consciência
destes conceitos, torna-se fácil diferenciar Procedimentos de Funções.
Procedimentos são sub-rotinas que NUNCA retornam um valor como resultado, apenas
executam uma tarefa. Por exemplo, o comando escreva imprime uma mensagem na tela, mas não
retorna nenhum valor. O comando leia é um procedimento que lê um valor do teclado e o
armazena numa variável, sem retornar valor.
Funções são sub-rotinas que SEMPRE retornam um valor como resultado. O tipo
retornado por uma função pode ser do tipo básico como inteiro, real, literal, caractere ou lógico,
ou pode ser do tipo declarado pelo usuário como um vetor, matriz, registro dentre outros.
A declaração de procedimentos e funções é bastante similar, diferenciando apenas pelo fato
de que em Função deve-se informar o tipo de dado a ser retornado, enquanto procedimento não
existe a declaração o tipo de retorno, pois ele não nunca retorna valor.
Ressalta-se que o aluno deve guardar e não esquecer esta definição: A diferença entre o uso
de um Procedimento e uma Função é: um Procedimento NUNCA retorna valor, enquanto uma
Função SEMPRE retornará um valor.
15.1 PROCEDIMENTOS
Um procedimento é um conjunto de comandos que realiza alguma operação ao qual se dá
um nome e NUNCA retorna valor.
Pode-se dizer que um procedimento possui vida própria, com suas próprias variáveis
(variável local), mas que para ser processado, deve ser chamado pelo algoritmo principal ou por
outro procedimento.
Deste conceito, define-se o termo escopo de variável, o qual pode ser de escopo global ou
escopo local.
<lista_de_variáveis> : <tipo>;
Figura 132 – Declaração de Variável em Procedimentos
Exemplificando...
Declaração do procedimento SEPARADOR sem parâmetros. Este procedimento cria uma
linha como separador na tela usando asteriscos (*).
...
PROCEDIMENTO SEPARADOR ( );
declare i : inteiro;
PARA i de 1 ATÉ 20 FAÇA
escreva (“*”);
FIMPARA;
FIMPROCEDIMENTO;
...
Figura 133 – Declaração do Procedimento SEPARADOR
...
PROCEDIMENTO IMPRIMIR ( );
declare i : inteiro;
PARA i de 1 ATÉ 1000 FAÇA
escreva (i);
FIMPARA;
FIMPROCEDIMENTO;
...
Figura 134 – Declaração do Procedimento IMPRIMIR
...
PROCEDIMENTO SEPARADOR ( símbolo : caractere);
declare i : inteiro;
PARA i de 1 ATÉ 20 FAÇA
escreva (simbolo);
FIMPARA;
FIMPROCEDIMENTO;
...
Figura 135 – Declaração do Procedimento SEPARADOR
...
PROCEDIMENTO IMPRIMIR(x1, x2:inteiro);
declare i : inteiro;
PARA i de x1 ATÉ x2 FAÇA
escreva (i);
FIMPARA;
FIMPROCEDIMENTO;
...
Figura 136 – Declaração do Procedimento IMPRIMIR
...
PROCEDIMENTO IMPRIMIR(nome:caractere; salario:real; idade:inteiro);
declare i : inteiro;
escreva (“nome:”, nome);
escreva (“salario:”, salario);
escreva (“idade: ”, idade);
FIMPROCEDIMENTO;
...
Figura 137 – Declaração do Procedimento IMPRIMIR
Algoritmo teste_procedimento;
declare nome : literal;
PROCEDIMENTO SEPARADOR ( );
declare i : inteiro;
PARA i de 1 ATÉ 20 FAÇA
escreva (“*”);
FIMPARA;
FIMPROCEDIMENTO;
INICIO
escreva (“Algoritmo para testar chamada de um procedimento”);
separador;
escreva (“Aula de AEDI”);
separador;
escreva (“Digite seu nome:”);
leia (nome);
separador;
escreva (“O nome é:”, nome);
separador;
FIM.
Figura 138 – Chamada ao Procedimento SEPARADOR
A Figura 138 mostra um procedimento que imprime uma linha com 20 asteriscos. Toda vez
que o procedimento SEPARADOR for chamado, ele sempre fará a mesma coisa sem nenhuma
variação, ou seja, imprimirá uma linha com 20 asteriscos.
Algoritmo teste_procedimento;
declare nome : literal;
simbolo: caractere;
PROCEDIMENTO SEPARADOR ( );
declare i : inteiro;
PARA i de 1 ATÉ 20 FAÇA
escreva (simbolo);
FIMPARA;
FIMPROCEDIMENTO;
INICIO
escreva (“Algoritmo para testar chamada de um procedimento”);
escreva (“Digite o caractere que deseja imprimir como separador de linha: ”);
leia(simbolo);
separador;
escreva (“Digite novo caractere que deseja imprimir como separador de linha: ”);
leia(simbolo);
separador;
FIM.
Figura 139 – Chamado ao Procedimento SEPARADOR
A Figura 139 mostra um algoritmo em que o usuário fornece o caractere que deseja
imprimir como separador de linha. Este caractere é armazenado na variável símbolo declarada
como de escopo global. A primeira vez que o procedimento SEPARADOR é chamado, uma
linha com o caractere armazenado em símbolo será impresso. Em seguida, novo caractere é
solicitado ao usuário e, na sequencia, o procedimento SEPARADOR utilizará esse novo símbolo
para imprimir a linha com 20 caracteres. Observe que a variação do comportamento do
procedimento sem parâmetro, somente foi possível por que o procedimento utiliza uma variável
global que pode ser alterada.
A quantidade dos parâmetros, sua sequência e respectivos tipos não podem mudar,
devendo estar de acordo com o especificado na declaração. Portanto, se o programador definir
um procedimento com dois parâmetros um inteiro e um real, nesta ordem, então ao chamar o
procedimento, obrigatoriamente, deverá ser passado um valor inteiro e um real, nesta ordem.
Exemplificando...
Voltemos ao exemplo da Figura 138 que declara um procedimento que cria uma linha como
separador na tela usando asteriscos (*). Mas agora alterando-o, permitindo o uso de diferentes
símbolos como separador.
Algoritmo teste_procedimento_com_parametro;
declare nome : literal;
PROCEDIMENTO SEPARADOR (simbolo : caractere);
declare i : inteiro;
PARA i de i ATÉ 20 FAÇA
escreva (simbolo);
FIMPARA;
FIMPROCEDIMENTO;
INICIO
escreva (“Testando chamada de procedimento com passagem de parâmetro!”);
separador (“-”);
escreva (“Aula de AEDI”);
separador (“=”);
escreva (“Digite seu nome:”);
leia (nome);
separador (“+”);
escreva (“O nome é:”, nome);
separador (“#”);
FIM.
Figura 140 – Algoritmo, usando Procedimento COM passagem de Parâmetros
15.2 FUNÇÕES
Uma função é um conjunto de comandos que realiza alguma operação para a qual dá-se um
nome e SEMPRE retorna um valor.
E também como no caso dos procedimentos, as funções precisam ser chamadas pelo
algoritmo principal para serem executadas. Ao se chamar uma função, desvia-se a execução do
algoritmo principal para realizar uma tarefa específica. Após sua execução, no local onde foi
feita a chamada da função atribui-se o valor retornado por ela.
O conceito de Função vem da idéia de função matemática, como raiz quadrada, seno,
cosseno, tangente, logaritmo etc, onde calcula-se um valor a partir de outro(s) fornecido(s) à
função.
Lembre-se que como uma função sempre retorna um valor, elas devem ser chamadas de
forma a fazer sentido a substituição da chamada da função pelo valor que ela retorna.
Por isso, em uma função deve-se declarar tipos, consistentes com o tipo de valor por ela
calculado (inteiro, real, caractere, literal ou Lógico).
variavel Funcao(parâmetros);
variavel Funcao(parâmetros) + Z;
A chamada de uma função é feita através da citação do seu nome, seguido pelos
parâmetros entre parênteses (se houver), dentro de uma expressão.
Uma função possui um cabeçalho de identificação com o nome da função, uma lista
opcional de parâmetros, o tipo de dado do valor retornado, um bloco de declarações e um
bloco de comandos.
Exemplificando...
Declaração da função DIVIDIR com 2 parâmetros. Esta função divide dois números
inteiros e retorna um número real.
Algoritmo Exemplo_funcao_com_parametro;
declare calc: real;
X,Y: inteiro;
FUNCAO DIVIDIR ( a, b : inteiro) : real;
retorne a/b;
FIMFUNCAO;
INICIO
Escreva ("Digite 2 números inteiros para serem divididos”);
Escreva ("Digite o 1º número= ”);
Leia(X);
Escreva ("Digite o 2º número= ”);
Leia(Y);
calc DIVIDIR( X ,Y );
Escreva ("A divisão de ", x, "por ", y, "é ", calc);
FIM.
Figura 144 – Algoritmo com chamada a Função com 2 parâmetros
...
FUNCAO <nome_da_funcao>:<tipo_do_valor_retornado>;
declare < lista-de-variáveis> : <tipo>;
<comandos>;
retorne <valor de retorno>;
FIMFUNCAO;
...
Figura 145 – Declaração de Função SEM passagem de parâmetros
Exemplificando...
Algoritmo para calcular dividir dois números reais, cuja função NÃO possui parâmetros.
Algoritmo Exemplo_funcao_sem_parametro;
declare calc, X,Y : real;
FUNCAO DIVIDIR : real;
retorne X/Y;
FIMFUNCAO;
INICIO
Escreva ("Digite 2 números para serem divididos”);
Escreva ("Digite o 1º número= ”);
Leia(X);
Escreva ("Digite o 2º número= ”);
Leia(Y);
calc DIVIDIR;
Escreva ("A divisão de “, x, “por “, y, “é ", calc);
FIM.
Figura 146 – Algoritmo com chamada a Função sem parâmetros
...
FUNCAO <nome_da_funcao> (<lista-de-parâmetros> : <tipo>): <tipo_retornado>;
declare < lista-de-variáveis> : <tipo>;
<comandos>;
retorne <valor de retorno>;
FIMFUNCAO;
...
Figura 147 – Declaração de Função COM passagem de parâmetros
Exemplificando...
Algoritmo _funcao_com_parametros;
declare calc, X,Y : real;
INICIO
Escreva ("Digite 2 números para serem multiplicados!”);
Escreva ("Digite o 1º número= ”);
Leia(X);
Escreva ("Digite o 2º número= ”);
Leia(Y);
calc MULTIPLICAR( X , Y );
Escreva ("A multiplicação de “, x, “por “, y, “é ", calc);
FIM.
Figura 148 – Algoritmo com chamada a Função COM parâmetros
Algoritmo Exemplo_funcao;
declare X, Y : inteiro;
inicio
Escreva ("Digite um número inteiro”);
Leia(X);
Y QUAD(X);
Escreva (X, " elevado ao quadrado é = ", Y);
Fim.
Note que:
A função QUAD recebe num como parâmetro do tipo inteiro, terá um valor de retorno
do tipo inteiro e possui Z como uma variável local do tipo inteiro;
Exercícios Resolvidos:
PROGRAMA Uso_Funcao;
declare num:inteiro;
INICIO
Escreva ("Digite um número inteiro”);
leia (num);
escreva ( POTENCIA(num) );
FIM.
Algoritmo aumento_salario;
declare sal, aum, novo_sal: real;
INICIO
Escreva (“Digite o salário: “);
Leia (sal);
aum CALC (sal);
novo_sal sal + aum;
Escreva (“O nomo salário é: “,novo_sal);
FIM.
Figura 149 – Algoritmo, usando Função CALC_SAL (com passagem de parâmetro)
Algoritmo Calcula_Preco;
INICIO
lerdados;
peso_grama ← kg2grama( peso_kg );
preco_total ← CalcularPrecoTotal( codigo, peso_grama );
valor_imposto ← Imposto( cod_pais, preco_total );
valor_total ← ValorTotal( preco_total, valor_imposto );
ImprimirDados;
FIM.
PROCEDIMENTO lerdados( )
escreva("Digite o código do produto: ");
leia(codigo);
escreva("Digite o peso do produto(kg): ");
leia(peso_kg);
escreva("Digite o código do país de origem: ");
leia(cod_pais);
FIMPROCEDIMENTO;
FUNCAO kg2grama(pesokg:real):real
retorne TRUNC(pesokg) * 1000 + FRAC(pesokg);
FIMFUNÇÃO;
escolha (cod)
caso 1..4 : valor ← pesogr * 10;
caso 5..7 : valor ← pesogr * 25;
caso 8..10: valor ← pesogr * 35;
fimescolha;
retorne valor;
FIMFUNÇÃO;
PROCEDIMENTO ImprimirDados()
escreva("Peso em gramas: ", peso_grama);
escreva("Preco Total do Produto: "preco_total);
escreva("Valor do Imposto ",valor_imposto);
escreva("Valor Total ", valor_total);
FIMPROCEDIMENTO;
Recomenda-se não usar variáveis globais dentro de procedimentos e funções, pois esta
prática cria dependência do procedimento ou função em relação à variável. Neste caso, se o
programador tentar reutilizar o procedimento ou função em outro algoritmo, então ele terá que
declarar uma variável global com o mesmo nome no novo algoritmo que está construindo.
Recomenda-se que o programador sempre declare parâmetros para passar valor do
algoritmo principal para as funções e procedimentos.
PROCEDIMENTO IMPRIMIR;
declare i : inteiro;
PARA i de x1 ATÉ x2 FAÇA
escreva (i);
FIMPARA;
FIMPROCEDIMENTO;
Figura 150 – Declaração do Procedimento IMPRIMIR
Na Figura 150, observa-se o trecho principal do algoritmo entre as palavras reservadas início
e fim. Deve-se compreender que x1 e x2 são variáveis de escopo global. Isto implica que estas
variáveis são visíveis e utilizáveis em qualquer parte do programa, inclusive dentro de
procedimentos e funções. Por isto, pode-se utilizá-las no procedimento IMPRIMIR sem declará-
las, pois já foram declaradas no algoritmo principal e existem em todo algoritmo. Observa-se
ainda que dentro do procedimento IMPRIMIR declarou-e a variável i.
Quando variáveis são declaradas dentro de sub-rotinas como funções e procedimentos, elas
são denominadas de Variáveis de Escopo Local. Isto implica que estas variáveis são visíveis e
utilizáveis apenas dentro do procedimento ou função onde foram declaradas. Por isto, a variável i
não pode ser utilizada dentro do algoritmo principal. Caso o programador tente utilizar a variável
de Escopo Local fora da função ou procedimento onde ela foi declarada, o compilador informará
que a variável não existe.
Nesta seção, apresentam-se as diferenças entre os conceitos, para que o programador tome
a melhor decisão de acordo com as necessidades do projeto
Além da declaração da função, imagine uma linha chamando a função com a seguinte
declaração:
N1 10;
N2 20;
S SOMAR(N1, N2);
1 2 3 4 5 6
1 N1=10
2
3 N2=20
4
5
Figura 151 – Memória do Computador com as Variáveis Globais
Quando ocorre a chamada a função Somar(N1, N2), então o computador copia o valor 10
do primeiro parâmetro N1 para a primeira variável declarada no parâmetro da função,
denominada X. Logo em seguida, o computador copia o valor 20 do segundo parâmetro N2 para
a segunda variável declarada no parâmetro da função, denominada Y. A Figura 152 apresenta o
estado da memória após copiar os valores de N1 e N2 para X e Y, respectivamente.
Após compreender o que ocorre na memória do computador quando se passa parâmetros
por valor, torna-se fácil explicar este tipo de passagem de parâmetros. Define-se passagem de
parâmetros por valor quando o computador copia o valor das variáveis contidas na chamada de
uma função ou procedimento para os parâmetros declarados na função. Portanto, as variáveis são
distintas, e quando se altera o valor de X e Y dentro da função ou procedimento, as variáveis N1
e N2 não têm seus valores alterados, pois estão alocadas em locais diferentes na memória
1 2 3 4 5 6
1 N1=10
2
3 N2=20
4 X=10
5 Y=20
Figura 152 – Memória do Computador Contendo os Parâmetros X e Y
O leitor deve aceitar que o computador consegue guardar o número 10 na memória e que
para acessar o número 10 você pode chamar a variável A ou B, veja a Figura 153.
C
A B
1 2 3 4 5 6
1 10
2 30
3
4
5
Figura 153 – Variáveis Ocupando o Mesmo Espaço de Memória
Uma analogia para esta situação é imaginar que o apelido de seu irmão Francisco é Chico.
Se Chico se formar em engenharia e alguém lhe perguntar qual a profissão de Francisco, você
responderá: engenheiro. Logo, se você chamá-lo de Francisco ou Chico, estará referenciando a
mesma pessoa, o que acontece com Chico também se aplica a Francisco e vice versa.
A palavra var destacada na declaração informa que X e Y são variáveis que receberão
parâmetros por referência. Quando não se coloca a palavra var, automaticamente, o computador
entenderá que o programador quer passagem de parâmetros por valor. Além da declaração da
função SOMA, considera as linhas a seguir contendo atribuições e chamada a função:
N1 10;
N2 20;
S SOMAR(N1, N2);
N1 N2
1 2 3 4 5 6
1 10
2
3 20
4
5
Figura 154 – Memória do Computador com as Variáveis Globais
Quando ocorre a chamada a função Somar(N1, N2), cujos parâmetros foram declarados
com var, então o computador cria as variáveis X e Y, apontando para o mesmo local das
variáveis N1 e N2, respectivamente, como mostrado na Figura 155. Portanto, ao referenciar a
variável X, referencia-se também a variável N1, e quando se referencia a variável Y referencia-
se também a variável N2, e vice versa.
X N2 Y
N1
1 2 3 4 5 6
1 10
2
3 20
4
5
Figura 155 – Memória do Computador com Passagem de Parâmetros Por Referência
16 RECURSIVIDADE
Um módulo (Procedimento ou Função) recursivo é aquele que chama a si próprio n vezes
para resolver um problema. A utilização da técnica de recursividade em um algoritmo tem por
objetivo diminuir a complexidade do problema, aplicando-se o princípio de dividir para
conquistar.
Para aplicar a recursividade, deve-se dividir o problema sucessivamente em problemas
mais simples, até que a simplicidade do problema permita resolvê-lo de forma direta, sem que a
função ou procedimento tenham de chamar a si mesmos novamente.
4! = 4 . 3!
3! = 3 . 2!
2! = 2 . 1!
1! = 1 . 0!
Na última linha acima, basta substituir o 0! por 1, então tem-se o resultado da conta de 4!.
Assim, tem-se a seguinte definição:
n! = 1 se n =0
n . (n-1)! se n>0
Portanto, para resolver 4! é preciso multiplicar 3 por 3!, o que implica em recursividade,
pois para resolver qualquer fatorial de n, é preciso calcular outro fatorial até se chegar a 0! que
por definição será 1. Quando n vale 0, no caso do fatorial, diz-se que o algoritmo atingiu uma
condição de parada, não sendo necessário calcular outro fatorial, apenas retornar um valor de
definição. Esta condição de parada deve estar presente em pelo menos um local dentro algoritmo
para que ele possa encerrar o cálculo e não entrar em loop infinito.
Exemplificando...
Sabe-se que o fatorial de um número N (positivo) pode ser obtido multiplicando-o pelo
fatorial de seu predecessor:
Algoritmo teste_recursividade;
declare num: inteiro;
INICIO
escreva (“Digite um número para obter seu fatorial: “);
leia (num);
escreva (“Fatorial de “ ,num, “:“ , FAT(num) );
FIM.
Exemplificando...
Portanto, na Figura 157, observa-se que dentro da condição SE, o procedimento recursão é
chamado. Neste caso, a execução é congelada (suspensa) e inicia-se outra execução do mesmo
procedimento recursão com parâmetro "n-1". Como, na nova execução, há outra chamada ao
procedimento recursão, então esta nova chamada também é congelada, e outra execução se
inicia do próprio procedimento. Somente após atingir a condição de parada e o procedimento não
for chamado novamente, é que as execuções anteriormente congeladas continuarão a execução
do ponto em que pararam.
Exemplificando...
Exemplificando...
10) Escreva uma função recursiva que imprima na tela todos os números fatoriais de 1 até 20,
utilizando apenas uma função.
11) Escreva uma função recursiva que imprima na tela todos os números fatoriais de n1 até
n2, utilizando apenas uma função. N2 é MAIOR OU IGUAL a n1.
17 ÍNDICE DE FIGURAS
Figura 1 - Algoritmo de Euclides para calcular o MDC ................................................................................. 7
Figura 103 – Exemplo de Declaração de uma Matriz 5X10 do tipo inteiro .............................................. 102
Figura 108 – Representação da Matriz num após atribuição de valores ................................................. 106
Figura 109 – Entrada e Saída de dados em uma Matriz 5X10 .................................................................. 106
Figura 110 – Algoritmo para somar número 5 a cada posição de uma matriz [5,10] .............................. 107
Figura 111 – Algoritmo para somar os elementos da linha 2 e multiplicar os elementos da coluna 3 ... 108
Figura 112 – Algoritmo para encontrar maior valor da matriz e multiplicá-lo pela matriz ..................... 109
Figura 125 – Exemplo de comandos para manipular o Vetor de Registros produto ............................... 117
Figura 126 – Operações de Entrada e Saída, utilizando Vetor de Registros ............................................ 118
Figura 144 – Algoritmo com chamada a Função com 2 parâmetros ....................................................... 129
Figura 148 – Algoritmo com chamada a Função COM parâmetros ......................................................... 131
Figura 149 – Algoritmo, usando Função CALC_SAL (com passagem de parâmetro) ............................... 132
Figura 155 – Memória do Computador com Passagem de Parâmetros Por Referência.......................... 140
Figura 156 – Função Recursiva que calcula o fatorial de um número ..................................................... 142
Figura 157 – Procedimento Recursivo que imprime um número em ordem decrescente...................... 143
Figura 158 – Procedimento Recursivo que imprime um número em ordem crescente .......................... 144
Figura 159 – Função Recursiva para obter a série de Fibonacci .............................................................. 144
18 ÍNDICE DE TABELAS
Tabela 1 - Execução do algoritmo de Euclides para calcular o MDC dos números 48 e 30 ......................... 8
19 RELAÇÃO DE ÍCONES
Indicadores de ações requisitadas durante o estudo
FAÇA. Determina a existência de tarefa a ser executada. Este ícone indica que há uma
atividade de estudo para ser realizada.
BUSQUE. Indica a exigência de busca por mais informação, seja ela em anexos do módulo
impresso, em bibliografia específica ou em endereços de Internet.
IMPORTANTE. Aponta uma observação significativa. Pode ser encarado como um sinal de
alerta que o orienta para prestar atenção à informação indicada.