I - ALGORITMIA - Conceitos Básicos



Documentos relacionados
Linguagens de Programação:

Montadores e Compiladores

Nº horas ESTRATÉGIAS RECURSOS AVALIAÇÃO

Metodologias de Programação

Microcontroladores e Microprocessadores. Conversão de Bases Prof. Samuel Cavalcante

Módulo IV Programação Visual Basic. Programação

1. Noção de algoritmo

Algoritmos e Programação : Conceitos e estruturas básicas. Hudson Victoria Diniz

Ciclo com Contador : instrução for. for de variável := expressão to. expressão do instrução

Estruturas de Repetição

Versão 2 COTAÇÕES pontos pontos pontos pontos pontos pontos

MATRIZ DA PROVA DE EXAME DE EQUIVALÊNCIA À FREQUÊNCIA A NÍVEL DE ESCOLA DE INTRODUÇÃO ÀS TECNOLOGIAS DA INFORMAÇÃO E COMUNICAÇÃO (PROVA 24)

Introdução a Programação Aula 01

Informação-Prova de Equivalência à disciplina de: Aplicações Informáticas B. 1. Introdução. Ensino Secundário. Ano letivo de 2011/12

Organização e Arquitetura de Computadores I

Sistemas Numéricos. Tiago Alves de Oliveira

Exame de Equivalência à Frequência do Ensino Secundário

Escola Secundária c/3º CEB José Macedo Fragateiro. Curso Profissional de Nível Secundário. Componente Técnica. Disciplina de

Conceitos básicos de programação

Proporcionar a modelagem de sistemas utilizando todos os conceitos da orientação a objeto;

Programação de Computadores I. Linguagem C Função

Introdução a Banco de Dados. INTRODUÇÃO

Algoritmo e Lógica de Programação. Conceitos de Linguagens de Programação

INTRODUÇÃO À PROGRAMAÇÃO EM FORTRAN

Informática Aplicada

Conceitos c++ Prof. Demétrios Coutinho INFORMÁTICA BÁSICA

3. COMPILAÇÃO E ESTRUTURA BÁSICA DE UM PROGRAMA EM C

RACIOCÍNIO LÓGICO QUANTITATIVO

O que é Microsoft Excel? Microsoft Excel. Inicialização do Excel. Ambiente de trabalho

INF1005: Programação I. Algoritmos e Pseudocódigo

Capítulo II : A Linguagem Pascal Conceitos Fundamentais

4. Álgebra Booleana e Simplificação Lógica. 4. Álgebra Booleana e Simplificação Lógica 1. Operações e Expressões Booleanas. Objetivos.

CAPÍTULO 2 SISTEMAS DE NUMERAÇÃO E CÓDIGOS

Figura 8: modelo de Von Neumann

Projetando um Computador

Normas para a elaboração de um relatório. para a disciplina de projecto integrado. 3.º ano 2.º semestre. Abril de 2004

Fundamentos de Arquitetura e Organização de Computadores

UNIPAC Araguari FACAE - Faculdade de Ciências Administrativas e Exatas SISTEMAS DE INFORMAÇÃO

Introdução. Software Básico Aula 3. Prof. Dr. Rogério Vargas.

CAP. II RESOLUÇÃO NUMÉRICA DE EQUAÇÕES NÃO LINEARES

TECNOLOGIA EM MECATRÔNICA INDUSTRIAL CONTROLADORES LÓGICOS PROGRAMÁVEIS

FOLHA DE CÁLCULO ELABORAÇÃO DE GRÁFICOS

O AMBIENTE DELPHI. Programação de Computadores.

Programação de Computadores I Estruturas de Repetição PROFESSORA CINTIA CAETANO

Capítulo VI Circuitos Aritméticos

Histórico e Evolução da Computação

Modelo de Entidade-Relação (ER)

OBSERVAÇÕES: EXERCÍCIOS

Comandos de Desvio 1

1. Manual Resumido de Gestão de Contratos

Algoritmos APRENDENDO A PROGRAMAR COM C#

Projetando um Computador Parte II Arquitetura do Processador BIP

LINGUAGEM SQL Linguagem usada em SGBD para: Definir estrutura de dados; Modificar dados em um banco de dados; Especificar restrições de segurança; Rea

