Академический Документы
Профессиональный Документы
Культура Документы
Técnicas de Programação
José Augusto N. G. Manzano
Ecivaldo Matos
André Evandro Lourenço
Algoritmos
Técnicas de Programação
1ª Edição
www.editoraerica.com.br
1
Dados Internacionais de Catalogação na Publicação (CIP)
(Câmara Brasileira do Livro, SP, Brasil)
Bibliografia
ISBN 978-85-365-0737-8
14-01498 CDD-005.1
Os Autores e a Editora acreditam que todas as informações aqui apresentadas estão corretas e podem ser utilizadas para qualquer m legal.
Entretanto, não existe qualquer garantia, explícita ou implícita, de que o uso de tais informações conduzirá sempre ao resultado desejado.
Os nomes de sites e empresas, porventura mencionados, foram utilizados apenas para ilustrar os exemplos, não tendo vínculo nenhum com
o livro, não garantindo a sua existência nem divulgação. Eventuais erratas estarão disponíveis para download no site da Editora Érica.
Conteúdo adaptado ao Novo Acordo Ortográco da Língua Portuguesa, em execução desde 1º de janeiro de 2009.
A ilustração de capa e algumas imagens de miolo foram retiradas de <www.shutterstock.com>, empresa com a qual se mantém contrato
ativo na data de publicação do livro. Outras foram obtidas da Coleção MasterClips/MasterPhotos© da IMSI, 100 Rowland Way, 3rd oor
Novato, CA 94945, USA, e do CorelDRAW X5 e X6, Corel Gallery e Corel Corporation Samples. Copyright© 2013 Editora Érica, Corel
Corporation e seus licenciadores. Todos os direitos reservados.
Todos os esforços foram feitos para creditar devidamente os detentores dos direitos das imagens utilizadas neste livro. Eventuais omissões
de crédito e copyright não são intencionais e serão devidamente solucionadas nas próximas edições, bastando que seus proprietários conta-
tem os editores.
Agradecemos a todos aqueles que acreditam na educação como um dos elementos undamen-
tais para a mudança social.
3
Sobre os autores
5
w
a
h
lis
w
o
e
C
ik
M
/
s
n
o
m
m
o
C
a
i
d
e
m
i
k
i
W
Somente em 1642, o rancês Blaise Pascal cria uma máquina com capacidade para realizar
somas e subtração de orma automática. Essa máquina, batizada de Pascalina, simulava por meio de
rodas dentadas o uncionamento do ábaco. Alguns anos depois, em 1672, Gottried Wilhelm Leibniz
consegue modificar a máquina de Pascal com o objetivo de incluir operações de multiplicar e dividir.
2
1
5
m
u
ie
T
/
s
n
o
m
m
o
C
ia
d
e
im
ik
W
Diversas máquinas oram criadas ao longo do tempo por diversos inventores. O objetivo das
máquinas sempre oi auxiliar em cálculos complexos ou substituir o homem em alguma atividade.
Entre as diversas máquinas que oram criadas, temos: máquina de tear (1804), de Joseph Marie
Jacquard; máquina de dierenças (1822); máquina analítica, (1837) de Charles Babbage; e máquina
)
B
y
(B
l
a
rr
a
B
o
n
ru
B
/
s
n
o
m
m
o
C
ia
d
e
im
ik
W
odas as máquinas criadas até então eram dispositivos mecânicos e não utilizavam nenhum
tipo de circuito elétrico.
A utilização de circuitos elétricos só oi possível depois que um matemático chamado George
Boole criou um sistema lógico no qual tudo poderia ser representado por meio de dois algarismos:
0 ou 1. Nascia aí a Lógica Booleana, utilizada até hoje em todos os modernos computadores. Em
sua teoria, 0 (zero) representa algo que esteja desligado, apagado, sem valor. Já o valor 1 (um) repre-
senta ligado, aceso. Com a combinação desses algarismos, podemos criar outros valores. Vejamos
um exemplo que utilize 2 algarismos:
00 - Apagado
01 - Luz verde
10 - Luz amarela
11 - Luz vermelha
Fique de olho!
Para cada algarismo utilizado, damos o nome debit. No exemplo acima, temos dois bits. Para construir os símbolos uti-
lizados em nosso alfabeto (letras e números) utilizamos oito algarismos, ou seja, oito bits. Para um conjunto de oitobits
damos o nome de byte. Portanto, para formar uma letra ou número do nosso alfabeto, utilizamos um byte.
1 byte = 8 bits
1.6.2 Compiladores
Um compilador trabalha de orma semelhante ao interpretador, porém, ao final do processo de
conversão, é gerado um arquivo chamado código executável (programa executável). O código execu-
tável é um arquivo binário que será executado diretamente pela máquina sem a necessidade de inter-
pretação linha a linha.
» Vantagens
É executado de orma mais rápida e diretamente ao nível de máquina.
»
Desvantagens
A manutenção só é possível a partir do código-onte.
O código executável gerado só poderá ser executado em máquinas de mesma arquitetura.
Exemplos: C, C++, C#, Pascal etc.
1.6.3 Tradutores
Existe um terceiro método que trabalha de orma intermediária entre os compiladores e inter-
pretadores. Umtradutor gera, a partir do código-onte, um código intermediário, mas que não exige
tanto espaço de memória quanto o código srcinal. É gerado, a partir do código intermediário, o
código executável da orma que um interpretador unciona.
» Vantagens
Independência da arquitetura que ará a execução final.
» Desvantagens
Necessidade de um interpretador específico na máquina do usuário final que ará a inter-
pretação.
Exemplo: Java
Exercício resolvido
Um uncionário recebe determinado salário mensal. Faça um programa que leia o valor do
salário mensal e o índice (em porcentagem) do reajuste a ser concedido. O programa deverá
imprimir na tela o novo salário do uncionário.
Solução
Em primeiro lugar, devemos entender o principal problema a ser resolvido. Nesse caso, calcu-
lar o valor do novo salário.
A segunda etapa apresenta um detalhamento no que se reere à entrada e saída, ou seja, deve-
-se entrar com o valor do salário atual e com o índice do reajuste para que, após o cálculo, seja
exibido o valor do novo salário.
Início
SALÁRIO, ÍNDICE
novoSalário
Fim
Você viu, na Figura 1.10, a primeira orma de notação gráfica. Agora, iremos transcrever o dia-
grama de blocos para uma orma narrativa denominada pseudocódigo ou português estruturado.
O português estruturado se aproxima muito da linguagem (por exemplo, PASCAL, C,
FORRAN, BASIC, JAVA, PHP etc.) utilizada pelos computadores para gerarem o programa a
ser executado, porém, não tem o mesmo rigor sintático de sua escrita.
A seguir, é apresentado um exemplo do algoritmo escrito em português estruturado.
programa SALARIO
var
m
O objetivo principal deste capítulo é o estudo dos mecanismos para que possamos eetuar uma
tomada de decisão simples, composta ou encadeada, por meio do processamento lógico. Para que
uma tomada de decisão seja eetuada pela máquina, destacamos, também, operadores lógicos e relacionais.
da se Na construçãocondição
determinada de algoritmos, muitas Essa
or satiseita. vezescondição
é necessário que uma
é definida parte
por umadoexpressão
código sólógica
seja executa-
cujo
resultado sempre será um valor also ou verdadeiro. A expressão lógica, que testará as condições
impostas pelo algoritmo, utiliza uma relação entre um par de elementos, o qual pode ser composto por
variável versus variável ou variável versus constante, e um operador relacional (apresentado no pró-
ximo tópico).
Ao desenvolver os diagramas de blocos, deve-se utilizar os símbolos de decisão e conexão,
conorme a Figura 3.1.
37
Amplie seus conhecimentos
ocê sabia que o ENIAC (Electronic Numerical Integrator and Computer) é considerado o primeiro computador eletrônico
digital? Foi construído entre 1943 e 1945, entrando em operação em julho de 1946 com a finalidade de ser usado em
cálculos de balística. Para seu funcionamento havia 17.468 válvulas, 1.500 relés, além de diversos outros componentes
eletrônicos, pesando 30 toneladas! Os técnicos que o operavam trabalhavam dentro do computador.
ara saber um pouco mais, consulte: <http://www.hardware.com.br/guias/historia-informatica/eniac.html>. Acesso em:
28 jan. 2014.
Diagrama de blocos
N S
Condição
Português estruturado
se (<condição>) então
m_se
<bloco de comandos que sempre será executado>
NUMERO1, NUMERO2
(NUMERO
1+ NUMERO
2)/2
MEDIA
N S
MEDIA >= 7
‘‘APROVADO’’
FIM
var
leia NUMERO1
leia NUMERO2
m_ se
m
Diagrama de blocos
N S
Condição
Português estruturado
se (<condição>) então
Exemplo
Construir um algoritmo que leia dois números reais e calcule a média aritmética desses núme-
ros. O programa deve imprimir APROVADO se a média or maior ou igual a 7.0; caso contrá-
rio, deve imprimir REPROVADO.
Solução
Para este exemplo, tomaremos como base o exemplo anterior, em que não é possível optar por
imprimir APROVADO, se a média or superior ou igual a 7, ou, do contrário, REPROVADO.
Note que devemos utilizar, aqui, o SENÃO.
Diagrama de blocos
N
Bloco de comandos que
S
Condição 2 só será executado quando a
condição 2 for verdadeira
caso <variável>
seja <opção 1> faça
3.4 Divisibilidade
Vamos ver agora um assunto que com certeza já é conhecido dos primeiros anos do ensino
1. Operações aritmé-
básico, que são operações aritméticas de divisão realizadas com números naturais
ticas de divisão com números naturais são aquelasque possuem valor de resto com quociente inteiro.
A Figura 3.10 nos apresenta os passos da divisão do número natural 5 com o número natural 2,
que dá como resultado um quociente igual a 2 e um valor de resto igual a 1.
52 52 5 2
2 2 x
Dividendo
Divisor
5 2
5 2 5 2 -4 2
4 2 -4 2
1
1 Quociente
Resto
A Figura 3.11 nos mostra que para obter o valor do resto, devemos azer a subtração do valor
do quociente multiplicado pelo divisor sob o valor do dividendo. Assim, devemos usar a expressão
Resto = Dividendo – Divisor ⋅ Quociente, que, computacionalmente, pode ser escrita como sendo:
Resto ← Dividendo – Divisor * (Dividendo div Divisor), onde o operador aritmético div az o cál-
culo de divisão com quociente inteiro.
Exemplo
Desenvolver um programa de computador que leia um valor numérico inteiro e mostre men-
sagem inormando se o número lido é par ou ímpar.
1 Números naturais são ormados pelo conjunto de todos os números inteiros positivos, incluindo-se zero e representado pela letra
N maiúscula, sendo: N = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ... }.
Diagrama de blocos
INÍCIO
N S
RESTO = 0
‘‘VALOR ‘‘VALOR
IMPAR’’ PAR’’
FIM
Português estruturado
programa PAR_OU_IMPAR
var
N, RESTO : inteiro
início
leia N
RESTO ← N - 2 * (N div 2)
se (RESTO = 0) então
Observe o uso da expressão RESO ← N − 2 * (N div 2), que obtém o valor de divisibili-
dade da operação de divisão entre a variável N (dividendo) e o valor 2 (divisor) gerando o valor do
RESO da divisão entre N e 2. A instrução de tomada de decisão az uso da condição (RESO = 0),
que é verdadeira se o valor de RESO or igual a zero.
Diagrama de blocos
N Condição 1 S
.e.
Condição 2
Português estruturado
Exemplo
Construir um algoritmo que leia dois valores. Um valor representa a média aritmética; o outro, o
número total de altas. O programa deve imprimir APROVADO se a média or maior ou igual a
7.0 e o número
programa total de altas or inerior a20; caso contrário, deve mostrar REPROVADO.
APROVADO_REPROVADO
var
FALTAS : inteiro
MEDIA : real
início
leia FALTAS
leia MEDIA
se (MEDIA >= 7.0) .e. (FALTAS < 20) então
escreva "aprovado"
senão
escreva "reprovado"
m_ se
m
Note que, na sentença do SE, ambas as condições devem ser verdadeiras para que seja
impresso “aprovado” na tela. Sendo assim, observe na abela 3.3 algumas simulações de digitação:
abela 3.3 - Exemplo de utilização do operador lógico .e.
M é dia Faltas Média>=7.0 Faltas<20 Condição1.e.Condição2
8.0 30 Verdadeira Falsa Falsa
5.0 15 Falsa Verdadeira Falsa
7.0 10 Verdadeira Verdadeira Verdadeira
N Condição 1 S
.ou.
Condição 2
Português estruturado
Exemplo
programa TESTE_OU
var
CODIGO: inteiro
início
leia CODIGO
se (CODIGO = 100) .ou. (CODIGO = 200) então
escreva "código válido"
senão
escreva "o código digitado está inválido"
m_ se
m
Teste lógico
N
Condição
Instruções a
serem executadas
Exemplo
Desenvolver um programa de computador que leia um valor inteiro qualquer, divida-o suces-
sivas vezes por 2, até que o seu valor seja menor que 5, e apresente como resultado a quantidade
de sucessivas divisões realizadas.
Solução
O programa deve possuir a variável de entrada (N) e uma segunda variável que será usada para cal-
cular a quantidade de ações (divisões sucessivas) realizadas. A variável R será iniciada com valor 0
e, a cada iteração, deverá ser acrescida de 1.
Diagrama de blocos Português estruturado
Início programa DIVISOES_SUCESSIVAS
var
R 0 N, R : inteiro
início
N
R ← 0
leia N
N
N >= 5 enquanto (N >= 5) faça
N ← N div 2
S
R ← R + 1
N Ndiv2
m_en quan to
R R+1
escreva R
m
Fim
No exemplo, utilizamos a variável R para dois propósitos: guardar o resultado final a ser exi-
bido e servir de contador. O laço apresentado eetua um pré-teste antes de permitir a execução da
rotina associada à repetição: N >= 5. Isso significa que, se o valor de N or inerior a 5, as instruções
subordinadas ao laço não serão (mais) executadas.
Ao entrar no laço, o valor de N é alterado por 2 peladivisão inteira (div). Repare que o processa-
mento está sendo realizado e o valor da variável de entrada é alterado por esse processamento. Não oi
necessário criar outra variável para guardar o cálculo. Logo em seguida, e ainda dentro do laço, o valor
do contador é alterado. Isso se repetirá até que o valor de N se torne menor que 5. Quando isso aconte-
cer, o laço será interrompido e o valor docontador, apresentado como saída doprograma.
Exemplo
Desenvolver um programa de computa- Solução
dor que leia as avaliações de consumidores
O programa deve possuir, além da variável
sobre determinado produto. Essas avaliações
são valores reais entre 5 e 10. Calcule a nota de
paraentrada (N),osuma
acumular segunda
valores lidosvariável (R)
e uma ter-
média atribuída ao produto. O usuário digi-
ceira variável (CON) para contar quantos
tará quantas avaliações considerar necessário,
valores já oram lidos. É o valor lido a cada
até que o valor digitado seja inválido (menor
iteração que será acrescido à variável R.
que 5 ou maior que 10).
A variável CON será iniciada com valor
Diagrama de blocos 0 e, a cada leitura dierente de 0, deve ser
acrescida de 1.
Início
Português estruturado
R 0
programa LACO_INTERATIVO
var
CONT 0
N, R : real
CONT : inteiro
N
início
R ← 0
N CONT ← 0
N >= 5
.e. leia N
N <= 10
enquanto (N >= 5) .e. (N <= 10) faça
S R ← R + N
R R+N
CONT ← CONT + 1
leia N
m_en quan to
CONT CONT+ 1
se (CONT > 0) então
R ← R / CONT
N
escreva R
m
S N
CONT > 0
R R/ CONT
Fim
Exemplo
Desenvolver um programa de computador que leia um número inteiro qualquer, eleve-o ao
quadrado e apresente o resultado do cálculo. Essa operação deve ocorrer até que o usuário res-
ponda SIM à pergunta “Deseja encerrar cálculo?”.
Solução
O programa deve possuir, além das variáveis de entrada (N) e de processamento do cálculo (R)
solicitado, uma terceira variável que será usada para guardar a resposta do usuário (ENCER).
A variável
SIM, ENCERrepetirá
o programa é iniciada comque
o laço, valor NÃOserá
somente e, cada vez que a resposta
interrompido quando adada or dierente
resposta or SIM. de
Diagrama de blocos Português estruturado
Início programa CALCULO_INTERATIVO
var
ENCER ← "NÃO"
repita
R N* N
leia N
R ← N * N
‘‘Deseja
encerrar?’’ escreva R
Sim
Fim
Diagrama de blocos
Var
Início, Fim,
Incremento
Instruções
Português estruturado
para <variável> de <início> até <m> passo <incremento> faça
<instruções subordinadas>
m_para
Atenção! Observe que não houve uso de condição para a escrita desse laço; não há, portanto,
teste lógico: verifica-se, apenas, se a variável de controle já chegou ao seu limite superior/inerior.
Para exemplificar o uso do laço incondicional, considere o exemplo seguinte:
IN + N+1,1
10,
R R+I
Fim
Verifique a dierença deste exemplo em relação aos demais. Neste, desde o início o programa-
dor sabia quantas iterações seriam necessárias; ele não dependia de nenhuma condição a ser veri-
ficada a cada ciclo. A variável de controle oi iniciada com o valor N + 1 e incrementada de 1 em 1
Iniciaremos o processo de troca por meio da comparação um a um, ou seja, vamos começar
pelo elemento A[1] e compará-lo com todos os demais, um por vez. Assim que encontrarmos um
elemento com valor menor que A[1], aremos uma permuta, mas continuaremos o procedimento até
que A[1] tenha sido comparado com todos os outros elementos.
Após a permuta do elemento A[1], o processo deve ser repetido para A[2]. Não será necessário
compará-lo com o novo valor de A[1] porque, após a primeira permuta, já sabemos que esse valor é
o menor de todos e, portanto, está na posição adequada. Esse processo será repetido sucessivas vezes
com os demais elementos até que tenhamos ordenado todo o conjunto.
Vamos, então, executar o algoritmo de troca no conjunto de dados da matriz A. Para iniciar,
basta comparar o valor do elemento armazenado em A[1] com o valor do elemento em A[2]. Como
oA[2],
elemento em aA[2]
deixando é menor
matriz com osque o elemento
elementos nestaem A[1], é preciso azer uma permuta entre A[1] e
ordem:
A[1] = 8 | A[2] = 45 | A[3] = 17 | A[4] = 5 | A[5] = 2
Continuaremos a comparação do valor de A[1] = 8 com o valor de A[3] = 17. Nesse caso, A[3]
não é menor que A[1], portanto não haverá troca. Seguiremos, assim, com a execução do algoritmo,
comparando o valor de A[1] com o de A[4].
O elemento em A[4] é menor que o valor em A[1], então esses elementos serão trocados, dei-
xando a matriz com a seguinte configuração:
A[1] = 5 | A[2] = 45 | A[3] = 17 | A[4] = 8 | A[5] = 2
Perceba
mais baixo, que,
mais à medida
próximo do que o algoritmo
ideal, que, nesse executa
caso, é oanúmero
ordenação,
2. o valor do primeiro elemento fica
Continuamos o processo, desta vez comparando o valor de A[1] com o de A[5]. Como A[5]
possui o valor 2, que é menor que o valor 5 armazenado em A[1], haverá permuta entre esses dois
elementos. Após essa troca, a matriz fica da seguinte orma:
A[1] = 2 | A[2] = 45 | A[3] = 17 | A[4] = 8 | A[5] = 5
Não há mais elementos a serem comparados com A[1] e, por esse motivo, já temos o valor
final esperado para o elemento A[1]. Assim, não precisamos mais eetuar comparações com o ele-
mento A[1].
A[1] = 2 | A[2] = 45 | A[3] = 17 | A[4] = 8 | A[5] = 5
Não há mais comparações a serem eitas. Pode-se notar que a classificação oi realizada, ou
seja, a matriz está ordenada:
A[1] = 2 | A[2] = 5 | A[3] = 8 | A[4] = 17 | A[5] = 45
Para outros tipos de dados, como caractere ou string (cadeia), o processo de classificação segue
os mesmos passos; o algoritmo é o mesmo, só muda o tipo de dado. Lembre-se de que a ordem a
ser considerada é a da tabela ASCII. Logo, “A” tem valor menor (vem antes) que “B” e “A” também é
menor que “a”; essa ordem é dada pelo valor numérico associado a cada caractere.
var
I 1,20,1
ESTUD : conjunto[1..20] de cadeia
I, J : inteiro
ESTUD[I]
X : cadeia
início
I 1, 19, 1
para I de 1 até 20 passo 1 faça
leia ESTUD[I]
J 1,20,1
m_para
ESTUD[I] ← ESTUD[J]
ESTUD[J] ← X
m_ se
m_ pa ra
I 1,20,1
m_ pa ra
ESTUD[I]
para I de 1 até 20 passo 1 faça
escreva ESTUD[I]
Fim
m_ pa ra
disciplina cadeia
falta conjunto[1..4]de inteiro
tipo
FICHA_ACADEMICA = registro
NOME : cadeia
SERIE : inteiro
TURMA : caractere
DISCIPLINA : cadeia
m_registro
var
aluno : cha_academica
Note que a definição para a criação da variável não soreu ajuste; houve alteração apenas na
estrutura do registro.
falta conjunto[1..4]deinteiro
nota conjunto[1..4]dereal
O português estruturado para a estrutura criada na abela 7.5 pode ser observado a seguir:
tipo
BIMESTRE = registro
m_registro
FICHA_ACADEMICA = registro
NOME : cadeia
SERIE : inteiro
TURMA : caractere
DISCIPLINA : cadeia
BOLETIM : bimestre
m_registro
var
ALUNO : cha_academica
Após o uso do comando var, é indicada a variável de registro aluno, ormada por um conjunto
(vetor) de cinco registros do tipo de dado derivado FICHA_ACADEMICA.
Utilização de Sub-rotinas 99
Dividimos, portanto, o problema em dois a depender do valor da chave de busca:
» busca binária nos elementos a1 até a(n/2)-1 do vetor;
» busca binária nos elementos a (n/2)+1 até an do vetor.
O processo de divisão e conquista se repete até que, então, o valor procurado seja encontrado
ou descubra-se que o valor não está no vetor. Note que o processo de divisão é realizado quantas
vezes or necessário.
Perceba também que nesse algoritmo, os processos de dividir e de conquistar são iterativos e
incrementais, ou seja, ocorrem várias vezes, e a cada vez que ocorrem, o algoritmo está mais pró-
ximo de encontrar a chave de busca 1 (ou de inormar que ela não consta no conjunto de dados).
Note que esse método é semelhante ao que realizamos ao procurar uma palavra (nossa chave
de busca) em um dicionário.
Vejamos um exemplo da aplicação desse algoritmo. Encontrar o número 4 no vetor ordenado
V = {1, 3, 4, 9, 10, 11, 15}. Antes de resolver, saiba que o vetor V possui 7 elementos, logo n = 7.
A primeira decisão é aplicada: 4 está na posição n/2, ou seja, na posição 3? Não, pois nessa
posição está o valor 9. Então, dividiremos o vetor em dois subconjuntos:
»
programa BUSCA_BINARIA
INÍCIO
var
V : conjunto[
1..20] de inteiro
I 1,20,1
X, N, MEIO, ESQUERDA, DIREITA, I: inteiro
início
fm_para
N 20
ESQUERDA 0
DIREITA N N ← 20
ESQUERDA ← 0
DIREITA ← N
X
leia X
S
MEIO (ESQUERDA + DIREITA) DIV 2 se (V[MEIO] = X) então
escreva MEIO
senão
N S
V [MEIO] = X se (V[MEIO] < X) então
ESQUERDA ← MEIO + 1
N S MEIO
V [MEIO] < X senão
DIREITA ← MEIO - 1
DIREITA MEIO - 1 ESQUERDA MEIO + 1
fm_se
fm_se
fm_enquanto
fm
FIM
8.3 Procedimentos
O programador deve sempre se lembrar de manter a legibilidade dos algoritmos e códigos-
-onte dos seus programas. Para isso, é preciso utilizar-se de vários mecanismos. Um deles é a modu-
larização do programa. Ao criar módulos de programas, o programador permite estabelecer ações
pontuais para cada porção de código, deixando o programa mais limpo e, consequentemente, mais
ácil de eetuar manutenção.
Atualmente, há diversas ormas de modularização. Neste capítulo, estudaremos duas ormas:
procedimentos e unções.
Procedimentos são subprogramas (também conhecidas por sub-rotinas), ou seja, partes de um
programa maior, com finalidade específica. Os procedimentos executam uma determinada tarea com
uso ou não de parâmetros de entrada, mas jamais retornam valores ao programa que o chamou. Os
parâmetros são valores enviados pelo programa principal para correta execução dos procedimentos.
odo procedimento deve ter uma assinatura. A assinatura é composta pelo identificador do
procedimento e seus parâmetros de entrada, caso tenha. ambém pode ter espaço para declaração de
variáveis. Essas variáveis só poderão ser utilizadas dentro do procedimento onde oram declaradas.
m_procedimento
I, J : inteiro
X : cadeia
início
var
ESTUD : conjunto[
1..20] de cadeia
I: inteiro
início
para I de 1 até 20 passo 1 faça
leia ESTUD [I]
m_para
Ordenacao_Vetor(ESTUD, 20)
I, ACUMULADOR : inteiro
início
Nesse exemplo, considerando que oi lido o valor N = 10, será apresentada na tela a
seguinte saída:
10
100
100
O último valor reere-se à variável N, que, por ter sido passada por reerência à unção
Cálculo, oi alterado dentro dessa unção, dierente do que ocorreu no exemplo em que N oi pas-
sada por valor. Veja, também, que para passar valor por reerência a uma unção ou procedimento é
necessário colocar a palavra “var” antes do nome do parâmetro na assinatura da sub-rotina.
Vamos recapitular?
1) Escreva uma sub-rotina que receba por parâmetro um número inteiro e imprima se
ele é divisível por 7 ou não. Decida se usará procedimento ou unção e explique o
porquê da escolha.
2) Escreva um procedimento
determinado quee,receba
animal pertence por parâmetro
em seguida, imprima o nome
códigododogrupo
grupoe ao qual um
a constante
K para cálculo da taxa metabólica basal (MB), conorme tabela a seguir:
3) Escreva uma unção que receba por parâmetro o peso metabólico (PM) de um ani-
mal (peso total do animal expresso em quilogramas) e o grupo ao qual esse animal
pertence e calcule a taxa metabólica basal (MB). A taxa metabólica basal é o peso
metabólico elevado a 0,75 e multiplicado por uma constante K. O valor de K depen-
de do grupo do animal, conorme tabela do exercício anterior.
Fórmula de cálculo da taxa metabólica basal: MB = (PM ↑ 0,75) * K
4) Escreva um procedimento que receba por parâmetro o peso metabólico (PM) de um
animal (peso total do animal expresso em quilogramas), o grupo ao qual esse animal
pertence e uma letra (flag). Se a letra or B, o procedimento deve chamar uma unção
para calcular a taxa metabólica basal (MB). Se a letra or E, o procedimento deve
chamar
da ME,umausarunção para acalcular
a órmula seguir. aOtaxa metabólica
valor específica
da constante (ME). Para
K corresponde o cálculo
ao grupo do
animal, sendo o mesmo tanto para o cálculo da MB como da ME.
Fórmula de cálculo da taxa metabólica específica: ME = (PM ↑ 0,25) * K
Neste capítulo, serão abordados de maneira introdutória e mais didática possível conceitos preli-
minares do uso de medidas de complexidade de algoritmos para estudantes iniciantes em programação
de computadores.
O que
um livro apresentamos
introdutório sobreaqui sobre
lógica análise de algoritmos
de programação e suas complexidades
de computadores não é comum
para programadores em
iniciantes,
como este. A disponibilidade de livros em português é pequena e o oco desse estudo é ministrado
em cursos mais avançados de programação. Assim sendo, o tema ora abordado constitui-se em uma
visão preliminar com o objetivo de indicar ao nosso estudante os próximos passos a serem seguidos
no estudo da lógica de programação e no aproundamento desse estudo, que se estende com a apren-
dizagem de uma disciplina denominada Estrutura de Dados.
A expressão Análise de Algoritmos, como é usada e como a conhecemos, oi idealizada por
Donald E. Knuth quando publicou em 1968 o primeiro volume de uma série de sete livros intitulado
Te Art o Computer Programming (A Arte da Programação de Computadores) não tendo este traba-
lho tradução para o português.
109
A disciplina de Análise de Algoritmos tem por objetivo estudar os problemas computacionais
que se apresentam de orma recorrente, que se mostram de dierentes ormas (FEOFILOFF, 2013).
Nesse sentido, podemos entender que essa disciplina visa, para um dado problema, nos mostrar:
» a prova de que o algoritmo que estamos usando está correto.
» a estimativa da complexidade do tempo que a execução do algoritmo consome.
» a estimativa do espaço de memória usada para seu armazenamento.
Veja que, com base no exposto fica ácil concordar com as palavras de Almeida (2000, p. 3)
que nos diz que um “algoritmo não é a solução de um problema, pois, se assim osse, cada problema
teria um único algoritmo”. Note que poderão existir para a solução de um problema vários cami-
nhos, vários algoritmos. Assim sendo, um problema poderá ser resolvidos com o uso de vários algo-
ritmos (PRESES, 2011), Almeida (2000, p. 3) acrescenta ainda que “algoritmo é um caminho para
a solução de um problema, e em geral, os caminhos que levam a uma solução são muitas”. Análise de
Algoritmos é a orma com a qual poderemos medir qual algoritmo é o melhor para responder a certo
problema, pois como afirma Prestes (2011) “o ato de um algoritmo resolver um dado problema não
significa que seja aceitável na prática”.
Se tivermos dois algoritmos para a solução de um mesmo problema, a ação prática da Análise
de Algoritmos nos permitirá decidir dos dois algoritmos ornecidos, aquele que seja melhor eficiente
(otimilidade de algoritmos).
realiza sua tarea É undamental
até atingir seu sabermos
objetivo e que eficáciaque
é o eficiência é asi.orma
objetivo em como um devem
Os algoritmos algoritmo
ser
eficazes, devem atender seus objetivos, devem ornecer uma solução de boa qualidade a certo pro-
blema. Assim, a eficiência é o grau de satisação de boa qualidade medido pela Análise de Algoritmos
para saber qual dos algoritmos encontrados é o melhor para solucionar o problema existente.
Para analisar a eficiência no uso de certo algoritmo, é necessário levar em consideração a exis-
tência de duas possibilidades de análise, como mostra Matos (2008, p. 13):
» Pormenorizada: mais exata e direta, em geral menos útil, pois:
é expressa em segundos;
resultado da avaliação da eficiência (por exemplo, tempo gasto): único e dependente da
velocidade e características do processador.
» Por meio de ordens de grandeza: ignora as constantes multiplicativas e é uma análise
assintótica (método para medir o tempo total gasto por um algoritmo para realizar certa
tarea computacional), isto é:
expressa em ordens de grandeza;
resultado da avaliação da eficiência: paramétrico (uma unção do comprimento dos
dados) e independente da velocidade e características do processador.
Com base nessa explicação, podemos dizer que a Análise de Algoritmos é uma disciplina de
Engenharia, de Matemática ou da Ciência da Computação, dependendo do enoque que queira se
dar, que procura prever o comportamento de um algoritmo antes mesmo que seja implementado
Nós, programadores de computador, temos que sempre levar em consideração que todo pro-
jeto de programa pode vir a ser influenciado pelo estudo de seus comportamentos. Após um pro-
blema ser analisado e as decisões sobre o projeto serem tomadas, o algoritmo em si deve ser imple-
mentado na orma de um programa de computador. Nesse instante, devemos analisar as inúmeras
alternativas que poderemos aplicar, devemos considerar os aspectos de tempo de execução e espaço
de memória ocupado. As alternativas encontradas para o desenvolvimento desses algoritmos podem
ser localizadas em outras disciplinas tais como: pesquisa operacional, otimização, teoria de graos,
estatísticas, probabilidades etc. (CLAUDINO, 2013).
Knuth (apud CLAUDINO, 2013, p. 8) inorma que “na área de estudo dos algoritmos, há dois
tipos de problemas bem distintos” a serem considerados: a análise de um algoritmo particulare a
análise de uma classe de algoritmose assim os especifica:
»
A análise de um algoritmo particularleva em conta o custo do uso de um dado algoritmo
para equacionar um problema específico. Características importantes do algoritmo devem
ser investigadas, geralmente uma análise do número de vezes que cada parte do algoritmo
deve ser executada, seguida do estudo da quantidade de memória necessária a ser utili-
zada por certo computador.
» A análise de uma classe de algoritmosvisa identificar o algoritmo de menor custo possível
para resolver um determinado problema particular. oda uma amília algoritmos para resol-
ver um problema específico deve ser investigada com o objetivo de identificar o algoritmo
que seja o melhor possível. Isso significa colocar limites para a complexidade computacio-
nal dos algoritmos pertencentes à classe. Por exemplo, é possível estimar o número mínimo
de comparações necessáriaspara ordenar “n” números por meio de comparações sucessivas.
Em relação à otimilidade de algoritmos Potros (2013, p. 3) nos orienta que “para um deter-
minado problema, pode existir várias resoluções algorítmicas, então se az necessário escolher o
melhor” e acrescenta que “se a mesma medida de custo é aplicada a dierentes algoritmos, então é
possível compará-los e escolher o mais adequado para resolver o problema”.
Entre as várias maneiras a qual se pode medir o custo de utilização de um algoritmo Ziviani
(1999, p. 4) nos mostra que a ”orma mais adequada de se medir o custo de utilização de um algoritmo
é através do uso de um modelo matemático”, acrescenta que “o conjunto de operações a serem execu-
tadas deve ser especificado, assim como o custo associado com a execução de cada operação”. Desta
orma, o modelo matemático indicado para medir o custo de execução de certo algoritmo reere-se ao
uso de uma unção de complexidade denominada (n).
A unção de complexidade (n) pode ser utilizada para a obtenção da métrica de tempo
(medida do tempo de execução consumida, dado um conjunto de entrada de dados, que certo
algoritmo requer para produzir uma resposta) ou da métrica de espaço (medida da quantidade de
memória de computador que o algoritmo necessita para sua execução).
Se a unção de complexidade (n) or usada para medir a quantidade do tempo necessário
para executar certo algoritmo de tamanho n, então é considerada como unção de complexidade
de tempo do algoritmo. Caso a unção de complexidade (n) seja usada para medir a quantidade da
memória de computador necessária para executar um algoritmo de tamanho n, então é chamada
unção de complexidade de espaço do algoritmo (ZIVIANI, 1999, p. 4). Podemos considerar como
relações uncionais os aspetos:
» emporal: unção de complexidade de tempo que tem por finalidade relacionar o tama-
nho da entrada com o tempo de execução:
t = (n)
» Espacial: unção de complexidade de espaço que tem por finalidade relacionar o tamanho
da entrada com o espaço de memória necessário para o armazenamento requerido:
e = (n)
Em termos práticos o ator de medida mais usado é a unção de complexidade de tempo: t = (n).
Isso significa que essa unção é normalmente calculada em primeira instância, ficando, a unção de com-
plexidade de espaço:e = (n) em segunda instância. A escolha da unção de complexidade a ser usada
dependerá do tipo de métrica que se deseja avaliar para escolher o algoritmo de melhor otimilidade.
Exemplo
Como exemplo de recursividade considere uma unção que calcule o valor do atorial de um
N S
LIMITE N <= 1
programa CALC_FAT
se (N <= 1) então
FATORIAL ← 1
senão
FATORIAL ← FATORIAL(N - 1) * N
m_se
m
var
LIMITE : inteiro
início
m
mento
o trechodado
unção e o retorno
programa do valor120
que eetuou para
a chamada
FATORIAL 1
da unção. A Figura 9.5 demonstra grafica-
mente a lógica de uncionalidade e de ação e
mostra como unciona uma unção recursiva RETORNA 1
(backtraking). Cada instância de chamada da RETORNA 2 * 1
unção recursivaFAORIAL()ocorre de orma RETORNA 3 * 2
RETORNA 4 * 6
a empilhar cada uma das instâncias da unção
RETORNA 5 * 24
em operação para depois, no retorno, eetuar a RETORNA 120
multiplicação sucessiva típica do valor retorna-
do com o valor armazenado na pilha, a fim de Figura 9.5 - Esquema lógico de
uncionalidade e ação de unção recursiva.
calcular a atorial solicitada.
(MANZANO; FIGUEIREDO, 2012)
OFFOLO, . Análise de Algoritmos . Minas Gerais: universidade Federal de Ouro Preto, 2012.
Disponível em: <http://www.decom.uop.br/toffolo/ensino/todas/bcc202_2012-1/aulas/>. Acesso
em: 19 dez. 2013.
VENANCIO, C. F.Desenvolvimento de Algoritmos:Uma Nova Abordagem. São Paulo: Érica, 1998.
VERZELLO, R. J. Processamento de Dados. São Paulo: McGraw-Hill, 1984.
WEBER, R. F. Fundamentos de Arquitetura de C omputadores. 3. ed. Porto Alegre: Instituto de
Inormática UFRGS: Editora Sagra Luzzato, 2004.
Bibliografia 127
Marcas Registradas
odos os nomes registrados, marcas registradas ou direitos de uso citados neste livro pertencem aos
seus respectivos proprietários.