1. Algoritmos e Estruturas de Dados I
Marcos Castilho Fabiano Silva Daniel Weingaertner
Vers˜o 0.7
a
Maio de 2011
2. 2
Algoritmos e Estruturas de Dados I - Notas de Aula est´ licen-
a
ciado segundo a licen¸a da Creative Commons Atribui¸ao-Uso
c c˜
N˜o-Comercial-Vedada a Cria¸˜o de Obras Derivadas 2.5 Bra-
a ca
sil License.http://creativecommons.org/licenses/by-nc-nd/
2.5/br/
Algoritmos e Estruturas de Dados I - Notas de Aula is licen-
sed under a Creative Commons Atribui¸ao-Uso N˜o-Comercial-
c˜ a
Vedada a Cria¸ao de Obras Derivadas 2.5 Brasil License.http:
c˜
//creativecommons.org/licenses/by-nc-nd/2.5/br/
AVISO: Este texto ainda est´ em constru¸˜o.
a ca
3. Sum´rio
a
1 Introdu¸˜o
ca 7
2 Sobre problemas e solu¸˜es
co 9
2.1 Contando o n´mero de presentes em um evento . . . . . . . . . . . . . 9
u
2.2 Trocando os quatro pneus . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3 Conclus˜o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
a
3 Sobre algoritmos e programas 15
3.1 O que ´ um algoritmo? . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
e
3.2 O que ´ um programa? . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
e
3.3 Exerc´
ıcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4 O modelo do computador 21
4.1 Hist´rico . . . . . . . . . . . . . . . . . . . . . . . . . .
o . . . . . . . . . 21
4.2 Princ´ ıpios do modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.2.1 Endere¸os versus conte´dos . . . . . . . . . . .
c u . . . . . . . . . 22
4.2.2 O repert´rio de instru¸oes . . . . . . . . . . . .
o c˜ . . . . . . . . . 23
4.2.3 O ciclo de execu¸˜o de instru¸oes . . . . . . . .
ca c˜ . . . . . . . . . 25
4.2.4 Exemplo de execu¸ao de um programa . . . . .
c˜ . . . . . . . . . 25
4.3 Humanos versus computadores . . . . . . . . . . . . . . . . . . . . . . . 26
4.3.1 Abstra¸˜o dos endere¸os . . . . . . . . . . . . .
ca c . . . . . . . . . 27
4.3.2 Abstra¸˜o dos c´digos das instru¸oes . . . . . .
ca o c˜ . . . . . . . . . 28
4.3.3 Abstra¸˜o do repert´rio de instru¸˜es . . . . . .
ca o co . . . . . . . . . 29
4.3.4 Abstra¸˜o dos endere¸os de mem´ria (vari´veis)
ca c o a . . . . . . . . . 30
4.4 Abstra¸ao das instru¸˜es (linguagem) . . . . . . . . . .
c˜ co . . . . . . . . . 31
4.5 Conclus˜o . . . . . . . . . . . . . . . . . . . . . . . . .
a . . . . . . . . . 33
4.6 Exerc´ ıcios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5 Conceitos elementares 37
5.1 Algoritmos e linguagens de programa¸ao . . . . . .
c˜ . . . . . . . . . . . 37
5.2 C´lculo de ra´ de uma equa¸ao do segundo grau
a ızes c˜ . . . . . . . . . . . 38
5.3 Imprimir a soma de dois n´meros dados . . . . . .
u . . . . . . . . . . . 39
5.4 Imprimindo sequˆncias de n´meros na tela . . . . .
e u . . . . . . . . . . . 40
5.5 Imprimir os quadrados de uma faixa de n´meros . .
u . . . . . . . . . . . 44
5.6 Imprimindo a soma de v´rios pares de n´meros . .
a u . . . . . . . . . . . 44
3
7. Cap´
ıtulo 1
Introdu¸˜o
ca
Este material cont´m notas de aulas da disciplina CI055 – Algoritmos e Estruturas de
e
Dados I, ministrada para os curso de Bacharelado em Ciˆncia da Computa¸ao (BCC),
e c˜
Matem´tica Industrial (MatInd) e para o Bacharelado em Inform´tica Biom´dica
a a e
(BIB) da Universidade Federal do Paran´. a
Esta disciplina ´ ministrada no primeiro semestre (para os calouros) e ´ a primeira
e e
das quatro que cobrem o conte´do b´sico de algoritmos sem o qual um curso de
u a
computa¸ao n˜o faz sentido. As disciplinas subsequentes s˜o:
c˜ a a
• Algoritmos e Estruturas de Dados II;
• Algoritmos e Estruturas de Dados III; e
• Algoritmos e Teoria dos Grafos.
A orienta¸˜o da Coordena¸ao dos cursos ´ que este deve ter um conte´do forte
ca c˜ e u
em conceitos de algoritmos no qual a implementa¸ao final em uma linguagem de pro-
c˜
grama¸ao ´ vista apenas como um mecanismo facilitador ao aprendizado dos conceitos
c˜ e
te´ricos.
o
O texto est´ dividido em duas partes bem definidas, a primeira entre os cap´
a ıtulos 2
e 9, cont´m os princ´
e ıpios b´sicos da constru¸˜o de algoritmos elementares, incluindo
a ca
a parte de subprogramas, com especial aten¸˜o a quest˜es tais como passagem de
ca o
parˆmetros e vari´veis locais e globais. A no¸˜o de modularidade ´ bastante explorada.
a a ca e
A segunda parte, a partir do cap´ ıtulo 10, cont´m princ´
e ıpios de estruturas de dados
b´sicas, onde se introduz a no¸ao de vetores unidimensionais, a primeira das estruturas
a c˜
de dados. Nesta estrutura, praticamos a elabora¸˜o de algoritmos modulares e j´ n˜o
ca a a
escrevemos um c´digo inteiro, mas sim um conjunto de fun¸oes e procedimentos que,
o c˜
em uma abordagem por refinamentos sucessivos (top down), s˜o constru´
a ıdos passo a
passo.
Alguns algoritmos importantes s˜o estudados em suas vers˜es b´sicas: busca e
a o a
ordena¸ao de vetores. No¸˜es de complexidade de algoritmos s˜o mencionadas, ainda
c˜ co a
que de modo informal, pois isto ´ conte´do de per´
e u ıodos mais avan¸ados. Contudo, ´
c e
importante ao aprendiz ter no¸ao clara da diferen¸a de custo entre diferentes algorit-
c˜ c
mos.
7
8. 8 CAP´ ¸˜
ITULO 1. INTRODUCAO
As ultimas estruturas de dados relevantes para o primeiro per´
´ ıodo s˜o as matrizes
a
e o conceito de registro. Havendo tempo, tamb´m se discute estruturas um pouco
e
mais sofisticadas, misturando-se vetores, registros e matrizes.
Finalmente se oferece um desafio aos alunos. O objetivo ´ o de mostrar uma
e
aplica¸ao interessante dos conceitos que eles j´ dominam. Normalmente trabalha-se
c˜ a
em sala de aula o desenvolvimento de um programa que tem sido a constru¸ao de um
c˜
jogo simples que pode ser implementado em uma estrutura de matriz, eventualmente
com registros. A ideia ´ que eles possam fazer um programa mais extenso para
e
treinarem a constru¸ao de programas modulares. Este material constitui o ultimo
c˜ ´
cap´ıtulo deste material.
O estudante n˜o deve iniciar uma parte sem antes ter compreendido o conte´do
a u
das anteriores. Tamb´m n˜o deve iniciar um novo cap´
e a ıtulo sem ter compreendido os
anteriores.
Sobre a linguagem, o estudante ´ encorajado a buscar apoio na literatura e nos
e
guias de referˆncia dispon´
e ıveis para o compilador escolhido (Free Pascal ), incluindo
um guia de referˆncia b´sico que foi escrito pelos monitores da disciplina no ano de
e a
2009.
A leitura destas notas de aula n˜o isenta o estudante de buscar literatura comple-
a
mentar, sempre bem-vinda. Em particular, uma ´tima hist´ria da computa¸ao pode
o o c˜
ser encontrada em [Tre83]. Alguns excelentes textos introdut´rios em algoritmos est˜o
o a
em [Car82], [Sal98], [Med05] e [Wir78]. Para mais detalhes de programa¸˜o em Pascal
ca
o leitor pode consultar [Far99] e tamb´m os guias de referˆncia da linguagem [Gui].
e e
Finalmente, embora talvez de dif´ compreens˜o para um iniciante, recomendamos
ıcil a
pelo menos folhear o material em [Knu68].
9. Cap´
ıtulo 2
Sobre problemas e solu¸oes
c˜
Vamos iniciar nosso estudo com uma breve discuss˜o sobre problemas e solu¸˜es. O
a co
objetivo ´ deixar claro desde o in´ que:
e ıcio
• n˜o existe, em geral, uma unica solu¸˜o para o mesmo problema;
a ´ ca
• algumas solu¸oes s˜o melhores do que outras, sob algum crit´rio;
c˜ a e
• alguns problemas s˜o casos particulares de outros similares;
a
• as vezes, ´ melhor resolver o problema mais gen´rico, assim, resolve-se uma
e e
classe de problemas, e n˜o apenas um.
a
Ser˜o apresentados dois problemas reais e para cada um deles segue uma discuss˜o
a a
sobre a existˆncia de diversas solu¸oes para um dado problema. A ˆnfase ser´ dada
e c˜ e a
nas diferen¸as entre as solu¸˜es e tamb´m na discuss˜o sobre at´ que ponto deve-se
c co e a e
ficar satisfeito com a primeira solu¸ao obtida ou se ela pode ser generalizada para
c˜
problemas similares.
2.1 Contando o n´ mero de presentes em um evento
u
No primeiro dia letivo do primeiro semestre de 2009, um dos autores deste material
colocou o seguinte problema aos novos alunos: quer´ ıamos saber quantos estudantes
estavam presentes na sala de aula naquele momento. A sala tinha capacidade aproxi-
mada de 100 lugares e a naquele momento estava razoavelmente cheia.
Os estudantes discutiram v´rias possibilidades. Apresentamos todas elas a seguir.
a
Primeira solu¸˜o
ca
A primeira solu¸ao parecia t˜o obvia que levou algum tempo at´ algum aluno verbali-
c˜ a ´ e
zar: o professor conta os alunos um por um, tomando o cuidado de n˜o contar algu´m
a e
duas vezes e tamb´m de n˜o esquecer de contar algu´m.
e a e
Quais s˜o as vantagens deste m´todo? Trata-se de uma solu¸ao simples, f´cil de
a e c˜ a
´ uma solu¸ao perfeita para salas de aula com
executar e produz o resultado correto. E c˜
9
10. 10 CAP´ ¸˜
ITULO 2. SOBRE PROBLEMAS E SOLUCOES
poucos alunos, digamos, 20 ou 30. Outro aspecto considerado foi o fato de que este
m´todo n˜o exige nenhum conhecimento pr´vio de quem vai executar a opera¸˜o, a
e a e ca
n˜o ser saber contar. Tamb´m n˜o exige nenhum equipamento adicional.
a e a
Quais as desvantagens? Se o n´mero de alunos na sala for grande, o tempo ne-
u
cess´rio para o t´rmino da opera¸ao pode ser insatisfat´rio. Para piorar, quanto
a e c˜ o
maior o n´mero, maior a chance de aparecerem erros na contagem. Foi discutida a
u
adequa¸ao desta solu¸˜o para se contar os presentes em um com´ ou manifesta¸ao
c˜ ca ıcio c˜
popular numa pra¸a p´blica. Concluiu-se pela inviabilidade do m´todo nestes casos.
c u e
Executamos a contagem em aproximadamente 1 minuto. Dois alunos tamb´m e
fizeram a contagem e, ap´s conferˆncia, obtivemos o resultado correto, que serviu
o e
para an´lise das outras solu¸˜es.
a co
Segunda solu¸˜o
ca
Pensando no problema de se contar na ordem de 100 alunos, um estudante sugeriu
que se fizesse apenas a contagem das carteiras vazias e em seguida uma subtra¸ao com
c˜
rela¸ao ao n´mero total de carteiras na sala.
c˜ u
A solu¸˜o tamb´m ´ muito simples e funciona perfeitamente bem, mas exige um
ca e e
conhecimento pr´vio: deve-se saber antecipadamente o total de carteiras na sala.
e
Esta maneira de contar ´ cada vez melhor quanto maior for o n´mero de presentes,
e u
pois o n´mero de carteiras vazias ´ menor do que o das ocupadas. Por outro lado, se
u e
a sala estiver com pouca gente, o m´todo anterior ´ mais eficiente.
e e
Os alunos observaram tamb´m que a solu¸ao n˜o se aplica para os casos de con-
e c˜ a
tagem de presentes a um com´ numa pra¸a p´blica, pois n˜o h´ carteiras na rua.
ıcio c u a a
Terceira solu¸˜o
ca
Para resolver o problema do com´ ıcio, outro estudante sugeriu que se fizesse uma
estimativa baseada na metragem total da pra¸a, multiplicada pelo n´mero estimado
c u
de pessoas por metro quadrado.
Solu¸ao elegante, na pr´tica ´ o que a organiza¸˜o do com´ e a pol´ usam.
c˜ a e ca ıcio ıcia
Mas deve-se saber de antem˜o a metragem da pra¸a e estimar a taxa de pessoas por
a c
metro quadrado. O m´todo ´ t˜o bom quanto melhor for a estimativa. Tamb´m ´
e e a e e
melhor se a popula¸ao estiver uniformemente distribu´
c˜ ıda.
Concluiu-se que ´ um bom m´todo, mas que n˜o ´ preciso. Isto ´, a chance
e e a e e
do n´mero estimado ser exatamente o n´mero de presentes ´ baixa. Os m´todos
u u e e
anteriores s˜o exatos, isto ´, nos d˜o o n´mero correto de presentes. Este m´todo
a e a u e
tamb´m serve razoavelmente bem para o n´mero de alunos na sala de aula. De fato,
e u
nesta aula, o professor conseguiu o n´mero com aproxima¸ao 80% correta. A quest˜o
u c˜ a
que restou ´ se o erro de 20% ´ aceit´vel ou n˜o. Isto depende do motivo pelo qual
e e a a
se quer contar os alunos na sala.
Quarta solu¸˜o
ca
Para resolver o problema da precis˜o, outro estudante sugeriu o uso de roletas.
a
11. ´
2.1. CONTANDO O NUMERO DE PRESENTES EM UM EVENTO 11
Efetivamente ´ esta a solu¸ao para contar torcedores no est´dio ou presentes em
e c˜ a
um show de rock. Mas tamb´m foi considerado que a solu¸˜o exige uma ou mais
e ca
catracas, uma barreira para ningu´m entrar sem passar pela roleta e etc, para se
e
garantir a exatid˜o do resultado. No caso do com´ n˜o seria vi´vel. No caso da
a ıcio a a
sala de aula foi constatado que n˜o havia roletas e portanto o m´todo n˜o se aplicava.
a e a
Quinta solu¸˜o
ca
Mais uma vez outro estudante apresentou uma boa alternativa: contar o n´mero de
u
filas de carteiras e, dado que todas tenham o mesmo n´mero de estudantes, ent˜o
u a
bastaria uma simples multiplica¸˜o para a determina¸˜o do n´mero correto.
ca ca u
De fato esta solu¸˜o funciona perfeitamente bem em lugares como por exemplo o
ca
ex´rcito. As filas s˜o rapidamente arrumadas com, digamos, 10 soldados em cada fila,
e a
sabendo-se o n´mero de filas basta multiplicar por 10, eventualmente tendo-se que
u
contar o n´mero de pessoas em uma fila que n˜o tenha completado 10.
u a
Infelizmente as carteiras estavam bagun¸adas na nossa sala e este c´lculo n˜o pode
c a a
ser feito. Tamb´m ficaria estranho o professor colocar todos os alunos em filas. Foi
e
tamb´m observado que o m´todo fornece a solu¸ao exata para o problema.
e e c˜
Sexta solu¸˜o
ca
Nova sugest˜o de outro aluno: cada estudante no in´ de cada fila conta o n´mero de
a ıcio u
alunos da sua fila, tomando o cuidado de contar a si pr´prio tamb´m. Depois soma-se
o e
todas as contagens de todos os primeiros de fila.
Solu¸ao muito boa. Na verdade ´ a vers˜o em paralelo da primeira solu¸˜o.
c˜ e a ca
Distribuindo-se a tarefa, cada primeiro de fila tem entre 10 e 15 alunos para con-
tar em sua fila. Se a soma foi correta o n´mero obtido ao final do processo ´ exato.
u e
No caso daquela aula os estudantes realizaram a opera¸˜o em poucos segundos, mais
ca
algum tempo para as somas (isto demorou mais. . . ). Mas o resultado foi exato.
A solu¸ao n˜o exige conhecimento pr´vio, n˜o exige equipamento adicional e ´
c˜ a e a e
razoavelmente escal´vel, isto ´, funciona para salas de tamanhos diferentes.
a e
S´tima solu¸˜o
e ca
Para finalizar, o professor apresentou a solu¸ao seguinte: todos os estudantes se le-
c˜
vantam e se atribuem o n´mero 1. Em seguida os alunos se organizam em pares. Em
u
cada par, primeiro ´ somado o n´mero de cada um dos dois, um deles guarda este
e u
n´mero e permanece de p´, o outro deve se sentar. Os que ficaram em p´ repetem
u e e
este processo at´ que s´ exista um unico aluno em p´. Ele tem o n´mero exato de
e o ´ e u
estudantes na sala.
Como se divide a sala em pares, ap´s a primeira rodada metade da sala deve ter
o
o n´mero 2 e a outra metade est´ sentada, considerando que a sala tem o n´mero de
u a u
alunos par. Se for ´
ımpar um deles ter´ ainda o n´mero 1. Ap´s a segunda rodada um
a u o
quarto dos alunos dever´ ter o n´mero 4 e trˆs quartos estar˜o sentados, eventualmente
a u e a
um deles ter´ um n´mero ´
a u ´ f´cil perceber que o resultado sai em tempo
ımpar. E a
12. 12 CAP´ ¸˜
ITULO 2. SOBRE PROBLEMAS E SOLUCOES
proporcional ao logaritmo do n´mero total de alunos, o que ´ bem r´pido. De fato,
u e a
para mil pessoas o processo termina em 10 passos e para um milh˜o de pessoas termina
a
em 20 passos.
Parece um bom algoritmo, ele d´ resultado exato, n˜o exige conhecimento pr´vio,
a a e
´ escal´vel, isto ´, funciona muito bem para um grande n´mero de pessoas, mas exige
e a e u
organiza¸ao dos presentes.
c˜
Infelizmente aquela turma n˜o se organizou direito e o resultado veio com um erro
a
de 40%. . . Mas ap´s duas rodadas de treinamento, na terceira conseguimos obter o
o
resultado correto.
2.2 Trocando os quatro pneus
Todo mundo sabe trocar pneus, embora n˜o goste. O processo que um cidad˜o comum
a a
executa ´ muito simples: levanta o carro com o macaco, tira todos os quatro parafusos
e
da roda com o pneu furado, tira a roda do eixo, coloca a roda com o pneu novo no
eixo, em seguida aperta os quatro parafusos. Finalmente, baixa o carro e est´ pronto.
a
Nos anos 1980, um famoso piloto de f´rmula 1 imaginou que poderia ser campe˜o
o a
do mundo se pudesse usar um composto de pneu mais mole e com isto ganhar preciosos
segundos com rela¸ao aos seus concorrentes. O problema ´ que estes compostos mais
c˜ e
moles se deterioram rapidamente exigindo a troca dos quatro pneus no meio da corrida.
O tal piloto, ap´s alguns c´lculos, concluiu que se levasse menos de 8 segundos para
o a
trocar os quatro pneus, valeria a pena aplicar este m´todo.
e
Obviamente a solu¸˜o caseira n˜o serve. O m´todo descrito acima custa em geral
ca a e
20 minutos por pneu, com um pouco de pr´tica 10 minutos. Com muita pr´tica 2 ou
a a
3 minutos. Para trocar os quatro pneus, 8 a 12 minutos.
Da´ o problema: Como trocar os quatro pneus de um carro em menos de 8 segun-
ı
dos?
Um dos grandes custos de tempo ´ ter que trocar o macaco para cada roda: usamos
e
um macaco hidr´ulico, destes de loja de pneus, e levantamos o carro todo de uma s´
a o
vez.
Mas, para cada roda, temos 4 parafusos, isto ´, 16 no total, ou melhor, 32, pois
e
tem que tirar e depois recolocar: usa-se uma aparafusadeira el´trica para amenizar o
e
problema, mas ainda n˜o ´ suficiente.
a e
Se a roda tiver um unico parafuso a economia de tempo ´ maior ainda. Mas
´ e
ainda estamos na casa dos minutos, e o tempo total deve ser menor que 8 segundos.
Desistimos do campeonato?
Com 4 pessoas, cada uma troca uma roda, divide-se o tempo por 4. Opa! J´ a
estamos abaixo de 1 minuto.
Se tiver ainda a possibilidade de 3 pessoas por roda: um tira o parafuso, outro tira
a roda velha, um terceiro coloca a roda nova e o primeiro aperta o parafuso. Mais 2
mecˆnicos para levantar e baixar o carro todo de uma vez e est´ feito.
a a
Hoje em dia se trocam os quatro pneus de um carro de f´rmula 1, com direito a
o
completar o tanque de gasolina, em cerca de 6 segundos.
Ah, o tal piloto foi campe˜o naquele ano, pois tamb´m usou o truque de aquecer
a e
13. ˜
2.3. CONCLUSAO 13
os pneus antes da prova e andar com o carro contendo metade da gasolina, j´ que ele
a
ia ter que parar nos boxes de qualquer maneira para trocar os pneus. . . O cara ´ um
e
gˆnio.
e
2.3 Conclus˜o
a
Mesmo para um problema simples existem diversas solu¸˜es. A escolha da melhor
co
depende de v´rios fatores. Por exemplo, se a resposta deve ser exata ou n˜o ou se os
a a
conhecimentos pr´vios necess´rios est˜o dispon´
e a a ıveis, e assim por diante.
´
E importante notar que somente ap´s uma s´rie de considera¸oes ´ poss´ escolher
o e c˜ e ıvel
a melhor t´cnica e somente em seguida executar a tarefa.
e
Algumas solu¸˜es existem a no¸˜o de paralelismo. Hoje em dia os computadores
co ca
vˆm com v´rios n´cleos de processamento e sempre existe a chance de se tentar quebrar
e a u
um problema em v´rios outros menores e deixar que v´rios processadores resolvam
a a
seus peda¸os de solu¸ao e depois tentar juntar os resultados com mais alguma opera¸˜o
c c˜ ca
simples.
No caso da f´rmula 1 isto funcionou, mas em geral n˜o ´ verdade. Infelizmente
o a e
existe o problema da dependˆncia de dados. Por exemplo, o mecˆnico que vai colocar
e a
a roda nova s´ pode trabalhar depois que o outro tirou a roda velha. Em problemas
o
com alto grau de dependˆncia, paralelizar ´ complicado.1 .
e e
1
N˜o se estudar˜o algoritmos paralelos nesta disciplina.
a a
14. 14 CAP´ ¸˜
ITULO 2. SOBRE PROBLEMAS E SOLUCOES
15. Cap´
ıtulo 3
Sobre algoritmos e programas
Ap´s o estudo do problema, an´lise das diversas possibilidades de solu¸ao e a escolha
o a c˜
da melhor delas, cabe agora a tarefa de escrever um programa que implemente esta
solu¸ao. Antes, contudo, ´ preciso saber a diferen¸a entre um algoritmo em um
c˜ e c
programa. Isto ser´ discutido neste cap´
a ıtulo.
3.1 O que ´ um algoritmo?
e
Um algoritmo ´ uma sequˆncia extremamente precisa de instru¸oes que, quando lida
e e c˜
e executada por uma outra pessoa, produz o resultado esperado, isto ´, a solu¸ao de
e c˜
um problema. Esta sequˆncia de instru¸oes ´ nada mais nada menos que um registro
e c˜ e
escrito da sequˆncia de passos necess´rios que devem ser executados para manipular
e a
informa¸oes, ou dados, para se chegar na resposta do problema.
c˜
Isto serve por dois motivos: o primeiro ´ que atrav´s do registro se garante que
e e
n˜o haver´ necessidade de se redescobrir a solu¸ao quando muito tempo tiver passado
a a c˜
e todos tiverem esquecido do problema; o outro motivo ´ que, as vezes, queremos
e
que outra pessoa execute a solu¸ao, mas atrav´s de instru¸˜es precisas, de maneira
c˜ e co
que n˜o haja erros durante o processo. Queremos um algoritmo para a solu¸ao do
a c˜
problema.
Uma receita de bolo de chocolate ´ um bom exemplo de um algoritmo (a lista de
e
ingredientes e as quantidades foram omitidas, bem como a receita da cobertura):
Bata em uma batedeira a manteiga e o a¸ucar. Junte as gemas uma a uma
c´
at´ obter um creme homog^neo. Adicione o leite aos poucos. Desligue a
e e
batedeira e adicione a farinha de trigo, o chocolate em p´, o fermento
o
e reserve. Bata as claras em neve e junte-as a massa de chocolate
`
misturando delicadamente. Unte uma forma retangular pequena
com manteiga e farinha e leve para assar em forno m´dio pr´-aquecido
e e
por aproximadamente 30 minutos. Desenforme o bolo ainda
quente e reserve.
Este ´ um bom exemplo de algoritmo pois podemos extrair caracter´
e ısticas bastante
interessantes do texto. Em primeiro lugar, a pessoa que escreveu a receita n˜o ´a e
15
16. 16 CAP´
ITULO 3. SOBRE ALGORITMOS E PROGRAMAS
necessariamente a mesma pessoa que vai fazer o bolo. Logo, podemos estabelecer,
sem preju´ que foi escrita por um mas ser´ executada por outro.
ızo, a
Outras caracter´
ısticas interessantes que est˜o impl´
a ıcitas s˜o as seguintes:
a
• as frases s˜o instru¸oes no modo imperativo: bata isso, unte aquilo. S˜o ordens,
a c˜ a
n˜o sugest˜es. Quem segue uma receita obedece quem a escreveu;
a o
• as instru¸oes est˜o na forma sequencial: apenas uma pessoa executa. N˜o exis-
c˜ a a
tem a¸oes simultˆneas.
c˜ a
• existe uma ordem para se executar as instru¸˜es: primeiro bata a manteiga e
co
o a¸ucar; depois junte as gemas, uma a uma, at´ acabar os ovos; em seguida
c e
adicione o leite.
• algumas instru¸oes n˜o s˜o executadas imediatamente, ´ preciso entrar em um
c˜ a a e
modo de repeti¸ao de um conjunto de outras instru¸˜es: enquanto houver ovos
c˜ co
n˜o usados, junte mais uma gema. S´ pare quando tiver usado todos os ovos.
a o
• algumas outras instru¸oes n˜o foram mencionadas, mas s˜o obviamente ne-
c˜ a a
cess´rias que ocorram: ´ preciso separar as gemas das claras antes de come¸ar
a e c
a tarefa de se fazer o bolo, assim como ´ preciso ainda antes quebrar os ovos.
e
• algumas instru¸oes, ou conjunto de instru¸oes, podem ter a ordem invertida:
c˜ c˜
pode-se fazer primeiro a massa e depois a cobertura, ou vice-e-versa. Mas nunca
se pode colocar no forno a assadeira antes de se chegar ao t´rmino do preparo
e
da massa.
Mesmo levando estas coisas em considera¸ao, qualquer ser humano bem treinado
c˜
em cozinha conseguiria fazer um bolo de chocolate razo´vel com as instru¸˜es acima,
a co
pois todas as receitas seguem o mesmo padr˜o. As conven¸˜es que est˜o impl´
a co a ıcitas
no algoritmo s˜o conhecidas de qualquer cozinheiro, pois seguem um formato padr˜o.
a a
O formato padr˜o para algoritmos que vamos considerar ´ o seguinte:
a e
• as instru¸˜es ser˜o escritas uma em cada linha;
co a
• as instru¸oes ser˜o executadas uma a uma, da primeira at´ a ultima linha,
c˜ a e ´
nesta ordem, a menos que o pr´prio algoritmo tenha instru¸˜es que alterem este
o co
comportamento;
• em cada linha, uma instru¸ao faz somente uma coisa;
c˜
• tudo o que est´ impl´
a ıcito dever´ ser explicitado.
a
A figura 3.1 ilustra a receita de bolo de chocolate escrita dentro deste formato
padr˜o.
a
17. ´
3.1. O QUE E UM ALGORITMO? 17
Algoritmo para fazer um bolo de chocolate.
in´cio
ı
Providencie todos os ingredientes da receita.
Providencie uma forma pequena.
Ligue o forno em temperatura m´dia.
e
Coloque a menteiga na batedeira.
Coloque o a¸ucar na batedeira.
c
Ligue a batedeira.
Enquanto um creme homog^neo n~o for obtido, junte mais uma gema.
e a
Adicione aos poucos o leite.
Desligue a batedeira.
Adicione a farinha de trigo.
Adicione o chocolate em p´.
o
Adicione o fermento.
Reserve a massa obtida em um lugar tempor´rio.
a
Execute o algoritmo para obter as claras em neve.
Junte as claras em neve a massa de chocolate que estava reservada.
`
Misture esta massa delicadamente.
Execute o algoritmo para untar a forma com manteiga e farinha.
Coloque a forma no forno.
Espere 30 minutos.
Tire a forma do forno.
Desenforme o bolo ainda quente.
Separe o bolo em um lugar tempor´rio.
a
Fa¸a a cobertura segundo o algoritmo de fazer cobertura.
c
Coloque a cobertura no bolo.
fim.
Figura 3.1: Algoritmo para fazer bolo de chocolate.
Infelizmente, nem todos conseguem fazer o bolo, pois existem instru¸˜es que so-
co
mente os iniciados decifram:
• “adicione aos poucos”;
• “misturando delicadamente”;
• “quando o creme fica homogˆneo?”. . .
e
No caso do computador a situa¸ao ´ pior ainda, pois trata-se de um circuito
c˜ e
eletrˆnico, de uma m´quina. Por este motivo, as instru¸oes devem ser precisas e
o a c˜
organizadas.
Um algoritmo feito para um computador executar deve tornar expl´ ıcito todas as
informa¸oes impl´
c˜ ıcitas. Tamb´m deve evitar o uso de frases amb´
e ıguas ou imprecisas
e deve ser o mais detalhado poss´ıvel. Tamb´m n˜o pode ter frases de significado
e a
desconhecido.
Na pr´xima se¸ao vamos desenvolver melhor este tema.
o c˜
18. 18 CAP´
ITULO 3. SOBRE ALGORITMOS E PROGRAMAS
3.2 O que ´ um programa?
e
Um programa ´ a codifica¸ao em alguma linguagem formal que garanta que os pas-
e c˜
sos do algoritmo sejam executados da maneira como se espera por quem executa as
instru¸oes.
c˜
Vamos imaginar, a t´ıtulo de ilustra¸ao, que ´ a primeira vez que a pessoa entra na
c˜ e
cozinha em toda a sua vida e resolve fazer um bolo de chocolate seguindo o algorimo 3.1
O algoritmo 3.1 foi escrito por um cozinheiro para ser executado por um outro
cozinheiro, o que n˜o ´ o caso, pois a pessoa ´ inexperiente em cozinha e n˜o sabe o
a e e a
que significa “bater as claras em neve”. Significa que o novato vai ficar sem o bolo.
O novato precisaria de algo mais detalhado, isto ´, de instru¸˜es meticulosas de
e co
como se obt´m claras em neve. Poderia ser algo como ilustrado na figura 3.2.
e
Algoritmo para fazer claras em neve
in´cio
ı
Repita os tr^s seguintes passos:
e
Pegue um ovo.
Quebre o ovo.
Separe a clara da gema.
Coloque somente a clara em um prato fundo.
At´ que todos os ovos tenham sido utilizados.
e
Pegue um garfo.
Mergulhe a ponta do garfo no prato.
Repita os seguinteis passos:
Bata a clara com o garfo por um tempo.
Levante o garfo.
Observe se a espuma produzida fica presa no garfo
Quando a espuma ficar presa no garfo, pare.
Neste ponto suas claras em neve est~o prontas.
a
fim.
Figura 3.2: Algoritmo para fazer claras em neve.
J´ temos algo mais detalhado, mas nosso inexperiente cozinheiro pode ainda ter
a
problemas: como se separa a clara da gema? Este tipo de situa¸ao parece n˜o ter fim.
c˜ a
Qual ´ o limite do processo de detalhamento da solu¸ao?
e c˜
O problema ´ que o cozinheiro que escreveu a receita original n˜o sabia o n´ de
e a ıvel
instru¸ao de quem ia efetivamente fazer o bolo. Para isto, ´ preciso que se estabele¸a
c˜ e c
o n´ m´
ıvel ınimo de conhecimento para quem vai executar, assim quem escreve sabe at´ e
onde deve ir o n´ de detalhamento de sua receita.
ıvel
Um programa, neste sentido, ´ um algoritmo escrito de forma t˜o detalhada quanto
e a
for necess´rio para quem executa as instru¸oes. O algoritmo pode ser mais gen´rico,
a c˜ e
o programa n˜o.
a
Como estamos pensando em deixar que o computador execute um algoritmo, pre-
cisamos escrever um programa em uma linguagem que o computador possa entender
19. ´
3.2. O QUE E UM PROGRAMA? 19
as instru¸oes para posteriormente poder execut´-las com sucesso.
c˜ a
Qual ´, afinal, o conjunto de instru¸oes que o computador conhece? Para responder
e c˜
a esta pergunta precisamos conhecer melhor como funciona um computador, para, em
seguida, continuarmos no estudo de algoritmos.
20. 20 CAP´
ITULO 3. SOBRE ALGORITMOS E PROGRAMAS
3.3 Exerc´
ıcios
1. Escreva algoritmos como os que foram escritos neste cap´
ıtulo para cada uma
das solu¸˜es do problema discutido na se¸ao 2.1.
co c˜
2. Escreva um algoritmo para o problema da troca de um unico pneu de um carro.
´
3. Escreva um algoritmo para o problema de trocar um pneu de uma bicicleta.
21. Cap´
ıtulo 4
O modelo do computador
Esta se¸ao tem dois objetivos, o primeiro ´ mostrar como ´ o funcionamento dos
c˜ e e
computadores modernos, isto ´, no n´
e ıvel de m´quina. A segunda ´ que o aluno
a e
perceba, desde o in´ do seu aprendizado, as limita¸oes a que est´ sujeito quando
ıcio c˜ a
programa, e quais s˜o todas as instru¸˜es que o computador conhece.
a co
Ao final da leitura, o estudante deve compreender que, por mais sofisticada que
seja a linguagem de programa¸˜o utilizada, a computa¸˜o de verdade ocorre como
ca ca
1
ser´ mostrado aqui.
a
4.1 Hist´rico
o
Um computador (hardware) ´ um conjunto de circuitos eletrˆnicos que manipulam
e o
sinais el´tricos e que s˜o capazes de transformar sinais de entrada em sinais de sa´
e a ıda.
Os sinais el´tricos podem ser representados, basicamente, pelos n´meros zero e um.
e u
Existem v´rias maneiras de se fazer isto, mas n˜o entraremos em detalhes neste texto.
a a
O importante a destacar ´ que uma computa¸˜o ´ uma manipula¸˜o de dados
e ca e ca
residentes em mem´ria atrav´s de altera¸oes de sinais el´tricos realizadas por circuitos
o e c˜ e
integrados implementados normalmente em placas de sil´ ıcio.
Quando os computadores foram criados, na d´cada de 1930, a programa¸ao deles
e c˜
era feita de maneira muito prec´ria. Era necess´rio configurar uma situa¸ao dos
a a c˜
circuitos para manipular os sinais el´tricos da maneira desejada para cada programa
e
particular. Para se executar outro programa era necess´rio alterar os circuitos, assim
a
se reprogramando o computador para manipular os dados de outra maneira.
Um computador era algo raro naqueles tempos, e devia rodar v´rios programas
a
diferentes, o que resultava em imenso trabalho para os engenheiros (os programadores
eram engenheiros na ´poca).
e
A mem´ria do computador, naqueles tempos, era exclusividade dos dados que
o
seriam manipulados. O programa era feito nos circuitos eletrˆnicos.
o
1
O texto que segue foi adaptado de outro escrito pelo prof. Renato Carmo para a disciplina CI-208
- Programa¸˜o de Computadores ministrada para diversos cursos na UFPR.
ca
21
22. 22 CAP´
ITULO 4. O MODELO DO COMPUTADOR
John von Neumann propˆs um modelo bastante simples, no qual tanto o programa
o
quanto os dados poderiam ficar simultaneamente em mem´ria, desde que a parte que
o
ficaria programada nos circuitos pudesse interpretar o que era dado e o que era o
programa e realizar os c´lculos, isto ´, manipular os dados.
a e
Isto foi poss´
ıvel pela implementa¸ao em hardware de um limitado conjunto de
c˜
instru¸oes que s˜o usados pelo programa que est´ em mem´ria. Isto revolucionou a
c˜ a a o
arte da programa¸˜o. Os computadores modernos ainda funcionam assim.
ca
Nesta se¸˜o pretende-se mostrar atrav´s de um exemplo os princ´
ca e ıpios deste modelo.
4.2 Princ´
ıpios do modelo
Conforme explicado, Von Neumann propˆs que os dados e o programa poderiam ser
o
carregados em mem´ria ao mesmo tempo. Um elemento adicional denominado ciclo
o
de execu¸˜o de instru¸˜es controla a execu¸ao do programa.
ca co c˜
A ideia ´ implementar em hardware um pequeno conjunto de instru¸oes que n˜o
e c˜ a
mudam e programar o computador para realizar opera¸oes complexas a partir da
c˜
execu¸ao de v´rias instru¸˜es b´sicas da m´quina.
c˜ a co a a
Cada fabricante define o seu conjunto de instru¸oes b´sicas, mas o importante a
c˜ a
observar ´ que, uma vez implementadas, este conjunto define tudo o que o computador
e
´
sabe fazer. E isto que queremos saber.
Neste cap´
ıtulo vamos usar como exemplo um computador fabricado pela Big Com-
puter Company (BCC).
4.2.1 Endere¸os versus conte´ dos
c u
O computador da BCC implementa o modelo Von Neumann, logo, sua mem´ria o
cont´m os dados e o programa.
e
A mem´ria do computador em um dado instante do tempo ´ uma configura¸˜o de
o e ca
sinais el´tricos que podem ser vistos pelo ser humano como uma sequˆncia absurda
e e
de zeros e uns (chamados de bits).2
O ser humano costuma n˜o gostar muito desta forma de visualiza¸˜o, ent˜o con-
a ca a
vencionou algumas maneiras de enxergar n´meros inteiros que representam os bits.
u
N˜o vamos apresentar neste texto as diversas maneiras de convers˜o de n´meros, o
a a u
leitor interessado pode estudar sobre representa¸˜o bin´ria na literatura.
ca a
Vamos imaginar que a mem´ria do computador ´ uma tabela contendo ´
o e ındices
(endere¸os) com conte´dos (dados). A t´
c u ıtulo de exemplo, vamos considerar uma
“fotografia” da mem´ria de um computador da BCC em um certo momento, fotografia
o
esta apresentada na figura 4.1
2
Quem assistiu ao filme Matrix pode imaginar a complica¸˜o.
ca
23. 4.2. PRINC´
IPIOS DO MODELO 23
Endere¸o
c Conte´ do
u Endere¸o
c Conte´ do
u Endere¸o
c Conte´ do
u
0 1 21 49 42 54
1 54 22 6 43 8
2 2 23 52 44 57
3 1 24 51 45 9
4 50 25 3 46 33
5 4 26 53 47 2
6 7 27 46 48 76
7 46 28 52 49 67
8 4 29 5 50 76
9 47 30 55 51 124
10 46 31 53 52 14
11 46 32 54 53 47
12 7 33 8 54 235
13 48 34 55 55 35
14 4 35 2 56 23
15 49 36 56 57 78
16 50 37 46 58 243
17 48 38 52 59 27
18 3 39 5 60 88
19 51 40 57 61 12
20 47 41 56 62 12
Figura 4.1: Uma fotografia da mem´ria.
o
Para melhor entendimento, ´ importante que o leitor tenha em mente a diferen¸a
e c
entre endere¸o e conte´do do endere¸o. Para facilitar a compreens˜o, vamos adotar
c u c a
uma nota¸ao. Seja p um endere¸o. Denotamos por [p] o conte´do do endere¸o p.
c˜ c u c
Vejamos alguns exemplos com base na figura 4.1:
[0] = 1
[[0]] = [1] = 54
[[[0]]] = [[1]] = [54] = 235
[0] + 1 = 1 + 1 = 2
[0 + 1] = [1] = 54
[[0] + 1] = [1 + 1] = [2] = 2
[[0] + [1]] = [1 + 54] = [55] = 35
4.2.2 O repert´rio de instru¸oes
o c˜
Conforme mencionado, o modelo Von Neumann pressup˜e que o computador que est´
o a
em uso possui um conjunto limitado de instru¸oes programado em hardware.
c˜
Cada equipamento tem o seu repert´rio de instru¸˜es. O repert´rio do computador
o co o
da BCC foi definido ap´s longas discuss˜es da equipe t´cnica da empresa e tem um
o o e
conjunto extremamente limitado de instru¸˜es, na verdade apenas nove.
co
24. 24 CAP´
ITULO 4. O MODELO DO COMPUTADOR
Esta defini¸˜o levou em conta a capacidade financeira da empresa que n˜o tinha
ca a
muita verba para gravar em circuitos integrados um conjunto mais rico de instru¸˜es.
co
3
As nove instru¸oes do computador da BCC s˜o apresentadas na figura 4.2. .
c˜ a
C´digo
o Mnemˆnico Descri¸˜o
o ca Nota¸˜o
ca
1 load escreva em [p + 1] o valor do [p + 1] ← [p + 2].
n´mero em [p + 2] e some 3
u
em p
2 add escreva em [p + 1] o valor da [p + 1] ← [[p + 2]] + [[p + 3]].
soma dos n´meros em [[p +
u
2]] e [[p + 3]] e some 4 em p
3 sub escreva em [p + 1] o valor [p + 1] ← [[p + 2]] − [[p + 3]].
da subtra¸ao do n´mero em
c˜ u
[[p+2]] pelo n´mero em [[p+
u
3]] e some 4 em p
4 mult escreva em [p + 1] o valor [p + 1] ← [[p + 2]] × [[p + 3]].
do produto dos n´meros em
u
[[p + 2]] e [[p + 3]] e some 4
em p
[[p+2]]
5 div escreva em [p + 1] o valor da [p + 1] ← [[p+3]]
.
divis˜o do n´mero em [[p +
a u
2]] pelo n´mero em [[p + 3]]
u
e some 4 em p
6 sqrt escreva em [p + 1] o valor da [p + 1] ← [[p + 2]].
raiz quadrada de [[p + 2]] e
some 3 em p
7 read leia um n´mero do teclado,
u [p + 1] ← ∨.
escreva-o em [p + 1] e some
2 em p
8 write escreva [[p + 1]] na tala e ← [[p + 1]].
some 2 em p
9 stop pare •
Figura 4.2: O repert´rio de instru¸oes do computador da BCC.
o c˜
3
Os concorrentes comerciais famosos da BCC implementam algumas centenas de instru¸˜es, e
co
ainda nenhuma delas ´ a de bater claras em neve.
e
25. 4.2. PRINC´
IPIOS DO MODELO 25
4.2.3 O ciclo de execu¸˜o de instru¸˜es
ca co
O ciclo de execu¸˜o de instru¸˜es define o comportamento do computador. Funciona
ca co
assim (no computador da BCC):
1. comece com p = 0;
2. interprete [p] de acordo com a tabela de instru¸˜es e pare somente quando a
co
instru¸ao for uma ordem de parar (instru¸ao 9, stop).
c˜ c˜
Devemos lembrar que este comportamento tamb´m est´ implementado nos circui-
e a
tos eletrˆnicos do computador da BCC.
o
4.2.4 Exemplo de execu¸˜o de um programa
ca
A grande surpresa por tr´s do modelo de Von Neumann ´ que, mesmo que o leitor
a e
ainda n˜o compreenda, o que existe na verdade “disfar¸ado” na fotografia da mem´ria
a c o
da figura 4.1 ´ um programa que pode ser executado pelo computador, desde que todo
e
o processo siga as instru¸˜es descritas na se¸˜o anterior.
co ca
Vamos tentar acompanhar passo a passo como ´ o funcionamento deste esquema.
e
Para isto, o leitor talvez queira ir marcando, a l´pis, as altera¸˜es que ser˜o feitas
a co a
o o ´
a seguir em uma c´pia da “fotografia da mem´ria” acima. E recomendado neste
momento se ter uma vers˜o impressa daquela p´gina.
a a
Notem que, no momento, n˜o ´ necess´rio sabermos qual o programa implemen-
a e a
tado, afinal de contas, o computador jamais saber´. . . Ele executa cegamente as ins-
a
tru¸oes. N´s saberemos logo a frente, mas, agora, para entendermos como ´ o funci-
c˜ o ` e
onamento deste modelo, vamos nos imaginar fazendo o papel do computador.
1. O programa come¸a com p = 0
c
2. Em seguida, ´ preciso interpretar [p], isto ´ [0] = 1. A instru¸ao de c´digo “1” ´
e e c˜ o e
“load”, cujo comportamento ´, segundo a tabela de instru¸˜es “escreva em [2]
e co
o valor do n´mero em [3] e some 3 em p”. Ora, [2] = 54 e [3] = 2. Logo, o valor
u
2 ´ colocado como sendo o conte´do da posi¸˜o 54. Havia nesta posi¸˜o o valor
e u ca ca
235. Ap´s a execu¸ao da instru¸ao, existe um 2 neste lugar. O valor 235 n˜o
o c˜ c˜ a
existe mais. Ao final foi somado 3 no valor de p, isto ´, agora p = 3.
e
3. Como p = 3 devemos interpretar [3] = 1. Logo, a instru¸ao ´ novamente “load”.
c˜ e
Analogamente ao que foi feito no par´grafo anterior, o conte´do de [5] = 4 ´
a u e
colocado como sendo o conte´do da posi¸ao [4] = 50. Na posi¸ao 50 havia o
u c˜ c˜
valor 76. Ap´s a execu¸ao da instru¸˜o o 76 d´ lugar ao 4. Ao final o valor de
o c˜ ca a
p foi atualizado para 6.
4. Como p = 6 devemos interpretar [6] = 7. Logo, a instru¸˜o para ser executada
ca
agora ´ “read”, isto ´, esperar o usu´rio digitar algo no teclado e carregar este
e e a
valor em [p + 1] = [7] = 46. Supondo que o usu´rio digitou o valor 5, este agora
a
substitui o antigo valor, que era 33. Ao final, o valor de p foi atualizado de 6
para 8.
26. 26 CAP´
ITULO 4. O MODELO DO COMPUTADOR
5. Como p = 8 devemos interpretar [8] = 4. Logo, a instru¸˜o a ser executada
ca
´ “mult”. Isto faz com que o computador fa¸a a multiplica¸ao do valor em
e c c˜
[[10]] = [46] pelo mesmo valor em [[11]] = [46]. O valor em [46] ´ 5 (aquele
e
n´mero que o usu´rio tinha digitado no teclado). O resultado da multiplica¸˜o,
u a ca
5 × 5 = 25, ´ carregado na posi¸˜o de mem´ria [9] = 47. O valor ali que era 2
e ca o
agora passa a ser 25. Ao final, ao valor de p foi somado 4, logo neste momento
p = 12.
´
E importante salientar que este ´ um processo repetitivo que s´ terminar´ quando
e o a
a instru¸˜o “stop” for a da vez. O leitor ´ encorajado a acompanhar a execu¸˜o
ca e ca
passo a passo at´ o final para entender como ´ exatamente o comportamento dos
e e
computadores quando executam programas. Isto ´, fica como exerc´
e ıcio ao leitor!
Destacamos que os circuitos implementados cuidam da altera¸˜o do estado el´trico
ca e
dos circuitos da mem´ria.
o
4.3 Humanos versus computadores
N´s seres humanos n˜o nos sentimos muito a vontade com este tipo de trabalho
o a `
repetitivo. Temos a tendˆncia a identificar “meta-regras” e executar a opera¸ao com
e c˜
base em um comportamento de mais alto n´ ıvel. Em suma, n´s aprendemos algo neste
o
processo, coisa que o computador s´ faz em filmes de fic¸˜o cient´
o ca ıfica.
A primeira coisa que nos perguntamos ´: por qual motivo ora se soma um valor
e
em p, ora outro? Isto ´, quando executamos a opera¸˜o “load”, o valor somado em p
e ca
foi 3. Depois, quando executada a opera¸ao “read” o valor somado foi 2. Em seguida,
c˜
para a instru¸˜o “mult” o valor somado foi 4.
ca
O estudante atento, notadamente aquele que foi at´ o final na execu¸ao do ciclo de
e c˜
opera¸oes deixado como exerc´
c˜ ıcio, talvez tenha percebido uma sutileza por tr´s deste
a
modelo.
De fato, quando se executa a instru¸ao [p], o conte´do de [p+1] sempre ´ o endere¸o
c˜ u e c
de destino dos dados que s˜o resultado da opera¸ao em execu¸ao. Os endere¸os
a c˜ c˜ c
subsequentes apontam para os operandos da opera¸ao que est´ programada para
c˜ a
acontecer.
Assim:
• Se for uma multiplica¸˜o, subtra¸ao ou soma, precisamos de dois operandos e
ca c˜
do endere¸o destino, por isto se soma 4 em p;
c
• Se for um “load” precisamos de um operando apenas, assim como para a raiz
quadrada, por isto se soma 3 em p;
• Se for uma leitura do teclado ou uma escrita na tela do computador, ent˜o um
a
unico argumento ´ necess´rio, por isto se soma apenas 2 em p.
´ e a
Uma outra observa¸ao importante ´ que, por quest˜es de hardware, o computador
c˜ e o
precisa entender a mem´ria como esta esp´cie de “tripa”. O ser humano, ao contr´rio,
o e a
27. 4.3. HUMANOS VERSUS COMPUTADORES 27
uma vez que j´ identificou pequenos blocos relacionados as instru¸oes, pode tentar
a ` c˜
entender esta mesma mem´ria em outro formato, isto ´, separando cada um destes
o e
pequenos blocos em uma unica linha.
´
Observamos que apenas os n´meros de 1 a 9 podem ser interpretados como c´digos
u o
de alguma instru¸˜o, pois s˜o os unicos c´digos da tabela de instru¸oes da BCC.
ca a ´ o c˜
A separa¸ao dos pequenos blocos resulta em uma visualiza¸˜o em que os dados
c˜ ca
s˜o separados das instru¸˜es numa mesma linha, cada linha agora representa toda a
a co
instru¸ao com os dados. Isto pode ser visto na figura 4.3. Importante notar que ´ a
c˜ e
mesma informa¸ao da figura 4.1, s´ que em outro formato visual.
c˜ o
Endere¸o Instru¸ao Operando Operando Operando
c c˜
0 1 54 2
3 1 50 4
6 7 46
8 4 47 46 46
12 7 48
14 4 49 50 48
18 3 51 47 49
22 6 52 51
25 3 53 46 52
29 5 55 53 54
33 8 55
35 2 56 46 52
39 5 57 56 54
43 8 57
45 9
Figura 4.3: Separando as instru¸oes.
c˜
4.3.1 Abstra¸˜o dos endere¸os
ca c
Continuando nossa explora¸ao de aspectos percebidos pelo ser humano a partir da
c˜
maneira como o computador trabalha, agora ´ poss´ percebermos mais duas coisas
e ıvel
importantes:
1. O computador n˜o mudou seu modo de operar, ele continua executando as
a
instru¸oes na mem´ria conforme foi apresentado na se¸ao 4.2.4;
c˜ o c˜
2. A visualiza¸˜o na forma apresentada na figura 4.3 ´ apenas uma maneira mais
ca e
simples para o ser humano perceber o que o computador est´ fazendo.
a
Esta segunda observa¸ao ´ muito importante. Ela nos permite aumentar o grau de
c˜ e
“facilidade visual” ou, dizendo de outra maneira, o grau de nota¸˜o sobre o modelo
ca
Von Neumann, o que vai nos permitir a compreens˜o do processo de uma maneira
a
cada vez mais “humana”.
28. 28 CAP´
ITULO 4. O MODELO DO COMPUTADOR
De fato, a partir da figura 4.3, podemos perceber que o endere¸o em que ocorre
c
a instru¸ao ´ irrelevante para n´s, humanos. Podemos perfeitamente compreender o
c˜ e o
processo de computa¸˜o se eliminarmos a coluna do “Endere¸o” na figura 4.3.
ca c
A figura 4.4 ilustra como ficaria o programa em mem´ria visto de outra maneira,
o
agora n˜o apenas em formato de blocos mas tamb´m sem a coluna dos endere¸os. Va-
a e c
mos perceber que, apesar de muito parecido com a figura anterior, o grau de “polui¸ao
c˜
visual” ´ bem menor.
e
Instru¸ao Operando Operando Operando
c˜
1 54 2
1 50 4
7 46
4 47 46 46
7 48
4 49 50 48
3 51 47 49
6 52 51
3 53 46 52
5 55 53 54
8 55
2 56 46 52
5 57 56 54
8 57
9
Figura 4.4: Abstra¸ao dos endere¸os.
c˜ c
Vale a pena refor¸ar: o computador n˜o mudou, ele continua operando sobre os
c a
circuitos eletrˆnicos, o que estamos fazendo ´ uma tentativa, um pouco mais humana,
o e
de enxergar isto.
4.3.2 Abstra¸˜o dos c´digos das instru¸oes
ca o c˜
Continuando neste processo de “fazer a coisa do modo mais confort´vel para o ser
a
humano”, afirmamos que ´ poss´ aumentar ainda mais o grau de nota¸˜o.
e ıvel ca
Para a etapa seguinte, vamos observar que, embora os computadores manipulem
n´meros (em particular, n´meros bin´rios) de maneira muito eficiente e r´pida, o
u u a a
mesmo n˜o ocorre para os humanos, que tˆm a tendˆncia a preferirem nomes.
a e e
De fato, basta observar que n´s usamos no nosso dia-a-dia nomes tais como Marcos,
o
Jos´ ou Maria e n˜o n´meros tais como o RG do Marcos, o CPF do Jos´ ou o PIS da
e a u e
Maria.
Ora, j´ que ´ assim, qual o motivo de usarmos os n´meros 1 − 9 para as instru¸oes
a e u c˜
se podemos perfeitamente usar o mnemˆnico associado ao c´digo?
o o
Desta forma, vamos modificar ainda mais uma vez nossa visualiza¸ao da mem´ria,
c˜ o
desta vez escrevendo os nomes dos mnemˆnicos no lugar dos n´meros. Assim, na
o u
29. 4.3. HUMANOS VERSUS COMPUTADORES 29
coluna Instru¸˜o, substituiremos o n´mero 1 por load, 2 por add, 3 por sub e assim
ca u
por diante, conforme a figura 4.2.
O programa da figura 4.4 pode ser visualizado novamente de outra forma, tal como
apresentado na figura 4.5. Notem que o grau de compreens˜o do c´digo, embora ainda
a o
n˜o esteja em uma forma totalmente amig´vel, j´ ´ bastante melhor do que aquela
a a ae
primeira apresenta¸ao da “fotografia da mem´ria”.
c˜ o
De fato, agora ´ poss´ compreender o significado das linhas, em que existe um
e ıvel
destaque para a opera¸˜o (o mnemˆnico), a segunda coluna ´ o endere¸o de destino
ca o e c
da opera¸˜o e as outras colunas s˜o os operandos.
ca a
Instru¸ao Operando Operando Operando
c˜
load 54 2
load 50 4
read 46
mult 47 46 46
read 48
mult 49 50 48
sub 51 47 49
sqrt 52 51
sub 53 46 52
div 55 53 54
write 55
add 56 46 52
div 57 56 54
write 57
stop
Figura 4.5: Programa reescrito com Mnemˆnicos.
o
O que falta ainda a ser melhorado? N´s humanos usamos desde a mais tenra idade
o
outro tipo de nota¸ao para representarmos opera¸oes. Este ´ o pr´ximo passo.
c˜ c˜ e o
4.3.3 Abstra¸˜o do repert´rio de instru¸˜es
ca o co
Nesta etapa, observaremos que as instru¸˜es executadas pelo computador nada mais
co
s˜o do que manipula¸ao dos dados em mem´ria. Os c´lculos s˜o feitos sobre os dados
a c˜ o a a
e o resultado ´ colocado em alguma posi¸ao de mem´ria.
e c˜ o
Podemos melhorar o grau de abstra¸ao considerando a nota¸˜o apresentada na
c˜ ca
figura 4.6. Isto ´, vamos usar as tradicionais letras finais do alfabeto para ajudar na
e
melhoria da facilidade visual. Assim poderemos reescrever o programa mais uma vez
e ele ficar´ como apresentado na figura 4.7.
a
30. 30 CAP´
ITULO 4. O MODELO DO COMPUTADOR
[p] Instru¸˜o
ca Nota¸˜o
ca
1 load x y x ← [y]
2 add x y z x ← [y] + [z]
3 sub x y z x ← [y] − [z]
x = [p + 1] 4 mult x y z x ← [y] × [z]
y = [p + 2]
5 div x y z x ← [y]
[z]
z = [p + 3]
6 sqrt x y x ← [y]
7 read x x←V
8 write x V ← [x]
9 stop •
Figura 4.6: Nota¸ao para as instru¸˜es.
c˜ co
54 ← 2
50 ← 4
46 ← ∨
47 ← [46] × [46]
48 ← ∨
49 ← [50] × [48]
51 ← [47] − [49]
52 ← [[51]]
53 ← [46] − [52]
[53]
55 ← [54]
← [55]
56 ← [46] + [52]
[56]
57 ← [54]
← [57]
•
Figura 4.7: Programa escrito sob nova nota¸ao.
c˜
4.3.4 Abstra¸˜o dos endere¸os de mem´ria (vari´veis)
ca c o a
Na verdade, assim como j´ observamos que o c´digo da instru¸ao n˜o nos interessa,
a o c˜ a
vamos perceber que o mesmo ´ verdade com rela¸˜o aos endere¸os de mem´ria. Ent˜o,
e ca c o a
convencionaremos que os n´meros podem ser trocados por nomes. Fazemos isto na
u
vers˜o seguinte do mesmo programa.
a
Conv´m notar que o ser humano gosta de dar nomes apropriados para as coi-
e
sas4 . Assim, ´ importante que os nomes que usarmos tenham alguma rela¸˜o com o
e ca
4
Quem quiser ter uma ideia do estrago quando n˜o damos bons nomes para as
a
coisas, pode acompanhar dois di´logos humor´
a ısticos, um deles, o original, da du-
pla Abbot & Costello sobre um jogo de beisebol, a outra de um ex-presidente
dos Estados Unidos falando sobre o novo presidente da China. Ambos os v´ıdeos
est˜o dispon´
a ıveis no YouTube: (1) http://www.youtube.com/watch?v=sShMA85pv8M; (2)
http://www.youtube.com/watch?v=Lr1DWkgUBTw.
31. ¸˜ ¸˜
4.4. ABSTRACAO DAS INSTRUCOES (LINGUAGEM) 31
significado que eles est˜o desempenhando no programa.
a
Ent˜o chega o momento de n´s sabermos que o programa que est´ em mem´ria
a o a o
recebe como entrada dois valores b e c e escreve como sa´ as ra´
ıda ızes da equa¸ao
c˜
x2 − bx + c = 0. Os c´lculos usam o m´todo de B´skara. A figura 4.8 mostra a
a e a
conven¸˜o para a substitui¸˜o dos endere¸os por nomes.
ca ca c
Endere¸o
c Nome
54 dois
50 quatro
46 B
47 quadradoB
48 C
49 quadruploC
51 discriminante
52 raizDiscriminante
53 dobroMenorRaiz
55 menorRaiz
56 dobroMaiorRaiz
57 maiorRaiz
Figura 4.8: Dando nomes para os endere¸os.
c
Agora, usaremos esta conven¸ao de troca de endere¸os por nomes para podermos
c˜ c
reescrever o programa ainda mais uma vez, obtendo a vers˜o da figura 4.9.
a
Esta vers˜o define o ultimo grau de abstra¸˜o simples. A partir deste ponto a
a ´ ca
nota¸ao deixa de ser s´ uma abreviatura das instru¸oes e a tradu¸ao deixa de ser
c˜ o c˜ c˜
direta.
Apesar do fato de ser o ultimo n´ de nota¸ao simples, ainda ´ poss´ melhorar-
´ ıvel c˜ e ıvel
mos o grau de facilidade visual, mas desta vez passamos para a nota¸ao ou linguagem
c˜
de “alto n´
ıvel”, que vai exigir a introdu¸ao dos chamados compiladores.
c˜
4.4 Abstra¸˜o das instru¸˜es (linguagem)
ca co
Apesar de todas as nota¸oes e conven¸oes que foram feitas no programa, at´ se chegar
c˜ c˜ e
na vers˜o mostrada na figura 4.9, de certa maneira, o programa ainda est´ em um
a a
formato muito parecido com o do programa original.
Para que seja poss´ aumentar o n´ de nota¸ao ainda mais ´ preciso contar com
ıvel ıvel c˜ e
a ajuda de programas tradutores, ou como eles s˜o mais conhecidos, os compiladores.
a
Estes programas conseguem receber como entrada um texto escrito em um for-
mato adequado e gerar como sa´ um programa no formato da m´quina. Isto ´
ıda a e