• Nenhum resultado encontrado

2.4 Resolução de Problemas no Contexto de Programação

2.4.1 Problemas Bem Definidos

Para nós, um problema de programação é bem definido quando seu enunciado apresenta as infor- mações necessárias ao seu entendimento, deixando claro o que deve ser feito.

Na disciplina introdutória de programação é comum os professores adotarem problemas bem definidos [O’Kelly and Gibson 2006; Falkner and Palmer 2009]. São exemplos de típicos problemas

2.4 Resolução de Problemas no Contexto de Programação 16

utilizados nessa disciplina: verificar se um número é primo, apresentar as raízes reais de uma equação de segundo grau, calcular o fatorial de um número e informar o tipo de um triângulo. No Quadro 2.4, nós apresentamos o enunciado deste último problema, que solicita um programa para determinar a classificação de um triângulo quanto aos lados.

Quadro 2.4: Exemplo de problema bem definido.

Problema do Triângulo

Faça um programa que leia da entrada padrão os valores correspondentes às medidas dos lados de um triângulo. Verifique se esses valores formam um triângulo e, se formarem, determine se ele é eqüilátero, isósceles ou escaleno. Na saída deve ser impressa uma mensagem informando o tipo do triângulo e, no caso, em que as medidas não formem um triângulo deve ser exibida a seguinte mensagem: “Nao eh triangulo”.

Exemplos: Entradas lado 1 = 4 lado 2 = 9 lado 3 = 4 Saída Nao eh triangulo Entradas lado 1 = 1.5 lado 2 = 2 lado 3 = 2.5 Saída Triangulo escaleno

Problemas bem definidos são comuns em livros textos adotados nas disciplinas introdutórias de programação [Farrer 1999; Eckel 2006; de Oliveira 2008; Zelle 2004] e também em sites de maratonas de programação, tais como, o site disponível pelo SPOJ Brasil1e pela Universidade de Valladolid2.

Nos enunciados dos problemas bem definidos, eventuais requisitos que não estão explícitos po- dem ser ignorados na solução elaborada pelos estudantes, ou aceitos pelo professor independente- mente da forma que os estudantes os implementaram no programa. Por exemplo, no problema do

1http://br.spoj.pl/ 2

2.4 Resolução de Problemas no Contexto de Programação 17

triângulo (Quadro 2.4) não está especificado se o programa deve exibir a classificação do triângulo apenas uma vez, ou se deve permitir ao usuário verificar outras entradas. Também não está especi- ficado se o programa deve tratar entradas não numéricas. Como estes requisitos não são o cerne do problema, são geralmente aceitas qualquer uma das alternativas implementadas pelos estudantes.

Para exemplificar essa situação, apresentamos dois exemplos de programas que foram escritos na linguagem Python e que solucionam o problema do triângulo apresentado no Quadro 2.4. Na primeira solução (Código Fonte 2.1), o estudante implementa o que é solicitado no problema e trata o caso do usuário digitar entradas alfabéticas, conforme pode ser observado nas linhas 3, 10 e 17 do código fonte do programa. Nesta solução, o programa não oferece opção para o usuário escolher se deseja ou não verificar a classificação de outro triângulo.

Código Fonte 2.1: Programa do Triângulo (Solução 1).

1 w h i l e T r u e :

2 l a d o 1 = r a w _ i n p u t ( "lado 1 = " ) 3 i f n o t ( l a d o 1 . i s a l p h a ( ) ) : 4 i f ( f l o a t ( l a d o 1 ) > 0 ) : 5 break

6 p r i n t "Digite novamente. Apenas numeros sao validos." 7 8 w h i l e T r u e : 9 l a d o 2 = r a w _ i n p u t ( "lado 2 = " ) 10 i f n o t ( l a d o 2 . i s a l p h a ( ) ) : 11 i f ( f l o a t ( l a d o 2 ) > 0 ) : 12 break

13 p r i n t "Digite novamente. Apenas numeros sao validos." 14 15 w h i l e T r u e : 16 l a d o 3 = r a w _ i n p u t ( "lado 3 = " ) 17 i f n o t ( l a d o 3 . i s a l p h a ( ) ) : 18 i f ( f l o a t ( l a d o 3 ) > 0 ) : 19 break

