ver/abrir - Repositório do Departamento de Ciência da Computação

Transcrição

ver/abrir - Repositório do Departamento de Ciência da Computação
Universidade de Brasília
Instituto de Ciências Exatas
Departamento de Ciência da Computação
Um Software Educacional para o Ensino de
Programação em C
Vinícius de Faria Sena
Monograa apresentada como requisito parcial
para conclusão do Bacharelado em Ciência da Computação
Orientador
Prof. Dr. Homero Luiz Píccolo
Brasília
2011
Universidade de Brasília UnB
Instituto de Ciências Exatas
Departamento de Ciência da Computação
Bacharelado em Ciência da Computação
Coordenador: Prof. Dr. Marcus Vinícius Lamar
Banca examinadora composta por:
Prof. Dr. Homero Luiz Píccolo (Orientador) CIC/UnB
Prof. Dra. Carla Denise Castanho CIC/UnB
Prof. Dra. Germana Menezes da Nóbrega CIC/UnB
CIP Catalogação Internacional na Publicação
Sena, Vinícius de Faria.
Um Software Educacional para o Ensino de Programação em C / Vinícius de Faria Sena. Brasília : UnB, 2011.
131 p. : il. ; 29,5 cm.
Monograa (Graduação) Universidade de Brasília, Brasília, 2011.
1. Tira-Teima, 2. softwares educacionais, 3. ensino de programação,
4. sistemas tutores inteligentes
CDU 004.4
Endereço:
Universidade de Brasília
Campus Universitário Darcy Ribeiro Asa Norte
CEP 70910-900
BrasíliaDF Brasil
Universidade de Brasília
Instituto de Ciências Exatas
Departamento de Ciência da Computação
Um Software Educacional para o Ensino de
Programação em C
Vinícius de Faria Sena
Monograa apresentada como requisito parcial
para conclusão do Bacharelado em Ciência da Computação
Prof. Dr. Homero Luiz Píccolo (Orientador)
CIC/UnB
Prof. Dra. Carla Denise Castanho
Prof. Dra. Germana Menezes da Nóbrega
CIC/UnB
CIC/UnB
Prof. Dr. Marcus Vinícius Lamar
Coordenador do Bacharelado em Ciência da Computação
Brasília, 14 de fevereiro de 2011
Dedicatória
Dedico aos meus pais por terem me ensinado o valor da educação.
i
Agradecimentos
Agradeço a Deus pela força, aos meus pais, Wirgílio e Beatriz, pelo apoio incondicional,
à minha irmã, Lorena, pela conança, à minha namorada, Paula, pela compreensão, à
Orelina pelo suporte, aos meus amigos pela companhia, ao meu orientador, Homero, pelos
ensinamentos, e a todos aqueles que de alguma forma contribuíram para esse trabalho
tornar-se possível.
ii
Resumo
Este trabalho mostra o aprimoramento de um software educacional utilizado no ensino
de programação o Tira-Teima. Essa ferramenta representa gracamente a execução de
um programa de computador. O Tira-Teima é uma das partes do TutorialICC, um tutorial
utilizado para ministrar a disciplina Introdução à Ciência da Computação na Universidade
de Brasília. Foi aumentado o grau de interatividade do Tira-Teima com o aluno criando-se
a possibilidade de se visualizarem diferentes uxos de execução de um mesmo programa,
o que acontece com estruturas de decisão e de repetição. Foram feitas também alterações
no Tira-Teima para que ele fosse compatível com a linguagem de programação C, além
da até então utilizada, o Pascal.
Palavras-chave: Tira-Teima, softwares educacionais, ensino de programação, sistemas
tutores inteligentes
iii
Abstract
This work shows the improvement of an educational software used to teach computer programming the Tira-Teima. This tool represents graphically the execution of
a computer program. The Tira-Teima is part of the TutorialICC, a tutor used to teach
introduction to computer science at the University of Brasília. The interactivity with
the student was increased by creating on Tira-Teima the possibility of viewing dierent execution ows from the same program, what happens when decision and repetition
structures are used. Changes were made so that Tira-Teima now is compatible with the
C programming language, in addition to the one already used, the Pascal.
Keywords: Tira-Teima, educational softwares, computer teaching, intelligent tutoring
systems
iv
Sumário
1 Introdução
1.1
1.2
Problemas e Justicativas .
Objetivos . . . . . . . . . .
1.2.1 Objetivos Gerais . .
1.2.2 Objetivos Especícos
2 Revisão da Literatura
2.1
2.2
2.3
2.4
2.5
2.6
2.7
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3.4
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Desaos no Processo de Ensino-Aprendizagem de Programação . . . . . . .
TutorialICC um software de apoio ao ensino-aprendizagem de programação
Tira-Teima o simulador de execução de programas do TutorialICC . . . .
2.3.1 Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.2 Funcionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.3 Arquitetura e Tecnologias Utilizadas . . . . . . . . . . . . . . . . .
Taxonomia de Softwares Educacionais . . . . . . . . . . . . . . . . . . . .
2.4.1 Taxonomia Geral . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4.2 CAI versus STI . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Sistemas Tutores Inteligentes . . . . . . . . . . . . . . . . . . . . . . . . . .
2.5.1 Denição e Características . . . . . . . . . . . . . . . . . . . . . . .
2.5.2 Perspectiva Histórica dos STI . . . . . . . . . . . . . . . . . . . . .
2.5.3 Arquitetura de um STI . . . . . . . . . . . . . . . . . . . . . . . . .
2.5.4 A Internet e os STI . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.5.5 Vantagens dos STI . . . . . . . . . . . . . . . . . . . . . . . . . . .
Levantamento de Soluções Semelhantes . . . . . . . . . . . . . . . . . . . .
2.6.1 Exposição e Avaliação Relacionadas ao Conteúdo . . . . . . . . . .
2.6.2 Mecanismos de Correção de Código . . . . . . . . . . . . . . . . . .
2.6.3 Simulação de Execução de Programas . . . . . . . . . . . . . . . . .
Classicação do TutorialICC e do Tira-Teima . . . . . . . . . . . . . . . .
3 Atualização do Tira-Teima
3.1
3.2
3.3
.
.
.
.
Metodologia . . . . . . . . . . . . . . . . . .
Preparação - Interpretando e Documentando
Portando o Tira-Teima para a linguagem C
3.3.1 Syntax highlighting . . . . . . . . . .
3.3.2 Representação de Ponteiros . . . . .
3.3.3 Melhorias na Visualização de Funções
Acrescentando Entrada de Dados do Usuário
v
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
2
3
3
3
4
4
5
7
7
8
10
11
11
13
17
17
19
20
26
27
28
29
29
29
29
33
33
34
35
36
37
39
41
3.5
3.6
Aceitando Percursos Variados para um Mesmo Programa
Criando condicionais, laços e repetições . . . . . . . . . .
3.6.1 Condicionais : Se-Senão (if -else ) . . .
3.6.2 Repetições : Enquanto (while ) . . . .
3.6.3 Repetições : Para (for . . . . . . . . .
Exempo
Exemplo
Exemplo
4 Conclusão
Referências
A Comandos Adicionados ao Tira-Teima
vi
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
43
44
45
45
46
49
51
54
Lista de Figuras
2.1
2.2
2.3
2.4
2.5
2.6
2.7
TutorialICC - Uma apresentação de seus módulos . . . . . . . . . . . . .
Módulo de Tutoria do TutorialICC . . . . . . . . . . . . . . . . . . . . .
Taxonomia de exemplos ilustrada em forma de árvore. . . . . . . . . . . .
Tira-Teima ferramenta de simulação de programas do TutorialICC . . .
Módulos de funcionamento do Tira-Teima. . . . . . . . . . . . . . . . . .
Exemplo de funcionamento do Tira-Teima. . . . . . . . . . . . . . . . . .
Taxonomia de programas educacionais, adaptada de Viccari and Giraa
(2003) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.8 Arquitetura de um STI proposta por Self, adaptada de Self (1999) . . . .
2.9 JavaTool compila um código a ele submetido e roda uma animação da
execução do código . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.10 Visualg compila um programa escrito em pseudo-código e mostra dados
de sua execução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. 5
. 6
. 6
. 7
. 8
. 10
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9
3.10
.
.
.
.
.
.
.
.
.
.
Principais etapas do modelo cascata, adaptada de Sommerville
Exemplo de highlighting em C . . . . . . . . . . . . . . . . . .
Exemplo de highlighting em Pascal . . . . . . . . . . . . . . .
Exemplo de highlighting em pseudocódigo. . . . . . . . . . . .
Exemplo de Representação Gráca de Ponteiros. . . . . . . . .
Exemplo de Representação de Funções. . . . . . . . . . . . . .
Exemplo de Representação de Entrada de Dados pelo Aluno. .
Exemplo de Comando do Tipo Se-Senão. . . . . . . . . . . . .
Exemplo de Comando do Tipo Enquanto. . . . . . . . . . . .
Exemplo de Comando do Tipo Para. . . . . . . . . . . . . . .
vii
(2007).
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
.
.
.
.
.
.
.
.
.
.
. 12
. 21
. 30
. 31
33
36
37
38
39
41
42
46
47
48
Lista de Tabelas
2.1
2.2
CAI x STI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Recursos de Inteligência Articial de Tutores Inteligentes, adaptada de Woolf (2007) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
A.1 Tabela de Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
viii
Capítulo 1
Introdução
Na Universidade de Brasília, departamento de Ciência da Computação, é ensinada a
disciplina ICC. Essa disciplina é ofertada a diversos cursos na Universidade, de modo que
nela se pretende introduzir no mundo da computação alunos que não são de computação.
Nela se ensinam conceitos gerais relacionados a esta área de conhecimento, tais como a
introdução a conceitos básicos como sistema de numeração binária, álgebra booleana,
algoritmos e, fundamentalmente, estruturas lógicas de programação, como estruturas
de decisão e repetição, juntamente com estruturas de dados simples, como conjuntos e
registros. Para isso, utiliza-se como ferramenta de treinamento a linguagem Pascal.
No segundo semestre de 2010 houve 12 turmas, totalizando 360 alunos que cursam
ICC. Com o objetivo de viabilizar a oferta de ICC a um maior número de alunos, além de
facilitar o ensino e aprendizagem desta disciplina, utiliza-se uma ferramenta de aprendizagem denominada TutorialICC (David and Bezerra 2008). Este tutorial agrega conceitos
de sistemas tutoriais inteligentes, interação humano-computador e usabilidade para prover
aos alunos e professores os meios de desenvolver as habilidades básicas de computação.
O TutorialICC lança mão, basicamente, dos seguintes recursos para ensinar: explanação
teórica, exemplos interativos categorizados por assunto e por níveis de diculdade, animações e avaliador (corretor) de programas feitos pelos alunos. Neste método, não há
aulas expositivas. O aluno é acompanhado por tutores em sessões de treinamento em
laboratório e faz as provas presencialmente, em laboratório também.
No TutorialICC, após a explicação teórica entremeada com animações interativas, são
mostrados aos alunos diversos exemplos de programação codicados na linguagem Pascal.
Os exemplos do TutorialICC são apresentados de acordo com uma taxonomia (Brandizzi
and Nuñez 2009), de modo a proporcionar aos alunos um aprofundamento condicional e
sucessivo do conceito ensinado. Com a nalidade de tornar mais interativos os exemplos,
desenvolveu-se uma ferramenta denominada Tira-Teima.
O Tira-Teima é um componente do TutorialICC em que é simulada, gracamente,
a execução de um programa de computador (Biller 2009). Nele o usuário navega pelos
passos do programa obtendo uma correspondência visual entre código fonte do programa
e um esquema gráco do programa executado. Desse modo, caminhando em uma linha de execução do programa, ao aluno é dada a oportunidade de visualizar como um
determinado programa de computador desenvolve-se.
O presente trabalho propõe-se a aprimorar o Tira-Teima. Uma das melhorias propostas para o Tira-Teima é portá-lo para que ele seja utilizado não somente com a linguagem
1
de programação Pascal, mas também com a linguagem C. Para tanto, tornar-se-á necessário melhorar a já existente representação de funções no programa, bem como implementar
uma representação de ponteiros, a qual ainda não está presente no Tira-Teima. Com isso
poderá ser utilizado o componente para ensinar também a linguagem C, o que é demanda
da Universidade de Brasília.
Outra melhoria pretendida com este trabalho é possibilitar ao usuário executar mais
de uma linha de execução possível de um programa, o que atualmente não é viabilizado.
Esses possíveis caminhos devem ser escolhidos de acordo com as entradas fornecidas pelo
aluno de modo que ele possa condicionar a execução do programa às suas entradas. A
importância desta última proposta reside no fato de que ela dotaria o Tira-Teima de um
maior grau de interatividade.1
1.1
Problemas e Justicativas
Um dos problemas relacionados ao Tira-Teima é que o Departamento de Ciência da
Computação da Universidade de Brasília pretende lecionar a disciplina Introdução à Ciência da Computação utilizando a linguagem de programação C. Pelo fato de o Tira-Teima
ter sido idealizado como uma ferramenta para utilização com códigos fonte Pascal, o
programa precisa de adaptações para poder ser portado para a nova linguagem utilizada.
Embora o programa utilize uma representação gráca que abranja de certo modo
qualquer linguagem estruturada, há nele direcionamentos e limitações que restringem sua
utilização para exemplos em Pascal. Duas principais características do programa limitam
seu uso: a representação incompleta de funções e a ausência de representação de ponteiros.
Soma-se a estas o fato de que o Tira-Teima só colore palavras chave da linguagem Pascal.
A importância de portar o programa para a linguagem C é viabilizar o ensino de ICC
nesta linguagem de modo a alinhar o uso do Tira-Teima com o planejamento do departamento referido. Aprimorar sua representação de funções dará um maior potencial didático
ao Tira-Teima. Além disso, passar a representar ponteiros será de suma importância para
o ensino da linguagem C, uma vez que eles são muito utilizados nesta linguagem. Segundo
Kernighan and Ritchie (1988), às vezes determinados algoritmos só podem ser representados em C com o uso de ponteiros, além de que com seu uso alguns códigos cam mais
compactos e ecientes do que se obtidos em outras formas.
Outro problema a ser abordado é a execução de estruturas condicionais no programa
no Tira-Teima. Neste, como está, é exibida ao aluno a representação de apenas uma linha
de execução do programa. Com isso, deparando-se com mais de uma possível forma de
caminhar pelo código (o que se dá em trechos condicionais e laços de repetição) o professor
escolhe uma dentre as possíveis e a mostra ao aluno. Isso de certa forma restringe o
potencial do exemplo ao impossibilitar que o aluno teste diferentes caminhos executáveis
dentro de um programa.
Importa, então, para o objetivo do Tira-Teima possibilitar uma execução
(diferentes caminhos para diferentes situações de um programa) e
(dependente
das entradas do usuário) de um determinado código fonte. A solução deste último problema também levaria a aproximar o TutorialICC, mais especicamente o Tira-Teima, de
condicional
interativa
1 Algumas
dessas melhorias foram sugeridas já por Biller (2009)
2
um sistema tutor inteligente, uma vez que tais sistemas caracterizam-se por se adaptarem
às necessidades dos alunos ao longo de seu uso (Self 1999).
1.2
Objetivos
Procura-se no presente trabalho alcançar os objetivos gerais apontados por meio dos
objetivos especícos detalhados a seguir.
1.2.1
Objetivos Gerais
1. Viabilizar no Tira-Teima a execução de um programa de acordo com entradas fornecidas pelo aluno, possibilitando a representação de mais de uma linha de execução
neste programa.
2. Tornar possível o uso da linguagem de programação C no Tira-Teima.
1.2.2
Objetivos Especícos
1. Representar a execução de estruturas condicionais e de repetição em um programa,
possibilitando ao aluno caminhar por diversas linhas de execução de um mesmo
programa.
2. Fornecer ao aluno meios de interação com um programa em execução no Tira-Teima
criando neste a possibilidade de rodar um programa de acordo com suas entradas.
3. Portar o Tira-Teima para a linguagem C de modo que ele trabalhe com códigos
fonte nesta linguagem.
4. Aprimorar a visualizacão de funções nos programas executados pela ferramenta
referida.
5. Implementar ponteiros na execução de programas no Tira-Teima.
3
Capítulo 2
Revisão da Literatura
2.1
Desaos no Processo de Ensino-Aprendizagem de
Programação
Como mostrado em Píccolo et al. (2010), professores cam muitas vezes desmotivados
e desencorajados a dar tais disciplinas, que são de serviço. Para isso eles precisam se desvincularem de suas linhas de pesquisa, encontrando muitas vezes alunos de outras áreas,
que não da computação. Normalmente professores substitutos acabam sendo aqueles que
ministram tais disciplinas, tendo em geral pouca experiência didática, apresentando ainda
forte rotatividade.
Como posto em Píccolo et al. (2010) os conceitos trabalhados em programação são
de difícil aprendizagem por parte dos alunos. O raciocínio lógico envolvido nessas disciplinas que introduzem a ciência da computação é de complexa transposição para um
programa real, o que acaba por desmotivar alguns desses alunos, o que provoca evasão da
disciplina, bem como alto índice de reprovação, quando comparado com outras disciplinas das universidades. Diversas diculdades são envolvidas na tarefa de programar, como
resolver problemas complexos usando algoritmos e dominar sintaxe de uma linguagem de
programação.
Outros problemas também são encontrados pelos professores que ministram tais disciplinas. Por exemplo, na Universidade de Brasília as turmas são heterogêneas, às vezes
participando delas alunos de cursos distintos, muitos dos quais não são estritamente ligados à computação. A grande quantidade de alunos por professor também se congura
como um problema no ensino dessas disciplinas.
A partir de tal situação, faz-se necessário pesquisar formas e ferramentas para o ensino
de disciplinas e cursos introdutórios de computação. Ao criar ferramentas de ensino que
utiliza ambientes colaborativos e inteligentes, cria-se uma proposta para solucionar os
problemas causados por essas disciplinas (Píccolo et al. 2010).
4
2.2
TutorialICC um software de apoio ao ensinoaprendizagem de programação
O TutorialICC é uma ferramenta utilizada na Universidade de Brasília para ministrar
Introdução à Ciência da Computação. No segundo semestre de 2010, 360 alunos, divididos em 12 turmas, utilizando o formato semi-presencial com a ajuda do TutorialICC,
participaram dessa disciplina. Não há aulas expositivas, sendo o aluno acompanhado por
alguns tutores em sessões para treino em laboratório. As provas são feitas presencialmente, também no laboratório. Essa ferramenta, cujos módulos estão descritos na Figura
2.1, consiste de basicamente três partes: um módulo de tutoria, um módulo de correção
de códigos e um módulo de simulação.
Figura 2.1: TutorialICC - Uma apresentação de seus módulos
módulo de tutoria
O
, o qual contém também a interface para as demais partes do
TutorialICC, é um módulo que utiliza como tecnologia de suporte, basicamente, Hypertext
Markup Language (HTML) e Cascading Style Sheet (CSS). Desse modo, textos e imagens
são utilizados para se explicarem aos alunos conceitos de computação e programação. São
utilizadas, ainda, algumas animações em Java Applet e alguns pequenos scripts educativos
utilizando a linguagem JavaScript para tal. Sua interface principal é demonstrada na
Figura 2.2
O conteúdo no tutor está distribuído em níveis de diculdade. Construiu-se, a partir
do conteúdo, uma taxonomia de exemplos proposta por Brandizzi and Nuñez (2009)
distribuindo o conjunto de conceitos que se deseja passar ao aluno. Os conceitos são
agrupados de dois em dois, de modo que um primeiro exemplo é apresentado contendo
os dois conceitos. Cada exemplo dá origem a uma árvore com o exemplo com os dois
conceitos na raiz e dois exemplos mais simples contendo apenas cada um dos conceitos
nas folhas. Ilustra-se essa taxonomia pela Figura 2.3.
O
é responsável tanto pela correção de exercícios quanto de
provas. Ao enunciar um exemplo, o TutorialICC apresenta o enunciado de um problema
exigindo os conceitos presentes no exemplo. O aluno escreve o seu código fonte em um
módulo de correção
5
Figura 2.2: Módulo de Tutoria do TutorialICC
Figura 2.3: Taxonomia de exemplos ilustrada em forma de árvore.
editor disponibilizado pelo Tutorial e o submete a um programa em Java, que o compila
e o executa. A partir de testes de entrada e saída, o TutorialICC corrige o código do
aluno, dá uma nota ao seu código e presta recomendações ao aluno, tais como seguir para
uma certa parte do conteúdo ou analisar certos exemplos em seu nível mais detalhado.
Assim o aluno pode adaptar a sua evolução no conhecimento apoiando-se nas orientações
providas pelo TutorialICC.
Os exemplos que são apresentados ao longo do conteúdo são mostrados no
, chamado Tira-Teima, no qual são demonstrados visualmente detalhes da
execução de um programa escolhidos pelo professor. É o módulo em aprimoramento neste
presente trabalho. Ele será detalhado na Seção 2.3. Seu objetivo principal é tornar mais
representativos os exemplos.
módulo
de simulação
6
2.3
Tira-Teima o simulador de execução de programas do TutorialICC
O Tira-Teima é um dos módulos do TutorialICC, e é responsável pela simulação da
execução dos exemplos enunciados no próprio tutorial. Sua interface pode ser vista na Figura 2.4. Em Pereira Júnior and Rapkiewicz (2004) foi discutida uma pesquisa mostrando
que a visualização (gráca) de um algoritmo, por ativar os dois lados do cérebro, aumenta
a probabilidade de sua compreensão. Dessa forma, ao ver o código emparelhado com uma
representação gráca de seu funcionamento, o aluno tanto raciocina sobre o programa
quanto o visualiza. Nesse sentido, o Tira-Teima promove uma melhor compreensão dos
exemplos relatados no programa.
Figura 2.4: Tira-Teima ferramenta de simulação de programas do TutorialICC
2.3.1
Interface
A interface do Tira-Teima, demonstrada na Figura 2.4 é composta por três componentes fundamentais: uma barra de controle de execução do código (parte superior), um
editor de exibição do código fonte (parte da esquerda) e um mostrador. (parte da direita).
A barra de controle permite ao aluno caminhar na linha de execução de um programa,
avançando ou retornando nos passos de visualização. É facultado ao estudante inserir um
número de linha para que se execute o programa a partir de tal linha. O editor de exibição
do código fonte simplesmente mostra o texto estilizado por meio de um mecanismo de
syntax highlighting, que muda o estilo das fontes de acordo com a categoria dos trechos
de código (palavras chaves, tipos, bibliotecas, strings, números, etc.). O mostrador, por
sua vez, possui um painel de variáveis, vetores e matrizes, além de possuir um descritor
7
de arquivos abertos, um mostrador de alertas dados pelo professor e um console simulado. Com essa interface é possível representar praticamente todos os conceitos básicos
de programação.
2.3.2
Funcionamento
O funcionamento do Tira-Teima se dá como na Figura 2.5. O Tira-Teima recebe como
parâmetros dois arquivos, um código fonte escrito em linguagem de programação e um
escrito em uma linguagem cuja sintaxe foi denida ad hoc, apenas para representar
a execução de um programa escrito sob o paradigma estruturado. Dessa forma, cabe ao
professor escrever o exemplo tanto em linguagem de programação como na linguagem de
representação de sua representação.
roteiro
Figura 2.5: Módulos de funcionamento do Tira-Teima.
Como exemplo, cite-se o código fonte em Pascal que segue, além do roteiro escrito na
linguagem do Tira-Teima, e se observe o seu resultado, na Figura 2.6. O programa em
Pascal recebe três variáveis, comparando seus valores para imprimir na tela o menor e
o maior valor. O roteiro, por sua vez, determina para cada linha o que deverá ser feito
pelo Tira-Teima em termos de visualização. Elementos não representativos do programa,
como o comentário que aparece na janela vermelha da Figura, podem ser utilizados nos
passos do programa. Repare-se que não há forte compromisso sintático entre o código
fonte de verdade e o roteiro, pois este último é escrito em uma linguagem independente
do código.
Código-Fonte em Pascal
program Programa301;
var
a, b, c : integer;
begin
writeln ('entre com os valores de a, b, c');
readln (a, b, c);
8
if
if
if
if
if
if
end.
(a
(a
(b
(b
(c
(c
<
<
<
<
<
<
b)
c)
c)
a)
b)
a)
and
and
and
and
and
and
(b
(c
(c
(a
(b
(a
<
<
<
<
<
<
c)
b)
a)
c)
a)
b)
then
then
then
then
then
then
writeln
writeln
writeln
writeln
writeln
writeln
(a,
(a,
(b,
(b,
(c,
(c,
c);
b);
a);
c);
a);
b);
Código do Roteiro na Linguagem do Tira-Teima
1;
3;
4 int a cor(240,50,50) tamanho(60,30) posicao(30,30),
b cor(50,240,50) tamanho(60,30) posicao(130,30),
c cor(50,50,240) tamanho(60,30) posicao(230,30);
6;
7 writeln ("entre com os valores de a, b, c");
8 {writeln ("2 9 5"); a = 2; b = 9; c = 5;}
9 ;
10 {writeln ("2 9");
comenta("Neste if foi encontrada a solução. No entanto, como este
programa não está otimizado, ele continuar procurando em todos os
outros if's.");
som();}
11;
12;
13;
14;
15;
Para implementar o roteiro, foi criado no programa o conceito de Passo. Para o TiraTeima, um passo é um conjunto de comandos, os quais podem representar desde uma
impressão de texto no console até exibição de variáveis na tela e avisos sonoros. Existe
um conjunto de comandos possíveis no Tira-Teima, descritos por uma gramática.
Cada passo é associado a uma linha do código fonte original, para que ela seja destacada e se observe qual trecho do código está sendo representado. Repare-se que a cada
linha pode ser associado mais de um comando, como na linha 9 {writeln ("21"); idade
= 21;}. Da mesma forma, uma linha do código fonte original pode ser repetida, se for
necessário. Portanto, cada linha do código fonte pode estar associada a vários passos
diferentes, e cada passo do comando pode possuir um ou mais comandos de visualização
para que o Tira-Teima execute.
Isso foi desenvolvido para se obter a seguinte vantagem: car a cargo do professor
quais linhas do código serão exploradas didaticamente e como essas linhas deverão ser
representadas. A desvantagem desse mecanismo em relação a simuladores que compilam
o código fonte é o custo de tempo para escrever o roteiro, além da possibilidade de falha
de quem escreve o roteiro.
9
Figura 2.6: Exemplo de funcionamento do Tira-Teima.
Portanto, o Tira-Teima recebe um código fonte e um roteiro, os interpreta associando
números de linhas a passos de visualização do Tira-Teima (conjuntos de comandos) e
mostra os passos sob demanda do aluno.
2.3.3
Arquitetura e Tecnologias Utilizadas
Os principais módulos do Tira-Teima são os descritos na Figura 2.5. O Tira-Teima é
desenvolvido em Java, e algumas ferramentas adjacentes são utilizadas, a saber o JavaCC
e o Java Swing.
Seu
é responsável por promover a análise léxica, sintática e
semântica do código do roteiro associado a um exemplo. Para essa nalidade foi utilizada
uma ferramenta livre e de código aberto denominada JavaCC, a qual permite a criação
de analisadores sintáticos descendentes recursivos, os quais são analisadores sintáticos
construídos a partir de sub-rotinas recursivas. Ao carregar o programa, todo o arquivo de
roteiro é compilado e os passos para execução do programa são montados e colocados em
memória. Ou seja, em certo sentido é possível dizer que uma das principais funcionalidades
do Tira-Teima é compilar e executar o roteiro (não o código fonte).
A partir do momento em que se executa o programa, o
direcionado pelo usuário passará a determinar qual passo (conjunto de comandos) será executado
em um determinado momento. Ele consegue caminhar livremente pelos passos já criados,
por guardar o estado exato de cada componente na media em que avançam os passos. Ou
seja, é possível voltar na execução do código.
Ao se executarem os passos, e consequentemente os comandos relacionados a eles, comandos de visualização são executados pelo
, o qual passa a mostrar
variáveis, imprimir textos no console, exibir mensagens de alerta, exibir descritores de
módulo interpretador
módulo controlador
módulo mostrador
10
arquivos, entre outros comandos. A cada passo uma das linhas do código fonte original é
destacada para se relacionar o que se está sendo visualizado com o programa associado.
Para tornar mais agradável a visualização, o Tira-Teima utiliza um syntax highlighting
colorimento seletivo do código para a linguagem do código fonte. Tudo isso é exibido
através de um
gráca que utiliza o framework Java Swing para
exibir os componentes, sendo alguns componentes já padronizados pela framework e outros
componentes desenhados pelo Tira-Teima.
módulo de interface
2.4
Taxonomia de
Softwares Educacionais
Com a nalidade de organizar o acesso aos programas educacionais em bibliotecas e
para favorecer a análise destes sob a ótica do projeto pedagógico, em Viccari and Giraa
(2003) foi proposta uma taxonomia de tais softwares. Baseado nessa categorização, nesta
seção procurar-se-á contextualizar o presente trabalho dentre os diversos tipos de programas educacionais desenvolvidos. Com isso pretende-se contribuir para a limitação do
escopo do Tira-Teima, bem como para contextualizá-lo teórica e metodologicamente.
2.4.1
Taxonomia Geral
Diversos autores tradicionais da área de Informática na Educação, como Taylor (1980),
não consideram que para um programa ser classicado como educacional ele precisa ter
sido inicialmente desenvolvido para esssa nalidade. Basta, na verdade, que tal programa
seja contextualizado através de um método em um ambiente de ensino-aprendizagem.
Desse modo, "todo programa pode ser considerado um programa educacional, desde que
utilize uma metodologia que o contextualize no processo de ensino-aprendizagem" (Viccari and Giraa 2003). Podemos tomar como categoria mais genérica para programas
educacionais como sendo os AEAC (Ambientes de Ensino-Aprendizagem Computadorizados).
Dentre os programas educacionais, existem aqueles que foram desenvolvidos especicamente para tal nalidade, destacando-se dos demais, então, por peculiaridades em seu
projeto, arquitetura e classicação. Esses programas criados para a educação podem ser
classicados tanto de acordo com seus elementos observáveis quanto pela suas formas de
utilização. Daí resulta a Figura 2.7, baseada na taxonomia referida.
A taxonomia aqui descrita segue conforme Viccari and Giraa (2003). Essa taxonomia
diferencia primeiramente os programas em dois grupos, de acordo com a forma de estruturação do programa e sua interface (ou seja, pelos seus elementos observáveis). São estes:
os para aprendizagem de habilidades especícas e os para aprendizagem de habilidades
cognitivas amplas. Os últimos são os que permitem a exploração maior do conteúdo,
congurando-se como ambientes compostos normalmente de diversas ferramentas integradas. Secundariamente, distinguem-se os programas por seu uso e contextualização no
ensino.
Os programas voltados para habilidades especícas dividem-se em duas grandes categorias, os CAI (do inglês computer-aided instruction ) originados de pesquisas em
educação; e os ICAI (do inglês intelligent computer-aided instruction desenvolvidos a
partir de pesquisas em IA (Inteligência Articial).
11
Figura 2.7: Taxonomia de programas educacionais, adaptada de Viccari and Giraa (2003)
Os CAI são baseados em teorias da educação, sendo que nem sempre há uma teoria
correspondente na área de CC (Ciência da Computação). Na verdade, a maior parte das
teorias educacionais não apresentam correspondentes em CC (Giraa 1995). Inicialmente
esses sistemas utilizavam as lições propostas por um professor de uma forma sequencial
e pouco interativa. Nos CAI não há nenhum modelo do aluno que oriente a forma de
interação aluno-programa. O conteúdo é posto de acordo com um programa normalmente
único e executado de modo sequencial. São modalidades de CAI:
• Programas Exercício-Prática : o aluno é levado a testar ou praticar seus conhecimentos de uma forma procedural, podendo para tanto utilizar-se de recursos hipermídia.
• Jogos e Simulação : uma simulação é uma execução dinâmica de um modelo anteriormente denido. Já um jogo é uma simulação em que se envolve um sentido
de competição, em que se busca, através desta, a ampliação de uma certa habilidade do aluno. Adicionando-se características pode-se, no entanto, passar os jogos
educacionais para segunda categoria, a de habilidades cognitivas amplas.
• Demonstração : caracterizam-se por uma exposição demonstrativa e sequencial do
conteúdo ao aluno.
• Tutores : imitam o padrão de aula tradicional, de modo que o professor organiza o
conteúdo e o aluno escolhe qual parte do conteúdo irá estudar.
Os ICAI, por sua vez, utilizam técnicas de IA e resultados da Psicologia Cognitiva com
arquiteturas modulares para cumprir o mesmo papel do CAI em um nível mais elevado
de interatividade e adaptação. Assim, participam mais ativamente do processo de ensinoaprendizagem, embora em geral eles possuam um foco maior no conteúdo e menor no
método de ensino utilizado. Eles podem assim ser divididos:
• Sistemas Especialistas : esses sistemas foram projetados para evitar que os CAI fossem meros viradores de página eletrônicos, utilizando-se de algumas técnicas de IA,
12
embora não fossem modularizados e não possuíssem um modelo para o comportamento do aluno.
• Sistemas Tutores Inteligentes (STI) : já esses sistemas utilizam-se também das mesmas técnicas dos Sistemas Especialistas, porém com o diferencial de existir um modelo do aluno que visa personalizar o ensino de acordo com a utilização do programa
pelo estudante.
Já os programas voltados para habilidades cognitivas amplas, os quais se constituem
em ambientes semanticamente mais ricos, podem ser classicados em:
• Micromundos : são formados por ambientes de aprendizagem cognitivas amplas,
caracterizando-se por ter proposta oposta à do CAI. Nesses ambientes, é permitido
ao aluno trabalhar de diferentes formas, seguindo seu ritmo e construindo sua própria
solução para o seu problema. Esse modelo está altamente atrelado às propostas de
aprendizagem de Jean Piaget, que enfatiza a construção do conhecimento por parte
do aluno em detrimento da mera transmissão por parte do professor. Para tanto,
muitas vezes são utilizadas linguagens de programação simplicadas de modo que
o aluno possa criar suas próprias soluções. Nesses ambientes não há conteúdos
pré-xados nem respostas.
• Sistemas de Autoria : são ferramentas que viabilizam a criação de soluções por parte
do aluno. Em tais sistemas, é possibilitado ao aluno o exercício de suas habilidades
cognitivas e sua criatividade.
• Jogos Educacionais : são jogos em que o aluno atinge determinado grau de cognição
de acordo com o resultado nal de uma partida. Estes se diferenciam daqueles
relacionados na categoria dos CAI no sentido de serem mais sosticados e complexos
a ponto de ser necessária uma equipe interdisciplinar para implementar seu projeto.
• Intelligent Learning Enviroments (ILE) : são ambientes de aprendizagem inteligentes
em que se considera a presença de mais de um aluno ou mais de um tutor no
processo de ensino. São também conhecidos como Sistemas Tutores Cooperativos
ou Sistemas de Aprendizagem Social. Combinam aspectos de STI, Micromundos e
por vezes elementos de simulação e jogos.
Cabe ressaltar que de acordo com a contextualização de um programa em um método
pedagógico ele poderá ser facilmente passado da primeira para a segunda categoria. Isso
torna exível essa classicação no sentido de depender mais do contexto e do uso da
ferramenta do que da sua forma propriamente dita.
Diante dessa taxonomia, cabe ao educador projetista do sistema avaliar o seu conjunto
de crenças em relação ao que é aprender. De acordo com tais convicções deverão ser denidas as características, a interface e a organização dos conteúdos. Com esses componentes
em mãos e apoiado na classicação taxonômica do projeto deve-se, então, levar a cabo a
implementação de seu software educacional.
2.4.2
CAI versus STI
Viccari and Giraa (2003) comparam os CAI com os STI, mostrando como um evoluiu
ao outro e quais características os diferenciam. Embora tenham propósitos semelhantes,
13
os métodos utilizados e o potencial de ensino dessas duas categorias de programas educacionais tornam eminentes as suas diferenças, as quais são de suma importância para saber
com o que de fato se está trabalhando em uma dada implementação.
Há um ponto de contato teórico entre a aprendizagem e o ensino por computador que
é o seguinte: existem princípios gerais que descrevem o processo de ensino-aprendizagem e
a partir dos quais se pode inferir a construção de sistemas que ensinam/aprendem (Woolf
1988). Para a informática na educação essa modelagem é de suma importância, uma vez
que é a partir dela que se direcionam as construções de softwares educacionais efetivos.
Parte dessa efetividade é buscada combinando-se técnicas de IA(Inteligência Articial)
aos modelos pré-existentes de ensino baseado em computação.
O surgimento da IA fez com que projetistas dos CAI procurassem agregar inteligência
aos seus programas. Desse desejo surgiram os ICAI (Intelligent CAI), os quais, para ns
de simplicação são aqui equiparados aos STI. Os STI destacaram-se nas pesquisas ao
longo das últimas três décadas, o que lhes conferiu características próprias que os diferenciavam dos CAI. As técnicas de inteligência articial foram inicialmente empregadas com
o objetivo analisar padrões de erro e o estilo de aprendizagem do aluno, fornecendo ajuda
de acordo com essas análises (Saviani 2005). Entre os CAI e os STI existem diversas
diferenças.
O principal ponto de divergência entre os CAI e os STI é a forma de concepção do
projeto. Enquanto os primeiros induzem os alunos a repostas corretas a partir de um
conjunto de estímulos planejados, os últimos tomam decisões pedagógicas a partir de
modelos cognitivos do aluno e da interação dele com o programa. Bons CAI até simulam
diversas situações, mas só os STI simulam o processo de resolução do problema (Viccari
and Giraa 2003). Um objetivo fundamental dos STI é adaptar o ambiente ao aluno,
tanto no conteúdo quanto na forma.
Um problema é que ainda se está longe de alcançar tal realidade. Limites de hardware
e software contribuem para tanto, pois um professor humano pode lidar com estímulos
que o computador ainda não pode. Também as emoções ainda não são amplamente
consideradas nos modelos computacionais. Tudo isso limita o trabalho de um tutorial
baseado em computador frente ao aluno.
Resultados como os enunciados em Merrill et al. (1992) mostram que alunos apoiados
por STI aprendem mais rápido e mais efetivamente que alunos sem esse apoio. No entanto, ainda que de maneira branda, os sistemas tutores inteligentes demonstram piores
resultados de ensino-aprendizagem frente a tutores humanos.
Outro problema é o fato de não existirem modelos cognitivos de aprendizagem precisos.
O conhecimento de como se dá a aquisição, armazenamento, processamento e recuperação
do conhecimento torna difícil a criação de modelos do aluno nos sistemas tutores inteligentes, o que é de suma importância para a efetividade destes. Não só tais modelos são
escassos, como são de difícil implementação.
Representar o conhecimento humano por meio do que dispomos (Prolog, Lisp e outros)
tem restringido a modelagem humana por características intrínsecas a este conhecimento.
Assim, até que passem a existir alternativas computacionais mais efetivas para representar
o conhecimento humano, bem como implementação destas em nível de linguagens de
programação e arquitetura de computadores haverá perdas signicativas de qualidade nos
softwares educacionais.
14
De uma forma geral, pode-se pontuar as diferenças entre CAI e STI por meio da tabela
2.1 encontrada em Viccari and Giraa (2003).
Aspecto
CAI
STI
Estruturação do
Conhecimento
Modelagem do
Aluno
Modalidades
Avaliam a última resposta
Tentam avaliar todas as respostas
do aluno durante a interação
Socrático, ambiente interativo,
diálogo bidirecional e guia
Origem
Bases Teóricas
Estruturação e
Funções
Educação
Skinner (Behaviorista)
Uma única estrutura algoritmicamente pré-denida, onde o aluno
não inui na sequenciação.
Algorítmica
Tutorial, exercício e prática, simulação e jogos educativos
Ciência da Computação
Psicologia Cognitivista
Estrutura subdividida em módulos, cuja sequenciação se dá em
função das respostas do aluno
Heurística
Tabela 2.1: CAI x STI
Os CAI originaram-se na década de 1950 de projetos da área da educação e utilizaram os informatas como implementadores de suas idéias. Dessa forma, baseavam-se nas
teorias aceitas pelos educadores. Aproveitando-se do desenvolvimento dos computadores,
os prossionais de educação idealizaram o uso das tecnologias emergentes no ensino. Já
os ICAI, dentro dos quais encontram-se os STI, surgiram na década de 1970 a partir de
prossionais da área de computação, os quais pretendiam utilizar técnicas da área de
inteligência articial na construção dos programas educacionais.
Como explicado em Viccari and Giraa (2003), a base teórica para os CAI foi basicamente comportamentalista (behaviorista), cujo precursor foi Skinner. A idéia era modelar
o comportamento do aluno induzindo-o a respostas corretas de acordo com estímulos meticulosamente preparados. Em relação aos STI, a base foi a psicologia cognitivista, na
qual contribuíram, entre outros, Piaget e Vigotsky. Para estes o conhecimento deve ser
construído pelo aluno e isso se reetiu nos programas educacionais no sentido de fazer
com que eles fornecessem os meios para que os alunos aprendessem interativamente.
O conhecimento, nos CAI, era estruturado de uma forma algorítimica. Ou seja, o
aluno utilizava um conjunto pré-denido de instruções estabelecido pelo professor de uma
forma sequencial e pouco interativa. Os STI quebraram esse paradigma ao propor que o
tutor inteligente deveria prover ao estudante um ensino de acordo com suas necessidades
particulares. Isso implicou em uma abordagem Heurística no projeto dos tutores, uma
vez que para cada aluno (e para o conjunto destes) o tutorial adaptaria suas estratégias
de ensino baseado no estilo de aprendizagem percebido.
Nos CAI o modelo do aluno era bastante simplicado e levava em consideração apenas
a última resposta dada pelo estudante, normalmente sob uma análise de verdadeira ou
falsa. Isso limitava o modelo no sentido de se ignorarem os verdadeiros processos cognitivos
de aprendizagem. Em oposição, os STI aprimoraram o modelo do aluno tentando avaliar
não só a última, mas o conjunto de respostas dadas pelo estudante ao longo do processo
de aprendizagem, apreendendo seu estilo de ensino-aprendizagem e adaptando o estilo do
tutor ao usuário particular.
Entre as modalidades de CAI que emergiram, podemos citar:
15
• Tutoriais programas que imitam a estrutura clássica de aula com conteúdos prédenidos a serem seguidos em sequencia linear pelo aluno.
• Exercício-prática softwares que levam o estudante a praticar seu conhecimento de
forma procedural.
• Simulação e Jogos Educativos execuções dinâmicas de um modelo denido anteriormente. Podem envolver disputa (jogos) ou não.
Já em relação às modalidades dos STI, exemplicam-se:
• Socrático provê instrução a partir de diálogos com o aluno. Para tanto utilizam
subconjuntos de linguagem natural ou linguagens envolvendo o paradigma funcional
(ou lógico).
• Ambiente Interativo propiciam uma interação entre o tutor e um aluno, de modo
a diagnosticar o estudante em seu ensino.
• Diálogo Bidirecional muitas vezes envolvem-se diálogos que alteram o comportamento do tutor em função das respostas do aluno.
• Guia alguns programas funcionam como guias apresentando ao aluno o conteúdo
de maneiras variadas sem necessariamente envolver um diálogo.
Um ponto em comum para um bom projeto tanto de um CAI quanto de um STI é a
interdisciplinaridade. Um bom programa educacional, independente da sua natureza, deve
envolver diversas áreas e/ou especialistas do conhecimento. Especialistas no assunto de
domínio, prossionais de tecnologia da informação, pedagogos, psicólogos e programadores
visuais devem estar envolvidos em um projeto de um software educacional. A ausência de
qualquer um desses conhecimentos pode implicar em um prejuízo técnico ou pedagógico
no programa.
No entanto, em um STI o projeto sofre grande inuência dos especialistas em uma
base de conhecimento que será utilizada para interação aluno-tutor. Isso faz com que seja
desejável que eles aprendam de acordo com a interação do aluno, tornando-o exível e
capaz de aprender com o meio e atualizar seu conhecimento. Isso favorece um aprendizado
na prática por parte dos alunos, de modo que ca viável ao sistema fornecer ao estudante
condições de explorar o meio, comparando e sintetizando sua base de conhecimento.
Uma diculdade é utilizar adequadamente as técnicas de IA nos CAI ou seja,
aproveitando-se dos estudos pedagógicos e dos modelos computacionais desenvolvidos.
Ainda de acordo com Viccari and Giraa (2003). Para tanto é preciso considerar:
• Deve-se integrar os componentes de IA no sistema, o que é uma tarefa de difícil
implementação.
• Modelar corretamente o domínio é um processo difícil.
• O atual uso das técnicas de IA, sob o ponto de vista pedagógico, está longe de ser
efetivo.
• A informação codicada deve ser tornada explícita e facilmente modicável, pois
ca facilitada a interação do aluno com a base de conhecimento.
16
Segundo Viccari and Giraa (2003), que consideraram STI como sinônimo de ICAI,
"acrescentar um I à sigla CAI não signica apenas agregar técnicas de IA para a construção
de sistemas tutores e sim trabalhar de forma interdisciplinar com as conquistas que as
outras áreas de pesquisa obtiveram, em relação ao conhecimento da Comunicação, da
Psicologia e da Pedagogia".
2.5
2.5.1
Sistemas Tutores Inteligentes
Denição e Características
Os Sistemas Tutores Inteligentes, ou STI podem ser denidos genericamente como
sistemas de aprendizagem baseados em computador que tentam adaptar-se às necessidades
do aluno (Self 1999). Esses programas de computador utilizam técnicas de Inteligência
Articial (IA) para representar o conhecimento e com isso possibilitar uma interação
com o aluno (Sleeman 1982). Ao interagir com o aluno, os STI modicam sua base de
conhecimento (aprendem), adaptando suas estratégias de ensino de acordo com a evolução
de um determinado processo de ensino-aprendizagem (Viccari 1990).
Como visto, segundo Viccari and Giraa (2003), tais sistemas podem ser classicados
como sendo uma modalidade da categoria ICAI na Seção 2.4, os quais são sistemas inteligentes modelam um tutor (Corbett et al. 1997). O que especializa um STI perante aos
demais ICAIs é a existência de um modelo do aluno que objetiva personalizar o trabalho
de acordo com as características do usuário (Viccari and Giraa 2003). O objetivo de
um STI seria envolver os alunos em atividades que envolvam o raciocínio interagindo com
o estudante baseando-se na compreensão do comportamento do usuário (Corbett et al.
1997).
Segundo Self (1999), entre outros autores, os STI normalmente utilizam uma arquitetura baseada em três módulos básicos: módulo do aluno; módulo do domínio; e módulo do
tutor. O módulo do aluno representa o estudante em seu conhecimento, comportamento e
cognição. O módulo do domínio procura modelar o conhecimento detido por especialistas
de um determinado assunto e o módulo tutor possui estratégias de ensino que procuram
aproximar o conhecimento do aluno ao conhecimento do módulo de domínio. Citam-se
ainda módulos relacionados à interface e controle do programa, os quais teriam interação
direta com o aluno. Essa arquitetura ca mais bem esclarecida na Seção 2.5.3.
Woolf (2007) mapeou os principais recursos de inteligência articial providos por tutores inteligentes, os quais se encontram presentes nos principais exemplos de STI. Tais
recursos estão mapeados na Tabela 2.2 em tradução livre. Ressalte-se que não necessariamente em um dado tutor todos os elementos devem estar presentes, mas tão somente
alguns desses elementos já o caracterizariam como tal. Em geral apenas o aprendizado interativo e o modelo de tutor estão presentes na maioria dos STI encontrados nos exemplos
clássicos da literatura.
O primeiro recurso dos tutores inteligentes é a generatividade, ou seja, a habilidade de
gerar recursos para o estudante. Os tutores que possuem essa capacidade podem gerar
problemas customizados, dicas e ajuda personalizados às necessidades do estudante.
O segundo e o terceiro recursos dos STI são o modelo do estudante e o modelo do
domínio. No modelo do estudante, baseado nas ações do aluno se tomam decisões pedagógicas. Já no modelo do domínio o conhecimento é representado tanto em forma de
17
Recurso de um Tutor Descrição do Recurso
Inteligente
Generatividade
Modelo do Estudante
Modelo do Domínio
Iniciativa Mista
Aprendizado
tivo
Intera-
Modelo do Tutor
Auto melhoria
A habilidade de gerar problemas apropriados, dicas e ajuda
customizados às necessidades de aprendizado do estudante.
A habilidade de representar e raciocinar sobre o atual conhecimento e necessidades de aprendizado de um estudante e de
responder provendo instrução
Uma representação e forma de raciocínio sobre a atuação de
especialistas no domínio e a capacidade implícita de responder
provendo instrução
A habilidade de iniciar interações com um estudante, bem
como interpretar e responder utilmente a interações iniciadas
pelo estudante.
Atividades de aprendizado que requeiram um autêntico engajamento do estudante e que sejam apropriadamente contextualizadas e relevantes para o domínio.
A habilidade de mudar o modo de ensino baseado em inferências sobre o aprendizado do estudante.
A habilidade do sistema em monitorar, avaliar, e melhorar
sua própria performance de ensino basiada na sua experiência
com estudantes anteriores.
Tabela 2.2: Recursos de Inteligência Articial de Tutores Inteligentes, adaptada de Woolf
(2007)
18
tópicos e conceitos como é dado ao tutor a capacidade de resolver problemas no domínio
em questão.
O quarto recurso é a iniciativa mista em que tanto o estudante quanto o tutor podem
iniciar uma interação. O tutor deve ser capaz de inicar uma iniciativa pertinente e deve
ser capaz de responder adequadamente a uma interação iniciada pelo estudante.
O quinto recurso a ser enunciado é o aprendizado interativo. Esse é um dos recursos
que se pressupõe presente em todos os STI. Ele implica em reponder às necessidades
dos usuários dinamicamente. Essa interatividade em questão não se baseia apenas no
controle por parte do aluno em avançar ou voltar no uxo de aprendizagem ou iniciar
eventos. O que de fato deve ocorrer para uma interação efetiva é que ela satisfaça critérios
pedagógicos.
Um sexto recurso é o modelo de tutor. Tal modelagem viabiliza alterar a direção
de ensino de acordo com a necessidade do aluno. Estratégias de ensino variadas devem
ser projetadas para que os mais diversos estilos de aprendizagem sejam contemplados.
Esse modelo não raro recebe entradas do modelo do estudante para poder ajustar-se às
necessidades de um aluno em particular.
O sétimo recurso é a auto melhoria, ou autodesenvolvimento. Baseado na experiência
com alunos anteriores, um tutor inteligente pode ser capaz de ajustar seu esquema de
ensino-aprendizagem. Isso implica geralmente em alguma tecnica de aprendizado por
parte da máquina (machine learning ). A partir do uso e dos resultados dos estudantes,
o tutor pode julgar quais intervenções são mais efetivas e priorizá-las para próximos
usuários.
Sistemas Tutores Inteligentes ajudam a atender à crescente demanda pelo conhecimento na sociedade. É fato que eles possuem limitações frente a tutores humanos, mas
em certos casos eles se conguram como uma boa opção tanto para ampliar a escala do
ensino quanto para aumentar o acesso a este. É um campo relativamente novo de pesquisa
que com a colaboração da computação, educação e psicologia podem trazer ainda grandes
avanços nos sistemas de ensino-aprendizagem.
2.5.2
Perspectiva Histórica dos STI
Antes dos STI havia os CAI, surgidos na década de 1950 e originados da área de Educação. Esses sistemas utilizavam-se de computadores como suporte para o conhecimento,
mas de uma forma procedural e não interativa. Foram por muitos considerados meros
viradores de página eletrônicos 1 . Na década de 1970, surgiram os sistemas chamados
generativos.
Tais programas eram chamados generativos por conseguirem gerar automaticamente
material instrucional. Por exemplo, geravam equações automaticamente de modo que se
podia comparar a resposta do aluno com a resposta do sistema. No entanto, não era
mostrado ao aluno como solucionar tais equações, pois tais problemas matemáticos eram
resolvidos com algoritmos próprios totalmente diferentes daqueles que seriam usados por
um humano para resolver a equação. Tais sistemas estavam a um passo de ser um sistema
tutor inteligente. Em Viccari and Giraa (2003) encontra-se uma cronologia em três
estágios para os STI.
1 jargão
utilizado por especialistas para denir o uso sequencial e pré-denido dos CAI
19
Ainda na década de 1970 e início dos anos 1980 surgiram os STI com o objetivo de
superar as limitações dos sistemas generativos. Aí se deu o primeiro estágio dos STI. O
principal objetivo nessa época era explorar métodos e técnicas de IA existentes com a
nalidade de aplicá-las ao aprendizado e à instrução dos alunos. A maior contribuição
desse estágio foi a mudança da forma de pensar em um projeto de programa de computador
educacional e a exploração de soluções técnicas para o STI. Esse programas já propunham
que se deveria levar em consideração particularidades cognitivas de cada aluno.
Na segunda metade da década de 1980 houve o início do segundo estágio, no qual
se procurou levar em consideração o projeto pedagógico. Começaram a participar da
elaboração dos sistemas não somente prossionais da área de computação, mas também
especialistas em educação. Passaram a ser utilizadas linguagens para ns gerais na implementação de STI e a popularização dos computadores pessoais facilitou as pesquisas
em software.
O terceiro estágio se deu na década de 1990 com a exploração de ambientes pedagógicos
especícos e a utilização de equipes interdisciplinares para conceber e validar os programas
educacionais. A principal contribuição dessa época foram as teorias e estratégias de ensino/aprendizagem desenvolvidas. Desse estágio tirou-se a lição de que pesquisar em STI
deveria contemplar estratégias de ensino, o que deveria ser feito de forma interdisciplinar.
O atual estágio em que se encontra a área aponta por um lado para uma maior
abrangência dos projetos para conceitos novos como os ILE (ambientes de aprendizagem
inteligentes) e os ITA (intelligent teaching assistant ) compondo uma espécie de ITS de
segunda geração, que leva em consideração contextos maiores e ambiente social de aprendizagem. E por outro lado pesquisa-se ainda a essência dos ITS e seus problemas clássicos
permanecem em estudo. Como exemplos de pesquisas em tais problemas, podem citar-se
esforços em:
• modelar conhecimento, como em Jung and Van Lehn (2010), onde se buscou aprimorar o uso de linguagem natural para facilitar a modelagem do domínio.
• modelar o aluno, utilizando-se conhecimentos de pedagogia e psicologia, como em Anderson et al. (2010), onde se utilizou ressonância magnética para observar o estado
mental dos estudantes quando interagindo com um sistema tutor inteligente.
• melhorar as estratégias de ensino por meio de técnicas de IA que envolvam aprendizagem por parte do sistema, como em Pardos et al. (2010), em que se utilizam
redes neurais para detectar os melhores itens utilizados para ns de aprendizagem.
2.5.3
Arquitetura de um STI
A arquitetura de um sistema tutor inteligente varia de implementação para implementação. No entanto, existem alguns componentes básicos em comum que podem ser
constatados na maioria dos STI encontrados na literatura. Desses componentes pode-se
inferir uma arquitetura, a qual foi positivada por Self (1999). Nessa arquitetura, representada pela Figura 2.8, existem três componentes básicos e seus papéis, que interagem entre
si para produzir o resultado nal do STI: o módulo do domínio (modelo da situação); o
módulo do aluno (modelo de interação); e o módulo tutor (modelo de permissões). Além
destes módulos básicos, por muitos autores é citado um módulo de interface ou controle,
como por exemplo, em Viccari (1990).
20
Figura 2.8: Arquitetura de um STI proposta por Self, adaptada de Self (1999)
Essa arquitetura separa o domínio da sua forma de manipulação, o que congurouse como um grande avanço, pois estratégias de ensino diferentes puderam passar a ser
associadas de acordo com o modelo do aluno existente. O módulo de domínio serve para
modelar o conhecimento a respeito do domínio em estudo viabilizando o acesso a este por
parte do estudante no momento em que ele interage com o STI (modelo da situação). O
módulo do aluno contextualiza as interações com o estudante e, de acordo com as ações do
aluno, infere-se a estrutura cognitiva do aluno naquele momento e então se tomam decisões
de estratégias de ensino (modelo de interação). O módulo tutor é aquele que conduz o
estudante de acordo com os objetivos educacionais que o ambiente a ele proporciona
(modelo de permissões). O módulo de controle ou interface citados por alguns autores
opera no sentido de ser o componente entre o aluno e o sistema, coordenando os demais
módulos.
Serão explicados em detalhes cada um dos módulos referidos.
Modelo de Domínio
Modelos de domínio constituem-se de representações qualitativas de conhecimento especializado de um certo domínio (Woolf 2007). Dessa forma, lições, conceitos, animações,
exemplos, exercícios, etc. constituem o modelo de domínio. Esse modelo comporta todo o
conhecimento do domínio que se pretende passar ao estudante. Nesse módulo determinase a complexidade e forma de apresentação do conteúdo ao aluno.
Certamente a melhor forma de representar, armazenar e ter acesso ao conhecimento
irá depender substancialmente da natureza do domínio ensinado. Isso acaba reforçando
21
a natureza interdisciplinar dos STI (Self 1993). Existem basicamente três formas de
representar o domínio, a declarativa, a procedural e a heurística.
A forma declarativa, que representa geralmente domínios de natureza descritiva e teórica, utiliza-se de redes semânticas ou linguagens de frames para representar seu domínio.
A forma procedural, por sua vez, representa domínios orientados a tarefas e utiliza-se
basicamente de regras de produção. Já a chamada forma heurística procura representar
maneiras de utilizar o conhecimento procedural ou declarativo na resolução de problemas.
Quanto mais complexo é o domínio, mais difícil tende a ser a geração desse modelo. Em
estudo comparativo de exemplos, Woolf (2007) mostra que os primeiros STI atuaram em
domínios bem denidos (geometria, álgebra etc.) e que até hoje poucos tutores inteligentes
foram desenvolvidos para áreas pouco delineadas (direito, design, arquitetura etc.).
Para problemas simples e bem denidos, o normal é se apresentarem diversos problemas ou testes e conduzir o aluno a solucioná-lo. Já para problemas complexos e mal
denidos, outras alternativas devem ser utilizadas. Estudo de casos e análise de especialistas podem ser métodos pertinentes nestes casos. Segundo Woolf (2007) mesmo para
domínios simples como a programação pode não ser simples estabelecer regras e planos.
Para Sison and Shimura (1998) enumerar todos os erros e conceitos equivocados em programação é difícil, mesmo se considerando apenas os principais.
Investigar formas de codicar conhecimento e como representar tamanha especialidade
em um ITS permanece como sendo o foco central do desenvolvimento de um módulo
especialista (Burns and Capps 1988). No entanto, para eles existem basicamente três
abordagens para atingir esse objetivo.
Sistemas especialista do tipo black box, ou caixa-preta, seria uma das abordagens.
Nesse método, o conhecimento é modelado em termos de entrada e saída de modo que o
sistema compara as saídas do especialista com as do aluno, provendo a ele feedback e a
instrução devida.
Outra abordagem seria da de glass box, ou caixa de vidro. Aqui se utilizam técnicas de
engenharia do conhecimento. Um engenheiro entrevista um especialista e desenvolve uma
representação computacional do conhecimento, utilizando-se normalmente um formalismo
baseado em regras para isso. Não necessariamente as regras expressam como um especialista pensam, mas certamente elas exprimem com muito mais qualidade o conteúdo que
o modelo de caixa-preta.
Uma última abordagem seria a de modelagem cognitiva, a qual foi preconizada por
Anderson J. R. em seus trabalhos psicológicos. Nessa maneira, o objetivo é desenvolver
uma simulação tão realística quanto se possa de um processo de resolução de problemas
realizado por um humano. Muitas perguntas derivam dessa tentativa, como por exemplo:
quais componentes psicológicos são essenciais para se ensinar; em qual nível eles devem
ser representados; como tratar cada tipo de conhecimento procedural, declarativo, e
heurístico (ou qualitativo).
Seguem até hoje os esforços dos especialistas em ITS em representar melhor e tornar
mais acessível o conhecimento no módulo do domínio.
Modelo do Aluno
Tutores humanos utilizam os mais diversos recursos para identicar o conhecimento
de seus alunos através de sua experiência de ensino. Expressões faciais, entonação de
22
voz, postura corporal e características afetivas são elementos analisados pelo professor
para prover uma instrução individual para seus alunos, adaptando-se assim às suas necessidades. Os sistemas tutores inteligentes, por sua vez, devem fazer inferências acerca
do conhecimento do estudante e armazená-lo em forma de um modelo do estudante. A
motivação geral para se construir tal modelo, portanto, baseia-se em adaptar o processo
de ensino-aprendizagem ao aluno, tornando-o efetivo (Woolf 2007).
Uma razão especíca para se implementar o módulo do aluno é que um modelo do
estudante garante que o sistema tenha conhecimento do saber de cada aluno de modo que
ele consiga responder efetivamente, promovendo o interesse do estudante e consequente
aprendizado. Respostas customizadas são essenciais para se produzir conhecimento. Instruções adaptadas aos estilos de aprendizagem dos alunos aumentam tanto o interesses
dos alunos quanto o aprendizado.
Segundo Viccari (1990) os dados que modelam o aluno são constituídos de dados
estáticos e dados dinâmicos. Os dados estáticos relacionam-se aos modelos pré-concebidos
do aluno baseados na experiência dos especialistas e no modelo do domínio. Os dados
dinâmicos, por sua vez, já se referem a ao desempenho do aluno, sobretudo no que tange
às questões formuladas pelo tutor em confronto com as hipóteses elaboradas pelo aluno.
Em Viccari and Giraa (2003) elencaram-se diversas técnicas para construção do modelo do aluno, a saber: reconhecimento de padrões de acordo com respostas fornecidas;
comparação das ações do aluno com as de um especialista; identicação das preferências
do aluno; seleção de erros mais cometidos quando interagindo com o tutor; indicação das
crenças, intenções e desejos do aluno.
Costa and Werneck (1996) enumeram modelos de descrição a partir dos quais se podem
ser representado o modelo do aluno:
• Modelo Diferencial : o aluno é modelado de acordo com suas diferenças com relação
ao especialista. Compara-se a resposta do aluno com a resposta do modelo de
domínio (especialista). A partir da diferença entre esses dois conhecimentos se
obtém o diagnóstico do conhecimento do aluno.
• Modelo de Overlay ou Superposição : o modelo do estudante é tido como um subconjunto do conhecimento do tutor. Esse conhecimento inclusive é descrito usando
a mesma notação.
• Modelo de Perturbação : toma o aluno por seus erros mais comuns, assumindo que
existem erros recorrentes na concepção de alguns conceitos. A partir desses erros é
possível que se crie uma biblioteca de erros comuns.
• Modelo de Simulação : modela o aluno de acordo com uma concepção prévia de seu
comportamento. O ambiente possui um modelo do comportamento esperado para
o estudante e baseado em seu histórico se prevê o que ele fará.
• Modelo Mentalista : pretende-se modelar o aluno por seus processos cognitivos,
representando-os. Pretende-se manter modelos cognitivos dos alunos, de modo a
representar seus estados mentais.
• Modelo de Agente : imagina-se o aluno como sendo um agente com estados mentais,
ou seja, um agente inteligente, o qual é modelado para o sistema. Daí se infere que
a interação tutor-aluno se dá entre dois agentes inteligentes.
23
Alguns problemas comuns na modelagem do estudante puderam ser relatados por Woolf (2007). Representar o conhecimento do estudante é um deles, e os modelos de descrição
previamente enumerados procuram resolver tal problema. Outro problema é a atualização
do conhecimento do aluno. Para manter o modelo do aluno atualizado, o modelo diferencial e o modelo de simulação, bem como técnicas de aprendizagem de máquina (machine
learning ) são utilizados. Um último problema é como melhorar a performance do tutor
a partir do modelo do aluno. Este será melhor desenvolvido na seção seguinte, a 2.5.3,
relativa ao módulo tutor.
Modelo do Tutor
O Modelo de Domínio e o Modelo de Aluno dependem do Modelo do Tutor para de fato
adaptar a resposta do tutor a um estudante em particular (Woolf 2007). Esse modelo
é fundamental e fornece fundamentos para determinar quando intervir no aprendizado
do aluno. O elemento fundamental relacionado ao Modelo de Tutor é o conjunto de
estratégias de ensino empregadas no tutor. A partir sobretudo de Viccari and Giraa
(2003) delinear-se-ão aqui alguns aspectos relevantes acerca dessas estratégias.
Uma estratégia não passa de um plano de como ensinar de modo que, utilizando-se
de diagnóstico, monitoração e análise, se ensine efetivamente ao aluno um determinado
tópico (Viccari and Giraa 2003). Woolf (2007), por exemplo, elenca estratégias de ensino baseada em humanos (aprendizagem por treinamento, e resolução de problemas); e
estratégias baseada em teorias de aprendizagem (método socrático, teoria cognitiva do
aprendizado, teoria construtivista, aprendizagem contextual, interação e zona de desenvolvimento proximal). Essas são estratégias gerais de ensino, que no entanto, quando
aplicadas em relação aos STI de uma forma mais pragmática provocam um avanço fundamental na aprendizagem do aluno.
Essas estratégias de ensino devem denir em relação ao aluno quando interrompê-lo,
o que dizer e ele (tópicos e ordem), e como dizer. Dessa forma devem ser estabelecidos
critérios de quando o tutor deverá interromper o raciocínio do aluno para passar a ele
algum conhecimento ou fazer alguma ponderação acerca da prática do aluno, colocando
essas informações da melhor maneira possível. É nessa última questão (como dizer) que
residem as principais diferenças.
Um método muito utilizado é o método socrático, no qual perguntas baseadas na
experiência do aluno são feitas de modo que o estudante tire suas próprias conclusões.
Outra técnica usada é o modelo de treinamento, em que atividades de simulação ou
entretenimento são empregadas para que direta ou indiretamente o aluno aprenda. Mais
um modelo é o de hipertextos, nos quais o aluno pode navegar em uma estrutura de
acordo com seu interesse.
Segundo Viccari and Giraa (2003), o modelo de hipertexto possui diversas vantagens.
A representação do conhecimento em diversas formas no mesmo documento e apresentação
do conteúdo de forma dinâmica seriam duas delas. Outra vantagem seria o predomínio da
lógica de aprendizado do estudante ao invés da lógica do projetista, além da possibilidade
de acesso de vários usuários a um mesmo documento mediante o uso de tecnologias atuais.
É possível enunciar seis táticas de ensino a partir de Ohlsson (1986) in Viccari and
Giraa (2003). A saber:
24
• Tática de apresentação do objetivo: explicitação dos termos essenciais para a descrição do processo;
• Tática de apresentação de precursores: levantamento das habilidades prévias requeridas para o aprendizado de uma determinada tarefa ou conceito;
• Tática de representação de propósitos: apontamento do que se pode alcançar com
determinado procedimento;
• Tática de apresentação de justicativas: relacionamento entre cada passo executado
e a resolução do problema;
• Tática de relacionamento de erros: elencar os erros cometidos pelo aluno e relacionálos a conteúdo instrucional;
• Tática de relacionamento de soluções do aluno: levar o estudante a fazer uma autovericação dos passos que ocasionaram um erro.
Nessas seis táticas popostas por Ohlsson (1986) ca nítida a inuência da abordagem
construtivista, uma vez que ele é levado a pensar em seu erro de uma forma reexiva. Há
ainda outros grupos de técnicas.
Um conjunto importante de técnicas é o de formas de interação com o aluno. Há
três maneiras básicas de interação com o aluno: controlar seu currículo (sequenciação
do conteúdo), responder seus questionamentos e determinar quando ele precisa de ajuda.
Essas três formas de interação culminarão em um modelo instrucional.
A modelagem instrucional baseia-se no uso de exemplos ou em prática dirigida para
introduzir ao estudante um determinado assunto (Viccari and Giraa 2003). Dessa forma,
a partir de como se sequenciará um conteúdo e de quais instruções serão dadas surgirá
uma metodologia de ensino, e consequentes técnicas de ensino. Responder a perguntas
(amplicando assim o potencial pedagógico) também é uma característica desejável em
um Sistema Tutor Inteligente.
Em relação à intervenção por parte do tutorial, é possível enunciarem-se duas abordagens principais. Uma é o rastreamento do modelo, na qual utilizam-se técnicas para
descobrir se o estudante está se perdendo na solução do problema. Outra maneira de
intervir é por meio do tutoramento baseado em resultados, cuja intervenção é ativada de
acordo com algum resultado do aluno a uma solução. Essas intervenções devem ter seu
conteúdo escolhido.
Quanto ao conteúdo da intervenção, existem três estratégias principais. Na estratégia
de generalização o aluno é colocado para resolver um problema e erros são apontados no
processo, de modo que se espera que ele consiga, a partir de solução de problemas particulares e erros especícos, resolver problemas reais com menos erros. Já na estratégia de
acabamento, é apresentado ao aluno uma solução pronta e são solicitadas correções, alterações ou expansões da solução. Outra estratégia é o aprender fazendo, em que complexas
atividades cognitivas são empregadas pelo aluno, podendo-se utilizar outros estudantes,
professores ou o STI como apoio.
Muitas outras estratégias de ensino são apresentadas na literatura, de modo que elas
devem ser selecionadas de acordo com o domínio de ensino-aprendizagem utilizado por
cada STI. Ainda faltam teorias pedagógicas no que tange ao como ensinar, mas avanços
25
tem sido feitos nessa área de modo que cada vez mais embasamento tem ganhado os
Sistemas Tutores Inteligentes.
Controle e Interface
Este módulo não é apontado por todos os autores, mas como em Viccari and Giraa
(2003), notamos aqui sua importância para explicitar que é necessário coordenar os demais
módulos de um sistema tutor inteligente, além de relacioná-los por meio de uma interface
com o aluno.
Segundo essas autoras, o módulo de controle é aquele responsável pela coordenação
entre as partes de um tutor, como troca de mensagens entre os módulos, manutenção de
informações atualizadas e tratamento da sessão com o aluno. Além disso a interface deve
monitorar as ações do estudante, seja em um nível histórico (de uma sessão para a outra)
ou em um nível de diagnóstico de uma sessão em particular, além de relacionar esses
dois níveis. Para ligar os demais módulos ao estudante de uma forma bem sucedida, é
necessária uma boa interface, sendo esta a camada de visualização e interação do sistema
com o usuário.
A função da interface é apresentar o material instrucional e monitorar o progresso do
estudante para se adequar às estratégias de ensino de acordo com a interação do estudante.
Para tanto essa interface não deve ser entediante. Deseja-se que ela possibilite o diálogo
iniciado tanto pelo estudante quanto pelo tutor, e tenha um tempo de resposta aceitável,
além de monitorar o aluno o máximo de tempo sem interromper a execução do programa
principal (Viccari and Giraa 2003).
Uma possibilidade de apresentação do conteúdo por parte de interface é a utilização
de hipertexto, um texto formatado que permite a interligação de um conteúdo colocado de
forma dinâmica, e de hipermídia, que são elementos grácos (imagens, vídeos, animações
e scripts interativos). Esses vários recursos potencializam a apresentação do conteúdo por
parte de sistemas tutores inteligentes e as tecnologias atuais de internet vão ao encontro
dessas possibilidades.
Dessa forma, a comunicação dos STI entre seus módulos e o aluno se dão das mais
diversas maneiras. Menus, símbolos, diálogos e hipertextos são utilizados amplamente. A
interface pretende ser dinâmica e adaptável à necessidade dos alunos, sendo que muitos
avanços técnicos e metodológicos têm sido empregados com sucesso para atender a esse
objetivo.
2.5.4
A Internet e os STI
É notável o avanço das tecnologias de rede e internet nos últimos anos. De forma
crescente, muitos STI têm se utilizado de páginas web para servir de interface com relação
ao aluno e aos demais módulos. Essa utilização se dá sobretudo por conta de vantagens
oferecidas por tais tecnologias, muitas das quais foram mapeadas por Viccari and Giraa
(2003) e serão explicitadas aqui.
Na internet a troca de informações ca facilitada pelo uso de seus protocolos de comunicação servidor-cliente. O salvamento de informações relativas ao aluno também é
simplicado com o uso de bancos de dados. Decerto, tais características também existem
em outros ambientes, mas no que a internet se diferencia é no acesso a essas funcionalidades de qualquer lugar, sem barreiras físicas. Isso propicia uma maior escalabilidade
26
de uma solução pedagógica por softwares educacionais, além de ampliar seu acesso e
aumentar a sua velocidade de difusão.
Outro ponto interessante a ser notado nas tecnologias web é o fato de ser fácil montar uma grande base de conhecimento utilizando hipertextos HTML (Hypertext Markup
Language - linguagem de marcação de hipertexto). Com as tecnologias disponíveis atualmente, esses hipertextos podem ser interligados, utilizando-se, além de textos formatados,
scripts interativos, animações, vídeos, sons e muitos outros recursos. Todos estes aspectos são de fácil integração com bancos de dados e servidores que podem armazenar as
informações necessárias para mediar a interação do modelo de domínio e o modelo do
aluno.
No entanto, há limitações para essas tecnologias em relação ao seu uso para STI.
Segundo (Woolf 2007) os materiais educacionais na internet geralmente não obedecem
a regras, padrões, nem são baseados em uma teoria coerente com a pedagogia. Além
dessa limitação por parte dos projetistas dos programas educacionais, o autor cita outros
problemas.
A qualidade de informações pesquisadas na internet pode ser questionada. Os métodos
de pesquisas atualmente utilizados na internet podem retornar informações escassas ou de
má qualidade. Não se é facilitada a classicação das respostas em categorias e problemas
pedagógicos podem surgir desses problemas. Outras fontes de problema são as diculdades
de uso. Muitas pessoas ainda hoje não possuem acesso à internet, conhecimento sobre ela
ou tempo de explorá-la. Isso diminui seu potencial didático.
A falta de serviços de suporte aos tutores na web também representam um problema.
Muitas vezes o estudante ca sem apoio do tutor e falta a ele um apoio relacionado a
seu aprendizado. Suporte humano online tende a solucionar esse problema. Os papéis
também cam em conito. Qual deve ser o papel de um tutor na web? Dar suporte ao
aprendizado ou suprí-lo por completo? Somado a isso, problemas de privacidade muitas
vezes são mencionados com relação ao ensino à distância e acesso às informações do
estudante.
Dentro desse contexto, muito se tem a melhorar com relação à internet para que elas
preencham todas as necessidades de programas educacionais. Contudo, mesmo como está
seu estado atual, a web tem propiciado boas oportunidades, de modo que muitos STI tem
sido inclusive portados para a rede de modo a ampliar seu acesso. Novas tecnologias,
como web semântica tendem a aumentar o potencial dessas ferramentas a longo prazo.
2.5.5
Vantagens dos STI
Mesmo com todos os avanços dos Sistemas Tutores Inteligentes e intensas pesquisas
na área, a tutoria por parte de um humano no ensino de um para um, utilizando boas
estratégias pedagógicas, ainda mostra-se mais ecaz que os sistemas tutores inteligentes.
O suporte oferecido por tutores humanos é mais exível e mais sutil que os STI (Merrill
et al. 1992). Então por que utilizar Sistemas Tutores Inteligentes? Para responder essa
pergunta, serão enunciadas vantagens do uso de um STI.
• Necessidade de menos mão de obra : em certas áreas de atuação, seria necessário um
professor para três alunos (Woolf 2007) no processo de tutoria. Há sobretudo nas
universidades brasileiras uma falta de prossionais em número que supra tamanha
27
necessidade. Com Sistemas Tutores Inteligentes essa tutoria, ainda que em pior
qualidade, pode ser dada em um nível muitas vezes satisfatório.
• Baixo custo de manutenção : comparando com a tutoria humana, após estabelecido
um método pedagógico, sempre seria necessária a tutoria por parte de alguém, o
que poderia custar caro. Já os STI podem oferecer um serviço com um bom grau
de inteligência com apenas a manutenção do programa.
• Facilidade de escalabilidade : sobretudo com o auxílio do uso de tecnologias de internet ca viabilizado o amplo acesso de um STI com um baixo custo. Uma vez
colocada em um servidor na rede, uma aplicação educacional só precisa gerenciar
os recursos desse serviço, tendo atualmente um baixo custo comparado ao ensino
presencial. Várias pessoas de vários lugares podem acessar ao mesmo tempo com
um baixo custo um STI.
• Possibilidade de construção do conhecimento por parte do aluno : apesar de alguns
programas educacionais utilizarem paradigmas behavioristas, ca nítido um direcionamento por predileções construtivistas nas teorias relacionadas aos STI. Os modelos e ferramentas têm aumentado o grau de interatividade do aluno a níveis bem
elevados.
É fato que muito ainda se tem a estudar com relação aos Sistemas Tutores Inteligentes
para que eles possam representar considerável potencial pedagógico e fazer frente à tutoria
humana. A intenção não é substituir pessoas no ensino, mas aproveitar as vantagens dos
STI para apoiar os alunos e professores no processo de ensino-aprendizagem.
2.6
Levantamento de Soluções Semelhantes
Em Píccolo et al. (2010) foram enunciados trabalhos anteriores relacionados ao ensino
introdutório de computação. Encontram-se desde o início do uso de STI tentativas diversas
de criar técnicas, ferramentas e programas que auxiliassem no ensino dos conceitos básicos
de computação. O LISP Tutor, por exemplo, foi desenvolvido por Self (1985). Esse STI
auxiliava os alunos na aprendizagem da linguagem de programação LISP. Nele, tentou-se
criar um ambiente amigável para se resolverem os problemas de programação além de
um tutor inteligente. Se o aluno por acaso cometesse um erro ao programar, planejar
o programa ou pedisse ajuda ao tutor, o programa passaria a fornecer informações para
levar o aluno à solução.
Tanto no Simpósio Brasileiro de Informática na Educação (SBIE), quanto no Workshop
sobre Educação em Computação (WEI), entre 1999 e 2003, ao menos um artigo sobre ensino de programação foi constatado (Pereira Júnior and Rapkiewicz 2004). Os softwares
observados nesses eventos apresentam diversas das funcionalidades que vão ao encontro
de características dos STI: exposição em hipertexto do conteúdo; simulação de execução
de algoritmos e/ou programas em linguagens de programação conhecida; mecanismos de
correção de código do aluno; e colaboração de soluções entre alunos para resolver problemas computacionais (Tobar et al. 2001). Simulação de diálogos com alunos (Santos Júnior
et al. 2009) também tem sido apresentadas.
28
2.6.1
Exposição e Avaliação Relacionadas ao Conteúdo
Todas as ferramentas encontradas possuíam uma parte para exposição ou avaliação
do conteúdo, ou ao menos estavam inseridas em um contexto maior que incluía esse tipo
de informação. Mota et al. (2009) mostraram em seu artigo, um software com exemplos
de programação com base em algumas estratégias didáticas. (Neto and Schuvartz 2007)
introduziu o PROGTUTOR, que possuía denições e exemplos, além de exercícios.
2.6.2
Mecanismos de Correção de Código
Barros et al. (2004) apresentaram um sistema de correção de código. O aluno submetia
um programa e instruções ligadas a seus erros e uso indevido de padrões eram retornadas ao aluno. Já o corretor de Mota et al. (2009) analisava a complexidade do código,
utilizando-se para isso de um método estatístico, e testava o código dos alunos usando
alguns testes de entrada e saida.
2.6.3
Simulação de Execução de Programas
Por serem as ferramentas mais assimiladas ao corrente trabalho, cabe detalhar mais
algumas ferramentas encontradas na literatura. Mota et al. (2009) apresentaram em sua
estrutura o JavaTool, Figura 2.9, que é uma ferramenta que simula gracamente um programa submetido a ele. Mostra-se o código fonte, uma animação criada automaticamente
e um console. O JavaTool compila o código fonte em uma linguagem de programação a
ele submetido e cria automaticamente a animação gráca do programa.
Em Souza (2009) é exposto o VisuAlg, Figura 2.10 que interpreta um programa em
uma linguagem pseudo-algorítmica, o corrige e simula sua execução passo a passo, explicitando variáveis e escopo, entre outras informações. Ele permite a execução de um
programa passo a passo, visualização do valor das variáveis, exame da pilha de ativação
(no caso de subprogramas) e contador de execuções das linhas, entre outras funcionalidades.
2.7
Classicação do TutorialICC e do Tira-Teima
Por estar inserido no contexto do TutorialICC, o Tira-Teima não é passível de classicação separada. No entanto, é possível fazer um paralelo entre o TutorialICC e seu
módulo Tira-Teima, e as classicações mencionadas na Seção 2.4. Desse modo, nesta
seção será classicado o TutorialICC, apontando-se as contribuições do Tira-Teima para
essa categorização.
Ante o exposto nas seções anteriores, não ca dúvida que o TutorialICC seja um ambiente de ensino-aprendizagem computadorizado, uma vez que ele utiliza uma metodologia
pedagógica contextualizada no ensino de programação. Dentre os dois grupos apontados por Viccari and Giraa (2003), os de aprendizagem de habilidades especícas e os
de habilidades cognitivas amplas, observa-se que por suas características, o TutorialICC
enquadra-se nos programas relacionados a habilidades especícas, no caso os fundamentos
de programação. No entanto, não ca nítida a classicação em que se encontra essa ferramenta em relação à diferenciação entre os CAI e os STI. De qualquer modo, comparando
29
Figura 2.9: JavaTool compila um código a ele submetido e roda uma animação da
execução do código
a tabela 2.1 com a descrição do TutorialICC é possível traçar um posicionamento entre
essas duas categorias.
Em relação à origem, vemos que o TutorialICC foi desenvolvido no ambiente de ciência
da computação, não só por estar sendo utilizado no curso de ICC, mas por ter sido
desenvolvido por prossionais da computação, tendo em vista um objetivo de utilizar-se
de técnicas computacionais para atingir sua nalidade pedagógica. Nesse ponto ele se
aproxima de um STI.
Quanto à base teórica, ca visível a tendência cognitivista do projeto. Os trabalhos relacionados, ainda que indiretamente, basearam-se em fontes de psicologia cognitivista. Os
processos de processo aprendizagem e sua correlação com Interação Humano-Computador
foram fundamentados em bases cognitivas no TutorialICC(David and Bezerra 2008). Outro ponto baseado em psicologia cognitiva foi a análise ergonômica de usabilidade na qual
se baseou o trabalho de Biller (2009) para propor melhorias para o Tira-Teima. Por m,
fatores cognitivos foram levantados em (Brandizzi and Nuñez 2009) para embasar a divisão dos exemplos do TutorialICC em níveis de diculdades. Também nessa característica
ele se assemelha aos STI.
No que trata da estruturação do conteúdo, como visto, o TutorialICC categoriza os
exemplos em graus de diculdade e problemas são propostos aos alunos dentro dessa
mesma categorização. Posteriormente, são apresentados problemas cujas soluções dadas
30
Figura 2.10: Visualg compila um programa escrito em pseudo-código e mostra dados
de sua execução
ao aluno levarão a uma recomendação de seqüenciamento do conteúdo ao aluno. Ou seja,
quanto mais ele mostrar que aprendeu, mais o TutorialICC orienta-o para que não passe
pelos exemplos mais detalhados de exemplos. Desse modo, nota-se que o TutorialICC não
apresenta um seqüenciamento puramente algorítmico, sendo estas feito em muitos casos
em função das respostas do aluno.
Especicamente no Tira-Teima, o aluno só simula uma linha de execução de um determinado programa na versão atual. Desse modo, para aumentar a interatividade da
apresentação do conteúdo em função do aluno, a proposta deste trabalho de possibilitar a
execução de várias linha de execução em um mesmo código vem colaborar nessa direção
de seqüenciamento baseado na interação com o aluno. Por tais características nota-se
uma mistura entre um conhecimento colocado de forma algorítmica e heurística. Portanto, embora o TutorialICC não possibilite vertentes de estruturação do conteúdo muito
complexas, ele tende a se aproximar cada vez mais de um STI nessa característica.
No que tange à avaliação das respostas, o TutorialICC em sua versão atual só avalia
a última resposta para diferenciar o seqüenciamento do conteúdo. A mudança na possibilidade de novas linhas de execução do Tira-Teima aplicada nesse trabalho também
31
não mudará esse fato, pois só se baseará na última decisão do aluno. Faltam, portanto,
técnicas de aprendizagem de máquina para levar em consideração todas as respostas anteriores do aluno (bem como a de todos os alunos) na apresentação do conteúdo e nas
estratégias didáticas. Nesse ponto, portanto, o TutorialICC acaba se distanciando dos
STI e se aproximando dos CAI.
Uma característica fundamental que separa os CAI dos STI, como visto na Seção 2.4,
é o fato de serem tomadas decisões pedagógicas levando-se em conta modelos cognitivos
do aluno e da interação dele com o programa. O mecanismo de sugestão de seqüenciamento do conteúdo de acordo com soluções do aluno a problemas de mesma natureza de
exemplos categorizados ilustra nitidamente o uso de um modelo cognitivo. O trabalho
atual também vem fortalecer esse modelo do aluno ao possibilitar diferentes linhas de execução na simulação de um programa. A suposição de que o processo de experimentação
de conseqüências na execução do programa para diferentes entradas que o aluno forneça
reforça seu entendimento, é de fato, um bom incremento no modelo do aluno. Embora a
interação proposta por essas características não seja também muito complexa, notam-se
traços próximos aos STI.
No mais, é possível apontar funcionalidades típicas de um STI elencadas por Woolf
(1988) e enunciadas no na tabela 2.2 que são usadas no TutorialICC. A modelagem do
estudante, do domínio e do tutor, bem com o aprendizado interativo são exemplos de
funcionalidades de um STI que são utilizadas no TutorialICC. A generatividade, não se
aplica ao aluno, mas se aplica ao professor, pois ao utilizar uma linguagem especíca
para a criação de exemplos dinâmicos ca caracterizado o potencial de gerar exemplos do
Tira-Teima (mesmo que com ajuda do professor). Já a generatividade, a iniciativa mista
e a auto-melhoria são funcionalidades não empregadas no TutorialICC. Note-se que tais
características não necessariamente devem estar presentes em sua totalidade para que um
software educacional possa ser classicado como um STI (Woolf 1988).
Por tais características é possível observar que apesar de possuir características de
Tutoriais (que são exemplos de CAI) nota-se um direcionamento do TutorialICC para
tornar-se cada vez mais próximo de ambientes interativos (já estes, exemplos de STI). O
TutorialICC, composto inclusive pelo módulo Tira-Teima, apresenta diversas características de um STI, não podendo ser classicado exatamente como tal, porém podendo ser
apontado como cada vez mais próximo de um Sistema Tutor Inteligente em sua natureza
predominante.
32
Capítulo 3
Atualização do Tira-Teima
Este capítulo propõe-se a descrever as soluções adotadas para os problemas enunciados,
bem como demonstrar o caminho percorrido até chegar nessas soluções. Será explicado
na Seção 3.1 o método utilizado para o desenvolvimento do programa. Na Seção 3.2 serão
descritos trabalhos preparativos que foram realizados antes da implementação das novas
soluções para o Tira-Teima. Na Seção 3.3 é mostrado como o Tira-Teima foi modicado
para poder ser utilizado com a linguagem de programação C e nas seções 3.4, 3.5 e 3.6
foram demonstrados os detalhes de como foi possibilitada no Tira-Teima a representação
de estruturas condicionais de de repetição.
3.1
Metodologia
Para cumprir os objetivos nesse trabalho foram utilizados métodos de engenharia de
software. Um dos principais modelos de processo de desenvolvimento é o modelo em
cascata. Nesse modelo, ilustrado em resumo na Figura 3.1, há o encadeamento de uma
fase do desenvolvimento de um programa computacional após a outra (Sommerville 2007).
Aplicado ao nosso caso as etapas foram:
Figura 3.1: Principais etapas do modelo cascata, adaptada de Sommerville (2007).
33
1. Análise e denição de requisitos : levantamento dos detalhes de implementação. O
professor envolvido no projeto foi entrevistado para informar a melhor maneira de
implementar as novas funcionalidades.
2. Projeto de sistema e software : projeto técnico das soluções adotadas. Enumeraramse as alterações a serem realizadas no código e se planejou uma forma de executá-las.
3. Implementação e teste : teste do programa. Foram codicadas as soluções e testes das novas partes colocadas no sistema foram realizados. As partes anteriores
também foram testadas com o objetivo de vericar se erros não foram injetados.
4. Integração e teste de sistema : integração das novas soluções ao programa principal.
As novas soluções foram integradas ao TutorialICC, vericando-se seu funcionamento em ambiente de utilização.
5. Operação e manutenção : uso e manutenção do Tira-Teima. Ficará ao encargo do
grupo desenvolvedor do TutorialICC incluir novas funcionalidades que venham a
ser projetadas para o Tira-Teima, bem como corrigir eventuais falhas ou defeitos
encontrados. O programa será colocado em uso tão logo se escrevam novos exemplos
que usem as funcionalidades criadas para o Tira-Teima.
Em oposição ao modelo cascata, modelos ágeis de desenvolvimento, como o Rational Unied Process (RUP) (Kruchten 2004), o Scrum (Schwaber and Beedle 2002) e o
XP (Beck and Andres 2004) vêm demonstrando vantagens da entrega incremental (em
partes menores) e iterativa (para cada parte, passar por todas as etapas do modelo cascata) ao invés de passar por cada etapa do modelo cascateado apenas uma vez e ao nal
entregar todo o software. Levando essas vantagens em consideração, a solução foi entregue
para avaliação a cada conclusão de melhoria. A ordem de implementação das soluções,
da primeira à última foi:
1. Portar o Tira-Teima para a linguagem C;
2. Aprimorar a visualizacão de funções;
3. Implementar ponteiros na execução do Tira-Teima;
4. Viabilizar mais de uma linha de execução no Tira-Teima;
5. Fornecer ao aluno meios de interacão com o Tira-Teima de modo que ele inuencie
em sua linha de execução.
3.2
Preparação - Interpretando e Documentando
Como posto anteriormente, este trabalho consiste em um aprimoramento de um software pré-existente. Diversos programadores, ao menos mais que seis, participaram das
etapas pelas quais passaram o Tira-Teima para chegar até o ponto em que ele se encontrava previamente a este trabalho. À época, ele estava com 7.220 linhas de código fonte1 ,
1 Essa
contagem foi feita utilizando o programa CLOC Count Lines of Code versão 1.53. Para ns
de cálculo ele não contabiliza linhas em branco nem comentários. Ademais, não foram contabilizados os
arquivos auto-gerados pelo JavaCC, mas foram incluídas as linhas do arquivo de descrição da gramática
utilizada para compilar o roteiro.
34
divididas em 69 arquivos e possuía boa parte das funcionalidades já implementadas. Uma
vez que alguns dos requisitos de aprimoramento alterariam fundamentalmente algumas
partes do programa, cou premente a necessidade de compreender o projeto ao modo
como ele estava feito.
Para interpretar o código fonte, foi necessário dominar duas frameworks soluções
genéricas prontas o Java Swing (Oracle, 2011) e o JavaCC (Oracle, 2010). O Java
Swing é uma biblioteca de classes voltadas para a criação da camada gráca, e todo o
Tira-Teima é renderizado utilizando-se o Swing. Já o JavaCC é um gerador de analisador
léxico, sintático e semântico, que é usado para descrever a linguagem em que será escrito o
roteiro do Tira-Teima. Em nível teórico foi necessário conhecer o conceito de analisadores
sintáticos descendentes recursivos, pois são estes os analisadores criados pelo JavaCC, bem
como é a notação desse tipo de analisadores que é requerida para o uso desta biblioteca.
Foi notado que, embora o código estivesse com bons padrões de projeto e um bom
uso de orientação a objetos, de certa forma o projeto carecia de mais documentação.
Tendo em vista uma melhor interpretação do programa e pretendendo dar eciência à sua
manutenção, foi documentado mais extensamente o seu código.
Para tanto, foi necessário entrevistar algumas das pessoas que participaram do projeto do Tira-Teima, de modo que se explicassem detalhes da implementação. A partir
dessas entrevistas, bem como do esforço do entendimento da equipe mencionada, foram
produzidos dois artefatos, uma documentação auto-gerada amplicada e um manual do
programador.
A documentação do código seguiu o padrão JavaDoc, um padrão utilizado por muitas
ferramentas geradoras de documentação. Um código com comentários nesse padrão podem
ser transformados em documentos hipertexto com a descrição das classes e dos métodos
do projeto, além de outras informações adicionais. A cobertura de código feita nesse
padrão por comentários desta natureza aumentou substancialmente.
Outro artefato criado neste trabalho foi o manual do programador. Esse manual
consiste em um documento que explica em termos gerais o ciclo de funcionamento do programa e entra em detalhes do funcionamento de algumas partes do programa. A intenção
ao escrever tal manual foi o de dar uma visão geral do projeto para novos participantes
que venham a contribuir com o Tira-Teima. Com esses dois artefatos em mãos espera-se
que a manutenção seja não apenas mais eciente, como também mais ecaz.
3.3
Portando o Tira-Teima para a linguagem C
Para que o Tira-Teima pudesse ser utilizado para a linguagem C, foi necessário que se
zessem algumas alterações, dentre as quais se destacam:
1. o suporte ao syntax highlighting de C;
2. ponteiros passassem a ser representados; e
3. funções fossem melhor visualizadas.
Cada uma dessas soluções foi adotada conforme segue.
35
3.3.1
Syntax highlighting
Para se manter a funcionalidade do Tira-Teima indicada na Seção 2.3.1 colorir as
palavras chave da linguagem de programação que aparece no editor de texto do programa
foi necessário desenvolver essa mesma possibilidade para C.
Considerando-se que o projeto já utilizava o JavaCC, aproveitou-se do fato de que ele
também funciona como um analisador léxico. O JavaCC, que é de código fonte aberto,
possui em sua documentação um repositório de linguagens de programação descrito em
sua syntax e em arquivos com extensão *.jj, a utilizada pelo JavaCC. Nesse repositório,
encontra-se também a descrição léxica e sintática da linguagem C, a qual foi aproveitada
para o projeto.
O analisador léxico da linguagem C gerado por essa descrição encontrada foi acoplado
ao Tira-Teima de modo que para cada palavra encontrada, de acordo com sua categoria
(identicador, palavra chave, literal, pontuação, etc.) ela recebese um estilo. Um exemplo
desse colorido das palavras chave pode ser visto na Figura 3.22 . No entanto, tomou-se o
cuidado de preservar a possibilidade de utilizar a sintaxe do Pascal.
Figura 3.2: Exemplo de highlighting em C
Para que não se perdesse a funcionalidade do syntax highlighting para Pascal, foi criado
no programa uma forma de identicar qual era o tipo de linguagem utilizado, de modo
que de acordo com a linguagem ele faça um colorido especíco. Figura-se um exemplo
2 Algoritmo
da Torre de Hanoi retirado de http://hanoitower.mkolar.org/algo.html
36
na ilustração 3.33 . Ficaram sendo suportadas, então as linguagens C e Pascal para ns
de destaque de código. Visando dar uma maior exibilidade ao Tira-Teima, foi também
provida mais uma possibilidade.
Figura 3.3: Exemplo de highlighting em Pascal
Caso seja de interesse de algum professor mostrar no Tira-Teima uma outra linguagem
(seja um pseudo-algoritmo ou alguma outra linguagem estruturada), o programa também
passou a aceitar outras linguagens em seu editor de texto. A diferença é que para linguagens que não sejam C ou Pascal, não há o destaque do código. Segue um exemplo na
Figura 3.44 Na medida da necessidade, porém, o código permanece pronto para que novas
descrições de linguagens sejam feitas e seu highlighting passe a ser aceito.
Além dessa funcionalidade de destaque do código, para utilizar o Tira-Teima para
ensinar C, era preciso representar estruturas ainda não contempladas pelo programa,
sendo uma delas os ponteiros.
3.3.2
Representação de Ponteiros
Para se ensinar C, é se suma importância o uso de ponteiros (Kernighan and Ritchie
1988). Até mesmo estruturas elementares acabam por utilizar ponteiros como strings
de tamanho variável implementadas como um ponteiro para um caractere. A passagem
por referência, por exemplo, em C só é realizável utilizando-se ponteiros. Portanto, foi
necessário criar uma representação de ponteiros pertinente no Tira-Teima.
A linguagem que descreve os roteiros utilizados no Tira-Teima não é uma linguagem
de programação propriamente dita, mais se parecendo com uma linguagem de script. Por
tal característica, se projetou uma forma de representação de ponteiros em que não se
3 Algoritmo
da Torre de Hanoi retirado de http://www.lsd.ic.unicamp.br/projetos/elane/introPascal/aula10.html
4 Pseudo-algoritmo da Torre de Hanoi retirado de http://www.realidadevirtual.com.br/cmsimple-rv
na seção aplicações, Torre de Hanoi
37
Figura 3.4: Exemplo de highlighting em pseudocódigo.
referenciasse uma variável pela outra, mas sim se representasse uma seta que, partindo
de uma variável, poderia apontar para outra posição da tela. Ponteiros nulos são representados com um ponto preto em seu centro, além de ter sua seta apagada. Foi criado,
portanto, um tipo de variável ponteiro.
Dessa forma, para fazer com que, gracamente, uma variável aponte para a outra, ca
necessário posicionar a ponta da seta que parte de uma variável para outra variável. Por
exemplo o seguinte código C abaixo poderia ser representado pelo código do roteiro que
o segue. O resultado pode ser visto na Figura 3.5.
Código Fonte em C
#include<stdio.h>
int main(int argc, char *argv[ ]){
int numero;
int *p;
p = NULL;
p = &numero;
numero = 10;
printf("%d",*p);
p = NULL;
return 0;
}
Código do Roteiro
3;
4 int numero cor(150,150,150) tamanho(80,30) posicao (350,90);
5 pointer p cor(150,150,255) tamanho(50,20) posicao (363,170);
38
6 p = null;
7 p aponta(388,130);
8 numero = 10;
9 writeln("10");
10 p = null;
11;
Figura 3.5: Exemplo de Representação Gráca de Ponteiros.
Outra funcionalidade da qual depende o ensino de C é a representação de funções.
3.3.3
Melhorias na Visualização de Funções
Para se entender a linguagem de programação C, é fundamental o entendimento de
funções e procedimentos. O próprio funcionamento básico da linguagem C inicia-se a
partir de uma função principal a main. Todas as chamadas principais de C são funções,
a função de escrita, a de leitura e até mesmo de saída. Além disso, a modularização
de sistemas é uma ferramenta essencial à computação, de modo que mesmo um curso
introdutório de ICC demanda seu aprendizado.
Previamente essas funções já estavam representadas. No entanto, como essa funcionalidade não estava em pleno uso, restavam algumas correções mínimas para serem realizadas. Em uma primeira etapa, portanto, foram corrigidos os erros e falhas detectados
na parte de funções do programa. Em seguida foi necessário incrementar a representação
de funções em prol da representação de ponteiros.
Em algumas linguagens estruturadas, como a linguagem C, funções podem receber
ponteiros como parâmetros de entrada. Em relação ao recebimento, não foi necessário alterar nada no programa, pois ao declarar uma função, a estrutura do Tira-Teima permitia
39
na declaração de parâmetros enunciar um ponteiro, tipo este recém criado na estrutura.
Na hora de chamar a função, no entanto, foi necessário poder criar um mecanismo para
passar o que seria o (endereço) de uma variável de um tipo que não seja ponteiro. Isso
seria ao que em C se representa por um e comercial, o '&'. No Tira-Teima foi adotada
uma solução análoga, que é o uso do operador cuja palavra chave é "endereco".
Já em relação à referência para variáveis fora da função foi encontrado um problema.
As funções no Tira-Teima são representadas por meio de uma divisão que se dá em seu
mostrador, de modo que na divisão inferior mostra-se tudo o que acontece dentro da
função, e um pequeno título com a assinatura da função aparece. A Figura 3.6 apresenta
um exemplo.
O que foi feito, portanto, para solucionar o problema foi criar a seguinte representação.
Dentro da função o que se mostra é um ponteiro com uma seta que aponta para um texto
cujo nome é igual ao da variável. Ressalte-se que a tarefa de escrever roteiro mais se parece
com uma linguagem em script de desenho do que programação propriamente dita. Dessa
forma, caram representadas funções. Segue um exemplo de código fonte e de roteiro.
Código Fonte
#include<stdio.h>
void incrementa (int* p){
*p = *p + 1;
}
int main(int argc, char *argv[ ]){
int x;
x = 10;
incrementa(&x);
printf("%d",x);
return 1;
}
Código Fonte
1 function incrementa(pointer p cor(150,150,255) tamanho(50,20)
posicao (20,60);):void;
7;
8 int x cor(150,150,150) tamanho(50,20) posicao (20,20);
9 x = 10;
10;
3 {start incrementa(endereco x); p aponta(45,30);
insere_texto conteudo("x") tamanho(12) posicao(34,10);}
4 x = 11;
5 end;
10;
11 writeln("11");
12;
40
Como essa parte de funções ainda estava recém criada, não havia uma entrada no
manual do professor, que descreve como escrever roteiros e usar o Tira-Teima, para esta
parte. Foi necessário ainda atualizar este manual com as novas funcionalidades.
Figura 3.6: Exemplo de Representação de Funções.
Todas as representações, ponteiros, funções e os comandos anteriormente existentes no
Tira-Teima careciam de um aumento no potencial didático. Procurou-se então encontrar
uma forma de acrescentar uma interatividade maior ao programa.
3.4
Acrescentando Entrada de Dados do Usuário
Como estava, o Tira-Teima apenas simulava a entrada de dados, ou seja, a partir de
um comando no roteiro o console do programa mostrava como se algum dado tivesse sido
recebido. Essa funcionalidade ainda permanece presente, sobretudo por uma questão de
compatibilidade com os exemplos já escritos. No entanto, se achou por bem possibilitar
que o próprio aluno fornecesse dados ao programa. Com isso, abre-se uma porta de
interatividade no programa.
Antes, os únicos elementos que o aluno podia controlar eram o uxo de execução do
código e a visualização do programa (repartição de espaço, zoom etc.). Toda a execução
do código fonte só se baseava no roteiro escrito pelo professor.
O que foi feito, portanto, foi criar o devido comando de entrada de dados. Como o
console do Tira-Teima não foi preparado para receber entrada de dados, foi criada uma
maneira diferente de receber dados. Um painel é aberto para se receber a entrada dos
41
dados do usuário. Isso auxilia também para diferenciar o que é uma entrada simulada de
uma entrada do aluno.
É vericado o tipo do dado passado pelo aluno. Logo, se houver um conito de tipo, ou
se o aluno cancelar a entrada de dados, ele ca proibido de prosseguir, sendo informado
disso. Dessa maneira evita-se inconsistência de dados, bem como a existência de uma
variável não inicializada. Veja um simples exemplo de entrada de dados, tanto os códigos
quanto seus efeitos na Figura 3.7.
Código Fonte
#include<stdio.h>
int main(){
int a;
scanf("%d",&a);
printf("%d",a);
}
Código do Roteiro
3;
4 int a cor(170,170,170) tamanho(50,20) posicao(10,10);
5 recebe(a);
6 writeln(a);
Figura 3.7: Exemplo de Representação de Entrada de Dados pelo Aluno.
Tendo sido aceitas entradas para o usuário, não necessariamente um programa real
teria uma mesma linha de execução para diferentes programas. Surgiu daí a necessidade
de possibilitar mais de um percurso para um mesmo programa.
42
3.5
Aceitando Percursos Variados para um Mesmo Programa
Em sua versão anterior, o Tira-Teima possuía apenas uma linha de execução. Ou seja,
apenas um percurso possível do programa era percorrido. Dessa forma, cava limitada
a capacidade de representação de programas. Ao aluno não era facultada a escolha de
por onde percorrer no programa, tendo-se, para tanto, que escrever um novo roteiro para
isso. Não que o Tira-Teima dessa forma não atendesse a uma nalidade didática, mas a
estaticidade com que isso era possibilitado tolhia em parte seu potencial didático.
Três características fundamentais marcavam a versão anterior em relação à premissa
de apenas uma linha de execução:
1. Ele utilizava como estrutura de dados para armazenar os passos do programa uma
lista;
2. O Tira-Teima criava toda a lista de passos que seria utilizada sempre na mesma
ordem;
3. Eram executadas operações irreversíveis nos comandos, anal, não seria necessário
executar um mesmo passo novamente.
Todas essas três características tiveram que ser alteradas para que se suportasse uma
execução condicional do código.
A primeira foi alterada substituindo-se a lista de estados por uma pilha de estados.
A partir da atualização do Tira-Teima, agora, ao andar para frente em uma linha de
execução, o Tira-Teima executa e guarda seu estado (conguração) em uma pilha. Caso
o aluno ande para trás na execução do programa, o Tira-Teima restaura o último estado
inserido na pilha. Assim ele consegue executar de maneira diferenciada o mesmo passo.
No exemplo da Seção 3.4, Figura 3.7, só era escrito um único valor para a variável 'a'.
Agora, dependendo da entrada do aluno, o valor de 'a' pode assumir diferentes valores.
A segunda foi resolvida com o uso de uma solução encontrada em algumas linguagens,
inclusive de assembly. Nessa linguagens, utiliza-se a gura do label, ou etiqueta, associado
ao uso de um comando de desvio. Logo, ao chegar em um trecho de código, se existentes
as condições de desvio, a linha de execução do código não prossegue na seqüência, mas
pula para a linha de código que contém o label informado.
Da mesma forma, aos passos do Tira-Teima foram associados labels, e foi criado o
comando de desvio, que pode ser condicional ou incondicional. De início, o Tira-Teima
ordena todos os passos em ordem seqüencial, mas só à medida que eles são executados se
decide para qual se vai, o próximo passo ou um passo com um determinado label. Detalhes
e exemplos desses tipos de desvios são abordados na Seção3.6.
Já a terceira foi resolvida de modo que todos os comandos que produziam comandos
irreversíveis, foram alterados de modo que os efeitos de sua execução eram revertidos logo
em seguida. Desse modo um comando passou a poder ser re-executado sem problemas.
Tendo alterado essas características, tornou-se possível inclusive representar estruturas
condicionais, laços e repetições.
43
3.6
Criando condicionais, laços e repetições
Em linguagens estruturadas, bem como na maioria de outras linguagens, cam evidentes os benefícios do uso de condicionais, laços e repetições. É certo que comandos
de desvios podem substituir essas estruturas nos algoritmos (inclusive ao compilarem-se
tais linguagens, normalmente é o que ocorre). Mas o que ocorre é que essas estruturas,
sendo mais bem compostas, acabam dando mais legibilidade e concisão ao código, itens
essenciais ao desenvolvimento de programas complexos.
Portanto, procurou-se nesse trabalho, sobretudo possibilitar ao aluno visualizar diferentes caminhos dentro desse tipo de estrutura. É fato que em uma linguagem de programação normal ele já pode ver os efeitos de tais condicionais. Em um depurador, até
mesmo o estado do programa pode ser consultado, embora isso seja tarefa em demasiado
complexa levando-se em consideração o contexto de disciplinas introdutórias.
Ao permitir que tais estruturas possam ser visualizadas enquanto são executadas, de
modo que o aluno participe dessa execução, o Tira Teima é acrescentado de um grande
valor didático.
Para que o Tira-Teima pudesse executar tais comandos, foi utilizada uma das alterações mencionadas na Seção 3.5, a criação de labels e comandos de desvio. Os comandos
de desvio podem ser condicionais ou incondicionais.
Os desvios
executam um teste e, sendo este verdadeiro, desviam o uxo
de execução do código para o ponto marcado pelo label correspondente. Já os desvios
, quando executados, obrigatoriamente pulam para o trecho de execução
do código marcado pelo label. Esses dois tipos de desvios, juntos, acabam viabilizando a
implementação de condicionais e comandos de repetição em suas mais variadas formas.
No entanto, a sintaxe das linguagens variam muito de uma para a outra quando se trata
desses comandos de repetição e condicionais. Entre as linguagens Pascal e C, por exemplo
bem diferentes são as estruturas de controle. Comandos como if, else, while, do-while,
entre outros, são bem conhecidos por programadores. Porém acabam por diferenciaremse muito entre si de linguagem para linguagem. Tendo em vista este aspecto, o Tira-Teima
utiliza como estruturas de controle, apenas os desvios condicionais e incondicionais.
Para que os testes dos desvios condicionais fossem viabilizados, foi necessário criar-se
uma parte de avaliação de expressões. Como posto, essas expressões são colocadas símbolo
a símbolo em uma pilha no momento de geração dos passos e interpretada e calculada
em tempo de execução. Para tanto foi utilizado o clássico algoritmo de pós-xação de
expressões5 .
Nesse algoritmo, o Tira-Teima substitui as variáveis por valores literais em uma expressão de teste. Posteriormente, ele coloca a expressão em uma forma pós-xada, tendo
em vista a precedência dos operadores. Por m calcula o valor nal da expressão. Nem
todos os operadores de todas as linguagens foram aceitos, no entando os principais e pertinentes foram trazidos para a linguagem e a sintaxe das expressões foi assemelhada à
forma usada no ANSI C6 .
condicionais
incondicionais
5 uma
versão detalhada descrita pelo professor Sérgio Furgeri pode ser vista em
http://www.sergio.pro.br/trabalhos/17_avaliacao_de_expressoes_em_estrutura_de_dados.pdf
6 Tal gramática pode ser encontrada descrita em BNF no endereço http://www.lysator.liu.se/c/ANSIC-grammar-y.html
44
Aproveitou-se que o Tira-Teima passou a calcular expressões e se melhorou o comando
de atribuição. Esse comando, que recebia apenas constantes à direita, passou a receber
também expressões à direita. Isso também foi essencial para representar comandos de
repetição que utilizam incremento de variáveis.
Ao roteirista ca incumbida a tarefa de traduzir o comando da linguagem nativa para
desvios condicionais e incondicionais. Seguem alguns exemplos de estruturas de controle
e sua representação no Tira-Teima.
3.6.1
Condicionais Exempo: Se-Senão (if -else )
Nas linguagens de programação são encontradas estruturas condicionais. Essas estruturas, que na linguagem C são representadas pela notação if -else, proporcionam seguir
por duas ou mais linhas de execução a partir de uma ou mais decisões. Segue um exemplo
dessa funcionalidade com o códigos fonte na linguagem C e na linguagem do roteiro, bem
como na Figura 3.8, o resultado do Tira-Teima para estes dois códigos.
Código Fonte
#include<stdio.h>
int main(){
int a;
scanf("%d",&a);
if((a>=0) && (a<5))
printf("número entre 0 e 5");
else
printf("número negativo ou maior que 6");
return 0;
}
Código do Roteiro
3;
4 int a cor(170,170,170) tamanho(50,20) posicao(10,10);
5 recebe(a);
6 se ((a>=0) && (a<5)) vaipara(label1);
9 {writeln("número entre 0 e 5"); vaipara(label2);}
7 label1: writeln("número negativo ou maior que 6");
10 label2:;
3.6.2
Repetições Exemplo: Enquanto (while )
Nas linguagens de programação são encontradas também estruturas de repetição. Essas estruturas, que na linguagem C são representadas, entre outras, pela notação while,
viabilizam meios para a repetição de um determinado trecho de código (laços). Segue
um exemplo dessa funcionalidade com o códigos fonte na linguagem C e na linguagem do
roteiro, bem como na Figura 3.9, o resultado do Tira-Teima para estes dois códigos.
Código Fonte
45
Figura 3.8: Exemplo de Comando do Tipo Se-Senão.
#include<stdio.h>
int main(){
int a;
scanf("%d",&a);
while(a < 10){
a = a + 1;
printf("valor: %d\n",a);
}
return 0;
}
Código do Roteiro
3;
4 int a cor(170,170,170) tamanho(50,20) posicao(10,10);
5 recebe(a);
6 label1: se(!(a<10)) vaipara(label2);
7 a = a + 1;
8 {writeln("valor: ",a); vaipara(label1);}
9 label2:;
10;
3.6.3
Repetições Exemplo: Para (for
Outra forma de representar, na linguagem C, as repetições é por meio da utilização
da estrutura for. Segue um exemplo de como caria uma repetição dessa natureza com
46
Figura 3.9: Exemplo de Comando do Tipo Enquanto.
o códigos fonte na linguagem C e na linguagem do roteiro, bem como na Figura 3.10, o
resultado do Tira-Teima para estes dois códigos.
Código Fonte
#include<stdio.h>
int main(){
int max,cont;
scanf("%d",&max);
for(cont = 0; cont <= max; cont++){
printf("valor: %d\n",cont);
}
return 0;
}
Código do Roteiro
3;
4 {int max cor(170,170,170) tamanho(50,20) posicao(10,10);
int cont cor(0,170,170) tamanho(50,20) posicao(110,10);}
5 recebe(max);
6 cont = 0;
6 label_for: se(cont <= max) vaipara(begin_for);
8 vaipara(end_for);
7 begin_for:writeln("valor de cont: ",cont);
6 {cont = cont + 1; vaipara(label_for);}
9 end_for:;
47
Figura 3.10: Exemplo de Comando do Tipo Para.
Para implementar essas funcionalidades foi necessária a criação de alguns novos comandos, os quais seguem descritos no apêndice A.
48
Capítulo 4
Conclusão
O presente trabalho, ao contribuir com o Tira-Teima, conferiu ao TutorialICC uma
maior interatividade e versatilidade, o que auxilia este tutorial em sua busca pela efetividade.
Em termos de métricas, ao nal deste projeto o programa evoluiu de 7.220 linhas de
código fonte1 , divididas em 69 arquivos, para 8.714 linhas de código fonte2 , divididos em
78 arquivos. Em relação à documentação JavaDoc, esta passou de 2.165 linhas para 2.789
linhas3 . Isso representa, em estimativa, um acréscimo de 21% de linhas de código fonte e
de 29% de documentação. Apesar de essas métricas não medirem a qualidade do software,
são válidas para estimar o seu crescimento.
Em termos de continuidade do presente trabalho, muito ainda se pode melhorar em
relação ao Tira-Teima. Seguem propostas de melhorias a serem realizadas:
•
Escrever mais exemplos: embora novas funcionalidades tenham sido adicionadas
ao Tira-Teima, estas ainda não estão em uso. Dessa forma, para que sejam aproveitadas as melhorias realizadas será necessário escreverem-se novos exemplos e serem
estes adicionados ao Tutorial;
•
Criar um gerador de roteiro: atualmente um dos principais gargalos na criação
de exemplos é a escrita dos roteiros. Uma ferramenta visual que desonerasse o
professor de dominar a linguagem do roteiro, aumentaria muito a produtividade em
termos de produção de exemplos;
•
Colocar diálogos interativos com o aluno: a iniciativa mista, um dos recursos
oferecidos por Sistemas Tutores Inteligentes, enriqueceria muito o TutorialICC, ou
mais especicamente, o Tira-Teima. Talvez a utilização do método socrático para
diálogo, introduzindo-se perguntas ao aluno, ou mesmo possibilitando ao aluno tirar
dúvidas enquanto utiliza o Tira-Teima congurar-se-ia como um grande avanço a
este software educacional;
1 Essa
contagem foi feita utilizando o programa CLOC Count Lines of Code versão 1.53. Para ns
de cálculo ele não contabiliza linhas em branco nem comentários. Ademais, não foram contabilizados os
arquivos auto-gerados pelo JavaCC, mas foram incluídas as linhas do arquivo de descrição da gramática
utilizada para compilar o roteiro.
2 Também foi incluído na contagem a descrição da linguagem C que foi utilizada para gerar o Syntax
Highlighting de C.
3 O cálculo de linhas de comentários foi realizada também se utilizando o programa CLOC 1.53.
49
•
Avaliar Pedagogicamente o Tira-Teima: mesmo já sendo o Tira-Teima uma
ferramenta amplamente utilizada na Universidade de Brasília, tanto as funcionalidades já utilizadas quanto as novas acrescentadas não passaram por uma avaliação
pedagógica criteriosa, a qual poderia fornecer um importante retorno de sua evolução;
•
Refatorar o Código: o projeto do Tira-Teima já sofreu diversas alterações ao
longo do tempo. Tais alterações deixaram no código fonte estruturas que não mais
são necessárias. De certa forma, estas estruturas acabam produzindo complicações
desnecessárias que dicultam a manutenção do código. Em parte o código já foi
refatorado neste trabalho, no entanto, esse aspecto ainda pode ser melhorado;
•
Ampliar a Documentação: a documentação do Tira-Teima foi ampliada pelo
presente trabalho, embora ela ainda possa ser melhorada. O manual do professor
carece de explicações mais detalhadas de como alcançar todo o potencial do TiraTeima. Os professores que hoje utilizam o roteiro detém a informação, porém ela
não está devidamente positivada, o que dicultaria a aprendizagem por parte de
novos participantes.
Acredita-se que o TutorialICC tem auxiliado substancialmente a Universidade de Brasília no ensino de Introdução a Ciência da Computação. O Tira-Teima, objeto deste
trabalho, também tem contribuido para esse objetivo. Diante do contexto de ensino de
disciplinas básicas de computação marcado por diculdades em ensinar e aprender o
TutorialICC tem se mostrado como uma ferramenta efetiva para difundir o conhecimento.
O caminho trilhado pelo TutorialICC na direção de um Sistema Tutor Inteligente
também se congura em uma boa escolha. Tutores inteligentes, em detrimento de meros
passadores de páginas eletrônicos, são cada vez mais utilizados não em substituição ao
tutor humano, mas em apoio ao ensino-aprendizado de disciplinas cujo contexto permite
ou demanda ferramentas dessa natureza. E o ensino inicial de programação, sobretudo
na Universidade de Brasília, se enquadra nesse tipo de contexto.
Inúmeras pessoas já participaram do desenvolvimento dos diversos módulos componentes do TutorialICC. A inteligência articial, cujo uso tanto é buscado na área de softwares
educacionais, só se tem tornado possível em suas formas atuais mediante a conjunção do
conhecimento de diversas pessoas em um só objeto de ensino-aprendizagem. Para o TutorialICC, em especial para seu módulo Tira-Teima, essa máxima também é verdadeira.
Como foi dito por Elaine Rich, "Um dos poucos resultados concretos obtidos nos primeiros vinte anos da pesquisa de inteligência articial, é o fato de que a inteligência requer
conhecimento.".
50
Referências
J. R. Anderson, S. Betts, J. L. Ferris, and J. M. Fincham. Neural imaging to track mental
states while using an intelligent tutoring system. Proceedings of the National Academy
of Sciences, 107(15):7018, 2010. 20
L. N. Barros, K. V. Delgado, and A. C. Machion. ITS for Programming to Explore
Practical Reasoning. XV Simpósio Brasileiro de Informática na Educação, 2004. 29
K. Beck and C. Andres. Extreme programming explained: embrace change. AddisonWesley Professional, 2004. ISBN 0321278658. 34
A. Biller. Usabilidade na ferramenta tira-teima do tutorial de icc, 2009. 1, 2, 30
A. V. N. Brandizzi and Y. M. Nuñez. Taxonomia de problemas para aprendizagem de
programação, 2009. 1, 5, 30
H. L. Burns and C. G. Capps. Foundations of intelligent tutoring systems: an introduction.
Foundations of intelligent tutoring systems, pages 119, 1988. 22
A. T. Corbett, K. R. Koedinger, and J. R. Anderson. Intelligent tutoring systems (Chapter
37). MG Helander, TK Landauer, & P. Prabhu,(Eds.) Handbook of Human-Computer
Interaction, 1997. 17
Oracle Corporation. Javacc - project kenai, 2010. URL http://java.net/projects/
javacc.
Creating a gui with jfc/swing, 2011. URL http://download.
oracle.com/javase/tutorial/uiswing.
Oracle Corporation.
R. Costa and V. M. B. Werneck. Tutores Inteligentes. Rio de Janeiro: COPPE/UFRJ,
1996. 23
L. M. David and X. S. Bezerra. Tutorial utilizando princípios de ihc: o caso da disciplina
de introdução à ciência da computação, 2008. 1, 30
L. M. M. Giraa. Fundamentos de Teorias de ensino-aprendizagem e sua aplicação em
Sistemas Tutores Inteligentes. Porto Alegre: CPGCC/UFRGS, 1995. 12
S. Y. Jung and K. Van Lehn. Developing an Intelligent Tutoring System Using Natural
Language for Knowledge Representation. In Intelligent Tutoring Systems, pages 355
358. Springer, 2010. 20
51
B. W. Kernighan and D. M. Ritchie. The C programming language. Citeseer, 1988. 2, 37
P. Kruchten. The rational unied process: an introduction. Addison-Wesley Professional,
2004. ISBN 0321197704. 34
D. C. Merrill, B. J. Reiser, M. Ranney, and J. G. Trafton. Eective tutoring techniques:
A comparison of human tutors and intelligent tutoring systems. Journal of the Learning
Sciences, 2(3):277305, 1992. 14, 27
M. P. Mota, S. R. Brito, M. P. Moreira, and E. L. Favero. Ambiente Integrado à Plataforma Moodle para Apoio ao Desenvolvimento das Habilidades Iniciais de Programação.
XX Simpósio Brasileiro de Informática na Educação, 2009. 29
W. C. B. Neto and A. A. Schuvartz. Ferramenta Computacional de Apoio ao Processo
de Ensino-Aprendizagem dos Fundamentos de Programação de Computadores. XVIII
Simpósio Brasileiro de Informática na Educação, 2007. 29
S. Ohlsson. Some principles of intelligent tutoring. Instructional Science, 14(3):293326,
1986. 24, 25
Z. Pardos, M. Dailey, and N. Heernan. Learning what works in ITS from non-traditional
randomized controlled trial data. In Intelligent Tutoring Systems, pages 4150. Springer,
2010. 20
H. L. Píccolo, V. F. Sena, K. B. Nogueira, M. O. da Silva, and Y. A. N. Maia. Ambiente Interativo e Adaptável para Ensino de Programação. XXI Simpósio Brasileiro de
Informática na Educação, 2010. 4, 28
J. C. Pereira Júnior and C. E. Rapkiewicz. O Processo de Ensino-Aprendizagem de
Fundamentos de Programação: Uma Visão Crítica da Pesquisa no Brasil. WEI, I,
2004. 7, 28
G. P. S. Santos Júnior, J. M. Fechine, and E. B. Costa. Analogus: Um Ambiente para
Auxílio ao Ensino de Programação Orientado pelo Raciocínio por Analogia. XVII WEI.,
2009. 28
D. Saviani. Pedagogia histórico-crítica: primeiras aproximações. Autores associados,
2005. 14
K. Schwaber and M. Beedle. Agile software development with Scrum, volume 18. Prentice
Hall Upper Saddle River, NJ, 2002. 34
J. Self. The Lisp Tutor. Byte, 10(4):159175, 1985. 28
J. Self. Computational Mathetics: the missing link in Intelligent Tutoring Systems research? NATO ASI SERIES F COMPUTER AND SYSTEMS SCIENCES, 91:3838,
1993. 22
J. Self. The dening characteristics of intelligent tutoring systems research: ITSs care,
precisely. International Journal of Articial Intelligence in Education, 10(3-4):350364,
1999. vii, 3, 17, 20, 21
52
R. Sison and M. Shimura. Student modeling and machine learning. International Journal
of Articial Intelligence in Education, 9(1-2):128158, 1998. 22
D. Sleeman. 9. Assessing aspects of competence in basic algebra. In Intelligent tutoring
systems, page 185. Academic Press, 1982. 17
I. Sommerville. Engenharia de Software. Pearson Addison Wesley, 8a edition, 2007. vii,
33
C. M. Souza. VisuAlg - Ferramenta de Apoio ao Ensino de Programação. Revista TECCEN, 2(2):159175, setembro 2009. 29
R. Taylor. The Computer in the School: Tutor, Tool, Tutee. 1980. 11
C. M. Tobar, J. L. G. Rosa, J. M. A. Coelho, and R. Pannain. Uma Arquitetura de
Ambiente Colaborativo para o Aprendizado de Programação. XII Simpósio Brasileiro
de Informática na Educação., 2001. 28
R. M. Viccari. Um tutor inteligente para a programação em lógica: idealização, projecto
e desenvolvimento. 1990. 17, 20, 23
R. M. Viccari and L. M. M. Giraa. Fundamentos dos Sistemas Tutores Inteligentes.
Capítulo do Livro: Sociedades Articiais, 2003. vii, 11, 12, 13, 14, 15, 16, 17, 19, 23,
24, 25, 26, 29
B. Woolf. Intelligent tutoring systems: A survey. pages 143, 1988. 14, 32
B. P. Woolf. Building intelligent interactive tutors. Elsevier, 2007. viii, 17, 18, 21, 22, 23,
24, 27
53
Apêndice A
Comandos Adicionados ao Tira-Teima
Para criar as novas funcionalidades foi necessário acrescentar alguns comandos ao TiraTeima. Esses comandos possuem uma sintaxe descrita na linguagem do roteiro e serão
aqui mostrados. Para cada comando será denida a expressão geral usando a notação
BNF, será dado um exemplo e serão explicados os efeitos na visualização do programa.
Foram acrescentados os seguintes
ao Tira-Teima:
comandos
1.
Ponteiro Aponta Para: faz com que um ponteiro referencie uma variável.
• Expressão Geral:
<variável> aponta (<x>,<y>);
• Exemplo:
p1 aponta (50,75);
• Efeito:
Do ponteiro p1 parte uma seta que vai até a posição (50,75).
2.
Ponteiro Insere Texto: insere uma palavra no mostrador (onde cam as variá-
veis). Serve para referenciar uma variável fora do escopo.
• Expressão Geral:
insere_texto conteudo(<string>) tamanho(<pontos>) posicao(<x>,<y>);
• Exemplo:
insere_texto conteudo("var1") tamanho(12) posicao(100,90);
• Efeito:
54
É escrito o texto "var1"com o tamanho 12pt na posição (100,90).
3.
Lê do Aluno: lê uma entrada a ser fornecida pelo aluno.
• Expressão Geral:
recebe(<variável>);
• Exemplo:
recebe(a);
• Efeito:
É aberto um painel pop-up com um campo para o aluno fornecer o valor da
variável 'a'.
4.
Salto Incondicional: altera o uxo de execução do código incondicionalmente.
• Expressão Geral:
vaipara(<label>);
• Exemplo:
vaipara(label1);
• Efeito:
Pula do passo atual para o passo que possui o label 'label1'.
5.
Salto Condicional: altera o uxo de execução do código apenas se uma expressão
for verdadeira.
• Expressão Geral:
se(<expressão>) vaipara(<label>);
• Exemplo:
se(a>=0 && a<6) vaipara(label1);
• Efeito:
55
Se 'a' estiver entre 0 e 5, pula do passo atual para o passo cujo label é 'label1'.
6.
Expressões: são utilizadas tanto em saltos condicionais quanto à direita de atribuições.
Essas expressões assemelham-se a quaisquer linguagens de programação, contemplando alguns operadores, os quais possuem uma ordem de precedência. Veja na
tabela os operadores e suas precedências,
. Os
operadores na mesma linha possuem a mesma precedência:
da mais alta para a mais baixa
Operador
()
!
*/%
+> < >=
<=
== !=
&& ||
Descrições
parênteses
negação
multiplicação, divisão e módulo
adição e subtração
maior, menor, maior ou igual e
menor ou igual
igual e diferente
e, ou
Associatividade
da
da
da
da
da
esquerda para a direita
direita para a esquerda
esquerda para a direita
esquerda para a direita
esquerda para a direita
da esquerda para a direita
da esquerda para a direita
Tabela A.1: Tabela de Operadores
Alguns outros comandos, por sua vez, precisaram ser alterados. Mesmo diferentes,
esses comandos mantêm a compatibilidade com os exemplos previamente escritos. Segue
abaixo a lista dos que foram modicados, suas expressões gerais, exemplos e alterações:
1.
Passo: adiciona um passo (um ou mais comandos) ao Tira-Teima.
• Expressão Geral:
<número da linha>[<label>:] <comando>;
• Exemplo:
10 label1: a = a + 1;
• Alteração:
Agora o passo poderá receber um label para ns de controle de saltos.
2.
Inicia Função: inicializa uma função no programa.
• Expressão Geral:
start <nome da função>(<lista de parâmetros>);
56
em que
<lista de parâmetros> := <parametro>[,<parametro>]*
e que
<parametro> := [endereco]<variável> OU <constante>
• Exemplo:
start foo(a, endereco b, 7.2);
• Alteração:
Além de receber constantes e variáveis na lista de parâmetros, pode agora
receber a referência para (endereço de) uma variável.
3.
Atribuição: atribui um valor a alguma variável.
• Expressão Geral:
<variável> = <expressão>;
• Exemplo:
b = a * (2 + c);
• Alteração:
Agora o passo recebe expressões à direita das atribuições.
57