Universidade Federal do Espírito Santo Programação II Professora: Norminda Luiza Lógica Podemos relacionar a lógica com a “correção do pensamento”, pois uma de suas preocupações é determinar quais operações são válidas e quais não são fazendo análises das formas e leis do pensamento. Poderíamos dizer também que é a arte de bem pensar, que é a ciência das formas do pensamento. Visto que a forma mais complexa do pensamento é o raciocínio, a lógica estuda a “correção do pensamento”. Lógica Todo mamífero é um animal. Todo cavalo é um mamífero. Portanto, todo cavalo é um animal. Esse exemplo ilustra silogismos, que no estudo da Lógica Proposicional (ou cálculo sentencial) representam um argumento composto de duas premissas e uma conclusão; e está estabelecendo uma relação, que pode ser válida ou não. Esse é um dos objetivos da lógica, o estudo de técnicas de formalização, dedução e análise que permitam vefiricar a validade de argumentos. Lógica de Programação Significa o uso correto das leis do pensamento, da “ordem da razão” e de processos de raciocínio e simbolização formais na programação de computadores, objetivando racionalidade e o desenvolvimento de técnicas que cooperam para a produção de soluções logicamente válidas e coerentes, que resolvam com qualidade os problemas que se deseja programar. Para representar mais fielmente o raciocínio da Lógica de Programação, utilizamos os Algoritmos. Algoritmo É a descrição de um conjunto de comandos que, obedecidos, resultam numa sucessão finita de ações. Ação é um acontecimento que, a partir de um estado inicial, após um período de tempo finito, produz um estado final previsível e bem definido. Geralmente, um algoritmo se destina a resolver um problema: fixa um padrão de comportamento a ser seguido, uma norma de execução a ser trilhada, para se atingir, como resultado final, a solução de um problema. Algoritmo Um algoritmo pode ser definido como uma sequência de passos que visam a atingir um objetivo bem definido Para especificar uma sequência de passos, é necessário utilizar ordem, ou seja, “pensar com ordem”, portanto precisamos utilizar lógica. Ao elaborar um algoritmo, devemos especificar ações claras e precisas, que a partir de um estado inicial, após um período de tempo finito, produz um estado final previsível e bem definido. Algoritmo Por que é importante construir um algoritmo? • Representar mais fielmente o raciocínio envolvido na Lógica de Programação. • Pode ser traduzida programação. para qualquer Exemplo (utilizando um português coloquial) Algoritmo 1.1 - Troca de lâmpada pegar uma escada; posicionar a escada embaixo da lâmpada; buscar uma lâmpada nova; subir na escada; retirar a lâmpada velha; colocar a lâmpada nova. linguagem de Algoritmo Algoritmo 1.2 - Troca de lâmpada com teste pegar uma escada; posicionar a escada embaixo da lâmpada; buscar uma lâmpada nova; acionar o interruptor; se a lâmpada não acender, então subir na escada; retirar a lâmpada queimada; colocar a lâmpada nova. Algoritmo Algoritmo 1.3 - Troca de lâmpada com teste no início acionar o interruptor; se a lâmpada não acender, então pegar uma escada; posicionar a escada embaixo da lâmpada; buscar uma lâmpada nova; subir na escada; retirar a lâmpada queimada; colocar a lâmpada nova. Algoritmo Algoritmo 1.4 - Troca de lâmpada com teste e repetição indefinida acionar o interruptor; subir na escada; retirar a lâmpada queimada; colocar a lâmpada nova. se a lâmpada não acender, então retirar a lâmpada queimada; colocar a lâmpada nova. se a lâmpada não acender, então retirar a lâmpada queimada; colocar a lâmpada nova. se a lâmpada não acender, então retirar a lâmpada queimada; colocar a lâmpada nova. … até quando? Algoritmo Algoritmo 1.5 - Troca de lâmpada com teste e condição de parada acionar o interruptor; se a lâmpada não acender, então pegar uma escada; posicionar a escada embaixo da lâmpada; buscar uma lâmpada nova; subir na escada; retirar a lâmpada queimada; colocar uma lâmpada nova; Enquanto a lâmpada não acender, faça retirar a lâmpada queimada; colocar uma lâmpada nova; Algoritmo Um homem precisa atravessar um rio com um barco que possui capacidade de transportar apenas ele mesmo e mais uma de suas três cargas, que são: um lobo, um bode e um maço de alfafas. O que o homem deve fazer para conseguir atravessar o rio sem perder suas cargas? Informações: um barco um homem um lobo um bode um maço de alfafa Ação: atravessar o rio sem perder as cargas Algoritmo Resultado: todas as cargas na outra margem do rio algoritmo: – atravessar homem e bode – voltar homem – atravessar homem e lobo – voltar homem e bode – atravessar homem e alfafa – voltar homem – atravessar homem e bode fim algoritmo Algoritmo Elabore um algoritmo que mova três discos de uma Torre de Hanói, que consiste em três hastes (a-b-c), uma das quais serve de suporte para três discos de tamanhos diferentes (1-2-3), os menores sobre os maiores. Pode-se mover um disco de cada vez para qualquer haste, contanto que nunca seja colocado um disco maior sobre o menor. O objetivo é transferir os três discos para outra haste. Informações: Algoritmo 3 discos 3 hastes Ações: movimentar um disco de cada vez de forma que fiquem ordenado Resultado: discos transferidos o ordenados para outra haste algoritmo - mover o disco 1 para a haste b - mover o disco 2 para a haste c - mover o disco 1 para a haste c - mover o disco 3 para a haste b - mover o disco 1 para a haste a - mover o disco 2 para a haste b - mover o disco 1 para a haste b fim algoritmo Torre de Hanói Torre de Hanói Algoritmo Escrever os termos da sequência de Fibonacci inferiores a um valor numérico L. A Sequência de Fibonacci se define como tendo os dois primeiros termos iguais a 1 e cada termo seguinte é igual a soma dos dois termos imediatamente anteriores. L = 50 1 1 2 3 5 8 L = 13 1 1 2 3 5 8 13 21 34 L=1 Algoritmo Escreva os termos de Fibonacci inferiores a L fim algoritmo Algoritmo - Refinamentos sucessivos Um algoritmo é considerado completo se for do entendimento do seu destinatário. Num algoritmo, um comando que não for do entendimento do destinatário terá de ser desdobrado em novos comandos, que constituirão um refinamento do comando inicial. Ref. Escreva os termos de Fibonacci inferiores a L Receba o valor de L. Processe os 2 primeiros termos. Processe os termos restantes. fim ref. Algoritmo - Refinamentos sucessivos • Um algoritmo e seus refinamentos são formados por comandos, que determinam as ações a serem executadas pelo seu destinatário e por estruturas de controle que determinam a ordem em que os comandos devem ser executados, se devem ser executados ou não e quando devem ser repetidos. • No refinamento anterior vigora a mais simples das estruturas de controle: a estrutura sequêncial. • Se um comando de um refinamento for um tanto vago, ele poderá por sua vez, ser desdobrado em novos comandos, produzindo-se o refinamento de um refinamento, e assim sucessivamente. Algoritmo - Refinamentos sucessivos Ref. Processe os 2 primeiros termos Atribua o valor 1 ao primeiro termo Se ele for menor que L então escreva-o fim se Atribua o valor 1 ao segundo termo Se ele for menor que L então escreva-o fim se fim ref. • Neste refinamento aparece uma segunda estrutura de controle: a estrutura condicional Algoritmo - Refinamentos sucessivos Ref. Processe os termos restantes Repita Calcule novo termo somando os 2 anteriores Se novo termo for maior ou igual a L então interrompa fim se Escreva novo termo fim repita fim ref. • Neste refinamento aparece uma terceira estrutura de controle: a estrutura de repetição • Após esses refinamentos sucessivos, o algoritmo pode ser considerado completo, a menos que o destinatário não saiba fazer a adição de dois termos ou não seja capaz de entender diretamente algum comando. Algoritmo Algoritmo {Escrita dos termos de Fibonacci inferiores a L} Receba o valor de L. {Processamento dos 2 primeiros termos} Atribua o valor 1 ao primeiro termo Se ele for menor que L então escreva-o fim se Atribua o valor 1 ao segundo termo Se ele for menor que L então escreva-o fim se {Processamento dos termos restantes.} Repita Calcule novo termo somando os 2 anteriores Se novo termo for maior ou igual a L então interrompa fim se Escreva novo termo fim repita fim algoritmo Algoritmos Estruturados • São técnicas que permitem sistematizar e ajudar o desenvolvimento de algoritmos para a resolução de grandes e complexos problemas nos computadores: são as técnicas de desenvolvimento estruturado de algoritmos. • Objetivos: – facilitar o desenvolvimento dos algoritmos; – facilitar o seu entendimento pelos humanos; – antecipar a comprovação da sua correção; – facilitar a sua manutenção e a sua modificação; – permitir que o seu desenvolvimento possa ser empreendido simultaneamente por uma equipe de pessoas. Algoritmos Estruturados • Para atingir estes objetivos, o desenvolvimento estruturado preconiza que: – os algoritmos sejam desenvolvidos por refinamentos sucessivos. Este desenvolvimento também se denomina “construção hierárquica de algoritmos” e “desenvolvimento de cima para baixo” (em inglês, topdown); – os sucessivos refinamento são módulos, que delimitam poucas funções e são o mais independente possível, isto é, conservam poucos vínculos com outros módulos; – nos módulos deve ser usado um número limitado de diferentes comandos e de diferentes estruturas de controle. Linguagens de Programação • Para armazenar um algoritmo na memória de um computador e para que ele possa, em seguida, comandar as operações a serem executadas, é necessário que ele seja programado, isto é, que seja transcrito para uma linguagem que o computador possa “entender”, direta ou indiretamente. • Os computadores só podem executar diretamente os algoritmos expressos em linguagem de máquina, que é um conjunto de instruções capazes de ativar diretamente os dispositivos eletrônicos do computador. • Compilador: é um programa que traduz o algoritmo escrito na linguagem escolhida para a linguagem de máquina • Interpretador: é um programa que interpreta cada comando do programa e executa uma série de instruções que a ele correspondem.