Anda di halaman 1dari 53

Instituto Politcnico de Bragana EsACT - Mirandela

Paulo Gouveia et all



PROGRAMAO I


Ano lectivo de 2012/2013



Textos de Apoio









- Cursos:


- Informtica e Comunicaes
- Multimdia
- Design de Jogos Digitais











2 Algoritmos e Programao











































Sebenta elaborada pelo Eng. Paulo Gouveia, no mbito das disciplina de
Algoritmos e Estruturas de Dados dos cursos de Informtica de Gesto, Engenharia
Informtica, Engenharia Electrotcnica e Engenharia Informtica, da Escola Superior de
Tecnologia e Gesto do Instituto Politcnico de Bragana.
A sebenta tem sido revista e actualizada por Antnio Mouro.



Algoritmos e Programao 3




4 Algoritmos e Programao
APRESENTAO

Objectivos / Competncias a Adquirir


- OBJECTIVOS:
- Desenvolver competncias e conceitos que so essenciais para a
resoluo de problemas;
- Induo de boas prticas de Programao;
- Desenvolver maneiras eficazes de resolver problemas
computando;
- RESULTADOS DA APRENDIZAGEM / COMPETNCIAS A ADQUIRIR:
- Discutir a importncia do uso de algoritmos no processo de
resoluo de problemas;
- Identificar as propriedades que um bom algoritmo deve ter;
- Desenvolvimento de algoritmos para a resoluo de problemas
simples;
- Usar uma linguagem Algortmica para desenvolver, testar e
depurar algoritmos de pequena complexidade;
- Descrever estratgias que so teis para a depurao de
algoritmos;
- Analisar e explicar o comportamento de programas simples;
- Modificar e expandir funcionalidades de pequenos programas;
- Desenvolver testar e depurar programas de baixa/mdia
complexidade;
- Escolher a estrutura de controlo de fluxo mais apropriada
para a resoluo de uma determinada tarefa;
- Aplicar estratgia de decomposio de problemas de maior
complexidade em problemas de menor complexidade;

Algoritmos e Programao 5
- Descrever os mecanismos de comunicao entre subprogramas
- Descrever o conceito de recursividade, dando exemplos de
aplicabilidade;
- Comparar solues iterativas e recursivas para problemas
simples como o factorial de um nmero inteiro.
- Bases para a compreenso da codificao e execuo de
algoritmos em computadores;
- Capacidade de utilizar linguagens de programao de uma
forma estruturada;
Prioridades

- Algoritmos e Resoluo de Problemas: estratgias para a
resoluo de problemas; a funo dos algoritmos na resoluo de
problemas; estratgias de implementao de algoritmos;
estratgias de depurao; conceitos e propriedades dos
algoritmos.
- Fundamentos de Linguagens de Programao: sintaxe e
semntica de uma linguagem de programao de alto nvel;
variveis, tipos de de dados, expresses e atribuies; estruturas
de controlo de fluxo de seleco e repetio; mtodos de
entrada/sada; Sub Programao e passagem de parmetros;
decomposio de problemas.

Bibliografia

Textos de apoio fornecidos pelo docente da unidade curricular,
IPB, 2006.
DAMAS, Lus Linguagem C. 3 edio. FCA, 2001. ISBN
9727221564. 628 p.


6 Algoritmos e Programao
GUERREIRO, Pedro - Elementos de Programao com C. 3
edio. FCA, 2006. ISBN 9727225101. 466 p.
HUTCHISON, Robert C.; JUST, Steven B. - Programming Using
the C Language. 1st edition. McGraw-Hill, 1998. ISBN
0070315418.
KERNIGHAN, Brian W.; RITCHIE, Dennis M. - The C
Programming Language. 2 edio. Prentice Hall, 1998. ISBN
0131103628.
SCHILDT, Herbert. - C Completo e Total. Makron Books, 1997.
ISBN 8534605955. 856p.

Programa

Noes gerais de decomposio de problemas e algoritmia:
- Introduo ao conceito de Algoritmo e Programao estruturada;
- Formulao do problema e sua especificao completa: Tipos,
operadores e expresses; estruturas de controlo de fluxo de
seleco e de repetio; subprogramao.
Linguagens de Programao:
- Conceitos gerais; Preparao e execuo de um programa.
- Conceitos elementares em C: Identificadores; Palavras
reservadas; Estruturas de Dados; Directivas; Tipos, operadores e
expresses.
- Estruturas de controlo de fluxo: if () else; for; do while; while.
- Funes e estrutura de um Programa.
- Recursividade.
- Estruturas de Dados: arrays, records, strings, representao de
dados em memria; apontadores.
- Alocao dinmica de memria.

Algoritmos e Programao 7






8 Algoritmos e Programao
INTRODUO AO CONCEITO DE ALGORITMO E PROGRAMAO
ESTRUTURADA

Fases da Programao

Anlise do enunciado do problema
- Dados de entrada
- Dados de sada
- Relaes de transformao
Desenvolvimento do algoritmo
Codificao na linguagem de programao (C, PASCAL,etc.)
Execuo e Testes

Dados de entrada: dados que so necessrios fornecer para poderem ser
calculados os dados de sada.
Dados de sada: Resultados a obter
Relaes de transformao: relaes matemticas ou de qualquer outra
espcie que permitam transformar os dados de entrada nos dados de sada
Algoritmo: Escrita, numa linguagem normalizada, da sequncia de operaes
que definem o problema.

O algoritmo e as estruturas bsicas de controlo

O conceito central da programao o de algoritmo
- Programao estruturada arte de formular algoritmos de uma
forma sistemtica
- UM ALGORITMO UM PLANO DE ACO QUE VISA ESTABELECER UM
CERTO EFEITO DESEJADO OU, POR OUTRAS PALAVRAS, OBTER UMA
SOLUO PARA UM DETERMINADO TIPO DE PROBLEMA.

Algoritmos e Programao 9
A formulao do algoritmo e a definio da estrutura de dados a
serem usadas esto intimamente ligadas
- assim, decises sobre a estruturao dos dados no podem ser
feitas sem o conhecimento dos algoritmos aplicados a eles, e vice-
versa.
Num algoritmo devemos distinguir dois aspectos complementares:
- o aspecto esttico, e
- o aspecto dinmico
O algoritmo consiste basicamente num texto contendo um
conjunto de instrues que pretendemos ver executadas na
resoluo de um determinado problema
- esse texto tem evidentemente um carcter esttico
Por outro lado, o texto que representa o algoritmo no tem
por si utilidade, mas pelos efeitos que pode desencadear
durante a sua execuo ao longo do tempo
- a execuo do algoritmo um evento dinmico
A grande dificuldade que se coloca na concepo de algoritmos
prende-se precisamente com o relacionamento desses dois
aspectos:
- como entender as possveis execues do algoritmo (aspecto
dinmico) a partir do texto do algoritmo (aspecto esttico)
Veremos mais adiante que esta dificuldade atenuada com o
recurso a um nmero restrito de estruturas de controlo

No nosso quotidiano deparamo-nos frequentemente com exemplos
de algoritmos, isto , com situaes em que nos so facultadas
indicaes de como fazer algo:
- instrues para uso de um electrodomstico, receitas de culinria,
partituras musicais, etc.
(quando perguntamos, por exemplo, pelo caminho para os Correios, estamos
precisamente espera que nos forneam um algoritmo atravs do qual
consigamos chegar a esse destino)