Até o momento, vimos que a estrutura de um computador segue uma seqüência: ENTRADA => PROCESSAMENTO => SAÍDA

Vírgula flutuante Aula 6

Qualidade de Produto. Maria Cláudia F. P. Emer

Introdução à Ciência da Informação

1. À primeira coluna (P), atribui-se uma quantidade de valores V igual à metade do total de linhas

Versão 1. Identifica, claramente, na folha de respostas, a versão do teste (1 ou 2) a que respondes.

AGRUPAMENTO DE ESCOLAS DR. VIEIRA DE CARVALHO

Parte 05 - Técnicas de programação (mapas de Veitch-Karnaugh)

Caminho de Dados e Controle. Prof. Leonardo Barreto Campos 1

Plano de Ensino PROBABILIDADE E ESTATÍSTICA APLICADA À ENGENHARIA - CCE0292

Métodos Formais. Agenda. Relações Binárias Relações e Banco de Dados Operações nas Relações Resumo Relações Funções. Relações e Funções

Circuitos Aritméticos

Universidade Federal da Paraíba Centro de Informática Departamento de Informática

Programa de Matemática 2º ano

Arquitetura e Organização de Computadores

Prova Modelo. Nome: Número:

CRITÉRIOS ESPECÍFICOS DE AVALIAÇÃO

2) Escreva um algoritmo que leia um conjunto de 10 notas, armazene-as em uma variável composta chamada NOTA e calcule e imprima a sua média.

CAPÍTULO II. Variáveis e Expressões CAPÍTULO II COMENTÁRIOS SINTAXE / SEMÂNTICA ESTRUTURA DE UM ALGORITMO EM PSEUDOCÓDIGO

Bases de Dados BDDAD. Álgebra Relacional. Nelson Freire (ISEP LEI-BDDAD 2015/16) 1/33

Matemática Aplicada às Ciências Sociais

Sistemas Digitais Ficha Prática Nº 7

Programação. Folha Prática 4. Lab. 4. Departamento de Informática Universidade da Beira Interior Portugal Copyright 2010 All rights reserved.

BANCO DE DADOS I AULA 2. Willamys Araújo willamysaraujo7@gmail.com

Engenharia Econômica

LINGUAGEM JAVA - RESUMO

Introdução. Qualidade de Produto. Introdução. Introdução ISO/IEC Normas

Oganização e Arquitetura de Computadores

Algoritmo e Pseudo-código

Do alto-nível ao assembly

1. Estrutura de Dados

OpenPDV: Sistema aberto para gerenciamento de restaurantes

Matemática A COTAÇÕES GRUPO I GRUPO II. Teste Intermédio. Versão 2. Duração do Teste: 90 minutos º Ano de Escolaridade. 5...

AGRUPAMENTO DE ESCOLAS DE SAMORA CORREIA ESCOLA BÁSICA PROF. JOÃO FERNANDES PRATAS ESCOLA BÁSICA DE PORTO ALTO

Placas Gráficas. Placas Gráficas. Placas Gráficas. Placas Gráficas. O que é? Para que serve? Resolução (cont.) Resolução

Simplificação de Expressões Booleanas e Circuitos Lógicos

ÁLGEBRA BOOLEANA- LÓGICA DIGITAL

Orientação a Objetos

Java possui 4 tipos de dados. Estes tipos de dados são divididos em: boolean, character, integer e float.

EXPLORANDO A RESOLUÇÃO DE PROBLEMAS COM O MAPLE

1 Teoria de conjuntos e lógica

Medidas e Escalas: Escalas não Comparativas

Microprocessadores e Aplicações

INTERFACE PARALELA. Área: Eletrônica Nível de conhecimento necessário: básico. Autor:

EXAME NACIONAL DO ENSINO SECUNDÁRIO

O Sistema de Computação

Transcrição:

