Sei sulla pagina 1di 122

ALGORITMOS E PROGRAMAO

COM RESUMO DAS LINGUAGENS PASCAL E C

PROF. AFONSO INCIO ORTH

SUMRIO

Introduo

Conceitos Bsicos de Algoritmos

Exerccios

10

Algoritmos Seqenciais

11

Questionrio

16

Exerccios

16

Algoritmos com Seleo

18

Questionrio

25

Exerccios

25

Algoritmos com Repetio

27

Questionrio

34

Exerccios

34

Algoritmos de Manipulao de Matrizes

40

Exerccios

49

Subalgoritmos

55

Subalgoritmos do Tipo Funo

56

Subalgoritmos do Tipo Procedimento

61

Tcnica Top-Down

67

Tcnica Bottom-up

70

Questionrio

73

Exerccios

73

Algoritmos Recursivos

77

Exerccios

83

Algoritmos de Manipulao de Caracteres

84

Implementao de Cadeias de Caracteres usando Vetores

86

Exerccios

87

Registros

88

Registro de Vetores

89

Vetor de Registros

90

Exerccios

96

Correo e outras qualidades de um algoritmo

100

Formas de melhoria da eficincia de um algoritmo

101

Apndice A

Traduo de Algoritmos para PASCAL

105

Apndice B

Traduo de Algoritmos para C

113

Captulo I

Captulo II

Captulo III

Captulo IV

Captulo V

Captulo VI

Captulo VII

Captulo VIII

Captulo IX

Captulo X

Bibliografia

122

INTRODUO

O uso de algoritmos quase to antigo quanto a matemtica. Com o passar do tempo, entretanto, ele foi bastante
esquecido pela matemtica. Com o advento das mquinas de calcular e , mais tarde dos computadores, o uso de
algoritmos ressurgiu com grande vigor, como uma forma de indicar o caminho para a soluo dos mais variados
problemas.
Segundo Knuth (68 ), o termo algoritmo derivado do nome de um matemtico persa do sculo IX,
chamado Abu Jafar Maom ibn Ms al-Khowrizm ( 1825 ).
Algoritmo no a soluo do problema, pois, se assim fosse, cada problema teria um nico algoritmo.
Algoritmo um caminho para a soluo de um problema, e, em geral, os caminhos que levam uma soluo so
muitos. A soluo obtida por meio da execuo do algoritmo, seja mentalmente, ou manualmente usando lpis e
papel ou por meio de um computador
Ao longo dos anos surgiram muitas formas de representao dos algoritmos, algumas utilizando
linguagens semelhantes s linguagens de programao, ou as prprias linguagens de programao e outras
utilizando formas grficas de representao dos algoritmos.
Dentre as formas de representao, nos ltimos anos, deu-se acentuada preferncia por formas
estruturadas, cuja principal vantagem a de facilitar a legibilidade e compreenso dos algoritmos.
Uma das dificuldades constatadas no aprendizado de algoritmos a passagem de uma lngua natural, de
expresso completamente livre, para uma restrio da linguagem, rigidamente formalizada, com sintaxe no
familiar e, em geral, em uma lngua estrangeira.
Certamente, uma passagem por uma linguagem algortmica, embora mais restrita que a lngua natural, mas
com sintaxe conhecida e em portugus, representa uma transio bem menos traumatizante.
Outro argumento razovel para justificar o uso de uma linguagem algortmica em lugar de uma linguagem
de programao ou at de uma linguagem algortmica executvel, o fato de que, sob a ptica do ensino, deve-se
ensinar um conceito cada vez, sob pena de se perder muito mais tempo para o aprendizado. O objetivo aqui o de
ensinar uma forma de expressar algoritmos e no uma sintaxe de uma linguagem de programao. Normalmente
detalhes de notao como ;, :=, etc. desviam a ateno do aluno do principal.
Perdemos muito tempo ensinando detalhes da sintaxe das linguagens de programao e, como este ensino
se d geralmente em momentos nos quais o aluno no est necessitando imediatamente destas informaes e
provavelmente no est motivado para aprend-las, perdemos literalmente o nosso precioso tempo.
Alm disso, o uso de uma linguagem algortmica evita que os alunos associem a lgica da soluo do
problema com eventuais detalhes de implementao do algoritmo em tal ou qual linguagem.
A experincia tem mostrado que, uma vez dominando a linguagem algortmica, o ensino de uma
linguagem de programao pode ser feito em dois perodos de aula com folga, incluindo exerccios. Melhor ainda,
deixemos que o aluno aprenda os detalhes das linguagens de programao no momento em que necessitar deles e
estiver motivado para tanto. No subestimemos a capacidade do aluno de buscar as informaes que necessita. Isto
o cerne do processo ensino-aprendizagem, onde o processo ensino muito menos importante do que o processo
aprendizagem. o aluno que aprende quando motivado para tanto e no o professor que ensina. Um aluno
motivado aprende, inclusive, apesar do professor e de outras condies menos favorveis.
Os algoritmos iniciais so, via de regra, suficientemente simples para se fazer uma verificao de seu
funcionamento de forma manual. Com isso o aluno aprender mais facilmente o efetivo funcionamento de cada
estrutura de controle da linguagem utilizada e, alm disso, a verificao de algoritmos, pelo autor, uma forma
adicional e complementar de aprendizagem de algoritmos.
O aprendizado de algoritmos s se consegue atravs de muitos exerccios.
Algoritmos NO se aprendem:
- Copiando algoritmos;
- Estudando algoritmos.
Algoritmos S se aprendem:
-

Construindo algoritmos;
Testando algoritmos.

CAPTULO I
CONCEITOS BSICOS DE ALGORTMOS

Este captulo visa conceituar: constante, varivel, operao, expresso e atribuio.


Considerando-se a frmula matemtica simples do clculo do volume de uma esfera tm-se:

V =

4
3

R3

onde encontramos:
1 valores que podem ser classificados como:
valores constantes, invariantes em todas as aplicaes da frmula, no caso, os valores 4, 3, e , que,
pelo fato de serem sempre os mesmos so denominados de constantes;
b) valores a serem substitudos na frmula, em cada aplicao que dela fazemos. A representao destes
valores, usualmente feita atravs do uso de letras ou combinaes de letras e/ou dgitos numricos,
que recebem o nome de variveis e tornam a frmula genrica, isto , possvel de ser usada para
resolver uma certa classe de problemas e no apenas um problema especfico. No exemplo, V e R so
denominados de variveis. Outros exemplos de variveis: a, b1, valor, x14, codigo10, etc.
a)

2 - operaes a serem executadas sobre determinados operandos ( valores ), para a obteno da soluo do
problema. Na frmula do volume da esfera esto representadas as operaes de diviso, multiplicao e
potenciao, efetuadas sobre os operandos 4, 3, e R, numa seqncia pr-determinada, mas nem sempre rigorosa,
devido s leis matemticas da comutatividade e associatividade.
Uma frmula matemtica simplesmente uma descrio de um conjunto de aes ( operaes ) que devem
ser executadas sobre um conjunto de objetos ( constantes e/ou variveis).
importante que os objetos sobre os quais as operaes tem efeito sejam precisamente definidos.
Existe uma outra relao que deve ser cuidada entre objetos e operaes. Certas operaes somente podem
ser executadas sobre determinados objetos, se estes objetos satisfizerem certas condies como pode ser ilustrado
nos exemplos abaixo:

Exemplo 1:

A operao de radiciao somente pode ser executada sobre o objeto a, se este pertencer ao conjunto dos reais
positivos R+.
Exemplo 2: n !
O conjunto de operaes necessrias para o clculo do fatorial de n s far sentido prtico se o objeto n pertencer
ao conjunto dos inteiros positivos I+.
Exemplo 3: Arc sen x
A operao de determinao do arco do seno trigonomtrico somente pode ser executada sobre o objeto x se este
pertencer ao intervalo [ -1,1 ] do conjunto R.
Exemplo 4: Verificar a ocorrncia da letra a em um dado texto.
A operao de comparao de cada um dos caracteres do texto com a letra a tem como resultado um valor lgico
verdadeiro ou falso conforme o caracter a for ou no encontrado no texto. Entretanto, ela s far sentido se o
caracter a pertencer ao conjunto de smbolos possveis de ocorrerem no texto.
Nos exemplos apresentados, pode-se notar dois tipos de limitaes:

1. Limitaes de classes de valores que podem ser:


Inteiros quando pertencem aos conjuntos I ou Z.
Reais quando pertencem ao conjunto R .
Lgicos quando pertencem ao conjunto { verdadeiro, falso }.
Literais quando pertencem ao conjunto dos caracteres.
2. Limitaes de intervalo, pois, algumas operaes no atuam sobre todo o conjunto, mas somente sobre parte
dele.
O conjunto de valores que uma varivel pode assumir poder influir, inclusive, na maneira de se executar certas
operaes:

Exemplo: AB que pode assumir as seguintes variaes de clculo:

a) B inteiro e positivo

:A

b) B inteiro e negativo : A

=AxAxAxA
=

1 1
1
1
x
x
xx
A A A
A

c) B real

: AB = 10B. log10A

d) B nulo

: AB = 1

Uma constante pois, um objeto invariante em cada execuo de uma frmula matemtica, enquanto varivel
um objeto que representa um valor que pode ser alterado a cada execuo da frmula que a contm.
Se for resolvida a expresso V =
4
3

4
3

R3

para uma esfera de raio 3, por exemplo, teremos:

33 )

1.

Substituir R por 3 ( V =

2.

Substituir por 3,1416 ( V =

4
3

3,1416. 33 )

3.

Calcular a potenciao ( V =

4
3

3,1416 . 27 )

4.

Calcular a diviso 4 por 3 (V = 1,333. 3,1416. 27 )

5.

Calcular a primeira multiplicao (V = 4,1885 . 27 )

6.

Calcular a multiplicao restante ( V = 113,0895 )

Observa-se que neste caso, a existncia de nmeros como

4
3

= 1,3333 obrigou-nos ao estabelecimento de um

limite de preciso para que a seqncia de operaes pudesse ser executada.


As variveis podem ser visualizadas como receptculos de valores. Cada receptculo identificado atravs de um
nome e pode receber um valor de um determinado tipo.
Assim a frmula V =

4
3

R3 pode ser visualizada como segue:


3

4
3

Cada vez que a frmula for utilizada, ocorrer o seguinte:

a varivel R dever receber um valor antes da execuo dos clculos;


a varivel V receber um valor aps a execuo dos clculos;
o valor da varivel R ser utilizado no clculo do valor de V;
a cada nova utilizao da frmula, o valor de R poder ser alterado e, consequentemente o valor de V
tambm o ser.

Segundo (Forsythe,1975), uma varivel pode ser vista como uma caixa identificada por um nome colocado na
tampa desta caixa e por um valor de uma constante que poder estar colocado no interior da caixa. Enquanto o
nome sempre permanece o mesmo, o contedo da caixa, isto , a constante nela armazenada pode ser alterada cada
vez que a frmula na qual ela aparece utilizada.
Embora saibamos que a memria de um computador no constituda por um conjunto de caixas deste tipo, na
prtica, ela funciona como se assim fosse.
Segundo (Wirth,1972), uma varivel comparvel a um quadro-negro: um valor escrito no quadro-negro pode ser
consultado(inspecionado ou lido), tantas vezes quantas se deseja ou pode ser apagado e reescrito. O reescrever,
contudo, causa a perda do valor anterior, o qual ser substitudo pelo novo valor, enquanto as aes de ler ou
consultar o valor no provocam a sua perda.
Uma vez conceituados constante, varivel e operao pode-se analisar as combinaes deles na construo de
expresses.
Expresses, no sentido matemtico, so representaes simblicas de seqncias de operaes a serem feitas sobre
determinados operandos, visando a obteno de um resultado.
As operaes representadas nas expresses devem ser vlidas para os operandos especificados para que seja
possvel a obteno do resultado.
O conjunto de operandos e operaes que compe uma expresso determinam o tipo da expresso e tambm
definem o tipo do resultado que ser obtido pela avaliao da expresso. As expresses mais freqentemente
usadas enquadram-se em uma das seguintes categorias:
- Expresses Aritmticas: produzem como resultado um valor numrico;
- Expresses Lgicas : produzem como resultado um valor lgico.
Para cada uma das categorias acima, pode ser definido um conjunto de operaes possveis.
Estas operaes podem ser mondicas ( um operador atua sobre um nico operando) ou didicas ( um operador
atua sobre dois operandos) e, independente da forma de representao, qualquer expresso pode ser decomposta em
seqncias encadeadas de operaes mondicas e/ou didicas.
Exemplo1: X - ( - Y )
onde o primeiro - uma operao didica e o segundo - uma operao mondica.

Exemplo2: no(a ou b )
Onde ou uma operao didica e no ( que s tem um operando ) uma operao mondica.
As expresses lgicas sero conceituadas e analisadas em outro captulo.
Uma Expresso Aritmtica pode ser conceituada como sendo uma constante ou uma varivel ou uma
combinao de constantes e/ou variveis por meio de operadores aritmticos
Nas expresses aritmticas so usados smbolos para representar:
-

operandos : constantes e variveis;

operadores : que indicam as operaes a serem feitas ( +,-,x,/);

ordem de avaliao: smbolos que indicam alteraes na ordem usual de avaliao ( ( , ), ] , [, }, }).

Os smbolos tambm so usados para representar de forma compacta, seqncias longas de operaes, tais como:
n
Sn =

1
i!
i=1

onde

1
o somatrio dos inversos dos fatoriais de i
i!

Essa representao compacta pode ser substituda por outras, tais como:
Sn =

1 1
1
1
+
+
++
1! 2! 3!
n!

importante notar que a representao compacta no diminui a quantidade de operaes a serem feitas, isto , no
minimiza o esforo de clculo, apenas minimiza o esforo de notao.
A decomposio de uma expresso em passos mais elementares possibilita o emprego de mquinas simples para a
soluo de problemas de grande complexidade ou grande volume de clculos repetitivos.
So exemplos de Expresses Aritmticas, de acordo com a definio apresentada acima:

50
a
b+c
b2
4ac
(a+b)2

(2a + 5b)
+1
2
Na resoluo de uma expresso aritmtica deve-se seguir uma ordem pr-definida que depende dos operadores e de
smbolos capazes de indicar alterao de ordem de resoluo.
A prioridade natural dos operadores a seguinte:
1)
2)
3)
4)
5)

Potenciaes e ( - ) mondico
Multiplicaes e divises
Somas e subtraes
Parnteses, colchetes ou chaves podem alterar esta ordem
Segue-se da esquerda para a direita em caso de indeterminao ( mais de uma operao de mesma prioridade ).

b 2 4ac
2a

Exemplo1 : Resolver

x
x

Considere-se esta outra expresso: ( a + b) 2

(2a + 5b)
+1 que tem a seguinte ordem de operaes:
2
2

+
A decomposio de uma expresso dever atender sempre o seguinte princpio bsico: a soluo das subexpresses deve conduzir soluo de toda a expresso.
Tanto o resultado final da expresso quanto os resultados das sub-expresses devem ser armazenados em
variveis.
O ato de armazenar ou escrever um valor em uma varivel chamado de atribuio de valor, sendo
representado atravs de smbolos, tais como:
Varivel valor
Varivel := valor
Varivel = valor
A atribuio compreende uma ao de substituio do contedo de uma varivel cujo efeito : aps a
atribuio, a varivel passa a representar um novo valor, sendo perdido o valor anterior.
Assim, uma atribuio tal como:
PI = 3,1416
seguida de outra do tipo:
PI = 3,15
far com que a varivel PI represente o valor 3,15 como resultado atual, perdendo o valor 3,1416
anteriormente nela armazenado.
Considere as atribuies:
A=5
B=2
C = 10
Se fizermos em seguida: A = B e B = C, teremos como resultados
A=2
B = 10
C = 10
Fazendo-se, a seguir, as seguintes atribuies: B = C e A = B, teremos
A = 10
B = 10
C = 10

Outro exemplo nos mostra que se tivermos A = 2 e B = 4 e quisermos intercambiar os valores das
variveis A e B, no poderemos simplesmente escrever:
A=B
B=A
cujo resultado seria
A=4
B=4
e no A = 4 e B = 2 como se desejava fazer.
Teremos neste caso que escrever a seguinte seqncia de atribuies:
C=A
A=B
B=C
onde C uma varivel auxiliar que evita perder o contedo da varivel A que ocorria no primeiro caso. O
resultado agora ser A = 4, B = 2 e C = 2, sendo que o valor de C no nos interessa mais.
Embora em muitas linguagens algortmicas ( ou de programao ) se utilize o smbolo = como
operador de atribuio, deve-se tomar cuidado para no confundi-lo com o operador relacional de igualdade que
tambm usa este smbolo.
Considere a atribuio
N=N+1
Se o smbolo de = fosse tomado com o significado de igualdade, a afirmativa seria sempre falsa. Se,
entretanto, for tomado como operador de atribuio, e supondo-se que o valor de N seja 5, teremos N = 6,
significando fazer N ser igual ao valor anterior de N acrescido de uma unidade ou somar uma unidade ao valor
atual de N.

EXERCCIOS

1)
2)
3)
4)
5)

Conceitue constante.
Conceitue varivel.
Conceitue operao.
Qual o efeito de uma atribuio de valor a uma varivel?
Resolva as expresses abaixo para a = 5, b = 1 e c = 2, dando o valor de x e a ordem das operaes.

a 2 5b +
X=

X=

(b + 3
7

c
2

(a + b 2 )(a b) + 4a 5b + c
2

6 ) Conceitue Expresso Aritmtica.


7 ) Que so operadores mondicos e didicos?
8 ) Alm das expresses aritmticas que outro tipo de expresses so usadas em algoritmos?
9 ) Qual a seqncia de operaes necessrias para intercambiar os valores de 3 variveis a, b, c de modo que a fique com o
valor de b, b fique com o valor de c e c fique com o valor de a ?

10) Se X possui o valor 15 e se forem executadas as seguintes atribuies na ordem em que aparecem:
X=X+3
X=X6
X = X/2
X = 3X

Qual ser o valor armazenado em X ?

10

CAPTULO II
ALGORITMOS SEQENCIAIS

Este captulo visa conceituar algoritmo, formalizar este conceito, caracterizar algoritmos seqenciais, bem
como, iniciar a apresentao de uma linguagem algortmica a ser utilizada ao longo do livro.
Nada mais bsico em computao do que o conceito de algoritmo.
Um conjunto finito de regras, bem definidas, para a soluo de um problema em um tempo finito.
Este conceito, aparentemente simples, pode ser formalizado matematicamente com grande preciso,
edificando-se sobre a definio toda uma teoria de algoritmos.
Considere o seguinte problema: Dados 3 valores positivos, a, b, c, determinar a sua mdia aritmtica,
harmnica, geomtrica e ponderada com pesos respectivos de 1, 2 e 3. As tarefas a serem executadas para a soluo
deste problema, podem ser descritas da seguinte forma:
1) Obter os valores de a, b, c

a+b+c
3
3
3) Calcular a mdia harmnica pela frmula mh =
1 1 1
+ +
a b c
4) Calcular a mdia geomtrica pela frmula mg = 3 axbxc
1xa + 2 xb + 3 xc
5) Calcular a mdia ponderada pela frmula mp =
1+ 2 + 3
2) Calcular a mdia aritmtica pela frmula ma =

6) Comunicar os resultados obtidos: ma,mh,mg,mp


7) Terminar
A seqncia de tarefas acima, especificadas passo a passo, um algoritmo, pois formado por um
conjunto finito de regras que podem ser consideradas bem definidas e cuja execuo produz a soluo do problema
proposto, aps um tempo finito.
A execuo da tarefa, neste caso, corretamente cumprida, se executarmos todos os passos (instrues) na
seqncia em que elas aparecem, da primeira at a ltima, sem omisses e sem repeties.
Um algoritmo com estas caractersticas denominado de algoritmo seqencial.
No passo 1 do algoritmo indicada a ao de obter valores . Para efetuar os clculos indicados nos
passos 2, 3e 4 a pessoa, mquina de calcular ou computador que dever executar estas tarefas necessita receber os
valores de a, b, c. Aos valores recebidos por um algoritmo d-se o nome de Entradas. Deve-se ter o cuidado de
definir claramente o conjunto ou intervalo de conjunto ao qual pertencem as Entradas.
No algoritmo acima, a, b, c podem assumir qualquer valor real, exceto o zero, pois, o inverso de zero no
est definido e com isso a mdia harmnica no poderia ser calculada.
Todo algoritmo possui pelo menos um resultado. O algoritmo do clculo das mdias possui como
resultados os valores das mdias ma, mh, mg e mp. Os resultados fornecidos por um algoritmo recebem o nome de
Sadas.
importante que num algoritmo cada passo esteja precisamente definido no deixando margem a
ambigidades. Muitos conjuntos de regras encontradas no dia a dia, tais como, receitas, descries de usos de
aparelhos, etc. pecam por definies imprecisas de um ou mais de seus passos.
Assim, uma receita que se refere a uma pitada de sal ou mexa at que fique em ponto de caramelo no
define claramente o quanto isto representa, de forma que cada usurio da receita deve interpret-lo.
Para precisar o conceito de algoritmo necessrio que ele satisfaa propriedade da efetividade ( no
confundir com eficincia ), isto , todas as operaes especificadas no algoritmo devem ser suficientemente bsicas
para que possam ser, pelo menos em princpio, executadas de maneira exata e num tempo finito.
Deve-se observar que na prtica no basta que um algoritmo seja de execuo finita. Um algoritmo til
precisa terminar no apenas em um tempo finito, mas em um tempo muito finito . Por exemplo, dada uma
partida de xadrez, existe um algoritmo que determina se as peas brancas podem ou no forar uma vitria. Eis um
algoritmo que pode resolver um problema de grande interesse para um bom nmero de pessoas. No entanto, no
teremos a resposta, pois, tal algoritmo requer um tempo fantasticamente grande, ainda que finito, para chegar a esta
concluso. No possui a efetividade.

11

Observe a seguinte lista de instrues, que escreve os nmeros mpares partir de 1:

Fazer n igual a zero e i igual a 1


Enquanto n for menor do que 5
Escreve i
Somar 2 ao i
Terminar

A lista acima possui um conjunto finito de passos, claramente definidos, mas sua execuo de tempo
infinito, pois, como fcil ver, o n feito igual a zero no incio e no alterado por nenhuma instruo. Logo, a
instruo Enquanto ser executada indefinidamente porque n ser sempre menor do que 5.
Quando isto ocorre, a lista de instrues dita procedimento e no algoritmo, pois, falta-lhe a condio
de efetividade.
Cada passo de um algoritmo pode ser constitudo de uma ou mais operaes, por exemplo, no
procedimento acima a instruo Enquanto constituda de Escrever i e Somar 2 ao i que so duas
operaes distintas.
Ao conjunto de duas ou mais operaes que devem ser executadas na ordem em que aparecem, denominase de seqncia de operaes.
Na prtica no importante ter-se apenas um algoritmo, mas ter-se um bom algoritmo. O mais importante
com respeito a um algoritmo a sua correo, isto , se ele resolve realmente o problema proposto e o faz
exatamente. Sem esta qualidade, qualquer outra no interessa e o prprio algoritmo no tem sentido de existncia.
Outros critrios que devem ser considerados so: o tempo necessrio para a sua execuo, a adaptabilidade
do algoritmo para a soluo de problemas similares, sua simplicidade, sua elegncia, sua legibilidade, etc. que
sero analisados em um captulo parte.
Geralmente existe mais de uma seqncia de operaes as quais podem ser executadas para se ter a
execuo de uma determinada tarefa, isto , existem vrios algoritmos para o mesmo problema. No , porm,
qualquer seqncia de operaes que leva correta execuo de uma tarefa. Quanto maior o nmero de operaes
para se executar uma tarefa tanto mais algoritmos diferentes existem para executar aquela tarefa.
Considere-se o problema de encontrar o mximo divisor comum de dois nmeros m e n inteiros e
positivos:
Soluo 1

Seja r o resto da diviso de m por n.


(0 r < n)
Se r = 0 ento escrever n como resposta e
terminar.
Fazer m assumir o valor de n ,
n assumir o valor de r e
voltar ao passo inicial.

12

Soluo 2
Se m n fazer m igual ao resto de m
dividido por n e repetir este mesmo passo.
Trocar os valores de m e n entre si.
Se n = 0 ento escrever m como resposta e
terminar.
Voltar ao passo inicial.

Soluo 3

Dividir m por n e fazer r ser o resto.


Se r = 0 escrever n como resposta e terminar.
Dividir n por r e fazer m ser o resto.
Dividir r por m e fazer n ser o resto.
Se m = 0 escrever r como resposta e terminar.
Se n = 0 escrever m como resposta e terminar.
Voltar ao passo inicial.

Soluo 4

Se n 0 ento MDC = MDC( n, mod( m,n ))


Seno MDC = m.

Onde mod a funo mdulo ( resto inteiro da diviso de m por n), Esta soluo a forma recursiva
para se calcular o mximo divisor comum entre m e n.
Certamente estas solues no so as nicas solues para se resolver este problema.
Quando se dispe de vrios algoritmos para solucionar o mesmo problema, entram em considerao os
critrios de escolha do melhor algoritmo. Deve-se, porm, verificar primeiramente se todos os algoritmos so
corretos, isto , resolvem exatamente todo o problema proposto e, somente depois, levam-se em conta os critrios
de escolha tais como, tempo de execuo, legibilidade, adaptabilidade, elegncia, simplicidade, etc.
Para ter-se um algoritmo necessrio:
1)
2)
3)
4)
5)
6)

Que se tenha um nmero finito de passos.


Que cada passo esteja precisamente definido, sem possveis ambigidades.
Que existam zero, uma ou mais Entradas tomadas de conjuntos bem definidos.
Que existam uma ou mais Sadas.
Que o conjunto de passos nos leve, passo a passo, execuo de uma tarefa til.
Que exista uma condio de fim sempre atingida para quaisquer Entradas e num tempo finito.

13

Um mtodo para a construo de algoritmos pode, simplificadamente, ser descrito pelos seguintes passos:
1.
2.
3.
4.
5.
6.

Ler atentamente o enunciado.


Descobrir no enunciado o conjunto de entradas ( dados que so fornecidos ).
Descobrir no enunciado o conjunto de sadas ( resultados que devem ser produzidos ).
Determinar o que deve ser feito para transformar as entradas nas sadas desejadas.
Construir o algoritmo.
Executar o algoritmo verificando se produz os resultados desejados.

Nos exemplos de algoritmos at agora apresentados foi utilizada uma linguagem usual, sem maiores
formalismos. Contudo, para um melhor entendimento dos prprios algoritmos, para poder compar-los com outros
algoritmos que foram escritos por colegas e que solucionam o mesmo problema, , se no necessrio, ao menos
altamente conveniente formalizar a linguagem algortmica usada.
Como j visto, um algoritmo geralmente possui uma ou mais entradas. Uma operao de dar entrada de
valores ser indicada no algoritmo pela seguinte instruo:
Ler (< lista de variveis >)

Onde lista de variveis uma varivel ou vrias variveis separadas por vrgulas.
Exemplos:

Ler ( a )
Ler ( a, b, c )
Ler ( numero, nome, salrio )

Todo algoritmo deve produzir pelo menos um resultado, denominado de sada. Uma operao de sada, no
algoritmo, ser indicada pela instruo:

Escrever ( < lista de expresses > )


Onde lista de expresses uma constante ou uma varivel ou constantes e/ou variveis e/ou expresses,
separadas por vrgulas.
Exemplos:

Escrever
Escrever
Escrever
Escrever
Escrever

(5)
(x)
( x, y, z )
( Matrcula = , m, Nota = , n )
( Faculdade de Informtica )

Escrever (

a+b
, 2ab, b2-4ac )
2

Num algoritmo existem, geralmente, um ou mais passos indicando clculos que devem ser realizados.
Uma operao de clculo ser indicada pela instruo de atribuio:
Varivel = Expresso
Exemplos:

a=5
x=y
d = b2 4ac
nome = Joo

Como, aps a execuo de um certo nmero de passos, o algoritmo, deve chegar condio de tarefa
realizada, isto , termino da execuo do algoritmo. Esta operao ser indicada pela instruo:

Fim

14

Como, para se poder construir um algoritmo efetivo, deve-se definir os valores que as variveis do
algoritmo podem assumir, ser utilizada a seguinte instruo para indicar os tipos de valores que as variveis do
algoritmo podem assumir:
< Lista de variveis >: < tipo >

Onde o significado de lista de variveis j foi visto acima e tipo pode ser qualquer um dos seguintes :
inteiro, real, caracter, booleano. Por enquanto usaremos somente estes tipos.
Exemplos:

n : inteiro
a, b, c : real
Um algoritmo que possui apenas estes tipos de instrues denominado de algoritmo seqencial.
Um Algoritmo Seqencial aquele cuja execuo efetuada na ordem em que as instrues ocorrem,
sem omisso de passos. A passagem de um passo a outro natural e automtica e cada passo executado uma
nica vez.
Como exemplo, considere o problema de calcular o fluxo de corrente alternada de um circuito dados: a
voltagem, a resistncia, a freqncia, a indutncia e a capacitncia.
As variveis que representam estas grandezas so:
I = corrente ( amperes )
R = resistncia ( ohms )
C = capacitncia ( farads )
E = voltagem ( volts )
L = indutncia ( henrys )
F = freqncia ( ciclos/seg )
Um algoritmo para resolver este problema o seguinte:
Algoritmo CalculoCorrente
E, R, F, C, L, I : Real
Incio
Ler (( E, R, F, L, C )

I=

R 2 + [2FL

1 2
]
2FC

Escrever ( I )
Fim
O passo 2 do algoritmo acima poderia ser decomposto em diversas instrues de clculo em lugar de se
usar uma s. Independente da decomposio ou no, o algoritmo se resume nas seguintes instrues bsicas:
-

Ler valores
Calcular valores
Escrever resultados
Parar

Todo algoritmo seqencial tem exatamente esta estrutura. Portanto, a lgica deste tipo de algoritmo
muito simples e no reside no algoritmo propriamente dito a dificuldade de se escrever algoritmos seqenciais e
sim, no eventual desconhecimento das formas de se calcular os valores desejados.

15

QUESTIONRIO
1)
2)
3)
4)
5)
6)
7)
8)
9)
10)

Conceitue algoritmo, enumerando os principais elementos que so significativos neste conceito.


Em que consiste a propriedade da efetividade de um algoritmo ?
Que um procedimento ?
Quando que um algoritmo dito correto ?
Cite 3 outros critrios que podem ajudar na escolha do melhor algoritmo para solucionar um determinado
problema.
Que um algoritmo seqencial ?
Que tipos de instrues aparecem num algoritmo seqencial ?
Qual a principal dificuldade que pode aparecer em algoritmos seqenciais ?
Por que interessante formalizar-se a linguagem algortmica utilizada ?
Por que necessrio definir-se os tipos de valores que as variveis podem assumir ?

