Prévia do material em texto
1 Algoritmos Autor: Milena Wohlmeister 2 Algoritmos Milena Wohlmeister Introdução O uso de algoritmos é quase tão antigo quanto a matemática. Com o passar do tempo, entretanto, ele foi bastante esquecido pela matemática. Com o advento das máquinas de calcular e mais tarde os computadores, o uso de algoritmos ressurgiu com grande vigor, como uma forma de indicar o caminho para a solução dos mais variados problemas. Algoritmo não é a solução do problema, pois, se assim fosse, cada problema teria um único algoritmo. Algoritmo é um caminho para a solução de um problema, e em geral, os caminhos que levam a uma solução são muitos. Ao longo dos anos surgiram muitas formas de representar os algoritmos, algumas utilizando linguagens semelhantes às linguagens de programação e outras utilizando formas gráficas, como os fluxogramas. Dentre as formas de representação usadas, deu-se uma acentuada preferência por formas estruturadas, cuja principal vantagem é a de facilitar a legibilidade e compreensão dos algoritmos. O aprendizado de algoritmos não se consegue a não ser através de muitos exercícios. Não se aprende algoritmos: • Copiando algoritmos • Estudando algoritmos Só se aprende algoritmos: • Construindo algoritmos • Testando algoritmos Conceitos Básicos Essa seção visa conceituar constante, variável, operação, expressão e atribuição. Considere- se a fórmula matemática simples do cálculo do volume de uma esfera: V = 4 pi R3 3 3 onde se encontram: 1- valores que podem ser classificados como: a) valores constantes, invariantes em todas as aplicações da fórmula, no caso, os valores 4, 3 e pi, aos quais denomina-se constantes. b) valores a serem substituídos na fórmula, em cada aplicação. A representação destes valores, usualmente, é feita através de letras que recebem o nome de variáveis e tornam a fórmula genérica, possível de ser aplicada para resolver uma certa classe de problemas e não apenas um problema específico. 2- Operações a serem feitas sobre determinados operandos (valores), para a obtenção da solução do problema. Na fórmula do volume da esfera, estão representadas as operações de divisão, multiplicação e potenciação, feitas sobre os operandos, 4, 3, pi e R, numa seqüência pré-determinada, mas nem sempre rigorosa, devido às leis matemáticas. Sob este aspecto, uma fórmula matemática é simplesmente uma descrição de um conjunto de ações que devem ser executadas sobre um conjunto de objetos, sendo estes, constantes ou variáveis. Existe uma outra relação importante entre objeto e operação, no sentido de que, certas operações somente podem ser executadas sobre determinados objetos. Por exemplo: • a raiz quadrada de um número qualquer somente pode ser feita se o número for real e positivo; • o cálculo do fatorial de um número somente pode ser feito se o número for inteiro e positivo; • a determinação do arco seno trigonométrico somente pode ser feita se o valor estiver no intervalo [ -1 , 1 ]. Nos exemplos apresentados, pode-se notar dois tipos de limitações: 1- limitação de classe de valores: inteiros, reais, lógicos, literais; 2- limitações de intervalo, pois algumas operações não atuam sobre todo conjunto, mas somente sobre parte dele. Os tipos de dados (valores) existentes podem, então, ser inteiros, reais, caracteres (ou literais) e lógicos (ou booleanos). Esses tipos básicos são bem definidos e podem ser combinados de modo a formar tipos de dados estruturados, incluindo vetores, matrizes, registros e arquivos. Uma constante é, então, um objeto invariante em cada execução de uma expressão, enquanto variável é um objeto que representa um valor que pode ser alterado a cada execução da expressão em que estiver inserida. 4 As variáveis podem ser visualizadas como receptáculos de valores. Cada receptáculo é identificado através de um nome e somente pode receber valores de um determinado tipo. Pode-se comparar uma variável também como sendo uma caixa identificada por um nome colocado na tampa e na qual pode ser armazenado um valor. Enquanto o nome sempre permanece o mesmo, o conteúdo da caixa pode ser substituído. Assim, cada vez que a fórmula do cálculo do volume de uma esfera for utilizada, ocorrerá o seguinte: • a variável R deverá receber um valor antes da execução dos cálculos; • a variável V receberá um valor após a execução dos cálculos; • o valor da variável R será utilizado no cálculo do valor de V; • a cada nova utilização da fórmula, o valor de R poderá ser alterado e conseqüentemente o valor de V também o será. Uma vez conceituados constante e variável pode-se analisar as combinações deles na construção de expressões. Expressões, no sentido matemático, são representações simbólicas de seqüências de operações a serem feitas sobre determinados operandos, visando a obtenção de um resultado. As operações representadas nas expressões devem ser válidas para os operandos especificados para que seja possível a obtenção de um resultado. O conjunto de operandos e operações que compõem uma expressão determina o tipo da expressão e define o tipo de resultado a ser obtido. As expressões mais freqüentemente usadas na solução de problemas enquadram-se em uma das seguintes categorias: • expressões aritméticas: produzem como resultado um número; • expressões literais: produzem como resultado um texto; • expressões lógicas: produzem como resultado um valor lógico. Para cada uma das categorias acima, pode ser definido um conjunto de operações possíveis. Por exemplo, as expressões aritméticas podem utilizar as operações de adição, subtração, multiplicação, divisão, entre outras. As expressões literais podem utilizar a operação de concatenação, unindo dois conjuntos de caracteres. Nesse primeiro instante, irão ser estudadas as expressões aritméticas, compostas por: • operandos: constantes e variáveis; • operadores: que indicam as operações a serem feitas; • ordem de avaliação: símbolos que indicam alterações na ordem usual de avaliação. Por exemplo, o uso de parênteses. Na resolução de uma expressão aritmética deve-se seguir uma ordem pré-definida dependente dos operadores que aparecem nesta expressão. A prioridade dos operadores básicos é a que segue: 5 1- potenciação, radiciação e operações unárias 2- multiplicação e divisão 3- soma e subtração 4- parênteses podem alterar esta ordem 5- segue-se da esquerda para a direita em caso de indeterminação (mais de uma operação com a mesma prioridade) A última operação realizada em uma expressão se chama atribuição de valor, que é o ato de armazenar ou escrever um valor em uma variável. A atribuição compreende uma ação de substituição do conteúdo de uma variável cujo efeito é: após a atribuição, a variável passa a representar um novo valor, sendo “perdido” o seu valor anterior. Em algoritmos, existem várias maneiras de representar uma atribuição de valor, como: variavel = valor variavel := valor variavel <- valor Será utilizada a segunda forma para representar uma atribuição. Isso será feito para diferenciar o operador de atribuição do operador de igualdade, muito utilizado em operações lógicas. Por exemplo, se N = 5 fosse considerado uma atribuição, então o valor 5 seria atribuído à variável N. Se N = 5 fosse considerada uma operação de igualdade, então o resultado seria verdadeiro se N fosse igual a 5 e falso se N fosse diferente de 5. Considerando as atribuições: A := B B := C nesta ordem e supondo que A tenha valor 5, B tenha valor 2 e C tenha valor 10, tem-se como resultado final A com valor 2 e B com valor 10. Se for alterada apenas a ordem das duas atribuiçõespara: B := C A := B tem-se como resultado final A com valor 10 e B com valor 10. Outro exemplo mostra que se o A tiver valor 2 e B valor 4 e se forem intercambiados os valores das variáveis A e B não é possível escrever simplesmente: A := B B := C Cujo resultado seria A com valor 4 e B com valor 4 também. Nesse caso tem-se que utilizar uma variável auxiliar, assim: C := A 6 A := B B := C Algoritmos Puramente Seqüenciais Essa seção visa conceituar algoritmo e caracterizar algoritmos puramente seqüenciais, além de apresentar a formalização da linguagem algorítmica. Em termos conceituais, algoritmo é um conjunto finito de regras, bem definidas, para a solução de um problema em um tempo finito. Considerando o seguinte problema: dados três valores não nulos a, b, c, determinar a sua média aritmética, harmônica e geométrica. As tarefas a serem executadas para a solução deste problema podem ser descritas assim: 1- obter os valores de a, b, c 2- calcular a média aritmética pela fórmula: média aritmética = a + b + c 3 3- calcular a média harmônica pela fórmula: média harmônica = 3 1 + 1 + 1 a b c 4- calcular a média geométrica pela fórmula: média geométrica = 3 a x b x c 5- comunicar os resultados obtidos: média aritmética, média harmônica e média geométrica 6- terminar A seqüência de tarefas apresentada, especificada passo a passo, é um algoritmo, pois é um conjunto finito de regras que podem ser consideradas bem definidas e cuja execução produz a solução do problema proposto, após um tempo finito. É importante que, num algoritmo, cada passo esteja precisamente definido, não deixando nenhuma margem a ambigüidades. A correção é uma qualidade diferente das demais que podem ser consideradas em relação a um algoritmo. Enquanto as outras qualidades são relativas, isto é, podem ser mais importantes em alguns algoritmos e menos em outros, a correção é condição para que o algoritmo tenha sentido de existência. As outras qualidades importantes em um algoritmo, além da correção, são: • efetividade: o algoritmo deve fazer aquilo a que se propõe em tempo hábil; • eficiência e clareza: o algoritmo deve fazer aquilo a que se propõe da forma mais econômica possível, tanto do ponto de vista da máquina, quanto do usuário; • generalidade: se possível, o algoritmo deve prever a necessidade de futuras adaptações e estar preparado para aceitá-las. Na prática, não é importante se ter apenas um algoritmo, mas sim um bom algoritmo. Geralmente existe mais de uma seqüência de operações que levam à execução da mesma tarefa, isto é, existem vários algoritmos para um mesmo problema. Após encontrada uma 7 solução, pode ser efetuado um refinamento no algoritmo, na tentativa de se alcançar as qualidades citadas anteriormente. No exemplo das médias foi utilizada uma linguagem algorítmica informal, onde não existem regras rígidas na construção do algoritmo. Para os algoritmos desenvolvidos a partir de agora, será utilizada uma linguagem algorítmica estruturada, baseada na linguagem Pascal. O algoritmo em si se constitui basicamente em: • entrada de dados • processamento • saída de dados Para a entrada de dados será utilizada a instrução: ler(lista de variáveis); Exemplo: ler(a,b,c); Para a saída de dados será utilizada a instrução: mostre(lista de variáveis/texto qualquer); Exemplo: mostre(‘Alo mundo!’); mostre(‘O resultado final é ’, soma); mostre(‘A média de ’, a , ‘, ’ , b , ‘ e ’ , c , ‘ é ’ , media); O texto mostrado nos exemplos é conhecido como string, e é assim que será chamado daqui pra diante. Um string, obrigatoriamente, deve estar dentro de apóstrofes. Percebe-se que é possível intercalar strings com variáveis na mostragem. Tanto a instrução ler quanto o mostre tem ao seu final um ponto-e-vírgula. Isso também é obrigatório em todo final de instrução. A utilização de maiúsculas ou minúsculas na construção do algoritmo fica por conta de quem vai construí-lo. Como já foi comentado, o operador das atribuições será o :=, mas as expressões aritméticas tem que estar dispostas todas na mesma linha, usando os operadores comumente utilizados em computadores. No exemplo das médias, as expressões ficariam assim: a + b + c ma := (a + b + c ) / 3; 3 3 mh := 3 / (1/a + 1/b + 1/c ); 1 + 1 + 1 a b c 8 3 a x b x c mg := (a * b * c) ^ (1 / 3); Os operadores são (em ordem de prioridade) : 1. potenciação Ex.: 2^3 e radiciação Ex.: 12 ^(1/2) 2 12 2. multiplicação * e divisão / 3. adição + e subtração – Os tipos de dados utilizados em variáveis são : • inteiro: variáveis que armazenam valores inteiros; • real: variáveis que armazenam valores reais; • caracter: variáveis que armazenam apenas uma letra, número ou símbolo; • string: variáveis que armazenam um conjunto de caracteres; • lógico: variáveis que armazenam verdadeiro ou falso. Cada variável vai ter um nome identificador que deve ser iniciado por letras ou o caracter underline ( _ ). O resto é formado por letras, dígitos e caracter underline. Não é permitida a utilização de espaços para a formação do identificador e nem acentuação. Exemplo de identificadores válidos: valortotal, soma_item1. É muito importante que se tenha cuidado com a sintaxe do algoritmo, ou seja, a grafia tem que estar rigorosamente dentro das especificações. Em termos estruturais, o algoritmo possui quatro áreas, na ordem: 1. área para identificação; 2. área para declarações; 3. área para subalgoritmos; 4. área do algoritmo em si. A terceira área somente será utilizada mais adiante. A área para identificação é formada pela palavra-chave programa, um espaço em branco, um identificador, que segue as mesmas regras das variáveis, mas pode ter no máximo dez caracteres, e um ponto-e-vírgula. Exemplo: programa medias; A área para declarações é o espaço destinado para declarar as variáveis que serão utilizadas no algoritmo. Todas as variáveis devem ser declaradas, obrigatoriamente. Sempre começa pela palavra-chave var. Exemplo: var a,b,c: inteiro; soma: real; 9 letra: caracter; nome1, nome2: string; x: lógico; A área do algoritmo começa com a palavra-chave início e termina com a palavra-chave fim com um ponto final. Dentro dessa área vão estar as entradas, o processamento e as saídas do algoritmo, ou seja, é o algoritmo em si. Exemplo: início <entradas> <processamento> <saídas> fim. Percebe-se, nos exemplos, um pequeno avanço para a direita em alguns momentos. Isso se chama endentação do algoritmo e, apesar de não influenciar na sua execução, é muito utilizada para sua organização e entendimento. Mais adiante, quando os algoritmos tomarem dimensões maiores e for necessário mais do que um nível de endentação, se notará mais claramente a sua importância. Com o que foi visto até aqui, é possível construir algoritmos puramente seqüenciais, onde a execução se dá em ordem ascendente às instruções, de cima para baixo. Como exemplo, o algoritmo abaixo mostra a resolução do problema das médias apresentada anteriormente. programa medias; var a,b,c,ma,mh,mg: real; inicio ler(a,b,c); ma := (a + b + c ) / 3; mh := 3 / (1/a + 1/b + 1/c ); mg := (a * b * c) ^ (1 / 3); mostre(‘Media Aritmetica: ’, ma); mostre(‘Media Harmonica: ’, mh); mostre(‘Media Geometrica: ’, mg); fim. Percebe-se a existência das três áreas bem definidas, com a identificação doalgoritmo, a declaração das variáveis utilizadas e do algoritmo em si, que é executado seqüencialmente. Exercícios 1. Escrever um algoritmo que lê o número de um funcionário, seu número de horas trabalhadas, o valor que recebe por hora, e o número de filhos com idade menor do que 14 anos. Calcular e mostrar o salário deste funcionário. 2. Escrever um algoritmo que calcula e mostra o fatorial de 5. Um fatorial é caracterizado pela fórmula n! => n x (n-1) x (n-2) x ... x 1. 3. Escrever um algoritmo que lê 3 valores a, b, c e calcula e mostra: 10 a) A área do triângulo que tem a por base e b por altura. Fórmula: (b x h) 2 b) A área do círculo de raio c. Fórmula: piR2 c) A área do trapézio que tem a e b por bases e c por altura. Fórmula: (B + b).h 2 d) A área do quadrado de lado b. Fórmula: lado2 e) A área do retângulo de lados a e b. Fórmula: lado1 x lado2 f) A área da superfície de um cubo que tem c por aresta. Fórmula: 6a2 4. Escrever um algoritmo que lê p, u e r respectivamente o 1o termo de uma progressão aritmética, o último termo da progressão e a razão desta progressão. Determinar a soma dos termos desta progressão aritmética e mostrar. n = an – a1 + r Sn = (a1 + an) . n r 2 5. Escrever um algoritmo que lê o código da peça 1, o número de peças 1, o valor unitário da peça 1, o código da peça2, o número de peças 2, o valor unitário da peça 2 e a percentagem do IPI a ser acrescentado e calcula e mostra o valor total a ser pago. 6. Um avião em linha reta, a uma altitude a passa sobre um ponto p num instante t = 0. Se a velocidade é v, calcular a distância d do avião ao ponto p no tempo t = 30. Escrever um algoritmo que lê v e a e calcula e mostra a distância ao ponto p após 30 segundos. d = a2 + vt2 7. Escrever um algoritmo para calcular e mostrar os sucessivos valores de “E” usando a série abaixo e considerando primeiro 3 termos, depois 4 termos e finalmente 5 termos. E = 1 + 1 + 1 + 1 + 1 1! 2! 3! 4! 0 vt 30 a d p 11 8. Escrever um algoritmo que lê o valor de um empréstimo e calcule e mostre o valor de cada amortização, considerando 24 amortizações a uma taxa de 48%. valor da amortização = valor do emprestimo x taxa no de amortizações 9. Escrever um algoritmo que lê um valor monetário e calcula qual o menor número possível de notas de 5000, 1000, 500, 200, 100, 50, 10, 5 e 1 em que o valor lido pode ser decomposto. Mostrar o valor lido e a relação de notas necessárias. Dica: Utilizar a instrução truncar, que serve para pegar apenas a parte inteira de uma divisão. Ex.: truncar(8 / 3) produz o resultado 2 . 10. Escrever um algoritmo que lê o número de um vendedor, o seu salário-fixo, o total de vendas por ele efetuadas e o percentual que ganha sobre o total de vendas. Calcular o salário total do vendedor. Mostrar o número do vendedor e o salário total. 11. Escrever um algoritmo que lê 3 valores a, b, c que são lados de um triângulo e calcule e mostre a área deste triângulo. Area = s(s – a)(s – b)(s – c) onde s é o semi-perímetro s = a + b + c 2 12. Um sistema de equações lineares do tipo: ax + by = c dx + ey = f pode ser resolvido segundo mostrado abaixo: x = ce – bf e y = af – cd ae – bd ae – bd Escrever um algoritmo que lê os coeficientes a, b, c, d, e, f e calcula e mostra os valores de x e y. 13. O custo ao consumidor, de um carro novo, é a soma do custo de fábrica com a percentagem do distribuidor e dos impostos (aplicados ao custo de fábrica). Supondo que a percentagem do distribuidor seja de 28% e os impostos de 45%, escrever um algoritmo para ler o custo de fábrica de um carro e mostrar o custo ao consumidor. 14. Uma revendedora de carros usados paga a seus funcionários vendedores, um salário fixo por mês, mais uma comissão também fixa para cada carro vendido e mais 5% do valor das vendas por ele efetuadas. Escrever um algoritmo que lê o número do vendedor, o número de carros por ele vendidos, o valor total de suas vendas, o salário fixo e o valor que recebe por carro vendido e calcula e o salário mensal do vendedor, mostrando-o juntamente o seu número de identificação. 15. Considerando que o aumento dos funcionários é de 80% do INPC e mais um percentual de produtividade discutido com a empresa, escrever um algoritmo que lê 12 o número do funcionário, seu salário atual, o índice INPC e o índice de produtividade conquistado e mostra o número do funcionário, seu aumento e o valor de seu novo salário. 16. Escrever um algoritmo que lê 3 valores a, b, c. Encontre o maior dos 3 valores e o mostre com a mensagem: “É o maior” Maior entre a e b = a + b + |a – b| 2 Dica: utilize a instrução absoluto para descobrir o valor absoluto. Ex.: absoluto(a – b) Algoritmos com Seleção Essa seção visa conceituar algoritmos com seleção e expressões lógicas, bem como explicitar as instruções existentes na linguagem algorítmica. Existem algoritmos com situações resolvidas através de passos cuja execução é subordinada a uma condição. Tais algoritmos são denominados algoritmos com seleção. A condição aqui referenciada é denominada expressão lógica ou expressão booleana. A álgebra booleana é a que regulamenta as expressões lógicas, onde não existem outros estados possíveis além do verdadeiro e falso. As expressões lógicas são construídas baseadas em dois tipos de operadores, os operadores relacionais, responsáveis pelas proposições realizadas; e os operadores lógicos, responsáveis pela ligação de duas ou mais proposições. Operadores Relacionais Operador Operação = Igual <> Diferente < Menor > Maior <= Menor ou igual >= Maior ou igual Operadores Lógicos Operador Operação não “não” booleano e “e” booleano ou “ou” booleano Duas são as instruções que podem ser utilizadas. A primeira delas: 13 se <expressão lógica> então <instrução>; Exemplo: se (a > 2) então mostre(‘O valor é maior que 2’); A instrução do então pode estar na linha seguinte, endentada. Exemplo: se (a > 0) e (a < 2) então mostre(‘O valor é maior que 0 e menor que 2’); Nos exemplos, o string apenas será mostrado se a expressão for verdadeira. Quando existe mais do que uma instrução a ser executada, é necessário inserir as instruções no que se chama bloco de instruções. Um bloco de instruções sempre possui um início e um fim; Por exemplo: se (a > 2) então início mostre(‘O valor é maior que 2. O novo valor é 4’); a := 4; fim; Quando existem instruções a serem executadas quando a expressão for falsa, deve-se utilizar o senão, assim: se (a > 2) então mostre(‘O valor é maior que 2’) senão mostre(‘O valor é menor ou igual a 2’); Na linguagem algorítmica que está sendo utilizada, a instrução anterior ao senão não pode ter ponto-e-vírgula. No caso de se usar um bloco de instruções, o fim fica sem ponto-e- vírgula, assim: se (a > 2) então início mostre(‘O valor é maior que 2. O novo valor é 4’); a := 4; fim senão inicio mostre(‘O valor é menor ou igual a 2. O novo valor é 5’); a := 5; fim; No exemplo abaixo, os resultados possíveis são: se (a > 0) e (b < 0) então ... V V V V F F F F V 14 F F F Se for mudado o operador lógico: se (a > 0) ou (b < 0) então ... V V V V V F F V V F F F Pode-se ter expressões muito maiores, cujo resultado final vai ser verdadeiro ou falso, dependendo dos valores existentes nas variáveis envolvidas na expressão inteira,como: se não(((a > b) e (b > c)) ou ((c > d) e (d > f))) então ... Em algumas situações, pode-se utilizar a instrução caso no lugar do se. caso <variável> faça <valor1 : instrução1>; <valor2 : instrução2>; <valorn : instruçãon>; senão <instrução>; fimcaso; Assim, as instruções abaixo: se (a = 1) então mostre(‘um’); se (a = 2) então mostre(‘dois’); se (a = 3) então mostre(‘três’); se (a = 4) então mostre(‘quatro’); se (a < 1) ou (a > 4) então mostre(‘nenhum’); Podem ser substituídas por: caso a faça 1: mostre(‘um’); 2: mostre(‘dois’); 3: mostre(‘três’); 4: mostre(‘quatro’); senão mostre(‘nenhum’); fimcaso; Exercícios 1. Escrever um algoritmo que lê 3 valores a, b, c e calcula e mostra a média ponderada com peso 5 para o maior dos três valores e 2.5 para os outros 2. 2. Escrever um algoritmo que lê 3 valores a, b, c e verifica se eles formam ou não um triângulo. Supor que os valores lidos são inteiros e positivos. Caso os valores 15 formarem um triângulo, calcular e mostrar a área deste triângulo. Se não formarem, mostrar os valores lidos e a mensagem “não formam triângulo”. 3. Escrever um algoritmo que lê 2 valores a, b e os mostra com a mensagem “são múltiplos” ou “não são múltiplos”, conforme o caso. 4. Escrever um algoritmo que lê o número de um vendedor de uma empresa, seu salário fixo e o total de vendas por ele efetuadas. Cada vendedor recebe um salário fixo, mais uma comissão proporcional às vendas por ele efetuadas.A comissão é de 3% sobre o total de vendas até 1000 reais e 5% sobre o que ultrapassar esse valor. Mostrar o número do vendedor, o total de suas vendas, seu salário fixo e seu salário total. 5. Escrever um algoritmo que lê um conjunto de 4 valores i, a, b, c, onde i é um valor inteiro e a, b, c são quaisquer valores reais. A seguir: • Se i = 1 mostrar os 3 valores a, b, c em ordem crescente. • Se i = 2 mostrar os 3 valores a, b, c em ordem decrescente. • Se i = 3 mostrar os 3 valores de forma que o maior valor fique entre os outros dois. Subalgoritmos e Recursividade Muitos problemas de solução mais ou menos complexa podem ser divididos, sucessivamente, em problemas menores e de lógica mais fácil. Em vez de se escrever um algoritmo grande, se escreve vários algoritmos menores, os quais, conjuntamente, resolvem o problema proposto. Os trechos de algoritmo que efetuam um ou mais cálculos determinados denominam-se subalgoritmos. Em um algoritmo, eles ficam situados na área dos subalgoritmos e são formados pela palavra-chave procedimento ou proced, acompanhados por um identificador único que segue as mesmas regras do nome do programa, e um ponto-e- vírgula. O subalgoritmo em si fica em um bloco de instruções. Como exemplo, é mostrado a seguir o algoritmo de cálculo das médias com a utilização de subalgoritmos. programa medias; var a,b,c,ma,mh,mg: real; proced leitura; início mostre(‘Digite 3 valores: ’); ler(a,b,c); fim; proced calculo; início ma := (a + b + c ) / 3; 16 mh := 3 / (1/a + 1/b + 1/c ); mg := (a * b * c) ^ (1 / 3); fim; proced mostragem início mostre(‘Media Aritmetica: ’, ma); mostre(‘Media Harmonica: ’, mh); mostre(‘Media Geometrica: ’, mg); fim; inicio leitura; calculo; mostragem; fim. O algoritmo em si sempre fica após os subalgoritmos. No exemplo, os procedimentos são chamados dentro da área do algoritmo, mas isso não é uma regra. É possível chamar um procedimento dentro de outro procedimento, além de ser possível chamá-lo quantas vezes forem necessárias. Esse é um dos objetivos dos subalgoritmos: a reutilização de blocos de instruções que se repetiriam em um algoritmo seqüencial. Além disso, muitas vezes, é necessário repetir o mesmo procedimento de dentro dele mesmo. Isso se chama recursividade, e é muito útil, por exemplo, para validar a entrada de dados. O subalgoritmo proced leitura; início mostre(‘Digite valor positivo: ’); ler(a); se (a < 0) então início mostre(‘Valor inválido’); leitura; fim; fim; garante que o valor digitado para a variável a obrigatoriamente será um valor positivo. Exercícios 1. Refazer o algoritmo 5 da lista anterior, utilizando subalgoritmos e considerando que o valor para i deve ser inteiro no intervalo de 1 a 3. 2. Escrever um algoritmo que lê um conjunto de 6 valores x1, x2, y1, y2, z1, z2 em um intervalo de –10 a 10, que representam as coordenadas cartesianas de 3 pontos P1(x1, x2), P2(y1, y2) e P3(z1, z2). Calcule as distâncias entre P1 e P2, P1 e P3, P2 e P3. distancia = (y1 – x1)2 + (y2 – x2)2 para P1 e P2. 17 Se os segmentos de retas calculados formarem um triângulo, calcular e mostrar a área deste triângulo. Caso contrário, mostrar as distâncias calculadas. 3. Escrever um algoritmo que lê 4 comprimentos de lados a, b, c, d, em um intervalo de 10 a 50, e os ordena em ordem decrescente, mostrando-os. 4. Escrever um algoritmo que lê 3 comprimentos de lados a, b, c, em um intervalo de 5 a 10, e os ordena em ordem decrescente, de modo que o a represente o maior dos 3 lados lidos. Determine, a seguir, o tipo de triângulo que estes 3 lados formam, com base nos seguintes casos, mostrando sempre a mensagem adequada: • Se a > b + c não formam triângulo algum; • Se a2 = b2 + c2 formam um triângulo retângulo. • Se a2 > b2 + c2 formam um triângulo obtusângulo. • Se a2 < b2 + c2 formam um triângulo acutângulo. • Se forem todos iguais formam um triângulo eqüilátero. • Se a = b ou b = c ou a = c então formam um triângulo isósceles. 5. O departamento que controla o índice de poluição do meio ambiente mantém 3 grupos de indústrias que são altamente poluentes do meio ambiente. O índice de poluição aceitável varia de 0.05 até 0.25. Se o índice subir de 0.25 até 0.3, as indústrias do 1o grupo são intimadas a suspenderem suas atividades. Se subir até 0.4, as indústrias do 1o e 2o grupo são intimadas a suspenderem suas atividades. Se o índice for maior que 0.4, todos os 3 grupos devem ser notificados a paralisarem suas atividades. Escrever um algoritmo que lê o índice de poluição medido (acima de 0.05) e emite a notificação adequada aos diferentes grupos de empresas. 6. Escrever um algoritmo que lê a hora de início de um jogo e a hora do final do jogo (considerando apenas horas inteiras) e calcula e mostra a duração do jogo em horas, sabendo-se que o tempo máximo de duração do jogo é de 24 horas e que o jogo pode iniciar em um dia e terminar no dia seguinte. 7. O cardápio de uma casa de lanches é dado pela tabela a seguir: Código 100 101 102 103 104 105 106 Especificação Cachorro-quente Bauru simples Bauru com ovo Hamburger Cheese burger Refrigerante Cerveja Preço Unitário 3.50 4.00 4.50 5.50 6.00 1.50 2.50 Escrever um algoritmo que lê o código dos itens, o número de itens de cada tipo adquiridos por um consumidor. A cada item fazer a pergunta: “Deseja mais algum item?”. Se a resposta for negativa calcular e mostrar o valor da conta a pagar. A 18 seguir, perguntar: “Deseja calcular a conta de mais algum consumidor?”. Encerrar o algoritmo apenas se a resposta for negativa. 8. Escrever um algoritmo que lê o número de um funcionário, inteiro e positivo, o número de horas por ele trabalhadas, o valor que recebe por hora, o número de filhos com idade inferior a 14 anos, a idade, o tempo de serviço do funcionário e o valor do salário família por filho. Calcular o salário bruto, o desconto do INSS (8,5% do salário bruto) e o salário família. Calcular o IR como segue: • Se salário bruto for maior ou igual a 1500 então IR = 15% do salário bruto. • Se salário brutofor maior ou igual a 500 e menor que 1500 então IR = 7% do salário bruto. • Se salário bruto for menor que 500 então IR = 0. Calcular o adicional conforme especificado: • Se idade for superior a 40 anos, adicional = 2% do salário bruto. • Se tempo de serviço for superior a 15 anos, adicional = 3.5% do salário bruto. • Se tempo de serviço for menor que 15 anos, mas superior a 5 anos e idade maior do que 30 anos, adicional = 1,5% do salário bruto. Calcular o salário líquido, mostrando-o juntamente com o número do funcionário, seu salário bruto, o total de descontos e o adicional. 9. Escrever um algoritmo que lê o número de identificação e as 3 notas obtidas por um aluno nas 3 verificações e a média dos exercícios que fazem parte da avaliação. Para cada aluno, calcular a média de aproveitamento, usando a fórmula: MA = N1 + N2 x 3 + N3 x 3 + ME 2 A atribuição de conceitos obedece à tabela abaixo: Média de Aproveitamento Conceito >= 9.0 >= 7.5 e < 9.0 >= 6.0 e < 7.5 >= 4.0 e < 6.0 < 4.0 A B C D E O algoritmo deve mostrar o número do aluno, suas notas, a média dos exercícios, a média de aproveitamento, o conceito correspondente e a mensagem: “Aprovado” se o conceito for A, B ou C e “Reprovado” se o conceito for D ou E. Para cada aluno, perguntar: “Deseja calcular a média de aproveitamento de mais algum aluno?”. 10. A empresa XYZ decidiu conceder um aumento de salários a seus funcionários de acordo com a tabela abaixo: Salário Atual Índice de aumento 19 0 a 400.00 400.01 a 700.00 700.01 a 1000.00 1000.01 a 1800.00 1800.01 a 2500.00 Acima de 2500.00 15% 12% 10% 7% 4% Sem aumento Escrever um algoritmo que lê, para cada funcionário, o seu número e o seu salário atual e mostra o número do funcionário, seu salário atual, o percentual de seu aumento e o valor do salário corrigido. Perguntar ao final: “Deseja calcular a correção do salário de mais algum funcionário?”. 11. Escrever um algoritmo que lê a hora de início de um jogo e a hora de término do jogo, ambas subdivididas em 2 valores distintos, a saber: horas e minutos. Calcular e mostrar a duração do jogo, também em horas e minutos, considerando que o tempo máximo de duração de um jogo pode iniciar em um dia e terminar no dia seguinte. 12. Escrever um algoritmo que lê um código i, em um intervalo de 1 a 5, e 3 valores a, b, c inteiros e positivos, com a < b. • Se código i = 1 então calcular a área do trapézio de base a e b e altura c e mostrar juntamente com os valores lidos. • Se código i = 2 então se a, b, c formarem equação do 2o grau e esta tiver raízes reais, calcular e mostrar as raízes desta equação. Formula = -b ± b2– 4ac 2a • Se código i = 3 então calcular a média geométrica e mostrar juntamente com os valores lidos. • Se código i = 4 então se a, b, c formarem triângulo, calcular e mostrar a área deste triângulo. • Se código i = 5 então calcular e mostrar a soma dos inteiros de a inclusive até b com uma variação igual a c (se a = 5, b = 19 e c = 3, então soma = 5+8+11+14+17 = 55) Algoritmos com Repetição e Vetores/Matrizes Essa seção visa conceituar algoritmos com repetição, apresentar as instruções para manipulação desse tipo de algoritmo, variáveis do tipo contador e do tipo acumulador, além de apresentar conceitos e utilização de vetores e matrizes. Todo algoritmo que possui um ou mais de seus passos repetidos um determinado número de vezes denomina-se algoritmo com repetição. São basicamente três as instruções existentes: 20 A primeira instrução, mostrada a seguir, faz com que uma variável inteira inicie com um valor e repita o bloco de instruções tantas vezes quantas forem necessárias para se atingir o valor final, sempre adicionando (a) ou subtraindo (menosaté) um número. para <variável inteira> := <valor inicial> a/menosaté <valor final> faça <bloco de instruções> Exemplo: a:= 0; para i:= 1 a 5 faça início a:= a + i; mostre(a); fim; A variável inteira utilizada pode ser utilizada em expressões, como o a:= a + i; , mas não pode ter um valor atribuído a ela, como por exemplo i:= i + 1;. O incremento/decremento da variável inteira é feito automaticamente. A segunda instrução repete o bloco de instruções enquanto a expressão lógica for verdadeira. enquanto <expressão lógica> faça <bloco de instruções>; Exemplo: a:= 0; enquanto (a < 5) faça início a:= a + 1; mostre(a); fim; A terceira instrução é parecida com a segunda, mas se caracteriza por ter a expressão lógica no final do bloco de instruções, garantindo a execução do bloco uma vez, pelo menos, além de repeti-lo até que a expressão for verdadeira. O bloco de instruções não tem início-fim. O que garante o término é o próprio até. repita <bloco de instruções> até <expressão lógica>; Exemplo: a:= 0; repita a:= a + 1; mostre(a); até (a = 5); 21 Em muitos casos, há a necessidade da utilização de variáveis contadoras dentro de um bloco de repetição. As variáveis contadoras recebem um valor inicial (geralmente 0) fora do bloco e é incrementada dentro do bloco (geralmente em 1). Em outros casos, há a necessidade de utilizar variáveis acumuladoras, onde o valor inicial geralmente é zero e é incrementado de um valor variável, e não de uma constante. As instruções de repetição são muito úteis em algoritmos que utilizam vetores e matrizes. Um vetor é um tipo de dado estruturado, sendo muito útil quando se deseja armazenar um conjunto de valores. Um conceito simples para vetor seria: é uma variável com um nome único, de um tipo de dado único, que pode armazenar vários valores desse tipo, cada um com seu índice próprio. A diferença entre vetor e matriz é que a matriz permite a indexação por linha e coluna, enquanto o vetor possui apenas uma linha. Exemplos de declaração de vetores e matrizes: var vet: arranjo [1..10] de inteiros; vet2: arranjo [1..20] de reais; vet3: arranjo [1..10] de caracteres; mat: arranjo [1..5, 1..10] de inteiros; mat1: arranjo [1..5, 1..10] de reais; A indexação de um vetor se dá da seguinte forma: vet[1]:= 4; vet1[1]:= 3.4; vet2[1]:= ‘a’; Para as matrizes, é importante observar a indexação na forma [linha, coluna]: mat[1,1]:= 5; mat1[1,1]:= 2.4; Exercícios com Instruções de Repetição e Vetores 1. Escrever um algoritmo que lê 5 valores quaisquer para um vetor a. Contar, após, quantos destes valores são negativos, mostrando esta informação. 2. Escrever um algoritmo que gera e mostra os números ímpares entre 100 e 200 3. Escrever um algoritmo que lê 10 valores quaisquer, armazenando em um vetor. Contar quantos deles estão no intervalo [10, 20] e quantos deles estão fora deste intervalo, mostrando estas informações. 4. Escrever um algoritmo que lê 30 valores inteiros em um intervalo de 0 a 100, armazenando em um vetor. Contar quantos deles estão em cada um dos intervalos [0, 25], (25, 50], (50, 75], (75, 100]. 22 5. Escrever um algoritmo semelhante ao anterior que calcula as médias aritméticas de cada intervalo e as mostra, juntamente com o número de valores encontrados em cada intervalo. 6. A série de Fibonacci tem como dados os 2 primeiros termos da série, que são respectivamente 0 e 1. A partir deles, os demais termos são construídos pela regra: tn = tn-1 + tn-2 Escrever um algoritmo que gera os 10 primeiros termos da série de Fibonacci e armazena em um vetor. Após, calcular a soma destes termos e mostrar juntamente com o vetor. 7. Escrever um algoritmo que gera os 30 primeiros termos da série de Fibonacci e armazena em um vetor. Após, mostrar os termos gerados com a mensagem “É primo” ou “Não é primo”, conforme o caso. 8. Escrever um algoritmoque lê 100 números positivos e armazena em um vetor. Após, mostrar uma tabela com cabeçalho, que deve ser repetido a cada 20 linhas escritas. A tabela conterá o valor lido, seu quadrado, seu cubo e sua raiz quadrada. 9. Escrever um algoritmo que lê 100 valores para o vetor v, todos inteiros e positivos. Após, percorrer o vetor e, se o valor for par, verificar quantos divisores possui e mostrar esta informação. Se o valor for ímpar e menor que 12 calcular e mostrar o fatorial do valor. Se o valor for ímpar e maior ou igual a 12 calcular e mostrar a soma dos inteiros de 1 até o valor. 10. Escrever um algoritmo que lê 10 valores para o vetor a, todos inteiros e positivos. Calcular e mostrar, a seguir, a média aritmética dos valores do vetor, a quantidade de valores pares, a quantidade de valores ímpares, a percentagem de valores pares e a percentagem de valores ímpares. 11. Escrever um algoritmo que mostra os números primos entre 100 e 200, bem como a soma destes números. 12. Escrever um algoritmo que lê 500 valores inteiros e positivos. Mostrar estes 500 valores ordenados em ordem crescente. 13. Escrever um algoritmo que lê 10 valores para o vetor n, todos inteiros e positivos. Após, para cada valor lido, mostrar a tabuada de 1 até n de n. 1 x n = n 2 x n = 2n . . . . . . . . . . . . . . . n x n = n 2 14. Escrever um algoritmo que lê um par de valores a, b, inteiros e positivos, com a < b e mostra os inteiros pares de a até b, incluindo o a e b se forem pares. 15. Escrever um algoritmo que lê um par de valores m, n, inteiros e positivos, e calcula e mostra a soma dos n inteiros consecutivos à partir de m, inclusive. 23 16. Escrever um algoritmo que lê um conjunto de 15 valores, um de cada vez, acompanhados de um código 1 ou 2. O valor representa o número de cobaias utilizadas em cada uma das 15 experiências feitas e os códigos 1 e 2 representam, respectivamente, coelhos e ratos. Armazenar esses valores em dois vetores numcob e tipo. Quer-se saber o total de cobaias utilizadas, o total de coelhos, o total de ratos, a percentagem de coelhos e a percentagem de ratos. Mostrar esses valores. 17. Escrever um algoritmo que lê um número n (número de termos de uma progressão aritmética), a1 (primeiro termo desta progressão) e r (razão da progressão), e mostra os n termos desta progressão, bem como, a sua soma. Utilizar as instruções de repetição, e não as fórmulas matemáticas. 18. Escrever um algoritmo que lê 2 vetores de 10 valores, o primeiro contendo o número de identificação de dez alunos, e o segundo contendo a altura em centímetros de cada um. Após, encontrar o aluno mais alto e o mais baixo e mostrar seus números, suas alturas e uma mensagem dizendo se é o mais alto ou o mais baixo. 19. Um avião, voando em linha reta, a uma altitude a passa sobre um ponto p num instante t = 0. Se a velocidade v e a altura a são lidos, calcular a distância d do avião ao ponto p após 1, 2, 3, ..., 60 segundos. Mostrar, para cada t, o tempo e a distância. 20. Escrever um algoritmo que lê um valor n que indica quantos valores devem ser lidos para m, todos inteiros e positivos, com leitura de um valor de cada vez. Mostre uma tabela contendo o valor m lido, o somatório dos inteiros de 1 até m e o fatorial de m. 21. Escrever um algoritmo que gera e mostra os 5 primeiros números perfeitos. Um número perfeito é aquele que é igual a soma dos seus divisores, menos ele mesmo. (Ex.: 6=1+2+3; 28=1+2+4+7+14). 22. Escrever um algoritmo que lê um vetor g com 5 valores do tipo caracter, que constituem o gabarito de uma prova de 5 questões. Leia, a seguir, um número não determinado de 5 respostas de alunos em um vetor do tipo caracter r. Para cada aluno, contar o número de acertos e multiplicar por 2, mostrando a nota adquirida. Após, perguntar: “Deseja conferir as respostas de mais algum aluno?”. 23. Escrever um algoritmo que mostra os números entre 1000 e 1999, inclusive, que divididos por 11 dão um resto igual a 5. 24. Sabe-se, pela Lei de Newton, que a força de interação entre 2 corpos é diretamente proporcional ao produto de suas massas e inversamente proporcional ao quadrado de suas distâncias. F = G m1 m2 d2 Escrever um algoritmo que lê um número não determinado de conjuntos de 4 valores m1 (massa do 1o corpo), m2 (massa do 2o corpo), G (constante de gravitação universal) e d (distância entre os corpos) e calcula e mostra, para cada conjunto lido, a força de atração. A cada conjunto, perguntar se deseja continuar ou não. 24 25. Sabe-se, da matemática financeira, que a aplicação de um capital C, a uma taxa mensal de juros i, capitalizados mensalmente, é recuperado através de n prestações mensais de valor R. R = C i(1 + i)n (1 + i)n-1 Escrever um algoritmo que lê um número não determinado de conjuntos de valores formados pelo capital, a taxa de juros e o número de prestações e calcula e mostra, para cada conjunto lido, o valor de cada prestação. A cada conjunto, perguntar se deseja continuar ou não. 26. Escrever um algoritmo que lê um valor x e calcula e mostra os 20 primeiros termos da série: 1 + 1 + 1 + 1 + ... x 2 x 3 x 4 27. Escrever um algoritmo que calcula e mostra a média aritmética dos números pares compreendidos entre 13 e 73. 28. Escrever um algoritmo que calcula e mostra o produto dos números primos entre 92 e 1478. 29. Escrever um algoritmo que lê n, inteiro e positivo, e calcula e mostra o termo de ordem n da sucessão abaixo: ordem: 1 2 3 4 5 6 7 8 ... sucessão: -1 0 5 6 11 12 17 18 ... 30. Supondo que a população de um país A seja da ordem de 90000 habitantes, com uma taxa anual de crescimento de 3,1% e que a população de um país B seja de 200000 habitantes, com uma taxa anual de crescimento de 1,5%, escrever um algoritmo que calcula e mostra quantos anos serão necessários para que a população do país A ultrapasse a do país B, mantidas as taxas atuais de crescimento. Exercícios com Vetores e Matrizes 1. Escrever um algoritmo que leia 10 números inteiros e positivos e armazene em um vetor. Após, mostrar o maior dos 10 números lidos e sua ordem de entrada. 2. Escrever um algoritmo que lê 100 valores quaisquer para um vetor x. Substitua, a seguir, todos os valores nulos de x por 1 e mostre o vetor modificado. 3. Escrever um algoritmo que lê 20 valores quaisquer para um vetor n. Troque, a seguir, o 1o elemento com o último, o 2o com o penúltimo, assim por diante, até o 10o com o 11o e mostre o vetor modificado. 4. Escrever um algoritmo que lê 20 valores quaisquer para um vetor k. Troque, a seguir, os elementos de ordem ímpar com os de ordem par imediatamente seguintes e mostre o vetor modificado. 25 5. Escrever um algoritmo que lê 20 valores quaisquer para um vetor m. Troque, a seguir, o 1o elemento com o 11o, o 2o com o 12o, assim por diante, até o 10o com o 20o e mostre o vetor modificado. 6. Escrever um algoritmo que lê um vetor de 20 posições sem elementos repetidos e um valor qualquer a. Multiplicar cada posição do vetor por a e mostrar o vetor modificado. 7. Escrever um algoritmo que lê dois vetores com 10 valores inteiros x e y. Crie, a seguir, um vetor z que seja a união de x com y, mostrando-o ao final. 8. Escrever um algoritmo que lê dois vetores com 10 valores inteiros a e b. Crie, a seguir, um vetor c que seja a intersecção de a com b, mostrando-o ao final. 9. Escrever um algoritmo que lê 20 valores quaisquer para um vetor v. Compacte, a seguir, o vetor V, retirando dele todos os valores nulos ou negativos e mostre o vetor compactado. 10. Escrever um algoritmo que lê 30 valores inteiros e positivos para um vetor k. Crie, a seguir, um vetor n que contém todos os valoresprimos de k e mostre-o. 11. Escrever um algoritmo que lê 20 valores quaisquer para um vetor v. Retire, a seguir, os elementos em duplicata, compactando o vetor v e mostrando-o ao final. 12. Escrever um algoritmo que lê um conjunto de 30 valores inteiros e os coloca em 2 vetores, conforme forem pares ou ímpares. O tamanho dos vetores é de 5 posições. Se algum vetor estiver cheio, mostrar e voltar a preencher a partir da primeira posição. Terminada a leitura, mostrar o conteúdo que sobrou dos dois vetores. 13. Escrever um algoritmo que lê 2 vetores de 10 valores inteiros v e x. Crie, a seguir, um vetor y com os elementos de v e x em ordem crescente. 14. Escrever um algoritmo que lê 20 valores inteiros para um vetor v de 30 posições que ocuparão as 20 primeiras posições. Ordene, a seguir, os 20 elementos em ordem crescente. Após, leia 10 valores inteiros, um por vez, e insira-os nas posições adequadas do vetor v, de forma que o mesmo continue ordenado em ordem crescente, mostrando-o ao final. 15. Escrever um algoritmo que lê 20 valores inteiros para um vetor x. Mostre, a seguir, cada um dos valores distintos que aparecem em x e quantas vezes ele apareceu. 16. Escrever um algoritmo que preencha uma matriz 10 por 50 com a soma da sua linha e coluna respectiva. Passar, após, os valores da matriz para um vetor. Mostrar a matriz e o vetor preenchidos. 17. Escrever um algoritmo que lê uma matriz m(5,5) com valores inteiros e positivos. Calcule e mostre, após, as somas: a) da linha 4 de m. b) da coluna 2 de m. c) da diagonal principal. d) da diagonal secundária. e) de todos os elementos da matriz. 26 18. Escrever um algoritmo que lê uma matriz m(6,6) e calcula as somas das partes hachuriadas, mostrando-as. 19. Escrever um algoritmo que lê uma matriz m(10,10) com valores quaisquer. Troque, a seguir, a linha 2 com a linha 8, a coluna 4 com a coluna 10, a diagonal principal com a secundária e a linha 5 com a coluna 10. Mostre a matriz modificada. 20. Escrever um algoritmo que lê uma matriz m(6,6) e um valor a e multiplica a matriz m pelo valor a e coloca os valores da matriz multiplicados por a em um vetor v, mostrando-o ao final. 21. Escrever um algoritmo que lê uma matriz m(5,5) com valores inteiros e cria 2 vetores sl(5) e sc(5) que contenham as somas das linhas e das colunas de m, mostrando-os. 22. Escrever um algoritmo que lê uma matriz m(50,19) contendo, nas posições assinaladas de cada linha o que segue: 1 – no do aluno 2, 3, 4 – notas da disciplina 1 5, 6, 7 – notas da disciplina 2 8, 9, 10 – notas da disciplina 3 11, 12, 13 – notas da disciplina 4 14, 15, 16 – notas da disciplina 5 17, 18, 19 – notas da disciplina 6 Calcular, para cada aluno, as médias de cada disciplina e a média geral, armazenando num vetor o número do aluno, as médias por disciplina e a média geral. Mostrar o vetor antes de passar ao aluno seguinte. 23. Escrever um algoritmo que lê uma matriz a(12,13) e divida todos os 13 elementos de cada uma das 12 linhas de a pelo valor do maior elemento em módulo daquela linha. Mostrar a matriz a modificada. 24. Na teoria de sistemas, define-se como elemento mínimax de uma matriz, o menor elemento da linha em que se encontra o maior elemento da matriz. Escrever um algoritmo que lê uma matriz a(10,10) com valores inteiros e determina o elemento mínimax dessa matriz, mostrando-o juntamente com a sua posição na matriz. Bibliografia Os conceitos e exercícios dessa apostila foram baseados na referência (que não está mais sendo editada): 27 ORTH, A.I. Algoritmos. Porto Alegre, RS: Ciência dos Computadores, 1985. Tais conceitos, exercícios e principalmente a definição da linguagem algorítmica sofreram várias adaptações.