Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.

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.

Mais conteúdos dessa disciplina