EXERCCIOS

1) Reescrever o algoritmo que calcula as mdias, apresentado no incio deste captulo, utilizando a linguagem
apresentada.
2) Escrever um algoritmo que l o nmero de um funcionrio, seu nmero de horas trabalhadas, o valor que
recebe por hora, o nmero de filhos com idade menor do que 14 anos e o valor do salrio famlia ( pago por
filho com menos de 14 anos ). Calcular o salrio total deste funcionrio e escrever o seu nmero e o seu salrio
total.
3) Escrever um algoritmo que calcula e escreve o fatorial de 5.
4) Escrever um algoritmo que l 3 valores reais a, b, c e calcula:
A rea do tringulo que tem a por base e b por altura;
A rea do crculo de raio c;
A rea do trapzio que tem a e b por bases e c por altura;
A rea do quadrado de lado b;
A rea do retngulo de lados a e b;
A rea da superfcie de um cubo que tem c por aresta.
5) Escrever um algoritmo que escreve os nmeros mpares entre 10 e 20.
6) Escrever um algoritmo que l p, u e r respectivamente o primeiro termo de uma progresso aritmtica, o
ltimo termo da progresso e a sua razo. Determinar e escrever a soma dos termos desta progresso.
7) Escrever um algoritmo que l o nmero de peas do tipo 1, o valor de cada pea do tipo 1, o nmero de peas
do tipo 2, o valor de cada pea do tipo 2 e o percentual do IPI a ser acrescentado. Calcula e escreve o valor
total a ser pago por esta compra.
8) Um avio em linha reta, a uma altitude a passa sobre um ponto p situado no solo, num instante t = 0. Se a
velocidade v, calcular a distncia d do avio ao ponto p aps 30 segundos. Escrever um algoritmo que l v e
a e calcula e escreve a distncia do avio ao ponto p aps 30 segundos.
9) Uma farmcia paga o seu funcionrio a cada sexta-feira e deseja deixar pronto o envelope de pagamento.
Escrever um algoritmo que l o valor do salrio do funcionrio em cruzeiros e calcula qual o menor nmero
possvel de notas de 100, 50, 10, 5 e 1, em que o valor lido pode ser decomposto. Escrever o valor lido e o
nmero de notas de cada tipo que compe o envelope de pagamento.
10) Escrever um algoritmo que l o nmero de um vendedor, o seu salrio fixo, o total de vendas por ele efetuadas
e o percentual que ganha sobre o total de suas vendas. Calcular o salrio total do vendedor e escrever o nmero
e o salrio do vendedor.
11) Escrever um algoritmo que l 3 valores a, b, c que so lados de um tringulo e calcula e escreve a rea deste
tringulo.
rea =

s ( s a )( s b)( s c)

Onde s = semipermetro.
12) O custo ao consumidor, de um carro novo, a soma do custo de fbrica com a percentagem do distribuidor e o
percentual dos impostos ( aplicados ao custo de fbrica ). Escrever um algoritmo que l o custo de fbrica, o
percentual do distribuidor e o percentual dos impostos e calcula e escreve o valor a ser pago pelo consumidor
por este carro.
13) Uma revendedora de carros usados paga a seus funcionrios vendedores, um salrio fixo por ms, mais uma
comisso tambm fixa para cada carro vendido e mais 5% do valor das vendas por ele efetuadas. Escrever um
algoritmo que l o nmero do vendedor, o nmero de carros por ele vendidos, o valor de cada carro, o salrio
16

fixo e o valor que recebe por carro vendido e calcula o salrio a ser pago a este vendedor, escrevendo o nmero
do vendedor e seu salrio total.
14) Considerando que o aumento dos funcionrios de uma empresa tenha sido definido da seguinte forma: 80% de
um ndice chamado INTEMP e mais um percentual de produtividade discutido com a empresa por ocasio do
dissdio da categoria. Escrever um algoritmo que l o nmero do funcionrio, seu salrio atual, o valor do
INTEMP e o ndice de produtividade conquistado e escreve o nmero do funcionrio, seu aumento e seu novo
salrio.
15) Escrever um algoritmo que l as coordenadas de dois pontos no plano cartesiano e calcula e escreve a distncia
entre estes dois pontos, sabendo-se que a frmula da distncia entre dois pontos P1( X1,Y1) e P2( X2,Y2)
Distncia =

( X 2 X 1) 2 + (Y 2 Y 1) 2

16) Escrever um algoritmo que l 3 valores a, b, c e os escreve. Encontre, a seguir, o maior dos 3 valores e o
escreva com a mensagem: O MAIOR
Maior =

a + b+ | a b |
2

17) Escrever um algoritmo que l o valor de uma compra em dlares e a taxa do dlar no dia da compra e calcula e
escreve o valor a ser pago em reais.
18) Um hotel com 42 apartamentos resolveu fazer promoes para os fins de semana for a da alta temporada, isto
, nos meses de abril, maio, junho, agosto, setembro outubro e novembro. A taxa da promoo de 22% da
diria normal. A expectativa aumentar a taxa de ocupao de 40 para 70%. Supondo que as expectativas se
confirmem, escrever um algoritmo que l a diria normal e calcula e escreve as seguintes informaes:
a) O valor da diria no perodo da promoo.
b) O valor mdio arrecadado sem a promoo, durante um ms.
c) O valor mdio arrecadado com a promoo, durante um ms.
d) O lucro ou prejuzo mensal com a promoo.
19) Escrever um algoritmo que l a hora de incio de um jogo e a hora de fim do jogo, considerando apenas horas
inteiras e jogos que comeam e terminam no mesmo dia, calcular e escrever o tempo de durao do jogo em
horas.
20) O mesmo problema anterior, mas escrevendo o tempo do jogo em minutos.
21) Escrever um algoritmo que l um nmero de 3 dgitos e o inverte, escrevendo o nmero lido e o nmero
invertido.

17

CAPTULO III
ALGORITMOS COM SELEO
Este captulo tem por objetivo conceituar algoritmos com seleo e expresses lgicas.
Os algoritmos seqenciais podem ser usados na soluo de alguns problemas, porm a maioria dos problemas
exigem o uso de mais recursos, tais como:
-

dados 3 valores a, b, c que representam os coeficientes de uma equao do segundo grau, calcular as
razes reais, somente se o valor do discriminante no for negativo;
dado um conjunto de valores, determinar quantos deles pertencem ao intervalo [ 0,50 ] e quantos
pertencem ao intervalo [ 51,100 ].

Nos algoritmos, situaes como estas so resolvidas atravs de passos cuja execuo est subordinada veracidade
ou no de uma condio.
Um algoritmo em que se tem a execuo de determinados passos subordinada veracidade de uma condio
denominado de algoritmo com seleo .
Uma operao de seleo em um algoritmo ser representada pelas seguintes instrues:
Se < condio > ento < instruo >

Se < condio > ento < instruo >


seno < instruo >

Onde instruo qualquer uma das instrues j vistas ou ainda a serem vistas, ou ainda uma seqncia de
instrues. No caso de ser uma seqncia, utiliza-se Incio e Fim para agrupar as instrues que formam a seqncia.
Exemplos:

Incio
Ler a
x = a2-1
Escrever x
Fim

Incio

a+b+c
3
3
x2 = a.b.c

x1 =

Fim

Condio uma expresso lgica.


Para conceituar expresso lgica conveniente uma explicao sobre o que se entende por lgebra de Boole.
A lgebra de Boole baseada em proposies. As proposies so assertivas que podem estar corretas
(verdadeiras) ou incorretas ( falsas ). A lgebra booleana uma lgebra de dois estados: no existem outros estados
possveis alm do verdadeiro e do falso .
Exemplos de proposies:
1.

O valor de

2.

A equao

2 um nmero irracional.
Ax 2 + Bx + C = 0 possui duas razes reais.

Enquanto a proposio 1. obviamente verdadeira, a proposio 2. Poder ser verdadeira ou falsa, dependendo dos
valores de A, B, C.
As proposies so combinadas atravs de inter-relaes e possvel demonstrar a veracidade ou a falsidade destas
combinaes.

18

As inter-relaes entre as proposies so feitas atravs de operadores lgicos. Um operador lgico um operador
cujos operandos so expresses lgicas e cujo resultado um valor lgico verdadeiro ( V ) ou falso ( F ).
Expresses Lgicas
Dados dois valores lgicos quaisquer, T1 e T2, e um operador L, o resultado da expresso lgica T1 L T2 tem
valor verdadeiro ( V ) ou falso ( F ) .
Devido ao restrito domnio dos valores lgicos, possvel definir os resultados das operaes de forma compacta,
atravs de tabelas-verdade . Este tipo de tabela mostra o resultado das operaes, para todas as possveis combinaes
dos operandos.
A tabela-verdade para os trs principais operadores lgicos, a negao, o produto lgico e a soma lgica, pode ser
representada como segue:

T1
V
V
F
F

T2
V
F
V
F

Sendo: T1 e T2
~
^

~T1
F
F
V
V

T1 ^T2
V
F
F
F

T1 T2
V
V
V
F

operandos lgicos
operador unrio de negao ( no )
operador de produto lgico ( e )
operador de soma lgica
( ou )

As relaes tambm podem fazer parte das expresses lgicas, como operandos, uma vez que seu resultado
lgico. As relaes so definidas entre expresses aritmticas, por meio de operadores relacionais.
Dados dois valores E1 e E2, e um operador relacional R, o resultado da expresso E1 R E2 tem o valor verdadeiro
( V ) ou falso ( F ).
Os operadores relacionais so:
- maior
(>)
- menor
(<)
- igual
(=)
- maior ou igual
()
- menor ou igual
()
- diferente
()
Enquanto os operadores lgicos atuam sobre operandos lgicos, os peradores relacionais atuam sobre operandos
aritmticos, como pode ser visto na expresso abaixo:
Proposio : X [ 1; -1 ], isto
X pertence ao intervalo [ 1 ; -1 ] , cuja expresso lgica correspondente :
X -1 ^ X 1
R1
R2
R1 e R2 so relaes que fornecem como resultado um valor lgico V ou F. O operador lgico ^ (e) dar como
resultado o valor lgico V somente se ambas as relaes R1 e R2 forem verdadeiras.
Os operadores relacionais e atuam sobre os valores X, 1 e 1, que so expresses aritmticas e no
lgicas.
Nos algoritmos a correta formulao de condies, isto , expresses lgicas, de fundamental importncia, visto
que as estruturas de seleo e tambm as de repetio ( que sero vistas adiante ), so baseadas nelas.
Portanto, condio
-

ou uma comparao de expresses aritmticas ( relaes ) por meio de operadores relacionais (=, <,
>, , , );
ou uma combinao de comparaes por meio de operadores lgicos ( ~, ^, ).

19

As diversas formulaes das condies podem levar a algoritmos distintos. Considere-se o problema:
Dado um par de valores X, Y , que representam as coordenadas de um ponto no plano, determinar o
quadrante ao qual pertence o ponto, ou ento, se est sobre algum dos eixos cartesianos ou na origem .
A soluo do problema consiste em determinar todas as combinaes de X e Y para as classes de valores positivos,
negativos e nulos.
A tabela, a seguir, mostra todas as entradas e sadas possveis:

Entradas
X
=0
=0
0
>0
<0
<0
>0

Mensagem de Sada
Y
=0
0
=0
>0
>0
<0
<0

Ponto na origem
Ponto sobre o eixo Y
Ponto sobre o eixo X
Ponto no Quadrante 1
Ponto no Quadrante 2
Ponto no Quadrante 3
Ponto no Quadrante 4

Os algoritmos podem ser baseados em estruturas concatenadas ( uma em seqncia a outra ) ou em estruturas
aninhadas ( uma dentro da outra ), de acordo com a formulao das condies.
Algoritmo 3.1: Estruturas concatenadas
Algoritmo PosioPonto
x, y : Inteiros
Incio
Ler ( x, y )
Se x = 0 e y = 0 ento escrever ( Ponto na origem )
Se x = 0 e y 0 ento escrever ( Ponto sobre o eixo y )
Se x 0 e y = 0 ento escrever ( Ponto sobre o eixo x )
Se x > 0 e y > 0 ento escrever ( Ponto no quadrante 1 )
Se x < 0 e y > 0 ento escrever ( Ponto no quadrante 2 )
Se x < 0 e y < 0 ento escrever ( Ponto no quadrante 3 )
Se x > 0 e y < 0 ento escrever ( Ponto no quadrante 4 )
Fim
Algoritmo 3.2: Estruturas aninhadas
Algoritmo PosioPonto
x, y : Inteiros
Incio
Ler ( x, y )
Se x 0
ento se y = 0
ento escrever ( Ponto sobre o eixo x )
seno se x > 0 ento se y > 0 ento escrever ( Ponto no quadrante 1 )
seno escrever ( Ponto no quadrante 4 )
seno se y > 0 ento escrever ( Ponto no quadrante 2)
seno escrever ( Ponto no quadrante 3 )
seno se y = 0 ento escrever ( Ponto na origem )
seno escrever ( Ponto sobre o eixo y )
Fim

importante notar que possvel obter diversos algoritmos para a soluo deste problema, atravs de diferentes
combinaes de formulaes de condies.

20

As estruturas de seleo aninhadas, geralmente, no so recomendadas por dificultarem o entendimento da soluo,


como pode ser observado no algoritmo 2 cuja lgica menos clara do que a do algoritmo 1. Isto no representa problema
para o computador, mas para o programador. Quanto mais complexo o algoritmo, mais facilmente ele pode ser escrito de
forma incorreta.
Quanto aos tipos de seleo, considere o algoritmo abaixo:

Algoritmo 3.3: Seleo Simples

Algoritmo Medias
i, a, b, c, x : Inteiros
Incio
Ler ( i, a, b, c )

a+b+c
3
Se i = 2 ento x = a.b.c
3
Se i = 3 ento x =
1 1 1
+ +
a b c
Se i = 1 ento x =

Se i > 3 ou i < 1 ento x = 0


Escrever ( x )
Fim
O tipo de seleo mostrado no exemplo 3 denominado de seleo simples, pois, decide entre a execuo ou no
de uma ou mais instrues conforme a condio for verdadeira ou falsa.
Algoritmo 3.4: Seleo Dupla
Algoritmo Raizes
a, b, c, x, x1, x2, d : Reais
Incio
Ler ( a, b, c )
Se a = 0 ento se b 0

ento

Incio
x = -c/b
Escrever ( x )
Fim
Escrever ( c )

seno
seno Incio
d = b2 - 4ac
Se d < 0 ento Escrever ( Equao sem raizes reais )
seno Incio
x1 =

x2 =

b+ d
2a
b d
2a

Escrever ( x1, x2 )

Fim
Fim
Fim

Neste caso o algoritmo sempre seleciona entre duas aes ou conjuntos de aes, executando uma delas e
desprezando a outra, conforme a condio for verdadeira ou falsa.

21

Assim, se a = 0 e b 0 calcula e escreve a raiz da equao do primeiro grau.


Se a = 0 e b = 0 escreve somente o valor de c
Se a 0 e b2- 4ac < 0 escreve a mensagem Equao sem razes reais
Se a 0 e b2- 4ac > 0 calcula e escreve as razes da equao do segundo grau que tem a, b, c, por coeficientes.
Este tipo de seleo denominado de seleo dupla .
Seleo Mltipla
Embora os algoritmos com seleo mltipla possam ser resolvidos com o uso de instrues de selees simples,
uma forma mais elegante e que tem correspondncia nas linguagens de programao o uso da instruo Case, cuja forma
a seguinte:
Case < expresso aritmtica > com
< val1 > : instruo 1
< val2 > : instruo 2
< val3 > : instruo 3
.
.
.
.
.
.
< valn > : instruo n
Seno instruo
Fim_Case

Onde < val1 >, < val2 >, < val3 >, ... , < valn > so valores assumidos pela expresso aritmtica. Para cada valor
pode-se especificar uma ao ou um conjunto de aes a serem executadas.
Algoritmo 3.5: Seleo Mltipla
Algoritmo Mdias2
i : inteiro
a, b, c, x : real
Incio
Ler ( i, a, b, c )
Case i com
1: x =
2: x =
3: x =

a+b+c
3

axbxc

3
1 +1 +1
a
b
c

Seno x = 0
Fim_Case
Escrever ( x )
Fim

ou

Algoritmo Mdias 3
i : inteiro
a, b, c, ma, mg, mh : real
Incio
Ler ( i, a, b, c )
Case i com
1: Incio
ma =

a+b+c
3

Escrever ma
Fim
2: Incio
mg = 3 axbxc
Escrever ( mg )
Fim
3 : Incio
mh =

3
1 +1 +1
a
b
c

Escrever ( mh )
Fim
Seno escrever (Cdigo Invlido)
Fim_Case
Fim

22

Com a introduo das instrues de seleo, o nmero de algoritmos que podem ser construdos como soluo para
um problema j aumenta consideravelmente.
Considere-se o problema de ler 3 valores a, b, c, quaisquer e encontrar o maior dos 3 escrevendo-o com a
mensagem: O MAIOR.
Algoritmo 3.6 :Verso 1

Algoritmo Maior
a, b, c, mab, mabc : Reais
Incio
Ler ( a, b, c )

a + b+ | a b |
2
mab + c + | mab c
mabc =
2
mab =

Escrever ( mabc, E O MAIOR )


Fim

Algoritmo 3.7 :Verso 2


Algoritmo Maior
a, b, c : Reais
Incio
Ler ( a, b, c )
Se a b e a c ento escrever (a, O MAIOR )
Se b > a e b c ento escrever ( b, O MAIOR )
Se c > a e c > b ento escrever (c, O MAIOR )
Fim
Algoritmo 3.8 :Verso 3

Algoritmo Maior
a, b, c : Reais
Incio
Ler ( a, b, c )
Se a b e a c ento escrever ( a, O MAIOR )
seno Se b > a e b c ento escrever ( b, O MAIOR )
seno escrever ( c, O MAIOR )
Fim
Algoritmo 3.9 :Verso 4

Algoritmo Maior
a, b, c : Reais
Incio
Ler ( a, b ,c )
Se a > b ento Se a > c ento escrever ( a, O MAIOR )
seno escrever (c, O MAIOR )
seno Se b > c ento escrever ( b, O MAIOR )
seno escrever ( c, O MAIOR )
Fim

23

Algoritmo 3.10 :Verso 5

Algoritmo Maior
a, b, c, maior : Reais
Incio
Ler ( a, b, c )
maior = a
Se maior < b ento maior = b
Se maior < c ento maior = c
Escrever ( maior, O MAIOR )
Fim

As verses 2, 3 e 4, se aumentarmos o nmero de variveis para 4 ou 5 j complicariam bastante. Sugere-se


reescrever alguma destas verses para 4 valores.
A verso 5 j no se torna complexa para at 10 valores. Contudo, se o nmero de valores crescer muito outras
solues devem ser construdas, como se ver mais adiante.
As diferentes verses anteriormente apresentadas ( 5 da muitas possveis ), mostram que um problema admite
geralmente uma quantidade de algoritmos que so caminhos para se chegar soluo do problema. Isto d margem ao uso
de criatividade e enseja anlises sobre qual dos algoritmos uma soluo melhor. Isto ser discutido mais adiante.

24

QUESTIONRIO
1.
2.
3.
4.
5.
6.
7.

Conceitue algoritmo com seleo.


Apresente as formas de representao de uma instruo de seleo em um algoritmo.
Conceitue expresso lgica ou condio.
Os operadores relacionais atuam sobre que tipo de operandos ?
Os operadores lgicos atuam sobre que tipo de operandos ?
Que se entende por seleo simples ?
Que significa seleo dupla ?

EXERCCIOS
1) Escrever um algoritmo que l 3 valores a, b, c e calcula e escreve a mdia ponderada com peso 5 para o maior
dos 3 valores e peso 2.5 para os outros dois.
2) Escrever um algoritmo que l 3 valores a, b, c e verifica se eles formam ou no um tringulo. Supor que os
valores lidos so inteiros e positivos. Caso os valores formem tringulo calcular e escrever a rea deste
tringulo. Se no formarem tringulo, escrever os valores lidos com a mensagem: No formam tringulo .
3) Escrever um algoritmo que l dois valores a, b e os escreve com a mensagem: So Mltiplos ou No so
Mltiplos .
4) Escrever um algoritmo que l um conjunto de 4 valores i, a, b, c, onde i um valor inteiro e positivo e a, b, c
so quaisquer valores reais. Escreva os valores lidos e, a seguir :
Se i = 1 escrever os trs valores a, b, c em ordem crescente.
Se i = 2 escrever os trs valores a, b, c em ordem decrescente.
Se i = 3 escrever os trs valores a, b, c de forma que o maior fique entre os outros dois.
5) Escrever um algoritmo que l um conjunto de 6 valores X1, X2, Y1, Y2, Z1, Z2, que representam as
coordenadas cartesianas de 3 pontos P1(X1,X2), P2(Y1,Y2) e P3(Z1,Z2). Calcule as distncias entre P1 e P2,
entre P2 e P3 e entre P1 e P3. Se os segmentos de retas calculados formam um tringulo, calcular e escrever a
rea deste tringulo, caso contrrio, escrever as distncias calculadas.
6) Escrever um algoritmo que l o nmero de um vendedor de uma empresa, seu salrio fixo e o total das vendas
por ele efetuadas. Sabe-se que cada vendedor recebe um salrio fixo, mais uma comisso proporcional s
vendas por ele efetuadas. A comisso de 3% sobre o total das vendas at 10.000,00 e 5% sobre o que
ultrapassa este valor. Escrever o nmero do vendedor, o total de suas vendas, seu salrio fixo e seu salrio
total.
7) Escrever um algoritmo que l 3 comprimentos de lados a, b, c e os coloca em ordem decrescente, de forma que
o a represente o maior dos 3 valores. Determine, a seguir, o tipo de tringulo que estes 3 lados formam com
base nas seguintes relaes, escrevendo sempre os valores lidos e a mensagem adequada.
Se a > b + c ento no formam tringulo algum;
Se a2 = b2 + c2 ento formam um tringulo retngulo;
Se a2 > b2 + c2 ento formam um tringulo obtusngulo;
Se a2 < b2 + c2 ento formam um tringulo acutngulo;
Se a = b e b = c ento formam um tringulo equiltero;
Se a = b ou b = c ou a = c e a b ou a c ento formam tringulo issceles.
8) O departamento que controla o ndice de poluio do meio ambiente mantm 3 grupos de indstrias que so
altamente poluidoras do meio ambiente. O ndice de poluio aceitvel varia de 0.05 at 0.25. Se o ndice sobe
para 0.3 as indstrias do grupo 1 so intimadas a suspenderem as suas atividades. Se o ndice cresce para 0.4 as
indstrias dos grupos 1 e 2 recebem a intimao de suspenso das atividades. Se o ndice atingir 0.5 ento
todos os 3 grupos so notificados.
Escrever um algoritmo que l o ndice de poluio medido e emite as notificaes adequadas aos diferentes
grupos de indstrias.
9) Escrever um algoritmo que l a hora de incio e a hora de fim do jogo ( considerando apenas horas inteiras ) e
calcula e escreve a durao do jogo em horas, sabendo-se que a durao mxima para o jogo de 24 horas e
que o jogo pode iniciar em um dia e terminar no dia seguinte.
10) Escrever um algoritmo que l o nmero de um funcionrio, o nmero de horas por ele trabalhadas, o valor que
recebe por hora, o nmero de filhos com menos de 14 anos, a idade do funcionrio, o tempo de servio do
funcionrio e o valor do salrio famlia por filho.
Calcular o salrio bruto, o desconto do INSS ( 8.5% do salrio bruto), e o salrio famlia.
Calcular o desconto do Imposto de Renda na fonte como segue:
Se Salrio Bruto > 1500,00 ento Imposto de Renda = 15% do Salrio Bruto;
Se Salrio Bruto > 500,00 e Salrio Bruto 1500,00 ento Imposto de Renda = 10% do Salrio Bruto
Se Salrio Bruto < 500,00 ento Imposto de Renda = 0.
Calcular o adicional conforme especificado:
Se idade > 40 anos ento adicional = 2% do Salrio Bruto;
Se tempo de servio > 15 anos ento adicional = 3.5% do Salrio Bruto;
25

Se tempo de servio < 15 anos mas superior a 5 anos e idade > 30 anos ento adicional = 1.5% do Salrio
Bruto.
Calcular o Salrio Lquido
Escrever o nmero do funcionrio, seu salrio bruto, o total de seus descontos, o adicional e o salrio lquido.
11) Escrever um algoritmo que l o nmero de identificao de um aluno e as 3 notas obtidas por este aluno nas 3
verificaes ao longo do semestre, bem como, a mdia dos exerccios que fazem parte da avaliao. Para cada
aluno, calcular a mdia de aproveitamento, usando a frmula:
MA =

N1 + N 2 x 2 + N 3 x3 + ME
7

A atribuio de conceitos obedece tabela abaixo:

Mdia de Aproveitamento
9.0
7.5 e < 9.0
6.0 e < 7.5
4.0 e < 6.0
< 4.0

Conceito
A
B
C
D
E

O algoritmo deve escrever o nmero do aluno, suas notas, a mdia dos exerccios, a mdia de aproveitamento,
o conceito correspondente e a mensagem APROVADO se o conceito for A, B ou C e REPROVADO se
o conceito for D ou E.
12) A empresa XYZ decidiu conceder um aumento de salrios a seus funcionrios de acordo com a tabela abaixo:

13)

14)

15)

16)

SALRIO ATUAL

NDICE DE AUMENTO

0 - 400
401 700
701 1000
1001 1800
1801 2500
Acima de 2500

15%
12%
10%
7%
4%
Sem Aumento

Escrever um algoritmo que l, o nmero de um funcionrio e o seu salrio atual e escreve o nmero do
funcionrio, seu salrio atual, o percentual de seu aumento e o valor do salrio corrigido.
Escrever um algoritmo que l a hora de incio de um jogo e a hora de trmino do jogo, ambas subdivididas em
2 valores distintos, a saber: horas e minutos. Calcular e escrever a durao do jogo, tambm em horas e
minutos, considerando que o tempo mximo do jogo de 24 horas, que sua durao no pode ser nula e que o
jogo pode comear em um dia e terminar no dia seguinte.
Escrever um algoritmo que l um cdigo i e 3 valores a, b, c. Tanto o cdigo i, quanto os valores a, b, c, lidos
so inteiros e positivos.
Se cdigo = 1 ento calcular a rea do trapzio de bases a e b e altura c e escrev-la juntamente com os valores
lidos.
Se cdigo = 2 ento se a, b, c, formam equao de segundo grau com razes reais ento calcular e escrever
estas razes.
Se cdigo = 3 ento calcular a mdia geomtrica dos 3 valores e escrev-la juntamente com os valores lidos.
Se cdigo = 4 ento se a, b, c, formam tringulo, calcular e escrever a rea deste tringulo.
Se cdigo > 4 ento escrever cdigo invlido.
Escrever um algoritmo que l um valor m.
Se m no inteiro escrever a mensagem O VALOR DE M NO INTEIRO .
Se m inteiro e negativo escrev-lo com a mensagem NEGATIVO .
Caso contrrio verificar se m par ou mpar e escrev-lo com a mensagem correspondente.
Um supermercado vende cerveja de trs tipos ( c1, c2 e c3 ). Como o supermercado deseja fazer uma
promoo destas 3 marcas de cerveja e atender, ao mesmo tempo, um bom nmero de clientes, o nmero de
cervejas de cada tipo foi limitado por cliente em 18 do tipo c1, 12 do tipo c2 e 6 do tipo c3.
Escrever um algoritmo que l a quantidade de cervejas do tipo c1, o valor unitrio da cerveja c1, a quantidade
de cervejas do tipo c2, o valor unitrio da cerveja do tipo c2, a quantidade de cervejas do tipo c3 e o valor
unitrio de cada cerveja do tipo c3. O algoritmo deve considerar as limitaes impostas pelo supermercado,
26

isto , se o cliente pediu mais unidades do que o permitido deve-lhe ser debitado apenas o limite permitido.
Dever escrever o nmero de itens de cada tipo efetivamente fornecido e o valor total a ser pago.
17) Escrever um algoritmo que l um valor inteiro e positivo m , de 3 dgitos e escreve o valor lido e o seu
equivalente em algarismos romanos ( I , V, X, L, C, D, M ).
18) Escrever um algoritmo que l os nomes de 3 produtos, o preo unitrio de cada um e a quantidade de cada
produto que foi solicitada.
O algoritmo dever escrever:
a) O nome dos produtos cujo preo superior a 50 reais;
b) O nome e o preo dos produtos que custam menos do que 30 reais;
c) O preo mdio dos 3 produtos;
d) O nome e o preo dos produtos cujo valor superior ao preo mdio;
e) O valor total a ser pago pelo pedido.

27

CAPTULO IV
ALGORITMOS COM REPETIO
Este captulo tem por objetivo conceituar algoritmo com repetio, introduzir as noes de varivel contador,
varivel acumulador e apresentar os tipos de instruo de repetio geralmente utilizados em algoritmos que repetem uma
ou mais instrues.
Na prtica, um algoritmo no executado para um nico conjunto de valores conforme visto em algoritmos
seqenciais e em algoritmos com seleo.
Em algoritmos deste tipo, aparecem com freqncia, conceitos tais como: varivel contador e varivel acumulador.
Uma varivel contador uma varivel qualquer que recebe um valor inicial ( geralmente 0 ) e incrementada em
algum outro ponto do algoritmo, de um valor constante ( geralmente 1 ).
Exemplo:
.
.
.
Cont = 0
.
.
.
Cont = Cont + 1
O significado de Cont = 0 armazenar, na posio de memria de nome Cont o valor 0. Enquanto o significado de
Cont = Cont + 1 armazenar na posio de memria Cont, o valor que j estava nesta posio acrescido de uma unidade.
Suponha que se queira calcular e escrever a mdia aritmtica das 3 notas n1, n2 e n3, obtidas por cada um dos 30
alunos de uma turma. Para cada aluno ser lido o seu nmero e suas 3 notas.
Para este tipo de algoritmo necessita-se de uma nova instruo, a saber:
Enquanto < condio >
Incio
< seqncia de instrues >
Fim_Enquanto

Onde seqncia de instrues so pelo menos duas outras instrues quaisquer.


Algoritmo 4.1:

Algoritmo Mdia
Num, Cont : Inteiros
N1, n2, n3, Media : Reais
Incio
Cont = 0
Enquanto Cont < 30
Incio
Ler ( num, n1, n2, n3 )
Media =

n1 + n 2 + n3
3

Escrever ( num, Media )


Cont = Cont + 1
Fim_enquanto
Fim

28

