Algoritmos
Algoritmos
Algoritmos
Ao final da disciplina, o aluno será capaz de identificar os aspectos teóricos, técnicos, práticos e
fundamentais para a construção de algoritmos e estará habilitado a propor uma estratégia de solução para
um determinado problema por meio de uma linguagem de programação.
DESCRIÇÃO DO PROGRAMA
Módulos
Conceitos de Programas e Algoritmos
Fluxogramas
Constantes, Variáveis, Tipos e Pseudocódigo
Operadores
Módulos
Estrutura de Condição
Estrutura de Decisão
Estrutura Para
Estrutura Enquanto e Faça-Enquanto
Módulos
Funções de interface e matemática
Funções de cadeia e arquivos
Ponteiros e Recursividade
Lista, Fila e Pilha
CRITÉRIOS DE AVALIAÇÃO
BIBLIOGRAFIA
CONCEITO DE PROGRAMA
Nos dias de hoje o computador passou a ser a principal ferramenta em diversas áreas de trabalho, isso
ocorreu porque o computador é rápido, não cansa e não erra, mas não tem nenhuma iniciativa,
nenhuma criatividade e depende totalmente das instruções e comandos que recebe.
A finalidade do computador é receber, manipular dados e gerar resultados. A simples tarefa de digitar
um texto no Word é um exemplo dessa função: o usuário digita o texto puro, define a formatação, as
margens, insere figuras e, com o auxilio do computador, gera um resultado bem mais apresentável do
que se tivesse que fazer esse texto manualmente.
Outros exemplos como cálculos, ordenação e resumo de informações, são tarefas que o computador
consegue fazer com velocidade e precisão e em bases de dados com milhões de registros. Atividades
que antigamente necessitariam de muitas pessoas ou de muito tempo para concluí-las são rapidamente
realizadas por um único computador.
Como dito anteriormente, as instruções devem ser passadas detalhadamente para o computador e a
forma como essas instruções são passadas se dá através de programas.
Portanto, o programa de computador é uma espécie de idioma usado para repassarmos as ações que o
computador deve executar.
Um programa nada mais é que um tipo de algoritmo, ou seja, é uma sequência finita de ações que
descrevem como um problema pode ser resolvido. Sua particularidade é que suas operações são
específicas para o computador e restritas ao conjunto de instruções que o processador pode executar.
Podemos considerar esse conjunto de instruções como a primeira linguagem de programação do
computador, também chamada de linguagem de máquina.
1
101 – Algoritmos | Unidade 01
02
Desenvolver um programa consiste em processar dados, isto é, recebê-los por um dispositivo de entrada
(teclado, mouse, scanner), realizar operações com os mesmos (processamento) e gerar respostas que
serão expressas em um dispositivo de saída (impressora, monitor) ou guardar os resultados em
dispositivos de armazenamento (disco rígido, pen-driver, CDs).
03
CONCEITO DE ALGORITMO
Segundo Cormen:
Algoritmo é qualquer procedimento computacional bem definido que toma algum valor ou conjunto
de valores como entrada e produz algum valor ou conjunto de valores como saída.
2
101 – Algoritmos | Unidade 01
Em resumo, podemos dizer que algoritmo é um conjunto finito de regras que prevê uma sequência de
operações destinadas à solução de um problema específico.
A importância do algoritmo está no fato de termos de especificar uma sequência de passos lógicos para
que o computador possa executar a tarefa desejada pelo usuário do programa. Lembre-se de que o
computador não tem vontade própria, isto é, faz apenas o que o algoritmo determina.
04
Alguns autores consideram que o algoritmo pode ser considerado a solução de um problema. Mas,
atenção:
Um algoritmo que resolve um problema não pode ser considerado certo ou errado, mas ele pode ser
mais ou menos demorado na resolução do problema. Um algoritmo pode ser especificado em
linguagem comum, como um programa de computador, ou mesmo como um projeto de hardware.
Como exemplo, elencamos o algoritmo para ordenar números, onde tem uma entrada de números (45,
23, 85, 77) e deverá, depois de o algoritmo ser executado, ter uma saída (23, 45, 77, 85) ou seja, um
algoritmo para reordenar a sequência de números.
O melhor algoritmo para uma determinada aplicação depende, entre outros fatores, do número de itens
a serem ordenados, da extensão em que os itens já estão ordenados de algum modo, de possíveis
restrições sobre os valores de itens e da espécie de dispositivo de armazenamento a ser usado: memória
principal, discos ou fitas.
3
101 – Algoritmos | Unidade 01
Ordenamos uma sequência de números pequenos, mas vamos agora citar o exemplo dado por Cormen
sobre o projeto Genoma, que tem como objetivos:
Cada uma dessas etapas exige algoritmos sofisticados. Um algoritmo eficiente pode gerar uma
economia de tempo, dinheiro, tanto humano quanto da máquina, à medida que mais informações
podem ser extraídas.
05
Descrição narrativa
Na descrição narrativa utiliza-se a língua portuguesa para descrever a sequência finita de regras dos
algoritmos.
06
Fluxograma
Os fluxogramas são uma apresentação do algoritmo em formato gráfico. Cada ação ou situação é
representada por uma caixa. Tais caixas são ligadas por setas, que indicam o fluxo
das ações.
4
101 – Algoritmos | Unidade 01
algoritmo e para o seu final, para que o fluxo do algoritmo possa ser determinado do seu princípio até o
seu término. A representação de algoritmos por meio de fluxogramas tem uma série de vantagens, que
serão apresentadas mais adiante.
Uma das buscas da humanidade é desenvolver uma máquina que pense e tome
decisões como o ser humano. Apesar de avanços essa máquina ainda não existe. O
exemplo representado pelo fluxograma acima obtém o nome do usuário e escreve
uma saudação.
Descrição Narrativa
07
Linguagem algorítmica
O pseudocódigo visa a trazer o máximo possível de benefícios, tentando diminuir o ônus da utilização da
linguagem de programação. A ideia é que o pseudocódigo seja um passo intermediário entre a
linguagem natural e a de programação. Ao contrário da linguagem de programação, o pseudocódigo
tem um grau de rigidez sintática intermediária, mas pode utilizar o idioma nativo.
5
101 – Algoritmos | Unidade 01
apresenta uma aceitação grande e tem suas razões para isso. Após a construção do algoritmo em
pseudocódigo, é necessário que mais um passo seja executado para que o algoritmo possa ser
transformado em programa, é necessário que seja transcrito para uma linguagem de programação. É a
transformação do pseudocódigo em código de alguma linguagem de programação real.
Para representarmos nossos algoritmos, utilizaremos uma adaptação do Portugol, que incluirá algumas
construções e mecanismos que julgamos adequados para o melhor aprendizado do programador,
procurando facilitar o processo de construção do algoritmo.
08
Exemplo:
#incluir <biblioteca>
principal( )
inicio
literal Nome;
escreva(“Digite seu nome”);
leia(Nome);
escreva(“Olá “, Nome);
fim
O deslocamento para a direita (identação) de uma instrução significa que esta está subordinada à
instrução anterior. Esse recuo facilita muito a compreensão e manutenção do algoritmo e dos códigos
fontes em uma linguagem de programação.
09
6
101 – Algoritmos | Unidade 01
Descrição Narrativa
Fluxograma
Linguagem Algorítmica
#incluir <biblioteca>
principal( )
inicio
leia(N1, N2);
M N1 * N2;
escreva(“Multiplicação = “, M);
fim
7
101 – Algoritmos | Unidade 01
10
Depois de ter sido realizada a análise do problema (métodos de 1 a 4), pode-se utilizar a descrição
narrativa para descrever a sequência dos passos do algoritmo, depois elaborar o fluxograma para
facilitar o entendimento do fluxo de execução e, por fim, representar o algoritmo em linguagem
algorítmica. Esta sequência permite o melhor entendimento do algoritmo. Com o aperfeiçoamento da
análise de problemas e dependendo da complexidade de um algoritmo, a fase de elaboração da
descrição narrativa e do fluxograma pode ser suprimida.
11
DESCRIÇÃO NARRATIVA
Veja, a seguir, exemplos de utilização da descrição narrativa na construção do algoritmo. As demais
formas de representação serão apresentadas nas próximas unidades.
Exemplo A
8
101 – Algoritmos | Unidade 01
Solução:
12
Exemplo B
Dinheiro é o meio usado na troca de bens, na forma de moedas ou notas (cédulas), usado
na compra de bens, serviços, força de trabalho, divisas estrangeiras ou nas demais
transações financeiras, emitido e controlado pelo governo de cada país, que é o único que
tem essa atribuição.
Solução
9
101 – Algoritmos | Unidade 01
Exemplo C
Solução
13
Exemplo D
Um pneu é um artefato circular feito de borracha, o qual pode ser inflado com ar
ou com água. Utilizado por veículos em geral, como carros de passeio,
caminhões, tratores, bicicletas, carros de mão etc.
Solução
10
101 – Algoritmos | Unidade 01
Exemplo E
Solução
14
REFINAMENTO SUCESSIVO
O refinamento sucessivo de um algoritmo consiste na lapidação do mesmo. Nesta fase, são adicionadas
tarefas antes omitidas. São apresentadas soluções mais bem elaboradas.
Em algoritmo, um problema pode ser resolvido de maneiras diferentes, porém, deve gerar sempre a
mesma resposta.
Exemplo F
11
101 – Algoritmos | Unidade 01
Δ b 2 4ac
ax 2 bx c 0
x b Δ
2a
Solução:
a = 1, b = -5, c = 6
b Δ (5) 1 5 1
x
2a 2.1 2
x1 = 2 ou x2 = 3.
15
Solução:
12
101 – Algoritmos | Unidade 01
Atenção: para uma melhor aprendizagem, antes de clicar sobre cada passo para ver a solução, tente
fazer o seu algoritmo.
Solução:
a = 1, b = -5, c = 7
16
Solução:
PASSO 5: Se o delta for menor do que zero, informe que não existem raízes reais.
13
101 – Algoritmos | Unidade 01
17
RESUMO
Neste módulo apresentamos os conceitos básicos de programa, a importância do programa como
ferramenta para execução de atividades. Apresentamos também os conceitos básicos de algoritmo, suas
características e sua importância para o desenvolvimento de programas. Descrevemos as técnicas e
métodos que auxiliam na análise e resolução de algoritmos, os quais devem seguir os passos:
SIMBOLOGIA
O fluxograma é uma forma universal de representação, pois se utiliza de figuras geométricas para
ilustrar os passos a serem seguidos para a resolução dos problemas. Também é chamado de diagrama
de blocos.
14
101 – Algoritmos | Unidade 01
O fluxograma é utilizado para organizar o raciocínio lógico a ser seguido para a resolução de um
problema ou para definir os passos para a execução de uma tarefa, dentro das estruturas sequenciais,
de decisão ou de repetição. Cada ação ou situação é representada por uma caixa. Tomadas de decisões
são indicadas por caixas especiais, possibilitando ao fluxo de ações tomar caminhos distintos.
02
ESTRUTURAS DE CONDIÇÃO
Num processo geral de execução de um algoritmo implementado, a execução começa na primeira linha
e vai avançando sequencialmente, executando o código, linha após linha, até chegar no final.
Entretanto, frequentemente surge a necessidade de colocar instruções dentro de um programa, as quais
só serão executadas caso alguma condição específica aconteça. Para esta finalidade, a maioria das
linguagens dispõe de estruturas de condição para realizar esta tarefa, o que pode variar de acordo com
a característica de cada linguagem.
15
101 – Algoritmos | Unidade 01
O exemplo a seguir mostra um algoritmo utilizando fluxograma para ler dois números e apresentar no
vídeo a soma entre eles. Ao lado do fluxograma, inserimos a simbologia, de modo que você possa
identificar cada etapa do fluxo e habituar-se ao uso dos símbolos.
FLUXOGRAMA:
03
ESTRUTURAS DE DECISÃO
A estrutura de decisão permite que, durante o processamento, o algoritmo possa decidir qual será a
próxima ação, entre uma ou mais opções, dependendo do valor lógico de um determinado teste
(condição).
É uma expressão que deverá retornar um valor de verdadeiro (V) ou de falso (F), e caso o resultado
dessa expressão seja verdadeiro, será executado o bloco de comandos que está dentro da estrutura.
Caso seja falso, a execução do programa ignora o bloco de comando e continua na linha seguinte à
estrutura de condição.
se <expressão-lógica> então:
<bloco de comandos>
fim-se
16
101 – Algoritmos | Unidade 01
04
O exemplo a seguir mostra um algoritmo utilizando fluxograma para ler dois números e apresentar a
soma entre eles se o primeiro for maior, se o segundo número for maior, é feita a multiplicação desses
números.
O fluxo com a identificação V executa caso o teste seja verdadeiro. Caso o teste resulte em falso, o
fluxograma executa a outra parte do algoritmo.
17
101 – Algoritmos | Unidade 01
E se os números forem iguais, qual fluxo será executado? Qual é o resultado do teste A>B, verdadeiro ou
falso?
Resposta
05
Estruturas de decisão podem ser encadeadas. Por exemplo, se o usuário desejar escolher uma opção
entre várias.
18
101 – Algoritmos | Unidade 01
Resposta
Resposta: O fluxograma mostra a mensagem “Digite uma opção válida” e volta para a tela inicial.
06
ESTRUTURAS DE REPETIÇÃO
A estrutura de repetição permite que durante o processamento, o algoritmo repita uma mesma tarefa
um número determinado de vezes.
19
101 – Algoritmos | Unidade 01
No fluxo anterior, N funciona como um contador de passos, após a exibição da mensagem, N passa a ter
seu valor acrescido de 1 (NN+1), por isso, quando N for maior que 100, a expressão N<=100 será falsa
e o fluxograma vai para o fim.
07
As estruturas de repetição permitem que os passos sejam executados por uma determinada quantidade
de vezes ou até que se obtenha uma determinada condição.
No exemplo a seguir a mensagem “Devo estudar Algoritmo” será exibida até que o usuário escolha a
opção Não.
20
101 – Algoritmos | Unidade 01
08
No exemplo a seguir a mensagem “Devo estudar Algoritmo” será exibida por quantas vezes o usuário
informar.
As estruturas de decisão e repetição serão explicadas com mais detalhes na próxima unidade quando
serão aplicadas nos algoritmos.
21
101 – Algoritmos | Unidade 01
09
CONECTORES
Os conectores são usados quando o algoritmo se torna extenso e sua representação fica complexa.
Nestes casos o conector é usado para ligar diversas partes do fluxograma.
22
101 – Algoritmos | Unidade 01
10
RESUMO
Neste módulo apresentamos o Fluxograma ou Diagrama de Blocos como forma de representação do
algoritmo, sua finalidade e o significado dos símbolos. Explicamos também a função de cada símbolo
mostrando alguns exemplos. As estruturas de decisão, que podem ser simples e compostas, e as
estruturas de repetição (que permitem que os passos sejam executados por uma determinada
quantidade de vezes ou até que se obtenha uma determinada condição), com e sem blocos de
comando, também foram demonstradas e exemplificadas, os exemplos mostram em quais situações
cada estrutura pode ser utilizada. Foi mostrada ainda a importância da utilização dos conectores para
organizar fluxogramas extensos visando facilitar sua visualização. Com essas informações é possível
representar um algoritmo de forma gráfica com o objetivo de facilitar o entendimento e a visualização
da ordem de execução dos passos do algoritmo.
Uma constante é quando seu valor não se altera ao longo do tempo em que o algoritmo é executado,
23
101 – Algoritmos | Unidade 01
Um dado que pode ter seu valor alterado durante a execução do programa é tido como uma variável.
Uma constante tem valor fixo e inalterável, podendo ser um caractere, uma cadeia de caracteres ou um
número:
Uma constante muito comum no meio matemático e, por consequência, no meio computacional, é o
número π = 3,141592...
02
CONSTANTE GRAVITACIONAL
Normalmente uma pessoa diz que está pesando 60 quilos, no entanto, o que ela quer dizer é que sua
massa é de 60 quilos.
Peso é uma força que é calculada pela massa multiplicada pela aceleração gravitacional da Terra.
Neste caso a constante gravitacional é utilizada para saber qual a força que um corpo de 60 Kg exerce
na superfície do planeta Terra. O cálculo do peso é feito através da fórmula:
24
101 – Algoritmos | Unidade 01
Peso = Massa * g;
onde g = 9,78 m/s²
03
Uma variável representa a posição da memória do computador. Um algoritmo recebe dados que
precisam ser armazenados no computador, para que sejam utilizados no processamento. O
armazenamento de dados é feito na memória do computador.
A variável possui nome e tipo, além disso, o conteúdo que ela armazena pode variar ao longo do tempo,
durante a execução de um programa.
04
TIPOS DE DADOS
Para otimizar os recursos computacionais disponíveis e acelerar o processamento das informações, é
necessário que os dados sejam armazenados no computador de acordo com o tipo de informação que
se desejar disponibilizar, bem como o tipo de operação que será executada. Assim, os dados são
representados pelas informações a serem processadas por um computador.
A seguir são definidos os tipos de dados mais comuns encontrados na maioria das linguagens de
programação.
numérico,
lógico e
literal ou caractere.
Dado numérico
25
101 – Algoritmos | Unidade 01
05
Dado lógico
Os dados lógicos também são chamados de dados booleanos. Podem assumir os valores lógicos
verdadeiro ou falso. Os dados lógicos, quando armazenados na memória do computador ocupam um
byte.
Os dados lógicos assumem os valores lógicos definidos pela Lógica Matemática, isto é, pelo princípio da
não contradição e pelo princípio do terceiro excluído.
Segundo o princípio da não contradição, uma proposição não pode ser verdadeira e falsa ao mesmo
tempo. E pelo princípio do terceiro excluído, não há uma terceira opção para que a proposição assuma.
Sendo assim, ou a proposição assume o valor lógico VERDADEIRO ou assume o valor lógico FALSO.
V ou Verdadeiro
F ou Falso
26
101 – Algoritmos | Unidade 01
Para saber mais sobre os princípios da não contradição e do terceiro excluído, acesse
http://www.academia.edu/3658762/Principios_de_identidade_nao-contradicao_e_terceiro_excluido
06
Dado literal
O dado literal ou caractere é formado por um único caractere ou por uma cadeia de caracteres.
Os dados literais podem ser as letras maiúsculas, as letras minúsculas, os números (não podem ser
usados para cálculo) e os caracteres especiais (&, #, @, ?, +). O dado literal quando armazenado na
memória do computador, ocupa 1 byte para cada caractere.
Agora, observe na tabela abaixo, alguns exemplos de tipos de dados, incluindo o dado literal.
07
27
101 – Algoritmos | Unidade 01
08
28
101 – Algoritmos | Unidade 01
Exemplo 1
Resposta:
Dados de entrada:
Valor de capital
Taxa de juros
Prazo, em meses
Dados de Saída:
Prestação
09
Exemplo 2
Resposta:
Dados de entrada:
Valor bruto
Percentual de Desconto
29
101 – Algoritmos | Unidade 01
Dados de Saída:
Valor Líquido
Exemplo 3
Resposta:
Dados de entrada:
Número real
Dados de Saída:
Quadrado do número real
10
Exemplo 4
Resposta:
30
101 – Algoritmos | Unidade 01
Dados de entrada: A e B
Dados de Saída: R
11
Exemplos de palavras reservadas em um pseudocódigo: inicio, declare, fim, literal, real, se, senão, entre
outras.
Exemplos de palavras reservadas da linguagem de programação C: case, char, if, else, entre outras.
Os identificadores são os nomes das variáveis, dos programas, das constantes, das funções e dos
procedimentos.
1) Caracteres que podem ser utilizados: números, letras maiúsculas, letras minúsculas e o
caractere sublinhado.
2) Primeiro caractere deve ser sempre uma letra ou o caractere sublinhado.
3) Não são permitidos os espaços em branco e caracteres especiais (@, $, +, -, %, !).
4) Não se pode utilizar palavras reservadas.
Exemplos:
31
101 – Algoritmos | Unidade 01
12
PSEUDOCÓDIGO – PORTUGOL
O pseudocódigo é um padrão textual de representação de um algoritmo, pode ser denominado também
de português estruturado ou Portugol.
Seus comandos e operações são semelhantes aos da linguagem de programação, o que facilita o
entendimento da estrutura desses comandos e ajuda a traduzir o código para a linguagem de
programação.
32
101 – Algoritmos | Unidade 01
As unidades que seguem utilizarão em seus exemplos o padrão da linguagem algorítmica PORTUGOL. O
PORTUGOL foi desenvolvido com o intuito de aproximar o aluno da linguagem C, ainda durante a fase
inicial do aprendizado, evitando dificuldades de aprendizagem com as diferenças entre as sintaxes do C
e do PORTUGOL.
13
Sintaxe:
Fluxograma:
14
33
101 – Algoritmos | Unidade 01
Pode-se considerar as variáveis como “apelidos” para endereços de memória que armazenam dados.
Todas as variáveis de um programa C devem ser declaradas antes de serem usadas para que seja
alocada memória para as mesmas.
As variáveis são declaradas conforme os tipos de dados utilizados (numérico, literal ou lógico). Ao longo
do desenvolvimento do programa e do algoritmo, o dado será manipulado através do nome do seu
identificador, que poderá ser uma constante ou uma variável. Assim, o primeiro passo para utilizarmos
os dados é a nomeação do seu identificador e a definição do seu tipo ou do seu valor. A definição dos
dados em algoritmos também é conhecida como declaração.
Um identificador, variável ou constante, declarado com um determinado tipo de dados ficará restrito a
armazenar valores daquele tipo específico (inteiro, real, caractere, lógico).
Na maioria dos casos, se houver uma tentativa de atribuir a um identificador um tipo diferente daquele
para o qual ele foi definido, o sistema não irá funcionar adequadamente.
var
ano: inteiro;
preco: real;
vendido: lógico;
constante
PI=3.141592654;
MAXIMO=100;
15
Como já vimos, para que os programas manipulem valores, estes devem ser armazenados em variáveis e
para isso, devemos declará-las de acordo com a sintaxe:
NomeVariável : Tipo
Ex.: VARIÁVEIS
34
101 – Algoritmos | Unidade 01
VARIÁVEIS é a palavra chave, que deverá ser utilizada uma única vez na definição das variáveis e
antes do uso das mesmas;
Variáveis de tipos diferentes deverão ser declaradas em linhas diferentes;
Em uma mesma linha, quando quisermos definir variáveis de mesmo tipo, deveremos usar o
símbolo de vírgula (,) para separar as mesmas.
Não se deve esperar para declarar variáveis quando precisar delas; isto pode confundir um
programador imprudente e embaralhar o escopo do código.
Não se deve declarar variáveis locais com nomes iguais a de outras variáveis de nível superior.
Exemplo A
Solução
Solução:
inteiro A;
Exemplo B
Solução
Solução:
real B;
35
101 – Algoritmos | Unidade 01
16
RESUMO
Neste módulo vimos que, dentro de um algoritmo, podemos encontrar basicamente duas classes
diferentes de dados: constantes e variáveis. Foram apresentados os seus e a sua aplicação dentro de um
algoritmo, detalhados os tipos de dados das variáveis: numérico, lógico e literal, conceituadas e
exemplificadas as variáveis de entrada e saída nos algoritmos. As regras de identificação das variáveis
foram apresentadas. Vimos que o pseudocódigo é um padrão textual de representação de um
algoritmo, e pode ser denominado também de português estruturado ou Portugol. Foi demonstrada a
sua estrutura básica e foi descrita e exemplificada a estrutura inicial que é a declaração de variável. Com
estes conceitos é possível definir as constantes e variáveis de entrada e saída, e iniciar a construção de
um algoritmo com a declaração de variáveis.
OPERADOR DE ATRIBUIÇÃO
A operação de atribuição permite que se forneça um valor numérico, literal ou lógico ou, ainda, um
valor numérico de uma expressão a uma variável. O comando de atribuição é representado pelo símbolo
“”.
Como pode ser visto abaixo, no lado esquerdo do operador será colocado o nome da variável que irá
receber o valor, e do lado direito o valor que será armazenado na mesma. A seguir são apresentados
alguns exemplos de atribuições de valores a variáveis:
TipoVeiculo carro;
Cor Azul;
Sintaxe:
variável expressão
36
101 – Algoritmos | Unidade 01
#incluir <biblioteca>
principal( )
inicio
inteiro x;
literal y[4];
lógico teste;
x 4;
x x + 2;
y “aula”;
teste falso;
bloco_de_comandos;
fim
02
#incluir <biblioteca>
principal( )
inicio
inteiro A, B, C;
A 10;
B 5;
C 1;
A B – C;
B A + C;
C A – B;
A A + C – B;
C B – C;
B A + C – B;
escreva(A, B, C);
fim
37
101 – Algoritmos | Unidade 01
Resposta
Resposta:
A = –2; B = –1, C = 6)
03
COMANDO DE ENTRADA
Os algoritmos necessitam receber informações de fora do próprio algoritmo, a partir da entrada padrão
(em geral, o teclado). Ferrari cita o exemplo de um sistema de locadora: sempre que alugamos um filme,
o sistema irá necessitar de algumas informações, como o nosso código de cliente (ou o nome) e o nome
da fita que estamos locando. Essas informações são fornecidas pelo sistema a partir de comandos de
entrada de dados.
Para realizarmos a entrada de dados utilizaremos o comando leia. Ao utilizar o comando leia, o
programador deve saber de antemão qual a variável que irá armazenar o valor que será fornecido pelo
usuário. No caso do exemplo, os valores que seriam fornecidos pelo usuário são referentes ao código do
cliente e ao nome da fita que o mesmo está locando. Sendo assim, é necessário declarar variáveis que
possam armazenar valores que sejam compatíveis com as informações solicitadas ao usuário. Saiba+
Os cálculos do computador são de pouco valor a não ser que, primeiro, se possa fornecer os dados sobre
os quais estes cálculos serão efetuados e, segundo, se for possível visualizar os resultados destes
cálculos.
a) A = –2, B = –1, C = 6.
b) A = –3, B = –2, C = –1
O comando de entrada é utilizado para receber os dados digitados pelo usuário, por meio de um
dispositivo de entrada (teclado, mouse, monitor). Os dados recebidos são armazenados em variáveis,
conforme os tipos que os comportem. O comando de entrada é representado pela palavra LEIA.
Sintaxe:
leia(nome_variável);
leia(variável-1, variável-2, ..., variável-n);
Saiba+
Por exemplo, a informação do código do cliente pode ser um valor do tipo inteiro, então é necessário
38
101 – Algoritmos | Unidade 01
que declaremos no algoritmo uma variável desse tipo. Seguindo esse mesmo raciocínio, a informação do
nome da fita pode ser uma informação do tipo caractere, sendo também necessário que declaremos no
algoritmo uma outra variável para receber essa informação.
04
COMANDO DE SAÍDA
O comando de saída é utilizado para apresentar ao usuário perguntas necessárias ao processamento e
respostas obtidas com o mesmo, nos dispositivos de saída (monitor, impressora). As informações
apresentadas ao usuário podem ser conteúdos de variáveis ou mensagens. O comando de saída é
representado pela palavra ESCREVA.
Sintaxe:
escreva(“mensagens”);
escreva(nome_variável);
escreva(“mensagens”, nome_variável);
Observe os exemplos a seguir. Tente fazer o que se pede e somente depois clique para ver a resposta.
Exemplo 1
39
101 – Algoritmos | Unidade 01
05
Exemplo 2
Elaborar um algoritmo que recebe três números reais some os dois primeiros e
multiplique o resultado pelo terceiro, utilize fluxograma e linguagem
algorítmica.
40
101 – Algoritmos | Unidade 01
Sintaxe:
// Lembrete
06
41
101 – Algoritmos | Unidade 01
Durante a execução de uma expressão que envolve vários operadores, deve-se seguir uma ordem de
prioridades, caso contrário, corre-se o risco de obter valores que não representem o resultado
esperado.
07
Exemplo A
42
101 – Algoritmos | Unidade 01
08
Exemplo B
n1p1 n 2 p 2 n 3p3
Mp
p1 p 2 p3
43
101 – Algoritmos | Unidade 01
09
ORDEM DE PRECEDÊNCIA
Quando uma expressão aritmética precisa ser avaliada num algoritmo, o analisador processa a
expressão dando prioridade para certos operadores.
A tabela a seguir apresenta a ordem de prioridade dos operadores numa expressão aritmética, chamada
de precedência de operadores.
Conforme o quadro acima, as primeiras subexpressões a serem resolvidas serão aquelas embutidas em
parênteses mais internos, em seguida, as potências, depois as multiplicações e divisões, e assim por
diante, seguindo a ordem.
Dica
A maneira mais fácil de verificar a ordem de execução das operações numa expressão aritmética é
44
101 – Algoritmos | Unidade 01
seguir os parênteses, sendo que eles são executados antes de tudo, a partir dos mais internos para os
mais externos.
10
Exemplo:
Qual operador devo utilizar para descobrir se um número é par ou impar? Exemplifique.
Solução:
Para fixar bem a ordem de prioridade dos operadores, efetue as expressões abaixo e clique em
“Resposta” para verificar se você acertou.
Resposta a
Resposta: 9.
b) 4 + 5 * 9 – 12 / 3;
Resposta b
Resposta: 45.
c) 40 / 8 + 2 * (5 – 11 MOD 3);
Resposta c
Resposta: 11.
45
101 – Algoritmos | Unidade 01
Resposta d
Resposta: -2.
e) A = 1, B = 2, C = 3, D = 4;
A 40 * B MOD C;
C A * 10 – 5 DIV D;
escreva(A, B, C, D);
Resposta e
Resposta: 2, 2, 19, 4.
11
OPERADORES RELACIONAIS
Os operadores relacionais são utilizados para comparar duas variáveis.
Exemplo:
#incluir <biblioteca>
principal()
46
101 – Algoritmos | Unidade 01
inicio
inteiro A, B, C, D, R;
A 1; B 2; C 3;
escreva(“Digite D”);
leia(D);
se (D + A < C + 4)
R A + B + C + D;
senão
R A – B + C – D;
fim
Solução
Solução:
D+A=3+1=4
C+4=3+4=7
(4 < 7) verdade
R=1+2+3+3=9
Solução
Solução:
D + A = 10 + 1 = 11
C+4=3+4=7
(11 < 7) falso
R = 1 – 2 + 3 – 10 = – 8.
12
OPERADORES LÓGICOS
© 2014 - AIEC - Associação Internacional de Educação Continuada
47
101 – Algoritmos | Unidade 01
As proposições podem ser simples ou compostas. As simples possuem um único sentido completo
enquanto as compostas dois ou mais.
A palavra que une as proposições simples para formar as compostas é denominada conectivo. Os
principais conectivos são: e (^), ou (v), não (~), se... então (), se somente se ().
Tabelas-verdades fundamentais
Exemplo:
Em um triângulo retângulo, o quadrado da medida da hipotenusa é igual à soma dos quadrados das
medidas dos catetos.
13
48
101 – Algoritmos | Unidade 01
Exemplo
A expressão acima verifica se todos os itens estão no carro para continuar a execução da troca de pneu.
Se um dos itens for Falso, a expressão toda se torna falsa, portanto, impossibilitando a continuidade do
processo de troca de pneu. Isso acontece porque o conector utilizado foi o “e”.
Significa que se um dos pneus estiver furado, a expressão será verdadeira. Inclusive se os dois estiverem
furados, a expressão também será verdadeira.
14
a 30, b 40 e c 80
a > 30 e c = 80 Falso
O valor de a é 30, portanto, a expressão "a é maior que 30" é falsa. O valor de c é 80, portanto, a
expressão "c é igual a 80" é verdadeira. No entanto, a conjunção "e" resulta verdadeira apenas se todas
as expressões resultarem verdadeiras, nesse caso, portanto, o resultado é falso.
a != 20 ou b <= 50 Verdadeiro
O valor de a é 30. A expressão “a é diferente de 30” é verdadeira. A expressão “b é menor ou igual a 50”
é falsa, pois b tem o valor atribuído de 40. Porém a disjunção “ou” resulta verdadeira se pelo menos
uma das expressões resultar verdadeira, por isso o resultado final é verdadeiro.
49
101 – Algoritmos | Unidade 01
a != b e b = c Falso
A expressão “a é maior que b” é falsa. A expressão “b é maior que 50” é falsa. Portanto, o resultado é
falso, já que para a disjunção “ou”, todas as expressões tem que ser falsas para o resultado ser falso.
A expressão “c é maior que 20” é verdadeira, pois o valor de c é 80. A expressão “a é menor que b”
também é verdadeira. Na disjunção “ou” basta uma das expressões ser verdadeira para o resultado ser
verdadeiro, nesse caso, ambas são verdadeiras, o que também resulta em verdadeiro.
15
Em resumo, podemos concluir que a conjunção “e” será falsa se pelo menos uma das expressões for
falsa e somente será verdadeira se todas forem verdadeiras.
A disjunção “ou” será falsa se todas as expressões forem falsas e será verdadeira se pelo menos uma for
verdadeira. A operação de negação sempre irá inverter o valor da expressão.
A disciplina Lógica Matemática mostra detalhadamente a aplicação dos operadores lógicos e das tabelas
verdade.
50
101 – Algoritmos | Unidade 01
RESUMO
Neste módulo foram apresentados os operadores utilizados para manipular os dados em um algoritmo.
Vimos que a operação de atribuição permite que se forneça um valor numérico, literal ou lógico ou,
ainda, um valor numérico de uma expressão a uma variável. Estudamos também os operadores de
entrada e saída, que são utilizados para atribuir valores de entrada e mostrar valores de saída nos
algoritmos. Foram apresentados os operadores aritméticos que manipulam os valores numéricos, os
operadores relacionais que comparam valores e os operadores lógicos que comparam expressões
lógicas. Com esses conhecimentos é possível manipular valores e variáveis e compará-las logicamente.
51
101 – Algoritmos | Unidade 02
1 - ESTRUTURAS DE CONDIÇÃO
Nos módulos anteriores foram apresentados alguns conceitos básicos sobre as estruturas e comandos
que são utilizados para construir um algoritmo simples. Entretanto, as possibilidades de construção de
algoritmos que temos até o presente momento são bastante limitadas, pois ainda não estamos aptos
a tomar decisões durante o tempo de execução do algoritmo, ou até mesmo de classificar
determinados valores de variáveis. Evoluiremos o módulo apresentando algumas estruturas de
condição.
• Estrutura de condição se-entao
se<expressão> então
<comandos>
fim-se
A estrutura de condição, que inicia e finaliza com as palavras se e fim-se, contém uma expressão que
deverá retornar um valor verdadeiro (V) ou de falso (F), e caso o resultado dessa expressão seja
verdadeiro, serão executados os comandos que estão dentro da estrutura. Caso seja falso, a execução
do programa ignora os comandos contidos dentro da expressão e continua na linha seguinte da
estrutura de condição.
Os comandos são sequência de códigos que serão executados até o fim-se, caso seja verdadeira a
expressão.
02
Alguns exemplos de expressões lógicas já foram vistos anteriormente, a seguir temos mais alguns
exemplos:
1
101 – Algoritmos | Unidade 02
03
Essa estrutura de condição oferece a possibilidade de executarmos uma determinada ação ou comando
se o resultado da expressão for verdadeiro ou falso. Para essas situações é utilizado o comando senão,
como mostrado nos exemplos abaixo.
se<expressão> então
<comandos>
Senão
<comandos>
fim-se
Exemplo no fluxograma
2
101 – Algoritmos | Unidade 02
04
Dentro de uma estrutura se-então-senão é perfeitamente possível utilizarmos mais de uma linha de
comando, ou até mesmo outras estruturas se-então-senão. Existem situações em que os caminhos para
a tomada de uma decisão acabam formando uma espécie de árvore com ramificações diversas, onde
cada caminho é um conjunto de ações. Nesses casos podemos recorrer à utilização de várias estruturas
se-então-senão embutidas umas dentro das outras, comumente chamadas de ninhos.
Exemplo:
05
Nas estruturas de decisão encadeadas, uma estrutura de condição é aninhada dentro de outra. Para que
as condições internas sejam executadas é necessário que seja “Verdadeira” a condição de fora.
3
101 – Algoritmos | Unidade 02
Exemplo no fluxograma
06
Outra forma para trabalhar com comandos condicionados a um determinado valor é a estrutura caso
seja. Nessa estrutura o valor de uma determinada variável é avaliado e caso esse valor coincida com
determinado valor pré-estabelecido um determinado comando é executado. A estrutura de condição
caso é utilizada da forma mostrada a seguir:
4
101 – Algoritmos | Unidade 02
fim-se
07
2 - TESTE DE MESA
O teste de mesa ou chinês é um teste feito manualmente, analisando o algoritmo, com valores
que possam testar as suas diversas condições para que depois os resultados sejam comparados
com a execução do programa no computador. Havendo qualquer divergência entre os
resultados, o algoritmo deve ser analisado.
5
101 – Algoritmos | Unidade 02
08
Dadas duas variáveis a e b, inicialmente com valores v1 e v2, respectivamente, crie um algoritmo que
atribua o valor v2 à variável a e o valor v1 à variável b.
Suponhamos que sua primeira proposta de solução se pareça com o algoritmo a seguir:
Algoritmo 1
01 programa
02 var a, b: inteiro
03 //inicialização das variáveis
04 a ← v1
05 b ← v2
06 // troca dos valores das variáveis
07 a ← b
08 b ← a
09 fim
Analisando esse algoritmo, vejamos se ele produz o efeito desejado: perceba que a instrução da linha 7
altera o valor de a para v2, de forma que a atribuição da linha 8 não muda o valor armazenado em b,
pois depois da linha 7 o valor de a ficou igual ao valor de b. Isso pode ser visto em detalhes no teste de
mesa, onde omitimos as linhas de comentário, pois essas não afetam a execução:
6
101 – Algoritmos | Unidade 02
Uma possível solução para esse problema é dada pelo algoritmo seguinte:
Algoritmo 2
01 programa
02 var a, b, aux: inteiro
03 //inicialização das variáveis
04 a ← v1
05 b ← v2
06 //troca dos valores das variáveis
07 aux ← a
08 a ← b
09 b ← aux
10 fim
Neste algoritmo, introduzimos a variável aux, responsável por armazenar o valor original de a,
permitindo que o acessemos mesmo depois da troca do valor de a. Esse é o procedimento padrão
utilizado para troca dos valores de duas variáveis. Veja, a seguir, o teste de mesa para esse novo
algoritmo:
Teste de mesa do Algoritmo 2.
Dessa forma, ao final do algoritmo a variável a tem valor v2 e a variável b tem valor v1, conforme
desejado.
7
101 – Algoritmos | Unidade 02
09
Perceba como o teste de mesa torna a análise do algoritmo mais clara, ajudando o programador a
identificar falhas. O teste de mesa pode ser adaptado de acordo com o problema tratado, portanto,
utilize o esquema proposto como um guia geral e ajuste-o quando necessário.
Exemplo 2
#incluir <biblioteca>
principal()
início
real idade, R;
escreva(“Digite a idade”);
leia(idade);
se (idade >= 18)
escreva(“Maior de idade”);
fim
10
Para fixar bem o teste de mesa, clique para assistir ao vídeo abaixo.
https://www.youtube.com/watch?v=CUKuXzka_Xs
11
Agora faça o teste de mesa do algoritmo a seguir e clique no link para ver o resultado.
Exemplo 3
8
101 – Algoritmos | Unidade 02
#incluir <biblioteca>
principal()
início
real N, R;
escreva(“Digite um número”);
leia(N);
R ← N;
se (N > 30)
R ← 5*N;
escreva(R);
fim
Teste de mesa
12
Exemplo 4
Vamos exercitar! Faça o algoritmo e o teste de mesa. Somente depois, clique para ver o resultado.
9
101 – Algoritmos | Unidade 02
Algoritmo
Solução:
#incluir <biblioteca>
principal()
início
real N, R;
escreva(“Digite um número”);
leia(N);
R ← N;
se (N >= 50)
R ← N/2;
escreva(R);
fim
Teste de mesa
13
Exemplo 5
Algoritmo:
#incluir <biblioteca>
principal()
início
real N, R;
escreva(“Digite um número”);
leia(N);
10
101 – Algoritmos | Unidade 02
R &larr N;
se (N > 90 && N < 100)
R ← 2*N;
escreva(R);
fim
Teste de mesa
14
Exemplo 6
Algoritmo
#incluir <biblioteca>
principal()
início
real N, R;
escreva(“Digite um número”);
leia(N);
R ← N;
se (N < 50 || N > 1000)
R ← N/5;
escreva(R);
fim
11
101 – Algoritmos | Unidade 02
Teste de mesa
15
3 - INTERPRETAÇÃO
Exemplo 7
12
101 – Algoritmos | Unidade 02
Algoritmo Fluxograma
#incluir <biblioteca>
principal()
início
real N, R;
escreva(“Digite um
número”);
leia(N);
R ← N;
se (N mod 2 = 1)
inicio
escreva(“O
número é ímpar”);
R ← 5*N;
fim
escreva(R);
fim
16
Exemplo 8
Analise o exemplo abaixo e, com os valores de entrada, verifique o resultado final do algoritmo.
Algoritmo
#incluir <biblioteca>
principal()
início
inteiro A, B, C, D;
leia(A);
leia(B); Teste de mesa
leia(C);
leia(D);
se (A < B || B < D)
inicio
A ← B * C – D;
13
101 – Algoritmos | Unidade 02
B ← A – C * D;
C ← B – A * D;
D ← A + B * C – D;
A ← A * (D – C + B);
fim
escreva(A, B, C, D);
fim
17
Agora é sua vez. Tente resolver o que se pede e, em seguida, clique para verificar se você acertou.
Exemplo 9
Verifique o resultado final do algoritmo do exemplo anterior se a linha “se (A < B || B < D)” for
substituída por “se (A < B && B < D)”.
Teste de mesa
Exemplo 10
14
101 – Algoritmos | Unidade 02
Algoritmo
Teste de Mesa
Teste de mesa
Algoritmo
#incluir <biblioteca>
principal()
inicio
inteiro a, b, aux;
limpatela();
escreva(“Digite os Números: “);
leia(a,b);
se (a < b)
inicio
aux ← a;
a ← b;
b ← aux;
fim
escreva(“Ordenados: “, b, a);
fim
15
101 – Algoritmos | Unidade 02
Teste de mesa
18
RESUMO
Neste módulo aprofundamos mais nas estruturas de condição. Esses comandos fazem parte das técnicas
de programação que conduzem a estruturas de programas que não são totalmente sequenciais. Com as
instruções de DESVIO pode-se fazer com que o algoritmo proceda de uma ou outra maneira, de acordo
com as decisões lógicas tomadas e nos resultados anteriores. As principais estruturas de condição
apresentadas são: “se então”, “se então senão” e “caso seja”.
Outro aprendizado que tivemos foi o Teste de Mesa, muito chamado de chinês. No qual o usuário pode
executar manualmente o algoritmo proposto, seguindo as instruções do algoritmo de maneira precisa
para verificar se o procedimento utilizado está correto ou não, escrevendo todas as variáveis e
resultados em uma tabela.
1 - ESTRUTURAS DE DECISÃO
Vimos nos módulos anteriores o conceito de estruturas de condição. Neste módulo aprofundaremos
mais apresentando os tipos de decisões que fazem parte do dia a dia dos algoritmos e dos programas.
16
101 – Algoritmos | Unidade 02
Sintaxe
se (condição)
comando_1;
senão
comando_2;
Interpretação
02
Exemplo 1
Linguagem algorítmica
#incluir <biblioteca>
principal()
início
real idade, R;
escreva(“Digite a idade”);
leia(idade);
se (idade >= 18)
17
101 – Algoritmos | Unidade 02
escreva(“Maior de idade”);
senão
escreva(“Menor de idade”);
fim
03
Exemplo 2
18
101 – Algoritmos | Unidade 02
Linguagem algorítmica
Fluxograma
#incluir <biblioteca>
principal( )
inicio
real a,b,c;
escreva(“Digite as 3 alturas: “);
leia(a,b,c);
se ((a > b)&&(a > c))
escreva("O Maior mede: ",a);
senão
se (b > c)
escreva("O Maior mede: ",b);
senão
escreva("O Maior mede: ",c);
fim
Teste de Mesa
04
19
101 – Algoritmos | Unidade 02
Sintaxe
se (condição)
início
comando1;
comando2;
fim
senão
início
comando3;
comando4;
fim
05
2 - INTERPRETAÇÃO
Observações:
• Os recuos devem ser usados sempre que se escrever um bloco de comandos, ou seja, após o
símbolo início, as instruções seguintes devem estar recuadas (à direita) de um ou mais espaços. O
símbolo fim, que termina o conjunto de instruções, deve estar alinhado ao início correspondente.
• O compilador sempre associa um senão ao se anterior mais próximo que ainda não possui um senão.
20
101 – Algoritmos | Unidade 02
06
A estrutura de decisão se-senão pode ser utilizada na implementação da solução das equações
polinomiais do 2º e 3º grau. Veja a seguir.
Exemplo 3
Fluxograma
Algoritmo
#incluir<biblioteca>
principal()
inicio
inteiro a,b,c,x1,x2,delta;
escreva("Digite a, b, c:");
leia(a,b,c);
delta ← (b*b)-(4*a*c);
se (delta >= 0)
inicio
x1 = (-b - raiz(delta))/(2*a);
x2 = (-b + raiz(delta))/(2*a);
escreva("As raízes sao: “,x1,x2);
fim
senão
escreva("Não existe raízes reais”);
fim
07
A estrutura de decisão se-senão também pode ser utilizada na elaboração de um menu de opções. No
entanto, no próximo tópico veremos um comando melhor para a realização desta ação.
Exemplo 4
21
101 – Algoritmos | Unidade 02
Linguagem algorítmica
#incluir <biblioteca>
principal()
inicio
inteiro x;
escreva("1. Inclusao");
escreva("2. Alteracao");
escreva("3. Exclusao");
escreva("Digite sua opção: ");
leia(x);
se (x = 1) escreva("Escolheu inclusao\n");
se (x = 2) escreva("Escolheu alteracao\n");
se (x = 3) escreva("Escolheu exclusao\n");
se (x != 1 && x != 2 && x != 3) escreva("Opção invalida\n");
fim
08
3 - Comando Escolha
Diversas vezes é necessário escolher uma opção que se encontra numa lista de um menu. O
comando escolha() aparece como a melhor opção para esta necessidade.
Sintaxe
escolha (variável)
inicio
caso 1:
bloco de
comandos;
interrupção;
caso 2:
bloco de
comandos;
22
101 – Algoritmos | Unidade 02
interrupção;
caso 3:
bloco de
comandos;
interrupção;
dúvida:
bloco de
comandos;
fim
Uma variável é testada sucessivamente contra uma lista de variáveis inteiras ou de caracteres. Depois
de encontrar uma coincidência, o bloco de comandos correspondente é executado. Se nenhuma
coincidência for encontrada, o bloco de comandos do caso dúvida será executado.
O comando interrupção é opcional e por isto, se for suprimido, permite que o próximo “caso” seja
executado, sem haver qualquer quebra na sequência do processamento. Observa-se que não é
necessário utilizar o comando início e o comando fim para delimitar o bloco de comandos.
09
Agora é sua vez. Faça o que se pede nos exemplos a seguir e depois verifique se você acertou.
Exemplo 5
23
101 – Algoritmos | Unidade 02
Linguagem algorítmica
Exemplo 6
Linguagem algorítmica
Fluxograma
Linguagem algorítmica:
#incluir <biblioteca>
principal()
inicio
inteiro x;
escreva("1. Inclusao");
escreva("2. Alteracao");
escreva("3. Exclusao");
escreva("4. Sair");
escreva("Digite sua opção: ");
leia(x);
escolha (x)
inicio
caso 1: escreva(“Escolheu inclusao”); interrupção;
caso 2: escreva(“Escolheu alteracao”); interrupção;
caso 3: escreva(“Escolheu exclusao”); interrupção;
caso 4: escreva(“Atualizando alterações”); interrupção;
dúvida: escreva(“Opção invalida”);
fim
fim
24
101 – Algoritmos | Unidade 02
Linguagem algorítmica
#incluir <biblioteca>
principal()
inicio
inteiro x;
real a, b, c, soma, prod;
escreva(“1. Somar 3 números”);
escreva(“2. Multiplicar 3 números”);
escreva(“3. Sair”);
escreva(“Digite sua opção: “);
leia(x);
escolha(x)
inicio
caso 1:
escreva(“Digite 3 números”);
leia(a,b,c);
soma = a + b + c;
escreva(“Soma = “, soma);
interrupção;
caso 2:
escreva(“Digite 3 números”);
leia(a,b,c);
prod = a * b * c;
escreva(“Produto = “, prod);
interrupção;
caso 3:
escreva(“Saindo !!!!”);
interrupção;
dúvida: escreva(“Opção invalida\n”);
fim
fim
25
101 – Algoritmos | Unidade 02
10
RESUMO
Nos módulos anteriores foram apresentados alguns conceitos básicos sobre as estruturas e comandos
que são utilizados para construir um algoritmo. Neste módulo foi apresentado o comando da estrutura
de decisão escolha, que possibilita ao usuário do sistema configurar uma lista em um menu de um
sistema qualquer.
Vimos também que no algoritmo você poderá realizar uma interrupção dos comandos que estão sendo
executados, usando o comando interrupção, que para a execução do algoritmo até a próxima ação do
usuário.
As possibilidades de construção de algoritmos que temos até o presente momento são bastante boas
para construirmos quase todo o tipo de algoritmo.
26
101 – Algoritmos | Unidade 02
Vale lembrar que comandos de repetição são estruturas utilizadas no corpo de um algoritmo que
possibilitam ao computador repetir a mesma tarefa.
Os comandos de repetição são recursos muito importantes nas linguagens de programação devido ao
grande poder de processamento dos computadores, que permitem a execução de tarefas repetidas com
extrema rapidez.
A estrutura de repetição PARA, implementa um contador implicitamente. Veja como é o seu esquema:
PARA <variável contadora> DE <valor inicial> ATE <valor final> [PASSO <valor de
incremento>] FAÇA <instruções a serem executadas repetidamente até a <variável contadora> atingir o
valor final>
Sintaxe
27
101 – Algoritmos | Unidade 02
comando_1;
Interpretação
O comando será executado utilizando a variável i como controle, cujo conteúdo vai variar do valor inicial
1 até o valor final cond_lim, de 1 em 1, incrementando automaticamente.
02
Exemplo 1
Linguagem algorítmica
#incluir <biblioteca>
principal()
inicio
inteiro i;
para (i ← 1; i <= 100; i ← i + 1)
escreva(i, “ – “);
escreva(i);
fim
Observação: a penúltima linha escreva(i); irá escrever o último número (100), pois quando i for igual a
100, a condição (i<100) será falsa, portanto, a instrução dentro do laço não será executada.
03
Agora é sua vez. Faça o que é pedido nos exemplos a seguir e depois clique para verificar o resultado.
Exemplo 2
28
101 – Algoritmos | Unidade 02
Linguagem algorítmica
Teste de Mesa
Exemplo 3
0! = 1
1! = 1
n!=n.(n-1)…3.2.1
Linguagem algorítmica
Teste de Mesa
Linguagem algorítmica
#incluir <biblioteca>
principal()
inicio
inteiro i,num;
escreva(“digite um numero: “);
leia(num);
29
101 – Algoritmos | Unidade 02
Teste de Mesa
Linguagem algorítmica
#incluir <biblioteca>
principal()
inicio
inteiro i, num, fat;
fat ← 1;
escreva(“digite um numero: “);
leia(num);
se (num = 0)
escreva(“o fatorial de”, num, “e’”, fat);
senão
início
para(i=1; i<=num ; i← ! i+1)
fat = fat*i;
escreva(“o fatorial de”, num, “e’”, fat);
fim
fim
30
101 – Algoritmos | Unidade 02
Teste de Mesa
04
Exemplo 4
31
101 – Algoritmos | Unidade 02
05
Exemplo 5
Linguagem algorítmica
Teste de mesa 1
Teste de mesa 2
Linguagem algorítmica:
#incluir <biblioteca>
principal()
inicio
inteiro i,num,cont;
escreva(“Digite um numero: “);
leia(num);
cont ← 0;
para(i=1; i <= num ; i ← !i + 1)
se(num mod i = 0)
cont ← cont + 1;
se(cont = 2)
escreva(“O número”, num, “é primo”);
senão
escreva(“O número”, num, “não é
primo”);
fim
32
101 – Algoritmos | Unidade 02
Teste de Mesa
Teste de Mesa
06
Exemplo 6
33
101 – Algoritmos | Unidade 02
n
∑i = 1+2+3+...+ n
i =1
Linguagem algorítmica
#incluir <biblioteca>
principal()
inicio
inteiro i,num,soma;
escreva(“Digite um numero: “);
leia(num);
soma ← 0;
para(i=1; i<=num ; i←i+1)
soma ← soma + i;
escreva(“Soma =”, soma);
fim
07
Exemplo 7
Número par é todo número inteiro que ao ser dividido pelo número dois resulta
em um número inteiro. Elaborar um algoritmo que apresente a soma dos N
primeiros números pares.
n
∑2.i = 2+4+6+...+ 2.n
i =1
34
101 – Algoritmos | Unidade 02
Observação: no teste de mesa, o algoritmo soma os oito primeiros números pares, ou seja,
2+4+6+8+10+12+14+16.
08
Exemplo 8
Número ímpar é todo número inteiro que ao ser dividido pelo número dois resulta
em um número racional não inteiro. Elaborar um algoritmo que some todos os
números ímpares até 2005.
1003
∑2.i-1 = 1+3+5+...+ (2.1003-1)
i =1
#incluir <biblioteca>
principal()
inicio
inteiro i,num,soma;
soma←0;
para(i=1; i<=2005 ; i←i+2)
35
101 – Algoritmos | Unidade 02
soma←soma + i;
escreva(“Soma =”, soma);
fim
Observação: no exemplo, o incremento da variável de controle i é 2 e não 1 (i←i+2), como nos demais
exemplos, o que significa que o i inicia em 1 e a cada passo pula os números pares: 1, 3, 5, ..., 2005.
09
Sintaxe:
Interpretação:
Os comando1 e comando2 serão executados utilizando a variável i como controle, cujo conteúdo vai
variar do valor inicial 1 até o valor final cond_lim, de 1 em 1, incrementando automaticamente.
10
Exemplo 9
36
101 – Algoritmos | Unidade 02
#incluir <biblioteca>
principal()
inicio
inteirofahr;
realcelsius;
para (fahr = 1; fahr<= 300; fahr = fahr + 1)
inicio
escreva(fahr);
celsius ← (5.0/9.0)*(fahr-32);
escreva(celsius);
fim
fim
11
Agora é sua vez. Tente resolver o que se pede e clique para ver o resultado.
Exemplo 10
37
101 – Algoritmos | Unidade 02
12
RESUMO
Caro aluno, estamos aos poucos evoluindo nas estruturas de repetição. Estruturas essas que compõem
os algoritmos e os programas que são construídos pelos programadores. Os comandos de repetição são
estruturas utilizadas no corpo de um algoritmo que possibilitam ao computador repetir a mesma tarefa
quantas vezes forem necessária para satisfazer a condição preestabelecida.
Nesse módulo evoluímos na estrutura de repetição PARA. O comando PARA é executado até a condição
do PARA for verdadeira, depois ela vai para o próximo comando.
A estrutura de repetição PARA pode ser utilizada para diversas necessidades de algoritmos como
tabuada, conversão de escala de temperatura dentre outros.
Existem situações em que o teste condicional da estrutura de repetição, que fica no início, resulta em
um valor falso logo na primeira comparação. Nestes casos, os comandos de dentro da estrutura de
repetição não serão executados.
Sintaxe:
enquanto (condição)
inicio
comando_1;
comando_2;
fim
Fluxograma:
38
101 – Algoritmos | Unidade 02
Interpretação:
02
Exemplo 1
Linguagem algorítmica
#incluir <biblioteca>
principal()
inicio
inteiro i;
i ← 100;
enquanto(i > 10)
inicio
escreva(i);
i ← i - 1;
se(i mod 10 = 0)
39
101 – Algoritmos | Unidade 02
escreva(pula_linha);
fim
fim
Teste de Mesa
03
Agora, tente resolver os algoritmos a seguir e depois clique para verificar o resultado.
Exemplo 2
40
101 – Algoritmos | Unidade 02
04
Exemplo 3
41
101 – Algoritmos | Unidade 02
05
Exemplo 4
Linguagem algorítmica
Fluxograma
Teste de mesa
42
101 – Algoritmos | Unidade 02
Linguagem algorítmica:
#incluir <biblioteca>
principal()
inicio
inteiro i, num, res, n1, n2;
escreva("Digite o número de elementos: ");
leia(num);
i ← 3;
n1←0;
n2←1;
escreva(n1);
escreva(n2);
enquanto (i <= num)
inicio
res← n1 + n2;
escreva(res);
n1 ← n2;
n2 ← res;
i←i+1
fim
fim
Fluxograma
43
101 – Algoritmos | Unidade 02
Teste de mesa
06
44
101 – Algoritmos | Unidade 02
Sintaxe:
faça
inicio
comando_1;
comando_2;
fim
enquanto (condição);
Interpretação:
07
Exemplo 5
45
101 – Algoritmos | Unidade 02
Linguagem algorítmica
#incluir <biblioteca>
principal()
inicio
inteiro op;
faça
inicio
escreva("1. Inclusao");
escreva("2. Alteracao");
escreva("3. Exclusao");
escreva("4. Sair");
escreva("Digite sua opção: ");
leia(op);
escolha(op)
inicio
caso 1: escreva("Escolheu inclusao"); interrupção;
caso 2: escreva("Escolheu alteracao"); interrupção;
caso 3: escreva("Escolheu exclusao"); interrupção;
caso 4: escreva("Sair"); interrupção;
dúvida: escreva("Opcao Inválida");
fim
fim
enquanto(op != 4);
fim
08
Agora é a sua vez. Faça o que se pede nos exemplos a seguir e depois clique para verificar o resultado.
Exemplo 6
46
101 – Algoritmos | Unidade 02
09
Exemplo 7
47
101 – Algoritmos | Unidade 02
10
Exemplo 8
11
Exemplo 9
11
48
101 – Algoritmos | Unidade 02
12
RESUMO
Caro aluno, continuamos nesse módulo estudando as Estruturas de Repetição. Aprendemos duas
estruturas: ENQUANTO e FAÇA ENQUANTO. A grande diferença das duas é a execução dos comandos
que estão dentro dessa estrutura. No caso do FAÇA ENQUANTO, os comandos são executados e só após
é verificado se a condição ENQUANTO atende.
Aprendemos também que a utilização do ENQUANTO ocorre quando não sabemos o momento da
parada da repetição dos comandos.
Todas essas estruturas estudadas serão muito úteis no dia a dia da programação, então aproveite o
máximo possível o seu estudo.
49
101 – Algoritmo | Unidade 03
Neste módulo aprenderemos que nos algoritmos existem comandos já predeterminados a executarem
uma ação. Esse comando já configurado é chamado de função.
Uma função é composta de um nome, uma lista de parâmetros entre parênteses ( ) e o bloco de código
associado.
Vimos anteriormente que podemos utilizar diversos operadores e funções nos nossos algoritmos.
Podemos, também, definir novas funções. A utilização de funções algorítmicas tem duas grandes
vantagens:
a) Possibilita tratar problemas complexos: um algoritmo grande pode ser dividido em partes, sendo cada
parte escrita como uma função.
02
No exemplo abaixo apresentamos uma função de leitura e uma de escrita. Essas duas funções já foram
apresentadas nos módulos passados.
No exemplo acima a função leia() irá receber um valor e a função escreva() apresentará na tela a soma
dos valores da variável k.
1
101 – Algoritmo | Unidade 03
Essa atribuição descreve um significado previamente definido pelo interpretador, elas não podem ser
utilizadas para outro fim, senão aquele a que foi originalmente atribuída. O interpretador pode ser
qualquer um ou qualquer coisa que vá ler o algoritmo.
03
Existem, também, as funções de cadeia e funções de arquivo, as quais serão estudadas no próximo
módulo.
Apresentaremos a seguir algumas funções, com exemplos, que serão utilizadas para facilitar o trabalho
do dia a dia do profissional de TI, as quais simplificarão os algoritmos daqui por diante.
2
101 – Algoritmo | Unidade 03
04
inicio
inteiro maior,menor,res;
escreva("digite o maior número: ");
leia(maior);
escreva("digite o menor número: ");
leia(menor);
enquanto (menor != 0)
inicio
res ← maior mod menor;
maior ← menor;
menor ← res;
fim
escreva("o mdc entre os números é igual a", maior);
fim
05
Leia( ) - A função tem por objetivo realizar a entrada de informações para o processador. A
função leia() não retorna valor. Quando colocado aspas irá apresentar na tela o texto que estiver
dentro. Para apresentar o valor de uma variável deve ser colocado sem as aspas. E se quiser mostrar
uma mensagem e o valor da variável deve colocar o sinal de vírgula após as aspas - leia( ”nº”, n).
inicio
inteiro maior,menor,res;
escreva("digite o maior número: ");
leia(maior);
leia("digite o menor número: ", menor);
enquanto (menor != 0)
inicio
3
101 – Algoritmo | Unidade 03
06
Moldura( ) - A função tem por objetivo fazer um quadro com linhas duplas na tela. A
função moldura() não retorna valor.
Moldura ( exprN1, exprN2, exprN3, exprN4 ); onde exprN1, exprN2, exprN3 e exprN4 são expressões
numéricas do tipo inteiro, que representam as coordenadas dos cantos superior esquerdo e inferior
direito do quadro - Moldura (L1, C1, L2, C2). As coordenadas são especificadas em pares de números
inteiros, onde o primeiro representa a linha e o segundo representa a coluna.
inicio
Moldura (4, 5, 16, 60);
escreva("Bom dia aluno");
fim
07
Pausa( ) - A função tem por objetivo fazer uma interrupção na execução do algoritmo e aguardar a tecla
<enter> ser pressionada. A função pausa() não retorna valor. A função não recebe letras ou números,
somente o parêntese.
4
101 – Algoritmo | Unidade 03
inicio
inteiro maior,menor,res;
escreva("digite o maior número: ");
leia(maior);
escreva("digite o menor número: ");
leia(menor);
enquanto (menor != 0)
inicio
res ← maior mod menor;
maior ← menor;
menor ← res;
fim
escreva(“aperte a tecla <enter> para continuar”); pausa();
escreva("o mdc entre os números é igual a", maior);
fim
08
LimpaTela( ) - A função tem por objetivo limpar a tela do vídeo. A função não retorna valor.
inicio
Moldura (4, 5, 16, 60);
escreva("Bom dia aluno");
LimpaTela();
fim
09
Imprima( ) - A função tem por objetivo enviar a saída de informações para a impressora. A
função imprima() não retorna valor.
5
101 – Algoritmo | Unidade 03
inicio
inteiro maior,menor,res;
escreva("digite o maior número: ");
leia(maior);
leia("digite o menor número: ", menor);
enquanto (menor != 0)
inicio
res ← maior mod menor;
maior ← menor;
menor ← res;
fim
imprima("o mdc entre os números é igual a", maior);
fim
10
inicio
inteiro s, i, j;
real n;
i ← 0;
j ← 0;
enquanto (n != 0)
inicio
escreva("digite qualquer número: ");
leia(n);
S := sinal(n);
Se S = 1
i = i + 1;
senão
j=j+1
fim
imprima("foram digitados", i, “números positivos e “, j “números negativos”);
fim
11
6
101 – Algoritmo | Unidade 03
ParteInteira( ) - A função retorna a parte inteira de seu argumento, isto é, os dígitos decimais são
ignorados. Ela é chamada com a sintaxe N := ParteInteira ( exprN );
inicio
inteiro s;
real n;
escreva("digite qualquer número: ");
leia(n);
S := ParteInteira(n);
imprima("Foi digitado o número", n, “e sua parte inteira é”, S);
fim
12
ParteDecimal( ) - função ParteDecimal() retorna a parte decimal de seu argumento, isto é, os dígitos
inteiros são ignorados.
Ela é chamada com a sintaxe N := ParteDecimal ( exprN );
Veja o exemplo abaixo:
inicio
inteiro s;
real n;
escreva("digite qualquer número: ");
leia(n);
S := ParteDecimal(n);
imprima("Foi digitado o número", n, “e sua parte decimal é”, S);
fim
inicio
inteiro s, p;
real n;
escreva("digite qualquer número: ");
leia(n);
P := ParteDecimal(n);
S := ParteInteira(n);
imprima("Foi digitado o número", n, “e sua parte inteira é ”, S, “e sua parte decimal é “, P);
fim
13
7
101 – Algoritmo | Unidade 03
Quociente( ) – a função retorna o quociente entre seus argumentos. O valor de retorno é do tipo real.
Ela é chamada com a sintaxe Q := Quociente ( exprN1, exprN2 ); onde exprN1 e exprN2 são expressões
numéricas e exprN2 deve ser diferente de zero. A função retorna o valor de exprN1 / exprN2.
inicio
inteiro i, j;
real Q
escreva("digite qualquer número que queira dividir: ");
leia(i);
escreva(“digite o denominador da divisão “, j)
Q := Quociente(i, j)
escreva("O quociente ou o resultado da divisão dos números ”, i, “e ”, j, “é”, Q);
fim
14
Resto( ) - a função retorna o resto da divisão inteira entre seus argumentos. O valor de retorno é do tipo
inteiro.
Ela é chamada com a sintaxe R := Resto ( exprN1, exprN2 ); onde exprN1 e exprN2 são expressões
numéricas e exprN2 deve ser diferente de zero. A função retorna o valor do resto de exprN1 / exprN2.
Veja os exemplos abaixo:
inicio
inteiro R, i, j;
escreva("digite qualquer número que queira dividir: ");
leia(i);
escreva(“digite o denominador da divisão “, j)
R := Resto(i, j)
escreva("O resto da divisão dos números”, i, “e ”, j, “é”, r);
fim
inicio
inteiro R, i, j;
escreva("digite qualquer número que queira dividir: ");
leia(i);
escreva(“digite o denominador da divisão “, j)
Q := Quociente(i, j)
R := Resto(i, j)
escreva("O quociente ou o resultado da divisão dos números ”, i, “e ”, j, “é”, Q);
8
101 – Algoritmo | Unidade 03
15
Raiz( ) - a função retorna a raiz quadrada de seu argumento. O valor de retorno é do tipo real.
Ela é chamada com a sintaxe R := Raiz (exprN); onde exprN é expressão numérica e exprN deve ser
positivo.
inicio
inteiro n;
real: r;
escreva("Digite um número e descubra qual a sua raiz quadrada: ");
leia(n);
R := Raiz(n);
escreva("A raiz quadrada do número “, n, “é ", R);
fim
16
Potencia( ) - a função retorna a potenciação entre seus argumentos. O valor de retorno é do tipo real.
Ela é chamada com a sintaxe P := Potencia (exprN1, exprN2); onde exprN1 e exprN2 são expressões
numéricas. A função retorna o valor de exprN1 elevado a exprN2.
inicio
inteiro n, p, j;
escreva("digite o número que queira elevar, ou potencializar: ");
leia(n);
escreva("digite o número elevado ");
leia(j);
P:= potencia(n,j);
escreva("O resultado da potência foi”, P);
fim
17
RESUMO
9
101 – Algoritmo | Unidade 03
Nessa Unidade evoluímos na arte da construção de algoritmos. Começamos a tratar das funções, que
ajudam e simplificam em muito os algoritmos e futuramente a programação. Vimos as diferentes classes
de funções:
Palavras reservadas - relacionadas com a definição de tipos de dados e também com as estruturas de
controle do fluxo; as palavras reservadas não podem ser utilizadas, pois já possuem as suas próprias
características.
Funções de interface - são as instruções que nos permitem realizar um diálogo entre nosso algoritmo e
o usuário.
Funções matemáticas – instruções que nos permitem utilizar de recursos matemáticos frequentemente
solicitados na resolução de algum tipo de problema. Com as funções matemáticas tornou mais fácil a
forma de realizar cálculos.
1 – CONCEITOS
Depois de estudarmos as palavras reservadas, as funções de interface e as funções matemáticas,
continuaremos, neste módulo, a estudar as funções. Veremos agora outras igualmente importantes
para o dia a dia, que são funções de cadeia e funções de arquivos.
As funções em cadeia tratam das variáveis do tipo literal e caractere. Posteriormente aprenderemos o
uso de vetores e matrizes com as funções de cadeia, portanto, é importante que você compreenda bem
o conteúdo deste módulo, pois servirá de apoio para o estudo dos próximos módulos.
10
101 – Algoritmo | Unidade 03
Apresentaremos a seguir algumas funções, com exemplos, que serão utilizadas para facilitar o trabalho
do dia a dia do profissional de TI. Funções que simplificarão os algoritmos estudados nos dois primeiros
módulos.
02
C:= Comprimento (conteúdo); onde conteúdo é uma expressão do tipo cadeia (literal) e C representa
uma variável qualquer, de classe numérica, que receberá o valor retornado pela função.
inicio
inteiro C;
literal nome;
escreva("digite o seu nome: ");
leia(nome);
c:= Comprimento (nome);
escreva("seu nome possui ", c, “letras”);
fim
03
Concatena( ) - a função retorna os seus conteúdos concatenados em uma única cadeia, sem espaços
entre eles. O valor retornado pela função é do tipo cadeia (literal).
11
101 – Algoritmo | Unidade 03
A:= Concatena( conteúdo, conteudo1,... ); onde conteúdo é uma expressão do tipo cadeia (literal) e A
representa uma variável qualquer, do tipo cadeia, que receberá o valor retornado pela função. As
reticências significam que a função pode receber vários conteúdos, sendo eles separados por vírgulas.
inicio
literal nome, sobrenome, c;
escreva("digite o seu primeiro nome: ");
leia(nome);
escreva("digite o seu sobrenome: ");
leia(sobrenome);
c := Concatena(nome, sobrenome)
imprima("Bom dia ”, c);
fim
04
SubCadeia( ) - a função retorna um conteúdo de seu sub conteúdo. O valor retornado pela função é do
tipo cadeia (literal).
inicio
literal nome, sobrenome, N, S ;
escreva("digite o seu primeiro nome: ");
leia(nome);
N := SubCadeia(nome, 1, 1)
escreva("digite o seu sobrenome: ");
leia(sobrenome);
S := SubCadeia(sobrenome, 1, 1)
imprima("Bom dia”, nome, “seu sobrenome é”, sobrenome, “suas iniciais são ", N, S);
fim
05
Primeiros( ) - a função retorna uma subcadeia de seu conteúdo. O valor retornado pela função é do tipo
cadeia (literal).
12
101 – Algoritmo | Unidade 03
S:= Primeiros (Conteúdo, N ); onde Conteúdo é uma expressão do tipo cadeia da qual se deseja uma
subcadeia, N é uma número ou resultado de uma expressão do tipo inteiro que representa a quantidade
de caracteres do Conteúdo, contados a partir de seu início, que se deseja retornar.
inicio
literal nome, N;
escreva("digite o seu primeiro nome: ");
leia(nome);
N := Primeiros(nome, 4)
imprima("As 4 primeiras letras iniciais do seu nome são”, N);
fim
06
Ultimos( ) - a função retorna uma subcadeia de seu conteúdo. O valor retornado pela função é do tipo
cadeia (literal).
N := Ultimos(Conteúdo, m); onde Conteúdo é uma expressão do tipo cadeia da qual se deseja uma
subcadeia, m é um número ou uma expressão do tipo inteiro que representa a quantidade de caracteres
do Conteúdo, contados a partir de seu final, que se deseja retornar.
inicio
literal nome, N;
escreva("digite o seu primeiro nome: ");
leia(nome);
N := Ultimos(nome, 2)
imprima("As duas letras finais do seu nome são”, N);
fim
07
Compara( ) - a função tem por objetivo comparar duas cadeia (duas variáveis literais) com relação a
ordem alfabética de seus conteúdos. Ela retorna um valor inteiro, negativo, nulo ou positivo de acordo
com a ordem de passagem de seus conteúdos.
13
101 – Algoritmo | Unidade 03
S := Compara(nome1, nome2); onde nome1 e nome2 são expressões do tipo cadeia (literal). Se os
valores representados pelas expressões nome1 e nome2 forem iguais o valor de retorno é 0 (zero), se
nome2 for maior que nome1, isto é, nome2 representar um valor que está em uma posição à frente de
nome1, considerando a ordem alfabética, o valor de retorno será 1 (um), caso contrário o valor de
retorno será –1. Assim sendo, o valor de retorno será negativo se a ordem dos argumentos estiver
diferente da ordem alfabética dos mesmos.
inicio
inteiro N;
literal nome, nome1;
escreva("digite o primeiro nome: ");
leia(nome);
escreva("digite o segundo nome: ");
leia(nome1);
N := Compara(nome, nome1)
inicio
Se n = 0
Imprima(“nomes iguais”);
Se n = 1
Imprima(“Primeiro nome na ordem alfabética”, nome)
Se n =-1
Imprima(“Primeiro nome em ordem alfabética”,nome1)
fim
fim
08
Maiusculas( ) - a função tem por objetivo retornar o seu conteúdo transformado em maiúsculas. O valor
de retorno é do tipo cadeia (literal).
inicio
literal nome, N;
escreva("digite o seu nome: ");
leia(nome);
N := Maiusculas(nome)
14
101 – Algoritmo | Unidade 03
09
Minusculas( ) - a função tem por objetivo retornar o seu conteúdo transformado em minúsculas. O
valor de retorno é do tipo cadeia (literal).
inicio
literal nome, N;
escreva("digite o seu nome: ");
leia(nome);
N := Minusculas(nome)
imprima("Bom dia, seu nome com caracteres em minúsculo é ”, nome);
fim
10
CadeiaParaInteiro( ) - a função tem por objetivo retornar um numérico do tipo inteiro correspondente a
cadeia numérica de seu conteúdo.
inicio
inteiro V;
literal N;
escreva("digite um número: ");
leia(N);
V := CadeiaParaInteiro(N)
Se V = 0
inicio
escreva(“Número não inteiro”)
senão
15
101 – Algoritmo | Unidade 03
11
Vincular (nome arquivo, nome arquivo); onde nome arquivo representa o nome lógico do arquivo
utilizado no algoritmo e, nome arquivo representa o nome físico do arquivo no disco.
inicio
literal clientes ;
Criar (clientes);
Criar (“arq001.dat”);
Vincular(clientes, “arq001.dat”);
Abrir (clientes);
Gravar (clientes, “teste de gravação 1”);
Gravar (clientes, “teste de gravação 2”);
Posicionar (clientes, INICIO);
Gravar (clientes, “teste de gravação 0”);
Posicionar (clientes, FINAL);
Gravar (clientes, “teste de gravação 3”);
Fechar (clientes);
fim
12
Criar (nome arquivo); onde nome arquivo representa o identificador lógico do arquivo ou o seu
identificador físico.
16
101 – Algoritmo | Unidade 03
inicio
literal clientes ;
Criar (clientes);
Criar (“arq001.dat”);
Vincular (clientes, “arq001.dat”);
Abrir (clientes);
Gravar (clientes, “teste de gravação 1”);
Gravar (clientes, “teste de gravação 2”);
Posicionar (clientes, INICIO);
Gravar (clientes, “teste de gravação 0”);
Posicionar (clientes, FINAL);
Gravar (clientes, “teste de gravação 3”);
Fechar (clientes);
fim
13
Abrir (nome arquivo); onde nome arquivo representa o identificador lógico do arquivo ou o seu
identificador físico.
inicio
literal clientes;
Criar (clientes ;
Criar (“arq001.dat”);
Vincular (clientes, “arq001.dat”);
Abrir (clientes);
Gravar (clientes, “teste de gravação 1”);
Gravar (clientes, “teste de gravação 2”);
Posicionar (clientes, INICIO);
Gravar (clientes, “teste de gravação 0”);
Posicionar (clientes, FINAL);
Gravar (clientes, “teste de gravação 3”);
Fechar (clientes);
fim
14
17
101 – Algoritmo | Unidade 03
Fechar (nome arquivo); onde nome arquivo representa o identificador lógico do arquivo ou o seu
identificador físico.
inicio
literal clientes;
Criar (clientes);
Criar (“arq001.dat”);
Vincular (clientes, “arq001.dat”);
Abrir (clientes);
Gravar (clientes, “teste de gravação 1”);
Gravar (clientes, “teste de gravação 2”);
Posicionar (clientes, INICIO);
Gravar (clientes, “teste de gravação 0”);
Posicionar (clientes, FINAL);
Gravar (clientes, “teste de gravação 3”);
Fechar (clientes);
fim
15
Gravar (nome arquivo algoritmo, nome arquivo); onde nome arquivo algoritmo representa o
identificador lógico ou físico do arquivo e nome arquivo representa a informação que se deseja
armazenar.
inicio
literal clientes;
Criar (clientes);
Criar (“arq001.dat”);
Vincular (clientes, “arq001.dat”);
Abrir (clientes );
Gravar (clientes, “teste de gravação 1”);
Gravar (clientes, “teste de gravação 2”);
Posicionar (clientes, INICIO);
Gravar (clientes, “teste de gravação 0”);
18
101 – Algoritmo | Unidade 03
16
Posicionar ( ) - a função tem por objetivo permitir o posicionamento em uma determinada informação
no arquivo físico.
Posicionar (nome, pos); onde nome representa o identificador lógico ou físico do arquivo e pos a posição
em que se deseja apontar no arquivo. Pode ser INÍCIO e FIM.
inicio
literal cliente;
Criar (clientes );
Criar (“arq001.dat”);
Vincular (clientes, “arq001.dat”);
Abrir (clientes );
Gravar (clientes, “teste de gravação 1”);
Gravar (clientes, “teste de gravação 2”);
Posicionar (clientes, INICIO);
Gravar (clientes, “teste de gravação 0”);
Posicionar (clientes, FINAL );
Gravar (clientes, “teste de gravação 3”);
Fechar (clientes);
Fim
17
RESUMO
Nesse módulo continuamos o estudo das funções. Vimos funções de cadeia e funções de arquivos. As
funções de cadeia são as instruções que nos permitem tratar sequência de caracteres. As cadeias são
recursos bastante utilizados na programação em geral. As funções para o tratamento de arquivo são as
instruções que nos permitem tratar informações que poderão ser armazenadas indefinidamente no
computador, mas necessariamente em arquivos.
19
101 – Algoritmo | Unidade 03
1 - PONTEIROS
Para entender o que são os ponteiros, imagine a seguinte situação: você trabalha no departamento de
Recursos Humanos de uma empresa há muito tempo, desde a sua criação, portanto, você sabe
exatamente em que local as pessoas trabalham e o que fazem. Assim, quando chega alguma encomenda
ou uma correspondência na empresa, sempre acabam recorrendo a você, que serve de referência,
apontando exatamente onde encontrar a pessoa que estão procurando.
Os ponteiros possuem exatamente a mesma ideia, ou seja, são eles que possuem o poder de armazenar
a localização onde estão guardadas determinadas informações.
Falando em termos de algoritmos, podemos entender um ponteiro como uma variável que armazena
um endereço de memória onde está localizado um valor.
02
Os ponteiros são utilizados em diversas situações. Podemos citar, por exemplo, a atualização de valores
que são utilizados em várias partes dos algoritmos e que, por algum motivo, precisam ser atualizados ao
longo da vida útil do mesmo. Para solucionar esta situação, basta referenciarem-se estes valores em
uma função e aplicar sobre eles operações que alterem seus valores de forma pertinente e a replicação
ocorre automaticamente.
Quando um ponteiro contém o endereço de uma variável, dizemos que o ponteiro está "apontando"
para essa variável.
Na imagem abaixo apresenta as variáveis i, f e j com os seus respectivos valores 2450, 225.345 e 11331,
e os endereços de cada variável respectivamente 1002, 1004 e 1005.
03
20
101 – Algoritmo | Unidade 03
Para utilizarmos o ponteiro em nossos algoritmos devemos conhecer o seu comando, ou forma de
representar em um pseudocódigo.
Quando declaramos int i=240, estamos declarando para a memória reservar um espaço para valores do
tipo inteiro. Simultaneamente é atribuído o valor 240 à variável i, o que significa que no endereço de
memória associado à variável i é armazenado o valor 240.
Como dito anteriormente, o uso de ponteiros pode ser justificado quando é necessária a utilização da
variável em outros momentos dos algoritmos. Neste caso, poderiam existir vários apontadores ou
ponteiros espalhados pelo programa, apontando para essa variável, que deteria o conteúdo desejado (a
informação). Toda e qualquer modificação no dado seria feita no conteúdo da variável a que todos os
apontadores fariam a referência, ou seja, diferentes partes do programa sempre estariam acessando um
valor de dado atualizado.
Ponteiros ou apontadores são variáveis que armazenam um endereço de memória (isto é, o endereço
de outras variáveis). Eles fornecem um mecanismo para acessar diretamente e objetos e código de
modificação na memória. Os ponteiros são utilizados em muitas linguagens de programação, cada
ponteiro tem um tipo, podendo ser um tipo para cada tipo de linguagem ou um tipo definido pelo
programador. Dessa forma, podemos ter ponteiros para inteiros, ponteiros para real, ponteiros para
manipular cadeias de caracteres, para passar parâmetros para funções, manipulação matrizes de dados
e criação de listas ligadas e outras estruturas de dados complexas.
04
O acesso direto na memória proporciona uma melhora no desempenho da sua aplicação. Quando um
ponteiro contém o endereço de uma variável, dizemos que o ponteiro está "apontando" para essa
variável. Uma função a ser passada como um parâmetro para outra função. Um ponteiro de função
pode ser atribuído o endereço de uma das opções de funções, de modo que o ponteiro atua como uma
espécie de apelido. Linguagens de programação orientadas a objetos eliminaram a necessidade de
ponteiros de função com herança e polimorfismo.
21
101 – Algoritmo | Unidade 03
O operador do ponteiro “*” pode ser usado para acessar o conteúdo no local apontado pela variável de
ponteiro. Por exemplo, considere a seguinte declaração:
Inteiro *pont;
Inteiro x
início
x ← 10
*pont ← &x
Escreva(“O endereço de memória da variável ”,x”é”, &x);
Escreva(“O valor da memória apontada é ", pont*);
Fim
No trecho acima simplesmente foi criado um ponteiro, alocando a memória para ele, logo após
atribuindo um valor à variável e finalizando com a escrita na tela.
05
Pode-se dizer que o conceito de algo recursivo está dentro de si, que por sua vez está dentro de si e
assim sucessivamente, infinitamente, ou seja, se não tiver um mecanismo de saída ou de parada o
algoritmo entrará em loop.
O termo loop é usado na TI para coisas que ficam girando ou rodando sem fim.
O exemplo a seguir mostra a foto de um espelho de frente a outro espelho, onde representa a
recursividade no dia a dia.
22
101 – Algoritmo | Unidade 03
06
Vamos examinar um exemplo coloquial de procedimento recursivo. Imaginemos ter que encontrar no
dicionário o significado da palavra "jururu". É claro que ninguém vai ler sequencialmente o dicionário
até chegar à palavra procurada.
Vamos definir o processo de achar uma palavra num dicionário em termos algorítmicos mais ou menos
livres procura-palavra (Dicionário, palavra-procurada):
O algoritmo é recursivo no sentido de que ele chama a ele mesmo. Note que ocorre a procura da
palavra várias vezes até encontrá-la, ou, caso depois da procura não se encontre o que deseja, ele
encerra o algoritmo. Nesse caso, o processo é finito, já que, a cada chamada, o universo de pesquisa é
menor. Na primeira vez, ele é todo o dicionário, na segunda vez, apenas a metade, na terceira vez, uma
quarta parte e assim por diante. Finalmente, há uma condição que estabelece o fim da pesquisa.
23
101 – Algoritmo | Unidade 03
No exemplo do dicionário, vimos às três características que um problema recursivo tem que ter:
07
Definições como “recursividade” são normalmente encontradas na matemática. O grande apelo que o
conceito da recursão traz é a possibilidade de dar uma definição infinita para um conjunto que pode ser
finito. Um bom exemplo é o cálculo do fatorial.
0! = 1
1! = 1
n!=n.(n-1)…3.2.1
Você já deve ter estudado, na matemática, a expressão fatorial: o fatorial de um número natural n é o
produto de todos os inteiros positivos menores ou iguais a n. Isso é escrito como n! e lido como
"fatorial de n". A notação n! foi introduzida por Christian Kramp em 1808.
O exemplo abaixo demonstra a fórmula do fatorial de qualquer número, onde n é um número inteiro
positivo:
F(n) = 1 se n = 0 ou n = 1
Esta propriedade é chamada de propriedade recursiva: o fatorial de um número pode ser calculado
através da multiplicação do número pelo fatorial de seu antecessor.
08
Ora, podemos utilizar esta propriedade para escrevermos uma rotina recursiva para o cálculo de
fatorial.
F(4) = 4.F(4-1)
F(3) = 3.F(3-1)
F(2) = 2.F(2-1)
F(1) = 1.F(1-1)
n! = n . (n-1)!
24
101 – Algoritmo | Unidade 03
Na computação o conceito de recursividade é amplamente utilizado, mas deve-se tomar cuidado em sua
utilização, pois necessita de uma condição para provocar o fim do ciclo recursivo. Essa condição deve
existir, pois, devido às limitações técnicas que o computador apresenta, a recursividade é impedida de
continuar eternamente.
Nos anos 90 grandes CPD (Centro de Processamento de Dados) possuíam salas com impressoras que
atendiam a várias equipes. Essas impressoras imprimiam 10 a 20 folhas por segundo e um programa que
entrava em loop, ou seja, em uma função recursiva sem saída, gerava milhares de páginas de erros do
programa. Como funcionava? O analista construía ou alterava um sistema e mandava rodar e imprimir
logo a seguir para ver o resultado. O técnico da sala de impressão ligava imediatamente quando dava
erro na impressão, algumas vezes tarde demais, e muitas folhas de papel iam para o lixo.
10
25
101 – Algoritmo | Unidade 03
Muito importante realizar testes nas aplicações que estão sendo implantadas, principalmente nos
programas com rotinas recursivas. Os testes evitam problemas com códigos que não estão funcionando
adequadamente.
11
#incluir <biblioteca>
principal()
inicio
inteiro i, num, fat;
fat ← 1;
escreva(“digite um numero: “);
leia(num);
se (num = 0)
escreva(“o fatorial de”, num, “e’”, fat);
senão
início
para(i=1; i<=num ; i ← i+1)
fat = fat*i;
escreva(“o fatorial de”, num, “e’”, fat);
fim
fim
26
101 – Algoritmo | Unidade 03
12
13
14
RESUMO
27
101 – Algoritmo | Unidade 03
Nesse módulo vimos mais alguns recursos que podemos usar em algoritmos e consequentemente na
programação, ponteiros e recursividade, que facilitam a construção dos algoritmos mais complexos e
mais difíceis.
Podemos entender um ponteiro como uma variável que armazena um endereço de memória onde está
localizado um valor. Os ponteiros ajudam a entender como são armazenadas informações na memória,
como informações de arquivos dos sistemas.
A recursividade está nos algoritmos e no nosso dia a dia, tudo o que se repete com certa constância é
chamado de recursivo.
1. LISTA
Vamos supor que você tenha feito uma lista de compras, ou seja, tem um pedaço de papel com diversos
itens, organizados conforme a ordem em que você ia lembrando o que precisava comprar.
Provavelmente essa ordem é a que você seguirá para efetuar as compras, do primeiro item até o último.
Se você é uma pessoa criteriosa, deve ter feito a lista segundo uma sequência lógica, listando os itens
conforme o setor: produtos de limpeza, alimentícios etc. Já no mercado, você vai verificar a lista
novamente, seguir a ordem dela, marcar o que comprou ou não, anotar os preços e verificar se comprou
algo a mais do previsto. A lista de compras, portanto, é um modo de organização, sem a qual você
correria o risco de comprar supérfluos ou deixar de comprar algo essencial.
28
101 – Algoritmo | Unidade 03
No mundo da computação, alguns tipos de dados podem ser organizados em uma cadeia, seja de
números ou de caracteres, que denominamos de lista. É uma estrutura de dados abstrata que
implementa uma coleção ordenada de valores, onde o mesmo valor pode incidir mais de uma vez. Em
suma:
Uma lista é um conjunto ordenado de dados, geralmente do mesmo tipo e essa organização é feita
através da enumeração dos dados para melhor visualização da informação.
02
Inúmeros tipos de dados podem ser representados por listas. Suponhamos, por exemplo, que você
precise fazer um programa que cadastre um número indefinido de pessoas. Para isso, você não irá criar
uma matriz ou vetor, pois mesmo que você crie 1000 posições, isso irá consumir muita memória, desde
o início do processo, sem contar a possibilidade de se ter 900 pessoas, ou até mesmo 1500 pessoas, ou
seja, o valor é variável. Nesse caso, o ideal é criar uma lista encadeada, que é manipulada de forma
dinâmica. Outros exemplos de sistemas de informação que podem utilizar listas são: informações sobre
os funcionários de uma empresa, notas de alunos, itens de estoque etc.
As listas podem ser implementadas de várias maneiras, tanto em uma linguagem de programação
procedural como em uma linguagem de programação funcional.
As listas são estruturas dinâmicas, em oposição aos vetores (arrays), os quais são estruturas estáticas e
contém um conjunto específico de dados. Virtualmente, uma lista pode conter infinitos itens. As
operações sobre listas são limitadas ao tipo de dados que uma lista contém. Por exemplo, listas de
dados numéricos podem ser tratadas matematicamente, enquanto listas de caracteres podem ser
ordenadas, concatenadas. O conjunto de números [20, 13, 42, 23,54] é uma lista numérica de inteiros;
[‘a’, ‘d’, ‘z’, ‘m’, ‘w’, ‘u’] é uma lista de caracteres; e ["maçã”, "abacaxi”, "pera"] é uma lista de frutas.
Sendo que n>= 1, n1 é o primeiro item da lista e xn o último item da lista.
As listas são importantes, pois constituem uma forma simples de interligar os itens de um conjunto,
agrupando informações referentes a um conjunto de elementos que se relacionam entre si de alguma
forma.
As listas são úteis em aplicações tais como manipulação simbólica, em que se manipulam as variáveis
em expressões algébricas, a gerência de memória, que define as prioridades da memória do
computador ou outro dispositivo, simulação, e onde é possível juntar informações sequenciais ou
dinâmicas para realizar uma simulação e compiladores, que gravam uma sequência de procedimentos
para transformar o programa em um software executável.
Lista encadeada
Uma lista ligada ou lista encadeada é uma estrutura de dados linear e dinâmica. Ela é composta por
células que apontam para o próximo elemento da lista. Para "ter" uma lista ligada/encadeada, basta
guardar seu primeiro elemento, e seu último elemento aponta para uma célula nula. O esquema a
29
101 – Algoritmo | Unidade 03
Célula 1 ----> Célula 2 ---> Célula 3 ---> Célula 4 ---> Célula 5 ---> (Nulo)
Programação procedural
Programação utilizada nas linguagens mais antigas, como o COBOL, onde possui estruturas que são
chamadas de procedimento ou procedure.
Programação funcional
Programação mais atual, como o ASP, PHP, etc, em que se utilizam funções para montar um aplicativo.
Como exemplo, função para validar CPF, função para buscar endereço pelo CEP, etc.
Estruturas dinâmicas
Uma lista mutável ou dinâmica pode permitir que itens sejam inseridos, substituídos ou excluídos
durante a existência da lista.
Estruturas estáticas
As estruturas de lista estáticas permitem apenas a verificação e enumeração dos valores.
Manipulação simbólica
A manipulação de símbolos é o manuseio da simbologia da matemática, serve assim para resolver
operações algébricas, é o manuseio das variáveis nas expressões matemáticas.
Simulação
É a técnica de estudar o comportamento e reações de determinados sistemas através de modelos. A
simulação computacional de sistemas, ou apenas simulação, consiste na utilização de certas técnicas
matemáticas, empregadas em computadores, as quais permitem imitar o funcionamento de,
praticamente qualquer tipo de operação ou processo do mundo real, ou seja, é o estudo do
comportamento de sistemas reais através do exercício de modelos.
Compiladores
Compilador é um programas que traduz o código fonte de uma linguagem de programação de alto nível
para uma linguagem de programação de baixo nível (por exemplo, Assembly ou código de máquina).
Contudo alguns autores citam exemplos de compiladores que traduzem para linguagens de alto nível
como C.
03
30
101 – Algoritmo | Unidade 03
As listas possuem operações que possibilitam a sua manipulação. Essa manipulação consiste em
operações para inserir, retirar e localizar itens em qualquer momento que for necessário. Algumas
operações influenciam no tamanho da lista, possibilitando o seu crescimento ou sua diminuição.
Outra característica é que as listas possibilitam também a concatenação de duas ou mais listas e
também a divisão de uma lista em mais listas. As listas podem ser adequadas quando não é possível
prever o tamanho da memória, permitindo a manipulação de quantidades imprevisíveis de dados, de
formato também imprevisível.
Pode-se destacar, também, que cada elemento da lista possui um índice, um número que identifica cada
elemento da lista. Usando o índice de um elemento da lista é possível buscá-lo ou removê-lo.
Tamanho da lista
Quando falamos em “tamanho da lista”, estamos nos referindo ao número de elementos presentes na
lista.
04
Vimos então que podemos definir uma lista como um conjunto ordenado de elementos, geralmente do
mesmo tipo de dado. As listas podem ser classificadas em pilhas e filas, dependendo do tipo de acesso
que pode ser feito aos dados que ela contém.
31
101 – Algoritmo | Unidade 03
05
2 - PILHA
É um tipo especial de lista, onde os elementos são ordenados como um empilhamento de dados,
denominados pilha.
As pilhas representam uma das estruturas mais importantes no processamento de dados. Embora sua
estrutura seja bastante simples, as pilhas desempenham um importante papel nas linguagens de
programação, pois são utilizadas como acumuladores em laços do programa e em chamadas de sub-
rotinas ou funções.
Uma pilha pode ser definida como um conjunto ordenado de dados, no qual se pode inserir e retirar
dados apenas em uma determinada ordem, ou seja, em uma posição denominada “topo da pilha”.
O exemplo acima apresenta um conjunto de pratos, ou seja, uma pilha de pratos, onde se tira
normalmente o primeiro prato até chegar ao último, que foi o primeiro a ser colocado.
06
As pilhas são estruturas muito comuns em algoritmos e o seu processo de atualização se divide
principalmente em duas partes:
32
101 – Algoritmo | Unidade 03
Como visto anteriormente, o topo da pilha, que é a extremidade, serão inseridos e retirados os itens do
mesmo tipo. A pilha também é chamada de lista linear, onde todas as inserções e eliminações são feitas
em apenas uma das extremidades. As imagens acima mostram a representação de uma pilha.
Primeiramente inserindo itens e depois eliminando itens.
07
A estrutura de dados do tipo pilha tem como característica que a última informação a entrar é a
primeira a sair (LIFO - last in first out). A aplicação da estrutura de pilhas é mais frequente em
compiladores e sistemas operacionais, que a utilizam para controle de dados e alocação de variáveis na
memória. O problema no uso de pilhas é controlar o final da pilha. Isto pode ser feito de várias formas,
sendo a mais indicada criar um método para verificar se existem mais dados na pilha para serem
retirados.
Antes de programar a solução de um problema que usa uma pilha, é necessário determinar como
representar uma pilha usando as estruturas de dados existentes na linguagem de programação. Lembre-
se de que uma pilha é um conjunto ordenado de itens, na linguagem C já contém um tipo de dado que
representa um conjunto ordenado de itens, que é o vetor. Então, sempre que for necessário utilizar a
estrutura de pilhas para resolver um problema, pode-se utilizar o vetor para armazenar esta pilha. Vale
lembrar, porém, que a pilha é uma estrutura dinâmica e pode crescer infinitamente, enquanto um vetor
na linguagem C tem um tamanho fixo; contudo, pode-se definir este vetor com um tamanho
suficientemente grande para conter esta pilha.
inicio
inteiro i;
real pilha[10], soma;
33
101 – Algoritmo | Unidade 03
08
É possível realizar algumas operações básicas na estrutura de dados Pilha, as mais importantes são a
operação de empilhar (push) e desempilhar (pop). Mas para isso devemos executar outras operações
para que isso seja possível:
• Empilhar;
• Desempilhar;
Toda vez que criamos uma estrutura de pilha, esta deve ser inicializada para garantir que não haja
nenhuma "sujeira" no local onde esteja montada. Importante elencar que:
Quando a pilha não está vazia não significa que ela esteja cheia, o que acontece também inversamente,
ou seja, quando a pilha não está cheia, não significa que ela esteja vazia.
Empilhar
Na estrutura de dados pilha, sempre que um novo item é inserido ele passa a estar no topo da pilha.
34
101 – Algoritmo | Unidade 03
Desempilhar
Na estrutura de dados pilha, sempre o item a ser retirado será o que estiver no topo da pilha, ou seja, o
último que foi empilhado.
09
3 - FILA
Aprenderemos agora o comportamento das filas. Assim como listas e pilhas, as filas são estruturas de
dados que armazenam os elementos de maneira sequencial.
A fila é um conjunto ordenado de itens a partir do qual se podem eliminar itens em uma extremidade,
que é o início da fila, e que podem inserir itens na outra extremidade, que é o final da fila.
O que diferencia a fila da pilha é a ordem de saída dos itens. Relembrando o que já foi estudado,
enquanto na pilha o último item que entra é o primeiro item que sai, na fila o primeiro item que entra é
o primeiro item que sai (FIFO – first in, first out). Abaixo temos duas representações de Fila.
A ideia fundamental da fila é que só podemos inserir um novo elemento no final da fila e só podemos
retirar o elemento do início.
10
35
101 – Algoritmo | Unidade 03
Você deve ter observado que a estrutura de fila é uma analogia natural ao conceito de fila que usamos
em nosso dia a dia: quem primeiro entra numa fila é o primeiro a ser atendido (a sair da fila).
No dia a dia, enfrentamos e até já nos acostumamos às filas em diversos lugares. Quando precisamos ir
ao banco, enfrentamos fila, quando vamos ao mercado, enfrentamos fila, no cinema também, e
infelizmente no hospital às vezes é o que mais demora, entre outros lugares. Mesmo assim as filas são
importantes, pois elas determinam a ordem de atendimento das pessoas. Como seria se não tivéssemos
fila?
A simplicidade de uma fila fica interessante quando começamos a analisá-la. As pessoas são atendidas
conforme a posição delas na fila. O próximo a ser atendido é sempre o primeiro da fila. Quando o
primeiro da fila é chamado para ser atendido, a fila diminui, ou seja, o segundo passa a ser o primeiro, o
terceiro passa a ser o segundo e assim por diante até a última pessoa. Significa que o último será
primeiro em algum momento. Sendo assim, a pessoa que entra em uma fila, estará neste momento na
última posição, ou seja, no fim da fila. Desta forma, quem chega antes tem prioridade.
11
Finalidade da Fila
• buffer para gravação de dados em mídia: quando vamos gravar uma grande quantidade de
informações, como por exemplo, a cópia de um CD, o computador armazena isso em uma memória
temporária em formato de fila, depois do processamento ele começa a descarregar a fila gravando a
informação no local de destino.
36
101 – Algoritmo | Unidade 03
na caixa de saída. Quando o sistema normaliza as mensagens seguem conforme a fila, ou seja, seguem a
fila de chegada na caixa e começa a enviar as mensagens até esvaziar a fila de saída.
Esses exemplos demonstram a utilidade do dia a dia, utilidades essas que às vezes nem imaginamos que
exista.
12
Para realizar as operações de uma fila, devemos ser capazes de inserir novos elementos em uma
extremidade, o fim, e retirar elementos da outra extremidade, oinício. Temos as seguintes operações:
Toda vez que criamos uma estrutura de pilha, esta deve ser inicializada para garantir que não haja
nenhuma "sujeira" no local onde esteja montada. Do mesmo modo da pilha, quando a fila não está vazia
não significa que ela esteja cheia, o que acontece também quando a fila não está cheia não significa que
ela esteja vazia.
37
101 – Algoritmo | Unidade 03
13
RESUMO
Nesse módulo apresentamos as listas, as pilhas e as filas, que são tipos abstratos de dados que criamos
para gerenciar estrutura de dados. Uma lista é um conjunto ordenado de dados, geralmente do mesmo
tipo e essa organização é feita através da enumeração dos dados para melhor visualização da
informação. As pilhas e filas têm operações mais restritas do que as operações das listas. Nas filas e
pilhas seguem um rito de entrada e saída, sendo que, na fila o primeiro que entra é o primeiro que sai
(LIFO - Last In, First Out), e na Pilha o primeiro que entra é o último que sai (FIFO - First In, First Out).
Nas listas, os elementos são adicionados e removidos de qualquer posição.
As filas, listas e pilhas estão presentes em nosso dia a dia e em cada detalhe do mundo da TI e fora da
tecnologia também.
38
101 – Algoritmo | Unidade 04
Imagine, por exemplo, que você receba o nome e a nota de 100 alunos de uma escola, e depois precise
listar o nome de cada um, a média final de cada aluno e ainda a média da turma.
Agora imagine você declarando uma a uma, todas as 100 variáveis para o nome, depois as 100 variáveis
para as notas. O seu algoritmo ficaria semelhante a este:
inicio
caractere aluno1, aluno2, aluno3, aluno4, aluno5, aluno6, aluno7, aluno8, aluno9, aluno10,
aluno11, aluno12, aluno13, aluno14, aluno15, aluno16, aluno17, aluno18, aluno19, aluno20,
aluno21, aluno22, aluno23, aluno24, aluno25, aluno26, aluno27, aluno28, aluno29, aluno30,
aluno31, aluno32, aluno33, aluno34, aluno35, aluno36, aluno37, aluno38, aluno39, aluno40,
aluno41, aluno42, aluno43, aluno44, aluno45, aluno46, aluno47, aluno48, aluno49, aluno50,
aluno51, aluno52, aluno53, aluno54, aluno55, aluno56, aluno57, aluno58, aluno59, aluno60,
aluno61, aluno62, aluno63, aluno64, aluno65, aluno66, aluno67, aluno68, aluno69, aluno70,
aluno71, aluno72, aluno73, aluno74, aluno75, aluno76, aluno77, aluno78, aluno79, aluno80,
aluno81, aluno82, aluno83, aluno84, aluno85, aluno86, aluno87, aluno88, aluno89, aluno90,
aluno91, aluno92, aluno93, aluno94, aluno95, aluno96, aluno97, aluno98, aluno99, aluno100;
real nota1, nota2, nota3, nota4, nota5, nota6, nota7, nota8, nota9, nota10,
nota11, nota12, nota13, nota14, nota15, nota16, nota17, nota18, nota19, nota10,
nota21, nota22, nota23, nota24, nota25, nota26, nota27, nota28, nota29, nota10,
nota31, nota32, nota33, nota34, nota35, nota36, nota37, nota38, nota39, nota10,
nota41, nota42, nota43, nota44, nota45, nota46, nota47, nota48, nota49, nota10,
nota51, nota52, nota53, nota54, nota55, nota56, nota57, nota58, nota59, nota10,
nota61, nota62, nota63, nota64, nota65, nota66, nota67, nota68, nota69, nota10,
nota71, nota72, nota73, nota74, nota75, nota76, nota77, nota78, nota79, nota10,
nota81, nota82, nota83, nota84, nota85, nota86, nota87, nota88, nota89, nota10,
nota91, nota92, nota93, nota94, nota95, nota96, nota97, nota98, nota99, nota100;
Além do trabalho de declarar todas as variáveis, você deveria gerenciar as variáveis no algoritmo.
Provavelmente seu algoritmo iria ficar muito grande, o que poderia deixar lenta a aplicação.
Seria bem trabalhoso, não? É para casos como esse que usamos as estruturas de dados homogêneos.
1
101 – Algoritmo | Unidade 04
02
Estruturas de dados homogêneos são estruturas que permitem armazenar conjuntos de dados de um
mesmo tipo (daí o nome ‘homogêneos’) em uma única variável.
Essas estruturas são também chamadas de variáveis compostas homogêneas ou variáveis compostas
indexadas.
• os vetores (ou arrays), estruturas que armazenam os dados em uma única linha e várias colunas
(dizemos que são unidimensionais);
• as matrizes, estruturas que armazenam os dados em forma de tabela, com várias linhas e várias
colunas (são bidimensionais).
No presente módulo nosso objeto de estudo serão os vetores. As matrizes serão estudadas em outra
ocasião.
03
Suponha a seguinte situação: você precisa elaborar um algoritmo que receba dois números reais
fornecidos pelo usuário e forneça como resultado a soma dos mesmos. Rapidamente é possível pensar a
solução:
#incluir <biblioteca>
principal()
inicio
real a, b, soma;
escreva(“Digite os números: ”);
leia(a, b);
soma = a + b;
escreva(“Soma = “, soma);
fim
Vetores homogêneos são matrizes unidimensionais que armazenam dados de um mesmo tipo.
Veremos oportunamente o que é matriz, mas podemos dizer agora, de forma resumida, que uma matriz
2
101 – Algoritmo | Unidade 04
seria vários vetores do mesmo tipo e do mesmo tamanho um em cima do outro, ou um do lado do
outro.
04
Declaração de um vetor
Os vetores precisam ser declarados antes de serem utilizados, assim como fazemos com as variáveis
simples. A declaração de um vetor, entretanto, é um pouco diferente da declaração de uma variável
comum, pois se trata de uma variável indexada. É como se declarássemos diversas variáveis dentro de
uma só, diferenciadas por um índice.
Essas variáveis correspondem aos elementos do vetor (em nosso exemplo, os nomes dos alunos). Já o
índice é um valor numérico do tipo inteiro, que sempre começa em 1 e corresponde à posição de cada
elemento no vetor. Observe a tabela a seguir.
Essa tabela representa um vetor de 5 elementos. Os elementos são os nomes (Carla, Cleide, Dalton,
Diana, Edson). Os números de 1 a 5 representam os índices, que são as posições de cada elemento no
vetor. Por exemplo, o elemento ‘Diana’ ocupa a posição ‘4’ do vetor.
Ao declarar um vetor, o seu ‘tamanho’ deve ser informado. O ‘tamanho’ de um vetor é a quantidade de
dados que será armazenada na variável. Na tabela acima, o tamanho do vetor é 5. No nosso exemplo
(dos nomes dos alunos), o tamanho do vetor é 100, pois queremos armazenar os nomes de 100 alunos.
Nosso exemplo:
No nosso exemplo, ao invés de declararmos diversas variáveis (aluno1, aluno2... aluno100), estamos
declarando diversos elementos (os nomes) em uma variável.
Variável indexada
É o conjunto de variáveis do mesmo tipo, referenciadas pelo mesmo nome e individualizadas por
índices. Podem ter um ou mais índices e ao número de índices necessários para a localização de um
elemento dentro da variável indexada dá-se o nome de dimensão.
3
101 – Algoritmo | Unidade 04
05
Nesta representação cada dado é determinado por um índice na forma aij, sendo “a” a variável, “i” a
linha e “j” a coluna. No caso dos vetores, o índice j é constante e igual a 1 e, portanto, pode ser
desconsiderado. A tabela a seguir apresenta a representação dos elementos de um vetor.
SINTAXE:
Para acessar os conteúdos dos dados de um vetor basta escrever o índice em pesquisa.
SINTAXE:
#incluir <biblioteca>
principal()
inicio
inteiro i;
real vetor[1000], soma;
para(i←1; i<=1000; i←i+1)
inicio
escreva(“Digite o número”, i,”:”);
leia(vetor[i]);
fim
4
101 – Algoritmo | Unidade 04
soma = 0;
para(i←1; i<=1000; i←i+1)
soma = soma + vetor[i];
escreva(“Soma = “, soma);
fim
Às vezes, a quantidade total de dados armazenados é conhecida, portanto, é necessário criar algoritmos
que permitam a entrada de todos estes dados.
07
Os vetores possuem seus tamanhos descritos logo no início, na declaração das variáveis, e seu endereço
interno dos valores na memória é declarado como “i”, também logo no início.
inteiro vetor[101];
inteiro i;
Para que possamos ler e escrever os valores de um vetor é necessário realizar a chamada do índice, no
caso o [i]. Assim serão lidos e apresentados na tela os valores contidos em cada vetor.
leia(vetor[i]);
escreva(vetor[i]);
O valor de [i] varia de acordo com o tamanho do vetor, essa leitura ou armazenamento depende da
mudança do valor do endereço. Para que essa mudança ocorra é necessário usar uma estrutura de
repetição. Lembrando que a estrutura de repetição PARA é utilizada quando se sabe o número de vezes
que um trecho do algoritmo deve ser repetido.
Com esses elementos elencados acima temos condições de utilizar vetores em nossos algoritmos.
08
5
101 – Algoritmo | Unidade 04
Exemplo 1
Foi realizada uma análise estatística sobre a idade de garotos de ruas em uma
determinada cidade. Elaborar um algoritmo que armazene até 100 destas idades
em um vetor e depois as apresente na ordem em que foram armazenadas.
Solução:
#incluir <biblioteca>
principal()
inicio
inteiro vetor[101];
inteiro i;
inteiro total;
para (i ← 1; i <= 100; i ←i + 1)
inicio
escreva ("Entre com um numero");
leia(vetor[i]);
total = i + 1;
fim
escreva("Os números que você digitou foram:");
para (i ← 1; i < total; i ←i + 1)
escreva(vetor[i]);
fim
09
Exemplo 2
A média aritmética é obtida dividindo-se a soma das observações pelo
número delas. Elaborar um algoritmo, para calcular a média aritmética das
50 notas de uma turma de alunos.
Solução:
#incluir <biblioteca>
principal()
inicio
real notas[50];
real soma;
inteiro i;
para(i ← 1; i <= 50; i ←i + 1)
inicio
6
101 – Algoritmo | Unidade 04
10
Exemplo 3
A média geométrica de um conjunto de números positivos é definida como
o produto de todos os membros do conjunto elevado ao inverso do
número de membros. Elaborar um algoritmo, para calcular a média
geométrica das 50 notas de 1 turma de alunos.
Solução:
#incluir <biblioteca>
principal()
inicio
real notas[50];
real prod;
inteiro i;
para(i ← 1; i <= 50; i ←i + 1)
inicio
escreva(“Digite a”, i, “nota do aluno: “);
leia(notas[i]);
fim
prod = 1.0;
para(i ← 1; i <= 50; i ←i + 1)
prod = prod*notas[i];
escreva(“Media geométrica das notas: “, pot(prod,1/50));
fim
11
Exemplo 4
O dinheiro é o meio usado na troca de bens, na compra de bens, serviços, força
7
101 – Algoritmo | Unidade 04
de trabalho, divisas estrangeiras ou nas demais transações financeiras. É emitido e controlado pelo
governo de cada país, que é o único que tem essa atribuição. Elaborar um algoritmo que, dado um
determinado valor inteiro em reais, calcule a menor quantidade de cédulas de R$ 1,00; R$ 2,00; R$ 5,00;
R$ 10,00; R$ 20,00; R$ 50,00 e R$ 100,00 que representa tal valor.
Solução exemplo 4
#incluir <biblioteca>
principal()
inicio
inteiro i, valor, quant;
inteiro tab[7] ;
tab[1] = 100;
tab[2] = 50;
tab[3] = 20;
tab[4] = 10;
tab[5] = 5;
tab[6] = 2;
tab[7] = 1;
escreva(“Digite o valor em reais: “);
leia(valor);
para(i ← 1; i < 7; i ←i + 1)
inicio
quant = valor DIV tab[i];
se (quant> 0)
inicio
escreva(“Valor da nota = ”, tab[i]);
escreva(“Numero de notas = ”, quant);
fim
valor = valor MOD tab[i];
fim
fim
Exemplo 5
A tabuada é uma tabela contendo todos os produtos dos números inteiros de 1 a
9. Elaborar um algoritmo que apresente a tabuada de um dado valor t, utilizando
vetor.
8
101 – Algoritmo | Unidade 04
Solução exemplo 5
#incluir <biblioteca>
principal
inicio
inteiro a[10], i, t;
escreva("Digite qual tabuada deseja pesquisar: ");
leia(t);
para(i ← 1; i<=10; i ←i + 1)
a[i] = i * t;
para(i ← 1; i<=10; i ←i + 1)
escreva(i, “x”, t, “=”, a[i]);
fim
12
Não é possível operar diretamente todos os valores do vetor, como um conjunto todo, mas um
de cada vez. Vejamos a imagem abaixo:
Se quisermos somar um vetor com outro, deve-se somar separadamente cada valor, unitariamente. O
mesmo ocorre se quisermos somar os valores do mesmo vetor. A soma é de um elemento com outro.
Para isso, é necessário utilizar a estrutura de repetição, a qual possibilita percorrer todo o vetor e
realizar a soma.
Os vetores também podem realizar outras operações, tudo depende da necessidade de cada algoritmo.
Exemplo 6
Elaborar um algoritmo que imprima 100 números na ordem oposta em que
foram informados em um vetor.
#incluir <biblioteca>
principal()
inicio
inteiro i;
inteiro a[100];
para(i ← 1; i <= 100; i ←i + 1)
9
101 – Algoritmo | Unidade 04
inicio
escreva(“Elemento “, i);
leia(a[i]);
fim
para(i ← 100; i>=1; i ←i - 1)
escreva(“Elemento : “, a[i]);
fim
13
Exemplo 7
Elaborar um algoritmo que imprima os elementos de posição ímpar de um vetor
de 100 elementos.
#incluir <biblioteca>
principal()
início
inteiro i;
inteiro a[100];
para (i ← 1; i <= 100; i ←i + 1)
início
escreva(“Elemento “, i);
leia(a[i]);
fim
para (i ← 1; i <= 100; i ←i + 1)
início
se (i MOD 2 = 1)
escreva(“Elemento: “, a[i]);
fim
fim
14
Exemplo 8
Elaborar um algoritmo que imprima os elementos pares de um vetor de 100
elementos.
10
101 – Algoritmo | Unidade 04
#incluir <biblioteca>
principal()
início
inteiro i;
inteiro a[100];
para (i ← 1; i <= 100; i ←i + 1)
início
escreva(“Elemento “, i);
leia(a[i]);
fim
para (i ← 1; i <= 100; i ←i + 1)
início
se (a[i] MOD 2 = 0)
escreva(“Elemento: “, a[i]);
fim
fim
15
Exemplo 9
Elaborar um algoritmo que imprima os elementos ímpares de posição par de
um vetor de 100 elementos.
Solução Exemplo 9
#incluir <biblioteca>
principal()
início
inteiro i;
inteiro a[100];
para (i ← 1; i <= 100; i ←i + 1)
início
escreva(“Elemento “, i);
leia(a[i]);
fim
para (i ← 1; i <= 100; i ←i + 1)
início
se (i MOD 2 = 0 & a[i] MOD 2 = 1)
escreva(“Elemento: “, a[i]);
fim
fim
11
101 – Algoritmo | Unidade 04
Exemplo 10
Elaborar um algoritmo que imprima os elementos pares de posição ímpar e os elementos
múltiplos de 3 de posição par de um vetor de 100 elementos.
Solução Exemplo 10
#incluir <biblioteca>
principal()
início
inteiro i, a[100];
para (i ← 1; i <= 100; i ←i + 1)
início
escreva(“Elemento “, i);
leia(a[i]);
fim
para (i ← 1; i <= 100; i ←i + 1)
início
se (i MOD 2 = 1 & a[i] MOD 2 = 0)
escreva(“Elemento:“, a[i], “de posição”, i);
se (i MOD 2 = 0 & a[i] MOD 3 = 0)
escreva(“Elemento:“, a[i], “de posição”, i);
fim
fim
Exemplo 11
Elaborar um algoritmo que carregue um vetor com dez números
inteiros. Calcule o quadrado dos valores e mostre em um vetor
resultante.
Solução Exemplo 11
#incluir <biblioteca>
principal()
inicio
inteiro vet1[10], vet2[10], i;
para (i ← 1; i <= 10; i ←i + 1)
inicio
escreva("Digite um numero ");
leia(vet[i]);
fim
12
101 – Algoritmo | Unidade 04
16
Para fixar o conceito de vetor e compreender melhor a aplicação de vetores em algoritmos, assista ao
vídeo abaixo.
https://www.youtube.com/watch?v=MWR37yk2uwo
17
RESUMO
Aprendemos até agora, que a execução dos comandos com as estruturas de controle utilizou tipos de
dados básicos, com variáveis simples dos tipos: real, inteiro, literal, caractere e lógico. Neste módulo
aprendemos situações em que os tipos de dados básicos não são suficientes para resolver os problemas,
assim, é necessário utilizar estruturas de dados homogêneas, que são estruturas que permitem
armazenar conjuntos de dados de um mesmo tipo (daí o nome ‘homogêneos’) em uma única variável.
Vimos que as estruturas de dados homogêneas são classificadas em dois tipos: os vetores (ou arrays,
que são estruturas que armazenam os dados em uma única linha e várias colunas) e as matrizes, que
são estruturas que armazenam os dados em forma de tabela, com várias linhas e várias colunas (são
bidimensionais). O vetor é um conjunto de valores do mesmo tipo, armazenados em locais contíguos na
memória e possuem o mesmo nome, ou seja, é uma variável que armazena diversas variáveis do mesmo
tipo.
1 - CONCEITO
Aprendemos no módulo passado o conceito de vetores, que são estruturas de dados unidimensionais,
com variáveis indexadas referenciadas por um único índice. Você aprendeu que, armazenando os dados
em um vetor e acessando-o, em seguida, podemos exibir suas informações em uma lista. Vimos também
13
101 – Algoritmo | Unidade 04
que os vetores lidam com apenas uma dimensão, ou seja, se fosse uma tabela, ela só teria uma coluna
com várias linhas ou uma linha com várias colunas, como podemos ver na tabela abaixo.
Exemplificamos no módulo anterior a declaração de um vetor com 1000 alunos. Infelizmente fica quase
inviável trabalhar com um vetor tão grande, por isso é indicado o uso de matriz, no caso para um vetor
de 1000 alunos teríamos uma matriz de 10x100 ou 100x10.
Para melhorar o exemplo, imagine um tabuleiro de damas ou de xadrez, podemos representar como um
vetor de 100 posições. Como você diria em qual posição está a peça branca mais avançada à direita? E
utilizando uma matriz? Caso você vá fazer as contas da posição da peça, lembre que a leitura deverá ser
da esquerda para direita, do ponto mais alto para o mais baixo.
Sendo assim, para melhor visualização e melhor forma de trabalhar nesse caso, é aconselhável utilizar
matriz, neste exemplo matriz 10x10.
02
A declaração do vetor ou matriz multidimensional é efetuada com múltiplos colchetes, que informam a
quantidade de elementos que a matriz poderá conter, podendo ser atribuídos valores aos itens em sua
declaração inicial ou, atribuídos valores durante a demanda do processamento da aplicação, de acordo
com as necessidades do algoritmo.
14
101 – Algoritmo | Unidade 04
Uma matriz pode ser definida como um conjunto de variáveis de mesmo tipo e identificadas pelo
mesmo nome. Essas variáveis são diferenciadas por meio da especificação de dois índices que definem
posições dentro dessa estrutura.
Vamos pegar como exemplo uma matriz bidimensional (duas dimensões linha X colunas). Podemos
considerar que ela será assim:
Consideramos que para acessarmos o valor um (1), localizamos o índice por sua linha (1) e coluna (1),
deste modo seu índice é (1,1). O valor 2 (dois), por exemplo, será (1, 2).
03
Nesta estrutura, o índice da esquerda indexa as linhas e o da direita indexa as colunas. Ao preencher ou
ler uma matriz, o índice mais à direita varia mais rapidamente que o índice à esquerda.
Observe a matriz 3x2 abaixo: enquanto o índice à esquerda “i” fica fixo o índice a direita “j” fica variando
mais rapidamente.
Componente [i][j]
15
101 – Algoritmo | Unidade 04
04
2 - EXEMPLOS
Vejamos alguns exemplos de algoritmos utilizando matrizes.
Exemplo 1
Elaborar um algoritmo que construa uma matriz de dimensão 20 x 10, e armazene
em cada célula o valor de 1 a 200, sequencialmente ordenados por linha. O
programa deve mostrá-los na tela em formato tabular.
#incluir <biblioteca>
principal()
inicio
inteiro mtrx [20][10];
inteiro i,j,cont;
cont← 1;
para (i←1;i<=20;i←i+1)
para (j←1;j=10;j←j+1)
inicio
mtrx[i][j] ←cont;
cont←cont + 1;
fim
para (i←1;i<=20;i←i+1)
16
101 – Algoritmo | Unidade 04
inicio
escreva(“|”);
para (j←1;j=10;j←j+1)
inicio
escreva(mtrx[i][j]);
fim
escreva(“|”);
escreva(pular linha);
fim
fim
05
Exemplo 2
Elaborar um algoritmo que carregue uma matriz 2 x 2, calcule e mostre uma
matriz resultante que será a matriz digitada multiplicada pelo maior elemento
da matriz.
#incluir <biblioteca>
principal()
inicio
inteiromat[2][2], resultado[2][2], i, j, maior;
para(i←1;i<=2;i←i+1)
inicio
para(j←1;j<=2;j←j+1)
inicio
escreva("Digite o elemento da linha”, i, “e coluna”, j);
leia(mat[i][j]);
fim
fim
maior←mat[i][j];
para(i←1;i<=2;i←i+1)
inicio
para(j←1;j<=2;j←j+1)
inicio
se (mat[i][j] > maior)
maior←mat[i][j];
fim
fim
17
101 – Algoritmo | Unidade 04
para(i←1;i<=2;i←i+1)
inicio
para(j←1;j<=2;j←j+1)
resultado[i][j] ← maior * mat[i][j];
fim
escreva("Imprimindo a matriz resultante ");
para(i←1;i<=2;i←i+1)
inicio
para(j←1;j<=2;j←j+1)
inicio
escreva(resultado[i][j]);
fim
fim
fim
06
Exemplo 3
Elaborar um algoritmo que carregue uma matriz 10 x 3 com as notas de
dez alunos em três provas. Mostre um relatório com o número do aluno
(número da linha) e a prova em que cada aluno obteve menor nota. Ao
final do relatório, mostre quantos alunos tiveram menor nota na prova
1, quantos alunos tiveram menor nota na prova 2 e quantos alunos
tiveram menor nota na prova 3.
18
101 – Algoritmo | Unidade 04
para (i←1;i<=10;i←i+1)
inicio
escreva("Aluno numero %d", i);
menor = notas[i][1];
prova_menor = 0;
para(j←1;j<=3;j←j+1)
inicio
se (notas[i][j] <= menor)
inicio
menor← notas[i][j];
prova_menor← j;
fim
fim
escreva("A menor nota do aluno”, i, “foi na”, prova_menor, prova.");
se (prova_menor = 1)
q1 = q1 + 1;
se (prova_menor = 2)
q2 = q2 + 1;
se (prova_menor = 3)
q3 = q3 + 1;
fim
escreva("Quantidade de alunos com menor nota na prova 1 = ", q1);
escreva("Quantidade de alunos com menor nota na prova 2 = ", q2);
escreva("Quantidade de alunos com menor nota na prova 3 = ", q3);
fim
07
Exemplo 4
Elaborar um algoritmo que carregue uma matriz 10 x 20 com
números inteiros e some cada uma das linhas, armazenando o
resultado das somas em um vetor. A seguir, multiplique cada
elemento da matriz pela soma da linha e mostre a matriz
resultante.
19
101 – Algoritmo | Unidade 04
para (j←1;j<=20;j←j+1)
inicio
escreva("Digite o elemento da lin=”, i, “e col=”, j, “da matriz");
leia(mat[i][j]);
fim
fim
para (i←1;i<=10;i←i+1)
inicio
soma[i] ← 0;
para (j←1;j<=20;j←j+1)
soma[i] ← soma[i] + mat[i][j];
fim
para (i←1;i<=10;i←i+1)
inicio
para (j←1;j<=20;j←j+1)
mat[i][j] ←mat[i][j] * soma[i];
fim
escreva("Imprimindo a matriz resultante");
para (i←1;i<=10;i←i+1)
inicio
escreva("Linha”, i);
para (j←1;j<=20;j←j+1)
escreva(mat[i][j]);
fim
fim
08
Exemplo 5
Uma matriz é uma série de variáveis do mesmo tipo referenciadas por um
único nome, onde cada variável é diferenciada por meio de um número
chamado índice. Elaborar um algoritmo que carregue uma matriz 3 x 3,
calcule e mostre uma matriz resultante que será a matriz digitada
multiplicada pelo menor elemento da matriz.
#incluir <biblioteca>
principal()
inicio
inteiromat[3][3], resultado[3][3], i, j, menor;
para(i←1;i<=3;i←i+1)
inicio
para(j←1;j<=3;j←j+1)
20
101 – Algoritmo | Unidade 04
inicio
escreva("Digite o elemento da linha”, i, “e coluna”, j);
leia(mat[i][j]);
fim
fim
menor←mat[i][j];
para(i←1;i<=3;i←i+1)
inicio
para(j←1;j<=3;j←j+1)
inicio
se (mat[i][j] < menor)
menor←mat[i][j];
fim
fim
para(i←1;i<=3;i←i+1)
inicio
para(j←1;j<=3;j←j+1)
resultado[i][j] ← menor * mat[i][j];
fim
escreva("Imprimindo a matriz resultante ");
para(i←1;i<=3;i←i+1)
inicio
para(j←1;j<=3;j←j+1)
inicio
escreva(resultado[i][j]);
fim
fim
fim
09
3 - MATRIZES MULTIDIMENSIONAIS
As matrizes multidimensionais possuem duas (mat [i][j]) ou mais dimensões (mat [i][j][k]), porém são
pouco utilizadas devido ao consumo de memória que exigem. O aumento é exponencial, pois guarda as
informações multidimensionais dinamicamente na memória. Conforme a necessidade do programa que
está sendo construído pode-se usar outros métodos para guardar as informações. Atualmente os
sistemas utilizam bancos de dados para isso. Bancos de dados são locais específicos onde se pode
armazenar todo o tipo de informação e recuperar, quando necessário.
21
101 – Algoritmo | Unidade 04
SINTAXE:
SINTAXE:
A lista de valores é composta por valores (do mesmo tipo da variável) separados por vírgula. Os valores
devem ser dados na ordem em que serão colocados na matriz.
10
4 - ORDENAÇÃO E PESQUISA
Uma das formas de deixar o algoritmo mais rápido é ordenando os vetores e matrizes. Isso facilita, em
uma pesquisa, encontrar mais rapidamente o que se deseja. Imagine você com um baralho completo,
você sabe que são muitas cartas e estão desordenadas. Se alguém pedir a carta 7 de Copas, você deverá
procurar a carta em todo o baralho. Sua consulta será demorada e muito, pois dependerá da sorte para
que o 7 de Copas esteja logo no início da pilha. Se a carta procurada estiver na última posição, você
passará por todas as cartas do baralho para achar a carta desejada.
Se esse baralho estivesse ordenado por número ou por naipes, sua busca seria bem mais rápida. A
ordenação ajudaria em muito a sua consulta, reduzindo drasticamente o tempo de pesquisa.
22
101 – Algoritmo | Unidade 04
11
O método bolha ordena uma lista comparando valores entre pares consecutivos e rearranjando os
valores de acordo com a ordem.
Possui esse nome pelo fato de que se um valor, que deveria estar no topo da lista, estiver embaixo, ele
vai progredindo até o seu devido lugar.
Exemplo 6
Elabore um algoritmo que carregue um vetor com 100 números inteiros. Após
isto, o algoritmo deve ordenar de maneira crescente os dados.
#incluir <biblioteca>
principal()
inicio
inteiro vet[100], i, j, aux;
para (i ← 1; i <= 100; i ← i + 1)
inicio
escreva("Digite um numero ");
leia(vet[i]);
fim
para (i ← 1; i <= 100; i ← i + 1)
para (j ← 1; j <= 99; j ← j + 1)
se (vet[j] >vet[j+1])
23
101 – Algoritmo | Unidade 04
inicio
aux←vet[j];
vet[j] ←vet[j+1];
vet[j+1] ←aux;
fim
para (i ← 1; i <= 100; i ← i + 1)
escreva(vet[i]);
fim
Para ordenar o vetor de forma decrescente é apenas necessário trocar o sinal de maior para o sinal de
menor na linha “se (vet[j] <vet[j+1])”
12
Algoritmos de pesquisa de valores, assim como os de ordenação, também têm como objetivo a
recuperação de dados. Ambos os algoritmos evoluem conjuntamente com as tecnologias da
computação.
A pesquisa linear ou sequencial é o método mais intuitivo de busca, ele lê um valor sequencialmente e
compara com todos os elementos do vetor.
Voltando ao exemplo do baralho, seria como se nós passássemos carta a carta para achar o 7 de Copas,
respeitando a sequência das cartas. Esse método é utilizado quando há pequena quantidade de
elementos para pesquisar. Imagine que temos 10 cartas no baralho e nos é solicitada uma específica.
Iremos olhar as cartas uma a uma conforme sequência.
Exemplo 7
Elabore um algoritmo que carregue um vetor com 10 números de telefones. Após
isto, o algoritmo deve informar a posição de um determinado telefone.
#incluir <biblioteca>
principal()
inicio
inteiro i, j, aux;
literalvet[10], tel;
para (i ← 1; i <= 10; i ← i + 1)
inicio
escreva("Digite um telefone ");
24
101 – Algoritmo | Unidade 04
leia(vet[i]);
fim
escreva("Pesquisa telefone ");
leia(tel);
para (i ← 1; i <= 10; i ← i + 1)
se (vet[i] == tel)
escreva("Telefone na posição ",i);
fim
13
A pesquisa binária é muito utilizada quando se quer ganhar tempo na pesquisa. Geralmente a pesquisa
binária é utilizada quando temos muitos elementos.
Se fôssemos aplicar a pesquisa binária no exemplo do baralho, deveríamos reparti-lo ao meio e verificar
se a carta que apareceu está antes ou depois daquela que estamos procurando. Caso estejamos longe
da carta procurada, devemos descartar a metade mais distante e repartir novamente o bolo do baralho.
E assim seguimos até encontrar a carta desejada. Veja que, para isso funcionar, o baralho deve estar na
ordem, ou gastaremos muito tempo na procura.
A pesquisa binária ou logarítmica é uma otimização do algoritmo simples, no entanto, neste caso, é
necessário que a lista esteja ordenada. A busca consiste em pegar o elemento central da lista e
comparar com o valor a ser buscado, caso o elemento esteja na parte superior da lista, a parte inferior
é descartada e o processo se repete.
14
Exemplo 8
Elabore um algoritmo que carregue um vetor com 10 números inteiros.
Após isto, o algoritmo deve informar a posição de um determinado
número.
25
101 – Algoritmo | Unidade 04
#incluir <biblioteca>
principal()
inicio
inteiro inicial, meio, final, i, num, vet[10];
para (i ← 1; i <= 10; i ← i + 1)
inicio
escreva("Digite um numero ");
leia(vet[i]);
fim
escreva("Pesquise o numero ");
leia(num);
inicial← 1
final← 10
enquanto (inicial <= final)
inicio
meio← (inicial + final)/2
se (num == vet[meio] )
inicio
escreva("Número na posição ",i);
inicial← final;
fim
senão
se (num <= vet[meio])
final← meio -1;
senão
inicial← meio + 1;
fim
fim
15
RESUMO
Aprendemos nesse módulo que as matrizes são conjuntos de vetores do mesmo tipo, ou melhor, são
estruturas de dados homogêneos de duas (ou mais) dimensões. As matrizes facilitam a forma de
representação das variáveis e também ajudam no armazenamento bidirecional dos dados. Aprendemos
os tipos de pesquisas e como realizar uma pesquisa linear e a pesquisa binária, que propõe agilizar uma
pesquisa quando temos muitos elementos. Não podemos esquecer que a ordenação é fundamental
para que as pesquisas possam ser rápidas e eficientes. Todas essas ferramentas ajudam no
desenvolvimento dos algoritmos e consequentemente dos futuros programas, que serão construídos
por programadores.
26
101 – Algoritmo | Unidade 04
01
1 - ESTRUTURAS
Antes de iniciarmos com o assunto “Árvores”, primeiro apresentaremos o conceito de estruturas, que
estará presente em quase todo o conteúdo desse módulo.
Buscamos nesse momento o apoio do dicionário Aurélio on-line, que descreve dessa forma a
palavra estrutura:
s.f. Maneira como um edifício ou uma coisa qualquer é construída, organizada e disposta. / Maneira
como as partes de um todo estão dispostas entre si: estrutura do corpo humano. / Armação, esqueleto,
arcabouço. / Ordem, disposição e relações das partes que compõem uma obra: a estrutura do poema. /
Geologia Natureza das camadas geológicas e disposição dessas camadas, umas em relação às outras. /
Matemática Caráter de um conjunto resultante das operações nele definidas e das propriedades dessas
operações: estrutura de grupo. / Psicologia Conjunto orgânico de formas que, segundo os gestaltistas,
seria percebido de imediato, antes da captação dos detalhes. // Reforma das estruturas, reformas
legislativas que modificam profundamente as estruturas administrativas, econômicas ou sociais de uma
coletividade. // Estrutura latente de um grupo, configuração dos membros de um grupo, que a análise
de um teste sociométrico permite pôr em evidência.
Percebemos então que a palavra estrutura pode ser usada para diversos aspectos, tudo depende da
visão e da necessidade. Necessidade essa de demonstrar as partes de um todo, que juntos formam uma
estrutura única. No exemplo abaixo é apresentada a estrutura de uma empresa, percebe-se que há uma
hierarquia funcional entre os cargos, que são representados por caixas. Essa hierarquia demonstra uma
precedência de regras e atividade do dia a dia. Na altura superior da estrutura está o Vice Presidente e
então vai descendo, explorando a área da Direção da TI, que possui três gerências no mesmo nível
hierárquico (Gerência de Infraestrutura e serviços, Gerência de Desenvolvimento e Gerência de
Arquitetura e Processos). Essas gerências estão subdivididas internamente, conforme características de
cada área.
27
101 – Algoritmo | Unidade 04
Estrutura Organizacional
02
Logo abaixo, apresentamos um exemplo de árvore genealógica, onde os mais velhos precedem os mais
jovens: temos os bisavós, avós, pais e o filho. Na verdade essa árvore é de uma pessoa somente, pois
não está considerando outros parentes, como irmãos, primos, tios etc. Seria uma árvore gigantesca se
colocássemos todos os parentes.
28
101 – Algoritmo | Unidade 04
Árvore genealógica
03
2 - ÁRVORES
As árvores são utilizadas para representar hierarquicamente estruturas, como demonstrado acima nos
exemplos da árvore genealógica e a estrutura organizacional. Na tecnologia as árvores podem ser
utilizadas para representar decisões, definições formais de linguagem ou mesmo para representar
hierarquia entre elementos.
Para melhor entendimento iremos pegar o exemplo de uma árvore, isso mesmo, só que você a colocará
de cabeça para baixo. Todas as árvores possuem raiz, a raiz é o um elemento principal da árvore, sem a
raiz não teríamos a árvore. Visualizando a imagem abaixo percebemos que a árvore além da raiz possui
outros elementos e outras ligações, que são denominados galhos ou filhos. Essas ramificações são
originadas dos nós. Os galhos levam a outros nós que também possuem outros galhos. O elemento que
não possui galhos é conhecido como folha ou nó terminal.
29
101 – Algoritmo | Unidade 04
04
Árvore binária
Uma árvore binária é um conjunto finito de elementos que está vazio ou é particionada em três
subconjuntos.
A árvore pode não ter nenhum elemento (árvore vazia). A construção de uma árvore pode ser recursiva
e, devido a isso, muitas operações sobre árvores binárias utilizam recursão. Lembrando
que recursividade é o processo de definir algo em termos de si mesmo e é, algumas vezes, chamado de
definição circular. Assim, pode-se dizer que o conceito de algo recursivo está dentro de si, que por sua
vez está dentro de si e assim sucessivamente, infinitamente, ou seja, se não tiver um mecanismo de
saída ou de parada o algoritmo entrará em loop.
As árvores onde cada nó que não seja folha numa árvore binária tem subárvores esquerda e direita.
30
101 – Algoritmo | Unidade 04
05
A figura abaixo apresenta um método convencional de representação de uma árvore. Nesta árvore, o
elemento A é a raiz da árvore, a subárvore da esquerda é o elemento B e a da direita é representada
pelo elemento C. Um nó sem ilhós é chamado de folha. Sendo A a raiz de uma árvore binária e B sua
subárvore, é dito que A é pai de B e que B é filho de A.
Representação de árvore
Sendo assim temos outras relações de parentesco conforme figura acima, onde B e C são filhos
de A, B e C são irmãos, D e E são irmãos e H e I são irmãos. Outra forma visualizada na figura é que C é
pai de F, que é pai de H e I.
As letras B, C, E, F são chamados de nós, e as letras D, G, H, I são nós sem filhos, que são chamados de
folhas.
06
Tamanho da árvore
O caminho da raiz de uma árvore até a sua folha final é calculada pela seguinte fórmula k – 1. Onde se
conta o número de nós do lado maior da árvore, que é a letra k e subtrai por um. Assim você terá o
31
101 – Algoritmo | Unidade 04
tamanho de uma árvore. Veja a figura abaixo, K é igual a 4, usando a fórmula k – 1, o tamanho da árvore
é 3. Sendo assim a raiz não se conta.
07
Altura do nó
A altura do nó pode se confundir com o tamanho, mas não é. A altura do nó é comprimento do maior
caminho do nó até alguns de seus descendentes. Descendentes do nó são todos os nós que podem ser
alcançados caminhando-se para baixo a partir da raiz. A altura de cada uma das folhas é 1. Desta
maneira a altura de A é 4, a altura de C é 3 enquanto que de D, E e F são 2 e G, H e I são 1.
08
Outro ponto importante a observar é como medir o grau de saída de cada nó. Que é número de filhos
de um nó. Por exemplo, o nó B tem grau de saída 2, o nó C tem grau 1, o nó F grau 2.
32
101 – Algoritmo | Unidade 04
09
Nível do nó
O nível de um nó pode ser definido, a partir do nó raiz, que é de nível 0. Os outros nós têm um nível que
é uma unidade a mais do que o nível do seu pai. Na árvore da figura abaixo temos:
Nível 0: A
Nível 1: B e C
Nível 2: D, E e F
Nível 3: G, H e I
10
Uma árvore completa é uma árvore binária na qual todas as folhas estão no mesmo nível k. Sendo k a
profundidade da árvore (tamanho). Para se calcular o número total de nós utiliza a seguinte fórmula
(2k+1– 1) e para calcular número total de folhas utiliza a seguinte fórmula (k2).
33
101 – Algoritmo | Unidade 04
Embora uma árvore binária completa possua muitos nós (o máximo para cada profundidade), a distância
da raiz a uma folha qualquer é relativamente pequena.
A árvore da figura abaixo tem profundidade 3, então utilizando a fórmula para calcular a quantidade de
nós:
(2k+1– 1)
(23+1– 1)
(24 - 1)
(16 – 1) = 15, então temos 15 nós.
11
Importante, primeiramente, antes de realizar uma busca em uma árvore é a organização dos dados
contidos na árvore. O objetivo de organizar é para facilitar a tarefa de procura de um determinado valor.
Lembrando que a busca em qualquer tipo de estrutura de dados é mais rápida quando os dados estão
ordenados.
A partir da raiz e de posse da informação a ser encontrada, é possível saber qual o caminho (galho) a ser
percorrido até encontrar o nó desejado. Para tanto, basta verificar se o valor procurado é maior, menor
ou igual ao nó que se está posicionando. Deve-se observar que não existe uma única forma de organizar
um conjunto de informações em uma árvore de busca binária, afinal, dependendo da escolha do nó raiz,
obtêm-se árvores diferentes.
12
3 – GRAFO
Primeiramente é bom registrar que grafo não é gráfico, apesar de os nomes serem parecidos e de o
grafo poder ser representado graficamente.
34
101 – Algoritmo | Unidade 04
Grafos são estruturas matemáticas usadas para representar ideias ou modelos, por intermédio de uma
ilustração, gráfico ou esquema.
Estritamente, em matemática, a teoria dos grafos é utilizada para representar o relacionamento entre
dois ou mais conjuntos, grandezas ou valores. A representação de um mapa de rotas, redes e outros
modelos semelhantes podem ser feita por meio do que se denominam grafos.
Vamos tomar, por exemplo, um mapa de rotas aéreas. Na figura abaixo, nota-se que existem várias
rotas de um ponto a outro, por exemplo, de Florianópolis a Brasília existem as possibilidades via
Curitiba, via São Paulo ou via Rio de Janeiro. Algumas rotas podem ter mais escalas, por exemplo, pode-
se ir a Brasília por São Paulo, passando por Curitiba, Rio e Belo Horizonte. Podemos ter também um voo
panorâmico, onde o avião sai de um lugar e volta para o mesmo lugar. Por exemplo, voo de São Paulo
para São Paulo, onde o avião sai do aeroporto de Congonhas sobrevoa a cidade e volta para Congonhas.
13
A representação de dados como estrutura de dados, pode ser aplicada em Mapas de distâncias, Mapas
Metabólicos, Diagramas e Fluxogramas, Redes de computadores, Redes Neurais, Estruturas químicas,
redes sociais etc.
35
101 – Algoritmo | Unidade 04
No caso das redes sociais, por exemplo, Facebook, Orkut, Linkedin existe um relacionamento social e
negocial entre pessoas. Nesses relacionamentos as pessoas se interligam através da amizade e grupos
de interesse. Se A é amigo de B e B é amigo de C, indiretamente, A está "conectado" a C. Essas redes de
amigos são exemplos de um grafo. Você possui amigos e está "conectado" a eles. Estes, eventualmente
estão conectados a outras pessoas. Quando entramos no perfil de um amigo e entramos no perfil de
algum conhecido do nosso amigo, que você não conhece, vimos um caminho de pessoas, de você até o
amigo do amigo. Isso é um problema de grafo. Deve-se partir de uma pessoa (você) e, percorrendo seus
relacionamentos, encontrar um "caminho" até outra pessoa.
As pessoas que se relacionam entre si são chamados de nós do grafo. Cada relacionamento entre os nós
é chamado de aresta. Abaixo, temos uma imagem que representa um GRAFO simplesmente.
Os nós podem representar os números das casas no sistema de distribuição de água, poderia ser o nome
da cidade no mapa, lista de amigos do Facebook.
14
36
101 – Algoritmo | Unidade 04
37
101 – Algoritmo | Unidade 04
Dá para perceber, a partir de todos esses exemplos, que o conceito de grafos é bastante abrangente e
pode ser utilizado para diversas coisas. Mas como assim “utilizar”? Uma das maneiras, citando o
exemplo das linhas do Metrô, como poderíamos aumentar o fluxo de pessoas em cada linha (nó)? Esse é
um grande problema hoje para as grandes cidades, como São Paulo e Rio de Janeiro. Aumentar o
número de pessoas que utilizam o metrô, tirando carros em circulação das ruas. Não é apenas construir
novos nós, ou novas estações, é um estudo de fluxo de pessoas, horários de picos, velocidade de cada
trem, temperatura etc.
É isso que torna a teoria dos grafos um campo tão estudado. As pessoas estudam esse modelo
matemático porque sabem que, se conseguirem desenvolver novos trabalhos em cima desse modelo
abstrato, esses trabalhos serão aplicáveis a inúmeros problemas reais. Imagine que você tenha
conseguido desenvolver um trabalho para aumentar o fluxo entre dois nós de um grafo. Esse seu
trabalho poderá ser aplicado a qualquer modelo, dentro das características de cada problema. É
importante então sempre levar em consideração todas as necessidades de cada problema.
Outro exemplo que podemos usar é a ampliação de casas com luz elétrica. Vejamos, expandir energia
elétrica para pessoas que não possuem pode tirar de quem já tem, ou prejudicar o funcionamento.
Ampliar e melhorar a distribuição da rede de energia elétrica é um desafio para o governo e as centrais
elétricas. Aumentar com responsabilidade.
São estudos que devem ser feitos para não prejudicar a distribuição para o restante da cidade. Estamos
vendo que não é o caso só de colocar mais postes e fios. Deve se ter um estudo de como atender a
demanda de melhoria, que é a expansão de energia para quem não tem.
38
101 – Algoritmo | Unidade 04
15
RESUMO
As estruturas estão presentes no nosso dia a dia, no trabalho, na escola, entre outras. Na tecnologia as
árvores podem ser utilizadas para representar decisões, definições formais de linguagem ou mesmo
para representar hierarquia entre elementos. As árvores também são estruturas, que apoiam em vários
momentos o desenvolvimento do software. A construção de uma árvore pode ser recursiva, até atender
a necessidade do algoritmo.
Uma árvore binária é um conjunto finito de elementos que está vazio ou é particionada em três
subconjuntos: raiz da árvore; subárvore da esquerda e subárvore da direita.
Os grafos são estruturas matemáticas usadas para representar ideias ou modelos, por intermédio de
uma ilustração, gráfico ou esquema. O seu estudo é importante para ajudar na melhoria do cotidiano
das pessoas, não somente para a TI. Estudos de fluxos de transporte, distribuição de energia, cursos de
água e rotas e áreas são exemplos de grafos e estão, todos os dias, sendo avaliados em prol da
população.
39