Sei sulla pagina 1di 43

Escola Sec. de S.

João do Estoril Ensino Recorrente - Programação de Computadores

Algoritmo
Novembro de 1998

Para iniciar este capítulo vamos falar de culinária. Algo que, aparentemente, não terá nada a
ver com programação.
Vamos, então, analisar uma receita culinária.
Para iniciar, verificamos que é composta de duas partes: uma que descreve os ingredientes e a
outra (preparação) que explica como confeccionar os scones.
A preparação consiste na descrição sequencial dos passos da confecção. Observemos que a
descrição dos passos da preparação é ordenada, isto é, tem de ser feita na ordem apresentada.
Ninguém amassa tudo e só depois peneira a farinha.
Este tipo de descrição pode ser aplicada a muitas outras situações do dia-a-dia. Por exemplo, na
montagem de um kit seja de
mobiliário, seja de modelismo;
Receita de Scones
trazem sempre instruções de
montagem que mostram a ordem ingredientes:
•farinha de trigo - 12 colheres de sopa
das peças a montar. •açúcar refinado - 3 colheres de sopa
Encontra, ainda, no manual da •leite - 6 colheres de sopa
•manteiga - 1 colher de sopa
sua impressora quando explica a •fermento em pó - 1 colher de sopa
mudança da fita, do cartucho de •1 ovo inteiro
•uma pitada grande de sal
tinta ou do toner conforme o tipo
de impressora que se trata. Preparação:
A este tipo de apresentação dá- Peneira-se a farinha com o fermento para um alguidar.
Põe-se em cima todas as outras coisas e amassa-se
se o nome de algoritmo. Assim, a muito ligeiramente, só para ligar tudo, sem bater nem
receita de scones apresentada é o cansar a massa.
Fazem-se bolinhas e colocam-se num tabuleiro forrado
algoritmo da sua confecção. As de alumínio.
instruções de montagem de um kit Depois de cozidos, abrem-se de lado e mete-se-lhes um
bocado de manteiga.
são o algoritmo da montagem
desse kit.
Se analisarmos os diversos algoritmos, verificamos que contêm características comuns. São elas:
- descrição sequencial (ordenada), cada passo corresponde a uma acção elementar
clara, não devendo ocasionar ambiguidade na sua interpretação;
- tem um número finito de passos.

É apresentado, seguidamente, o algoritmo do cálculo do múltiplo de um número.

Algoritmo do cálculo dos múltiplos de um número:


1. Anotar o limite dos múltiplos (limite)
2. Anotar o número do qual se quer saber os múltiplos (número)
3. O primeiro múltiplo é o próprio número (múltiplo = número)
4. Enquanto o múltiplo for menor que o limite indicado fazer:
4.1. Anotar o múltiplo
4.2. O novo múltiplo será igual ao múltiplo anterior mais o número
(múltiplo = múltiplo + número)
5. Fim do algoritmo.

Alexandre Alcobia Unidade 1 - Algoritmia 1


Ensino Recorrente - Programação de Computadores Escola Sec. de S. João do Estoril

Criar um programa de computador

Do que foi dito anteriormente, conclui-se que para fazer um programa devemos ter claro o
algoritmo do nosso problema. Portanto, primeiro há que estudar o problema e elaborar o seu
algoritmo.
Uma vez estabelecido o seu algoritmo podemos, então, passar para a sua implementação numa
linguagem de programação e assim testar
o programa no computador.
Concluindo, a construção de um
programa comporta duas fases (ver
figura):
- fase de resolução do problema -
consiste na formulação do algoritmo
eficaz para a resolução do problema posto;
- fase de implementação - consiste na
tradução do algoritmo para a linguagem
de programação escolhida.

Algoritmo do cálculo dos múltiplos de um número


num computador:
1. Entrar pelo teclado o limite dos múltiplos
(limite)
2. Entrar pelo teclado o número do qual se quer
saber os múltiplos (número)
3. O primeiro múltiplo é o próprio número
(múltiplo = número)
4. Enquanto o múltiplo for menor que o limite
indicado fazer:
4.1. Apresentar no ecrã o múltiplo
4.2. O novo múltiplo será igual ao múltiplo
anterior mais o número
(múltiplo = múltiplo + número)
5. Fim do algoritmo.

program Multiplos (input,output);


{Este programa está escrito num dialécto do PASCAL};
uses
Crt;
var
Limite : integer;
Numero : integer;
Multiplo : integer;
begin
clrscr;
write (‘Qual o valor de que se quer achar os múltiplos ‘);
readln (Numero);
write (‘Qual é o limite da sequência? ‘);
readln (Limite);
writeln (‘ Os múltiplos de ‘,Numero:3:2, ’ são: ‘);
Multiplo := Numero;
while Multiplo < Limite do
begin
writeln (Multiplo:3:2);
Multiplo := Multiplo + Numero;
end;
end.

2 Unidade 1 - Algoritmia Alexandre Alcobia


Escola Sec. de S. João do Estoril Ensino Recorrente - Programação de Computadores

Exercícios

1. Construa o algoritmo para calcular a área de um rectângulo.


Algoritmo área do rectângulo
1. Entrar pelo teclado o valor do lado1
2. Entrar pelo teclado o valor do lado2
3. Calcular a área A = lado1 x lado2
4. Apresentar no ecrã o valor da área

2. Algoritmo do calculo da hipotenusa de um triângulo rectângulo.


Temos que saber a fórmula:

hipot = cateto12 + cateto22


Além da fórmula, temos que dar ao computador os valores dos catetos do triângulo.

3. Algoritmo da transformação dos valores da temperatura de graus Fahrenheit para


graus Célsius.
Tente o leitor resolver este problema, sabendo que a fórmula a aplicar será:
5
celsius = × ( fahr − 32)
9
4. Explique o que entende por algoritmo.

Alexandre Alcobia Unidade 1 - Algoritmia 3


Ensino Recorrente - Programação de Computadores Escola Sec. de S. João do Estoril

Linguagem algorítmica

Temos vindo a usar a linguagem comum como a linguagem de desenvolvimento de algoritmos.


A linguagem algorítmica deve ser formal, isto é, a descrição tem de obedecer a regras de lógica
precisas e sem ambiguidades. Mas por outro lado, não se torna necessário que o código seja muito
rígido como acontece na linguagem do computador podendo, por exemplo, as frases serem escritas
em letras maiúsculas ou minúsculas e as expressões matemáticas escritas na forma vulgar. Assim,
vamos estabelecer algumas regras e criar uma linguagem algoritmica que é conhecida por
pseudolinguagem ou pseudocódigo.
A par da pseudolinguagem existe uma outra forma, esta gráfica, de representação de algoritmos.
Esta baseia-se na utilização de determinados símbolos para fazer uma descrição gráfica do
algoritmo.

Pseudolinguagem
A pseudolinguagem pode ser visto como a tentativa de fundir a expressividade da linguagem
natural e o rigor lógico de esquemas como o fluxograma.
A pseudolinguagem permite a descrição do algoritmo de uma forma linear, fácil de ler e fácil de
compreender.
Vamos aplicar esta linguagem algoritmica, reformulando um algoritmo anteriormente tratado.
O algoritmo deve estar enquadrado entre dois indicadores que possibilitem determinar onde o
algoritmo começa e acaba. Assim, aparecem as instruções Início e Fim.

Atribuição
Esta operação tem por objectivo atribuir um valor a uma variável. A variável funciona como
um recipiente em que vão ser colocados dados.
Temos de criar tantas variáveis (recipientes) quantas as forem necessárias para o correcto
funcionamento do algoritmo.
A operação de atribuição coloca o dado na variável.
Exemplo: x ← -b/a (na variável x é colocado o valor de -b/a)

Introdução e saída de dados


A instrução Sair é utilizada para apresentar os dados ao utilizador.
Exemplo: Sair “O valor da área é”, área

A instrução Entrar é utilizada para introduzir dados no computador através do operador. Estes
dados são afectados a variáveis.
Exemplo: Entrar a, b

Posteriormente, trataremos dos tipos de dados a declarar e das estruturas de decisão.

4 Unidade 1 - Algoritmia Alexandre Alcobia


Escola Sec. de S. João do Estoril Ensino Recorrente - Programação de Computadores

Peguemos no algoritmo da circunferência e vamos reformular a sua apresentação:

Algoritmo circunferência
[Este algoritmo dá as características de uma circunferência]
inteiro raio
real área, perímetro
PI ← 3,14159

Início
Entrar raio
área ← PI x raio2
perímetro ← 2 x PI x raio
Sair área, perímetro
Fim

