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 = 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