Prévia do material em texto
C A P Í T U L O O raciocínio e as formas de resolução de problemas “Quando o único instrumento que você tem é um martelo, todo problema que aparece você trata como um prego.” Mark Twain Saber as fases e as estratégias de resolução de um problema auxilia a construir novas ferramentas mentais para compreender e resolver novos problemas. Quanto mais você praticar, mais ferramentas terá e mais problemas conseguirá resolver. É uma bola de neve! O bj e t i v o s do c a p í tu l o ■ Compreender e utilizar, implícita ou explicitamente, as fases típicas para resolução de problemas. ■ Desenvolver estratégias específicas para tratar cada tipo de problema. ■ Resolver problemas simples e complexos, utilizando o formalismo algorítmico apropriado. Para começar Você já parou para pensar na situação onde tem que decidir sobre um determinado caminho ou na escolha de um médico ou especialista para resolver um problema grave? Na ilustração, qual médico a mãe com a filha doente escolherá? Um médico mais experiente com anos de atendimento, ou um jovem recém-formado que acabou de instalar sua clínica? Em mais de /0% dos casos, a escolha é a do médico mais experiente. Você já pensou em por que isso ocorre? Nós nos sentimos mais seguros quando recorremos a pessoas que possuem mais experiência. Pessoas que já passaram por muitas situações, problemas e casos conseguem resolver uma gama maior de problemas, com mais assertividade, em virtude da vivência, ou melhor, da prática. Isso também ocorre na área de computação, em desenvolvimento de algoritmos e programas de computador. Quanto mais você pratica, mais variedade de problemas consegue resolver. A prática leva à excelência. O que descreveremos nesse capítulo é que a resolução de problemas passa por uma série de etapas. Saber reconhecê-las e utilizá-las, mesmo que implicitamente, traz mais segurança à solução. Em seguida, será visto que existem várias formas de expressar a solução algorítmica de um problema. Por fim, serão apresentados alguns problemas e suas soluções. Vamos em frente! Conhecendo a teoria para programar Quando examinamos uma série de livros de programação ou algoritmos, nos deparamos frequentemente com uma série de orientações dos passos necessários para resolvermos problemas ou encontrarmos soluções algorítmicas. Uma das mais encontradas é a seguinte sequência de passos: :. Compreender o problema. ;. Identificar as entradas do problema, ou seja, as informações necessárias ou fornecidas para resolvermos o problema. . Construir o algoritmo ou a sequência de passos possibilita a transformação do passo =. ?. Testar o algoritmo em várias situações. Ao ler a sequência de passos descrita para a resolução de problemas, dificilmente uma pessoa que tenha dificuldades em resolver problemas conseguirá êxito apenas lendo essa receita. Precisamos de um pouco mais Uma sequência um pouco mais detalhada poderia ser a seguinte: :. Leitura superficial ou mais profunda do enunciado, com a finalidade de compreender exatamente o que se deseja resolver. ;. Levantamento das hipóteses de resolução. . Rever todos os passos anteriores. É fundamental que, para cada hipótese, sejam registrados os passos realizados para tentar resolver o problema. ?. Concluir com a resolução mais adequada. Parece um pouco mais completo, mas ainda é difícil. Na verdade, o processo de resolução de problemas é uma subdivisão do que chamamos de pensamento crítico. Enquanto o pensamento crítico trabalha com estratégias de longo prazo, o processo de resolução de problemas trabalha com questões mais imediatas. Isso implica que, ao resolvermos um determinado problema, devemos nos ater apenas às variáveis e ao contexto sugerido. Foco é a palavra-chave. Muitas vezes podemos pensar que as pessoas que possuem boa capacidade de resolver problemas o fazem, pois faz parte de sua intuição. Mas isso não é verdade. Já foi provado que a utilização sistemática de passos para resolver problemas traz soluções mais precisas e bem sucedidas do que pessoas que as encontram intuitivamente. Mas quais seriam esses passos? Podemos dividir em dois conjuntos. Um primeiro conjunto seriam os passos genéricos que serviriam para quaisquer tipos de problemas a serem resolvidos. Um segundo conjunto seriam os problemas matemáticos, que frequentemente necessitam de passos mais específicos para sua solução. Passos para resolução genérica de problemas :. Saiba o que deve ser feito: identificar o problema certo a resolver é frequentemente onde as pessoas se deparam com as maiores dificuldades. Entender exatamente o que deve ser feito não é tão simples quanto pode parecer. Pense em um problema complexo. Pode haver algumas centenas de possibilidades para se resolver esse problema. Fazer as perguntas certas e ser um bom detetive ajuda a enquadrar o problema com precisão. Essa etapa envolve o entendimento correto do que se espera resolver. Não avance se você não entendeu completamente o problema. O bom resolvedor de problemas faz muitas perguntas sobre qual é de fato o problema, em vez de adivinhar e já tomar decisões rápidas. Vá com calma! ;. Imagine a(s) solução(ões): é o que muitos autores falam do processo de abstração. Abstrair é formar as imagens mentais do problema e dos possíveis passos para resolvê-lo. Faça uma lista reduzida do que o problema pode ser e sobre todas as possíveis soluções. Este não é o momento de avaliar as soluções... apenas identificá-las. O processo cognitivo de gerar ideias não é o mesmo para avaliá-las e ambos não podem funcionar ao mesmo tempo. Ambos são processos críticos. Faça um, depois o outro. a seguir, na Figura ;.:. � FIGURA �.� Passos para resolução de problemas matemáticos. Adaptado de Simões (����) Para exemplificar essa sequência de passos, vamos resolver um problema simples: “Um buquê de flores com " rosas e # margaridas custou R$ &',''. Sabendo que cada margarida custou R$ ),'' a mais do que uma rosa, determine o preço de cada rosa e de cada margarida.” Dado o problema acima, vamos resolvê-lo seguindo os / passos (adaptado de Simões, ;00?): �°. Ler o enunciado do problema Um buquê de flores com ? rosas e = margaridas custou R$ >0,00. Sabendo que cada margarida custou R$ 0,00. Também deve-se interpretar e entender que uma margarida custou 0,00 R$ Y) ENTAO ESCREVA (X) SENAO ESCREVA (Y) FIMSE FIMALGORITMO Agora é com você. Veja os exemplos e exercícios propostos. Faça! Exercite! Vamos programar VisuAlg As implementações em VisuAlg são bem semelhantes ao desenvolvido em Português Estruturado. Como qualquer linguagem, existe uma estrutura a ser seguida. Em VisuAlg a estrutura é a seguinte: ALGORITMO “nome do algoritmo” VAR INÍCIO FIMALGORITMO Os dois exemplos que tratamos ao longo do capítulo e suas implementações em VisuAlg ficariam da seguinte forma: Primeiro: ALGORITMO “SOMA” VAR X,Y: INTEIRO INICIO LEIA (X) LEIA (Y) S Y) ENTAO ESCREVA (X) SENAO ESCREVA (Y) FIMSE FIMALGORITMO Note que o nome do algoritmo deve ser o mais sucinto possível, e deve expressar o que o algoritmo vai fazer. O espaço reservado para a declaração das variáveis (VAR) vem antes do início efetivo do algoritmo, pois o interpretador deve saber todos os símbolos ou rótulos que serão utilizados ao longo do algoritmo para não confundir ou fazer uma má interpretação, podendo indicar um erro de digitação. Tente executar o VisuAlg e implementar os códigos acima. Execute e veja o que acontece. Note que tais estruturas serão melhor explicadas ao longo dos próximos capítulos. Bom estudo! Pascal As implementações em LinguagemPascal trazem uma boa semelhança ao desenvolvido em Português Estruturado. Entretanto são comandos em língua inglesa. Também, como qualquer linguagem de programação, existe uma estrutura a ser seguida. Em linguagem Pascal a estrutura é a seguinte: program var begin end. Os dois exemplos que tratamos ao longo do capítulo e suas implementações em linguagem Pascal ficariam da seguinte forma: Primeiro: program SOMA var X,Y,S: integer; begin readln(X); readln(Y); S := X + Y; writeln(S); end. Segundo: program MAIOR var X,Y: integer; begin readln(X); readln(Y); if (X > Y) then writeln(X) else writeln(Y); end. Note que o nome do programa, assim como em VisuAlg, deve ser o mais sucinto possível, e deve expressar o que o programa vai fazer. O espaço reservado para a declaração das variáveis (var) funciona da mesma forma que em VisuAlg, informando para o compilador que tais rótulos serão utilizados ao longo do programa. Tente executar o DEV-Pascal e implementar os códigos acima. Execute e veja o que acontece. Note que tais estruturas serão melhor explicadas ao longo dos próximos capítulos. Bom estudo! C As implementações em Linguagem C trazem certa semelhança ao desenvolvido em Português Estruturado e Linguagem Pascal. Entretanto, na Linguagem C, o compilador trabalha com funções (veremos esses conceitos nos capítulos a seguir). Dessa forma, existe uma função especial chamada main (principal), pela qual a execução do programa em Linguagem C é iniciada. Assim, também, como qualquer linguagem de programação, existe uma estrutura a ser seguida. Em linguagem C a estrutura é a seguinte: #include main() { } Os dois exemplos que tratamos ao longo do capítulo e suas implementações em linguagem C ficariam da seguinte forma: Primeiro: #include main() { int X,Y,S; scanf(“%d”, &X); scanf(“%d”, &Y); S = X + Y; printf(“%d”, S); } Segundo: #include main() { int X,Y; scanf(“%d”, &X); scanf(“%d”, &Y); if (X > Y) { printf(“%d”, X); } else { printf(“%d”, Y); } } Note que não existe um espaço específico para a declaração das variáveis, como em VisuAlg ou Pascal. A regra é: antes de utilizar uma determinada variável, ela deve ser declarada. Tente executar o DEV-C/C + + e implementar os códigos acima. Execute e veja o que acontece. Note que tais estruturas serão melhor explicadas ao longo dos próximos capítulos. Bom estudo! Java As implementações em Linguagem Java trazem uma certa semelhança às desenvolvidas em Linguagem C. Entretanto, na Linguagem Java, estamos trabalhando com uma linguagem orientada a objetos, e assim, tudo deve ser transformado em objetos. Para tanto, as construções devem ser desenvolvidas em classes (que no processo de instanciação são transformadas ou concretizadas em objetos). Existe sempre uma classe principal (que tem o nome do arquivo ou projeto). Dentro dessa classe, uma função principal (main) por onde a execução é iniciada. Vamos trabalhar com a forma mais simples, focando sempre o desenvolvimento do raciocínio algorítmico. Assim, a estrutura que vamos trabalhar da linguagem Java é a seguinte: import public class { public static void main (String[] args) { } } Os dois exemplos que tratamos ao longo do capítulo e suas implementações em linguagem Java ficariam da seguinte forma: Primeiro: import java.util.*; public class Prog: { public Prog:() { } public static void main(String[] args) { int x, y, s; Scanner dado; dado = new Scanner(System.in); x = dado.nextInt(); dado = new Scanner(System.in); y = dado.nextInt(); s = x + y; System.out.println(s); } } Segundo: import java.util.*; public class Prog: { public Prog:() { } public static void main(String[] args) { int x, y; Scanner dado; dado = new Scanner(System.in); x = dado.nextInt(); dado = new Scanner(System.in); y = dado.nextInt(); if (x > y){ System.out.println(x); }else { System.out.println(y); } } } Note que em Java, assim como em C, não existe um espaço específico para a declaração das variáveis. A regra é a mesma: antes de utilizar uma determinada variável, ela deve ser declarada. Tente executar o JCreator LE e implementar os códigos acima. Execute e veja o que acontece. Note que tais estruturas serão melhor explicadas ao longo dos próximos capítulos. Bom estudo! PHP As implementações em Linguagem PHP trazem uma certa semelhança às desenvolvidas em Linguagem C. Entretanto, na Linguagem PHP, os comandos são interpretados linha a linha e o foco são sempre os resultados a serem exibidos no navegador. Lembre-se que os programas em PHP são executados no servidor e o resultado é exibido no navegador (browser). Como qualquer linguagem de programação, existe uma estrutura a ser seguida. Em linguagem PHP a estrutura é a seguinte: ?> Os dois exemplos que tratamos ao longo do capítulo e suas implementações em linguagem PHP ficariam da seguinte forma. Note que os valores não serão inseridos pelo usuário, mas pela atribuição dos valores às variáveis. Mais à frente mostraremos como isso pode ser feito, utilizando formulários HTML. Primeiro: Segundo: $Y) { print $X; } else { print $Y; } ?> Note que a primeira vez que se utiliza uma variável e o valor que a ela é atribuído, acontece a declaração (ou o registro) da mesma. Tente executar o DEV-PHP e implementar os códigos acima. Execute e veja o que acontece. Não se esqueça de executar e colocar o servidor Apache rodando antes de executar os programas em PHP. Note que tais estruturas serão melhor explicadas ao longo dos próximos capítulos. Bom estudo! Para fixar Dados os problemas a seguir: :) Um furgão de um frigorífico tem a capacidade de transportar ;00 peças de frios ou >00 potes de manteiga. Você acabou de ser contratado pelo dono do frigorífico para desenvolver um algoritmo que possibilite o planejamento adequado do transporte dos produtos. Geralmente, se tem uma quantidade do pedido (frios ou potes). O algoritmo deve calcular e fornecer a quantidade do segundo produto (para que o furgão sempre transporte sua capacidade máxima). ;) Um fazendeiro acabou de montar um cercado. Nele, o fazendeiro colocou galinhas e coelhos compartilhando o mesmo espaço. O fazendeiro gostaria que você fizesse um algoritmo que determinaria a quantidade de coelhos e a quantidade de galinhas, apenas informando os números totais de cabeças e de pés existentes no cercado. Resolva-os, usando os / passos: : Ler o enunciado do problema. ; Interpretar o texto e as imagens. Escrever as equações. ? Resolver o sistema de equações. f Indicar as equações e o domínio. O Indicar a solução do problema. / Responder ao problema. Em seguida, faça os algoritmos em fluxograma e em português estruturado. Algoritmos no cotidiano o o o o o o o o o Biologicamente, nosso organismo, assim como todos os organismos vivos, tentam fazer ou tomar ações que resultem no menor caminho e no menor desgaste possível, seja a curto ou longo prazo. Fazem sempre as coisas mais simples possíveis. O lógico e frade franciscano inglês William de Ockham, no século XIV, postulou um princípio conhecido como “A Navalha de Ockham”. Nesse princípio, Ockham afirma que a explicação para qualquer fenômeno deve assumir apenas as premissas estritamente necessárias à explicação do fenômeno eeliminar todas as que não causariam qualquer diferença aparente nas predições da hipótese ou teoria. Quando você for desenvolver seus algoritmos, tente aplicar esse princípio. Comece sempre pela resolução mais simples. Só depois tente melhorá-la. Navegar é preciso WIKIPEDIA. Fluxograma. Disponível em: . Acesso em: 0;/0O/;0::. Você já viu o filme “A Rede Social”? Se não, assista-o e veja como saber programar é fundamental para o desenvolvimento de soluções algorítmicas que podem, além de resolver problemas, se transformar em grandes sistemas utilizados por pessoas de todo o mundo, como é o Facebook. E xe rc í c i o s p ro p o st o s Resolva os problemas a seguir, construindo os algoritmos necessários para encontrar uma possível solução. :. Faça um algoritmo que leia dois números e escreva (devolva como resultado) o menor deles. ;. Faça um algoritmo que receba o salário de um funcionário, calcule e mostre o novo salário, sabendo-se que este sofreu um aumento de :>,%. =. Faça um algoritmo que receba dois valores nas variáveis A e B respectivamente, troque o valor contido na variável A pelo valor em B, e o valor em B pelo valor em A, isto é, ao final do algoritmo, A e B terão os valores trocados. >. Num triângulo retângulo, segundo Pitágoras, o quadrado da hipotenusa (a) é igual a soma dos quadrados dos catetos (b e c), isto é, a = b + c . Faça um algoritmo, receba os valores dos catetos e imprima o valor da hipotenusa. Referências KNUTH DE. The art of computer programming. Reading, MA: Addison-Wesley; :/?O. MIZRAHI VV. Treinamento em linguagem C. São Paulo: Pearson Prentice Hall; ;00O. SIMÕES, A. (;00?) Os alunos não sabem resolver problemas? Disponível em: . Acesso em: :0/:;/;0::. E xe rc í c i o s a d i c i o n a i s Resolva os exercícios a seguir, construindo os algoritmos, na linguagem de programação de sua preferência, que encontrem uma possível solução. :. Faça um algoritmo que receba o ano de nascimento de uma pessoa e o ano atual, calcule e mostre: a. a idade dessa pessoa em anos; b. a idade dessa pessoa em meses; ; ; ; c. a idade desta pessoa em dias; d. a idade dessa pessoa em semanas. ;. João recebeu seu salário e precisa pagar duas contas que estão atrasadas. Como as contas estão atrasadas, João terá de pagar multa de ;% sobre cada conta. Faça um algoritmo que receba os valores do salário e os valores iniciais de cada uma das contas. O algoritmo deve calcular e mostrar quanto restará do salário de João após pagar as duas contas.