Upload
dangtruc
View
215
Download
0
Embed Size (px)
Citation preview
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 1
Linguagens de Programação
Para comunicar com um computador é necessário que ele entenda o utilizador e
que o utilizador o entenda. Isto é um problema de comunicação que se resolve utilizan-
do uma linguagem (ou linguagens) que ambos sejam capazes de descodificar com
precisão. Já se conhece uma linguagem que estabelece um primeiro nível de comuni-
cação: o Sistema Operativo. Mas este não permite realizar uma infinidade de tarefas
específicas como, a contabilidade de uma empresa ou a sua facturação, o desenho da
planta de uma casa, a gestão dos sócios de um clube, a resolução de uma equação
matemática, etc.. Para isso é necessário usar uma linguagem de programação que
permita criar uma aplicação (programa) que realize aquelas tarefas. Então, pode dizer-
se, que uma aplicação assenta numa linguagem, ou seja, num modo específico de
comunicação com a máquina.
Linguagens de programaçãoLinguagens de programaçãoLinguagens de programaçãoLinguagens de programaçãoLinguagens de programação são sistemas de escrita para
enunciar as operações a executar por um computador.
ououououou
Conjunto de indicações em código que se transmitem a um
computador para dar resposta a um dado problema.
Como sistema de escrita, uma linguagem de programação (como qualquer outra
linguagem, como o Português, por exemplo) é composta por:
• Uma terminologia ou semântica - ou seja, um conjunto de termos, palavras, carac-
teres ou sinais que assumem determinados significados para o computador;
• Um conjunto de regras ou sintaxe - que estipulam o modo correcto de utilizar os
termos da linguagem para formular instruções válidas para a máquina.
Linguagem Máquina
Já se sabe que tudo o que o computador faz é sob as ordens de um programa e
que, a única linguagem que o computador entende é a dos bits. Esta linguagem consiste
na representação dos dados por sequências de zeros e uns, que desencadeiam deter-
minadas acções no processador; por isso, esta linguagem é conhecida por linguagem
máquina ou código máquina.
As linguagens baseadas em código máquina designam-se por linguagens de baixo
I - ALGORITMIA - Conceitos Básicos
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 2
nível, pois encontram-se ao nível do hardware e são executadas directamente pela CPU
obedecendo a instruções que contêm um código de operação e um ou mais endereços
de memória.
Estas linguagens são pouco práticas e, a sua utilização, implica o conhecimento
profundo da arquitectura da máquina, o que nem sempre é viável. A programação em
linguagem máquina é bastante difícil, em particular porque:
• O programador deve memorizar todos os códigos de operação ou consultar cons-
tantemente um manual com tais códigos;
• O programador deve lembrar-se de todos os endereços de memória que contêm
informação;
• Como o programa e os dados são armazenados sequencialmente na memória
central, a introdução ou remoção de instruções no programa, pode acarretar a
alteração de todos os endereços e consequentemente a alteração de todo o
programa;
• A programação está sujeita a muitos erros, pois a troca de zero por um ou vice-
versa muda o significado de uma instrução.
Assim, para facilitar a tarefa dos programadores foram criadas diversas lingua-
gens de programação.
Linguagem Simbólica ou de Montagem
Inicialmente, na década de 1950, criou-se uma nova linguagem semelhante à lin-
guagem máquina mas com os códigos de operação substituídos por mnemónicas e com
os endereços de memória correspondentes aos dados, substituídos por nomes simbóli-
cos. A esta linguagem simbólica de montagem chamou-se Linguagem Assembly.
Um programa em linguagem Assembly é convertido para linguagem máquina por
um tradutor (ou programa de montagem) denominado Assembler. Este tradutor recebe
o programa em linguagem Assembly, substitui cada uma das suas instruções pela instrução
equivalente em linguagem máquina e finalmente executa o programa em linguagem má-
quina. A versão em linguagem simbólica do programa é normalmente conhecida por
programa (ou código) fonte, e a versão já traduzida em linguagem máquina é conhecida
por programa (ou código) objecto.
Esquematicamente:
Sob o ponto de vista da programação, esta linguagem apresenta as seguinte des-
vantagens:
PROGRAMA-FONTE PROGRAMA-OBJECTOTRADUTOR
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 3
• Cada instrução executa uma operação muito simples (soma, subtracção, etc.)
dando origem a programas muito longos;
• A linguagem é orientada para a máquina em vez de ser orientada para as aplica-
ções, isto é, o programador tem que pensar em termos de organização da má-
quina (registos internos, posições de memória, número de endereços, opera-
ções básicas) em vez de pensar em termos da aplicação que está a programar;
• Um programa escrito para uma máquina não pode ser executado numa máquina
diferente.
Linguagens de Alto Nível
Apareceram então, na década de 1960, linguagens mais poderosas, de mais fácil
utilização e compreensão: as linguagens de alto nível, para que qualquer utilizador
possa programar sem dificuldade de maior.
As linguagens de alto nível baseiam-se em linguagens correntes (sendo o Inglês a
mais utilizada), têm regras e sintaxe próprias e os conceitos e notações deste tipo de
linguagens são mais apropriados para o tipo de problemas a resolver, que aqueles dita-
dos pela estrutura interna do computador. Isto torna a linguagem orientada para a pes-
soa e não para a máquina. Além disso os programas são portáteis; um programa desen-
volvido numa máquina pode correr perfeitamente noutra com uma arquitectura diferente,
se a linguagem utilizada for igual nos dois casos.
Entre as linguagens de alto nível mais divulgadas encontram-se as seguintes:
FORTRAN (Formula Translation) - IBM 1956
Foi criada para aplicações científicas que envolvem muitos cálculos, complexos,
precisos, e rapidamente executados, como por exemplo em problemas de astronomia .
Os dialectos mais conhecidas são o FORTRAN II e o FORTRAN IV.
COBOL (Common Bussiness Oriented Language) - EUA 1960
Linguagem introduzida por um grupo de grandes utilizadores de computadores,
fabricantes e órgãos do governo norte-americano. Baseia-se mais que qualquer outra na
linguagem inglesa corrente. É muito utilizada em aplicações de índole comercial com
cálculos leves mas que utilizem grandes quantidades de informação, em virtude das
suas capacidades para manipular ficheiros. É das linguagens mais utilizadas hoje em
dia.
ALGOL (Algoritmic Language)
Linguagem introduzida em 1960 por um comité internacional. Orientada para o
cálculo científico e para a descrição formal de algoritmos.
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 4
PL1 (Programming Language 1) - IBM 1965
Propunha-se reunir as três linguagens anteriores. Tinha por finalidade servir como
linguagem universal, aplicável tanto a problemas científicos como comerciais.
BASIC (Beginner’s All-Purpose Symbolic Instruction Code) - EUA 1965
Surgida para servir com facilidade interesses de não especialistas, mais interes-
sados na resolução de problemas do que no estudo dos aspectos mais delicados da
programação. Utiliza o Inglês corrente e simbologia matemática. É orientada para os
microcomputadores, educação e pequenos problemas de gestão. Há diversos dialectos:
M-BASIC, MS-BASIC, GW-BASIC, BASIC-1, BASIC-2, QUICK BASIC e TURBO BASIC.
PASCAL (em honra do matemático Blaise Pascal) - Suiça 1971
Linguagem orientada para aplicações científicas, tornando fácil o desenvolvimen-
to e manutenção de grandes programas. Influenciou a maioria das linguagens de progra-
mação e por apresentar uma estruturação lógica e modular é também muito utilizada
para aprender a programar. Utiliza o Inglês e, dos muitos dialectos existentes, o mais
conhecido é o TURBO PASCAL.
PROLOG (Programming Logic) - França 1972
Linguagem baseada na lógica dos predicados e utilizada em Inteligência Artificial.
Foi a linguagem escolhida para o projecto japonês da quinta geração.
C - Bell Telephone 1972
Criada em ambiente UNIX para o desenvolvimento de software de sistemas, rapi-
damente se divulgou devido às suas potencialidades. A linguagem C é considerada de
nível médio por ser composta por um conjunto mínimo de declarações de controlo e
manipulação de dados (que não são normalmente acessíveis em linguagens de alto
nível) que os programadores podem utilizar para construir comandos de alto nível. As
aplicações mais complexas foram elaboradas nesta linguagem. O dialecto C++, actual-
mente considerada a linguagem mais poderosa, tem sido utilizada pela Microsoft para
produzir aplicativos do mais conhecido ambiente integrador gráfico para PC’s, o
WINDOWS. Foi utilizada para criar gráficos e efeitos especiais em filmes como A Guerra
das Estrelas.
Program CalArea; MOV AL, DH 10101010100100101
Var raio, area : Real; DIV BL 01010000101111100
Begin ADD Al, DL HARDWARE
Write('Qual o raio?');
Programa numa linguagem de Programa em Assembly Programa em Linguagem-
alto nível Máquina
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 5
Além destas, muitas outras linguagens foram desenvolvidas: RPG, APL, CLIPPER,
LIST, MODULA 2, LOGO, JAVA, etc., com interfaces e ambientes de trabalho cada vez
mais amigáveis (como o caso das linguagens visuais: Visual Basic, Visual C++ e Delphi)
permitindo a um programador escolher a linguagem de programação mais indicada para
a elaboração de uma aplicação particular. No entanto, como já se sabe, não basta o
programador conhecer a linguagem: é necessário torná-la legível para o computador, o
que se consegue recorrendo a um programa tradutor.
Há dois tipos de tradutores:
Compilador e Interpretador
Compilador
O programa-fonte escrito em linguagem de alto nível é traduzido integralmente em
linguagem-máquina (compilação). É uma operação que se faz de uma só vez e que,
normalmente, indica os erros ou incorrecções de sintaxe (caso existam), mas, que não
permite ir observando passo a passo, o que cada instrução do programa faz. Quando
isento de erros e depois de incorporadas ao programa-objecto as bibliotecas do utilizador
e do sistema, é criado um programa (ficheiro com extensão EXE) que pode ser executa-
do independentemente do compilador. Há vários tipos de compiladores e cada um é
classificado de acordo com o código de saída que gera.
Os compiladores tem a vantagem de compilar de maneira imediata, com execução
rápida e com tamanho reduzido de código. No entanto os programas devem ser total-
mente recompilados quando ocorrem alterações.
Interpretadores
Traduzem o programa directamente no computador específico, interpretando a
linguagem de alto nível, instrução a instrução e chamando as bibliotecas apropriadas
quando requeridas.
Os interpretadores são fáceis de se usar, permitem a correcção imediata dos
erros e o desenvolvimento rápido de programas não muito complexos. No entanto, um
interpretador é muito mais lento que um compilador.
TRADUTOR
(COMPILADOR)
PROGRAMA-OBJECTO
(PROGRAMA EM LINGUAGEM-
-MÁQUINA)
PROGRAMA-FONTE
(EM LINGUAGEM DE ALTO
NÍVEL)
TRADUTOR
(INTERPRETADOR)
PROGRAMA-FONTE
(EM LINGUAGEM DE ALTO
NÍVEL OU ASSEMBLY) SAÍDA
(EXECUÇÃO)
ENTRADA
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 6
Linguagens da quarta geração
É usual atribuir “gerações” às linguagens-máquina, assembly e de alto nível. O
avanço das linguagens-máquina (primeira geração) para as linguagens Assembly (se-
gunda geração) trouxe aproximadamente um progresso de sete para um à actividade do
programador. Um progresso semelhante ocorreu quanto as linguagens de alto nível (ter-
ceira geração) foram introduzidas. Actualmente, um grande número de programadores
está a desenvolver e a introduzir uma variedade enorme de instrumentos de aplicação
que podem oferecer ainda maiores progressos na produtividade. Tais rotinas (pequenos
programas) são frequentemente referidos, no seu conjunto, como linguagens de quarta
geração - 4GL. Um programa 4GL actua interactivamente com o software de Sistema de
Gestão de Base de Dados (SGBD) para armazenar, tratar e recuperar os dados necessá-
rios, para satisfazer as necessidades do utilizador. Uma linguagem de alto nível é
procedimental, isto é, requer do programador a especificação dos passos do
processamento necessários para atingir o resultado desejado. Uma 4GL é não-
procedimental, isto é, permite ao utilizador especificar simplesmente qual deve ser o tipo
sem ter que descrever todos os detalhes de como os dados devem ser manipulados para
produzir tal resultado.
Não é possível dar uma definição clara de 4GL uma vez que cada rotina ou Lin-
guagem é o produto de um programador específico, e os vendedores não estão de
acordo relativamente a uma padronização.
Uma linguagem com rotinas deste tipo é o CLIPPER (linguagem para sistemas de
gestão de base de dados).
Linguagens de Quinta Geração ou Naturais
Encontram-se ainda numa fase de desenvolvimento e destinam-se a facilitar, como
sempre, a comunicação entre o Homem (utilizador) e o computador. Trata-se da utiliza-
ção, e compreensão por parte do computador, das linguagens naturais (como o inglês, o
português ou o japonês). Espera-se que a introdução destas linguagens venha permitir,
entre outras coisas, a aprendizagem por parte do computador. Devido às necessidades
de grandes quantidades de memória e de velocidades de processamento muito eleva-
das, o desenvolvimento deste tipo de linguagens tinha-se limitado, até há pouco, aos
sistemas mainframes e aos supercomputadores. O rápido aumento de tais capacidades
nos microcomputadores, sobretudo após o desenvolvimento dos microprocessadores
486 e Pentium, fez com que algumas casas de software começassem a desenvolver
versões de linguagens naturais para os computadores pessoais.
Uma das vias de aplicação mais importante para estas linguagens serão os
interfaces de entrada de voz nos sistemas de computador.
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 7
Etapas do desenvolvimento de uma aplicação
Depois de se saber o que é uma linguagem de programação, é altura de começar
a concretizar o objectivo principal deste módulo: como criar um programa para o compu-
tador e quais as ferramentas e métodos para isso.
Um problema ou uma determinada tarefa, a resolver ou desenvolver por meios
informáticos, requer a realização dos seguintes passos :
1. Análise; Fase de resolução do problema
2. Concepção;
3. Implementação; Fase de implementação
4. Teste.
A concentração e o investimento de tempo nos dois primeiros passos: fase de
resolução do problema é fundamental para a resolução rápida e eficaz de um progra-
ma, uma vez que, é preciso entender de um modo aprofundado aquilo que é pedido
(análise), para depois conceber a sua resolução (concepção). É nesta fase que é elabo-
rado um algoritmo que visa a resolução do problema proposto. Só depois da formulação
de um algoritmo adequado, se passará à sua implementação numa linguagem de progra-
mação para posterior execução e teste: fase de implementação. Note-se que só nesta
última fase se faz uso do computador.
Análise
O projecto de um sistema informático ou de um simples programa requer uma
investigação preliminar: estudo teórico do problema, elaboração de inquéritos para se
obterem informações sobre o sistema a informatizar, observação no local do modo de
funcionamento do sistema, registo e recolha de documentos que representem a informa-
ção que anda em jogo, etc. Depois de compreendido todo o funcionamento (eventual-
mente retendo os aspectos positivos e propondo melhoramentos) passa-se á
esquematização, elaborando diagramas, onde de uma forma simples e bem documenta-
da se representam todas as entidades, processos, fluxos de informação e armazenamentos
de dados envolvidos. Tudo isto resulta num esquema genérico, que contém em si a
resolução do problema. O aprofundamento da análise depende da complexidade do sis-
tema ou problema, existindo métodos e ferramentas próprios, cujo estudo sai do âmbito
deste módulo.
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 8
Concepção
Depois de compreendido e esquematizado o sistema ou problema, deve pensar-
se na melhor maneira de o resolver, passo a passo, de uma forma estruturada, clara,
eficiente e genérica tendo sempre presente que o problema é para ser resolvido por
meios informáticos e por isso os passos da resolução não podem ser ambíguos e terão
de ser em número finito.
Durante a concepção deve ser elaborado um dicionário dos dados identificados
na análise, onde serão descritos em termos de nome, tipo (se é um número, um caracter,
etc.) e significado. Depois será elaborado um algoritmo (código de escrita em que se
utilizam representações simbólicas para indicar as instruções do programa) que não é
mais que a resolução do problema, passo a passo. Este algoritmo poderá evoluir para
pseudocódigo onde se usam representações simbólicas que são um misto de palavras
da nossa linguagem natural com termos e notações típicas de uma linguagem de progra-
mação. O uso do pseudocódigo presta-se a uma aproximação sucessiva à versão do
programa na linguagem de programação utilizada, ou seja, pode-se ir progressivamente
por fases, revendo o pseudocódigo e substituindo-o progressivamente por terminologia
própria da linguagem de programação.
Implementação
Consiste em transcrever para o computador, usando a linguagem de programação
escolhida e um editor, a definição dos dados e o algoritmo, que é transformado em
instruções dessa linguagem, gerando-se assim o código-fonte. De seguida este código
é traduzido para código-objecto com o auxílio de um tradutor (compilador ou interpretador).
O processo estará completo quando o código-fonte estiver correctamente escrito de acordo
com as normas impostas pela linguagem. Se houver erros de sintaxe, o tradutor não os
deixará passar e o código-fonte terá de ser revisto para poder gerar o código objecto.
Esta fase de correcção dos erros, quanto às normas impostas pela linguagem costuma
chamar-se de depuração (debugging).
Teste
Depois de obtido o código-objecto, e de ter sido ligado (lincagem) a outros códi-
gos-objecto (rotinas em bibliotecas da linguagem e do Sistema Operativo) fica-se com
um programa executável em código-máquina que deverá ser testado para se verificar a
sua integridade e eficiência. Um programa pode estar escrito sem qualquer erro do
ponto de vista das normas da linguagem (isto é sem erros de tradução) mas ter falhas do
ponto de vista dos objectivos que se pretendiam alcançar, por imprecisões, deficiente
formulação algorítmica, vícios de raciocínio, etc.
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 9
Estes testes deverão ser realizados por vários utilizadores e com dados diversifi-
cados. Qualquer erro detectado implica regressar de novo à concepção ou à análise
para ser corrigido. Este processo repete-se até que não existam erros. A implementação
e teste de um programa será objecto de estudo no módulo seguinte.
Algoritmos
Tal como muitas das tarefas diárias são feitas com base em decisões mais ou
menos elaboradas, também a electrónica sofisticada de um computador, de uma máqui-
na multibanco, de uma máquina de lavar, etc. executa sequências de instruções de um
programa.
Aquelas tarefas podem escrever-se num papel em linguagem corrente, sendo muitas
vezes a sua descrição baseada num processo sequencial partindo-se depois para uma
tradução desses processos utilizando uma linguagem estruturada.
Considerando vários níveis para a apreensão de uma linguagem, pode-se tomar
como base de referência a linguagem natural, estando mais abaixo o processo cognitivo
(interiorização de imagens, sons, etc., que rodeiam o ser humano), e acima representa-
ções simbólicas utilizadas na matemática e na programação. Grande parte do trabalho
para a referida tradução pertence à Algoritmia, pois é necessário partir de uma lingua-
gem em que o Homem se exprime e comunica quase sem regras, para um mundo de
regras e estruturas que regem o computador.
Cabe à Algoritmia como técnica de desenvolvimento de algoritmos, uma primeira
descrição das acções necessárias e suficientes para resolver um problema e obter resul-
tados, podendo-se considerar um algoritmo como o esquisso de um programa.
Um algoritmo algoritmo algoritmo algoritmo algoritmo pode ser definido como uma sequência
ordenada, e sem ambiguidades, de passos (em número
finito) que levam à resolução de um problema.
Apesar do termo em si ser novo, o conceito é bastante familiar: de uma forma
muitas vezes explícita recorre-se ao uso de algoritmos (por exemplo, a procura de um
número de telefone, a determinação de um caminho para um determinado lugar, a elabo-
ração de uma receita culinária, a pesquisa da avaria de uma viatura, etc.); e outras vezes
de uma forma implícita (por exemplo, por um CD a tocar, fazer um telefonema, etc.)
Embora o número e a sequência de passos, associados a uma determinada tare-
fa, possa parecer de fácil compreensão enquanto agente executor dessa mesma tarefa,
já a linguagem e descrição terá de ser diferente para outro executor . Por exemplo, o
projecto e cálculos envolvidos na elaboração da planta de uma casa resulta num algoritmo
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 10
com um conjunto de desenhos e indicações para o executor-construtor executar; se a
tarefa de cálculo e desenho for executada por um programa num executor-computador,
então as descrições das acções de cálculo e desenho têm de ser refinadas num algoritmo
para conversão em instruções de uma linguagem de programação.
De tudo o que foi dito, conclui-se que o uso de algoritmos tem como objectivo final
fazer uma descrição ao nível do executor, isto é, detalhar as acções em instruções ou
ordens de acordo com as possibilidades do agente executor (no caso o computador).
O seguinte exemplo trata, com um algoritmo, a obtenção de uma chamada telefó-
nica interurbana (numa rede automática):
1 Levantar o auscultador
2 Marcar o indicativo e o número de telefone local
3 Aguardar até obter resposta humana
4 Se for obtida resposta humana então
4.1 Falar
Caso contrário
4.2 Pousar o auscultador
A sequência de instruções é finita e foram utilizadas representações numéricas e
de indentação das instruções (alinhamento do texto) para facilitar a distinção de qual a
instrução seguinte a executar.
Para um executor que não soubesse o significado de “marcar” ou de “sinal de
chamada”, ou reconhecer todas as indicações feitas, era necessário avançar no grau de
detalhe. Finalmente, salienta-se que, a utilização deste algoritmo não poderia ter êxito,
se não se dispuser dos dados (de entrada) relativos ao indicativo da zona de destino e
número de telefone.
Foi usada a linguagem descritiva corrente, para apresentação do algoritmo pas-
so-a-passo, no entanto, eles podem ser expressos de outras formas.
Tipos de Algoritmos
1. Descrição narrativa;
2. Descrição detalhada em linguagem corrente dos passos para a resolução;
3. Descrição detalhada em pseudocódigo dos passos para a resolução;
4. Fluxogramas;
Veja-se, com o exemplo simples da soma de dois números A e B, como construir
um algoritmo para cada um das quatro representações anteriores.
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 11
Descrição narrativa
É narrada, em linguagem corrente, a resolução do problema.
Ler ou pedir dois números chamados A e B. Em seguida calcular a sua
soma e guardá-la no número chamado C. Por último escrever ou fornecer o
valor de C.
Descrição, passo a passo, em linguagem corrente
É feita uma descrição detalhada recorrendo à linguagem corrente, tentando man-
ter um certo rigor e clareza. Os passos são numerados e a escrita é indentada para
facilitar a distinção de qual o passo ou instrução a executar a seguir (como no algoritmo
da página anterior e no exercício resolvido nº 1)
.
Passo 1 : Pedir o número A
Passo 2 : Pedir o número B
Passo 3 : Fazer C tomar o valor de A + B
Passo 4 : Fornecer o número C
Pseudocódigo
É utilizada uma sequência de frases (em português) e uma simbologia muito pró-
xima da usada por uma linguagem de programação, para descrever as acções do algoritmo,
que se convencionam de uma forma abreviada em relação à descrição em linguagem
corrente (tipo de algoritmo anterior). O pseudocódigo não pode ser implementado direc-
tamente no computador, mas o formalismo implícito é muito semelhante a muitas lingua-
gens de programação (como por exemplo o PASCAL). Nada impede, no entanto, que
fosse construído um compilador que aceitasse o mesmo (daí o nome pseudocódigo).
Ler A
Ler B
C ← A + B
Escrever C
Fluxogramas
Consiste em representar de uma forma gráfica a descrição de um algoritmo. Para
o efeito são utilizados símbolos geométricos (diagramas) e setas (fluxos) indicando um
sentido de execução da sequência:
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 12
A
C
Fim
Início
B
C <- A + B
Fim
C <- A + B
Início
Ler B
Ler A
Escrever C
ENTRADA/SAÍDA
INÍCIO OU FIM DO PROGRAMA
LER A E B PELO TECLADO
OU
PROCESSAMENTO INTERNO
ESCREVER C NO MONITOR
O problema do exemplo apresentado é tão simples, que poderia surgir a tentação
de o escrever directamente numa linguagem de programação. O tempo e a prática vão
encarregar-se de demonstrar que mesmo em problemas pouco complexos uma visão
global, planeamento e respectivo algoritmo são indispensáveis. A elaboração de um
algoritmo permite também a abstracção de certos conceitos e a não “viciação” num certo
estilo de programação prejudiciais à boa análise e resolução do problema. Tal como em
outras actividades, a programação exige um certo grau de experiência e prática, para
facilmente se encontrar o caminho mais indicado.
Como os algoritmos construídos destinam-se a serem codificados numa lingua-
gem de programação serão usados daqui em diante somente os fluxogramas e o
pseudocódigo.
Características de um Algoritmo
Qualquer algoritmo correctamente elaborado e algumas boas técnicas de progra-
mação, devem transmitir ao programa as seguintes características desejáveis:
• Integridade Os cálculos terão de ser correctamente efectuados.
• Clareza Um programa deve ser facilmente lido e entendido tanto pelo pro-
gramador como por outro utilizador.
• Simplicidade O programa deverá ter uma estrutura simples e linear.
• Eficiência Tem a ver com a velocidade de execução e com a utilização efectiva
de memória. Em programas complexos terá de existir um compro-
misso entre estas duas características.
• Modularidade Os grandes programas devem ser divididos numa série de subtarefas
identificáveis. É de boa prática implementar cada uma destas
subtarefas em módulos de programa separados.
•Generalidade Quer-se um programa que seja tão genérico quanto possível, de
forma a abranger um grande número de tipo diferentes de dados.
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 13
O rigor imposto na descrição dos algoritmos bem como a insistência em determi-
nados pormenores que possam parecer excessivos para o Homem como agente execu-
tor, é indispensável em linguagens de programação onde o agente executor é o compu-
tador.
Interessa agora estudar cada elemento constituinte dos algoritmos e a simbologia
usada para os descrever.
Dados
Em qualquer linguagem de programação trabalha-se com dados que são identifi-
cados e descritos na fase de resolução do problema. Viu-se também, que as três fun-
ções básicas de um programa são:
• ler (pedir ou introduzir) os dados de entrada (input);
• processar os dados de entrada e eventualmente outros que são constantes
• escrever (sair ou fornecer) os dados de saída (output)
É por isso fundamental saber que tipos de dados existem e como os manipular.
Tipos de dados
Os dados podem ser simples e devem ser entendidos como representando um
único valor de um determinado tipo (um número, um valor lógico, um caracter ou uma
cadeia de caracteres); ou estruturados e representam um conjunto de valores.
Podem resumir-se e classificar-se no seguinte quadro:
inteiros (integer)
numéricos reais (real)
Simples lógicos ou booleanos (boolean)
um caracter (char)
cadeia de caracteres (string)
tabelas, quadros ou matrizes (array)
Estruturados registos (record)
ficheiros (file)
Dados Numéricos
Podem ser números inteiros (sem casas decimais) ou reais (com casas decimais).
Devem ser entendidos como o são na matemática, exceptuando o intervalo de valores.
Enquanto que na matemática o intervalo é infinito, num programa de computador devido
às limitações de memória, o intervalo é finito. Assim, tipicamente, um dado inteiro é
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 14
representado por 2 bytes, pelo que só pode ser usado, sem erro, se estiver no intervalo
de -32 767+1 a +32 767 (2 bytes dão uma combinação de 216
números = 65536; metade
para os números negativos e a outra metade para os positivos). No caso dos números
reais o intervalo é muito maior pois utilizam 8 bytes de memória, suficientes para a mai-
oria das aplicações numéricas correntes.
Dados Lógicos ou Booleanos
Representam os dois valores lógicos: Verdadeiro (true) ou Falso (false). São usa-
dos em situações em que só existam dois estados possíveis (Sim/Não, 0/1, Activado/
Desactivado, Ligado/Desligado, etc.). São a base da maior parte das estruturas
algorítmicas de controlo.
Dados Caracter ou Cadeia de Caracteres
Uma cadeia de caracteres é uma sequência de caracteres (isto é, letras dígitos e
caracteres especiais) entre plicas ( ‘ e ‘ ). São utilizados para representar texto, mensa-
gens, nomes, moradas, etc. O número máximo de caracteres que pode ser incluído numa
cadeia é tipicamente de 255, suficientes para a maioria das necessidades.
Tabelas
Representa uma estrutura de dados sob a forma de linhas e colunas (como numa
folha de cálculo ou no jogo “Batalha Naval”). Quando uma tabela só tem uma linha (ou
uma só coluna) é chamada de vector. Cada elemento da tabela é referenciado por inter-
médio de um índice (número da linha e número da coluna). Por exemplo o elemento [2,1]
corresponde ao dado que está na intersecção da linha 2 com a coluna 1.
Tipicamente, uma tabela é constituída por elementos todos do mesmo tipo, e é
usada em situações em que a informação tem de ser guardada em memória para que se
possa tratá-la como um bloco ou individualmente.
Registos
Representa uma estrutura de dados composta por elementos de diferentes tipos
conhecidos por campos (como numa base de dados). É usada para representar uma
entidade (um livro, um cliente, um produto, etc.) caracterizada por diferentes atributos
(nome, morada, telefone, etc.).
Ficheiros
Pode ser de qualquer um dos tipos anteriormente descritos e serve para guardar
os dados em memória secundária, uma vez que todos os outros tipos de dados residem
na memória central que como se sabe é volátil.
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 15
Identificadores
Qualquer dado (de entrada, de saída ou auxiliar) e outros elementos de programa-
ção devem ser identificados no programa por um nome: identificador.
Um identificador é um nome normalmente atribuído, pelo
programador ou utilizador, a um elemento com que se
pretende trabalhar dentro de um programa.
• Este nome deve ser sugestivo, isto é, deve estar de acordo com o seu significado ou
função dentro do programa.
• Há também algumas regras a seguir para construir um identificador correctamente
quando for usada uma linguagem de programação em vez do pseudocódigo; para já
é conveniente que os nomes compostos não levem espaços (por exemplo o
identificador número 1 deverá ser número1 ou número_1).
• A atribuição correcta de um nome é fundamental para transmitir clareza ao algoritmo
e por conseguinte ao programa.
• É o dicionário de dados elaborado na fase de resolução do problema que os deverá
descrever em termos de nome, tipo e significado.
Variáveis e constantes
Como se sabe, uma das características de um programa é a sua generalidade,
pelo que, ele não poderá funcionar só para um valor específico de dados. Por exemplo,
um programa que permita calcular a área de um círculo não o poderá fazer só para um
caso particular de um círculo com 2 metros de raio: terá de calcular a área de qualquer
círculo (qualquer valor do raio). Assim, é necessário que o dado de entrada (o raio) seja
variável (o mesmo acontece para o dado de saída, a área, que depende do raio).
Um identificador cujo valor pode variar durante a execução do
programa é designado por variável.
Do mesmo modo, há dados que são necessários para o processamento mas cujo
valor não é lido nem calculado: define-se e mantém-se constante durante a execução do
programa. Por exemplo, para o cálculo da área de um círculo é necessário conhecer o
valor de π (3,1416...) que é sempre o mesmo qualquer que seja o círculo.
O identificador é designado por constante se o elemento de informa-
ção que representa se mantém inalterável ao longo do programa.
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 16
Identificadores e Endereços de Memória
Quando se trata de uma variável, um identificador terá de ser entendido de formas
diferentes:
• No algoritmo e no código-fonte do programa deve ser entendido como já foi referido:
representa simbolicamente um dado, isto é, designa simbolicamente por meio de
uma letra ou palavra um endereço de memória.
• Na compilação vai traduzir-se num endereço relativo de memória, ao qual irá
corresponder um determinado espaço nessa mesma memória (2 bytes no caso da
variável ser inteira) para armazenar o dado (o valor que a dita variável assume a
qualquer momento) quando o programa for executado.
• Na execução, o identificador (que começou por ser um endereço simbólico e depois
passou a relativo) passa a representar um endereço absoluto, isto é, torna-se efecti-
vamente um endereço de memória principal do computador mas ainda sem qualquer
valor. Quando o dado representado pelo identificador é utilizado ao ser executado o
programa, o seu valor ficará armazenado na zona de memória correspondente.
Esquematicamente:
No algoritmo ou no código-fonte tem-se a instrução:
Ler A A É REPRESENTAÇÃO SIMBÓLICA DE UM DADO
Depois da compilação desta instrução:
1
CÓDIGO-MÁQUINA DO COMANDO LER ENDEREÇO RELATIVO DE A
No início da execução do programa tem-se na memória, além do programa, uma zona de
dados com:
1 2 3 ... ENDEREÇOS ABSOLUTOS
CONTEÚDO
Quando a execução chega a esta instrução é pedido um valor ao utilizador (por exemplo
2,5) e a memória fica:
1 2 3 ... ENDEREÇOS ABSOLUTOS
2.5 CONTEÚDO
Pode, tipicamente, atribui-se um valor a uma variável (colocar um valor na zona de
memória reservada a essa variável) de duas formas (como se verá adiante):
• lendo o seu valor com uma instrução de leitura (por exemplo, Ler A)
• por intermédio de uma instrução de atribuição (por exemplo, C ← (A + B)
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 17
Quando o identificador é uma constante deve ser entendido no algoritmo e no
código-fonte do mesmo modo que uma variável não sendo, no entanto, candidato a en-
dereço de memória uma vez que o valor da constante fica incorporado no código do
programa durante a compilação. Há no entanto linguagens de programação que não
fazem distinção entre variáveis e constantes nos termos antes descritos: é ao programa-
dor que cabe a tarefa de ter cuidado em não alterar, inadvertidamente, o valor que consi-
derou constante.
Operações com os Dados
A maior parte das vezes, os dados (variáveis e constantes) e outros elementos de
programação terão de ser operacionados. Segue-se um resumo das operações usuais,
e sua simbologia, aplicáveis aos diferentes tipos de dados simples.
TIPO DE DADOS OPERADOR DESCRIÇÃO TIPO DE RESULTADO
+ ADIÇÃO INTEIRO
- SUBTRACÇÃO INTEIRO
* MULTIPLICAÇÃO INTEIRO
INTEIROS / DIVISÃO REAL REAL
**, ̂ POTENCIAÇÃO INTEIRO
DIV DIVISÃO INTEIRA INTEIRO
MOD, % RESTO DA DIVISÃO INTEIRA INTEIRO
+ ADIÇÃO REAL
- SUBTRACÇÃO REAL
REAIS * MULTIPLICAÇÃO REAL
/ DIVISÃO REAL
**, ̂ POTENCIAÇÃO REAL
AND, E CONJUNÇÃO VALOR LÓGICO
LÓGICOS OR, OU DISJUNÇÃO VALOR LÓGICO
NOT, NÃO NEGAÇÃO VALOR LÓGICO
CARACTERES + CONCATENAÇÃO CARACTER
Uma operação, na sua forma simples, é constituída por dois (binária) ou um (unária)
operandos e um operador, e fornece um resultado de um determinado tipo.
Existe ainda uma classe importante de operadores, que podem ter como operandos
qualquer tipo de dados simples. São os operadores relacionais que permitem estabele-
cer uma relação de ordem (comparação) entre dados do mesmo tipo e, por isso, o resul-
tado é sempre um valor lógico.
A tabela seguinte resume este tipo de operadores:
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 18
OPERADOR DESCRIÇÃO
= COMPARAÇÃO (IGUALDADE)<>, # COMPARAÇÃO (DESIGUALDADE)> COMPARAÇÃO (MAIOR QUE)< COMPARAÇÃO (MENOR QUE)>= COMPARAÇÃO (MAIOR OU IGUAL QUE)
<= COMPARAÇÃO (MENOR OU IGUAL QUE)
Expressões
Os diferentes tipos de dados juntamente com as suas operações podem ser liga-
dos para formar expressões.
Uma expressão é um conjunto de operandos (números,
constantes, variáveis, etc.) agrupados por certos operadores
( * , + , etc.) constituindo formas algébricas que represen-
tam um valor, isto é, um elemento de informação simples.
Conforme o tipo de valor que gera, uma expressão pode ser classificada como,
inteira, real, lógica (booleana ou condição) ou de caracter. Exemplos:
• 2 + 5 * 3 - 4, é uma expressão numérica (inteira) com o valor 13;
• (X = 2) AND (5 > 7), é uma expressão booleana com valor FALSO;
• ‘A’ < ‘B’, é uma expressão booleana com valor VERDADEIRO (ver tabela ASCII).
Existem algumas regras que devem ser seguidas para construir correctamente
uma expressão em pseudocódigo (e numa linguagem de programação):
1. Não são permitidos dois operadores sucessivos. Podem contudo ser usados parêntesis
para separar operadores sucessivos ou para clarificar uma expressão, mesmo que
eles não sejam necessários;
2. Uma expressão pode consistir num único identificador que é usado como constante ou
variável ou num literal (um número, valor lógico ou caracter explicitamente indicado);
3. O nome de uma função pode ser usado no lugar de um identificador de constante ou
de variável dentro de uma expressão (as funções serão estudadas mais à frente).
4. Os identificadores não definidos e/ou sem um valor em memória, não podem aparecer
numa expressão (isto é, antes de o usar deve-se atribuir-lhe um valor);
5. Um identificador precedido dum sinal menos é equivalente à multiplicação por -1.
Assim -a*b é equivalente a -1*a*b;
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 19
6. Não podem aparecer dois operadores aritméticos consecutivos. A expressão a*-b é
incorrecta, mas a*(-b) já é correcta;
7. As operações aritméticas não podem estar implícitas (como na notação matemática).
A expressão 2(x+y) está incorrecta, mas 2*(x+y) é correcta;
8. O número de parêntesis abertos (à esquerda) tem de ser igual ao número de parêntesis
fechados (à direita);
Uma expressão pode por vezes tornar-se bastante complexa devido à presença
de múltiplos operadores. Nestes casos é necessário especificar a ordem pela qual essas
operações são efectuadas (ordem de precedência). Assim:
PRECEDÊNCIA OPERADOR(ES)
1 (MAIS ELEVADO) A PRIMEIRA A REALIZAR NOT
2 * / DIV MOD AND
3 + - OR
4 (MAIS BAIXO) AS ÚLTIMAS A REALIZAR = <> < <= > >=
As operações dentro de parêntesis devem ser as primeiras a ser realizadas e
dentro de cada grupo de precedência são efectuadas à medida que aparecem, isto é, da
esquerda para a direita (esta ordem pode ser diferente conforme as linguagens).
Instruções
Uma instrução é uma frase que indica uma ordem, ou um conjunto de ordens, que
irá obrigar o computador a efectuar certas acções ou operações.
Existem dois tipos básicos de instruções: as simples, que são instruções únicas
ou incondicionais que executam uma ou mais tarefas; e as estruturadas, que são forma-
das por várias instruções que podem ou não ser executas repetidamente ou no caso de
se verificar uma condição. Umas e outras são formadas por comandos, que são, nor-
malmente, palavras em português (no pseudocódigo) ou em Inglês (no código-fonte),
abreviaturas ou conjunto de caracteres que sugerem a acção que é desempenhada.
Por exemplo:
Ler (read), Escrever (write), Imprimir (print), etc.
De aqui em diante, os comandos serão escritos em negrito para se distinguirem.
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 20
de leitura/escrita
Simples de atribuição
de chamada de um módulo de programação (assunto a tratar)
salto para outra parte do programa (goto)
compostas
Estruturadas repetitivas
condicionais
Instrução de Leitura
As entradas de dados têm de ser indicadas ao agente executor com instruções no
algoritmo. A entrada obriga o executor (computador) a recolher do exterior (pelo teclado,
discos, rato, etc.) o valor necessário para atribuir um valor a uma variável, com uma
frase do tipo:
Ler lista de variáveis separadas por vírgulas
Instrução de Escrita
As saídas de dados têm também de ser indicadas ao agente executor com
instruções no algoritmo. Vão obrigar o agente executor a mostrar os resultados (conteú-
dos das variáveis) e/ou mensagens ao utilizador. Será utilizada uma frase do tipo:
Escrever lista de identificadores separados por vírgulas e/ou
mensagens (entre plicas) separadas por vírgulas
Instrução de Atribuição ou de Afectação
Fornece outra forma de alterar/atribuir um valor a uma variável, sem ser por leitu-
ra (por exemplo um cálculo). Será utilizada uma frase do género:
variável ← expressão
Ao executar esta instrução, o agente executor terá primeiro de obter o valor cor-
respondente à expressão (lado esquerdo do sinal de afectação) e colocá-la na variável
(lado direito do sinal de afectação). Se a variável possuir um valor antes desta instrução,
ele será perdido, ficando no seu lugar o valor da expressão. É necessário que a variável
e a expressão sejam do mesmo tipo. Por exemplo, a instrução:
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 21
Area ← 3.1416 * raio * * 2
vai obrigar o valor da expressão 3.1416 * raio ** 2 a ser atribuído à variável Area.
Exemplo
Com tudo o que já foi dito pode-se, por exemplo, resolver completamente e por
meios informáticos (construindo um programa) o problema do cálculo da área de círcu-
los.
Análise
Sendo o problema bastante simples bastará atender ao seguinte:
1. Matematicamente, a fórmula para o cálculo da área de um círculo é dada por: A = π π π π π r2
sendo r o raio do círculo, A a sua área e π um valor constante igual a 3.1416... (com
mais ou menos casas decimais conforme a precisão pretendida para a área e de
acordo com a precisão do raio)
2. Serão necessários 3 passos para resolver o problema:
Concepção
Dicionário (declaração) dos dados:
E/S/A ou Const Nome Tipo Descrição
Entrada raio real raio do círculo
Saída area real área do círculo a calcular
Constante pi real = 3.1416
Pseudocódigo Fluxograma
Escrever ‘ Introduza o valor do Raio: ‘
Ler raio
area ← pi * raio ** 2
Escrever ‘ A área é :’, area
Testes
O algoritmo só se deve dar como finalizado depois de ser testado com dados de
entrada para os quais se tenha a certeza de qual é o resultado correcto. Este processo é
conhecido por traçagem (trace). Por exemplo, é fácil de reconhecer que se o valor do
raio for de uma unidade o resultado será o valor de Pi. Confirmando:
Início
raio
Introduza o valor do raio
area <- pi * raio ** 2
Fim
area
A área é:
Entra o raio Sai a áreaCalcula aárea
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 22
Ler raio raio = 1
area ← pi *raio*raio area = 3.1416*1*1
area = 3.1416
Escrever area 3.1416
Sendo assim, o programa teria o seguinte output (a menos da apresentação do
resultado):
Introduza o valor do raio: 1
A área é: 3.1416
Finalmente, como revisão dos conceitos estudados é mostrado o quadro seguinte
que identifica todos os elementos de programação conhecidos e que fazem parte da
estrutura do pseudocódigo do exemplo anterior. Note-se que as cadeias de caracteres
(entre plicas) e o número (2), são parte intrínseca da linguagem e por isso são automati-
camente reconhecidos por ela. Estes elementos são muitas vezes designados por lite-
rais como já antes se referiu.
Dados Variáveis raio e area
Constantes pi
Operações Reais * e **
Expressão Real Pi * raio ** 2
Comandos Escrever e Ler
Instruções Leitura Ler raio
Escrita Escrever ‘Introduza o valor do raio.'
Escrever ‘A área é: ‘, area
Atribuição area <- pi * raio **2
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 23
Melhoramento de um algoritmo
Para uma melhor apresentação e compreensão do algoritmo e também para o
aproximar ainda mais a uma linguagem de programação estruturada (no caso o PASCAL)
é costume acrescentar-lhe o seguinte:
Limites
Convenciona-se que os algoritmos são delimitados por duas palavras para o efei-
to: Início e Fim, para se saber onde começa e onde acaba (como já se fez no caso dos
fluxogramas)
Comentários
Em muitas situações, quando surgem instruções de difícil compreensão, é costu-
me comentá-las com um texto delimitado por duas chavetas ( { e } ). Isto permite também
entender melhor o algotitmo quando mais tarde se pretender melhorá-lo (criar nova ver-
são).
Declaração dos dados
Os dados do programa, em vez de serem descritos unicamente no dicionário de
dados, podem ser declarados no início do algoritmo. Isto torna-o mais parecido com o
futuro código-fonte.
Com tudo que foi dito, o pseudocódigo do exemplo ficaria como:
{Algoritmo para calcular a área de um círculo}
Início
{ Declaração dos dados}
area, raio Reais
pi = 3.1416
{Instruções}
Escrever ‘ Introduza o valor do Raio : ‘
Ler raio
{cálculo da área}
area ← pi * raio ** 2
Escrever ‘ A área é :’, area
Fim
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 24
Em todos os algoritmos estudados até agora, cada instrução era executada de
uma única vez, pela mesma ordem em que aparecia no programa formando uma se-
quência de instruções simples. No entanto, este tipo de algoritmos é na prática pouco
frequente, uma vez que não inclui nenhuma estrutura de controlo, como:
. Testes para determinar se certas condições são verdadeiras ou falsas para deci-
dir se se deve executar uma ou outra instrução;
. Execução repetida de grupos de instruções um certo número de vezes ou en-
quanto se verificar uma condição;
. Conjunto de instruções que se repete em diversos pontos do programa, tornando-
se então útil passar a tratá-lo como um módulo de programação (rotina ou
subprograma).
Isto é, é necessário alterar a sequência normal da execução das instruções do
programa utilizando uma sequência de instruções estruturadas. (Convém, para me-
lhor compreender o que se segue, relembrar a noção de instrução, tipos de instruções,
expressões booleanas e os operadores relacionais e lógicos.)
Instrução Composta
É um conjunto de instruções, geralmente englobadas entre dois delimitadores e/
ou escritas de uma forma indentada, considerado como um bloco. Esta forma de estruturar
instruções não existe de uma forma explícita em todas as linguagens de programação.
No entanto, como o PASCAL (e o C) as utilizam são aqui abordadas.
Segue-se um exemplo esquemático de uma instrução composta:
Instrução 1
Instrução 2
instrução 2.1
instrução 2.2 INSTRUÇÃO COMPOSTA
instrução 2.3
Instrução 3
Instrução 4
Deve indentar-se a estrutura para definir o seu âmbito de actuação, isto é, deslocá-
la em relação à margem esquerda. No exemplo entende-se perfeitamente que as instruções
2.1, 2.2 e 2.3 estão subordinadas á instrução 2. Além de tornar mais claros os algoritmos,
o uso da indentação torna desnecessário utilizar palavras, parêntesis ou caracteres es-
peciais para indicar o início o e fim da estrutura. No entanto (como se verá no caso do
II - ALGORITMIA - Estruturas de Controlo
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 25
ESTA INSTRUÇÃO PODE SER LIDA ASSIM:
SE A EXPRESSÃO BOOLEANA TIVER O VALOR
VERDADEIRO É EXECUTADA A INSTRUÇÃO. SE
TIVER O VALOR FALSO NÃO É EXECUTADA A
INSTRUÇÃO.instrução
expressãobooleana
ENTÃO verdadeira
falsa
SE
FSE
PASCAL), a maior parte das linguagens de programação estruturadas usa delimitadores
para indicar o início e o fim das instruções compostas.
Nas linguagens de programação em que é possível criar módulos de programa
(rotinas ou subprogramas), pode optar-se por transformar uma instrução composta (prin-
cipalmente se ela se repete várias vezes ao longo do programa) num módulo, que é
descrito algures fora da sequência normal, sendo depois chamado onde antes estaria a
referida instrução composta.
Instrução SE (IF)
É uma estrutura condicional de controlo, que permite ao agente executor reali-
zar uma acção, unicamente se uma expressão booleana tiver um determinado valor (ver-
dadeiro ou falso). Esta estrutura é das mais difundidas e existe em todas as linguagens
de programação, folhas de cálculo e em outras aplicações. Pode apresentar as formas:
Instrução selectiva simples SE-ENTÃO (IF-THEN)
É a forma mais simples da estrutura SE, cuja forma geral é:
SE expressão booleana ENTÃO instrução FSE
A parte relativa à instrução será executada se e só se a expressão booleana for
verdadeira. Se a expressão booleana for falsa, a parte relativa à instrução será ignorada.
Não esquecer que a instrução pode ser simples ou estruturada, sendo normalmente uma
instrução composta. Segue-se o diagrama de fluxo desta estrutura.
Exemplos
1. SE raio <= 0 ENTÃO Escrever ‘ Valor incorrecto para o raio’ FSE
2. SE raio > 0 ENTÃO
area ← pi * r ** 2
Escrever area
FSE
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 26
instrução 1 instrução 2
falsaverdadeiraexpressãobooleana
ENTÃO SENÃO
FSE
SE
3. SE fim ENTÃO
Escrever ‘FIM DO PROGRAMA’
FSE
No primeiro exemplo, a instrução de leitura só será executada se a variável raio
for menor ou igual a 0. No segundo exemplo é executada uma instrução composta se a
variável raio for maior que 0. No último exemplo a expressão booleana ou condição (fim)
é ela própria uma variável do tipo booleano (tem o valor verdadeiro ou falso) e por isso só
será executada a instrução de escrita se ela tiver o valor VERDADEIRO. Note-se que o
exemplo 1 poderia ser escrito com o formato usado no exemplo 3 uma vez que só é
executada uma instrução simples. Já no caso do exemplo 2, o uso da indentação ilustra
a natureza subordinada da instrução composta dentro da estrutura SE.
Finalmente, será convencionado que as palavras chave da estrutura serão escri-
tas em negrito e em maiúsculas porque são palavras reservadas, isto é, mais nenhum
elemento de programação poderá ser identificado com palavras deste tipo.
Instrução selectiva com alternativa SE-ENTÃO-SENÃO (IF-THEN-ELSE)
É outra forma da estrutura SE (que engloba a anterior), utilizada quando é neces-
sário seleccionar, uma de entre duas alternativas em curso de acção. Tem a seguinte
forma geral e respectivo fluxograma:
SE expressão booleana ENTÃO
instrução1
SENÃO
instruçao2
FSE
Neste caso, a instrução1 será executada se a expressão booleana for verdadeira,
senão será executada a instrução 2. Ou seja, é executada uma ou outra instrução, mas
nunca as duas ao mesmo tempo.
Exemplos
1. SE db >= 1000 ENTÃO taxa ← 0.2 SENÃO taxa ← 0.1 * salario FSE
ou com a apresentação mais conveniente para fácil leitura:
SE db >= 1000 ENTÃO
taxa ← 0.2
SENÃO
taxa ← 0.1 * salario
FSE
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 27
2. SE a >= b ENTÃO
Escrever a, ‘ é maior ou igual a’, b
SENÃO
Escrever a, ‘ é menor que ‘, b
FSE
3. A estrutura SE-ENTÃO-SENÃO é só uma maneira de fornecer um meio mais rápido e
claro de programar, uma vez que, ela pode perfeitamente ser construída com duas
instruções SE simples:
SE expressão booleana ENTÃO instrução 1
SE NÃO expressão booleana ENTÃO instrução 2
4. Ver exercício resolvido nº 2
Instruções SE encaixadas
As estruturas SE podem ser encaixadas (nexted) umas nas outras. Seguem-se
algumas formas de encaixe, onde eb1,eb2, ... são expressões booleanas e i1, i2, ... são
instruções.
1. SE eb1 ENTÃO
SE eb2 ENTÃO
i1 executa i3 (outra instrução SE)
SENÃO = i3 se eb1 verdadeira, senão não faz nada
i2
FSE
FSE
Note-se que este caso não é mais que a substituição de uma instrução por uma
estrutura SE-ENTÃO-SENÃO. Seguindo com este processo podem-se substituir as
instruções representadas por i1 e i2 por outras estruturas SE. Seria assim obtida um
encaixe multinível.
2. SE eb1 ENTÃO
SE eb2 ENTÃO
i1 executa i4 se eb1 verdadeira,
SENÃO = i4 senão executa i3
i2
FSE
SENÃO
i3
FSE
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 28
3. SE eb1 ENTÃO SE eb2 ENTÃO i1 SENÃO i2 FSE FSE
Em cada uma das formas anteriores, a natureza subordinada da estrutura interior
SE é indicada pela sua indentação. Neste caso, não é claro qual a expressão booleana
que está associada com SENÃO. É contudo, a expressão eb2 que lhe está associada
pelo que esta forma é equivalente ao primeiro caso apresentado.
Se se quisesse associar a parte SENÃO com eb1 e não eb2, isto é, se i2 só deve
ser executada quando eb1 for falsa, ficaria:
SE eb1 ENTÃO
SE eb2 ENTÃO
i1
FSE
SENÃO
i2
FSE
Exemplo
Calcular o maior de três números inteiros dados.
Análise
Se os números forem identificados por a, b e c, para que um deles seja maior que
os outros dois tem de ser comparado dessa forma, isto é:
Para que a seja maior que b e c terá de ser a > b e a > c. Se não se verificarem
estas condições é porque o maior número ou é b ou c e por isso devem eles também ser
comparados. Obviamente que a comparação poderia ser iniciada com b ou c em vez de
a, tendo o problema a mesma resolução.
Se nenhuma destas condições se verificar é porque os número são iguais dois a
dois ou são os três iguais, isto é, se a é igual a b e são os dois maiores que c o maior
número escrito pelo algoritmo é b; se b é igual a c e são os dois maiores que a, o maior
número escrito é c; se são os três iguais o maior número escrito pelo algoritmo é c.
Concepção
Dicionário de dados
E/S Nome Tipo Descrição
E a inteiro 1º número dado
E b inteiro 2º número dado
E c inteiro 3º número dado
S a ou b ou c inteiro o valor de saída é o maior dos três
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 29
Ler a, b, c
Início
a>b e a>cSim Não
b>c
NãoSim
Sim
Não
Não
Escrever 'o maior número é ', aEscrever 'o maior número é ', a
Escrever 'o maior número é ', b
Escrever 'o maior número é ', c
Fim
Pseudocódigo
Inicio
{declaração de variáveis}
a, b, c inteiros
{instruções}
Escrever ‘ Introduza os três número a comparar: ‘
Ler a,b,c
SE a > b e a > c ENTÃO
Escrever ‘ O maior número é ‘, a
SENÃO
SE b > c ENTÃO
Escrever ‘ O maior número é ‘, b
SENÃO
Escrever ‘ O maior número é ‘, c
FSE
FSE
Fim
Fluxograma
Output
Introduza os três números a comparar: 7 10 1
O maior número é 10
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 30
Este problema poderia ser resolvido de outra forma (que é a usada, como se verá,
quando existem muitos números e não é possível definir variáveis para todos eles).
Assim, pode-se definir uma variável, que à partida terá um valor muito pequeno,
(ou pelo menos que se saiba que é menor que os números a comparar), e depois cada
número é comparado com ela. Quando for encontrado um número maior que o valor
dessa variável, esse número será atribuído à variável, que no fim do processamento
conterá o maior dos números:
Inicio
{declaração de variáveis}
a, b, c inteiros
maior inteiro
{instruções}
maior ← -32767 {menor número inteiro}
Escrever ‘ Introduza os três número a comparar’
Ler a,b,c
SE a > maior ENTÃO
maior ← a
FSE
SE b > maior ENTÃO
maior ← b
FSE
SE c > maior ENTÃO
maior ← c
FSE
Escrever ‘ O maior número é ‘, maior
Fim
Instrução de Selecção Múltipla CASO (CASE)
É uma instrução estruturada de controlo condicional que permite ao agente exe-
cutor fazer uma selecção múltipla, isto é, permite que uma instrução sejam escolhida
de entre várias disponíveis. A selecção é baseada no valor corrente de uma expressão
referida como selector. O selector pode ser de qualquer tipo simples não real e toma
muitas vezes a forma de uma única variável simples.
Esta estrutura existe em muitas linguagens de programação para tornar mais cla-
ros os programas/algoritmos e para facilitar o trabalho do programador, uma vez que,
com instruções SE-ENTÃO-SENÃO pode construir-se a estrutura CASO.
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 31
A forma geral desta estrutura é:
CASO expressão SEJA
lista de etiquetas de caso 1 : instrução1
lista de etiquetas de caso 2 : instrução2
..... . ........ . .... . ...........
lista de etiquetas de caso n : instrução n
[SENÃO
instrução alternativa ]
FCASO
Cada etiqueta de caso representa um dos valores permitidos pela expressão. As-
sim, se a expressão é de um certo tipo simples, as etiquetas de caso representam valo-
res do mesmo tipo que caiam dentro de uma gama permitida. Se tal não acontecer a
estrutura CASO ou é ignorada ou é executada a instrução alternativa, se existir a cláusu-
la SENÃO. Seguem-se algumas regras de uso das etiquetas de caso.
1. Podem aparecer por qualquer ordem;
2. As etiquetas podem aparecer numa só lista, executando-se a instrução corresponden-
te logo que o selector tome um dos valores da lista.
3. As instruções podem ser simples ou estruturadas. É vulgar o uso de instruções com-
postas. As instruções não necessitam de ser únicas, isto é, a mesma instrução pode
ser usada com duas ou mais listas de etiquetas de caso.
Exemplo (ver também exercício resolvido nº 3)
...
Ler NotaQuantitativa
CASO NotaQuantitativa SEJA
1,2,3,4 : NotaQualitativa ← ‘Mau’
5,6,7,8,9 : NotaQualitativa ← ‘Medíocre
10,11,12,13 : NotaQualitativa ← ‘Suficiente’
14,15,16,17 : NotaQualitativa ← ‘Bom’
18,19,20 : NotaQualitativa ← ‘Muito Bom’
SENÃO
Escrever ‘ Nota inválida’
FCASO
...
A PARTE DA ESTRUTURA DELIMITADA
PELOS PARÊNTESIS RECTOS É OPCIONAL,
ISTO É, PODE SER USADA OU NÃO
CONFORME AS NECESSIDADES.
Início
Ler notaQuantitativa
NotaQuantitativa >= 1 eNotaQuantitativa <= 4
NotaQuantitativa >= 5 eNotaQuantitativa <= 9
Não
Sim
Não
Sim
Sim
NotaQuantitativa >= 10 eNotaQuantitativa <= 13
Sim
SimNotaQuantitativa >= 14 eNotaQuantitativa <= 17
Sim
Não
Não
Fim
Não
NotaQuantitativa >= 18 eNotaQuantitativa <= 20
Escrever 'Nota inválida
NotaQuantitativa >= 1 eNotaQuantitativa <= 4
NotaQualitativa <- 'Medíocre'
NotaQualitativa <- 'Suficiente'
NotaQualitativa <- 'Bom'
NotaQualitativa <- 'Mau'
NotaQualitativa <- 'Muito Bom'
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 32
Neste exemplo é lida uma nota quantitativa (de 0 a 20) e conforme o seu valor é
definida uma nota qualitativa (cadeia de caracteres que fica guardada na variável
NotaQualitativa). Se a nota não estiver na gama permitida não há correspondência com
nenhuma etiqueta de caso e é executada a parte SENÃO da estrutura CASO.
Como já se disse, a estrutura CASO é uma simplificação de estruturas SE,
encadeadas e que testam igualdades ou intervalos de valores. Mostra-se a seguir o
mesmo troço do algoritmo, construído desta forma, para se verificar que é mais pesado e
mais difícil de ser entendido.
...
Ler NotaQuantitativa
SE NotaQuantitativa >= 1 e NotaQuantitativa <= 4 ENTÃO
NotaQualitativa ← ‘Mau’
SENÃO
SE NotaQuantitativa >= 5 e NotaQuantitativa <= 9 ENTÃO
NotaQualitativa ← ‘Medíocre’
SENÃO
SE NotaQuantitativa >= 10 e NotaQuantitativa <= 13 ENTÃO
NotaQualitativa ← ‘Suficiente’
SENÃO
SE NotaQuantitativa >= 14 e NotaQuantitativa <= 17 ENTÃO
NotaQualitativa ← ‘Bom’
SENÃO
SE NotaQuantitativa >= 18 e NotaQuantitativa <= 20 ENTÃO
NotaQualitativa ← ‘Muito Bom’
SENÃO
Escrever ‘ Nota inválida’
FSE
FSE
FSE
FSE
FSE
...
Instruções Repetitivas ou Ciclos (loops)
Frequentemente é necessário que o agente executor repita uma certa instrução
ou conjunto de instruções um determinado número de vezes ou enquanto se verificar
uma certa condição. Essa repetição, na maior parte das vezes, não tem que ser uma
repetição exacta das mesmas operações, pois pode haver pelo meio certos dados (vari-
áveis) que se vão alterando à medida que o ciclo vai decorrendo.
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 33
ExpresãoBooleana
Verdadeira
Falsa
Instrução
EXECUTAR
ENQUANTO
FENQUANTO
Em algumas linguagens existe apenas uma instrução ou estrutura de controlo,
enquanto que noutras podem existir duas ou até três como no caso do PASCAL. A esco-
lha da estrutura a usar vai depender das características do ciclo.
Instrução ENQUANTO-EXECUTAR (WHILE-DO)
É uma estrutura de controlo, repetitiva, usada para efectuar ciclos condicionais.
A sua forma geral é:
ENQUANTO expressão booleana EXECUTAR
instrução
FENQUANTO
A parte da estrutura correspondente à instrução, será executada repetidamente,
enquanto a expressão booleana se mantiver verdadeira. Esta instrução pode ser simples
ou estruturada, apesar de geralmente ser uma instrução composta que inclui uma carac-
terística que pode alterar o valor da expressão booleana.
Como o teste da expressão booleana é realizado antes da possível execução da
instrução, a estrutura ENQUANTO será executada nenhuma ou mais vezes, dependen-
do do valor lógico da referida expressão booleana.
É preciso ter cuidado em não criar uma repetição infinita, isto é, a expressão
booleana nunca tomar o valor falso para parar o ciclo.
Exemplos
1. ...
1 contador ← 1
2 soma ← 0
3 ENQUANTO contador <= 20 EXECUTAR
3.1 Ler classificação
3.2 soma ← soma + classificação
3.3 contador ← contador + 1
FENQUANTO
...
Este troço de um algoritmo tem a finalidade de calcular a soma de 20 classifica-
ções lidas. A variável contador permite controlar este ciclo de modo a ter um número de
repetições igual ao número de classificações a processar, isto é, vai contando as classi-
ficações até 20. São fundamentais as instruções 1 e 3.3; a primeira para iniciar o conta-
dor (correspondente á primeira classificação) de modo que a expressão booleana (con-
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 34
Sequência de Instruções
ExpresãoBooleana
Falsa
Verdadeira
REPETIR
ATÉ
tador <= 20) seja correctamente avaliada na primeira repetição do ciclo; a segunda para
ir somando ao contador uma unidade (correspondente à 2ª, 3ª, ..., 20ª classificações) de
modo que o ciclo termine quando estiverem as 20 classificações processadas. O mes-
mo acontece para o cálculo da soma: são fundamentais as instruções 2 e 3.2; a primeira
para inicializar a variável soma com zero (elemento neutro da adição) de modo que a
expressão soma + classificação seja correctamente avaliada na primeira repetição do
ciclo (notar que é proibido usar variáveis que não tenham um valor definido); a segunda
para ir acumulando a soma das classificações.
2. ...
1 contador ← 1
2 maior ← -32767
3 ENQUANTO contador <= 3 EXECUTAR
3.1 Ler numero
3.2 SE numero > maior ENTÃO
maior ← numero
FSE
3.3 contador ← contador + 1
FENQUANTO
...
3. Ver exercício resolvido nº 4
Este troço de um algoritmo tem a finalidade de determinar o maior de três números
lidos (é a outra forma de resolver o problema descrito na página 174). Quanto o ciclo
controlado pela variável contador terminar (depois de três repetições correspondentes
aos três números lidos) a variável maior conterá o valor do maior dos três números lidos.
Instrução REPETIR-ATÉ (REPEAT-UNTIL)
É outra instrução estruturada, repetitiva de controlo, usada para efectuar ciclos
condicionais. É semelhante à estrutura ENQUANTO-EXECUTAR e, em alguns aspec-
tos, estas duas estruturas completam-se uma à outra. A sua forma geral é:
REPETIR
sequência de instruções
ATÉ expressão booleana
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 35
A sequência de instruções será executada até que a expressão booleana se torne verda-
deira (ou dito de outra forma, enquanto a expressão booleana for falsa).
A sequência de instruções será sempre executada pelo menos uma vez, dado que
a expressão booleana é testada só no fim da estrutura de controlo.
Com o que ficou dito anteriormente, podem-se tirar as diferenças entre as estrutu-
ras ENQUANTO e REPETIR:
1. Com ENQUANTO tem-se uma instrução a executar (embora possa ser composta),
enquanto que com REPETIR tem-se uma sequência de instruções.
2. A instrução em ENQUANTO não será executada se a expressão booleana for falsa,
uma vez que o teste é feito no início, enquanto que a sequência de instruções em
REPETIR é executada pelo menos uma vez, pois o teste é feito no fim.
Exemplos
1. ...
contador ← 1
soma ← 0
REPETIR
Ler classificação
soma ← soma + classificação
contador ← contador + 1
ATÉ contador > 20
...
2. contador ← 1
maior ← -32767
REPETIR
Ler numero
SE numero > maior ENTÃO
maior ← numero
FSE
contador ← contador + 1
ATÉ contador > 3
...
3. Ver exercício resolvido nº 5
Comparando com o mesmos exemplos construídos com a estrutura ENQUANTO
pode ver-se que a única diferença é a expressão booleana ser a negação da usada com
aquela estrutura.
Pode então concluir-se que a escolha de uma destas duas estruturas repetitivas é
geralmente uma questão de preferência pessoal. Contudo, a escolha é influenciada pela
vantagem de testar a expressão booleana no princípio ou no fim da estrutura de controlo.
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 36
Variável de controlo<- valor inicial
PARA
EXECUTAR
FPARA
variável de controlo <- variável de controlo + 1
NãoVariável de controlo <=
valor final
Instrução
Sim
Instrução PARA-ATÉ-EXECUTAR (FOR-TO-DO)
É uma instrução estruturada, repetitiva de controlo, usada para efectuar ciclos
incondicionais, isto é, esta estrutura permite que uma acção seja repetida um número
especificado de vezes. Pode apresentar várias formas. A mais usada é:
PARA variável de controlo ← valor inicial ATÉ valor final EXECUTAR
instrução
FPARA
Esta estrutura de repetição é controlada por uma variável (variável de controlo)
que parte de um determinado valor inicial e é incrementada (soma de uma unidade se for
do tipo inteiro) até um determinado valor final, isto é, inicialmente, à variável de controlo
é atribuído o valor especificado por valor inicial , depois esta variável toma o valor se-
guinte, automaticamente, cada vez que a instrução é repetida, até atingir e tomar o valor
especificado por valor final. Veja-se o fluxograma desta estrutura para melhor se compre-
ender o seu funcionamento.
Seguem-se algumas considerações a ter em conta no uso desta estrutura:
1. A parte da instrução da estrutura pode ser simples ou estruturada, embora seja tipica-
mente uma instrução composta que pode incluir outras estruturas de controlo. Esta
instrução será executada para cada um dos vários valores consecutivos atribuídos
(repare-se no sinal de atribuição ← ) à variável de controlo;
2. O número de valores atribuídos à variável de controlo, determina o número de vezes
que a instrução é executada (este número é : valor final - valor inicial + 1 no caso da
variável ser inteira);
3. A variável de controlo deve ser uma variável simples de qualquer tipo diferente de real
(geralmente é inteira);
4. Valor inicial e valor final poderão ser constantes, variáveis ou expressões;
AS ATRIBUIÇÕES INDICADAS NO FLUXOGRAMA SÃO
AUTOMATICAMENTE IMPLEMENTADAS PELA
ESTRUTURA, PELO QUE, NÃO DEVEM SER
ESPECIFICADAS NO ALGORITMO/PROGRAMA.
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 37
5. Valor inicial e valor final deverão ser do mesmo tipo que a variável de controlo;
6. O valor inicial deve ser menor do que valor final, se se pretender que a instrução seja
executada mais do que uma vez. Se valor inicial e valor final forem iguais, a instrução
será executada somente uma vez; se valor inicial for maior que valor final, a instrução
não chegará a ser executada.
Exemplos
1. ...
soma ← 0
PARA contador ← 1 ATÉ 20 EXECUTAR
Ler classificação
soma ← soma + classificação
FPARA
...
2. maior ← -32767
PARA contador ← 1 ATÉ 3 EXECUTAR
Ler numero
SE numero > maior ENTÃO
maior ← numero
FSE
FPARA
...
3. Ver exercício resolvido nº 6
Comparando com os mesmos exemplos construídos com as outras duas estrutu-
ras repetitivas pode concluir-se que a estrutura PARA é a mais indicada uma vez que se
sabe à partida quantas repetições vão ser necessárias e, é a que envolve um menor
número de instruções (em virtude da inicialização e incrementação do contador serem
feitas automaticamente). Mas se não se soubesse logo de início quantas classificações
iriam ser somadas ou quantos números iriam ser comparados, isto é, se não se soubesse
quantas repetições iria ter o ciclo, teria de ser usada uma estrutura repetitiva condicional
(ENQUANTO ou REPETIR).
É frequente a estrutura FOR aparecer de outras duas formas diferentes:
1. Em vez de a variável de controlo partir de um valor inicial menor que um valor final, para
ser incrementada, pode partir de um valor inicial maior que um valor final para ser
decrementada, isto é, subtrair uma unidade (no caso de ser inteira).
2. Em vez da incrementação/decrementação ser de uma unidade, pode ser de outro valor
qualquer. Para indicar isso é costume acrescentar-se à estrutura a cláusula COM PASSO
(steep) com o valor dessa incrementação/decrementação.
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 38
Exemplo (para escrever os números pares de 20 a 0)
...
PARA contador ← 20 ATÉ 0 COM PASSO 2 EXECUTAR
Escrever contador
FPARA
...
Validação de dados
Nos vários exemplos já mencionados, alguns algoritmos não funcionam correcta-
mente se não forem feitas certas restrições à entrada de dados, isto é, os valores de
entrada devem ser testados antes de serem utilizados. Esta operação, de verificar se os
dados são aceitáveis ou não para o algoritmo, designa-se por validação dos dados.
Perante uma detecção de dados inválidos há que indicar ao agente executor qual a
decisão a tomar. Por exemplo:
1. Emitir uma mensagem de erro (ver exemplo estudado para a estrutura CASO) e inter-
romper a execução ;
2. Emitir uma mensagem de erro e voltar a pedir os dados;
3. Efectuar uma correcção automática dos dados, se possível.
As estruturas repetitivas podem ser usadas para validar os dados de entrada. Por
exemplo, o cálculo da área de um círculo não tem sentido se o utilizador introduzir um
valor para o raio menor ou igual a zero. Nestas condições o algoritmo com a validação
do dados de entrada ficaria (ver também o exercício resolvido nº 7):
{Algoritmo para calcular a área de um círculo}
Início
{ Declaração dos dados}
area, raio Inteiros
pi = 3.1416
{Instruções}
REPETIR
Escrever ‘ Introduza o valor do raio : ‘
Ler raio
SE raio <= 0 ENTÃO
Escrever ‘ Valor incorrecto para o raio. Tente novamente’
SENÃO
area ← pi * raio ** 2
Escrever ‘ A área é :’, area
FSE
ATÉ raio > 0
Fim
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 39
Exercícios Resolvidos
Para complementar os exemplos até agora estudados seguem-se alguns exercíci-
os resolvidos abordando várias técnicas de programação.
Exercício nº 1 - Procurar uma palavra no dicionário para obter o seu significado.
Uma primeira descrição algorítmica desta tarefa pode ser feita com a seguinte
sequência de instruções:
1 Anotar a palavra a procurar
2 Abrir o dicionário na primeira página e procurar
3 Repetir a seguinte acção até encontrar a palavra ou
até encontrar palavras de ordem alfabética superior ou
até chegar ao fim do dicionário
3.1 Procurar na página seguinte
4 Se a palavra for encontrada então
4.1 Recolher o seu significado
Senão
4.1 Avisar que a palavra não consta no dicionário
Pode, à partida, questionar-se a eficiência deste algoritmo, pois se para pequenas
tarefas (pequeno dicionário) a sua utilização pode ser aceitável o mesmo já não se pode
dizer para um grande volume de informação (grande dicionário). Na prática não é utiliza-
do o processo de pesquisa sequencial, como foi descrito na primeira versão do algoritmo,
mas sim uma técnica (que muitas vezes se usa neste casos) conhecida por pesquisa
dicotómica. Desta forma pode construir-se uma segunda versão do algoritmo:
1 Anotar a palavra a procurar
2 Segurar no molho de folhas que formam o dicionário
3 Repetir a seguinte acção até reduzir o molho a uma folha
3.1 Abrir o molho em duas partes quaisquer
3.2 Se a palavra a procurar for anterior à palavra do 2º semi-molho então
3.2.1 Segurar apenas no segundo semi-molho
Senão
3.2.1 Segurar apenas no 1º semi-molho
4 Procurar a palavra na folha seleccionada
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 40
5 Se a palavra for encontrada então
5.1 Recolher o seu significado
Senão
5.1 Avisar que a palavra não consta no dicionário
Assume-se neste algoritmo que o agente executor sabe executar o procedimento
de procurar uma palavra, caso contrário teria de ser detalhado.
Exercício nº 2 - Resolução de um sistema de equações lineares a duas incógnitas.
Análise
Estão envolvidos neste problema acções de cálculo numérico e conceitos de ma-
temática. A resolução terá como objectivo final a solução de um sistema do tipo:
ax + by = c
dx + ey = f , apresentado na forma canónica, com as incógnitas x e y e os coe-
ficientes a, b, c, d, e, f.
Para se determinar o valor de x e y (se for possível a resolução) basta conhecer os
valores numéricos dos coeficientes e aplicar as seguintes regras algébricas:
x = (ce - bf) / (ae - bd)
y = (af - cd) / (ae - bd)
Terá de ter-se em conta um aspecto importante que resulta também da análise
matemática do sistema:
a) se o denominador, nas expressões que dão as soluções, for zero e o numerador for
diferente de zero, a equação é impossível;
b) se o denominador, nas expressões que dão as soluções, for zero e o numerador for
também zero, a equação é indeterminada.
Assim, basicamente, o problema resume-se a entrar com os coeficientes, calcular
as soluções fazendo os testes antes indicados e fornecer as soluções. Esquematicamente:
Concepção
Dicionário de dados
E/S Nome Tipo Descrição
E a,b,c,d,e,f reais coeficientes do sistema
S x,y reais soluções do sistema
Algoritmos -Para este exercício vão ser apresentados três tipos diferentes de
algoritmos estudados, no entanto, daqui em diante, somente o pseudocódigo e às vezes
o fluxograma serão elaborados, pelo facto de estarem mais vocacionados para a
implementação do problema numa linguagem de programação.
Cálculodas
Soluções
Entram os coeficientesEntram os coeficientes Saem as soluções
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 41
Descritivo
1 Início
2 Pedir os valores dos coeficientes: a, b, c, d, e, f
3 Se o resultado de (ae - bd) for nulo então
3.1 Se o resultado de (ce - bf) for nulo então
3.1.1 Dizer que o sistema é indeterminado
Senão
3.1.1 Dizer que o sistema é impossível
Senão
3.1 Calcular o valor de x utilizando a expressão
3.2 Calcular o valor de y utilizando a expressão
3.3 Fornecer a solução (valores de x e y)
4 Fim
Pseudocódigo
Início
Ler a, b, c, d, e, f
SE (a*e - b*d) = 0 ENTÃO
SE (c*e - b*f) = 0 ENTÃO
Escrever 'O sistema é indeterminado'
SENÃO
Escrever 'O sistema é impossível'
FSE
SENÃO
x ← (c*e - b*f) / (a*e - b*d)
y ← (a*f - c*d) / (a*e - b*d)
Escrever ' A solução do sistema é: x = ', x, ' e y = ', y
FSE
Fim
Fluxograma
Inicio
Ler a,b,c,d,e,f
1 (ESTE SÍMBOLO SIGNIFICA QUE O FLUXOGRAMA
CONTINUA NA PÁGINA SEGUINTE.)
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 42
Nota: Como o cálculo da expressão a*e - b*d é efectuado várias vezes, o algoritmo
ficaria mais eficiente se só o fosse uma única vez. Para isso, deve definir-se uma variável
auxiliar, por exemplo com o nome Denominador, para ficar logo de início com o valor da
expressão, isto é, deve incluir-se a instrução Denominador ← a*e - b*d e no resto do
algoritmo, substitui-se a*e - b*d pela variável denominador. Com esta optimização e a
declaração de dados tem-se o seguinte pseudocódigo:
Início
{declaração dos dados}
a,b,c,d,e,f reais
denominador real
x,y reais
{instruções}
Escrever ' Introduza os coeficientes do sistema: '
Ler a, b, c, d, e, f
denominador ← a*e - b*d
SE denominador = 0 ENTÃO
SE (c*e - b*f) = 0 ENTÃO
Escrever 'O sistema é indeterminado'
SENÃO
Escrever 'O sistema é impossível'
FSE
SENÃO
x ← (c*e - b*f) / denominador
y ← (a*f - c*d) / denominador
Escrever ' A solução do sistema é: x = ', x, ' e y = ', y
FSE
Fim
1
Escrever' Sistema Impossível'
Escrever' Sistema Indeterminado'Escrever x, y
Fim
x <- (c*e - b*f) / (a*e - b*d)y <- (a*f - c*d) / (a*e - b*d)
(a*e-b*d)=0
(c*e-b*f)=0
Não Sim
Não Sim
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 43
Output
Introduza os coeficientes do sistema: 2 1 4 2 2 1
A solução do sistema é: x = 3.5 e y = -3
Exercício nº 3 - Efectuar, a partir de dois números inteiros fornecidos, uma das
quatro operações aritméticas básicas (adição, subtracção, multiplicação e divisão) con-
forme a escolha do utilizador.
Análise
Este é o caso típico de problema que necessita de um menu para se proceder à
escolha de uma acção de entre várias disponíveis (selecção múltipla). Assim, o utilizador
terá de escolher uma opção num menu para efectuar uma das quatro operações com os
dois números. Esquematicamente:
Concepção
Dicionário de dados
E/S Nome Tipo Descrição
E opção inteiro opção do menu
E n1, n2 inteiros números a operacionar
S resultado inteiro resultado da operação
Pseudocódigo
Início
{declaração dos dados}
opção inteiro
n1,n2 inteiros
resultado inteiro
{instruções}
Escrever ' Introduza os números :'
Ler n1,n2
Escrever ' MENU'
Escrever ' 1- Adicionar '
(RESOLVA O SISTEMA USADO NO TESTE
DO ALGOTITMO PARA CONFIRMAR O
RESULTADO DO OUTPUT.)
MenuEscolher opção conforme a opção que entra
Entram dois números
Efectuar operaçãoSai resultado
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 44
Escrever ' 2- Subtrair'
Escrever ' 3- Multiplicar'
Escrever ' 4- Dividir'
Escrever ' Qual a opção ? '
Ler opção
CASO opção SEJA
1 : resultado ← n1 + n2
Escrever ' A soma é ', resultado
2 : resultado ← n1 - n2
Escrever ' A diferença é ', resultado
3 : resultado ← n1 * n2
Escrever ' O produto é ', resultado
4 : resultado ← n1 DIV n2
Escrever ' O quociente é ', resultado
SENÃO
Escrever ' Opção inválida '
FCASO
Fim
Fluxograma Início
Ler n1,n2
Escrever menu
Ler opção
opção = 2
opção = 1
opção = 3
opção = 4
SimResultado <- n1 + n2
Resultado <- n1 - n2
Resultado <- n1 * n2
Resultado <- n1 / n2
Escrever resultado
Escrever resultado
Escrever resultado
Escrever resultado
Sim
Sim
Sim
Escrever 'Opção inválida'
Fim
Não
Não
Não
Não
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 45
OutputIntroduza os números : 12 6
MENU'1- Adicionar '2- Subtrair'3- Multiplicar'4- Dividir'
Qual a opção ? 1A soma é 18
Exercício nº 4 - Decomposição de um número inteiro positivo em factores primos.
Análise
Se se designar por n o número a decompor, então pretende-se encontrar o con-
junto de factores primos cujo produto é igual a n.
Para encontrar os factores primos de um número deve determinar-se o menor
número inteiro, superior à unidade, por forma que a sua divisão pelo número dado dê
quociente inteiro (isto é, resto nulo). Repete-se o processo para o quociente obtido até
que seja atingido o valor 1 como quociente. Por exemplo, o número 140 tem a seguinte
decomposição em factores primos:
A sequência de factores primos obtida (2, 2, 5 e
7), convertida no produto 2x2x5x7 vai dar o nú-
mero 140.
Concepção
Dicionário de dados
E/S/Aux Nome Tipo Descrição
E/Aux n inteiro número a decompor em factores primos
e depois os sucessivos quocientes
S divisor inteiro sucessivos divisores de n
Pseudocódigo
Início
{declaração dos dados}
n, divisor inteiros
140 2
2
5
7
1
70
35
7
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 46
{instruções}
Escrever 'Introduza o número a decompor: '
Ler n
Escrever 'factores primos de ', n
divisor ← 2
ENQUANTO n <> 1 EXECUTAR
ENQUANTO n MOD divisor <> 0 EXECUTAR
divisor ← divisor + 1
FENQUANTO
Escrever divisor, ' '
n ← n DIV divisor
FENQUANTO
Fim
O ciclo interior permite detectar qual o primeiro número (a começar em 2) divide
exactamente (n MOD divisor) o número dado, isto é, enquanto o resto da divisão inteira
do número dado pelo divisor não for zero, soma uma unidade a divisor. Este ciclo termina
quando for encontrado um divisor, que pode ser o próprio número se ele for primo. De-
pois o divisor encontrado é escrito e em seguida é actualizado o número n para que todo
o processo se repita (ciclo exterior) mas agora com o novo quociente (n DIV divisor). A
factorização termina quando não for possível dividir mais, isto é, quanto n for 1.
FluxogramaInício
Ler n
divisor <- 2
n <> 1
Início
Não
Sim
Sim
n mod divisor <> 0
Não
Escrever divisor
divisor <- divisor + 1
n <- n div divisor
Fim
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 47
Output
Introduza o número a decompor: 140
factores primos de 140:2257
Exercício nº 5 - Controlo de paragem de um algoritmo/programa
Todos os algoritmos até agora estudados, resolviam os diferentes problemas exac-
tamente uma vez, quer isto dizer que, quando ele fosse implementado numa linguagem
de programação, um novo cálculo com outros dados implicaria executar o programa todo
desde o início. Na prática tal não sucede, isto é, o programa continua até que o utilizador
decida terminá-lo. É preciso então construir um controlo de paragem.
A melhor forma de o fazer é com uma estrutura REPETIR-ATÉ, uma vez que, se
supõe que pelo menos uma vez o programa calcula o pretendido. Por exemplo, o exercí-
cio anterior com um controlo de paragem teria o seguinte pseudocódigo:
Início
{declaração dos dados}
n, divisor inteiros
terminar caracter
{instruções}
REPETIR
Escrever 'Introduza o número a decompor: '
Ler n
Escrever 'factores primos de ', n
divisor ← 2
ENQUANTO n <> 1 EXECUTAR
ENQUANTO n MOD divisor <> 0 EXECUTAR
divisor ← divisor + 1
FENQUANTO
Escrever divisor, ' '
n ← n DIV divisor
FENQUANTO
Escrever ' Quer terminar ? (S/N) '
Ler terminar
ATÉ terminar = 'S'
Fim
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 48
Foi necessário definir uma nova variável do tipo caracter chamada terminar para
controlar a estrutura repetitiva do controlo de paragem. Quando o utilizador introduzir a
letra S a expressão booleana da cláusula ATÉ fica verdadeira terminando o ciclo, e por-
tanto o programa; outra letra qualquer torna a expressão booleana falsa e o programa
continua. Note-se que a variável terminar poderia ser de outro tipo qualquer, por exemplo
inteiro, podendo neste caso a mensagem ser: ' 0 para continuar; 1 para sair' e a expres-
são booleana: terminar = 1.
Nos casos em que exista um menu, a mensagem deve ser mais uma opção do
mesmo. Por exemplo, no exercício nº3, o menu poderia ter uma 5ª opção com: 5 - Sair e
seria a variável opção que controlaria a estrutura REPETIR-ATÉ do controlo de para-
gem.
Exercício nº 6 - Dado um certo número de notas calcular: a sua média, a maior e
a menor das notas.
Análise
Se for n o número total de notas, a média é obtida somando as notas todas e
dividindo essa soma por n. O método usado para efectuar uma adição sucessiva (sendo
o agente executor o computador) e para determinar o maior (e o menor) de uma lista de
números, já foi estudado.
Concepção
Dicionário de dados
E/S/Aux Nome Tipo Descrição
E n inteiro número total de notas
E nota real cada uma das notas
Aux soma real soma das notas
Aux contador inteiro contador para o ciclo que representa a
ordem de cada uma das notas (1ª, 2ª,...)
S média real média das notas
S maior real a maior das notas
S menor real a menor das notas
Note-se que terá de se usar um ciclo cujo número de repetições é conhecido (n)
para processar cada uma das notas. Por isso, a variável notas vai representar na 1ª
repetição a 1ª nota, na 2ª repetição a 2ª nota, ... e na enésima repetição a enésima nota.
O problema terá de ser resolvido assim, uma vez que não teria sentido definir uma vari-
ável para cada nota pois o algoritmo, para ser geral, não sabe à partida quantas são (é
o utilizador que introduzirá o valor de n).
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 49
Pseudocódigo
Início
{declaração dos dados}
n, contador inteiros
nota, soma reais
média, maior, menor reais
{instruções}
maior ← 0
menor ← 20
soma ← 0
Escrever 'Introduza o total de notas: '
Ler n
PARA contador ← 1 ATÉ n EXECUTAR
Escrever 'Introduza a ', contador, 'ª nota: '
Ler nota
{calcula a soma das notas}
soma ← soma + nota
{determina a maior nota}
SE nota > maior ENTÃO
maior ← nota
FSE
{determina a menor nota}
SE nota < menor ENTÃO
menor ← nota
FSE
FPARA
{calcula a média}
média ← soma / n
Escrever ' A média das notas é: ', média
Escrever ' A maior nota é: ', maior
Escrever ' A menor nota é: ', menor
Fim
Para cada nota que é lida dentro do ciclo é feita uma acumulação da soma, isto é,
na 1ª repetição do ciclo a 1ª nota é somada a zero (valor inicial da soma), na 2ª repetição
a 2ª nota é somada à 1ª, na 3ª repetição a 3ª nota é somada à soma da 1ª com a 2ª, etc.
No final do ciclo tem-se a soma de todas as notas guardada na variável soma. O mesmo
acontece para o cálculo da maior (e da menor) notas, só que em vez de uma acumulação
é realizada uma troca de valores.
Para este algoritmo executar correctamente os cálculos é necessário que as no-
tas lidas estejam todas no intervalo [0, 20]. Como acontece com frequência o utilizador
enganar-se a introduzir os dados era necessário modificar o algoritmo para os validar
(este assunto será estudado no exercício seguinte).
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 50
Fluxograma
Traçagem
Valores iniciais:n = 3maior = 0menor = 20soma = 0
1ª repetição (contador = 1)nota = 8soma = 0 + 8 = 8maior = 8menor = 8
2ª repetição (contador = 2)nota = 14soma = 8 + 14 = 22maior = 14menor = 8
3ª repetição (contador = 3)nota = 17soma = 22 + 17 = 39maior = 17menor = 8
Escrita:média = 39 / 3 = 13maior = 17menor = 8
Faça o teste ao algoritmo para 3 notas: 8, 14 e 17 para verificar que realmente é
escrita a média 13, a maior nota 17 e a menor nota 8, conforme se demonstra ao lado do
fluxograma.
Início
maior <- 0
menor <- 20
soma <- 0
ler n
contador <- 1
contador <= nNão
Sim
Ler nota
soma <- soma + nota
nota > maior
maior <- nota
nota > menor
menor <- nota
Sim
Sim
Não
Não
contador <- contador +1
Escrever média
Fim
Escrever maior
Escrever menor
INFORMÁTICA
António M. P. Sousa da Silva Algoritmia - 51
Output
Introduza o total de notas: 3
Introduza a 1ª nota: 8Introduza a 2ª nota: 14Introduza a 3ª nota: 17A média das notas é: 13A maior das notas é: 17A menor das notas é: 8
Exercício nº 7 - Validação dos dados do exercício anterior.
Como já se referiu, o exercício anterior não seria correctamente resolvido, nem
traduziria a realidade, se por acaso o utilizador introduzisse notas menores que 0 e
maiores que 20 valores. Assim o troço do algoritmo onde as notas são lidas deve ser
alterado como a seguir se exemplifica:
...PARA contador ← 1 ATÉ n EXECUTAR
REPETIR
Escrever 'Introduza a ', contador, 'ª nota: '
Ler nota
SE nota < 0 ou nota > 20 ENTÃO VALIDAÇÃO DOS DADOS
Escrever ' Nota inválida. Tente de novo'
FSE
ATÉ nota > 0 e nota < 20
{calcula a soma das notas}
soma ← soma + nota
{determina a maior nota}
SE nota > maior ENTÃO
maior ← nota
FSE
{determina a menor nota}
SE nota < menor ENTÃO
menor ← nota
FSE
FPARA
...