I - ALGORITMIA - Conceitos Básicos 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 utilizando 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 comunicaçã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 dizerse, que uma aplicação assenta numa linguagem, ou seja, num modo específico de comunicação com a máquina. Linguagens de programação são sistemas de escrita para enunciar as operações a executar por um computador. 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, caracteres 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 determinadas 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 António M. P. Sousa da Silva Algoritmia - 1

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 constantemente 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 viceversa muda o significado de uma instrução. Assim, para facilitar a tarefa dos programadores foram criadas diversas linguagens de programação. Linguagem Simbólica ou de Montagem Inicialmente, na década de 1950, criou-se uma nova linguagem semelhante à linguagem 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ólicos. 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: PROGRAMA-FONTE PROGRAMA-OBJECTO TRADUTOR Sob o ponto de vista da programação, esta linguagem apresenta as seguinte desvantagens: António M. P. Sousa da Silva Algoritmia - 2

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 ditados pela estrutura interna do computador. Isto torna a linguagem orientada para a pessoa e não para a máquina. Além disso os programas são portáteis; um programa desenvolvido 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. António M. P. Sousa da Silva Algoritmia - 3

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 interessados 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 desenvolvimento e manutenção de grandes programas. Influenciou a maioria das linguagens de programaçã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, rapidamente 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++, actualmente 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 Linguagemalto nível Máquina António M. P. Sousa da Silva Algoritmia - 4

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 executado independentemente do compilador. Há vários tipos de compiladores e cada um é classificado de acordo com o código de saída que gera. PROGRAMA-FONTE (EM LINGUAGEM DE ALTO NÍVEL) TRADUTOR (COMPILADOR) PROGRAMA-OBJECTO (PROGRAMA EM LINGUAGEM- -MÁQUINA) 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 totalmente 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. PROGRAMA-FONTE (EM LINGUAGEM DE ALTO NÍVEL OU ASSEMBLY) TRADUTOR (INTERPRETADOR) ENTRADA SAÍDA (EXECUÇÃO) 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. António M. P. Sousa da Silva Algoritmia - 5

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 (segunda geração) trouxe aproximadamente um progresso de sete para um à actividade do programador. Um progresso semelhante ocorreu quanto as linguagens de alto nível (terceira 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ãoprocedimental, 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 Linguagem é 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 elevadas, 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. António M. P. Sousa da Silva Algoritmia - 6

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 computador 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 programa, 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 é elaborado 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 programaçã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 (eventualmente retendo os aspectos positivos e propondo melhoramentos) passa-se á esquematização, elaborando diagramas, onde de uma forma simples e bem documentada 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 sistema ou problema, existindo métodos e ferramentas próprios, cujo estudo sai do âmbito deste módulo. António M. P. Sousa da Silva Algoritmia - 7

Concepção Depois de compreendido e esquematizado o sistema ou problema, deve pensarse 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 programaçã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ódigos-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. António M. P. Sousa da Silva Algoritmia - 8

Estes testes deverão ser realizados por vários utilizadores e com dados diversificados. 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áquina 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 linguagem 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 resultados, podendo-se considerar um algoritmo como o esquisso de um programa. Um 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 elaboraçã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 tarefa, 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 António M. P. Sousa da Silva Algoritmia - 9

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 passo-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. António M. P. Sousa da Silva Algoritmia - 10

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 manter 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 directamente no computador, mas o formalismo implícito é muito semelhante a muitas linguagens 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: António M. P. Sousa da Silva Algoritmia - 11

Início INÍCIO OU FIM DO PROGRAMA Início A LER A E B PELO TECLADO Ler A B OU Ler B ENTRADA/SAÍDA C <- A + B PROCESSAMENTO INTERNO C <- A + B C ESCREVER C NO MONITOR Escrever C Fim Fim 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 linguagem 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 programaçã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 programador 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 compromisso 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. António M. P. Sousa da Silva Algoritmia - 12

O rigor imposto na descrição dos algoritmos bem como a insistência em determinados pormenores que possam parecer excessivos para o Homem como agente executor, é indispensável em linguagens de programação onde o agente executor é o computador. 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 identificados 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: Simples inteiros (integer) numéricos reais (real) lógicos ou booleanos (boolean) um caracter (char) Estruturados cadeia de caracteres (string) tabelas, quadros ou matrizes (array) 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 é António M. P. Sousa da Silva Algoritmia - 13

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 2 16 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 maioria das aplicações numéricas correntes. Dados Lógicos ou Booleanos Representam os dois valores lógicos: Verdadeiro (true) ou Falso (false). São usados 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, mensagens, 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 intermé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. António M. P. Sousa da Silva Algoritmia - 14

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. António M. P. Sousa da Silva Algoritmia - 15

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 efectivamente 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 Depois da compilação desta instrução: 1 A É REPRESENTAÇÃO SIMBÓLICA DE UM DADO 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) António M. P. Sousa da Silva Algoritmia - 16

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 endereç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 programador que cabe a tarefa de ter cuidado em não alterar, inadvertidamente, o valor que considerou 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 estabelecer uma relação de ordem (comparação) entre dados do mesmo tipo e, por isso, o resultado é sempre um valor lógico. A tabela seguinte resume este tipo de operadores: António M. P. Sousa da Silva Algoritmia - 17

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 ligados 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 representam 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; António M. P. Sousa da Silva Algoritmia - 18

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 formadas 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, normalmente, 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. António M. P. Sousa da Silva Algoritmia - 19