Suponha agora que se queira, no final saber a mdia geral desta turma. A necessitamos de outro conceito que o
de varivel acumulador.
Uma varivel acumulador qualquer varivel que recebe um valor inicial constante ( geralmente 0 ) e
incrementada em algum outro ponto do algoritmo de um valor varivel.
Exemplo:
.
.
Soma = 0
.
.
.
Soma = Soma + Valor

O significado de Soma = 0 armazenar no endereo de memria cujo nome Soma o valor 0. Enquanto o
significado de Soma = Soma + Valor armazenar na posio de memria cujo nome Soma, o valor que j est nesta
posio acrescido do valor da varivel Valor.
Algoritmo 4.2:

Algoritmo MediaGeral
Num, Cont : Inteiros
Soma, Media, n1, n2, n3, Medgeral: Reais
Incio
Soma = Cont = 0
Enquanto Cont < 30
Incio
Ler ( num, n1, n2, n3 )
Media =

n1 + n 2 + n3
3

Escrever ( num, Media )


Soma = Soma + Media
Cont = Cont + 1
Fim_Enquanto
Medgeral = Soma/30
Escrever ( Medgeral )
Fim

Em ambos os algoritmos tm-se um conjunto de instrues que repetido um certo nmero de vezes, isto o que
caracteriza um algoritmo com repetio.
Todo algoritmo que tem a execuo de um ou mais de seus passos repetido duas ou mais vezes denominado
de algoritmo com repetio.
O nmero de vezes que um certo conjunto de instrues repetido pode ser previamente conhecido, como no caso
dos exemplos anteriores, ou pode no ser conhecido com antecedncia.
Suponha o mesmo problema do algoritmo 4.2, apenas no se conhecendo o nmero de alunos da turma ou
querendo se escrever uma soluo que sirva para uma turma com qualquer nmero de alunos.
Neste caso deve-se encontrar uma condio de fim para o algoritmo, isto , quando deve parar a repetio.
No caso deste problema no difcil achar-se esta condio de fim. Como sabemos que o nmero do aluno
certamente no ser um valor negativo, podemos repetir a leitura e as demais instrues at que seja lido um nmero de
aluno negativo, por exemplo.

29

Algoritmo 4.3:

Algoritmo MediaGeral
Cont, Num :Inteiros
Soma, n1, n2, n3, Media, Medgeral : Reais
Incio
Soma = Cont = 0
Ler ( Num, n1, n2, n3 )
Enquanto Num > 0
Incio
Media =

n1 + n 2 + n3
3

Soma = Soma + Media


Cont = Cont + 1
Ler ( Num, n1, n2, n3 )
Fim_enquanto
Medgeral = Soma/Cont
Escrever ( Medgeral )
Fim
Como no algoritmo 4.3, na maioria dos casos interessam solues genricas para os algoritmos.
O teste de valor final pode apresentar-se sob duas formas:
a)

Se os valores lidos pertencem a um intervalo bem conhecido ou a algum conjunto bem restrito, adiciona-se, no
final do conjunto de valores vlidos, um valor que est for a do intervalo ou do conjunto restrito utilizado no
algoritmo.
Exemplo1: Ler um conjunto no determinado de nmeros de alunos.
Ler Num
Se Num < 0 ento escrever Fim
Como os nmeros de alunos costumam ser inteiros e positivos, coloca-se no final, para terminar, um nmero
negativo.
Exemplo 2: Ler um conjunto no conhecido de valores inteiros para m, um de cada vez.
Ler m
Se m int(m) ento escrever Terminou a leitura do conjunto

b) Se os valores lidos podem assumir qualquer valor ( inteiro, real, positivo, negativo ) ento no h como
fornecer um valor diferente. Lembre-se de que as variveis geralmente no misturam caracteres com nmeros (
ou numrica e representa um nmero, ou alfanumrica e representa caracteres ).
Neste caso, em vez de ler x ( que pode ser qualquer valor numrico), pode-se ler x e y onde para y ser
fornecido 0 quando o valor de x interessa e 1 para terminar.
Exemplo 1: Ler um nmero qualquer de ternos de valores a, b, c todos reais.
Ler a, b, c, i
Se i = 1 ento escrever Terminar
Como a, b, c podem ser quaisquer valores numricos, no h como se basear neles para terminar a leitura. Por
isso, foi adicionada uma varivel nova I, para a qual se fornecer 0 enquanto a leitura deve continuar e 1
quando se deseja terminar.

30

Isto est ilustrado abaixo :

5
-6.12
44
0
1000

-1
4
-211
1
0

5.23
9.8
1
-1
-8

0
0
0
0
0

Exemplo 2: Ler um conjunto no conhecido de valores para x, x R.


Ler x, L
Se L ento escrever Acabaram os valores de x
Supe que a varivel L ( varivel lgica: verdadeiro ou falso ) recebe o valor falso enquanto nem todos os
valores de x tiverem sido lidos e recebe o valor verdadeiro quando acabaram os valores de x.
X

0.2345
-1
-45
1433
0.2346
0

falso
falso
falso
falso
falso
verdadeiro

Como na maioria das linguagens de programao existem vrias instrues diferentes de repetio, ser
apresentada outra forma para uma instruo de repetio.

Para varivel = Exp1 at Exp2 [ inc Exp3 ]


Incio
< Instrues >
Fim_Para varivel

Onde varivel qualquer varivel, neste caso, denominada de varivel de controle da repetio.
Exp1, Exp2 e Exp3 so expresses aritmticas.
Exp1 representa o valor inicial da varivel de controle.
Exp2 representa o valor final da varivel de controle.
Exp3 representa o incremento da varivel de controle.
Se o valor da varivel de controle for 1 no ser necessrio especific-lo. Por isso [ inc Exp3 ] aparece entre
colchetes, indicando que a sua especificao opcional 9 s quando necessrio ).
Numa instruo deste tipo esto implcitas 3 operaes, a saber :
1.
2.
3.

Uma inicializao da varivel de controle com um valor inicial igual a Exp1 .


Um teste que verifica se o valor da varivel de controle j ultrapassou o seu valor final indicado por Exp2
A cada nova repetio ocorrer um incremento da varivel de controle de um valor igual a 1 ou de um
valor igual a Exp3.

31

Se ao fazer o teste verificado que o valor da varivel de controle j ultrapassou o valor final permitido, a
repetio encerrada e o controle automaticamente transferido para a primeira instruo depois de Fim_Para .

Exemplos de instrues de repetio deste tipo:


a)

Para i = 1 at 5
Incio
Instrues
Fim_Para i

b) Para x = a at b inc 2
Incio
Instrues
Fim_Para x
c)

Para i = n at 1 inc 1
Incio
Instrues
Fim_Para i

d) Para a =

x+ j
at b2 4 + cd inc c/2
2

Incio
Instrues
Fim_Para a
e)

Para x = 0.5 at 17.3 inc 1.3


Incio
Instrues
Fim_Para x

No exemplo c) quando o incremento negativo, o teste sempre se o valor da varivel de controle j


menor do que o valor final especificado. Nos demais casos o teste sempre maior do que.
Algoritmo 4.4 : Verificar se um nmero m lido primo.

Algoritmo Divisores
c,m,i : Inteiros
Incio
Ler ( m )
Enquanto m >0
Incio
c=2
Para i = 2 at m/2
Se m/i = int ( m/i ) ento c = c + 1
Fim_Para i
Se c > 2 ento escrever ( m, possui c, divisores)
seno escrever ( m, PRIMO )
Ler ( m )
Fim_enquanto
Fim

Obs.: Neste algoritmo foram usadas as duas instrues de repetio apresentadas. Quando no conhecido o
nmero de valores ou conjuntos de valores que devem ser lidos no possvel utilizar a repetio do tipo Para. A
repetio do tipo Enquanto mais geral e sempre pode ser usada.

32

Se tivermos dentro de uma repetio, seja de qual tipo for, uma outra repetio, esta ltima dever estar
inteiramente contida na primeira.
Considere o seguinte problema: Escrever um algoritmo que l 10 valores para m, todos inteiros e positivos, e,
para cada m lido, calcula o fatorial de m, escrevendo-o juntamente com o valor lido.

Algoritmo 4.5 Clculo do Fatorial

Algoritmo Fatorial
c,m, i, fat : Inteiros
Incio
Para c = 1 at 10
Incio
Ler ( m )
fat = 1
Para i = 1 at m
fat = fat x i
Fim_Para i
Escrever ( m, fat )
Fim_Para c
Fim

Algoritmos com repeties dentro de outras repeties so denominados de algoritmos com repeties aninhadas.

33

QUESTIONRIO

1.
2.
3.
4.
5.
6.

Que uma varivel Contador ?


Que uma varivel Acumulador ?
Qual a diferena entre uma varivel Contador e uma varivel Acumulador ?
Que se entende por teste do valor final e quando usado ?
Conceitue algoritmo com repetio.
Que so repeties aninhadas ?

EXERCCIOS

1.
2.
3.

Escrever um algoritmo que l 5 valores para a, um de cada vez, e conta quantos destes valores so negativos,
escrevendo esta informao.
Escrever um algoritmo que gera e escreve os nmeros mpares entre 100 e 200.
Escrever um algoritmo que l 10 valores, um de cada vez, e conta quantos deles esto no intervalo [ 10, 20 ] e
quantos deles esto fora deste intervalo, escrevendo estas informaes.

4.

Escrever um algoritmo que l um nmero no conhecido de valores, um de cada vez, e conta quantos deles
esto em cada um dos intervalos [ 0, 25 ), [ 25, 50 ), [ 50, 75 ) e [ 75, 100 ], escrevendo estas informaes.

5.

Escrever um algoritmo semelhante ao anterior, que calcula as mdias aritmticas de cada intervalo e as
escreve, juntamente com o nmero de valores encontrados em cada intervalo.

6.

A srie de Fibonacci tem como dados os 2 primeiros termos da srie que so respectivamente 0 e 1. partir
deles, os demais termos so construdos pela seguinte regra:

tn = tn-1 + tn-2
Escrever um algoritmo que gera os 10 primeiros termos desta srie e calcula e escreve a sua soma.
7.

Escrever um algoritmo que gera os 10 primeiros termos da srie de Fibonacci e os escreve, juntamente com o
seu nmero de ordem.

8.

Escrever um algoritmo que gera os 30 primeiros termos da srie de Fibonacci e escreve os termos gerados com
a mensagem: PRIMO ou NO PRIMO , conforme o caso.

9.

Escrever um algoritmo que l um conjunto no determinado de valores, um de cada vez, e escreve uma tabela,
contendo 20 linhas em cada pgina. A tabela deve conter o valor lido, seu quadrado, seu cubo e sua raiz
quadrada.

10. Escrever um algoritmo que l um nmero no determinado de valores para m, todos inteiros e positivos, um de
cada vez. Se m for par, verificar quantos divisores possui e escrever esta informao. Se m for mpar e menor
do que 12 calcular e escrever o fatorial de m. Se m for mpar e maior do que 12, calcular e escrever a soma dos
inteiros de 1 at m.
11. Escrever um algoritmo que l um nmero no determinado de valores a, todos inteiros e positivos, um de cada
vez, e calcule e escreva a mdia aritmtica dos valores lidos, bem como, a quantidade de valores pares, a
quantidade de valores mpares, a percentagem dos valores pares e a percentagem dos valores mpares.
12. Escrever um algoritmo que escreve os nmeros primos entre 100 e 200, bem como, a soma destes nmeros
primos.

34

13. Escrever um algoritmo que l 10 valores para n, um de cada vez, todos inteiros e positivos, e para cada n lido,
escreva a tabuada de 1 at n de n.
1xn=n
2 x n = 2n
. . . . .
. . . . .
. . . . .
n x n = n2

14. Escrever um algoritmo que l 5 pares de valores a, b , todos inteiros e positivos, um par de dada vez, com a <
b e escreve os inteiros pares de a at b, incluindo o a e b se forem pares.
15. Escrever um algoritmo que l um nmero no determinado de pares de valores m, n , todos inteiros e
positivos, um par de cada vez, e calcula e escreve a soma dos n inteiros consecutivos partir de m inclusive.
16. Escrever um algoritmo que l um nmero no determinado de conjuntos de valores, cada um formado pelo
nmero do aluno e suas 3 notas. Calcular, para cada aluno, a mdia ponderada com pesos respectivos de 4.0
para a maior nota e peso 3 para as outras duas. Escrever o nmero do aluno, suas 3 notas, a mdia calculada e
uma mensagem APROVADO se a nota for 5 ou REPROVADO se nota < 5.
17. Escrever um algoritmo que l um valor n inteiro e positivo e que calcula e escreve o valor de E, onde :

E=1+

1
1 1 1
+ + + ... +
1! 2! 3!
n!

18. Um Clube de Futebol de uma cidade fez uma pesquisa entre seus scios, coletando dados sobre o salrio e o
nmero de filhos dos scios. O Clube deseja saber:
a)

A mdia do salrio dos scios

b) A mdia do nmero de filhos


c)

O maior salrio

d) O percentual de pessoas com salrio at R$ 400,00


O final da leitura de dados se dar quando da leitura de um salrio negativo.
19. Gustavo tem 1,40 metros e cresce 15 centmetros por ano, enquanto Juliano tem 1,10 metros e cresce 3
centmetros por ano. Construa um algoritmo que calcula e escreve, quantos anos sero necessrios para que
Juliano ultrapasse Gustavo.
20. Em uma eleio presidencial existem 4 candidatos. Os votos so informados por meio de cdigos. Os dados
utilizados para a contagem dos votos obedecem seguinte codificao:
Os cdigos 1, 2, 3 e 4 representam os votos para os respectivos candidatos.
O cdigo 5 representa o voto nulo.
O cdigo 6 representa o voto em branco.
Elabore um algoritmo que l os votos, um de cada vez, e calcula e escreve:
-

o total de votos para cada candidato

35

o total de votos nulos

o percentual de votos em branco

21. Escrever um algoritmo que l um conjunto de 15 valores, um de cada vez, acompanhados de um cdigo 1 ou 2.
O valor representa o nmero de cobaias utilizadas em cada uma das 15 experincias feitas, e os cdigos 1 ou 2
representam respectivamente coelhos e ratos. Quer-se saber o nmero total de cobaias utilizadas, o total de
coelhos, o total de ratos, a percentagem de coelhos e a percentagem de ratos. Escrever estes valores.
22. Escrever um algoritmo que l, para cada um dos vendedores de uma empresa, o seu nmero de identificao,
seu salrio fixo e o total das vendas por ele efetuadas em reais. Cada vendedor recebe um salrio fixo e uma
comisso proporcional s vendas por ele efetuadas. A comisso de 3% sobre o total de vendas at 10000,00 e
5% sobre o que ultrapassa este valor. Escrever, para cada vendedor, o seu nmero de identificao, o seu
salrio fixo e o seu salrio total.
23. Escrever um algoritmo que l um nmero n que representa o nmero de termos de uma Progresso Aritmtica,
a1 , o primeiro termo desta progresso e r , razo desta progresso. Escrever os n termos desta progresso, bem
como, a sua soma.
24. Escrever um algoritmo que l 5 conjuntos de 2 valores, o primeiro representando o nmero de um aluno, e o
segundo representando a sua altura em centmetros. Encontrar o aluno mais alto e o mais baixo e escrever seus
nmeros, suas alturas e uma mensagem dizendo se o mais alto ou o mais baixo.
25. Um avio voando em linha reta, a uma altitude a, passa sobre um ponto P situado em solo num instante t = 0.
Se a velocidade v e a altura a forem lidos, calcular a distncia d do avio ao ponto P aps 1, 2, ... , 30
segundos. Escrever, para cada t, o tempo e a distncia.
26. Escrever um algoritmo que l um valor n que indica quantos valores devem ser lidos para m, valores todos
inteiros e positivos, com leitura de um valor de cada vez. Escreva, para cada valor lido, o prprio valor lido,
seu fatorial e sua raiz cbica.
27. Escrever um algoritmo que gera e escreve os 5 primeiros nmeros perfeitos. Um nmero perfeito aquele que
igual a soma de seus divisores, exceto ele prprio.
Exemplo: 6 = 1 + 2 + 3; 28 = 1 + 2 + 4 + 7 + 14
28. Escrever um algoritmo que l 50 valores, um de cada vez, e encontra e escreve o maior deles.
29. Escrever um algoritmo l a, b, c, d e e , que constituem o Gabarito de uma prova de 5 questes. Leia, a seguir,
um nmero no determinado de conjuntos de 6 valores: num, a1, a2, a3, a4 e a5, onde num representa o
nmero do aluno e os demais valores so as respostas daquele aluno s 5 questes da prova. Conte o nmero
de acertos e multiplique por 2. Escrever, para cada aluno, o seu nmero e a sua nota.
30. Foi feita uma pesquisa em um municpio. A pesquisa coletou, para cada habitante, os seguintes dados: idade,
sexo ( M/F ) e salrio. Escreva um algoritmo que l os conjuntos de dados obtidos, um conjunto de cada vez,
obtm e escreve as seguintes informaes:
a)

A mdia de salrio dos habitantes do municpio.

b) A maior e a menor idade das pessoas pesquisadas.


c)

A quantidade de mulheres com salrio at 500,00.

O algoritmo deve terminar quando for fornecida uma idade negativa.


31. Foi realizada uma pesquisa de algumas caractersticas fsicas entre a populao de uma determinada regio. Os
dados coletados por habitante, para serem analisados foram:
-

sexo ( masculino ou feminino )

cor dos olhos ( azuis, verdes ou castanhos )

36

cor dos cabelos ( louros, castanhos, pretos )

idade

Escrever um algoritmo que obtenha e escreva:


-

A maior idade entre os habitantes

A quantidade de indivduos do sexo feminino cuja idade est entre 18 e 24 anos inclusive e que
tenham olhos verdes e cabelos louros

O final do algoritmo ocorrer quando entrar uma idade negativa.


32. Escrever um algoritmo que l uma quantidade no determinada de nmeros positivos. Calcula e escreve a
quantidade de nmeros pares e mpares, a mdia dos valores pares e dos mpares e a mdia geral dos valores
lidos. O algoritmo finaliza quando entrar um valor nulo.
33. Escrever um algoritmo que l o cdigo e o valor de cada produto de uma empresa. Supondo que a empresa
deseja aumentar todos os produtos de cdigos pares em 15% e todos os produtos cujos cdigos so mpares em
20%, escreva a lista dos produtos com o respectivo cdigo e o seu preo j reajustado. O algoritmo termina
quando entrar um cdigo nulo.
34. Escrever um algoritmo que gera os nmeros entre 1000 e 2000 e escreve aquele que divididos por 11 deixam
resto igual a 5.
35. Escrever um algoritmo que l 50 valores inteiros e positivos e:
a)

apresenta o maior dos 50 valores lidos;

b) apresenta o menor dos 50 valores lidos;


c)

apresenta a mdia aritmtica dos 50 valores lidos.

36. Escrever um algoritmo que l um valor inteiro e positivo n e calcula a seguinte soma:
S = 1 + 1/2 + 1/3 + 1/4 + ... + 1/n
O algoritmo deve escrever cada um dos termos da soma e o valor final de S.
37. Escrever um algoritmo que calcula e escreve a mdia ponderada com peso 1.0 para os valores mpares e peso
2.0 para os valores pares situados no intervalo [13, 77].
38. Escrever um algoritmo que l 50 pares de valores, cada par formado pela altura e pelo sexo de uma pessoa (
cdigo=1, masculino e cdigo=2, feminino ) e escreve a maior e menor altura para cada sexo.
39. Escrever um algoritmo que calcula e escreve o produto dos nmeros primos entre 95 e 1475.
40. Foi feita uma estatstica nas 20 principais cidades do estado para coletar dados sobre acidentes de trnsito.
Foram obtidos os seguintes dados:
-

cdigo da cidade ( 1 a 20 )

nmero de veculos de passeio do ano passado

nmero de acidentes com vtimas do ano passado

Escrever um algoritmo que l 20 conjuntos de valores, um de cada vez, contendo o cdigo da cidade, o nmero
de veculos de passeio e o nmero de acidentes e, calcula e escreve:
a)

Qual o maior e menor ndice de acidentes e a que cidade pertencem respectivamente

b) Qual a mdia de veculos nas cidades pesquisadas


37

c)

Qual a mdia de acidentes entre as 20 cidades pesquisadas.

41. Fez-se uma pesquisa entre os 1200 habitantes de uma regio para coletar os seguintes dados: sexo ( 0feminino, 1-masculino ), idade e altura.
Escrever um algoritmo que l as informaes coletadas e escreve as seguintes informaes:
a)

mdia da idade do grupo;

b) mdia da altura das mulheres;


c)

mdia da idade dos homens;

d) percentual de pessoas com idade entre 21 e 53 anos.


42. Escrever um algoritmo que l um conjunto no conhecido de pares de valores a e b, todos inteiros e positivos,
e, para cada par de valores lido, obtm o M.D.C. de a e b e o escreve juntamente com os valores lidos.
43. Escrever um algoritmo que l um conjunto no conhecido de pares de valores a e b, todos inteiros e positivos,
e, para cada par de valores lido, obtm o M. D. C. e o M. M. C. de a e b e os escreve juntamente com os
valores lidos.
44. Escrever um algoritmo que l n, inteiro e positivo, e calcula e escreve o termo de ordem n da sucesso abaixo:
Ordem:

1 2 3 4

10

Sucesso:

-1 0 5 6 11 12 17 18 23 24

45. Foram entrevistadas 50 pessoas e coletados os seguintes dados:


a)

sexo: M ( masculino ) e F ( feminino );

b) cor dos olhos: A ( azuis ), V ( verdes ), e C ( castanhos );


c)

cor dos cabelos: L ( louros ), C ( castanhos ) e P ( pretos );

d) idade.
Escrever um algoritmo que l os 50 conjuntos de valores para cada uma das pessoas entrevistadas e escreve:
1.

a maior idade do grupo;

2.

a quantidade de indivduos do sexo feminino, com idade entre 18 e 24 anos e que tenham olhos verdes e
cabelos louros.

46. Uma loja de departamentos que tem cadastrados 180 clientes deseja mandar uma correspondncia aos
melhores dos seus clientes anunciando-lhes um bnus especial. Escrever um algoritmo que l o nome do
cliente e o valor de suas compras no ano que passou e calcula um bnus de 15% para aqueles clientes cujo
valor de compras excedeu a 200 reais. Escrever o nome dos clientes que so merecedores deste brinde.
47. Escreva um algoritmo que l um conjunto no determinado de pares de datas e escreva a diferena entre elas
em dias.
48. Sabemos pela Lei de Newton que a fora de atrao entre dois corpos diretamente proporcional ao produto

de suas massas e inversamente proporcional ao quadrado da distncia entre eles.


Escrever um algoritmo que l um nmero no conhecido de conjuntos de 4 valores m1 ( massa do primeiro
corpo ), m2 ( massa do segundo corpo ), G ( constante de gravitao universal ) e d (distncia entre os corpos )

38

e calcula e escreve, para cada conjunto lido, a fora de atrao entre os dois corpos de massas m1 e m2
respectivamente.
49. Supondo que a populao de uma cidade A seja da ordem de 90.000 habitantes com uma taxa anual de

f =

Gm1m2
d2

crescimento de 3.1% e que a populao de uma cidade B seja da ordem de 200.000 habitantes com uma taxa
anual de crescimento de 1.5%. Escrever um algoritmo que calcula quantos anos sero necessrios para que a
populao da cidade A ultrapasse a populao da cidade B, mantidas as taxas atuais de crescimento de cada
uma.
50. Supondo dados os trs primeiros nmeros primos, respectivamente 1, 2, e 3, escrever um algoritmo que
escreve os 20 primeiros nmero primos, incluindo os trs j dados.

39

CAPTULO V
ALGORITMOS DE MANIPULAO DE MATRIZES
O captulo V tem como objetivo a conceituao de matriz apresentar os seus usos e os principais algoritmos
relacionados.
A idia de fazer uso de conjuntos de variveis vem desde os primrdios da matemtica. O prprio conceito de
matriz, que ser usado em algoritmos em nada difere do conceito usado na matemtica.
Matriz um conjunto de variveis, cada uma podendo representar o valor de uma constante, como se fossem
variveis simples, mas todas elas compartilham o mesmo nome.
ndices so associados a este nome comum com a finalidade de permitir a individualizao dos elementos do
conjunto.
Por exemplo: Um conjunto A de 5 elementos representado como:
A1 A2 A3 A4 A5
Onde A o nome de cada um dos 5 elementos e a identificao dos elementos individuais, que no pode mais ser
feita s pelo nome, que o mesmo para todos, passa a ser feita pelo nome do conjunto seguido de um ndice. Assim A1
representa o primeiro elemento do conjunto e A5 representa o quinto e ltimo elemento do conjunto.
Muitos dos problemas do dia a dia exigem um nmero significativo de variveis. Na maioria das linguagens de
programao no difcil encontrar um grande nmero de variveis para representar os valores que so necessrios para a
soluo do problema, mas em todas elas torna-se difcil e trabalhoso tratar com um grande nmero de variveis diferentes.
As operaes, tais como leitura, escrita e qualquer outra operao que envolva todas elas exigiria uma nomeao
individual de todas estas variveis.
Alm disso, uma quantidade de problemas que com o uso de variveis simples ficaria, praticamente, limitado a um
pequeno nmero de valores, com a utilizao de matrizes podem ser resolvidos de forma simples, para nmeros grandes de
valores.
Para diferenciar as variveis simples das variveis do tipo matrizes, as linguagens de programao usam, cada uma
sua maneira, uma indicao de quais variveis so do tipo matrizes, quantas dimenses possui cada uma e qual o tamanho
de cada dimenso.
Na linguagem algortmica usada adotar-se- a seguinte instruo:
Nome_da _Varivel ( dim1, dim2, ... , dimn ): Mat

Onde a sigla Mat indica que a varivel apresentada do tipo Matriz com n dimenses.
Exemplo: V ( 5 ), M ( 6,8 ): Mat
Indica que V uma matriz com uma dimenso ( um vetor ) e o tamanho da dimenso 5, que M uma matriz com
duas dimenses, respectivamente de 6 linhas e 8 colunas.
A representao destas matrizes seria
V1

V2

V3

V4

V5

40

M(6,8)

A maioria das linguagens de programao permitem trabalhar com matrizes de mais de duas dimenses. Apenas
algumas como o BASIC esto limitadas a apenas duas dimenses. Se observamos que cerca de 95% dos problemas podem
ser resolvidos com matrizes de duas dimenses, esta limitao passa a ser pouco significativa.
Consideremos, a seguir, algumas operaes mais freqentes com matrizes, tais como: leitura de matrizes, escrita de
matrizes, soma dos elementos de uma matriz. A representao destas operaes mostrada abaixo:
a)

Leitura de um vetor V(5)

Para i = 1 at 5
Ler ( V( i ) )
Fim_Para i

b) Escrita de uma matriz M(5,4)

Para i = 1 at 5
Para j = 1 at 4
Escrever ( M(i , j) )
Fim_Para j
Fim_Para i

c)

Soma dos elementos de um vetor X(100)

S=0
Para i = 1 at 100
S = S + X( i )
Fim_Para i

Uma observao importante que numa matriz M ( i, j ), por conveno o primeiro ndice representa a linha e o
segundo ndice representa a coluna, mas como primeiro ou como segundo ndices podem ser usadas quaisquer variveis
inteiras. No existe nenhum compromisso do i com linha ou do j com coluna.

41

Se tivermos vrias operaes a serem feitas sobre a mesma matriz em ocasies diferentes podemos usar ndices
diferentes. O que deve ser cuidado apenas a variao do ndice a qual deve ficar dentro dos limites da dimenso que o
ndice representa.
Considere-se o seguinte problema: Ler um vetor N com 80 elementos, onde cada elemento representa a nota de
um aluno de uma turma de Vestibular. Calcular a mdia geral da turma e verificar quantos alunos ficaram acima da
mdia, quantos ficaram abaixo da mdia e quantos ficaram na mdia, escrevendo a mdia geral, o nmero de notas
acima da mdia, o nmero de notas abaixo da mdia e o nmero de notas iguais mdia .
Algoritmo 5.1: Clculo da Mdia Geral

Algoritmo Estatstica
N( 80 ) : Mat de tipo inteiro
S, Mg : real
i, j, C, B : inteiro
Incio
S=0
Para i = 1 at 80
Incio
Ler ( N( i ) )
S = S + N( i )
Fim_Para i
Mg = S/80
C=0
Para j = 1 at 80
Se N( j ) < Mg ento C = C + 1
Fim_Para j
B = 80 C
Escrever ( Mdia Geral =
, Mg,
Acima da Mdia =
, C,
Abaixo da Mdia =
,B)
Fim

Note que, conforme observao acima, na instruo Para j = 1 at 80 podera-se ter usado novamente como
ndice a varivel i em lugar do j.
Dada a natureza do problema, contar quantos alunos ficaram na mdia, acima ou abaixo dela, ele seria difcil de ser
solucionado se os valores lidos no tivessem sido guardados em um vetor. Todos os valores teriam que ser fornecidos
novamente para o computador de forma que pudesse compar-los com a mdia.
Considere-se o seguinte problema: Ler um vetor V de 6 elementos e escrev-lo. Ordenar, em seguida, os
elementos de V em ordem crescente e escrever o vetor V assim ordenado.
Na soluo deste problema tm-se uma quantidade grande de algoritmos que solucionam o problema, alguns deles
bem simples mas pouco eficientes e outros bastante eficientes, porm j nem to simples.
O problema da eficincia do algoritmo, naturalmente s relevante quando se trata de conjuntos grandes de
elementos. No caso de um vetor de 6 elementos todos os algoritmos praticamente levam o mesmo tempo para fazerem a
ordenao.
Veremos aqui duas destas solues, bastante simples, mas em geral no muito eficientes para conjuntos grandes.
O primeiro mtodo consiste em percorrer o vetor, comparando-se cada elemento do vetor com o elemento
imediatamente seguinte ( V(i) com V(i+1) ). Se o elemento comparado for menor ou igual ao elemento seguinte, compara-se
o segundo valor com o prximo at esgotar o vetor. Se o elemento comparado for maior do que o imediatamente seguinte,
troca-se entre si os dois elementos comparados e continua-se comparando o segundo valor com o imediatamente seguinte
enquanto houver elementos no vetor. Teramos ento:

42

Para i = 1 at 5
Se V(i) > V(i+1) ento Incio
x = V(i)
V(i) = V(i+1)
V(i+1) = x
Fim
Fim_Para i

Supondo a leitura de um vetor V(6) com os seguintes valores:

15

17

10

Executando-se o trecho de algoritmo acima sobre este vetor, resultaria o seguinte:

15

10

17

Como pode ser observado, o novo vetor ficou mais prximo de uma ordenao em ordem crescente, mas no est
ordenado conforme se deseja. Isto indica que o processo deve ser repetido vrias vezes at se conseguir o objetivo final.
Uma segunda execuo nos levaria seguinte configurao do vetor:

