Você está na página 1de 4

Representando Padres em um Ambiente de Apoio Aprendizagem de Programao

Thais Helena Chaves de Castro 1, Alberto Nogueira de Castro Jnior 2, Credin Silva de Menezes 1
1

Mestrado em Informtica Universidade Federal do Esprito Santo (UFES) Caixa Postal 01-9011 29060-970 Vitria ES Brasil {thaish, credine}@inf.ufes.br

Departamento de Cincia da Computao Universidade Federal do Amazonas (UFAM) Av. Gal. Rodrigo O. J. Ramos, 3000 69077-900 Manaus AM Brasil albertoc@dcc.fua.br

Resumo. Este artigo descreve uma pesquisa sobre padres para representao de programas no contexto do aprendizado de programao por estudantes iniciantes. Ao longo de uma experincia de cerca de dez anos de ensino de programao para iniciantes, colecionamos classes de problemas e esqueletos de programas desenvolvidos pelos estudantes. Portanto, no contexto da arquitetura SAAP, descrevemos uma proposta de linguagem ou pseudolinguagem para a representao dessas classes de problemas e esquemas de programas utilizando a linguagem funcional Haskell. Palavras Chave: padres de programa, esquemas de programa, programao funcional.

1. Introduo
No aprendizado de programao est envolvido o desenvolvimento de diferentes habilidades, principalmente a capacidade de abstrao. Para desenvolver essa habilidade optamos pela utilizao de uma linguagem funcional, que julgamos mais adequada a esse primeiro contato do estudante com programao, estimulando-o a escrever programas para resolver problemas geomtricos. Aps anos aplicando disciplinas introdutrias, vimos que a utilizao de esqueletos ou esquemas de programas pode auxiliar professores e estudantes no melhor entendimento dos conceitos de programao. Na prxima seo ( Seo 2) mostramos uma viso geral da pesquisa em padres e esquemas de programa. Na Seo 3 damos direes de como representar padres em linguagem funcional. Finalmente, na Seo 4 propomos uma linguagem para representao de esquemas de programa, utilizando Haskell.

2. Padres e Esquemas de Programa


Em diversos trabalhos so descritas representaes de programas ou trechos de programas atravs de esquemas genricos. Nesta seo, mostramos uma viso geral sobre o uso de esquemas de programa, relacionando-os aos trabalhos mais relevantes para o aprendizado de programao. Uma forma clssica de derivao de esquemas a semi-formal, como a apresentada em [Dershowitz 1985], onde so mostrados passos para abstrair um esquema a partir de um ou mais programas, por analogias, onde as invariantes e provas de correo desempenham um papel importante. O primeiro a

XIII Simpsio Brasileiro de Informtica na Educao SBIE UNISINOS 2002

558

fazer tentar identificar exatamente quais ocorrncias de smbolos nos programas so anlogas. Ento, as transformaes devem ser feitas somente para as mais relevantes. O problema que para isto ser possvel, precisa-se de informao sobre como os programas originais foram construdos. O processo de abstrao comea com um conjunto de programas, que, segundo o autor, pode ser um ou vrios. aceitvel a abstrao a partir de um nico programa, de alguma forma escolhendo smbolos de especificao para serem abstrados e permanecendo para que sejam examinadas as conseqncias. O uso de mais programas reduz a arbitrariedade, garantindo que somente partes anlogas sejam abstradas. J em [Michaelson 1996] so mostrados padres informais em linguagem funcional (ML), descrevendo meta operaes, como operaes com listas. O trabalho tem o objetivo de facilitar o aprendizado dos estudantes iniciantes em programao, tentando eliminar as mal-compreenses. Seguindo a mesma linha de trabalho que Michaelson, em [Bielikov e Nvrat 1998] argumentado que o estudante aprende mais com uma abordagem baseada em esquemas, atravs da instanciao de modelos gerais, apresentados previamente a ele. Aps um dado esquema de programa ser introduzido, solicitado que os estudantes instanciem o esquema como um exerccio de escrita e, depois, como um exerccio de programao. Esse trabalho de Bielikov e Nvrat apresenta esquemas de programa conhecidos em LISP e Prolog, sem formalismos ou regras de derivao, mostrando apenas algumas etapas para sua elaborao, refinando as generalizaes. Em outro trabalho interessante [Abd-El-Hafiz 1997] apresentado um estudo comparativo entre duas tcnicas de decomposio de programas. A primeira a decomposio de loops em eventos, que so fragmentos parcialmente ordenados. A outra program slicing, um mtodo de decomposio automtica de um programa, analisando seu controle e fluxo de dados. As trs principais diferenas entre slices e eventos so quanto representao, ordem e tamanho, mas uma vantagem em um compensa uma desvantagem em outro. Como descrito por [Bielikov e Nvrat 1998], esquemas informais para iniciantes precisam se restringir a problemas nos quais: (i) os nicos tipos de dados so listas, incluindo tomos (nmeros ou smbolos); (ii) sem recurso indireta; (iii) sem operaes com efeito colateral (como entrada/sada). Apesar de haver essas restries de abstrao, que precisam ser graduais, para representaes informais de esquema, entendemos que esse tipo de representao mais adequado ao processo ensinoaprendizagem de programao, pela possibilidade de se utilizar a prpria linguagem de programao adotada em uma disciplina para descrever tais esquemas.