Num algoritmo, podemos definir três secções:

Cabeçalho
O cabeçalho é a secção onde é dado o nome ao algoritmo. Começa com a palavra "Algoritmo".

Declarações
Nesta, é apresentada a descrição das variáveis usadas.

Corpo
Esta secção contém a sequência dos passos (acções) do algoritmo. Inicia-se com a palavra "Início"
e termina com "Fim".
Existe um tipo de objecto de grande importância na clarificação de um algoritmo. São os
comentários que ajudam muito à sua compreensão.

Comentários
Cada passo do algoritmo pode iniciar com um comentário entre dois parênteses rectos. Estes
comentários dão uma breve descrição do passo ou dum grupo de passos seguintes.
Os comentários são uma parte importante do algoritmo. Eles servem para tornar a leitura, do
algoritmo, mais fácil e clara.

Alexandre Alcobia Unidade 1 - Algoritmia 5


Ensino Recorrente - Programação de Computadores Escola Sec. de S. João do Estoril

Fluxogramas
Esta técnica surge para representar, graficamente, o desenvolvimento de algoritmos. O
fluxograma mostra a lógica do algoritmo dando uma apresentação global das interligações entre
os diversos passos.
Actualmente, a utilização do fluxograma restringe-se a um apoio complementar na
documentação do algoritmo, valendo pela vantagem gráfica da apresentação das interligações.

Alguns símbolos usados na construção de fluxogramas

Limites do algoritmo

Processamento

Entrada ou saída de dados


Início

Isto é um comentário
Ligação entre partes do fluxograma raio
num fluxograma

Decisão área ← PIxraio2

perímetro ← 2xPIxraio

perimetro
area

Fim

Exercícios
Aproveitando os exercícios anteriores, apresente os algoritmos em pseudolinguagem e faça os
respectivos fluxogramas.

6 Unidade 1 - Algoritmia Alexandre Alcobia


Escola Sec. de S. João do Estoril Ensino Recorrente - Programação de Computadores

Estrutura de decisão I

Até agora temos estado a lidar com algoritmos puramente sequênciais, isto é, as instruções são
cumpridas uma após outra até chegar ao fim do algoritmo. No entanto existem estruturas que
permitem a tomada de decisões em função de condições estabelecidas e assim, o algoritmo apresenta
acções alternativas. Estas condições podem ser verdadeiras ou falsas; conforme esse valor o
algoritmo segue uma acção ou segue outra em alternativa.
Estas estruturas não são mais que instruções complexas, geralmente, compostas por várias
palavras, mas formando um todo.
A primeira que vamos usar é de decisão simples e tem o formato

Se condição então
acção1
senão
acção2
fim se

Esta será a sua forma em pseudolinguagem.

Sim condição Não

acção1 acção2

Alexandre Alcobia Unidade 1 - Algoritmia 7


Ensino Recorrente - Programação de Computadores Escola Sec. de S. João do Estoril

Exercícios

1. Faça a discussão da equação do 1º grau


A equação do primeiro grau é do tipo Ax+B=0. Sabe-se, também, que a sua solução é dada pela expressão

B
x=−
A
Temos de analisar esta expressão em função de A ser igual a zero ou não. Caso seja não se pode determinar. Então,
temos:

1. Entrar pelo teclado o valor A e B


2. Verificar para A=0 ou para A<>0
3. Sair para o ecrã o resultado
4. Fim do algoritmo

Desenvolvendo o ponto 2, temos:

2. Se A=0
0
Se B=0 - Sair no ecrã: "Equação indeterminada" ( x = − 0 )
B
Se B<>0 - Sair no ecrã: "Equação impossível" ( x = − )
0
Se A<>0
B
Calcular o valor de x ( x = − )
A
Sair no ecrã: x

2. Calcule as ajudas de custo a um funcionário de uma empresa


Pretende-se calcular as ajudas de custo a pagar aos funcionários de uma empresa que tenham de se deslocar em
viatura própria para serviço da empresa. O valor é em função da distância percorrida e do valor por quilómetro que,
por sua vez, é função da motorização do veículo (cilindrada do motor), como se indica a seguir:
- motor de cilindrada inferior a 2000cm3 será financiado a 3$00 por quilómetro
- motor de cilindrada superior ou igual a 2000cm3 será financiado a 3$50 por quilómetro.
A fórmula para o cálculo do valor será:
ajuda de custo = valor por quilómetro * distância percorrida

3. Calcule o salário semanal de um operário que trabalha por turnos (I)


Pretende-se calcular o salário semanal de um operário em função do turno realizado e do número de horas de
trabalho nessa semana.
Sabemos que no turno de dia será pago a 750$00 por hora. No turno da noite será pago a 1000$00 por hora.

8 Unidade 1 - Algoritmia Alexandre Alcobia


Escola Sec. de S. João do Estoril Ensino Recorrente - Programação de Computadores

4. Calcule o salário semanal de um operário que trabalha por turnos (II)


Pegando no problema anterior, vamos considerar a possibilidade do operário poder fazer horas extraordinárias. Se
realizar acima de 35 horas semanais, as restantes horas são consideradas trabalho extraordinário e será pago pelos
seguintes valores:
- turno de dia - cada hora extraordinária vale 1000$00;
- turno de noite - cada hora extraordinária vale 1250$00.

5. De entre dois valores dados, verificar qual deles é o maior


O que se pretende é a construção de um algoritmo que permita verificar qual o maior de dois números.
O algoritmo será:

1. Entrar pelo teclado os dois valores


2. Compara os dois valores
3. Sair no ecrã o maior
O ponto 2 pode ser desenvolvido do seguinte modo:

2. Se primeiro valor for maior que o segundo


Guardar o primeiro valor
Se segundo valor for maior que o primeiro
Guardar o segundo valor

O algoritmo completo, em pseudolinguagem, é

Algoritmo O valor mais elevado I


[Vamos trabalhar só com números inteiros]
Inteiro: val1, val2, maior

Início
Entrar val1
Entrar val2
Se val1>val2 Então
maior ← val1
Senão
maior ← val2
Fim se
Sair maior
Fim

6. De entre três valores dados, verificar qual deles é o maior


Partindo do algoritmo anterior, propomos ao leitor a construção de um algoritmo para fazer a verificação para três
valores.

7. De que formas podemos representar um algoritmo?

8. Construa os fluxogramas dos algoritmos dos exercícios anteriores.

Alexandre Alcobia Unidade 1 - Algoritmia 9


Ensino Recorrente - Programação de Computadores Escola Sec. de S. João do Estoril

Tipos de dados

O leitor já sabe que as variáveis usadas num programa têm que ser definidas num determinado
tipo de dado. Ora, as linguagens apresentam um número pré-definido de tipos de dados. São
estes tipos que passaremos a apresentar.
As diferentes linguagens apresentam diferentes tipos de instruções para definirem esses tipos
de dados.

Inteiros
Estes correspondem a todos os números inteiros quer positivos, quer negativos.
Ex.: 16, 7, -5

Reais
Estes correspondem aos números com decimais.
Ex.: 23,8; -56,321; 0,35
Neste caso, também, aparecem diversos tipos de reais conforme a precisão que se pretende.
Os dados numéricos (reais ou inteiros) quando muito compridos são, normalmente,
representados no que se chama vírgula flutuante, isto é, a vírgula decimal é sempre colocada
imediatamente antes do primeiro algarismo significativo.
Exemplo:
número vírgula flutuante
386 321 457 0,386 321 x 109
0,000 000 326 72 0,327 x 10-6
Assim, quando são muito compridos decide-se quantos algarismos significativos exactos
escolhemos (precisão), arredonda-se o último e utiliza-se uma potência de dez necessária (ver
exemplos acima).

Lógicos / Booleanos
Os dados lógicos consistem nos valores verdadeiro e falso (1 e 0). Estes valores são usados para
fazer operações lógicas.
Estes dados são, também, conhecidos como booleanos em homenagem a um matemático chamado
Boole.

10 Unidade 1 - Algoritmia Alexandre Alcobia


Escola Sec. de S. João do Estoril Ensino Recorrente - Programação de Computadores

Caracteres (alfanuméricos)
Estes dados são cadeias de caracteres alfanuméricos (character string). Estes caracteres podem
ser quaisquer caracteres reconhecidos pelo computador.
Uma cadeia de caracteres é representada nos programas como uma colecção destes caracteres
começando e acabando por um carácter especial - aspas (“) - para que saibamos onde a cadeia
começa e onde acaba. Estas aspas são designadas como delimitadores da cadeia de caracteres.
Exemplos: “Rua Almirante”; “333+444 dá 777”.

Alexandre Alcobia Unidade 1 - Algoritmia 11


Ensino Recorrente - Programação de Computadores Escola Sec. de S. João do Estoril

Estratégia Top-Down

Nos problemas anteriores, temos vindo a aplicar uma estratégia para a construção do algoritmo
que consiste em fazer um primeiro desenvolvimento genérico do algoritmo e só depois, desenvolver
os passos mais complexos. Esta estratégia é conhecida pelo nome Top-Down.
O seu princípio baseia-se na divisão de um problema complexo em problemas menores para
os quais é mais fácil encontrar a solução. Deste modo parte-se da construção de um algoritmo
genérico com um número mínimo de passos genéricos. Vai-se, sucessivamente, construindo
algoritmos mais detalhados (refinação do genérico).
É uma estratégia a aplicar à resolução de problemas em geral e, não só, informáticos.
Como exemplo vamos desenvolver um algoritmo da pesagem de 1kg de arroz para uma tigela.
Definimos um algoritmo genérico que corresponda à solução que pretendemos:

1. Trazer os materiais
2. Pesar a arroz
3. Guardar os materiais

Vamos refinar o primeiro passo do algoritmo genérico:

1.1 Trazer o saco da arroz


1.2 Trazer a balança
1.3 Trazer a tigela

O segundo passo poderia ser:

2.1 Pesar a tigela e memorizar o seu peso


2.2 Pôr alguma arroz na tigela
2.3 Enquanto o peso indicado não for igual ao peso da tigela sozinha mais
1kg:
Se o peso da tigela mais arroz é menor que o peso da tigela mais 1kg,
Adiciona algum arroz à tigela
Doutro modo, retira algum arroz da tigela

O terceiro passo do algoritmo seria:

3.1 Guardar o saco de arroz


3.2 Guardar a balança

Existe a estratégia Bottom-Up em contrapartida com a Top-Down. Consiste em partir do particular


para o genérico. É uma estratégia usada na resolução de erros.

12 Unidade 1 - Algoritmia Alexandre Alcobia


Escola Sec. de S. João do Estoril Ensino Recorrente - Programação de Computadores

Operações elementares

Embora no algoritmo possamos apresentar as operações da forma habitual, nas linguagens de


programação essas notações são, geralmente, diferentes. Assim, apresentamos seguidamente as
notações habituais nas linguagens de programação, além de outras operações típicas.

Adição e subtracção
A adição e a subtracção são representados da forma habitual.
Ex: 3+5; a+25.

Multiplicação e divisão (x * y) (x/y)


Estas operações apresentam-se em notações diferentes das usuais. A multiplicação é assinalada
por um asterisco em vez do "x" ou ponto.
Ex: 4 * 30=120; x * y.
x 3
A divisão é representada por x / y em vez de x : y ou y . Isto quer dizer que algo como não
2
pode ser escrito. Em vez disso, usamos 3/2 que o computador entenderá por 1,5.

Divisão truncada (x div y)


Quando pretendemos que o resultado da divisão de dois números dê um inteiro, utiliza-se a
operação div, a qual dá como resultado um número inteiro truncado.
Diz-se que o resultado é truncado quando se despreza a parte decimal.
Exemplo:
real truncado
2,5 2
0,62 0
Assim, 1 div 2 dá 0 ao contrário de 1/2 que daria 0,5; 14 div 7 = 2, do mesmo modo 14,2 div 7 =2.

Resto da divisão de inteiros (x mod y)


Esta operação dá-nos o resto da divisão de dois inteiros.
Assim, 6 mod 3 = 0 e 5 mod 2 = 1

Potenciação (x^y)
A potenciação é representada por uma simbologia diferente. Deste modo, utiliza-se 3^2 em
vez de 32.

Alexandre Alcobia Unidade 1 - Algoritmia 13


Ensino Recorrente - Programação de Computadores Escola Sec. de S. João do Estoril

Operadores lógicos
Definições
a e b são proposições
0 - valor falso
1 - valor verdadeiro

Exemplos:
a = O Sol é uma estrela
b = O gato é um mamífero

Vamos analisar as operações lógicas fundamentais

Negação
A negação da proposição a representa-se por:
A negação de a lê-se: O Sol não é uma estrela

Conjunção
A conjunção de a e b representa-se por:
a = O Sol é uma estrela
b = O Sol emite energia
A conjunção de a com b lê-se: a e b, ou seja: O Sol é uma
estrela e o Sol emite energia

Disjunção inclusiva
A disjunção inclusiva de a e b representa-se por:
a = António é médico
b = António é professor
A disjunção inclusiva de a com b lê-se: a e/ou b, ou seja:
António é médico e/ou António é professor

Disjunção exclusiva
A disjunção exclusiva de a e b representa-se por:
a = António é médico; b = António é professor
A disjunção exclusiva de a com b lê-se: ou a ou b, ou seja: ou
António é médico ou António é professor

Leis de De Morgan
Estas leis dão-nos as seguintes transformações:

~ (a ∧ b ) =~ a ∨ ~ b
~ (a ∨ b ) =~ a ∧ ~ b

14 Unidade 1 - Algoritmia Alexandre Alcobia


Escola Sec. de S. João do Estoril Ensino Recorrente - Programação de Computadores

Prioridade das operações

Consideremos a seguinte expressão:

A ← 3+6*13

Que valor atribuir à variável A? O valor desta variável dependerá da ordem utilizada na
realização das operações. Assim, da esquerda para a direita será A=117; da direita para a esquerda
será A=81.
Para se evitarem estas ambiguidades temos que respeitar a prioridade das operações, pois ela
vai garantir a correcção do resultado.

A multiplicação tem prioridade em relação à adição


Como se pode verificar, o valor correcto é 81.
Pode-se alterar a prioridade das operações, utilizando parênteses:

A primeira prioridade vai para as operações incluídas entre parênteses.


Dum modo global temos:
·mais alta prioridade para a potenciação;
·segue-se em igualdade a multiplicação e a divisão;
·finalmente, temos a adição e subtracção.

Consideremos a seguinte expressão:

-3 * 7 + 2^3 div 4 - 6

As operações deverão ser realizadas como se mostra a seguir:

Alexandre Alcobia Unidade 1 - Algoritmia 15


Ensino Recorrente - Programação de Computadores Escola Sec. de S. João do Estoril

Estrutura de decisão II

Há casos em que se tem de optar entre várias opções que uma variável pode dispor, pelo que se
terá de recorrer a várias estruturas SE encadeadas. O encadeamento das estruturas SE traz
dificuldade na interpretação do algoritmo. Neste caso, temos uma estrutura de decisão composta
ou decisão múltipla que vai tornar a leitura do algoritmo mais fácil.
Essa estrutura é conhecida pela estrutura CASO.
Em pseudocódigo, apresentará a seguinte forma:

Caso variável
opção1:
acção1
A
opção2:
acção2
...
Fim caso Decisão

opção1 opção2 opção3

acção1 acção2 acção3

Vejamos o seguinte exemplo:

Algoritmo Selecção
[caracterização de algumas letras do alfabeto]
Carácter letra, frase

Início
Entrar letra
Caso letra
“a”,”b”:
frase ← “Primeiras letras”
“k”,”w”,”y”:
frase ← “Alfabeto inglês”
“z”:
frase ← “Última letra”
Senão
frase ← “Outras letras do alfabeto”
Fim caso
Sair frase
Fim

16 Unidade 1 - Algoritmia Alexandre Alcobia


Escola Sec. de S. João do Estoril Ensino Recorrente - Programação de Computadores

Exercício

1. Descreva o que faz o seguinte algoritmo.

Algoritmo números
Inteiro número
Caracter frase
Início
Entrar número
Se número > 10 então
frase ← “É maior de 10”
Senão
Se número < 10 então
frase ← “É menor de 10”
Senão
frase ← “É igual a 10”
Fim se
Fim se
Sair frase
Fim

2. Construa o algoritmo da discussão da equação do segundo grau usando a estrutura


CASO.
A equação do segundo grau apresenta-se na forma ax 2 + bx + c = 0
A resolução desta equação é baseada na utilização do binómio discriminante b 2 − 4ac .
Assim, temos três situações:
- binómio discriminante > 0
Tem solução dada por
− b ± b 2 − 4ac
x=
2a
- binómio discriminante < 0
Não tem solução nos reais.

-binómio discriminante = 0
Tem solução dada por −b
x=
2a