10

15

17

Como se v, este vetor, com apenas duas execues do trecho de algoritmo acima j ficou ordenado. Outros
vetores, entretanto, podem exigir uma quantidade maior de execues do trecho acima at conseguirem deixar o vetor
totalmente ordenado. No mximo o nmero de execues necessrias para a ordenao de um vetor de N-1, onde N o
nmero de elementos do vetor.
Podemos assim completar o trecho acima:

Para n = 1 at 5
Incio
Para i = 1 at 5
Se V(i) > V(i+1) ento Incio
X = V(i)
V(i) = V(i+1)
V(i+1) = X
Fim
Fim_Para i
Fim_Para n

Este trecho certamente garante a ordenao do vetor conforme desejado, contudo, na prtica o nmero de vezes que
se tem que passar pelo vetor bem menor do que N-1, conforme pde ser visto no exemplo do vetor V acima. Em lugar de
cinco passagens foram necessrias apenas duas. Desta forma, uma soluo melhor a seguinte:

43

k=0
Enquanto k = 0
Incio
k=1
Para i = 1 at 5
Se V(i) > V(i+1) ento Incio
X = V(i)
V(i) = V(i+1)
V(i+1) = X
k=0
Fim
Fim_Para i
Fim_enquanto

Com isto a verso 1 da ordenao de um vetor V de 6 elementos a seguinte:


Algoritmo 5.2 Ordenao pelo mtodo da Bolha

Algoritmo OrdenaCrescenteBolha
V ( 6 ) : Mat de tipo Inteiro
i, k, x : Inteiro
Incio
Para i = 1 at 6
Incio
Ler ( V( i ) )
Escrever ( V(i ) )
Fim_Para i
k=0
Enquanto k = 0
Incio
k=1
Para i = 1 at 5
Se V(i) > V(i+1) ento Incio
x = V(i)
V(i) = V(i+1)
V(i+1) = x
k=0
Fim
Fim_Para i
Fim_enquanto
Para i = 1 at 6
Escrever ( V ( i ) )
Fim_Para i
Fim

Assim, o algoritmo acima l um vetor V de 6 elementos e o escreve tal qual foi lido. Em seguida, ordena o vetor V
em ordem crescente, usando um dos muitos mtodos de ordenao existentes, denominado mtodo da bolha ( Bubble Sort ).
Uma vez ordenado, o algoritmo escreve o vetor ordenado em ordem crescente.
Outro processo de ordenao de um conjunto, consiste em achar o maior elemento do conjunto e troc-lo com a
ltima posio. Em seguida acha-se o maior do conjunto restante e troca-se com a penltima posio. Procede-se da mesma
maneira at que o conjunto restante contenha apenas um elemento quando se d por concludo o processo.

44

Supondo que se tenha o mesmo vetor usado anteriormente:

15

17*

10*

15*

10*

17

10*

4*

15

17

7*

1*

10

15

17

4*

1*

10

15

17

10

15

17

Os * indicam os elementos que foram trocados de uma linha para a seguinte. A soluo do problema da ordenao
por este processo nos leva ao seguinte algoritmo:
Algoritmo 5.3 Verso 2 do algoritmo de ordenao de um conjunto pelo mtodo da troca do maior.

Algoritmo OrdenaCrescenteTrocaMaior
V(6) : Mat de tipo inteiro
i, n, m, p, aux, k : inteiro
Incio
Para i = 1 at 6
Incio
Ler ( V( i ) )
Escrever ( V( i ) )
Fim_Para i
n=6
Enquanto n > 1
Incio
m = V( 1 )
p=1
Para i =2 at 6
Se m < V( i ) ento Incio
m = V(i)
p = i
Fim
Fim_Para i
aux = V( n )
V( n ) = V( p )
V( p ) = aux
n=n1
Fim_enquanto
Para k = 1 at 6
Escrever ( V( k ) )
Fim_Para k
Fim

Quando se tratar de matrizes de duas dimenses, tem-se dois ndices que devem ser controlados. Considere o
seguinte problema: Ler uma tabela T( 10, 20 ). Em seguida ler 15 valores, um de cada vez, e, para cada valor lido,
verificar se este valor est ou no na tabela T, escrevendo-o com a mensagem adequada.

45

Desta forma temos o algoritmo 5.5 abaixo:

Algoritmo Pesquisa em Tabela


T(10,20) : Mat de tipo inteiro
n, i, j, a : inteiro
Incio
Para i = 1 at 10
Para j = 1 at 20
Ler ( T( i,j ) )
Fim_Para j
Fim_Para i
Para n = 1 at 15
Incio
Ler ( a )
Para i = 1 at 10
Para j = 1 at 20
Se a = T(i, j) ento Incio
i = 12
j = 10
Fim
Fim_Para j
Fim_Para i
Se i = 11 ento escrever ( a, no est na Tabela )
seno escrever ( a, est na Tabela )
Fim_Para n
Fim

Outro problema que aparece com freqncia quando se trata de matrizes de duas dimenses o de fazer-se somas
de diferentes partes da matriz. Isto ser ilustrado atravs do seguinte problema:
Ler uma matriz M(5,5) e efetuar as seguintes somas:
a) Soma dos elementos da linha 3.
b) Soma dos elementos da coluna 5.
c)

Soma dos elementos da Diagonal Principal.

d) Soma dos elementos da Diagonal Secundria.


e)

Soma dos elementos de toda a matriz.

Escrever as somas calculadas.


As somas solicitadas podem ser melhor visualizadas abaixo:

46

Lembrando que qualquer varivel pode representar o ndice linha ou o ndice coluna de qualquer matriz, no
existindo qualquer compromisso do i com linha ou do j com coluna e resolvendo o problema por partes, temos o algoritmo
abaixo:

Algoritmo 5.6 das Somas diversas de uma matriz ( Primeira verso )

Algoritmo SomasMatriz
M(5,5) : Mat de tipo inteiro
i, j : inteiro
S1,S2,S3,S4,S5: real
Incio
Para i = 1 at 5
Para j = 1 at 5
Ler ( M(i,j) )
Fim_Para j
Fim_Para i
S1= S2 = S3 = S4 = S5 = 0
Para i = 1 at 5
S1 = S1 + M( 3,i )
Fim_Para i
Para i = 1 at 5
S2 = S2 + M( i, 5 )
Fim_Para i
Para i = 1 at 5
S3 = S3 + M( i, i )
Fim_Para i
Para i = 1 at 5
S4 = S4 + M( i, 5-i )
Fim_Para i
Para i = 1 at 5
Para j = 1 at 5
S5 = S5 + M( i, j )
Fim_Para j
Fim_Para i
Escrever ( S1, S2, S3, S4, S5 )
Fim

Este algoritmo, quando se analisa o conjunto das aes que devem ser realizadas pode ser simplificado para o
seguinte algoritmo:

Algoritmo 5.7 das somas elementares de uma matriz ( Segunda verso ):

47

Algoritmo SomasMatrizCompacto
M( 5,5 ): Matriz de tipo inteiro
i, j, S1, S2, S3, S4, S5: inteiro
Incio
/ Leitura da Matriz /
Para i = 1 at 5
Para j = 1 at 5
Ler ( M( i, j ) )
Fim_Para j
Fim_Para i
/ Zerar os acumuladores das 5 somas /
S1 = S2 = S3 = S4 = S5 = 0
/ Efetuar as somas a), b), c), d) /
Para i = 1 at 5
S1 = S1 + M ( 3, j )
S2 = S2 + M ( i, 5 )
S3 = S3 + M ( i, i )
S4 = S4 + M ( i, 5-i )
/ Efetuar a soma de uma linha de M /
Para j = 1 at 5
S5 = S5 + M ( i, j )
Fim_Para j
Fim_Para i
/ Escrever as somas calculadas /
Escrever ( S1, S2, S3, S4, S5 )
Fim

Principalmente usando matrizes, convm analisar o problema como um todo, antes de comear a construir o
algoritmo, para evitar grande nmero de variaes de ndices o que pode tornar a soluo extensa e pouco eficiente.

48

EXERCCIOS
01. Conceitue Matriz
02. Como indicada a leitura de um vetor V( 10 )
03. Como se indica a escrita de uma matriz M ( 5, 8 )
04. Escrever um algoritmo que l um vetor V ( 6 ) e o escreve. Conte, a seguir quantos valores de V so negativos
e escreva esta informao.
05. Escrever um algoritmo que l um vetor A ( 10 ) e escreve todos os valores iguais a 5 deste vetor.
06. Escrever um algoritmo que l um vetor X ( 100 ) e o escreve. Substitua, a seguir, todos os valores negativos de
X por 1 e escreva o vetor modificado.
07. Escrever um algoritmo que l um vetor V ( 10 ) e o escreve. Conte, a seguir o nmero de valores negativos de
V, substitua os negativos por 1 e escreva a sua posio. No final escrever o nmero de valores negativos
encontrados e o vetor modificado.
08. Escrever um algoritmo que l um vetor C ( 50 ) e o escreve. Encontre, a seguir, o maior elemento de C e o
escreva com a mensagem: O MAIOR.
09. Escrever um algoritmo que l um vetor N ( 80 ) e o escreve. Encontre, em seguida, o menor elemento e a sua
posio e escreva estas informaes.
10. Escrever um algoritmo que l um vetor A ( 15 ) e o escreve. Ordene, a seguir, os elementos de A em ordem
crescente e escreva o vetor A ordenado.
11. Escrever um algoritmo que l um vetor N ( 20 ) e o escreve. Troque, a seguir, o 1 elemento com o ltimo, o
2 com o penltimo, e assim por diante, at o 10 com 11 e escreva o vetor N assim modificado.
12. Escrever um algoritmo que l um vetor K ( 20 ) e o escreve. Troque, a seguir, os elementos de ordem mpar
com os de ordem par imediatamente seguintes e escreva o vetor assim modificado.
13. Escrever um algoritmo que l um vetor M ( 20 ) e o escreve. Troque, a seguir, o 1 com o 11, o 2 com 12 e
assim por diante at o 10 com o 20 e escreva o vetor assim modificado.
14. Escrever um algoritmo que l um vetor V ( 10 ) e um escalar. Fazer o produto do escalar A pelo vetor V e
escrever o vetor e o produto calculado.
15. Escrever um algoritmo que l um vetor G ( 20 ) que representa o gabarito de uma prova de 20 questes. Ler, a
seguir, um nmero no determinado de conjuntos formados pelo nmero de um aluno e por um vetor R ( 20 )
que constitue o conjunto resposta do aluno quela prova. Para cada aluno, calcular o nmero de acertos e
depois calcular a sua nota pela frmula:

Nmero de acertos -

( 20 nmero de acertos )
______________________
2
2

pois, cada dois erros descontam um acerto. Escrever o nmero do aluno, sua nota e a mensagem : APROVADO
se tiver nota maior ou igual a 5 e REPROVADO se tiver nota menor do que 5.
16. Escrever um algoritmo que l dois vetores N ( 10 ) e M ( 10 ) e faz o produto escalar de N por M escrevendo
os vetores lidos e o produto calculado.

49

17. Escrever um algoritmo que l dois vetores X ( 10 ) e Y ( 10 ) e os escreve. Crie, a seguir, um vetor Z que seja a
unio de X com Y. Escreva o vetor Z criado.
18. Escrever um algoritmo que l dois vetores A ( 10 ) e B ( 10 ) e os escreve. Crie, a seguir, um vetor C que seja a
interseo de A com B. Escreva o vetor C criado.
19. Escrever um algoritmo que l dois vetores K ( 10 ) e N ( 10 ) e os escreve. Crie, a seguir, um vetor M que seja
a diferena entre K e N. Escreva o vetor M criado.
20. Escrever um algoritmo que l um vetor G ( 13 ) que o gabarito de um teste da Loteria Esportiva, contendo os
valores 1 ( coluna 1 ), 2 ( coluna 2 ) e 3 ( coluna do meio ). Ler, a seguir, para cada apostador, o nmero de seu
carto e o vetor resposta R ( 13 ). Verificar o nmero de acertos do apostador e escrever o nmero do carto e
o seu nmero de acertos. Se tiver 13 acertos, escrever tambm a mensagem : GANHADOR, PARABNS .
21. A empresa XYZ registra todas as suas despesa em um conjunto, medida que os pagamentos vo sendo feitos.
A receita da empresa, por sua vez, realizada toda no dia 10 do ms e registrada no mesmo vetor como um
valor s. Como as despesas so registradas uma a uma e a receita de uma s vez, o valor da receita certamente
ser o maior valor do conjunto, mas no necessariamente ser maior do que as somas das despesas. Encontre:
a)

O valor da receita;

b) O valor das despesas;


c)

Diga se a empresa obteve lucro ou prejuzo.

22. Escrever um algoritmo que l um vetor V ( 20 ) e o escreve. Compacte, a seguir, o vetor V, retirando dele
todos os valores nulos ou negativos e escreva o vetor compactado.
23. Escrever um algoritmo que l um vetor K ( 15 ) e o escreve. Crie, a seguir, um vetor N, que contm todos os
valores primos de K e escreva o vetor N assim criado.
24. Uma agncia de loteria esportiva deseja fazer uma estatstica de nmeros de acertadores por jogo em cada um
dos testes. Escrever um algoritmo que l o gabarito G ( 13 ) do teste em questo e em seguida l os vetores
resposta R ( 13 ) de cada apostador. No final deve escrever os jogos ( 1, 2 , 3 ... 13), o nmero de acertadores
desta agncia em cada jogo e o percentual de acertadores de cada jogo em relao ao nmero de apostadores.
25. Escrever um algoritmo que l um vetor V ( 20 ) e o escreve. Retire, a seguir, os elementos em duplicata,
compactando o vetor V e escrevendo o vetor compactado.
26. Escrever um algoritmo que l um conjunto de 30 valores e os coloca em 2 vetores conforme forem pares ou
mpares. O tamanho dos vetores de 5 posies cada. Se algum vetor estiver cheio escrev-lo. Ao final
escrever o contedo dos dois vetores. Cada vetor pode ser preenchido tantas vezes quanto for necessrio.
27. Escrever um algoritmo que l o 1 termo e a razo de uma progresso aritmtica e gera os 20 termos seguintes
desta progresso armazenando-os em dois vetores de 10 posies cada. No 1 vetor devem ser armazenados os
termos cuja ordem de gerao mpar e no 2 vetor, os termos cuja ordem de gerao par. Escrever, no final,
os dois vetores de forma que os termos da progresso apaream na ordem em que foram gerados.
28. Escrever um algoritmo que l 2 vetores V ( 10 ) e X ( 10 ) e os escreve. Crie, a seguir, um vetor Y ( 20 ) com
os elementos de V e X em ordem crescente ( sem ter que ordenar o vetor Y ) e escreva o vetor Y criado.
29. Escrever um algoritmo que l para um vetor V ( 30 ), vinte valores que devero ocupar as 20 primeira posies
de V. Ordene, a seguir, os elementos de V em ordem crescente. Leia, em seguida, 10 valores, um por vez, e
insira-os nas posies adequadas do vetor V, de forma que o mesmo permanea ordenado em ordem crescente.
Escreva o vetor V no final.
30. Escrever um algoritmo que gera os 10 primeiros nmeros primos acima de 100 e os armazena em um vetor
X(10) escrevendo o vetor X no final.
31. Escrever um algoritmo que l um vetor L( 5 ) que fornece os 5 nmeros sorteados em algum sorteio da LOTO.
Leia, a seguir, um nmero no determinado de vetores J ( 6 ) cada um contendo na primeira posio o nmero
de identificao do carto e nas demais posies as opes do apostador em questo. Para cada apostador
escrever o nmero de seu carto e o seu nmero de acertos, assinalando com uma mensagem quando tiver 3, 4
ou 5 acertos.
32. Escrever um algoritmo que l um vetor X ( 20 ) e o escreve. Escreva, a seguir, todos os valores distintos que
aparecem em X, com o seu nmero de ocorrncias.

50

33. Escrever um algoritmo que l uma matriz M (6, 6 ) e calcula as somas indicadas:
a)

Soma dos elementos acima da diagonal principal;

b) Soma dos elementos acima da diagonal secundria;


c)

Soma dos elementos abaixo da diagonal principal;

d) Soma dos elementos abaixo da diagonal secundria.


Escrever as somas calculadas.
34. Escrever um algoritmo que l uma matriz M ( 15, 15 ) e calcula as somas indicadas:
a)

Soma dos elementos simultaneamente acima das duas diagonais;

b) Soma dos elementos simultaneamente abaixo das duas diagonais;


c)

Soma dos elementos que esto simultaneamente acima da diagonal principal e abaixo da diagonal
secundria;

d) Soma dos elementos que esto simultaneamente acima da diagonal secundria e abaixo da diagonal
principal.
35. Escrever um algoritmo que l uma matriz M ( 10, 10 ) e a escreve. Troque, a seguir, conforme indicao:
a)

A linha 2 com a linha 8;

b) A coluna 4 com a coluna 10;


c)

A diagonal principal com a diagonal secundria;

d) A linha 5 com a coluna 10;


e)

A linha 1 com a diagonal secundria;

f)

A coluna 7 com a diagonal principal.

Escrever a matriz aps cada troca.


36. Escrever um algoritmo que l duas matrizes M ( 4, 6 ) e N ( 6, 8 ) e cria :
a)

Uma matriz M1 transposta da matriz M;

b) Uma matriz M2 com todos os seus elementos iguais a 1;


c)

Uma matriz MI que seja uma matriz identidade;

d) Uma matriz MP que seja o produto de M por N.


Escrever as matrizes lidas e as matrizes criadas.
37. Escrever um algoritmo que l uma matriz de coeficientes de um sistema linear e o vetor dos termos
independentes do sistema e cria a matriz aumentada do sistema ( n x n+1 ), escrevendo-a .
38. Escrever um algoritmo que l duas matrizes N1 ( 4, 6 ) e N2 ( 4, 6 ) e cria :
a)

Uma matriz M1 que seja a soma de N1 com N2;

b) Uma matriz M2 que seja a diferena entre N1 e N2.


Escrever as matrizes lidas e criadas.
39. Escrever um algoritmo que l uma matriz M( 10, 20) e escreve:
a)

O maior elemento de cada linha da matriz;

b) A mdia dos elementos de cada coluna;


c)

O produto de todos os elementos diferentes de zero;

d) O nmero de elementos negativos da matriz M;


e)

A posio que ocupada ( linha e coluna ) por um elemento cujo valor lido.

40. Escrever um algoritmo que l uma matriz M ( 6, 6 ) e um valor A e multiplica a matriz M pelo valor A e
coloca os valores da matriz M multiplicados por A em um vetor V ( 36 ), escrevendo o vetor assim formado.
41. Escrever um algoritmo que l uma matriz M ( 5, 5 ) e cria 2 vetores SL ( 5 ) e SC ( 5 ) que contenham,
respectivamente as somas das linhas e das colunas de M. Escrever a matriz e os vetores criados.
51

42. Escrever um algoritmo que l uma matriz M 50, 19 ), contendo nas posies assinaladas de cada linha o que
segue:
-

coluna 1 nmero do aluno;

colunas 2, 3 e 4 notas da disciplina 1;

colunas 5, 6 e 7 notas da disciplina 2;

colunas 8, 9 e 10 notas da disciplina 3;

colunas 11, 12 e 13 notas da disciplina 4;

colunas 14, 15 e 16 notas da disciplina 5;

colunas 17, 18 e 19 notas da disciplina 6.

Calcular, para cada aluno, as mdias de cada disciplina e a mdia geral armazenando num vetor o nmero do
aluno , as mdias por disciplina e a mdia geral e escrevendo o vetor antes de passar para o aluno seguinte.
43. Escrever um algoritmo que l uma matriz A ( 12, 13 ) e divide cada um dos 13 elementos de cada uma das 12
linhas de A pelo valor do maior elemento em valor absoluto daquela linha. Escrever a matriz A lida e a matriz
A modificada.
44. Escrever um algoritmo que l uma matriz M( 10, 10 ) e cria um vetor V1 contendo os elementos das linhas
pares de M e um outro vetor V2 contendo os elementos da diagonal principal somados aos elementos que
ficam na mesma linha, porm, na diagonal secundria. Escrever a matriz e os vetores criados.
45. Escrever um algoritmo que l uma matriz M( 6,6 ) e escreve os elementos que esto acima das duas diagonais
simultaneamente.
46. Uma matriz esparsa uma matriz que tem aproximadamente 2/3 de seus elementos iguais a zero. Escrever um
algoritmo que l uma matriz esparsa M( 10, 10 ) e cria uma matriz condensada de 3 linhas, contendo os
elementos no nulos de M, como segue:
-

a primeira linha contm a linha da matriz original onde foi localizado o elemento no nulo;

a segunda linha contm a coluna da matriz original onde foi localizado o elemento no nulo;

a terceira linha contm o elemento no nulo da matriz original.

Escrever a matriz condensada criada e a matriz original lida.


47. Escrever um algoritmo que l uma matriz A ( 8, 8 ), sem elementos repetidos e a escreve. Leia, a seguir, um
nmero no determinado de valores para X, um de cada vez, e para cada X lido verifica se este valor est ou
no est em A . Se for encontrado, encerrar a pesquisa escrevendo o valor X e a mensagem: EST EM A.
Caso contrrio, escrever X e a mensagem: NO EST EM A.
48. Modificar o exerccio anterior de forma a que, encontrando o valor, o algoritmo tambm escreva em que linha
e coluna da matriz A ele foi encontrado.
49. Supondo que a matriz A do exerccio acima possa conter elementos repetidos, modifique o algoritmo de sorte
que ele escreva as vrias posies em que o elemento X foi encontrado. Caso no exista nenhuma ocorrncia
escrever a mensagem: VALOR NO ENCONTRADO EM A.
50. Em certos problemas de Clculo Numrico vantajoso que o elemento de maior valor em valor absoluto de
uma coluna, numa matriz quadrada, esteja na diagonal, e a troca de linhas entre si no tem importncia.
Escrever um algoritmo que troque as linhas de uma matriz A ( n x n ) lida, de modo que:
| Dii | | Aji | para i = 1 at n-1 e para j = i + 1 at n
portanto, trocar a linha j com a linha i se | A ji | > | Aii |.
51. Muitos mtodos de Clculo Numrico para que possam ser aplicados exigem matrizes diagonalmente
dominantes. Uma matriz diagonalmente dominante se e somente se:
( i ) | Aii |

| Aij | e ( i ) | | Aii | > | Aij |


ji

ji

Escrever um algoritmo que l uma matriz M ( 4, 4 ) e verifica se esta matriz diagonalmente dominante
escrevendo uma mensagem adequada.

52

52. Na Teoria de Sistemas define-se como elemento minimax de uma matriz, o menor elemento da linha em que
se encontra o maior elemento da matriz. Escrever um algoritmo que l uma matriz K ( 10 , 10 ) e determina o
elemento minimax desta matriz, escrevendo a matriz e a posio ( linha e coluna ) do elemento minimax.
53. Supondo que se lance um dado 50 vezes e cada vez o valor seja armazenado em um conjunto. Escrever um
algoritmo que l os valores dos lanamentos dos dados e:
-

determina e escreve o nmero de lanamentos nos quais o resultado obtido maior do que a mdia
aritmtica dos 50 lanamentos;

determina a porcentagem de ocorrncias da face 6.

54. Num determinado campeonato de futebol foram anotados os nomes dos jogadores e o nmero de gols que cada
um marcou. Escrever um algoritmo que, partir destas informaes, fornea o nome do goleador do
campeonato e o nmero de gols por ele marcados. Considere um campeonato com apenas 8 times e 12
jogadores cada.
55. Uma empresa vende 30 artigos. Cada artigo identificado por um cdigo e os artigos possuem preos
variados. Usando variveis indexadas escreva um algoritmo que l os cdigos dos artigos com respectivos
preos e os armazena em matriz, determinando o seguinte:
a)

O cdigo e o preo dos 3 artigos mais caros;

b) A mdia dos preos dos 30 artigos;


c)

Quais os cdigos dos artigos com preos superiores mdia.

56. A empresa de Turismo XYZ TUR , na ltima temporada de vero fez uma pesquisa entre seus clientes no Rio
Grande do Sul, para saber o seguinte: Praia de Preferncia ( Torres, Arroio do Sal, Curumin, Arroio Teixeira,
Capo Novo, Capo da Canoa, Atlntida, Rainha do Mar, Mariluz, Imb, Tramanda, Cidreira, Pinhal e
Quinto ) e renda mensal. A pesquisa foi feita com 300 turistas e os dados foram armazenados em uma matriz
com as linhas representando as praias na ordem apresentada e as colunas representando as seguintes faixas de
renda ( 150-300, 301-500, 501- 800, 801 1000, 1001-2000, 2001- 4000 e 4001 10000).
Escrever um algoritmo que l estas informaes e fornece os seguintes dados:
a)

Qual a praia preferida pelo maior nmero de turistas;

b) A mdia da renda mensal dos turistas desta empresa;


c)

O nmero de turistas por praia;

d) Renda mdia por cada praia.

57. Escrever um algoritmo que l uma matriz T ( 10, 8) que contm os preos dos terrenos que so vendidos por
uma imobiliria, de acordo com a metragem ( colunas ) e de acordo com a zona de localizao ( linhas ).
Ler, a seguir, um conjunto de valores, cada conjunto contendo o cdigo do comprador, a zona de localizao, a
metragem do terreno e a opo de pagamento.
Obter o preo do terreno e acrescentar mais 3% de corretagem.
Se a opo de pagamento for 1( pagamento vista ) descontar 10% do valor total e escrever o cdigo do
comprador, a metragem do terreno, a zona de localizao do terreno e o valor total a pagar.
Se a opo de pagamento for 2 ( Pagamento de uma entrada de 30% e mais 3 prestaes de igual valor ) ento
acrescentar 15% ao valor do terreno. Calcular a entrada e o valor de cada prestao. Escrever o cdigo do
comprador, a metragem, a zona de localizao, a entrada a ser paga e o valor de cada prestao.
58. Uma matriz de adjacncias, para um mapa rodovirio, composta de elementos zeros e uns sendo que M(i, j)
= 1 se existir uma ligao rodoviria da cidade i para a cidade j e M( i, j ) = 0 se no existir esta ligao.
Esta matriz ser simtrica se para todo caminho i j existir um caminho j i ( estradas de mo dupla ).
Uma matriz assim tem a propriedade de que M2 representa os caminhos compostos de 2 trajetos, M3 representa
os caminhos compostos de 3 trajetos, e assim por diante.
Se considerarmos apenas caminhos compostos que no passam duas vezes pela mesma cidade ento os
elementos da diagonal da matriz produto devem ser zerados.
53

Escrever um algoritmo que l uma matriz de adjacncias A para um conjunto de 10 cidades, e:


a)

descubra quantos caminhos de 4 trajetos existem para cada par de cidades, escrevendo estas informaes;

b) leia K e L, duas cidades quaisquer e verifique o nmero mnimo de trajetos para completar um caminho da
cidade K para a cidade L, escrevendo esta informao.
59. Escrever um algoritmo que l uma matriz M ( 15, 15 ) e a escreve. Verifique, a seguir, quais os elementos de
M que esto repetidos e quantas vezes cada um deles aparece em M. Escrever cada elemento repetido com
uma mensagem dizendo quantas vezes ele aparece.
60. Um quadrado mgico de ordem n ( sendo n um nmero mpar ) um arranjo de nmeros de 1 at n2 em uma
matriz quadrada de tal modo que a soma de cada linha, coluna ou diagonal a mesma.

15

24

17

16

14

23

22

20

13

21

19

12

10

25

18

11

A figura mostra um quadrado mgico de ordem 5. A regra de formao relativamente fcil de ser verificada:
Comece com o 1 no meio da primeira linha. partir da siga para cima e para esquerda diagonalmente ( quando
sair do quadrado suponha que os lados superior e inferior esto unidos e os lados esquerdo e direito da mesma
forma ). Em cada quadrado que passar coloque o valor do quadrado anterior acrescido de uma unidade. Quando
atingir um quadrado j preenchido, desa um quadrado e o preencha e continue seguindo a diagonal at ter
colocado o valor n2 .
Escrever um algoritmo que l cinco nmeros mpares, um de cada vez, e gere e escreva o quadrado mgico
correspondente aos nmeros lidos.

61. Uma outra forma de representao de uma matriz esparsa a matriz de 4 linhas. A matriz de 4 linhas Q uma
matriz com nmero de colunas igual ao nmero de elementos no nulos da matriz esparsa original.
Q ( 1, * ) = valor dos elementos diferentes de 0 da matriz original.
Q ( 2, * ) = linha da matriz esparsa onde aparece o elemento no nulo.
Q ( 3, * ) = coluna da matriz esparsa onde aparece o elemento no nulo.
Q ( 4, * ) = nmero que indica a coluna da matriz Q onde aparece o prximo elemento da mesma coluna.
Escrever um algoritmo que l uma matriz A ( 15,15 ) que possui em torno de 2/3 de seus elementos nulos e
cria e escreve a matriz Q de 4 linhas formada, segundo as regras acima.

54

CAPTULO VI

SUBALGORITMOS

Muitos problemas grandes ou nem to grandes mas de soluo mais complexa podem ser divididos,
sucessivamente, em problemas menores, com lgica mais simples e de compreenso mais fcil. Em vez de escrever-se um
algoritmo grande, escrevem-se vrios algoritmos menores, os quais, no isoladamente mas em conjunto, resolvem o
problema proposto.
Aos trechos de algoritmo que efetuam um ou mais clculos determinados, d-se o nome de subalgoritmos.
Os valores fornecidos aos subalgoritmos so denominados de parmetros.
Ao processo de dividir-se problemas grandes em um conjunto de problemas menores denomina-se de
modularizao.
A modularizao de um algoritmo tem como vantagens:
1.

Dividir problemas grandes em vrios problemas menores, de baixa complexidade, principalmente por terem
um nmero pequeno de variveis e poucos caminhos de controle ( caminhos do incio ao fim do programa ).
Isto resulta em maior qualidade do algoritmo uma vez que o controle de grande nmero de variveis no uma
tarefa fcil, pois, sabe-se que as pessoas normais conseguem controlar 7 2 variveis simultneas sem se
atrapalharem. Com um nmero maior de variveis a probabilidade de cometer equvocos aumenta. Alm disso,
o fato de os mdulos, geralmente, terem poucos caminhos de controle simplifica a lgica e facilita o
entendimento do que efetivamente deve ser feito. A qualidade de um algoritmo est fortemente associada
perfeita compreenso do algoritmo, pois, muito mais provvel que algum produza um algoritmo correto se
souber exatamente o que o algoritmo deve fazer.

2.

A possibilidade de utilizar-se solues gerais para classes de problemas em lugar de solues especficas para
problemas particulares.
O uso de solues genricas, na maioria das linguagens de programao s possvel por meio do uso de
mdulos. O grande ganho que se tem com esta tcnica o alto grau de reusabilidade dos mdulos escritos
como solues genricas. Na prtica, isto significa solucionar uma vez cada problema e no dezenas ou
centenas de vezes.