10 Algoritmos e Programao
Introduziremos ento a noo de algoritmo de uma forma intuitiva,
usando como exemplos algoritmos que fazem descries de aces do
nosso quotidiano.
- Exemplos:
substituir a roda de um automvel;
confeccionar uma refeio;
caminhar at a um local determinado;
Se pretendermos que uma destas aces seja levada a cabo por
algum que no saiba como a executar, devemos fazer uma
descrio mais detalhada de todo o processo
- assim, se tomarmos o exemplo de substituio de uma roda, essa
aco seria decomposta nas seguintes subaces:
desapertar a roda a substituir;
elevar o automvel;
acabar de desapertar a roda;
retirar a roda danificada;
colocar a roda sobressalente;
apertar ligeiramente a roda;
baixar o automvel;
acabar de apertar a roda.
Repare que smbolo de sequenciamento ; tem duas funes
concretas no algoritmo:
- no texto, separa uma aco da outra
- na execuo, a de indicar que as aces cujo nome ele separa
ocorrero uma aps a outra, na mesma ordem em que elas se
encontram escritas
- O SMBOLO DE SEQUENCIAO ; REPRESENTA A MAIS SIMPLES DAS
CHAMADAS ESTRUTURAS DE CONTROLO
O algoritmo apresentado um exemplo particularmente simples,
uma vez que consiste somente numa concatenao de comandos a
serem executados sequencialmente

Algoritmos e Programao 11
Suponhamos agora que temos de usar um critrio racional para
decidir se devemos ou no desapertar a roda aps a elevao do
automvel
- dependendo obviamente de a roda ter j sido desapertada
completamente ou no
Podemos ento reescrever o algoritmo de forma a acomodar as
duas situaes:
desapertar a roda a substituir;
elevar o automvel;
se roda ainda no completamente desapertada ento
acabar de desapertar a roda;
retirar a roda danificada;
colocar a roda sobressalente;
apertar ligeiramente a roda;
baixar o automvel;
acabar de apertar a roda.
Nesta descrio algortmica aparece uma nova estrutura de
controlo, bastante usada em programao: a estrutura de seleco
SE...ENTO
- a execuo ou no da aco acabar de desapertar a roda
depende, cada vez que o algoritmo executado, do resultado
(verdadeiro ou falso) da condio roda ainda no completamente
desapertada
De forma a tornarmos o algoritmo ainda mais descritivo, podemos
expressar o processo desapertar a roda a substituir custa da
aco elementar desapertar um parafuso
desapertar um parafuso;
desapertar um parafuso;
desapertar um parafuso;
desapertar um parafuso;


12 Algoritmos e Programao
Se admitirmos a existncia de automveis com rodas que
contenham menos de 4 parafusos, o algoritmo no
suficientemente geral para poder ser aplicado
- a soluo pode passar pela utilizao de mais estruturas do tipo
SE...ENTO
se houver parafusos por desapertar ento
desapertar um parafuso;
se houver parafusos por desapertar ento
desapertar um parafuso;
se houver parafusos por desapertar ento
desapertar um parafuso;
se houver parafusos por desapertar ento
desapertar um parafuso;
so os seguintes os inconvenientes que podemos encontrar nesta
soluo:
- a escrita de uma mesma aco repetidas vezes pode tornar o
algoritmo algo fastidioso e pouco legvel
- se a roda possuir apenas um parafuso, quem a substituir vai
desnecessariamente ter que se certificar trs vezes se h ou no
mais parafusos
- muitas vezes difcil encontrar um limite superior para o nmero
de repeties (mesmo no nosso exemplo no temos a garantia que
no apaream rodas com mais de 4 parafusos)
De forma a contornar todos estes inconvenientes, vamo-nos
socorrer de uma outra importante estrutura de controlo: a estrutura
de repetio ENQUANTO...FAZER
- o processo desapertar a roda a substituir passaria ento a ser
descrito da seguinte forma
enquanto houver parafusos por desapertar fazer
desapertar um parafuso;
A aco desencadeada pela estrutura enquanto...fazer corresponde
execuo repetida do comando desapertar um parafuso at ao

Algoritmos e Programao 13
momento em que a condio houver parafusos por desapertar
passe a ter o valor falso
Podemos, por fim, reescrever todo o algoritmo aplicando a estrutura
enquanto...fazer no apenas primeira aco mas a todas aquelas
que sejam de natureza repetitiva
enquanto houver parafusos por desapertar na roda a substituir fazer
desapertar um parafuso;
elevar o automvel;
se a roda ainda no estiver completamente desapertada ento
enquanto houver parafusos por desapertar fazer
acabar de desapertar um parafuso;
retirar a roda danificada;
colocar a roda sobressalente;
enquanto houver parafusos por apertar na roda sobressalente fazer
apertar ligeiramente um parafuso;
baixar o automvel;
enquanto houver parafusos por apertar na roda sobressalente fazer
acabar de apertar um parafuso.
Com este exemplo podemos ver o excelente poderio do conceito
algoritmo:
- um texto esttico, capaz de descrever com um grande nvel de
detalhe todo um conjunto de acontecimentos que se pretende ver
realizados


















14 Algoritmos e Programao



Programao Estruturada

A programao estruturada consiste numa metodologia de
desenvolvimento de programas, visando:
- facilitar a escrita dos programas
- tornar os programas mais legveis
- permitir a verificao a priori dos programas
- facilitar a manuteno e modificao dos programas
A ideia subjacente ao conceito de Programao Estruturada a de
reduzir a complexidade em trs nveis:
- desenvolvimento do programa passo a passo por refinamento
sucessivo
- decomposio do programa em mdulos funcionais
- uso de um nmero muito limitado de estruturas bsicas de controlo
A concepo de um programa passa por todo um processo de
raciocnio que compreende
- desde a anlise do problema, passando por um algoritmo em
termos gerais, at um algoritmo suficientemente detalhado a ser
directamente expresso numa linguagem de programao
Durante a fase de projecto, o problema vai sendo sucessivamente
decomposto em sub problemas
- o que permite normalmente a diviso natural do problema em
vrios mdulos claramente distintos ao ponto de poderem ser
implementados separadamente


Algoritmos e Programao 15
LINGUAGEM ALGORTMICA


- AO CONTRRIO DO QUE SUCEDE COM A LINGUAGEM HUMANA, A
CONSTRUO DE UM PROGRAMA REQUER QUE CADA PASSO
CONSIDERADO SEJA DESCRITO SEM QUALQUER AMBIGUIDADE NUMA
LINGUAGEM SIMPLES E PRECISA.
- Essa linguagem dever ser de fcil traduo para uma linguagem
de programao.

- NORMALMENTE, OS ALGORITMOS SO DESENVOLVIDOS UTILIZANDO
LINGUAGENS SEMELHANTES S LINGUAGENS DE PROGRAMAO NAS
QUAIS SE ADMITEM CERTAS DESCRIES EM LINGUAGEM NATURAL.
- Pretende-se, deste modo, descrever rigorosamente como vai ser
desenvolvido o problema, sem se entrar, no entanto, nos
pormenores inerentes a uma linguagem de programao.

Passamos, por isso, a apresentar uma linguagem auxiliar, do tipo
pseudocdigo, que ser por ns adoptada sempre que pretendamos
fazer a descrio algortmica dum problema.
Associado a qualquer linguagem h a considerar sempre dois
aspectos:
- a sintaxe, que tem a ver com a forma e regras impostas na escrita
da linguagem (gramtica)
- a semntica, com o contedo
A acompanhar as vrias estruturas de controlo, sempre que possvel
exibiremos paralelamente um fluxograma elucidativo da semntica
que lhes est associada






16 Algoritmos e Programao
1. ESTRUTURA FORMAL DO ALGORITMO

NOME: Descrio/identificador
Definio de constantes
Declarao de variveis
INCIO
Sequncia de instrues
FIM.

2. DEFINIO DE CONSTANTES

Constantes so valores que no se alteram durante a execuo do
programa
- a cada um desses valores podemos associar um nome que o
passar identificar
DEFINIO DE UMA CONSTANTE
identificador = valor;
exemplos: PI = 3.14;
NotaMax = 20;

3. DECLARAO DE VARIVEIS