20 p r i n t "Digite novamente. Apenas numeros sao validos." 21

22 i f ( f l o a t ( l a d o 1 ) < f l o a t ( l a d o 2 ) + f l o a t ( l a d o 3 ) ) and ( f l o a t ( l a d o 2 ) < f l o a t ( l a d o 1 ) + f l o a t ( l a d o 3 ) ) and ( f l o a t ( l a d o 3 ) < f l o a t ( l a d o 1 ) + f l o a t ( l a d o 2 ) ) :

2.4 Resolução de Problemas no Contexto de Programação 18 23 i f f l o a t ( l a d o 1 ) == f l o a t ( l a d o 2 ) : 24 i f f l o a t ( l a d o 1 ) == f l o a t ( l a d o 3 ) : 25 p r i n t "Triangulo equilatero" 26 e l s e: 27 p r i n t "Triangulo isosceles" 28 e l s e: 29 i f f l o a t ( l a d o 2 ) == f l o a t ( l a d o 3 ) : 30 p r i n t "Triangulo isosceles" 31 e l s e: 32 p r i n t "Triangulo escaleno" 33 e l s e: 34 p r i n t "Nao eh triangulo"

Na segunda solução (Código Fonte 2.2), o estudante implementa o programa utilizando funções e permite que o usuário escolha se deseja ou não verificar a classificação de outros triângulos. Essa opção é implementada nas linhas 44 a 52 do código fonte do programa. Diferentemente do código 2.1, essa segunda solução não verifica o caso do usuário digitar um valor alfabético para as entradas. É verificado apenas se as medidas dos lados do triângulo são positivas e maiores que zero, conforme as linhas 16 a 35 do código fonte.

Embora o design das duas soluções seja diferente e ambas incorporem uma ou outra funcionali- dade adicional, as informações contidas no enunciado são suficientes para que os estudantes saibam o que deve ser feito.

Código Fonte 2.2: Programa do Triângulo (Solução 2).

1 d e f e h _ t r i a n g u l o ( a , b , c ) : 2 r e t u r n ( a < b + c ) and ( b < a + c ) and ( c < a + b ) 3 4 d e f c l a s s i f i c a _ t r i a n g u l o ( a , b , c ) : 5 i f a == b : 6 i f a == c : 7 r e t u r n "Triangulo equilatero" 8 e l s e: 9 r e t u r n "Triangulo isosceles" 10 e l s e: 11 i f b == c : 12 r e t u r n "Triangulo isosceles" 13 e l s e:

2.4 Resolução de Problemas no Contexto de Programação 19 14 r e t u r n "Triangulo escaleno" 15 16 d e f e n t r a d a ( ) : 17 w h i l e T r u e : 18 l a d o 1 = r a w _ i n p u t ( "lado 1 = " ) 19 i f ( f l o a t ( l a d o 1 ) > 0 ) : 20 break

21 p r i n t "Digite novamente. Apenas numeros > 0 sao validos." 22

23 w h i l e T r u e :

24 l a d o 2 = r a w _ i n p u t ( "lado 2 = " ) 25 i f ( f l o a t ( l a d o 2 ) > 0 ) :

26 break

27 p r i n t "Digite novamente. Apenas numeros > 0 sao validos." 28

29 w h i l e T r u e :

30 l a d o 3 = r a w _ i n p u t ( "lado 3 = " ) 31 i f ( f l o a t ( l a d o 3 ) > 0 ) :

32 break

33 p r i n t "Digite novamente. Apenas numeros > 0 sao validos." 34 35 r e t u r n f l o a t ( l a d o 1 ) , f l o a t ( l a d o 2 ) , f l o a t ( l a d o 3 ) 36 37 c o n t i n u a = T r u e 38 w h i l e T r u e : 39 l a d o 1 , l a d o 2 , l a d o 3 = e n t r a d a ( ) 40 i f e h _ t r i a n g u l o ( l a d o 1 , l a d o 2 , l a d o 3 ) : 41 p r i n t c l a s s i f i c a _ t r i a n g u l o ( l a d o 1 , l a d o 2 , l a d o 3 ) 42 e l s e: 43 p r i n t "Nao eh triangulo" 44 w h i l e T r u e :