3.

Permite delimitar o escopo ( nvel de abrangncia ) de variveis. As variveis definidas no interior de um


mdulo so denominados de variveis locais.
As variveis declaradas em um mdulo so ativadas quando aquele mdulo comea a ser executado. Ocupam
memria somente at o final da execuo do mdulo ao qual pertencem. Isto permite uma otimizao do uso
da memria.

4.

Evita a repetio, dentro de um mesmo algoritmo, de uma seqncia de aes em diferentes pontos.
Escrevendo a seqncia de aes que se repete em vrios pontos de um algoritmo na forma de um mdulo,
ganha-se tempo, encurta-se o algoritmo e d-se menos chance ao azar de cometer algum erro em alguma destas
seqncias.

Existem, na maioria das linguagens de programao, duas formas de implementao e uso de subalgoritmos ( ou
mdulos ):

a)

Subalgoritmos que implementam uma funo, no sentido matemtico do termo, isto , que calculam um nico
valor em funo de um ou mais parmetros recebidos;

b) Subalgoritmos do tipo procedimento que podem calcular um nmero qualquer de valores, calculados ou no
em funo dos parmetros recebidos.

55

SUBALGORITMOS DO TIPO FUNO

A definio deste tipo de subalgoritmo ser feita da seguinte forma:


Funo NomeF (Arg1:tipo, Arg2:tipo, ..., Argn:tipo ): Tipo
Definies de variveis locais
Incio
.............
.............
.............
NomeF = Expresso
Retorne
Fim

onde as linhas pontilhadas representam instrues comuns de um algoritmo, NomeF o nome da funo e Tipo o
tipo do valor que ser devolvido pela funo. O nmero de argumentos qualquer e cada um vem acompanhado de seu tipo.
Deve existir, no corpo do subalgoritmo, pelo menos uma instruo do tipo NomeF = Expresso. Como uma funo s pode
calcular um nico valor, muitas linguagens de programao obrigam que este valor seja atribudo ao nome da funo, dentro
do corpo da funo. Desta forma, como o nome da funo nico, no tem como retornar mais de um valor, no existindo o
perigo de algum tentar descaracterizar o subalgoritmo como sendo do tipo funo. A instruo Retorne indica o trmino da
execuo do subalgoritmo e o retorno do valor calculado para o algoritmo que chamou a funo.
Quanto aos argumentos, que so os valores recebidos e/ou retornados por um subalgoritmo, podemos divid-los em
3 categorias:
De Entrada
: So os argumentos que tm seus valores estabelecidos fora do subalgoritmo e no podem ser
modificados dentro do subalgoritmo ( valores recebidos );
De Sada
calculados );

: So os argumentos que tm seus valores estabelecidos dentro do subalgoritmo ( valores

De Entrada-Sada: So argumentos que tm seus valores estabelecidos fora do subalgoritmo, mas que podem ser
modificados pelo subalgoritmo ( valores modificados ).
Quanto passagem de parmetros, que so os valores usados na chamada do subalgoritmo, existem duas formas,
normalmente usadas:
Passagem por Valor : quando o que passado para o subalgoritmo o valor da varivel usada como parmetro;
Ex.: Funo F ( x : inteiro, y : real ): real
onde x um argumento do tipo inteiro passado por valor e y um argumento do tipo real, tambm passado por
valor.
Passagem por Referncia: quando o que passado no o valor de uma varivel, mas o endereo desta varivel.
Ex.: Funo Func ( ref Vet : vetor, dim : inteiro ): inteiro
onde Vet um argumento do tipo vetor, passado por referncia ( isto , pelo seu endereo ) e dim um argumento
do tipo inteiro, passado por valor.
Todo algoritmo que referencia um ou mais subalgoritmos denominado de algoritmo principal com relao aos
subalgoritmos por ele referenciados. A referncia a um subalgoritmo do tipo funo dentro do algoritmo principal feita em
expresses aritmticas de forma semelhante ao uso de funes em contextos matemticos.
Com relao aos subalgoritmos do tipo funo, cabem as seguintes observaes:
1.

Um subalgoritmo do tipo funo no executvel por si s. Necessita ser ativado por uma instruo de
chamada de diferentes formas:
a)

Varivel = NomeF ( Parmetros )

b) Varivel = ( X Y3 + NomeF( Parmetros ) )/ Z


c)

Escrever a+b, b2-4ac, NomeF( Parmetros ), d-1

56

Como pode ser visto, a funo se comporta como um operando em alguma expresso , em qualquer
lugar onde podem aparecer expresses em um algoritmo.
2.

Em subalgoritmos do tipo funo, o valor calculado retornado ( na maioria das linguagens de programao )
pelo nome da funo. Isto implica na existncia, dentro do corpo da funo, de pelo menos uma instruo de
atribuio de algum valor ao nome da funo, sob pena de a funo no retornar nada.

3.

Os argumentos de definio do subalgoritmo so variveis sem efeito, servindo apenas para se fazer a
definio do subalgoritmo. Na hora da execuo eles sero substitudos pelos parmetros de chamada.

4.

Os argumentos de definio e os parmetros de chamada devem corresponder-se em nmero, tipo e na mesma


ordem.

5.

Enquanto os argumentos de definio devem ser obrigatoriamente variveis, os parmetros de chamada podem
ser expresses .

6.

Nos algoritmos ser usada, como ltima instruo de uma funo, explicitamente, a instruo Retorne. Em
algumas linguagens, a simples atribuio de um valor ao nome da funo eqivale ao Retorne.

7.

No caso de subalgoritmos do tipo funo os argumentos so todos do tipo Entrada, isto , devem ser
estabelecidos fora da funo e no podem ser modificados dentro da funo. Apenas os seus valores podem ser
usados na obteno do valor a ser retornado pela funo.

8.

Normalmente, argumentos de Entrada em funes so recebidos por valor. Nos exemplos abaixo, todos os
parmetros de chama das funes apresentadas so por valor.

Exemplo de funo com uso de variveis simples:


Seja escrever um algoritmo que l um nmero no determinado de valores m, todos inteiros e positivos, um
valor de cada vez, e, se m < 10 utiliza um subalgoritmo do tipo funo que calcula o fatorial de m, e caso contrrio,
utiliza um subalgoritmo do tipo funo para obter o nmero de divisores de m. Escrever cada m lido e seu fatorial ou seu
nmero de divisores com uma mensagem adequada.
Neste caso, temos um programa principal e dois subalgoritmos. Vamos iniciar com a definio do Programa
Principal.

Algoritmo 6.1:

Algoritmo Principal
x, m: Inteiro
Incio
Ler ( m )
Enquanto m >0 e int(m) = m
Incio
Se m < 10 ento Incio
x = Fatorial ( m )
Escrever ( m, fatorial = , x )
Fim
seno Incio
x =Numdiv ( m )
Escrever ( m, Numero de Divisores = , x )
Fim
Ler ( m )
Fim_enquanto
Fim

Neste algoritmo aparecem as referncias a dois subalgoritmos de nomes Fatorial e Numdiv, respectivamente, os
quais devem ser escritos a seguir.

57

Algoritmo 6.2 : Subalgoritmo Fatorial:

Funo Fatorial ( n: inteiro ) : inteiro


Fat, i : inteiro
Incio
Fat = 1
Para i = 2 at n
Fat = Fat x i
Fim_Para i
Fatorial = Fat
Retorne
Fim

Neste caso o argumento n uma varivel que serve apenas para se definir a funo, sendo substituda pelo
parmetro m que usado na chamada, isto , a funo calcula o fatorial de m fornecido como parmetro de chamada e no
de n usado como argumento de definio.

Algoritmo 6.3 : Subalgoritmo Numdiv:

Funo Numdiv( n: inteiro ): inteiro


i, ndiv : inteiro
Incio
ndiv =2
Para i = 2 at m/2
Se n mod i = 0 ento ndiv = ndiv + 1
Fim_Para i
Numdiv = ndiv
Retorne
Fim

Como pode ser visto, o valor calculado pela funo atribudo ao nome da funo, antes do trmino da funo.
Como o nome da funo nico, no h a possibilidade de se violar o conceito matemtico de funo, que calcula um nico
valor em funo de seus argumentos.

Exemplo 2 de funo com uso de vetor.

Escrever um algoritmo que l um vetor V(10) e o escreve. Utilize uma funo para obter o maior elemento
de V. Escreva o maior elemento encontrado com a mensagem: E o MAIOR do VETOR

58

Algoritmo Principal 6.4:

Algoritmo Principal
V(10 ): matriz de tipo inteiro
i, j, maior : inteiro
Incio
Para i = 1 at 10
Incio
Ler ( V( i ) )
Escrever ( V ( i ) )
Fim_Para i
maior = MaiorVetor ( V, 10 )
Escrever ( maior, E O MAIOR DO VETOR )
Fim

O algoritmo principal chama a funo MaiorVetor para obter o maior elemento do vetor V, a qual ser apresentada,
a seguir:

Algoritmo 6.5 : Funo Maior

Funo MaiorVetor ( Vet: vetor, m: inteiro ): inteiro


i, mai : Inteiro
Incio
mai = Vet ( 1 )
Para i = 2 at m
Se mai < Vet ( i ) ento mai = Vet ( i )
Fim_Para i
MaiorVetor = mai
Retorne
Fim

Exemplo 3 de funo com uso de matriz.

Escrever um algoritmo que l uma matriz M ( 6,6 ) e a escreve. Utilize uma funo para obter a posio do
menor elemento da diagonal principal de M. Escrever o menor elemento e sua posio na diagonal.

Algoritmo Principal 6. 6:

59

Algoritmo Principal
M( 6,6 ): Matriz de tipo inteiro
i, j, p :Inteiro
Incio
Para i = 1 at 6
Para j = 1 at 6
Incio
Ler ( M ( i, j ) )
Escrever ( M( i, j ) )
Fim_Para j
Fim_Para i
p = Posicao ( M , 6 )
Escrever ( MENOR = , M( p,p), E sua posio = , p, p )
Fim

Este algoritmo faz uso da funo Posicao para obter a posio do menor elemento da diagonal principal de uma
matriz quadrada qualquer, que ser apresentado a seguir:

Algoritmo 6.7 : Funo Posio

Funo Posicao( Mat: matriz, m: inteiro )


i, j, pos, menor : Inteiro
Incio
menor = Mat( 1, 1 )
pos = 1
Para i = 2 at m
Se menor > Mat( i, i ) ento Incio
menor = Mat ( i, i )
pos = i
Fim
Fim_Para i
Posicao = pos
Retorne
Fim

60

SUBALGORITMOS DO TIPO PROCEDIMENTO

um tipo de subalgoritmo que pode calcular e retornar uma quantidade qualquer de valores. Neste caso, os valores
calculados e que devem ser retornados figuram na lista dos argumentos de definio do subalgoritmo.

A definio deste tipo de subalgoritmo segue o padro abaixo:

Procedimento NomeP( V1:tipo, V2: tipo, ...,Vn: tipo, R1: tipo, R2: tipo, ..., Rn: tipo )
Definio de variveis locais
Incio
.......................................
.......................................
.......................................
R1 = Exp1
R2 = Exp2
.................
Rn = Expn
Fim

Nos subalgoritmos que so procedimentos existem os trs tipos de argumentos vistos anteriormente. Os argumentos
V1, V2,..., Vn, que so valores recebidos pelo procedimento, (argumentos de Entrada), mas que podem ser argumentos que
foram recebidos, modificados e retornados, ( argumentos de Entrada-Sada ), e os argumentos R1, R2, ... , Rn, que so
valores calculados pelo procedimento e devolvidos, ( argumentos de Sada ).

Com relao aos subalgoritmos do tipo procedimento, cabem as seguintes observaes:


1.

Da mesma forma que a funo, um subalgoritmo do tipo procedimento no executvel por si s. Necessita
ser ativado por uma instruo de chamada da forma
NomeP ( Parmetros )

2.

Subalgoritmos do tipo procedimento podem calcular um nmero qualquer de valores, os quais, sero
retornados atravs dos parmetros de Sada ou de Entrada-Sada.

3.

Da mesma forma que em funes, os argumentos de definio do procedimento so variveis sem efeito,
servindo apenas para se definir o procedimento. Na hora da chamada eles sero substitudos pelos parmetros
de chamada.

4.

Como em funes, os argumentos de definio e os parmetros de chamada devem corresponder-se em


nmero, tipo e na mesma ordem.

5.

Enquanto os argumentos de definio devem ser obrigatoriamente variveis, os parmetros de chamada podem
ser expresses .

Exemplo1:
Seja escrever um algoritmo que l um nmero no determinado de conjuntos de 3 valores a, b, c, no
negativos, um conjunto de cada vez, e, para cada conjunto lido, calcula as mdias aritmtica, geomtrica, harmnica
e ponderada com peso 2 para o menor valor, 3.5 para o valor intermedirio e 4.5 para o maior valor. Para cada
conjunto lido escrever os valores lidos e as mdias calculadas.

61

Algoritmo Principal 6.8

Algoritmo Principal
a, b, c, ma, mg, mh, mp: real
Incio
Ler ( a, b, c )
Enquanto a x b x c 0
Incio
Se a > 0 e b > 0 e c > 0
ento Incio
Ordena ( a, b, c )
Medias ( a, b, c, ma, mg, mh, mp, 2, 3.5, 4.5 )
Escrever ( a, b, c, ma, mg, mh, mp )
Fim
Ler (a, b, c )
Fim_enquanto
Fim

onde aparece a referncia ( chamada ) de dois procedimentos, Ordena que dever ordenar os 3 valores em ordem
crescente e Medias que calcular as 4 mdias solicitadas.
Repare no subalgoritmo Ordena abaixo a soluo para se ordenar em ordem crescente 3 valores, armazenados em
3 variveis simples. Se este problema de ordenao de valores, que um problema comum e freqente no dia a dia, fosse
tratado sempre com o uso de variveis simples, verifique quantas instrues de seleo seriam necessrias para ordenar em
ordem crescente 5 valores, por exemplo. Com isso voc descobrir facilmente porque este problema resolvido
preferencialmente com o auxlio de conjuntos ( vetores ). Isto simplifica a soluo, tornando-a independente, em tamanho,
do nmero de valores que devem ser ordenados.
No subalgoritmo Ordena todos os 3 argumentos so argumentos de Entrada- Sada, pois, os 3 valores x, y e z so
recebidos pelo subalgoritmo em uma determinada ordem, e so devolvidos, possivelmente em uma outra ordem, isto , so
valores recebidos de um jeito, modificados, e devolvidos de outro jeito.
J no subalgoritmo Medias existe uma ntida distino entre os argumentos de Entrada ( a, b, c, p1, p2, p3 ) que
so os valores recebidos pelo subalgoritmo, e os argumentos de Sada ( r1, r2, r3, r4 ), que so os valores calculados pelo
subalgoritmo.

Algoritmo 6. 9 :Subalgoritmo Ordena:


Procedimento Ordena ( x, y, z:real )
aux : real
Incio
Se x > y ento Incio
aux = x
x=y
y = aux
Fim
Se y > z ento Incio
aux = y
y=z
z = aux
Fim
Se x > y ento Incio
aux = x
x=y
y = aux
Fim
Fim.

62

Algoritmo 6.10 : Subalgoritmo Medias :

Procedimento Medias ( a, b, c, r1, r2, r3, r4, p1, p2, p3 : real)


Incio

a+b+c
3
3
r2 = axbxc
3
r3 =
1/ a + 1/ b + 1/ c
(axp1 + bxp 2 + cxp3)
r4 =
p1 + p 2 + p3
r1 =

Fim.

Exemplo 2 com uso de vetor :

Seja escrever um algoritmo que l um vetor V(10 ) e o escreve. Ordene, a seguir, o vetor V em ordem
crescente e escreva o vetor ordenado.
Algoritmo Principal 6.11

Algoritmo Principal
V(10) : vetor de tipo inteiro
Incio
LeiaVet ( V, 10 )
EscrevaVet ( V, 10 )
OrdenaVet ( V, 10 )
LeiaVet ( V, 10 )
Fim

Como pode ser visto, o algoritmo Principal no faz nada, mas manda outros fazerem o que tem que ser feito. Assim
LeiaVet, l um vetor, EscrevaVet, escreve um vetor e OrdenaVet, ordena um vetor. Embora o enunciado no explicite que
se deva usar subalgoritmos para a leitura e para a escrita do vetor, isto conveniente, pois, assim se resolve os problemas de
leitura e escrita de vetores uma nica vez, podendo reus-los nos diferentes problemas que envolvem leitura e escrita de
vetores.

Algoritmo 6.12 : Procedimento de Leitura de um Vetor:

Procedimento LeiaVet ( Vet: vetor, n: inteiro )


i : inteiro
Incio
Para i = 1 at n
Ler (Vet ( i ) )
Fim_Para i
Fim

63

Algoritmo 6.13 : Procedimento de Escrita de um Vetor:

Procedimento EscrevaVet ( Vet: vetor, n: inteiro )


i : inteiro
Incio
Para i = 1 at n
Escrever ( Vet ( i ) )
Fim_Para i
Fim

Algoritm 6.14 : Procedimento de Ordenao de um Vetor:

Procedimento OrdenaVet ( Vet: vetor, n: inteiro )


i, aux, k : inteiro
// Processo Mtodo da Bolha //
Incio
k=0
Enquanto k = 0
Incio
k=1
Para i = 1 at n-1
Se Vet ( i ) > Vet ( i + 1 )
ento Incio
aux = Vet ( i )
Vet ( i ) = Vet ( i + 1 )
Vet ( i + 1 ) = aux
k=0
Fim
Fim_Para i
Fim_enquanto
Fim

Note-se que no subalgoritmo LeiaVet o argumento Vet do tipo Sada e n do tipo Entrada. J no subalgoritmo
EscrevaVet os dois argumentos Vet e n so do tipo Entrada. No subalgoritmo OrdenaVet o argumento Vet de EntradaSada e n s de Entrada.
Exemplo 3 com uso de Matriz:

Seja escrever um algoritmo que l uma matriz M( 6, 8 ) e a escreve.


Utilize um subalgoritmo do tipo funo para obter o maior elemento da linha 4 de M.
Escreva o valor do maior elemento da linha 4 de M.
Utilize um subalgoritmo do tipo procedimento para inverter os valores da linha 2 de M. Inverter, aqui,
quer dizer, trocar o 1 com o ltimo, o 2, com o penltimo, e assim por diante, at o 4 com o 5.
Escreva a matriz modificada.
Utilize um subalgoritmo do tipo procedimento para trocar a linha 1 com a linha 5 de M.
Escreva a matriz modificada.
Utilize tambm procedimentos para a leitura e para a escrita da matriz.

64

Algoritmo Principal 6. 15

Algoritmo Principal
M(6,6) : matriz de tipo inteiro
Ma : inteiro
Incio
LeiaMat ( M, 6, 8 )
EscrevaMat ( M, 6, 8 )
ma = MaiorLinha ( M, 6, 8 , 4 )
Escrever ( ma )
InverteLinha ( M, 6, 8, 2 )
EscrevaMat ( M, 6, 8 )
TrocaLinhas ( M, 6, 8, 1, 5 )
EscrevaMat ( M, 6, 8 )
Fim

Algoritmo 6.16 : Subalgoritmo LeiaMat que l uma matriz de inteiros

Procedimento LeiaMat ( Mat: matriz, m, n: inteiro )


i, j : inteiro
Incio
Para i = 1 at m
Para j = 1 at n
Ler ( Mat ( i, j ) )
Fim_Para j
Fim_Para i
Fim

Algoritmo 6.17 : Subalgoritmo EscrevaMat que escreve uma matriz de inteiros

Procedimento EscrevaMat ( Mat: matriz, m, n : inteiro )


i, j : inteiro
Incio
Para i = 1 at m
Incio
Para j= 1 at n
Escrever ( Mat ( i, j ) )
Fim_Para j
Escrever
Fim_Para i
Fim

65

Algoritm 6 . 18 : Subalgoritmo MaiorLinha que obtm o maior elemento de uma linha.

Funo MaiorLinha ( Mat: matriz, m, n, l: inteiros ): inteiro


i, maior : inteiro
Incio
maior = Mat ( l, 1 )
Para i = 2 at n
Se maior < Mat ( l, i ) ento maior = Mat ( l, i )
Fim_Para i
MaiorLinha = maior
Retorne
Fim

Algoritmo 6.19 :Subalgoritmo InverteLinha que inverte os elementos de uma linha de uma matriz.

Procedimento InverteLinha ( Mat: matriz, m, n, l: inteiro )


aux, i : inteiro
Incio
Para i = 1 at n/2
Incio
aux = Mat ( l, i )
Mat ( l, i ) = Mat ( l, n+1-i )
Mat ( l, n+1-i ) = aux
Fim_Para i
Fim

Algoritmo 6.20 :Subalgoritmo TrocaLinhas que troca duas linhas quaisquer de uma matriz.

Procedimento TrocaLinhas ( Mat: matriz, m, n, l1, l2: inteiro )


i, aux: inteiro
Incio
Para i = 1 at n
Incio
aux = Mat ( l1, i )
Mat ( l1, i ) = Mat ( l2, i )
Mat ( l2, i ) = aux
Fim_Para i
Fim
Observaes:
1.

Nos vrios exemplos dados iniciou-se sempre com o Algoritmo Principal, passando-se em seguida para os
subalgoritmos. Esta tcnica denomina-se de TOP-DOWN. Suas principais vantagens so:
a)

Resulta em sistemas bem estruturados;

b) Pode-se fazer testes de integrao medida que os mdulos ficam prontos, sem prejuzo para os demais;
c)

Os mdulos de controle, que so, geralmente, os que exigem maior cuidado, so os mais bem testados.

66

2.

Na medida em que cada subproblema resolvido na forma de um subalgoritmo escrito de forma genrica, isto
, para resolver uma classe de problemas e no um problema particular, ganha-se um alto potencial de
reusabilidade destes mdulos.

3.

Diferentemente de funes, onde os argumentos so sempre argumentos de Entrada, em Procedimentos os


argumentos podem ser de Entrada, Sada ou Entrada-Sada.

4.

Nos exemplos apresentados at aqui, os nomes das variveis usadas como argumentos foram diferentes das
variveis usadas como parmetros, para caracterizar bem a diferena entre ambos. Contudo, nada impede que
se utilize variveis com mesmo nome. De qualquer forma, elas sero vistas pelo sistema como variveis
diferentes devido sua abrangncia. As variveis definidas no subalgoritmo tm efeito apenas local. Com isso,
podemos ter vrias variveis com mesmo nome, mas com significados diferentes em um mesmo sistema.

5.

Nos exemplos apresentados, a passagem de parmetros foi feita sempre por valor. Para evitar, em programas,
que sero executados por um computador e que ocupam espao na memria deste computador, que conjuntos
de valores, principalmente grandes, passados como parmetros, sejam duplicados quando do uso por algum
subprograma, podemos pass-los no por valor, mas sim por referncia, isto , por endereo. Neste caso, o
subprograma trabalha com ou sobre a mesma estrutura de dados do programa principal. Isto economiza
memria e tempo de processamento para efetuar cpia da estrutura de dados.

Exemplos de subalgoritmos com passagem de parmetros por referncia.

Seja escrever um algoritmo que l uma matriz M ( 6, 6 ) e a escreve. Utilize uma funo para obter a soma
dos elementos da coluna 3de M, dividida pelo maior elemento desta coluna. Escreva o valor calculado. Utilize um
procedimento para trocar entre si as duas diagonais de M e escreva a matriz assim modificada.

Neste exemplo usar-se- a passagem de parmetros por referncia em lugar de por valor. Para indicar que um
parmetro passado por referncia ser usada a seguinte notao:

Ref Nome_da_Varivel

Tcnica TOP-DOWN

Nvel 1

Alg. Principal

Nvel 2
LeiaMat

EscrevaMat

MediaColuna

TrocaDiag

EscrevaMat

Nvel 3
MaiorColuna
Nvel 1

67

Algoritmo 6.21

Algoritmo Principal
M(6,6) de tipo inteiro
Media : inteiro
Incio
LeiaMat ( M, 6, 6 )
EscrevaMat ( M , 6, 6 )
Media = MediaColuna ( M, 6, 6, 3 )
Escrever Media
TrocaDiag ( M, 6 )
EscrevaMat ( M, 6, 6 )
Fim

A tcnica Top-Down inicia sempre pelo algoritmo principal e segue, de cima para baixo, e da esquerda para a
direita. Portanto, seguem-se os subalgoritmos LeiaMat, EscrevaMat, MediaColuna, TrocaDiag, EscrevaMat e MaiorColuna
nesta ordem.

Nvel 2

Algoritmo 6.22 : Subalgoritmo LeiaMat

Procedimento LeiaMat ( ref Mat: matriz, m, n: inteiro )


i, j : inteiro
Incio
Para i = 1 at m
Para j = 1 at n
Ler ( Mat ( i, j ) )
Fim_Para j
Fim_Para i
Fim

Agoritmo 6.23 : Subalgoritmo EscrevaMat

Procedimento EscrevaMat ( ref Mat: matriz, m, n: inteiro )


i, j : inteiro
Incio
Para i = 1 at m
Incio
Para j = 1 at n
Escrever ( Mat ( i, j ) )
Fim_Para j
Escrever
Fim_Para i
Fim

68

Subalgoritmo MediaColuna

Funo MediaColuna ( ref Mat: matriz, m, n, c: inteiro ): inteiro


i, soma, med, maicol: inteiro
Incio
maicol = MaiorColuna ( Mat, m, c )
soma = 0
Para i = 1 at m
soma = soma + Mat ( i, c )
Fim_Para i
med = soma/maicol
MediaColuna = med
Retorne
Fim

Subalgoritmo TrocaDiag.

Procedimento TrocaDiag ( ref Mat: matriz, m: inteiro )


i, aux : inteiro
Incio
Para i = 1 at m
Incio
aux = Mat ( i, i )
Mat ( i, i ) = Mat ( i, m+1-i )
Mat ( i, m+1-i ) = aux
Fim_Para i
Fim
O Procedimento EscrevaMat que utilizado a seguir, j foi definido anteriormente e est sendo reutilizado j neste
sistema, dispensando uma nova definio.
Nvel 3
Subalgoritmo MaiorColuna.
Funo MaiorColuna ( ref Mat: matriz, m, c: inteiro ): inteiro
i, maior : inteiro
Incio
maior = Mat ( 1, c )
Para i = 2 at m
Se maior < Mat ( i, c ) ento maior = Mat ( i, c )
Fim_Para i
MaiorColuna = maior
Retorne
Fim

Existe uma outra tcnica, freqentemente usada na soluo de problemas grandes, subdivididos em mdulos (
subalgoritmos ), que denominada de tcnica BOTTOM-UP.
O uso desta tcnica aconselhado nos casos em que se conhece uma poro de detalhes do problema, mas no se
tem ainda uma viso do todo da soluo.
As vantagens desta tcnica so:
1.

Permitir paralelismo no desenvolvimento, diminuindo o tempo total do desenvolvimento da soluo.

69

2.

Permitir um melhor aproveitamento do pessoal disponvel, pois, existiro mdulos mais simples que podem ser
desenvolvidos por quem tem menos experincia e, mdulos mais complexos que devem ser desenvolvidos
pelos mais experientes.

3.

Como cada mdulo razoavelmente independente do resto do sistema, pode-se test-lo em separado e alm
disso, fica mais fcil fazer-se um controle da padronizao ( conjunto de regras fixadas para o
desenvolvimento de um mdulo ).

Como desvantagens desta tcnica temos:


1.

Se no houver um bom controle de padronizao, o sistema como um todo pode resultar em uma colcha de
retalhos.

2.

A integrao dos mdulos no sistema no feita, geralmente ao longo do perodo de desenvolvimento e sim no
final do processo, podendo da resultar um sistema potencialmente com mais falhas no descobertas durante o
perodo do desenvolvimento.

Exemplo usando a Tcnica Bottom-up.

Seja escrever um algoritmo que l um nmero no determinado de conjuntos de 4 valores i, a, b, c, todos


inteiros e positivos, um conjunto de cada vez, e, para cada conjunto lido:
-

Se i = 1 ento calcular o fatorial do menor entre os valores a, b, c, e escrever o menor valor e


seu fatorial.

Se i = 2 ento calcular o MDC entre a soma dos dois maiores e o menor dos 3 valores e escrever
a soma dos dois maiores, o menor e o MDC calculado.

Se i = 3 ento verificar se o menor dos 3 valores primo ou no. Escrever o menor valor e uma
mensagem dizendo se primo ou no.

Utilizar subalgoritmos para resolver os subproblemas envolvidos na soluo do todo.

Menor_abc

Nvel 1

Nvel 2

Nvel 3

Fatrial

MDC

Primo

Algoritmo Principal

Nvel 1

Como pode ser reparado na anlise do que est sendo solicitado pelo algoritmo, em cada um dos 3 casos sempre
necessrio primeiro conhecer-se qual o menor dos 3 valores a, b, c. Esta a primeira ao que chama a ateno de quem l o
enunciado do problema.

70

Subalgoritmo Menor_abc

Funo Menor_abc ( x, y, z : inteiro): inteiro


Incio
menor = x
Se menor > y ento menor = y
Se menor > z ento menor = z
Menor_abc = menor
Retorne
Fim

Nvel 2

Analisando-se um pouco mais o problema, aparecem trs aes distintas, em funo do menor dos 3 valores, o
clculo do fatorial do menor, a verificao de que o menor ou no um nmero primo e o calculo do MDC tambm em
funo do menor.

Subalgoritmo Fatorial

Funo Fatorial ( n: inteiro ): inteiro


i, fat : inteiro
Incio
fat = 1
Para i = 2 at n
Fat = fat x i
Fim_Para i
Fatorial = fat
Retorne
Fim

Subalgoritmo MDC

Funo MDC ( x, y: inteiro ): inteiro


r: inteiro
Incio
r = x mod y
Enquanto r 0
Incio
x=y
y=r
r = x mod y
Fim_enquanto
MDC = y
Retorne
Fim

71

Subalgoritmo Primo.

Funo Primo ( x: inteiro ): inteiro


i : inteiro
Incio
Primo = 1
Se x = 1 ento Retorne
Para i = 2 at x
Se mod ( x, i ) = 0 ento Incio
Primo = 2
Retorne
Fim
Fim_Para i
Retorne
Fim

Nvel 3

Algoritmo Principal

Algoritmo Principal
i, a , b, c, men, som, p, maxdiv: inteiro
Incio
Ler ( i, a b, c )
Enquanto
Enquanto i > 0 e i < 4
Incio
men = Menor_abc( a, b, c )
fat = Fatorial ( men )
Escrever ( men, fat )
som = a + b + c men
maxdiv = MDC ( som, men )
Escrever ( men, som, maxdiv )
p = Primo ( men )
Se p = 1 ento escrever ( men, E PRIMO )
seno escrever ( men, NO E PRIMO )
Ler ( i, a, b, c )
Fim_enquanto
Fim