Podemos imaginar uma varivel como um local onde se pode
colocar qualquer valor do conjunto de valores possveis do tipo
bsico associado
Associado a uma varivel temos:
- um identificador, que o nome pelo qual ela conhecida
- o tipo, que identifica o conjunto de valores possveis a assumir pela
varivel
- um valor, que deve ser do tipo associado
So quatro os tipos bsicos que podemos usar:
- inteiro: qualquer inteiro, negativo, nulo ou positivo
ex: -2, 0, 15
- real: qualquer nmero real negativo, nulo ou positivo

Algoritmos e Programao 17
ex: -2.5, 0.0, 10.25
- caracter: qualquer letra, digito ou outros smbolos
ex: 3, A, y, +, ?
- booleano: qualquer valor lgico
ex: VERDADEIRO, FALSO
DEFINIO DE UMA VARIVEL
identificador :tipo;
exemplos: n_elem: inteiro;
x: real;
letra: caracter;
opcao: booleano;

4. INSTRUO DE ATRIBUIO

para a atribuio de um valor a uma varivel utilizaremos o smbolo
de atribuio
varivel expresso;

- o resultado da expresso do lado direito deve ser coerente com o
tipo da varivel

5. INSTRUES DE ENTRADA E SADA DE DADOS

Para que o algoritmo possa receber dados durante a sua execuo,
devemos incluir na linguagem uma instruo que possibilite essa
tarefa

LER (lista_de_variveis)

Da mesma forma, dever existir uma outra instruo que permita
ao algoritmo fornecer dados ao ambiente exterior

ESCREVER (lista_de_valores)












18 Algoritmos e Programao

Exemplo
Desenvolver um algoritmo que calcule a velocidade mdia (dados
de sada) de determinado corpo, sendo fornecido ao algoritmo os
valores de distncia e tempo (dados de entrada).
Nota: velocidade = distncia a dividir pelo tempo (razo de
transformao)




NOME: calcular_velocidade
dist, tempo, vel: real;
INICIO
LER(dist, tempo);
vel dist / tempo;
ESCREVER(velocid=, vel);
FIM.







6. OPERADORES ADOPTADOS

OPERADORES ARITMTICOS
+, -, *, /, para as quatro operaes bsicas
DIV Quociente da diviso inteira de 2 nmeros
MOD ou % Resto da diviso inteira de 2 nmeros
OPERADORES LGICOS
E para a conjuno
OU para a disjuno
NAO para a negao
OPERADORES RELACIONAIS
=, , <, , >, , cujo significado bvio


inicio
fim
vel dist / tempo
ler
dist, tempo
escrever
velocid=,
vel

Algoritmos e Programao 19

7. ESTRUTURAS DE SELECO SIMPLES

Quando a aco a executar depender da verificao ou no de uma
condio, deve-se utilizar a estrutura de seleco simples
SE...ENTAO


SE condio ENTO
INICIO
sequncia_de_instrues
FIM
FIMSE


- condio qualquer expresso
cujo resultado seja falso ou
verdadeiro (i.e. do tipo booleano)




Se estiverem previstas aces quer para o caso da condio ser
verdadeira quer para o caso de ser falsa, ento teremos a estrutura
de seleco simples composta: SE...ENTAO...SENAO



SE condio ENTO
INICIO
sequncia_de_instrues1
FIM
SENO
INICIO
sequncia_de_instrues2
FIM
FIMSE





con
d
Inst.1
Inst.2
Inst.N
V
F
con
d
Inst.1
Inst.2
Inst.N
V F
Inst.1
Inst.2
Inst.M


20 Algoritmos e Programao
Exemplo
Dados dois nmeros inteiros, A=1 e B=2, colocar a zero (igualar a
zero) aquele que tenha o maior valor.

NOME: pequeno exemplo
A, B: inteiro;
INICIO
A 1;
B 2;
SE A > B ENTAO
A 0;
SENAO
B 0;
FIMSE;
FIM.





Exemplo 2
Desenvolver um algoritmo que faa a leitura de um nmero inteiro
e que posteriormente verifique se esse nmero PAR ou MPAR.

NOME: Par ou mpar
num: inteiro;
INICIO
ESCREVER(Digite um nmero: );
LER(num);
SE num MOD 2 = 0 ENTAO // condio de nmero PAR
ESCREVER (Nmero digitado PAR);
SENO
ESCREVER (Nmero digitado MPAR);
FIMSE;
FIM.


V F
inicio
fim
A 1
B 2
A>
BB
B 0 A 0

Algoritmos e Programao 21
- NOTA IMPORTANTE:
Nos exemplos anteriores, as sequncias de instrues alternativas
eram na realidade, no uma sequncia de instrues, mas sim uma
nica instruo, no formando no conjunto um bloco de instrues.
Por esse facto no houve necessidade de incluir essa instruo num
bloco INICIO FIM, no entanto quando tal acontece, o uso de blocos
INICIO FIM necessrio para tornar o Algoritmo mais claro e sem
ambiguidades.

Exemplo 3
Desenvolver um algoritmo que faa a leitura das medidas de um
determinado slido, comprimento, largura e altura e que,
posteriormente, calcule e mostre o seu volume. O algoritmo dever
tambm identificar o tipo de slido (cubo ou paraleleppedo).

NOME: Volume de slido
alt,larg,comp: REAL;
volume:REAL;
INICIO
ESCREVER(Digite medidas (comprimento,largura e
altura):);
LER(comp,larg,alt);
SE (comp=larg E larg=alt) ENTAO
INICIO
volume comp*alt*larg;
ESCREVER( um CUBO com volume =,volume);
FIM
SENO
INICIO
volume comp*alt*larg;
ESCREVER( um PARALELEPPEDO com volume
=,volume);
FIM
FIMSE
FIM.






22 Algoritmos e Programao
8. ESTRUTURAS DE SELECO MLTIPLA

Quando se pretende que a aco a executar seja seleccionada a
partir de um conjunto de aces alternativas, a estrutura a usar
ser a estrutura de seleco mltipla CASO...IGUAL


CASO expresso IGUAL
const1 : instruo1;
const2 : instruo2;
const3 : instruo3;
FIMCASO







CASO expresso IGUAL
constante1 :sequncia_de_instrues1
constante2, constante3 :sequncia_de_instrues2
constante4 .. constante5 :sequncia_de_instrues3
. . .
constanteN :sequncia_de_instruesN
SENO
sequnc_de_instr_alternativas
FIMCASO






















caso
contrrio
=cnst.1 =cnst.2 =cnst.3
express
instr1 instr2 instr3
=cnst.1
=cnst.5
=cnst.4 =cnst.3 =cnst.2
seno
=cnst.N
seq.
inst3
seq.
inst2
seq.
instN
seq.
instAlt
seq.
inst1
express

Algoritmos e Programao 23

A semntica associada a esta segunda estrutura a seguinte:
- apenas uma sequncias de instrues executada;
- o valor da expresso comparado com cada uma das constantes;
- executada a sequncia de instrues que se segue constante
cujo valor seja igual ao da expresso;
- se o valor da expresso for diferente de todas as constantes, ento
ser executado o conjunto de instrues que se segue clusula
SENO


Exemplo


NOME: escolher operao
n1, n2, result: real;
oper: caracter;
INICIO
LER(n1, n2);
LER(oper);
CASO oper IGUAL
+ : result n1+n2;
- : result n1-n2;


* : result n1*n2;
/ : result n1/n2;
FIMCASO
ESCREVER(Resultado:, result);
FIM.












caso
contrrio
inicio
fim
resultn1+n2
ler
n1, n2
escrever
Resultado:,resul
t vel
ler
oper
ope
r
resultn1-n2 resultn1/n2
resultn1*n2
+ -
*
/


24 Algoritmos e Programao
9. ESTRUTURAS DE REPETIO