3. Construa um algoritmo que disponha do cálculo do valor da área de três figuras


geométricas. O utilizador escolherá uma das três figuras disponíveis a tratar e o
algoritmo produzirá o valor da área.
A partir de um menu em que são apresentadas as figuras geométricas disponíveis, o utilizador escolherá a pretendida.
De seguida, ser-lhe-ão pedidos os dados referentes à figura e produzir-se-á o cálculo do valor da área que será
apresentado no ecrã.

4. Construa os fluxogramas dos algoritmos dos exercícios anteriores.

Alexandre Alcobia Unidade 1 - Algoritmia 17


Ensino Recorrente - Programação de Computadores Escola Sec. de S. João do Estoril

Estruturas de Repetição

Os computadores são particularmente bem adaptados a aplicações nas quais uma dada operação
- ou uma série de operações - é repetida muitas vezes, ou seja, a produção de ciclos. As estruturas
de repetição são construções fundamentais e podem ocorrer numa variedade de formas.

REPETIR ... ATÉ


Apresentará o seguinte formato:
A

Repetir
acção
até condição
Acção

A acção será repetida até que a condição seja


verdadeira.
A condição será testada depois de realizada
a acção. Portanto, a acção realizar-se-á pelo
menos uma vez. Não
Condição Sim

Algoritmo múltiplos
inteiro Número, Limite, Múltiplo

Apresentamos um exemplo. Trata-se de um Início


Entrar Número, Limite
algoritmo para o cálculo dos múltiplos de um Múltiplo ← Número
número até um determinado valor definido por Repetir
Limite SAIR Múltiplo
Múltiplo ← Múltiplo + Número

até Múltiplo >= Limite


Fim

18 Unidade 1 - Algoritmia Alexandre Alcobia


Escola Sec. de S. João do Estoril Ensino Recorrente - Programação de Computadores

ENQUANTO ... REPETIR


Esta apresenta a seguinte formulação em pseudocódigo:

Enquanto condição fazer


acção
repetir
Neste caso, a acção repete-se enquanto a condição for
verdadeira.
A condição é testada antes de se iniciar a acção. Se a
condição for verdadeira produz-se a acção, se for falsa já não
se produz a acção.

A estrutura REPETIR ... ATÉ pode ser realizada utilizando a estrutura ENQUANTO ... REPETIR.
Basta mudar de REPETIR ... ATÉ condição, para ENQUANTO ~condição ... REPETIR.
Assim, temos:

Múltiplo ← Valor Múltiplo ← Valor


Repetir Enquanto ~(Múltiplo >= Número) fazer
Sair Múltiplo Sair Múltiplo
Múltiplo ← Múltiplo + Valor Múltiplo ← Múltiplo + Valor
até Múltiplo >= Número repetir

Condição Não

Sim

Acção

Alexandre Alcobia Unidade 1 - Algoritmia 19


Ensino Recorrente - Programação de Computadores Escola Sec. de S. João do Estoril

PARA... SEGUINTE
Por último, temos uma estrutura de repetição por contagem:

Para variável ← valor inicial até valor final passo n fazer


acção
seguinte

A variável toma um valor inicial que vai incrementando (ou decrementando) até um valor
final. O valor do incremento (ou decremento) é dado pelo valor positivo (ou negativo) de n.
O passo é de utilização opcional. Se não for declarado é, por defeito, de uma unidade.
Vamos ver o algoritmo para verificar se um número é ou não primo.

Algoritmo Números Primos


[Vamos verificar se é primo]
inteiro número, contagem
carácter frase
booleano primo

Início
primo ← verdadeiro
Entrar numero

[Para não ser primo tem de ser divisível


por qualquer entre 1 e ele próprio, isto é,
de 2 até número-1]
Para contagem ← 2 até número-1 fazer

[Se for divisível não é primo]


Se (numero mod contagem = 0) então
primo ← falso
Fim se

Seguinte
Se primo então
frase ← “É número primo”
senão
frase ← “Não é primo”
Fim se A
Sair frase
Fim

variável
v_inicial até v_final

Não está estabelecida qualquer representação


gráfica para a estrutura PARA, mas podemos
adoptar a seguinte.

acção

20 Unidade 1 - Algoritmia Alexandre Alcobia


Escola Sec. de S. João do Estoril Ensino Recorrente - Programação de Computadores

Aqui é apresentada uma aplicação desta estrutura. A variável contagem é utilizada como contador.
A não indicação do passo leva a que o valor seguinte de contagem será o valor anterior mais um.
Esta estrutura PARA ... pode-se considerar uma variante da estrutura ENQUANTO... Vejamos:

Algoritmo Números Primos


[Vamos verificar se é primo]
Neste caso é necessária a
inteiro número, contagem inicialização da variável contador
booleano primo antes da estrutura ENQUANTO.
Início Dentro do ciclo, é necessário
primo ← verdadeiro proceder ao incremento da variável
Entrar numero
contador para que alcance o valor
[Para não ser primo tem de ser divisível final pretendido.
por qualquer entre 1 e ele próprio, isto é,
de 2 até número-1]
contagem ← 2 [Para iniciar a contagem]
Enquanto contagem =< número-1 fazer

[Se for divisível não é primo]


Se (numero mod contagem = 0) então
primo ← falso
Fim se
contagem ← contagem + 1 [Incrementa de uma unidade]

Repetir
Se primo então
Sair “É número primo”
senão
Sair “Não é primo”
Fim se
Fim

variavel ← v_inicial

Usando a estrutura ENQUANTO,


o fluxograma fica como o apresentado
ao lado. variavel =< v_final

Sim
Não

Acção

variavel ← variavel + 1

Alexandre Alcobia Unidade 1 - Algoritmia 21


Ensino Recorrente - Programação de Computadores Escola Sec. de S. João do Estoril

Fluxograma do algoritmo Número primo usando a estrutura ENQUATO.

Número primo

número

contagem ← 2

contagem
=<número-1

Sim

número mod
Sim Não
contagem=0

Não

primo← falso

contagem ← contagem+1

Não primo Sim

"Não é nº primo" "É nº primo"

Fim

22 Unidade 1 - Algoritmia Alexandre Alcobia


Escola Sec. de S. João do Estoril Ensino Recorrente - Programação de Computadores

Exercícios

1. Análise do algoritmo do número primo.


Um número primo é aquele que é divisível, só e somente, pela unidade e por ele próprio. Sendo divisível por qualquer
outro, não é número primo.
Como todos os números são divisíveis por um e por si próprios não necessitamos de verificar a divisibilidade. Assim,
temos de verificar todos os outros números desde 2 até ao número anterior ao que queremos verificar (número - 1).
Por isso aparece a estrutura

Para contagem ← 2 até número-1 fazer

acção
Seguinte

A acção é a verificação da divisibilidade.


Se um número a for divisível por outro b então o resto da divisão será zero. Temos uma operação que nos dá o resto
da divisão de inteiros. É o mod.
Neste caso temos que se número mod contagem = 0 então o número não será primo. Daí que surge

Para contagem ← 2 até número-1 fazer

Se (numero mod contagem = 0) então


primo ← falso
Fim se

Seguinte

Na realidade estamos a verificar se o número não é primo. Para indicar se o número é ou não primo usamos uma
variável booleana que toma um de dois valores: ou verdadeiro ou falso. A variável está identificada com o nome primo.
Por isso usamos

Se (numero mod contagem = 0) então


primo ← falso
Fim se.
Para mandar a indicação para o ecrã, a frase será a conveniente, isto é, se o número é primo ou
não. Usamos o valor da variável booleana para fazer a diferenciação.

Se primo então
frase ← “É número primo” Se for primo (primo terá o valor verdadeiro) é apresentado
senão no ecrã “É número primo”; se não for será apresentada a
frase ← “Não é primo” frase “Não é primo”.
Fim se

2. Somar os N primeiros números inteiros


Somar todos os números desde 1 até ao número N indicado pelo utilizador.
Faça o algoritmo com a estrutura PARA e outro com a estrutura ENQUANTO.

Alexandre Alcobia Unidade 1 - Algoritmia 23


Ensino Recorrente - Programação de Computadores Escola Sec. de S. João do Estoril

3. Construa o algoritmo do factorial de um número, isto é, o produto de todos os inteiros


desde 1 até ao número escolhido
Por exemplo, o factorial de 3 é 1x2x3 = 6, mas o factorial de zero é 1.
Use a estrutura PARA, mas não se esqueça de ter em atenção do pormenor de o factorial de zero ser 1.