72

QUESTIONRIO
1.

O que se entende por modularizao ?

2.

Quais as vantagens de se utilizar a modularizao ?

3.

O que se entende por argumentos em subalgoritmos ?

4.

O que so parmetros ?

5.

Quais as diferenas mais significativas entre argumentos e parmetros ?

6.

Qual a diferena entre um parmetro passado por valor e um parmetro passado por referncia ?

7.

Quais as principais diferenas entre funes e procedimentos ou subrotinas ?

8.

Qual a diferena entre uma varivel global e uma varivel local ?

9.

Quais os 3 tipos de argumentos em um subalgoritmo ?

10. Qual a diferena entre a chamada de uma funo e a chamada de um procedimento ?

EXERCCIOS
1.

Escrever um algoritmo que l dois vetores X( 10 ) e V( 15 ) e os escreve. Ordene, a seguir, os vetores X e V


em ordem crescente e os escreva novamente. Crie, em seguida um vetor Y( 25 ) contendo todos os valores
pares de X e V. Escreva o vetor assim formado. Ordene o vetor Y em ordem decrescente e o escreva
novamente. Utilize os subalgoritmos de leitura, escrita e ordenao em ordem crescente j apresentados
anteriormente e escreva os restantes subalgoritmos necessrios para a soluo do problema. Utilize a tcnica
TOP-DOWN.

2.

Escreva um procedimento que recebe um vetor Vet , sua dimenso e o tipo de ordenao que se quer ( ordem
crescente ou descrescente) e devolve o vetor ordenado de acordo com o desejado.

3.

Escrever um subalgoritmo que recebe um vetor X, seu nmero de elementos e um parmetro P que indica a
forma de criao de um vetor Y partir de X. Se P = 1 ento criar Y com os elementos pares de X. Se P = 2
ento criar Y com os elementos mpares de X. Se p > 2 ou P < 0 ento criar Y com todos os elementos nulos.
Devolver o vetor Y criado.

4.

Escrever um algoritmo que l um vetor V ( 12 ) e o escreve. Encontre, a seguir, o menor elemento entre V(1),
V(2) e V(3) e o escreva. Verifique, em seguida, se os valores V(4), V(5) e V(6) formam ou no um tringulo.
Se formarem tringulo calcular e escrever a rea deste tringulo. Caso contrrio escrever Os valores , V(4),
V(5), V(6), no formam tringulo. Calcular, depois, a mdia ponderada de V(7), V(8) e V(9) com pesos
respectivos de 4.0 para o maior dos 3 valores e peso 3.0 para os outros dois. Escreva a mdia com a mensagem
APROVADO ou REPROVADO conforme a mdia calculada seja maior ou igual a 5.0 ou menor do que
5.0. Para finalizar, calcule o fatorial de cada um dos valores V(10), V(11) e V(12) e escreva os valores e seus
fatoriais. Utilizar funes ou procedimentos j definidos ou por definir. Os subalgoritmos definidos
especialmente para este problema devem ser apresentados. Utilize a tcnica BOTTOM-UP.

5.

O subalgoritmo abaixo do tipo funo, podendo, pois, calcular um nico valor.


Funo PRIMO ( x: inteiro ): inteiro
x, prim,i : inteiro
Incio
prim = 1
Se x 1 e x 2
Ento Para i = 2 at x
Se x mod i = 0 ento prim = 2
Fim_Para i
PRIMO = prim
Retorne
Fim

Este subalgoritmo retorna 1 se x primo e 2 se x no primo. Modifique este subalgoritmo de forma que ele
retorne, alm da informao de que x ou no primo, tambm o nmero de divisores de x, sem que deixe de ser do
tipo funo.
73

6.

Escrever um subalgoritmo de nome TROCA que recebe como parmetros x, y, z, e p, onde x, y, z so 3


valores reais quaisquer e p um parmetro que indica o que deve ser feito com os 3 valores x, y, e z. Se p = 1
ento o procedimento deve trocar entre si os valores de x e y. Se p = 2 deve trocar entre si os valores de x e z.
Se p = 3 deve trocar entre si os valores de y e z.

7.

Escrever um algoritmo que l um nmero mpar entre 1 e 20 e utiliza um procedimento para gerar o quadrado
mgico com a dimenso do nmero lido. Vide descrio do que um quadrado mgico no exerccio 60 do
captulo V.

8.

Escrever um algoritmo que l um valor A e um vetor V(30) e escreve o vetor lido. Conte, a seguir, quantos
valores iguais a A esto em V e escreva esta informao. Utilize subalgoritmo do tipo funo para obter esta
informao. Crie, em seguida, um vetor X contendo todos os elementos de V que so diferentes de A,
utilizando um subalgoritmo do tipo procedimento. Escreva o vetor X criado.

9.

Dado o algoritmo abaixo, que efetua a soma dos elementos de uma matriz M (5, 5 ) que se encontram acima da
diagonal secundria:
Funo Soma ( ref Mat: matriz, m: inteiro ) : inteiro
i, j, s : inteiro
Incio
s=0
Para i = 1 at 4
Para j = 1 at 5-i
s = s + Mat(i, j )
Fim_Para j
Fim_Para i
Soma = s
Retorne
Fim

Modifique esta funo de modo que faa a soma dos elementos que esto acima da diagonal secundria de
qualquer matriz com quaisquer dimenses, isto , torne a funo genrica.

10. Dado o algoritmo principal abaixo, escreva os subalgoritmos ORDENA1 e ORDENA2, sabendo que
ORDENA1 utiliza o mtodo da Bolha e ORDENA2, descobre o maior do conjunto e o troca com a ltima
posio, encontra o maior dos restantes e o troca com a penltima posio, e assim por diante.
Algoritmo Principal
V(100) : vetor do tipo inteiro
Incio
Ler m, n
LeiaVet ( V, n )
EscrevaVet ( V, n )
Se n > 50 e m = 1 ento ORDENA1( V, n )
seno ORDENA2 ( V, n )
EscrevaVet ( V, n )
Fim

11. Uma matriz quadrada dita simtrica se para todo i e j, o elemento ( i, j ) sempre igual ao elemento ( j, i ).
Escrever um subalgoritmo do tipo funo que recebe uma matriz Mat e sua dimenso e verifica se esta matriz
ou no simtrica.
12. O produto escalar de dois vetores A e B de comprimento n dado por:

A .B

n
i = 1

AiBi

74

Escrever um subalgoritmo do tipo funo que recebe os vetores A e B e sua Dimenso n e retorna o produto
escalar de A por B.
13. Escrever um subalgoritmo que recebe um vetor V que pode ter elementos em duplicata e altera o vetor
recebido, substituindo os elementos repetidos por 0, retornando o vetor modificado e o nmero de
modificaes feitas. Substituir por 0 somente a segunda, terceira, etc, ocorrncias de valores repetidos.
14. Escrever um algoritmo que l dois vetores X e Y e chama o subalgoritmo do exerccio 12 para calcular o
produto escalar de X .Y. Se o produto escalar de dois vetores zero, os vetores so ditos ortogonais. Se o valor
retornado for diferente de zero, escrev-lo com a mensagem Produto escalar de X por Y. Caso contrrio
escrever a mensagem: Os vetores X e Y so ortogonais.
15. Escrever um algoritmo que l um nmero no identificado de valores inteiros de 5 dgitos cada um e utilize
uma funo para obter o dgito de controle deste nmero ( dgito de controle = soma de cada um dos 5 dgitos
multiplicados da esquerda para a direita respectivamente por 2, 3, 5 ,7,9 e dividido por 11 ). Utilize um
procedimento que recebe o nmero lido e o devolve acrescido do dgito de controle ( direita ) O programa
deve escrever o valor lido e o valor acrescido de seu dgito de controle.
16. Escrever uma funo que recebe um nmero para o qual o dgito mais da direita representa o dgito de
controle, calculado da forma do exerccio anterior, e devolve verdadeiro se o nmero vlido e falso se o
nmero no confere.
17. Escrever um algoritmo que l um nmero no identificado de valores n, todos inteiros e positivos, um por vez,
e, para cada n lido chama uma funo que verifica se n um nmero perfeito ou no. Escrever o nmero lido e
uma mensagem adequada.
18. Escrever um algoritmo que l 50 conjuntos de 10 valores cada, contendo as seguintes informaes:
Na posio 1 : o nmero do aluno
Na posio 2 : a nota da prova 1
Na posio 3 : a nota da prova 2
Na posio 4 : a nota da prova 3
Na posio 5 : a mdia dos exerccios
Na posio 6 : o peso da prova 1
Na posio 7 : o peso da prova 2
Na posio 8 : o peso da prova 3
Na posio 9 : o peso dos exerccios
Na posio 10: a freqncia do aluno
Utilize uma funo para obter a mdia geral do aluno.
Se a freqncia < 75 ento escrever o nmero do aluno, sua mdia geral e a mensagem Reprovado por Falta
de Freqncia
Se a freqncia > 75 e media geral 7 ento escrever o nmero do aluno, sua mdia geral e a mensagem
Aprovado por mdia.
Se a freqncia > 75 e a media geral < 7 e > 4 ento escrever o nmero do aluno, sua mdia geral e a
mensagem Aluno em Exame
Se a freqncia > 75 e mdia geral < 4 ento escrever o nmero do aluno, sua mdia geral e a mensagem
Aluno reprovado por falta de aproveitamento.
19. Escrever um algoritmo que l um nmero qualquer de valores n, todos inteiros e positivos, um valor por vez, e,
para cada n lido utilize um procedimento para gerar e escrever a tabuada de 1 at 10 de n.
20. Escrever um algoritmo que l dois vetores X e Y, cada um com 10 elementos e utiliza um procedimento para
criar o vetor Z que seja a unio de X com Y. Escrever o vetor unio assim criado.
21. O mesmo que o exerccio anterior, com a diferena de que o vetor Z criado deve ser a interseo de X com Y.
22. Escrever uma funo que recebe um vetor e sua dimenso. O vetor contm um nmero binrio, um dgito por
posio. A funo deve retornar o nmero decimal equivalente ao nmero binrio do vetor.
23. Escrever um procedimento que recebe um nmero real positivo e devolve as suas partes, inteira e real em
variveis separadas.
75

24. Uma editora avalia a vantagem de editar ou no um livro, utilizando o custo de produo acrescido de 30%. Se
este valor ficar abaixo de 40,00 para cada 100 pginas que o livro tiver, sua publicao economicamente
vivel, caso contrrio, no vivel. Construa um algoritmo que l um conjunto no determinado de conjuntos
de valores, cada conjunto constitudo por: cdigo de identificao do livro, custo fixo de um livro para a
editora, nmero de exemplares estimado e nmero de pginas do livro. Para cada conjunto lido utilize uma
funo para obter o custo de produo:
Custo de produo = custo fixo + nmero de exemplares x nmero de pginas x 0.030
Utilizar um procedimento que verifica se a publicao do livro examinado economicamente vivel. Se for
retorna um valor 1, caso contrrio, retorna zero.
Escrever os cdigos dos livros cuja publicao tiver sido considerada econmica de acordo com os critrios da
editora.
25. Escrever um procedimento que recebe duas matrizes: A(m,k ) e B (k,n ) e retorna a matriz produto C ( m,n ).
26. Goldbach fez uma conjetura ( que no foi provada, mas exaustivamente testada sem encontrar contra-exemplo)
de que qualquer nmero par maior do que 2 a soma de dois nmeros primos. Escreva um programa que gera
os nmeros pares entre 100 e 200 e utiliza um procedimento para encontrar os dois nmeros primos que
somados do origem ao nmero examinado. Escrever o nmero par e os dois nmeros primos cuja soma
igual ao nmero par escrito.
27. Escrever um procedimento que recebe o gabarito da LOTO e uma aposta ( com no mximo 10 dezenas ) e
devolve o nmero de pontos da aposta.
28. Escrever uma funo que recebe como parmetros o dia, o ms e o ano e devolve o nmero de dias deste ano
at a data fornecida. Lembre-se que Fevereiro pode ter 28 ou 29 dias conforme o ano for ou no um ano
bissexto. Um ano bissexto sempre divisvel por 4.
29. Escreva um procedimento que recebe um nmero inteiro de no mximo 4 dgitos e devolve os dgitos
separadamente em 4 variveis.
30. Escreva uma funo que recebe 4 valores, cada um de um dgito e devolve um nmero inteiro formado por
estes 4 dgitos na ordem inversa em que foram fornecidos, desprezando zeros esquerda.
31. Escrever um algoritmo que l um nmero qualquer de valores n, todos inteiros e positivos com n 9999 e
utiliza o procedimento da questo 29 e a funo da questo 30 para descobrir se n um nmero capicua.
Capicua um nmero que lido da esquerda para a direita ou da direita para a esquerda o mesmo. Escrever os
nmeros lidos que so capicuas.
32. Escrever um procedimento que recebe um valor inteiro n e devolve um vetor contendo os divisores de n , bem
como uma varivel contendo o nmero destes divisores.
33. Escrever um algoritmo que l um valor n inteiro e gera valores inteiros de 1 at n. Para cada valor gerado
utilize uma funo para obter o nmero de divisores do valor gerado. Escrever uma tabela contendo os valores
gerados e seu nmero de divisores, contando o 1 e o prprio nmero.

76

CAPTULO VII

ALGORITMOS RECURSIVOS

Iterar humano, a recurso divina


L. Peter Deutsch

Um objeto dito recursivo se estiver definido em termos de si prprio. A recursividade uma outra forma de se
resolver problemas iterativos. A idia que est por trs da recursividade a velha estratgia de dividir para conquistar, isto
:

O problema reduzido a um comjunto de problemas menores de mesma natureza e que, portanto, podem usar
a mesma soluo;

Os problemas menores, se ainda no triviais, podem ser reduzidos a outros problemas menores ainda at que se
tornem de soluo trivial;

As solues dos vrios subproblemas so combinadas dando origem, desta forma, soluo do problema
original.

Isto implica na verificao de trs condies:

1.

Existe uma forma de se resolver o problema se ele for menor ?

2.

possvel dividir-se o problema dado em subproblemas mais simples e de mesma natureza ?

3.

A combinao das solues dos subproblemas soluciona satisfatoriamente o problema original ?

Se estas trs condies se verificam pode-se resolver o problema usando recursividade.


As solues recursivas so, geralmente, mais concisas do que as suas equivalentes iterativas, mas exigem que se
conhea todos os elementos importantes deste tipo de soluo, a saber :
1.

Condio de Trmino. O subalgoritmo recursivo inicia sempre com um teste que verifica se j foi alcanado
o subproblema mais simples, cuja soluo trivial. Se este for o caso, o subproblema trivial solucionado e o
subalgoritmo termina a sua execuo.

2.

Diviso. Sempre que o problema atual no for ainda um problema to simples que tenha uma soluo trivial,
divide-se o problema em subproblemas mais simples e de mesma natureza. Isto feito por meio de uma
chamada recursiva com os parmetros do problema atual.

3.

Combinao. Os resultados dos diferentes subproblemas so combinados, podendo envolver o uso de


operaes de adio, multiplicao ou outras, para a obteno da soluo do problema original.

A recursividade pode ser encontrada, no apenas na matemtica, mas em muitas aes do dia a dia. Alguns
exemplos so:

1.

Andar
( a ) Dar um passo;
( b ) Dar um passo e Andar o resto do Caminho.

77

2.

Dizer um Discurso
( a ) Dizer uma frase;
( b ) Dizer uma frase e Dizer o resto do Discurso.

3.

Ler um Livro
( a ) Ler uma pgina;
( b ) Ler uma pgina e Ler o resto do Livro.

4.

Examinar Lista
( a ) Examinar um elemento;
( b ) Examinar um elemento e Examinar Lista restante.

5.

Descendente
( a ) Filho ou Filha;
( b ) Descendente de Filho ou Filha.

6.

Lista
( a ) Nada;
( b ) Elemento seguido de Lista.

7.

Nmeros Naturais
( a ) 0 um nmero Natural;
( b ) O sucessor de um nmero Natural um nmero Natural.

8.

Funo Fatorial para Inteiros positivos


( a ) Fat ( 0 ) = 1;
( b ) Fat ( n ) = n * Fat ( n 1 ).

Segundo a Teoria da Computabilidade, existe soluo para um problema, se ele puder ser enunciado de forma
recursiva. Esta , pois, a maneira natural ( no necessariamente a mais eficiente ) de se formular um problema e o
modo mais simples de se entender os mecanismos de sua soluo. O uso da recursividade se relaciona, em geral,
com uma generalizao do problema, no sentido de controlar mais do que apenas o resultado que se espera obter,
mas tambm o mecanismo de obteno deste resultado.
O poder da recurso deve-se ao fato de se conseguir, por seu intermdio, definir conjuntos infinitos por
meio de formulaes finitas. O uso da recursividade particularmente recomendado quando a funo ou o
procedimento ou ainda a estrutura de dados a serem processados j esto definidos de forma recursiva.
Um procedimento P pode ser diretamente recursivo quando este procedimento contm uma referncia
explcita a si mesmo, ou, indiretamente recursivo quando P referencia um procedimento Q que por sua vez contm
uma referncia direta ou indireta a P. Logo, a simples inspeo do cdigo pode dificultar a identificao de um
procedimento recursivo.
Da mesma forma que em procedimentos repetitivos, nos procedimentos recursivos existe o problema da
terminao dos clculos, que deve ser cuidado.

78

Nas aplicaes prticas com uso de recurso importante mostrar que o nvel mais profundo de recurso
seja no apenas finito, mas bem finito. Caso contrrio, o algoritmo, alm de ficar pouco eficiente pode ainda
estourar o espao de memria, pois, cada nova chamada ativa novas variveis locais e alm disso, o estado do
processamento tambm deve ser guardado para garantir um retorno correto aps a chamada.

Considere-se a soma dos n nmeros inteiros positivos:

Soma = 1 + 2 + 3 + . . . + n-2 + n-1 + n


ou
Soma( n ) = n + n-1 + n-2 + ... + 3 + 2 + 1

A recursividade procura reduzir um problema qualquer a outro problema de soluo mais fcil do que o
anterior, de uma forma sucessiva at que o problema restante se torne um problema trivial.

1.

Soma ( n ) = n + Soma ( n-1 )

2.

Soma ( n ) = n + n-1 + Soma ( n-2 )

n-1 Soma ( n ) = n + n-1 + n-2 + ... + 3 + 2 + Soma ( 1 )


n

Soma ( n ) = n + n-1 + n-2 + ... + 3 + 2 + 1

No passo 1 o problema consistia da soma de n nmeros inteiros. No passo 2 o problema j se resume a


uma operao elementar de soma do valor n com a soma dos n-1 inteiros restantes, e assim sucessivamente at o
passo n-1 onde se tem a soma de n + n-1 + n-2 + ... + 3 + 2 com a Soma de 1 inteiro restante.

Colocando-se este problema na forma de definio de problemas recursivos usada acima, tem-se:

Soma dos n inteiros


( a ) Soma ( n ) = 1, se n = 1;
( b ) Soma ( n ) = n + Soma ( n-1 ), se n > 1.

Seja o algoritmo principal abaixo:


Algoritmo Principal
n, s : inteiro
Incio
Ler ( n )
s = Soma ( n )
Escrever ( s )
Fim

Escrevendo-se a funo Soma de forma recursiva:

79

Funo Soma ( n: inteiro ): inteiro


Incio
Se n = 1 ento Soma = 1
seno Soma = n + Soma ( n-1 )
Retorne
Fim

Para entender os algoritmos recursivos o principal problema saber para onde deve ser retornado o
resultado aps a finalizao de uma chamada recursiva. Supondo que o valor lido para n seja 5, seguem-se as
seguintes chamadas e respectivos retornos:
Soma ( 5 )

5 + Soma ( 4 )

5 + 4 + Soma ( 3 )

5 + 4 + 3 + Soma ( 2 )

5 + 4 + 3 + 2 + Soma(1)

Os retornos acontecero da seguinte forma:


Retorno 1 para a funo

Soma = 1

Retorno 2 para a funo

Soma = 1 + 2 = 3

Retorno 3 para a funo

Soma = 3 + 3 = 6

Retorno 4 para a funo

Soma = 6 + 4 = 10

Retorno 5 para o Alg. Princ.

Soma = 10 + 5 = 15

Outros exemplos:

Fatorial de n
( a ) Fat ( n ) = 1 , se n = 0 ou n = 1
( b ) Fat ( n ) = n x Fat ( n 1 ), se n > 1

Funo que calcula o fatorial de n de forma recursiva:

Funo FatRecursivo ( n:inteiro ) : inteiro


Incio
Se n = 0 ou n = 1 ento FatRecursivo = 1
seno FatRecursivo = n x FatRecursivo ( n-1 )
Retorne
Fim

Se em lugar de escrever uma funo recursiva para clculo do fatorial se quisesse um procedimento recursivo para
clculo do fatorial a soluo seria:

80

Procedimento FatRecursivo ( n, fat : inteiro )


Incio
Se n = 0 ou n = 1 ento fat = 1
seno Incio
FatRecursivo ( n-1, fat )
Fat = fat x n
Fim
Fim

Seja escrever um algoritmo que utiliza um procedimento recursivo para gerar o Tringulo de Pascal de
ordem n, onde n lido. Escrever o tringulo gerado.

Algoritmo Principal
T( 20,20 ) : matriz de tipo inteiro
i, j, n : inteiro
Incio
Ler ( n )
TriangPascal ( n )
Para i = 1 at n
Para j = 1 at n
Escrever ( T( i, j ) )
Fim _Para j
Escrever
Fim_Para i
Fim

Procedimento recursivo que gera o Tringulo de Pascal:

Procedimento TriangPascal ( n : inteiro )


i : inteiro
Incio
T ( n, 1 ) = 1 || Primeira coluna sempre 1 ||
Se n > 1 ento TriangPascal ( n-1 ) || Gera as n-1 primeiras linhas ||
T ( n, n ) = 1
|| O ltimo da linha sempre 1 ||
Se n > 2 ento Para i = 2 at n-1
T( n, i ) = T ( n-1, i-1 ) + T( n-1, i )
Fim_Para i
Fim

Escrever uma funo recursiva para calcular a raiz quadrada de X com uma aproximao inicial A e erro
menor do que E, utilizando o mtodo de Newton com X0 = A e, retornando o valor da raiz calculada

81

Funo RaizQuadrada ( X,A,E : real ): real


B : real
Incio
B=(AxA+X)/(2xA)
|| Calcula Nova Aproximao ||
Se | B A | < E
|| Verifica Limite de Erro
||
Ento RaizQuadrada = B
|| A Aproximao est boa ||
Seno RaizQuadrada = RaizQuadrada ( X, B, E )
Retorne
Fim

82

EXERCCIOS

1.

Escrever um algoritmo que l um nmero no determinado de valores m, todos inteiros e positivos e, de forma
recursiva, verifica se o valor m lido ou no primo, escrevendo-o com uma mensagem adequada.

2. Escrever uma funo recursiva Potncia ( X, Y ), onde X e Y so argumentos inteiros e positivos, retornando X
elevado a Y, usando a seguinte definio:
( a ) Potncia ( X, Y ) = X, se Y = 1
( b ) Potncia ( X, Y ) = X x Potncia ( X, Y 1 )
3. Escrever uma funo recursiva para obter o termo de ordem N da Srie de Fibonacci ( 1,1,2,3,5,8,13,21,34,...),
onde Fibonacci ( N ) definido como:
( a ) Fibonacci ( N ) = 1 , se N = 1 ou N = 2;
( b ) Fibonacci ( N ) = Fibonacci ( N-1 ) + Fibonacci ( N-2 ), se N > 2.
4.
Escrever um procedimento que recebe um vetor Vet por referncia juntamente com sua dimenso n, e ordena,
usando recursividade, o vetor Vet em ordem crescente. ( Encontrar o ndice do menor elemento e trocar o menor com o
primeiro elemento, em seguida encontrar o menor do conjunto restante e troc-lo com o segundo elemento, etc., at
ordenar o vetor ).
5.
Escrever uma funo inteira e recursiva PesqBin( X, Vet, I, K ) para localizar X em um vetor Vet no intervalo
Vet( I ) a Vet ( K ) e retorna a posio do elemento X, se existir, ou retorna o negativo da posio I recebida.
6. Escrever uma funo inteira e recursiva PesqLin( X, V, K ) que localiza X no intervalo V ( K ) at V ( N ) por
pesquisa linear, retornando a posio do primeiro elemento igual a X ou 1 se no encontrar X em V.
7.
Escrever um procedimento recursivo InverterVet( Vet, I, K ) que inverte o vetor Vet trocando entre si as posies
Vet ( I ) e Vet ( K ), Vet ( I + 1) e Vet ( K 1 ), e assim por diante at completar a inverso.
8.
Escrever uma funo inteira recursisva Menor( Vet, K, L ) que obtm o menor valor entre os K ltimos elementos
de Vet e o valor L fornecido como argumento, isto , acha o mnimo entre Vet ( K ), Vet ( K+1), ..., Vet ( N ) e L.
9.
Escrever uma funo recursiva real Acumula( Vet, K ) que soma os K ltimos elementos de Vet, isto , soma os
elementos de Vet ( K ) at Vet ( N ) retornando esta soma.
10. Escrever um procedimento recursivo Transposta( Mat, K ), onde Mat uma matriz NxN e K indica partir de que
ndice as sub-matrizes devem ser transpostas.
11.

A funo de Ackerman definida da seguinte forma:

A ( m, n ) =

n+1

se m = 0

A ( n-1, 1 )

se m 0 e n = 0