45 r e s p o s t a = r a w _ i n p u t ( "Deseja ver a classificacao de outro triangulo [s/n]? ")

46 i f ( s t r . u p p e r ( r e s p o s t a ) i n [ ’S’ , ’N’ ] ) : 47 break

48 p r i n t "Digite apenas s ou n" 49 i f s t r . u p p e r ( r e s p o s t a ) == ’S’ :

2.4 Resolução de Problemas no Contexto de Programação 20

50 c o n t i n u a == T r u e 51 e l s e:

52 break

Entendimento de Problemas Bem Definidos

Problemas de programação bem definidos simplificam a fase de entendimento. Ao lerem o enunciado, os estudantes podem identificar facilmente as partes principais do problema e identificar também “o que” deve ser feito.

Admitindo a estratégia de diálogo de Pólya, descrita na Seção 2.3, vamos supor que o estudante ao se defrontar com o problema do triângulo, apresentado no Quadro 2.4, se disponha a entendê-lo de forma autônoma. Para isso, ele estabelece um diálogo consigo mesmo a fim de compreender o que está sendo solicitado. Nós exemplificamos esse diálogo no Quadro 2.5. Como podemos observar, baseado na leitura do enunciado, o estudante pode identificar o objetivo do programa, as entradas e saídas e suas restrições, os rótulos que devem ser exibidos para entrada de dados e a forma como as mensagens devem ser exibidas na saída (linhas 1 a 10 do diálogo).

Quadro 2.5: Diálogo do estudante consigo mesmo sobre o problema bem definido.

Diálogo

1 Estudante: O que o meu programa precisa fazer?

2 Estudante: Humm... verificar se o triângulo é isósceles, equilátero ou escaleno.

3 Estudante: Será que é só isso?

4 Estudante: Eita, preciso dizer também se as medidas não formam um triângulo.

5 Estudante: Qual são as entradas?

6 Estudante: As medidas dos lados do triângulo.

7 Estudante: O que eu preciso imprimir na saída?

8 Estudante: Uma mensagem informando o tipo do triângulo ou se não é um triângulo.

9 Estudante: Como devem ser chamadas as medidas do triângulo?

10 Estudante: lado1, lado2, lado3.

11 Estudante: Como eu vou determinar se é triângulo sabendo apenas os lados?

12 Estudante: Eu já esqueci isso, vou pesquisar na Internet.

13 Estudante: Preciso de mais alguma coisa?

14 Estudante: Bom, eu pego o que diz a matemática e traduzo para a programação. Agora é

2.4 Resolução de Problemas no Contexto de Programação 21

Há um aspecto que não está evidente no enunciado do problema (Quadro 2.4): como determinar o tipo do triângulo sabendo apenas as medidas dos lados? Essa informação pode ser facilmente esclarecida com base no conhecimento prévio do estudante, ou com uma simples consulta em livros ou na Web. Como apresentamos no diálogo (linhas 11 e 12 do Quadro 2.5), o estudante opta por consultar a Web. Uma vez que essa informação é obtida, caberá ao estudante focar no espaço da solução, isto é, traduzir os conceitos matemáticos para o contexto de programação e viabilizar a construção do programa. Esses aspectos são enfatizados nas linhas 13 a 15 do diálogo.

Desta forma, podemos concluir que problemas de programação bem definidos têm seu entendi- mento facilitado, pois o enunciado contém as informações que os estudantes necessitam para com- preender o que deve ser feito.

A etapa de entendimento é, portanto, similar ao que foi proposto por Pólya (Seção 2.3): uma fase de familiarização, na qual os estudantes devem tomar conhecimento do enunciado do problema; e, uma fase de aperfeiçoamento do entendimento, na qual os estudantes vão extrair do enunciado as informações relevantes. Com pouco trabalho sendo requisitado no espaço do problema, os estudantes acabam concentrando seus esforços e atenção no espaço da solução.