De seguida d-se incio ao estudo de um
outro tipo de estruturas de controlo de fluxo:
as estruturas de repetio
- recorre-se a este tipo de estruturas sempre
que seja necessrio executar
repetidamente um conjunto de aces

ENQUANTO condio FAZER
sequncia_de_instrues
FIMENQUANTO


A semntica associada ao ciclo ENQUANTO
a seguinte:
- enquanto a condio for verdadeira, as instrues so executadas;
- quando for falsa, o ciclo abandonado;
- se logo no incio da execuo do ciclo a condio for falsa, as
instrues nunca sero executadas.


Exemplo:
O algoritmo seguinte calcula o somatrio
de valores fornecidos pelo utilizador at ser
introduzido o zero

NOME somatrio
valor, soma: inteiro;
INCIO
soma 0;
LER(valor);
ENQUANTO valor 0 FAZER
soma soma+valor;
LER(valor);
FIMENQUANTO;
ESCREVER(Soma=,soma);
FIM.
con
d
Inst.1
Inst.2
Inst.N
V
F
valor
0
V
F
inicio
fim
soma0
ler
valor
somasoma+valor
ler
valor
escrever
Soma=,soma

Algoritmos e Programao 25
Outra estrutura de repetio o ciclo
REPETIR...AT

REPETIR
sequncia_de_instrues
AT condio

- As instrues que se
encontram dentro do ciclo so executadas
repetidamente at que a condio final
passe a ser verdadeira
- A sequncia de
instrues executada pelo menos uma vez,
mesmo que a condio seja sempre verdadeira
De forma a evidenciarmos as semelhanas e as diferenas entre os
dois ciclos apresentados, vamos resolver o somatrio anterior, usando
agora a estrutura REPETIR


NOME somatrio
valor, soma: inteiro;
INCIO
soma 0;
REPETIR
LER(valor);
soma soma+valor;
AT valor = 0;
ESCREVER(Soma=,soma);
FIM.












con
d
Inst.1
Inst.2
Inst.N
V
F
valor=
0
V
F
fim
inicio
soma0
somasoma+valor
ler
valor
escrever
Soma=,soma


26 Algoritmos e Programao











REPETIR ENQUANTO condio FAZER
instrues instrues
AT condio FIMENQUANTO




Por fim, a ltima estrutura de repetio a saber o ciclo PARA

PARA vc valor1 AT valorN
PASSO inc FAZER
sequncia_de_instrues
FIMPARA

Este ciclo normalmente utilizado em
situaes em se consiga determinar a
priori o nmero de repeties a
efectuar
Inst.1
Inst.2
Inst.N
V
F
vcvalor1
valor1
vcvalor
N
vcvc+inc
con
d
Inst.1
Inst.2
Inst.N
V
F
con
d
Inst.1
Inst.2
Inst.N
V
F

Algoritmos e Programao 27
Nesta estrutura, a varivel de controlo (chamemos-lhe vc) comea
por ser inicializada com o valor1
Aps a inicializao de vc, as instrues contidas no ciclo so
executadas repetidamente, tendo presente o seguinte
- s se avana para uma prxima repetio se o valor de vc ainda
no superar o valorN;
- aps cada repetio, o valor de vc automaticamente
incrementado com o valor de inc.
- o nmero de repeties efectuadas igual ao nmero de valores
contidos do intervalo {valor1; ...; valorN}

Para um melhor entendimento do comportamento do ciclo PARA,
segue-se um algoritmo que efectua o somatrio dos nmeros
impares positivos, inferiores a 100








NOME somatrio de nmeros impares
soma, n: inteiro;
INCIO
soma 0;
PARA n0 AT 49 PASSO 1 FAZER
soma soma+2*n+1;
FIMPARA;
ESCREVER(Soma=,soma);
FIM.










somasoma+2*n+1
V
F
n 0
valor1
n 49
n n+1
fim
inicio
soma0
escrever
Soma=,soma


28 Algoritmos e Programao











Algoritmos e Programao 29
METODOLOGIA DE DESENVOLVIMENTO DE ALGORITMOS


- FASES DE CONSTRUO DE UM PROGRAMA
Especificao dos dados de entrada e dos resultados
pretendidos
Construo de um algoritmo que resolva o problema em causa
Implementao do algoritmo na linguagem utilizada
- QUESTES A TER EM ATENO NA CONSTRUO DE UM PROGRAMA
Correco
- Prende-se com a obrigao de cumprir as especificaes
pretendidas
- Um algoritmo bem estruturado e simples muito til a este
objectivo bsico
Eficincia
- A eficincia de um programa mede-se em:
Tempo de execuo relacionada com o nmero de operaes
envolvidas no algoritmo
Memria ocupada relacionada com a quantidade de dados
manipulados e com o volume de instrues do programa
- Um programa ser tanto mais eficiente quanto menor for a
memria ocupada e menor for o tempo de execuo.
Clareza
- Importante, quer para o programador, quer para outras pessoas
que futuramente necessitem de fazer alteraes no programa
- Facilita a depurao do programa
- Para que resulte um programa claro, as seguintes caractersticas
devem ser garantidas
> Separao lgica do texto que reflicta tarefas distintas a
executar pelo programa


30 Algoritmos e Programao
> Utilizao de nomes para identificadores que
correspondam sua funo no programa
> Incluso de comentrios ao longo do programa
> Utilizao de espaos em branco e indentao que d
nfase s relaes entre os vrios blocos de texto.

Aperfeioamento Progressivo do Algoritmo

- A PROGRAMAO DE COMPUTADORES TRADUZ-SE, NA MAIOR PARTE DAS
VEZES, NUMA TAREFA EXTREMAMENTE COMPLEXA.
Torna-se, por isso, necessrio adoptar uma estratgia que facilite,
de alguma forma, a tarefa do programador.
- Concretamente, podemos torn-la muito mais fcil se dividirmos o
problema sistematicamente em partes menos complexas a
abordagem do dividir para conquistar.
- ESTA METODOLOGIA, TAMBM DENOMINADA DECOMPOSIO DO TOPO
PARA A BASE (TOP DOWN DESIGN), TRADUZ-SE NUM APERFEIOAMENTO
PROGRESSIVO DA SOLUO DO PROBLEMA

Assim, dado um problema complexo
decomposto em vrios subproblemas, de modo a
serem resolvidos separadamente
Se um subproblema for de implementao trivial
escreve-se a soluo final directamente
Caso contrrio
decompe-se o subproblema em outros
subproblemas mais simples
continua-se com este aperfeioamento at todos os
subproblemas serem de soluo simples
ESBOO
DE
NVEL 1
ESBOO
DE
NVEL 2

Algoritmos e Programao 31
Por fim, juntam-se todos os subproblemas de forma a
fazer-se a reconstituio completa da sequncia de
operaes

- FORMATO GERAL DE CADA ESBOO

NOME: designao do problema ou subproblema a descrever
INCIO
operao 1;
operao 2;
. . .
operao N;
FIM.

- AS OPERAES SO DESCRITAS INICIALMENTE EM LINGUAGEM NATURAL
E PROGRESSIVAMENTE TORNADAS MAIS PRECISAS

EXEMPLIFICAO
Pretende-se escrever um programa que leia um tempo em
segundos e o converta para horas, minutos e segundos.

Especificao das variveis de entrada e de sada

ENTRADA
TOTAL_SEG (inteiro)

SADA
NHORAS (inteiro)
NMINUTOS (inteiro)
NSEGUNDOS (inteiro)

Descrio algortmica do problema

NOME: converso de um tempo dado em segundos
INCIO
leitura do valor em segundos;
converso de segundos para horas, minutos e segundos;
mostrar resultado
FIM.
ESBOO
FINAL


32 Algoritmos e Programao

o subproblema leitura do valor em segundos no necessita de
maior desenvolvimento, uma vez que a sua traduo para a
linguagem de implementao bastante simples e directa
vamos, por isso, fazer a decomposio do subproblema que efectua
a converso e do subproblema mostrar resultado

