Escolar Documentos
Profissional Documentos
Cultura Documentos
Computadores, algoritmos e
programas
Would you tell me, please, which way I ought to go from
here?
That depends a good deal on where you want to get to,
said the Cat.
I dont much care where said Alice.
Then it doesnt matter which way you go, said the Cat.
so long as I get somewhere, Alice added as an explanation.
Oh, youre sure to do that, said the Cat, if you only
walk long enough.
Lewis Carroll, Alices Adventures in Wonderland
Uma das caratersticas de um engenheiro e a capacidade para resolver problemas tecnicos. A resoluc
ao deste tipo de problemas envolve uma combinac
ao
de ciencia e de arte. Por ciencia entende-se um conhecimento dos princpios
matem
aticos, fsicos e dos apectos tecnicos que tem de ser bem compreendidos,
para que sejam aplicados corretamente. Por arte entende-se a avaliac
ao correta,
a experiencia, o bom senso e o conhecimento que permitem representar um problema do mundo real por um modelo ao qual o conhecimento tecnico pode ser
aplicado para produzir uma solucao.
De um modo geral, qualquer problema de engenharia e resolvido recorrendo a
uma sequencia de fases: a compreens
ao do problema e a fase que corresponde
3
constituda por componentes eletr
onicos, nem os seus componentes nem a interligac
ao entre eles ser
ao aqui estudados. Para a finalidade que nos propomos
atingir, o ensino da programac
ao, podemos abstrair de toda a constituic
ao fsica
de um computador, considerando-o uma caixa eletr
onica, vulgarmente designada pela palavra inglesa hardware, que tem a capacidade de compreender e
de executar programas.
A Inform
atica e o ramo da ciencia que se dedica ao estudo dos computadores e
dos processos com eles relacionados: como se desenvolve um computador, como
se especifica o trabalho a ser realizado por um computador, de que forma se
pode tornar mais f
acil de utilizar, como se definem as suas limitac
oes e, principalmente, como aumentar as suas capacidades e o seu domnio de aplicac
ao.
Um dos objetivos da Inform
atica corresponde ao estudo e desenvolvimento de
entidades abstratas geradas durante a execuc
ao de programas os processos
computacionais. Um processo computacional e um ente imaterial que evolui ao
longo do tempo, executando ac
oes que levam `
a soluc
ao de um problema. Um
processo computacional pode afetar objetos existentes no mundo real (por exemplo, guiar a aterragem de um avi
ao, distribuir dinheiro em caixas multibanco,
comprar e vender ac
oes na bolsa), pode responder a perguntas (por exemplo,
indicar quais as p
aginas da internet que fazem referencia a um dado termo),
entre muitos outros aspetos.
A evoluc
ao de um processo computacional e ditada por uma sequencia de instruc
oes a que se chama programa, e a atividade de desenvolver programas e chamada programaca
o. A programacao e uma atividade intelectual fascinante, que
n
ao e difcil, mas que requer muita disciplina. O principal objetivo deste livro
e fornecer uma introduc
ao `
a programac
ao disciplinada, ensinando os princpios
e os conceitos subjacentes, os passos envolvidos no desenvolvimento de um programa e o modo de desenvolver programas bem estruturados, eficientes e sem
erros.
A programac
ao utiliza muitas atividades e tecnicas que s
ao comuns `
as utilizadas
em projetos nos v
arios ramos da engenharia: a compreens
ao de um problema;
a separac
ao entre a informac
ao essencial ao problema e a informac
ao acess
oria;
a criac
ao de especificac
oes pormenorizadas para o resolver; a realizac
ao destas
especificac
oes; a verificac
ao e os testes.
Neste primeiro captulo definimos as principais caratersticas de um computador
1.1
Caratersticas de um computador
Um computador e uma m
aquina cuja func
ao e manipular smbolos. Embora
os computadores difiram em tamanho, aparencia e custo, eles partilham quatro
caratersticas fundamentais: s
ao autom
aticos, universais, eletr
onicos e digitais.
Um computador diz-se autom
atico no sentido em que, uma vez alimentado com
a informac
ao necess
aria, trabalha por si s
o, sem a intervenc
ao humana. N
ao
pretendemos, com isto, dizer que o computador comeca a trabalhar por si s
o
(necessita, para isso, da intervenc
ao humana), mas que o computador procura
por si s
o a soluc
ao dos problemas. Ou seja, o computador e autom
atico no
sentido em que, uma vez o trabalho comecado, ele ser
a levado ate ao final
sem a intervenc
ao humana. Para isso, o computador recebe um programa, um
conjunto de instruc
oes quanto ao modo de resolver o problema. As instruc
oes
do programa s
ao escritas numa notac
ao compreendida pelo computador (uma
linguagem de programac
ao), e especificam exatamente como o trabalho deve
ser executado. Enquanto o trabalho est
a a ser executado, o programa est
a
armazenado dentro do computador e as suas instruc
oes est
ao a ser seguidas.
Um computador diz-se universal, porque pode efetuar qualquer tarefa cuja
soluc
ao possa ser expressa atraves de um programa. Ao executar um dado
programa, um computador pode ser considerado uma m
aquina orientada para
um fim particular. Por exemplo, ao executar um programa para o tratamento
de texto, um computador pode ser considerado como uma m
aquina para produzir cartas ou texto; ao executar um programa correspondente a um jogo, o
computador pode ser considerado como uma m
aquina para jogar. A palavra
universal provem do facto de o computador poder executar qualquer programa, resolvendo problemas em diferentes
areas de aplicac
ao. Ao resolver um
problema, o computador manipula os smbolos que representam a informac
ao
pertinente para esse problema, sem lhes atribuir qualquer significado. Devemos, no entanto, salientar que um computador n
ao pode resolver qualquer tipo
de problema. A classe dos problemas que podem ser resolvidos atraves de um
computador foi estudada por matem
aticos antes da construc
ao dos primeiros
computadores. Durante a decada de 1930, matem
aticos como Alonzo Church
(19031995), Kurt G
odel (19061978), Stephen C. Kleene (19091994), Emil
Leon Post (18971954) e Alan Turing (19121954) tentaram definir matematicamente a classe das func
oes que podiam ser calculadas mecanicamente. Embora
os metodos utilizados por estes matem
aticos fossem muito diferentes, todos os
formalismos desenvolvidos s
ao equivalentes, no sentido em que todos definem
a mesma classe de func
oes, as func
oes recursivas parciais. Pensa-se, hoje em
dia, que as func
oes recursivas parciais s
ao exatamente as func
oes que podem ser
calculadas atraves de um computador. Este facto e expresso atraves da tese de
Church-Turing1 .
De acordo com a tese de Church-Turing, qualquer computac
ao pode ser baseada
num pequeno n
umero de operac
oes elementares. Nos nossos programas, estas
operac
oes correspondem fundamentalmente `
as seguintes:
1. Operac
oes de entrada de dados, as quais obtem valores do exterior do
programa;
2. Operac
oes de sada de dados, as quais mostram valores existentes no programa;
3. Operac
oes matem
aticas, as quais efetuam c
alculos sobre os dados existentes no programa;
4. Execuc
ao condicional, a qual corresponde ao teste de certas condic
oes e `
a
execuc
ao de instruc
oes, ou nao, dependendo do resultado do teste;
5. Repetic
ao, a qual corresponde `
a execuc
ao repetitiva de certas instruc
oes.
A tarefa de programac
ao corresponde a dividir um problema grande e complexo,
em v
arios problemas, cada vez menores e menos complexos, ate que esses problemas sejam suficientemente simples para poderem ser expressos em termos de
operac
oes elementares.
Um computador e eletr
onico. A palavra eletr
onico refere-se aos componentes
da m
aquina, componentes esses que s
ao respons
aveis pela grande velocidade das
operac
oes efetuadas por um computador.
Um computador e tambem digital. Um computador efectua operac
oes sobre
informac
ao que e codificada recorrendo a duas grandezas discretas (tipicamente
1 Uma discuss
ao sobre a tese de Church-Turing e sobre as funco
es recursivas parciais
est
a para al
em da mat
eria deste livro. Este assunto pode ser consultado em [Brainerd and
Landwebber, 1974], [Hennie, 1977] ou [Kleene, 1975].
1.2
Algoritmos
1.2. ALGORITMOS
1
468
+ 37
(a)
468
+ 37
5
1
+
(b)
468
37
05
(c)
468
37
505
(d)
1.2.1
Exemplos de algoritmos
[Modesto, 1982], p
agina 134. Reproduzida com autorizaca
o da Editorial Verbo.
5 gemas de ovos;
250 g de acu
car para a cobertura;
e farinha.
Leva-se o acu
car ao lume com um copo de
agua e deixa-se ferver ate fazer ponto de
perola. Junta-se a amendoa e deixa-se ferver um pouco. Retira-se do calor e adicionam-se
as gemas. Leva-se o preparado novamente ao lume e deixa-se ferver ate se ver o fundo
do tacho. Deixa-se arrefecer completamente. Em seguida, com a ajuda de um pouco de
farinha, molda-se a massa de ovos em bolas. Leva-se o restante acu
car ao lume com 1 dl
de
agua e deixa-se ferver ate fazer ponto de rebucado. Passam-se as bolas de ovos por
este acu
car e p
oem-se a secar sobre uma pedra untada, ap
os o que se embrulham em papel
celofane de v
arias cores.
Esta receita e constituda por duas partes distintas: (1) uma descric
ao dos objetos a manipular; (2) uma descric
ao das ac
oes que devem ser executadas sobre
esses objetos. A segunda parte da receita e uma sequencia finita de instruc
oes
bem definidas (para uma pessoa que saiba de culin
aria e portanto entenda o
significado de expressoes como ponto de perola, ponto de rebucado, etc.,
todas as instruc
oes desta receita s
ao perfeitamente definidas), cada uma das
quais pode ser executada mecanicamente (isto e, sem requerer imaginac
ao por
parte do executante), num perodo de tempo finito e com uma quantidade de
esforco finita. Ou seja, a segunda parte desta receita e um exemplo informal de
um algoritmo.
Consideremos as instruc
oes para montar um papagaio voador, as quais est
ao
4
associadas ao diagrama representado na Figura 1.2 .
PAPAGAIO VOADOR
1. A haste de madeira central j
a se encontra colocada com as pontas metidas nas
bolsas A. e B;
2. Dobre ligeiramente a haste transversal e introduza as suas extremidades nas bolsas
C. e D;
3. Prenda as pontas das fitas da cauda `
a haste central no ponto B;
4. Prenda com um n
o a ponta do fio numa das argolas da aba do papagaio. Se o
vento soprar forte dever
a prender na argola inferior. Se o vento soprar fraco dever
a
prender na argola superior.
4 Adaptado
gal.
das instruco
es para montar um papagaio voador oferecido pela Telecom Portu-
1.2. ALGORITMOS
1.2.2
Caratersticas de um algoritmo
10
1.2. ALGORITMOS
11
e reac
oes qumicas de um modo compacto e n
ao ambguo, por exemplo,
MgO + H2 ! Mg + H2 O. A linguagem Python, discutida neste livro, e
mais um exemplo de uma linguagem artificial;
12
1.3
Programas e algoritmos
13
1.3.1
Linguagens de programac
ao
14
Sistema operativo
Linguagem mquina
Hardware
1.3.2
15
Exemplo de um programa
Apresentamos um exemplo de algoritmo para calcular a soma dos 100 primeiros inteiros positivos e o programa correspondente em Python. Para isso,
comecamos por analisar o que fazemos para resolver este problema utilizando
uma calculadora. O objetivo da nossa apresentac
ao e fornecer uma ideia intuitiva dos passos e do raciocnio envolvidos na criac
ao de um programa e,
simultaneamente, mostrar um primeiro programa em Python.
Podemos descrever as ac
oes a executar para resolver este problema atraves da
seguinte sequencia de comandos a fornecer `
a calculadora:
Limpar o visor da calculadora
Carregar na tecla 1
Carregar na tecla +
Carregar na tecla 2
Carregar na tecla +
Carregar na tecla 3
Carregar na tecla +
..
.
Carregar na tecla 1
Carregar na tecla 0
Carregar na tecla 0
Carregar na tecla =
Os smbolos ... na nossa descric
ao de ac
oes indicam que existe um padr
ao que
se repete ao longo da nossa atuac
ao e portanto n
ao e necess
ario enumerar todos
os passos, porque podemos facilmente gerar e executar os que est
ao implcitos.
No entanto, a existencia destes smbolos n
ao permite qualificar o conjunto de
instruc
oes anteriores como um algoritmo, pois a caraterstica do rigor deixa
de se verificar. Para executar este conjunto de instruc
oes e necess
ario ter a
capacidade de compreender quais sao os passos subentendidos por ....
Para transformar as instruc
oes anteriores num algoritmo que possa ser executado por um computador, e necess
ario tornar explcito o que est
a implcito.
Note-se, no entanto, que para explicitar todos os passos do algoritmo anterior
teramos mais trabalho do que se execut
assemos o algoritmo n
os pr
oprios, pelo
que deveremos encontrar uma formulac
ao alternativa. Para isso, vamos refletir
sobre o processo de c
alculo aqui descrito. Existem duas grandezas envolvidas
16
neste processo de c
alculo, a soma corrente (que aparece, em cada instante, no
visor da calculadora) e o n
umero a ser adicionado `
a soma (o qual e mantido na
nossa cabeca). Cada vez que um n
umero e adicionado `
a soma corrente, mentalmente, aumentamos em uma unidade o pr
oximo n
umero a ser adicionado. Se
quisermos exprimir este processo de um modo rigoroso, necessitamos de recorrer a duas vari
aveis, uma para representar a soma corrente (`
a qual chamaremos
soma), e a outra para representar o n
umero que mantemos na nossa cabeca (a
que chamaremos numero). Os passos que executamos sempre que adicionamos
um n
umero `
a soma corrente s
ao:
A soma toma o valor de soma + numero
O numero toma o valor de numero + 1
Estes passos s
ao executados repetitivamente para todos os n
umeros a somar, o
que significa que a nossa tarefa corresponde a repetir estas operac
oes enquanto
o n
umero a somar n
ao exceder 100. Em programac
ao, a repetic
ao de uma
sequencia de ac
oes chama-se um ciclo. O ciclo que executamos ao calcular a
soma dos 100 primeiros inteiros positivos e:
enquanto o numero for menor ou igual a 100
A soma toma o valor de soma + numero
O numero toma o valor de numero + 1
Convem agora relembrar as operac
oes que efetuamos antes de comecar a executar esta sequencia repetitiva de operac
oes: (1) limp
amos o visor da calculadora,
isto e estabelecemos que o valor inicial da vari
avel soma era zero; (2) estabelecemos que o primeiro numero a ser adicionado `
a soma era um. Com estes
dois aspetos em mente, poderemos dizer que a sequencia de passos a seguir para
calcular a soma dos 100 primeiros inteiros positivos e:
A soma toma o valor de 0
O numero toma o valor de 1
enquanto o numero for menor ou igual a 100
A soma toma o valor de soma + numero
O numero toma o valor de numero + 1
Em matem
atica, operac
oes como toma o valor de s
ao normalmente representadas por um smbolo (por exemplo, =). Em programac
ao, esta operac
ao e
tambem representada por um smbolo (=, :=, ou outro, dependendo da linguagem de programac
ao utilizada). Se adotarmos o smbolo utilizado em Python,
17
Esta descric
ao e uma vers
ao muito aproximada de um programa em Python
para calcular a soma dos primeiros 100 inteiros positivos, o qual e o seguinte:
def prog_soma():
soma = 0
numero = 1
while numero <= 100:
soma = soma + numero
numero = numero + 1
print(O valor da soma
e: , soma)
Au
ltima linha do programa anterior tem por finalidade informar o mundo exterior do valor calculado pelo programa e corresponde a uma instruc
ao de sada
de dados.
importante notar que existe uma f
E
ormula que nos permite calcular a soma
dos primeiros 100 inteiros positivos, se os considerarmos como uma progress
ao
aritmetica de raz
ao um, a qual e dada por:
soma =
100 (1 + 100)
2
18
1.4
Sintaxe e sem
antica
1.4.1
Sintaxe
1.4. SINTAXE E SEMANTICA
19
2. Um smbolo n
ao terminal especial, o smbolo inicial, que representa o
elemento principal da linguagem;
3. Um conjunto de smbolos, os smbolos terminais, que aparecem nas frases
da linguagem;
4. Um conjunto de regras, as regras de produca
o, que descrevem a estrutura
dos v
arios componentes da linguagem. Estas regras de produc
ao definem
todas as frases da linguagem a partir do smbolo inicial.
Para descrever a sintaxe do Python, escrevemos gram
aticas utilizando uma
notac
ao conhecida por notac
ao BNF6 , a qual utiliza as seguintes regras:
1. Os smbolos n
ao terminais escrevem-se entre parenteses angulares, h
e i. Usando um exemplo do Python, hexpress
aoi e um smbolo n
ao
20
hdgito binario i hn
umero binarioi
Nesta gram
atica os smbolos terminais s
ao 0 e 1 e os smbolos n
ao terminais
s
ao hn
umero binarioi (o smbolo inicial) e hdgito binarioi. A gram
atica tem duas
1.4. SINTAXE E SEMANTICA
21
1.4.2
Sem
antica
Then you should say what you mean, the March Hare
went on.
I do, Alice hastily replied; at leastat least I mean what
I saythats the same thing, you know.
Not the same thing a bit! said the Hatter. You might
just as well say that I see what I eat is the same thing
as I eat what I see!
Lewis Carroll, Alices Adventures in Wonderland
A sem
antica de uma linguagem define qual o significado de cada frase da linguagem. A sem
antica nada diz quanto ao processo de gerac
ao das frases da
linguagem. A descric
ao da sem
antica de uma linguagem de programac
ao e
muito mais difcil do que a descricao da sua sintaxe. Um dos processos de descrever a sem
antica de uma linguagem consiste em fornecer uma descric
ao em
lngua natural (por exemplo, em portugues) do significado, ou seja, das ac
oes
que s
ao realizadas pelo computador, de cada um dos possveis componentes da
linguagem. Este processo, embora tenha os inconvenientes da informalidade e
da ambiguidade associadas `
as lnguas naturais, tem a vantagem de fornecer uma
perspetiva intuitiva da linguagem.
Cada frase em Python tem uma sem
antica, a qual corresponde `
as ac
oes tomadas
22
pelo Python ao executar essa frase, ou seja, o significado que o Python atribui
a frase. Esta sem
`
antica e definida por regras para extrair o significado de cada
frase, as quais s
ao descritas neste livro de um modo incremental, `
a medida que
novas frases s
ao apresentadas. Utilizamos o portugues para exprimir a sem
antica
do Python.
1.4.3
23
1.5
Notas finais
ingl
es, insetos.
[Taylor, 1984], p
agina 44.
24
linguagem de programac
ao, e o resultado originado pela execuc
ao de um programa, um processo computacional.
Apresent
amos o conceito de algoritmo, uma sequencia finita de instruc
oes bem
definidas e n
ao ambguas, cada uma das quais pode ser executada mecanicamente num perodo de tempo finito com uma quantidade de esforco finita, bem
como as suas caratersticas, ser rigoroso, eficaz e dever terminar. O aspeto de
um algoritmo ter que terminar e de certo modo controverso. Alguns autores, por
exemplo [Hennie, 1977] e [Hermes, 1969], admitem que um algoritmo possa n
ao
terminar. Para estes autores, um algoritmo apenas apresenta as caratersticas
de rigor e de efic
acia. Outros autores, por exemplo [Brainerd and Landwebber,
1974] e [Hopcroft and Ullman, 1969], distinguem entre procedimento mec
anico
uma sequencia finita de instruc
oes que pode ser executada mecanicamente
e um algoritmo um procedimento mec
anico que e garantido terminar. Neste
livro, adotamos a segunda posic
ao.
Finalmente apresent
amos os dois aspetos associados a uma linguagem, a sintaxe
e a sem
antica, e introduzimos a notac
ao BNF para definir a sintaxe de uma linguagem. Como a sintaxe apenas se preocupa com o processo de combinac
ao
dos smbolos de uma dada linguagem, ela pode ser, na maior parte dos casos,
facilmente formalizada. Os linguistas e os matem
aticos estudaram as propriedades sint
aticas das linguagens, e grande parte deste trabalho e aplic
avel `
as
particularmente importante o trabalho de Noam
linguagens de programac
ao. E
Chomsky ([Chomsky, 1957] e [Chomsky, 1959]), que classifica as linguagens em
grupos. Grande parte das linguagens de programac
ao pertence ao grupo 2, ou
grupo das linguagens livres de contexto10 .
1.6
Exerccios
ingl
es, context-free languages
1.6. EXERCICIOS
25
decimal, o qual e rodeado por dgitos. Por exemplo, +4.0, -4.0 e 4.0
s
ao n
umeros reais em notacao decimal. Um real em notac
ao cientfica
tem uma mantissa, a qual e um inteiro ou um real, o smbolo ee um
expoente inteiro, o qual pode ou n
ao ter sinal. Por exemplo, 4.2e-5, 2e4
e -24.24e+24 s
ao n
umeros reais em notac
ao cientfica.
3. Considere a seguinte gram
atica em notac
ao BNF, cujo smbolo inicial e
hSi:
hSi :: = hAi a
hAi :: = a hBi
hBi :: = hAi a b
(a) Diga quais s
ao os smbolos terminais e quais s
ao os smbolos n
ao
terminais da gram
atica.
(b) Quais das frases pertencem ou n
ao `
a linguagem definida pela gram
atica.
Justifique a sua resposta.
aabaa
abc
abaa
aaaabaaaa
4. Considere a seguinte gram
atica em notac
ao BNF, cujo smbolo inicial e
hidti:
hletrai hletrasi
hnumerosi ::= hnumi
hletrai ::= A
hnumi ::= 1
hnumi hnumerosi
B
26