4. Implemente o algoritmo do número primo para apresentar todos os números primos


até um número N indicado pelo utilizador.
Terá de usar mais uma estrutura PARA que a usada no algoritmo apresentado.

24 Unidade 1 - Algoritmia Alexandre Alcobia


Escola Sec. de S. João do Estoril Ensino Recorrente - Programação de Computadores

Erros

A construção de algoritmos traz consigo a produção de erros. Estes são tanto mais prováveis
quanto mais complexo for o algoritmo.
Neste caso, temos de utilizar técnicas que nos permitam detectar o erro de modo a poder
corrigi-lo.
Uma técnica usada é a construção de quadros de taçagem (trace table), permite uma análise do
funcionamento do algoritmo levando à detecção do erro e, assim, permitir a sua correcção.
Para exemplificar esta técnica vamos usar o algoritmo do número primo apresentado
anteriormente.

Algoritmo Números Primos


inteiro número, contagem
carácter frase
booleano primo

Início
primo ← verdadeiro
Entrar numero

1. Para contagem ← 2 até número-1 fazer

2. Se (numero mod contagem = 0) então


primo ← falso
Fim se

1.1 Seguinte

3. Se primo então
frase ← “É número primo”
3.1. senão
frase ← “Não é primo”
Fim se
Sair frase
Fim

Cria-se uma série de referências, por exemplo a numeração como se apresenta no algoritmo
acima.
Em seguida constroi-se uma tabela na qual colocamos os valores das variáveis e das condições
a testar.
a = contagem ← 2 até número-1
b = (numero mod contagem = 0)

número contagem a b primo frase

1 3 2 V - V -

2 3 2 V F V -

1.1 3 3 - - V -

1 3 3 F - V -

3 3 3 - - V Primo

Alexandre Alcobia Unidade 1 - Algoritmia 25


Ensino Recorrente - Programação de Computadores Escola Sec. de S. João do Estoril

A tabela apresentada, mostra o funcionamento do algoritmo e os valores que vai produzindo


para um número escolhido que é o três que sabemos ser primo.
Pelo quadro, sabemos que o algoritmo produz a resposta certa.
Um teste completo, do algoritmo, tem de comportar os casos particulares do problema posto.
A tabela seguinte mostra o teste para um outro número escolhido por nós, agora o quatro que
sabemos não ser primo e o algoritmo produz o resultado esperado.

número contagem a b primo frase

1 4 2 V - V -

2 4 2 V V F -

1.1 4 3 - - F -

1 4 3 V - F -

2 4 3 - F F -

1.1 4 4 - - F -

1 4 4 F - F -

3.1 4 4 - - F N ão primo

Aos erros produzidos na construção de um algoritmo dá-se o nome de erros lógicos ou erros
semânticos.
São erros, em geral, difíceis de detectar porque reflectem uma incorrecta elaboração do algoritmo.
Estes resultam do facto de o programador não ter expressado correctamente a sequência de acções
a ser executada (o programador queria dizer uma coisa mas disse outra).
Ao processo de detecção e correcção de erros dá-se o nome de depuração. Em inglês, este
processo é denominado debugging e aos erros dá-se o nome de bugs.

26 Unidade 1 - Algoritmia Alexandre Alcobia


Escola Sec. de S. João do Estoril Ensino Recorrente - Programação de Computadores

Exercícios

1. O algoritmo apresentado seguidamente produz um ciclo infinito. Corrija-o.


contagem ← 1
Enquanto contagem <= 10 fazer

Sair “Não acabou”

Repetir
Use a técnica de trace table para analisar o funcionamento do algoritmo

2. Construa um algoritmo para, de entre dois números inteiros, verificar qual deles é o
maior
Para a construção do algoritmo pedido basta usar uma estrutura SE.

Algoritmo valor mais elevado


inteiro val1, val2, maior
Início
Entrar val1, val2
Se val1>val2 então
maior ← val1
senão
maior ← val2
Fim se
Sair maior
Fim

3. Construa um algoritmo para verificar de entre três números inteiros, qual o maior
Será aconselhável basear-se no algoritmo do exercício anterior.

4. Melhoria do algoritmo “Números primos”


O algoritmo apresentado antes pode ser melhorado em dois aspectos:
- Não tem interesse a verificação a números negativos, nem o zero nem o número um.
Solução: impedir ao utilizador a introdução dos referidos valores.
- Quando se encontra um valor em que o número é divisível não há vantagem em continuar a verificação, pois o
número é primo.
Solução: quando se encontra o valor que divide o número pára-se a estrutura PARA.
Vamos começar pelo primeiro aspecto

Algoritmo Números Primos


inteiro número, contagem
carácter frase
booleano primo

Início
primo ← verdadeiro
número ← 0
Enquanto número < 2 fazer
Entrar número
Repetir
.......
Acrescentamos a estrutura ENQUANTO para verificar o valor que o utilizador introduz na variável número, obrigando
o utilizador a repetir novo valor caso tenha introduzido um valor não apropriado.
Há a inicialização da variável número (número ← 0) para obrigar ao pedido da introdução do número a verificar. Caso
não se faça a inicialização referida, não sabemos o que poderá acontecer uma vez que não sabemos que valor a
variável número contém no momento do teste da condição da estrutura ENQUANTO.

Alexandre Alcobia Unidade 1 - Algoritmia 27


Ensino Recorrente - Programação de Computadores Escola Sec. de S. João do Estoril

Para o segundo aspecto referido, temos

Para (contagem ← 2 até número-1) ∧ ~(numero mod contagem=0) fazer

Se (numero mod contagem = 0) então


primo ← falso
Fim se

Seguinte

.......
Vimos nos operadores lógicos que na conjunção basta uma proposição ser falsa para que a condição seja falsa.
Assim, basta encontrar um valor que divida o número para acabar a estrutura PARA. Esta, também acaba se a
contagem chegar ao fim.
Vejamos a tabela de verdade para as condições postas.
Tomemos a = contagem ← 2 até número-1
b = numero mod contagem=0

a b ~b a ∧ ~b
1 1 0 0 A estrutura PARA continua

1 0 1 1

0 1 0 0

0 0 1 0

5. Como exercício, transforme a estrutura PARA, do algoritmo anterior, numa estrutura


ENQUANTO. Valide a sua escolha com a verificação numa trace table.

28 Unidade 1 - Algoritmia Alexandre Alcobia


Escola Sec. de S. João do Estoril Ensino Recorrente - Programação de Computadores

Quadros e vectores

Suponhamos que queremos analizar as notas, dos alunos de uma turma, numa disciplina. Para
tal, construimos o seguinte algoritmo.

Algoritmo Notas
[Programa para determinar a média das notas de uma turma a uma disciplina e classificar
os alunos em relação a essa média]
Inteiro nota1,nota2,...,nota20 [Suponhamos que a turma tem 20 alunos]
Inteiro SNotas
Caracter comentario
Real media

Início
[Inicialização das variável para a soma das notas da turma]
SNotas ← 0
[Introdução das notas dos 20 alunos]
Entrar “Introduza a nota”, nota1
SNotas ← SNotas + nota1
Entrar “Introduza a nota”, nota2
SNotas ← SNotas + nota2
......
Entrar “Introduza a nota”, nota20
SNotas ← SNotas + nota20
[Cálculo da média]
media ← SNotas / 20
Sair “A média é”,media

[Apreciação da situiação de cada aluno em relação à média]


Se nota1 = media então [Apreciação para o aluno 1]
comentario ← “O aluno 1 está na média.”
senão
Se nota1 > media então
comentario ← “O aluno 1 está acima da média”
senão
comentario ← “O aluno 1 está abaixo da média”
fim se
fim se
Sair comentario
Se nota2 = media então [Apreciação para o aluno 2]
comentario ← “O aluno 2 está na média.”
senão
Se nota2 > media então
comentario ← “O aluno 2 está acima da média”
senão
comentario ← “O aluno 2 está abaixo da média”
fim se
fim se
Sair comentario
..........
.......
Se nota20 = media então [Apreciação para o aluno 20]
comentario ← “O aluno 20 está na média.”
senão
Se nota20 > media então
comentario ← “O aluno 20 está acima da média”
senão
comentario ← “O aluno 20 está abaixo da média”
fim se
fim se
Sair comentario
Fim

Alexandre Alcobia Unidade 1 - Algoritmia 29


Ensino Recorrente - Programação de Computadores Escola Sec. de S. João do Estoril