A ( m-1, A ( m, n-1 )

se m 0 e n 0

Utilize para o teste desta funo valores pequenos para m e n.


12.

Escrever um procedimento recursivo para ler um vetor V ( 20 )

13.

Escrever uma funo recursiva para encontrar o maior elemento de um vetor V ( 30 ).

83

CAPTULO VIII

ALGORITMOS DE MANIPULAO DE CARACTERES

O tipo caractere consiste de um s dado desse tipo. Na maioria das vezes quando se trabalha com caracteres temse manipulaes de dados formados por uma seqncia de caracteres, tais como: nomes, endereos, ttulos de livros, frases
ou textos.
Nas implementaes de algoritmos de manipulao de caracteres nas diferentes linguagens de programao bvio
que deve haver uma preocupao com a forma de armazenamento desse tipo de dados no computador. No haver,
inicialmente, nvel de algoritmos este tipo de preocupao. Supe-se aqui que a cada varivel corresponda um espao
suficiente para guardar cada um de seus possveis valores.
O tipo seq ( seqncia ) permite construir uma estrutura de dados cujos elementos so colees de objetos ( dados
bsicos ), sem qualquer limitao no seu tamanho, exceto o de ser finito.
O formato de definio de uma seqncia :

Seq : tipo

Logo, pode-se definir esse tipo de dado, denominado de Cadeia de Caracteres ( String em Ingls ) da seguinte
forma:
Tipo Cadeia : seqncia de caracteres
Constantes desse tipo sero escritas da seguinte forma:
a, b, valor, Joao da Silva, ,
onde o ltimo exemplo representa uma cadeia vazia e o penltimo representa uma cadeia formada unicamente pelo
caractere branco.
Num tipo construdo pelo mecanismo seq temos as seguintes operaes primitivas que so comuns sobre cadeias
de caracteres:

Concatenao de duas ou mais cadeias : operao concat


Ex.: X = NACIONAL
INTER concat X

INTERNACIONAL

Primeiro de uma cadeia de caracteres : operao prim


Ex.: X = INTERNACIONAL
Y = prim X

Y = I

Remover o primeiro elemento da cadeia : operao rem


Ex.: T = VIRADA
T = rem T

T = IRADA

Estas operaes sero consideradas operaes primitivas, assim como o so, por exemplo, as operaes + e -
sobre dados do tipo inteiro.
Outras operaes so interessantes e teis quando se trabalha com cadeias de caracteres.

Eis alguns exemplos de operaes construdas com o uso das operaes primitivas apresentadas:

Contagem do nmero de caracteres de uma cadeia.

84

Funo Comprimento ( c: cadeia ) : inteiro


i : inteiro
c1 : cadeia
Incio
i=0
c1 = c
Enquanto c1 || Se c1 diferente de cadeia vazia ||
Incio
c1 = rem c1
i=i+1
Fim_enquanto
Comprimento = i
Retorne
Fim

Obter uma Subcadeia partir de uma cadeia c, iniciando na posio p e com comprimento m.

Funo Subcadeia ( c: cadeia, p, m : inteiro ) : cadeia


i : inteiro
c1, c2 : cadeia
Incio
Se m = 0 ento Subcadeia =
seno Incio
c1 = c
c2 =
Se p > 1 ento Para i = 1 at p-1
c1 = rem c1
Fim_Para i
Para i = 1 at m
Se c1 = ento escrever erro
seno Incio
c2 = c2 concat prim c1
c1 = rem c1
Fim
Fim_Para i
Retorne
Fim

Esta funo elimina da cadeia c todos os caracteres anteriores posio p que indica o incio da subcadeia
desejada. Em seguida, pega caractere por caractere at completar os m caracteres pretendidos e os concatena em c2.
A varivel c1 usada para manter uma cpia de c enquanto a varivel c2 utilizada para armazenar a subcadeia
que est sendo construda.

Obter a Posio inicial de uma subcadeia dentro de uma cadeia

Embora tambm pudesse ser escrita na forma de uma funo, esta operao ser exemplificada atravs da
construo de um procedimento.
O procedimento recebe uma cadeia c, uma cadeia s que se supe seja uma subcadeia de c e retorna um parmetro p
contendo 0 caso a subcadeia s no seja encontrada em c ou retorna a posio inicial partir da qual a subcadeia s
foi encontrada em c se ela a existir. Neste subalgoritmo tambm sero usadas variveis auxiliares do tipo cadeia.

85

Assim a varivel c1 ser uma cpia de c. As variveis c2 e c3 sero usadas durante a repetio para materem
respectivamente cpias de c1 e de s j que c1 e s sero usadas para percorrer as respectivas cadeias durante a busca.
Procedimento PosioSubCadeia( c, s : cadeia, p : inteiro )
i : inteiro
c1, c2, c3 : cadeia
Incio
Se s = ento p = 0
|| Situao em que s vazio ||
seno Incio
c1 = c
i=1
Enquanto c1
Incio
Se prim c1 = prim s
ento Incio
c2 = rem c1
c3 = rem s
Enquanto c2
Incio
Se c3 =
ento p = i
seno Se prim c2 = prim c3
ento Incio
c2 = rem c2
c3 = rem c3
Fim
seno Escape || Sada do enquanto mais interno ||
Fim_enquanto
Se c3 = ento p = i || Sucesso ||
Fim
C1 = rem c1
i=i+1
Fim_enquanto
Fim
p = 0 || Insucesso ||
Fim

IMPLEMENTAO DE CADEIAS DE CARACTERES USANDO VETORES


Uma cadeia de caracteres muitas vezes implementada como um vetor. Neste caso, cada posio do vetor pode
conter um ou mais caracteres. Para se dimensionar adequadamente o vetor precisa-se saber o nmero n de
caracteres da cadeia e o nmero m de caracteres que podem ser armazenados em cada posio do vetor. Assim np
(nmero de posies do vetor ) ser definido como:
np = n/m ( menor inteiro maior ou igual a n/m )
No caso de se poder armazenar mais do que um caractere por posio h necessidade de uma operao que permita
deslocar um caractere para a primeira ou a ltima posio dentro do espao ocupado por cada elemento do vetor.
Como as linguagens de alto nvel, normalmente no tm uma operao deste tipo, usar-se- exemplos de vetores
nos quais somente um caractere armazenado em cada posio.
Em muitos casos, ao dimensionar o vetor no se tem conhecimento do comprimento de todas as cadeias que
possam vir a ser armazenadas neste vetor. Por exemplo, se as cadeias a serem armazenadas forem nomes com
tamanhos diferentes interessante dimensionar o vetor de forma a comportar qualquer nome, independente de seu
tamanho. Nestes casos, o final da cadeia pode ser indicado por um caractere especial, no pertencente cadeia,
como por exemplo: #.
Assim, se for armazenado o nome JOO DA SILVA num vetor V( 16 ) tem-se:

J O O

D A

S I L V A #

86

EXERCCIOS

1.

Escrever uma funo que recebe uma cadeia c e a devolve invertida.


Ex.: Se c = ACENOS o procedimento deve retornar SONECA.

2.

Escrever uma funo NumOcor ( cad : cadeia, c : caractere ) que recebe uma cadeia cad e um caractere c e
retorna o nmero de ocorrncias do caractere c na cadeia cad.
Ex.: Se cad = INTERNACIONAL
ento NumOcor ( cad, I )
NumOcor ( cad, N )

3.

2
3

Escrever um procedimento UltimoCar que recebe uma cadeia c e sem utilizar a funo SubCadeia, devolve o
ltimo caractere da cadeia c.
Ex.: Se c = GREMIO
ento UltimoCar ( c ) = O

4.

Escrever um procedimento MenosUltimo que recebe uma cadeia c, e que no faa uso da funo SubCadeia
devolva a cadeia c sem o ltimo caractere.
Ex.: Se c = IDENTIDADE
ento MenosUltimo ( c ) = IDENTIDAD

5.

Escrever um procedimento RetiraSubCadeia que recebe uma cadeia cad, a posio inicial P da subcadeia a
ser retirada e N o comprimento desta subcadeia e devolve cad sem a subcadeia especificada.
Ex.: Se cad = ALGORITMOS, P = 1 e N = 4 ento RetiraSubCadeia ( cad, P, N ) = RITMOS

6.

Escrever um procedimento SubstitueCarac que recebe duas cadeias cad1 e cad2, P um inteiro positivo que
indica a posio inicial partir da qual ser feita a substituio de caracteres e N que indica o nmero de
caracteres de cad1 que sero substitudos por caracteres de cad2.
Ex.: Se cad1 = INFORMAO e,
cad2 = TERNO
P=3
N=4
ento SubstitueCarac ( cad1, cad2, P, N ) = INTERNAO
Se cad1 = INFORMA e cad2 = ERNO, P = 4 e N = 4 ento SubstitueCarac ( cad1, cad2, P, N ) =
INFERNO

7.

Sabendo-se que num texto pode ocorrer o caractere , como sinal de pontuao ou como vrgula decimal entre
dgitos numricos. A vrgula ser vrgula decimal somente nos casos em que for seguida imediatamente por
um dgito. Escrever um procedimento para trocar as vrgulas decimais por . ( ponto decimal ) no texto
abaixo, supostamente lido.
Jos ganha 12,64 reais por hora. Como trabalha 40 horas semanais, se no tiver faltas, recebe um
salrio mensal de 505,60 reais

8.

Escrever um algoritmo que l n ( tamanho do nome ), um nome de tamanho n para um vetor Nome ( 40 ) e um
caractere a ser pesquisado. Os caracteres do nome so armazenados, um caractere por posio. Ao final da
leitura deve ser colocado o caractere # que indica o fim do nome, se o mesmo no ocupar as 40 posies. O
algoritmo deve usar uma funo PesquisaVet que verifica se o caractere lido est ou no no vetor Nome.

9.

Escrever um algoritmo que l 10 conjuntos de valores, cada conjunto constitudo de n ( nmero de caracteres
do nome a ser lido ), do nome e de um sobrenome. Usando um procedimento deve verificar, para cada nome
lido, se o sobrenome tambm lido pertence ou no a este nome. Se for encontrado deve retornar a posio
inicial e final dentro do nome, os quais sero escritos pelo algoritmo principal. Caso contrrio, deve retornar 0
para os dois valores e o algoritmo principal escrever a mensagem adequada.

10. Escrever um algoritmo que l para uma matriz 10 x 50 um texto. Em seguida l 5 palavras, uma de cada vez, e,
para cada palavra lida, conta quantas vezes ela aparece no texto, escrevendo a palavra lida e o seu nmero de
ocorrncias no texto.

87

CAPTULO IX

REGISTROS

Vetores, Matrizes e Conjuntos so estruturas de dados homogneos, isto , podem conter colees de dados de
mesmo tipo ( todos inteiros, todos reais, todos caracteres ). A diferena entre um vetor e um conjunto est apenas no fato de
que um vetor pode ter dados repetidos e um conjunto no.
Na vida real encontramos muitas situaes onde temos colees de dados que so de tipos diferentes. Como
exemplos temos: uma ficha de cadastro de um funcionrio, uma cdula de identidade, uma inscrio em um concurso, etc.
Numa ficha de cadastro de um funcionrio temos dados, tais como, nome do funcionrio, endereo, nmero de
dependentes, salrio, funo, entre outros.
Pode-se notar que estes diversos dados so de tipos diferentes. Assim, nome, endereo e funo, so do tipo
caractere, nmero de dependentes do tipo inteiro e salrio do tipo real.
Para agrupar-se estes dados no servem os vetores, conjuntos ou matrizes. H necessidade de um outro tipo de
estrutura de dados que ser denominado de registro.
Registro , portanto, uma coleo de dados heterogneos, isto , de tipos diferentes.
A Declarao deste tipo de estrutura de dados ser feita da seguinte forma:

Nome = Registro
Campo 1: tipo
Campo 2: tipo
.
.
.
Campo n: tipo
Fim_Registro

Onde Nome o nome do tipo de Registro que est sendo definido.


Campo 1, Campo 2, ..., Campo n representam os nomes de cada um dos campos do Registro.
Tipo representa qualquer tipo bsico ou tipo anteriormente definido.
Portanto, a estrutura de dados representada pela ficha do funcionrio pode ser representada por uma estrutura do
tipo Registro, e sua definio :

Ficha = Registro
Nome(30)

: Caractere

Endereo(20)

: Caractere

Num_Dep

: Inteiro

Salrio

: Real

Funo(10)

: Caractere

Fim_Registro

O exemplo mostra Ficha como sendo um modelo de um Registro ao qual est associada uma rea de memria de
nome Ficha, capaz de conter as 5 subdivises constitudas por Nome, Endereo, Num_Dep, Salrio e Funo.
Neste caso, supondo que um tipo inteiro necessite de duas posies de memria, um tipo real de quatro posies e
um tipo caractere de uma posio, a memria reservada para o Registro Ficha de 66 posies.
A referncia, por exemplo, ao nome do funcionrio e ao nmero de dependentes, neste caso ser feita da seguinte
forma:
88

Ficha.Nome
Ficha.Num_Dep
Onde o nome do campo est ligado ao nome do Registro pelo caractere . ( ponto ).

Suponha que a Ficha contenha mais um dado: Data de Admisso.


Neste caso a especificao da Ficha poderia ser:

Ficha = Registro
Nome(30)

: Caractere

Endereo(20) : Caractere
Num_Dep

: Inteiro

Salrio

: Real

Data_Adm = Registro
Dia

: Inteiro

Ms

: Inteiro

Ano

: Inteiro

Fim_Registro
Funo(10)

: Caractere

Fim_Registro

Neste caso, o campo Data definido como uma nova estrutura do tipo Registro. Para referenciar o ano da data de
admisso tem-se:

Ficha.Data.Ano

Uma das principais utilidades do uso de Registros a referenciao genrica do conjunto de dados, como ocorre
com vetores e matrizes.
Assim podemos ler ou escrever todos os dados da Ficha de uma s vez utilizando arquivos ou fazer outras
referncias genricas :

Ler ( Arq, Ficha )


Escrever (Arq, Ficha )
Cadastro = Ficha ( que atribui a uma outra estrutura do tipo Registro a estrutura Ficha )

Registro de Vetores

Suponha que em um formulrio de cadastramento de candidatos uma eleio, as informaes que devem ser
preenchidas sejam as seguintes:
Nome do Candidato.
Endereo do Candidato.
Partido ao qual Pertence.
Cargo ao qual concorre.
Nmero de votos obtidos em eleies anteriores.
89

Este formulrio poderia ser definido da seguinte forma:

Formulrio = Registro
Nome(30)

: Caractere

Ender(30)

: Caractere

Partido(30)

: Caractere

Cargo(10)

: Caractere

Num_Votos(5) : Inteiro
Fim_Registro

Ou a definio poderia tambm ter sido feita desta outra forma:

Conjunto1 = vetor( 30 ) de Caractere


Conjunto2 = vetor( 10 ) de Caractere
Conjunto3 = vetor ( 5 ) de Inteiro
Formulrio = Registro
Nome

: Conjunto1

Ender

: Conjunto1

Partido

: Conjunto1

Cargo

: Conjunto2

Num_Votos

: Conjunto3

Fim_Registro

No caso do Nmero de votos, consideram-se apenas as 5 ltimas eleies, de sorte que Num_votos( 5 )
corresponde ltima eleio, Num_Votos ( 4 ) penltima, e assim por diante. Se o candidato no participou de alguma
eleio registra-se 1.
Como os campos do Registro so do tipo Vetor, diz-se que este Registro um Registro de Vetores. Pode-se falar
em Registro de Vetores mesmo que nem todos os campos do Registro sejam vetores.
A manipulao de Registros de Vetores obedece s regras de manipulao de cada uma das estruturas de dados
utilizadas. Assim, para referenciar o partido do candidato usa-se:

Formulrio.Partido

Para referenciar a quantidade de votos obtidos pelo candidato na antepenltima eleio usa-se:

Formulrio.Num_Votos( 3 )

Vetor de Registros

Voltando ao exemplo da empresa que utiliza uma ficha para registrar as informaes sobre o funcionrio. Como a
empresa, normalmente, no tem apenas um funcionrio, mas vrios, tambm existiro vrias fichas de funcionrios, uma
para cada funcionrio. Isto nos leva a uma estrutura de dados composta, do tipo Vetor de Registros.
Na hiptese de uma empresa possuir 30 funcionrios, cada um com a sua ficha de informaes, esta situao
poderia ser definida como segue:
90

Ficha = Registro
Nome (30 )

: Caractere

Ender (30 )

: Caractere

Num_Dep

: Inteiro

Salrio

: Real

Funo( 10 ) : Caractere
Fim_Registro

Cadastro = Vetor ( 30 ) de Ficha

Neste exemplo, para poder definir Cadastro como um vetor de Ficha necessrio definir primeiro o tipo Ficha.
Para referenciar-se o nome do oitavo candidato cadastrado, a referncia seria a seguinte:

Cadastro ( 8 ).Nome

Exemplo 1
Construir um algoritmo, que, para cada rapaz identifica o grau de afinidade deste rapaz com cada uma das
5 candidatas que se apresentaram como interessadas. O algoritmo deve ler um conjunto no determinado de
registros, cada um contendo: cdigo ( 0 para rapaz e 1,2,3,4,5 para cada uma das 5 candidatas ), nome do
rapaz ou menina e vetor de respostas contendo as repostas s 25 questes ( 1 para SIM, 2 para NO e 3 para
Indiferente ). O trmino da leitura de registros se dar quando for lido um cdigo 1.
A cada registro de rapaz seguem-se 5 registros de meninas. O algoritmo deve verificar para cada rapaz, qual
a menina que tem mais afinidade com ele, escrevendo o nome do rapaz , o nome da menina e o grau de
afinidade entre eles.
O grau de afinidade obtido pelo nmero de respostas coincidentes s 25 perguntas. Para fins de seleo das
candidatas o algoritmo escolher a menina com nmero mais alto de respostas coincidentes. Em caso de
empate no grau mais alto, deve escrever todos os nomes de meninas e respectivos graus.
O formato de cada Registro tanto de rapaz quanto de menina o seguinte:
Cdigo: _______________
Nome: ______________________________________________________________________
Respostas:

Algoritmo Compatibilidade

C( 5 ) : vetor de Inteiro
Conjunto = Registro
Cdigo

: Inteiro

Nome ( 30 )

: Caractere

Vet_Resp ( 25 ) : Inteiro
Fim_Registro
Conj(5) : vetor de Conjunto
91

Aux

: Conjunto

i, j, k : Inteiro
Incio
Ler ( Conjunto.Codigo )
Ler ( Conjunto.Nome)
Para i = 1 at 25
Ler ( Conjunto.Vet_Resp(i) )
Fim_Para i
Aux = Conjunto
Enquanto Conjunto. Cdigo 
Para i = 1 at 5
Ler ( Conj(i).Codigo )
Ler ( Conj(i).Nome )
Para i1 = 1 at 25
Ler ( Conj (i ).Vet_Resp( i1 ) )
Fim_Para i1
C(i)=0
Para j = 1 at 25
Se Aux. Vet_Resp ( j ) = Conjunto. Vet_Resp ( j ) ento C ( i ) = C ( i ) + 1
Fim_Para j
Fim_Para i
Maior = C ( 1 )
Para k = 2 at 5
Se Maior < C ( k ) ento Maior = C ( k )
Fim_Para k
Escrever ( Aux. Nome )
Para k = 1 at 5
Se Maior = C ( k ) ento escrever ( Conj( k ). Nome, C ( k ) )
Fim_Para k
Ler ( Conjunto.Codigo )
Ler ( Conjunto.Nome )
Para k = 1 at 25
Ler ( Conjunto.Vet_Resp ( k ) )
Fim_Para k
Aux = Conjunto
Fim_ enquanto
Fim

Segue, abaixo, a verso deste algoritmo em Pascal usando subconjunto do Delphi :

92

{apptype = console }
program Compatibilidade;
uses
Forms;
Type vetor=array[1..5]of integer;
vetor1=array[1..25] of integer;
vetor2=array[1..30] of String;
Registro=Record
Codigo :Integer;
Nome

:vetor2;

Vet_Resp :vetor1;
End;
vetor3= array[1..5] of Registro;
Var Aux,Conjunto : Registro;
C

: vetor;

i,j,k,Maior,i1 :Integer;
Conj

: vetor3;

begin
Readln ( Conjunto.Codigo);
Readln ( Conjunto.Nome[30]);
For i:= 1 to 25 do
Readln (Conjunto.Vet_Resp[i]);
Aux := Conjunto;
While Conjunto.Codigo <> -1
do Begin
For i:=1 to 5 do
Begin
Readln ( Conj[i].Codigo);
Readln ( Conj[i].Nome[30]);
For i1:= 1 to 25 do
Readln (Conj[i].Vet_Resp[i1]);
C [ i ] :=0;
For j:= 1 to 25 do
if Aux.Vet_Resp[j] = Conj[i].Vet_Resp[j]
then C[i]:=C[i] + 1 ;
End;
Maior:= C[1];
For k:= 2 to 5 do
if Maior < c[k] then Maior:= C[k];
write ( Aux.Nome[30], ' '); writeln;
For k:= 1 to 5 do

93

if Maior = C[k] then write( Conj[k].Nome[30],' ',C[k]);


Readln ( Conjunto.Codigo);
Readln ( Conjunto.Nome[30]);
For i:= 1 to 25 do
Readln (Conjunto.Vet_Resp[i]);
Aux:= Conjunto;
end;
end.
Segue uma verso do mesmo algoritmo em C
Compatibilidade.cpp
#include <stdio.h>
#include <conio.h>
void main()
{
struct Registro
{
int Codigo;
char Nome[30];
int Vet_Resp[25];
} Aux, Conjunto, Conj[5];
int C[5], i, j, k, i1, Maior;
scanf(%d, &Conjunto.Codigo); fflush(stdin);
gets ( Conjunto.Nome );
for ( i=0; i<25; i++)
{
fflush(stdin);
scanf ( %d, &Conjunto.Vet_Resp[i]);
}
Aux = Conjunto;
While ( Conjunto.Codigo != -1 )
{
for ( i=0; i < 25; i++ )
{
scanf( %d, &Conj[i].Codigo );
fflush(stdin);
gets ( Conj[i].Nome );
for ( j = 0; j < 25; j++ )
{
fflush(stdin);
scanf( %d, &Conj[i].Vet_Resp[j] );
}

94

C[i] = 0;
For ( i1 = 0; i1 < 25; i1++ )
If ( Aux.Vet_Resp[ i1 ] == Conj[ i ]. Vet_Resp[ i1 ] ) C[i] = C[i] + 1;
}
Maior = C[0];
For ( k = 1; k < 5; k++ )
If ( Maior < C[k] ) Maior = C[k];
Printf (%s\n, Aux.Nome );
For ( k = 0; k < 5; k++ )
If ( Maior == C[k] ) printf (%s

%d\n, Conj[k].Nome, C[k] );

fflush(stdin);
scanf (%d, &Conjunto.Codigo );
fflush( stdin );
gets ( Conjunto.Nome );
for ( i = 0; i < 25; i++ )
{
fflush( stdin );
scanf (%d, &Conjunto.Vet_Resp[i] );
}
Aux = Conjunto;
}
}

95

EXERCCIOS

1.

Considere um bilhete de Passagem de nibus conforme mostrado abaixo:

VIAO OURO E PRATA


Nmero:________

Nome da Empresa:___________________________

Origem:__________________

Destino:___________________________________

Data: _____/_____/_____

Horrio: _______:_______

Assento: ________

Distncia ________km

Valor da Passagem: _________________________


a)

Defina uma estrutura de dados de nome Passagem.

b) Considerando um nibus de 48 assentos, defina um Vetor de Passagens

2.

Defina, baseado em seus conhecimentos, um registro contendo os dados de um Cheque Bancrio.

3.

A Biblioteca de Informtica de uma Faculdade possui 2000 volumes, pertencentes a duas reas: informtica e
administrao. So 1200 ttulos da rea de informtica e 800 ttulos da rea de administrao. Como h
previso de expanso da biblioteca, respectivamente para 1500 ttulos de informtica e 1000 ttulos de
administrao, os respectivos vetores j so definidos com estes tamanhos. Para a catalogao dos livros
utilizada uma ficha com as seguintes informaes:
Cdigo do Livro:_______________________

rea:____________________

Ttulo do Livro: _____________________________________________________


Autor: _____________________________________________________________
Editora:__________________

a)

Ano:_______

Num. Exemplares:_________

Escrever um algoritmo que l as informaes necessrias para cada obra disponvel na biblioteca reunindo-as
em dois vetores: INF(1500) e ADM(1000).

b) Elaborar um procedimento que recebe os vetores INF e ADM, suas dimenses e um cdigo de livro e escreve
as informaes referentes ao livro cujo cdigo foi fornecido ou escreve uma mensagem dizendo que o cdigo
fornecido no foi encontrado.
c)

Escrever uma funo que recebe os vetores INF e ADM, suas dimenses e um cdigo de livro e devolve 1 se o
livro da rea de informtica e 0 se for da rea de administrao.

d) Escrever uma funo que recebe os vetores INF e ADM, suas dimenses e um cdigo de livro e devolve o
nmero de exemplares deste livro.
e)

Escrever um procedimento que recebe os vetores INF e ADM, suas dimenses e um ano e lista todas as
informaes existentes sobre os livros editados neste ano.

f)

Escrever um procedimento para inserir novos livros na biblioteca. O procedimento recebe os vetores INF e
ADM, bem como as informaes sobre o livro que deve ser inserido, alterando o respectivo vetor inserindo
nele as informaes deste novo livro. Se a insero ocorreu com sucesso, escrever o nome do vetor, sua
posio e as informaes inseridas. Caso falte espao, escrever a mensagem: Sem espao para inserir as
informaes no vetor XXX.

96

4.

Suponha que o DETRAN queira informatizar o controle de veculos de uma dada cidade que possui um total
de 6000 veculos. O registro das informaes sobre os veculos feito em uma ficha conforme modelo abaixo:
DETRAN CADASTRO DE VECULOS
Tipo de Veculo: _______________________________
Modelo: _____________________

Marca: _________________________

Cor: _______________

Chassi:__________________

Proprietrio: ______________________________________________________________________
Combustvel: _________________

Placa: _________

Ano: _________

Onde Tipo de Veculo: passeio, utilitrio, caminho ou nibus;


Marca : Wolkswagen, Chevrolet, Ford, Fiat, Outro Nacional, Importado;
Combustvel: gasolina, lcool ou diesel
Placa: 3 letras e quatro dgitos
Considere que estas informaes j esto cadastradas em um vetor de Registros denominado CVA(6000).

a)

Escreva um procedimento que recebe um ano de fabricao um tipo e um combustvel e lista todos os
proprietrios cujos carros tenham ano de fabricao maior ou igual ao ano fornecido, que sejam do tipo
igual ao que foi fornecido e que utilizem o mesmo combustvel fornecido.

b) Escrever um procedimento que recebe uma letra e um dgito e lista todos os proprietrios cujos veculos
tenham como primeira letra da placa a letra fornecida e como ltimo dgito da placa o dgito fornecido.
c)

Escrever uma funo que recebe uma marca de carro, uma cor de carro, as duas primeiras letras da placa e
os dois primeiros dgitos da placa e verifica se existe algum carro com estas caractersticas, devolvendo o
nmero do chassi.

d) Escrever um procedimento que recebe o nmero de um chassi e lista as restantes informaes sobre
aquele carro, se for encontrado algum carro com este nmero de chassi. Caso contrrio, escreva a
mensagem: Chassi inexistente.

5.

Uma Companhia de Turismo para fazer reservas de passagens entra com os dados cadastrais de cada
passageiro conforme ficha abaixo:
COMPANHIA DE TURISMO SIRIUS LTDA
Nome: _______________________________________________________

Idade: ________

Endereo: _____________________________________________________________________
Vo: __________________

tipo: ________________________

Ms: _________

Preo Base: __________________________

O sistema fornece o valor a ser pago de acordo com as seguintes regras:


1.

Se a idade do passageiro for maior ou igual a 65 ou menor do que 10 haver 20% de desconto sobre o
preo base;

2.

Se o ms da viagem for de baixa temporada ( maro, abril, maio, junho, setembro ou outubro ) h um
desconto de mais 30% sobre o preo anterior.

Escrever um algoritmo que, para cada passageiro lido, escreve o nome do passageiro, seu vo e o valor a ser
pago.
97

6.

Supondo que para o exerccio anterior o pagamento seja feito por cheque, contendo as seguintes informaes:
CHEQUE BANCO COOPERATIVA SA
Banco:_______ Agncia: ________

Nmero do Cheque:_________________

Nmero da Conta: _______________________DC: __


Data: ___/___/___

Valor: ______________

Local: ____________________________

Nome: _______________________________________________________________

a)

Construir um procedimento para a leitura destas informaes.

b) Construir uma funo para verificar a correo da conta, verificando o DC e retornando 0 ou 1 conforme a
conta estiver ou no correta.
c)

7.

Incluir no algoritmo da questo 5 a chamada do procedimento e da funo e acrescentar na escrita a


mensagem: pago com cheque:,xxxxxx, do Banco:, xxxxx.

A CBF, como todos os anos vem fazendo, credenciou 500 jornalistas esportivos de todo o pas, para fazer a
eleio do melhor jogador e do melhor time do Campeonato Brasileiro do ano. Cada jornalista recebe a lista
dos 24 times e dos 22 jogadores de cada time. Cada jornalista credenciado indica o que considera o melhor
time e o melhor jogador do Campeonato no ano. Os votos de cada jornalista compreendem doi nomes, um de
time e outro de jogador e sero lidos.

a)

Apresente as estruturas de dados necessrias soluo deste problema.

b) Escreva um algoritmo que l os dados ( times e jogadores ) e escreve uma lista que ser entregue a cada
jornalista. Em seguida, l os votos de cada jornalista e emite um relatrio com o resultado da eleio.

8.

Escreva um algoritmo que soluciona o problema do preenchimento das vagas nos 5 cursos de um Centro
Universitrio. Cada candidato que prestou o Vestibular na instituio gerou um registro com os seguintes
campos: nmero de inscrio, mdia geral obtida no Vestibular e cdigo do curso para o qual se candidatou.
Cada um dos 5 cursos oferecidos pelo Centro Universitrio possui 50 vagas. O algoritmo deve ler os registros
dos vestibulandos e distribu-los pelos 5 cursos de acordo com a mdia obtida e do curso escolhido. Em caso
de empate na mdia, ser privilegiado o aluno com menor nmero de inscrio ( o primeiro que se inscreveu )
se este empate ocorrer na ltima vaga de um curso. O final de dados ser indicado por um nmero de inscrio
negativo.

9.

A Agncia Aproxima SA pretende implantar um sistema de controle de cadastro de seus clientes e descobrir
afinidades entre os clientes. O algoritmo deve, basicamente, ter as seguintes operaes:
a)

Um procedimento CadastraNovoCliente que inclui os dados de um novo cliente. No podero existir dois
clientes com mesmo nome.

b) Um procedimento AtualizaDadosCliente que altera dados de um cliente, exceto o seu nome.


c)

Um procedimento RemoveCliente que retira um cliente do cadastro.

d) Um procedimento ListaCadastro que lista todas as informaes de todos os clientes da empresa. Devem
ser construdos pelo menos 3 outros procedimentos para se obter listagens especficas por critrios, tais
como, sexo, idade, data de nascimento.
e)

Um procedimento InformaDadosCadastrais que lista as informaes de um determinado cliente.

f)

Um procedimento ListaClientesCompatveis que lista, para um determinado cliente, outros clientes que
tm afinidades com ele.

98

Para cada cliente so cadastradas as seguintes informaes: nome, telefone, sexo, idade, data de nascimento e
interesses pessoais ( Artes, Msica, Tipos de Literatura, Teatro, Cinema, Esportes, Poltica, Lazer, Culinria,
Turismo, Festas, Religio ). Cada cliente deve informar de 3( mnimo ) a 5 (mximo ) reas de interesse,
numeradas na ordem de apresentao.
O critrio para definir se duas pessoas so ou no compatveis envolve:
-

Sexos diferentes;

Diferena de idade no superior a 10 anos;

Possuir pelo menos 3 reas de interesse em comum.

99

CAPTULO X

CORREO E OUTRAS QUALIDADES DE UM ALGORITMO

A correo uma qualidade diferente das demais que podem ser consideradas com relao a um algoritmo.
Enquanto as outras qualidades so relativas, isto , podem ser mais importantes em alguns algoritmos e menos em outros, a
correo condio para que o algoritmo tenha sentido de existncia.
As outras qualidades podem interessar em um grau maior em algum algoritmo e em um grau menor em outros,
enquanto a correo uma qualidade absoluta. S interessa um algoritmo 100% correto.
As fontes mais freqentes de erros em algoritmos so as falhas humanas, que se manifestam no somente na lgica
incorreta ou na ausncia de elementos importantes, mas tambm na simples transcrio errnea e em outros erros ou
esquecimentos banais.
Na construo de um algoritmo h, pois, uma hierarquia de consideraes a fazer:

1.

CORREO
O algoritmo deve resolver correta e completamente o problema do usurio.

Como os mecanismos para se provar a correo de um algoritmo ainda no esto disponveis ou seu uso
economicamente invivel e no inspiram confiana, a questo passa a ser, como garantir a construo de
algoritmos que sejam corretos ?
A tarefa de provar a correo de um algoritmo, assim como de um programa, ainda uma tarefa complicada,
trabalhosa e, em muitos casos, impossvel de ser realizada.
Assim, para garantir que todas as providncias razoveis e disponveis tenham sido tomadas deve-se, pelo
menos, adotar as seguintes prticas:

2.

Utilizar a tcnica da modularizao dos problemas de sorte a obter subproblemas menores, menos
complexos, com menor nmero de variveis e com poucos caminhos de controle ( caminhos do incio
ao fim do algoritmo ). Como um problema menor, menos complexo mais facilmente bem
compreendido, muito mais provvel que se consiga escrever uma soluo que atenda os requisitos
pretendidos;

Fazer-se uma verificao intuitiva da correo, antes de cada novo particionamento do problema em
subproblemas, isto , deve-se parar, analisar, verificar consistncia, completude e adequao do que
est sendo produzido. Se necessrio obter a opinio e colaborao de terceiros;

Fazer uma anlise para descobrir quais os dados mais significativos ao contexto do problema, os mais
utilizados por quem vai usar a soluo. Aplicar testes suficientes para garantir, pelo menos, que o
algoritmo produz os resultados esperados para os dados que representam o uso mais comum e
freqente.

EFETIVIDADE ou EFICCIA
Diz respeito capacidade de o algoritmo chegar a um resultado em um tempo hbil.

3.

EFICINCIA E CLAREZA
Deve faz-lo da forma mais econmica possvel tanto do ponto de vista da mquina quanto do ponto de vista
das pessoas que vo us-lo ( possivelmente com adaptaes ). O algoritmo mais eficiente aquele que obtm o
resultado desejado com a melhor relao custo/benefcio.
Clareza se refere capacidade de o algoritmo expressar as aes que devem ser realizadas sem que haja
ambigidades.

4.

GENERALIDADE E ADAPTABILIDADE
Servir como soluo para uma classe de problemas e no somente para um problema especfico. Prever, tanto
quanto possvel a necessidade de futuras adaptaes estando preparado para aceit-las sem grandes
dificuldades.

100

FORMAS DE MELHORIA DA EFICINCIA DE UM ALGORITMO

A primeira preocupao com a construo de qualquer algoritmo constru-los corretos, pois, sem esta qualidade
as outras perdem a sua razo de ser. Depois de se ter um algoritmo correto pode-se pensar em melhorar-lhe a
eficincia. Algumas cuidados na melhoria da eficincia de um algoritmo so, a seguir, apresentadas:

a) Efetuar os clculos que no so afetados pela repetio, fora da repetio.

Exemplo:

Algoritmo Exemplo
m, n, i : inteiro
x, y, z, k : real
Incio
Ler ( m, n )
Para i = 1 at 5
Incio
x = m/2
y=nx2
z=