3. Representando Padres
Como visto na seo anterior, esquemas tm sido largamente utilizados para representar padres de programas em linguagens imperativas e em lgica. Porm, nesta pesquisa, no encontramos padres de programas agrupados de acordo com nveis de complexidade, relacionados progresso natural na aprendizagem de estudantes em cursos introdutrios de programao. Nas instituies onde atuamos utilizamos o paradigma funcional na primeira disciplina de programao (Haskell), que ministrada para trs cursos: Cincia da Computao, Engenharia da Computao e Matemtica, conforme descrito em [Castro et al 2002a]. Ao longo dessa experincia de 10 anos, fomos identificando (i) a necessidade de agruparmos os problemas estudados em diferentes classes, representando nveis de experincia dos estudantes no decorrer da disciplina; e (ii) padres de respostas semelhantes entre si, instanciados a essas classes de problemas. Na etapa inicial, o curso de programao contempla problemas geomtricos, por serem de fcil visualizao. Estes problemas podem ser agrupados em, pelo menos, duas classes (Quadro 1): (i) problemas de determinao; e (ii) problemas de pertinncia. Partindo dessas classes iniciais, abstramos

XIII Simpsio Brasileiro de Informtica na Educao SBIE UNISINOS 2002

559

alguns esquemas de programas de respostas de estudantes a listas de exerccios, aplicadas nos ltimos semestres. Para descrever os padres de solues precisamos de uma linguagem. Um dos requisitos que esta linguagem seja amistosa o suficiente para que o prprio professor, que j conhece os principais tipos de programas de uma determinada classe de problemas, possa descrever seus esquemas em alto nvel. Estes padres sero ento transformados em esqueletos de programa em Haskell, a partir dos quais as solues dos alunos sero analisadas.

Problema: Considere dado um quadrado, paralelo aos eixos cartesianos, atravs de um ponto P onde suas diagonais se interceptam e um lado l. Considere que cada um de seus cantos o centro de uma circunferncia de raio igual metade do lado do quadrado. Pede-se: a) uma funo para determinar a rea do quadrado que circunscreve o conjunto formado pelo quadrado e a s circunferncia, que no coberta pelo conjunto (determinao); b) dado um ponto P1 qualquer, escreva uma funo verifica se P1 pertence regio interior ao quadro e exterior s circunferncias (verificao).

Quadro 1 - Exemplo de problemas geomtricos com questes de verificao e determinao

4. Proposta de uma Linguagem para Representao de Padres


Por no existir uma representao de padres para problemas geomtricos nem em Haskell nem em outra linguagem de programao, propomos uma linguagem para descrever as classes desses problemas e, posteriormente, outras classes a serem acrescentadas por um professor. A linguagem proposta est nos moldes dos esqueletos de programa em Prolog descritos por [Bowles et al 1994], contendo meta-funes, atravs da formao de pattern, no lugar da lgica de segunda ordem utilizada para os programas em Prolog. Essa linguagem foi modelada em BNF, sendo posteriormente submetido ao ALEX , um analisador lxico escrito em Haskell, e est em fase de validao no Happy, um validador de gramticas. Os padres representados nessa linguagem sero incorporados no ambiente SAAP [Castro et al 2002b], constituindo-se em uma ferramenta para autoria de esquemas, contendo uma interface para um professor de uma disciplina introdutria poder representar os padres encontrados por ele, utilizando uma classe de problemas j representada ou criando uma nova, sem precisar se ater a detalhes especficos da linguagem de programao.

5. Referncias

XIII Simpsio Brasileiro de Informtica na Educao SBIE UNISINOS 2002

560

ABD-EL-HAFIZ, S. Effects of Decomposition Techiques on Knowledge-Based Program Understanding. In: Proceedings of the International Conference on Software Maintenance. IEEE. 1997. BIELIKOV, M. e NVRAT, P. A Schema-Based Approach to Teaching Programming in Lisp and Prolog. In: Proceedings of PEG International Conference. pp. 22-29. 1997. BIELIKOV, M. e NVRAT, P. Use of Program Schemata in Lisp Programming: an Evaluation of its Impact on Learning. In: Informtica Journal, Vol. 9, Num. 1, pp. 5-20. 1998. BOWLES, A.; ROBERTSON, D.; VASCONCELOS, W.; VARGAS-VERAS, M. e BENTAL, D. Applying Prolog programming Techniques. In: International Journal Human-Computer Studies, Vol 41, pp. 329-350. 1994 CASTRO, T.; CASTRO Jr, A.; MENEZES, C.; BOERES, C. e RAUBER, C. Utilizando Programao Funcional em Disciplina Introdutrias de Computao. In: Proceedings of Workshop de Educao em Computao-CSBC. 2002a. CASTRO, T.; CASTRO Jr, A.; MENEZES, C. e CURY, D. Arquitetura SAAP Sistema de Apoio ao Aprendizado de Programao. In: Proceedings of Workshop de Informtica na Escola-CSBC 2002b. DERSHOWITZ, N. Program Abstraction and Instantiation. In: ACM Transactions on Programming Languages and Systems, Vol. 7, Num. 3, pp. 446-477. 1985. MICHAELSON, G. Automatic Analysis of Functional Program Style. In: Proceedings of the Australian Software Engineering Conference. IEEE. 1996.

XIII Simpsio Brasileiro de Informtica na Educao SBIE UNISINOS 2002

561

Você também pode gostar