Analisando o algoritmo vêmos que é criada uma variável para cada nota, sendo a turma de
vinte alunos logo temos de criar vinte varáveis para as notas. Na apreciação qualitativa em relação
à média, deparamos com uma sequência idêntica de estruturas SE, mas sempre semelhantes para
cada nota existente. Isto perfaz vinte estruturas semelhantes.
A escrita de um programa com estas características é muito fastidioso, isto é, se não pensarmos
em fazer um programa para um curso que teria cento e cinquenta alunos. Não seria nada prático.
De qualquer modo, poderíamos ultrapassar o problema usando a mesma variável para as notas
dos alunos e usando a estrutura PARA, mas ter-se-ía de intorduzir duas vezes as notas dos alunos.

Algoritmo Notas
[Programa para determinar a média das notas de uma turma a uma disciplina e classificar
os alunos em relação a essa média]

Inteiro contador,NAlunos,nota,SNotas,numero
Real media
Caracter comentario
Início
[Inicialização das variáveis]
nota ← 0
NAlunos ← 0
SNotas ← 0

[Introdução do número de alunos da turma]


Entrar “Indique o número de alunos da turma.”, NAlunos

[Introdução das notas dos alunos]


Para contador ← 1 até NAlunos fazer
Entrar “Introduza a nota”, nota
SNotas ← SNotas + nota
Seguinte

[Cálculo da média]
media ← SNotas/NAlunos
Sair “A média é”,media

[Apreciação da situiação do aluno em relação à média]


Para contador ← 1 até NAlunos fazer
Entrar “Indique o número do aluno”, numero
Entrar “Introduza a nota do aluno”, nota
Se nota = media então
comentario ← “Este aluno está na média.”
senão
Se nota > media então
comentario ← “Este aluno está acima da média”
senão
comentario ← “Este aluno está abaixo da média”
fim se
fim se
Sair comentario
Seguinte
Fim

Para ultrapassar este problema temos uma estrudura de dados conhecida como quadro ou array
que não é mais que uma matriz e que podemos usar na resolução de questões deste tipo, ou
outros, tornando a produção mais fácil de algoritmos mais eficientes.

30 Unidade 1 - Algoritmia Alexandre Alcobia


Escola Sec. de S. João do Estoril Ensino Recorrente - Programação de Computadores

Na realidade, é um grupo de dados com o mesmo identificador (nome do array) mas cada dado
está associado a um endereço diferente. Assim, à semelhança de uma matriz, temos

Cada dado do array tabela é identificado pelo par [linha, coluna]. Deste modo, temos
tabela [2,3] = 17.
Este quadro é bidimensional, mas pode haver com mais dimensões ou com menos
(unidimensional). Os dados guardados num quadro podem ser inteiros, reais, caracter ou outro.

Este quadro é unidimensional. Tem


uma coluna e quatro linhas. Assim,
uni[2] = e, uni[4] = ou.

Este quadro representa duas tabelas de três


linhas e três colunas. Assim, temos que
tri[1,2,3] = 9 e tri[2,1,1] = 10.

Como vimos, podemos usar quadros unidimensionais, bidimensionais ou outros conforme o


necessário, mas, normalmente, não vai além dos tridimensionais. Os quadros unidimensionais
também são chamados vectores.
Utilizando esta estrutura de dados, torna-se mais prática a elaboração do referido algoritmo
como podemos verificar seguidamente.

Alexandre Alcobia Unidade 1 - Algoritmia 31


Ensino Recorrente - Programação de Computadores Escola Sec. de S. João do Estoril

Algoritmo Notas
[Programa para determinar a média das notas de uma turma a uma disciplina e classificar
os alunos em relação a essa média]

Inteiro NAlunos,SNotas,numero
Real media
[Definição de quadro para o máximo de 30 alunos]
Quadro Inteiro nota[30]

Início
[Inicialização das variáveis]
SNotas ← 0

[Introdução do número de alunos da turma]


Repetir
NAlunos ← 0
Sair “Indique até ao máximo de 30 alunos”
Entrar “Indique o número de alunos da turma.”,NAlunos
Até NAlunos => 1 ∧ NAlunos =< 30

[Introdução das notas dos alunos]


Para numero ← 1 até NAlunos
Sair numero
Sair “Introduza a nota do aluno”
Entrar nota[numero]
SNotas ← SNotas + nota[numero]
Seguinte

[Cálculo da média]
media ← SNotas / NAlunos
Sair “A média é”,media

[Apreciação da situação do aluno em relação à média]


Para numero ← 1 até NAlunos
Se nota[numero] = media então
Sair numero
Sair “O aluno está na média.”
senão
Se nota[numero] > media então
Sair numero
Sair “O aluno está acima da média”
senão
Sair numero
Sair “O aluno está abaixo da média”
fim se
fim se
Seguinte
Fim

Analisando o algoritmo apresentado, começamos por verificar que usa um vector (quadro
unidimensional) de inteiros com trinta posições: Quadro Inteiro nota[30].
A estrutura REPETIR... ATÉ serve para garantir que o utilizador introduza um número de 1 até
30 que é o número máximo de alunos que o quadro pode suportar.
A estrutura PARA que aparece a seguir, serve para encher o vector com as notas dos alunos.
Cada posição do vector é referenciada por nota[numero] dado que nota é o identificador do quadro
e o contador numero vai incrementando a posição no vector conforme vai incrementando na
estrutura PARA.

Para numero ← 1 até NAlunos


...
Entrar nota[numero]
...
Seguinte
contador

É claro que não corre o quadro todo, mas só a quantidade de posições que NAlunos contém.

32 Unidade 1 - Algoritmia Alexandre Alcobia


Escola Sec. de S. João do Estoril Ensino Recorrente - Programação de Computadores

A seguir aparece uma outra estrutura PARA para correr o vector e fazer a comparação, de cada
valor armazenado, com a média realizando a apreciação de cada aluno.
Da análise, conclui-se que a estrutura PARA é muito útil no trabalho de quadros de um modo
geral.
Se usarmos quadros bidimensionais usam-se duas estruturas PARA para correr o quadro porque
passam a existir dois indicadores de posição para cada célula do quadro.

Quadro Inteiro QuadBid [5,10]


...
Para linha ← 1 até 5 fazer
Para coluna ← 1 até 10 fazer
...
Entrar QuadBid[linha,coluna]
...
Seguinte
Seguinte

Como vemos no exemplo acima apresentado, existe o quadro QuadBid de 5 linhas por 10 colunas
que é referenciado com a ajuda de duas estruturas PARA.
A primeira estrutura corre as linhas do quadro e a segunda corre, em cada linha, as colunas.
Cada vez que realiza a instrução Entrar, o utilizador introduz um inteiro no quadro na posição
referenciada no momento pelos contadores linha e coluna.

Ordenação
Quando se preenche um quadro com dados, estes ficam arrumados em função da ordem de
entrada que o utilizador usou. Assim, os dados ficam sem uma ordem convencional. Por questão
de lógica de procura ou de leitura, pode haver interesse em que os dados estejam ordenados.
Por esta razão, vamos estudar um algoritmo simples que permitirá proceder à ordenação dos
dados de um quadro.
Vejamos o vector definido por

Quadro Inteiro Idades [5]

que contém as idades de cinco pessoas: 45 27 33 40 35


Os dados do vector Idades não se encontra ordenado. Seria legítimo pretender-se que as idades
estivessem ordenadas por ordem crescente. Para tal, teremos de correr o vector comparando os
valores sucessivos e, caso necessário, fazer a troca conveniente. Vejamos, a posição Idade[1] é 45 e
a posição Idade[2] é 27, logo terão de ser trocados os valores de modo que a posição Idade[1] fosse
27 e Idade[2] fosse 45. Depois verificamos Idade[2] e Idade[3] e têm de ser trocados. Todo este
procedimento corre o vector até ao fim.
Esquematizando, temos:

Para coluna ← 1 até 4 fazer


Se Idade[coluna] > Idade[coluna+1] então
Troca (Idade[coluna],Idade[coluna+1])
Fim se
Seguinte

Alexandre Alcobia Unidade 1 - Algoritmia 33


Ensino Recorrente - Programação de Computadores Escola Sec. de S. João do Estoril

Este algoritmo tem uma operação especial a que chamámos Troca que vai realizar a troca pretendida.
Uma análise mais atenta, mostra-nos que este algoritmo não chega. Vejamos, no quadro seguinte, o
que se passa a cada incremento da variável coluna na estrutura PARA.

vector original
45 27 33 40 35

1 27 45
coluna ←1 até 4 2 27 33 45

3 27 33 40 45

4 27 33 40 35 45

