

























Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Os melhores documentos à venda: Trabalhos de alunos formados
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Comunidade
Peça ajuda à comunidade e tire suas dúvidas relacionadas ao estudo
Descubra as melhores universidades em seu país de acordo com os usuários da Docsity
Guias grátis
Baixe gratuitamente nossos guias de estudo, métodos para diminuir a ansiedade, dicas de TCC preparadas pelos professores da Docsity
Curso de Algoritmo, demonstra técnicas para resolução de problemas. Material retirado do Site www.olinux.com.br Autor: Jorge Luiz E. de Souza
Tipologia: Notas de aula
1 / 33
Esta página não é visível na pré-visualização
Não perca as partes importantes!
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
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.
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:
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 caminho para 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.
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!
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.
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
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 algoritmo A 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.
também será apresentada neste exemplo.
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 + 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á!
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 + 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
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 + 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 + FIMSE //fim do senão
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 + 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
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á!
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 + ...
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:
Por: Jorge Luiz E. Souza ( 18/02/2001 )
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: 2102202302* 1+2+3+4+5+6+7+ 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= XY SubTotal = Mult / Soma Expressao = [(X15)+(Y25)+(X35)+(Y45)+(X55)]/ Total= SubTotal + Expressao Fazer um algoritmo que: