Universidade de Bras´ılia
Instituto de Ciˆencias Exatas
Departamento de Ciˆencia da Computa¸c˜ao
Taxonomias de Exemplos para Aprendizagem de
Programa¸c˜ao
Adam Victor Nazareth Brandizzi
Yuri Moreira de Nu˜nez
Monografia apresentada como requisito parcial
para conclus˜ao do Curso de Computa¸c˜ao — Licenciatura
Orientador
Prof. Dr. Homero Luiz P´ıccolo
Bras´ılia
2009
Universidade de Bras´ılia — UnB
Instituto de Ciˆencias Exatas
Departamento de Ciˆencia da Computa¸c˜ao
Curso de Computa¸c˜ao — Licenciatura
Coordenador: Prof. Dr. Fl´avio Leonardo Cavalcanti de Moura
Banca examinadora composta por:
Prof. Dr. Homero Luiz P´ıccolo (Orientador) — CIC/UnB
Prof. Dr. Maria de F´atima R. Brand˜ao — CIC/UnB
Prof. Dr. Carla Cavalcante Koike — CIC/UnB
CIP — Cataloga¸c˜ao Internacional na Publica¸c˜ao
Brandizzi, Adam Victor Nazareth.
Taxonomias de Exemplos para Aprendizagem de Programa¸c˜ao / Adam
Victor Nazareth Brandizzi, Yuri Moreira de Nu˜nez. Bras´ılia : UnB, 2009.
121 p. : il. ; 29,5 cm.
Monografia (Gradua¸c˜ao) — Universidade de Bras´ılia, Bras´ılia, 2009.
1. Exemplos, 2. Problemas, 3. Programa¸c˜ao de Computador,
4. Ensino de Programa¸c˜ao, 5. Sistemas Tutoriais Inteligentes,
6. Sistemas Tutorias Baseados na Web, 7. Taxonomia de Exemplos,
8. Tutorias
CDU 004
Endere¸co: Universidade de Bras´ılia
Campus Universit´ario Darcy Ribeiro — Asa Norte
CEP 70910-900
Bras´ılia–DF — Brasil
Universidade de Bras´ılia
Instituto de Ciˆencias Exatas
Departamento de Ciˆencia da Computa¸c˜ao
Taxonomias de Exemplos para Aprendizagem de
Programa¸c˜ao
Adam Victor Nazareth Brandizzi
Yuri Moreira de Nu˜nez
Monografia apresentada como requisito parcial
para conclus˜ao do Curso de Computa¸c˜ao — Licenciatura
Prof. Dr. Homero Luiz P´ıccolo (Orientador)
CIC/UnB
Prof. Dr. Maria de F´atima R. Brand˜ao Prof. Dr. Carla Cavalcante Koike
CIC/UnB CIC/UnB
Prof. Dr. Fl´avio Leonardo Cavalcanti de Moura
Coordenador do Curso de Computa¸c˜ao — Licenciatura
Bras´ılia, 30 de junho de 2009
Agradecimentos
Agrade¸co, acima de tudo, a meus saudosos pais, que me deram a melhor educa¸c˜ao poss´ıvel;
a meus tios Nataniel e Ana, que me apoiaram nos momentos dif´ıceis; a minhas irm˜as, que
sempre me apoiaram, e a Juliana Vilela, que esteve ao meu lado durante grande parte do
curso. Agrade¸co `a Universidade de Bras´ılia, pelo ensino de alta qualidade; aos professores
do departamento, pelo conhecimento, t´ecnico ou n˜ao, transmitido e pela compreens˜ao e
apoio. Agrade¸co especialmente ao professor Homero, pela orienta¸c˜ao s´abia, dedicada e
paciente. Por fim, agrade¸co a todos os companheiros universit´arios que me apoiaram,
especialmente ao amigo Pedro, que muito me ajudou no come¸co do curso, e ao parceiro
de projeto Yuri, cujo trabalho foi indispens´avel. A todos citados, e aos que n˜ao pude
citar, muito obrigado.
Adam Victor Nazareth Brandizzi
Agrade¸co ao professor orientador, Homero, e parceiro de projeto, Adam, pela paciˆencia
e esmero. Agrade¸co especialmente `as mulheres da minha vida - minha m˜ae, minha esposa,
minha irm˜a e minha av´o - que contribuiram a cada tempo com amor e compreens˜ao.
Agrade¸co, enfim, a todos os amigos que aguardavam ansiosos por este feliz desfecho.
Yuri Moreira de Nu˜nez
iv
Resumo
Estudantes possuem diferentes ritmos de aprendizado. Para satisfazer suas diferentes
necessidades, s˜ao necess´arios materiais did´aticos em diferentes n´ıveis de complexidade.
Nesse trabalho, propomos um conjunto de exemplos de programa¸c˜ao com v´arios n´ıveis
de complexidade para alunos que estejam aprendendo a programar computadores. Esse
conjunto de exemplos ser´a integrado ao Tutorial ICC, um sistema de aprendizagem auxi-
liado por computador. Este ´e mais um passo para acrescentar adaptabilidade ao Tutorial
ICC, aproximando-o dos sistemas tutoriais inteligentes.
Palavras-chave: Exemplos, Problemas, Programa¸c˜ao de Computador, Ensino de Pro-
grama¸c˜ao, Sistemas Tutoriais Inteligentes, Sistemas Tutorias Baseados na Web, Taxono-
mia de Exemplos, Tutorias
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.
Keywords: Computer Programming, Examples, Examples Taxonomy, Intelligent Tutor-
ing Systems, Problems, Programming Teaching, Tutorials, Web-based Tutoring Systems
vi
Sum´ario
1 Introdu¸c˜ao 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¸c˜ao 4
2.1 A dificuldade de ensinar a programar . . . . . . . . . . . . . . . . . . . . . 4
2.2 Fatores cognitivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.3 Fatores pedag´ogicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.4 Proposta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
3 Sistemas Tutoriais Inteligentes 8
3.1 Arquitetura de um sistema tutorial inteligente . . . . . . . . . . . . . . . . 8
3.2 Categorias de sistemas tutoriais inteligentes . . . . . . . . . . . . . . . . . 10
3.3 Vantagem dos sistemas tutoriais inteligentes . . . . . . . . . . . . . . . . . 14
3.4 O papel do trabalho corrente . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4 Taxonomias de Exemplos 15
4.1 Taxonomia hier´arquica de exemplos . . . . . . . . . . . . . . . . . . . . . . 15
4.2 Enunciados e solu¸c˜oes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.3 “Tira-teima” e roteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.4 Localiza¸c˜ao na taxonomia . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.5 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5 Exemplos de Taxonomias 23
5.1 ´Arvore 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5.1.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 23
5.1.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 24
5.1.3 Enunciados e programas . . . . . . . . . . . . . . . . . . . . . . . . 24
5.1.4 Coment´arios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5.2 ´Arvore 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5.2.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 28
5.2.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 28
vii
5.2.3 Enunciados e programas . . . . . . . . . . . . . . . . . . . . . . . . 28
5.2.4 Coment´arios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5.3 ´Arvore 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
5.3.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 34
5.3.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 34
5.3.3 Enunciados e programas . . . . . . . . . . . . . . . . . . . . . . . . 34
5.3.4 Coment´arios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.4 ´Arvore 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.4.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 42
5.4.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 42
5.4.3 Enunciados e programas . . . . . . . . . . . . . . . . . . . . . . . . 42
5.4.4 Coment´arios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.5 ´Arvore 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.5.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 49
5.5.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 49
5.5.3 Enunciados e programas . . . . . . . . . . . . . . . . . . . . . . . . 49
5.5.4 Coment´arios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.6 ´Arvore 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5.6.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 62
5.6.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 62
5.6.3 Enunciados e programas . . . . . . . . . . . . . . . . . . . . . . . . 62
5.6.4 Coment´arios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
6 Conclus˜oes e Trabalhos Futuros 74
Referˆencias 75
A Taxonomias do Cap´ıtulo 2 do Tutorial ICC 78
A.1 ´Arvore 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
A.1.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 78
A.1.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 78
A.1.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
A.2 ´Arvore 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
A.2.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 79
A.2.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 79
B Taxonomias do Cap´ıtulo 4 do Tutorial ICC 81
B.1 ´Arvore 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
B.1.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 81
B.1.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 81
B.1.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
B.2 ´Arvore 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
B.2.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 82
B.2.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 82
viii
B.2.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
B.3 ´Arvore 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
B.3.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 83
B.3.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 83
B.3.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
B.4 ´Arvore 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
B.4.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 84
B.4.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 84
B.4.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
B.5 ´Arvore 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
B.5.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 85
B.5.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 85
B.5.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
B.6 ´Arvore 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
B.6.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 86
B.6.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 87
B.6.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
B.7 ´Arvore 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
B.7.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 88
B.7.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 88
B.7.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
C Taxonomias do Cap´ıtulo 4 do Tutorial ICC 89
C.1 ´Arvore 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
C.1.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 89
C.1.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 89
C.1.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
C.2 ´Arvore 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
C.2.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 90
C.2.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 90
C.2.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
C.3 ´Arvore 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
C.3.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 91
C.3.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 92
C.3.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
C.4 ´Arvore 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
C.4.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 93
C.4.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 93
C.4.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
C.5 ´Arvore 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
C.5.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 94
C.5.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 94
C.5.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
ix
D Taxonomias do Cap´ıtulo 6 do Tutorial ICC 96
D.1 ´Arvore 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
D.1.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 96
D.1.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 96
D.1.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
D.2 ´Arvore 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
D.2.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 97
D.2.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 97
D.2.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
D.3 ´Arvore 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
D.3.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 98
D.3.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 99
D.3.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
D.4 ´Arvore 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
D.4.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 100
D.4.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 100
D.4.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
D.5 ´Arvore 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
D.5.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 101
D.5.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 101
D.5.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
D.6 ´Arvore 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
D.6.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 102
D.6.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 102
D.6.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
E Taxonomias do Cap´ıtulo 7 do Tutorial ICC 104
E.1 ´Arvore 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
E.1.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 104
E.1.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 104
E.1.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
E.2 ´Arvore 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
E.2.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 105
E.2.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 105
E.2.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
E.3 ´Arvore 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
E.3.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 106
E.3.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 107
E.3.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
x
Lista de Tabelas
3.1 Categorias de STIs, segundo Murray (1999) . . . . . . . . . . . . . . . . . 13
xi
Lista de Figuras
3.1 Componentes de um STI, segundo Beck et al. (1996) . . . . . . . . . . . . 10
4.1 Representa¸c˜ao de taxonomia com duas caracter´ısticas remov´ıveis . . . . . . 16
4.2 Representa¸c˜ao de taxonomia com trˆes caracter´ısticas remov´ıveis . . . . . . 16
4.3 Representa¸c˜ao de taxonomia sem n´o sem caracter´ısticas . . . . . . . . . . . 17
4.4 Representa¸c˜ao de uma taxonomia n˜ao-ortogonal . . . . . . . . . . . . . . . 18
4.5 Screenshot da applet Java executando um “tira-teima” . . . . . . . . . . . 19
4.6 Exemplo de roteiro de “tira-teima” . . . . . . . . . . . . . . . . . . . . . . 20
4.7 Representa¸c˜ao da localiza¸c˜ao do aluno na taxonomia . . . . . . . . . . . . 21
xii
Siglas e Acrˆonimos
ACM Association of Computing Machinery
AIS Association for Information Systems
CALS computer-assisted learning1
CALS computer-assisted learning system
EaD educa¸c˜ao a distˆancia2
HTML Hypertext Markup Language
HTTP Hypertext Transfer Protocol
IEEE Institute of Electrical and Electronics Engineers
IEEE-CS IEEE Computer Society
ICC Introdu¸c˜ao `a Ciˆencia da Computa¸c˜ao
ITS intelligent tutoring system
SAAC sistema de aprendizagem auxiliada por computador
STBW sistema tutorial baseado em Web
STI sistema tutorial inteligente
UnB Universidade de Bras´ılia
1
Tamb´em ´e comum a forma, para efeitos gerais equivalente nesta monografia, computer-aideld learning.
2
Tamb´em ´e comum a forma, para efeitos gerais equivalente nesta monografia, ensino a distˆancia.
xiii
Cap´ıtulo 1
Introdu¸c˜ao
A programa¸c˜ao ´e comumente reconhecida como uma habilidade dif´ıcil de se aprender e,
portanto, de se ensinar (Gomes e Mendes, 2007). Al´em desse problema, a procura por
forma¸c˜ao em Ciˆencia da Computa¸c˜ao, Engenharia de Software e outros cursos que exigem
conhecimento de programa¸c˜ao como base cresceu bastante a partir dos anos 90 (ACM,
2005, p. 10).
Uma poss´ıvel solu¸c˜ao para o grande aumento da demanda dos cursos de programa¸c˜ao
´e o uso dos chamados sistemas tutoriais baseados em Web (STBW), que tˆem mostrado
bons resultados quando complementado por canais pelos quais alunos e professores podem
se comunicar e esclarecer d´uvidas (Brusilovsky et al., 1998, p. 2). A vantagem dos cursos
baseados na Web para o problema de forma¸c˜ao em maior escala ´e que esses cursos podem
ser acessados de qualquer lugar por uma grande quantidade de alunos. Al´em disso, cursos
baseados em Web permitem que os estudantes aprendam os pontos b´asicos de seus cursos
sem exigir acompanhamento constante do professor, que pode se concentrar nas d´uvidas
mais complicadas e nos alunos com mais dificuldades, desde que o material on-line possa
se adaptar aos estudantes e seus backgrounds (Brusilovsky et al., 1998, p. 2).
V´arios experimentos j´a foram ou est˜ao sendo feitos para avaliar a viabilidade do uso de
cursos baseados na Web para o ensino de programa¸c˜ao, como, por exemplo, Chen (2005),
Ferrandin e Stephani (2005), Carlson (2004) e dos Santos e Costa (2005). Esse presente
trabalho pretende evoluir um sistema em funcionamento. Esse sistema ´e chamado Tutorial
ICC e ´e utilizado no ensino de programa¸c˜ao para as turmas de Introdu¸c˜ao `a Ciˆencia da
Computa¸c˜ao da Universidade de Bras´ılia.
Mais especificamente, nossa abordagem ser´a acrescentar alguma flexibilidade ao tu-
torial. Nosso planejamento inicial ´e tornar Tutorial ICC n˜ao exatamente um sistema
tutorial inteligente (STI) no sentido estrito, mas tentar aplicar os conceitos inerentes a
esse tipo de sistema de uma maneira b´asica. Em especial, nosso foco ser´a oferecer um
sistema de exemplos alternativos ao estudante. Essa ´e uma decis˜ao promissora porque j´a
foi obtido sucesso consider´avel com essa abordagem no ensino do uso de bibliotecas na
pr´opria Universidade de Bras´ılia (P´ıccolo, 2006).
1
1.1 Problemas e Justificativa
Embora programa¸c˜ao seja uma das atividades fundamentais na Ciˆencia da Computa¸c˜ao,
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¸c˜ao tˆem crescido bastante (ACM, 2005). Desse modo, ´e de grande interesse
que se consigam ferramentas educacionais que auxiliem os estudantes no processo de
ensino-aprendizagem de programa¸c˜ao. Tamb´em tem crescido o interesse em ferramentas
que auxiliem o professor a ministrar cursos de programa¸c˜ao a um n´umero crescente de
alunos; em outras palavras, ´e necess´ario criar ferramentas que acrescentem escalabilidade
aos cursos de programa¸c˜ao.
Tem-se tentado satisfazer a necessidade de escalabilidade no ensino de programa¸c˜ao
atrav´es 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˜ao contaria com o apoio constante de um professor. Uma poss´ıvel solu¸c˜ao
para o problema da dificuldade de aprendizagem atrav´es de STBWs ´e permitir que tais
tutoriais se adaptem ao ritmo e necessidade dos estudantes. Isso ´e poss´ıvel, atrav´es do
uso de STIs.
O Tutorial ICC ´e, desde j´a, um STBW que evolui aos poucos para um STI. Este
trabalho d´a mais um passo nessa dire¸c˜ao, a saber, fornecer exemplos que possam ser
utilizados em um STI.
1.2 Objetivos
O objetivo geral deste trabalho ´e desenvolver um conjunto de taxonomias hier´arquicas de
exemplos para o ensino de programa¸c˜ao para os alunos da disciplina Introdu¸c˜ao `a Ciˆencia
da Computa¸c˜ao (ICC).
Os objetivos espec´ıficos deste trabalho, por sua vez, s˜ao:
1. identificar conceitos e habilidades que estudantes de programa¸c˜ao podem ter difi-
culdade de apreender;
2. desenvolver exemplos, enunciados, programas e representa¸c˜oes gr´aficas da execu¸c˜ao
de programas que exercitem os conceitos e habilidades identificados.
3. desenvolver uma representa¸c˜ao gr´afica das taxonomias hier´arquicas, para auxiliar o
aluno a se localizar em uma determinada taxonomia.
1.3 Metodologia
Propusemos e implementamos uma s´erie de taxonomias de exemplos organizada hierarqui-
camente em n´ıveis de dificuldade. Essa taxonomia foi influenciada tamb´em por pesquisas
publicadas, mas em sua maior parte ´e a aplica¸c˜ao do conhecimento emp´ırico e longa
2
experiˆencia de professores de programa¸c˜ao da Universidade de Bras´ılia (UnB). H´a uma
taxonomia para cada cap´ıtulo atual do Tutorial ICC, exceto o primeiro e o ´ultimo (oitavo).
Para desenvolver uma taxonomia, identificamos os conceitos e habilidades que estu-
dantes de programa¸c˜ao podem ter dificuldade de apreender em um determinado cap´ıtulo.
Concebemos, ent˜ao, problemas que exercitem cada um dos conjuntos de conceitos pro-
postos.
Para cada um desses problemas, desenvolvemos vers˜oes simplificadas de modo a criar
´arvores de problemas em que cada problema exercita um subconjunto dos conjuntos de
conceitos. Escrevemos, ent˜ao, 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¸c˜oes para os enunciados, em Pascal. Criamos tamb´em scripts
que, aliados com uma applet em Java j´a desenvolvida, permitem representar graficamente
a execu¸c˜ao dos programas escritos.
Por fim, integramos os enunciados, os programas e os scripts gerados para cada
cap´ıtulo ao Tutorial ICC. Tamb´em desenvolvemos e implantamos uma representa¸c˜ao
gr´afica das taxonomias hier´arquicas, para auxiliar o aluno a se localizar em uma de-
terminada taxonomia.
1.4 Resultados esperados
Ao final deste trabalho, temos uma taxonomia de exemplos implementada para os cap´ıtulos
2, 3, 4, 5, 6 e 7 do Tutorial ICC. Essas taxonomias s˜ao um primeiro passo para trabalhos
futuros que envolvam a flexibiliza¸c˜ao e automatiza¸c˜ao da interface do Tutorial ICC em
prol de torn´a-lo cada vez mais dotado de inteligˆencia.
3
Cap´ıtulo 2
O Ensino de Programa¸c˜ao
Embora programa¸c˜ao seja uma das atividades fundamentais na Ciˆencia da Computa¸c˜ao,
muitos estudantes tˆem grande dificuldade para aprender a programar (Jenkins, 2003;
Gomes e Mendes, 2007). Desse modo, ´e de grande interesse conseguir ferramentas educa-
cionais que auxiliem no processo de ensino-aprendizagem de programa¸c˜ao. Neste cap´ıtulo,
apresentaremos algumas das quest˜oes e dificuldades sobre ensinar a programar.
2.1 A dificuldade de ensinar a programar
Aprender e ensinar a programar s˜ao tarefas dif´ıceis. Grande n´umero de estudantes de
Computa¸c˜ao consideram muito dif´ıcil aprender programa¸c˜ao, mesmo em etapas avan¸cadas
do curso. Essa ´e uma situa¸c˜ao preocupante para o ensino de Computa¸c˜ao: programa¸c˜ao
´e um componente b´asico, ou mesmo uma ferramenta indispens´avel para se compreender
v´arias ´areas da disciplina. O ensino de programa¸c˜ao ´e objeto de diversos estudos que
buscam reduzir essa dificuldade, mas h´a poucas evidˆencias de que se tenham conseguido
avan¸cos significativos na aprendizagem (Jenkins, 2003).
V´arias raz˜oes foram apontadas para essas dificuldades. Por vezes, afirma-se que o
problema n˜ao ´e que aprender a programar seja dif´ıcil em si, mas sim que certos alunos
tˆem dificuldades, por n˜ao terem algumas habilidades necess´arias para programar bem
desenvolvidas, como habilidades matem´aticas ou para solu¸c˜ao de problemas. Entretanto,
Jenkins (2003) considera os resultados de pesquisas nesse sentido inconclusivos: enquanto
alguns trabalhos de fato mostram alguma correla¸c˜ao entre o dom´ınio de certas habilida-
des e a maior ou menor facilidade em aprender a programar (por exemplo, Byrne e Lyons
(2001)), outros estudos indicam que n˜ao h´a tal correla¸c˜ao (Jenkins e Davy, 1999). De
qualquer forma, essas habilidades n˜ao s˜ao necessariamente inatas, podendo ser desen-
volvidas; Gomes e Mendes (2007), por exemplo, consideram como problema a falta de
treinamento pr´evio do estudante em matem´atica e l´ogica, n˜ao uma dificuldade inata; de
fato, a escolha do estudante por um curso de Ciˆencia da Computa¸c˜ao ou correlato ´e um
ind´ıcio de que ele j´a tem consider´avel interesse na ´area de ciˆencias matem´aticas1
.
1
Temos constatado empiricamente que alguns estudantes escolhem o curso com uma vis˜ao preliminar
errˆonea da Computa¸c˜ao, e esses mesmos estudantes tˆem s´erias dificuldades em aprender a programar.
4
2.2 Fatores cognitivos
V´arios fatores cognitivos s˜ao relevantes para a maior ou menor facilidade na aprendizagem
de programa¸c˜ao. O primeiro fator s˜ao os estilos de aprendizagem. Estudantes aprendem
de maneiras diferentes: estudando sozinho ou em grupo, estudando em detalhes ou su-
perficialmente a disciplina. V´arios 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˜ao ser adequado para
um determinado ponto do estudo de programa¸c˜ao (Jenkins, 2003).
Como exemplo, consideremos os estilos de aprendizagem classificados como aborda-
gem aprofundada e abordagem superficial. A abordagem aprofundada ´e aquela na qual o
estudante busca pela compreens˜ao do t´opico, enquanto a abordagem superficial ´e aquela
na qual o estudo resume-se a pouco mais que memorizar as informa¸c˜oes. Programa¸c˜ao
´e uma atividade que exige o uso de ambas as abordagens: enquanto ´e necess´ario um
conhecimento m´ınimo, mesmo que vago, das regras l´exicas e sint´aticas da linguagem de
programa¸c˜ao utilizada, uma compreens˜ao profunda da semˆantica e dos conceitos abstra-
tos sobre programa¸c˜ao ´e exigido. No caso, n˜ao s´o ´e necess´ario que se utilize ambas as
abordagens em v´arios pontos da disciplina; ´e exigido que ambas as abordagens sejam
utilizadas ao mesmo tempo (Jenkins, 2003).
Os estilos de aprendizagem podem tamb´em variar de acordo com os tipos psicol´ogicos.
Alunos tˆem estilos de aprendizagem diferentes, que influenciam em seus m´etodos e pre-
ferˆencias de estudo. Alguns preferem pensar em termos mais abstratos, enquanto outros
podem preferir conceitos mais concretos e aplicados; alguns alunos preferem m´etodos
sistem´aticos de estudos, enquanto outros “deixam-se levar” pelo tema (Keirsey, 1998).
Ocorre que programa¸c˜ao exige tanto racioc´ınio abstrato quanto concreto; por vezes, exige
m´etodo r´ıgido e, noutras, experimenta¸c˜ao avulsa. Inclusive, h´a problemas que s˜ao mais
facilmente resolv´ıveis de uma forma que de outra. O estudante, por´em, usualmente es-
colhe explorar o tema da programa¸c˜ao apenas atrav´es da maneira que mais lhe agrada,
e tenta utilizar sua abordagem preferida sem considerar o car´ater do problema. Uma
pesquisa preliminar focando no estilo de aprendizagem do aluno, com poss´ıvel aplica¸c˜ao
futura no Tutorial ICC, foi desenvolvido por Chaves J´unior e Bastos (2008). Outras pes-
quisas poder˜ao abordar as pr´aticas necess´arias na aprendizagem de programa¸c˜ao, dando
um primeiro passo no trabalho sobre as diversas maneiras de estudar de cada tipo de
estilo de aprendizagem.
Outro fator importante — e problem´atico — no estudo de programa¸c˜ao ´e a motiva¸c˜ao.
Enquanto v´arios alunos aprendem a programar por vontade pr´opria e interesse pessoal
— em outras palavras, por motiva¸c˜ao intr´ınseca —, outros estudantes o fazem em busca
de uma carreira financeiramente rent´avel ou apenas para obter diploma em um curso
superior qualquer — ou seja, por motiva¸c˜ao extr´ınseca. Previsivelmente, alunos com mo-
tiva¸c˜oes intr´ınsecas apresentam um desempenho melhor em aprendizagem que alunos com
motiva¸c˜oes extr´ınsecas. Entretanto, a motiva¸c˜ao extr´ınseca n˜ao ´e, de maneira alguma,
Entretanto, tais estudantes s˜ao uma minoria e, afinal, v´arios dos estudantes que demonstram grande
habilidade em diversas outras ´areas da Computa¸c˜ao tamb´em tˆem dificuldades espec´ıficas em solucionar
problemas com c´odigo.
5
um empecilho para a aprendizagem, de modo que estudantes com tais interesses n˜ao s˜ao
“casos perdidos” (Jenkins, 2003).
Al´em disso, existem diversos “ bugs” conceituais que afetam a maneira como pro-
gramadores iniciantes programam e lˆeem programas. Por exemplo, ´e usual que o aluno
imagine que o programa ´e, em certo sentido, executado de uma vez s´o — o que ´e usu-
almente chamado de “bug” de paralelismo; tamb´em ocorre de programadores iniciantes
lerem instru¸c˜oes de c´odigo subentendendo inten¸c˜oes e n˜ao apenas seu significado (“bug”
de intencionalidade) ou de escreverem c´odigo que em seu racioc´ınio produza o efeito de-
sejado, mas que possui menos semˆantica que a necess´aria (“bug” de egocentrismo) (Pea,
1986). A cataloga¸c˜ao e estudo desses “bugs” j´a vem de longo tempo e inclui artigos como
Pea (1986) e Spohrer e Soloway (1986).
2.3 Fatores pedag´ogicos
Os professores de programa¸c˜ao tˆem um grande desafio: ensinar uma disciplina extrema-
mente jovem. O corpo de conhecimento sobre o processo did´atico do ensino de Com-
puta¸c˜ao ´e ainda pequeno quando comparado a outras disciplinas mais bem estabelecidas,
como ´Algebra e C´alculo. Isso ´e especialmente verdadeiro quando se trata de programa¸c˜ao,
uma atividade cheia de idiossincrasias e peculiaridades que a colocam no meio do caminho
entre a ´Algebra e alguma engenharia.
Entretanto, isso n˜ao implica que n˜ao temos base alguma para come¸car a desenvolver e
propor um modelo de ensino de programa¸c˜ao. J´a h´a pesquisa na busca de uma metodo-
logia confi´avel de ensino de programa¸c˜ao, e muitas das raz˜oes das dificuldades do ensino
de programa¸c˜ao j´a s˜ao conhecidas, ao menos superficialmente.
Por exemplo, v´arios cursos de programa¸c˜ao tendem a dar ˆenfase no ensino da lingua-
gem de programa¸c˜ao, e n˜ao na programa¸c˜ao em si (Gomes e Mendes, 2007), ao ponto de
v´arias institui¸c˜oes terem uma s´erie de cursos de “Programa¸c˜ao”, cada um ensinando uma
linguagem diferente. A escolha da linguagem de programa¸c˜ao que suportar´a os exemplos
de um curso comumente ´e guiada pela linguagem mais popular na ind´ustria no momento,
ao inv´es de considerar fatores did´aticos (Jenkins, 2003). Isso pode ser problem´atico, dado
que a linguagem de programa¸c˜ao ´e uma nota¸c˜ao e, portanto, pode fazer uma dr´astica dife-
ren¸ca na transmiss˜ao de conceitos (Iverson, 1980). Por isso linguagens de programa¸c˜ao de
car´ater did´atico, como Pascal (Wirth, 1972) e Logo (Pea, 1983), e ambientes que reduzam
as dificuldades do aluno s˜ao didaticamente importantes (Jenkins, 2003)(Gomes e Mendes,
2007).
O contexto em que o estudante acaba de adentrar tamb´em dificulta a aprendizagem.
´E usual que o ensino de programa¸c˜ao seja um dos primeiros cursos que um aluno de
Computa¸c˜ao (ou alguma ´area relacionada ou dependente) tenha durante sua gradua¸c˜ao.
O aluno, inexperiente, ao lidar com t˜ao complexa disciplina, tem ainda mais dificuldades
de aprender. Muitos autores consideram que o posicionamento de ensino de programa¸c˜ao
na grade curricular ´e excessivamente adiantado (Jenkins, 2003)(Gomes e Mendes, 2007)2
.
2
Nossa experiˆencia pessoal nos d´a uma vis˜ao diversa: n´os, quando estudantes, ouvimos muitos cole-
gas de turma reclamarem do quanto se demorava para aprender a programar e para chegar aos cursos
6
Por fim, podemos citar tamb´em a grande heterogeneidade de estudantes nas turmas
de programa¸c˜ao. Como o curso de programa¸c˜ao ´e um dos primeiros a serem ministrados,
h´a em suas turmas estudantes dos mais diversos backgrounds e perfis. Como tais cursos
n˜ao raramente ainda seguem uma estrutura bastante tradicional de aula expositiva, seus
professores n˜ao disp˜oem de tempo e energias suficientes para atender pessoalmente cada
um dos alunos. De fato, a falta de personaliza¸c˜ao nos cursos e o desgaste do professor
s˜ao apontadas por v´arios pesquisadores como causas significativas para mau desempenho
de estudantes de programa¸c˜ao (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´arios dos problemas que afligem os estudantes e professores de pro-
grama¸c˜ao. A proposta do tutorial, a longo prazo, ´e tornar-se um sistema tutorial dotado
de inteligˆencia, objetivo para o qual esse trabalho oferece mais um pequeno passo. Para
compreender como um sistema tutorial dotado de inteligˆencia pode auxiliar o ensino de
programa¸c˜ao, precisamos ver, antes o que s˜ao sistemas tutoriais inteligentes.
mais avan¸cados e “pr´aticos”. Entretanto, esta ´e apenas uma evidˆencia aned´otica: embora realmente te-
nhamos conhecidos alguns estudantes que reclamassem dessa demora (especialmente em vers˜oes antigas
do curr´ıculo dos nossos cursos), n˜ao sabemos quantos realmente reclamavam. Eis uma ´area digna de
pesquisa.
7
Cap´ıtulo 3
Sistemas Tutoriais Inteligentes
Sistemas tutoriais inteligentes (do inglˆes intelligent tutoring systems) s˜ao sistemas de
aprendizagem auxiliados por computador (SAAC) que se adaptam, sem necessidade de
cont´ınua interven¸c˜ao humana, `as necessidades e ao desempenho do aluno (Self, 1999).
Esses sistemas s˜ao um caso especial dos sistemas de instru¸c˜ao auxiliada por computador
(do inglˆes computer aided instruction) que almejam utilizar tecnologias inform´aticas 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ˆencias e conhecimentos (Murray, 1999).
O Tutorial ICC evolui para adquirir, se n˜ao o car´ater de um sistema tutorial inteligente
em todos os aspectos, ao menos algumas caracter´ısticas e fun¸c˜oes de sistemas tutoriais
inteligentes, tornando-se um sistema tutorial dotado de inteligˆencia. O corrente trabalho
´e mais um passo nessa dire¸c˜ao.
3.1 Arquitetura de um sistema tutorial inteligente
Um dos aspectos mais importantes de qualquer sistema computacional — inclusive de sis-
temas tutoriais inteligentes — ´e a sua arquitetura. V´arias arquiteturas j´a foram propostas
para sistemas tutoriais inteligentes mas, tradicionalmente, divide-se um sistema tutorial
inteligente em trˆes m´odulos: o m´odulo especialista, o m´odulo do estudante e o m´odulo
do tutor (Self, 1999). Ademais, a maioria das demais arquiteturas s˜ao apenas varia¸c˜oes
isoladas desse modelo.
O m´odulo especialista ´e respons´avel por modelar o conhecimento a ser transmitido.
Trˆes abordagens s˜ao poss´ıveis nesse caso: a cria¸c˜ao de um m´odulo “caixa preta”, um
m´odulo de “caixa de vidro” ou um m´odulo de solu¸c˜ao de problemas. Um m´odulo “caixa
preta” n˜ao codifica a inteligˆencia humana, mas s´o o conhecimento. Desse modo, esse
m´odulo apenas pode fazer compara¸c˜oes entre o conhecimento do estudante e a repre-
senta¸c˜ao do conhecimento interna ao sistema. Esse modelo ´e insuficiente para o ensino,
de modo que sistemas tutoriais inteligentes que fazem uso de tais m´odulos geralmente
incrementam seu desempenho com os chamados m´odulos de solu¸c˜ao de problemas, que
decidem o comportamento do sistema para cada comportamento observado no m´odulo
8
do estudante, com especial ˆenfase em enganos comuns. Alternativas aos m´odulos “caixa
preta”, os m´odulos “caixa de vidro” s˜ao usualmente baseados em formalismos dos co-
nhecimentos a serem apresentados. Seu desenvolvimento no geral depente do aux´ılio de
engenheiros de conhecimento, que ap´os entrevistar especialistas, cria uma representa¸c˜ao
computacinal do conhecimento a ser transmitido (Burns e Capps, 1988).
O m´odulo 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´odulo, Burns e Capps
(1988) chama a aten¸c˜ao para trˆes dimens˜oes a serem levadas em conta. Primeiro, ´e
necess´ario saber que informa¸c˜oes temos sobre o comportamento do usu´ario do sistema. A
maioria dos sistemas tutoriais inteligentes s´o tem acesso `as respostas dadas pelo aluno `as
quest˜oes propostas.1
Segundo, conv´em distinguir qual a categoria do conhecimento que se
tenta transmitir; isto ´e, ´e preciso ter em mente se queremos transmitir um conhecimento
procedural (conhecimento sobre como executar uma tarefa), declarativo (conhecimento
sobre fatos em geral, sem necess´aria aplica¸c˜ao) ou mesmo qualitativo (habilidade em
fazer julgamentos e tirar conclus˜oes de modelos mentais). Por fim, Burns e Capps (1988)
chama a aten¸c˜ao para a necessidade de se distinguir diferen¸cas entre o estudante e o
m´odulo especialista. Tradicionalmente, usa-se a representa¸c˜ao do conhecimento do pr´oprio
m´odulo especialista na implementa¸c˜ao do m´odulo do estudante; sistemas mais avan¸cados,
por´em, tamb´em fornecem uma biblioteca de erros que permitem que o sistema reaja de
maneira mais adequada a erros previstos (Burns e Capps, 1988).
O m´odulo do tutor ´e o m´odulo respons´avel pela integra¸c˜ao entre o m´odulo espe-
cialista e o m´odulo do estudante. Ele ´e o real respons´avel por escolher o fluxo de
apresenta¸c˜ao do conte´udo, assim como por dar sugest˜oes e apresentar corre¸c˜oes de ma-
neira ass´ıncrona. Existem diversas teorias instrucionais utilizadas na constru¸c˜ao de tais
m´odulos (Burns e Capps, 1988).
A esses componentes, Burns e Capps (1988) acrescenta o ambiente de instru¸c˜ao e a
interface homem-m´aquina. O ambiente de instru¸c˜ao ´e o conjunto de ferramentas utilizadas
no processo de transmiss˜ao de conhecimento. Exemplos dessas ferramentas s˜ao jogos,
gr´aficos, anima¸c˜oes etc. Elas comp˜oem um micromundo no qual o aluno explora as
possibilidades do sistema tutorial inteligente. A interface homem-m´aquina ´e o conjunto
de tecnologias utilizado para a comunica¸c˜ao entre o computador e o aluno. O Tutorial
ICC, por exemplo, utiliza a interface Web atrav´es de uma interface de usu´ario gr´afica.
Beck et al. (1996) prop˜oem uma divis˜ao levemente diferente. O conhecimento do
dom´ınio estaria separado do m´odulo especialista: enquanto o conhecimento do dom´ınio se-
ria uma base de dados de conhecimento a ser utilizado, o m´odulo especialista representaria
o conhecimento de uma pessoa especialmente h´abil no tema estudado. O m´odulo espe-
cialista seria, ent˜ao, respons´avel por comparar a solu¸c˜ao dada pelo aluno com a solu¸c˜ao
do especialista. Al´em disso, Beck et al. (1996) apresentam tanto o ambiente de instru¸c˜ao
1
Entretanto, v´arios sistemas tentam captar e processar informa¸c˜oes sobre outros aspectos do compor-
tamento do aluno como, por exemplo, seu estado emocional. Esses sistemas s˜ao denominados sistemas
tutoriais inteligentes afetivos e podem tanto escolher a ordem de apresenta¸c˜ao do conte´udo quanto enviar
mensagens de motiva¸c˜ao ou apoio ao estudante (Nkambou, 2006). Infelizmente, como Murray (1999)
ressalta, sistemas baseados em hiperm´ıdia e Web, como o Tutorial ICC, n˜ao disp˜oem de tais facilidades,
ao menos n˜ao de maneira trivial.
9
quanto a interface homem-m´aquina como um componente s´o: o modelo de comunica¸c˜ao,
que intermedeia a intera¸c˜ao entre a m´aquina e o aluno. A figura 3.1 apresenta as intera¸c˜oes
entre os m´odulos da arquitetura proposta por Beck et al. (1996).
Modelo de estudante M´odulo Pedag´ogico Modelo de Comunica¸c˜ao
Conhecimento de Dom´ınio Modelo de Especialista
T T
&
&
&
&b



}
E
' E
Figura 3.1: Componentes de um STI, segundo Beck et al. (1996)
Uma alternativa com altera¸c˜oes mais significativas ´e a de Gugerty (1997). Gugerty
(1997) prop˜oe a cria¸c˜ao de sistemas tutoriais inteligentes sem m´odulos de estudante.
Tais sistemas seriam, ent˜ao, ferramentas computacionais de aux´ılio a professores. Esses
sistemas s˜ao chamados sistemas tutoriais inteligentes n˜ao-diagn´osticos, em oposi¸c˜ao aos
sistemas tutoriais inteligentes tradicionais que fazem um diagn´ostico do estado afetivo
e/ou cognitivo do estudante. De fato, a experiˆencia tem mostrado que sistemas tutoriais
inteligentes s˜ao caros e dif´ıceis de se desenvolver, embora bastante efetivos (Murray, 1999),
e o m´odulo de estudante ´e a parte mais dif´ıcil de se desenvolver (Burns e Capps, 1988).
Ademais, o estado atual da tecnologia inform´atica ainda n˜ao oferece uma largura de
banda de informa¸c˜oes sobre o usu´ario suficiente para uma avalia¸c˜ao significativa do estado
cognitivo e afetivo do aluno e, no final das contas, os ganhos pedag´ogicos do uso de sistemas
tutoriais inteligentes n˜ao-diagn´osticos s˜ao consider´aveis (Gugerty, 1997). Embora esse
tipo de sistema tutorial fuja do modelo tradicional, ele ´e bastante promissor e pode servir
como referˆencia em v´arios aspectos para o nosso sistema.
Como se percebe, h´a v´arias divergˆencias sobre como organizar a arquitetura de um
sistema tutorial inteligente. Entretanto, essas s˜ao, quase sempre, divergˆencias superficiais:
todos os modelos de sistemas tutoriais inteligentes, de certo modo, derivam da arquitetura
seminal apresentada por Self (1974).
3.2 Categorias de sistemas tutoriais inteligentes
Nosso primeiro passo ser´a tentar situar o Tutorial ICC no estado da arte dos sistemas
tutoriais inteligentes. O que ´e interessante que o Tutorial ICC tenha? O que outros
sistemas nos ensinam?
Uma primeira diferencia¸c˜ao a ser feita ´e entre os sistemas tutoriais inteligentes shell e
tool. Um shell ´e um framework para desenvolvimento de sistemas tutoriais inteligentes; ge-
ralmente, ´e mais voltado para programadores de computadores, que podem customiz´a-los,
e s˜ao mais gen´ericos. J´a tools s˜ao mais voltados para o p´ublico em geral, fornecendo inter-
faces que permitem n˜ao programadores registrarem o conhecimento no sistema (Murray,
1999). Nessa categoriza¸c˜ao, Tutorial ICC ´e claramente um tool.
10
Murray (1999) divide os sistemas tutoriais inteligentes em sete categorias n˜ao ortogo-
nais em fun¸c˜ao dos seus dom´ınios de atua¸c˜ao e ´areas em que seu uso ´e mais adequado.
As categorias, sumarizadas na tabela 3.1, s˜ao as seguintes:
1. Planejamento e sequenciamento de curr´ıculos
Os sistemas tutoriais inteligentes de planejamento e sequenciamento de curr´ıculos
definem unidades de instru¸c˜ao cujo fluxo de apresenta¸c˜ao ´e decidido pelo sistema
de acordo com as necessidades do aluno. Para o estudante, esses sistemas s˜ao muito
semelhantes a sistemas de gerenciamento de cursos (como o Moodle); entretanto, os
sistemas de planejamento e sequenciamento de curr´ıculos podem seguir quaisquer
ordens mais adequadas de apresenta¸c˜ao de conte´udos. A ordem de apresenta¸c˜ao
de conte´udos deve, por´em, ser escolhida pelo sistema de forma automatizada, sem
interferˆencia humana, assim como deve se adequar especificamente ao desempenho
de cada aluno.
2. Estrat´egias tutoriais
Diz-se que um sistema tutorial inteligente tem foco em estrat´egias tutoriais (ou
estrat´egias de ensino) quando tem a capacidade de decidir quais as melhores es-
trat´egias de apresenta¸c˜ao de conte´udo para o aluno. Esses sistemas s˜ao semelhantes
aos sistemas de planejamento e sequenciamento de curr´ıculos, mas agem em um
n´ıvel de abstra¸c˜ao mais baixo. Enquanto os sistemas de planejamento e sequencia-
mento de curr´ıculos tomam decis˜oes sobre quais componentes do fluxo da mat´eria
v˜ao apresentar; sistemas de estrat´egias tutoriais escolhem o melhor momento para
apresentar ferramentas de ensino, e n˜ao s´o conte´udo. Por exemplo, um sistema que
decida explicar mais detalhadamente um determinado t´opico do ensino e escolha
quando apresentar uma determinada explica¸c˜ao ou um exemplo s˜ao sistemas de
estrat´egias tutoriais.
3. Simula¸c˜ao de dispositivos e treinamento em equipamentos
V´arios sistemas tutoriais inteligentes buscam simular certos dispositivos para o estu-
dante. A intera¸c˜ao entre o estudante e o sistema mimetiza o uso de um determinado
dispositivo ou equipamento. Desse modo, esses sistemas, categorizados como siste-
mas de simula¸c˜ao de dispositivos ou sistemas de treinamento em equipamentos, per-
mitem que o estudante possa compreender o funcionamento do dispositivo simulado
sem ter de lidar com o dispositivo em si. Isso ´e especialmente ´util quando se quer
ensinar o uso de equipamentos caros, fr´ageis, perigosos ou inacess´ıveis. Tais sistemas
tamb´em s˜ao interessantes pois permitem que se dˆe uma resposta mais did´atica ao
estudante, ao inv´es do erro real gerado pelo dispositivo.
4. Sistemas especialistas e tutores cognitivos
´E bastante comum o uso de simula¸c˜oes cognitivas em sistemas tutoriais inteligentes.
Sistemas tutoriais inteligentes que usam esse m´etodo possuem um mecanismo de
simula¸c˜ao de cogni¸c˜ao que, baseado em regras, tentam criar um modelo de cogni¸c˜ao
do atual est´agio de conhecimento do aluno. Esse modelo ´e utilizado pelo m´odulo
11
especialista para definir o melhor fluxo de ensino. Esses sistemas s˜ao chamados
de sistemas tutores cognitivos, ou sistemas de modelagem de cogni¸c˜ao. Murray
(1999) p˜oe na mesma categoria tanto esses sistemas quanto os sistemas que fazem
uso de sistemas especialistas para a resolu¸c˜ao de problemas. A diferen¸ca ´e que
sistemas especialistas s˜ao utilizados no m´odulo especialista para encontrar a solu¸c˜ao
de problemas did´aticos e n˜ao para modelar o estado cognitivo do estudante.
5. M´ultiplos 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´udo, diz-se que o sistema possui m´ultiplos tipos de conhecimentos. Por exem-
plo, um sistema com m´ultiplos tipos de conhecimento pode dividir o conhecimento
a ser transmitido em trˆes categorias: fatos, conceitos e procedimentos. Cada com-
ponente da habilidade maior a ser ensinada contaria com um m´etodo espec´ıfico de
ensino, dependendo de qual das trˆes categorias acima melhor modela o componente.
Esses sistemas tendem a ser mais f´aceis de configurar, mas s˜ao menos flex´ıveis.
6. Sistemas de prop´osito espec´ıfico
Embora sistemas tutoriais inteligentes gen´ericos tenham atra´ıdo bastante interesse,
tamb´em pode ser interessante projetar sistemas tutoriais inteligentes para ´areas es-
pec´ıficas. N˜ao raramente, sistemas gen´ericos surgem do desenvolvimento de um
sistema espec´ıfico que vai gradativamente se tornando parametriz´avel e reutiliz´avel.
Por um lado, esses sistemas de prop´osito espec´ıfico atingem um p´ublico-alvo bem
restrito; por outro lado, podem utilizar ferramentas did´aticas espec´ıficas mais po-
derosas.
7. Hiperm´ıdia adaptativa/inteligente
Com a crescente sofistica¸c˜ao 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ˆem se tornado predominantes nessa ´area de pesquisa.
Esses sistemas permitem a apresenta¸c˜ao, ordena¸c˜ao, filtragem etc. de links em
fun¸c˜ao de v´arios aspectos da disciplina ou do desempenho do aluno, como fluxo
de apresenta¸c˜ao, dificuldade, adequa¸c˜ao de pr´e-requisitos etc. Comumente, tais
sistemas s˜ao sistemas de planejamento e sequenciamento de curr´ıculo, ou sistemas
de estrat´egias tutoriais com uma interface baseada em hiperm´ıdia.
Embora essa classifica¸c˜ao mais pare¸ca a “enciclop´edia chinesa” de Jorge Luis Bor-
ges (Foucault, 2002) que uma taxonomia tradicional, ela ´e muito ´util. O pr´oprio 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´arias dessas ca-
tegorias. Nosso objetivo inicial ´e, a princ´ıpio, torn´a-lo um sistema de planejamento e
sequenciamento de curr´ıculos, ou, mais provavelmente, um sistema de estrat´egias tuto-
riais; naturalmente, podemos torn´a-lo ambos. Do mesmo modo, j´a hoje o Tutorial ICC
12
Categoria Vantagens Desvantagens Varia¸c˜oes
Planejamento
e sequenci-
amento de
curr´ıculos
Executar regras para
sequenciamento de
m´odulos e programas
Pouca fidelidade ao
modelo de estudante;
representa¸c˜ao superfi-
cial de habilidades
As regras podem ser
fixas ou alter´aveis pelo
autor
Estrat´egias
tutoriais
Estrat´egias tutoriais
vari´aveis dentro do
m´odulo; conjunto so-
fisticado de primitivas
e m´ultiplas estrat´egias
tutoriais
Pouca fidelidade ao
modelo de estudante;
representa¸c˜ao superfi-
cial de habilidades
M´etodo de estrat´egia
de representa¸c˜ao,
fonte de expertise
instrucional
Simula¸c˜ao de
dispositivos
e treina-
mento em
equipamentos
Tutoramento de iden-
tifica¸c˜ao de compo-
nentes, opera¸c˜ao e re-
solu¸c˜ao de problemas;
habilidades procedu-
rais
Estrat´egias instrutivas
limitadas; modelagem
de estudante limitada
Fidelidade da si-
tua¸c˜ao, facilidade
de composi¸c˜ao de
tutorial
Sistemas
especialistas
e tutores
cognitivos
Modelo do dom´ınio
de especializa¸c˜ao mais
profundo e execut´avel;
facilidade de inclus˜ao
de erros e comporta-
mento de novato
Dificuldade de cons-
tru¸c˜ao; limita¸c˜ao a ha-
bilidades procedurais
ou de solu¸c˜ao de pro-
blemas; estrat´egias de
instru¸c˜ao limitadas
Modelos de habilidade
baseados em cogni¸c˜ao
ou desempenho
M´ultiplos
tipos de
conhecimento
Representa¸c˜ao clara
e m´etodo instrutivos
pr´e-definidos para
fatos, conceitos e
procedimentos
Limitado a fatos, con-
ceitos e procedimentos
simples; estrat´egias
tutoriais pr´e-definidas
Inclus˜ao de sequenci-
amento curricular in-
teligente; varia¸c˜ao dos
tipos de conhecimento
e tarefas suportados
Sistemas de
prop´osito
espec´ıfico
Modelos de sistemas
provˆeem uma grande
ajuda na composi¸c˜ao
do conte´udo; um
projeto ou princ´ıpio
pedag´ogico espec´ıfico
pode ser enfatizado
Ferramentas limitadas
ao tipo de tutor que
suportam; inflexibili-
dade na representa¸c˜ao
e pedagogia
Grau de inflexibili-
dade
Hiperm´ıdia
adaptati-
va/inteligente
Acess´ıvel pela Web;
uniformidade de in-
terface de usu´ario;
sele¸c˜ao adaptativa e
anota¸c˜ao de hiper-
liga¸c˜ao
Intera¸c˜ao limitada;
largura de banda de
resposta de modelo de
estudante limitada
Foco em micro ou ma-
crovis˜ao; grau de inte-
ratividade.
Tabela 3.1: Categorias de STIs, segundo Murray (1999)
13
fornece simula¸c˜oes de um computador, tornando-o um potencial sistema de simula¸c˜ao
de dispositivos. Como programa¸c˜ao exige o conhecimento de uma s´erie de fatos, concei-
tos e habilidades, ´e tamb´em bem prov´avel que o Tutorial ICC se torne um sistema de
m´ultiplos conhecimentos. Como, afinal, o Tutorial ICC ´e um sistema Web, ele ´e, desde
j´a, 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´eias para nos auxiliar no nosso projeto.
3.3 Vantagem dos sistemas tutoriais inteligentes
Os sistemas de aprendizagem auxiliada por computador (SAAC) fornecem uma s´erie de
vantagens aos professores e estudantes de programa¸c˜ao. Por exemplo, dado o aumento
na demanda por cursos focados em Tecnologia da Informa¸c˜ao, o n´umero de aluno nas
turmas de disciplinas de programa¸c˜ao tende a crescer bastante, como comentamos no
cap´ıtulo 1; SAACs permitem que as partes mais f´aceis de assimilar do conte´udo dessas
disciplinas sejam ministradas em massa para os alunos, permitindo que o professor se
desgaste menos e foque mais em ajudar os alunos com mais dificuldades. De modo an´alogo,
estes sistemas viabilizam cursos de educa¸c˜ao a distˆancia (EaD). Tais sistemas tamb´em
permitem que o aluno possa estudar em seu pr´oprio ritmo, algo que pode ser bastante
positivo para a aprendizagem, conforme comentado na se¸c˜ao 2.3. O Tutorial ICC, sobre
o qual trabalhamos, ´e um exemplo sistema de aprendizagem auxiliada por computador
(SAAC).
Entretanto, SAACs tˆem desvantagens. Uma destas desvantagens ´e a despersonaliza¸c˜ao
do ensino. Mesmo cursos tradicionais de programa¸c˜ao n˜ao alcan¸cam o ideal de cursos
personalizados, com foco nas dificuldades dos alunos; SAACs tradicionais tendem a ser
ainda mais problem´aticos. De modo an´alogo, estes sistemas n˜ao se adaptam ao ritmo de
aprendizagem e estilo de estudo dos estudantes.
T´ecnicas de desenvolvimento de STIs podem ser utilizadas em SAACs para tentar su-
perar essas desvantagens. De fato, v´arios STIs se adaptam ao ritmo, estilo e personalidade
do aluno. A m´edio prazo, espera-se que o Tutorial ICC torne-se adapt´avel aos diversos
n´ıveis de dificuldade dos alunos.
3.4 O papel do trabalho corrente
Neste trabalho, nosso objetivo ´e prover ao Tutorial ICC uma s´erie de exemplos, orga-
nizados em taxonomias de exemplos hier´arquicas, que permitam que alunos em diversos
est´agios e ritmos de aprendizagem analisar cen´arios simples e complexos de acordo com
sua pr´opria capacidade. Esses cen´arios devem conter um enunciado, uma solu¸c˜ao em
c´odigo-fonte Pascal e um script de execu¸c˜ao de “tira-teima”, que representa graficamente
a execu¸c˜ao do programa, atrav´es de uma applet Java. Tamb´em faz parte do trabalho uma
representa¸c˜ao da posi¸c˜ao do aluno na taxonomia.
A maneira como essas tarefas foram desenvolvidas ´e apresentadas no cap´ıtulo 4.
14
Cap´ıtulo 4
Taxonomias de Exemplos
Afora os exemplos desenvolvidos e integrados ao Tutorial ICC, um dos principais resulta-
dos deste trabalho ´e o m´etodo de desenvolvimento de uma forma de estruturar problemas
que denominamos taxonomias hier´arquicas de exemplos. O m´etodo envolve uma s´erie de
passos, seus pr´oprios termos e algumas recomenda¸c˜oes. Abaixo, seguem estes resultados.
4.1 Taxonomia hier´arquica de exemplos
Uma taxonomia ´e, literalmente, a ciˆencia ou t´ecnica de classifica¸c˜ao (Houaiss et al., 2001,
pp. 2680—2681). No nosso trabalho, uma taxonomia de exemplos ´e uma classifica¸c˜ao
de um conjunto de exemplos; por extens˜ao, uma taxonomia de exemplos ´e tamb´em um
conjunto de exemplos organizados segundo uma determinada classifica¸c˜ao. Por sua vez,
uma taxonomia hier´arquica de exemplos ´e uma taxonomia na qual os exemplos s˜ao orga-
nizados de forma estruturada, como ´arvores. Tamb´em dizemos, neste trabalho, que uma
taxonomia hier´arquica ´e uma ´arvore de exemplos, de modo que ´e poss´ıvel que nos refi-
ramos a alguma propriedade de ´arvores, mas se referindo a uma taxonomia hier´arquica.
Como trataremos apenas de taxonomias hier´arquicas de exemplos, toda vez que usarmos
o termo “taxonomia” o significado ser´a “taxonomia de exemplos hier´arquica”.
Cada taxonomia exemplifica o uso de um conjunto de caracter´ısticas remov´ıveis. Uma
caracter´ıstica remov´ıvel ´e um conceito, t´ecnica ou padr˜ao que o estudante deve aprender.
A raiz da ´arvore da taxonomia deve utilizar todas as caracter´ısticas remov´ıveis; seus
n´os diretamente subordinados devem explorar subconjuntos diferentes das taxonomias
da raiz, e os filhos desses n´os apresentar˜ao subconjuntos dos subconjuntos que seus pais
apresentam.
Na pr´atica, n´os utilizamos taxonomias com duas ou trˆes caracter´ısticas remov´ıveis.
Se a taxonomia tiver duas caracter´ısticas remov´ıveis, os n´os filhos da raiz dever˜ao ter,
cada um, uma caracter´ıstica. Parece natural que cada um desses n´os tenha ele mesmo
um n´o filho sem nenhuma caracter´ıstica; entretanto, n˜ao seria muito did´atico fazer o
estudante descer mais um n´ıvel nos exemplos para observar um exemplo que sequer apre-
senta uma das caracter´ısticas da ´arvore. Deste modo, o n´o que n˜ao cont´em nenhuma
15
das caracter´ısticas remov´ıveis torna-se filho do n´o principal. A figura 4.1 apresenta uma
representa¸c˜ao gr´afica dessa ´arvore. O travess˜ao ´e o r´otulo do n´o sem caracter´ısticas.


C1, C2


—












C1


C2










Figura 4.1: Representa¸c˜ao de taxonomia com duas caracter´ısticas remov´ıveis
Se a taxonomia tiver trˆes caracter´ısticas remov´ıveis, o exemplo raiz deve usar as trˆes. A
raiz teria, usualmente, trˆes n´os filhos, cada um apresentando duas das trˆes caracter´ısticas
remov´ıveis. Esse n´o filho ´e, por sua vez, raiz de uma sub´arvore que tem a estrutura de uma
taxonomia de duas caracter´ısticas remov´ıveis. A figura 4.2 apresenta uma representa¸c˜ao
gr´afica dessa ´arvore. O travess˜ao ´e o r´otulo do n´o sem caracter´ısticas.


C1, C2, C3


C1, C2
D
D
D
D
D
D
D
D
D


C1, C3


C2, C3
l
l
l
l
l
l
l
l
l


—








C1


C2
v
v
v
v
v
vv


—








C1


C3
v
v
v
v
v
vv


—








C2


C3
v
v
v
v
v
vv
Figura 4.2: Representa¸c˜ao de taxonomia com trˆes caracter´ısticas remov´ıveis
Se uma taxonomia tem uma das estruturas apresentadas acima, dizemos que ´e uma
taxonomia totalmente preenchida. Embora tenhamos focado em gerar taxonomias total-
mente preenchidas, nem sempre ´e poss´ıvel ou interessante “for¸car” 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˜ao precisa ser apresentado. Isto ocorre co-
mumente com taxonomias de trˆes caracter´ısticas, e a ´arvore resultante possui a estrutura
representada na figura 4.3. A se¸c˜ao 5.2 apresenta uma taxonomia com esta estrutura.


C1, C2, C3


C1, C2
D
D
D
D
D
D
D
D
D


C1, C3


C2, C3
l
l
l
l
l
l
l
l
l


C1
¢
¢
¢
¢
¢
¢¢


C2
f
f
f
f
f
ff


C1
¢
¢
¢
¢
¢
¢¢


C3
f
f
f
f
f
ff


C2
¢
¢
¢
¢
¢
¢¢


C3
f
f
f
f
f
ff
Figura 4.3: Representa¸c˜ao de taxonomia sem n´o sem caracter´ısticas
Outro caso de ´arvore n˜ao totalmente preenchida ocorrem quando ao menos uma ca-
racter´ıstica remov´ıvel s´o pode ser apresentada se uma outra qualquer estiver presente.
Por exemplo, considere uma ´arvore de trˆes caracter´ısticas remov´ıveis C1, C2 e C3 tal que,
para C3 estar presente em um exemplo, ´e necess´ario que ou C1 ou C2 tamb´em estejam
presentes. N˜ao h´a exemplos que exercitem apenas C3. A estrutura da taxonomia ´e a apre-
sentada na figura 4.4, e a se¸c˜ao 5.4 apresenta uma taxonomia na qual esta configura¸c˜ao
ocorre.
Dizemos que essas caracter´ısticas remov´ıveis s˜ao caracter´ısticas n˜ao-ortogonais entre
si pois elas se influenciam; em contraposi¸c˜ao, caracter´ısticas remov´ıveis que podem estar
presentes em um exemplo independente das outras s˜ao chamadas de caracter´ısticas ortogo-
nais entre si. Se uma taxonomia ´e constru´ıda apenas a partir de caracter´ısticas ortogonais
— isto ´e, todas as caracter´ısticas que geram a taxonomia s˜ao ortogonais entre si —, ela
´e dita uma taxonomia ortogonal; caso contr´ario, ´e chamada de taxonomia n˜ao-ortogonal.
Em geral, nossa experiˆencia indicou que taxonomias n˜ao-ortogonais s˜ao mais complexas
de criar e, ao que tudo indica, menos claras, didaticamente falando. Enquanto ´e perfeita-
mente razo´avel construir taxonomias n˜ao totalmente preenchidas, construir taxonomias
n˜ao-ortogonais n˜ao ´e o ideal.
17
C1, C2, C3


C1, C2
D
D
D
D
D
D
D
D
D


C1, C3


C2, C3
l
l
l
l
l
l
l
l
l


C1
¢
¢
¢
¢
¢
¢¢


C2
f
f
f
f
f
ff


C1


C2
Figura 4.4: Representa¸c˜ao de uma taxonomia n˜ao-ortogonal
4.2 Enunciados e solu¸c˜oes
Dados os conceitos apresentados na se¸c˜ao 4.1, o processo para o desenvolvimento de ta-
xonomias de problemas pˆode ser facilmente definido. Primeiro, defin´ıamos conjuntos de
duas ou trˆes caracter´ısticas remov´ıveis — idealmente, conjunto de caracter´ısticas que
usualmente aparecem de fato pr´oximas em problemas reais e que fossem caracter´ısticas
ortogonais entre si. Para cada um desses conjuntos, elaboramos um enunciado que possi-
bilite apresentar todas as caracter´ısticas, assim como enunciados que permitam apresentar
apenas subconjuntos das caracter´ısticas, formando uma taxonomia hier´arquica. Para cada
um dos enunciados, elaboramos um pequeno programa que resolva o problema.
A elabora¸c˜ao de enunciados apresenta uma s´erie de quest˜oes. Por exemplo, qual ´e
o melhor estilo: enunciados que apresentem problemas da vida real, ou enunciados abs-
tratos? Conforme comentamos na se¸c˜ao 2.2, h´a estudantes que lidariam melhor com um
estilo, enquanto outros apreciariam mais o outro — e nem consideramos outros parˆametros
que variam em fun¸c˜ao do tipo de personalidade! Nossa abordagem foi experimentar enun-
ciados de ambos os estilos. Em breve, poderemos avaliar os resultados1
.
Outra quest˜ao foi: como exercitar bugs conceituais dos estudantes? Na se¸c˜ao 2.2
comentamos que h´a v´arios enganos que estudantes cometem recorrentemente. Esses en-
ganos podem servir de guia para os exemplos, mas ainda h´a o desafio de inseri-los em
enunciados. Do mesmo modo, h´a padr˜oes de programa¸c˜ao importantes e ´uteis que os
1
Um estilo que pode ser promissor s˜ao os enunciados baseados em abstra¸c˜oes com estado, especialmente
jogos, como o Jogo da Vida, Snake ou Tetris. De fato, em conversas e observa¸c˜oes aned´oticas com calouros,
notamos que esses problemas s˜ao especialmente apreciados.
18
estudantes devem conhecer, e deve haver enunciados que os apresentem. Em verdade,
bugs conceituais e padr˜oes importantes s˜ao boas caracter´ısticas remov´ıveis.
Tamb´em se questionou qual deve ser a rela¸c˜ao entre os enunciados de uma taxono-
mia. Os enunciados devem ser independentes ou relacionados? Nossa hip´otese ´e que os
enunciados devem ser relacionados, e os mais simples devem ser vers˜oes ou “passos” dos
enunciados mais completos. Isto, supomos, mant´em o estudante no contexto mental do
problema, facilitando sua compreens˜ao.
Uma vez definidos os enunciados, devemos desenvolver os programas que os soluci-
onam. A linguagem de programa¸c˜ao em que foram solucionados foi aquela j´a utilizada
no Tutorial ICC: Pascal. Pascal ´e uma boa escolha tamb´em porque ´e uma linguagem
did´atica, como explicado na se¸c˜ao 2.3.
Um desafio na cria¸c˜ao dos enunciados ´e: como criar um enunciado que “force” —
isto ´e, torne mais natural — o aluno a utilizar as caracter´ısticas que queremos? Depois
de criarmos algumas taxonomias, notamos que esta ´e uma quest˜ao secund´aria: embora
seja realmente interessante criar enunciados que levem intuitivamente `as caracter´ısticas
remov´ıveis escolhidas, s˜ao os desenvolvedores das taxonomias que escolhem como soluci-
onar˜ao os enunciados. Isto ´e interessante de se ter em mente porque, por vezes, alguns
enunciados tornam-se pouco intuitivos para for¸car a solu¸c˜ao de um problema em uma
determinada dire¸c˜ao. Este esfor¸co, por´em, n˜ao ´e necess´ario. A taxonomia apresentada na
se¸c˜ao 5.2 ´e um bom exemplo pr´atico disso.
Figura 4.5: Screenshot da applet Java executando um “tira-teima”
19
4.3 “Tira-teima” e roteiros
Um dos recursos mais not´aveis do Tutorial ICC s˜ao os “tira-teimas”: representa¸c˜oes
gr´aficas da execu¸c˜ao de um programa. Esses “tira-teimas” s˜ao apresentados atrav´es de
uma applet Java, apresentada na figura 4.5. Os “tira-teimas” s˜ao compostos de duas
partes: um programa cuja execu¸c˜ao ser´a simulada e um script espec´ıfico que simular´a a
execu¸c˜ao. Denominamos tais scripts de roteiros.
Cada linha de um roteiro inicia com um n´umero inteiro; este n´umero ´e o ´ındice da
linha do programa simulado que ser´a real¸cada no programa quando a linha do roteiro
for executada. Ap´os este ´ındice, podem vir zero ou mais comandos separados por ponto-
e-v´ırgula. Se n˜ao houver nenhum comando a ser executado na linha, apenas o ponto-e-
v´ırgula segue o n´umero; se houver mais de um, os comandos devem vir entre chaves. H´a,
basicamente, comandos de declara¸c˜ao de vari´aveis (que aparecem como caixas coloridas
na applet de tira-teima, comandos de escrita (que imprimem um valor no console da applet
e altera¸c˜ao de valores de vari´aveis. A figura 4.6 apresenta o exemplo do roteiro utilizado
para o exemplo apresentado na se¸c˜ao 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.0i e um real nao -negativo.);
24;
Figura 4.6: Exemplo de roteiro de “tira-teima”
Um roteiro pode percorrer apenas um caminho dentro de um programa. Por exemplo,
se h´a um comando if com uma cl´ausula else no programa, um roteiro pode passar
apenas pela cl´ausula then ou pela cl´ausula else. Isto levanta uma quest˜ao importante:
como escolher o caminho que um roteiro deve percorrer em um programa?
N´os utilizamos alguns crit´erios bem simples para escolher os caminhos. Um, bastante
natural, foi:
Se o programa apresenta apenas uma caracter´ıstica remov´ıvel, o caminho escolhido
deve executar a caracter´ıstica.
20
O programa apresentado na se¸c˜ao 5.1.3.4 por exemplo, possui como caracter´ıstica
remov´ıvel a presen¸ca da cl´ausula else no comando if. O roteiro deste programa iria,
ent˜ao, passar pelo comando da cl´ausula else, ao inv´es de passar pela cl´ausula then.
Outro crit´erio 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´erio foi adotado porque acreditamos que, quanto mais linhas de c´odigo o
estudante observar serem executadas, mais oportunidades haver´a para fixar conceitos.
Al´em disso, execu¸c˜oes sem sa´ıda podem ser bastante confusas: para o iniciante, ´e bem
poss´ıvel que um programa que n˜ao imprima nada pare¸ca um programa que n˜ao fa¸ca nada.
4.4 Localiza¸c˜ao na taxonomia
Os v´arios exemplos s˜ao apresentados em p´aginas HTML separadas, mas sentimos a ne-
cessidade de prover ao estudante uma maneira de ele se localizar em uma determinada
taxonomia. A solu¸c˜ao foi criar imagens de ´arvores, nas quais o exemplo em que o estu-
dante se encontra ´e destacado atrav´es de cores. A figura 4.7 apresenta a representa¸c˜ao de
uma ´arvore.
Figura 4.7: Representa¸c˜ao da localiza¸c˜ao do aluno na taxonomia
21
4.5 Resumo
Dados os conceitos acima, o processo de cria¸c˜ao de taxonomias para um cap´ıtulo pode
ser resumido da seguinte maneira:
1. selecionar conceitos e estruturas relevantes — isto ´e, caracter´ısticas remov´ıveis — a
partir do tema do cap´ıtulo;
2. agrupar as caracter´ısticas remov´ıveis em conjuntos de duas ou trˆes caracter´ısticas.
Idealmente, as caracter´ısticas s˜ao conceitualmente pr´oximas e ortogonais entre si;
3. criar, para cada conjunto agrupado, enunciados que levem a programas que apresen-
tem subconjuntos das caracter´ısticas. Pode-se, eventualmente, n˜ao criar enunciados
para alguns subconjuntos que sejam triviais ou invi´aveis. Os enunciados de uma
taxonomia devem, idealmente, ser vers˜oes mais simples ou mais completas de um
problema;
4. para cada enunciado, desenvolver uma solu¸c˜ao, em linguagem Pascal;
5. para cada solu¸c˜ao, desenvolver um roteiro de “tira-teima”;
6. inserir os programas e roteiros em p´aginas HTML do Tutorial ICC;
7. para cada p´agina, criar uma representa¸c˜ao gr´afica da taxonomia da qual a p´agina
faz parte, e inserir essa representa¸c˜ao na p´agina.
Naturalmente, os passos n˜ao precisam seguir for¸cosamente esta ordem, mas ´e usual
que sejam seguidos assim.
O cap´ıtulo 5 apresenta a aplica¸c˜ao deste processo em um cap´ıtulo do Tutorial ICC.
22
Cap´ıtulo 5
Exemplos de Taxonomias
No tutorial ICC, implementamos sete conjuntos de taxonomias, um para cada um dos
cap´ıtulos do tutorial, a partir do segundo1
.
O primeiro conjunto implementado foram as taxonomias do cap´ıtulo 3. Este cap´ıtulo
trata de estruturas de decis˜ao if-then-else e case-of. Julgamos os conceitos por tr´as
destes comandos sofisticados o suficiente para antevermos alguns desafios da cria¸c˜ao de
taxonomias, mas simples o suficiente para que n˜ao nos perdˆessemos no seu desenvolvi-
mento; por isso, cap´ıtulo 3 do tutorial foi escolhido para o desenvolvimento da primeira
taxonomia.
Chegamos a v´arias conclus˜oes e questionamentos durante a cria¸c˜ao desta taxonomia e,
portanto, elegemos a taxonomia deste cap´ıtulo como um bom exemplo para ser analisado.
5.1 ´Arvore 1
Na primeira ´arvore 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 ´arvore devem ser
solucionados utilizando a estrutura condicional. As caracter´ısticas remov´ıveis, nesta pri-
meira ´arvore, s˜ao o uso do comando else e a presen¸ca de um comando composto, formado
por v´arios outros comandos agrupados pelos delimitadores de blocos begin-end. Como
h´a duas caracter´ısticas remov´ıveis, essa ´arvore possui dois n´ıveis de hierarquia e quatro
exemplos.
5.1.1 Caracter´ısticas remov´ıveis
C1. uso de blocos begin-end
C2. uso de else
1
O primeiro cap´ıtulo ´e, basicamente, para apresenta¸c˜ao de conceitos sobre computadores. Nesse
sentido, n˜ao h´a como criar uma taxonomia de exemplos de programa¸c˜ao para o cap´ıtulo.
23
5.1.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 1 (subse¸c˜ao 5.1.3.1)
– – 1.1 (subse¸c˜ao 5.1.3.2)
• – 1.2 (subse¸c˜ao 5.1.3.3)
– • 1.3 (subse¸c˜ao 5.1.3.4)
5.1.3 Enunciados e programas
5.1.3.1 Exemplo 1
Enunciado Uma companhia de seguros vende seguros de carros. O pre¸co de um seguro
anual ´e 5%, ou 1/20 do pre¸co do carro. Entretanto, a companhia s´o vende seguros para
pessoas com mais de 25 anos.
Fa¸ca um programa que leia o pre¸co do carro a ser segurado e a idade do motorista. Se
o motorista tiver idade para contratar seguro, imprima uma mensagem dizendo o valor
do seguro. Se o carro valer, por exemplo, R° 20 mil, a mensagem ser´a:
’Valor do seguro: R° 1000.00. ’
Se o motorista n˜ao tiver idade para contratar o seguro, imprima duas linhas. A
primeira linha ser´a:
’Voce nao pode contratar o seguro.’
Supondo que o motorista tenha 22 anos, a segunda linha ser´a:
’podera contaratar em 3 anos.’
Solu¸c˜ao A solu¸c˜ao usada foi a seguinte
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.
5.1.3.2 Exemplo 1.1
Enunciado Uma companhia de seguros vende seguros de carros. O pre¸co de um seguro
anual ´e 5%, ou 1/20 do pre¸co do carro. Entretanto, a companhia s´o vende seguros para
pessoas com mais de 25 anos.
Fa¸ca um programa que diga se um potencial cliente dessa seguradora pode contratar
um seguro. O programa deve ler a idade do cliente e, caso ele tenha idade para contratar
o seguro, deve imprimir a mensagem:
’Voce pode contratar o seguro.’
Solu¸c˜ao A solu¸c˜ao usada foi a seguinte
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.
5.1.3.3 Exemplo 1.2
Enunciado Uma companhia de seguros vende seguros de carros. O pre¸co de um seguro
anual ´e 5%, ou 1/20 do pre¸co do carro. Entretanto, a companhia s´o vende seguros para
pessoas com mais de 25 anos.
Fa¸ca um programa que diga se um potencial cliente dessa seguradora pode contratar
um seguro. O programa deve ler a idade do cliente e, caso ele n˜ao tenha idade para
contratar o seguro, deve imprimir a mensagem:
25
’Voce nao pode contratar o seguro.’
Al´em disso, deve tamb´em informar quando o cliente ter´a idade para contratar o seguro.
Supondo que o cliente tenha 22 anos, a mensagem ser´a:
’Podera contratar em 3 anos.’
Solu¸c˜ao A solu¸c˜ao usada foi a seguinte
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.
5.1.3.4 Exemplo 1.3
Enunciado Uma companhia de seguros vende seguros de carros. O pre¸co de um seguro
anual ´e 5%, ou 1/20 do pre¸co do carro. Entretanto, a companhia s´o vende seguros para
pessoas com mais de 25 anos.
Fa¸ca um programa que leia o pre¸co do carro a ser segurado e a idade do motorista. Se
o motorista tiver idade para contratar seguro, imprima uma mensagem dizendo o valor
do seguro. Se o carro valer, por exemplo, R° 20 mil, a mensagem ser´a:
’Valor do seguro: R° 1000.00. ’
Se o motorista n˜ao tiver idade para contratar o seguro, imprima a mensagem:
’Voce nao pode contratar o seguro.’
26
Solu¸c˜ao A solu¸c˜ao 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´arios
No exemplo 1, t´ınhamos de apresentar ambas as caracter´ısticas remov´ıveis. Na ´arvore ori-
ginal, acrescentamos a caracter´ıstica C2 colocando blocos de comando tanto na cl´ausula
then quanto na cl´ausula else. Entretanto, decidimos posteriormente que seria mais inte-
ressante colocar o comando composto em apenas uma das cl´ausulas: deste modo, espera-se
que o aluno compreenda que ´e poss´ıvel ter um comando composto em uma das cl´ausulas
tendo um comando simples na outra cl´ausula. Julgamos relevante inserir, sempre que
poss´ıvel, esse tipo de assimetria nos problemas. Al´em disso, decidimos colocar o comando
composto na cl´ausula else porque, no exemplo 1.2, o comando composto j´a fora colocado
em uma cl´ausula then.
5.2 ´Arvore 2
Nosso objetivo na segunda ´arvore do cap´ıtulo 3 ´e apresentar exemplos de aplica¸c˜ao, ao
aluno, do uso dos operadores booleanos and, or e not. A ´arvore tem trˆes caracter´ısticas
remov´ıveis, que s˜ao o uso do operador and, o uso do operador or e o uso do operador not. O
exemplo maior utiliza as trˆes caracter´ısticas remov´ıveis e possui trˆes 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
C2. uso do operador or
C3. uso do operador not
5.2.2 Numera¸c˜ao dos exemplos
c1 c2 c3 Exemplo
• • • 2 (subse¸c˜ao 5.2.3.1)
• • – 2.1 (subse¸c˜ao 5.2.3.2)
• – • 2.2 (subse¸c˜ao 5.2.3.3)
– • • 2.3 (subse¸c˜ao 5.2.3.4)
• – – 2.1.1, 2.2.1 (subse¸c˜ao 5.2.3.5)
– • – 2.1.2, 2.3.1 (subse¸c˜ao 5.2.3.6)
– – • 2.2.2, 2.3.2 (subse¸c˜ao 5.2.3.7)
– – – — (ver coment´arios na subse¸c˜ao 5.2.4)
5.2.3 Enunciados e programas
5.2.3.1 Exemplo 2
Enunciado Um certo pa´ıs exige que qualquer estrangeiro que v´a trabalhar em seu
territ´orio satisfa¸ca duas condi¸c˜oes. A primeira condi¸c˜ao ´e que o contratador do estrangeiro
envie uma carta `a embaixada. Al´em disso, o estrangeiro deve ter US° 10 mil em uma
conta do pa´ıs de origem ou ter um im´ovel no pa´ıs de origem.
Fa¸ca um programa que pergunte ao usu´ario se ele tem a carta do empregador, pergunte
se ele tem US° 10 mil reais em uma conta no pa´ıs de origem e pergunte se ele tem um
im´ovel. Se o usu´ario n˜ao tiver a carta ou alguma das duas outras condi¸c˜oes n˜ao for
satisfeita, imprima a mensagem:
’Voce nao pode trabalhar no pais.’
Caso contr´ario, n˜ao imprima nada. As respostas que o programa espera s˜ao ’s’ (para
“sim”) ou ’n’ (para “n˜ao”).
Solu¸c˜ao A solu¸c˜ao usada foi a seguinte
program exemplo2;
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.
5.2.3.2 Exemplo 2.1
Enunciado Um certo pa´ıs exige que qualquer estrangeiro que v´a trabalhar em seu
territ´orio satisfa¸ca duas condi¸c˜oes. A primeira condi¸c˜ao ´e que o contratador do estrangeiro
envie uma carta `a embaixada. Al´em disso, o estrangeiro deve ter US° 10 mil em uma
conta do pa´ıs de origem ou ter um im´ovel no pa´ıs de origem.
Fa¸ca um programa que pergunte ao usu´ario se ele tem a carta do empregador, pergunte
se ele tem US° 10 mil reais em uma conta no pa´ıs de origem e pergunte se ele tem um
im´ovel. Se o usu´ario tiver a carta e alguma das duas outras condi¸c˜oes for satisfeita,
imprima a mensagem:
’Voce pode trabalhar no pais.’
Caso contr´ario, n˜ao imprima nada. As respostas que o programa espera s˜ao ’s’ (para
“sim”) ou ’n’ (para “n˜ao”).
Solu¸c˜ao A solu¸c˜ao usada foi a seguinte
program exemplo2_1;
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´a trabalhar em seu
territ´orio satisfa¸ca duas condi¸c˜oes. A primeira condi¸c˜ao ´e que o contratador do estrangeiro
envie uma carta `a embaixada. Al´em disso, o estrangeiro deve ter US° 10 mil em uma
conta do pa´ıs de origem ou ter um im´ovel no pa´ıs de origem.
Fa¸ca um programa que pergunte ao usu´ario se ele tem US° 10 mil em uma conta e
pergunte se ele tem um im´ovel. Se o usu´ario tiver o dinheiro mas n˜ao tiver o im´ovel,
imprima a mensagem:
’Mesmo sem imovel , voce pode trabalhar no pais se tiver uma carta
.’
Caso contr´ario, n˜ao imprima nada. As respostas que o programa espera s˜ao ’s’ (para
“sim”) ou ’n’ (para “n˜ao”).
Solu¸c˜ao A solu¸c˜ao usada foi a seguinte
program exemplo2_2;
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.
5.2.3.4 Exemplo 2.3
Enunciado Um certo pa´ıs exige que qualquer estrangeiro que v´a trabalhar em seu
territ´orio satisfa¸ca duas condi¸c˜oes. A primeira condi¸c˜ao ´e que o contratador do estrangeiro
envie uma carta `a embaixada. Al´em disso, o estrangeiro deve ter US° 10 mil em uma
conta do pa´ıs de origem ou ter um im´ovel no pa´ıs de origem.
Fa¸ca um programa que pergunte ao usu´ario se ele tem US° 10 mil em uma conta e
pergunte se ele tem um im´ovel. Se o usu´ario n˜ao tiver o dinheiro nem o im´ovel, imprima
a mensagem:
’Voce nao pode trabalhar no pais.’
30
Caso contr´ario, n˜ao imprima nada. As respostas que o programa espera s˜ao ’s’ (para
“sim”) ou ’n’ (para “n˜ao”).
Solu¸c˜ao A solu¸c˜ao usada foi a seguinte
program exemplo2_3;
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.
5.2.3.5 Exemplos 2.1.1 e 2.2.1
Enunciado Um certo pa´ıs exige que qualquer estrangeiro que v´a trabalhar em seu
territ´orio satisfa¸ca duas condi¸c˜oes. A primeira condi¸c˜ao ´e que o contratador do estrangeiro
envie uma carta `a embaixada. Al´em disso, o estrangeiro deve ter US° 10 mil em uma
conta do pa´ıs de origem ou ter um im´ovel no pa´ıs de origem.
Fa¸ca um programa que pergunte ao usu´ario se ele tem a carta do empregador e per-
gunte se ele tem um im´ovel. Se o usu´ario tiver a carta e o im´ovel, imprima a mensagem:
’Voce pode trabalhar no pais.’
Caso contr´ario, n˜ao imprima nada. As respostas que o programa espera s˜ao ’s’ (para
“sim”) ou ’n’ (para “n˜ao”).
Solu¸c˜ao A solu¸c˜ao usada foi a seguinte
program exemplo2_1_1 ;
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.
5.2.3.6 Exemplos 2.1.2 e 2.3.1
Enunciado Um certo pa´ıs exige que qualquer estrangeiro que v´a trabalhar em seu
territ´orio satisfa¸ca duas condi¸c˜oes. A primeira condi¸c˜ao ´e que o contratador do estrangeiro
envie uma carta `a embaixada. Al´em disso, o estrangeiro deve ter US° 10 mil em uma
conta do pa´ıs de origem ou ter um im´ovel no pa´ıs de origem.
Fa¸ca um programa que pergunte ao usu´ario se ele tem US° 10 mil em uma conta e
pergunte se ele tem um im´ovel. Se o usu´ario tiver o dinheiro ou o im´ovel, imprima a
mensagem:
’Voce so precisa da carta.’
Caso contr´ario, imprima a mensagem:
’Voce nao pode trabalhar no pais.’
As respostas que o programa espera s˜ao ’s’ (para “sim”) ou ’n’ (para “n˜ao”).
Solu¸c˜ao A solu¸c˜ao usada foi a seguinte
program exemplo2_1_2 ;
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´a trabalhar em seu
territ´orio satisfa¸ca duas condi¸c˜oes. A primeira condi¸c˜ao ´e que o contratador do estrangeiro
envie uma carta `a embaixada. Al´em disso, o estrangeiro deve ter US° 10 mil em uma
conta do pa´ıs de origem ou ter um im´ovel no pa´ıs de origem.
Fa¸ca um programa que pergunte ao usu´ario se ele tem a carta do empregador. Se ele
n˜ao tiver a carta, imprima a mensagem:
’Voce nao pode trabalhar no pais.’
Caso contr´ario, n˜ao imprima nada. As respostas que o programa espera s˜ao ’s’ (para
“sim”) ou ’n’ (para “n˜ao”).
Solu¸c˜ao A solu¸c˜ao usada foi a seguinte
program exemplo2_2_2 ;
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´arios
Para mostrar uma aplica¸c˜ao pr´atica destes operadores, utilizamos ainda o comando if. ´E
interessante notar que procuramos evitar utilizar a cl´ausula else, justamente para “for¸car”
ao aluno que pense em termos dos operadores. Isso provavelmente n˜ao ´e necess´ario:
como programas implementando os enunciados j´a s˜ao apresentados, n˜ao ´e preciso for¸car
o estudante a pensar de certa maneira — basta apresentar um enunciado que leve a uma
solu¸c˜ao intuitiva utilizando as caracter´ısticas remov´ıveis do problema. Ademais, evitar
utilizar a cl´ausula else acabou tornado os enunciados menos intuitivos. Por exemplo,
enquanto a solu¸c˜ao do exemplo 2 possui um comando if arbitrariamente sem cl´ausula else
, poder´ıamos acrescent´a-la que conseguir´ıamos ainda assim utilizar todos os operadores,
como fizemos no exemplo da se¸c˜ao 5.2.3.6.
A implementa¸c˜ao de ´arvores de trˆes n´ıveis apresenta v´arios desafios. Primeiro, s˜ao
´arvores maiores. Al´em disso, como podemos notar na ´arvore 2, elas n˜ao necessariamente
levam a ´arvores totalmente preenchidas, que era nosso objetivo inicial: n˜ao h´a na ´arvore
2 um exemplo a que falte todas as caracter´ısticas remov´ıveis. N˜ao acrescentamos este
33
exemplo porque ele possuiria apenas um comando if, o que j´a foi exercitado na ´arvore
12
. A ´arvore 4 ´e tamb´em n˜ao totalmente preenchida, embora por raz˜oes diferentes3
.
Outro aspecto caracter´ıstico das ´arvores de trˆes caracter´ısticas ´e a repeti¸c˜ao de de
exemplos. Como h´a trˆes exemplos subordinados ao exemplo maior, cada um destes exem-
plos possui tamb´em seus subordinados com uma caracter´ıstica s´o. Por exemplo, obser-
vando a tabela da subse¸c˜ao 5.2.2, percebe-se que os exemplos 2.1.1 e 2.2.1 exercitam a
mesma caracter´ıstica, que ´e o uso do operador and. Assim sendo, decidimos repetir o
enunciado e a solu¸c˜ao do exemplo 2.1.1 no exemplo 2.2.1.
5.3 ´Arvore 3
A terceira ´arvore deste cap´ıtulo considera o uso de comandos do tipo if-then, n˜ao aninha-
dos, em seq¨uˆencia. As caracter´ısticas remov´ıveis, nesta primeira ´arvore, s˜ao a presen¸ca
de um comando else para a primeira ocorrˆencia de if-then e a presen¸ca de um comando
else para a segunda ocorrˆencia. Como h´a duas caracter´ısticas remov´ıveis, temos uma
´arvore de profundidade 2 e quatro exemplos.
5.3.1 Caracter´ısticas remov´ıveis
C1. primeiro comando if-then possui cl´ausula else
C2. segundo comando if-then possui cl´ausula else
5.3.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 3 (subse¸c˜ao 5.3.3.1)
– – 3.1 (subse¸c˜ao 5.3.3.2)
• – 3.2 (subse¸c˜ao 5.3.3.3)
– • 3.3 (subse¸c˜ao 5.3.3.4)
5.3.3 Enunciados e programas
5.3.3.1 Exemplo 3
Enunciado Um servidor p´ublico tem a possibilidade de aumentar sua remunera¸c˜ao se
apresentar os t´ıtulos de especializa¸c˜ao e/ou de mestrado.
O servidor poder´a apresentar apenas um diploma para cada titula¸c˜ao e s´o poder´a
acumular os adicionais de titula¸c˜oes diferentes.
Fa¸ca um programa que calcule a remunera¸c˜ao final de um servidor considerando os
seguintes dados:
2
A subse¸c˜ao 5.1.3.2 apresenta este exemplo.
3
A se¸c˜ao 5.4 apresenta essa ´arvore.
34
Vencimento: R° 1.000,00
Adicional de especializa¸c˜ao: 3% do Vencimento
Adicional de mestrado: 7% do Vencimento
Remunera¸c˜ao final ´e a soma do vencimento e adicionais.
O programa dever´a ler a resposta do usu´ario para as seguintes perguntas acerca dos
t´ıtulos:
’Possui diploma de especializacao ?’
’Possui diploma de mestrado?’
Se o servidor tem especializa¸c˜ao, o programa dever´a imprimir a seguinte mensagem:
’Voce tem direito ao adicional de especializacao .’
Caso contr´ario:
’Voce nao tem direito ao adicional de especializacao .’
Se o servidor tem mestrado, o programa dever´a imprimir a seguinte mensagem:
’Voce tem direito ao adicional de mestrado.’
Caso contr´ario:
’Voce nao tem direito ao adicional de mestrado.’
Por ´ultimo, dever´a imprimir a remunera¸c˜ao final. Caso a remunera¸c˜ao calculada pelo
programa for iguai a R° 1100, imprima:
’Sua remuneracao e de 1100. ’
35
Solu¸c˜ao A solu¸c˜ao 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.
5.3.3.2 Exemplo 3.1
Enunciado Um servidor p´ublico tem a possibilidade de aumentar sua remunera¸c˜ao se
apresentar os t´ıtulos de especializa¸c˜ao e/ou de mestrado.
O servidor poder´a apresentar apenas um diploma para cada titula¸c˜ao e s´o poder´a
acumular os adicionais de titula¸c˜oes diferentes.
Fa¸ca um programa que calcule a remunera¸c˜ao final de um servidor considerando os
seguintes dados:
Vencimento: R° 1.000,00
36
Adicional de especializa¸c˜ao: 3% do Vencimento
Adicional de mestrado: 7% do Vencimento
Remunera¸c˜ao final ´e a soma do vencimento e adicionais.
O programa dever´a ler a resposta do usu´ario para as seguintes perguntas acerca dos
t´ıtulos:
’Possui diploma de especializacao ?’
’Possui diploma de mestrado?’
Por ´ultimo, dever´a imprimir a remunera¸c˜ao final. Caso a remunera¸c˜ao calculada pelo
programa for iguai a R° 1100:
’Sua remuneracao e de 1100. ’
Solu¸c˜ao A solu¸c˜ao usada foi a seguinte
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´ublico tem a possibilidade de aumentar sua remunera¸c˜ao se
apresentar os t´ıtulos de especializa¸c˜ao e/ou de mestrado.
O servidor poder´a apresentar apenas um diploma para cada titula¸c˜ao e s´o poder´a
acumular os adicionais de titula¸c˜oes diferentes.
Fa¸ca um programa que calcule a remunera¸c˜ao final de um servidor considerando os
seguintes dados:
Vencimento: R° 1.000,00
Adicional de especializa¸c˜ao: 3% do Vencimento
Adicional de mestrado: 7% do Vencimento
Remunera¸c˜ao final ´e a soma do vencimento e adicionais.
O programa dever´a ler a resposta do usu´ario para as seguintes perguntas acerca dos
t´ıtulos:
’Possui diploma de especializacao ?’
’Possui diploma de mestrado?’
Se o servidor tem especializa¸c˜ao, o programa dever´a imprimir a seguinte mensagem:
’Voce tem direito ao adicional de especializacao .’
Caso contr´ario, imprima:
’Subsidiamos cursos de especializacao .’
Logo depois, se o servidor tem mestrado, o programa dever´a imprimir a seguinte
mensagem:
’Voce tem direito ao adicional de mestrado.’
Caso contr´ario, n˜ao imprima nada.
Por ´ultimo, dever´a imprimir a remunera¸c˜ao final. Caso a remuneracao calculada pelo
programa seja R° 1100:
’Sua remuneracao e de 1100 ’
38
Solu¸c˜ao A solu¸c˜ao 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.
5.3.3.4 Exemplo 3.3
Enunciado Um servidor p´ublico tem a possibilidade de aumentar sua remunera¸c˜ao se
apresentar os t´ıtulos de especializa¸c˜ao e/ou de mestrado.
O servidor poder´a apresentar apenas um diploma para cada titula¸c˜ao e s´o poder´a
acumular os adicionais de titula¸c˜oes diferentes.
Fa¸ca um programa que calcule a remunera¸c˜ao final de um servidor considerando os
seguintes dados:
Vencimento: R° 1.000,00
Adicional de especializa¸c˜ao: 3% do Vencimento
Adicional de mestrado: 7% do Vencimento
39
Remunera¸c˜ao final ´e a soma do vencimento e adicionais.
O programa dever´a ler a resposta do usu´ario para as seguintes perguntas acerca dos
t´ıtulos:
’Possui diploma de especializacao ?’
’Possui diploma de mestrado?’
Se o servidor tem especializa¸c˜ao, o programa dever´a imprimir a seguinte mensagem:
’Voce tem direito ao adicional de especializacao .’
Caso contr´ario, n˜ao deve imprimir nada.
Logo depois, se o servidor tem mestrado, o programa dever´a imprimir a seguinte
mensagem:
’Voce tem direito ao adicional de mestrado.’
Caso contr´ario, deve imprimir:
’Subsidiamos cursos de mestrado.’
Por ´ultimo, dever´a imprimir a remunera¸c˜ao final. Caso a remunera¸c˜ao calculada pelo
programa seja R° 1100:
’Sua remuneracao e de 1100 ’
Solu¸c˜ao A solu¸c˜ao usada foi a seguinte
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´arios
Essa ´arvore busca apresentar ao aluno o uso de comandos if em s´erie. A primeira quest˜ao
que se levantou foi: qual deve ser o n´umero de comandos if a serem apresentados em s´erie?
Inicialmente, cogitamos apresentar exemplos com trˆes comandos if em s´erie, uma vez que
t´ınhamos em mente utilizar ´arvores com trˆes caracter´ısticas remov´ıveis4
. Entretanto, os
programas ficaram muito grandes, o que provavelmente os tornaria cansativos para os
alunos. Decidimos, ent˜ao, utilizar dois comandos if em s´erie, com duas caracter´ısticas
remov´ıveis.
De fato, notamos que ´arvores com trˆes caracter´ısticas remov´ıveis tendem a gerar pro-
gramas maiores, al´em de, naturalmente, ´arvores com mais n´os, o que pode ser cansativo
ao aluno. Naturalmente, h´a exce¸c˜oes nas quais as ´arvores de trˆes caracter´ısticas s˜ao me-
nos cansativas e at´e mais naturais. A ´arvore 2 (apresentada na se¸c˜ao 5.2) e a ´arvore 6
(apresentada na se¸c˜ao 5.6) s˜ao bons exemplos de exce¸c˜oes.
5.4 ´Arvore 4
A quarta ´arvore do cap´ıtulo 3 apresenta o uso de comandos if-then aninhados. As
caracter´ısticas remov´ıveis s˜ao a presen¸ca da cl´ausula else no if-then interno, a presen¸ca
do if-then interno na cl´ausula then externa5
e a presen¸ca do if-then interno na cl´ausula
4
Como ter´ıamos trˆes comandos if, poder´ıamos definir como caracter´ısticas remov´ıveis a presen¸ca da
cl´ausula else no primeiro comando, a presen¸ca da cl´ausula else no segundo comando e a presen¸ca da
cl´ausula else no terceiro comando, analogamente ao que fizemos com dois comandos if.
5
Isto ´e, o if-then interno s´o ser´a executado se a condi¸c˜ao do if-then externo for satisfeita.
41
else externa6
. Como h´a trˆes caracter´ısticas remov´ıveis, a ´arvore possui trˆes n´ıveis de
hierarquia. A ´arvore possui oito exemplos.
5.4.1 Caracter´ısticas remov´ıveis
C1. h´a uma cl´ausula else em pelo menos um if-then interno
C2. h´a um comando if-then na cl´ausula then externa
C3. h´a um comando if-then na cl´ausula else externa
5.4.2 Numera¸c˜ao dos exemplos
C1 C2 C3 Exemplo
• • • 4 (subse¸c˜ao 5.4.3.1)
– • • 4.1 (subse¸c˜ao 5.4.3.2)
• – • 4.2 (subse¸c˜ao 5.4.3.3)
• • – 4.3 (subse¸c˜ao 5.4.3.4)
– – • 4.1.1, 4.2.1 (subse¸c˜ao 5.4.3.5)
– • – 4.1.2, 4.3.1 (subse¸c˜ao 5.4.3.5)
• – – — (ver coment´arios na subse¸c˜ao 5.4.4)
– – – — (ver coment´arios na subse¸c˜ao 5.4.4)
5.4.3 Enunciados e programas
5.4.3.1 Exemplo 4
Enunciado Os n´umeros complexos tˆem a forma a + bi e podem ser reais (caso b = 0)
e n˜ao reais (caso b = 0). Se o n´umero for real, ele pode ser negativo (se a  0) ou
n˜ao-negativo (se a ≥ 0). Eventualmente, o n´umero real pode ser neutro, isto ´e, igual a
zero. Se a = 0 e b = 0, o n´umero complexo ´e um n´umero imagin´ario.
Fa¸ca um programa que leia o valor da parte real a e o valor da parte imagin´aria b
de um n´umero complexo. Se o n´umero for n˜ao real (b = 0), verifique se o n´umero ´e
imagin´ario (a = 0). Se o n´umero for imagin´ario, imprima a mensagem:
’valor de a+ valor de bi e imaginario.’
Se o n´umero n˜ao for imagin´ario, n˜ao imprima nada.
Se o n´umero for real (b = 0), verifique se o n´umero ´e negativo. Se for, imprima
’valor de a+ valor de bi e real negativo.’
Se n˜ao for negativo, imprima
’valor de a+ valor de bi e real nao -negativo.’
6
Ou seja, o if-then interno s´o ser´a executado se a condi¸c˜ao do if-then externo n˜ao for satisfeita.
42
Solu¸c˜ao A solu¸c˜ao 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.
5.4.3.2 Exemplo 4.1
Enunciado Os n´umeros complexos tˆem a forma a + bi e podem ser reais (caso b = 0)
e n˜ao reais (caso b = 0). Se o n´umero for real, ele pode ser negativo (se a  0) ou
n˜ao-negativo (se a ≥ 0). Eventualmente, o n´umero real pode ser neutro, isto ´e, igual a
zero. Se a = 0 e b = 0, o n´umero complexo ´e um n´umero imagin´ario.
Fa¸ca um programa que leia o valor da parte real a e o valor da parte imagin´aria b
de um n´umero complexo. Se o n´umero for n˜ao real (b = 0), verifique se o n´umero ´e
imagin´ario (a = 0). Se o n´umero for imagin´ario, imprima a mensagem:
’valor de a+ valor de bi e imaginario.’
Se o n´umero n˜ao for imagin´ario, n˜ao imprima nada.
Se o n´umero for real (b = 0), verifique se o n´umero ´e negativo. Se for, imprima
’valor de a+ valor de bi e real negativo.’
Se n˜ao for negativo, n˜ao imprima nada.
43
Solu¸c˜ao A solu¸c˜ao 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.
5.4.3.3 Exemplo 4.2
Enunciado Os n´umeros complexos tˆem a forma a + bi e podem ser reais (caso b = 0)
e n˜ao reais (caso b = 0). Se o n´umero for real, ele pode ser negativo (se a  0) ou
n˜ao-negativo (se a ≥ 0). Eventualmente, o n´umero real pode ser neutro, isto ´e, igual a
zero. Se a = 0 e b = 0, o n´umero complexo ´e um n´umero imagin´ario.
Fa¸ca um programa que leia o valor da parte real a e o valor da parte imagin´aria b de
um n´umero complexo. Se o n´umero for n˜ao real (b = 0), imprima a mensagem:
’valor de a+ valor de bi e nao real.’
Se o n´umero n˜ao for imagin´ario, n˜ao imprima nada.
Se o n´umero for real (b = 0), verifique se o n´umero ´e negativo. Se for, imprima
’valor de a+ valor de bi e real negativo.’
Se n˜ao for negativo, imprima:
’valor de a+ valor de bi e real nao -negativo.’
44
Solu¸c˜ao A solu¸c˜ao 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.
5.4.3.4 Exemplo 4.3
Enunciado Os n´umeros complexos tˆem a forma a + bi e podem ser reais (caso b = 0)
e n˜ao reais (caso b = 0). Se o n´umero for real, ele pode ser negativo (se a  0) ou
n˜ao-negativo (se a ≥ 0). Eventualmente, o n´umero real pode ser neutro, isto ´e, igual a
zero. Se a = 0 e b = 0, o n´umero complexo ´e um n´umero imagin´ario.
Fa¸ca um programa que leia o valor da parte real a e o valor da parte imagin´aria b de
um n´umero complexo. Se o n´umero for imagin´ario (a = 0), imprima a mensagem:
’valor de a+ valor de bi e imaginario.’
Se o n´umero n˜ao for imagin´ario, mas tamb´em n˜ao for real imprima:
’valor de a+ valor de bi e nao real.’
Se o n´umero for real (b = 0), imprima a mensagem:
’valor de a+ valor de bi e real.’
45
Solu¸c˜ao A solu¸c˜ao 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.
5.4.3.5 Exemplos 4.1.1 e 4.2.1
Enunciado Os n´umeros complexos tˆem a forma a + bi e podem ser reais (caso b = 0)
e n˜ao reais (caso b = 0). Se o n´umero for real, ele pode ser negativo (se a  0) ou
n˜ao-negativo (se a ≥ 0). Eventualmente, o n´umero real pode ser neutro, isto ´e, igual a
zero. Se a = 0 e b = 0, o n´umero complexo ´e um n´umero imagin´ario.
Fa¸ca um programa que leia o valor da parte real a e o valor da parte imagin´aria b de
um n´umero complexo. Se o n´umero for n˜ao real (b = 0), imprima a mensagem:
’valor de a+ valor de bi e nao real.’
Se o n´umero for real (b = 0), verifique se o n´umero ´e negativo. Se for, imprima
’valor de a+ valor de bi e real negativo.’
Solu¸c˜ao A solu¸c˜ao usada foi a seguinte
program exemplo4_1_1 ;
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.
5.4.3.6 Exemplos 4.1.2 e 4.3.1
Enunciado Os n´umeros complexos tˆem a forma a + bi e podem ser reais (caso b = 0)
e n˜ao reais (caso b = 0). Se o n´umero for real, ele pode ser negativo (se a  0) ou
n˜ao-negativo (se a ≥ 0). Eventualmente, o n´umero real pode ser neutro, isto ´e, igual a
zero. Se a = 0 e b = 0, o n´umero complexo ´e um n´umero imagin´ario.
Fa¸ca um programa que leia o valor da parte real a e o valor da parte imagin´aria b
de um n´umero complexo. Se o n´umero for n˜ao real (b = 0), verifique se o n´umero ´e
imagin´ario (a = 0). Se o n´umero for imagin´ario, imprima a mensagem:
’valor de a+ valor de bi e imaginario.’
Se o n´umero n˜ao for real mas tamb´em n˜ao for imagin´ario, n˜ao imprima nada.
Se o n´umero for real (b = 0), imprima a mensagem
’valor de a+ valor de bi e real.’
Solu¸c˜ao A solu¸c˜ao usada foi a seguinte
program exemplo4_1_2 ;
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´arios
N´os buscamos sempre fazer ´arvores totalmente preenchidas nas taxonomias. Por vezes,
isso n˜ao ´e interessante; por exemplo, na ´arvore da se¸c˜ao 5.2 n˜ao h´a nenhum n´o que equiva-
lha aos problemas sem caracter´ısticas remov´ıveis, pois o problema desse n´o seria bastante
trivial. No caso da ´arvore dessa se¸c˜ao, ´e invi´avel fazer a ´arvore completa: ´e 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´ausula then ou de uma cl´ausula
else — mas a remo¸c˜ao das caracter´ısticas C2 e C3 impedem que haja um comando if
em qualquer uma das cl´ausulas. Al´em disso, um n´o que n˜ao tenha nenhuma das carac-
ter´ısticas remov´ıveis pareceu-nos simples demais para constar na ´arvore, assim como na
´arvore 2. Consequentemente, os n´os 4.2 e 4.3 possuem apenas um problema subordinado.
Essa configura¸c˜ao n˜ao aparenta ser muito boa: n˜ao sabemos se ´e conveniente ao aluno
descer um n´ıvel da ´arvore para estudar apenas um exemplo.
Na solu¸c˜ao7
do exemplo 4, ´e interessante notar que, enquanto o comando if dentro
da cl´ausula else possui tanto a cl´ausula then quanto a cl´ausula else, o comando if
dentro da cl´ausula then externa possui apenas a cl´ausula then. Isso foi uma decis˜ao
consciente: ´e relevante para mostrar ao aluno como inserir um comando if sem uma
cl´ausula else dentro de uma cl´ausula then8
. Al´em disso, essa configura¸c˜ao ´e assim´etrica:
os comandos dentro da cl´ausula then externa e else externa possuem estruturas diferentes.
Acreditamos que uma apresenta¸c˜ao assim´etrica incentiva o aluno a compreender melhor
a ortogonalidade do comando, e exercita melhor seu racioc´ınio. Essa ´e uma quest˜ao vasta
que escapa ao escopo do nosso projeto.
5.5 ´Arvore 5
A quinta ´arvore apresenta o uso de comandos if em cascata. Em outras palavras, essa
´arvore visa exercitar o aluno no uso (bastante comum) de comandos if com cl´ausulas
else em uma estrutura semelhante a
if condicao1 then
comando1
7
Ver se¸c˜ao 5.4.3.1.
8
Para fazer isso, nota-se que ´e preciso usar os agrupadores begin e end. Caso contr´ario, a cl´ausula
else do if interno ser´a 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˜ao a presen¸ca de else ao final da cascata, presen¸ca de
if interno com else e presen¸ca de if interno sem else. O comando if interno ocorrer´a
entre outros comandos dentro do bloco begin-end do if-then que o cont´em.
Como h´a trˆes caracter´ısticas remov´ıveis, temos uma ´arvore de profundidade 3.
5.5.1 Caracter´ısticas remov´ıveis
C1. presen¸ca de else ao final da cascata
C2. presen¸ca de if-then interno com else
C3. presen¸ca de if-then interno sem else
5.5.2 Numera¸c˜ao dos exemplos
C1 C2 C3 Exemplo
• • • 5 (subse¸c˜ao 5.5.3.1)
• • – 5.1 (subse¸c˜ao 5.5.3.2)
• – • 5.2 (subse¸c˜ao 5.5.3.3)
– • • 5.3 (subse¸c˜ao 5.5.3.4)
• – – 5.1.1, 5.2.1 (subse¸c˜ao 5.5.3.5)
– • – 5.1.2, 5.3.1 (subse¸c˜ao 5.5.3.6)
– – • 5.2.2, 5.3.2 (subse¸c˜ao 5.5.3.7)
– – – — (ver coment´arios na subse¸c˜ao 5.5.4)
5.5.3 Enunciados e programas
5.5.3.1 Exemplo 5
Enunciado Um restaurante quer informar aos seus clientes o prato do dia e descontos
promocionais. Ele funciona `as das ter¸cas `as quintas.
Fa¸ca um programa que forne¸ca tais informa¸c˜oes de acordo com as seguintes condi¸c˜oes:
O usu´ario dever´a informar um n´umero 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 3, o programa dever´a solicitar a idade do usu´ario:
’Digite sua idade:’
49
Se a idade for maior que zero, o programa dever´a imprimir o desconto, onde o numero
da porcentagem ´e igual `a idade. Por exemplo, se o usu´ario digitar a idade 30 o programa
dever´a imprimir:
’Desconto: 30% ’
Caso contr´ario, quando a idade for menor ou igual a zero, o programa dever´a imprimir
a mensagem:
’Idade invalida: sem descondo ’
Se o dia escolhido for o dia 5, o programa dever´a imprimir a pergunta:
’Possui cupom de desconto?’
Se o usu´ario digitar s, o programa dever´a imprimir:
’Desconto: 10% ’
O programa dever´a, tamb´em, imprimir o prato do dia conforme o dia escolhido.
Se o dia escolhido for 3, ter¸ca-feira, o programa dever´a imprimir:
’Prato do dia: macarronada ’
Se o dia escolhido for 4, quarta-feira, o programa dever´a imprimir:
’Prato do dia: galinhada ’
Se o dia escolhido for 5, quinta-feira, o programa dever´a imprimir:
’Prato do dia: feijoada ’
Se o dia escolhido for qualquer numero diferente dos anteriores, o programa dever´a
imprimir:
’Restaurante fechado ’
50
Solu¸c˜ao A solu¸c˜ao 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.
5.5.3.2 Exemplo 5.1
Enunciado Um restaurante quer informar aos seus clientes o prato do dia e descontos
promocionais. Ele funciona `as das ter¸cas `as quintas.
51
Fa¸ca um programa que forne¸ca tais informa¸c˜oes de acordo com as seguintes condi¸c˜oes:
O usu´ario dever´a informar um n´umero 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´a solicitar a idade do usu´ario:
’Digite sua idade:’
Se a idade for maior que zero, o programa dever´a imprimir o desconto, onde o numero
da porcentagem ´e igual `a idade. Por exemplo, se o usu´ario digitar a idade 30 o programa
dever´a imprimir:
’Desconto: 30% ’
Caso contr´ario, quando a idade for menor ou igual a zero, o programa dever´a imprimir
a mensagem:
’Idade invalida: sem descondo ’
O programa dever´a, tamb´em, imprimir o prato do dia conforme o dia escolhido.
Se o dia escolhido for 3, ter¸ca-feira, o programa dever´a imprimir:
’Prato do dia: macarronada ’
Se o dia escolhido for 4, quarta-feira, o programa dever´a imprimir:
’Prato do dia: galinhada ’
Se o dia escolhido for 5, quinta-feira, o programa dever´a imprimir:
’Prato do dia: feijoada ’
Se o dia escolhido for qualquer numero diferente dos anteriores, o programa dever´a
imprimir:
’Restaurante fechado ’
52
Solu¸c˜ao A solu¸c˜ao 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.
5.5.3.3 Exemplo 5.2
Enunciado Um restaurante quer informar aos seus clientes o prato do dia e descontos
promocionais. Ele funciona `as das ter¸cas `as quintas.
Fa¸ca um programa que forne¸ca tais informa¸c˜oes de acordo com as seguintes condi¸c˜oes:
O usu´ario dever´a informar um n´umero 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´a solicitar a idade do usu´ario:
’Possui cupom de desconto?’
53
Se o usu´ario digitar ’s’, o programa dever´a imprimir:
’Desconto: 10% ’
O programa dever´a, tamb´em, imprimir o prato do dia conforme o dia escolhido.
Se o dia escolhido for 3, ter¸ca-feira, o programa dever´a imprimir:
’Prato do dia: macarronada ’
Se o dia escolhido for 4, quarta-feira, o programa dever´a imprimir:
’Prato do dia: galinhada ’
Se o dia escolhido for 5, quinta-feira, o programa dever´a imprimir:
’Prato do dia: feijoada ’
Se o dia escolhido for qualquer numero diferente dos anteriores, o programa dever´a
imprimir:
’Restaurante fechado ’
Solu¸c˜ao A solu¸c˜ao usada foi a seguinte
program exemplo5_2;
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.
5.5.3.4 Exemplo 5.3
Enunciado Um restaurante quer informar aos seus clientes o prato do dia e descontos
promocionais. Ele funciona `as das ter¸cas `as quintas.
Fa¸ca um programa que forne¸ca tais informa¸c˜oes de acordo com as seguintes condi¸c˜oes:
O usu´ario dever´a informar um n´umero 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 3, o programa dever´a solicitar a idade do usu´ario:
’Digite sua idade:’
Se a idade for maior que zero, o programa dever´a imprimir o desconto, onde o numero
da porcentagem ´e igual `a idade. Por exemplo, se o usu´ario digitar a idade 30 o programa
dever´a imprimir:
’Desconto: 30% ’
Caso contr´ario, quando a idade for menor ou igual a zero, o programa dever´a imprimir
a mensagem:
’Idade invalida: sem descondo ’
Se o dia escolhido for o dia 5, o programa dever´a imprimir a pergunta:
’Possui cupom de desconto?’
Se o usu´ario digitar s, o programa dever´a imprimir:
’Desconto: 10% ’
55
O programa dever´a, tamb´em, imprimir o prato do dia conforme o dia escolhido.
Se o dia escolhido for 3, ter¸ca-feira, o programa dever´a imprimir:
’Prato do dia: macarronada ’
Se o dia escolhido for 4, quarta-feira, o programa dever´a imprimir:
’Prato do dia: galinhada ’
Se o dia escolhido for 5, quinta-feira, o programa dever´a imprimir:
’Prato do dia: feijoada ’
Se o dia escolhido for qualquer numero diferente dos anteriores, o programa dever´a
n˜ao imprimir nada.
Solu¸c˜ao A solu¸c˜ao usada foi a seguinte
program exemplo5_3;
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.
5.5.3.5 Exemplos 5.1.1 e 5.2.1
Enunciado Um restaurante quer informar aos seus clientes o prato do dia e descontos
promocionais. Ele funciona `as das ter¸cas `as quintas.
Fa¸ca um programa que forne¸ca tais informa¸c˜oes de acordo com as seguintes condi¸c˜oes:
O usu´ario dever´a informar um n´umero 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:
O programa dever´a, tamb´em, imprimir o prato do dia conforme o dia escolhido.
Se o dia escolhido for 3, ter¸ca-feira, o programa dever´a imprimir:
’Prato do dia: macarronada ’
Se o dia escolhido for 4, quarta-feira, o programa dever´a imprimir:
’Prato do dia: galinhada ’
Se o dia escolhido for 5, quinta-feira, o programa dever´a imprimir:
’Prato do dia: feijoada ’
Se o dia escolhido for qualquer numero diferente dos anteriores, o programa dever´a
imprimir:
’Restaurante fechado ’
57
Solu¸c˜ao A solu¸c˜ao 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.
5.5.3.6 Exemplos 5.1.2 e 5.3.1
Enunciado Um restaurante quer informar aos seus clientes o prato do dia e descontos
promocionais. Ele funciona `as das ter¸cas `as quintas.
Fa¸ca um programa que forne¸ca tais informa¸c˜oes de acordo com as seguintes condi¸c˜oes:
O usu´ario dever´a informar um n´umero 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´a solicitar a idade do usu´ario:
’Digite sua idade:’
Se a idade for maior que zero, o programa dever´a imprimir o desconto, onde o numero
da porcentagem ´e igual `a idade. Por exemplo, se o usu´ario digitar a idade 30 o programa
dever´a imprimir:
’Desconto: 30% ’
Caso contr´ario, quando a idade for menor ou igual a zero, o programa dever´a imprimir
a mensagem:
58
’Idade invalida: sem descondo ’
O programa dever´a, tamb´em, imprimir o prato do dia conforme o dia escolhido.
Se o dia escolhido for 3, ter¸ca-feira, o programa dever´a imprimir:
’Prato do dia: macarronada ’
Se o dia escolhido for 4, quarta-feira, o programa dever´a imprimir:
’Prato do dia: galinhada ’
Se o dia escolhido for 5, quinta-feira, o programa dever´a imprimir:
’Prato do dia: feijoada ’
Se o dia escolhido for qualquer numero diferente dos anteriores, o programa dever´a
n˜ao imprimir nada.
Solu¸c˜ao A solu¸c˜ao usada foi a seguinte
program exemplo5_1_2 ;
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.
5.5.3.7 Exemplos 5.2.2 e 5.3.2
Enunciado Um restaurante quer informar aos seus clientes o prato do dia e descontos
promocionais. Ele funciona `as das ter¸cas `as quintas.
Fa¸ca um programa que forne¸ca tais informa¸c˜oes de acordo com as seguintes condi¸c˜oes:
O usu´ario dever´a informar um n´umero 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´a imprimir a pergunta:
’Possui cupom de desconto?’
Se o usu´ario digitar s, o programa dever´a imprimir:
’Desconto: 10% ’
O programa dever´a, tamb´em, imprimir o prato do dia conforme o dia escolhido.
Se o dia escolhido for 3, ter¸ca-feira, o programa dever´a imprimir:
’Prato do dia: macarronada ’
Se o dia escolhido for 4, quarta-feira, o programa dever´a imprimir:
’Prato do dia: galinhada ’
Se o dia escolhido for 5, quinta-feira, o programa dever´a imprimir:
’Prato do dia: feijoada ’
Se o dia escolhido for qualquer numero diferente dos anteriores, o programa dever´a
n˜ao imprimir nada.
60
Solu¸c˜ao A solu¸c˜ao 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´arios
A ´arvore foi assim estabelecida de modo a exercitar o uso de sequˆencias de comandos if-
then mutualmente exclusivas, uma configura¸c˜ao em cascata. A partir de tal configura¸c˜ao,
estabelecemos trˆes caracter´ısticas remov´ıveis atendendo os crit´erios seguintes:
Uso do comando final else complementando a configura¸c˜ao em cascata
Uso de comandos avulsos if-then e else dentro de uma configura¸c˜ao em cascata
A configura¸c˜ao em cascata sugere a resolu¸c˜ao de problemas nos quais o programador
dever´a cobrir uma listas de poss´ıveis condi¸c˜oes exclusivas entre si, bem determinadas
ou n˜ao. Neste sentido, o uso do comando final else cobre as condi¸c˜oes indeterminadas,
estendendo o conceito j´a apresentado para configura¸c˜oes mais simples.
61
O uso de comandos comandos avulsos if-then e else tem o objetivo de indicar ao
aluno a possibilidade de inclus˜ao destes comandos dentro da configura¸c˜ao proposta na
´arvore tal como quaisquer outros comandos dentro do bloco begin-end.
5.6 ´Arvore 6
A sexta ´arvore encerra o cap´ıtulo de comandos de decis˜ao com a apresenta¸c˜ao de estruturas
case. Estas estruturas estendem e simplificam a experiˆencia adquirida com comandos if.
A sua fundamenta¸c˜ao ocorre sobre trˆes caracter´ısticas remov´ıveis: presen¸ca de intervalos;
presen¸ca de else; presen¸ca de blocos de comandos. ´Arvore de profundidade 3.
5.6.1 Caracter´ısticas remov´ıveis
C1. presen¸ca de bloco, begin-end, de comandos.
C2. presen¸ca de cl´ausula else
C3. presen¸ca de intervalos
5.6.2 Numera¸c˜ao dos exemplos
C1 C2 C3 Exemplo
• • • 6 (subse¸c˜ao 5.6.3.1)
• • – 6.1 (subse¸c˜ao 5.6.3.2)
• – • 6.2 (subse¸c˜ao 5.6.3.3)
– • • 6.3 (subse¸c˜ao 5.6.3.4)
• – – 6.1.2, 6.2.2 (subse¸c˜ao 5.6.3.6)
– • – 6.1.3, 6.3.2 (subse¸c˜ao 5.6.3.7)
– – • 6.2.3 (subse¸c˜ao 5.6.3.8)
– – – 6.1.1, 6.2.1, 6.3.1 (subse¸c˜ao 5.6.3.5)
5.6.3 Enunciados e programas
5.6.3.1 Exemplo 6
Enunciado Uma agˆencia de consultoria financeira classifica os pa´ıses em uma escala de
1 a 5. Pa´ıses nos n´ıveis 1 e 2 s˜ao ruins para se investir. Pa´ıses no n´ıvel 3 s˜ao razo´aveis
para se investir. Pa´ıses no n´ıvel 4 s˜ao bons para se investir, e pa´ıses no n´ıvel 5 s˜ao os
melhores.
Escreva um programa que pergunta o nome de um pa´ıs e o seu n´ıvel no ranking da
agˆencia. Se o pa´ıs for n´ıvel 1 ou 2, imprima a mensagem:
’nome do pais  e ruim para investir ’
62
Se o pa´ıs estiver no n´ıvel 3, imprima a mensagem:
’nome do pais  e razoavel para investir ’
e, depois, a mensagem:
’Ha paises melhores ’
Se o pa´ıs for n´ıvel 4, imprima a mensagem:
’nome do pais  e bom para investir ’
Se o pa´ıs estiver no n´ıvel 5, imprima a mensagem:
’nome do pais  e otimo para investir ’
seguida de
’Recomendamos investir nele ’
Caso o n´ıvel n˜ao seja nenhum desses, imprima a mensagem:
’Nivel invalido ’
Solu¸c˜ao A solu¸c˜ao usada foi a seguinte
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.
5.6.3.2 Exemplo 6.1
Enunciado Outra agˆencia de consultoria financeira classifica os pa´ıses em uma escala
de 1 a 5. Um pa´ıs no n´ıvel 1 ´e um p´essimo lugar para se investir. Pa´ıses no n´ıvel 2 s˜ao
locais ruins para se investir. Pa´ıses no n´ıvel 3 s˜ao medianos, razo´aveis para se investir.
Qualquer pa´ıs 4 j´a ´e bom para se investir, e se estiver no n´ıvel 5, o pa´ıs ´e ´otimo.
Escreva um programa que pergunta o nome de um pa´ıs e o seu n´ıvel no ranking da
agˆencia. Se o pa´ıs for n´ıvel 1, imprima a mensagem:
’nome do pais  e pessimo para investir ’
Se o pa´ıs estiver no n´ıvel entre 2, imprima a mensagem:
’nome do pais  e ruim para investir ’
e, depois, a mensagem:
Recomendamos nao investir nele
Se o pa´ıs for n´ıvel 3, imprima a mensagem:
’nome do pais  e razoavel para investir ’
seguida da mensagem:
Recomendamos investir em paises de nivel 4
Se o pa´ıs estiver no n´ıvel 4, imprima a mensagem:
’nome do pais  e bom para investir ’
Se o pa´ıs estiver for n´ıvel 5, imprima a mensagem:
’nome do pais  e otimo para investir ’
Caso o n´ıvel n˜ao seja nenhum desses, imprima a mensagem:
’Nivel invalido ’
64
Solu¸c˜ao A solu¸c˜ao 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.
5.6.3.3 Exemplo 6.2
Enunciado Uma agˆencia de consultoria financeira classifica os pa´ıses em uma escala de
1 a 5. Pa´ıses nos n´ıveis 1 e 2 s˜ao ruins para se investir. Pa´ıses no n´ıvel 3 s˜ao razo´aveis
para se investir. Pa´ıses no n´ıvel 4 s˜ao bons para se investir, e pa´ıses no n´ıvel 5 s˜ao os
melhores, e s˜ao geralmente um ou dois.
Escreva um programa que pergunta o nome de um pa´ıs e o seu n´ıvel no ranking da
agˆencia. Se o pa´ıs for n´ıvel 1 ou 2, imprima a mensagem:
’nome do pais  e ruim para investir ’
Se o pa´ıs estiver no n´ıvel 3, imprima a mensagem:
’nome do pais  e razoavel para investir ’
65
e, depois, a mensagem:
’Ha paises melhores ’
Se o pa´ıs for n´ıvel 4, imprima a mensagem:
’nome do pais  e bom para investir ’
Se o pa´ıs estiver no n´ıvel 5, imprima a mensagem:
’nome do pais  e otimo para investir ’
seguida de
’Recomendamos investir nele ’
Caso o n´ıvel n˜ao seja nenhum desses, n˜ao imprima nada.
Solu¸c˜ao A solu¸c˜ao usada foi a seguinte
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ˆencia de consultoria financeira classifica os pa´ıses em uma escala de
1 a 5. Pa´ıses nos n´ıveis 1 e 2 s˜ao ruins para se investir. Pa´ıses no n´ıvel 3 s˜ao razo´aveis
para se investir. Pa´ıses no n´ıvel 4 s˜ao bons para se investir, e pa´ıses no n´ıvel 5 s˜ao os
melhores, e s˜ao geralmente um ou dois.
Escreva um programa que pergunta o nome de um pa´ıs e o seu n´ıvel no ranking da
agˆencia. Se o pa´ıs for n´ıvel 1 ou 2, imprima a mensagem:
’nome do pais  e ruim para investir ’
Se o pa´ıs estiver no n´ıvel 3, imprima a mensagem:
’nome do pais  e razoavel para investir ’
Se o pa´ıs for n´ıvel 4, imprima a mensagem:
’nome do pais  e bom para investir ’
Se o pa´ıs estiver no n´ıvel 5, imprima a mensagem:
’nome do pais  e otimo para investir ’
Caso o n´ıvel n˜ao seja nenhum desses, imprima a mensagem:
’Nivel invalido ’
Solu¸c˜ao A solu¸c˜ao usada foi a seguinte
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ˆencia de consultoria financeira classifica os pa´ıses em uma escala
de 1 a 5. Um pa´ıs no n´ıvel 1 ´e um p´essimo lugar para se investir. Pa´ıses no n´ıvel 2 s˜ao
locais ruins para se investir. Pa´ıses no n´ıvel 3 s˜ao medianos, razo´aveis para se investir.
Qualquer pa´ıs 4 j´a ´e bom para se investir, e se estiver no n´ıvel 5, o pa´ıs ´e ´otimo.
Escreva um programa que pergunta o nome de um pa´ıs e o seu n´ıvel no ranking da
agˆencia. Se o pa´ıs for n´ıvel 1, imprima a mensagem:
’nome do pais  e pessimo para investir ’
Se o pa´ıs estiver no n´ıvel entre 2, imprima a mensagem:
’nome do pais  e ruim para investir ’
Se o pa´ıs for n´ıvel 3, imprima a mensagem:
’nome do pais  e razoavel para investir ’
Se o pa´ıs estiver no n´ıvel 4, imprima a mensagem:
’nome do pais  e bom para investir ’
Se o pa´ıs estiver for n´ıvel 5, imprima a mensagem:
’nome do pais  e otimo para investir ’
Caso o n´ıvel n˜ao seja nenhum desses, n˜ao imprima nada.
Solu¸c˜ao A solu¸c˜ao usada foi a seguinte
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.
5.6.3.6 Exemplos 6.1.2 e 6.2.2
Enunciado Outra agˆencia de consultoria financeira classifica os pa´ıses em uma escala
de 1 a 5. Um pa´ıs no n´ıvel 1 ´e um p´essimo lugar para se investir. Pa´ıses no n´ıvel 2 s˜ao
locais ruins para se investir. Pa´ıses no n´ıvel 3 s˜ao medianos, razo´aveis para se investir.
Qualquer pa´ıs 4 j´a ´e bom para se investir, e se estiver no n´ıvel 5, o pa´ıs ´e ´otimo.
Escreva um programa que pergunta o nome de um pa´ıs e o seu n´ıvel no ranking da
agˆencia. Se o pa´ıs for n´ıvel 1, imprima a mensagem:
’nome do pais  e pessimo para investir ’
Se o pa´ıs estiver no n´ıvel entre 2, imprima a mensagem:
’nome do pais  e ruim para investir ’
e, depois, a mensagem:
Recomendamos nao investir nele
Se o pa´ıs for n´ıvel 3, imprima a mensagem:
’nome do pais  e razoavel para investir ’
Se o pa´ıs estiver no n´ıvel 4, imprima a mensagem:
’nome do pais  e bom para investir ’
seguida da mensagem:
Recomendamos investir em paises de nivel 4
Se o pa´ıs for n´ıvel 5, imprima a mensagem:
’nome do pais  e otimo para investir ’
Caso o n´ıvel n˜ao seja nenhum desses, n˜ao imprima nada.
69
Solu¸c˜ao A solu¸c˜ao 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.
5.6.3.7 Exemplos 6.1.3 e 6.3.2
Enunciado Outra agˆencia de consultoria financeira classifica os pa´ıses em uma escala
de 1 a 5. Um pa´ıs no n´ıvel 1 ´e um p´essimo lugar para se investir. Pa´ıses no n´ıvel 2 s˜ao
locais ruins para se investir. Pa´ıses no n´ıvel 3 s˜ao medianos, razo´aveis para se investir.
Qualquer pa´ıs 4 j´a ´e bom para se investir, e se estiver no n´ıvel 5, o pa´ıs ´e ´otimo.
Escreva um programa que pergunta o nome de um pa´ıs e o seu n´ıvel no ranking da
agˆencia. Se o pa´ıs for n´ıvel 1, imprima a mensagem:
’nome do pais  e pessimo para investir ’
Se o pa´ıs estiver no n´ıvel entre 2, imprima a mensagem:
’nome do pais  e ruim para investir ’
Se o pa´ıs for n´ıvel 3, imprima a mensagem:
70
’nome do pais  e razoavel para investir ’
Se o pa´ıs estiver no n´ıvel 4, imprima a mensagem:
’nome do pais  e bom para investir ’
Se o pa´ıs estiver for n´ıvel 5, imprima a mensagem:
’nome do pais  e otimo para investir ’
Caso o n´ıvel n˜ao seja nenhum desses, imprima a mensagem:
’Nivel invalido ’
Solu¸c˜ao A solu¸c˜ao usada foi a seguinte
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ˆencia de consultoria financeira classifica os pa´ıses em uma escala de
1 a 5. Pa´ıses nos n´ıveis 1 e 2 s˜ao ruins para se investir. Pa´ıses no n´ıvel 3 s˜ao razo´aveis
para se investir. Pa´ıses no n´ıvel 4 s˜ao bons para se investir, e pa´ıses no n´ıvel 5 s˜ao os
melhores, e s˜ao geralmente um ou dois.
Escreva um programa que pergunta o nome de um pa´ıs e o seu n´ıvel no ranking da
agˆencia. Se o pa´ıs for n´ıvel 1 ou 2, imprima a mensagem:
’nome do pais  e pessimo para investir ’
Se o pa´ıs estiver no n´ıvel 3, imprima a mensagem:
’nome do pais  e razoavel para investir ’
Se o pa´ıs for n´ıvel 4, imprima a mensagem:
’nome do pais  e bom para investir ’
Se o pa´ıs estiver no n´ıvel 5, imprima a mensagem:
’nome do pais  e otimo para investir ’
Caso o n´ıvel n˜ao seja nenhum desses, n˜ao imprima nada.
Solu¸c˜ao A solu¸c˜ao usada foi a seguinte
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´arios
As ´arvores de 1 a 5 apresentaram o uso do comando if. Elas foram concebidas por
agrupamentos de caracter´ısticas afins cujo crit´erio para afinidade e sele¸c˜ao atendem a
determinadas premissas did´aticas.
No entanto, ainda restava-nos definir uma configura¸c˜ao que represente os comandos
case. Em geral, a op¸c˜ao 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¸c˜ao de comandos if em cascata. Um valor ´e ava-
liado e o fluxo de execu¸c˜ao do programa ´e desviado para uma entre diversas op¸c˜oes que
corresponda aquele valor. Tal como ocorre no uso de if, a execu¸c˜ao do programa pode
ser desviada para um simples comando ou um bloco de comandos. Tamb´em contamos
com a op¸c˜ao da cl´ausula else a fim de cobrir todo o universo de possibilidades para a
vari´avel avaliada.
A sofistica¸c˜ao possibilitada por uso do comando case apresenta uma caracter´ıstica
nova: pode-se definir a execu¸c˜ao a partir de um valor ou de uma s´erie de valores que
configurem um intervalo sem o uso de operadores l´ogicos.
73
Cap´ıtulo 6
Conclus˜oes e Trabalhos Futuros
Dados os desafios do ensino de programa¸c˜ao, uma das abordagens para lidar com eles
´e o uso de softwares de aux´ılio `a aprendizagem. Um modelo de software de aux´ılio `a
aprendizagem bastante promissor s˜ao os sistemas tutoriais inteligentes, que permitem a
adapta¸c˜ao do tutorial `as necessidades do estudante. O Tutorial ICC evolui nesta dire¸c˜ao,
n˜ao tanto para se tornar um STI em todos os sentidos, mas sim para tornar-se um sistema
tutorial dotado de inteligˆencia.
Este trabalho d´a mais um passo nessa dire¸c˜ao. N´os desenvolvemos taxonomias de
exemplos que exercitam diversos aspectos da aprendizagem de programa¸c˜ao em n´ıveis de
dificuldades diferentes.
Um framework conceitual para o desenvolvimento de taxonomias ´e uma id´eia nova.
A parte pr´atica de nosso trabalho focou-se em desenvolver este framework e aplic´a-lo ao
desenvolvimento de taxonomias. Assim sendo, o resultado do nosso trabalho inclui, al´em
das taxonomias em si, um framework com uma terminologia, conceitos e procedimentos
pr´oprios, que podem auxiliar o desenvolvimento e evolu¸c˜ao de taxonomias de exemplos
hier´arquicas.
Certamente, por´em, os v´arios aspectos das taxonomias de exemplos est˜ao 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ˆencias de professores, mas
certamente h´a outras maneiras de se isolar conceitos e dificuldades relevantes.
Outro poss´ıvel objeto de trabalho futuro ´e uma avalia¸c˜ao da efic´acia do uso de taxo-
nomias de exemplos. Uma vez que se tenha uma melhor id´eia da efic´acia das taxonomias,
outro passo seria uma pesquisa no aprimoramento do framework de desenvolvimento de
taxonomias, de modo a gerar ´arvores cada vez mais eficientes.
Ademais, pesquisas para desenvolver interfaces mais adaptativas e intuitivas para as
taxonomias s˜ao tamb´em bastante interessantes. Vale lembrar que as taxonomias s˜ao
apenas um dos m´odulos do sistema, e um sistema tutorial dotado de alguma inteligˆencia
possui uma s´erie de desafios no que tange `a sua interface.
74
Referˆencias
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
Hugh L. Burns e Charles G. Capps. Foundations of Intelligent Tutoring Systems: An
introduction. In Martha C. Polson, J. Jeffrey Richardson, e Eliot Soloway, editors,
Foundations of Intelligent Tutoring Systems, pages 1—19. Lawrence Erlbaum Associa-
tes Publishers, 1988. 9, 10
Pat Byrne e Gerry Lyons. The effect of student attributes on success in programming.
ACM SIGCSE Bulletin, 33(3):49—52, 2001. 4
Stephen E. Carlson. MIT OpenCourseWare Program Evaluation Findings Report. Tech-
nical report, Massachusetts Institute of Technology (MIT), 2004. 1
Pedro Ara´ujo Chaves J´unior e Eliza Silveira Bastos. Interface orientada a estilos de
aprendizagem em um tutorial para ensino de computa¸c˜ao, dezembro 2008. Monogra-
fia apresentada como requisito parcial para conclus˜ao do Bacharelado em Ciˆencia da
Computa¸c˜ao e Licenciatura em Computa¸c˜ao 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¸c˜ao.
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¸c˜ao via
internet. In SULCOMP-I Congresso Sul Catarinense de Computa¸c˜ao, 2005. 1
75
Michel Foucault. As Palavras e as Coisas. Martins Fontes, 3 edition, 2002. No pref´acio,
Foucault se refere a um texto de Borges sobre uma “certa enciclop´edia chinesa”. 12
Reva Freedman. What is an Intelligent Tutoring System? Intelligence, (11):15—16, 2000.
8
Anabela Gomes e A. J. Mendes. Learning to program — difficulties and solutions. In
International inproceedings on Engineering Education – ICEE 2007, 2007. 1, 2, 4, 6, 7
Leo Gugerty. Non-diagnostic intelligent tutoring systems: Teaching without student mo-
dels. Instructional Science, (25):409—432, 1997. 10
Antˆonio Houaiss, Mauro de Salles Villar, e Francisco Manoel Mello Franco. Dicion´ario
Houaiss da l´ıngua portuguesa. Editora Objetiva, 2001. Verbete taxonomia. 15
Kenneth E. Iverson. Notation as a tool of thought. Communications of the ACM, 23(8):
444—465, agosto 1980. 6
Tom Jenkins. On the difficulty of learning to program. In Proceedings of 3rd LTSN-ICS
inproceedings, pages 53—58, 2003. 2, 4, 5, 6, 7
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
D. Keirsey. Please Understand Me II: Temperament, Character, Intelligence. Prometheus
Nemesis Book Company, 1998. 5
Essi Lahtinen, Kirsti Ala-Mutka, e Hannu-Matti J¨arvinen. A study of the difficulties of
novice programmers. In The 10th Annual inproceedings on Innovation and Technology
in Computer Science Education — ITiCSE’05, pages 14—18. Universidade Nova de
Lisboa, Portugal, junho 2005. 7
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
Roger Nkambou. Towards Affective Intelligent Tutoring System. In G. Rebolledo-Mendez
e Martinez-Miron E., editors, 8th International inproceedings on ITS, pages 5—12, 2006.
9
Roy D. Pea. Language-independent conceptual bugs in novice programming. Journal of
Educational Computing Research, 2(1), 1986. 6
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ˆencia para orienta¸c˜ao de alunos novatos
em uma biblioteca universit´aria: 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
John Self. Student Models in Computer-Aided Instruction. International Journal of
Man-Machine Studies, (6):261—276, mar¸co 1974. 10
James G. Spohrer e Eliot Soloway. Empirical Studies of Programmers, chapter 16 —
Analyzing the High Frequency Bugs in Novice Programs, pages 230—251. Intellect
Books, second, completely revised edition, 1986. 6
Niklaus Wirth. The Programming Language Pascal. Berichte der Fachgruppe Computer-
Wissenschaften, novembro 1972. 6
77
Apˆendice A
Taxonomias do Cap´ıtulo 2 do
Tutorial ICC
A.1 ´Arvore 1
Uso de constantes e vari´aveis de v´arios tipos e formata¸c˜ao na sa´ıda dos dados.
A.1.1 Caracter´ısticas remov´ıveis
C1. uso de constantes e vari´aveis de v´arios tipos
C2. formata¸c˜ao na sa´ıda dos dados
A.1.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 1
– – 1.1
– • 1.2
• – 1.3
A.1.3 Enunciados
A.1.3.1 Exemplo 1
Fa¸ca um programa que pe¸ca ao usu´ario 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 ´ultimo 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¸ca um programa que pe¸ca ao usu´ario 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.1.3.3 Exemplo 1.2
Fa¸ca um programa que pe¸ca ao usu´ario 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, formatando as sa´ıdas do seguinte modo: 10 caracteres para o nome, 5
para a idade e 6 para o peso, sendo este ´ultimo escrito com dois algarismos depois da
v´ırgula.
A.1.3.4 Exemplo 1.3
Fa¸ca um programa que pe¸ca ao usu´ario 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.
O programa deve colocar um t´ıtulo sobre os dados indicando nome, idade e peso.
A.2 ´Arvore 2
Uso de express˜oes aritm´eticas e uso de fun¸c˜oes.
A.2.1 Caracter´ısticas remov´ıveis
C1. uso de express˜oes aritm´eticas com v´arios operadores
C2. uso de fun¸c˜oes
A.2.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 2
– – 2.1
– • 2.2
• – 2.3
79
A.2.2.1 Exemplo 2
Fa¸ca um programa para ler dois ˆangulos (em graus) alfa e beta.
Transforme os ˆangulos para radianos e a seguir calcule os valores reais x e y dados
pelas express˜oes:
x = (cos2
(alfa) − sen2
(beta))/(2cos(alfa))
y = sen2
(alfa) − 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.
A.2.2.2 Exemplo 2.1
Fa¸ca um programa para ler dois valores reais x e y.
O programa deve imprimir os dois valores e, em seguida, deve trocar esses valores
entre si e imprim´ı-los novamente.
A.2.2.3 Exemplo 2.2
Fa¸ca um programa para ler dois ˆangulos (em graus) alfa e beta.
Transforme os ˆangulos para radianos e a seguir calcule os valores reais x e y dados
por:
x = cos(alfa)
y = sen(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.
A.2.2.4 Exemplo 2.3
Fa¸ca um programa para ler dois valores reais a e b.
O programa deve calcular os valores de x e y dados por:
x = 2a2
− b
y = 3(b2
− a)
Em seguida, deve trocar esses valores entre si e imprim´ı-los novamente.
80
Apˆendice B
Taxonomias do Cap´ıtulo 4 do
Tutorial ICC
B.1 ´Arvore 1
Comando for-do. N´umero determinado de la¸cos. Exemplo utilizado: s´erie de n´umeros
reais.
B.1.1 Caracter´ısticas remov´ıveis
C1. for¸ca c´alculo de cada termo
C2. termos tˆem sinais alternantes
B.1.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 1
– – 1.1
– • 1.2
• – 1.3
B.1.3 Enunciados
B.1.3.1 Exemplo 1
Dada a s´erie 1/2, −1/4, 1/6 − 1/8, ... fa¸ca um programa que imprima os dez primeiros
elementos da s´erie, e a seguir imprima a soma desses dez elementos.
B.1.3.2 Exemplo 1.1
Dada a s´erie 1/2, 1/4, 1/6, 1/8, ... fa¸ca um programa que imprima a soma dos dez primeiros
elementos.
81
B.1.3.3 Exemplo 1.2
Dada a s´erie 1/2, −1/4, 1/6, −1/8, ... fa¸ca um programa que imprima a soma dos dez
primeiros elementos.
B.1.3.4 Exemplo 1.3
Dada a s´erie 1/2, 1/4, 1/6, 1/8, ... fa¸ca um programa que imprima os dez primeiros ele-
mentos da s´erie, e a seguir imprima a soma desses dez elementos.
B.2 ´Arvore 2
Comando repeat-until com final do la¸co especificado nos pr´oprios dados.
B.2.1 Caracter´ısticas remov´ıveis
C1. primeiro elemento da s´erie requer tratamento diferenciado
C2. h´a um if dentro do la¸co
B.2.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 2
– – 2.1
– • 2.2
• – 2.3
B.2.3 Enunciados
B.2.3.1 Exemplo 2
Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros diferentes de zero.
O programa deve imprimir o maior e menor valor da sequˆencia.
O programa deve parar quando o valor lido for igual a zero. O zero n˜ao faz parte da
sequˆencia.
B.2.3.2 Exemplo 2.1
Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros diferentes de zero.
O programa deve imprimir o valor da soma dos elementos da sequˆencia.
O programa deve parar quando o valor lido for igual a zero. O zero n˜ao faz parte da
sequˆencia.
82
B.2.3.3 Exemplo 2.2
Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros diferentes de zero.
O programa deve imprimir o valor da soma dos elementos positivos e a soma dos
elementos negativos da sequˆencia.
O programa deve parar quando o valor lido for igual a zero. O zero n˜ao faz parte da
sequˆencia.
B.2.3.4 Exemplo 2.3
Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros diferentes de zero.
O programa deve imprimir o maior valor da sequˆencia.
O programa deve parar quando o valor lido for igual a zero. O zero n˜ao faz parte da
sequˆencia.
B.3 ´Arvore 3
Comando repeat-until com pergunta ao usu´ario para cada la¸co.
B.3.1 Caracter´ısticas remov´ıveis
C1. primeiro elemento da s´erie requer tratamento diferenciado
C2. h´a cr´ıtica de dados de entrada
B.3.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 3
– – 3.1
– • 3.2
• – 3.3
B.3.3 Enunciados
B.3.3.1 Exemplo 3
3 Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros.
O programa deve imprimir o maior e menor valor da sequˆencia.
O programa deve perguntar ao usu´ario, em cada leitura, se deseja continuar ou parar.
O usu´ario deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar.
Se o usu´ario entrar com um caractere diferente de ’s’ ou ’n’, o programa deve repetir
a pergunta.
83
B.3.3.2 Exemplo 3.1
Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros.
O programa deve imprimir o valor da soma dos elementos da sequˆencia.
O programa deve perguntar ao usu´ario, em cada leitura, se deseja continuar ou parar.
O usu´ario deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar.
B.3.3.3 Exemplo 3.2
Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros.
O programa deve imprimir o maior e menor valor da sequˆencia.
O programa deve perguntar ao usu´ario, em cada leitura, se deseja continuar ou parar.
O usu´ario deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar.
B.3.3.4 Exemplo 3.3
Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros.
O programa deve imprimir o valor da soma dos elementos da sequˆencia.
O programa deve perguntar ao usu´ario, em cada leitura, se deseja continuar ou parar.
O usu´ario deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar.
Se o usu´ario entrar com um caractere diferente de ’s’ ou ’n’, o programa deve repetir
a pergunta.
B.4 ´Arvore 4
Comando repeat-until com final do la¸co dependendo de alguma condi¸c˜ao determinada
ao longo do programa.
B.4.1 Caracter´ısticas remov´ıveis
C1. condi¸c˜ao ´e uma express˜ao booleana
C2. h´a um la¸co dentro de outro
B.4.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 4
– – 4.1
– • 4.2
• – 4.3
84
B.4.3 Enunciados
B.4.3.1 Exemplo 4
Fa¸ca um programa que escreva todos os n´umeros primos entre 1 e 100, um em cada linha.
B.4.3.2 Exemplo 4.1
fa¸ca um programa que leia um determinado valor inteiro. O programa deve evitar que o
usu´ario entre com valores n˜ao positivos.
O programa deve imprimir todos os divisores do n´umero lido.
B.4.3.3 Exemplo 4.2
Fa¸ca um programa que imprima o menor divisor diferente de 1 de todos os n´umeros entre
2 e 20.
B.4.3.4 Exemplo 4.3
Fa¸ca um programa que leia um n´umero inteiro. O programa deve evitar que o usu´ario
entre com valores negativos.
O programa deve imprimir uma mensagem dizendo se o n´umero ´e primo ou se n˜ao ´e
primo.
B.5 ´Arvore 5
Comando while-do com final do la¸co especificado nos pr´oprios dados
B.5.1 Caracter´ısticas remov´ıveis
C1. primeiro elemento exige tratamento diferenciado
C2. h´a um if dentro do la¸co
B.5.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 5
– – 5.1
– • 5.2
• – 5.3
85
B.5.3 Enunciados
B.5.3.1 Exemplo 5
Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros diferentes de zero.
O programa deve imprimir o maior e o menor valor da sequˆencia.
O programa deve parar quando o valor lido for igual a zero. O zero n˜ao faz parte da
sequˆencia.
B.5.3.2 Exemplo 5.1
Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros diferentes de zero.
O programa deve imprimir o valor da soma dos elementos da sequˆencia.
O programa deve parar quando o valor lido for igual a zero. O zero n˜ao faz parte da
sequˆencia.
B.5.3.3 Exemplo 5.2
Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros diferentes de zero.
O programa deve imprimir o valor da soma dos elementos positivos e a soma dos
elementos negativos da sequˆencia.
O programa deve parar quando o valor lido for igual a zero. O zero n˜ao faz parte da
sequˆencia.
B.5.3.4 Exemplo 5.3
Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros diferentes de zero.
O programa deve imprimir o maior valor da sequˆencia.
O programa deve parar quando o valor lido for igual a zero. O zero n˜ao faz parte da
sequˆencia.
B.6 ´Arvore 6
Comando while-do com pergunta ao usu´ario para cada la¸co
B.6.1 Caracter´ısticas remov´ıveis
C1. primeiro elemento da s´erie requer tratamento diferenciado
C2. h´a cr´ıtica de dados de entrada
86
B.6.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 6
– – 6.1
– • 6.2
• – 6.3
B.6.3 Enunciados
B.6.3.1 Exemplo 6
Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros.
O programa deve imprimir o maior e menor valor da sequˆencia.
O programa deve perguntar ao usu´ario, em cada leitura, se deseja continuar ou parar.
O usu´ario deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar.
Se o usu´ario entrar com um caractere diferente de ’s’ ou ’n’, o programa deve repetir
a pergunta.
B.6.3.2 Exemplo 6.1
Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros.
O programa deve imprimir o valor da soma dos elementos da sequˆencia.
O programa deve perguntar ao usu´ario, em cada leitura, se deseja continuar ou parar.
O usu´ario deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar.
B.6.3.3 Exemplo 6.2
Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros.
O programa deve imprimir o valor da soma dos elementos da sequˆencia.
O programa deve perguntar ao usu´ario, em cada leitura, se deseja continuar ou parar.
O usu´ario deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar.
Se o usu´ario entrar com um caractere diferente de ’s’ ou ’n’, o programa deve repetir
a pergunta.
B.6.3.4 Exemplo 6.3
Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros.
O programa deve imprimir o maior e menor valor da sequˆencia.
O programa deve perguntar ao usu´ario, em cada leitura, se deseja continuar ou parar.
O usu´ario deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar.
—————————————————————-
87
B.7 ´Arvore 7
grupo 7. Comando while-do com final do la¸co dependendo de alguma condi¸c˜ao determi-
nada ao longo do programa.
Comando while-do com pergunta ao usu´ario para cada la¸co
B.7.1 Caracter´ısticas remov´ıveis
C1. condi¸c˜ao ´e uma express˜ao booleana
C2. h´a um la¸co dentro de outro
B.7.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 7
– – 7.1
– • 7.2
• – 7.3
B.7.3 Enunciados
B.7.3.1 Exemplo 7
Fa¸ca um programa que escreva todos os n´umeros primos entre 1 e 100, um em cada linha.
B.7.3.2 Exemplo 7.1
Fa¸ca um programa que leia um determinado valor inteiro. O programa deve evitar que o
usu´ario entre com valores n˜ao positivos.
O programa deve imprimir todos os divisores do n´umero lido.
B.7.3.3 Exemplo 7.2
Fa¸ca um programa que imprima o menor divisor diferente de 1 de todos os n´umeros entre
2 e 20.
B.7.3.4 Exemplo 7.3
Fa¸ca um programa que leia um n´umero inteiro. O programa deve evitar que o usu´ario
entre com valores negativos.
O programa deve imprimir uma mensagem dizendo se o n´umero ´e primo ou se n˜ao ´e
primo.
88
Apˆendice C
Taxonomias do Cap´ıtulo 4 do
Tutorial ICC
C.1 ´Arvore 1
Apenas um arquivo de entrada (sem uso de lstinlineeoln!! e apenas vari´aveis de tipo
lstinlineinteger!!).
C.1.1 Caracter´ısticas remov´ıveis
C1. perguntar ao usu´ario o nome do arquivo a ser lido
C2. v´arias linhas no arquivo
C.1.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 1
– – 1.1
– • 1.2
• – 1.3
C.1.3 Enunciados
C.1.3.1 Exemplo 1
Fa¸ca um programa que leia um arquivo tipo text contendo, em cada linha, uma sequencia
de 5 n´umeros 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´ario o nome do arquivo a ser lido.
89
C.1.3.2 Exemplo 1.1
Fa¸ca um programa que leia um arquivo tipo text contendo uma ´unica linha com 5 n´umeros
inteiros.
O programa deve escrever na tela o valor da soma dos 5 elementos.
O nome do programa ´e dado no pr´oprio comando assign.
C.1.3.3 Exemplo 1.2
Fa¸ca um programa que leia um arquivo tipo text contendo, em cada linha, uma sequencia
de 5 n´umeros inteiros.
O programa deve escrever na tela, para cada linha do arquivo, o valor da soma dos 5
elementos correspondentes.
O nome do programa ´e dado no pr´oprio comando assign.
C.1.3.4 Exemplo 1.3
Fa¸ca um programa que leia um arquivo tipo text contendo uma ´unica linha com uma
sequencia de 5 n´umeros inteiros.
O programa deve escrever na tela o valor da soma dos 5 elementos.
O programa deve perguntar ao usu´ario o nome do arquivo a ser lido.
C.2 ´Arvore 2
Apenas um arquivo de entrada com uso de eoln e vari´aveis de v´arios tipos diferentes.
C.2.1 Caracter´ısticas remov´ıveis
C1. v´arios tipos de vari´aveis no arquivo
C2. primeira linha do arquivo requer tratamento diferenciado
C.2.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 2
– – 2.1
– • 2.2
• – 2.3
90
C.2.3 Enunciados
C.2.3.1 Exemplo 2
Fa¸ca 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 ´e 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.2.3.2 Exemplo 2.1
Fa¸ca 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 escrever na tela, em cada linha, o valor da soma das notas da linha
correspondente.
C.2.3.3 Exemplo 2.2
Fa¸ca 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 determinar qual a linha cuja soma das notas ´e a maior, entre todas
as linhas presentes no arquivo. O programa deve escrever na tela o valor dessa soma
m´axima.
C.2.3.4 Exemplo 2.3
Fa¸ca 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 escrever na tela, em cada linha, o nome da pessoa, sua idade e o
valor da soma das suas notas.
C.3 ´Arvore 3
Apenas um arquivo de sa´ıda, entrada via teclado.
C.3.1 Caracter´ısticas remov´ıveis
C1. v´arios tipos de vari´aveis no arquivo
C2. sa´ıda formatada (tabela)
91
C.3.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 3
– – 3.1
– • 3.2
• – 3.3
C.3.3 Enunciados
C.3.3.1 Exemplo 3
Fa¸ca um programa que leia via teclado, 4 linhas, cada uma delas contendo 5 campos: o
primeiro ´e um nome (string[10]), o segundo ´e uma idade (integer) e os outros trˆes s˜ao
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.3.3.2 Exemplo 3.1
Fa¸ca um programa que leia via teclado, 4 linhas, cada uma delas contendo trˆes notas
(real).
O programa deve gerar um arquivo contendo em cada linha o conjunto de dados de
cada linha de entrada.
C.3.3.3 Exemplo 3.2
Fa¸ca um programa que leia via teclado, 4 linhas, cada uma delas contendo 5 campos: o
primeiro ´e um nome (string[10]), o segundo ´e uma idade (integer) e os outros trˆes s˜ao
notas (real).
O programa deve gerar um arquivo contendo em cada linha o conjunto de dados de
cada linha de entrada.
C.3.3.4 Exemplo 3.3
Fa¸ca um programa que leia via teclado, 4 linhas, cada uma delas contendo trˆes 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 ´Arvore 4
Um arquivo de entrada e outro de sa´ıda.
92
C.4.1 Caracter´ısticas remov´ıveis
C1. com uso de eoln
C2. sa´ıda formatada (tabela)
C.4.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 4
– – 4.1
– • 4.2
• – 4.3
C.4.3 Enunciados
C.4.3.1 Exemplo 4
Fa¸ca 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.
C.4.3.2 Exemplo 4.1
Fa¸ca 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 3 notas (reais).
O programa deve gerar um arquivo contendo, em cada linha, o nome da pessoa, sua
idade e a soma de suas notas.
C.4.3.3 Exemplo 4.2
Fa¸ca 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.
C.4.3.4 Exemplo 4.3
Fa¸ca 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 3 notas (reais).
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 ´Arvore 5
Um arquivo de entrada e dois de sa´ıda.
C.5.1 Caracter´ısticas remov´ıveis
C1. com uso de eoln
C2. v´arios tipos de vari´aveis no arquivo
C.5.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 5
– – 5.1
– • 5.2
• – 5.3
C.5.3 Enunciados
C.5.3.1 Exemplo 5
Fa¸ca 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.
C.5.3.2 Exemplo 5.1
Fa¸ca um programa que leia um arquivo tipo text contendo, em cada linha, uma sequencia
de 3 notas (reais).
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.
94
C.5.3.3 Exemplo 5.2
Fa¸ca 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.
C.5.3.4 Exemplo 5.3
Fa¸ca um programa que leia um arquivo tipo text contendo, em cada linha, um nome
(string de 10 caracteres) e uma sequencia de 3 notas (reais).
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.
95
Apˆendice D
Taxonomias do Cap´ıtulo 6 do
Tutorial ICC
D.1 ´Arvore 1
Utiliza apenas um vetor de n´umeros inteiros dispostos aleatoriamente.
D.1.1 Caracter´ısticas remov´ıveis
C1. p´ara percorrimento em determinda condi¸c˜ao
C2. atua apenas sobre alguns elementos, sob determinada condi¸c˜ao
D.1.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 1
– – 1.1
– • 1.2
• – 1.3
D.1.3 Enunciados
D.1.3.1 Exemplo 1
Fa¸ca 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´e 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¸ca 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.1.3.3 Exemplo 1.2
Fa¸ca 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 a soma de todos os elementos pares presentes no vetor.
D.1.3.4 Exemplo 1.3
Fa¸ca 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 a posi¸c˜ao, dentro do vetor, do primeiro elemento par en-
contrado. Se n˜ao houver nenhum n´umero par o programa deve escrever o valor 0.
D.2 ´Arvore 2
Utiliza dois vetores de caracteres, um ordenado e outro n˜ao; o n˜ao-ordenado pode conter
elementos repetidos.
D.2.1 Caracter´ısticas remov´ıveis
C1. percorre um vetor dentro do percorrimento do outro
C2. usa o fato de um vetor estar ordenado para interromper o percorrimento
D.2.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 2
– – 2.1
– • 2.2
• – 2.3
D.2.3 Enunciados
D.2.3.1 Exemplo 2
Fa¸ca 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˜ao 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¸c˜ao desse elemento no vetor a. Se
o elemento n˜ao estiver presente no vetor a, o programa deve escrever 0.
D.2.3.2 Exemplo 2.1
Fa¸ca 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˜ao tem elementos repetidos.
O vetor b tem os elementos dispostos aleatoriamente e pode ter elementos repetidos.
O programa deve escrever na tela o n´umero de vezes que o primeiro elemento do vetor
a est´a presente no vetor b.
D.2.3.3 Exemplo 2.2
Fa¸ca 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˜ao tem elementos repetidos.
O vetor b tem os elementos dispostos aleatoriamente e pode ter elementos repetidos.
O programa deve escrever na tela qual a posi¸c˜ao da primeira ocorrˆencia, no vetor b,
do primeiro elemento do vetor a. Se primeiro elemento de a n˜ao estiver presente no vetor
b, o programa deve escrever 0.
D.2.3.4 Exemplo 2.3
Fa¸ca 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˜ao tem elementos repetidos.
O vetor b tem os elementos dispostos aleatoriamente e pode ter elementos repetidos.
O programa deve escrever uma linha para cada combina¸c˜ao de elementos dos vetores
a e b.
D.3 ´Arvore 3
Utiliza dois vetores, um de strings e outro de reais, vinculados.
D.3.1 Caracter´ısticas remov´ıveis
C1. ordena elementos
C2. vincula os dois vetores
98
D.3.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 3
– – 3.1
– • 3.2
• – 3.3
D.3.3 Enunciados
D.3.3.1 Exemplo 3
Fa¸ca 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´etica.
D.3.3.2 Exemplo 3.1
Fa¸ca 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 apenas a nota m´axima do conjunto de notas.
D.3.3.3 Exemplo 3.2
Fa¸ca 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 o nome e a nota do aluno que tiver a nota m´axima
do conjunto dado.
D.3.3.4 Exemplo 3.3
Fa¸ca 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 de todos os alunos, um por linha, em
ordem alfab´etica. Em seguida deve escrever todas as notas, na mesma linha, em ordem
decrescente.
D.4 ´Arvore 4
Utiliza uma matriz de 3 por 5 inteiros.
99
D.4.1 Caracter´ısticas remov´ıveis
C1. usa ordena¸c˜ao
C2. processa linhas de forma independente uma da outra
D.4.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 4
– – 4.1
– • 4.2
• – 4.3
D.4.3 Enunciados
D.4.3.1 Exemplo 4
Fa¸ca um programa que leia, de um arquivo, uma matriz de 3 linhas e 5 colunas, de
n´umeros 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.
D.4.3.2 Exemplo 4.1
Fa¸ca um programa que leia, de um arquivo, uma matriz de 3 linhas e 5 colunas, de
n´umeros inteiros. Cada linha do arquivo deve conter uma linha da matriz.
O programa deve determinar o valor m´aximo entre os elementos da primeira linha da
matriz.
D.4.3.3 Exemplo 4.2
Fa¸ca um programa que leia, de um arquivo, uma matriz de 3 linhas e 5 colunas, de
n´umeros inteiros. Cada linha do arquivo deve conter uma linha da matriz.
O programa deve deteminar o valor m´aximo de cada linha da matriz. O programa
deve escrever em cada linha da tela o valor m´aximo de cada linha da matriz.
D.4.3.4 Exemplo 4.3
Fa¸ca um programa que leia, de um arquivo, uma matriz de 3 linhas e 5 colunas, de
n´umeros inteiros. Cada linha do arquivo deve conter uma linha da matriz.
O programa deve alterar a ordem dos elementos da primeira linha da matriz, deixando-
os ordenados em ordem crescente.
100
O programa deve escrever a nova matriz na tela, uma linha da matriz para cada linha
da tela.
D.5 ´Arvore 5
Utiliza matriz quadrada de 5 por 5 inteiros.
D.5.1 Caracter´ısticas remov´ıveis
C1. processa elementos abaixo da diagonal principal
C2. faz troca elementos
D.5.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 5
– – 5.1
– • 5.2
• – 5.3
D.5.3 Enunciados
D.5.3.1 Exemplo 5
Fa¸ca um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de n´umeros
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.
D.5.3.2 Exemplo 5.1
Fa¸ca um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de n´umeros
inteiros. Cada linha do arquivo deve conter uma linha da matriz.
O programa deve escrever na tela o valor do maior elemento de toda a matriz.
D.5.3.3 Exemplo 5.2
Fa¸ca um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de n´umeros
inteiros. Cada linha do arquivo deve conter uma linha da matriz.
O programa deve trocar a primeira coluna da matriz com a ´ultima.
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¸ca um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de n´umeros
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 ´Arvore 6
Utiliza matriz quadrada de 5 por 5 inteiros.
D.6.1 Caracter´ısticas remov´ıveis
C1. processa apenas elementos acima da diagonal secund´aria
C2. n˜ao processa elementos da diagonal secund´aria
D.6.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 6
– – 6.1
– • 6.2
• – 6.3
D.6.3 Enunciados
D.6.3.1 Exemplo 6
Fa¸ca um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de n´umeros
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´aria da matriz.
O programa deve escrever a nova matriz na tela, uma linha da matriz para cada linha
da tela.
D.6.3.2 Exemplo 6.1
Fa¸ca um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de n´umeros
inteiros. Cada linha do arquivo deve conter uma linha da matriz. O programa deve igualar
a zero todos os elementos da diagonal principal 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¸ca um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de n´umeros
inteiros. Cada linha do arquivo deve conter uma linha da matriz.
O programa deve igualar a zero todos os elementos da diagonal secund´aria da matriz.
O programa deve escrever a nova matriz na tela, uma linha da matriz para cada linha
da tela.
D.6.3.4 Exemplo 6.3
Fa¸ca um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de n´umeros
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´aria da matriz e tamb´em os elementos da diagonal secund´aria da matriz.
O programa deve escrever a nova matriz na tela, uma linha da matriz para cada linha
da tela.
103
Apˆendice E
Taxonomias do Cap´ıtulo 7 do
Tutorial ICC
E.1 ´Arvore 1
Registro dentro de outro registro.
E.1.1 Caracter´ısticas remov´ıveis
C1. a data ´e outro registro dentro do principal
C2. primeiro elemento do conjunto requer tratamento diferenciado
E.1.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 1
– – 1.1
– • 1.2
• – 1.3
E.1.3 Enunciados
E.1.3.1 Exemplo 1
Fa¸ca um programa que leia um arquivo text contendo em cada linha: um nome (string
[10]), um dia (inteiro), um mˆes (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 ´e outro registro contendo os campos dia, mˆes
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¸ca um programa que leia um arquivo text contendo em cada linha: um nome (string
[10]), um dia (inteiro), um mˆes (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ˆes, ano e divida.
O programa deve escrever na tela o valor da somas das d´ıvidas de todas as pessoas do
conjunto.
E.1.3.3 Exemplo 1.2
Fa¸ca um programa que leia um arquivo text contendo em cada linha: um nome (string
[10]), um dia (inteiro), um mˆes (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ˆes, ano e divida.
O programa deve escrever na tela os dados da pessoa mais nova de todo o conjunto.
E.1.3.4 Exemplo 1.3
Fa¸ca um programa que leia um arquivo text contendo em cada linha: um nome (string
[10]), um dia (inteiro), um mˆes (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 ´e outro registro contendo os campos dia, mˆes
e ano.
O programa deve escrever na tela o valor da somas das d´ıvidas de todas as pessoas do
conjunto.
E.2 ´Arvore 2
Array dentro de registro.
E.2.1 Caracter´ısticas remov´ıveis
C1. a data ´e outro registro dentro do principal
C2. primeiro elemento do conjunto requer tratamento diferenciado
E.2.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 2
– – 2.1
– • 2.2
• – 2.3
105
E.2.3 Enunciados
E.2.3.1 Exemplo 2
Fa¸ca 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 ´e um array contendo cinco notas (reais).
O programa deve escrever na tela os dados da pessoa com a m´edia das notas mais
baixa.
E.2.3.2 Exemplo 2.2
Fa¸ca um programa que leia um arquivo text contendo em cada linha: um nome (string
[10]) e trˆes notas (reais).
Os dados de cada pessoa devem ser colocados em um registro com os campos nome,
nota1, nota2 e nota3.
O programa deve escrever na tela a m´edia de todas as notas de todas as pessoas.
E.2.3.3 Exemplo 2.2
Fa¸ca um programa que leia um arquivo text contendo em cada linha: um nome (string
[10]) e trˆes notas (reais).
Os dados de cada pessoa devem ser colocados em um registro com os campos nome,
nota1, nota2 e nota3.
O programa deve escrever na tela os dados da pessoa com a m´edia das notas mais
baixa.
E.2.3.4 Exemplo 2.3
Fa¸ca 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 ´e um array contendo cinco notas (reais).
O programa deve escrever na tela a m´edia de todas as notas de todas as pessoas.
E.3 ´Arvore 3
Array de registros.
E.3.1 Caracter´ısticas remov´ıveis
C1. ordena os registros
C2. tem array dentro dos records
106
E.3.2 Numera¸c˜ao dos exemplos
C1 C2 Exemplo
• • 3
– – 3.1
– • 3.2
• – 3.3
E.3.3 Enunciados
E.3.3.1 Exemplo 3
Fa¸ca 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´edia (real). O programa deve
construir um array de 10 registros desse tipo. Observe que nesse caso o arquivo n˜ao pode
ter mais de 10 linhas.
O programa deve ler os dados de cada aluno e coloc´a-lo no elemento correspondente
do array de registros, calculando e guardando tamb´em a m´edia de cada aluno.
O programa deve escrever na tela uma rela¸c˜ao dos nomes e m´edias dos alunos, em
ordem decrescente do valor da m´edia.
E.3.3.2 Exemplo 3.1
Fa¸ca um programa que leia um arquivo contendo, em cada linha, o nome de um aluno
(string[10]) e 3 notas (reais).
Os dados de cada aluno devem ser colocados um registro com os seguintes campos:
um nome (string[10]), trˆes notas: nota1, nota2, nota3 (reais) e uma m´edia (real). O
programa deve construir um array de 10 registros desse tipo. Observe que nesse caso o
arquivo n˜ao pode ter mais de 10 linhas.
O programa deve ler os dados de cada aluno e coloc´a-lo no elemento correspondente
do array de registros, calculando e guardando tamb´em a m´edia de cada aluno.
O programa deve escrever na tela a rela¸c˜ao de nomes e m´edias, na mesma ordem em
que estavam no arquivo de origem.
E.3.3.3 Exemplo 3.2
Fa¸ca 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´edia (real). O programa deve
construir um array de 10 registros desse tipo. Observe que nesse caso o arquivo n˜ao pode
ter mais de 10 linhas.
107
O programa deve ler os dados de cada aluno e coloc´a-lo no elemento correspondente
do array de registros, calculando e guardando tamb´em a m´edia de cada aluno.
O programa deve escrever na tela a rela¸c˜ao de nomes e m´edias, na mesma ordem em
que estavam no arquivo de origem.
E.3.3.4 Exemplo 3.3
Fa¸ca um programa que leia um arquivo contendo, em cada linha, o nome de um aluno
(string[10]) e 3 notas (reais).
Os dados de cada aluno devem ser colocados um registro com os seguintes campos:
um nome (string[10]), trˆes notas: nota1, nota2, nota3 (reais) e uma m´edia (real). O
programa deve construir um array de 10 registros desse tipo. Observe que nesse caso o
arquivo n˜ao pode ter mais de 10 linhas.
O programa deve ler os dados de cada aluno e coloc´a-lo no elemento correspondente
do array de registros, calculando e guardando tamb´em a m´edia de cada aluno.
O programa deve escrever na tela uma rela¸c˜ao dos nomes e m´edias dos alunos, em
ordem decrescente do valor da m´edia.
108

Taxonomias

  • 1.
    Universidade de Bras´ılia Institutode Ciˆencias Exatas Departamento de Ciˆencia da Computa¸c˜ao Taxonomias de Exemplos para Aprendizagem de Programa¸c˜ao Adam Victor Nazareth Brandizzi Yuri Moreira de Nu˜nez Monografia apresentada como requisito parcial para conclus˜ao do Curso de Computa¸c˜ao — Licenciatura Orientador Prof. Dr. Homero Luiz P´ıccolo Bras´ılia 2009
  • 2.
    Universidade de Bras´ılia— UnB Instituto de Ciˆencias Exatas Departamento de Ciˆencia da Computa¸c˜ao Curso de Computa¸c˜ao — Licenciatura Coordenador: Prof. Dr. Fl´avio Leonardo Cavalcanti de Moura Banca examinadora composta por: Prof. Dr. Homero Luiz P´ıccolo (Orientador) — CIC/UnB Prof. Dr. Maria de F´atima R. Brand˜ao — CIC/UnB Prof. Dr. Carla Cavalcante Koike — CIC/UnB CIP — Cataloga¸c˜ao Internacional na Publica¸c˜ao Brandizzi, Adam Victor Nazareth. Taxonomias de Exemplos para Aprendizagem de Programa¸c˜ao / Adam Victor Nazareth Brandizzi, Yuri Moreira de Nu˜nez. Bras´ılia : UnB, 2009. 121 p. : il. ; 29,5 cm. Monografia (Gradua¸c˜ao) — Universidade de Bras´ılia, Bras´ılia, 2009. 1. Exemplos, 2. Problemas, 3. Programa¸c˜ao de Computador, 4. Ensino de Programa¸c˜ao, 5. Sistemas Tutoriais Inteligentes, 6. Sistemas Tutorias Baseados na Web, 7. Taxonomia de Exemplos, 8. Tutorias CDU 004 Endere¸co: Universidade de Bras´ılia Campus Universit´ario Darcy Ribeiro — Asa Norte CEP 70910-900 Bras´ılia–DF — Brasil
  • 3.
    Universidade de Bras´ılia Institutode Ciˆencias Exatas Departamento de Ciˆencia da Computa¸c˜ao Taxonomias de Exemplos para Aprendizagem de Programa¸c˜ao Adam Victor Nazareth Brandizzi Yuri Moreira de Nu˜nez Monografia apresentada como requisito parcial para conclus˜ao do Curso de Computa¸c˜ao — Licenciatura Prof. Dr. Homero Luiz P´ıccolo (Orientador) CIC/UnB Prof. Dr. Maria de F´atima R. Brand˜ao Prof. Dr. Carla Cavalcante Koike CIC/UnB CIC/UnB Prof. Dr. Fl´avio Leonardo Cavalcanti de Moura Coordenador do Curso de Computa¸c˜ao — Licenciatura Bras´ılia, 30 de junho de 2009
  • 4.
    Agradecimentos Agrade¸co, acima detudo, a meus saudosos pais, que me deram a melhor educa¸c˜ao poss´ıvel; a meus tios Nataniel e Ana, que me apoiaram nos momentos dif´ıceis; a minhas irm˜as, que sempre me apoiaram, e a Juliana Vilela, que esteve ao meu lado durante grande parte do curso. Agrade¸co `a Universidade de Bras´ılia, pelo ensino de alta qualidade; aos professores do departamento, pelo conhecimento, t´ecnico ou n˜ao, transmitido e pela compreens˜ao e apoio. Agrade¸co especialmente ao professor Homero, pela orienta¸c˜ao s´abia, dedicada e paciente. Por fim, agrade¸co a todos os companheiros universit´arios que me apoiaram, especialmente ao amigo Pedro, que muito me ajudou no come¸co do curso, e ao parceiro de projeto Yuri, cujo trabalho foi indispens´avel. A todos citados, e aos que n˜ao pude citar, muito obrigado. Adam Victor Nazareth Brandizzi Agrade¸co ao professor orientador, Homero, e parceiro de projeto, Adam, pela paciˆencia e esmero. Agrade¸co especialmente `as mulheres da minha vida - minha m˜ae, minha esposa, minha irm˜a e minha av´o - que contribuiram a cada tempo com amor e compreens˜ao. Agrade¸co, enfim, a todos os amigos que aguardavam ansiosos por este feliz desfecho. Yuri Moreira de Nu˜nez iv
  • 5.
    Resumo Estudantes possuem diferentesritmos de aprendizado. Para satisfazer suas diferentes necessidades, s˜ao necess´arios materiais did´aticos em diferentes n´ıveis de complexidade. Nesse trabalho, propomos um conjunto de exemplos de programa¸c˜ao com v´arios n´ıveis de complexidade para alunos que estejam aprendendo a programar computadores. Esse conjunto de exemplos ser´a integrado ao Tutorial ICC, um sistema de aprendizagem auxi- liado por computador. Este ´e mais um passo para acrescentar adaptabilidade ao Tutorial ICC, aproximando-o dos sistemas tutoriais inteligentes. Palavras-chave: Exemplos, Problemas, Programa¸c˜ao de Computador, Ensino de Pro- grama¸c˜ao, Sistemas Tutoriais Inteligentes, Sistemas Tutorias Baseados na Web, Taxono- mia de Exemplos, Tutorias v
  • 6.
    Abstract Students have differentlearning 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. Keywords: Computer Programming, Examples, Examples Taxonomy, Intelligent Tutor- ing Systems, Problems, Programming Teaching, Tutorials, Web-based Tutoring Systems vi
  • 7.
    Sum´ario 1 Introdu¸c˜ao 1 1.1Problemas e Justificativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.2 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.3 Metodologia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.4 Resultados esperados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2 O Ensino de Programa¸c˜ao 4 2.1 A dificuldade de ensinar a programar . . . . . . . . . . . . . . . . . . . . . 4 2.2 Fatores cognitivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.3 Fatores pedag´ogicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.4 Proposta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 3 Sistemas Tutoriais Inteligentes 8 3.1 Arquitetura de um sistema tutorial inteligente . . . . . . . . . . . . . . . . 8 3.2 Categorias de sistemas tutoriais inteligentes . . . . . . . . . . . . . . . . . 10 3.3 Vantagem dos sistemas tutoriais inteligentes . . . . . . . . . . . . . . . . . 14 3.4 O papel do trabalho corrente . . . . . . . . . . . . . . . . . . . . . . . . . . 14 4 Taxonomias de Exemplos 15 4.1 Taxonomia hier´arquica de exemplos . . . . . . . . . . . . . . . . . . . . . . 15 4.2 Enunciados e solu¸c˜oes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 4.3 “Tira-teima” e roteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 4.4 Localiza¸c˜ao na taxonomia . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 4.5 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 5 Exemplos de Taxonomias 23 5.1 ´Arvore 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 5.1.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 23 5.1.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 24 5.1.3 Enunciados e programas . . . . . . . . . . . . . . . . . . . . . . . . 24 5.1.4 Coment´arios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 5.2 ´Arvore 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 5.2.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 28 5.2.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 28 vii
  • 8.
    5.2.3 Enunciados eprogramas . . . . . . . . . . . . . . . . . . . . . . . . 28 5.2.4 Coment´arios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 5.3 ´Arvore 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 5.3.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 34 5.3.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 34 5.3.3 Enunciados e programas . . . . . . . . . . . . . . . . . . . . . . . . 34 5.3.4 Coment´arios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 5.4 ´Arvore 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 5.4.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 42 5.4.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 42 5.4.3 Enunciados e programas . . . . . . . . . . . . . . . . . . . . . . . . 42 5.4.4 Coment´arios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 5.5 ´Arvore 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 5.5.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 49 5.5.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 49 5.5.3 Enunciados e programas . . . . . . . . . . . . . . . . . . . . . . . . 49 5.5.4 Coment´arios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 5.6 ´Arvore 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 5.6.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 62 5.6.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 62 5.6.3 Enunciados e programas . . . . . . . . . . . . . . . . . . . . . . . . 62 5.6.4 Coment´arios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 6 Conclus˜oes e Trabalhos Futuros 74 Referˆencias 75 A Taxonomias do Cap´ıtulo 2 do Tutorial ICC 78 A.1 ´Arvore 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 A.1.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 78 A.1.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 78 A.1.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 A.2 ´Arvore 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 A.2.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 79 A.2.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 79 B Taxonomias do Cap´ıtulo 4 do Tutorial ICC 81 B.1 ´Arvore 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 B.1.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 81 B.1.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 81 B.1.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 B.2 ´Arvore 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 B.2.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 82 B.2.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 82 viii
  • 9.
    B.2.3 Enunciados .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 B.3 ´Arvore 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 B.3.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 83 B.3.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 83 B.3.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 B.4 ´Arvore 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 B.4.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 84 B.4.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 84 B.4.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 B.5 ´Arvore 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 B.5.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 85 B.5.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 85 B.5.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 B.6 ´Arvore 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 B.6.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 86 B.6.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 87 B.6.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 B.7 ´Arvore 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 B.7.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 88 B.7.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 88 B.7.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 C Taxonomias do Cap´ıtulo 4 do Tutorial ICC 89 C.1 ´Arvore 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 C.1.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 89 C.1.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 89 C.1.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 C.2 ´Arvore 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 C.2.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 90 C.2.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 90 C.2.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 C.3 ´Arvore 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 C.3.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 91 C.3.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 92 C.3.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 C.4 ´Arvore 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 C.4.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 93 C.4.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 93 C.4.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 C.5 ´Arvore 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 C.5.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 94 C.5.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 94 C.5.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 ix
  • 10.
    D Taxonomias doCap´ıtulo 6 do Tutorial ICC 96 D.1 ´Arvore 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 D.1.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 96 D.1.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 96 D.1.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 D.2 ´Arvore 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 D.2.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 97 D.2.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 97 D.2.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 D.3 ´Arvore 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 D.3.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 98 D.3.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 99 D.3.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 D.4 ´Arvore 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 D.4.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 100 D.4.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 100 D.4.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 D.5 ´Arvore 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 D.5.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 101 D.5.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 101 D.5.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 D.6 ´Arvore 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 D.6.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 102 D.6.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 102 D.6.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 E Taxonomias do Cap´ıtulo 7 do Tutorial ICC 104 E.1 ´Arvore 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 E.1.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 104 E.1.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 104 E.1.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 E.2 ´Arvore 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 E.2.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 105 E.2.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 105 E.2.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 E.3 ´Arvore 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 E.3.1 Caracter´ısticas remov´ıveis . . . . . . . . . . . . . . . . . . . . . . . 106 E.3.2 Numera¸c˜ao dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 107 E.3.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 x
  • 11.
    Lista de Tabelas 3.1Categorias de STIs, segundo Murray (1999) . . . . . . . . . . . . . . . . . 13 xi
  • 12.
    Lista de Figuras 3.1Componentes de um STI, segundo Beck et al. (1996) . . . . . . . . . . . . 10 4.1 Representa¸c˜ao de taxonomia com duas caracter´ısticas remov´ıveis . . . . . . 16 4.2 Representa¸c˜ao de taxonomia com trˆes caracter´ısticas remov´ıveis . . . . . . 16 4.3 Representa¸c˜ao de taxonomia sem n´o sem caracter´ısticas . . . . . . . . . . . 17 4.4 Representa¸c˜ao de uma taxonomia n˜ao-ortogonal . . . . . . . . . . . . . . . 18 4.5 Screenshot da applet Java executando um “tira-teima” . . . . . . . . . . . 19 4.6 Exemplo de roteiro de “tira-teima” . . . . . . . . . . . . . . . . . . . . . . 20 4.7 Representa¸c˜ao da localiza¸c˜ao do aluno na taxonomia . . . . . . . . . . . . 21 xii
  • 13.
    Siglas e Acrˆonimos ACMAssociation of Computing Machinery AIS Association for Information Systems CALS computer-assisted learning1 CALS computer-assisted learning system EaD educa¸c˜ao a distˆancia2 HTML Hypertext Markup Language HTTP Hypertext Transfer Protocol IEEE Institute of Electrical and Electronics Engineers IEEE-CS IEEE Computer Society ICC Introdu¸c˜ao `a Ciˆencia da Computa¸c˜ao ITS intelligent tutoring system SAAC sistema de aprendizagem auxiliada por computador STBW sistema tutorial baseado em Web STI sistema tutorial inteligente UnB Universidade de Bras´ılia 1 Tamb´em ´e comum a forma, para efeitos gerais equivalente nesta monografia, computer-aideld learning. 2 Tamb´em ´e comum a forma, para efeitos gerais equivalente nesta monografia, ensino a distˆancia. xiii
  • 14.
    Cap´ıtulo 1 Introdu¸c˜ao A programa¸c˜ao´e comumente reconhecida como uma habilidade dif´ıcil de se aprender e, portanto, de se ensinar (Gomes e Mendes, 2007). Al´em desse problema, a procura por forma¸c˜ao em Ciˆencia da Computa¸c˜ao, Engenharia de Software e outros cursos que exigem conhecimento de programa¸c˜ao como base cresceu bastante a partir dos anos 90 (ACM, 2005, p. 10). Uma poss´ıvel solu¸c˜ao para o grande aumento da demanda dos cursos de programa¸c˜ao ´e o uso dos chamados sistemas tutoriais baseados em Web (STBW), que tˆem mostrado bons resultados quando complementado por canais pelos quais alunos e professores podem se comunicar e esclarecer d´uvidas (Brusilovsky et al., 1998, p. 2). A vantagem dos cursos baseados na Web para o problema de forma¸c˜ao em maior escala ´e que esses cursos podem ser acessados de qualquer lugar por uma grande quantidade de alunos. Al´em disso, cursos baseados em Web permitem que os estudantes aprendam os pontos b´asicos de seus cursos sem exigir acompanhamento constante do professor, que pode se concentrar nas d´uvidas mais complicadas e nos alunos com mais dificuldades, desde que o material on-line possa se adaptar aos estudantes e seus backgrounds (Brusilovsky et al., 1998, p. 2). V´arios experimentos j´a foram ou est˜ao sendo feitos para avaliar a viabilidade do uso de cursos baseados na Web para o ensino de programa¸c˜ao, como, por exemplo, Chen (2005), Ferrandin e Stephani (2005), Carlson (2004) e dos Santos e Costa (2005). Esse presente trabalho pretende evoluir um sistema em funcionamento. Esse sistema ´e chamado Tutorial ICC e ´e utilizado no ensino de programa¸c˜ao para as turmas de Introdu¸c˜ao `a Ciˆencia da Computa¸c˜ao da Universidade de Bras´ılia. Mais especificamente, nossa abordagem ser´a acrescentar alguma flexibilidade ao tu- torial. Nosso planejamento inicial ´e tornar Tutorial ICC n˜ao exatamente um sistema tutorial inteligente (STI) no sentido estrito, mas tentar aplicar os conceitos inerentes a esse tipo de sistema de uma maneira b´asica. Em especial, nosso foco ser´a oferecer um sistema de exemplos alternativos ao estudante. Essa ´e uma decis˜ao promissora porque j´a foi obtido sucesso consider´avel com essa abordagem no ensino do uso de bibliotecas na pr´opria Universidade de Bras´ılia (P´ıccolo, 2006). 1
  • 15.
    1.1 Problemas eJustificativa Embora programa¸c˜ao seja uma das atividades fundamentais na Ciˆencia da Computa¸c˜ao, 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¸c˜ao tˆem crescido bastante (ACM, 2005). Desse modo, ´e de grande interesse que se consigam ferramentas educacionais que auxiliem os estudantes no processo de ensino-aprendizagem de programa¸c˜ao. Tamb´em tem crescido o interesse em ferramentas que auxiliem o professor a ministrar cursos de programa¸c˜ao a um n´umero crescente de alunos; em outras palavras, ´e necess´ario criar ferramentas que acrescentem escalabilidade aos cursos de programa¸c˜ao. Tem-se tentado satisfazer a necessidade de escalabilidade no ensino de programa¸c˜ao atrav´es 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˜ao contaria com o apoio constante de um professor. Uma poss´ıvel solu¸c˜ao para o problema da dificuldade de aprendizagem atrav´es de STBWs ´e permitir que tais tutoriais se adaptem ao ritmo e necessidade dos estudantes. Isso ´e poss´ıvel, atrav´es do uso de STIs. O Tutorial ICC ´e, desde j´a, um STBW que evolui aos poucos para um STI. Este trabalho d´a mais um passo nessa dire¸c˜ao, a saber, fornecer exemplos que possam ser utilizados em um STI. 1.2 Objetivos O objetivo geral deste trabalho ´e desenvolver um conjunto de taxonomias hier´arquicas de exemplos para o ensino de programa¸c˜ao para os alunos da disciplina Introdu¸c˜ao `a Ciˆencia da Computa¸c˜ao (ICC). Os objetivos espec´ıficos deste trabalho, por sua vez, s˜ao: 1. identificar conceitos e habilidades que estudantes de programa¸c˜ao podem ter difi- culdade de apreender; 2. desenvolver exemplos, enunciados, programas e representa¸c˜oes gr´aficas da execu¸c˜ao de programas que exercitem os conceitos e habilidades identificados. 3. desenvolver uma representa¸c˜ao gr´afica das taxonomias hier´arquicas, para auxiliar o aluno a se localizar em uma determinada taxonomia. 1.3 Metodologia Propusemos e implementamos uma s´erie de taxonomias de exemplos organizada hierarqui- camente em n´ıveis de dificuldade. Essa taxonomia foi influenciada tamb´em por pesquisas publicadas, mas em sua maior parte ´e a aplica¸c˜ao do conhecimento emp´ırico e longa 2
  • 16.
    experiˆencia de professoresde programa¸c˜ao da Universidade de Bras´ılia (UnB). H´a uma taxonomia para cada cap´ıtulo atual do Tutorial ICC, exceto o primeiro e o ´ultimo (oitavo). Para desenvolver uma taxonomia, identificamos os conceitos e habilidades que estu- dantes de programa¸c˜ao podem ter dificuldade de apreender em um determinado cap´ıtulo. Concebemos, ent˜ao, problemas que exercitem cada um dos conjuntos de conceitos pro- postos. Para cada um desses problemas, desenvolvemos vers˜oes simplificadas de modo a criar ´arvores de problemas em que cada problema exercita um subconjunto dos conjuntos de conceitos. Escrevemos, ent˜ao, 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¸c˜oes para os enunciados, em Pascal. Criamos tamb´em scripts que, aliados com uma applet em Java j´a desenvolvida, permitem representar graficamente a execu¸c˜ao dos programas escritos. Por fim, integramos os enunciados, os programas e os scripts gerados para cada cap´ıtulo ao Tutorial ICC. Tamb´em desenvolvemos e implantamos uma representa¸c˜ao gr´afica das taxonomias hier´arquicas, para auxiliar o aluno a se localizar em uma de- terminada taxonomia. 1.4 Resultados esperados Ao final deste trabalho, temos uma taxonomia de exemplos implementada para os cap´ıtulos 2, 3, 4, 5, 6 e 7 do Tutorial ICC. Essas taxonomias s˜ao um primeiro passo para trabalhos futuros que envolvam a flexibiliza¸c˜ao e automatiza¸c˜ao da interface do Tutorial ICC em prol de torn´a-lo cada vez mais dotado de inteligˆencia. 3
  • 17.
    Cap´ıtulo 2 O Ensinode Programa¸c˜ao Embora programa¸c˜ao seja uma das atividades fundamentais na Ciˆencia da Computa¸c˜ao, muitos estudantes tˆem grande dificuldade para aprender a programar (Jenkins, 2003; Gomes e Mendes, 2007). Desse modo, ´e de grande interesse conseguir ferramentas educa- cionais que auxiliem no processo de ensino-aprendizagem de programa¸c˜ao. Neste cap´ıtulo, apresentaremos algumas das quest˜oes e dificuldades sobre ensinar a programar. 2.1 A dificuldade de ensinar a programar Aprender e ensinar a programar s˜ao tarefas dif´ıceis. Grande n´umero de estudantes de Computa¸c˜ao consideram muito dif´ıcil aprender programa¸c˜ao, mesmo em etapas avan¸cadas do curso. Essa ´e uma situa¸c˜ao preocupante para o ensino de Computa¸c˜ao: programa¸c˜ao ´e um componente b´asico, ou mesmo uma ferramenta indispens´avel para se compreender v´arias ´areas da disciplina. O ensino de programa¸c˜ao ´e objeto de diversos estudos que buscam reduzir essa dificuldade, mas h´a poucas evidˆencias de que se tenham conseguido avan¸cos significativos na aprendizagem (Jenkins, 2003). V´arias raz˜oes foram apontadas para essas dificuldades. Por vezes, afirma-se que o problema n˜ao ´e que aprender a programar seja dif´ıcil em si, mas sim que certos alunos tˆem dificuldades, por n˜ao terem algumas habilidades necess´arias para programar bem desenvolvidas, como habilidades matem´aticas ou para solu¸c˜ao de problemas. Entretanto, Jenkins (2003) considera os resultados de pesquisas nesse sentido inconclusivos: enquanto alguns trabalhos de fato mostram alguma correla¸c˜ao entre o dom´ınio de certas habilida- des e a maior ou menor facilidade em aprender a programar (por exemplo, Byrne e Lyons (2001)), outros estudos indicam que n˜ao h´a tal correla¸c˜ao (Jenkins e Davy, 1999). De qualquer forma, essas habilidades n˜ao s˜ao necessariamente inatas, podendo ser desen- volvidas; Gomes e Mendes (2007), por exemplo, consideram como problema a falta de treinamento pr´evio do estudante em matem´atica e l´ogica, n˜ao uma dificuldade inata; de fato, a escolha do estudante por um curso de Ciˆencia da Computa¸c˜ao ou correlato ´e um ind´ıcio de que ele j´a tem consider´avel interesse na ´area de ciˆencias matem´aticas1 . 1 Temos constatado empiricamente que alguns estudantes escolhem o curso com uma vis˜ao preliminar errˆonea da Computa¸c˜ao, e esses mesmos estudantes tˆem s´erias dificuldades em aprender a programar. 4
  • 18.
    2.2 Fatores cognitivos V´ariosfatores cognitivos s˜ao relevantes para a maior ou menor facilidade na aprendizagem de programa¸c˜ao. O primeiro fator s˜ao os estilos de aprendizagem. Estudantes aprendem de maneiras diferentes: estudando sozinho ou em grupo, estudando em detalhes ou su- perficialmente a disciplina. V´arios 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˜ao ser adequado para um determinado ponto do estudo de programa¸c˜ao (Jenkins, 2003). Como exemplo, consideremos os estilos de aprendizagem classificados como aborda- gem aprofundada e abordagem superficial. A abordagem aprofundada ´e aquela na qual o estudante busca pela compreens˜ao do t´opico, enquanto a abordagem superficial ´e aquela na qual o estudo resume-se a pouco mais que memorizar as informa¸c˜oes. Programa¸c˜ao ´e uma atividade que exige o uso de ambas as abordagens: enquanto ´e necess´ario um conhecimento m´ınimo, mesmo que vago, das regras l´exicas e sint´aticas da linguagem de programa¸c˜ao utilizada, uma compreens˜ao profunda da semˆantica e dos conceitos abstra- tos sobre programa¸c˜ao ´e exigido. No caso, n˜ao s´o ´e necess´ario que se utilize ambas as abordagens em v´arios pontos da disciplina; ´e exigido que ambas as abordagens sejam utilizadas ao mesmo tempo (Jenkins, 2003). Os estilos de aprendizagem podem tamb´em variar de acordo com os tipos psicol´ogicos. Alunos tˆem estilos de aprendizagem diferentes, que influenciam em seus m´etodos e pre- ferˆencias de estudo. Alguns preferem pensar em termos mais abstratos, enquanto outros podem preferir conceitos mais concretos e aplicados; alguns alunos preferem m´etodos sistem´aticos de estudos, enquanto outros “deixam-se levar” pelo tema (Keirsey, 1998). Ocorre que programa¸c˜ao exige tanto racioc´ınio abstrato quanto concreto; por vezes, exige m´etodo r´ıgido e, noutras, experimenta¸c˜ao avulsa. Inclusive, h´a problemas que s˜ao mais facilmente resolv´ıveis de uma forma que de outra. O estudante, por´em, usualmente es- colhe explorar o tema da programa¸c˜ao apenas atrav´es da maneira que mais lhe agrada, e tenta utilizar sua abordagem preferida sem considerar o car´ater do problema. Uma pesquisa preliminar focando no estilo de aprendizagem do aluno, com poss´ıvel aplica¸c˜ao futura no Tutorial ICC, foi desenvolvido por Chaves J´unior e Bastos (2008). Outras pes- quisas poder˜ao abordar as pr´aticas necess´arias na aprendizagem de programa¸c˜ao, dando um primeiro passo no trabalho sobre as diversas maneiras de estudar de cada tipo de estilo de aprendizagem. Outro fator importante — e problem´atico — no estudo de programa¸c˜ao ´e a motiva¸c˜ao. Enquanto v´arios alunos aprendem a programar por vontade pr´opria e interesse pessoal — em outras palavras, por motiva¸c˜ao intr´ınseca —, outros estudantes o fazem em busca de uma carreira financeiramente rent´avel ou apenas para obter diploma em um curso superior qualquer — ou seja, por motiva¸c˜ao extr´ınseca. Previsivelmente, alunos com mo- tiva¸c˜oes intr´ınsecas apresentam um desempenho melhor em aprendizagem que alunos com motiva¸c˜oes extr´ınsecas. Entretanto, a motiva¸c˜ao extr´ınseca n˜ao ´e, de maneira alguma, Entretanto, tais estudantes s˜ao uma minoria e, afinal, v´arios dos estudantes que demonstram grande habilidade em diversas outras ´areas da Computa¸c˜ao tamb´em tˆem dificuldades espec´ıficas em solucionar problemas com c´odigo. 5
  • 19.
    um empecilho paraa aprendizagem, de modo que estudantes com tais interesses n˜ao s˜ao “casos perdidos” (Jenkins, 2003). Al´em disso, existem diversos “ bugs” conceituais que afetam a maneira como pro- gramadores iniciantes programam e lˆeem programas. Por exemplo, ´e usual que o aluno imagine que o programa ´e, em certo sentido, executado de uma vez s´o — o que ´e usu- almente chamado de “bug” de paralelismo; tamb´em ocorre de programadores iniciantes lerem instru¸c˜oes de c´odigo subentendendo inten¸c˜oes e n˜ao apenas seu significado (“bug” de intencionalidade) ou de escreverem c´odigo que em seu racioc´ınio produza o efeito de- sejado, mas que possui menos semˆantica que a necess´aria (“bug” de egocentrismo) (Pea, 1986). A cataloga¸c˜ao e estudo desses “bugs” j´a vem de longo tempo e inclui artigos como Pea (1986) e Spohrer e Soloway (1986). 2.3 Fatores pedag´ogicos Os professores de programa¸c˜ao tˆem um grande desafio: ensinar uma disciplina extrema- mente jovem. O corpo de conhecimento sobre o processo did´atico do ensino de Com- puta¸c˜ao ´e ainda pequeno quando comparado a outras disciplinas mais bem estabelecidas, como ´Algebra e C´alculo. Isso ´e especialmente verdadeiro quando se trata de programa¸c˜ao, uma atividade cheia de idiossincrasias e peculiaridades que a colocam no meio do caminho entre a ´Algebra e alguma engenharia. Entretanto, isso n˜ao implica que n˜ao temos base alguma para come¸car a desenvolver e propor um modelo de ensino de programa¸c˜ao. J´a h´a pesquisa na busca de uma metodo- logia confi´avel de ensino de programa¸c˜ao, e muitas das raz˜oes das dificuldades do ensino de programa¸c˜ao j´a s˜ao conhecidas, ao menos superficialmente. Por exemplo, v´arios cursos de programa¸c˜ao tendem a dar ˆenfase no ensino da lingua- gem de programa¸c˜ao, e n˜ao na programa¸c˜ao em si (Gomes e Mendes, 2007), ao ponto de v´arias institui¸c˜oes terem uma s´erie de cursos de “Programa¸c˜ao”, cada um ensinando uma linguagem diferente. A escolha da linguagem de programa¸c˜ao que suportar´a os exemplos de um curso comumente ´e guiada pela linguagem mais popular na ind´ustria no momento, ao inv´es de considerar fatores did´aticos (Jenkins, 2003). Isso pode ser problem´atico, dado que a linguagem de programa¸c˜ao ´e uma nota¸c˜ao e, portanto, pode fazer uma dr´astica dife- ren¸ca na transmiss˜ao de conceitos (Iverson, 1980). Por isso linguagens de programa¸c˜ao de car´ater did´atico, como Pascal (Wirth, 1972) e Logo (Pea, 1983), e ambientes que reduzam as dificuldades do aluno s˜ao didaticamente importantes (Jenkins, 2003)(Gomes e Mendes, 2007). O contexto em que o estudante acaba de adentrar tamb´em dificulta a aprendizagem. ´E usual que o ensino de programa¸c˜ao seja um dos primeiros cursos que um aluno de Computa¸c˜ao (ou alguma ´area relacionada ou dependente) tenha durante sua gradua¸c˜ao. O aluno, inexperiente, ao lidar com t˜ao complexa disciplina, tem ainda mais dificuldades de aprender. Muitos autores consideram que o posicionamento de ensino de programa¸c˜ao na grade curricular ´e excessivamente adiantado (Jenkins, 2003)(Gomes e Mendes, 2007)2 . 2 Nossa experiˆencia pessoal nos d´a uma vis˜ao diversa: n´os, quando estudantes, ouvimos muitos cole- gas de turma reclamarem do quanto se demorava para aprender a programar e para chegar aos cursos 6
  • 20.
    Por fim, podemoscitar tamb´em a grande heterogeneidade de estudantes nas turmas de programa¸c˜ao. Como o curso de programa¸c˜ao ´e um dos primeiros a serem ministrados, h´a em suas turmas estudantes dos mais diversos backgrounds e perfis. Como tais cursos n˜ao raramente ainda seguem uma estrutura bastante tradicional de aula expositiva, seus professores n˜ao disp˜oem de tempo e energias suficientes para atender pessoalmente cada um dos alunos. De fato, a falta de personaliza¸c˜ao nos cursos e o desgaste do professor s˜ao apontadas por v´arios pesquisadores como causas significativas para mau desempenho de estudantes de programa¸c˜ao (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´arios dos problemas que afligem os estudantes e professores de pro- grama¸c˜ao. A proposta do tutorial, a longo prazo, ´e tornar-se um sistema tutorial dotado de inteligˆencia, objetivo para o qual esse trabalho oferece mais um pequeno passo. Para compreender como um sistema tutorial dotado de inteligˆencia pode auxiliar o ensino de programa¸c˜ao, precisamos ver, antes o que s˜ao sistemas tutoriais inteligentes. mais avan¸cados e “pr´aticos”. Entretanto, esta ´e apenas uma evidˆencia aned´otica: embora realmente te- nhamos conhecidos alguns estudantes que reclamassem dessa demora (especialmente em vers˜oes antigas do curr´ıculo dos nossos cursos), n˜ao sabemos quantos realmente reclamavam. Eis uma ´area digna de pesquisa. 7
  • 21.
    Cap´ıtulo 3 Sistemas TutoriaisInteligentes Sistemas tutoriais inteligentes (do inglˆes intelligent tutoring systems) s˜ao sistemas de aprendizagem auxiliados por computador (SAAC) que se adaptam, sem necessidade de cont´ınua interven¸c˜ao humana, `as necessidades e ao desempenho do aluno (Self, 1999). Esses sistemas s˜ao um caso especial dos sistemas de instru¸c˜ao auxiliada por computador (do inglˆes computer aided instruction) que almejam utilizar tecnologias inform´aticas 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ˆencias e conhecimentos (Murray, 1999). O Tutorial ICC evolui para adquirir, se n˜ao o car´ater de um sistema tutorial inteligente em todos os aspectos, ao menos algumas caracter´ısticas e fun¸c˜oes de sistemas tutoriais inteligentes, tornando-se um sistema tutorial dotado de inteligˆencia. O corrente trabalho ´e mais um passo nessa dire¸c˜ao. 3.1 Arquitetura de um sistema tutorial inteligente Um dos aspectos mais importantes de qualquer sistema computacional — inclusive de sis- temas tutoriais inteligentes — ´e a sua arquitetura. V´arias arquiteturas j´a foram propostas para sistemas tutoriais inteligentes mas, tradicionalmente, divide-se um sistema tutorial inteligente em trˆes m´odulos: o m´odulo especialista, o m´odulo do estudante e o m´odulo do tutor (Self, 1999). Ademais, a maioria das demais arquiteturas s˜ao apenas varia¸c˜oes isoladas desse modelo. O m´odulo especialista ´e respons´avel por modelar o conhecimento a ser transmitido. Trˆes abordagens s˜ao poss´ıveis nesse caso: a cria¸c˜ao de um m´odulo “caixa preta”, um m´odulo de “caixa de vidro” ou um m´odulo de solu¸c˜ao de problemas. Um m´odulo “caixa preta” n˜ao codifica a inteligˆencia humana, mas s´o o conhecimento. Desse modo, esse m´odulo apenas pode fazer compara¸c˜oes entre o conhecimento do estudante e a repre- senta¸c˜ao do conhecimento interna ao sistema. Esse modelo ´e insuficiente para o ensino, de modo que sistemas tutoriais inteligentes que fazem uso de tais m´odulos geralmente incrementam seu desempenho com os chamados m´odulos de solu¸c˜ao de problemas, que decidem o comportamento do sistema para cada comportamento observado no m´odulo 8
  • 22.
    do estudante, comespecial ˆenfase em enganos comuns. Alternativas aos m´odulos “caixa preta”, os m´odulos “caixa de vidro” s˜ao usualmente baseados em formalismos dos co- nhecimentos a serem apresentados. Seu desenvolvimento no geral depente do aux´ılio de engenheiros de conhecimento, que ap´os entrevistar especialistas, cria uma representa¸c˜ao computacinal do conhecimento a ser transmitido (Burns e Capps, 1988). O m´odulo 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´odulo, Burns e Capps (1988) chama a aten¸c˜ao para trˆes dimens˜oes a serem levadas em conta. Primeiro, ´e necess´ario saber que informa¸c˜oes temos sobre o comportamento do usu´ario do sistema. A maioria dos sistemas tutoriais inteligentes s´o tem acesso `as respostas dadas pelo aluno `as quest˜oes propostas.1 Segundo, conv´em distinguir qual a categoria do conhecimento que se tenta transmitir; isto ´e, ´e preciso ter em mente se queremos transmitir um conhecimento procedural (conhecimento sobre como executar uma tarefa), declarativo (conhecimento sobre fatos em geral, sem necess´aria aplica¸c˜ao) ou mesmo qualitativo (habilidade em fazer julgamentos e tirar conclus˜oes de modelos mentais). Por fim, Burns e Capps (1988) chama a aten¸c˜ao para a necessidade de se distinguir diferen¸cas entre o estudante e o m´odulo especialista. Tradicionalmente, usa-se a representa¸c˜ao do conhecimento do pr´oprio m´odulo especialista na implementa¸c˜ao do m´odulo do estudante; sistemas mais avan¸cados, por´em, tamb´em fornecem uma biblioteca de erros que permitem que o sistema reaja de maneira mais adequada a erros previstos (Burns e Capps, 1988). O m´odulo do tutor ´e o m´odulo respons´avel pela integra¸c˜ao entre o m´odulo espe- cialista e o m´odulo do estudante. Ele ´e o real respons´avel por escolher o fluxo de apresenta¸c˜ao do conte´udo, assim como por dar sugest˜oes e apresentar corre¸c˜oes de ma- neira ass´ıncrona. Existem diversas teorias instrucionais utilizadas na constru¸c˜ao de tais m´odulos (Burns e Capps, 1988). A esses componentes, Burns e Capps (1988) acrescenta o ambiente de instru¸c˜ao e a interface homem-m´aquina. O ambiente de instru¸c˜ao ´e o conjunto de ferramentas utilizadas no processo de transmiss˜ao de conhecimento. Exemplos dessas ferramentas s˜ao jogos, gr´aficos, anima¸c˜oes etc. Elas comp˜oem um micromundo no qual o aluno explora as possibilidades do sistema tutorial inteligente. A interface homem-m´aquina ´e o conjunto de tecnologias utilizado para a comunica¸c˜ao entre o computador e o aluno. O Tutorial ICC, por exemplo, utiliza a interface Web atrav´es de uma interface de usu´ario gr´afica. Beck et al. (1996) prop˜oem uma divis˜ao levemente diferente. O conhecimento do dom´ınio estaria separado do m´odulo especialista: enquanto o conhecimento do dom´ınio se- ria uma base de dados de conhecimento a ser utilizado, o m´odulo especialista representaria o conhecimento de uma pessoa especialmente h´abil no tema estudado. O m´odulo espe- cialista seria, ent˜ao, respons´avel por comparar a solu¸c˜ao dada pelo aluno com a solu¸c˜ao do especialista. Al´em disso, Beck et al. (1996) apresentam tanto o ambiente de instru¸c˜ao 1 Entretanto, v´arios sistemas tentam captar e processar informa¸c˜oes sobre outros aspectos do compor- tamento do aluno como, por exemplo, seu estado emocional. Esses sistemas s˜ao denominados sistemas tutoriais inteligentes afetivos e podem tanto escolher a ordem de apresenta¸c˜ao do conte´udo quanto enviar mensagens de motiva¸c˜ao ou apoio ao estudante (Nkambou, 2006). Infelizmente, como Murray (1999) ressalta, sistemas baseados em hiperm´ıdia e Web, como o Tutorial ICC, n˜ao disp˜oem de tais facilidades, ao menos n˜ao de maneira trivial. 9
  • 23.
    quanto a interfacehomem-m´aquina como um componente s´o: o modelo de comunica¸c˜ao, que intermedeia a intera¸c˜ao entre a m´aquina e o aluno. A figura 3.1 apresenta as intera¸c˜oes entre os m´odulos da arquitetura proposta por Beck et al. (1996). Modelo de estudante M´odulo Pedag´ogico Modelo de Comunica¸c˜ao Conhecimento de Dom´ınio Modelo de Especialista T T & & & &b    } E ' E Figura 3.1: Componentes de um STI, segundo Beck et al. (1996) Uma alternativa com altera¸c˜oes mais significativas ´e a de Gugerty (1997). Gugerty (1997) prop˜oe a cria¸c˜ao de sistemas tutoriais inteligentes sem m´odulos de estudante. Tais sistemas seriam, ent˜ao, ferramentas computacionais de aux´ılio a professores. Esses sistemas s˜ao chamados sistemas tutoriais inteligentes n˜ao-diagn´osticos, em oposi¸c˜ao aos sistemas tutoriais inteligentes tradicionais que fazem um diagn´ostico do estado afetivo e/ou cognitivo do estudante. De fato, a experiˆencia tem mostrado que sistemas tutoriais inteligentes s˜ao caros e dif´ıceis de se desenvolver, embora bastante efetivos (Murray, 1999), e o m´odulo de estudante ´e a parte mais dif´ıcil de se desenvolver (Burns e Capps, 1988). Ademais, o estado atual da tecnologia inform´atica ainda n˜ao oferece uma largura de banda de informa¸c˜oes sobre o usu´ario suficiente para uma avalia¸c˜ao significativa do estado cognitivo e afetivo do aluno e, no final das contas, os ganhos pedag´ogicos do uso de sistemas tutoriais inteligentes n˜ao-diagn´osticos s˜ao consider´aveis (Gugerty, 1997). Embora esse tipo de sistema tutorial fuja do modelo tradicional, ele ´e bastante promissor e pode servir como referˆencia em v´arios aspectos para o nosso sistema. Como se percebe, h´a v´arias divergˆencias sobre como organizar a arquitetura de um sistema tutorial inteligente. Entretanto, essas s˜ao, quase sempre, divergˆencias superficiais: todos os modelos de sistemas tutoriais inteligentes, de certo modo, derivam da arquitetura seminal apresentada por Self (1974). 3.2 Categorias de sistemas tutoriais inteligentes Nosso primeiro passo ser´a tentar situar o Tutorial ICC no estado da arte dos sistemas tutoriais inteligentes. O que ´e interessante que o Tutorial ICC tenha? O que outros sistemas nos ensinam? Uma primeira diferencia¸c˜ao a ser feita ´e entre os sistemas tutoriais inteligentes shell e tool. Um shell ´e um framework para desenvolvimento de sistemas tutoriais inteligentes; ge- ralmente, ´e mais voltado para programadores de computadores, que podem customiz´a-los, e s˜ao mais gen´ericos. J´a tools s˜ao mais voltados para o p´ublico em geral, fornecendo inter- faces que permitem n˜ao programadores registrarem o conhecimento no sistema (Murray, 1999). Nessa categoriza¸c˜ao, Tutorial ICC ´e claramente um tool. 10
  • 24.
    Murray (1999) divideos sistemas tutoriais inteligentes em sete categorias n˜ao ortogo- nais em fun¸c˜ao dos seus dom´ınios de atua¸c˜ao e ´areas em que seu uso ´e mais adequado. As categorias, sumarizadas na tabela 3.1, s˜ao as seguintes: 1. Planejamento e sequenciamento de curr´ıculos Os sistemas tutoriais inteligentes de planejamento e sequenciamento de curr´ıculos definem unidades de instru¸c˜ao cujo fluxo de apresenta¸c˜ao ´e decidido pelo sistema de acordo com as necessidades do aluno. Para o estudante, esses sistemas s˜ao muito semelhantes a sistemas de gerenciamento de cursos (como o Moodle); entretanto, os sistemas de planejamento e sequenciamento de curr´ıculos podem seguir quaisquer ordens mais adequadas de apresenta¸c˜ao de conte´udos. A ordem de apresenta¸c˜ao de conte´udos deve, por´em, ser escolhida pelo sistema de forma automatizada, sem interferˆencia humana, assim como deve se adequar especificamente ao desempenho de cada aluno. 2. Estrat´egias tutoriais Diz-se que um sistema tutorial inteligente tem foco em estrat´egias tutoriais (ou estrat´egias de ensino) quando tem a capacidade de decidir quais as melhores es- trat´egias de apresenta¸c˜ao de conte´udo para o aluno. Esses sistemas s˜ao semelhantes aos sistemas de planejamento e sequenciamento de curr´ıculos, mas agem em um n´ıvel de abstra¸c˜ao mais baixo. Enquanto os sistemas de planejamento e sequencia- mento de curr´ıculos tomam decis˜oes sobre quais componentes do fluxo da mat´eria v˜ao apresentar; sistemas de estrat´egias tutoriais escolhem o melhor momento para apresentar ferramentas de ensino, e n˜ao s´o conte´udo. Por exemplo, um sistema que decida explicar mais detalhadamente um determinado t´opico do ensino e escolha quando apresentar uma determinada explica¸c˜ao ou um exemplo s˜ao sistemas de estrat´egias tutoriais. 3. Simula¸c˜ao de dispositivos e treinamento em equipamentos V´arios sistemas tutoriais inteligentes buscam simular certos dispositivos para o estu- dante. A intera¸c˜ao entre o estudante e o sistema mimetiza o uso de um determinado dispositivo ou equipamento. Desse modo, esses sistemas, categorizados como siste- mas de simula¸c˜ao de dispositivos ou sistemas de treinamento em equipamentos, per- mitem que o estudante possa compreender o funcionamento do dispositivo simulado sem ter de lidar com o dispositivo em si. Isso ´e especialmente ´util quando se quer ensinar o uso de equipamentos caros, fr´ageis, perigosos ou inacess´ıveis. Tais sistemas tamb´em s˜ao interessantes pois permitem que se dˆe uma resposta mais did´atica ao estudante, ao inv´es do erro real gerado pelo dispositivo. 4. Sistemas especialistas e tutores cognitivos ´E bastante comum o uso de simula¸c˜oes cognitivas em sistemas tutoriais inteligentes. Sistemas tutoriais inteligentes que usam esse m´etodo possuem um mecanismo de simula¸c˜ao de cogni¸c˜ao que, baseado em regras, tentam criar um modelo de cogni¸c˜ao do atual est´agio de conhecimento do aluno. Esse modelo ´e utilizado pelo m´odulo 11
  • 25.
    especialista para definiro melhor fluxo de ensino. Esses sistemas s˜ao chamados de sistemas tutores cognitivos, ou sistemas de modelagem de cogni¸c˜ao. Murray (1999) p˜oe na mesma categoria tanto esses sistemas quanto os sistemas que fazem uso de sistemas especialistas para a resolu¸c˜ao de problemas. A diferen¸ca ´e que sistemas especialistas s˜ao utilizados no m´odulo especialista para encontrar a solu¸c˜ao de problemas did´aticos e n˜ao para modelar o estado cognitivo do estudante. 5. M´ultiplos 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´udo, diz-se que o sistema possui m´ultiplos tipos de conhecimentos. Por exem- plo, um sistema com m´ultiplos tipos de conhecimento pode dividir o conhecimento a ser transmitido em trˆes categorias: fatos, conceitos e procedimentos. Cada com- ponente da habilidade maior a ser ensinada contaria com um m´etodo espec´ıfico de ensino, dependendo de qual das trˆes categorias acima melhor modela o componente. Esses sistemas tendem a ser mais f´aceis de configurar, mas s˜ao menos flex´ıveis. 6. Sistemas de prop´osito espec´ıfico Embora sistemas tutoriais inteligentes gen´ericos tenham atra´ıdo bastante interesse, tamb´em pode ser interessante projetar sistemas tutoriais inteligentes para ´areas es- pec´ıficas. N˜ao raramente, sistemas gen´ericos surgem do desenvolvimento de um sistema espec´ıfico que vai gradativamente se tornando parametriz´avel e reutiliz´avel. Por um lado, esses sistemas de prop´osito espec´ıfico atingem um p´ublico-alvo bem restrito; por outro lado, podem utilizar ferramentas did´aticas espec´ıficas mais po- derosas. 7. Hiperm´ıdia adaptativa/inteligente Com a crescente sofistica¸c˜ao 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ˆem se tornado predominantes nessa ´area de pesquisa. Esses sistemas permitem a apresenta¸c˜ao, ordena¸c˜ao, filtragem etc. de links em fun¸c˜ao de v´arios aspectos da disciplina ou do desempenho do aluno, como fluxo de apresenta¸c˜ao, dificuldade, adequa¸c˜ao de pr´e-requisitos etc. Comumente, tais sistemas s˜ao sistemas de planejamento e sequenciamento de curr´ıculo, ou sistemas de estrat´egias tutoriais com uma interface baseada em hiperm´ıdia. Embora essa classifica¸c˜ao mais pare¸ca a “enciclop´edia chinesa” de Jorge Luis Bor- ges (Foucault, 2002) que uma taxonomia tradicional, ela ´e muito ´util. O pr´oprio 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´arias dessas ca- tegorias. Nosso objetivo inicial ´e, a princ´ıpio, torn´a-lo um sistema de planejamento e sequenciamento de curr´ıculos, ou, mais provavelmente, um sistema de estrat´egias tuto- riais; naturalmente, podemos torn´a-lo ambos. Do mesmo modo, j´a hoje o Tutorial ICC 12
  • 26.
    Categoria Vantagens DesvantagensVaria¸c˜oes Planejamento e sequenci- amento de curr´ıculos Executar regras para sequenciamento de m´odulos e programas Pouca fidelidade ao modelo de estudante; representa¸c˜ao superfi- cial de habilidades As regras podem ser fixas ou alter´aveis pelo autor Estrat´egias tutoriais Estrat´egias tutoriais vari´aveis dentro do m´odulo; conjunto so- fisticado de primitivas e m´ultiplas estrat´egias tutoriais Pouca fidelidade ao modelo de estudante; representa¸c˜ao superfi- cial de habilidades M´etodo de estrat´egia de representa¸c˜ao, fonte de expertise instrucional Simula¸c˜ao de dispositivos e treina- mento em equipamentos Tutoramento de iden- tifica¸c˜ao de compo- nentes, opera¸c˜ao e re- solu¸c˜ao de problemas; habilidades procedu- rais Estrat´egias instrutivas limitadas; modelagem de estudante limitada Fidelidade da si- tua¸c˜ao, facilidade de composi¸c˜ao de tutorial Sistemas especialistas e tutores cognitivos Modelo do dom´ınio de especializa¸c˜ao mais profundo e execut´avel; facilidade de inclus˜ao de erros e comporta- mento de novato Dificuldade de cons- tru¸c˜ao; limita¸c˜ao a ha- bilidades procedurais ou de solu¸c˜ao de pro- blemas; estrat´egias de instru¸c˜ao limitadas Modelos de habilidade baseados em cogni¸c˜ao ou desempenho M´ultiplos tipos de conhecimento Representa¸c˜ao clara e m´etodo instrutivos pr´e-definidos para fatos, conceitos e procedimentos Limitado a fatos, con- ceitos e procedimentos simples; estrat´egias tutoriais pr´e-definidas Inclus˜ao de sequenci- amento curricular in- teligente; varia¸c˜ao dos tipos de conhecimento e tarefas suportados Sistemas de prop´osito espec´ıfico Modelos de sistemas provˆeem uma grande ajuda na composi¸c˜ao do conte´udo; um projeto ou princ´ıpio pedag´ogico espec´ıfico pode ser enfatizado Ferramentas limitadas ao tipo de tutor que suportam; inflexibili- dade na representa¸c˜ao e pedagogia Grau de inflexibili- dade Hiperm´ıdia adaptati- va/inteligente Acess´ıvel pela Web; uniformidade de in- terface de usu´ario; sele¸c˜ao adaptativa e anota¸c˜ao de hiper- liga¸c˜ao Intera¸c˜ao limitada; largura de banda de resposta de modelo de estudante limitada Foco em micro ou ma- crovis˜ao; grau de inte- ratividade. Tabela 3.1: Categorias de STIs, segundo Murray (1999) 13
  • 27.
    fornece simula¸c˜oes deum computador, tornando-o um potencial sistema de simula¸c˜ao de dispositivos. Como programa¸c˜ao exige o conhecimento de uma s´erie de fatos, concei- tos e habilidades, ´e tamb´em bem prov´avel que o Tutorial ICC se torne um sistema de m´ultiplos conhecimentos. Como, afinal, o Tutorial ICC ´e um sistema Web, ele ´e, desde j´a, 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´eias para nos auxiliar no nosso projeto. 3.3 Vantagem dos sistemas tutoriais inteligentes Os sistemas de aprendizagem auxiliada por computador (SAAC) fornecem uma s´erie de vantagens aos professores e estudantes de programa¸c˜ao. Por exemplo, dado o aumento na demanda por cursos focados em Tecnologia da Informa¸c˜ao, o n´umero de aluno nas turmas de disciplinas de programa¸c˜ao tende a crescer bastante, como comentamos no cap´ıtulo 1; SAACs permitem que as partes mais f´aceis de assimilar do conte´udo dessas disciplinas sejam ministradas em massa para os alunos, permitindo que o professor se desgaste menos e foque mais em ajudar os alunos com mais dificuldades. De modo an´alogo, estes sistemas viabilizam cursos de educa¸c˜ao a distˆancia (EaD). Tais sistemas tamb´em permitem que o aluno possa estudar em seu pr´oprio ritmo, algo que pode ser bastante positivo para a aprendizagem, conforme comentado na se¸c˜ao 2.3. O Tutorial ICC, sobre o qual trabalhamos, ´e um exemplo sistema de aprendizagem auxiliada por computador (SAAC). Entretanto, SAACs tˆem desvantagens. Uma destas desvantagens ´e a despersonaliza¸c˜ao do ensino. Mesmo cursos tradicionais de programa¸c˜ao n˜ao alcan¸cam o ideal de cursos personalizados, com foco nas dificuldades dos alunos; SAACs tradicionais tendem a ser ainda mais problem´aticos. De modo an´alogo, estes sistemas n˜ao se adaptam ao ritmo de aprendizagem e estilo de estudo dos estudantes. T´ecnicas de desenvolvimento de STIs podem ser utilizadas em SAACs para tentar su- perar essas desvantagens. De fato, v´arios STIs se adaptam ao ritmo, estilo e personalidade do aluno. A m´edio prazo, espera-se que o Tutorial ICC torne-se adapt´avel aos diversos n´ıveis de dificuldade dos alunos. 3.4 O papel do trabalho corrente Neste trabalho, nosso objetivo ´e prover ao Tutorial ICC uma s´erie de exemplos, orga- nizados em taxonomias de exemplos hier´arquicas, que permitam que alunos em diversos est´agios e ritmos de aprendizagem analisar cen´arios simples e complexos de acordo com sua pr´opria capacidade. Esses cen´arios devem conter um enunciado, uma solu¸c˜ao em c´odigo-fonte Pascal e um script de execu¸c˜ao de “tira-teima”, que representa graficamente a execu¸c˜ao do programa, atrav´es de uma applet Java. Tamb´em faz parte do trabalho uma representa¸c˜ao da posi¸c˜ao do aluno na taxonomia. A maneira como essas tarefas foram desenvolvidas ´e apresentadas no cap´ıtulo 4. 14
  • 28.
    Cap´ıtulo 4 Taxonomias deExemplos Afora os exemplos desenvolvidos e integrados ao Tutorial ICC, um dos principais resulta- dos deste trabalho ´e o m´etodo de desenvolvimento de uma forma de estruturar problemas que denominamos taxonomias hier´arquicas de exemplos. O m´etodo envolve uma s´erie de passos, seus pr´oprios termos e algumas recomenda¸c˜oes. Abaixo, seguem estes resultados. 4.1 Taxonomia hier´arquica de exemplos Uma taxonomia ´e, literalmente, a ciˆencia ou t´ecnica de classifica¸c˜ao (Houaiss et al., 2001, pp. 2680—2681). No nosso trabalho, uma taxonomia de exemplos ´e uma classifica¸c˜ao de um conjunto de exemplos; por extens˜ao, uma taxonomia de exemplos ´e tamb´em um conjunto de exemplos organizados segundo uma determinada classifica¸c˜ao. Por sua vez, uma taxonomia hier´arquica de exemplos ´e uma taxonomia na qual os exemplos s˜ao orga- nizados de forma estruturada, como ´arvores. Tamb´em dizemos, neste trabalho, que uma taxonomia hier´arquica ´e uma ´arvore de exemplos, de modo que ´e poss´ıvel que nos refi- ramos a alguma propriedade de ´arvores, mas se referindo a uma taxonomia hier´arquica. Como trataremos apenas de taxonomias hier´arquicas de exemplos, toda vez que usarmos o termo “taxonomia” o significado ser´a “taxonomia de exemplos hier´arquica”. Cada taxonomia exemplifica o uso de um conjunto de caracter´ısticas remov´ıveis. Uma caracter´ıstica remov´ıvel ´e um conceito, t´ecnica ou padr˜ao que o estudante deve aprender. A raiz da ´arvore da taxonomia deve utilizar todas as caracter´ısticas remov´ıveis; seus n´os diretamente subordinados devem explorar subconjuntos diferentes das taxonomias da raiz, e os filhos desses n´os apresentar˜ao subconjuntos dos subconjuntos que seus pais apresentam. Na pr´atica, n´os utilizamos taxonomias com duas ou trˆes caracter´ısticas remov´ıveis. Se a taxonomia tiver duas caracter´ısticas remov´ıveis, os n´os filhos da raiz dever˜ao ter, cada um, uma caracter´ıstica. Parece natural que cada um desses n´os tenha ele mesmo um n´o filho sem nenhuma caracter´ıstica; entretanto, n˜ao seria muito did´atico fazer o estudante descer mais um n´ıvel nos exemplos para observar um exemplo que sequer apre- senta uma das caracter´ısticas da ´arvore. Deste modo, o n´o que n˜ao cont´em nenhuma 15
  • 29.
    das caracter´ısticas remov´ıveistorna-se filho do n´o principal. A figura 4.1 apresenta uma representa¸c˜ao gr´afica dessa ´arvore. O travess˜ao ´e o r´otulo do n´o sem caracter´ısticas. C1, C2 — C1 C2           Figura 4.1: Representa¸c˜ao de taxonomia com duas caracter´ısticas remov´ıveis Se a taxonomia tiver trˆes caracter´ısticas remov´ıveis, o exemplo raiz deve usar as trˆes. A raiz teria, usualmente, trˆes n´os filhos, cada um apresentando duas das trˆes caracter´ısticas remov´ıveis. Esse n´o filho ´e, por sua vez, raiz de uma sub´arvore que tem a estrutura de uma taxonomia de duas caracter´ısticas remov´ıveis. A figura 4.2 apresenta uma representa¸c˜ao gr´afica dessa ´arvore. O travess˜ao ´e o r´otulo do n´o sem caracter´ısticas. C1, C2, C3 C1, C2 D D D D D D D D D C1, C3 C2, C3 l l l l l l l l l — C1 C2 v v v v v vv — C1 C3 v v v v v vv — C2 C3 v v v v v vv Figura 4.2: Representa¸c˜ao de taxonomia com trˆes caracter´ısticas remov´ıveis Se uma taxonomia tem uma das estruturas apresentadas acima, dizemos que ´e uma taxonomia totalmente preenchida. Embora tenhamos focado em gerar taxonomias total- mente preenchidas, nem sempre ´e poss´ıvel ou interessante “for¸car” o total preenchimento 16
  • 30.
    de uma taxonomia.Por exemplo, muitas vezes o exemplo sem caracter´ısticas remov´ıveis em uma taxonomia pode ser simples demais e n˜ao precisa ser apresentado. Isto ocorre co- mumente com taxonomias de trˆes caracter´ısticas, e a ´arvore resultante possui a estrutura representada na figura 4.3. A se¸c˜ao 5.2 apresenta uma taxonomia com esta estrutura. C1, C2, C3 C1, C2 D D D D D D D D D C1, C3 C2, C3 l l l l l l l l l C1 ¢ ¢ ¢ ¢ ¢ ¢¢ C2 f f f f f ff C1 ¢ ¢ ¢ ¢ ¢ ¢¢ C3 f f f f f ff C2 ¢ ¢ ¢ ¢ ¢ ¢¢ C3 f f f f f ff Figura 4.3: Representa¸c˜ao de taxonomia sem n´o sem caracter´ısticas Outro caso de ´arvore n˜ao totalmente preenchida ocorrem quando ao menos uma ca- racter´ıstica remov´ıvel s´o pode ser apresentada se uma outra qualquer estiver presente. Por exemplo, considere uma ´arvore de trˆes caracter´ısticas remov´ıveis C1, C2 e C3 tal que, para C3 estar presente em um exemplo, ´e necess´ario que ou C1 ou C2 tamb´em estejam presentes. N˜ao h´a exemplos que exercitem apenas C3. A estrutura da taxonomia ´e a apre- sentada na figura 4.4, e a se¸c˜ao 5.4 apresenta uma taxonomia na qual esta configura¸c˜ao ocorre. Dizemos que essas caracter´ısticas remov´ıveis s˜ao caracter´ısticas n˜ao-ortogonais entre si pois elas se influenciam; em contraposi¸c˜ao, caracter´ısticas remov´ıveis que podem estar presentes em um exemplo independente das outras s˜ao chamadas de caracter´ısticas ortogo- nais entre si. Se uma taxonomia ´e constru´ıda apenas a partir de caracter´ısticas ortogonais — isto ´e, todas as caracter´ısticas que geram a taxonomia s˜ao ortogonais entre si —, ela ´e dita uma taxonomia ortogonal; caso contr´ario, ´e chamada de taxonomia n˜ao-ortogonal. Em geral, nossa experiˆencia indicou que taxonomias n˜ao-ortogonais s˜ao mais complexas de criar e, ao que tudo indica, menos claras, didaticamente falando. Enquanto ´e perfeita- mente razo´avel construir taxonomias n˜ao totalmente preenchidas, construir taxonomias n˜ao-ortogonais n˜ao ´e o ideal. 17
  • 31.
    C1, C2, C3 C1,C2 D D D D D D D D D C1, C3 C2, C3 l l l l l l l l l C1 ¢ ¢ ¢ ¢ ¢ ¢¢ C2 f f f f f ff C1 C2 Figura 4.4: Representa¸c˜ao de uma taxonomia n˜ao-ortogonal 4.2 Enunciados e solu¸c˜oes Dados os conceitos apresentados na se¸c˜ao 4.1, o processo para o desenvolvimento de ta- xonomias de problemas pˆode ser facilmente definido. Primeiro, defin´ıamos conjuntos de duas ou trˆes caracter´ısticas remov´ıveis — idealmente, conjunto de caracter´ısticas que usualmente aparecem de fato pr´oximas em problemas reais e que fossem caracter´ısticas ortogonais entre si. Para cada um desses conjuntos, elaboramos um enunciado que possi- bilite apresentar todas as caracter´ısticas, assim como enunciados que permitam apresentar apenas subconjuntos das caracter´ısticas, formando uma taxonomia hier´arquica. Para cada um dos enunciados, elaboramos um pequeno programa que resolva o problema. A elabora¸c˜ao de enunciados apresenta uma s´erie de quest˜oes. Por exemplo, qual ´e o melhor estilo: enunciados que apresentem problemas da vida real, ou enunciados abs- tratos? Conforme comentamos na se¸c˜ao 2.2, h´a estudantes que lidariam melhor com um estilo, enquanto outros apreciariam mais o outro — e nem consideramos outros parˆametros que variam em fun¸c˜ao do tipo de personalidade! Nossa abordagem foi experimentar enun- ciados de ambos os estilos. Em breve, poderemos avaliar os resultados1 . Outra quest˜ao foi: como exercitar bugs conceituais dos estudantes? Na se¸c˜ao 2.2 comentamos que h´a v´arios enganos que estudantes cometem recorrentemente. Esses en- ganos podem servir de guia para os exemplos, mas ainda h´a o desafio de inseri-los em enunciados. Do mesmo modo, h´a padr˜oes de programa¸c˜ao importantes e ´uteis que os 1 Um estilo que pode ser promissor s˜ao os enunciados baseados em abstra¸c˜oes com estado, especialmente jogos, como o Jogo da Vida, Snake ou Tetris. De fato, em conversas e observa¸c˜oes aned´oticas com calouros, notamos que esses problemas s˜ao especialmente apreciados. 18
  • 32.
    estudantes devem conhecer,e deve haver enunciados que os apresentem. Em verdade, bugs conceituais e padr˜oes importantes s˜ao boas caracter´ısticas remov´ıveis. Tamb´em se questionou qual deve ser a rela¸c˜ao entre os enunciados de uma taxono- mia. Os enunciados devem ser independentes ou relacionados? Nossa hip´otese ´e que os enunciados devem ser relacionados, e os mais simples devem ser vers˜oes ou “passos” dos enunciados mais completos. Isto, supomos, mant´em o estudante no contexto mental do problema, facilitando sua compreens˜ao. Uma vez definidos os enunciados, devemos desenvolver os programas que os soluci- onam. A linguagem de programa¸c˜ao em que foram solucionados foi aquela j´a utilizada no Tutorial ICC: Pascal. Pascal ´e uma boa escolha tamb´em porque ´e uma linguagem did´atica, como explicado na se¸c˜ao 2.3. Um desafio na cria¸c˜ao dos enunciados ´e: como criar um enunciado que “force” — isto ´e, torne mais natural — o aluno a utilizar as caracter´ısticas que queremos? Depois de criarmos algumas taxonomias, notamos que esta ´e uma quest˜ao secund´aria: embora seja realmente interessante criar enunciados que levem intuitivamente `as caracter´ısticas remov´ıveis escolhidas, s˜ao os desenvolvedores das taxonomias que escolhem como soluci- onar˜ao os enunciados. Isto ´e interessante de se ter em mente porque, por vezes, alguns enunciados tornam-se pouco intuitivos para for¸car a solu¸c˜ao de um problema em uma determinada dire¸c˜ao. Este esfor¸co, por´em, n˜ao ´e necess´ario. A taxonomia apresentada na se¸c˜ao 5.2 ´e um bom exemplo pr´atico disso. Figura 4.5: Screenshot da applet Java executando um “tira-teima” 19
  • 33.
    4.3 “Tira-teima” eroteiros Um dos recursos mais not´aveis do Tutorial ICC s˜ao os “tira-teimas”: representa¸c˜oes gr´aficas da execu¸c˜ao de um programa. Esses “tira-teimas” s˜ao apresentados atrav´es de uma applet Java, apresentada na figura 4.5. Os “tira-teimas” s˜ao compostos de duas partes: um programa cuja execu¸c˜ao ser´a simulada e um script espec´ıfico que simular´a a execu¸c˜ao. Denominamos tais scripts de roteiros. Cada linha de um roteiro inicia com um n´umero inteiro; este n´umero ´e o ´ındice da linha do programa simulado que ser´a real¸cada no programa quando a linha do roteiro for executada. Ap´os este ´ındice, podem vir zero ou mais comandos separados por ponto- e-v´ırgula. Se n˜ao houver nenhum comando a ser executado na linha, apenas o ponto-e- v´ırgula segue o n´umero; se houver mais de um, os comandos devem vir entre chaves. H´a, basicamente, comandos de declara¸c˜ao de vari´aveis (que aparecem como caixas coloridas na applet de tira-teima, comandos de escrita (que imprimem um valor no console da applet e altera¸c˜ao de valores de vari´aveis. A figura 4.6 apresenta o exemplo do roteiro utilizado para o exemplo apresentado na se¸c˜ao 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.0i e um real nao -negativo.); 24; Figura 4.6: Exemplo de roteiro de “tira-teima” Um roteiro pode percorrer apenas um caminho dentro de um programa. Por exemplo, se h´a um comando if com uma cl´ausula else no programa, um roteiro pode passar apenas pela cl´ausula then ou pela cl´ausula else. Isto levanta uma quest˜ao importante: como escolher o caminho que um roteiro deve percorrer em um programa? N´os utilizamos alguns crit´erios bem simples para escolher os caminhos. Um, bastante natural, foi: Se o programa apresenta apenas uma caracter´ıstica remov´ıvel, o caminho escolhido deve executar a caracter´ıstica. 20
  • 34.
    O programa apresentadona se¸c˜ao 5.1.3.4 por exemplo, possui como caracter´ıstica remov´ıvel a presen¸ca da cl´ausula else no comando if. O roteiro deste programa iria, ent˜ao, passar pelo comando da cl´ausula else, ao inv´es de passar pela cl´ausula then. Outro crit´erio 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´erio foi adotado porque acreditamos que, quanto mais linhas de c´odigo o estudante observar serem executadas, mais oportunidades haver´a para fixar conceitos. Al´em disso, execu¸c˜oes sem sa´ıda podem ser bastante confusas: para o iniciante, ´e bem poss´ıvel que um programa que n˜ao imprima nada pare¸ca um programa que n˜ao fa¸ca nada. 4.4 Localiza¸c˜ao na taxonomia Os v´arios exemplos s˜ao apresentados em p´aginas HTML separadas, mas sentimos a ne- cessidade de prover ao estudante uma maneira de ele se localizar em uma determinada taxonomia. A solu¸c˜ao foi criar imagens de ´arvores, nas quais o exemplo em que o estu- dante se encontra ´e destacado atrav´es de cores. A figura 4.7 apresenta a representa¸c˜ao de uma ´arvore. Figura 4.7: Representa¸c˜ao da localiza¸c˜ao do aluno na taxonomia 21
  • 35.
    4.5 Resumo Dados osconceitos acima, o processo de cria¸c˜ao de taxonomias para um cap´ıtulo pode ser resumido da seguinte maneira: 1. selecionar conceitos e estruturas relevantes — isto ´e, caracter´ısticas remov´ıveis — a partir do tema do cap´ıtulo; 2. agrupar as caracter´ısticas remov´ıveis em conjuntos de duas ou trˆes caracter´ısticas. Idealmente, as caracter´ısticas s˜ao conceitualmente pr´oximas e ortogonais entre si; 3. criar, para cada conjunto agrupado, enunciados que levem a programas que apresen- tem subconjuntos das caracter´ısticas. Pode-se, eventualmente, n˜ao criar enunciados para alguns subconjuntos que sejam triviais ou invi´aveis. Os enunciados de uma taxonomia devem, idealmente, ser vers˜oes mais simples ou mais completas de um problema; 4. para cada enunciado, desenvolver uma solu¸c˜ao, em linguagem Pascal; 5. para cada solu¸c˜ao, desenvolver um roteiro de “tira-teima”; 6. inserir os programas e roteiros em p´aginas HTML do Tutorial ICC; 7. para cada p´agina, criar uma representa¸c˜ao gr´afica da taxonomia da qual a p´agina faz parte, e inserir essa representa¸c˜ao na p´agina. Naturalmente, os passos n˜ao precisam seguir for¸cosamente esta ordem, mas ´e usual que sejam seguidos assim. O cap´ıtulo 5 apresenta a aplica¸c˜ao deste processo em um cap´ıtulo do Tutorial ICC. 22
  • 36.
    Cap´ıtulo 5 Exemplos deTaxonomias No tutorial ICC, implementamos sete conjuntos de taxonomias, um para cada um dos cap´ıtulos do tutorial, a partir do segundo1 . O primeiro conjunto implementado foram as taxonomias do cap´ıtulo 3. Este cap´ıtulo trata de estruturas de decis˜ao if-then-else e case-of. Julgamos os conceitos por tr´as destes comandos sofisticados o suficiente para antevermos alguns desafios da cria¸c˜ao de taxonomias, mas simples o suficiente para que n˜ao nos perdˆessemos no seu desenvolvi- mento; por isso, cap´ıtulo 3 do tutorial foi escolhido para o desenvolvimento da primeira taxonomia. Chegamos a v´arias conclus˜oes e questionamentos durante a cria¸c˜ao desta taxonomia e, portanto, elegemos a taxonomia deste cap´ıtulo como um bom exemplo para ser analisado. 5.1 ´Arvore 1 Na primeira ´arvore 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 ´arvore devem ser solucionados utilizando a estrutura condicional. As caracter´ısticas remov´ıveis, nesta pri- meira ´arvore, s˜ao o uso do comando else e a presen¸ca de um comando composto, formado por v´arios outros comandos agrupados pelos delimitadores de blocos begin-end. Como h´a duas caracter´ısticas remov´ıveis, essa ´arvore possui dois n´ıveis de hierarquia e quatro exemplos. 5.1.1 Caracter´ısticas remov´ıveis C1. uso de blocos begin-end C2. uso de else 1 O primeiro cap´ıtulo ´e, basicamente, para apresenta¸c˜ao de conceitos sobre computadores. Nesse sentido, n˜ao h´a como criar uma taxonomia de exemplos de programa¸c˜ao para o cap´ıtulo. 23
  • 37.
    5.1.2 Numera¸c˜ao dosexemplos C1 C2 Exemplo • • 1 (subse¸c˜ao 5.1.3.1) – – 1.1 (subse¸c˜ao 5.1.3.2) • – 1.2 (subse¸c˜ao 5.1.3.3) – • 1.3 (subse¸c˜ao 5.1.3.4) 5.1.3 Enunciados e programas 5.1.3.1 Exemplo 1 Enunciado Uma companhia de seguros vende seguros de carros. O pre¸co de um seguro anual ´e 5%, ou 1/20 do pre¸co do carro. Entretanto, a companhia s´o vende seguros para pessoas com mais de 25 anos. Fa¸ca um programa que leia o pre¸co do carro a ser segurado e a idade do motorista. Se o motorista tiver idade para contratar seguro, imprima uma mensagem dizendo o valor do seguro. Se o carro valer, por exemplo, R° 20 mil, a mensagem ser´a: ’Valor do seguro: R° 1000.00. ’ Se o motorista n˜ao tiver idade para contratar o seguro, imprima duas linhas. A primeira linha ser´a: ’Voce nao pode contratar o seguro.’ Supondo que o motorista tenha 22 anos, a segunda linha ser´a: ’podera contaratar em 3 anos.’ Solu¸c˜ao A solu¸c˜ao usada foi a seguinte 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
  • 38.
    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. 5.1.3.2 Exemplo 1.1 Enunciado Uma companhia de seguros vende seguros de carros. O pre¸co de um seguro anual ´e 5%, ou 1/20 do pre¸co do carro. Entretanto, a companhia s´o vende seguros para pessoas com mais de 25 anos. Fa¸ca um programa que diga se um potencial cliente dessa seguradora pode contratar um seguro. O programa deve ler a idade do cliente e, caso ele tenha idade para contratar o seguro, deve imprimir a mensagem: ’Voce pode contratar o seguro.’ Solu¸c˜ao A solu¸c˜ao usada foi a seguinte 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. 5.1.3.3 Exemplo 1.2 Enunciado Uma companhia de seguros vende seguros de carros. O pre¸co de um seguro anual ´e 5%, ou 1/20 do pre¸co do carro. Entretanto, a companhia s´o vende seguros para pessoas com mais de 25 anos. Fa¸ca um programa que diga se um potencial cliente dessa seguradora pode contratar um seguro. O programa deve ler a idade do cliente e, caso ele n˜ao tenha idade para contratar o seguro, deve imprimir a mensagem: 25
  • 39.
    ’Voce nao podecontratar o seguro.’ Al´em disso, deve tamb´em informar quando o cliente ter´a idade para contratar o seguro. Supondo que o cliente tenha 22 anos, a mensagem ser´a: ’Podera contratar em 3 anos.’ Solu¸c˜ao A solu¸c˜ao usada foi a seguinte 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. 5.1.3.4 Exemplo 1.3 Enunciado Uma companhia de seguros vende seguros de carros. O pre¸co de um seguro anual ´e 5%, ou 1/20 do pre¸co do carro. Entretanto, a companhia s´o vende seguros para pessoas com mais de 25 anos. Fa¸ca um programa que leia o pre¸co do carro a ser segurado e a idade do motorista. Se o motorista tiver idade para contratar seguro, imprima uma mensagem dizendo o valor do seguro. Se o carro valer, por exemplo, R° 20 mil, a mensagem ser´a: ’Valor do seguro: R° 1000.00. ’ Se o motorista n˜ao tiver idade para contratar o seguro, imprima a mensagem: ’Voce nao pode contratar o seguro.’ 26
  • 40.
    Solu¸c˜ao A solu¸c˜aousada 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´arios No exemplo 1, t´ınhamos de apresentar ambas as caracter´ısticas remov´ıveis. Na ´arvore ori- ginal, acrescentamos a caracter´ıstica C2 colocando blocos de comando tanto na cl´ausula then quanto na cl´ausula else. Entretanto, decidimos posteriormente que seria mais inte- ressante colocar o comando composto em apenas uma das cl´ausulas: deste modo, espera-se que o aluno compreenda que ´e poss´ıvel ter um comando composto em uma das cl´ausulas tendo um comando simples na outra cl´ausula. Julgamos relevante inserir, sempre que poss´ıvel, esse tipo de assimetria nos problemas. Al´em disso, decidimos colocar o comando composto na cl´ausula else porque, no exemplo 1.2, o comando composto j´a fora colocado em uma cl´ausula then. 5.2 ´Arvore 2 Nosso objetivo na segunda ´arvore do cap´ıtulo 3 ´e apresentar exemplos de aplica¸c˜ao, ao aluno, do uso dos operadores booleanos and, or e not. A ´arvore tem trˆes caracter´ısticas remov´ıveis, que s˜ao o uso do operador and, o uso do operador or e o uso do operador not. O exemplo maior utiliza as trˆes caracter´ısticas remov´ıveis e possui trˆes 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
  • 41.
    5.2.1 Caracter´ısticas remov´ıveis C1.uso do operador and C2. uso do operador or C3. uso do operador not 5.2.2 Numera¸c˜ao dos exemplos c1 c2 c3 Exemplo • • • 2 (subse¸c˜ao 5.2.3.1) • • – 2.1 (subse¸c˜ao 5.2.3.2) • – • 2.2 (subse¸c˜ao 5.2.3.3) – • • 2.3 (subse¸c˜ao 5.2.3.4) • – – 2.1.1, 2.2.1 (subse¸c˜ao 5.2.3.5) – • – 2.1.2, 2.3.1 (subse¸c˜ao 5.2.3.6) – – • 2.2.2, 2.3.2 (subse¸c˜ao 5.2.3.7) – – – — (ver coment´arios na subse¸c˜ao 5.2.4) 5.2.3 Enunciados e programas 5.2.3.1 Exemplo 2 Enunciado Um certo pa´ıs exige que qualquer estrangeiro que v´a trabalhar em seu territ´orio satisfa¸ca duas condi¸c˜oes. A primeira condi¸c˜ao ´e que o contratador do estrangeiro envie uma carta `a embaixada. Al´em disso, o estrangeiro deve ter US° 10 mil em uma conta do pa´ıs de origem ou ter um im´ovel no pa´ıs de origem. Fa¸ca um programa que pergunte ao usu´ario se ele tem a carta do empregador, pergunte se ele tem US° 10 mil reais em uma conta no pa´ıs de origem e pergunte se ele tem um im´ovel. Se o usu´ario n˜ao tiver a carta ou alguma das duas outras condi¸c˜oes n˜ao for satisfeita, imprima a mensagem: ’Voce nao pode trabalhar no pais.’ Caso contr´ario, n˜ao imprima nada. As respostas que o programa espera s˜ao ’s’ (para “sim”) ou ’n’ (para “n˜ao”). Solu¸c˜ao A solu¸c˜ao usada foi a seguinte program exemplo2; var carta , dinheiro , imovel : char; begin 28
  • 42.
    writeln(’Voce tem cartade 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. 5.2.3.2 Exemplo 2.1 Enunciado Um certo pa´ıs exige que qualquer estrangeiro que v´a trabalhar em seu territ´orio satisfa¸ca duas condi¸c˜oes. A primeira condi¸c˜ao ´e que o contratador do estrangeiro envie uma carta `a embaixada. Al´em disso, o estrangeiro deve ter US° 10 mil em uma conta do pa´ıs de origem ou ter um im´ovel no pa´ıs de origem. Fa¸ca um programa que pergunte ao usu´ario se ele tem a carta do empregador, pergunte se ele tem US° 10 mil reais em uma conta no pa´ıs de origem e pergunte se ele tem um im´ovel. Se o usu´ario tiver a carta e alguma das duas outras condi¸c˜oes for satisfeita, imprima a mensagem: ’Voce pode trabalhar no pais.’ Caso contr´ario, n˜ao imprima nada. As respostas que o programa espera s˜ao ’s’ (para “sim”) ou ’n’ (para “n˜ao”). Solu¸c˜ao A solu¸c˜ao usada foi a seguinte program exemplo2_1; 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
  • 43.
    5.2.3.3 Exemplo 2.2 EnunciadoUm certo pa´ıs exige que qualquer estrangeiro que v´a trabalhar em seu territ´orio satisfa¸ca duas condi¸c˜oes. A primeira condi¸c˜ao ´e que o contratador do estrangeiro envie uma carta `a embaixada. Al´em disso, o estrangeiro deve ter US° 10 mil em uma conta do pa´ıs de origem ou ter um im´ovel no pa´ıs de origem. Fa¸ca um programa que pergunte ao usu´ario se ele tem US° 10 mil em uma conta e pergunte se ele tem um im´ovel. Se o usu´ario tiver o dinheiro mas n˜ao tiver o im´ovel, imprima a mensagem: ’Mesmo sem imovel , voce pode trabalhar no pais se tiver uma carta .’ Caso contr´ario, n˜ao imprima nada. As respostas que o programa espera s˜ao ’s’ (para “sim”) ou ’n’ (para “n˜ao”). Solu¸c˜ao A solu¸c˜ao usada foi a seguinte program exemplo2_2; 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. 5.2.3.4 Exemplo 2.3 Enunciado Um certo pa´ıs exige que qualquer estrangeiro que v´a trabalhar em seu territ´orio satisfa¸ca duas condi¸c˜oes. A primeira condi¸c˜ao ´e que o contratador do estrangeiro envie uma carta `a embaixada. Al´em disso, o estrangeiro deve ter US° 10 mil em uma conta do pa´ıs de origem ou ter um im´ovel no pa´ıs de origem. Fa¸ca um programa que pergunte ao usu´ario se ele tem US° 10 mil em uma conta e pergunte se ele tem um im´ovel. Se o usu´ario n˜ao tiver o dinheiro nem o im´ovel, imprima a mensagem: ’Voce nao pode trabalhar no pais.’ 30
  • 44.
    Caso contr´ario, n˜aoimprima nada. As respostas que o programa espera s˜ao ’s’ (para “sim”) ou ’n’ (para “n˜ao”). Solu¸c˜ao A solu¸c˜ao usada foi a seguinte program exemplo2_3; 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. 5.2.3.5 Exemplos 2.1.1 e 2.2.1 Enunciado Um certo pa´ıs exige que qualquer estrangeiro que v´a trabalhar em seu territ´orio satisfa¸ca duas condi¸c˜oes. A primeira condi¸c˜ao ´e que o contratador do estrangeiro envie uma carta `a embaixada. Al´em disso, o estrangeiro deve ter US° 10 mil em uma conta do pa´ıs de origem ou ter um im´ovel no pa´ıs de origem. Fa¸ca um programa que pergunte ao usu´ario se ele tem a carta do empregador e per- gunte se ele tem um im´ovel. Se o usu´ario tiver a carta e o im´ovel, imprima a mensagem: ’Voce pode trabalhar no pais.’ Caso contr´ario, n˜ao imprima nada. As respostas que o programa espera s˜ao ’s’ (para “sim”) ou ’n’ (para “n˜ao”). Solu¸c˜ao A solu¸c˜ao usada foi a seguinte program exemplo2_1_1 ; var carta , imovel : char; begin writeln(’Voce tem uma carta de solicitacao?’); readln(carta); writeln(’Voce tem um imovel?’); readln(imovel); 31
  • 45.
    if (carta=’s’) and(imovel=’s’) then writeln(’Voce pode trabalhar no pais.’); end. 5.2.3.6 Exemplos 2.1.2 e 2.3.1 Enunciado Um certo pa´ıs exige que qualquer estrangeiro que v´a trabalhar em seu territ´orio satisfa¸ca duas condi¸c˜oes. A primeira condi¸c˜ao ´e que o contratador do estrangeiro envie uma carta `a embaixada. Al´em disso, o estrangeiro deve ter US° 10 mil em uma conta do pa´ıs de origem ou ter um im´ovel no pa´ıs de origem. Fa¸ca um programa que pergunte ao usu´ario se ele tem US° 10 mil em uma conta e pergunte se ele tem um im´ovel. Se o usu´ario tiver o dinheiro ou o im´ovel, imprima a mensagem: ’Voce so precisa da carta.’ Caso contr´ario, imprima a mensagem: ’Voce nao pode trabalhar no pais.’ As respostas que o programa espera s˜ao ’s’ (para “sim”) ou ’n’ (para “n˜ao”). Solu¸c˜ao A solu¸c˜ao usada foi a seguinte program exemplo2_1_2 ; 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
  • 46.
    5.2.3.7 Exemplos 2.2.2e 2.3.2 Enunciado Um certo pa´ıs exige que qualquer estrangeiro que v´a trabalhar em seu territ´orio satisfa¸ca duas condi¸c˜oes. A primeira condi¸c˜ao ´e que o contratador do estrangeiro envie uma carta `a embaixada. Al´em disso, o estrangeiro deve ter US° 10 mil em uma conta do pa´ıs de origem ou ter um im´ovel no pa´ıs de origem. Fa¸ca um programa que pergunte ao usu´ario se ele tem a carta do empregador. Se ele n˜ao tiver a carta, imprima a mensagem: ’Voce nao pode trabalhar no pais.’ Caso contr´ario, n˜ao imprima nada. As respostas que o programa espera s˜ao ’s’ (para “sim”) ou ’n’ (para “n˜ao”). Solu¸c˜ao A solu¸c˜ao usada foi a seguinte program exemplo2_2_2 ; 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´arios Para mostrar uma aplica¸c˜ao pr´atica destes operadores, utilizamos ainda o comando if. ´E interessante notar que procuramos evitar utilizar a cl´ausula else, justamente para “for¸car” ao aluno que pense em termos dos operadores. Isso provavelmente n˜ao ´e necess´ario: como programas implementando os enunciados j´a s˜ao apresentados, n˜ao ´e preciso for¸car o estudante a pensar de certa maneira — basta apresentar um enunciado que leve a uma solu¸c˜ao intuitiva utilizando as caracter´ısticas remov´ıveis do problema. Ademais, evitar utilizar a cl´ausula else acabou tornado os enunciados menos intuitivos. Por exemplo, enquanto a solu¸c˜ao do exemplo 2 possui um comando if arbitrariamente sem cl´ausula else , poder´ıamos acrescent´a-la que conseguir´ıamos ainda assim utilizar todos os operadores, como fizemos no exemplo da se¸c˜ao 5.2.3.6. A implementa¸c˜ao de ´arvores de trˆes n´ıveis apresenta v´arios desafios. Primeiro, s˜ao ´arvores maiores. Al´em disso, como podemos notar na ´arvore 2, elas n˜ao necessariamente levam a ´arvores totalmente preenchidas, que era nosso objetivo inicial: n˜ao h´a na ´arvore 2 um exemplo a que falte todas as caracter´ısticas remov´ıveis. N˜ao acrescentamos este 33
  • 47.
    exemplo porque elepossuiria apenas um comando if, o que j´a foi exercitado na ´arvore 12 . A ´arvore 4 ´e tamb´em n˜ao totalmente preenchida, embora por raz˜oes diferentes3 . Outro aspecto caracter´ıstico das ´arvores de trˆes caracter´ısticas ´e a repeti¸c˜ao de de exemplos. Como h´a trˆes exemplos subordinados ao exemplo maior, cada um destes exem- plos possui tamb´em seus subordinados com uma caracter´ıstica s´o. Por exemplo, obser- vando a tabela da subse¸c˜ao 5.2.2, percebe-se que os exemplos 2.1.1 e 2.2.1 exercitam a mesma caracter´ıstica, que ´e o uso do operador and. Assim sendo, decidimos repetir o enunciado e a solu¸c˜ao do exemplo 2.1.1 no exemplo 2.2.1. 5.3 ´Arvore 3 A terceira ´arvore deste cap´ıtulo considera o uso de comandos do tipo if-then, n˜ao aninha- dos, em seq¨uˆencia. As caracter´ısticas remov´ıveis, nesta primeira ´arvore, s˜ao a presen¸ca de um comando else para a primeira ocorrˆencia de if-then e a presen¸ca de um comando else para a segunda ocorrˆencia. Como h´a duas caracter´ısticas remov´ıveis, temos uma ´arvore de profundidade 2 e quatro exemplos. 5.3.1 Caracter´ısticas remov´ıveis C1. primeiro comando if-then possui cl´ausula else C2. segundo comando if-then possui cl´ausula else 5.3.2 Numera¸c˜ao dos exemplos C1 C2 Exemplo • • 3 (subse¸c˜ao 5.3.3.1) – – 3.1 (subse¸c˜ao 5.3.3.2) • – 3.2 (subse¸c˜ao 5.3.3.3) – • 3.3 (subse¸c˜ao 5.3.3.4) 5.3.3 Enunciados e programas 5.3.3.1 Exemplo 3 Enunciado Um servidor p´ublico tem a possibilidade de aumentar sua remunera¸c˜ao se apresentar os t´ıtulos de especializa¸c˜ao e/ou de mestrado. O servidor poder´a apresentar apenas um diploma para cada titula¸c˜ao e s´o poder´a acumular os adicionais de titula¸c˜oes diferentes. Fa¸ca um programa que calcule a remunera¸c˜ao final de um servidor considerando os seguintes dados: 2 A subse¸c˜ao 5.1.3.2 apresenta este exemplo. 3 A se¸c˜ao 5.4 apresenta essa ´arvore. 34
  • 48.
    Vencimento: R° 1.000,00 Adicionalde especializa¸c˜ao: 3% do Vencimento Adicional de mestrado: 7% do Vencimento Remunera¸c˜ao final ´e a soma do vencimento e adicionais. O programa dever´a ler a resposta do usu´ario para as seguintes perguntas acerca dos t´ıtulos: ’Possui diploma de especializacao ?’ ’Possui diploma de mestrado?’ Se o servidor tem especializa¸c˜ao, o programa dever´a imprimir a seguinte mensagem: ’Voce tem direito ao adicional de especializacao .’ Caso contr´ario: ’Voce nao tem direito ao adicional de especializacao .’ Se o servidor tem mestrado, o programa dever´a imprimir a seguinte mensagem: ’Voce tem direito ao adicional de mestrado.’ Caso contr´ario: ’Voce nao tem direito ao adicional de mestrado.’ Por ´ultimo, dever´a imprimir a remunera¸c˜ao final. Caso a remunera¸c˜ao calculada pelo programa for iguai a R° 1100, imprima: ’Sua remuneracao e de 1100. ’ 35
  • 49.
    Solu¸c˜ao A solu¸c˜aousada 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. 5.3.3.2 Exemplo 3.1 Enunciado Um servidor p´ublico tem a possibilidade de aumentar sua remunera¸c˜ao se apresentar os t´ıtulos de especializa¸c˜ao e/ou de mestrado. O servidor poder´a apresentar apenas um diploma para cada titula¸c˜ao e s´o poder´a acumular os adicionais de titula¸c˜oes diferentes. Fa¸ca um programa que calcule a remunera¸c˜ao final de um servidor considerando os seguintes dados: Vencimento: R° 1.000,00 36
  • 50.
    Adicional de especializa¸c˜ao:3% do Vencimento Adicional de mestrado: 7% do Vencimento Remunera¸c˜ao final ´e a soma do vencimento e adicionais. O programa dever´a ler a resposta do usu´ario para as seguintes perguntas acerca dos t´ıtulos: ’Possui diploma de especializacao ?’ ’Possui diploma de mestrado?’ Por ´ultimo, dever´a imprimir a remunera¸c˜ao final. Caso a remunera¸c˜ao calculada pelo programa for iguai a R° 1100: ’Sua remuneracao e de 1100. ’ Solu¸c˜ao A solu¸c˜ao usada foi a seguinte 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
  • 51.
    5.3.3.3 Exemplo 3.2 EnunciadoUm servidor p´ublico tem a possibilidade de aumentar sua remunera¸c˜ao se apresentar os t´ıtulos de especializa¸c˜ao e/ou de mestrado. O servidor poder´a apresentar apenas um diploma para cada titula¸c˜ao e s´o poder´a acumular os adicionais de titula¸c˜oes diferentes. Fa¸ca um programa que calcule a remunera¸c˜ao final de um servidor considerando os seguintes dados: Vencimento: R° 1.000,00 Adicional de especializa¸c˜ao: 3% do Vencimento Adicional de mestrado: 7% do Vencimento Remunera¸c˜ao final ´e a soma do vencimento e adicionais. O programa dever´a ler a resposta do usu´ario para as seguintes perguntas acerca dos t´ıtulos: ’Possui diploma de especializacao ?’ ’Possui diploma de mestrado?’ Se o servidor tem especializa¸c˜ao, o programa dever´a imprimir a seguinte mensagem: ’Voce tem direito ao adicional de especializacao .’ Caso contr´ario, imprima: ’Subsidiamos cursos de especializacao .’ Logo depois, se o servidor tem mestrado, o programa dever´a imprimir a seguinte mensagem: ’Voce tem direito ao adicional de mestrado.’ Caso contr´ario, n˜ao imprima nada. Por ´ultimo, dever´a imprimir a remunera¸c˜ao final. Caso a remuneracao calculada pelo programa seja R° 1100: ’Sua remuneracao e de 1100 ’ 38
  • 52.
    Solu¸c˜ao A solu¸c˜aousada 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. 5.3.3.4 Exemplo 3.3 Enunciado Um servidor p´ublico tem a possibilidade de aumentar sua remunera¸c˜ao se apresentar os t´ıtulos de especializa¸c˜ao e/ou de mestrado. O servidor poder´a apresentar apenas um diploma para cada titula¸c˜ao e s´o poder´a acumular os adicionais de titula¸c˜oes diferentes. Fa¸ca um programa que calcule a remunera¸c˜ao final de um servidor considerando os seguintes dados: Vencimento: R° 1.000,00 Adicional de especializa¸c˜ao: 3% do Vencimento Adicional de mestrado: 7% do Vencimento 39
  • 53.
    Remunera¸c˜ao final ´ea soma do vencimento e adicionais. O programa dever´a ler a resposta do usu´ario para as seguintes perguntas acerca dos t´ıtulos: ’Possui diploma de especializacao ?’ ’Possui diploma de mestrado?’ Se o servidor tem especializa¸c˜ao, o programa dever´a imprimir a seguinte mensagem: ’Voce tem direito ao adicional de especializacao .’ Caso contr´ario, n˜ao deve imprimir nada. Logo depois, se o servidor tem mestrado, o programa dever´a imprimir a seguinte mensagem: ’Voce tem direito ao adicional de mestrado.’ Caso contr´ario, deve imprimir: ’Subsidiamos cursos de mestrado.’ Por ´ultimo, dever´a imprimir a remunera¸c˜ao final. Caso a remunera¸c˜ao calculada pelo programa seja R° 1100: ’Sua remuneracao e de 1100 ’ Solu¸c˜ao A solu¸c˜ao usada foi a seguinte 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
  • 54.
    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´arios Essa ´arvore busca apresentar ao aluno o uso de comandos if em s´erie. A primeira quest˜ao que se levantou foi: qual deve ser o n´umero de comandos if a serem apresentados em s´erie? Inicialmente, cogitamos apresentar exemplos com trˆes comandos if em s´erie, uma vez que t´ınhamos em mente utilizar ´arvores com trˆes caracter´ısticas remov´ıveis4 . Entretanto, os programas ficaram muito grandes, o que provavelmente os tornaria cansativos para os alunos. Decidimos, ent˜ao, utilizar dois comandos if em s´erie, com duas caracter´ısticas remov´ıveis. De fato, notamos que ´arvores com trˆes caracter´ısticas remov´ıveis tendem a gerar pro- gramas maiores, al´em de, naturalmente, ´arvores com mais n´os, o que pode ser cansativo ao aluno. Naturalmente, h´a exce¸c˜oes nas quais as ´arvores de trˆes caracter´ısticas s˜ao me- nos cansativas e at´e mais naturais. A ´arvore 2 (apresentada na se¸c˜ao 5.2) e a ´arvore 6 (apresentada na se¸c˜ao 5.6) s˜ao bons exemplos de exce¸c˜oes. 5.4 ´Arvore 4 A quarta ´arvore do cap´ıtulo 3 apresenta o uso de comandos if-then aninhados. As caracter´ısticas remov´ıveis s˜ao a presen¸ca da cl´ausula else no if-then interno, a presen¸ca do if-then interno na cl´ausula then externa5 e a presen¸ca do if-then interno na cl´ausula 4 Como ter´ıamos trˆes comandos if, poder´ıamos definir como caracter´ısticas remov´ıveis a presen¸ca da cl´ausula else no primeiro comando, a presen¸ca da cl´ausula else no segundo comando e a presen¸ca da cl´ausula else no terceiro comando, analogamente ao que fizemos com dois comandos if. 5 Isto ´e, o if-then interno s´o ser´a executado se a condi¸c˜ao do if-then externo for satisfeita. 41
  • 55.
    else externa6 . Comoh´a trˆes caracter´ısticas remov´ıveis, a ´arvore possui trˆes n´ıveis de hierarquia. A ´arvore possui oito exemplos. 5.4.1 Caracter´ısticas remov´ıveis C1. h´a uma cl´ausula else em pelo menos um if-then interno C2. h´a um comando if-then na cl´ausula then externa C3. h´a um comando if-then na cl´ausula else externa 5.4.2 Numera¸c˜ao dos exemplos C1 C2 C3 Exemplo • • • 4 (subse¸c˜ao 5.4.3.1) – • • 4.1 (subse¸c˜ao 5.4.3.2) • – • 4.2 (subse¸c˜ao 5.4.3.3) • • – 4.3 (subse¸c˜ao 5.4.3.4) – – • 4.1.1, 4.2.1 (subse¸c˜ao 5.4.3.5) – • – 4.1.2, 4.3.1 (subse¸c˜ao 5.4.3.5) • – – — (ver coment´arios na subse¸c˜ao 5.4.4) – – – — (ver coment´arios na subse¸c˜ao 5.4.4) 5.4.3 Enunciados e programas 5.4.3.1 Exemplo 4 Enunciado Os n´umeros complexos tˆem a forma a + bi e podem ser reais (caso b = 0) e n˜ao reais (caso b = 0). Se o n´umero for real, ele pode ser negativo (se a 0) ou n˜ao-negativo (se a ≥ 0). Eventualmente, o n´umero real pode ser neutro, isto ´e, igual a zero. Se a = 0 e b = 0, o n´umero complexo ´e um n´umero imagin´ario. Fa¸ca um programa que leia o valor da parte real a e o valor da parte imagin´aria b de um n´umero complexo. Se o n´umero for n˜ao real (b = 0), verifique se o n´umero ´e imagin´ario (a = 0). Se o n´umero for imagin´ario, imprima a mensagem: ’valor de a+ valor de bi e imaginario.’ Se o n´umero n˜ao for imagin´ario, n˜ao imprima nada. Se o n´umero for real (b = 0), verifique se o n´umero ´e negativo. Se for, imprima ’valor de a+ valor de bi e real negativo.’ Se n˜ao for negativo, imprima ’valor de a+ valor de bi e real nao -negativo.’ 6 Ou seja, o if-then interno s´o ser´a executado se a condi¸c˜ao do if-then externo n˜ao for satisfeita. 42
  • 56.
    Solu¸c˜ao A solu¸c˜aousada 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. 5.4.3.2 Exemplo 4.1 Enunciado Os n´umeros complexos tˆem a forma a + bi e podem ser reais (caso b = 0) e n˜ao reais (caso b = 0). Se o n´umero for real, ele pode ser negativo (se a 0) ou n˜ao-negativo (se a ≥ 0). Eventualmente, o n´umero real pode ser neutro, isto ´e, igual a zero. Se a = 0 e b = 0, o n´umero complexo ´e um n´umero imagin´ario. Fa¸ca um programa que leia o valor da parte real a e o valor da parte imagin´aria b de um n´umero complexo. Se o n´umero for n˜ao real (b = 0), verifique se o n´umero ´e imagin´ario (a = 0). Se o n´umero for imagin´ario, imprima a mensagem: ’valor de a+ valor de bi e imaginario.’ Se o n´umero n˜ao for imagin´ario, n˜ao imprima nada. Se o n´umero for real (b = 0), verifique se o n´umero ´e negativo. Se for, imprima ’valor de a+ valor de bi e real negativo.’ Se n˜ao for negativo, n˜ao imprima nada. 43
  • 57.
    Solu¸c˜ao A solu¸c˜aousada 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. 5.4.3.3 Exemplo 4.2 Enunciado Os n´umeros complexos tˆem a forma a + bi e podem ser reais (caso b = 0) e n˜ao reais (caso b = 0). Se o n´umero for real, ele pode ser negativo (se a 0) ou n˜ao-negativo (se a ≥ 0). Eventualmente, o n´umero real pode ser neutro, isto ´e, igual a zero. Se a = 0 e b = 0, o n´umero complexo ´e um n´umero imagin´ario. Fa¸ca um programa que leia o valor da parte real a e o valor da parte imagin´aria b de um n´umero complexo. Se o n´umero for n˜ao real (b = 0), imprima a mensagem: ’valor de a+ valor de bi e nao real.’ Se o n´umero n˜ao for imagin´ario, n˜ao imprima nada. Se o n´umero for real (b = 0), verifique se o n´umero ´e negativo. Se for, imprima ’valor de a+ valor de bi e real negativo.’ Se n˜ao for negativo, imprima: ’valor de a+ valor de bi e real nao -negativo.’ 44
  • 58.
    Solu¸c˜ao A solu¸c˜aousada 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. 5.4.3.4 Exemplo 4.3 Enunciado Os n´umeros complexos tˆem a forma a + bi e podem ser reais (caso b = 0) e n˜ao reais (caso b = 0). Se o n´umero for real, ele pode ser negativo (se a 0) ou n˜ao-negativo (se a ≥ 0). Eventualmente, o n´umero real pode ser neutro, isto ´e, igual a zero. Se a = 0 e b = 0, o n´umero complexo ´e um n´umero imagin´ario. Fa¸ca um programa que leia o valor da parte real a e o valor da parte imagin´aria b de um n´umero complexo. Se o n´umero for imagin´ario (a = 0), imprima a mensagem: ’valor de a+ valor de bi e imaginario.’ Se o n´umero n˜ao for imagin´ario, mas tamb´em n˜ao for real imprima: ’valor de a+ valor de bi e nao real.’ Se o n´umero for real (b = 0), imprima a mensagem: ’valor de a+ valor de bi e real.’ 45
  • 59.
    Solu¸c˜ao A solu¸c˜aousada 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. 5.4.3.5 Exemplos 4.1.1 e 4.2.1 Enunciado Os n´umeros complexos tˆem a forma a + bi e podem ser reais (caso b = 0) e n˜ao reais (caso b = 0). Se o n´umero for real, ele pode ser negativo (se a 0) ou n˜ao-negativo (se a ≥ 0). Eventualmente, o n´umero real pode ser neutro, isto ´e, igual a zero. Se a = 0 e b = 0, o n´umero complexo ´e um n´umero imagin´ario. Fa¸ca um programa que leia o valor da parte real a e o valor da parte imagin´aria b de um n´umero complexo. Se o n´umero for n˜ao real (b = 0), imprima a mensagem: ’valor de a+ valor de bi e nao real.’ Se o n´umero for real (b = 0), verifique se o n´umero ´e negativo. Se for, imprima ’valor de a+ valor de bi e real negativo.’ Solu¸c˜ao A solu¸c˜ao usada foi a seguinte program exemplo4_1_1 ; var a, b : real; 46
  • 60.
    begin writeln(’Digite a partereal:’); 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. 5.4.3.6 Exemplos 4.1.2 e 4.3.1 Enunciado Os n´umeros complexos tˆem a forma a + bi e podem ser reais (caso b = 0) e n˜ao reais (caso b = 0). Se o n´umero for real, ele pode ser negativo (se a 0) ou n˜ao-negativo (se a ≥ 0). Eventualmente, o n´umero real pode ser neutro, isto ´e, igual a zero. Se a = 0 e b = 0, o n´umero complexo ´e um n´umero imagin´ario. Fa¸ca um programa que leia o valor da parte real a e o valor da parte imagin´aria b de um n´umero complexo. Se o n´umero for n˜ao real (b = 0), verifique se o n´umero ´e imagin´ario (a = 0). Se o n´umero for imagin´ario, imprima a mensagem: ’valor de a+ valor de bi e imaginario.’ Se o n´umero n˜ao for real mas tamb´em n˜ao for imagin´ario, n˜ao imprima nada. Se o n´umero for real (b = 0), imprima a mensagem ’valor de a+ valor de bi e real.’ Solu¸c˜ao A solu¸c˜ao usada foi a seguinte program exemplo4_1_2 ; var a, b : real; begin writeln(’Digite a parte real:’); readln(a); writeln(’Digite a parte imaginaria:’); readln(b); if b 0 then 47
  • 61.
    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´arios N´os buscamos sempre fazer ´arvores totalmente preenchidas nas taxonomias. Por vezes, isso n˜ao ´e interessante; por exemplo, na ´arvore da se¸c˜ao 5.2 n˜ao h´a nenhum n´o que equiva- lha aos problemas sem caracter´ısticas remov´ıveis, pois o problema desse n´o seria bastante trivial. No caso da ´arvore dessa se¸c˜ao, ´e invi´avel fazer a ´arvore completa: ´e 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´ausula then ou de uma cl´ausula else — mas a remo¸c˜ao das caracter´ısticas C2 e C3 impedem que haja um comando if em qualquer uma das cl´ausulas. Al´em disso, um n´o que n˜ao tenha nenhuma das carac- ter´ısticas remov´ıveis pareceu-nos simples demais para constar na ´arvore, assim como na ´arvore 2. Consequentemente, os n´os 4.2 e 4.3 possuem apenas um problema subordinado. Essa configura¸c˜ao n˜ao aparenta ser muito boa: n˜ao sabemos se ´e conveniente ao aluno descer um n´ıvel da ´arvore para estudar apenas um exemplo. Na solu¸c˜ao7 do exemplo 4, ´e interessante notar que, enquanto o comando if dentro da cl´ausula else possui tanto a cl´ausula then quanto a cl´ausula else, o comando if dentro da cl´ausula then externa possui apenas a cl´ausula then. Isso foi uma decis˜ao consciente: ´e relevante para mostrar ao aluno como inserir um comando if sem uma cl´ausula else dentro de uma cl´ausula then8 . Al´em disso, essa configura¸c˜ao ´e assim´etrica: os comandos dentro da cl´ausula then externa e else externa possuem estruturas diferentes. Acreditamos que uma apresenta¸c˜ao assim´etrica incentiva o aluno a compreender melhor a ortogonalidade do comando, e exercita melhor seu racioc´ınio. Essa ´e uma quest˜ao vasta que escapa ao escopo do nosso projeto. 5.5 ´Arvore 5 A quinta ´arvore apresenta o uso de comandos if em cascata. Em outras palavras, essa ´arvore visa exercitar o aluno no uso (bastante comum) de comandos if com cl´ausulas else em uma estrutura semelhante a if condicao1 then comando1 7 Ver se¸c˜ao 5.4.3.1. 8 Para fazer isso, nota-se que ´e preciso usar os agrupadores begin e end. Caso contr´ario, a cl´ausula else do if interno ser´a associada ao if externo. 48
  • 62.
    else if condicao2then comando2 else if condicao3 then comando3 else if condicao4 then comando4; Suas caracter´ısticas remov´ıveis s˜ao a presen¸ca de else ao final da cascata, presen¸ca de if interno com else e presen¸ca de if interno sem else. O comando if interno ocorrer´a entre outros comandos dentro do bloco begin-end do if-then que o cont´em. Como h´a trˆes caracter´ısticas remov´ıveis, temos uma ´arvore de profundidade 3. 5.5.1 Caracter´ısticas remov´ıveis C1. presen¸ca de else ao final da cascata C2. presen¸ca de if-then interno com else C3. presen¸ca de if-then interno sem else 5.5.2 Numera¸c˜ao dos exemplos C1 C2 C3 Exemplo • • • 5 (subse¸c˜ao 5.5.3.1) • • – 5.1 (subse¸c˜ao 5.5.3.2) • – • 5.2 (subse¸c˜ao 5.5.3.3) – • • 5.3 (subse¸c˜ao 5.5.3.4) • – – 5.1.1, 5.2.1 (subse¸c˜ao 5.5.3.5) – • – 5.1.2, 5.3.1 (subse¸c˜ao 5.5.3.6) – – • 5.2.2, 5.3.2 (subse¸c˜ao 5.5.3.7) – – – — (ver coment´arios na subse¸c˜ao 5.5.4) 5.5.3 Enunciados e programas 5.5.3.1 Exemplo 5 Enunciado Um restaurante quer informar aos seus clientes o prato do dia e descontos promocionais. Ele funciona `as das ter¸cas `as quintas. Fa¸ca um programa que forne¸ca tais informa¸c˜oes de acordo com as seguintes condi¸c˜oes: O usu´ario dever´a informar um n´umero 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 3, o programa dever´a solicitar a idade do usu´ario: ’Digite sua idade:’ 49
  • 63.
    Se a idadefor maior que zero, o programa dever´a imprimir o desconto, onde o numero da porcentagem ´e igual `a idade. Por exemplo, se o usu´ario digitar a idade 30 o programa dever´a imprimir: ’Desconto: 30% ’ Caso contr´ario, quando a idade for menor ou igual a zero, o programa dever´a imprimir a mensagem: ’Idade invalida: sem descondo ’ Se o dia escolhido for o dia 5, o programa dever´a imprimir a pergunta: ’Possui cupom de desconto?’ Se o usu´ario digitar s, o programa dever´a imprimir: ’Desconto: 10% ’ O programa dever´a, tamb´em, imprimir o prato do dia conforme o dia escolhido. Se o dia escolhido for 3, ter¸ca-feira, o programa dever´a imprimir: ’Prato do dia: macarronada ’ Se o dia escolhido for 4, quarta-feira, o programa dever´a imprimir: ’Prato do dia: galinhada ’ Se o dia escolhido for 5, quinta-feira, o programa dever´a imprimir: ’Prato do dia: feijoada ’ Se o dia escolhido for qualquer numero diferente dos anteriores, o programa dever´a imprimir: ’Restaurante fechado ’ 50
  • 64.
    Solu¸c˜ao A solu¸c˜aousada 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. 5.5.3.2 Exemplo 5.1 Enunciado Um restaurante quer informar aos seus clientes o prato do dia e descontos promocionais. Ele funciona `as das ter¸cas `as quintas. 51
  • 65.
    Fa¸ca um programaque forne¸ca tais informa¸c˜oes de acordo com as seguintes condi¸c˜oes: O usu´ario dever´a informar um n´umero 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´a solicitar a idade do usu´ario: ’Digite sua idade:’ Se a idade for maior que zero, o programa dever´a imprimir o desconto, onde o numero da porcentagem ´e igual `a idade. Por exemplo, se o usu´ario digitar a idade 30 o programa dever´a imprimir: ’Desconto: 30% ’ Caso contr´ario, quando a idade for menor ou igual a zero, o programa dever´a imprimir a mensagem: ’Idade invalida: sem descondo ’ O programa dever´a, tamb´em, imprimir o prato do dia conforme o dia escolhido. Se o dia escolhido for 3, ter¸ca-feira, o programa dever´a imprimir: ’Prato do dia: macarronada ’ Se o dia escolhido for 4, quarta-feira, o programa dever´a imprimir: ’Prato do dia: galinhada ’ Se o dia escolhido for 5, quinta-feira, o programa dever´a imprimir: ’Prato do dia: feijoada ’ Se o dia escolhido for qualquer numero diferente dos anteriores, o programa dever´a imprimir: ’Restaurante fechado ’ 52
  • 66.
    Solu¸c˜ao A solu¸c˜aousada 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. 5.5.3.3 Exemplo 5.2 Enunciado Um restaurante quer informar aos seus clientes o prato do dia e descontos promocionais. Ele funciona `as das ter¸cas `as quintas. Fa¸ca um programa que forne¸ca tais informa¸c˜oes de acordo com as seguintes condi¸c˜oes: O usu´ario dever´a informar um n´umero 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´a solicitar a idade do usu´ario: ’Possui cupom de desconto?’ 53
  • 67.
    Se o usu´ariodigitar ’s’, o programa dever´a imprimir: ’Desconto: 10% ’ O programa dever´a, tamb´em, imprimir o prato do dia conforme o dia escolhido. Se o dia escolhido for 3, ter¸ca-feira, o programa dever´a imprimir: ’Prato do dia: macarronada ’ Se o dia escolhido for 4, quarta-feira, o programa dever´a imprimir: ’Prato do dia: galinhada ’ Se o dia escolhido for 5, quinta-feira, o programa dever´a imprimir: ’Prato do dia: feijoada ’ Se o dia escolhido for qualquer numero diferente dos anteriores, o programa dever´a imprimir: ’Restaurante fechado ’ Solu¸c˜ao A solu¸c˜ao usada foi a seguinte program exemplo5_2; 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
  • 68.
    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. 5.5.3.4 Exemplo 5.3 Enunciado Um restaurante quer informar aos seus clientes o prato do dia e descontos promocionais. Ele funciona `as das ter¸cas `as quintas. Fa¸ca um programa que forne¸ca tais informa¸c˜oes de acordo com as seguintes condi¸c˜oes: O usu´ario dever´a informar um n´umero 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 3, o programa dever´a solicitar a idade do usu´ario: ’Digite sua idade:’ Se a idade for maior que zero, o programa dever´a imprimir o desconto, onde o numero da porcentagem ´e igual `a idade. Por exemplo, se o usu´ario digitar a idade 30 o programa dever´a imprimir: ’Desconto: 30% ’ Caso contr´ario, quando a idade for menor ou igual a zero, o programa dever´a imprimir a mensagem: ’Idade invalida: sem descondo ’ Se o dia escolhido for o dia 5, o programa dever´a imprimir a pergunta: ’Possui cupom de desconto?’ Se o usu´ario digitar s, o programa dever´a imprimir: ’Desconto: 10% ’ 55
  • 69.
    O programa dever´a,tamb´em, imprimir o prato do dia conforme o dia escolhido. Se o dia escolhido for 3, ter¸ca-feira, o programa dever´a imprimir: ’Prato do dia: macarronada ’ Se o dia escolhido for 4, quarta-feira, o programa dever´a imprimir: ’Prato do dia: galinhada ’ Se o dia escolhido for 5, quinta-feira, o programa dever´a imprimir: ’Prato do dia: feijoada ’ Se o dia escolhido for qualquer numero diferente dos anteriores, o programa dever´a n˜ao imprimir nada. Solu¸c˜ao A solu¸c˜ao usada foi a seguinte program exemplo5_3; 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
  • 70.
    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. 5.5.3.5 Exemplos 5.1.1 e 5.2.1 Enunciado Um restaurante quer informar aos seus clientes o prato do dia e descontos promocionais. Ele funciona `as das ter¸cas `as quintas. Fa¸ca um programa que forne¸ca tais informa¸c˜oes de acordo com as seguintes condi¸c˜oes: O usu´ario dever´a informar um n´umero 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: O programa dever´a, tamb´em, imprimir o prato do dia conforme o dia escolhido. Se o dia escolhido for 3, ter¸ca-feira, o programa dever´a imprimir: ’Prato do dia: macarronada ’ Se o dia escolhido for 4, quarta-feira, o programa dever´a imprimir: ’Prato do dia: galinhada ’ Se o dia escolhido for 5, quinta-feira, o programa dever´a imprimir: ’Prato do dia: feijoada ’ Se o dia escolhido for qualquer numero diferente dos anteriores, o programa dever´a imprimir: ’Restaurante fechado ’ 57
  • 71.
    Solu¸c˜ao A solu¸c˜aousada 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. 5.5.3.6 Exemplos 5.1.2 e 5.3.1 Enunciado Um restaurante quer informar aos seus clientes o prato do dia e descontos promocionais. Ele funciona `as das ter¸cas `as quintas. Fa¸ca um programa que forne¸ca tais informa¸c˜oes de acordo com as seguintes condi¸c˜oes: O usu´ario dever´a informar um n´umero 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´a solicitar a idade do usu´ario: ’Digite sua idade:’ Se a idade for maior que zero, o programa dever´a imprimir o desconto, onde o numero da porcentagem ´e igual `a idade. Por exemplo, se o usu´ario digitar a idade 30 o programa dever´a imprimir: ’Desconto: 30% ’ Caso contr´ario, quando a idade for menor ou igual a zero, o programa dever´a imprimir a mensagem: 58
  • 72.
    ’Idade invalida: semdescondo ’ O programa dever´a, tamb´em, imprimir o prato do dia conforme o dia escolhido. Se o dia escolhido for 3, ter¸ca-feira, o programa dever´a imprimir: ’Prato do dia: macarronada ’ Se o dia escolhido for 4, quarta-feira, o programa dever´a imprimir: ’Prato do dia: galinhada ’ Se o dia escolhido for 5, quinta-feira, o programa dever´a imprimir: ’Prato do dia: feijoada ’ Se o dia escolhido for qualquer numero diferente dos anteriores, o programa dever´a n˜ao imprimir nada. Solu¸c˜ao A solu¸c˜ao usada foi a seguinte program exemplo5_1_2 ; 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
  • 73.
    writeln(’Idade invalida: semdesconto ’); writeln(’Prato do dia: galinhada ’); end else if dia = 5 then writeln(’Restaurante fechado ’); end. 5.5.3.7 Exemplos 5.2.2 e 5.3.2 Enunciado Um restaurante quer informar aos seus clientes o prato do dia e descontos promocionais. Ele funciona `as das ter¸cas `as quintas. Fa¸ca um programa que forne¸ca tais informa¸c˜oes de acordo com as seguintes condi¸c˜oes: O usu´ario dever´a informar um n´umero 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´a imprimir a pergunta: ’Possui cupom de desconto?’ Se o usu´ario digitar s, o programa dever´a imprimir: ’Desconto: 10% ’ O programa dever´a, tamb´em, imprimir o prato do dia conforme o dia escolhido. Se o dia escolhido for 3, ter¸ca-feira, o programa dever´a imprimir: ’Prato do dia: macarronada ’ Se o dia escolhido for 4, quarta-feira, o programa dever´a imprimir: ’Prato do dia: galinhada ’ Se o dia escolhido for 5, quinta-feira, o programa dever´a imprimir: ’Prato do dia: feijoada ’ Se o dia escolhido for qualquer numero diferente dos anteriores, o programa dever´a n˜ao imprimir nada. 60
  • 74.
    Solu¸c˜ao A solu¸c˜aousada 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´arios A ´arvore foi assim estabelecida de modo a exercitar o uso de sequˆencias de comandos if- then mutualmente exclusivas, uma configura¸c˜ao em cascata. A partir de tal configura¸c˜ao, estabelecemos trˆes caracter´ısticas remov´ıveis atendendo os crit´erios seguintes: Uso do comando final else complementando a configura¸c˜ao em cascata Uso de comandos avulsos if-then e else dentro de uma configura¸c˜ao em cascata A configura¸c˜ao em cascata sugere a resolu¸c˜ao de problemas nos quais o programador dever´a cobrir uma listas de poss´ıveis condi¸c˜oes exclusivas entre si, bem determinadas ou n˜ao. Neste sentido, o uso do comando final else cobre as condi¸c˜oes indeterminadas, estendendo o conceito j´a apresentado para configura¸c˜oes mais simples. 61
  • 75.
    O uso decomandos comandos avulsos if-then e else tem o objetivo de indicar ao aluno a possibilidade de inclus˜ao destes comandos dentro da configura¸c˜ao proposta na ´arvore tal como quaisquer outros comandos dentro do bloco begin-end. 5.6 ´Arvore 6 A sexta ´arvore encerra o cap´ıtulo de comandos de decis˜ao com a apresenta¸c˜ao de estruturas case. Estas estruturas estendem e simplificam a experiˆencia adquirida com comandos if. A sua fundamenta¸c˜ao ocorre sobre trˆes caracter´ısticas remov´ıveis: presen¸ca de intervalos; presen¸ca de else; presen¸ca de blocos de comandos. ´Arvore de profundidade 3. 5.6.1 Caracter´ısticas remov´ıveis C1. presen¸ca de bloco, begin-end, de comandos. C2. presen¸ca de cl´ausula else C3. presen¸ca de intervalos 5.6.2 Numera¸c˜ao dos exemplos C1 C2 C3 Exemplo • • • 6 (subse¸c˜ao 5.6.3.1) • • – 6.1 (subse¸c˜ao 5.6.3.2) • – • 6.2 (subse¸c˜ao 5.6.3.3) – • • 6.3 (subse¸c˜ao 5.6.3.4) • – – 6.1.2, 6.2.2 (subse¸c˜ao 5.6.3.6) – • – 6.1.3, 6.3.2 (subse¸c˜ao 5.6.3.7) – – • 6.2.3 (subse¸c˜ao 5.6.3.8) – – – 6.1.1, 6.2.1, 6.3.1 (subse¸c˜ao 5.6.3.5) 5.6.3 Enunciados e programas 5.6.3.1 Exemplo 6 Enunciado Uma agˆencia de consultoria financeira classifica os pa´ıses em uma escala de 1 a 5. Pa´ıses nos n´ıveis 1 e 2 s˜ao ruins para se investir. Pa´ıses no n´ıvel 3 s˜ao razo´aveis para se investir. Pa´ıses no n´ıvel 4 s˜ao bons para se investir, e pa´ıses no n´ıvel 5 s˜ao os melhores. Escreva um programa que pergunta o nome de um pa´ıs e o seu n´ıvel no ranking da agˆencia. Se o pa´ıs for n´ıvel 1 ou 2, imprima a mensagem: ’nome do pais e ruim para investir ’ 62
  • 76.
    Se o pa´ısestiver no n´ıvel 3, imprima a mensagem: ’nome do pais e razoavel para investir ’ e, depois, a mensagem: ’Ha paises melhores ’ Se o pa´ıs for n´ıvel 4, imprima a mensagem: ’nome do pais e bom para investir ’ Se o pa´ıs estiver no n´ıvel 5, imprima a mensagem: ’nome do pais e otimo para investir ’ seguida de ’Recomendamos investir nele ’ Caso o n´ıvel n˜ao seja nenhum desses, imprima a mensagem: ’Nivel invalido ’ Solu¸c˜ao A solu¸c˜ao usada foi a seguinte 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
  • 77.
    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. 5.6.3.2 Exemplo 6.1 Enunciado Outra agˆencia de consultoria financeira classifica os pa´ıses em uma escala de 1 a 5. Um pa´ıs no n´ıvel 1 ´e um p´essimo lugar para se investir. Pa´ıses no n´ıvel 2 s˜ao locais ruins para se investir. Pa´ıses no n´ıvel 3 s˜ao medianos, razo´aveis para se investir. Qualquer pa´ıs 4 j´a ´e bom para se investir, e se estiver no n´ıvel 5, o pa´ıs ´e ´otimo. Escreva um programa que pergunta o nome de um pa´ıs e o seu n´ıvel no ranking da agˆencia. Se o pa´ıs for n´ıvel 1, imprima a mensagem: ’nome do pais e pessimo para investir ’ Se o pa´ıs estiver no n´ıvel entre 2, imprima a mensagem: ’nome do pais e ruim para investir ’ e, depois, a mensagem: Recomendamos nao investir nele Se o pa´ıs for n´ıvel 3, imprima a mensagem: ’nome do pais e razoavel para investir ’ seguida da mensagem: Recomendamos investir em paises de nivel 4 Se o pa´ıs estiver no n´ıvel 4, imprima a mensagem: ’nome do pais e bom para investir ’ Se o pa´ıs estiver for n´ıvel 5, imprima a mensagem: ’nome do pais e otimo para investir ’ Caso o n´ıvel n˜ao seja nenhum desses, imprima a mensagem: ’Nivel invalido ’ 64
  • 78.
    Solu¸c˜ao A solu¸c˜aousada 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. 5.6.3.3 Exemplo 6.2 Enunciado Uma agˆencia de consultoria financeira classifica os pa´ıses em uma escala de 1 a 5. Pa´ıses nos n´ıveis 1 e 2 s˜ao ruins para se investir. Pa´ıses no n´ıvel 3 s˜ao razo´aveis para se investir. Pa´ıses no n´ıvel 4 s˜ao bons para se investir, e pa´ıses no n´ıvel 5 s˜ao os melhores, e s˜ao geralmente um ou dois. Escreva um programa que pergunta o nome de um pa´ıs e o seu n´ıvel no ranking da agˆencia. Se o pa´ıs for n´ıvel 1 ou 2, imprima a mensagem: ’nome do pais e ruim para investir ’ Se o pa´ıs estiver no n´ıvel 3, imprima a mensagem: ’nome do pais e razoavel para investir ’ 65
  • 79.
    e, depois, amensagem: ’Ha paises melhores ’ Se o pa´ıs for n´ıvel 4, imprima a mensagem: ’nome do pais e bom para investir ’ Se o pa´ıs estiver no n´ıvel 5, imprima a mensagem: ’nome do pais e otimo para investir ’ seguida de ’Recomendamos investir nele ’ Caso o n´ıvel n˜ao seja nenhum desses, n˜ao imprima nada. Solu¸c˜ao A solu¸c˜ao usada foi a seguinte 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
  • 80.
    5.6.3.4 Exemplo 6.3 EnunciadoUma agˆencia de consultoria financeira classifica os pa´ıses em uma escala de 1 a 5. Pa´ıses nos n´ıveis 1 e 2 s˜ao ruins para se investir. Pa´ıses no n´ıvel 3 s˜ao razo´aveis para se investir. Pa´ıses no n´ıvel 4 s˜ao bons para se investir, e pa´ıses no n´ıvel 5 s˜ao os melhores, e s˜ao geralmente um ou dois. Escreva um programa que pergunta o nome de um pa´ıs e o seu n´ıvel no ranking da agˆencia. Se o pa´ıs for n´ıvel 1 ou 2, imprima a mensagem: ’nome do pais e ruim para investir ’ Se o pa´ıs estiver no n´ıvel 3, imprima a mensagem: ’nome do pais e razoavel para investir ’ Se o pa´ıs for n´ıvel 4, imprima a mensagem: ’nome do pais e bom para investir ’ Se o pa´ıs estiver no n´ıvel 5, imprima a mensagem: ’nome do pais e otimo para investir ’ Caso o n´ıvel n˜ao seja nenhum desses, imprima a mensagem: ’Nivel invalido ’ Solu¸c˜ao A solu¸c˜ao usada foi a seguinte 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
  • 81.
    5.6.3.5 Exemplos 6.1.1e 6.2.1 e 6.3.1 Enunciado Outra agˆencia de consultoria financeira classifica os pa´ıses em uma escala de 1 a 5. Um pa´ıs no n´ıvel 1 ´e um p´essimo lugar para se investir. Pa´ıses no n´ıvel 2 s˜ao locais ruins para se investir. Pa´ıses no n´ıvel 3 s˜ao medianos, razo´aveis para se investir. Qualquer pa´ıs 4 j´a ´e bom para se investir, e se estiver no n´ıvel 5, o pa´ıs ´e ´otimo. Escreva um programa que pergunta o nome de um pa´ıs e o seu n´ıvel no ranking da agˆencia. Se o pa´ıs for n´ıvel 1, imprima a mensagem: ’nome do pais e pessimo para investir ’ Se o pa´ıs estiver no n´ıvel entre 2, imprima a mensagem: ’nome do pais e ruim para investir ’ Se o pa´ıs for n´ıvel 3, imprima a mensagem: ’nome do pais e razoavel para investir ’ Se o pa´ıs estiver no n´ıvel 4, imprima a mensagem: ’nome do pais e bom para investir ’ Se o pa´ıs estiver for n´ıvel 5, imprima a mensagem: ’nome do pais e otimo para investir ’ Caso o n´ıvel n˜ao seja nenhum desses, n˜ao imprima nada. Solu¸c˜ao A solu¸c˜ao usada foi a seguinte 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
  • 82.
    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. 5.6.3.6 Exemplos 6.1.2 e 6.2.2 Enunciado Outra agˆencia de consultoria financeira classifica os pa´ıses em uma escala de 1 a 5. Um pa´ıs no n´ıvel 1 ´e um p´essimo lugar para se investir. Pa´ıses no n´ıvel 2 s˜ao locais ruins para se investir. Pa´ıses no n´ıvel 3 s˜ao medianos, razo´aveis para se investir. Qualquer pa´ıs 4 j´a ´e bom para se investir, e se estiver no n´ıvel 5, o pa´ıs ´e ´otimo. Escreva um programa que pergunta o nome de um pa´ıs e o seu n´ıvel no ranking da agˆencia. Se o pa´ıs for n´ıvel 1, imprima a mensagem: ’nome do pais e pessimo para investir ’ Se o pa´ıs estiver no n´ıvel entre 2, imprima a mensagem: ’nome do pais e ruim para investir ’ e, depois, a mensagem: Recomendamos nao investir nele Se o pa´ıs for n´ıvel 3, imprima a mensagem: ’nome do pais e razoavel para investir ’ Se o pa´ıs estiver no n´ıvel 4, imprima a mensagem: ’nome do pais e bom para investir ’ seguida da mensagem: Recomendamos investir em paises de nivel 4 Se o pa´ıs for n´ıvel 5, imprima a mensagem: ’nome do pais e otimo para investir ’ Caso o n´ıvel n˜ao seja nenhum desses, n˜ao imprima nada. 69
  • 83.
    Solu¸c˜ao A solu¸c˜aousada 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. 5.6.3.7 Exemplos 6.1.3 e 6.3.2 Enunciado Outra agˆencia de consultoria financeira classifica os pa´ıses em uma escala de 1 a 5. Um pa´ıs no n´ıvel 1 ´e um p´essimo lugar para se investir. Pa´ıses no n´ıvel 2 s˜ao locais ruins para se investir. Pa´ıses no n´ıvel 3 s˜ao medianos, razo´aveis para se investir. Qualquer pa´ıs 4 j´a ´e bom para se investir, e se estiver no n´ıvel 5, o pa´ıs ´e ´otimo. Escreva um programa que pergunta o nome de um pa´ıs e o seu n´ıvel no ranking da agˆencia. Se o pa´ıs for n´ıvel 1, imprima a mensagem: ’nome do pais e pessimo para investir ’ Se o pa´ıs estiver no n´ıvel entre 2, imprima a mensagem: ’nome do pais e ruim para investir ’ Se o pa´ıs for n´ıvel 3, imprima a mensagem: 70
  • 84.
    ’nome do pais e razoavel para investir ’ Se o pa´ıs estiver no n´ıvel 4, imprima a mensagem: ’nome do pais e bom para investir ’ Se o pa´ıs estiver for n´ıvel 5, imprima a mensagem: ’nome do pais e otimo para investir ’ Caso o n´ıvel n˜ao seja nenhum desses, imprima a mensagem: ’Nivel invalido ’ Solu¸c˜ao A solu¸c˜ao usada foi a seguinte 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
  • 85.
    5.6.3.8 Exemplos 6.2.3 EnunciadoUma agˆencia de consultoria financeira classifica os pa´ıses em uma escala de 1 a 5. Pa´ıses nos n´ıveis 1 e 2 s˜ao ruins para se investir. Pa´ıses no n´ıvel 3 s˜ao razo´aveis para se investir. Pa´ıses no n´ıvel 4 s˜ao bons para se investir, e pa´ıses no n´ıvel 5 s˜ao os melhores, e s˜ao geralmente um ou dois. Escreva um programa que pergunta o nome de um pa´ıs e o seu n´ıvel no ranking da agˆencia. Se o pa´ıs for n´ıvel 1 ou 2, imprima a mensagem: ’nome do pais e pessimo para investir ’ Se o pa´ıs estiver no n´ıvel 3, imprima a mensagem: ’nome do pais e razoavel para investir ’ Se o pa´ıs for n´ıvel 4, imprima a mensagem: ’nome do pais e bom para investir ’ Se o pa´ıs estiver no n´ıvel 5, imprima a mensagem: ’nome do pais e otimo para investir ’ Caso o n´ıvel n˜ao seja nenhum desses, n˜ao imprima nada. Solu¸c˜ao A solu¸c˜ao usada foi a seguinte 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
  • 86.
    5.6.4 Coment´arios As ´arvoresde 1 a 5 apresentaram o uso do comando if. Elas foram concebidas por agrupamentos de caracter´ısticas afins cujo crit´erio para afinidade e sele¸c˜ao atendem a determinadas premissas did´aticas. No entanto, ainda restava-nos definir uma configura¸c˜ao que represente os comandos case. Em geral, a op¸c˜ao 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¸c˜ao de comandos if em cascata. Um valor ´e ava- liado e o fluxo de execu¸c˜ao do programa ´e desviado para uma entre diversas op¸c˜oes que corresponda aquele valor. Tal como ocorre no uso de if, a execu¸c˜ao do programa pode ser desviada para um simples comando ou um bloco de comandos. Tamb´em contamos com a op¸c˜ao da cl´ausula else a fim de cobrir todo o universo de possibilidades para a vari´avel avaliada. A sofistica¸c˜ao possibilitada por uso do comando case apresenta uma caracter´ıstica nova: pode-se definir a execu¸c˜ao a partir de um valor ou de uma s´erie de valores que configurem um intervalo sem o uso de operadores l´ogicos. 73
  • 87.
    Cap´ıtulo 6 Conclus˜oes eTrabalhos Futuros Dados os desafios do ensino de programa¸c˜ao, uma das abordagens para lidar com eles ´e o uso de softwares de aux´ılio `a aprendizagem. Um modelo de software de aux´ılio `a aprendizagem bastante promissor s˜ao os sistemas tutoriais inteligentes, que permitem a adapta¸c˜ao do tutorial `as necessidades do estudante. O Tutorial ICC evolui nesta dire¸c˜ao, n˜ao tanto para se tornar um STI em todos os sentidos, mas sim para tornar-se um sistema tutorial dotado de inteligˆencia. Este trabalho d´a mais um passo nessa dire¸c˜ao. N´os desenvolvemos taxonomias de exemplos que exercitam diversos aspectos da aprendizagem de programa¸c˜ao em n´ıveis de dificuldades diferentes. Um framework conceitual para o desenvolvimento de taxonomias ´e uma id´eia nova. A parte pr´atica de nosso trabalho focou-se em desenvolver este framework e aplic´a-lo ao desenvolvimento de taxonomias. Assim sendo, o resultado do nosso trabalho inclui, al´em das taxonomias em si, um framework com uma terminologia, conceitos e procedimentos pr´oprios, que podem auxiliar o desenvolvimento e evolu¸c˜ao de taxonomias de exemplos hier´arquicas. Certamente, por´em, os v´arios aspectos das taxonomias de exemplos est˜ao 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ˆencias de professores, mas certamente h´a outras maneiras de se isolar conceitos e dificuldades relevantes. Outro poss´ıvel objeto de trabalho futuro ´e uma avalia¸c˜ao da efic´acia do uso de taxo- nomias de exemplos. Uma vez que se tenha uma melhor id´eia da efic´acia das taxonomias, outro passo seria uma pesquisa no aprimoramento do framework de desenvolvimento de taxonomias, de modo a gerar ´arvores cada vez mais eficientes. Ademais, pesquisas para desenvolver interfaces mais adaptativas e intuitivas para as taxonomias s˜ao tamb´em bastante interessantes. Vale lembrar que as taxonomias s˜ao apenas um dos m´odulos do sistema, e um sistema tutorial dotado de alguma inteligˆencia possui uma s´erie de desafios no que tange `a sua interface. 74
  • 88.
    Referˆencias ACM. Computing Curricula2005. 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 Hugh L. Burns e Charles G. Capps. Foundations of Intelligent Tutoring Systems: An introduction. In Martha C. Polson, J. Jeffrey Richardson, e Eliot Soloway, editors, Foundations of Intelligent Tutoring Systems, pages 1—19. Lawrence Erlbaum Associa- tes Publishers, 1988. 9, 10 Pat Byrne e Gerry Lyons. The effect of student attributes on success in programming. ACM SIGCSE Bulletin, 33(3):49—52, 2001. 4 Stephen E. Carlson. MIT OpenCourseWare Program Evaluation Findings Report. Tech- nical report, Massachusetts Institute of Technology (MIT), 2004. 1 Pedro Ara´ujo Chaves J´unior e Eliza Silveira Bastos. Interface orientada a estilos de aprendizagem em um tutorial para ensino de computa¸c˜ao, dezembro 2008. Monogra- fia apresentada como requisito parcial para conclus˜ao do Bacharelado em Ciˆencia da Computa¸c˜ao e Licenciatura em Computa¸c˜ao 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¸c˜ao. 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¸c˜ao via internet. In SULCOMP-I Congresso Sul Catarinense de Computa¸c˜ao, 2005. 1 75
  • 89.
    Michel Foucault. AsPalavras e as Coisas. Martins Fontes, 3 edition, 2002. No pref´acio, Foucault se refere a um texto de Borges sobre uma “certa enciclop´edia chinesa”. 12 Reva Freedman. What is an Intelligent Tutoring System? Intelligence, (11):15—16, 2000. 8 Anabela Gomes e A. J. Mendes. Learning to program — difficulties and solutions. In International inproceedings on Engineering Education – ICEE 2007, 2007. 1, 2, 4, 6, 7 Leo Gugerty. Non-diagnostic intelligent tutoring systems: Teaching without student mo- dels. Instructional Science, (25):409—432, 1997. 10 Antˆonio Houaiss, Mauro de Salles Villar, e Francisco Manoel Mello Franco. Dicion´ario Houaiss da l´ıngua portuguesa. Editora Objetiva, 2001. Verbete taxonomia. 15 Kenneth E. Iverson. Notation as a tool of thought. Communications of the ACM, 23(8): 444—465, agosto 1980. 6 Tom Jenkins. On the difficulty of learning to program. In Proceedings of 3rd LTSN-ICS inproceedings, pages 53—58, 2003. 2, 4, 5, 6, 7 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 D. Keirsey. Please Understand Me II: Temperament, Character, Intelligence. Prometheus Nemesis Book Company, 1998. 5 Essi Lahtinen, Kirsti Ala-Mutka, e Hannu-Matti J¨arvinen. A study of the difficulties of novice programmers. In The 10th Annual inproceedings on Innovation and Technology in Computer Science Education — ITiCSE’05, pages 14—18. Universidade Nova de Lisboa, Portugal, junho 2005. 7 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 Roger Nkambou. Towards Affective Intelligent Tutoring System. In G. Rebolledo-Mendez e Martinez-Miron E., editors, 8th International inproceedings on ITS, pages 5—12, 2006. 9 Roy D. Pea. Language-independent conceptual bugs in novice programming. Journal of Educational Computing Research, 2(1), 1986. 6 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
  • 90.
    Homero Luiz P´ıccolo.Tutorial dotado de inteligˆencia para orienta¸c˜ao de alunos novatos em uma biblioteca universit´aria: 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 John Self. Student Models in Computer-Aided Instruction. International Journal of Man-Machine Studies, (6):261—276, mar¸co 1974. 10 James G. Spohrer e Eliot Soloway. Empirical Studies of Programmers, chapter 16 — Analyzing the High Frequency Bugs in Novice Programs, pages 230—251. Intellect Books, second, completely revised edition, 1986. 6 Niklaus Wirth. The Programming Language Pascal. Berichte der Fachgruppe Computer- Wissenschaften, novembro 1972. 6 77
  • 91.
    Apˆendice A Taxonomias doCap´ıtulo 2 do Tutorial ICC A.1 ´Arvore 1 Uso de constantes e vari´aveis de v´arios tipos e formata¸c˜ao na sa´ıda dos dados. A.1.1 Caracter´ısticas remov´ıveis C1. uso de constantes e vari´aveis de v´arios tipos C2. formata¸c˜ao na sa´ıda dos dados A.1.2 Numera¸c˜ao dos exemplos C1 C2 Exemplo • • 1 – – 1.1 – • 1.2 • – 1.3 A.1.3 Enunciados A.1.3.1 Exemplo 1 Fa¸ca um programa que pe¸ca ao usu´ario 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 ´ultimo escrito com dois algarismos depois da v´ırgula. O programa deve colocar um t´ıtulo sobre os dados indicando nome, idade e peso. 78
  • 92.
    A.1.3.2 Exemplo 1.1 Fa¸caum programa que pe¸ca ao usu´ario 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.1.3.3 Exemplo 1.2 Fa¸ca um programa que pe¸ca ao usu´ario 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, formatando as sa´ıdas do seguinte modo: 10 caracteres para o nome, 5 para a idade e 6 para o peso, sendo este ´ultimo escrito com dois algarismos depois da v´ırgula. A.1.3.4 Exemplo 1.3 Fa¸ca um programa que pe¸ca ao usu´ario 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. O programa deve colocar um t´ıtulo sobre os dados indicando nome, idade e peso. A.2 ´Arvore 2 Uso de express˜oes aritm´eticas e uso de fun¸c˜oes. A.2.1 Caracter´ısticas remov´ıveis C1. uso de express˜oes aritm´eticas com v´arios operadores C2. uso de fun¸c˜oes A.2.2 Numera¸c˜ao dos exemplos C1 C2 Exemplo • • 2 – – 2.1 – • 2.2 • – 2.3 79
  • 93.
    A.2.2.1 Exemplo 2 Fa¸caum programa para ler dois ˆangulos (em graus) alfa e beta. Transforme os ˆangulos para radianos e a seguir calcule os valores reais x e y dados pelas express˜oes: x = (cos2 (alfa) − sen2 (beta))/(2cos(alfa)) y = sen2 (alfa) − 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. A.2.2.2 Exemplo 2.1 Fa¸ca um programa para ler dois valores reais x e y. O programa deve imprimir os dois valores e, em seguida, deve trocar esses valores entre si e imprim´ı-los novamente. A.2.2.3 Exemplo 2.2 Fa¸ca um programa para ler dois ˆangulos (em graus) alfa e beta. Transforme os ˆangulos para radianos e a seguir calcule os valores reais x e y dados por: x = cos(alfa) y = sen(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. A.2.2.4 Exemplo 2.3 Fa¸ca um programa para ler dois valores reais a e b. O programa deve calcular os valores de x e y dados por: x = 2a2 − b y = 3(b2 − a) Em seguida, deve trocar esses valores entre si e imprim´ı-los novamente. 80
  • 94.
    Apˆendice B Taxonomias doCap´ıtulo 4 do Tutorial ICC B.1 ´Arvore 1 Comando for-do. N´umero determinado de la¸cos. Exemplo utilizado: s´erie de n´umeros reais. B.1.1 Caracter´ısticas remov´ıveis C1. for¸ca c´alculo de cada termo C2. termos tˆem sinais alternantes B.1.2 Numera¸c˜ao dos exemplos C1 C2 Exemplo • • 1 – – 1.1 – • 1.2 • – 1.3 B.1.3 Enunciados B.1.3.1 Exemplo 1 Dada a s´erie 1/2, −1/4, 1/6 − 1/8, ... fa¸ca um programa que imprima os dez primeiros elementos da s´erie, e a seguir imprima a soma desses dez elementos. B.1.3.2 Exemplo 1.1 Dada a s´erie 1/2, 1/4, 1/6, 1/8, ... fa¸ca um programa que imprima a soma dos dez primeiros elementos. 81
  • 95.
    B.1.3.3 Exemplo 1.2 Dadaa s´erie 1/2, −1/4, 1/6, −1/8, ... fa¸ca um programa que imprima a soma dos dez primeiros elementos. B.1.3.4 Exemplo 1.3 Dada a s´erie 1/2, 1/4, 1/6, 1/8, ... fa¸ca um programa que imprima os dez primeiros ele- mentos da s´erie, e a seguir imprima a soma desses dez elementos. B.2 ´Arvore 2 Comando repeat-until com final do la¸co especificado nos pr´oprios dados. B.2.1 Caracter´ısticas remov´ıveis C1. primeiro elemento da s´erie requer tratamento diferenciado C2. h´a um if dentro do la¸co B.2.2 Numera¸c˜ao dos exemplos C1 C2 Exemplo • • 2 – – 2.1 – • 2.2 • – 2.3 B.2.3 Enunciados B.2.3.1 Exemplo 2 Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros diferentes de zero. O programa deve imprimir o maior e menor valor da sequˆencia. O programa deve parar quando o valor lido for igual a zero. O zero n˜ao faz parte da sequˆencia. B.2.3.2 Exemplo 2.1 Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros diferentes de zero. O programa deve imprimir o valor da soma dos elementos da sequˆencia. O programa deve parar quando o valor lido for igual a zero. O zero n˜ao faz parte da sequˆencia. 82
  • 96.
    B.2.3.3 Exemplo 2.2 Fa¸caum programa que leia uma sequˆencia de n´umeros inteiros diferentes de zero. O programa deve imprimir o valor da soma dos elementos positivos e a soma dos elementos negativos da sequˆencia. O programa deve parar quando o valor lido for igual a zero. O zero n˜ao faz parte da sequˆencia. B.2.3.4 Exemplo 2.3 Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros diferentes de zero. O programa deve imprimir o maior valor da sequˆencia. O programa deve parar quando o valor lido for igual a zero. O zero n˜ao faz parte da sequˆencia. B.3 ´Arvore 3 Comando repeat-until com pergunta ao usu´ario para cada la¸co. B.3.1 Caracter´ısticas remov´ıveis C1. primeiro elemento da s´erie requer tratamento diferenciado C2. h´a cr´ıtica de dados de entrada B.3.2 Numera¸c˜ao dos exemplos C1 C2 Exemplo • • 3 – – 3.1 – • 3.2 • – 3.3 B.3.3 Enunciados B.3.3.1 Exemplo 3 3 Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros. O programa deve imprimir o maior e menor valor da sequˆencia. O programa deve perguntar ao usu´ario, em cada leitura, se deseja continuar ou parar. O usu´ario deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar. Se o usu´ario entrar com um caractere diferente de ’s’ ou ’n’, o programa deve repetir a pergunta. 83
  • 97.
    B.3.3.2 Exemplo 3.1 Fa¸caum programa que leia uma sequˆencia de n´umeros inteiros. O programa deve imprimir o valor da soma dos elementos da sequˆencia. O programa deve perguntar ao usu´ario, em cada leitura, se deseja continuar ou parar. O usu´ario deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar. B.3.3.3 Exemplo 3.2 Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros. O programa deve imprimir o maior e menor valor da sequˆencia. O programa deve perguntar ao usu´ario, em cada leitura, se deseja continuar ou parar. O usu´ario deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar. B.3.3.4 Exemplo 3.3 Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros. O programa deve imprimir o valor da soma dos elementos da sequˆencia. O programa deve perguntar ao usu´ario, em cada leitura, se deseja continuar ou parar. O usu´ario deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar. Se o usu´ario entrar com um caractere diferente de ’s’ ou ’n’, o programa deve repetir a pergunta. B.4 ´Arvore 4 Comando repeat-until com final do la¸co dependendo de alguma condi¸c˜ao determinada ao longo do programa. B.4.1 Caracter´ısticas remov´ıveis C1. condi¸c˜ao ´e uma express˜ao booleana C2. h´a um la¸co dentro de outro B.4.2 Numera¸c˜ao dos exemplos C1 C2 Exemplo • • 4 – – 4.1 – • 4.2 • – 4.3 84
  • 98.
    B.4.3 Enunciados B.4.3.1 Exemplo4 Fa¸ca um programa que escreva todos os n´umeros primos entre 1 e 100, um em cada linha. B.4.3.2 Exemplo 4.1 fa¸ca um programa que leia um determinado valor inteiro. O programa deve evitar que o usu´ario entre com valores n˜ao positivos. O programa deve imprimir todos os divisores do n´umero lido. B.4.3.3 Exemplo 4.2 Fa¸ca um programa que imprima o menor divisor diferente de 1 de todos os n´umeros entre 2 e 20. B.4.3.4 Exemplo 4.3 Fa¸ca um programa que leia um n´umero inteiro. O programa deve evitar que o usu´ario entre com valores negativos. O programa deve imprimir uma mensagem dizendo se o n´umero ´e primo ou se n˜ao ´e primo. B.5 ´Arvore 5 Comando while-do com final do la¸co especificado nos pr´oprios dados B.5.1 Caracter´ısticas remov´ıveis C1. primeiro elemento exige tratamento diferenciado C2. h´a um if dentro do la¸co B.5.2 Numera¸c˜ao dos exemplos C1 C2 Exemplo • • 5 – – 5.1 – • 5.2 • – 5.3 85
  • 99.
    B.5.3 Enunciados B.5.3.1 Exemplo5 Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros diferentes de zero. O programa deve imprimir o maior e o menor valor da sequˆencia. O programa deve parar quando o valor lido for igual a zero. O zero n˜ao faz parte da sequˆencia. B.5.3.2 Exemplo 5.1 Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros diferentes de zero. O programa deve imprimir o valor da soma dos elementos da sequˆencia. O programa deve parar quando o valor lido for igual a zero. O zero n˜ao faz parte da sequˆencia. B.5.3.3 Exemplo 5.2 Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros diferentes de zero. O programa deve imprimir o valor da soma dos elementos positivos e a soma dos elementos negativos da sequˆencia. O programa deve parar quando o valor lido for igual a zero. O zero n˜ao faz parte da sequˆencia. B.5.3.4 Exemplo 5.3 Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros diferentes de zero. O programa deve imprimir o maior valor da sequˆencia. O programa deve parar quando o valor lido for igual a zero. O zero n˜ao faz parte da sequˆencia. B.6 ´Arvore 6 Comando while-do com pergunta ao usu´ario para cada la¸co B.6.1 Caracter´ısticas remov´ıveis C1. primeiro elemento da s´erie requer tratamento diferenciado C2. h´a cr´ıtica de dados de entrada 86
  • 100.
    B.6.2 Numera¸c˜ao dosexemplos C1 C2 Exemplo • • 6 – – 6.1 – • 6.2 • – 6.3 B.6.3 Enunciados B.6.3.1 Exemplo 6 Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros. O programa deve imprimir o maior e menor valor da sequˆencia. O programa deve perguntar ao usu´ario, em cada leitura, se deseja continuar ou parar. O usu´ario deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar. Se o usu´ario entrar com um caractere diferente de ’s’ ou ’n’, o programa deve repetir a pergunta. B.6.3.2 Exemplo 6.1 Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros. O programa deve imprimir o valor da soma dos elementos da sequˆencia. O programa deve perguntar ao usu´ario, em cada leitura, se deseja continuar ou parar. O usu´ario deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar. B.6.3.3 Exemplo 6.2 Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros. O programa deve imprimir o valor da soma dos elementos da sequˆencia. O programa deve perguntar ao usu´ario, em cada leitura, se deseja continuar ou parar. O usu´ario deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar. Se o usu´ario entrar com um caractere diferente de ’s’ ou ’n’, o programa deve repetir a pergunta. B.6.3.4 Exemplo 6.3 Fa¸ca um programa que leia uma sequˆencia de n´umeros inteiros. O programa deve imprimir o maior e menor valor da sequˆencia. O programa deve perguntar ao usu´ario, em cada leitura, se deseja continuar ou parar. O usu´ario deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar. —————————————————————- 87
  • 101.
    B.7 ´Arvore 7 grupo7. Comando while-do com final do la¸co dependendo de alguma condi¸c˜ao determi- nada ao longo do programa. Comando while-do com pergunta ao usu´ario para cada la¸co B.7.1 Caracter´ısticas remov´ıveis C1. condi¸c˜ao ´e uma express˜ao booleana C2. h´a um la¸co dentro de outro B.7.2 Numera¸c˜ao dos exemplos C1 C2 Exemplo • • 7 – – 7.1 – • 7.2 • – 7.3 B.7.3 Enunciados B.7.3.1 Exemplo 7 Fa¸ca um programa que escreva todos os n´umeros primos entre 1 e 100, um em cada linha. B.7.3.2 Exemplo 7.1 Fa¸ca um programa que leia um determinado valor inteiro. O programa deve evitar que o usu´ario entre com valores n˜ao positivos. O programa deve imprimir todos os divisores do n´umero lido. B.7.3.3 Exemplo 7.2 Fa¸ca um programa que imprima o menor divisor diferente de 1 de todos os n´umeros entre 2 e 20. B.7.3.4 Exemplo 7.3 Fa¸ca um programa que leia um n´umero inteiro. O programa deve evitar que o usu´ario entre com valores negativos. O programa deve imprimir uma mensagem dizendo se o n´umero ´e primo ou se n˜ao ´e primo. 88
  • 102.
    Apˆendice C Taxonomias doCap´ıtulo 4 do Tutorial ICC C.1 ´Arvore 1 Apenas um arquivo de entrada (sem uso de lstinlineeoln!! e apenas vari´aveis de tipo lstinlineinteger!!). C.1.1 Caracter´ısticas remov´ıveis C1. perguntar ao usu´ario o nome do arquivo a ser lido C2. v´arias linhas no arquivo C.1.2 Numera¸c˜ao dos exemplos C1 C2 Exemplo • • 1 – – 1.1 – • 1.2 • – 1.3 C.1.3 Enunciados C.1.3.1 Exemplo 1 Fa¸ca um programa que leia um arquivo tipo text contendo, em cada linha, uma sequencia de 5 n´umeros 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´ario o nome do arquivo a ser lido. 89
  • 103.
    C.1.3.2 Exemplo 1.1 Fa¸caum programa que leia um arquivo tipo text contendo uma ´unica linha com 5 n´umeros inteiros. O programa deve escrever na tela o valor da soma dos 5 elementos. O nome do programa ´e dado no pr´oprio comando assign. C.1.3.3 Exemplo 1.2 Fa¸ca um programa que leia um arquivo tipo text contendo, em cada linha, uma sequencia de 5 n´umeros inteiros. O programa deve escrever na tela, para cada linha do arquivo, o valor da soma dos 5 elementos correspondentes. O nome do programa ´e dado no pr´oprio comando assign. C.1.3.4 Exemplo 1.3 Fa¸ca um programa que leia um arquivo tipo text contendo uma ´unica linha com uma sequencia de 5 n´umeros inteiros. O programa deve escrever na tela o valor da soma dos 5 elementos. O programa deve perguntar ao usu´ario o nome do arquivo a ser lido. C.2 ´Arvore 2 Apenas um arquivo de entrada com uso de eoln e vari´aveis de v´arios tipos diferentes. C.2.1 Caracter´ısticas remov´ıveis C1. v´arios tipos de vari´aveis no arquivo C2. primeira linha do arquivo requer tratamento diferenciado C.2.2 Numera¸c˜ao dos exemplos C1 C2 Exemplo • • 2 – – 2.1 – • 2.2 • – 2.3 90
  • 104.
    C.2.3 Enunciados C.2.3.1 Exemplo2 Fa¸ca 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 ´e 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.2.3.2 Exemplo 2.1 Fa¸ca 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 escrever na tela, em cada linha, o valor da soma das notas da linha correspondente. C.2.3.3 Exemplo 2.2 Fa¸ca 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 determinar qual a linha cuja soma das notas ´e a maior, entre todas as linhas presentes no arquivo. O programa deve escrever na tela o valor dessa soma m´axima. C.2.3.4 Exemplo 2.3 Fa¸ca 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 escrever na tela, em cada linha, o nome da pessoa, sua idade e o valor da soma das suas notas. C.3 ´Arvore 3 Apenas um arquivo de sa´ıda, entrada via teclado. C.3.1 Caracter´ısticas remov´ıveis C1. v´arios tipos de vari´aveis no arquivo C2. sa´ıda formatada (tabela) 91
  • 105.
    C.3.2 Numera¸c˜ao dosexemplos C1 C2 Exemplo • • 3 – – 3.1 – • 3.2 • – 3.3 C.3.3 Enunciados C.3.3.1 Exemplo 3 Fa¸ca um programa que leia via teclado, 4 linhas, cada uma delas contendo 5 campos: o primeiro ´e um nome (string[10]), o segundo ´e uma idade (integer) e os outros trˆes s˜ao 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.3.3.2 Exemplo 3.1 Fa¸ca um programa que leia via teclado, 4 linhas, cada uma delas contendo trˆes notas (real). O programa deve gerar um arquivo contendo em cada linha o conjunto de dados de cada linha de entrada. C.3.3.3 Exemplo 3.2 Fa¸ca um programa que leia via teclado, 4 linhas, cada uma delas contendo 5 campos: o primeiro ´e um nome (string[10]), o segundo ´e uma idade (integer) e os outros trˆes s˜ao notas (real). O programa deve gerar um arquivo contendo em cada linha o conjunto de dados de cada linha de entrada. C.3.3.4 Exemplo 3.3 Fa¸ca um programa que leia via teclado, 4 linhas, cada uma delas contendo trˆes 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 ´Arvore 4 Um arquivo de entrada e outro de sa´ıda. 92
  • 106.
    C.4.1 Caracter´ısticas remov´ıveis C1.com uso de eoln C2. sa´ıda formatada (tabela) C.4.2 Numera¸c˜ao dos exemplos C1 C2 Exemplo • • 4 – – 4.1 – • 4.2 • – 4.3 C.4.3 Enunciados C.4.3.1 Exemplo 4 Fa¸ca 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. C.4.3.2 Exemplo 4.1 Fa¸ca 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 3 notas (reais). O programa deve gerar um arquivo contendo, em cada linha, o nome da pessoa, sua idade e a soma de suas notas. C.4.3.3 Exemplo 4.2 Fa¸ca 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. C.4.3.4 Exemplo 4.3 Fa¸ca 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 3 notas (reais). 93
  • 107.
    O programa devegerar 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 ´Arvore 5 Um arquivo de entrada e dois de sa´ıda. C.5.1 Caracter´ısticas remov´ıveis C1. com uso de eoln C2. v´arios tipos de vari´aveis no arquivo C.5.2 Numera¸c˜ao dos exemplos C1 C2 Exemplo • • 5 – – 5.1 – • 5.2 • – 5.3 C.5.3 Enunciados C.5.3.1 Exemplo 5 Fa¸ca 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. C.5.3.2 Exemplo 5.1 Fa¸ca um programa que leia um arquivo tipo text contendo, em cada linha, uma sequencia de 3 notas (reais). 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. 94
  • 108.
    C.5.3.3 Exemplo 5.2 Fa¸caum 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. C.5.3.4 Exemplo 5.3 Fa¸ca um programa que leia um arquivo tipo text contendo, em cada linha, um nome (string de 10 caracteres) e uma sequencia de 3 notas (reais). 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. 95
  • 109.
    Apˆendice D Taxonomias doCap´ıtulo 6 do Tutorial ICC D.1 ´Arvore 1 Utiliza apenas um vetor de n´umeros inteiros dispostos aleatoriamente. D.1.1 Caracter´ısticas remov´ıveis C1. p´ara percorrimento em determinda condi¸c˜ao C2. atua apenas sobre alguns elementos, sob determinada condi¸c˜ao D.1.2 Numera¸c˜ao dos exemplos C1 C2 Exemplo • • 1 – – 1.1 – • 1.2 • – 1.3 D.1.3 Enunciados D.1.3.1 Exemplo 1 Fa¸ca 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´e encontrar o primeiro elemento par. O programa deve escrever o valor da soma dos elementos percorridos antes de encontrar o primeiro elemento par. 96
  • 110.
    D.1.3.2 Exemplo 1.1 Fa¸caum 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.1.3.3 Exemplo 1.2 Fa¸ca 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 a soma de todos os elementos pares presentes no vetor. D.1.3.4 Exemplo 1.3 Fa¸ca 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 a posi¸c˜ao, dentro do vetor, do primeiro elemento par en- contrado. Se n˜ao houver nenhum n´umero par o programa deve escrever o valor 0. D.2 ´Arvore 2 Utiliza dois vetores de caracteres, um ordenado e outro n˜ao; o n˜ao-ordenado pode conter elementos repetidos. D.2.1 Caracter´ısticas remov´ıveis C1. percorre um vetor dentro do percorrimento do outro C2. usa o fato de um vetor estar ordenado para interromper o percorrimento D.2.2 Numera¸c˜ao dos exemplos C1 C2 Exemplo • • 2 – – 2.1 – • 2.2 • – 2.3 D.2.3 Enunciados D.2.3.1 Exemplo 2 Fa¸ca 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˜ao tem elementos repetidos. O vetor b tem os elementos dispostos aleatoriamente e pode ter elementos repetidos. 97
  • 111.
    O programa deveescrever uma linha para cada elemento de b. Cada linha deve conter o elemento de b, seguido de um inteiro que indica a posi¸c˜ao desse elemento no vetor a. Se o elemento n˜ao estiver presente no vetor a, o programa deve escrever 0. D.2.3.2 Exemplo 2.1 Fa¸ca 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˜ao tem elementos repetidos. O vetor b tem os elementos dispostos aleatoriamente e pode ter elementos repetidos. O programa deve escrever na tela o n´umero de vezes que o primeiro elemento do vetor a est´a presente no vetor b. D.2.3.3 Exemplo 2.2 Fa¸ca 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˜ao tem elementos repetidos. O vetor b tem os elementos dispostos aleatoriamente e pode ter elementos repetidos. O programa deve escrever na tela qual a posi¸c˜ao da primeira ocorrˆencia, no vetor b, do primeiro elemento do vetor a. Se primeiro elemento de a n˜ao estiver presente no vetor b, o programa deve escrever 0. D.2.3.4 Exemplo 2.3 Fa¸ca 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˜ao tem elementos repetidos. O vetor b tem os elementos dispostos aleatoriamente e pode ter elementos repetidos. O programa deve escrever uma linha para cada combina¸c˜ao de elementos dos vetores a e b. D.3 ´Arvore 3 Utiliza dois vetores, um de strings e outro de reais, vinculados. D.3.1 Caracter´ısticas remov´ıveis C1. ordena elementos C2. vincula os dois vetores 98
  • 112.
    D.3.2 Numera¸c˜ao dosexemplos C1 C2 Exemplo • • 3 – – 3.1 – • 3.2 • – 3.3 D.3.3 Enunciados D.3.3.1 Exemplo 3 Fa¸ca 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´etica. D.3.3.2 Exemplo 3.1 Fa¸ca 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 apenas a nota m´axima do conjunto de notas. D.3.3.3 Exemplo 3.2 Fa¸ca 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 o nome e a nota do aluno que tiver a nota m´axima do conjunto dado. D.3.3.4 Exemplo 3.3 Fa¸ca 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 de todos os alunos, um por linha, em ordem alfab´etica. Em seguida deve escrever todas as notas, na mesma linha, em ordem decrescente. D.4 ´Arvore 4 Utiliza uma matriz de 3 por 5 inteiros. 99
  • 113.
    D.4.1 Caracter´ısticas remov´ıveis C1.usa ordena¸c˜ao C2. processa linhas de forma independente uma da outra D.4.2 Numera¸c˜ao dos exemplos C1 C2 Exemplo • • 4 – – 4.1 – • 4.2 • – 4.3 D.4.3 Enunciados D.4.3.1 Exemplo 4 Fa¸ca um programa que leia, de um arquivo, uma matriz de 3 linhas e 5 colunas, de n´umeros 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. D.4.3.2 Exemplo 4.1 Fa¸ca um programa que leia, de um arquivo, uma matriz de 3 linhas e 5 colunas, de n´umeros inteiros. Cada linha do arquivo deve conter uma linha da matriz. O programa deve determinar o valor m´aximo entre os elementos da primeira linha da matriz. D.4.3.3 Exemplo 4.2 Fa¸ca um programa que leia, de um arquivo, uma matriz de 3 linhas e 5 colunas, de n´umeros inteiros. Cada linha do arquivo deve conter uma linha da matriz. O programa deve deteminar o valor m´aximo de cada linha da matriz. O programa deve escrever em cada linha da tela o valor m´aximo de cada linha da matriz. D.4.3.4 Exemplo 4.3 Fa¸ca um programa que leia, de um arquivo, uma matriz de 3 linhas e 5 colunas, de n´umeros inteiros. Cada linha do arquivo deve conter uma linha da matriz. O programa deve alterar a ordem dos elementos da primeira linha da matriz, deixando- os ordenados em ordem crescente. 100
  • 114.
    O programa deveescrever a nova matriz na tela, uma linha da matriz para cada linha da tela. D.5 ´Arvore 5 Utiliza matriz quadrada de 5 por 5 inteiros. D.5.1 Caracter´ısticas remov´ıveis C1. processa elementos abaixo da diagonal principal C2. faz troca elementos D.5.2 Numera¸c˜ao dos exemplos C1 C2 Exemplo • • 5 – – 5.1 – • 5.2 • – 5.3 D.5.3 Enunciados D.5.3.1 Exemplo 5 Fa¸ca um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de n´umeros 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. D.5.3.2 Exemplo 5.1 Fa¸ca um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de n´umeros inteiros. Cada linha do arquivo deve conter uma linha da matriz. O programa deve escrever na tela o valor do maior elemento de toda a matriz. D.5.3.3 Exemplo 5.2 Fa¸ca um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de n´umeros inteiros. Cada linha do arquivo deve conter uma linha da matriz. O programa deve trocar a primeira coluna da matriz com a ´ultima. O programa deve escrever a nova matriz na tela, uma linha da matriz para cada linha da tela. 101
  • 115.
    D.5.3.4 Exemplo 5.3 Fa¸caum programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de n´umeros 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 ´Arvore 6 Utiliza matriz quadrada de 5 por 5 inteiros. D.6.1 Caracter´ısticas remov´ıveis C1. processa apenas elementos acima da diagonal secund´aria C2. n˜ao processa elementos da diagonal secund´aria D.6.2 Numera¸c˜ao dos exemplos C1 C2 Exemplo • • 6 – – 6.1 – • 6.2 • – 6.3 D.6.3 Enunciados D.6.3.1 Exemplo 6 Fa¸ca um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de n´umeros 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´aria da matriz. O programa deve escrever a nova matriz na tela, uma linha da matriz para cada linha da tela. D.6.3.2 Exemplo 6.1 Fa¸ca um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de n´umeros inteiros. Cada linha do arquivo deve conter uma linha da matriz. O programa deve igualar a zero todos os elementos da diagonal principal da matriz. O programa deve escrever a nova matriz na tela, uma linha da matriz para cada linha da tela. 102
  • 116.
    D.6.3.3 Exemplo 6.2 Fa¸caum programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de n´umeros inteiros. Cada linha do arquivo deve conter uma linha da matriz. O programa deve igualar a zero todos os elementos da diagonal secund´aria da matriz. O programa deve escrever a nova matriz na tela, uma linha da matriz para cada linha da tela. D.6.3.4 Exemplo 6.3 Fa¸ca um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de n´umeros 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´aria da matriz e tamb´em os elementos da diagonal secund´aria da matriz. O programa deve escrever a nova matriz na tela, uma linha da matriz para cada linha da tela. 103
  • 117.
    Apˆendice E Taxonomias doCap´ıtulo 7 do Tutorial ICC E.1 ´Arvore 1 Registro dentro de outro registro. E.1.1 Caracter´ısticas remov´ıveis C1. a data ´e outro registro dentro do principal C2. primeiro elemento do conjunto requer tratamento diferenciado E.1.2 Numera¸c˜ao dos exemplos C1 C2 Exemplo • • 1 – – 1.1 – • 1.2 • – 1.3 E.1.3 Enunciados E.1.3.1 Exemplo 1 Fa¸ca um programa que leia um arquivo text contendo em cada linha: um nome (string [10]), um dia (inteiro), um mˆes (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 ´e outro registro contendo os campos dia, mˆes e ano. O programa deve escrever na tela os dados da pessoa mais nova de todo o conjunto. 104
  • 118.
    E.1.3.2 Exemplo 1.1 Fa¸caum programa que leia um arquivo text contendo em cada linha: um nome (string [10]), um dia (inteiro), um mˆes (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ˆes, ano e divida. O programa deve escrever na tela o valor da somas das d´ıvidas de todas as pessoas do conjunto. E.1.3.3 Exemplo 1.2 Fa¸ca um programa que leia um arquivo text contendo em cada linha: um nome (string [10]), um dia (inteiro), um mˆes (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ˆes, ano e divida. O programa deve escrever na tela os dados da pessoa mais nova de todo o conjunto. E.1.3.4 Exemplo 1.3 Fa¸ca um programa que leia um arquivo text contendo em cada linha: um nome (string [10]), um dia (inteiro), um mˆes (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 ´e outro registro contendo os campos dia, mˆes e ano. O programa deve escrever na tela o valor da somas das d´ıvidas de todas as pessoas do conjunto. E.2 ´Arvore 2 Array dentro de registro. E.2.1 Caracter´ısticas remov´ıveis C1. a data ´e outro registro dentro do principal C2. primeiro elemento do conjunto requer tratamento diferenciado E.2.2 Numera¸c˜ao dos exemplos C1 C2 Exemplo • • 2 – – 2.1 – • 2.2 • – 2.3 105
  • 119.
    E.2.3 Enunciados E.2.3.1 Exemplo2 Fa¸ca 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 ´e um array contendo cinco notas (reais). O programa deve escrever na tela os dados da pessoa com a m´edia das notas mais baixa. E.2.3.2 Exemplo 2.2 Fa¸ca um programa que leia um arquivo text contendo em cada linha: um nome (string [10]) e trˆes notas (reais). Os dados de cada pessoa devem ser colocados em um registro com os campos nome, nota1, nota2 e nota3. O programa deve escrever na tela a m´edia de todas as notas de todas as pessoas. E.2.3.3 Exemplo 2.2 Fa¸ca um programa que leia um arquivo text contendo em cada linha: um nome (string [10]) e trˆes notas (reais). Os dados de cada pessoa devem ser colocados em um registro com os campos nome, nota1, nota2 e nota3. O programa deve escrever na tela os dados da pessoa com a m´edia das notas mais baixa. E.2.3.4 Exemplo 2.3 Fa¸ca 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 ´e um array contendo cinco notas (reais). O programa deve escrever na tela a m´edia de todas as notas de todas as pessoas. E.3 ´Arvore 3 Array de registros. E.3.1 Caracter´ısticas remov´ıveis C1. ordena os registros C2. tem array dentro dos records 106
  • 120.
    E.3.2 Numera¸c˜ao dosexemplos C1 C2 Exemplo • • 3 – – 3.1 – • 3.2 • – 3.3 E.3.3 Enunciados E.3.3.1 Exemplo 3 Fa¸ca 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´edia (real). O programa deve construir um array de 10 registros desse tipo. Observe que nesse caso o arquivo n˜ao pode ter mais de 10 linhas. O programa deve ler os dados de cada aluno e coloc´a-lo no elemento correspondente do array de registros, calculando e guardando tamb´em a m´edia de cada aluno. O programa deve escrever na tela uma rela¸c˜ao dos nomes e m´edias dos alunos, em ordem decrescente do valor da m´edia. E.3.3.2 Exemplo 3.1 Fa¸ca um programa que leia um arquivo contendo, em cada linha, o nome de um aluno (string[10]) e 3 notas (reais). Os dados de cada aluno devem ser colocados um registro com os seguintes campos: um nome (string[10]), trˆes notas: nota1, nota2, nota3 (reais) e uma m´edia (real). O programa deve construir um array de 10 registros desse tipo. Observe que nesse caso o arquivo n˜ao pode ter mais de 10 linhas. O programa deve ler os dados de cada aluno e coloc´a-lo no elemento correspondente do array de registros, calculando e guardando tamb´em a m´edia de cada aluno. O programa deve escrever na tela a rela¸c˜ao de nomes e m´edias, na mesma ordem em que estavam no arquivo de origem. E.3.3.3 Exemplo 3.2 Fa¸ca 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´edia (real). O programa deve construir um array de 10 registros desse tipo. Observe que nesse caso o arquivo n˜ao pode ter mais de 10 linhas. 107
  • 121.
    O programa develer os dados de cada aluno e coloc´a-lo no elemento correspondente do array de registros, calculando e guardando tamb´em a m´edia de cada aluno. O programa deve escrever na tela a rela¸c˜ao de nomes e m´edias, na mesma ordem em que estavam no arquivo de origem. E.3.3.4 Exemplo 3.3 Fa¸ca um programa que leia um arquivo contendo, em cada linha, o nome de um aluno (string[10]) e 3 notas (reais). Os dados de cada aluno devem ser colocados um registro com os seguintes campos: um nome (string[10]), trˆes notas: nota1, nota2, nota3 (reais) e uma m´edia (real). O programa deve construir um array de 10 registros desse tipo. Observe que nesse caso o arquivo n˜ao pode ter mais de 10 linhas. O programa deve ler os dados de cada aluno e coloc´a-lo no elemento correspondente do array de registros, calculando e guardando tamb´em a m´edia de cada aluno. O programa deve escrever na tela uma rela¸c˜ao dos nomes e m´edias dos alunos, em ordem decrescente do valor da m´edia. 108