NOME: converso de segundos para horas, minutos e segundos
INCIO
NHORAS diviso inteira de TOTAL_SEG por 3600;
TOTAL_SEG resto da div. int. de TOTAL_SEG por 3600;
NMINUTOS diviso inteira de TOTAL_SEG por 60;
NSEGUNDOS resto da div. int. de TOTAL_SEG por 60;
FIM.

NOME: mostrar resultado
INCIO
escrever(NHORAS);escrever(:);
escrever(NMINUTOS);escrever(:);
escrever(NSEGUNDOS)
FIM.

Um esboo final do algoritmo:

NOME: converso de um tempo dado em segundos
TOTAL_SEG: inteiro;
NHORAS, NMINUTOS, NSEGUNDOS: inteiro;

INCIO
escrever(Tempo em segundos: );
ler(TOTAL_SEG);
NHORAS diviso inteira de TOTAL_SEG por 3600;
TOTAL_SEG resto da div. int. de TOTAL_SEG por 3600;
NMINUTOS diviso inteira de TOTAL_SEG por 60;
NSEGUNDOS resto da div. int. de TOTAL_SEG por 60;
escrever(NHORAS); escrever(:);
escrever(NMINUTOS); escrever(:);
escrever(NSEGUNDOS);
FIM.



Algoritmos e Programao 33

Soluo final, escrita em Pascal

PROGRAM CONV_SEGUNDOS;
VAR
TOTAL_SEG: integer;
NHORAS, NMINUTOS, NSEGUNDOS: integer;
BEGIN
write(Tempo em segundos: );
readln(TOTAL_SEG);
NHORAS := TOTAL_SEG DIV 3600;
TOTAL_SEG := TOTAL_SEG MOD 3600;
NMINUTOS := TOTAL_SEG DIV 60;
NSEGUNDOS := TOTAL_SEG MOD 60;
writeln(HORAS:2, :, MINUTOS:2, :, SEGUNDOS:2)
END.



Soluo final, escrita em C

#include <stdio.h>
#include <conio.h>

int total_seg;
int nhoras,nminutos,nsegundos;
void main(void)
{
clrscr();
printf("\nTempo em segundos: ");
scanf("%d",&total_seg);
nhoras = total_seg / 3600;
total_seg = total_seg % 3600;
nminutos = total_seg / 60;
nsegundos = total_seg % 60;
printf("\n Horas=%2d, minutos=%2d, segundos=%2d",
nhoras, nminutos,nsegundos);
}








34 Algoritmos e Programao
Soluo final, escrita em javascript (para web)

<script language="JavaScript" type="text/javascript">
<!--
var total_seg;
var nhoras, nminutos, nsegundos;
total_seg=prompt("Total de segundos:", "");
nhoras = (total_seg / 3600) | 0;
total_seg = total_seg % 3600;
nminutos = (total_seg / 60) | 0 ;
nsegundos = total_seg % 60;
alert("Horas=" + nhoras + " Minutos=" + nminutos +
" Segundos="+nsegundos);
//-->
</script>

Soluo final, escrita em C#