O quadro mostra-nos que a ordenação não ficou completa. É necessário fazer correr, mais uma
vez, a estrutura PARA. Portanto, o algoritmo só deve acabar quando a estrutura PARA correr o vector
e não acontecer alguma troca de valores.

Repetir
trocas ← falso
Para coluna ← 1 até 4 fazer
Se Idade[coluna] > Idade[coluna+1] então
Troca (Idade[coluna],Idade[coluna+1])
trocas ← verdadeiro
Fim se
Seguinte
Até ~trocas [Até não haver trocas]

Falta criar o algoritmo da operação Troca. Será fácil

temporario ← Idade[coluna]
Idade[coluna] ← Idade[coluna+1]
Idade[coluna+1] ← temporario

Agora podemos construir o algoritmo completo

Algoritmo Ordenação do vector


[Este algoritmo ordena por ordem crescente]
Inteiro coluna, temporario
Quadro Inteiro Idades [5]
Booleano trocas
Repetir
trocas ← falso
Para coluna ← 1 até 4 fazer
Se Idade[coluna] > Idade[coluna+1] então
temporario ← Idade[coluna]
Idade[coluna] ← Idade[coluna+1]
Idade[coluna+1] ← temporario
trocas ← verdadeiro
Fim se
Seguinte
Até ~trocas [Até não haver trocas]
Fim

34 Unidade 1 - Algoritmia Alexandre Alcobia


Escola Sec. de S. João do Estoril Ensino Recorrente - Programação de Computadores

Exercícios

1. Um stand de venda de automóveis, concessionário de uma marca, vende sete modelos


dessa marca. Crie um algoritmo que introduza num quadro bidimensional os modelos
e respectivo preço para posterior consulta.

Pre ço
M ode los
(contos )
modA 2500
modB 3000
modC 2500
modD 3500
modE 2500
modF 3000
modG 4000

O quadro terá de ser do tipo caracter, pois terá que conter a designação do modelo. Será de sete linhas e duas
colunas como se pode ver na tabela acima apresentada.

2. Faça um algoritmo para mostrar os dados contidos no quadro preenchido no exercício


anterior.
Partindo do algoritmo do exercício anterior será fácil construir este.

3. Construa um algoritmo para ordenação dos dados do quadro do exercício 1, por


ordem crescente do preço.
Neste caso, o quadro é bidimensional havendo necessidade de ordenar as duas colunas.
De qualquer modo, a primeira coluna só será ordenada em função da ordenação da segunda, isto é, quando houver
uma alteração da ordem de preços ter-se-á de fazer a alteração na ordem dos modelos respectivos.

Alexandre Alcobia Unidade 1 - Algoritmia 35


Ensino Recorrente - Programação de Computadores Escola Sec. de S. João do Estoril

Cadeias de caracteres (Strings)

Trata-se de uma outra estrutura de dados à qual já fizemos referência no capítulo Tipos de dados.
A esta estrutura está associada uma série de operações básicas que iremos apresentar
seguidamente e que permitem um manuseamento destes dados de uma forma diferente dos dados
numéricos.
Como já vimos anteriormente, o computador trata frases como uma cadeia de caracteres
alinhados e passíveis de serem ordenados. Como exemplo temos “A unidade 1 esta a acabar”, se
ordenado seria “cinco espaços1Aaaaaaabcddeeinrstu”.
O computador pode ordenar os caracteres. Estes são codificados em código binário porque é a
linguagem que a máquina conhece, assim pode estabelecer uma ordem aos caracteres que usa.
É claro que a codificação é convencional e existe, entre outras, um standard muito usado na
microinformática conhecido pelo código ASCII (American Standard Code for Information
Interchange). Na página seguinte é apresentada uma tabela dos caracteres standard desse código.
Os números são o código do carácter que está ao lado - é claro que o número está em base dez por
conversão do código binário.
Para acedermos ao carácter temos de premir a telca Alt mais o número no teclado numérico,
por exemplo o carácter # será Alt + 35.
Este código só tem 128 (de 0 a 127) caracteres, por ser necessário, apareceram extensões ao
código que vão do 128 até ao 255. Estas variam porque incluem caracteres específicos para
compatibilizar com as diversas línguas.

Diz-se código binário porque é baseado na utilização de dois símbolos (0 e 1).


Na máquina será: há energia / não há energia.
Deste modo podemos representar números ou símbolos como, por exemplo:
binário - carácter
0000 - 0
0001 - 1
0010 - 2
0011 - 3
0100 - 4
0101 - 5
0110 - 6
0111 - 7
1000 - 8
1001 - 9
1010 - 10
etc.

36 Unidade 1 - Algoritmia Alexandre Alcobia


Escola Sec. de S. João do Estoril Ensino Recorrente - Programação de Computadores

ASCII Standard
Os primeiros 32 characters (0-31) são códigos de control.

0 NUL Null 33 ! 65 A 97 a
1 SOH Start of heading 34 “ 66 B 98 b
2 STX Start of text 35 # 67 C 99 c
3 ETX End of text 36 $ 68 D 100 d
4 EOT End of transmit 37 % 69 E 101 e
5 ENQ Enquiry 38 & 70 F 102 f
6 ACK Acknowledge 39 ‘ 71 G 103 g
7 BEL Audible bell 40 ( 72 H 104 h
8 BS Backspace 41 ) 73 I 105 i
9 HT Horizontal tab 42 * 74 J 106 j
10 LF Line feed 43 + 75 K 107 k
11 VT Vertical tab 44 , 76 L 108 l
12 FF Form feed 45 - 77 M 109 m
13 CR Carriage return 46 . 78 N 110 n
14 SO Shift out 47 / 79 O 111 o
15 SI Shift in 48 0 80 P 112 p
16 DLE Data link escape 49 1 81 Q 113 q
17 DC1 Device control 1 50 2 82 R 114 r
18 DC2 Device control 2 51 3 83 S 115 s
19 DC3 Device control 3 52 4 84 T 116 t
20 DC4 Device control 4 53 5 85 U 117 u
21 NAK Neg. acknowledge 54 6 86 V 118 v
22 SYN Synchronous idle 55 7 87 W 119 w
23 ETB End trans. block 56 8 88 X 120 x
24 CAN Cancel 57 9 89 Y 121 y
25 EM End of medium 58 : 90 Z 122 z
26 SUB Substitution 59 ; 91 [ 123 {
27 ESC Escape 60 < 92 \ 124 |
28 FS Figures shift 61 = 93 ] 125 }
29 GS Group separator 62 > 94 ^ 126 ~
30 RS Record separator 63 ? 95 _ 127 •
31 US Unit separator 64 @ 96 ‘
32 SP Blank Space (Space Bar)

Alexandre Alcobia Unidade 1 - Algoritmia 37


Ensino Recorrente - Programação de Computadores Escola Sec. de S. João do Estoril

Aqui apresentamos dois códigos ASCII


extendidos. Um designado por 850
Multilingue e outro por 860 Portugal.
É com este tipo de códigos que se
compatibiliza a máquina com os caracteres
próprios de cada língua.

38 Unidade 1 - Algoritmia Alexandre Alcobia


Escola Sec. de S. João do Estoril Ensino Recorrente - Programação de Computadores

Concatenação
Uma operação fundamental no tratamento de cadeias é a concatenação. Consiste na aglutinação
de várias cadeias de caracteres.
Suponhamos que

operação ← “13+7”
igual ← “=”
resultado ← “20”

podemos fazer a concatenação das três cadeias

tudo ← operação + igual + resultado


tudo = “13+7=20”

Foi obtida uma nova cadeia que está atribuída à variável tudo.
Se as cadeias tivessem sido concatenadas numa outra ordem teríamos obtido uma outra cadeia,
assim
tudo ← operação + resultado + igual
tudo = “13+720=”

Agora obtivemos uma cadeia diferente da anterior.

Cadeia nula
Já vimos que uma cadeia de caracteres é formada por vários caracteres, mas, também, por um
só carácter, por exemplo

“?”
Deste modo temos uma cadeia de caracteres com um elemento.
Do que foi apresentado, pudemos estabelecer a existência de uma cadeia sem caracteres, ou
seja, uma cadeia nula (null string), isto é

“”
Uma característica desta cadeia nula é de elemento neutro, isto é,

tudo ← “13+7=20” + “”
então

tudo = “13+7=20”

Alexandre Alcobia Unidade 1 - Algoritmia 39


Ensino Recorrente - Programação de Computadores Escola Sec. de S. João do Estoril