m+n
2

Para k = x at y inc z
Escrever ( k/i )
Fim_Para k
Fim_Para i
Fim

Como os clculos de x, y e z que interessam para a variao de k no dependem do valor de i, podem ser
feitos uma nica vez antes de entrar na primeira repetio e no 5 vezes como acontece no exemplo acima.

Assim temos a nova verso melhorada com relao eficincia como segue abaixo:

Algoritmo Exemplo
m,n,i : inteiro
x, y, z, k : real
Incio
Ler ( m, n )
x = m/2
y=nx2
z=

m+n
2

Para i = 1 at 5
Para k = x at y inc z
Escrever ( k/i )
Fim_Para k
Fim_Para i
Fim

101

b) Evitar de calcular a mesma expresso vrias vezes sem necessidade.

Exemplo:

Algoritmo Equao Grau 2


a, b, c, x1, x2 : real
Incio
Ler ( a, b, c )
Enquanto a 0
Incio
Se b2 - 4ac 0
ento Incio
x1 =

b + b 2 4ac
2a

x2 =

b b 2 4ac
2a

Escrever ( x1, x2 )
Fim
Ler ( a, b, c )
Fim_enquanto
Fim

A expresso b2 4ac neste caso calculada 3 vezes quando poderamos calcul-la uma nica vez como
mostrado na verso a seguir:

Algoritmo Equao Grau 2


a, b, c, d, x1, x2 : real
Incio
Ler ( a, b, c )
Enquanto a 0
Incio
d = b2 4ac
Se d 0 ento Incio

b+ d
2a
b d
x2 =
2a
x1 =

Escrever ( x1, x2 )
Fim
Ler ( a, b, c )
Fim_enquanto
Fim

Obs.: Eficincia se refere tanto maior velocidade do processamento quanto ao menor uso de espao de memria.
Geralmente estas duas eficincias so conflitantes. Conseguimos maior velocidade de processamento s custas de
um uso de mais memria e quando tentamos economizar memria, geralmente, aumentamos o tempo de
processamento.
102

c)

No esgotar um Loop quando no for necessrio.

Exemplo:

Algoritmo Verifica Primo


m, i, c : inteiro
Incio
Ler ( m )
Enquanto m > 0
Incio
c=2
Para i = 2 at m
Se m mod i = 0 ento c = c + 1
Fim_Para i
Se c = 2 ento escrever ( m , E PRIMO )
seno escrever ( m, NO E PRIMO )
Ler ( m )
Fim_enquanto
Fim

Como neste problema se deseja apenas saber se o m lido Primo ou no, no h necessidade de esgotar-se
todo o Loop. Ao primeiro divisor encontrado no intervalo de 2 at a raiz quadrada de m j se sabe que m no
primo.

Verso melhorada do algoritmo Verifica Primo

Algoritmo Verifica Primo


m, i, c : inteiro
Incio
Ler ( m )
Enquanto m > 0
Incio
c=2
i=2
Enquanto c = 2
Incio
Se m mod i = 0 ento c = c + 1
i=i+1
Fim_enquanto
Se c = 2 ento escrever ( m, E PRIMO )
seno escrever ( m, NO E PRIMO )
Ler (m )
Fim_enquanto
Fim

103

d) No examinar condies desnecessrias.


Exemplo:

Algoritmo Conta Intervalos


m, c1, c2, c3, c4 : inteiro
Incio
Ler ( m )
Enquanto m > 0
Incio
Se m > 0 e m 10 ento c1 = c1 + 1
Se m > 10 e m 25 ento c2 = c2 + 1
Se m > 25 e m 50 ento c3 = c3 + 1
Se m > 50 e m 75 ento c4 = c4 + 1
Ler m
Fim_enquanto
Escrever ( c1, c2, c3, c4 )
Fim
Soluo melhorada do algoritmo Conta Intervalos.

Algoritmo Conta Intervalo


m, c1, c2, c3, c4 : inteiro
Incio
c1=c2=c3=c4=0
Ler ( m )
Enquanto m > 0
Incio
Se m > 50 e m 75
ento c4 = c4 + 1
seno Se m > 25
ento c3 = c3 + 1
seno Se m > 10
ento c2 = c2 + 1
seno c1 = c1 + 1
Ler m
Fim_enquanto
Escrever ( c1, c2, c3, c4 )
Fim
Os algoritmos acima ambos fazem a mesma coisa, isto , lem um nmero qualquer de valores m e
verificam quantos deles esto em cada um dos seguintes intervalos (0, 10], (10, 25], ( 25, 50] e ( 50, 75]. Na
primeira verso deste algoritmo so examinadas 4 condies duplas para cada valor de m lido. Na verso
melhorada, se m estiver no quarto intervalo examinada apenas uma condio dupla. No pior caso so examinadas
uma condio dupla e duas simples. Se a quantidade de valores m lidos for pequena, isto naturalmente no muito
significativo, mas para um nmero muito grande de valores examinados isto vai fazer diferena.

e)

Escolher mtodos mais eficientes quando existem vrias opes.

Tomando como exemplo a ordenao de um conjunto em ordem crescente. Se o conjunto que tivermos for
pequeno, no vale pena preocupar-se com o uso de um algoritmo mais eficiente, pois, para conjuntos pequenos
todos eles tero desempenhos semelhantes. Pode at acontecer que o algoritmo mais eficiente na teoria, para um
determinado caso prtico, seja menos eficiente que outro que teoricamente pior. Contudo, em conjuntos grandes a
diferena pode tambm ser bem grande.

104

APNDICE A

TRADUO DE ALGORITMOS PARA PASCAL

I Constantes em PASCAL
As constantes em PASCAL podem ser de trs tipos bsicos: Numricas, Lgicas e Literais.
Numricas:
a)

inteiras : 120, +561, -240

b) reais:
b.1) Notao Comum : 12.35, -.5, +5.
b.2) Notao Cientfica : 1.2E2, -0.56E-5, +1.78E+11

Lgicas :
As constantes lgicas so duas : true e false.

Literais:
qualquer conjunto de caracteres colocado entre apstofos.
Ex.: Joo da Silva, X100(-.#Ab, 120,
O ltimo representa o caractere apstrofo quando se quer us-lo como parte da constante literal.

II Variveis em PASCAL

Varivel o nome dado a uma localizao de memria na qual possvel armazenar-se o valor de uma
constante.
Em PASCAL as regras de formao dos nomes de variveis so as seguintes:
1.

O primeiro caractere do nome deve ser uma letra de A at Z, maiscula ou minscula, pois, a maioria
dos Compiladores PASCAL no fazem distino entre letra maiscula e minscula;

2.

Os demais caracteres, se houver, devem ser letras ou dgitos ou o smbolo de quebra _.

3.

O nmero de caracteres do nome da varivel no limitado. Contudo, em algumas implementaes o


Compilador s reconhece at o caractere 63. Os demais caracteres so ignorados.

Portanto, so nomes de variveis vlidos em PASCAL :


A
x
a1
valor_de_variavel
d12
No so vlidos, por exemplo:
Media aritmtica

( no so aceitos espaos em branco no nome de uma varivel )

( apenas letras ou dgitos so aceitos )

5a

( o primeiro caractere do nome deve ser letra )

A1.5

( ponto no nem letra e nem dgito )

105

III Expresses em PASCAL

Antes de mostrar a traduo de algumas expresses aritmticas para PASCAL importante chamar a
ateno para alguns pontos:

1.

Quando existir numerador ou denominador de frao que no seja simples, isto , que envolve uma ou
mais operaes, na traduo para PASCAL este numerador ou denominador deve ser colocado entre
parnteses;

2.

O PASCAL no usa colchetes ou chaves em expresses aritmticas como elementos de agrupamento


de operaes, portanto, estes smbolos se aparecerem devem ser substitudos por parnteses, podendose ter vrios nveis de parnteses;

3.

Na matemtica, em muitas ocasies, os operadores podem ficar implcitos. Em PASCAL nenhum


operador pode ficar implcito.

4.

Os operadores aritmticos em PASCAL so os apresentados abaixo:


4.1. Adio
4.2. Subtrao
4.3. Multiplicao
4.4. Diviso
4.5. Quociente inteiro da diviso
4.6. Resto inteiro da diviso

+
*
/
div
mod

5.

O operador de atribuio em PASCAL o :=

6.

Operaes para as quais no h operadores so resolvidas por meio de funes, das quais as mais
usuais j esto pr-definidas. No caso do PASCAL, as principais funes pr-definidas so :

quadrado de X
LN ( X ) logaritmo natural de X
EXP ( X ) exponencial de X
ABS ( X ) valor absoluto de X
SQRT(X) raiz quadrada de X
TRUNC(X) trunca o valor de X
ROUND(X) arredonda o valor de X
SIN ( X ) seno de X
COS ( X ) cosseno de X
TAN ( X ) tangente de X
SQR ( X )

7.

tipo real ou inteiro


tipo real
tipo real
tipo real ou inteiro
tipo real
tipo inteiro
tipo inteiro
tipo real
tipo real
tipo real

Os operadores relacionais em PASCAL so os seguintes:


=
<
>

=
<
>
>=
<=
<>

106

8.

Os operadores lgicos em PASCAL so os abaixo listados:

no
e
ou
9.

not
and
or

A prioridade dos operadores em PASCAL a seguinte:


1) Funes
2) *, /, div, mod, and
3) +, -, or
4) =, <>, <=, <, >, >=
5) :=
6) Parnteses podem alterar esta ordem.
7) Da esquerda para a direita em caso de indeterminao.

Exemplos de expresses aritmticas e sua traduo para PASCAL:


x=

a 2bc
a
+ 2
2
b +5

X:= (SQR(A)*B*C)/2 + A/ ( SQR(B) + 5);

m = (a + b 2 )[( x + y 3 ) 2 w] + d 1
M:= ( A + SQR ( B )) * ( SQR ( X + SQR (Y ) * Y) W ) + D 1;

d=

a b +1

D := SQRT ( SQRT ( ABS ( A B ))) + 1;


x = sen2x + cos x2 1

X := SQR ( SIN ( X )) + COS ( SQR ( X )) 1;

y=

a mn
+
b n +1

Y := A/B + ( M-N )/ ( N + 1 );

IV Linguagem algoritmica x Linguagem PASCAL

Definio de variveis:
m, n, i : inteiro
a, b, c : real
v1, v2 : lgico
nome, ender : literal

var m, n, i : integer;
var a, b, c : real;
var v1, v2 : boolean;
var nome, ender : char;
107

Type Vetor = array[1..10] of integer;

V(10): vetor de inteiro

V: Vetor;

Type Matriz = array[1..5,1..5] of real;

M(5,5) : matriz de real

M : Matriz;

Type Registro = Record

Empregado Registro
Nome(30): Literal

Nome: string[30];

Idade : Inteiro

Idade: Integer;

Salrio: Real

Salario: Real;

Fim_Registro

end;
Var Empregado : Registro;

Definio de comandos:

Fim

End. ( final de Programa )


Ou
End; ( final de bloco )

Ler ( a, b, c )

Read ( a, b, c );

Escrever ( x, y, (x+y)/3, Resultado)

Write ( x, y, ( x+y)/3, Resultado );

x=5

x := 5;

d = b2-4ac

d := Sqr ( b ) 4 * a * c ;

Se x 0 e y = 1 ento ler ( a, b, c )

If (x <> 0) and ( y = 1) then Read ( a, b, c );

Se b2-4ac < 0 ou a = 0 ento x = a + b

If (Sqr ( b )-4*a*c < 0 ) or ( a = 0 ) then x:= a + b

seno x = a b

else x:= a b ;

Se i mod 2 = 0 ento Incio

If i mod 2 = 0 then Begin

ma = a

ma := a;

Se ma < b ento ma = b

if ma < b then ma:= b;

Se ma < c ento ma = c

if ma < c then ma:= c;

Escrever ( ma, E o maior)

Write ( ma, E o maior );

Fim

End;

108

i:= 0;

i=0
Enquanto i < 5

While i < 5 do

Incio

begin

Ler ( a, b, c )

Read ( a, b, c );

me = a

me := a;

Se me > b ento me = b

if me > b then me:= b;

Se me > c ento me = c

if me > c then me:= c;

Escrever ( me , o menor )

write ( me, E o menor );

i := i + 1

i := i + 1;

Fim_enquanto

Para i = 1 at 10

end;

For i := 1 to 10 do

Ler ( V( i ) )

Read ( V[ i ] );

Fim_Para i

Para val = 1 at m

For val := 1 to m do

Incio
Soma = Soma + m

Begin

m=m+1

Soma := Soma + m ;

Fim_Para val

m := m + 1;
End;

Para n = 10 at 1

For n := 10 downto 1 do

Escrever ( n x n )

write ( n*n );

Fim_Para n

Algoritmo Fatorial
c,m, i, fat : Inteiro
Incio
Para c = 1 at 10
Incio
Ler ( m )
fat = 1
Para i = 1 at m
fat = fat x i
Fim_Para i
Escrever ( m, fat )
Fim_Para c
Fim

Program Fatorial;
Var c, m, i, fat : integer;
Begin
For c := 1 to 10 do
Begin
Read ( m );
fat := 1;
For i := 1 to m do
fat := fat * i;
write ( m , fat );
End;
End.

109

Algoritmo Raizes
a, b, c, x, x1, x2, d : Reais
Incio
Ler ( a, b, c )
Se a = 0 ento se b 0

ento

Incio
x = -c/b
Escrever ( x )
Fim
Escrever ( c )

seno
seno Incio
d = b2 - 4ac
Se d < 0 ento Escrever ( Equao sem razes reais )
seno Incio
x1 =

x2 =

b+ d
2a
b d
2a

Escrever ( x1, x2 )

Fim
Fim
Fim

Program Raizes;
Var a, b, c, x, x1, x2, d : real;
Begin
Read ( a, b, c );
If ( a = 0 ) then if b <> 0 then begin
x := -c/b;
write ( x );
end
else write (c )
else begin
d := b*b-4*a*c;
If d < 0 then write ( Equao sem raizes reais)
else begin
x1 := (-b + Sqrt( d ))/(2 * a );
x2 := (-b - Sqrt( d ))/(2 * a );
write ( x1, x2 );
end;
End.

110


Algoritmo OrdenaCrescenteBolha
V ( 6 ) : Mat de tipo Inteiro
i, k, x : Inteiro
Incio
Para i = 1 at 6
Incio
Ler (V( i ) )
Escrever ( V (i ) )
Fim_Para i
k=0
Enquanto k = 0
Incio
k=1
Para i = 1 at 5
Se V(i) > V(i+1) ento Incio
x = V(i)
V(i) = V(i+1)
V(i+1) = x
k=0
Fim
Fim_Para i
Fim_enquanto
Para i = 1 at 6
Escrever ( V( i ) )
Fim_Para i
Fim

Algoritmo Clculo-do-Fatorial
m, i, fat : inteiro
Incio
i=1
Enquanto i 30
Incio
Ler ( m )
Fat = Fatorial ( m )
Escrever ( m, fat )
i=i+1
Fim_enquanto
Fim
Funo Fatorial ( n: inteiro ): inteiro
f, i : inteiro
Incio
i=1
Enquanto i n
Incio
f=fxi
i=i+1
Fim_enquanto
Fatorial = f
Retorne
Fim

Program OrdenaCrescenteBolha;
Var V: array[1..6] of integer;
i, k, x : integer;
Begin
For i := 1 to 6 do
Begin
Read ( V[ i ] );
Write ( V [ i ] );
End;
k := 0;
While k = 0 do
Begin
k := 1;
For i := 1 to 5 do
If V [ i ] > V[ i+1 ]
Then Begin
x := V [ i ] ;
V[ i ] := V[ i + 1 ];
V [ i + 1 ] := x;
k := 0;
End;
End;
For i := 1 to 6 do
Write ( V[ i ], );
End.

Program Calculo_do_Fatorial ;
Var m, i, fat : integer;
Function Fatorial ( n: integer ): integer;
Var f, i : integer;
Begin
i := 1;
While i <= n do
Begin
f := f * i;
i := i + 1;
End;
Fatorial := f ;
End;
Begin
i := 1;
While i <= 30 do
Begin
Read ( m );
fat := Fatorial ( m );
writeln ( m, , fat );
i := i + 1;
End;
End.

111

Funo MaiorVet ( Vet: vetor, n : inteiro ): inteiro


maior, i : inteiro
Incio
maior = Vet ( 1 )
Para i = 2 at n
Se Vet( i ) > maior ento maior = Vet ( i )
Fim_Para i
MaiorVet = maior
Retorne
Fim

Function Maior_Vet (V: vetor, n : integer ): integer;


Var maior, i : integer;
Begin
maior := V[1];
for i := 2 to n do
if maior < V[ i ] then maior := V[ i ];
Maior_Vet : = maior;
End;

112

APNDICE B

TRADUO DE ALGORITMOS PARA C

I Constantes em C

As constantes em C podem ser de trs tipos bsicos: Numricas, Lgicas e Literais.


Numricas:
c)

inteiras : 120, +561, -240

d) reais:
b.1) Notao Comum : 12.35, -.5, +5.
b.2) Notao Cientfica : 1.2E2, -0.56E-5, +1.78E+11

Em C no existem constantes lgicas. Tudo o que no zero true. S o que for zero false.
Literais:
qualquer conjunto de caracteres colocado entre aspas.
Ex.: Joo da Silva, X100(-.#Ab, 120,

O ltimo representa o caractere aspas quando se quer us-lo como parte da constante literal.

II Variveis em C

Varivel o nome dado a uma localizao de memria na qual possvel armazenar-se o valor de uma
constante.
Em C as regras de formao dos nomes de variveis so as seguintes:
4.

O primeiro caractere do nome deve ser uma letra de A at Z, maiscula ou minscula. O Compilador
C faz distino entre letra maiscula e minscula. Isto exige algum cuidado para no se usar variveis
diferentes com mesmo objetivo;

5.

Os demais caracteres, se houver, devem ser letras ou dgitos ou o smbolo de quebra _.

6.

O nmero de caracteres do nome da varivel no limitado. Contudo, em algumas implementaes o


Compilador s reconhece at o caractere 63. Os demais caracteres so ignorados.

Portanto, so nomes de variveis vlidos em C :


A
a
a1
valor_de_variavel
Valor_de_variavel
Valor_de_Varivel

Tanto o A e o a so variveis diferentes, quanto o so as trs ltimas apresentadas.

113

No so vlidos, por exemplo:


Media aritmtica

( no so aceitos espaos em branco no nome de uma varivel )

( apenas letras ou dgitos so aceitos )

5a

( o primeiro caractere do nome deve ser letra )

A1.5

( ponto no nem letra e nem dgito )

III Expresses em C

Antes de mostrar a traduo de algumas expresses aritmticas para C importante chamar a ateno para
alguns pontos:

1.

Quando existir numerador ou denominador de frao que no seja simples, isto , que envolve uma ou
mais operaes, na traduo para C este numerador ou denominador deve ser colocado entre
parnteses;

2.

O C no usa colchetes ou chaves em expresses aritmticas como elementos de agrupamento de


operaes, portanto, estes smbolos se aparecerem devem ser substitudos por parnteses, podendo-se
ter vrios nveis de parnteses;

3.

Na matemtica, em muitas ocasies, os operadores podem ficar implcitos. Em C nenhum operador


pode ficar implcito.

4.

Os operadores aritmticos em C so os apresentados abaixo:


Adio
Subtrao
Multiplicao
Diviso
Resto inteiro da diviso
Incremento
Decremento

+
*
/
%
++
--

5.

O operador de atribuio em C o =

6.

Operaes para as quais no h operadores so resolvidas por meio de funes, das quais as mais
usuais j esto pr-definidas. No caso do C, as principais funes pr-definidas so :
pow (base, expoente )

potenciao

logaritmo natural de X
exp ( X ) exponencial de X
fabs ( X ) valor absoluto de X
sqrt(X)
raiz quadrada de X
ceil (X)
menor inteiro contido em X
fmod(X, Y) resto inteiro de X dividido por y
sin ( X ) seno de X
cos ( X ) cosseno de X
tan ( X ) tangente de X
asin( X ) arco seno de x
atan ( X ) arco tangente de X
log ( X )

tipo real ou inteiro


tipo real
tipo real
tipo real ou inteiro
tipo real
tipo inteiro
tipo inteiro
tipo real
tipo real
tipo real
tipo real
tipo real

114

7. Os operadores relacionais em C so os seguintes:


=
<
>

==
<
>
>=
<=
!=

8. Os operadores lgicos em C so os abaixo listados:

no
e
ou

!
&&
||

9. A prioridade dos operadores em C a seguinte:


9.1 Funes
9.2 ++, -9.3 *, /, %, &&
9.4 +, -, ||
9.5 ==, !=, <=, <, >, >=
9.6 Parnteses podem alterar esta ordem.
9.7 Da esquerda para a direita em caso de indeterminao.

Exemplos de expresses aritmticas e sua traduo para C:

x=

a 2bc
a
+ 2
2
b +5

x= (pow( a, 2 ) * b * c ) / 2 + a/ ( pow ( b, 2 ) + 5);

m = (a + b 2 )[( x + y 3 ) 2 w] + d 1
m = ( a + pow ( b, 2 ) * ( pow ( x + pow ( y, 3 ), 2 ) w ) + d 1;

d=

a b +1

d = sqrt ( sqrt ( fabs ( a b ))) + 1;


x = sen2x + cos x2 1

x = pow ( sin ( x ), 2 ) + cos ( pow (x, 2 ) ) 1;

115

y=

a mn
+
b n +1

y = a / b + ( m n ) / ( n + 1 );

IV Linguagem algortmica x Linguagem C

Definio de variveis:

V(10): vetor de inteiro

int m, n, i ;
float a, b, c ;
char nome, ender ;
int V[10];

M(5,5) : matriz de real

float M[5][5];

Empregado Registro

struct Empregado

m, n, i : inteiro
a, b, c : real
nome, ender : literal

{
Nome(30): Literal

char Nome[30];

Idade : Inteiro

int Idade;

Salrio: Real

float Salario;

Fim_Registro

Definio de comandos:

Incio

Fim

Ler (a, b, c )

scanf (%d%d%d, &a, &b, &c );

Escrever (x, y, (x+y)/3, Resultado)

printf (%d

x=5

x = 5;

d = b2-4ac

d = pow ( b ,2 ) 4 * a * c ;

Se x 0 e y = 1 ento ler ( a, b, c )

if ((x != 0 ) && (y == 1))scanf (%f%f%f,&a, &b, &c );

Se b2-4ac < 0 ou a = 0 ento x = a + b

if (pow ( b, 2 ) 4 * a * c < 0 ) || ( a == 0 ) x = a + b;

seno x = a b

%d %d Resultado,x, y, ( x+y)/3 );

else x = a b ;

116

Se i mod 2 = 0 ento Incio

if (i % 2 == 0) {

ma = a

ma = a;

Se ma < b ento ma = b

if (ma < b) ma= b;

Se ma < c ento ma = c

if (ma < c ) ma= c;

Escrever (ma, E o maior)

printf (%d E o maior, ma );

Fim

Caso i for
Incio

switch ( i )
{

1: x = a + b

case 1: x = a + b;
break;

2: x = a b

case 2: x = a b;
break;

3: x = a x b

case 3: x = a * b;
break;

4: x = a / b

case 4: x = a / b;
break;

seno x = 0
Fim

default x = 0;
}

i = 0;

i=0
Enquanto i < 5
Incio

while ( i < 5 )
{

Ler (a, b, c )

scanf ( %d%d%d, &a,&b, &c );

me = a

me = a;

Se me > b ento me = b

if (me > b ) me= b;

Se me > c ento me = c

if (me > c ) me= c;

Escrever (me , o menor )

printf (%d E o menor , me );

i := i + 1

i = i + 1;

Fim_enquanto

Para i = 1 at 10
Ler ( V( i ) )

for( i = 1; i <= 10; i++ )


scanf (%d, &V[ i ] );

Fim_Para i

117

Para val = 1 at m

for (val = 1; val <= m; val++)

Incio

Soma = Soma + m

Soma = Soma + m;

m=m+1

m = m = 1;

Fim_Para val

Para n = 10 at 1

For ( n = 10; n >= 1; n--)

Escrever ( n x n )

printf (%d, n*n );

Fim_Para n

Observao

Para se escrever um programa em C costumam-se utilizar uma quantidade de bibliotecas do C j prontas,


das quais sero apresentadas somente as mais usuais:

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

Um programa em C sempre uma funo. No caso do Programa Principal, uma funo que no retorna
nada, isto void.

Algoritmo Fatorial
c,m, i, fat : Inteiro
Incio
Para c = 1 at 10
Incio
Ler ( m )
fat = 1
Para i = 1 at m
fat = fat x i
Fim_Para i
Escrever ( m, fat )
Fim_Para c
Fim

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

void main( );
{
int c, m, i, fat ;
for ( c = 1; c <= 10; c++)
{
scanf (%d, &m );
fat = 1;
for (i = 1; i <= m; i++)
fat = fat * i;
printf (%d %d , m , fat );
}
}

118

Algoritmo Raizes
a, b, c, x, x1, x2, d : Reais
Incio
Ler ( a, b, c )
Se a = 0 ento se b 0

ento

Incio
x = -c/b
Escrever ( x )
Fim
Escrever ( c )

seno
seno Incio
d = b2 - 4ac
Se d < 0 ento Escrever ( Equao sem raizes reais )
seno Incio
x1 =

x2 =

b+ d
2a
b d
2a

Escrever ( x1, x2 )

Fim
Fim
Fim

#include <stdio.h>
#include <conio.h>
#include <math.h>
void main ( )
{
float a, b, c, x, x1, x2, d ;
scanf (%f%f%f, &a, &b, &c );
if ( a == 0 ) if ( b != 0) {
x = -c/b;
printf (%f , x );
}
else printf ( %f , c );
else {
d = b*b-4*a*c;
If ( d < 0 ) printf ( Equao sem raizes reais );
else {
x1 = ( -b + Sqrt ( d ) ) / ( 2 * a );
x2 = ( -b Sqrt ( d ) ) / ( 2 * a );
printf ( %f %f , x1, x2 );
}
}

119

Algoritmo OrdenaCrescenteBolha
V ( 6 ) : Mat de tipo Inteiro
i, k, x : Inteiro
Incio
Para i = 1 at 6
Incio
Ler (V( i ) )
Escrever (V (i ) )
Fim_Para i
k=0
Enquanto k = 0
Incio
k=1
Para i = 1 at 5
Se V(i) > V(i+1) ento Incio
x = V(i)
V(i) = V(i+1)
V(i+1) = x
k=0
Fim
Fim_Para i
Fim_enquanto
Para i = 1 at 6
Escrever (V( i ) )
Fim_Para i
Fim

Algoritmo Clculo-do-Fatorial
m, i, fat : inteiro
Incio
i=1
Enquanto i 30
Incio
Ler ( m )
Fat = Fatorial ( m )
Escrever ( m, fat )
i=i+1
Fim_enquanto
Fim
Funo Fatorial ( n: inteiro ): inteiro
f, i : inteiro
Incio
i=1
Enquanto i n
Incio
f=fxi
i=i+1
Fim_enquanto
Fatorial = f
Retorne
Fim

#include <stdio.h>
#include <conio.h>
void main ( )
{
int V{6], i, k, x ;
for ( i = 1; i <= 6; i++)
{
scanf (%d, V[ i ] );
printf(%d , V[ i ] );
}
k = 0;
while ( k = 0 )
{
k = 1;
for ( i = 1; i <= 5; i++ )
if ( V[ i ] > V[ i+1 ] )
{
x= V[ i ];
V[ i ] = V[ i+1 ];
V[ i+1 ] = x;
k = 0;
}
}
for ( i = 1; i <= 6; i++ )
printf (%d ; V[ i ] );
}

#include <stdio.h>
void main ( )
{
int m, i, fat ;
int Fatorial ( int n )
{
int f, i ;
i = 1;
while ( i <= n )
{
f = f * i;
i = i + 1;
}
return ( f ) ;
}
i = 1;
while ( i <= 30)
{
scanf (%d, &m );
fat = Fatorial ( m );
printf (\n %d %d , m, fat );
i = i + 1;
}
}

120

Funo MaiorVet ( Vet: vetor, n : inteiro ): inteiro


maior, i : inteiro
Incio
maior = Vet ( 1 )
Para i = 2 at n
Se Vet( i ) > maior ento maior = Vet ( i )
Fim_Para i
MaiorVet = maior
Retorne
Fim

Int Maior_Vet ( V, int n )


{
int maior, i ;
maior = V[1];
for ( i = 2; i n; i++)
if ( maior < V[ i ] ) maior = V[ i ];
Return ( maior );
}

121

BIBLIOGRAFIA UTILIZADA

1.

ORTH, A . I. Algoritmos. Editora Pallotti. Porto Alegre, 1987.

2.

FARRER, H. et alii . Algoritmos Estruturados. Editora Livros Tcnicos e Cientficos. Rio de Janeiro, 3 edio,
1999.

3.

VENNCIO, C. F. Desenvolvimento de Algoritmos: Uma nova abordagem. Editora rica. So Paulo, 1997.

4.

SALVETTI, D. D. & BARBOSA, L. M. Algoritmos. Editora Makron Books. So Paulo, 1998.

5.

PINTO, W. S. Introduo ao Desenvolvimento de Algoritmos e Estruturas de Dados. Editoa rica. So Paulo,


10 Edio, 1999.

6.

VELOSO, P. et alii Estruturas de Dados. 14 edio. Editora Campus. Rio de Janeiro, 1983.

7.

MIZRAHI, V. V. Treinamento em Linguagem C: Curso Completo. Vols 1 e 2. Editora Makron Books. So


Paulo, 1990.

8.

ZIVIANI, N. Projeto de Algoritmos com Implementaes em Pascal e C. Editora Pioneira. So Paulo, 1996.

9.

TREMBLAY, J. P. BUNT, R. B. Cincia dos Computadores: Uma abordagem algortmica. Editora McGrawHill. So Paulo, 1978.

10. DIJKSTRA, E. W. A Discipline of Programming. Englewood Gliffs. New Jersey. Prentice-Hall, 1976.
11. WIRTH, N. From Programming Techniques to Programming Methods. North-Holland, 1974.
12. KNUTH, D. E. The Art of Progamming vol 1 Fundamental Algorithms. Addison-Wesley. Massachussets,
1968.
13. TERADA, R. Desenvolvimento de Algoritmos e Estruturas de Dados. Editora McGraw-Hill. So Paulo, 1991.
14. SCHILDT,H. C Completo e Total. Editora Makron Books, So Paulo, 1997.
15. FORBELLONE, A .L.V. & EBERSPACHER, H.F. Lgica de Programao. Editora Makron Books, So
Paulo, 2000.

122

Potrebbero piacerti anche