class MainClass
{
static int total_seg;
static int nhoras,nminutos,nsegundos;

public static void Main(string[] args)
{
Console.Write("\nTempo em segundos: ");
string entrada= Console.ReadLine();
int.TryParse(entrada,out total_seg);
nhoras = total_seg / 3600;
total_seg = total_seg % 3600;
nminutos = total_seg / 60;
nsegundos = total_seg % 60;
Console.WriteLine("Horas={0,2}, Minutos={1,2},
Segundos={2,2}",nhoras, nminutos,nsegundos);
}
}




Algoritmos e Programao 35
SUBPROGRAMAO


Muitos problemas com resoluo de dimenso considervel, ou at
mesmo, problemas pequenos, mas de maior complexidade, podem
ser divididos, sucessivamente, em problemas mais pequenos com
lgica mais simples e de compreenso mais fcil.
Em vez de escrever-se um algoritmo grande, escrevem-se vrios
algoritmos pequenos (mdulos), os quais, em conjunto, resolvem o
problema proposto. Aos pedaos de algoritmo que efectuam um ou
mais clculos, d-se o nome de subalgoritmos (subprogramao).
Assunto este, a desenvolver neste captulo.

- NO DESENVOLVIMENTO DE ALGORITMOS, UTILIZAMOS COMO
ESTRATGIA A DECOMPOSIO DE UM PROBLEMA, INICIALMENTE
COMPLEXO, NUM CONJUNTO DE SUBPROBLEMAS DE MAIS FCIL
TRATAMENTO.
Faz parte de uma boa prtica de programao fazer
corresponder a cada subproblema um mdulo autnomo de
programa - subprograma.

- A ESTRUTURAO DE UM PROGRAMA NUMA FORMA MODULAR
PROPORCIONA, ENTRE OUTRAS, AS SEGUINTES VANTAGENS:

- Evita a necessidade de repetio de cdigo (programao
redundante). Quando h necessidade que um conjunto de
instrues seja executado mais do que uma vez, define-se um
mdulo com essas instrues para que possa ser acedido de vrios
pontos do programa. De cada vez que o mdulo acedido pode
ser processado um conjunto diferente de dados

- Resulta uma maior clareza lgica do programa. Os
programas decompostos em mdulos so mais fceis de escrever e
corrigir, e a sua estrutura lgica mais evidente.



36 Algoritmos e Programao
Anteriormente foram j apresentados exemplos de utilizao de
subprogramas, como por exemplo, as to usadas instrues
LER() e ESCREVER().
- EXISTEM, NA MAIORIA DAS LINGUAGENS DE PROGRAMAO, DUAS
FORMAS DE IMPLEMENTAO E USO DE SUBALGORITMOS (OU
MDULOS):
- Subalgoritmos que
implementam uma funo, no sentido matemtico do termo,
isto , que calculam um nico valor em funo de um ou mais
parmetros recebidos;
- Subalgoritmos do tipo
procedimento que podem calcular um nmero qualquer de
valores, calculados ou no em funo dos parmetros recebidos.

10. DEFINIO FORMAR DE SUBALGORITMOS

Em algoritmia existe alguma liberdade na formalizao algortmica de
funes/procedimentos, a sintaxe a usar nesta unidade no restrita,
sendo uma das vrias possveis:

SUB Identificador(IN/OUT param1: tipo,
IN/OUT param2: tipo,...
IN/OUT paramN: tipo):
TipoRetorno
Definio de constantes locais
Definio de variveis locais
INCIO
Sequncia de instrues;
...;
...;
RETORNAR valor de retorno;
FIMSUB;

Como se pode observar, a estrutura de um Subprograma no muito
diferente da estrutura de um algoritmo simples.

Algoritmos e Programao 37




- ASPECTOS A RETER DA SINTAXE ADOPTADA:
- Um subprograma comea sempre com a palavra SUB (seja um
subprograma do tipo funo ou do tipo procedimento);
- Depois da palavra SUB deve seguir-se a palavra que identifica o
subprograma no bloco principal do algoritmo. Lembrar que os
subprogramas sero depois chamados numa outra qualquer parte do
algoritmo (bloco principal, ou chamados de outros subalgoritmos);
- Caso o subprograma necessite de elementos (chamados de
parmetros/argumentos) externos a ele, ento essa indicao dever
ser feita entre (), a seguir ao nome do subprograma, indicando: a
categoria, o nome pelo qual o argumento vai ser conhecido dentro do
subprograma e o seu tipo. Um subprograma pode no ter
argumentos, ou ter um qualquer nmero de argumentos.
- No final da linha que identifica o subprograma dever tambm existir
a indicao do tipo de dados que esse subprograma vai devolver a
quem o chamou. No caso de no devolver nada (funcionamento, tipo
procedimento) ento o tipo de retorno poder ser omitido ou colocada
a palavra nada (ou void).
- De seguida escrito o algoritmo da mesma forma como se tratasse
de um problema simples.
- A finalizao de um subprograma feita usando a palavra FIMSUB
(em vez de FIM.), para diferenciar do bloco principal do algoritmo.
- Caso se trate de um subprograma, com funcionamento tipo funo,
ento dentro do subprograma dever tambm aparecer a instruo
RETORNAR seguido o valor/expresso que se deseja retornar a
quem chamou o subprograma. Esta instruo pode aparecer em
qualquer parte do subprograma tendo como efeito o





38 Algoritmos e Programao

imediato termino do mesmo.
- ARGUMENTOS: QUE SO OS VALORES RECEBIDOS E/OU RETORNADOS
POR UM SUBALGORITMO. SO DIVIDIDOS EM 3 CATEGORIAS:
De Entrada (IN): So os argumentos que tm os seus valores
estabelecidos fora do subalgoritmo e no devem ser modificados
dentro do subalgoritmo (valores recebidos, passagem por valor );
De Sada (OUT): So os argumentos, que existindo fora do
algoritmo, tm os seus valores estabelecidos dentro do
subalgoritmo (valores calculados e passagem por referncia);
De Entrada-Sada (IN/OUT): So argumentos que tm os seus
valores estabelecidos fora do subalgoritmo, mas que podem ser
modificados pelo subalgoritmo (valores modificados, passagem por
referncia).
- MAIS ALGUMS CONSIDERAES IMPORTANTES:
- Tudo aquilo que for declarado na zona de declaraes de um
subprograma para ser utilizado exclusivamente pelo prprio
subprograma (constantes, tipos, variveis)
- Esses dados apenas so vlidos durante a execuo do
procedimento a que pertencem.
- Para que um subprograma seja activado necessrio invoc-lo de
um qualquer ponto da zona de instrues de um programa ou de
outro subprograma, bastando para isso, indicar o seu nome seguido
pelos parmetros, se os houver.
Para entender melhor este conceito vamos de seguida passar a
apresentar um exemplo demonstrativo da utilizao de subprogramas:
Exemplo 1: Desenvolver um algoritmo que faa a leitura de uma srie
de nmeros inteiros positivos (num), e que, para um desses nmeros
efectuem as seguintes operaes, de acordo com as seguintes
indicaes: calcular e mostrar o factorial do nmero digitado, caso
este seja menor ou igual a 10 ou, fazer a apresentao dos divisores
desse nmero no caso de ser maior do que 10. O algoritmo dever
terminar quando o utilizador digitar como entrada um valor no
positivo.
// Bloco principal do algoritmo

Algoritmos e Programao 39
NOME calcular vrias coisas...
num, f: Inteiro
INCIO
ESCREVER(Digite um nmero: );
LER(num);
ENQUANTO (num>=0) FAZER
SE num<=10 ENTO
INICIO
f FACTORIAL(num);
ESCREVER(Factorial de ,num, , f);
FIM
SENO
MOSTRARDIVISORES(num);
FIMSE;
ESCREVER(Digite um nmero: );
LER(num);
FIMENQUANTO
FIM.

// Subprogramas usados pelo algoritmo
SUB FACTORIAL(IN n:INTEIRO):INTEIRO
fac,i:INTEIRO; // variveis a usar s aqui
INICIO
fac1;
PARA i2 AT n PASSO 1 FAZER
fac fac * i;
RETORNAR fac;
FIMSUB

SUB MOSTRARDIVISORES(IN n:INTEIRO):void
i:INTEIRO; // variveis a usar s aqui
INICIO
PARA i1 AT n/2 PASSO 1 FAZER // ir de 1 at n/2
SE (n MOD i =0) ENTAO
ESCREVER(i, );
FIMPARA
ESCREVER(n); // n tambm divisor
FIMSUB
Exemplo 2: Desenvolver um algoritmo que faa a leitura de uma
sequncia de grupos de valores reais (3 de cada vez) e que para os


40 Algoritmos e Programao
valores lidos, calcule e mostre a mdia aritmtica ((a+b+c)/3) e
mdia ponderada (com ponderao de 1 para o menor dos valores,
1.5 para o valor intermdio e 2.5 para o maior dos valores digitados)
dos valores lidos. O algoritmo s dever terminar quando for digitado
o valor 0 (zero) para qualquer um dos valores de entrada.
NOME Mdia aritmtica e ponderada de 3 valores
num1,num2,num3: REAL;
mA,mP:REAL;
INCIO
ESCREVER(Digite 3 nmeros: );
LER(num1,num2,num3);
ENQUANTO (num1*num2*num3<>0) FAZER
ORDERNAR3N(num1,num2,num3);
CALCULARMEDIAS(num1,num2,num3,1,1.5,2.5,mA,mP);
ESCREVER(Mdia aritmtica : ,mA);
ESCREVER(Mdia Ponderada : ,mP);
ESCREVER(Digite 3 nmeros: );
LER(num1,num2,num3);
FIMENQUANTO
FIM.

// Subprogramas usados pelo algoritmo
SUB TROCA2N(INOUT a:REAL, INOUT b:REAL):void
aux:REAL;
INICIO
auxa; ab; baux;
FIMSUB

SUB ORDENAR3N(INOUT x:REAL, INOUT y:REAL,
INOUT z:REAL):void
aux:REAL
INICIO
SE x>y ENTO
TROCA2N(x,y);
FIMSE
SE y>z ENTO
TROCA2N(y,z);
FIMSE
SE x>y ENTO
TROCA2N(x,y);
FIMSE
FIMSUB

SUB CALCULARMEDIAS(IN n1:REAL,IN n2:REAL,IN n3:REAL,

Algoritmos e Programao 41
IN p1:REAL,IN p2:REAL,IN p3:REAL,
OUT ma:REAL, OUT mp:REAL):void
INICIO
ma (n1+n2+n3)/3; // mdia aritmtica
mp (n1*p1+n2*p2+n3*p3)/(p1+p2+p3); // ponderada
FIMSUB


Exemplo 3 (avaliao de Janeiro/2006):
a) Desenvolva um Subprograma que receba, via argumento, um valor
do tipo inteiro (n) e que calcule e devolva o valor da seguinte soma:
SUB FuncaoS( n:INTEIRO):REAL
s:REAL;
i:INTEIRO;
INICIO
s0;
PARA i 1 AT N PASSO 1 FAZER
ss+ i/(n-i+1);
FIMPARA
RETORNAR s;
FIMSUB

b) Desenvolva um algoritmo que v fazendo a leitura de nmeros
inteiros do teclado e respectiva apresentao para cada um deles do
resultado da chamada ao subprograma definido na alnea anterior. O
Programa dever terminar quando o utilizador digitar como valor de
entrada um nmero menor ou igual a zero
NOME: calcular vrias chamadas a funesS
num:INTEIRO;
r:REAL;
INICIO
REPETIR
ESCREVER(Digite um nmero: );
LER(num);
r FuncaoS(num);
ESCREVER(Resultado da chamada funo ,r);
AT num<=0;
FIM.

1
...
2
3
1
2 1 n
n n n
s + +

+ =


42 Algoritmos e Programao
- CONSIDERAES RELATIVAS AOS TIPOS DE DADOS DE SUBPROGRAMA:

