Baixe o app para aproveitar ainda mais
Prévia do material em texto
Curso de Algoritmo - Aula I Por: Jorge Luiz E. de Souza ( 22/05/2001 ) Introdução Olá, comunidade! Nossa primeira aula será sobre PORTUGOL, uma forma de escrita estruturada, cuja finalidade é: descrever em uma sequência lógica os passos para a resolução de um problema. Um detalhe importante do portugol é que todas as linhas devem conter uma única instrução iniciada por verbos no imperativo. O que é Algorítmo? É uma forma estruturada de resolver problemas numa sequência lógica, passo a passo até obter o resultado desejado. Todo tipo de problema que temos no dia a dia, resolvemos através de algoritmos naturais, que muitas vezes não são nem percebidos como tal. Um exemplo: Quando você chega em sua casa a noite. O que você faz para entrar em sua casa? Você deve estar pensando: "O que isto tem a ver com programação?". A resposta é: TUDO. Vejamos: Sob o ponto de vista atual (isto é, sem conhecer algoritmos estruturados) você diria: Pense na sua resposta! Sob o ponto de vista de algorítmo estruturado: Abrir o portão Passar para o lado de dentro do terreno Fechar o portão Dirigir-se à porta Pegar a chave da porta Abrir a porta da casa Passar para o lado de dentro da casa Fechar a porta da casa Pronto! Você está dentro de casa. Exemplo 1. Sequência entrar em casa Analisando os passos sequenciais seguidos pelo exemplo 1, vemos que em 8 passos simples podemos demonstrar através de instruções simples e bem definidas, uma SOLUÇÃO GENÉRICA para o PROBLEMA: ENTRAR EM CASA. Isto é, QUALQUER pessoa que olhar para estas Copyright (C) 1999-2000 Linux Solutions. 1 http://www.linuxsolutions.com.br/ mailto:contato@olinux.com.br http://www.linuxsolutions.com.br/ instruções e seguí-las CONSEGUIRÁ ENTRAR EM CASA. Observe que todo início de linha contém um IMPERATIVO. Não é por acaso! O computador atende a COMANDOS (instruções diretas que geram uma resposta previsível e objetiva). Então, todas as linhas de um PORTUGOL, linguagem básica para entender os algorítmos devem iniciar com IMPERATIVOS. Tente descrever EM PORTUGOL (sequência de linhas lógicas para resolver um problema, com linhas iniciadas por imperativos) os seguintes problemas (faça algorítmos contínuos, ignore os problemas mais detalhados. Por enquanto!): Trocar o pneu de um carro. Levantar demanhã em uma segunda-feira. Dançar ao som de uma música (suponha que o aparelho de som está desligado). Ligar um computador. (se você não sabe! pesquise!) Acender uma luz em um quarto escuro. (Isto pode ser divertido!) Tomar um banho de piscina em um dia muito quente. (Suponha que a piscina está em um clube e você na sua casa). Abrir um programa de computador. (Suponha que o computador já está ligado) Escovar os dentes. Colocar um CD no aparelho de som. Ler um livro. Conclusão O PORTUGOL é uma linguagem simples que não possui muitas regras para sua escrita. Por isto é elucidativa a sua utilização. De forma clara, podemos enxergar que a partir de sequências de instruções genéricas podemos criar uma solução para um problema. E esta solução (reutilizável) poderia ser usada quantas vezes quizermos, desde que as condições sejam as mesmas. Na aula que vem veremos estruturação do pensamento, desvios condicionais e refinamento de código. Até lá! Aguardo críticas e sugestões. Curso de Algoritmo - Aula II Por: Jorge Luiz E. de Souza ( 05/06/2001 ) Introdução A aula de hoje é sobre estruturação do pensamento. Em primeiro lugar, estruturação do pensamento nada mais é do que saber definir qual a ordem de precedência entre os comandos a serem executados. Noção muito importante na programação. Isto será útil quando estivermos falando em ESCOPO de variáveis e do próprio código. Boa aula! Estruturação do pensamento Até agora, não pensamos em DETALHES, como por exemplo: • Condições: para fazer algo; isto é, antes de fazer uma coisa, tenho que verificar se outra já foi feita; • Desvio: se uma coisa já foi feita, não faça isto, faça aquilo. No pensamento estruturado existem FERRAMENTAS que auxiliam a escrita lógica para tais condições, são elas: SE [CONDIÇÃO] ENTÃO [COMANDO|LISTA DE COMANDOS] Copyright (C) 1999-2000 Linux Solutions. 2 mailto:contato@olinux.com.br Nota: mais a frente, entraremos em detalhes sobre SINTAXE (forma correta de se escrever comandos). Exemplo 1: Problema ENTRAR EM CASA, refinado. A instrução: Abrir o portão Poderíamos REFINAR para: Pegar chave do portão no bolso SE chave não está no bolso ENTAO Procurar na bolsa SE encontrou chave na bolsa então ENTAO Abrir o portão SENÃO Desesperar-se você está para fora por tempo indeterminado SENÃO Abir o portão Exemplo 2: REFINAMENTO da instrução Abrir Portão do problema ENTRAR EM CASA Nota: Para ler o algoritmo, entenda que: cada SE tem duas condições a serem TESTADAS, a primeira é o ENTÃO. Caso o ENTÃO SEJA SATISFEITO, isto é, se você optar pela condição do ENTÂO, deve ignorar o SENÃO correspondente do SE do mesmo nível. Por exemplo: no caso da instrução "SE chave não está no bolso", você deve optar por "Procurar na bolsa" (ENTÃO) a condição SENÃO correspondente seria "Abrir o portão". "Ai meu Deus... danou-se..." Nada disso! Entendendo: A condição estabelecida é: "chave não está no bolso". O ENTÃO correspondente são instruções a serem seguidas caso ela (a condição) seja VERDADEIRA (chave não está no bolso). E O SENÃO correspondente, são instruções a serem seguidas quando ela (a condição) for FALSA, isto é, chave está no bolso. Entendeu? Creio que com isto, já dá para você ler o resto do Algoritmo. Com este exemplo, temos dois conceitos novos: DESVIO CONDICIONAL e REFINAMENTO DE CÓDIGO. Refinamento de código No pensamento estruturado, existe a preocupação de chegar a um resultado a partir de GENERALIZAÇÃO/ESPECIALIZAÇÃO. Isto é, a partir de uma visão MACRO de um problema, chegar aos detalhes e, enfim, resolver o problema. Isto é bem mais simples e eficaz do que tentar visualizar todos os detalhes de um problema, a medida que vamos escrevendo o código para resolvê-lo. Um exemplo: No refinamento do Exemplo 2, a instrução "Desesperar-se", se pensarmos bem, poderia resultar em "Ligar para a esposa". O algorítmo ficaria assim: Pegar chave do portão no bolso SE chave não está no bolso ENTAO Procurar na bolsa Copyright (C) 1999-2000 Linux Solutions. 3 SE encontrou chave na bolsa então ENTAO Abrir o portão SENÃO Ligar para a esposa SENÃO Abir o portão Ou então: SE você é casado ENTÃO Ligar para Esposa SENÃO Desesperar-se O algorítmo ficaria assim: Pegar chave do portão no bolso SE chave não está no bolso ENTAO Procurar na bolsa SE encontrou chave na bolsa então ENTAO Abrir o portão SENÃO SE você é casado ENTÃO Ligar para Esposa SENÃO Desesperar-se SENÃO Abir o portão Ou ainda: SE você é casado ENTÃO Ligar para Esposa SENÃO SE você mora com alguém ENTÃO Ligar para esta pessoa SENÃO Desesperar-se E por aí vai! Agora, escreva você como ficaria o código. O que eu quero mostrar aqui é que o refinamento serve para que, a partir de passos "macro", possamos visualizar a solução parcial de um problema em determinadas condições. Após termos resolvido o problema em condições ideais, pensaremos em verificar as EXCEÇÕES. ENTÃO, o pensamento estruturado é uma ótima ferramenta para determinar condições ideais para a solução de problemas! Desvios condicionais Os desvios condicionais são utilizados para que, ao nos depararmos com determinada condição, tenhamos como contorná-las, de uma forma ou de outra, podendo haver desvios para os desvios e assim por diante. Tenha em mente que tudo tem um limite. E se um desvio não tem limite, está claro que este não é o caminhopara resolver o problema. Agora, com os conceitos de refinamento, refaça os algoritmos do capítulo anterior colocando desvios condicionais onde você achar próprio e refinando passos que você acha que podem ser refinados. Nota: Em portugol não existem ainda regras rígidas para a elaboração da sequência de solução do problema, então, sinta-se a vontade para escrever o código de acordo com sua visão do problema. Conclusão Estruturação do pensamento consiste na utilização de ferramentas como refinamento de código e desvios condicionais para a maior consistência do código. Para a partir de uma visão macro de um problema podermos chegar a uma solução viável através de refinamentos sucessivos. Copyright (C) 1999-2000 Linux Solutions. 4 Para uma fixação do conteúdo, refaça os exercícios da primeira aula utilizando estas técnicas (onde você achar necessário). Na próxima aula faremos uma introdução à algoritmos. Sugestões e críticas são bem vindos! Curso de Algoritmo - Aula III Por: Jorge Luiz E. de Souza ( 19/06/2001 ) Introdução Preparem-se pois esta aula é bem G R A N D E! O objetivo é dar uma introdução ao algoritmo. Sendo assim, os conceitos básicos serão todos apresentados, deixando para o decorrer do curso as técnicas e explicações detalhadas sobre novos recursos assim que eles se tornarem necessários. Preparados? Então vamos lá! Algoritmo A construção de algoritmos é regida por normas chamadas de: sintaxe de comandos. De acordo com a evolução no nível de programação, serão apresentadas a sintaxe de cada comando e a forma correta de utilizá-los. Inicialmente vamos definir o que é sintaxe. A boa escrita exige conhecimentos de sintaxe e gramática por parte do escritor. Se o escritor conhece bem a língua portuguesa, irá escrever textos claros e concisos. Evitará também erros grosseiros que são facilmente percebidos pelo leitor. O computador pode "ler" o código escrito por um programador através de um compilador. Um programa especial que converte o que o programador escreve em linguagemm de alto nível para a linguagem de máquina, a qual é entendida pelo computador. Uma breve introdução ao Processamento de Dados A computação é um processo simples e consiste em três passos básicos. São eles: entrada de dados, processamento dos dados e saída de informação. É necessário entender isto, pois não há sentido em um processamento que não gere informação útil ao usuário. Então, ao se programar, deve-se ter o cuidado de trabalhar os dados a fim de obter um resultado útil. Exemplo - um programa para calcular automaticamente a potência N de um número X: Este programa receberá duas entradas: o número X, e a potência a qual será elevado. Produzindo como resultado o valor referente ao processamento da operação matemática potência. Um programa assim é utilizado em calculadoras científicas, onde define-se o número pressionando, a tecla refernete ao mesmo, a tecla YX e a tecla do número relativo à potência. Este é um bom exemplo da utilização dos passos básicos mencionados anteriormente (relembrando, entrada de dados, processamento, saída de informação). Por que entrada de dados e saída de informação? Se você ainda está se perguntando isto após a explicação anterior, aí vai a resposta. Entrada de dados: aqui a palavra dados tem o intúito de enfatizar que o que está entrando são informações dispersas, cujo conteúdo se quer processar. Saída de informação: a palavra informação, aqui, denota que após o processamento os dados foram ordenados e o processamento extraíu o que não era necessário ou simplesmente foi concluído com êxito. Copyright (C) 1999-2000 Linux Solutions. 5 mailto:contato@olinux.com.br Observe que no exemplo da calculadora a saída de informação se refere ao resultado da potência mostrado no visor da calculadora, como um resultado útil ao usuário que o requisitou. Bem, chega de blá blá blá! Em suma, algoritmos se propõem a resolver problemas gerando informação útil após o processamento dos dados de entrada. Convenções de escrita de algoritmos Todas as palavras reservadas são escritas sublinhadas. Não utiliza-se acentos e caracteres especiais como o ç . A escrita de literais deve ser entre apóstrofos . Tipos serão escritos em maiúsculas. O que é uma literal? O computador é regido por códigos, somente entendendo estes. Cada letra para o computador é um código. Chamaremos letras isoladas de caractere, e um conjunto de letras chamaremos de LITERAL. Obs.: Literal pode conter números, mas números não podem conter caracteres alfa, isto é, letras. Tipos: Tipo é a definição de um conjunto de valores aceitos por uma vaiável. Tipos pré definidos: caractere, texto, inteiro, real e lógico. Variáveis Uma variável é uma posição de memória que pode conter um valor qualquer em determinado ponto do programa e outro valor em outro ponto do mesmo programa. Daí, o nome, variável. As variáveis são definidas utilizando-se a palavra chave declare no início do algoritmo. À toda variável declarada é associado um tipo e esta variável somente poderá conter (receber) valores deste tipo. Assim, se uma variável é declarada do tipo texto, seu conteúdo não poderá ser utilizados para cálculos matemáticos, visto que não é um número. Exemplo: Declare Nome:TEXTO X: INTEIRO Válido: Nome "João da Silva" X 20 Não permitido: Nome 50 X "Maria José" Aqui, declaramos as variáveis Nome (do tipo texto) e X (do tipo inteiro). Como Nome é uma literal, não poderá ter seu conteúdo utilizado por uma expressão matemática. Comentários Pode-se escrever frases explicativas tentro de um algoritmo, com fins de organização e estruturação do pensamento, sem que estas façam parte do código. Isto é, não serão executadas como comandos, nem mostradas ao usuário. Servindo somente ao propósito descrito acima. Estas linhas devem começar com duas barras seguidas: //. Copyright (C) 1999-2000 Linux Solutions. 6 Exemplo: A B //Atribuição do valor da variável B à variável A Convencões para sintaxe (Forma correta de utilização de um comando) Nota: termos entre [ ] são opcionais. Palavras Reservadas: Algoritmo, Declare, Se, Então, Senão, Para, Enquanto, faça, até, Leia, Escreva, catactere, texto, inteiro, lógico. Comandos de Atribuição Atribuição de valor à variável diretamente: Leia (variável) //Requisição de entrada de valor pelo usuário Comandos de Saída Escreva (Variavel [Texto]) Como começar um algoritmo Todo algoritmo começa com a palavra reservada "Algoritmo", seguida do nome do programa que será gerado. E é finalizado com a expressão literal "Fim Algoritmo". Exemplo: Algoritmo Soma Declare Lista de variáveis (Comandos de entrada) (Procesamento da entrada) (Saída da informação) Fim Algoritmo Declaração de variáveis Variáveis são declaradas no início de um algoritmo e sua sintáxe é a seguinte: Declare Variavel : TipoDaVariavel Variavel : TipoDaVariavel... Variavel, Variavel, variavel... : TipoDaVariavel... Exemplo: Algoritmo Soma Declare A, B, Soma : INTEIRO (Comandos de entrada) (Procesamento da entrada) (Saída da informação) Fim Algoritmo Copyright (C) 1999-2000 Linux Solutions. 7 Implementação de entrada de dados Quanto a este assunto, há algumas considerações: o que é uma entrada de dados? Quando fazer uma requisição de dados ao usuário? Para responder estas perguntas faremos duas implementações do algoritmo Soma usado acima. Na primeira implementação não será requisitada nenhuma interação do usuário com o programa. Isto é, o programa fará a soma de dois números e mostrará na tela somente os números que foram somados e o resultado da soma. Sem que o usuário possa alterar os números. Primeira implementação do algoritmo soma Algoritmo Soma Declare A, B, Soma : INTEIRO //Comandos de entrada esta linha está aqui a titulo de informação, não faz parte do algoritmoA 20 B 50 //Procesamento da entrada esta linha está aqui a titulo de informação, não faz parte do algoritmo Soma A + B //Saída da informação esta linha está aqui a titulo de informação, não faz parte do algoritmo Escreva ("Primeiro número: ", A) Escreva ("Segundo número: ", B) Escreva ("Soma= ", A) Fim Algoritmo Análise do algoritmo acima No algoritmo acima, temos a declaração de três variáveis do tipo inteiro: A, B e Soma. As linhas: A 20 B 50 Atribuem às variáveis A e B os respectivos valores. A linha: Soma A + B Processa a operação matemática soma com os números atribuídos anteriormente às variáveis e atribui o resultado da soma à variável Soma. As linhas: Escreva ("Primeiro número: ", A) Escreva ("Segundo número: ", B) Escreva ("Soma = ", A) Respectivamente mostram ao usuário: Primeiro número: 20 Segundo número: 50 Soma = 70 Esta é a saída do algoritmo Soma, descrito acima. Copyright (C) 1999-2000 Linux Solutions. 8 Conclusão Ufa! Você está meio tonto? É... Com estes novos conceitos na cabeça já dá para entender um pouco mais sobre o que estamos tratando. Algoritmos são códigos escritos em uma linguagem acessível (português estruturado), que visa o aprendizado de estruturação e refinamentos sucessivos, bem como a utilização de SINTAXE de comandos, para uma posterior migração para uma linguagem de programação. É importante frisar aqui o fato de que não existem interpretadores capazes de "ler" um algoritmo e executá-lo no computador. Sendo que o algoritmo é utilizado para dar uma noção de como criar um código executável para o computador. Uma vez pronto o algoritmo, você deve transformá-lo em código, usando uma linguagem de programação de sua escolha. Como por exemplo: Pascal, C, C++ etc. Obs: geralmente as linguagens de programação possuem algumas regras que devem ser observadas na hora da conversão do algoritmo para a linguagem, como por exemplo no Pascal, todas as linhas de comando devem terminar com um ";" (ponto e vírgula), entre outras regras próprias da linguagem. Espero que estejam gostando do curso. Até a próxima aula! Curso de Algoritmo - Aula IV Por: Jorge Luiz E. de Souza ( 03/07/2001 ) Introdução Neste capítulo veremos a resolução de um problema através do uso de Algoritmo. Serão apresentadas novas ferramentas e técnicas para a resolução. Estará tudo bem detalhado para que a interpretação e aprendizado seja fácil. Vamos começar! Desenvolvendo Algoritmos Algoritmos são formas de pensamento estruturado, sendo assim, a primeira coisa a fazer, é analizar muito bem o problema para identificar todas as possibilidades de solução possíveis. Vejamos o seguinte problema: Problema 1. O Instituto de Pesquisa Tal, deseja utilizar o computador para extrair informações com base nos dados obtidos com sua última pesquisa. Os dados são: Nome, idade, sexo, estado civil (e número de filhos caso seja casada) e origem de 3000 pessoas (toda população de uma pequina cidade). Deseja-se saber: 1. Quantas mulheres existem na cidade; 2. Quantas destas mulheres são casadas e tem mais de 3 filhos; 3. Quantos homens da cidade torcem para o palmeiras. Análise do Problema • 1ª Observação: o algoritmo a ser feito deverá RECEBER dados digitado pelo usuário. Considerando isto, já é clara a necessidade de um comando de leitura para cada item. • 2ª Observação: há a necessidade da repetição da leitura para cada pessoa (ficha com dados de uma pessoa) entrevistada. Aqui, vemos a necessidade de uma ESTRUTURA DE REPETIÇÃO, conceito que será apresentado neste exemplo. • 3ª Observação: As palavras QUANTAS, QUANTAS, QUANTOS indicam a necessidade da utilização de uma técnica de obtenção de dados quantitativos chamada CONTADOR. Que Copyright (C) 1999-2000 Linux Solutions. 9 mailto:contato@olinux.com.br também será apresentada neste exemplo. • 4ª Observação: Deve existir um contador para contar todas as mulheres da cidade. • 5ª Observação: Existe uma condição para uma mulher entrar na segunda CONTAGEM, esta condição é: ser casada e Ter mais de 3 filhos. Isto quer dizer que teremos dois CONTADORES para Mulheres, um para toda e qualquer mulher da cidade e um para as casadas com mais de três filhos. • 6ª Observação: Existe também uma condição para que um homem entre no TERCEIRO CONTADOR. Que é, torcer para o palmeiras. Todas as condições aqui expostas serão solucionadas utilizando-se de estruturas SE, ENTÃO e SENÃO. Apresentarei com este exemplo duas estruturas de repetição: Para e Enquanto, para isto haverá duas implementações de solução para este mesmo problema. Primeira implementação do Algoritmo Pesquisa * Utilizando a estrutura de repetição PARA Uma breve introdução à estrutura de repetição PARA Sintaxe: PARA variavel Valor ATÉ ValorFinal FAÇA { AQUI VÃO OS COMANDOS A SEREM EXECUTADOS Obs: as chaves utilizadas nesta sintaxe são mais uma forma de se escrever Comentários (comentários em BLOCO), isto é, tudo o que está Entre as chaves não é interpretado como código e sim como texto. } FIMPARA Entendendo a sintaxe: O PARA é uma estrutura de repetição incondicional, isto é, uma vez iniciada será executada quantas vezes estiver estipulada no intervalo entre variável e valor final. Vejamos: PARA i 1 até 100 faça Escreva("Este laço será executado 100 vezes") FIMPARA Note que, para a utilização desta estrutura devemos utilizar uma variável inteira, que deve ser declarada como tal, na área de declaração de variáveis do Algoritmo. Assim sendo: Algoritmo Exemplo Declare i: inteiro PARA i 1 até 100 faça Escreva(?Este laço será executado 100 vezes?) FIMPARA FimAlgoritmo Veremos mais sobre a utilização desta estrutura em outros exemplos. Resolução do problema proposto com a estrutura PARA Algoritmo Pesquisa Declare Nome, EstCiv, TimeQTorce, Origem: texto Copyright (C) 1999-2000 Linux Solutions. 10 Sexo: caracter i, Idade, contMulher, contMFilhos, ContTPalmeiras: inteiro //início do algoritmo ContMulher 0 ContMFilhos 0 ContTPalmeiras 0 PARA i <-- 1 ATÉ 3000 FAÇA escreva('Digite um nome: ') leia (nome) Escreva('Digite a idade: ') leia(idade) Escreva('Digite o Sexo (F para Feminino, M para Masculino):') leia(Sexo) Escreva('Digite o Estado Civil (Solteiro(a), Casado(a): ') Leia(EstCiv) SE (sexo = 'F') or (sexo = 'f') ENTÃO ContMulher ContMulher + 1 SE EstCiv = 'Casada' ENTÃO Escreva('Digite o Numero de filhos: ') Leia(NumFilhos) SE NumFilhos > 3 ENTÃO ContMFilhos ContMFilhos + 1 FIMSE FIMSE //fim do então SENÃO Escreva('Digite o Time para o qual Torce: ') Leia(TimeQTorce) SE TimeQTorce = 'Palmeiras' ENTÃO contTPalmeiras ContTPalmeiras +1 FIMSE //fim do senão FIMSE Escreva('Digite a Origem (BR,US,UC...): ') leia(Origem) FIMPARA //Escrevendo os resultados Escreva("O número de Torcedores do Palmeiras é: ", ContTPalmeiras) Escreva("O número de Mulheres da Cidade é: ",ContMulher) Escreva("O número de Mulheres Casadas com mais de três filhos é: ", ContMFilhos) FIMALGORITMO Conclusão Muito bem! Este primeiro contato com um problema e estas novas técnicas deve ser bem estudada. Pois na próxima aula teremos uma análise completa deste algoritmo. Até lá! Copyright (C) 1999-2000 Linux Solutions. 11 Curso de Algoritmo - Aula V Por: Jorge Luiz E. de Souza ( 17/07/2001 ) Introdução Como prometido aqui está a análise do algoritmo da aula anterior. Vamos entender o código! Análise da estrutura PARA Primeira análise: A seção de declaração de variáveis Declare Nome, EstCiv, TimeQTorce, Origem: texto Sexo: caracter i, Idade, contMulher, contMFilhos, ContTPalmeiras: inteiro A primeira seção de um algoritmo é sempre a DECLARAÇÃO DE VARIÁVEIS. Variáveis estas, que serão utilizadas no decorrer do algoritmo. É necessária a declaração, pois se uma variável utilizada no corpo do algoritmo não estiver declarada, o algoritmo não será executado. Provavelmente ocorrerá o erro ? váriavel desconhecida ? e o programa será abortado. Segunda análise: A inicialização de variáveis Quando declaramos uma variável, simplesmente estamos reservando um espaço de memória que poderá conter qualquer valor no decorrer do algoritmo. Mas o endereço ao qual a nossa variável está apontando provavelmente contém informações deixadas por outros programas ou se tivermos sorte estará vazia. A inicialização de variáveis se faz necessária quando devemos conhecer previamente o valor de uma variável. É o caso dos contadores. Precisamos ter certeza de que o valor inicial de um contador é 0 (zero). Então iniciamos seu valor utilizando o comando de atribuição "". ContMulher 0 ContMFilhos 0 ContTPalmeiras 0 NOTA: Um detalhe muito importante que deve ser observado é o nome de uma variável. Devemos dar preferência para nomes SIGNIFICATIVOS, isto é, ao criar uma variável, escolha um nome que possibilite a vizualização de seu conteúdo simplesmente pela leitura do mesmo. Como no caso acima, onde: • ContMulher é a variável que contará todas as mulheres da pesquisa; • ContMFilhos é a variável que contará todas as mulheres casadas e com mais de três filhos; • ContTPalmeiras é a variável que contará todos os torcedores do Palmeiras da pesquisa. Terceira análise: A implementação do Para e tudo que se irá repetir em seu escopo PARA i <-- 1 ATÉ 3000 FAÇA escreva('Digite um nome: ') leia (nome) Escreva('Digite a idade: ') leia(idade) Escreva(Digite o Sexo (F para Feminino, M para Masculino): ') Copyright (C) 1999-2000 Linux Solutions. 12 http://olinux.uol.com.br/artigos/345/1.html mailto:contato@olinux.com.br leia(Sexo) Escreva('Digite o Estado Civil (Solteiro(a), Casado(a): ') Leia(EstCiv) SE (sexo = 'F') or (sexo = 'f') ENTÃO ContMulher ContMulher + 1 SE EstCiv = 'Casada' ENTÃO Escreva('Digite o Numero de filhos: ') Leia(NumFilhos) SE NumFilhos > 3 ENTÃO ContMFilhos ContMFilhos + 1 FIMSE FIMSE //fim do então SENÃO Escreva('Digite o Time para o qual Torce: ') Leia(TimeQTorce) SE TimeQTorce = 'Palmeiras' ENTÃO contTPalmeiras ContTPalmeiras +1 FIMSE //fim do senão FIMSE Escreva('Digite a Origem (BR,US,UC...): ') leia(Origem) FIMPARA Muito bem, observando a estrutura acima, podemos notar: Todas as instruções entre o PARA e o FIMPARA serão executadas 3000 vezes. A estrutura de SE utilizada será tratada na Quarta análise. Todo o processamento do programa está dentro do para As primeiras oito linhas após o PARA são de leitura das variáveis (NOME, IDADE, SEXO e ESTCIV). Os comandos Escreva que antecedem cada comando Leia, são para informar o usuário quanto ao que o programa está esperando que ele digite. A posição de implementação dos contadores dentro da estrutura é estratégica, e não poderia ser outra. De acordo com a lógica do algoritmo, as leituras que estão dentro dos SE, mais internos, somente ocorrerão se a condição de entrada do ENTÃO ou SENÃO correspondente forem satisfeitas. Isto é, para o nosso algoritmo, se uma mulher não estiver com estado civil "Casada", o algoritmo não lerá número de filhos para esta mulher. Notamos que alguns valores recebidos não estão servindo para nenhum calculo especial, somente sendo necessários se, forem ser guardados em um banco de dados. Quarta análise: Estrutura SE ENTÃO SENÃO encadeadas SE (sexo = 'F') or (sexo = 'f') ENTÃO ContMulher ContMulher + 1 SE EstCiv = 'Casada' ENTÃO Escreva('Digite o Numero de filhos: ') Leia(NumFilhos) SE NumFilhos > 3 ENTÃO Copyright (C) 1999-2000 Linux Solutions. 13 ContMFilhos ContMFilhos + 1 FIMSE FIMSE //fim do então SENÃO Escreva('Digite o Time para o qual Torce: ') Leia(TimeQTorce) SE TimeQTorce = 'Palmeiras' ENTÃO contTPalmeiras ContTPalmeiras +1 FIMSE //fim do senão FIMSE Observamos aqui, uma estrutura de SE's encadeados. NOTA: A indentação é muito importante na estruturação visual do código para uma melhor leitura e entendimento do mesmo. INDENTAÇÃO É: Tabulação de elementos semelhantes em um mesmo nível (COLUNA imaginária). Se você pegar uma régua e colocar no início de um ENTÃO, encontrará seu SENÃO correspondente, e assim por diante. Relembrando Uma estrutura SE possui dois caminhos a serem seguidos, de acordo com o resultado da condição estabelecida para o mesmo. Sintaxe: SE CONDIÇÃO ENTÃO //comandos do então CASO A CONDIÇÃO SEJA VERDADEIRA SENÃO //comandos do senão CASO A CONDIÇÃO SEJA FALSA FIMSE Então, se o resultado da condição: SE (sexo = 'F') or (sexo = 'f') , for VERDADEIRA, serão executados todos os comandos que estão dentro do ENTÃO deste SE. ContMulher ContMulher + 1 SE EstCiv = 'Casada' ENTÃO Escreva('Digite o Numero de filhos: ') Leia(NumFilhos) SE NumFilhos > 3 ENTÃO ContMFilhos ContMFilhos + 1 FIMSE FIMSE //fim do então Caso contrário, se o resultado da condição for FALSO, serão executados todos os comandos do SENÃO correspondente. Escreva('Digite o Time para o qual Torce: ') Leia(TimeQTorce) SE TimeQTorce = 'Palmeiras' ENTÃO contTPalmeiras ContTPalmeiras +1 FIMSE //fim do senão Copyright (C) 1999-2000 Linux Solutions. 14 E assim é para todos os SE's encadeados dentro deste último. Quinta análise: Comandos de saída (resultado do processamento) Nosso exemplo é muito simples, e sua saída não poderia ser diferente. Como utilizamos comente estruturas de contagem (CONTADORES), após a leitura ser finalizadas, simplesmente escrevemos uma frase elucidativa antes de mostrar o CONTEÚDO (somatória) das variáveis de contagem. Sexta análise: Comentário sobre as deficiencias e possíveis refinamentos Este código é um bom começo, mas apresenta algumas "falhas". Por exemplo: - Uma vez iniciada a execução, será necessário digitar contínuamente todos as 3000 fichas. Sem interrupção, isto é, sem fechar o programa. Agora, imagine se fossem 100.000 entradas! Então, o PARA é uma estrutura falha?! De maneira alguma, é uma ótima estrutura de repetição, mas devemos pensar muito bem aonde a utilizaremos dentro de um algoritmo. Em nossa próxima implementação de solução para este mesmo problema, utilizaremos uma estrutura de repetição mais flexível o ENQUANTOque nos traz mais um conceito importante em programação; as FLAGs. Conclusão O algoritmo está certo, mas a estrutura apresentada na resolução (PARA) não é adequada para esta situação (isto foi feito propositalmente, para apresentar a você a estrutura). Na próxima aula apresentaremos o mesmo algoritmo com a estrutura (ENQUANTO), mais adequada para este problema. Entenda bem a leitura (interpretação) deste código, pois na próxima somente será analisada a nova estrutura, sendo que o restante do código será o mesmo. Até a próxima! Curso de Algoritmo - Aula VI Por: Jorge Luiz E. de Souza ( 31/07/2001 ) Introdução Como prometido aqui está a nova implementação do algoritmo da aula anterior. Espero que você tenha entendido a estrutura, pois somente será analisado aqui a nova estrutura (ENQUANTO). Se você ainda tem alguma dúvida, dê uma olhada na aula anterior que possui a análise completa da estrutura. Vamos aprender mais! A estrutura ENQUANTO Algoritmo Pesquisa Declare Nome, EstCiv, TimeQTorce, Origem: texto Sexo: caracter i, Idade, contMulher, contMFilhos, ContTPalmeiras: inteiro //início do algoritmo ContMulher 0 ContMFilhos 0 ContTPalmeiras 0 escreva('Digite um nome: ') leia (nome) Copyright (C) 1999-2000 Linux Solutions. 15 mailto:contato@olinux.com.br ENQUANTO nome <> ?fim? FAÇA escreva('Digite um nome: ') leia (nome) Escreva('Digite a idade: ') leia(idade) Escreva(Digite o Sexo (F para Feminino, M para Masculino): ') leia(Sexo) Escreva('Digite o Estado Civil (Solteiro(a), Casado(a): ') Leia(EstCiv) SE (sexo = 'F') or (sexo = 'f') ENTÃO ContMulher ContMulher + 1 SE EstCiv = 'Casada' ENTÃO Escreva('Digite o Numero de filhos: ') Leia(NumFilhos) SE NumFilhos > 3 ENTÃO ContMFilhos ContMFilhos + 1 FIMSE FIMSE //fim do então SENÃO Escreva('Digite o Time para o qual Torce: ') Leia(TimeQTorce) SE TimeQTorce = 'Palmeiras' ENTÃO contTPalmeiras ContTPalmeiras +1 FIMSE //fim do senão FIMSE Escreva('Digite a Origem (BR,US,UC...): ') leia(Origem) escreva('Digite um nome: ') leia (nome) FIMENQUANTO //Escrevendo os resultados Escreva("O número de Torcedores do Palmeiras é: ", ContTPalmeiras) Escreva("O número de Mulheres da Cidade é: ",ContMulher) Escreva("O número de Mulheres Casadas com mais de três filhos é: ", ContMFilhos) FIMALGORITMO Análise do algoritmo Todas as análises são idênticas à resolução anterior, com exceção dos novos conceitos: FLAG e a estrutura enquanto. Vejamos a estrutura enquanto: Sintaxe: ENQUANTO [CONDIÇÃO] FAÇA FIMENQUANTO Copyright (C) 1999-2000 Linux Solutions. 16 A estrutura básica do ENQUANTO é a dada acima, mas uma técnica para utilização desta estrutura é a FLAG. Uma FLAG é uma condição pré-definida que determina o fim do laço ENQUANTO. Para se utilizar flags é necessário determinar qual a melhor variável deve determinar (com o seu valor no decorrer do algoritmo) a saída do laço. Isto pode variar de problema para problema, mas geralmente usamos a primeira informação, dentro de uma sequência de informações digitadas pelo usuário. Sendo assim, se esta primeira informação contiver o valor determinado como FLAG de saída, o laço é abortado e o programa continua na primeira linha do algoritmo após o final da estrutura do laço. Assim temos (no nosso exemplo): escreva('Digite um nome: ') leia (nome) ENQUANTO nome <> "fim" FAÇA // comandos a serem executados para um nome diferente de fim escreva('Digite um nome: ') leia (nome) FIMENQUANTO Notem que estamos "lendo" o nome duas vezes na estrutura. Por quê? A primeira leitura é feita FORA do laço, e serve para que o usuário possa ignorar o laço, caso ele deseje isto. Isto é, se o usuário digitar "fim" antes de entrar no laço, o laço será ignorado. Isto garante a flexibilidade do ENQUANTO. Já a segunda leitura, está dentro do laço e garante que a(s) próxima(s) interação(ções) do laço, saberá(ão) o valor da FLAG de saída. Isto é necessário, pois caso não leiamos a variável "nome" dentro do laço, ocorrerá um LOOP ETERNO, uma vez que a condição de saída NUNCA será satisfeita. Isto é, se não lemos a variável nome, não podemos atribuir a ela o valor "fim" que determina a parada do laço. É importante notar também, que a variável que está nos servindo como FLAG, dentro do laço, deve ser a última instrução a ser lida. Pois após esta leitura, se a condição de saída for satisfeita os comandos de dentro do laço não devem mais ser executados. Conclusão Com isto terminamos o nosso curso básico de algoritmos. Espero que tenham aproveitado e gostado! Futuramente, em uma segunda parte, falaremos de comandos mais avançados e resolução de problemas matemáticos através dos algoritmos. Até lá! Curso de Algoritmo - Aula VII Por: Jorge Luiz E. Souza ( 11/01/2002 ) Introdução Muito bem, como ficou acertado, veremos a resolução de exercícios matemáticos, para a escrita de algoritmos estruturados. Exemplo 1 Nosso primeiro exercício será a resolução de uma somatória de números. S = 1 + 2 + 3 + 5 + ... Copyright (C) 1999-2000 Linux Solutions. 17 mailto:contato@olinux.com.br Até um total de 500 dígitos. Já ficou estabelecido o número de repetições, então, a melhor estrutura a ser utilizada para a resolução do problema é o PARA. Resolução Algoritmo Somatoria Declare S, i : Inteiro //Inicialização da variável acumuladora S <- 1 PARA i <- 2 ATÉ 500 FAÇA S <- S + i FIMPARA FIM ALGORITMO Pronto, a implementação para a solução deste problema é bem simples não?! E demonstra um pouco do poder de cálculo dos computadores. Para fazer esta soma, um computador levaria um milésimos de segundo. Aproveitando esta implementação, vejamos uma técnica para atualização rápida de estruturas PARA, em algoritmos mais complexos. Esta técnica é muito importante, pois imagine um código com 1500 (mil e quinhentas) linhas, e algumas estruturas PARA espalhadas, utilizando o mesmo valor de repetições. Você teria que procurar pelo código para encontrar as estruturas PARA e atualizar uma por uma caso o valor de repetição mudasse. A técnica é a seguinte: Ao invés de utilizarmos: PARA i <- 2 ATÉ 500 FAÇA Utilizaremos: PARA i <- 2 ATÉ VFim FAÇA Onde Vfim é uma variável que deve ser inicializada no início do programa com o valor de finalização da estrutura de repetição. Então teriamos: Algoritmo Somatoria Declare S, Vfim, i : Inteiro //Inicialização da variável acumuladora S <- 1 Vfim <- 500 PARA i <- 2 ATÉ VFim FAÇA S <- S + i FIMPARA FIM ALGORITMO Agora, basta alterar o valor de Vfim, para que a estrutura passe a calcular mais ou menos de 500 dígitos. Exemplo 2 Copyright (C) 1999-2000 Linux Solutions. 18 Vejamos um algoritmo para resolver o seguinte problema: S <- 2 + 4 + 6 + 8 +... Para um total de 1000 dígitos. Algoritmo SomatoriaII Declare S, Vfim, i : Inteiro //Inicialização da variável acumuladora S <- 0 Vfim <- 1000 PARA i <- 1 ATÉ VFim FAÇA S <- S + (i*2) FIMPARA FIM ALGORITMO Note que a solução apresentada aqui, para este segundo exemplo, utiliza a própria variável da estrutura PARA, para obter os valores a serem somados. Assim, quando o valor de "i" for: I = 1 ------- S receberá seu valor atual (zero) + o valor obtido pela multiplicação de "i" por 2, isto é (dois). I = 2 ------- S receberá seu valor atual(dois) + o valor obtido pela multiplicação de "i" por 2, isto é (quatro). E assim por diante. Observe que foi utilizado parenteses para descrever a ordem de operações que deve ser seguida. Como na matemática, o computador, se não especificado, segue a seguinte ordem de operações matemáticas: 1. Raiz quadrada 2. Equações 3. Multiplicação e divisão 4. Soma e subtração 5. Operadores lógicos (AND,OR,XOR,NOT) Para determinar a ordem de uma expressão matemática utiliza-se os parenteses. Assim, dão resultados diferentes: 1. 5*5+15/20 é diferente de 5*(5+15)/20 que é diferente de (5*5+(15/20)). Conclusão Com esta aula, vimos que a implementação de uma somatória pode ser muito simples e rápida para o computador. E como uma técnica simples pode ajudar na manutenção de estruturas PARA em algoritmos mais complexos. Para exercitar, faça um algoritmo que calcule: S = 1+ 3+ 5 + 7+... Para 20 dígitos Curso de Algoritmo - Aula VIII Por: Jorge Luiz E. Souza ( 18/02/2001 ) Copyright (C) 1999-2000 Linux Solutions. 19 mailto:contato@olinux.com.br Intorudção Este capítulo está direcionado para a resolução de exercícios, então, vamos à luta! OBS: O estudo detalhado e a resolução dos exercícios desta aula serão apresentados na aula seguinte. Pois o objetivo desta aula é uma avaliação de conhecimento adquirido, ou melhor, uma auto-avaliação, pois você deve tentar resolver sozinho, para poder comparar com a solução que eu darei. Boa Sorte! Exercícios Exercício 1 Fazer um algoritmo que dadas as dimensões de um retângulo, calcule a sua área e escreva na tela. Exercício 2 Fazer um algoritmo que para cada número digitado pelo usuário, calcule seu fatorial e escreva na tela. Exercício 3 Fazer um algoritimo para calcular a potência N de um numero X. Ambos serão digitados pelo usuário. E escreva na tela. Exercício 4 Dada a expressão: 2*10*2*20*2*30*2*40 1+2+3+4+5+6+7+8 Fazer um algoritmo para mostrar seu resultado. Exercício 5 Fazer um algoritmo que dados dois números, calcule a razão existente entre eles e monte uma PA de 10 termos e escreva na tela. O calculo da razão é o segundo termo menos o primeiro. Exercício 6 Tendo-se a seguinte expressão matemática: Soma = X+Y Mult= X*Y SubTotal = Mult / Soma Expressao = [(X*15)+(Y*25)+(X*35)+(Y*45)+(X*55)]/15 Total= SubTotal + Expressao Fazer um algoritmo que: 1. Leia os valores X e Y 2. Calcule a soma e a multiplicacao destes valores e armazene em SubTotal 3. Calcule expressao e armazene a última operação de soma na variável Total Ao final do programa, listar na tela os valores, da seguinte maneira: Exercício 6 Valores digitados pelo usuário "VALOR DE X"; "VALOR DE Y" Subtotal : "VALOR DO SUBTOTAL"; Expressão: "VALOR DA EXPRESSÃO"; Total:"Valor total"; Copyright (C) 1999-2000 Linux Solutions. 20 Curso de Algoritmo - Aula IX Por: Jorge Luiz E. Sousa ( 29/01/2002 ) Introdução Como prometido aqui estão as soluções dos exercícios apresentados na aula anterior . Solução dos exercícios. Confira! Exercício 1 Fazer um algoritmo que dadas as dimensões de um retângulo, calcule a sua área e escreva na tela. Algoritmo Declare //Inicio do algoritmo //Obtendo os dados do usuário Escreva('Digite o valor da base do retângulo: ') Leia(Base) Escreva('Digite o valor da altura do retângulo: ') Leia(Altura) //Calculando a área Area <- Base * altura Escreva('A área é: ',Area) FimAlgoritmo Análise do algorítmo acima: Primeira análise: Este algoritmo é muito simples, sendo necessário apenas uma fórmula para sua solução. não há o que comentar... qualquer dúvida contacte-me. Exercício 2 Fazer um algoritmo que para cada número digitado pelo usuário, calcule seu fatorial e escreva na tela. Algoritmo Declare //Inicio do algoritmo //Obtendo dados do usuário para entrar no laço ou não Escreva ('Digite um número, ou 0 para sair(o fatorial de 0 é 1.)')') Leia (Numero) //Inicializando variáveis i<- Numero Fatorial<- 1 Enquanto Numero <> 0 faça Para i<- 1 até Numero Faça Copyright (C) 1999-2000 Linux Solutions. 21 http://olinux.uol.com.br/artigos/437/1.html mailto:contato@olinux.com.br Se i<>0 então Fatorial<- Fatorial * i i<- i-1 FimPara Escreva('O fatorial de ',Numero,' é ',Fatorial) //Obtendo dados do usuário para continuar ou sair do laço Escreva('Digite um número, ou 0 para sair(o fatorial de 0 é 1.)')') Leia(Numero) FimEnquanto FimAlgoritmo Análise do algorítmo acima: Primeira análise. Para se calcular o fatorial de um número, é necessário multiplicá-lo pelos seus predessessores até se chegar ao 1. Por tanto, o fatorial de 5 é 5*4*3*2*1. Com base nisto, chega-se a conclusão de que uma estrutura PARA resolve o problema, visto que temos o valor inicial e o ponto de parada. Segunda análise. Como em algoritmo a estrutura PARA somente "anda para frente", devemos utilizar uma variável auxiliar para decrementar o número, assim poderemos chegar ao valor desejado, testando se o decremento chegou a zero por precaução. Exercício 3 Fazer um algoritimo para calcular a potência N de um numero X. Ambos serão digitados pelo usuário. E escreva na tela. Algoritmo Declare //Inicio do algoritmo //Obtendo os dados do usuário Escreva('Digite a base:') Leia(Base) Escreva('Digite o expoente:') Leia(Expoente) //Inicializando variável resultado Resultado<- Base //Calculando Se Expoente = 0 então Resultado<-1 senão Se base = 0 então Resultado <- 0 senão PARA i<- 1 até (Expoente -1) FAÇA Resultado<- Resultado * Expoente FimPARA FimSe FimSe Copyright (C) 1999-2000 Linux Solutions. 22 Escreva('O resultado é: ',Resultado) FimAlgoritmo Análise do algorítmo acima: Primeira análise O calculo da exponenciação se dá como XN de modo que para se obter o resultado final deve-se multiplicar X por ele mesmo N vezes. Então, conhecemos o valor inicial (1) e o valor final será dado pelo usuário. A estrutura PARA é o mais indicado. Segunda análise Montar a expressão é facil, mas em algoritmo é necessário mostrar todos os passos para a máquina (computador), pois você o está ensinando a fazer algo. então, devemos prever todas as situações possíveis. Por isto, testamos a entrada do expoente 0, e base 0. Exercício 4 Dada a expressão: 2*10*2*20*2*30*2*40 1+2+3+4+5+6+7+8 fazer um algoritmo para mostrar seu resultado. Algoritmo Declare //Inicio do algoritmo j<-10 Somar <- 0 PARA i <- 1 até 8 Faça Calcular<- Calcular + (2*j) Somar<- Somar + i j<- j + 10 FimPARA Resultado<- Calcular / Somar Escreva('O resultado é: ', Resultado) FimAlgoritmo Análise do algorítmo acima: Primeira análise A expressão é fixa tendo somente oito elementos no numerador, oito no denominador. A estrutura para é a mais indicada para resolver. Segunda análise São necessárias variáveis auxiliares para o calculo, estas são Calcular, j e Somar que fazem respectivamente: 1. Calcular o valor final do numerador, utilizando-se do incremento do j; Copyright (C) 1999-2000 Linux Solutions. 23 2. Calcular o valor do denominador. Exercício 5 Note que somente os calculos são feitos dentro do laço. o calculo do resultado final foi feito após o calculo das partes. Fora do laço. Bem como a escrita. Exercício 5 Fazer um algoritmo que dados dois números, calcule a razão existente entre eles e monte uma PA de 10 termos e escreva na tela. O calculo da razão é o segundo termo menos o primeiro. Algoritmo Declare //Inicio do algoritmo //Obtendo os dados do usuário Escreva('Digite o primeiro número') Leia(PTermo) Escreva('Digite o segundo número') Leia(STermo) //Calculando a razão Razao<- STermo - PTermo Escreva('Osdez primeiros termos desta PA são:') Escreva(PTermo) Escreva(STermo) TAux<-STermo Para i<-3 até 8 Faça ProxTermo<- TAux + Razao Escreva(ProxTermo) TAux<- ProxTermo FimPara FimAlgoritmo Análise do algorítmo acima: Primeira análise Uma PA é uma seqüência de números com uma razão entre eles. Para se calcular os termos da PA é necessário conhecer pelo menos um e a razão. No nosso caso, temos os dois primeiros, isto significa que temos a razão também. Depois é só somar. Segunda análise Não existe somente esta forma para resolver o problema. observe isto. Use este algoritmo como base somente, não como a única solução. Exercício 6 Tendo-se a seguinte expressão matemática: Soma = X+Y Mult= X*Y SubTotal = Mult / Soma Expressao = [ (X*15)+(Y*25)+(X*35)+(Y*45)+(X*55) ] / 15 Copyright (C) 1999-2000 Linux Solutions. 24 Total= SubTotal + Expressao Fazer um algoritmo que: 1. Leia os valores X e Y 2. Calcule a soma e a multiplicação destes valores e armazene em SubTotal 3. Calcule expressão e armazene a última operação de soma na variável Total Ao final do programa, listar na tela os valores, da seguinte maneira: Exercício 6 Valores digitados pelo usuário "VALOR DE X"; "VALOR DE Y" Subtotal : "VALOR DO SUBTOTAL"; Expressão: "VALOR DA EXPRESSÃO"; Total:"Valor total"; Algoritmo Declare //Inicio do algoritmo //Obtendo os números do usuário Escreva('Digite o primeiro número') leia(X) Escreva('Digite o Segundo número') Leia(Y) Soma <- X + Y Mult <- X * Y SubTotal <- Mult / Soma Expressao <- 0 i<-15 j<- 1 Enquanto i <= 55 faça Par<- J mod 2 Se (par = 0) Então Expressao <- Expressao + (X*i) Senão Expressao <- Expressao + (Y*i) FimSe i<- i + 10 Fim Enquanto Expressao<-Expressao/15 Total <- SubTotal + Expressao Escreva('Exercicio1') Escreva('') //isto escreve uma linha vazia Escreva('') //isto escreve uma linha vazia Escreva('Os valores digitados pelo usuário são:X=',X,' Y= ',Y) Escreva('SubTotal= ',SubTotal) Escreva('Expressão= ',Expressao) Escreva('O valor total dos calculos é:', Total) FimAlgoritmo Análise do algoritmo acima: Primeira análise O problema apresentado neste exercício e no anterior, devem ser resolvidos em partes, assim, na sequência temos a solução da primeira expressão, da segunda, do subtotal e o calculo da expressão. Segunda análise Copyright (C) 1999-2000 Linux Solutions. 25 Sobre o calculo da expressão: Expressao <- 0 i<-15 j<- 1 Enquanto i <= 55 faça Par<- J mod 2 Se (par = 0) Então Expressao <- Expressao + (X*i) Senão Expressao <- Expressao + (Y*i) FimSe i<- i + 10 Fim Enquanto Expressao<-Expressao / 15 Vejamos: 1. a inicialização da variável "Expressao" com zero é para que ele esteja "limpa" quando receber o primeiro valor. 2. a variável "i" recebendo 15 servirá para o incremento dos valores 15,25,35... 3. a variável "Par" receberá o valor do resto da divisão de j por 2, e definirá se o número é par ou impar. Portanto, quando for inpar multiplicaremos "i" por "X" e quando for par, multiplicaremos por "Y". 4. quando sairmos do laço, a expressão estará pronta para ser dividida por 15. Conclusão Com estes exercícios, terminamos este módulo. No próximo, veremos mais estruturas, ainda não apresentadas, como vetores e matrizes. Até mais! Se você conseguiu fazer todos os exercícios, Parabéns! Se não, não fique triste, você pode revisar as aulas e tentar de novo. Curso de Algoritmo - Aula X Por: Jorge Luiz E. Sousa ( 15/02/2002 ) Introdução Olá, comunidade! Hoje começa uma nova faze do curso, onde veremos algumas estruturas novas e muito importantes para programação. São chamadas VETORES. Definição São estruturas unidimensionais e homogêneas capazes de armazenar um número determinado de variáveis e referenciálas utilizando uma estrutura de índice. De acordo com esta descrição, vejamos um exemplo: Exemplo de um vetor de 8 (oito) posições 5 15 25 100 0 21 35 50 Exemplo de um vetor de 8 (oito) posições 'JLes' 'Exemplo' 'de' 'VETORES' '' '' '' '' Observe nas estruturas acima, que: Copyright (C) 1999-2000 Linux Solutions. 26 mailto:contato@olinux.com.br • No primeiro exemplo temos um vetor numérico • No segundo temos um vetor literal • Os dois exemplos estão totalmente preenchidos • O primeiro vetor foi inicializado com zeros • O segundo vetor foi inicializado com '' (espaços/vazio) • Ambos são homogêneos, isto é, seu conteúdo é do mesmo tipo • Ambos são unidimencionais, um índice basta para referenciar as posições do vetor. Com a explicação acima, concluimos que vetores são variáveis com múltiplas posições. Sintaxe A sintaxe de declaração de variáveis para vetores é: Declare <NomeDaVariável> : Vetor [INI .. FIM] TipoDoVetor Onde: • Declare é a palavra reservada para declaração de variáveis (sempre no início do Algoritmo) • <NomeDaVariável> : é o nome dado pelo usuário para a variável • Vetor é a palavra reservada para definir que uma variável é do tipo VETOR • [INI .. FIM] define a quantidade de ítens de um vetor • TipoDoVetor define o tipo de variável que o vetor vai armazenar. Exemplo: Declare vetNome : vetor [1..50] literal Declare vetSalario : vetor [1..50] numérico inteiro Características • Unidimensionais, • Homogêneos, • Um mesmo indice pode acessar valores em vários vetores distintos, desde que haja uma relação entre eles e sejam "do mesmo tamanho". • Ao tentar acessar uma posição inexistente, ocorrerá um erro no programa. • Vetores só existem na memória do computador e durante a execução de um programa ou "PROCEDIMENTO", não sendo estruturas para armazenamento permanente. Obs.: PROCEDIMENTOS e FUNÇÕES serão matéria de aulas futuras Referência Para acessar uma determinada posição do vetor, será necessário informar o nome do vetor e a posição desejada. Exemplo: NomeAtual <- vetNome[40] SalarioAtual <- vetSalario[40] Aplicação Copyright (C) 1999-2000 Linux Solutions. 27 Estas estruturas são utilizadas para armazenar temporáriamente vários valores relacionados. Como mostrado no exemplo anterior, podemos ter vários vetores de "N" posições, armazenando dados diferentes e relacionados, "SIMULANDO EM MEMÓRIA", o armazenamento de informações, para referência futura. Exemplo Como exemplo, vamos criar uma agenda virtual, que durante sua execução, armazenará: Nome, Telefone, endereço e e-mail de 100 pessoas. Algoritmo Declare Nome,Ender,Telefone,EMail: vetor [1..100]literal Indice: numérico inteiro //Início do algoritmo //Inicializando indice Indice<-1 //Inicializando vetores Parai<- 1 até 100 Faça Nome[i]<-'' Ender[i]<-'' Telefone[i]<-'' EMail[i]<-'' FimPara //Obtendo dados do usuário Para i<- 1 até 100 Faça Escreva('Digite o nome:') Leia(Nome[i]) Escreva('Digite o Endereco') Leia(Ender[i]) Escreva('Digite o Telefone') Leia(Telefone[i]) Escreva('Digite o e-mail') Leia(EMail[i]) FimPara //Listando todos os registros em sequência Parai<- 1 até 100 Faça Escreva(Nome[i]) Escreva(Ender[i]) Escreva(Telefone[i]) Escreva(EMail[i]) FimPara FimAlgoritmo Análise do algoritmo exemplo Primeira Análise O algoritmo acima contém muitas falhas, mas para uma visão inicial, serve ao propósito. Segunda Análise Note que a mesma estrutura "PARA" foi utilizada para todos os processos, a saber: Inicialização dos Copyright (C) 1999-2000 Linux Solutions. 28 vetores, obtenção dos dados e associação dos mesmos à uma mesma pessoa e impressão dos dados. Terceira análise O algoritmo, por utilizar a estrutura para, quando estiver no segundo laço (obtenção dos dados), não vai parar antes de ler todos os 100 registros. Isto pode ser muitocansativo e é desagradável pensar que estes dados serão perdidos assim que se chegar ao fim do algoritmo. Quarta análise Vetores são estruturas interessantes e úteis, mas não para uma agenda. sendo que a melhor utilização desta estrutura seria, como forma, por exemplo, de guardar os últimos 100 registros lidos de um banco de dados na memória para acesso imediato. Desta maneira, o acesso a disco (que é lento), seria feito "uma vez somente", e os dados seriam acessados a partir da memória, que é muito mais eficiente e rápido. Conclusão Com o decorrer do curso, utilizaremos este mesmo algoritmo, melhorando-o a cada novo recurso aprendido. Ao final, teremos um algoritmo de agenda completo, com arquivamento em disco e tudo o que mais for de direito de uma agenda, inclusive o Programa codificado em pascal para DOS, utilizando a interface do Delphi para implementação. A próxima aula será sobre matrizes. Espero que tenham apreciado, Críticas e Sugestões são bem vindas! Curso de Algoritmo - Aula XI Por: Jorge Luiz E. Sousa ( 28/02/2002 ) Introdução Olá Comunidade! Muito bem, estamos aqui novamente para nosso curso, e hoje falaremos sobre matrizes, que são vetores bidimensionais, isto é, vetores que possuem dois índices para acesso a uma posição. Um exemplo básico seria uma planílha, onde temos linhas e colunas, para referenciar uma célula. Mas note que isto é só um exemplo. Matrizes para os programas são estruturas que armazenam dados homogêneos (do mesmo tipo), em "células" que são acessadas através de coordenadas numéricas. Assim, uma matriz de 5x15, teria 5 linhas e 15 colunas, sendo que para acessar um elemento de coordenada 5, 5 (como nos vetores, visto aula passada), deveria ser informado o nome da matriz e entre colchetes a coordenada que se quer. Ex.: MatrizExemplo[5,5] Definição São estruturas bidimensionais e homogêneas capazes de armazenar um número determinado de variáveis e referenciá-las utilizando uma estrutura de dois índices. De acordo com esta descrição, vejamos um exemplo: Exemplo de um vetor de 2 (duas) linhas x 8 (oito) colunas 5 15 25 100 0 21 35 50 5 15 25 100 0 21 35 50 Exemplo de um vetor de 2 (duas) linhas x 8 (oito) colunas Copyright (C) 1999-2000 Linux Solutions. 29 mailto:contato@olinux.com.br 'JLes' 'Exemplo' 'de' 'MATRIZES' '' '' '' '' 'JLes' 'Exemplo' 'de' 'MATRIZES' '' '' '' '' Observe nas estruturas acima, que: • No primeiro exemplo temos uma matriz numérica • No segundo temos uma matriz literal • Os dois exemplos estão totalmente preenchidos • O primeiro vetor foi inicializado com zeros • O segundo vetor foi inicializado com '' (espaços/vazio) • Ambos são homogêneos, isto é, seu conteúdo é do mesmo tipo (numérico e literal respectivamente) • Ambos são bidimencionais, dois índice serão necessários para referenciar as posições da matriz. Com a explicação acima, concluimos que matrizes são "variáveis com multiplas posições e duas dimensões (plano carteziano x e y)". Sintáxe A sintáxe de declaração de variáveis para vetores é: Declare <NomeDaVariável> : Vetor [INI .. FIM, INI .. FIM] TipoDoVetor Onde: • Declare é a palavra reservada para declaração de variáveis (sempre no início do Algoritmo) • <NomeDaVariável> : é o nome dado pelo usuário para a variável • Vetor é a palavra reservada para definir que uma variável é do tipo VETOR • [INI .. FIM, INI .. FIM] define a quantidade de linhas e colunas de um vetor bidimensional (matriz) • TipoDoVetor define o tipo de variável que o vetor vai armazenar. Exemplo: Declare vetPessoa : vetor [1..50, 1..2] literal (matriz quadarada 50x50) Características Bidimensionais, homogêneos, um mesmo indice pode acessar valores em vários vetores distintos, desde que haja uma relação entre eles e sejam "do mesmo tamanho". Ao tentar acessar uma posição inexistente, ocorrerá um erro no programa. Vetores (uni, bi e multi*) só existem na memória do computador e durante a execução de um programa ou "PROCEDIMENTO", não sendo estruturas para armazenamento permanente. multi* existem linguagens de programação que permitem a criação de vetores multidimensionais. Vetores com 3 indices que seriam referênciados como matrizes sobrepostas, mas não é usual. Obs.: PROCEDIMENTOS e FUNÇÕES serão matéria de aulas futuras Referência Para acessar uma determinada posição do vetor, será necessário informar o nome do vetor e a posição desejada. Exemplo: Copyright (C) 1999-2000 Linux Solutions. 30 NomeAtual <- vetPessoa[40,1]T TelefoneAtual <- vetPessoa[40,2] Aplicação Estas estruturas são utilizadas para armazenar temporáriamente vários valores relacionados. Estamos utilizando o mesmo exemplo anterior, somente mostrando a diferença de acesso entre vetores e matrizes (vetores bidimensionais), "SIMULANDO EM MEMÓRIA", o armazenamento de informações, para referência futura. Exemplo Como exemplo, vamos criar uma agenda virtual, que durante sua execução, armazenará: Nome, Telefone, endereço e e-mail de 100 pessoas. Algoritmo Declare Pessoa:vetor[1..100, 1..4]literal Indice1, Indice2: numérico inteiro //Início do algoritmo //Inicializando indice Indice<-1 //Inicializando vetores Para i <-1 até 100 Faça Para j <-1 até 4 Faça Pessoa[i,j]<-'' FimPara //Obtendo dados do usuário FimPara //Obtendo dados do usuário j=1; Para i <-1 até 100 Faça Escreva('Digite o nome:') Leia(Pessoa[i,j]) Escreva('Digite o Endereco') Leia(Pessoa[i,j+1]) Escreva('Digite o Telefone') Leia(Pessoa[i,j+2]) Escreva('Digite o e-mail') Leia(Pessoa[i,j+3]) FimPara //Listando todos os registros em sequência Para i <-1 até 100 Faça Para j <-1 até 4 Faça Escreva(Pessoa[i,j]) Copyright (C) 1999-2000 Linux Solutions. 31 Escreva(Pessoa[i,j]) Escreva(Pessoa[i,j]) Escreva(Pessoa[i,j]) FimPara FimPara FimAlgoritmo Análise do algoritmo exemplo Primeira Análise Já está melhorando, observe que na aula anterior sobre vetores unidimensionais, precisamos criar uma estrutura para cada informação a respeito de uma pessoa, a saber: nome, endereço, e-mail e telefone. Com uma matriz, podemos simular um arquivo em memória. Sendo necessária somente uma matriz, para armazenar todos estes dados. Análogamente à um arquivo, as linhas da matriz seriam os registros, e as células da matriz seriam os campos. Observe que com este novo conceito a programação se torna mais abstrata, pois você como programador deve saber em sua mente, que coluna armazeana a informação de que você precisa. Segunda Análise Note que a mesma estrutura "PARA" foi utilizada para todos os processos, com uma diferença quando da leitura dos "registros" (linhas da matriz). No "PARA " de leitura, a variável "j" foi inicializada antes de entrar no laço e utilizada para referenciar as colunas da linha que armazenarão cada informação. NOTE QUE, o j não é incrementado em valor, dentro da estrutura, isto é seu valor não aumenta, é sempre 1. O que fizemos foi "incrementálo" como índice, sem que ele recebece seu próprio valor incrementado, assim, para cada linha ele continuará sendo "1", mas em cada leitura referenciará uma coluna diferente. Este conceito foi implementado aqui, para lhe dar uma noção de como utilizar os indices, existem várias outras formas de se fazer isto. Terceira análise O algoritmo, por utilizar a estrutura para, quando estiver no segundo laço (obtenção dos dados), não vai parar antes de ler todos os 100 registros, que agora equivalem a 100 x 4, isto é 400 leituras. Isto pode ser muito cansativo e é desagradável pensar que estes dados serão perdidos assim que se chegar ao fim do algoritmo.Quarta análise Vetores são estruturas interessantes e úteis, mas não para uma agenda. sendo que a melhor utilização desta estrutura seria, como forma, por exemplo, de guardar os últimos 100 registros lidos de um banco de dados na memória para acesso imediato. Desta maneira, o acesso a disco (que é lento), seria feito "uma vez somente", e os dados seriam acessados a partir da memória, que é muito mais eficiente e rápido. Conclusão Com o decorrer do curso, utilizaremos este mesmo algoritmo, melhorando-o a cada novo recurso aprendido. Ao final, teremos um algoritmo de agenda completo, com arquivamento em disco e tudo o que mais for de direito de uma agenda, inclusive o Programa codificado em pascal para DOS, utilizando a interface do Delphi para implementação. Copyright (C) 1999-2000 Linux Solutions. 32 Espero que tenham apreciado, Críticas e Sugestões são bem vindas. Copyright (C) 1999-2000 Linux Solutions. 33
Compartilhar