51
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ção Linguagens de programação Linguagens de programação Linguagens de programação Linguagens de programação são sistemas de escrita para enunciar as operações a executar por um computador. ou ou ou ou ou 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

I - ALGORITMIA - Conceitos Básicos · As linguagens baseadas em código máquina designam-se por linguagens de baixo I - ALGORITMIA - Conceitos Básicos. ... como por exemplo em

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

...