- Como j foi explicado no curso, um subprograma tem acesso aos
dados declarados na zona de declaraes do subprograma so os
chamados dados locais, uma vez que esses dados no podem ser
acedidos fora do subprograma. Podemos ter constantes locais,
variveis locais e tipos locais.
- Um subprograma tambm tem acesso aos chamados dados
globais, que podem ser acedidos de qualquer parte do programa
principal e dos subprogramas. Este tipo de dados so os declarados
fora de qualquer subprograma, no sendo recomendvel o seu uso.
Um identificador declarado localmente num subprograma pode ter
o mesmo nome que um identificador global que foi declarado
externamente. No entanto, considerado uma m prtica de
programao (dentro do subprograma, a definio local ter maior
precedncia. Fora, o identificador local estar indefinido).
- Embora se possam utilizar dados globais num procedimento, deve-
se utilizar, sempre que possvel, dados locais. As vantagens so
evidentes:
. consegue-se uma melhor legibilidade do programa
. consegue-se uma maior facilidade na deteco e correco de
erros
. aumenta a portabilidade, uma vez que um mesmo
procedimento pode ser utilizado em aplicaes distintas com
dados globais prprios
. consegue-se uma gesto mais eficiente da memria, uma vez
que os dados locais apenas esto residentes na memria
durante a execuo do subprograma







Algoritmos e Programao 43
RECURSIVIDADE

Alguma coisa recursiva quando definida em termos dela prpria.
Um exemplo de recursividade (visual) so as imagens repetidas que
um determinado objecto gera quando colocado entre dois espelhos.

Em Programao, a recursividade um mecanismo til e poderoso
que permite que um subprograma se chame a si prprio, ou seja, um
subprograma diz-se recursivo se ele contm nas suas instrues, uma
chamada a ele prprio.

A ideia bsica de um algoritmo recursivo consiste em diminuir
sucessivamente o problema num problema menor ou mais simples,
at que o tamanho ou a simplicidade do problema reduzido permita
resolv-lo de forma directa, sem recorrer a ele mesmo.
- Quando isso ocorre, diz-se que o algoritmo atingiu uma condio
de paragem, a qual deve estar presente em pelo menos um local
dentro do algoritmo. Sem esta condio o algoritmo no parar de
se chamar a si mesmo, at estoirar a capacidade da pilha de
execuo.

Qualquer algoritmo recursivo tem soluo no recursiva (iterativa) que
executa a mesma tarefa, o contrrio j no verdade.

Exemplo: clculo do factorial de N.
Por definio matemtica, o factorial
de um nmero N representado por
N! (n factorial) e calculado da
forma apresentada ao lado:








Aqui fica a verso no recursiva do subprograma que permite calcular
o factorial de um nmero n.

