Академический Документы
Профессиональный Документы
Культура Документы
Orientador
Prof. Dr. Homero Luiz Pı́ccolo
Brası́lia
2009
Universidade de Brası́lia — UnB
Instituto de Ciências Exatas
Departamento de Ciência da Computação
Curso de Computação — Licenciatura
CDU 004
Prof.ª Dr.ª Maria de Fátima R. Brandão Prof.ª Dr.ª Carla Cavalcante Koike
CIC/UnB CIC/UnB
Agradeço, acima de tudo, a meus saudosos pais, que me deram a melhor educação possı́vel;
a meus tios Nataniel e Ana, que me apoiaram nos momentos difı́ceis; a minhas irmãs, que
sempre me apoiaram, e a Juliana Vilela, que esteve ao meu lado durante grande parte do
curso. Agradeço à Universidade de Brası́lia, pelo ensino de alta qualidade; aos professores
do departamento, pelo conhecimento, técnico ou não, transmitido e pela compreensão e
apoio. Agradeço especialmente ao professor Homero, pela orientação sábia, dedicada e
paciente. Por fim, agradeço a todos os companheiros universitários que me apoiaram,
especialmente ao amigo Pedro, que muito me ajudou no começo do curso, e ao parceiro
de projeto Yuri, cujo trabalho foi indispensável. A todos citados, e aos que não pude
citar, muito obrigado.
iv
Resumo
v
Abstract
Students have different learning paces. In order to satisfy their different needs, educational
materials at different complexity levels are necessary. In this work, we propose a set of
programming examples with various complexity levels for students who are learning how
to program computers. This set will be integrated to Tutorial ICC, a computer-assisted
learning system. It is one more step to add adaptability to Tutorial ICC, approaching it
to intelligent tutoring systems.
vi
Sumário
1 Introdução 1
1.1 Problemas e Justificativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Metodologia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.4 Resultados esperados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2 O Ensino de Programação 4
2.1 A dificuldade de ensinar a programar . . . . . . . . . . . . . . . . . . . . . 4
2.2 Fatores cognitivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.3 Fatores pedagógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.4 Proposta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
4 Taxonomias de Exemplos 15
4.1 Taxonomia hierárquica de exemplos . . . . . . . . . . . . . . . . . . . . . . 15
4.2 Enunciados e soluções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.3 “Tira-teima” e roteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.4 Localização na taxonomia . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.5 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5 Exemplos de Taxonomias 23
5.1 Árvore 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5.1.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 23
5.1.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 24
5.1.3 Enunciados e programas . . . . . . . . . . . . . . . . . . . . . . . . 24
5.1.4 Comentários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5.2 Árvore 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5.2.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 28
5.2.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 28
vii
5.2.3 Enunciados e programas . . . . . . . . . . . . . . . . . . . . . . . . 28
5.2.4 Comentários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5.3 Árvore 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
5.3.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 34
5.3.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 34
5.3.3 Enunciados e programas . . . . . . . . . . . . . . . . . . . . . . . . 34
5.3.4 Comentários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.4 Árvore 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.4.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 42
5.4.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 42
5.4.3 Enunciados e programas . . . . . . . . . . . . . . . . . . . . . . . . 42
5.4.4 Comentários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.5 Árvore 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.5.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 49
5.5.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 49
5.5.3 Enunciados e programas . . . . . . . . . . . . . . . . . . . . . . . . 49
5.5.4 Comentários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.6 Árvore 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5.6.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 62
5.6.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 62
5.6.3 Enunciados e programas . . . . . . . . . . . . . . . . . . . . . . . . 62
5.6.4 Comentários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Referências 75
viii
B.2.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
B.3 Árvore 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
B.3.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 83
B.3.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 83
B.3.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
B.4 Árvore 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
B.4.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 84
B.4.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 84
B.4.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
B.5 Árvore 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
B.5.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 85
B.5.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 85
B.5.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
B.6 Árvore 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
B.6.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 86
B.6.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 87
B.6.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
B.7 Árvore 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
B.7.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 88
B.7.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 88
B.7.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
ix
D Taxonomias do Capı́tulo 6 do Tutorial ICC 96
D.1 Árvore 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
D.1.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 96
D.1.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 96
D.1.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
D.2 Árvore 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
D.2.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 97
D.2.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 97
D.2.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
D.3 Árvore 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
D.3.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 98
D.3.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 99
D.3.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
D.4 Árvore 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
D.4.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 100
D.4.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 100
D.4.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
D.5 Árvore 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
D.5.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 101
D.5.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 101
D.5.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
D.6 Árvore 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
D.6.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 102
D.6.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 102
D.6.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
x
Lista de Tabelas
xi
Lista de Figuras
xii
Siglas e Acrônimos
1
Também é comum a forma, para efeitos gerais equivalente nesta monografia, computer-aideld learning.
2
Também é comum a forma, para efeitos gerais equivalente nesta monografia, ensino a distância.
xiii
Capı́tulo 1
Introdução
1
1.1 Problemas e Justificativa
Embora programação seja uma das atividades fundamentais na Ciência da Computação,
muitos estudantes tem grandes dificuldades para aprender a programar (Jenkins, 2003;
Gomes e Mendes, 2007). Por outro lado, a demanda por cursos que exigem conhecimento
de programação têm crescido bastante (ACM, 2005). Desse modo, é de grande interesse
que se consigam ferramentas educacionais que auxiliem os estudantes no processo de
ensino-aprendizagem de programação. Também tem crescido o interesse em ferramentas
que auxiliem o professor a ministrar cursos de programação a um número crescente de
alunos; em outras palavras, é necessário criar ferramentas que acrescentem escalabilidade
aos cursos de programação.
Tem-se tentado satisfazer a necessidade de escalabilidade no ensino de programação
através de do uso de ferramentas tutoriais remotas, especialmente sistema tutorial baseado
em Webs (STBWs). Entretanto, cursos remotos podem dificultar a aprendizagem do
aluno, que não contaria com o apoio constante de um professor. Uma possı́vel solução
para o problema da dificuldade de aprendizagem através de STBWs é permitir que tais
tutoriais se adaptem ao ritmo e necessidade dos estudantes. Isso é possı́vel, através do
uso de STIs.
O Tutorial ICC é, desde já, um STBW que evolui aos poucos para um STI. Este
trabalho dá mais um passo nessa direção, a saber, fornecer exemplos que possam ser
utilizados em um STI.
1.2 Objetivos
O objetivo geral deste trabalho é desenvolver um conjunto de taxonomias hierárquicas de
exemplos para o ensino de programação para os alunos da disciplina Introdução à Ciência
da Computação (ICC).
Os objetivos especı́ficos deste trabalho, por sua vez, são:
1.3 Metodologia
Propusemos e implementamos uma série de taxonomias de exemplos organizada hierarqui-
camente em nı́veis de dificuldade. Essa taxonomia foi influenciada também por pesquisas
publicadas, mas em sua maior parte é a aplicação do conhecimento empı́rico e longa
2
experiência de professores de programação da Universidade de Brası́lia (UnB). Há uma
taxonomia para cada capı́tulo atual do Tutorial ICC, exceto o primeiro e o último (oitavo).
Para desenvolver uma taxonomia, identificamos os conceitos e habilidades que estu-
dantes de programação podem ter dificuldade de apreender em um determinado capı́tulo.
Concebemos, então, problemas que exercitem cada um dos conjuntos de conceitos pro-
postos.
Para cada um desses problemas, desenvolvemos versões simplificadas de modo a criar
árvores de problemas em que cada problema exercita um subconjunto dos conjuntos de
conceitos. Escrevemos, então, enunciados para cada um dos problemas, incluindo os
problemas que exercitem todos os conceitos de um conjunto.
Uma vez que tivemos um conjunto de enunciados que podiam apresentar os conceitos
escolhidos, programamos soluções para os enunciados, em Pascal. Criamos também scripts
que, aliados com uma applet em Java já desenvolvida, permitem representar graficamente
a execução dos programas escritos.
Por fim, integramos os enunciados, os programas e os scripts gerados para cada
capı́tulo ao Tutorial ICC. Também desenvolvemos e implantamos uma representação
gráfica das taxonomias hierárquicas, para auxiliar o aluno a se localizar em uma de-
terminada taxonomia.
3
Capı́tulo 2
O Ensino de Programação
4
2.2 Fatores cognitivos
Vários fatores cognitivos são relevantes para a maior ou menor facilidade na aprendizagem
de programação. O primeiro fator são os estilos de aprendizagem. Estudantes aprendem
de maneiras diferentes: estudando sozinho ou em grupo, estudando em detalhes ou su-
perficialmente a disciplina. Vários componentes de uma disciplina podem exigir maneiras
diferentes de se estudar. Usualmente, estudantes tendem a escolher os estilos que melhor
lhes serviram previamente para aprender algo, mas esse estilo pode não ser adequado para
um determinado ponto do estudo de programação (Jenkins, 2003).
Como exemplo, consideremos os estilos de aprendizagem classificados como aborda-
gem aprofundada e abordagem superficial. A abordagem aprofundada é aquela na qual o
estudante busca pela compreensão do tópico, enquanto a abordagem superficial é aquela
na qual o estudo resume-se a pouco mais que memorizar as informações. Programação
é uma atividade que exige o uso de ambas as abordagens: enquanto é necessário um
conhecimento mı́nimo, mesmo que vago, das regras léxicas e sintáticas da linguagem de
programação utilizada, uma compreensão profunda da semântica e dos conceitos abstra-
tos sobre programação é exigido. No caso, não só é necessário que se utilize ambas as
abordagens em vários pontos da disciplina; é exigido que ambas as abordagens sejam
utilizadas ao mesmo tempo (Jenkins, 2003).
Os estilos de aprendizagem podem também variar de acordo com os tipos psicológicos.
Alunos têm estilos de aprendizagem diferentes, que influenciam em seus métodos e pre-
ferências de estudo. Alguns preferem pensar em termos mais abstratos, enquanto outros
podem preferir conceitos mais concretos e aplicados; alguns alunos preferem métodos
sistemáticos de estudos, enquanto outros “deixam-se levar” pelo tema (Keirsey, 1998).
Ocorre que programação exige tanto raciocı́nio abstrato quanto concreto; por vezes, exige
método rı́gido e, noutras, experimentação avulsa. Inclusive, há problemas que são mais
facilmente resolvı́veis de uma forma que de outra. O estudante, porém, usualmente es-
colhe explorar o tema da programação apenas através da maneira que mais lhe agrada,
e tenta utilizar sua abordagem preferida sem considerar o caráter do problema. Uma
pesquisa preliminar focando no estilo de aprendizagem do aluno, com possı́vel aplicação
futura no Tutorial ICC, foi desenvolvido por Chaves Júnior e Bastos (2008). Outras pes-
quisas poderão abordar as práticas necessárias na aprendizagem de programação, dando
um primeiro passo no trabalho sobre as diversas maneiras de estudar de cada tipo de
estilo de aprendizagem.
Outro fator importante — e problemático — no estudo de programação é a motivação.
Enquanto vários alunos aprendem a programar por vontade própria e interesse pessoal
— em outras palavras, por motivação intrı́nseca —, outros estudantes o fazem em busca
de uma carreira financeiramente rentável ou apenas para obter diploma em um curso
superior qualquer — ou seja, por motivação extrı́nseca. Previsivelmente, alunos com mo-
tivações intrı́nsecas apresentam um desempenho melhor em aprendizagem que alunos com
motivações extrı́nsecas. Entretanto, a motivação extrı́nseca não é, de maneira alguma,
Entretanto, tais estudantes são uma minoria e, afinal, vários dos estudantes que demonstram grande
habilidade em diversas outras áreas da Computação também têm dificuldades especı́ficas em solucionar
problemas com código.
5
um empecilho para a aprendizagem, de modo que estudantes com tais interesses não são
“casos perdidos” (Jenkins, 2003).
Além disso, existem diversos “ bugs” conceituais que afetam a maneira como pro-
gramadores iniciantes programam e lêem programas. Por exemplo, é usual que o aluno
imagine que o programa é, em certo sentido, executado de uma vez só — o que é usu-
almente chamado de “bug” de paralelismo; também ocorre de programadores iniciantes
lerem instruções de código subentendendo intenções e não apenas seu significado (“bug”
de intencionalidade) ou de escreverem código que em seu raciocı́nio produza o efeito de-
sejado, mas que possui menos semântica que a necessária (“bug” de egocentrismo) (Pea,
1986). A catalogação e estudo desses “bugs” já vem de longo tempo e inclui artigos como
Pea (1986) e Spohrer e Soloway (1986).
6
Por fim, podemos citar também a grande heterogeneidade de estudantes nas turmas
de programação. Como o curso de programação é um dos primeiros a serem ministrados,
há em suas turmas estudantes dos mais diversos backgrounds e perfis. Como tais cursos
não raramente ainda seguem uma estrutura bastante tradicional de aula expositiva, seus
professores não dispõem de tempo e energias suficientes para atender pessoalmente cada
um dos alunos. De fato, a falta de personalização nos cursos e o desgaste do professor
são apontadas por vários pesquisadores como causas significativas para mau desempenho
de estudantes de programação (Jenkins, 2003)(Gomes e Mendes, 2007)(Lahtinen et al.,
2005).
2.4 Proposta
A ferramenta que pretendemos expandir — o Tutorial ICC — pode solucionar ou, ao
menos, amenizar vários dos problemas que afligem os estudantes e professores de pro-
gramação. A proposta do tutorial, a longo prazo, é tornar-se um sistema tutorial dotado
de inteligência, objetivo para o qual esse trabalho oferece mais um pequeno passo. Para
compreender como um sistema tutorial dotado de inteligência pode auxiliar o ensino de
programação, precisamos ver, antes o que são sistemas tutoriais inteligentes.
mais avançados e “práticos”. Entretanto, esta é apenas uma evidência anedótica: embora realmente te-
nhamos conhecidos alguns estudantes que reclamassem dessa demora (especialmente em versões antigas
do currı́culo dos nossos cursos), não sabemos quantos realmente reclamavam. Eis uma área digna de
pesquisa.
7
Capı́tulo 3
Sistemas tutoriais inteligentes (do inglês intelligent tutoring systems) são sistemas de
aprendizagem auxiliados por computador (SAAC) que se adaptam, sem necessidade de
contı́nua intervenção humana, às necessidades e ao desempenho do aluno (Self, 1999).
Esses sistemas são um caso especial dos sistemas de instrução auxiliada por computador
(do inglês computer aided instruction) que almejam utilizar tecnologias informáticas no
processo de ensino (Freedman, 2000). Tais sistemas se popularizaram bastante nas escolas
e empresas durante os anos 80 e 90, sendo utilizados para transmitir as mais variadas
competências e conhecimentos (Murray, 1999).
O Tutorial ICC evolui para adquirir, se não o caráter de um sistema tutorial inteligente
em todos os aspectos, ao menos algumas caracterı́sticas e funções de sistemas tutoriais
inteligentes, tornando-se um sistema tutorial dotado de inteligência. O corrente trabalho
é mais um passo nessa direção.
8
do estudante, com especial ênfase em enganos comuns. Alternativas aos módulos “caixa
preta”, os módulos “caixa de vidro” são usualmente baseados em formalismos dos co-
nhecimentos a serem apresentados. Seu desenvolvimento no geral depente do auxı́lio de
engenheiros de conhecimento, que após entrevistar especialistas, cria uma representação
computacinal do conhecimento a ser transmitido (Burns e Capps, 1988).
O módulo do estudante tenta simular o comportamento de um estudante, de modo a
poder prever qual o melhor passo a ser dado. No projeto desse módulo, Burns e Capps
(1988) chama a atenção para três dimensões a serem levadas em conta. Primeiro, é
necessário saber que informações temos sobre o comportamento do usuário do sistema. A
maioria dos sistemas tutoriais inteligentes só tem acesso às respostas dadas pelo aluno às
questões propostas.1 Segundo, convém distinguir qual a categoria do conhecimento que se
tenta transmitir; isto é, é preciso ter em mente se queremos transmitir um conhecimento
procedural (conhecimento sobre como executar uma tarefa), declarativo (conhecimento
sobre fatos em geral, sem necessária aplicação) ou mesmo qualitativo (habilidade em
fazer julgamentos e tirar conclusões de modelos mentais). Por fim, Burns e Capps (1988)
chama a atenção para a necessidade de se distinguir diferenças entre o estudante e o
módulo especialista. Tradicionalmente, usa-se a representação do conhecimento do próprio
módulo especialista na implementação do módulo do estudante; sistemas mais avançados,
porém, também fornecem uma biblioteca de erros que permitem que o sistema reaja de
maneira mais adequada a erros previstos (Burns e Capps, 1988).
O módulo do tutor é o módulo responsável pela integração entre o módulo espe-
cialista e o módulo do estudante. Ele é o real responsável por escolher o fluxo de
apresentação do conteúdo, assim como por dar sugestões e apresentar correções de ma-
neira assı́ncrona. Existem diversas teorias instrucionais utilizadas na construção de tais
módulos (Burns e Capps, 1988).
A esses componentes, Burns e Capps (1988) acrescenta o ambiente de instrução e a
interface homem-máquina. O ambiente de instrução é o conjunto de ferramentas utilizadas
no processo de transmissão de conhecimento. Exemplos dessas ferramentas são jogos,
gráficos, animações etc. Elas compõem um micromundo no qual o aluno explora as
possibilidades do sistema tutorial inteligente. A interface homem-máquina é o conjunto
de tecnologias utilizado para a comunicação entre o computador e o aluno. O Tutorial
ICC, por exemplo, utiliza a interface Web através de uma interface de usuário gráfica.
Beck et al. (1996) propõem uma divisão levemente diferente. O conhecimento do
domı́nio estaria separado do módulo especialista: enquanto o conhecimento do domı́nio se-
ria uma base de dados de conhecimento a ser utilizado, o módulo especialista representaria
o conhecimento de uma pessoa especialmente hábil no tema estudado. O módulo espe-
cialista seria, então, responsável por comparar a solução dada pelo aluno com a solução
do especialista. Além disso, Beck et al. (1996) apresentam tanto o ambiente de instrução
1
Entretanto, vários sistemas tentam captar e processar informações sobre outros aspectos do compor-
tamento do aluno como, por exemplo, seu estado emocional. Esses sistemas são denominados sistemas
tutoriais inteligentes afetivos e podem tanto escolher a ordem de apresentação do conteúdo quanto enviar
mensagens de motivação ou apoio ao estudante (Nkambou, 2006). Infelizmente, como Murray (1999)
ressalta, sistemas baseados em hipermı́dia e Web, como o Tutorial ICC, não dispõem de tais facilidades,
ao menos não de maneira trivial.
9
quanto a interface homem-máquina como um componente só: o modelo de comunicação,
que intermedeia a interação entre a máquina e o aluno. A figura 3.1 apresenta as interações
entre os módulos da arquitetura proposta por Beck et al. (1996).
- Modelo de Comunicação
Modelo de estudante - Módulo Pedagógico
6 }
Z >
6
Z
Z
Z
Conhecimento de Domı́nio Modelo de Especialista
10
Murray (1999) divide os sistemas tutoriais inteligentes em sete categorias não ortogo-
nais em função dos seus domı́nios de atuação e áreas em que seu uso é mais adequado.
As categorias, sumarizadas na tabela 3.1, são as seguintes:
11
especialista para definir o melhor fluxo de ensino. Esses sistemas são chamados
de sistemas tutores cognitivos, ou sistemas de modelagem de cognição. Murray
(1999) põe na mesma categoria tanto esses sistemas quanto os sistemas que fazem
uso de sistemas especialistas para a resolução de problemas. A diferença é que
sistemas especialistas são utilizados no módulo especialista para encontrar a solução
de problemas didáticos e não para modelar o estado cognitivo do estudante.
5. Múltiplos tipos de conhecimento
Quanto um sistema tutorial inteligente baseia-se em uma determinada teoria do
conhecimento para escolher a maneira mais adequada de apresentar uma parte do
conteúdo, diz-se que o sistema possui múltiplos tipos de conhecimentos. Por exem-
plo, um sistema com múltiplos tipos de conhecimento pode dividir o conhecimento
a ser transmitido em três categorias: fatos, conceitos e procedimentos. Cada com-
ponente da habilidade maior a ser ensinada contaria com um método especı́fico de
ensino, dependendo de qual das três categorias acima melhor modela o componente.
Esses sistemas tendem a ser mais fáceis de configurar, mas são menos flexı́veis.
6. Sistemas de propósito especı́fico
Embora sistemas tutoriais inteligentes genéricos tenham atraı́do bastante interesse,
também pode ser interessante projetar sistemas tutoriais inteligentes para áreas es-
pecı́ficas. Não raramente, sistemas genéricos surgem do desenvolvimento de um
sistema especı́fico que vai gradativamente se tornando parametrizável e reutilizável.
Por um lado, esses sistemas de propósito especı́fico atingem um público-alvo bem
restrito; por outro lado, podem utilizar ferramentas didáticas especı́ficas mais po-
derosas.
7. Hipermı́dia adaptativa/inteligente
Com a crescente sofisticação de sistemas de hipermı́dia (notadamente, a Web), um
passo natural seria o desenvolvimento de sistemas tutoriais inteligentes baseados
em hipermı́dia adaptativa (ou hipermı́dia inteligente). De fato, sistemas tutoriais
inteligentes baseados na Web têm se tornado predominantes nessa área de pesquisa.
Esses sistemas permitem a apresentação, ordenação, filtragem etc. de links em
função de vários aspectos da disciplina ou do desempenho do aluno, como fluxo
de apresentação, dificuldade, adequação de pré-requisitos etc. Comumente, tais
sistemas são sistemas de planejamento e sequenciamento de currı́culo, ou sistemas
de estratégias tutoriais com uma interface baseada em hipermı́dia.
Embora essa classificação mais pareça a “enciclopédia chinesa” de Jorge Luis Bor-
ges (Foucault, 2002) que uma taxonomia tradicional, ela é muito útil. O próprio Murray
a descreve mais como um “saco de dicas” que uma “caixa de ferramentas”. De qual-
quer forma, Tutorial ICC pode se encaixar mais ou menos bem em várias dessas ca-
tegorias. Nosso objetivo inicial é, a princı́pio, torná-lo um sistema de planejamento e
sequenciamento de currı́culos, ou, mais provavelmente, um sistema de estratégias tuto-
riais; naturalmente, podemos torná-lo ambos. Do mesmo modo, já hoje o Tutorial ICC
12
Categoria Vantagens Desvantagens Variações
Planejamento Executar regras para Pouca fidelidade ao As regras podem ser
e sequenci- sequenciamento de modelo de estudante; fixas ou alteráveis pelo
amento de módulos e programas representação superfi- autor
currı́culos cial de habilidades
Estratégias Estratégias tutoriais Pouca fidelidade ao Método de estratégia
tutoriais variáveis dentro do modelo de estudante; de representação,
módulo; conjunto so- representação superfi- fonte de expertise
fisticado de primitivas cial de habilidades instrucional
e múltiplas estratégias
tutoriais
Simulação de Tutoramento de iden- Estratégias instrutivas Fidelidade da si-
dispositivos tificação de compo- limitadas; modelagem tuação, facilidade
e treina- nentes, operação e re- de estudante limitada de composição de
mento em solução de problemas; tutorial
equipamentos habilidades procedu-
rais
Sistemas Modelo do domı́nio Dificuldade de cons- Modelos de habilidade
especialistas de especialização mais trução; limitação a ha- baseados em cognição
e tutores profundo e executável; bilidades procedurais ou desempenho
cognitivos facilidade de inclusão ou de solução de pro-
de erros e comporta- blemas; estratégias de
mento de novato instrução limitadas
Múltiplos Representação clara Limitado a fatos, con- Inclusão de sequenci-
tipos de e método instrutivos ceitos e procedimentos amento curricular in-
conhecimento pré-definidos para simples; estratégias teligente; variação dos
fatos, conceitos e tutoriais pré-definidas tipos de conhecimento
procedimentos e tarefas suportados
Sistemas de Modelos de sistemas Ferramentas limitadas Grau de inflexibili-
propósito provêem uma grande ao tipo de tutor que dade
especı́fico ajuda na composição suportam; inflexibili-
do conteúdo; um dade na representação
projeto ou princı́pio e pedagogia
pedagógico especı́fico
pode ser enfatizado
Hipermı́dia Acessı́vel pela Web; Interação limitada; Foco em micro ou ma-
adaptati- uniformidade de in- largura de banda de crovisão; grau de inte-
va/inteligente terface de usuário; resposta de modelo de ratividade.
seleção adaptativa e estudante limitada
anotação de hiper-
ligação
13
fornece simulações de um computador, tornando-o um potencial sistema de simulação
de dispositivos. Como programação exige o conhecimento de uma série de fatos, concei-
tos e habilidades, é também bem provável que o Tutorial ICC se torne um sistema de
múltiplos conhecimentos. Como, afinal, o Tutorial ICC é um sistema Web, ele é, desde
já, um sistema de hipermı́dia, e o transformaremos em um sistema de hipermı́dia adapta-
tiva. Estudando cada um dos cases apresentados em Murray (1999), podemos encontrar
diversas idéias para nos auxiliar no nosso projeto.
14
Capı́tulo 4
Taxonomias de Exemplos
15
das caracterı́sticas removı́veis torna-se filho do nó principal. A figura 4.1 apresenta uma
representação gráfica dessa árvore. O travessão é o rótulo do nó sem caracterı́sticas.
C1, C2
Z
Z
Z
Z
Z
Z
Z
Z
Z
Z
Z
— C1 C2
Se a taxonomia tiver três caracterı́sticas removı́veis, o exemplo raiz deve usar as três. A
raiz teria, usualmente, três nós filhos, cada um apresentando duas das três caracterı́sticas
removı́veis. Esse nó filho é, por sua vez, raiz de uma subárvore que tem a estrutura de uma
taxonomia de duas caracterı́sticas removı́veis. A figura 4.2 apresenta uma representação
gráfica dessa árvore. O travessão é o rótulo do nó sem caracterı́sticas.
C1, C2, C3
, l
, l
, l
, l
, l
, l
, l
, l
, l
C1, C2 C1, C3 C2, C3
LL
LL LL
L L L
L L L
L L L
L L L
L
L
L
— C1 C2 — C1 C3 — C2 C3
Se uma taxonomia tem uma das estruturas apresentadas acima, dizemos que é uma
taxonomia totalmente preenchida. Embora tenhamos focado em gerar taxonomias total-
mente preenchidas, nem sempre é possı́vel ou interessante “forçar” o total preenchimento
16
de uma taxonomia. Por exemplo, muitas vezes o exemplo sem caracterı́sticas removı́veis
em uma taxonomia pode ser simples demais e não precisa ser apresentado. Isto ocorre co-
mumente com taxonomias de três caracterı́sticas, e a árvore resultante possui a estrutura
representada na figura 4.3. A seção 5.2 apresenta uma taxonomia com esta estrutura.
C1, C2, C3
, l
, l
, l
, l
, l
, l
, l
, l
, l
C1, C2 C1, C3 C2, C3
B B B
B B B
B B B
B B B
B B B
B
B
B
C1 C2 C1 C3 C2 C3
Outro caso de árvore não totalmente preenchida ocorrem quando ao menos uma ca-
racterı́stica removı́vel só pode ser apresentada se uma outra qualquer estiver presente.
Por exemplo, considere uma árvore de três caracterı́sticas removı́veis C1, C2 e C3 tal que,
para C3 estar presente em um exemplo, é necessário que ou C1 ou C2 também estejam
presentes. Não há exemplos que exercitem apenas C3. A estrutura da taxonomia é a apre-
sentada na figura 4.4, e a seção 5.4 apresenta uma taxonomia na qual esta configuração
ocorre.
Dizemos que essas caracterı́sticas removı́veis são caracterı́sticas não-ortogonais entre
si pois elas se influenciam; em contraposição, caracterı́sticas removı́veis que podem estar
presentes em um exemplo independente das outras são chamadas de caracterı́sticas ortogo-
nais entre si. Se uma taxonomia é construı́da apenas a partir de caracterı́sticas ortogonais
— isto é, todas as caracterı́sticas que geram a taxonomia são ortogonais entre si —, ela
é dita uma taxonomia ortogonal ; caso contrário, é chamada de taxonomia não-ortogonal.
Em geral, nossa experiência indicou que taxonomias não-ortogonais são mais complexas
de criar e, ao que tudo indica, menos claras, didaticamente falando. Enquanto é perfeita-
mente razoável construir taxonomias não totalmente preenchidas, construir taxonomias
não-ortogonais não é o ideal.
17
C1, C2, C3
, l
, l
, l
, l
, l
, l
, l
, l
, l
C1, C2 C1, C3 C2, C3
B
B
B
B
B
B
C1 C2 C1 C2
18
estudantes devem conhecer, e deve haver enunciados que os apresentem. Em verdade,
bugs conceituais e padrões importantes são boas caracterı́sticas removı́veis.
Também se questionou qual deve ser a relação entre os enunciados de uma taxono-
mia. Os enunciados devem ser independentes ou relacionados? Nossa hipótese é que os
enunciados devem ser relacionados, e os mais simples devem ser versões ou “passos” dos
enunciados mais completos. Isto, supomos, mantém o estudante no contexto mental do
problema, facilitando sua compreensão.
Uma vez definidos os enunciados, devemos desenvolver os programas que os soluci-
onam. A linguagem de programação em que foram solucionados foi aquela já utilizada
no Tutorial ICC: Pascal. Pascal é uma boa escolha também porque é uma linguagem
didática, como explicado na seção 2.3.
Um desafio na criação dos enunciados é: como criar um enunciado que “force” —
isto é, torne mais natural — o aluno a utilizar as caracterı́sticas que queremos? Depois
de criarmos algumas taxonomias, notamos que esta é uma questão secundária: embora
seja realmente interessante criar enunciados que levem intuitivamente às caracterı́sticas
removı́veis escolhidas, são os desenvolvedores das taxonomias que escolhem como soluci-
onarão os enunciados. Isto é interessante de se ter em mente porque, por vezes, alguns
enunciados tornam-se pouco intuitivos para forçar a solução de um problema em uma
determinada direção. Este esforço, porém, não é necessário. A taxonomia apresentada na
seção 5.2 é um bom exemplo prático disso.
19
4.3 “Tira-teima” e roteiros
Um dos recursos mais notáveis do Tutorial ICC são os “tira-teimas”: representações
gráficas da execução de um programa. Esses “tira-teimas” são apresentados através de
uma applet Java, apresentada na figura 4.5. Os “tira-teimas” são compostos de duas
partes: um programa cuja execução será simulada e um script especı́fico que simulará a
execução. Denominamos tais scripts de roteiros.
Cada linha de um roteiro inicia com um número inteiro; este número é o ı́ndice da
linha do programa simulado que será realçada no programa quando a linha do roteiro
for executada. Após este ı́ndice, podem vir zero ou mais comandos separados por ponto-
e-vı́rgula. Se não houver nenhum comando a ser executado na linha, apenas o ponto-e-
vı́rgula segue o número; se houver mais de um, os comandos devem vir entre chaves. Há,
basicamente, comandos de declaração de variáveis (que aparecem como caixas coloridas
na applet de tira-teima, comandos de escrita (que imprimem um valor no console da applet
e alteração de valores de variáveis. A figura 4.6 apresenta o exemplo do roteiro utilizado
para o exemplo apresentado na seção 5.4.3.1.
1;
3;
4 real a , b ;
6;
7 writeln ( " Digite a parte real : " ) ;
8 { writeln ( " 3.0 " ) ; a = 3.0;}
9 writeln ( " Digite a parte imaginaria : " ) ;
10 { writeln ( " 0.0 " ) ; b = 0.0;}
11;
18;
19;
22;
23 writeln ( " 3.0 + 0.0 i e um real nao - negativo . " ) ;
24;
20
O programa apresentado na seção 5.1.3.4 por exemplo, possui como caracterı́stica
removı́vel a presença da cláusula else no comando if. O roteiro deste programa iria,
então, passar pelo comando da cláusula else, ao invés de passar pela cláusula then.
Outro critério adotado foi:
Dentre dois caminhos possı́veis, o roteiro deve passar pelo caminho mais complexo
ou que gere mais saı́da para o console da applet.
Este critério foi adotado porque acreditamos que, quanto mais linhas de código o
estudante observar serem executadas, mais oportunidades haverá para fixar conceitos.
Além disso, execuções sem saı́da podem ser bastante confusas: para o iniciante, é bem
possı́vel que um programa que não imprima nada pareça um programa que não faça nada.
21
4.5 Resumo
Dados os conceitos acima, o processo de criação de taxonomias para um capı́tulo pode
ser resumido da seguinte maneira:
Naturalmente, os passos não precisam seguir forçosamente esta ordem, mas é usual
que sejam seguidos assim.
O capı́tulo 5 apresenta a aplicação deste processo em um capı́tulo do Tutorial ICC.
22
Capı́tulo 5
Exemplos de Taxonomias
5.1 Árvore 1
Na primeira árvore do capı́tulo 3, propomos ao aluno um problema que possa ser resol-
vido com o comando if-then — assim sendo, todos os problemas da árvore devem ser
solucionados utilizando a estrutura condicional. As caracterı́sticas removı́veis, nesta pri-
meira árvore, são o uso do comando else e a presença de um comando composto, formado
por vários outros comandos agrupados pelos delimitadores de blocos begin-end. Como
há duas caracterı́sticas removı́veis, essa árvore possui dois nı́veis de hierarquia e quatro
exemplos.
23
5.1.2 Numeração dos exemplos
C1 C2 Exemplo
• • 1 (subseção 5.1.3.1)
– – 1.1 (subseção 5.1.3.2)
• – 1.2 (subseção 5.1.3.3)
– • 1.3 (subseção 5.1.3.4)
Se o motorista não tiver idade para contratar o seguro, imprima duas linhas. A
primeira linha será:
program exemplo1 ;
var
idade : integer ;
preco : real ;
begin
writeln ( ’ Qual e a sua idade ? ’) ;
readln ( idade ) ;
writeln ( ’ Qual e o preco de seu carro ? ’) ;
readln ( preco ) ;
24
if idade >= 25
then
writeln ( ’ Valor do seguro : R $ ’ , preco /20:2:2 , ’. ’)
else
begin
writeln ( ’ Voce nao pode contratar o seguro . ’) ;
writeln ( ’ Podera contratar em ’ , 25 - idade , ’ anos . ’) ;
end ;
end .
program exemplo1_1 ;
var
idade : integer ;
begin
writeln ( ’ Qual e a sua idade ? ’) ;
readln ( idade ) ;
if idade >= 25
then
writeln ( ’ Voce pode contratar o seguro . ’) ;
end .
25
’ Voce nao pode contratar o seguro . ’
Além disso, deve também informar quando o cliente terá idade para contratar o seguro.
Supondo que o cliente tenha 22 anos, a mensagem será:
program exemplo1_2 ;
var
idade : integer ;
begin
writeln ( ’ Qual e a sua idade ? ’) ;
readln ( idade ) ;
if idade < 25
then
begin
writeln ( ’ Voce nao pode contratar o seguro . ’) ;
writeln ( ’ Podera contratar em ’ , 25 - idade , ’ anos . ’) ;
end ;
end .
26
Solução A solução usada foi a seguinte
program exemplo1_3 ;
var
idade : integer ;
preco : real ;
begin
writeln ( ’ Qual e a sua idade ? ’) ;
readln ( idade ) ;
writeln ( ’ Qual e o preco de seu carro ? ’) ;
readln ( preco ) ;
if idade >= 25
then
writeln ( ’ Valor do seguro : R $ ’ , preco /20:2:2 , ’. ’)
else
writeln ( ’ Voce nao pode contratar o seguro . ’) ;
end .
5.1.4 Comentários
No exemplo 1, tı́nhamos de apresentar ambas as caracterı́sticas removı́veis. Na árvore ori-
ginal, acrescentamos a caracterı́stica C2 colocando blocos de comando tanto na cláusula
then quanto na cláusula else. Entretanto, decidimos posteriormente que seria mais inte-
ressante colocar o comando composto em apenas uma das cláusulas: deste modo, espera-se
que o aluno compreenda que é possı́vel ter um comando composto em uma das cláusulas
tendo um comando simples na outra cláusula. Julgamos relevante inserir, sempre que
possı́vel, esse tipo de assimetria nos problemas. Além disso, decidimos colocar o comando
composto na cláusula else porque, no exemplo 1.2, o comando composto já fora colocado
em uma cláusula then.
5.2 Árvore 2
Nosso objetivo na segunda árvore do capı́tulo 3 é apresentar exemplos de aplicação, ao
aluno, do uso dos operadores booleanos and, or e not. A árvore tem três caracterı́sticas
removı́veis, que são o uso do operador and, o uso do operador or e o uso do operador not. O
exemplo maior utiliza as três caracterı́sticas removı́veis e possui três exemplos diretamente
subordinados; cada um desses exemplos possui duas das caracterı́sticas removı́veis, e
possuem dois exemplos subordinados, cada um exercendo uma caracterı́stica removı́vel
do exemplo superior.
27
5.2.1 Caracterı́sticas removı́veis
C1. uso do operador and
Caso contrário, não imprima nada. As respostas que o programa espera são ’s’ (para
“sim”) ou ’n’ (para “não”).
var
carta , dinheiro , imovel : char ;
begin
28
writeln ( ’ Voce tem carta de solicitacao ? ’) ;
readln ( carta ) ;
writeln ( ’ Voce tem US $ 10 mil ? ’) ;
readln ( dinheiro ) ;
writeln ( ’ Voce tem um imovel ? ’) ;
readln ( imovel ) ;
if not (( carta = ’s ’) and (( dinheiro = ’s ’) or ( imovel = ’s ’) ) )
then
writeln ( ’ Voce nao pode trabalhar no pais . ’) ;
end .
Caso contrário, não imprima nada. As respostas que o programa espera são ’s’ (para
“sim”) ou ’n’ (para “não”).
var
carta , dinheiro , imovel : char ;
begin
writeln ( ’ Voce tem uma carta de solicitacao ? ’) ;
readln ( carta ) ;
writeln ( ’ Voce tem no minimo US $ 10 mil ? ’) ;
readln ( dinheiro ) ;
writeln ( ’ Voce tem um imovel ? ’) ;
readln ( imovel ) ;
if ( carta = ’s ’) and (( dinheiro = ’s ’) or ( imovel = ’s ’) )
then
writeln ( ’ Voce pode trabalhar no pais . ’) ;
end .
29
5.2.3.3 Exemplo 2.2
Enunciado Um certo paı́s exige que qualquer estrangeiro que vá trabalhar em seu
território satisfaça duas condições. A primeira condição é que o contratador do estrangeiro
envie uma carta à embaixada. Além disso, o estrangeiro deve ter US$ 10 mil em uma
conta do paı́s de origem ou ter um imóvel no paı́s de origem.
Faça um programa que pergunte ao usuário se ele tem US$ 10 mil em uma conta e
pergunte se ele tem um imóvel. Se o usuário tiver o dinheiro mas não tiver o imóvel,
imprima a mensagem:
’ Mesmo sem imovel , voce pode trabalhar no pais se tiver uma carta
.’
Caso contrário, não imprima nada. As respostas que o programa espera são ’s’ (para
“sim”) ou ’n’ (para “não”).
var
dinheiro , imovel : char ;
begin
writeln ( ’ Voce tem US $ 10 mil ? ’) ;
readln ( dinheiro ) ;
writeln ( ’ Voce tem um imovel ? ’) ;
readln ( imovel ) ;
if ( dinheiro = ’s ’) and not ( imovel = ’s ’)
then
writeln ( ’ Mesmo sem imovel , voce pode trabalhar no pais se
tiver a carta . ’) ;
end .
30
Caso contrário, não imprima nada. As respostas que o programa espera são ’s’ (para
“sim”) ou ’n’ (para “não”).
var
dinheiro , imovel : char ;
begin
writeln ( ’ Voce tem US $ 10 mil ? ’) ;
readln ( dinheiro ) ;
writeln ( ’ Voce tem um imovel ? ’) ;
readln ( imovel ) ;
if not (( dinheiro = ’s ’) or ( imovel = ’s ’) )
then
writeln ( ’ Voce nao pode trabalhar no pais . ’) ;
end .
Caso contrário, não imprima nada. As respostas que o programa espera são ’s’ (para
“sim”) ou ’n’ (para “não”).
var
carta , imovel : char ;
begin
writeln ( ’ Voce tem uma carta de solicitacao ? ’) ;
readln ( carta ) ;
writeln ( ’ Voce tem um imovel ? ’) ;
readln ( imovel ) ;
31
if ( carta = ’s ’) and ( imovel = ’s ’)
then
writeln ( ’ Voce pode trabalhar no pais . ’) ;
end .
As respostas que o programa espera são ’s’ (para “sim”) ou ’n’ (para “não”).
var
dinheiro , imovel : char ;
begin
writeln ( ’ Voce tem US $ 10 mil ? ’) ;
readln ( dinheiro ) ;
writeln ( ’ Voce tem um imovel ? ’) ;
readln ( imovel ) ;
if ( dinheiro = ’s ’) or ( imovel = ’s ’)
then
writeln ( ’ Voce so precisa da carta . ’)
else
writeln ( ’ Voce nao pode trabalhar no pais . ’) ;
end .
32
5.2.3.7 Exemplos 2.2.2 e 2.3.2
Enunciado Um certo paı́s exige que qualquer estrangeiro que vá trabalhar em seu
território satisfaça duas condições. A primeira condição é que o contratador do estrangeiro
envie uma carta à embaixada. Além disso, o estrangeiro deve ter US$ 10 mil em uma
conta do paı́s de origem ou ter um imóvel no paı́s de origem.
Faça um programa que pergunte ao usuário se ele tem a carta do empregador. Se ele
não tiver a carta, imprima a mensagem:
Caso contrário, não imprima nada. As respostas que o programa espera são ’s’ (para
“sim”) ou ’n’ (para “não”).
var
carta : char ;
begin
writeln ( ’ Voce tem uma carta de solicitacao ? ’) ;
readln ( carta ) ;
if not ( carta = ’s ’)
then
writeln ( ’ Voce nao pode trabalhar no pais . ’) ;
end .
5.2.4 Comentários
Para mostrar uma aplicação prática destes operadores, utilizamos ainda o comando if. É
interessante notar que procuramos evitar utilizar a cláusula else, justamente para “forçar”
ao aluno que pense em termos dos operadores. Isso provavelmente não é necessário:
como programas implementando os enunciados já são apresentados, não é preciso forçar
o estudante a pensar de certa maneira — basta apresentar um enunciado que leve a uma
solução intuitiva utilizando as caracterı́sticas removı́veis do problema. Ademais, evitar
utilizar a cláusula else acabou tornado os enunciados menos intuitivos. Por exemplo,
enquanto a solução do exemplo 2 possui um comando if arbitrariamente sem cláusula else
, poderı́amos acrescentá-la que conseguirı́amos ainda assim utilizar todos os operadores,
como fizemos no exemplo da seção 5.2.3.6.
A implementação de árvores de três nı́veis apresenta vários desafios. Primeiro, são
árvores maiores. Além disso, como podemos notar na árvore 2, elas não necessariamente
levam a árvores totalmente preenchidas, que era nosso objetivo inicial: não há na árvore
2 um exemplo a que falte todas as caracterı́sticas removı́veis. Não acrescentamos este
33
exemplo porque ele possuiria apenas um comando if, o que já foi exercitado na árvore
12 . A árvore 4 é também não totalmente preenchida, embora por razões diferentes3 .
Outro aspecto caracterı́stico das árvores de três caracterı́sticas é a repetição de de
exemplos. Como há três exemplos subordinados ao exemplo maior, cada um destes exem-
plos possui também seus subordinados com uma caracterı́stica só. Por exemplo, obser-
vando a tabela da subseção 5.2.2, percebe-se que os exemplos 2.1.1 e 2.2.1 exercitam a
mesma caracterı́stica, que é o uso do operador and. Assim sendo, decidimos repetir o
enunciado e a solução do exemplo 2.1.1 no exemplo 2.2.1.
5.3 Árvore 3
A terceira árvore deste capı́tulo considera o uso de comandos do tipo if-then, não aninha-
dos, em seqüência. As caracterı́sticas removı́veis, nesta primeira árvore, são a presença
de um comando else para a primeira ocorrência de if-then e a presença de um comando
else para a segunda ocorrência. Como há duas caracterı́sticas removı́veis, temos uma
árvore de profundidade 2 e quatro exemplos.
34
Vencimento: R$ 1.000,00
Adicional de especialização: 3% do Vencimento
Adicional de mestrado: 7% do Vencimento
Remuneração final é a soma do vencimento e adicionais.
O programa deverá ler a resposta do usuário para as seguintes perguntas acerca dos
tı́tulos:
Caso contrário:
Caso contrário:
Por último, deverá imprimir a remuneração final. Caso a remuneração calculada pelo
programa for iguai a R$ 1100, imprima:
35
Solução A solução usada foi a seguinte
program exemplo3 ;
var
especializacao , mestrado : char ;
vencimento , remuneracao : real ;
begin
vencimento := 1000;
remuneracao := vencimento ;
writeln ( ’ Possui diploma de especializacao ? ’) ;
readln ( especializacao ) ;
writeln ( ’ Possui diploma de mestrado ? ’) ;
readln ( mestrado ) ;
if ( especializacao = ’s ’)
then
begin
remuneracao := remuneracao + (0.03 * vencimento ) ;
writeln ( ’ Voce tem direito ao adicional de especializacao .
’) ;
end
else
writeln ( ’ Voce nao tem direito ao adicional de
especializacao . ’) ;
if ( mestrado = ’s ’)
then
begin
remuneracao := remuneracao + ( vencimento * 0.07) ;
writeln ( ’ Voce tem direito ao adicional de mestrado . ’) ;
end
else
writeln ( ’ Voce nao tem direito ao adicional de mestrado . ’) ;
writeln ( ’ Sua remuneracao e de ’ , remuneracao :4:2) ;
end .
Vencimento: R$ 1.000,00
36
Adicional de especialização: 3% do Vencimento
Adicional de mestrado: 7% do Vencimento
Remuneração final é a soma do vencimento e adicionais.
O programa deverá ler a resposta do usuário para as seguintes perguntas acerca dos
tı́tulos:
Por último, deverá imprimir a remuneração final. Caso a remuneração calculada pelo
programa for iguai a R$ 1100:
program exemplo3_1 ;
var
especializacao , mestrado : char ;
vencimento , remuneracao : real ;
begin
vencimento := 1000;
remuneracao := vencimento ;
writeln ( ’ Possui diploma de especializacao ? ’) ;
readln ( especializacao ) ;
writeln ( ’ Possui diploma de mestrado ? ’) ;
readln ( mestrado ) ;
if ( especializacao = ’s ’)
then
remuneracao := remuneracao + (0.03 * vencimento ) ;
if ( mestrado = ’s ’)
then
remuneracao := remuneracao + ( vencimento * 0.07) ;
writeln ( ’ Sua remuneracao e de ’ , remuneracao :4:2) ;
end .
37
5.3.3.3 Exemplo 3.2
Enunciado Um servidor público tem a possibilidade de aumentar sua remuneração se
apresentar os tı́tulos de especialização e/ou de mestrado.
O servidor poderá apresentar apenas um diploma para cada titulação e só poderá
acumular os adicionais de titulações diferentes.
Faça um programa que calcule a remuneração final de um servidor considerando os
seguintes dados:
Vencimento: R$ 1.000,00
Adicional de especialização: 3% do Vencimento
Adicional de mestrado: 7% do Vencimento
Remuneração final é a soma do vencimento e adicionais.
O programa deverá ler a resposta do usuário para as seguintes perguntas acerca dos
tı́tulos:
38
Solução A solução usada foi a seguinte
program exemplo3_2 ;
var
especializacao , mestrado : char ;
vencimento , remuneracao : real ;
begin
vencimento := 1000;
remuneracao := vencimento ;
writeln ( ’ Possui diploma de especializacao ? ’) ;
readln ( especializacao ) ;
writeln ( ’ Possui diploma de mestrado ? ’) ;
readln ( mestrado ) ;
if ( especializacao = ’s ’)
then
begin
remuneracao := remuneracao + (0.03 * vencimento ) ;
writeln ( ’ Voce tem direito a adicional de especializacao ’)
;
end
else
writeln ( ’ Subsidiamos cursos de especializacao . ’) ;
if ( mestrado = ’s ’)
then
begin
remuneracao := remuneracao + ( vencimento * 0.07) ;
writeln ( ’ Voce tem direito a adicional de mestrado . ’) ;
end ;
writeln ( ’ Sua remuneracao e de ’ , remuneracao :4:2) ;
end .
39
Remuneração final é a soma do vencimento e adicionais.
O programa deverá ler a resposta do usuário para as seguintes perguntas acerca dos
tı́tulos:
Por último, deverá imprimir a remuneração final. Caso a remuneração calculada pelo
programa seja R$ 1100:
program exemplo3_3 ;
var
especializacao , mestrado : char ;
vencimento , remuneracao : real ;
begin
vencimento := 1000;
remuneracao := vencimento ;
writeln ( ’ Possui diploma de especializacao ? ’) ;
readln ( especializacao ) ;
writeln ( ’ Possui diploma de mestrado ? ’) ;
40
readln ( mestrado ) ;
if ( especializacao = ’s ’)
then
begin
remuneracao := remuneracao + (0.03 * vencimento ) ;
writeln ( ’ Voce tem direito ao adicional de especializacao .
’) ;
end ;
if ( mestrado = ’s ’)
then
begin
remuneracao := remuneracao + ( vencimento * 0.07) ;
writeln ( ’ Voce tem direito ao adicional de mestrado . ’) ;
end
else
writeln ( ’ Subsidiamos cursos de mestrado . ’) ;
writeln ( ’ Sua remuneracao e de ’ , remuneracao :4:2) ;
end .
5.3.4 Comentários
Essa árvore busca apresentar ao aluno o uso de comandos if em série. A primeira questão
que se levantou foi: qual deve ser o número de comandos if a serem apresentados em série?
Inicialmente, cogitamos apresentar exemplos com três comandos if em série, uma vez que
tı́nhamos em mente utilizar árvores com três caracterı́sticas removı́veis4 . Entretanto, os
programas ficaram muito grandes, o que provavelmente os tornaria cansativos para os
alunos. Decidimos, então, utilizar dois comandos if em série, com duas caracterı́sticas
removı́veis.
De fato, notamos que árvores com três caracterı́sticas removı́veis tendem a gerar pro-
gramas maiores, além de, naturalmente, árvores com mais nós, o que pode ser cansativo
ao aluno. Naturalmente, há exceções nas quais as árvores de três caracterı́sticas são me-
nos cansativas e até mais naturais. A árvore 2 (apresentada na seção 5.2) e a árvore 6
(apresentada na seção 5.6) são bons exemplos de exceções.
5.4 Árvore 4
A quarta árvore do capı́tulo 3 apresenta o uso de comandos if-then aninhados. As
caracterı́sticas removı́veis são a presença da cláusula else no if-then interno, a presença
do if-then interno na cláusula then externa5 e a presença do if-then interno na cláusula
4
Como terı́amos três comandos if, poderı́amos definir como caracterı́sticas removı́veis a presença da
cláusula else no primeiro comando, a presença da cláusula else no segundo comando e a presença da
cláusula else no terceiro comando, analogamente ao que fizemos com dois comandos if.
5
Isto é, o if-then interno só será executado se a condição do if-then externo for satisfeita.
41
else externa6 . Como há três caracterı́sticas removı́veis, a árvore possui três nı́veis de
hierarquia. A árvore possui oito exemplos.
42
Solução A solução usada foi a seguinte
program exemplo4 ;
var
a , b : real ;
begin
writeln ( ’ Digite a parte real : ’) ;
readln ( a ) ;
writeln ( ’ Digite a parte imaginaria : ’) ;
readln ( b ) ;
if b <> 0
then
begin
if a = 0
then
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e imaginario . ’) ;
end
else
if a < 0
then
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e real negativo . ’)
else
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e real nao - negativo . ’) ;
end .
43
Solução A solução usada foi a seguinte
program exemplo4_1 ;
var
a , b : real ;
begin
writeln ( ’ Digite a parte real : ’) ;
readln ( a ) ;
writeln ( ’ Digite a parte imaginaria : ’) ;
readln ( b ) ;
if b <> 0
then
begin
if a = 0
then
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e imaginario . ’) ;
end
else
if a < 0
then
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e real negativo . ’) ;
end .
44
Solução A solução usada foi a seguinte
program exemplo4_2 ;
var
a , b : real ;
begin
writeln ( ’ Digite a parte real : ’) ;
readln ( a ) ;
writeln ( ’ Digite a parte imaginaria : ’) ;
readln ( b ) ;
if b <> 0
then
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e nao - real . ’)
else
if a < 0
then
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e real negativo . ’)
else
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e real nao - negativo . ’) ;
end .
Se o número não for imaginário, mas também não for real imprima:
45
Solução A solução usada foi a seguinte
program exemplo4_3 ;
var
a , b : real ;
begin
writeln ( ’ Digite a parte real : ’) ;
readln ( a ) ;
writeln ( ’ Digite a parte imaginaria : ’) ;
readln ( b ) ;
if b <> 0
then
if a = 0
then
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e imaginario . ’)
else
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e nao - real . ’)
else
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e real . ’) ;
end .
var
a , b : real ;
46
begin
writeln ( ’ Digite a parte real : ’) ;
readln ( a ) ;
writeln ( ’ Digite a parte imaginaria : ’) ;
readln ( b ) ;
if b <> 0
then
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e nao - real . ’)
else
if a < 0
then
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e real negativo . ’) ;
end .
Se o número não for real mas também não for imaginário, não imprima nada.
Se o número for real (b = 0), imprima a mensagem
var
a , b : real ;
begin
writeln ( ’ Digite a parte real : ’) ;
readln ( a ) ;
writeln ( ’ Digite a parte imaginaria : ’) ;
readln ( b ) ;
if b <> 0
then
47
begin
if a = 0
then
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e imaginario . ’) ;
end
else
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e real . ’) ;
end .
5.4.4 Comentários
Nós buscamos sempre fazer árvores totalmente preenchidas nas taxonomias. Por vezes,
isso não é interessante; por exemplo, na árvore da seção 5.2 não há nenhum nó que equiva-
lha aos problemas sem caracterı́sticas removı́veis, pois o problema desse nó seria bastante
trivial. No caso da árvore dessa seção, é inviável fazer a árvore completa: é impossı́vel
excluir mutuamente as caracterı́sticas removı́veis C2 e C3 e manter a caracterı́stica C1:
C1 depende de que um comando if esteja dentro de uma cláusula then ou de uma cláusula
else — mas a remoção das caracterı́sticas C2 e C3 impedem que haja um comando if
em qualquer uma das cláusulas. Além disso, um nó que não tenha nenhuma das carac-
terı́sticas removı́veis pareceu-nos simples demais para constar na árvore, assim como na
árvore 2. Consequentemente, os nós 4.2 e 4.3 possuem apenas um problema subordinado.
Essa configuração não aparenta ser muito boa: não sabemos se é conveniente ao aluno
descer um nı́vel da árvore para estudar apenas um exemplo.
Na solução7 do exemplo 4, é interessante notar que, enquanto o comando if dentro
da cláusula else possui tanto a cláusula then quanto a cláusula else, o comando if
dentro da cláusula then externa possui apenas a cláusula then. Isso foi uma decisão
consciente: é relevante para mostrar ao aluno como inserir um comando if sem uma
cláusula else dentro de uma cláusula then8 . Além disso, essa configuração é assimétrica:
os comandos dentro da cláusula then externa e else externa possuem estruturas diferentes.
Acreditamos que uma apresentação assimétrica incentiva o aluno a compreender melhor
a ortogonalidade do comando, e exercita melhor seu raciocı́nio. Essa é uma questão vasta
que escapa ao escopo do nosso projeto.
5.5 Árvore 5
A quinta árvore apresenta o uso de comandos if em cascata. Em outras palavras, essa
árvore visa exercitar o aluno no uso (bastante comum) de comandos if com cláusulas
else em uma estrutura semelhante a
if condicao1 then
comando1
7
Ver seção 5.4.3.1.
8
Para fazer isso, nota-se que é preciso usar os agrupadores begin e end. Caso contrário, a cláusula
else do if interno será associada ao if externo.
48
else if condicao2 then
comando2
else if condicao3 then
comando3
else if condicao4 then
comando4 ;
Suas caracterı́sticas removı́veis são a presença de else ao final da cascata, presença de
if interno com else e presença de if interno sem else. O comando if interno ocorrerá
entre outros comandos dentro do bloco begin-end do if-then que o contém.
Como há três caracterı́sticas removı́veis, temos uma árvore de profundidade 3.
49
Se a idade for maior que zero, o programa deverá imprimir o desconto, onde o numero
da porcentagem é igual à idade. Por exemplo, se o usuário digitar a idade 30 o programa
deverá imprimir:
’ Desconto : 30% ’
Caso contrário, quando a idade for menor ou igual a zero, o programa deverá imprimir
a mensagem:
’ Desconto : 10% ’
Se o dia escolhido for qualquer numero diferente dos anteriores, o programa deverá
imprimir:
’ Restaurante fechado ’
50
Solução A solução usada foi a seguinte
program exemplo5 ;
var
temcupom : char ;
idade , dia : integer ;
begin
write ( ’ Digite um numero de 3 a 6 que corresponda ao dia da
semana : ’) ;
readln ( dia ) ;
if dia = 3
then
begin
write ( ’ Digite sua idade : ’) ;
readln ( idade ) ;
if idade > 0
then
writeln ( ’ Desconto : ’ , idade , ’% ’)
else
writeln ( ’ Idade invalida : sem desconto . ’) ;
writeln ( ’ Prato do dia : macarronada ’) ;
end
else
if dia = 4
then
writeln ( ’ Prato do dia : galinhada ’)
else
if dia = 5
then
begin
write ( ’ Possui cupom de desconto ? ’) ;
readln ( temcupom ) ;
if temcupom = ’s ’
then
writeln ( ’ Desconto : 10% ’) ;
writeln ( ’ Prato do dia : feijoada ’) ;
end
else
writeln ( ’ Restaurante fechado ’) ;
end .
51
Faça um programa que forneça tais informações de acordo com as seguintes condições:
O usuário deverá informar um número entre 3 e 5 informando o dia da semana conforme
a seguinte mensagem: Digite um numero de 3 a 5 que corresponda ao dia da semana:
Se o dia escolhido for o dia 4, o programa deverá solicitar a idade do usuário:
Se a idade for maior que zero, o programa deverá imprimir o desconto, onde o numero
da porcentagem é igual à idade. Por exemplo, se o usuário digitar a idade 30 o programa
deverá imprimir:
’ Desconto : 30% ’
Caso contrário, quando a idade for menor ou igual a zero, o programa deverá imprimir
a mensagem:
Se o dia escolhido for qualquer numero diferente dos anteriores, o programa deverá
imprimir:
’ Restaurante fechado ’
52
Solução A solução usada foi a seguinte
program exemplo5_1 ;
var
idade , dia : integer ;
begin
write ( ’ Digite um numero de 3 a 5 que corresponda ao dia da
semana : ’) ;
readln ( dia ) ;
if dia = 3
then
writeln ( ’ Prato do dia : macarronada ’)
else
if dia = 4
then
begin
write ( ’ Digite sua idade : ’) ;
readln ( idade ) ;
if idade > 0
then
writeln ( ’ Desconto : ’ , idade , ’% ’)
else
writeln ( ’ Idade invalida : sem desconto ’) ;
writeln ( ’ Prato do dia : galinhada ’) ;
end
else
if dia = 5
then
writeln ( ’ Prato do dia : feijoada ’)
else
writeln ( ’ Restaurante fechado ’) ;
end .
53
Se o usuário digitar ’s’, o programa deverá imprimir:
’ Desconto : 10% ’
Se o dia escolhido for qualquer numero diferente dos anteriores, o programa deverá
imprimir:
’ Restaurante fechado ’
var
temcupom : char ;
dia : integer ;
begin
write ( ’ Digite um numero de 3 a 5 que corresponda ao dia da
semana : ’) ;
readln ( dia ) ;
if dia = 3
then
writeln ( ’ Prato do dia : macarronada ’)
else
if dia = 4
then
begin
write ( ’ Possui cupom de desconto ? ’) ;
54
readln ( temcupom ) ;
if temcupom = ’s ’
then
writeln ( ’ Desconto : 10% ’) ;
writeln ( ’ Prato do dia : galinhada ’) ;
end
else
if dia = 5
then
writeln ( ’ Prato do dia : feijoada ’)
else
writeln ( ’ Restaurante fechado ’) ;
end .
Se a idade for maior que zero, o programa deverá imprimir o desconto, onde o numero
da porcentagem é igual à idade. Por exemplo, se o usuário digitar a idade 30 o programa
deverá imprimir:
’ Desconto : 30% ’
Caso contrário, quando a idade for menor ou igual a zero, o programa deverá imprimir
a mensagem:
’ Desconto : 10% ’
55
O programa deverá, também, imprimir o prato do dia conforme o dia escolhido.
Se o dia escolhido for qualquer numero diferente dos anteriores, o programa deverá
não imprimir nada.
var
temcupom : char ;
idade , dia : integer ;
begin
write ( ’ Digite um numero de 3 a 5 que corresponda ao dia da
semana : ’) ;
readln ( dia ) ;
if dia = 3
then
begin
write ( ’ Digite sua idade : ’) ;
readln ( idade ) ;
if idade > 0
then
writeln ( ’ Desconto : ’ , idade , ’% ’)
else
writeln ( ’ Idade invalida : sem desconto ’) ;
writeln ( ’ Prato do dia : macarronada ’) ;
end
else
if dia = 4
then
56
writeln ( ’ Prato do dia : galinhada ’)
else
if dia = 5
then
begin
write ( ’ Possui cupom de desconto ? ’) ;
readln ( temcupom ) ;
if temcupom = ’s ’
then
writeln ( ’ Desconto : 10% ’) ;
writeln ( ’ Prato do dia : feijoada ’) ;
end ;
end .
Se o dia escolhido for qualquer numero diferente dos anteriores, o programa deverá
imprimir:
’ Restaurante fechado ’
57
Solução A solução usada foi a seguinte
program exemplo5_1_1 ;
var
dia : integer ;
begin
write ( ’ Digite um numero de 3 a 5 que corresponda ao dia da
semana : ’) ;
readln ( dia ) ;
if dia = 3
then
writeln ( ’ Prato do dia : macarronada ’)
else
if dia = 4
then
writeln ( ’ Prato do dia : galinhada ’)
else
if dia = 5
then
writeln ( ’ Prato do dia : feijoada ’)
else
writeln ( ’ Restaurante fechado ’) ;
end .
Se a idade for maior que zero, o programa deverá imprimir o desconto, onde o numero
da porcentagem é igual à idade. Por exemplo, se o usuário digitar a idade 30 o programa
deverá imprimir:
’ Desconto : 30% ’
Caso contrário, quando a idade for menor ou igual a zero, o programa deverá imprimir
a mensagem:
58
’ Idade invalida : sem descondo ’
Se o dia escolhido for qualquer numero diferente dos anteriores, o programa deverá
não imprimir nada.
var
dia , idade : integer ;
begin
write ( ’ Digite um numero de 3 a 5 que corresponda ao dia da
semana : ’) ;
readln ( dia ) ;
if dia = 3
then
writeln ( ’ Prato do dia : macarronada ’)
else
if dia = 4
then
begin
write ( ’ Digite sua idade : ’) ;
readln ( idade ) ;
if idade > 0
then
writeln ( ’ Desconto : ’ , idade , ’% ’)
else
59
writeln ( ’ Idade invalida : sem desconto ’) ;
writeln ( ’ Prato do dia : galinhada ’) ;
end
else
if dia = 5
then
writeln ( ’ Restaurante fechado ’) ;
end .
’ Desconto : 10% ’
Se o dia escolhido for qualquer numero diferente dos anteriores, o programa deverá
não imprimir nada.
60
Solução A solução usada foi a seguinte
program exemplo5_2_2 ;
var
temcupom : char ;
dia : integer ;
begin
write ( ’ Digite um numero de 2 a 5 que corresponda ao dia da
semana : ’) ;
readln ( dia ) ;
if dia = 3
then
writeln ( ’ Prato do dia : macarronada ’)
else
if dia = 4
then
begin
write ( ’ Possui cupom de desconto ? ’) ;
readln ( temcupom ) ;
if temcupom = ’s ’
then
writeln ( ’ Desconto : 10% ’) ;
writeln ( ’ Prato do dia : galinhada ’) ;
end
else
if dia = 5
then
writeln ( ’ Prato do dia : feijoada ’) ;
end .
5.5.4 Comentários
A árvore foi assim estabelecida de modo a exercitar o uso de sequências de comandos if-
then mutualmente exclusivas, uma configuração em cascata. A partir de tal configuração,
estabelecemos três caracterı́sticas removı́veis atendendo os critérios seguintes:
61
O uso de comandos comandos avulsos if-then e else tem o objetivo de indicar ao
aluno a possibilidade de inclusão destes comandos dentro da configuração proposta na
árvore tal como quaisquer outros comandos dentro do bloco begin-end.
5.6 Árvore 6
A sexta árvore encerra o capı́tulo de comandos de decisão com a apresentação de estruturas
case. Estas estruturas estendem e simplificam a experiência adquirida com comandos if.
A sua fundamentação ocorre sobre três caracterı́sticas removı́veis: presença de intervalos;
presença de else; presença de blocos de comandos. Árvore de profundidade 3.
62
Se o paı́s estiver no nı́vel 3, imprima a mensagem:
e, depois, a mensagem:
’ Ha paises melhores ’
seguida de
’ Nivel invalido ’
program exemplo6 ;
var
pais : string ;
nivel : integer ;
begin
writeln ( ’ Qual o nome do pais ? ’) ;
readln ( pais ) ;
writeln ( ’ Qual o nivel do pais ? ’) ;
readln ( nivel ) ;
case nivel of
1 .. 2 : writeln ( pais , ’ e ruim para investir ’) ;
3 : begin
writeln ( pais , ’ e razoavel para investir ’) ;
writeln ( ’ Ha paises melhores ’) ;
63
end ;
4: writeln ( pais , ’ e bom para investir ’) ;
5: begin
writeln ( pais , ’ e otimo para investir ’) ;
writeln ( ’ Recomendamos investir nele ’) ;
end ;
else writeln ( ’ Nivel invalido ’) ;
end ;
end .
e, depois, a mensagem:
seguida da mensagem:
’ Nivel invalido ’
64
Solução A solução usada foi a seguinte
program exemplo6_1 ;
var
pais : string ;
nivel : integer ;
begin
writeln ( ’ Qual o nome do pais ? ’) ;
readln ( pais ) ;
writeln ( ’ Qual o nivel do pais ? ’) ;
readln ( nivel ) ;
case nivel of
1 : writeln ( pais , ’ e pessimo para investir ’) ;
2 : begin
writeln ( pais , ’ e ruim para investir ’) ;
writeln ( ’ Recomendamos nao investir nesse pais ’) ;
end ;
3 : begin
writeln ( pais , ’ e razoavel para investir ’) ;
writeln ( ’ Recomendamos investir em paises de nivel 4 ’) ;
end ;
4 : writeln ( pais , ’ e bom para investir ’) ;
5 : writeln ( pais , ’ e otimo para investir ’) ;
else writeln ( ’ Nivel invalido ’) ;
end ;
end .
65
e, depois, a mensagem:
’ Ha paises melhores ’
seguida de
program exemplo6_2 ;
var
pais : string ;
nivel : integer ;
begin
writeln ( ’ Qual o nome do pais ? ’) ;
readln ( pais ) ;
writeln ( ’ Qual o nivel do pais ? ’) ;
readln ( nivel ) ;
case nivel of
1 .. 2 : writeln ( pais , ’ e ruim para investir ’) ;
3 : begin
writeln ( pais , ’ e razoavel para investir ’) ;
writeln ( ’ Ha paises melhores ’) ;
end ;
4: writeln ( pais , ’ e bom para investir ’) ;
5: begin
writeln ( pais , ’ e otimo para investir ’) ;
writeln ( ’ Recomendamos investir nele ’) ;
end ;
end ;
end .
66
5.6.3.4 Exemplo 6.3
Enunciado Uma agência de consultoria financeira classifica os paı́ses em uma escala de
1 a 5. Paı́ses nos nı́veis 1 e 2 são ruins para se investir. Paı́ses no nı́vel 3 são razoáveis
para se investir. Paı́ses no nı́vel 4 são bons para se investir, e paı́ses no nı́vel 5 são os
melhores, e são geralmente um ou dois.
Escreva um programa que pergunta o nome de um paı́s e o seu nı́vel no ranking da
agência. Se o paı́s for nı́vel 1 ou 2, imprima a mensagem:
’ < nome do pais > e ruim para investir ’
program exemplo6_3 ;
var
pais : string ;
nivel : integer ;
begin
writeln ( ’ Qual o nome do pais ? ’) ;
readln ( pais ) ;
writeln ( ’ Qual o nivel do pais ? ’) ;
readln ( nivel ) ;
case nivel of
1 .. 2 : writeln ( pais , ’ e ruim para investir ’) ;
3 : writeln ( pais , ’ e razoavel para investir ’) ;
4 : writeln ( pais , ’ e bom para investir ’) ;
5 : writeln ( pais , ’ e otimo para investir ’) ;
else writeln ( ’ Nivel invalido ’) ;
end ;
end .
67
5.6.3.5 Exemplos 6.1.1 e 6.2.1 e 6.3.1
Enunciado Outra agência de consultoria financeira classifica os paı́ses em uma escala
de 1 a 5. Um paı́s no nı́vel 1 é um péssimo lugar para se investir. Paı́ses no nı́vel 2 são
locais ruins para se investir. Paı́ses no nı́vel 3 são medianos, razoáveis para se investir.
Qualquer paı́s 4 já é bom para se investir, e se estiver no nı́vel 5, o paı́s é ótimo.
Escreva um programa que pergunta o nome de um paı́s e o seu nı́vel no ranking da
agência. Se o paı́s for nı́vel 1, imprima a mensagem:
program exemplo6_1_1 ;
var
pais : string ;
nivel : integer ;
begin
writeln ( ’ Qual o nome do pais ? ’) ;
readln ( pais ) ;
writeln ( ’ Qual o nivel do pais ? ’) ;
readln ( nivel ) ;
case nivel of
68
1 : writeln ( pais , ’ e pessimo para investimentos . ’) ;
2 : writeln ( pais , ’ e ruim para investimentos . ’) ;
3 : writeln ( pais , ’ e razoavel para investimentos . ’) ;
4 : writeln ( pais , ’ e bom para investimentos . ’) ;
5 : writeln ( pais , ’ e otimo para investimentos . ’) ;
end ;
end .
e, depois, a mensagem:
seguida da mensagem:
69
Solução A solução usada foi a seguinte
program exemplo6_1_2 ;
var
pais : string ;
nivel : integer ;
begin
writeln ( ’ Qual o nome do pais ? ’) ;
readln ( pais ) ;
writeln ( ’ Qual o nivel do pais ? ’) ;
readln ( nivel ) ;
case nivel of
1 : writeln ( pais , ’ e pessimo para investir ’) ;
2 : begin
writeln ( pais , ’ e ruim para investir ’) ;
writeln ( ’ Recomendamos nao investir nele ’) ;
end ;
3 : begin
writeln ( pais , ’ e razoavel para investir ’) ;
writeln ( ’ Recomendamos investir em paises de nivel 4 ’) ;
end ;
4 : writeln ( pais , ’ e bom para investir ’) ;
5 : writeln ( pais , ’ e otimo para investir ’) ;
end ;
end .
70
’ < nome do pais > e razoavel para investir ’
’ Nivel invalido ’
program exemplo6_1_3 ;
var
pais : string ;
nivel : integer ;
begin
writeln ( ’ Qual o nome do pais ? ’) ;
readln ( pais ) ;
writeln ( ’ Qual o nivel do pais ? ’) ;
readln ( nivel ) ;
case nivel of
1 : writeln ( pais , ’ e pessimo para investir ’) ;
2 : writeln ( pais , ’ e ruim para investir ’) ;
3 : writeln ( pais , ’ e razoavel para investir ’) ;
4 : writeln ( pais , ’ e bom para investir ’) ;
5 : writeln ( pais , ’ e otimo para investir ’) ;
else writeln ( ’ Nivel invalido ’) ;
end ;
end .
71
5.6.3.8 Exemplos 6.2.3
Enunciado Uma agência de consultoria financeira classifica os paı́ses em uma escala de
1 a 5. Paı́ses nos nı́veis 1 e 2 são ruins para se investir. Paı́ses no nı́vel 3 são razoáveis
para se investir. Paı́ses no nı́vel 4 são bons para se investir, e paı́ses no nı́vel 5 são os
melhores, e são geralmente um ou dois.
Escreva um programa que pergunta o nome de um paı́s e o seu nı́vel no ranking da
agência. Se o paı́s for nı́vel 1 ou 2, imprima a mensagem:
program exemplo6_2_3 ;
var
pais : string ;
nivel : integer ;
begin
writeln ( ’ Qual o nome do pais ? ’) ;
readln ( pais ) ;
writeln ( ’ Qual o nivel do pais ? ’) ;
readln ( nivel ) ;
case nivel of
1 .. 2 : writeln ( pais , ’ e pessimo para investir ’) ;
3 : writeln ( pais , ’ e razoavel para investir ’) ;
4 : writeln ( pais , ’ e bom para investir ’) ;
5 : writeln ( pais , ’ e otimo para investir ’) ;
end ;
end .
72
5.6.4 Comentários
As árvores de 1 a 5 apresentaram o uso do comando if. Elas foram concebidas por
agrupamentos de caracterı́sticas afins cujo critério para afinidade e seleção atendem a
determinadas premissas didáticas.
No entanto, ainda restava-nos definir uma configuração que represente os comandos
case. Em geral, a opção por utilizar estes comandos ocorre quando o programador pre-
tende simplificar rotinas que poderiam ser desenvolvidas com o uso de if.Um uso tı́pico
do comando case ocorre em substituição de comandos if em cascata. Um valor é ava-
liado e o fluxo de execução do programa é desviado para uma entre diversas opções que
corresponda aquele valor. Tal como ocorre no uso de if, a execução do programa pode
ser desviada para um simples comando ou um bloco de comandos. Também contamos
com a opção da cláusula else a fim de cobrir todo o universo de possibilidades para a
variável avaliada.
A sofisticação possibilitada por uso do comando case apresenta uma caracterı́stica
nova: pode-se definir a execução a partir de um valor ou de uma série de valores que
configurem um intervalo sem o uso de operadores lógicos.
73
Capı́tulo 6
Dados os desafios do ensino de programação, uma das abordagens para lidar com eles
é o uso de softwares de auxı́lio à aprendizagem. Um modelo de software de auxı́lio à
aprendizagem bastante promissor são os sistemas tutoriais inteligentes, que permitem a
adaptação do tutorial às necessidades do estudante. O Tutorial ICC evolui nesta direção,
não tanto para se tornar um STI em todos os sentidos, mas sim para tornar-se um sistema
tutorial dotado de inteligência.
Este trabalho dá mais um passo nessa direção. Nós desenvolvemos taxonomias de
exemplos que exercitam diversos aspectos da aprendizagem de programação em nı́veis de
dificuldades diferentes.
Um framework conceitual para o desenvolvimento de taxonomias é uma idéia nova.
A parte prática de nosso trabalho focou-se em desenvolver este framework e aplicá-lo ao
desenvolvimento de taxonomias. Assim sendo, o resultado do nosso trabalho inclui, além
das taxonomias em si, um framework com uma terminologia, conceitos e procedimentos
próprios, que podem auxiliar o desenvolvimento e evolução de taxonomias de exemplos
hierárquicas.
Certamente, porém, os vários aspectos das taxonomias de exemplos estão longe de
serem exaustivamente explorados. Eventuais trabalhos futuros podem focar, por exem-
plo, na pesquisa de conceitos e dificuldades mais relevantes para os estudantes. Nossa
abordagem atual nesse sentido foi nos basearmos nas experiências de professores, mas
certamente há outras maneiras de se isolar conceitos e dificuldades relevantes.
Outro possı́vel objeto de trabalho futuro é uma avaliação da eficácia do uso de taxo-
nomias de exemplos. Uma vez que se tenha uma melhor idéia da eficácia das taxonomias,
outro passo seria uma pesquisa no aprimoramento do framework de desenvolvimento de
taxonomias, de modo a gerar árvores cada vez mais eficientes.
Ademais, pesquisas para desenvolver interfaces mais adaptativas e intuitivas para as
taxonomias são também bastante interessantes. Vale lembrar que as taxonomias são
apenas um dos módulos do sistema, e um sistema tutorial dotado de alguma inteligência
possui uma série de desafios no que tange à sua interface.
74
Referências
ACM. Computing Curricula 2005. Technical report, Association for Computing Machi-
nery (ACM), Association for Information Systems (AIS), Computer Society (IEEE-CS),
2005. Acessado dia 31 de agosto de 2008. 1, 2
Joseph Beck, Mia Stern, e Erik Haugsjaa. Applications of AI in Education. ACM Cross-
roads, 1996. xii, 9, 10
Peter Brusilovsky, John Eklund, e Elmar Schwarz. Web-based education for all: A tool
for development adaptive courseware. In Proceedings of Seventh International World
Wide Web inproceedings, Abril 1998. Acessado dia 31 de agosto de 2008. 1
Pat Byrne e Gerry Lyons. The effect of student attributes on success in programming.
ACM SIGCSE Bulletin, 33(3):49—52, 2001. 4
Pedro Araújo Chaves Júnior e Eliza Silveira Bastos. Interface orientada a estilos de
aprendizagem em um tutorial para ensino de computação, dezembro 2008. Monogra-
fia apresentada como requisito parcial para conclusão do Bacharelado em Ciência da
Computação e Licenciatura em Computação na Universidade de Brası́lia. 5
J. Wei Chen. Designing a web-based van hiele model for teaching and learning computer
programming to promote collaborative learning. In Fifth IEEE International inprocee-
dings on Advanced Learning Technologies, pages 313—317, 2005. 1
Rodrigo Pereira dos Santos e Heitor Augustus Xavier Costa. TBC-AED e TBC-
AED/WEB: Um desafio no ensino de algoritmos, estruturas de dados e programação.
Acessado em http://www.weimig2005.unis.edu.br/artigos/TBC-AED.pdf, 2005. 1
Mauri Ferrandin e Simone Lilian Stephani. Ferramenta para o ensino de programação via
internet. In SULCOMP-I Congresso Sul Catarinense de Computação, 2005. 1
75
Michel Foucault. As Palavras e as Coisas. Martins Fontes, 3 edition, 2002. No prefácio,
Foucault se refere a um texto de Borges sobre uma “certa enciclopédia chinesa”. 12
Leo Gugerty. Non-diagnostic intelligent tutoring systems: Teaching without student mo-
dels. Instructional Science, (25):409—432, 1997. 10
Antônio Houaiss, Mauro de Salles Villar, e Francisco Manoel Mello Franco. Dicionário
Houaiss da lı́ngua portuguesa. Editora Objetiva, 2001. Verbete taxonomia. 15
Tony Jenkins e John Davy. Research-led innovation in teaching and learning program-
ming. In Proceedings of the 4th annual SIGCSE/SIGCUE ITiCSE conference on Inno-
vation and technology in computer science education, pages 5—8, 1999. 4
Tom Murray. Authoring Intelligent Tutoring Systems: An Analysis of the State of the
Art. International Journal of Artificial Intelligence in Education, (10):98—129, 1999.
xi, 8, 9, 10, 12, 13, 14
Roy D. Pea. Logo programming and problem solving. Technical Report 12, Spencer
Foundation, Center for Children and Technology, Bank Street College of Education,
abril 1983. 6
76
Homero Luiz Pı́ccolo. Tutorial dotado de inteligência para orientação de alunos novatos
em uma biblioteca universitária: o caso da Universidade de Brası́lia. Tese de doutorado,
Universidade de Brası́lia, Brası́lia, 2006. 1
John Self. The defining characteristics of Intelligent Tutoring Systems research: ITSs care,
precisely. International Journal of Artificial Intelligence in Education, (10):350—364,
1999. 8
Niklaus Wirth. The Programming Language Pascal. Berichte der Fachgruppe Computer-
Wissenschaften, novembro 1972. 6
77
Apêndice A
Taxonomias do Capı́tulo 2 do
Tutorial ICC
A.1 Árvore 1
Uso de constantes e variáveis de vários tipos e formatação na saı́da dos dados.
A.1.3 Enunciados
A.1.3.1 Exemplo 1
Faça um programa que peça ao usuário para entrar com o nome (string), a idade (integer)
e o peso (real) de 3 pessoas.
O programa deve gerar uma tabela na saı́da alinhando os dados das pessoas, reservando
10 caracteres para o nome, 5 para a idade e 6 para o peso, sendo este último escrito com
dois algarismos depois da vı́rgula.
O programa deve colocar um tı́tulo sobre os dados indicando nome, idade e peso.
78
A.1.3.2 Exemplo 1.1
Faça um programa que peça ao usuário para entrar com o nome (string), a idade (integer)
e o peso (real) de 3 pessoas.
O programa deve escrever na tela 3 linhas, cada uma contendo o nome, idade e peso
de cada pessoa.
A.2 Árvore 2
Uso de expressões aritméticas e uso de funções.
79
A.2.2.1 Exemplo 2
Faça um programa para ler dois ângulos (em graus) alfa e beta.
Transforme os ângulos para radianos e a seguir calcule os valores reais x e y dados
pelas expressões:
x = (cos2 (alf a) − sen2 (beta))/(2cos(alf a))
y = sen2 (alf a) − cos2 (beta)
O programa deve imprimir na tela os valores de x e de y.
Em seguida, deve trocar esses valores entre si e imprimı́-los novamente.
80
Apêndice B
Taxonomias do Capı́tulo 4 do
Tutorial ICC
B.1 Árvore 1
Comando for-do. Número determinado de laços. Exemplo utilizado: série de números
reais.
B.1.3 Enunciados
B.1.3.1 Exemplo 1
Dada a série 1/2, −1/4, 1/6 − 1/8, ... faça um programa que imprima os dez primeiros
elementos da série, e a seguir imprima a soma desses dez elementos.
81
B.1.3.3 Exemplo 1.2
Dada a série 1/2, −1/4, 1/6, −1/8, ... faça um programa que imprima a soma dos dez
primeiros elementos.
B.2 Árvore 2
Comando repeat-until com final do laço especificado nos próprios dados.
B.2.3 Enunciados
B.2.3.1 Exemplo 2
Faça um programa que leia uma sequência de números inteiros diferentes de zero.
O programa deve imprimir o maior e menor valor da sequência.
O programa deve parar quando o valor lido for igual a zero. O zero não faz parte da
sequência.
82
B.2.3.3 Exemplo 2.2
Faça um programa que leia uma sequência de números inteiros diferentes de zero.
O programa deve imprimir o valor da soma dos elementos positivos e a soma dos
elementos negativos da sequência.
O programa deve parar quando o valor lido for igual a zero. O zero não faz parte da
sequência.
B.3 Árvore 3
Comando repeat-until com pergunta ao usuário para cada laço.
B.3.3 Enunciados
B.3.3.1 Exemplo 3
3 Faça um programa que leia uma sequência de números inteiros.
O programa deve imprimir o maior e menor valor da sequência.
O programa deve perguntar ao usuário, em cada leitura, se deseja continuar ou parar.
O usuário deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar.
Se o usuário entrar com um caractere diferente de ’s’ ou ’n’, o programa deve repetir
a pergunta.
83
B.3.3.2 Exemplo 3.1
Faça um programa que leia uma sequência de números inteiros.
O programa deve imprimir o valor da soma dos elementos da sequência.
O programa deve perguntar ao usuário, em cada leitura, se deseja continuar ou parar.
O usuário deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar.
B.4 Árvore 4
Comando repeat-until com final do laço dependendo de alguma condição determinada
ao longo do programa.
84
B.4.3 Enunciados
B.4.3.1 Exemplo 4
Faça um programa que escreva todos os números primos entre 1 e 100, um em cada linha.
B.5 Árvore 5
Comando while-do com final do laço especificado nos próprios dados
85
B.5.3 Enunciados
B.5.3.1 Exemplo 5
Faça um programa que leia uma sequência de números inteiros diferentes de zero.
O programa deve imprimir o maior e o menor valor da sequência.
O programa deve parar quando o valor lido for igual a zero. O zero não faz parte da
sequência.
B.6 Árvore 6
Comando while-do com pergunta ao usuário para cada laço
86
B.6.2 Numeração dos exemplos
C1 C2 Exemplo
• • 6
– – 6.1
– • 6.2
• – 6.3
B.6.3 Enunciados
B.6.3.1 Exemplo 6
Faça um programa que leia uma sequência de números inteiros.
O programa deve imprimir o maior e menor valor da sequência.
O programa deve perguntar ao usuário, em cada leitura, se deseja continuar ou parar.
O usuário deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar.
Se o usuário entrar com um caractere diferente de ’s’ ou ’n’, o programa deve repetir
a pergunta.
87
B.7 Árvore 7
grupo 7. Comando while-do com final do laço dependendo de alguma condição determi-
nada ao longo do programa.
Comando while-do com pergunta ao usuário para cada laço
B.7.3 Enunciados
B.7.3.1 Exemplo 7
Faça um programa que escreva todos os números primos entre 1 e 100, um em cada linha.
88
Apêndice C
Taxonomias do Capı́tulo 4 do
Tutorial ICC
C.1 Árvore 1
Apenas um arquivo de entrada (sem uso de \lstinlineeoln!! e apenas variáveis de tipo
\lstinlineinteger!!).
C.1.3 Enunciados
C.1.3.1 Exemplo 1
Faça um programa que leia um arquivo tipo text contendo, em cada linha, uma sequencia
de 5 números inteiros.
O programa deve escrever na tela, para cada linha do arquivo, o valor da soma dos 5
elementos da sequencia.
O programa deve perguntar ao usuário o nome do arquivo a ser lido.
89
C.1.3.2 Exemplo 1.1
Faça um programa que leia um arquivo tipo text contendo uma única linha com 5 números
inteiros.
O programa deve escrever na tela o valor da soma dos 5 elementos.
O nome do programa é dado no próprio comando assign.
C.2 Árvore 2
Apenas um arquivo de entrada com uso de eoln e variáveis de vários tipos diferentes.
90
C.2.3 Enunciados
C.2.3.1 Exemplo 2
Faça um programa que leia um arquivo tipo text contendo, em cada linha, um nome
(string de 10 caracteres), uma idade (inteiro) e uma sequencia de notas (reais) de tamanho
indefinido (a sequencia pode ter tamanho zero).
O programa deve determinar qual a pessoa cuja soma das notas é a maior, entre todas
as pessoas presentes no arquivo. O programa deve escrever na tela o nome dessa pessoa
seguido de sua idade e do valor da soma das suas notas.
C.3 Árvore 3
Apenas um arquivo de saı́da, entrada via teclado.
91
C.3.2 Numeração dos exemplos
C1 C2 Exemplo
• • 3
– – 3.1
– • 3.2
• – 3.3
C.3.3 Enunciados
C.3.3.1 Exemplo 3
Faça um programa que leia via teclado, 4 linhas, cada uma delas contendo 5 campos: o
primeiro é um nome (string[10]), o segundo é uma idade (integer) e os outros três são
notas (real).
O programa deve gerar um arquivo contendo em cada linha o conjunto de dados de
cada linha de entrada, formatando-os como uma tabela com o tı́tulo de cada campo.
C.4 Árvore 4
Um arquivo de entrada e outro de saı́da.
92
C.4.1 Caracterı́sticas removı́veis
C1. com uso de eoln
C.4.3 Enunciados
C.4.3.1 Exemplo 4
Faça um programa que leia um arquivo tipo text contendo, em cada linha, um nome
(string de 10 caracteres), uma idade (inteiro) e uma sequencia de notas (reais) de tamanho
indefinido (a sequencia pode ter tamanho zero).
O programa deve gerar um arquivo contendo, em cada linha, o nome da pessoa, sua
idade e a soma de suas notas, formatando-os como uma tabela com o tı́tulo de cada
campo.
93
O programa deve gerar um arquivo contendo, em cada linha, o nome da pessoa, sua
idade e a soma de suas notas, formatando-os como uma tabela com o tı́tulo de cada
campo.
C.5 Árvore 5
Um arquivo de entrada e dois de saı́da.
C.5.3 Enunciados
C.5.3.1 Exemplo 5
Faça um programa que leia um arquivo tipo text contendo, em cada linha, um nome
(string de 10 caracteres) e uma sequencia de notas (reais) de tamanho indefinido (a
sequencia pode ter tamanho zero).
O programa deve gerar dois arquivos, um para os alunos cuja soma das notas ultrapasse
o valor 10, e outro para os alunos cuja soma das notas seja menor ou igual a 10.
Em cada um dos arquivos de saı́da o programa deve escrever, em cada linha, o nome
seguido do valor da soma das notas.
94
C.5.3.3 Exemplo 5.2
Faça um programa que leia um arquivo tipo text contendo, em cada linha uma sequencia
de notas (reais) de tamanho indefinido (a sequencia pode ter tamanho zero).
O programa deve gerar dois arquivos, um para os alunos cuja soma das notas ultrapasse
o valor 10, e outro para os alunos cuja soma das notas seja menor ou igual a 10.
Em cada um dos arquivos de saı́da o programa deve escrever, em cada linha, o valor
da soma das notas da linha correspondente no arquivo de entrada.
95
Apêndice D
Taxonomias do Capı́tulo 6 do
Tutorial ICC
D.1 Árvore 1
Utiliza apenas um vetor de números inteiros dispostos aleatoriamente.
D.1.3 Enunciados
D.1.3.1 Exemplo 1
Faça um programa para trabalhar com um vetor de 10 elementos inteiros. Os dados do
vetor devem ser lidos de um arquivo.
O programa deve percorrer o vetor, a partir do primeiro elemento, até encontrar o
primeiro elemento par.
O programa deve escrever o valor da soma dos elementos percorridos antes de encontrar
o primeiro elemento par.
96
D.1.3.2 Exemplo 1.1
Faça um programa para trabalhar com um vetor de 10 elementos inteiros. Os dados do
vetor devem ser lidos de um arquivo.
O programa deve escrever o valor da soma de todos os elementos do vetor.
D.2 Árvore 2
Utiliza dois vetores de caracteres, um ordenado e outro não; o não-ordenado pode conter
elementos repetidos.
D.2.3 Enunciados
D.2.3.1 Exemplo 2
Faça um programa que leia dois vetores,a e b, de 10 caracteres cada um, de dois arquivos
diferentes. O vetor a tem os elementos em ordem crescente e não tem elementos repetidos.
O vetor b tem os elementos dispostos aleatoriamente e pode ter elementos repetidos.
97
O programa deve escrever uma linha para cada elemento de b. Cada linha deve conter
o elemento de b, seguido de um inteiro que indica a posição desse elemento no vetor a. Se
o elemento não estiver presente no vetor a, o programa deve escrever 0.
D.3 Árvore 3
Utiliza dois vetores, um de strings e outro de reais, vinculados.
98
D.3.2 Numeração dos exemplos
C1 C2 Exemplo
• • 3
– – 3.1
– • 3.2
• – 3.3
D.3.3 Enunciados
D.3.3.1 Exemplo 3
Faça um programa que leia dois vetores de 5 elementos cada, de dois arquivos. Um dos
vetores guarda os nomes de alunos (string[10]) e o outro guarda suas notas (reais).
O programa deve escrever na tela os nomes e as notas, um aluno por linha, com os
nomes dos alunos em ordem alfabética.
D.4 Árvore 4
Utiliza uma matriz de 3 por 5 inteiros.
99
D.4.1 Caracterı́sticas removı́veis
C1. usa ordenação
D.4.3 Enunciados
D.4.3.1 Exemplo 4
Faça um programa que leia, de um arquivo, uma matriz de 3 linhas e 5 colunas, de
números inteiros. Cada linha do arquivo deve conter uma linha da matriz.
O programa deve alterar a ordem dos elementos em cada linha da matriz, de modo
que cada uma das linhas fique ordenada em ordem crescente.
O programa deve escrever a nova matriz na tela, uma linha da matriz para cada linha
da tela.
100
O programa deve escrever a nova matriz na tela, uma linha da matriz para cada linha
da tela.
D.5 Árvore 5
Utiliza matriz quadrada de 5 por 5 inteiros.
D.5.3 Enunciados
D.5.3.1 Exemplo 5
Faça um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de números
inteiros. Cada linha do arquivo deve conter uma linha da matriz.
O programa deve transpor a matriz, percorrendo os elementos abaixo da diagonal
principal.
O programa deve escrever a nova matriz na tela, uma linha da matriz para cada linha
da tela.
101
D.5.3.4 Exemplo 5.3
Faça um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de números
inteiros. Cada linha do arquivo deve conter uma linha da matriz.
O programa deve igualar a zero todos os elementos situados abaixo da diagonal prin-
cipal da matriz.
O programa deve escrever a nova matriz na tela, uma linha da matriz para cada linha
da tela.
D.6 Árvore 6
Utiliza matriz quadrada de 5 por 5 inteiros.
D.6.3 Enunciados
D.6.3.1 Exemplo 6
Faça um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de números
inteiros. Cada linha do arquivo deve conter uma linha da matriz.
O programa deve igualar a zero todos os elementos situados acima da diagonal se-
cundária da matriz.
O programa deve escrever a nova matriz na tela, uma linha da matriz para cada linha
da tela.
102
D.6.3.3 Exemplo 6.2
Faça um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de números
inteiros. Cada linha do arquivo deve conter uma linha da matriz.
O programa deve igualar a zero todos os elementos da diagonal secundária da matriz.
O programa deve escrever a nova matriz na tela, uma linha da matriz para cada linha
da tela.
103
Apêndice E
Taxonomias do Capı́tulo 7 do
Tutorial ICC
E.1 Árvore 1
Registro dentro de outro registro.
E.1.3 Enunciados
E.1.3.1 Exemplo 1
Faça um programa que leia um arquivo text contendo em cada linha: um nome (string
[10]), um dia (inteiro), um mês (inteiro), um ano (inteiro) e uma dı́vida (real).
Os dados de cada pessoa devem ser colocados em um registro com os campos nome,
nascimento e divida. O campo nascimento é outro registro contendo os campos dia, mês
e ano.
O programa deve escrever na tela os dados da pessoa mais nova de todo o conjunto.
104
E.1.3.2 Exemplo 1.1
Faça um programa que leia um arquivo text contendo em cada linha: um nome (string
[10]), um dia (inteiro), um mês (inteiro), um ano (inteiro) e uma dı́vida (real).
Os dados de cada pessoa devem ser colocados em um registro com os campos nome,
dia, mês, ano e divida.
O programa deve escrever na tela o valor da somas das dı́vidas de todas as pessoas do
conjunto.
E.2 Árvore 2
Array dentro de registro.
105
E.2.3 Enunciados
E.2.3.1 Exemplo 2
Faça um programa que leia um arquivo text contendo em cada linha: um nome (string
[10]) e cinco notas (reais).
Os dados de cada pessoa devem ser colocados em um registro com os campos nome e
notas. O campo notas é um array contendo cinco notas (reais).
O programa deve escrever na tela os dados da pessoa com a média das notas mais
baixa.
E.3 Árvore 3
Array de registros.
106
E.3.2 Numeração dos exemplos
C1 C2 Exemplo
• • 3
– – 3.1
– • 3.2
• – 3.3
E.3.3 Enunciados
E.3.3.1 Exemplo 3
Faça um programa que leia um arquivo contendo, em cada linha, o nome de um aluno
(string[10]) e 5 notas (reais).
Os dados de cada aluno devem ser colocados um registro com os seguintes campos:
um nome (string[10]), um array de 5 notas (reais) e uma média (real). O programa deve
construir um array de 10 registros desse tipo. Observe que nesse caso o arquivo não pode
ter mais de 10 linhas.
O programa deve ler os dados de cada aluno e colocá-lo no elemento correspondente
do array de registros, calculando e guardando também a média de cada aluno.
O programa deve escrever na tela uma relação dos nomes e médias dos alunos, em
ordem decrescente do valor da média.
107
O programa deve ler os dados de cada aluno e colocá-lo no elemento correspondente
do array de registros, calculando e guardando também a média de cada aluno.
O programa deve escrever na tela a relação de nomes e médias, na mesma ordem em
que estavam no arquivo de origem.
108