Simples de leitura/escrita de atribuição de chamada de um módulo de programação (assunto a tratar) salto para outra parte do programa (goto) Estruturadas compostas 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 leitura (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 correspondente à 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: António M. P. Sousa da Silva Algoritmia - 20

Area 3.1416 * raio * * 2 INFORMÁTICA 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írculos. 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 = π r 2 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: Entra o raio Calcula a área Sai a área 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 Escrever Introduza o valor do Raio: Ler raio area pi * raio ** 2 Escrever A área é :, area Fluxograma Início Introduza o valor do raio raio area <- pi * raio ** 2 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: António M. P. Sousa da Silva Algoritmia - 21 Fim

Ler raio raio = 1 area pi *raio*raio area = 3.1416*1*1 area = 3.1416 Escrever area 3.1416 resultado): Sendo assim, o programa teria o seguinte output (a menos da apresentação do 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 automaticamente reconhecidos por ela. Estes elementos são muitas vezes designados por literais 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 António M. P. Sousa da Silva Algoritmia - 22

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 efeito: 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, é costume 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 versã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 António M. P. Sousa da Silva Algoritmia - 23

II - ALGORITMIA - Estruturas de Controlo 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 sequê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 decidir se se deve executar uma ou outra instrução;. Execução repetida de grupos de instruções um certo número de vezes ou enquanto se verificar uma condição;. Conjunto de instruções que se repete em diversos pontos do programa, tornandose 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 melhor 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 2.3 Instrução 3 Instrução 4 INSTRUÇÃO COMPOSTA 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 especiais para indicar o início o e fim da estrutura. No entanto (como se verá no caso do António M. P. Sousa da Silva Algoritmia - 24

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 (principalmente 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 realizar uma acção, unicamente se uma expressão booleana tiver um determinado valor (verdadeiro 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 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. SE expressão booleana falsa ESTA INSTRUÇÃO PODE SER LIDA ASSIM: SE A EXPRESSÃO BOOLEANA TIVER O VALOR verdadeira ENTÃO instrução VERDADEIRO É EXECUTADA A INSTRUÇÃO. SE TIVER O VALOR FALSO NÃO É EXECUTADA A INSTRUÇÃO. Exemplos 1. SE raio <= 0 ENTÃO Escrever Valor incorrecto para o raio 2. SE raio > 0 ENTÃO area pi * r ** 2 Escrever area António M. P. Sousa da Silva Algoritmia - 25

3. SE fim ENTÃO Escrever FIM DO PROGRAMA 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 escritas 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 é necessário seleccionar, uma de entre duas alternativas em curso de acção. Tem a seguinte forma geral e respectivo fluxograma: SE SE expressão booleana ENTÃO instrução1 SENÃO instruçao2 ENTÃO verdadeira expressão booleana falsa SENÃO instrução 1 instrução 2 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 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 António M. P. Sousa da Silva Algoritmia - 26

2. SE a >= b ENTÃO Escrever a, é maior ou igual a, b SENÃO Escrever a, é menor que, b 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 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 SENÃO i3 António M. P. Sousa da Silva Algoritmia - 27

3. SE eb1 ENTÃO SE eb2 ENTÃO i1 SENÃO i2 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 SENÃO i2 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 António M. P. Sousa da Silva Algoritmia - 28

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 Fim Fluxograma Início Ler a, b, c Sim a>b e a>c Não Escrever 'o maior número é ', a Sim b>c Não Escrever 'o maior número é ', b Escrever 'o maior número é ', c Fim Output Introduza os três números a comparar: 7 10 1 O maior número é 10 António M. P. Sousa da Silva Algoritmia - 29

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 SE b > maior ENTÃO maior b SE c > maior ENTÃO maior c 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 executor 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 claros 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. António M. P. Sousa da Silva Algoritmia - 30

A forma geral desta estrutura é: INFORMÁTICA 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 A PARTE DA ESTRUTURA DELIMITADA PELOS PARÊNTESIS RECTOS É OPCIONAL, ISTO É, PODE SER USADA OU NÃO CONFORME AS NECESSIDADES. Cada etiqueta de caso representa um dos valores permitidos pela expressão. Assim, se a expressão é de um certo tipo simples, as etiquetas de caso representam valores 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áusula 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 correspondente 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 compostas. 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... Início Ler notaquantitativa NotaQuantitativa >= 1 e NotaQuantitativa <= 4 Não NotaQuantitativa >= 5 e NotaQuantitativa <= 9 Não NotaQuantitativa >= 10 e NotaQuantitativa <= 13 Não NotaQuantitativa >= 14 e NotaQuantitativa <= 17 Não NotaQuantitativa >= 18 e NotaQuantitativa <= 20 Sim NotaQualitativa <- 'Mau' Sim NotaQualitativa <- 'Medíocre' Sim NotaQualitativa <- 'Suficiente' Sim NotaQualitativa <- 'Bom' Sim NotaQualitativa <- 'Muito Bom' Não Escrever 'Nota inválida Fim António M. P. Sousa da Silva Algoritmia - 31

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... 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. António M. P. Sousa da Silva Algoritmia - 32

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 escolha 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 ENQUANTO expressão booleana EXECUTAR instrução FENQUANTO EXECUTAR Expresão Booleana Instrução Falsa Verdadeira 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 caracterí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, dependendo 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 classificações até 20. São fundamentais as instruções 1 e 3.3; a primeira para iniciar o contador (correspondente á primeira classificação) de modo que a expressão booleana (con- António M. P. Sousa da Silva Algoritmia - 33

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 mesmo 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 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 aspectos, estas duas estruturas completam-se uma à outra. A sua forma geral é: REPETIR REPETIR sequência de instruções ATÉ expressão booleana Sequência de Instruções ATÉ Expresão Booleana Falsa Verdadeira António M. P. Sousa da Silva Algoritmia - 34

A sequência de instruções será executada até que a expressão booleana se torne verdadeira (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 estruturas 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 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. António M. P. Sousa da Silva Algoritmia - 35

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 FPARA instrução 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 seguinte, 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 compreender o seu funcionamento. PARA Variável de controlo<- valor inicial Variável de controlo <= valor final EXECUTAR Instrução Sim Não AS ATRIBUIÇÕES INDICADAS NO FLUXOGRAMA SÃO AUTOMATICAMENTE IMPLEMENTADAS PELA ESTRUTURA, PELO QUE, NÃO DEVEM SER ESPECIFICADAS NO ALGORITMO/PROGRAMA. variável de controlo <- variável de controlo + 1 FPARA 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 tipicamente 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; António M. P. Sousa da Silva Algoritmia - 36

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 FPARA... 3. Ver exercício resolvido nº 6 Comparando com os mesmos exemplos construídos com as outras duas estruturas 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. António M. P. Sousa da Silva Algoritmia - 37

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 correctamente 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 interromper 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 ATÉ raio > 0 Fim António M. P. Sousa da Silva Algoritmia - 38

Exercícios Resolvidos Para complementar os exemplos até agora estudados seguem-se alguns exercícios 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 é utilizado 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 António M. P. Sousa da Silva Algoritmia - 39

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 matemá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 coeficientes 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 Entram os coeficientes Cálculo das Soluções E/S Nome Tipo Descrição Saem as soluções 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. António M. P. Sousa da Silva Algoritmia - 40

Descritivo INFORMÁTICA 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' 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 Fim Fluxograma Inicio Ler a,b,c,d,e,f 1 (ESTE SÍMBOLO SIGNIFICA QUE O FLUXOGRAMA CONTINUA NA PÁGINA SEGUINTE.) António M. P. Sousa da Silva Algoritmia - 41

1 Não (a*e-b*d)=0 Sim x <- (c*e - b*f) / (a*e - b*d) y <- (a*f - c*d) / (a*e - b*d) Não (c*e-b*f)=0 Sim Escrever x, y Escrever ' Sistema Impossível' Escrever ' Sistema Indeterminado' Fim 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' 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 Fim António M. P. Sousa da Silva Algoritmia - 42

Output Introduza os coeficientes do sistema: 2 1 4 2 2 1 A solução do sistema é: x = 3.5 e y = -3 (RESOLVA O SISTEMA USADO NO TESTE DO ALGOTITMO PARA CONFIRMAR O RESULTADO DO OUTPUT.) 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) conforme 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: Entram dois números Escolher opção Menu conforme a opção que entra Efectuar operação Sai resultado 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 ' António M. P. Sousa da Silva Algoritmia - 43

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 = 1 Não Sim Resultado <- n1 + n2 Escrever resultado opção = 2 Sim Resultado <- n1 - n2 Não Escrever resultado opção = 3 Sim Resultado <- n1 * n2 Não Escrever resultado opção = 4 Não Sim Resultado <- n1 / n2 Escrever resultado Escrever 'Opção inválida' Fim António M. P. Sousa da Silva Algoritmia - 44

Output Introduza os números : 12 6 MENU' 1- Adicionar ' 2- Subtrair' 3- Multiplicar' 4- Dividir' Qual a opção? 1 A 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 conjunto 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: 140 2 70 2 35 5 7 7 A sequência de factores primos obtida (2, 2, 5 e 7), convertida no produto 2x2x5x7 vai dar o número 140. 1 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 António M. P. Sousa da Silva Algoritmia - 45

{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. Depois 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. Fluxograma Início Ler n divisor <- 2 n <> 1 Não Sim n mod divisor <> 0 Não Sim divisor <- divisor + 1 Escrever divisor n <- n div divisor Fim António M. P. Sousa da Silva Algoritmia - 46

Output Introduza o número a decompor: 140 factores primos de 140: 2 2 5 7 Exercício nº 5 - Controlo de paragem de um algoritmo/programa Todos os algoritmos até agora estudados, resolviam os diferentes problemas exactamente 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 António M. P. Sousa da Silva Algoritmia - 47

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 portanto 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 expressã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 paragem. 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). António M. P. Sousa da Silva Algoritmia - 48

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 {determina a menor nota} SE nota < menor ENTÃO menor nota 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 INFORMÁTICA 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 notas 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). António M. P. Sousa da Silva Algoritmia - 49

Fluxograma Início maior <- 0 menor <- 20 soma <- 0 ler n Traçagem Valores iniciais: n = 3 maior = 0 menor = 20 soma = 0 contador <- 1 contador <= n Sim Não 1ª repetição (contador = 1) nota = 8 soma = 0 + 8 = 8 maior = 8 menor = 8 2ª repetição (contador = 2) nota = 14 soma = 8 + 14 = 22 maior = 14 menor = 8 3ª repetição (contador = 3) nota = 17 soma = 22 + 17 = 39 maior = 17 menor = 8 Escrita: média = 39 / 3 = 13 maior = 17 menor = 8 Ler nota soma <- soma + nota Não nota > maior Sim maior <- nota Não nota > menor Sim menor <- nota contador <- contador +1 Escrever média Escrever maior Escrever menor Fim 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. António M. P. Sousa da Silva Algoritmia - 50

Output Introduza o total de notas: 3 Introduza a 1ª nota: 8 Introduza a 2ª nota: 14 Introduza a 3ª nota: 17 A média das notas é: 13 A maior das notas é: 17 A 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 Escrever ' Nota inválida. Tente de novo' 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 {determina a menor nota} SE nota < menor ENTÃO menor nota FPARA... VALIDAÇÃO DOS DADOS António M. P. Sousa da Silva Algoritmia - 51