>
=
=
0 N se 1)! - N.(N
0 N se 1
! N


44 Algoritmos e Programao
SUB FACTORIAL(IN n:INTEIRO):INTEIRO
fac,i:INTEIRO;
INICIO
fac1;
PARA in AT 1 PASSO -1 FAZER
fac fac * i;
FIMPARA
RETORNAR fac;
FIMSUB

E Aqui fica a verso recursiva que permite resolver o mesmo
problema:
SUB FACTORIAL(IN n:INTEIRO):INTEIRO

INICIO
SE n=0 ENTO
RETORNAR 1;
SENO
RETORNAR n*FACTORIAL(n-1);
FIMSE
FIMSUB

Explicao: Pela definio do subprograma anterior, o clculo do
factorial de 4 seria feito da seguinte forma:
4! = 4*3! = 4*(3*2!) = 4*(3*(2*1!)) = 4*(3*(2*(1*0!))) = 4*3*2*1
de notar que o subprograma chamado recursivamente com um
argumento decrescente at chegar ao patamar em que o clculo do
factorial trivial (0!, cujo valor 1). Este caso simples (condio de
paragem do subprograma), faz com que o subprograma no entre em
ciclo infinito e faa estoirar a pilha de execuo do computador.

A recursividade um recurso muito til em determinadas situaes,
permitindo criar algoritmos mais simples e elegantes que os seus
equivalentes no recursivos (ou tambm chamados de iterativos).
Alm disso, muitas vezes evidente a natureza recursiva do problema
a resolver, como , o caso do factorial anteriormente referido.

No entanto, a recursividade tambm tem algumas desvantagens:

>
=
=
0 N se 1)! - N.(N
0 N se 1
! N

Algoritmos e Programao 45
- Algoritmos recursivos consomem mais recursos (memria) do
computador, logo tendem a apresentar um desempenho inferior aos
equivalentes iterativos;
- A recursividade no de traagem fcil (depurao: testar o
algoritmo linha a linha), especialmente quando for grande a
profundidade de recurso (nmero mximo de chamadas
simultneas).

Exemplo 2: Desenvolver um subprograma que receba como
argumento um valor inteiro positivo e que para esse nmero calcule e
devolva o nmero de algarismos que o constituem. Desenvolva uma
verso recursiva e uma verso no recursiva para a resoluo deste
problema.
Verso iterativa:
SUB QUANTOSALGARISMOS(IN n:INTEIRO):INTEIRO
c:INTEIRO;
INICIO
c0;
ENQUANTO n<>0 FAZER
n n DIV 10;
c c + 1;
FIMENQUANTO
RETORNAR c;
FIMSUB
Verso Recursiva:
SUB QUANTOSALGARISMOS(IN n:INTEIRO):INTEIRO
INICIO
SE n=0 ENTO
RETORNAR 0;
SENO
RETORNAR 1 + QUANTOSALGARISMOS(n DIV 10)
FIMSE
FIMSUB








46 Algoritmos e Programao
Exemplo 3: A sequncia [1, 1, 2, 3, 5, 8, 13, 21, ...] conhecida como
sucesso ou srie de Fibonacci. Tem diversas aplicaes tericas e
prticas, na medida em que alguns padres na natureza parecem
segui-la.
O termo de ordem N desta
srie pode ser calculado
atravs da frmula:


Desenvolva verses recursivas e no recursivas de subprogramas que
permitam calcular o termo de ordem n da srie de fibonacci (sendo n
um valor inteiro fornecido ao subprograma atravs dos seus
argumentos).
verso recursiva:
SUB FIB(IN n:INTEIRO):INTEIRO
INICIO
SE n<=2 ENTO
RETORNAR 1; // retorna 1
SENO
RETORNAR FIB(n-2) + FIB(n-1);
FIMSE
FIMSUB;

verso no recursiva
SUB FIB(IN n:INTEIRO):INTEIRO
i,F1,F2,F:INTEIRO
INICIO
SE n<=2 ENTO
RETORNAR 1; // retornar 1
FIMSE
F2 1;
F1 1;
PARA i 1 AT n-1 PASSO 1 FAZER
F F2 + F1;
F2 F1;
F1 F;
FIMPARA
RETORNAR F;
FIMSUB
2 n se
2 n se
1 n se
) 1 ( ) 2 (
1
1
) (
>
=
=

+
=
n fib n fib
n fib

Algoritmos e Programao 47









48 Algoritmos e Programao
DADOS DE TIPO ESTRUTURADO
- AT AO MOMENTO LIDMOS APENAS COM DADOS DE TIPO ELEMENTAR:
os dados de tipo predefinido:
INTEIROS (integer/int)
REAIS (real/float)
CARACTERES (char/char)
LGICOS (boolean/..)
Um dado do tipo simples, ou elementar, representa um nico
elemento, que pode ser um caracter, um nmero inteiro, um real,
um valor lgico, ou um valor de um tipo definido pelo utilizador.

- NESTE CAPTULO VAMOS DEBRUARMO-NOS SOBRE OUTRA CLASSE DE
DADOS: OS DADOS DE TIPO ESTRUTURADO:
Os dados de tipo estruturado tm a particularidade de um nico
identificador poder representar mltiplos elementos.
Os vrios elementos de uma varivel do tipo estruturado podem
ser manipulados individualmente ou colectivamente.
Vectores e Matrizes (arrays)
- O ARRAY UM DADO DO TIPO ESTRUTURADO COM A PARTICULARIDADE
DE TODOS OS SEUS ELEMENTOS SEREM DO MESMO TIPO.
Por vezes h necessidade de representar um conjunto de elementos
atravs de um nico identificador.
- Por exemplo, as notas dos alunos de uma turma so valores
inteiros, e o conjunto desses valores formam um todo. por isso
conveniente represent-los como uma s varivel, com vrios
componentes todos do mesmo tipo.
Esse objectivo pode ser conseguido utilizando uma varivel do
tipo array.



Algoritmos e Programao 49
ARRAYS UNIDIMENSIONAIS (VECTORES)

Os arrays de uma dimenso podem ser entendidos como se
de uma coluna (ou linha) de elementos se tratasse, todos do
mesmo tipo.
- CADA UM DOS ELEMENTOS DE UM ARRAY PODE SER ACEDIDO
INDIVIDUALMENTE, BASTANDO PARA ISSO ESPECIFICAR O NOME DO
ARRAY, SEGUIDO POR UM NDICE ESCRITO ENTRE PARNTESIS RECTOS,
INDICADOR DA POSIO DO ELEMENTO NESSE ARRAY.
- OS ELEMENTOS DE UM ARRAY PODEM SER DE QUALQUER UM DOS TIPOS
ESTUDADOS, DESDE QUE SEJAM TODOS DO MESMO TIPO.

- AO DEFINIR-SE UMA ESTRUTURA DO TIPO ARRAY, E NA LINGUAGEM
ALGORITMICA ADOPTADA, NECESSRIO INDICAR O TIPO DOS SEUS
ELEMENTOS E OS RESPECTIVOS NDICES.
Exemplo:
lista[0..2] : INTEIRO;
vector[0..99] : REAL;

- lista define e declara um tipo de array de 3 elementos inteiros
referenciados pelos ndices 0, 1 e 2.
A varivel LISTA poder ento ser ilustrada da seguinte forma:
LISTA =
| |
| |
| |(
(
(

2
1
0
LISTA
LISTA
LISTA

- OS NDICES DE UM ARRAY TM DE SER DE UM TIPO ORDENADO, COM
UMA GAMA LIMITADA DE VALORES.
Os elementos de um array podem ser usados em expresses,
instrues de atribuio, instrues de leitura e escrita, etc.:
5*lista[2] > 10 LER(lista[2]);
ESCREVER(lista[0]); lista[i-1] 5*lista[i];



50 Algoritmos e Programao
- QUANDO SE ACEDE A UM DADO ELEMENTO DE UM ARRAY, O NDICE QUE
O REFERENCIA PODE SER EXPRESSO COMO UMA CONSTANTE, UMA
VARIVEL OU ATRAVS DE UMA EXPRESSO
- Contudo, o ndice deve ser do tipo correcto.
- Exemplo de instrues que ilustram as vrias indexaes:
N := 2;
Y := lista[N]+lista[2];
Z := lista[(N MOD 2)+1];

Exemplo
1- Desenvolver um Algoritmo que, usando um vector de 5 elementos
do tipo inteiro, faa as seguintes tarefas, pela ordem indicada:
- Leitura de 5 nmeros digitados pelo utilizador;
- Apresentao de forma inversa qual foram digitados (isto ,
mostre em primeiro lugar o ltimo nmero digitado, depois o
penltimo, e por fim o primeiro);
- Apresentao apenas dos nmeros pares digitados;
- Calculo e apresentao da mdia aritmtica dos valores digitados.


NOME: Primeiro de arrays
i,soma, vector[0..4]: INTEIRO;
media:REAL;
INICIO

//leitura dos 5 nmeros
PARA i0 AT 4 PASSO 1 FAZER
ESCREVER(Digite um nmero: );
LER(vector[i]); //leitura do elemento i
FIMPARA

//Apresentao dos valores de trs para a frente
ESCREVER(Valores digitados: );
PARA i0 AT 4 PASSO 1 FAZER
ESCREVER(vector[4-i]);
FIMPARA

//Apresentao apenas dos valores pares
ESCREVER(Valores Pares digitados: );
PARA i0 AT 4 PASSO 1 FAZER
SE (vector[i] MOD 2 = 0) ENTO
ESCREVER(vector[i]);
FIMSE
FIMPARA


Algoritmos e Programao 51

//Calculo e apresentao da mdia dos valores digitados
soma0;
PARA i0 AT 4 PASSO 1 FAZER
soma soma + vector[i];
FIMPARA
media soma / 5
ESCREVER(A mdia dos valores lidos ,media);
FIM.


PASSAGEM DE PARMETROS DO TIPO ARRAY

Os arrays, tal como qualquer outro tipo de dados, podem ser
utilizados como parmetros de Subprogramas.
- Contudo, so sempre tratados como argumentos passados por
referncia (INOUT), sendo que qualquer alterao do seu
contedo dentro de um subprograma tem efeito no array usado
como argumento para esse subprograma.

A utilizao de arrays como parmetros obedece a regras idnticas s
de passagem de parmetros de tipo simples.
- A indicao ao subprograma de que um determinado
argumento do tipo Array feita atravs do uso de [] logo aps
o identificador do array. Exemplo:
SUB LERVEC(INOUT vec[]:INTEIRO): void
- sendo que o uso da palavra INOUT pode ser omitida, uma vez
que os arrays so sempre passados por referncia.
- de notar tambm, que na sintaxe usada, no existe indicao
do tamanho do array. Caber ao programador, fazer passar
tambm essa informao para o interior do subprograma. Ex:
atravs do uso de uma outra varivel de entrada:
SUB LERVEC(INOUT vec[]:INTEIRO,IN nlem:INTEIRO): void


A soluo apresentada, para o exerccio anterior, foi desenvolvida
totalmente no bloco principal do algoritmo. Em seguida feita a
apresentao, recorrendo agora ao uso de subprogramao (que a
forma mais correcta).




52 Algoritmos e Programao
// bloco principal
NOME: Primeiro b de arrays
vector[0..4]: INTEIRO;
media:REAL;
INICIO

//leitura dos 5 nmeros
LERNUMEROS(vector);

//Apresentao dos valores de trs para a frente
ESCREVER(Valores digitados: );
MOSTRARVECTOR1(vector);

//Apresentao apenas dos valores pares
ESCREVER(Valores Pares digitados: );
MOSTRARPARES(vector);

//Calculo e apresentao da mdia dos valores digitados
media MEDIAVECTOR(vector);
ESCREVER(A mdia dos valores lidos ,media);
FIM.

Resultado: a soluo ficou mais pequena e clara, tendo no entanto
agora de se resolver os problemas mais pequenos:

//leitura dos 5 nmeros
SUB LERNUMEROS(INOUT vec[]:INTEIRO): void
i:INTEIRO;
INICIO
PARA i0 AT 4 PASSO 1 FAZER
ESCREVER(Digite um nmero: );
LER(vec[i]); //leitura do elemento i
FIMPARA
FIMSUB

//Apresentao dos valores de trs para a frente
SUB MOSTRARVECTOR1(INOUT vec[]:INTEIRO): void
i:INTEIRO;
INICIO
PARA i0 AT 4 PASSO 1 FAZER
ESCREVER(vec[4-i]);
FIMPARA
FIMSUB

//Apresentao apenas dos valores pares
SUB MOSTRARPARES(INOUT vec[]:INTEIRO): void
i:INTEIRO;
INICIO
PARA i0 AT 4 PASSO 1 FAZER
SE (vec[i] MOD 2 = 0) ENTO

Algoritmos e Programao 53
ESCREVER(vec[i]);
FIMSE
FIMPARA
FIMSUB

//Calculo e devoluo da mdia dos valores digitados
SUB MEDIAVECTOR(INOUT vec[]:INTEIRO): REAL
soma,i:INTEIRO;
INICIO
soma0;
PARA i0 AT 4 PASSO 1 FAZER
soma soma + vec[i];
FIMPARA
RETORNAR soma / 5;
FIMSUB.

Anda mungkin juga menyukai