Comparação
Podem-se comparar cadeias de caracteres, uma vez que aos caracteres foi estabelecida uma
relação de ordem (ver tabela ASCII). Pode-se dizer qual está antes ou depois de um determinado
carácter.
A condição de igualdade entre duas cadeias é verdadeira se forem cumpridas duas condições:
- o número de caracteres das duas cadeias é igual;
- para a mesma posição de ordem de cada uma das cadeias está o mesmo carácter.
Exemplo:

nome1 ← “A2eda”
nome2 ← “A2eda”
nome3 ← “Ae2da”

logo nome1 = nome2, mas nome3 ≠ nome1.


Também se podem estabelecer outras relações de ordem como maior (posterior) e menor
(anterior) da mesma forma como se encontram ordenadas num dicionário ou lista telefónica.

Comprimento
Uma outra operação com cadeias é a determinação do seu comprimento, ou seja, o número de
caracteres que a cadeia comporta. Vamos designar esta operação por comp.
Exemplo:
t ← comp(nome1)
então, t ficará com o valor 5, uma vez que a cadeia em nome1 tem cinco caracteres.

Subcadeia
Esta operação permite extrair uma subcadeia a partir de uma outra cadeia maior. Vamos
designá-la por sub e comporta três argumentos conforme se apresenta seguidamente:

sub(arg1, arg2, arg3)

arg1 - é a cadeia da qual pretendemos a subcadeia;


arg2 - é a posição na cadeia em que inicia a subcadeia;
arg3 - comprimento da subcadeia.

Exemplos:
sub(nome3, 2, 2) = “e2”
sub(“A2eda”, 3, 2) = “ed”
Há que tomar atenção de que a contagem dos caracteres na cadeia é feita da esquerda para a
direita.

40 Unidade 1 - Algoritmia Alexandre Alcobia


Escola Sec. de S. João do Estoril Ensino Recorrente - Programação de Computadores

A seguir vamos apresentar um algoritmo que extrai o primeiro nome a partir do nome dado de
uma pessoa.
Vamos supor que o nome é introduzido, somente, com um espaço entre os nomes, isto é, nunca
aparecem espaços no início nem no fim.

Algoritmo Tirar apelido


caracter nome, apelido
inteiro comprimento, posição, tamanho

Início
Entrar nome
tamanho ← comp(nome)
[Verifica em todo o comprimento da cadeia
a posição do último espaço]
Para comprimento ← 1 até tamanho fazer
[Se encontra um espaço, assinala a sua posição na cadeia]
Se sub(nome, comprimento, 1) = “ “ então
posição ← comprimento
Fim se
Seguinte
posição ← posição + 1 [adiciona 1 porque o espaço não interessa]
apelido ← sub(nome, posição) [retira a subcadeia desde posição até ao fim]
Sair apelido
Fim

Exercícios

1. Produza um algoritmo para a determinação da frequência com que cada letra aparece
numa cadeia de caracteres dada.
Como temos que comparar com o alfabeto em maiúsculas e minúsculas partimos de um quadro com três colunas:
uma contém o alfabeto em minúsculas, outra o alfabeto em maiúsculas e a terceira coluna vai receber a quantidade de
ocurrências da respectiva letra.

Algoritmo Letras

Quadro caracter alfabeto [26,3] A a 0


caracter texto
inteiro linha, coluna, tamanho, posição
Este quadro tem 3 colunas e número B b 0
Início de linhas igual ao número de letras
Entrar texto do alfabeto. C c 0
tamanho ← comp(texto) As duas primeiras colunas têm o
[Inicializar a coluna 3 do quadro] alfabeto maiúsculo e minúsculo e a
Para linha ← 1 até 26 fazer D d 0
alfabeto[linha,3] ← 0 terceira o número de ocurrências que
Seguinte terá de ter valor inicial de zero. . . .
[Percorrer toda a cadeia texto]
Para posição ← 1 até tamanho fazer . . .
coluna ← 1 . . .
Repetir [Para cada coluna...]
linha ← 1
Repetir [... verifica todas as linhas até encontrar] Z z 0
Se afabeto[linha,coluna] = sub(texto,posição,1) então
alfabeto[linha,3] ← alfabeto[linha,3] + 1
Fim se
linha ← linha + 1
Até (linha > 26) ∨ (alfabeto[linha,coluna] = sub(texto,posição,1))
coluna ← coluna + 1
Até (coluna > 2) ∨ (alfabeto[linha,coluna] = sub(texto,posição,1))
Seguinte

Para linha ← 1 até 26 fazer


alfabeto[linha,3] ← alfabeto[linha,3]/tamanho
Sair alfabeto[linha,2]
Sair alfabeto[linha,3]
Seguinte
Fim

Alexandre Alcobia Unidade 1 - Algoritmia 41


Ensino Recorrente - Programação de Computadores Escola Sec. de S. João do Estoril

A primeira estrutura PARA serve para inicializar a terceira coluna do quadro para garantir que está tudo a zeros.
A segunda estrutura PARA é para percorrer toda a cadeia de caracteres que está na variável texto.
As estruturas REPETIR...ATÉ servem para percorrer todo o quadro à procura da letra correspondente e adicionar
cada ocorrência na terceira coluna do quadro na respectiva linha da letra.
Pretende-se, também, que quando encontre a letra no quadro para a pesquisa e passe ao carácter seguinte na
cadeia texto. Por isso, aparece condição

(alfabeto[linha,coluna] = sub(texto,posição,1))

nas estruturas REPETIR...ATÉ.


A última estrutura PARA é para calcular a frequência relativa da ocorrência de cada letra e apresentar o carácter e o
valor da sua frequência no ecrã.

2. Construa um algoritmo que, a partir do nome de pessoas, dê somente o primeiro e


último nome.
Sugerimos a análise do algoritmo Tirar apelido.

3. No estudo das cadeias de caracteres indicámos que uma das operações seria
comp(cadeia) que devolvia o número de caracteres da cadeia. Suponha que essa
operação não está disponível. Crie um algoritmo que faça a operação referida.

42 Unidade 1 - Algoritmia Alexandre Alcobia


Escola Sec. de S. João do Estoril Ensino Recorrente - Programação de Computadores

Linguagens de programação

Os computadores comunicam em código binário, isto é, os programas e os dados têm de ser em


código binário para que a máquina os possa entender. A esta linguagem dá-se o nome de linguagem
máquina.
Esta foi a linguagem usada nos primeiros computadores e só especialistas poderiam programar
essas máquinas.
Para facilitar o trabalho de programação, foram desenvolvidos programas tradutores que
transformavam um código feito numa linguagem mais compreensível por humanos, em linguagem
máquina. Esses programas eram conhecidos como assembladores (do inglês assembler) que
traduziam uma linguagem mais próxima da humana para a linguagem máquina.
Posteriormente, surgiram programas que usavam linguagens mais desenvolvidas e mais
próximas da linguagem falada (em geral inglês) e independentes da estrutura da máquina. Estas
linguagens são conhecidas como linguagens de alto nível, pois permitem que o programador não
necessite de ter algum conhecimento sobre o funcinamento interno do computador.
De uma forma genérica, podemos dizer que há duas maneiras destes programas fazerem
atradução para a linguagem máquina: temos os compiladores que produzem um programa em
linguagem máquina e que, depois, pode ser usado; por outro lado, temos os interpretadores que
vão traduzindo o texto escrito na linguagem de alto nível enquanto este é executado.
A construção de um programa compilado implica a criação de um programa fonte que é o texto
na linguagem de alto nível. Depois, este é compilado produzindo um programa em linguagem
máquina chamado programa objecto.
Este programa objecto não é legível para o programador, pelo que terá de recorrer sempre ao
programa fonte, este sim, texto legível pelo programador.
Para exemplo, temos o QuickBASIC, ao qual o leitor terá fácil acesso através do conhecido
MS-DOS, trata-se de uma linguagem de alto nível interpretada. No entanto, o TurboPascal é
compilado.
No início da unidade vimos que a criação de um programa passa pela construção do algoritmo
do problema em estudo e, depois, tendo em conta o tipo de problema tratado, escolhe-se a
linguagem conveniente e procede-se à fase de implementação para que possa realmenter ser usado
num computador.

Exemplos de linguagens de alto nível:

FORTRAN - Formula Translation


ALGOL - Algorithmic Language
BASIC - Beginner’s All-pourpouse Simbolic Instruction Code
COBOL - Common Busyness Oriented Language
Pascal
C++

Alexandre Alcobia Unidade 1 - Algoritmia 43

Potrebbero piacerti anche