Вы находитесь на странице: 1из 121

Universidade de Brası́lia

Instituto de Ciências Exatas


Departamento de Ciência da Computação

Taxonomias de Exemplos para Aprendizagem de


Programação

Adam Victor Nazareth Brandizzi


Yuri Moreira de Nuñez

Monografia apresentada como requisito parcial


para conclusão do Curso de Computação — Licenciatura

Orientador
Prof. Dr. Homero Luiz Pı́ccolo

Brası́lia
2009
Universidade de Brası́lia — UnB
Instituto de Ciências Exatas
Departamento de Ciência da Computação
Curso de Computação — Licenciatura

Coordenador: Prof. Dr. Flávio Leonardo Cavalcanti de Moura

Banca examinadora composta por:


Prof. Dr. Homero Luiz Pı́ccolo (Orientador) — CIC/UnB
Prof.ª Dr.ª Maria de Fátima R. Brandão — CIC/UnB
Prof.ª Dr.ª Carla Cavalcante Koike — CIC/UnB

CIP — Catalogação Internacional na Publicação

Brandizzi, Adam Victor Nazareth.

Taxonomias de Exemplos para Aprendizagem de Programação / Adam


Victor Nazareth Brandizzi, Yuri Moreira de Nuñez. Brası́lia : UnB, 2009.
121 p. : il. ; 29,5 cm.

Monografia (Graduação) — Universidade de Brası́lia, Brası́lia, 2009.

1. Exemplos, 2. Problemas, 3. Programação de Computador,


4. Ensino de Programação, 5. Sistemas Tutoriais Inteligentes,
6. Sistemas Tutorias Baseados na Web, 7. Taxonomia de Exemplos,
8. Tutorias

CDU 004

Endereço: Universidade de Brası́lia


Campus Universitário Darcy Ribeiro — Asa Norte
CEP 70910-900
Brası́lia–DF — Brasil
Universidade de Brası́lia
Instituto de Ciências Exatas
Departamento de Ciência da Computação

Taxonomias de Exemplos para Aprendizagem de


Programação

Adam Victor Nazareth Brandizzi


Yuri Moreira de Nuñez

Monografia apresentada como requisito parcial


para conclusão do Curso de Computação — Licenciatura

Prof. Dr. Homero Luiz Pı́ccolo (Orientador)


CIC/UnB

Prof.ª Dr.ª Maria de Fátima R. Brandão Prof.ª Dr.ª Carla Cavalcante Koike
CIC/UnB CIC/UnB

Prof. Dr. Flávio Leonardo Cavalcanti de Moura


Coordenador do Curso de Computação — Licenciatura

Brası́lia, 30 de junho de 2009


Agradecimentos

Agradeço, acima de tudo, a meus saudosos pais, que me deram a melhor educação possı́vel;
a meus tios Nataniel e Ana, que me apoiaram nos momentos difı́ceis; a minhas irmãs, que
sempre me apoiaram, e a Juliana Vilela, que esteve ao meu lado durante grande parte do
curso. Agradeço à Universidade de Brası́lia, pelo ensino de alta qualidade; aos professores
do departamento, pelo conhecimento, técnico ou não, transmitido e pela compreensão e
apoio. Agradeço especialmente ao professor Homero, pela orientação sábia, dedicada e
paciente. Por fim, agradeço a todos os companheiros universitários que me apoiaram,
especialmente ao amigo Pedro, que muito me ajudou no começo do curso, e ao parceiro
de projeto Yuri, cujo trabalho foi indispensável. A todos citados, e aos que não pude
citar, muito obrigado.

Adam Victor Nazareth Brandizzi

Agradeço ao professor orientador, Homero, e parceiro de projeto, Adam, pela paciência


e esmero. Agradeço especialmente às mulheres da minha vida - minha mãe, minha esposa,
minha irmã e minha avó - que contribuiram a cada tempo com amor e compreensão.
Agradeço, enfim, a todos os amigos que aguardavam ansiosos por este feliz desfecho.

Yuri Moreira de Nuñez

iv
Resumo

Estudantes possuem diferentes ritmos de aprendizado. Para satisfazer suas diferentes


necessidades, são necessários materiais didáticos em diferentes nı́veis de complexidade.
Nesse trabalho, propomos um conjunto de exemplos de programação com vários nı́veis
de complexidade para alunos que estejam aprendendo a programar computadores. Esse
conjunto de exemplos será integrado ao Tutorial ICC, um sistema de aprendizagem auxi-
liado por computador. Este é mais um passo para acrescentar adaptabilidade ao Tutorial
ICC, aproximando-o dos sistemas tutoriais inteligentes.

Palavras-chave: Exemplos, Problemas, Programação de Computador, Ensino de Pro-


gramação, 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ário

1 Introdução 1
1.1 Problemas e Justificativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Metodologia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.4 Resultados esperados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2 O Ensino de Programação 4
2.1 A dificuldade de ensinar a programar . . . . . . . . . . . . . . . . . . . . . 4
2.2 Fatores cognitivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.3 Fatores pedagógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.4 Proposta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

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árquica de exemplos . . . . . . . . . . . . . . . . . . . . . . 15
4.2 Enunciados e soluções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.3 “Tira-teima” e roteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.4 Localização na taxonomia . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.5 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

5 Exemplos de Taxonomias 23
5.1 Árvore 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5.1.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 23
5.1.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 24
5.1.3 Enunciados e programas . . . . . . . . . . . . . . . . . . . . . . . . 24
5.1.4 Comentários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5.2 Árvore 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5.2.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 28
5.2.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 28

vii
5.2.3 Enunciados e programas . . . . . . . . . . . . . . . . . . . . . . . . 28
5.2.4 Comentários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5.3 Árvore 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
5.3.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 34
5.3.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 34
5.3.3 Enunciados e programas . . . . . . . . . . . . . . . . . . . . . . . . 34
5.3.4 Comentários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.4 Árvore 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
5.4.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 42
5.4.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 42
5.4.3 Enunciados e programas . . . . . . . . . . . . . . . . . . . . . . . . 42
5.4.4 Comentários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.5 Árvore 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.5.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 49
5.5.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 49
5.5.3 Enunciados e programas . . . . . . . . . . . . . . . . . . . . . . . . 49
5.5.4 Comentários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
5.6 Árvore 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
5.6.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 62
5.6.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 62
5.6.3 Enunciados e programas . . . . . . . . . . . . . . . . . . . . . . . . 62
5.6.4 Comentários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

6 Conclusões e Trabalhos Futuros 74

Referências 75

A Taxonomias do Capı́tulo 2 do Tutorial ICC 78


A.1 Árvore 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
A.1.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 78
A.1.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 78
A.1.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
A.2 Árvore 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
A.2.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 79
A.2.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 79

B Taxonomias do Capı́tulo 4 do Tutorial ICC 81


B.1 Árvore 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
B.1.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 81
B.1.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 81
B.1.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
B.2 Árvore 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
B.2.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 82
B.2.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 82

viii
B.2.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
B.3 Árvore 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
B.3.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 83
B.3.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 83
B.3.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
B.4 Árvore 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
B.4.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 84
B.4.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 84
B.4.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
B.5 Árvore 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
B.5.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 85
B.5.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 85
B.5.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
B.6 Árvore 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
B.6.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 86
B.6.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 87
B.6.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
B.7 Árvore 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
B.7.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 88
B.7.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 88
B.7.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

C Taxonomias do Capı́tulo 4 do Tutorial ICC 89


C.1 Árvore 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
C.1.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 89
C.1.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 89
C.1.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
C.2 Árvore 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
C.2.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 90
C.2.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 90
C.2.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
C.3 Árvore 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
C.3.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 91
C.3.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 92
C.3.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
C.4 Árvore 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
C.4.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 93
C.4.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 93
C.4.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
C.5 Árvore 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
C.5.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 94
C.5.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 94
C.5.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

ix
D Taxonomias do Capı́tulo 6 do Tutorial ICC 96
D.1 Árvore 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
D.1.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 96
D.1.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 96
D.1.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
D.2 Árvore 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
D.2.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 97
D.2.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 97
D.2.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
D.3 Árvore 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
D.3.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 98
D.3.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 99
D.3.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
D.4 Árvore 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
D.4.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 100
D.4.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 100
D.4.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
D.5 Árvore 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
D.5.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 101
D.5.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 101
D.5.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
D.6 Árvore 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
D.6.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 102
D.6.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 102
D.6.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

E Taxonomias do Capı́tulo 7 do Tutorial ICC 104


E.1 Árvore 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
E.1.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 104
E.1.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 104
E.1.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
E.2 Árvore 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
E.2.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 105
E.2.2 Numeração dos exemplos . . . . . . . . . . . . . . . . . . . . . . . . 105
E.2.3 Enunciados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
E.3 Árvore 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
E.3.1 Caracterı́sticas removı́veis . . . . . . . . . . . . . . . . . . . . . . . 106
E.3.2 Numeração 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ção de taxonomia com duas caracterı́sticas removı́veis . . . . . . 16


4.2 Representação de taxonomia com três caracterı́sticas removı́veis . . . . . . 16
4.3 Representação de taxonomia sem nó sem caracterı́sticas . . . . . . . . . . . 17
4.4 Representação de uma taxonomia não-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ção da localização do aluno na taxonomia . . . . . . . . . . . . 21

xii
Siglas e Acrônimos

ACM Association of Computing Machinery

AIS Association for Information Systems

CALS computer-assisted learning 1

CALS computer-assisted learning system

EaD educação a distância2

HTML Hypertext Markup Language

HTTP Hypertext Transfer Protocol

IEEE Institute of Electrical and Electronics Engineers

IEEE-CS IEEE Computer Society

ICC Introdução à Ciência da Computação

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ém é comum a forma, para efeitos gerais equivalente nesta monografia, computer-aideld learning.
2
Também é comum a forma, para efeitos gerais equivalente nesta monografia, ensino a distância.

xiii
Capı́tulo 1

Introdução

A programação é comumente reconhecida como uma habilidade difı́cil de se aprender e,


portanto, de se ensinar (Gomes e Mendes, 2007). Além desse problema, a procura por
formação em Ciência da Computação, Engenharia de Software e outros cursos que exigem
conhecimento de programação como base cresceu bastante a partir dos anos 90 (ACM,
2005, p. 10).
Uma possı́vel solução para o grande aumento da demanda dos cursos de programação
é o uso dos chamados sistemas tutoriais baseados em Web (STBW), que têm mostrado
bons resultados quando complementado por canais pelos quais alunos e professores podem
se comunicar e esclarecer dúvidas (Brusilovsky et al., 1998, p. 2). A vantagem dos cursos
baseados na Web para o problema de formação em maior escala é que esses cursos podem
ser acessados de qualquer lugar por uma grande quantidade de alunos. Além disso, cursos
baseados em Web permitem que os estudantes aprendam os pontos básicos de seus cursos
sem exigir acompanhamento constante do professor, que pode se concentrar nas dúvidas
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ários experimentos já foram ou estão sendo feitos para avaliar a viabilidade do uso de
cursos baseados na Web para o ensino de programação, 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 é chamado Tutorial
ICC e é utilizado no ensino de programação para as turmas de Introdução à Ciência da
Computação da Universidade de Brası́lia.
Mais especificamente, nossa abordagem será acrescentar alguma flexibilidade ao tu-
torial. Nosso planejamento inicial é tornar Tutorial ICC não exatamente um sistema
tutorial inteligente (STI) no sentido estrito, mas tentar aplicar os conceitos inerentes a
esse tipo de sistema de uma maneira básica. Em especial, nosso foco será oferecer um
sistema de exemplos alternativos ao estudante. Essa é uma decisão promissora porque já
foi obtido sucesso considerável com essa abordagem no ensino do uso de bibliotecas na
própria Universidade de Brası́lia (Pı́ccolo, 2006).

1
1.1 Problemas e Justificativa
Embora programação seja uma das atividades fundamentais na Ciência da Computação,
muitos estudantes tem grandes dificuldades para aprender a programar (Jenkins, 2003;
Gomes e Mendes, 2007). Por outro lado, a demanda por cursos que exigem conhecimento
de programação têm crescido bastante (ACM, 2005). Desse modo, é de grande interesse
que se consigam ferramentas educacionais que auxiliem os estudantes no processo de
ensino-aprendizagem de programação. Também tem crescido o interesse em ferramentas
que auxiliem o professor a ministrar cursos de programação a um número crescente de
alunos; em outras palavras, é necessário criar ferramentas que acrescentem escalabilidade
aos cursos de programação.
Tem-se tentado satisfazer a necessidade de escalabilidade no ensino de programação
através de do uso de ferramentas tutoriais remotas, especialmente sistema tutorial baseado
em Webs (STBWs). Entretanto, cursos remotos podem dificultar a aprendizagem do
aluno, que não contaria com o apoio constante de um professor. Uma possı́vel solução
para o problema da dificuldade de aprendizagem através de STBWs é permitir que tais
tutoriais se adaptem ao ritmo e necessidade dos estudantes. Isso é possı́vel, através do
uso de STIs.
O Tutorial ICC é, desde já, um STBW que evolui aos poucos para um STI. Este
trabalho dá mais um passo nessa direção, a saber, fornecer exemplos que possam ser
utilizados em um STI.

1.2 Objetivos
O objetivo geral deste trabalho é desenvolver um conjunto de taxonomias hierárquicas de
exemplos para o ensino de programação para os alunos da disciplina Introdução à Ciência
da Computação (ICC).
Os objetivos especı́ficos deste trabalho, por sua vez, são:

1. identificar conceitos e habilidades que estudantes de programação podem ter difi-


culdade de apreender;
2. desenvolver exemplos, enunciados, programas e representações gráficas da execução
de programas que exercitem os conceitos e habilidades identificados.
3. desenvolver uma representação gráfica das taxonomias hierárquicas, para auxiliar o
aluno a se localizar em uma determinada taxonomia.

1.3 Metodologia
Propusemos e implementamos uma série de taxonomias de exemplos organizada hierarqui-
camente em nı́veis de dificuldade. Essa taxonomia foi influenciada também por pesquisas
publicadas, mas em sua maior parte é a aplicação do conhecimento empı́rico e longa

2
experiência de professores de programação da Universidade de Brası́lia (UnB). Há uma
taxonomia para cada capı́tulo atual do Tutorial ICC, exceto o primeiro e o último (oitavo).
Para desenvolver uma taxonomia, identificamos os conceitos e habilidades que estu-
dantes de programação podem ter dificuldade de apreender em um determinado capı́tulo.
Concebemos, então, problemas que exercitem cada um dos conjuntos de conceitos pro-
postos.
Para cada um desses problemas, desenvolvemos versões simplificadas de modo a criar
árvores de problemas em que cada problema exercita um subconjunto dos conjuntos de
conceitos. Escrevemos, então, enunciados para cada um dos problemas, incluindo os
problemas que exercitem todos os conceitos de um conjunto.
Uma vez que tivemos um conjunto de enunciados que podiam apresentar os conceitos
escolhidos, programamos soluções para os enunciados, em Pascal. Criamos também scripts
que, aliados com uma applet em Java já desenvolvida, permitem representar graficamente
a execução dos programas escritos.
Por fim, integramos os enunciados, os programas e os scripts gerados para cada
capı́tulo ao Tutorial ICC. Também desenvolvemos e implantamos uma representação
gráfica das taxonomias hierárquicas, para auxiliar o aluno a se localizar em uma de-
terminada taxonomia.

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ão um primeiro passo para trabalhos
futuros que envolvam a flexibilização e automatização da interface do Tutorial ICC em
prol de torná-lo cada vez mais dotado de inteligência.

3
Capı́tulo 2

O Ensino de Programação

Embora programação seja uma das atividades fundamentais na Ciência da Computação,


muitos estudantes têm grande dificuldade para aprender a programar (Jenkins, 2003;
Gomes e Mendes, 2007). Desse modo, é de grande interesse conseguir ferramentas educa-
cionais que auxiliem no processo de ensino-aprendizagem de programação. Neste capı́tulo,
apresentaremos algumas das questões e dificuldades sobre ensinar a programar.

2.1 A dificuldade de ensinar a programar


Aprender e ensinar a programar são tarefas difı́ceis. Grande número de estudantes de
Computação consideram muito difı́cil aprender programação, mesmo em etapas avançadas
do curso. Essa é uma situação preocupante para o ensino de Computação: programação
é um componente básico, ou mesmo uma ferramenta indispensável para se compreender
várias áreas da disciplina. O ensino de programação é objeto de diversos estudos que
buscam reduzir essa dificuldade, mas há poucas evidências de que se tenham conseguido
avanços significativos na aprendizagem (Jenkins, 2003).
Várias razões foram apontadas para essas dificuldades. Por vezes, afirma-se que o
problema não é que aprender a programar seja difı́cil em si, mas sim que certos alunos
têm dificuldades, por não terem algumas habilidades necessárias para programar bem
desenvolvidas, como habilidades matemáticas ou para solução de problemas. Entretanto,
Jenkins (2003) considera os resultados de pesquisas nesse sentido inconclusivos: enquanto
alguns trabalhos de fato mostram alguma correlação 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ão há tal correlação (Jenkins e Davy, 1999). De
qualquer forma, essas habilidades não são necessariamente inatas, podendo ser desen-
volvidas; Gomes e Mendes (2007), por exemplo, consideram como problema a falta de
treinamento prévio do estudante em matemática e lógica, não uma dificuldade inata; de
fato, a escolha do estudante por um curso de Ciência da Computação ou correlato é um
indı́cio de que ele já tem considerável interesse na área de ciências matemáticas1 .
1
Temos constatado empiricamente que alguns estudantes escolhem o curso com uma visão preliminar
errônea da Computação, e esses mesmos estudantes têm sérias dificuldades em aprender a programar.

4
2.2 Fatores cognitivos
Vários fatores cognitivos são relevantes para a maior ou menor facilidade na aprendizagem
de programação. O primeiro fator são os estilos de aprendizagem. Estudantes aprendem
de maneiras diferentes: estudando sozinho ou em grupo, estudando em detalhes ou su-
perficialmente a disciplina. Vários componentes de uma disciplina podem exigir maneiras
diferentes de se estudar. Usualmente, estudantes tendem a escolher os estilos que melhor
lhes serviram previamente para aprender algo, mas esse estilo pode não ser adequado para
um determinado ponto do estudo de programação (Jenkins, 2003).
Como exemplo, consideremos os estilos de aprendizagem classificados como aborda-
gem aprofundada e abordagem superficial. A abordagem aprofundada é aquela na qual o
estudante busca pela compreensão do tópico, enquanto a abordagem superficial é aquela
na qual o estudo resume-se a pouco mais que memorizar as informações. Programação
é uma atividade que exige o uso de ambas as abordagens: enquanto é necessário um
conhecimento mı́nimo, mesmo que vago, das regras léxicas e sintáticas da linguagem de
programação utilizada, uma compreensão profunda da semântica e dos conceitos abstra-
tos sobre programação é exigido. No caso, não só é necessário que se utilize ambas as
abordagens em vários pontos da disciplina; é exigido que ambas as abordagens sejam
utilizadas ao mesmo tempo (Jenkins, 2003).
Os estilos de aprendizagem podem também variar de acordo com os tipos psicológicos.
Alunos têm estilos de aprendizagem diferentes, que influenciam em seus métodos e pre-
ferências de estudo. Alguns preferem pensar em termos mais abstratos, enquanto outros
podem preferir conceitos mais concretos e aplicados; alguns alunos preferem métodos
sistemáticos de estudos, enquanto outros “deixam-se levar” pelo tema (Keirsey, 1998).
Ocorre que programação exige tanto raciocı́nio abstrato quanto concreto; por vezes, exige
método rı́gido e, noutras, experimentação avulsa. Inclusive, há problemas que são mais
facilmente resolvı́veis de uma forma que de outra. O estudante, porém, usualmente es-
colhe explorar o tema da programação apenas através da maneira que mais lhe agrada,
e tenta utilizar sua abordagem preferida sem considerar o caráter do problema. Uma
pesquisa preliminar focando no estilo de aprendizagem do aluno, com possı́vel aplicação
futura no Tutorial ICC, foi desenvolvido por Chaves Júnior e Bastos (2008). Outras pes-
quisas poderão abordar as práticas necessárias na aprendizagem de programação, dando
um primeiro passo no trabalho sobre as diversas maneiras de estudar de cada tipo de
estilo de aprendizagem.
Outro fator importante — e problemático — no estudo de programação é a motivação.
Enquanto vários alunos aprendem a programar por vontade própria e interesse pessoal
— em outras palavras, por motivação intrı́nseca —, outros estudantes o fazem em busca
de uma carreira financeiramente rentável ou apenas para obter diploma em um curso
superior qualquer — ou seja, por motivação extrı́nseca. Previsivelmente, alunos com mo-
tivações intrı́nsecas apresentam um desempenho melhor em aprendizagem que alunos com
motivações extrı́nsecas. Entretanto, a motivação extrı́nseca não é, de maneira alguma,
Entretanto, tais estudantes são uma minoria e, afinal, vários dos estudantes que demonstram grande
habilidade em diversas outras áreas da Computação também têm dificuldades especı́ficas em solucionar
problemas com código.

5
um empecilho para a aprendizagem, de modo que estudantes com tais interesses não são
“casos perdidos” (Jenkins, 2003).
Além disso, existem diversos “ bugs” conceituais que afetam a maneira como pro-
gramadores iniciantes programam e lêem programas. Por exemplo, é usual que o aluno
imagine que o programa é, em certo sentido, executado de uma vez só — o que é usu-
almente chamado de “bug” de paralelismo; também ocorre de programadores iniciantes
lerem instruções de código subentendendo intenções e não apenas seu significado (“bug”
de intencionalidade) ou de escreverem código que em seu raciocı́nio produza o efeito de-
sejado, mas que possui menos semântica que a necessária (“bug” de egocentrismo) (Pea,
1986). A catalogação e estudo desses “bugs” já vem de longo tempo e inclui artigos como
Pea (1986) e Spohrer e Soloway (1986).

2.3 Fatores pedagógicos


Os professores de programação têm um grande desafio: ensinar uma disciplina extrema-
mente jovem. O corpo de conhecimento sobre o processo didático do ensino de Com-
putação é ainda pequeno quando comparado a outras disciplinas mais bem estabelecidas,
como Álgebra e Cálculo. Isso é especialmente verdadeiro quando se trata de programação,
uma atividade cheia de idiossincrasias e peculiaridades que a colocam no meio do caminho
entre a Álgebra e alguma engenharia.
Entretanto, isso não implica que não temos base alguma para começar a desenvolver e
propor um modelo de ensino de programação. Já há pesquisa na busca de uma metodo-
logia confiável de ensino de programação, e muitas das razões das dificuldades do ensino
de programação já são conhecidas, ao menos superficialmente.
Por exemplo, vários cursos de programação tendem a dar ênfase no ensino da lingua-
gem de programação, e não na programação em si (Gomes e Mendes, 2007), ao ponto de
várias instituições terem uma série de cursos de “Programação”, cada um ensinando uma
linguagem diferente. A escolha da linguagem de programação que suportará os exemplos
de um curso comumente é guiada pela linguagem mais popular na indústria no momento,
ao invés de considerar fatores didáticos (Jenkins, 2003). Isso pode ser problemático, dado
que a linguagem de programação é uma notação e, portanto, pode fazer uma drástica dife-
rença na transmissão de conceitos (Iverson, 1980). Por isso linguagens de programação de
caráter didático, como Pascal (Wirth, 1972) e Logo (Pea, 1983), e ambientes que reduzam
as dificuldades do aluno são didaticamente importantes (Jenkins, 2003)(Gomes e Mendes,
2007).
O contexto em que o estudante acaba de adentrar também dificulta a aprendizagem.
É usual que o ensino de programação seja um dos primeiros cursos que um aluno de
Computação (ou alguma área relacionada ou dependente) tenha durante sua graduação.
O aluno, inexperiente, ao lidar com tão complexa disciplina, tem ainda mais dificuldades
de aprender. Muitos autores consideram que o posicionamento de ensino de programação
na grade curricular é excessivamente adiantado (Jenkins, 2003)(Gomes e Mendes, 2007)2 .
2
Nossa experiência pessoal nos dá uma visão diversa: nós, 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ém a grande heterogeneidade de estudantes nas turmas
de programação. Como o curso de programação é um dos primeiros a serem ministrados,
há em suas turmas estudantes dos mais diversos backgrounds e perfis. Como tais cursos
não raramente ainda seguem uma estrutura bastante tradicional de aula expositiva, seus
professores não dispõem de tempo e energias suficientes para atender pessoalmente cada
um dos alunos. De fato, a falta de personalização nos cursos e o desgaste do professor
são apontadas por vários pesquisadores como causas significativas para mau desempenho
de estudantes de programação (Jenkins, 2003)(Gomes e Mendes, 2007)(Lahtinen et al.,
2005).

2.4 Proposta
A ferramenta que pretendemos expandir — o Tutorial ICC — pode solucionar ou, ao
menos, amenizar vários dos problemas que afligem os estudantes e professores de pro-
gramação. A proposta do tutorial, a longo prazo, é tornar-se um sistema tutorial dotado
de inteligência, objetivo para o qual esse trabalho oferece mais um pequeno passo. Para
compreender como um sistema tutorial dotado de inteligência pode auxiliar o ensino de
programação, precisamos ver, antes o que são sistemas tutoriais inteligentes.

mais avançados e “práticos”. Entretanto, esta é apenas uma evidência anedótica: embora realmente te-
nhamos conhecidos alguns estudantes que reclamassem dessa demora (especialmente em versões antigas
do currı́culo dos nossos cursos), não sabemos quantos realmente reclamavam. Eis uma área digna de
pesquisa.

7
Capı́tulo 3

Sistemas Tutoriais Inteligentes

Sistemas tutoriais inteligentes (do inglês intelligent tutoring systems) são sistemas de
aprendizagem auxiliados por computador (SAAC) que se adaptam, sem necessidade de
contı́nua intervenção humana, às necessidades e ao desempenho do aluno (Self, 1999).
Esses sistemas são um caso especial dos sistemas de instrução auxiliada por computador
(do inglês computer aided instruction) que almejam utilizar tecnologias informáticas no
processo de ensino (Freedman, 2000). Tais sistemas se popularizaram bastante nas escolas
e empresas durante os anos 80 e 90, sendo utilizados para transmitir as mais variadas
competências e conhecimentos (Murray, 1999).
O Tutorial ICC evolui para adquirir, se não o caráter de um sistema tutorial inteligente
em todos os aspectos, ao menos algumas caracterı́sticas e funções de sistemas tutoriais
inteligentes, tornando-se um sistema tutorial dotado de inteligência. O corrente trabalho
é mais um passo nessa direção.

3.1 Arquitetura de um sistema tutorial inteligente


Um dos aspectos mais importantes de qualquer sistema computacional — inclusive de sis-
temas tutoriais inteligentes — é a sua arquitetura. Várias arquiteturas já foram propostas
para sistemas tutoriais inteligentes mas, tradicionalmente, divide-se um sistema tutorial
inteligente em três módulos: o módulo especialista, o módulo do estudante e o módulo
do tutor (Self, 1999). Ademais, a maioria das demais arquiteturas são apenas variações
isoladas desse modelo.
O módulo especialista é responsável por modelar o conhecimento a ser transmitido.
Três abordagens são possı́veis nesse caso: a criação de um módulo “caixa preta”, um
módulo de “caixa de vidro” ou um módulo de solução de problemas. Um módulo “caixa
preta” não codifica a inteligência humana, mas só o conhecimento. Desse modo, esse
módulo apenas pode fazer comparações entre o conhecimento do estudante e a repre-
sentação do conhecimento interna ao sistema. Esse modelo é insuficiente para o ensino,
de modo que sistemas tutoriais inteligentes que fazem uso de tais módulos geralmente
incrementam seu desempenho com os chamados módulos de solução de problemas, que
decidem o comportamento do sistema para cada comportamento observado no módulo

8
do estudante, com especial ênfase em enganos comuns. Alternativas aos módulos “caixa
preta”, os módulos “caixa de vidro” são usualmente baseados em formalismos dos co-
nhecimentos a serem apresentados. Seu desenvolvimento no geral depente do auxı́lio de
engenheiros de conhecimento, que após entrevistar especialistas, cria uma representação
computacinal do conhecimento a ser transmitido (Burns e Capps, 1988).
O módulo do estudante tenta simular o comportamento de um estudante, de modo a
poder prever qual o melhor passo a ser dado. No projeto desse módulo, Burns e Capps
(1988) chama a atenção para três dimensões a serem levadas em conta. Primeiro, é
necessário saber que informações temos sobre o comportamento do usuário do sistema. A
maioria dos sistemas tutoriais inteligentes só tem acesso às respostas dadas pelo aluno às
questões propostas.1 Segundo, convém distinguir qual a categoria do conhecimento que se
tenta transmitir; isto é, é preciso ter em mente se queremos transmitir um conhecimento
procedural (conhecimento sobre como executar uma tarefa), declarativo (conhecimento
sobre fatos em geral, sem necessária aplicação) ou mesmo qualitativo (habilidade em
fazer julgamentos e tirar conclusões de modelos mentais). Por fim, Burns e Capps (1988)
chama a atenção para a necessidade de se distinguir diferenças entre o estudante e o
módulo especialista. Tradicionalmente, usa-se a representação do conhecimento do próprio
módulo especialista na implementação do módulo do estudante; sistemas mais avançados,
porém, também fornecem uma biblioteca de erros que permitem que o sistema reaja de
maneira mais adequada a erros previstos (Burns e Capps, 1988).
O módulo do tutor é o módulo responsável pela integração entre o módulo espe-
cialista e o módulo do estudante. Ele é o real responsável por escolher o fluxo de
apresentação do conteúdo, assim como por dar sugestões e apresentar correções de ma-
neira assı́ncrona. Existem diversas teorias instrucionais utilizadas na construção de tais
módulos (Burns e Capps, 1988).
A esses componentes, Burns e Capps (1988) acrescenta o ambiente de instrução e a
interface homem-máquina. O ambiente de instrução é o conjunto de ferramentas utilizadas
no processo de transmissão de conhecimento. Exemplos dessas ferramentas são jogos,
gráficos, animações etc. Elas compõem um micromundo no qual o aluno explora as
possibilidades do sistema tutorial inteligente. A interface homem-máquina é o conjunto
de tecnologias utilizado para a comunicação entre o computador e o aluno. O Tutorial
ICC, por exemplo, utiliza a interface Web através de uma interface de usuário gráfica.
Beck et al. (1996) propõem uma divisão levemente diferente. O conhecimento do
domı́nio estaria separado do módulo especialista: enquanto o conhecimento do domı́nio se-
ria uma base de dados de conhecimento a ser utilizado, o módulo especialista representaria
o conhecimento de uma pessoa especialmente hábil no tema estudado. O módulo espe-
cialista seria, então, responsável por comparar a solução dada pelo aluno com a solução
do especialista. Além disso, Beck et al. (1996) apresentam tanto o ambiente de instrução
1
Entretanto, vários sistemas tentam captar e processar informações sobre outros aspectos do compor-
tamento do aluno como, por exemplo, seu estado emocional. Esses sistemas são denominados sistemas
tutoriais inteligentes afetivos e podem tanto escolher a ordem de apresentação do conteúdo quanto enviar
mensagens de motivação ou apoio ao estudante (Nkambou, 2006). Infelizmente, como Murray (1999)
ressalta, sistemas baseados em hipermı́dia e Web, como o Tutorial ICC, não dispõem de tais facilidades,
ao menos não de maneira trivial.

9
quanto a interface homem-máquina como um componente só: o modelo de comunicação,
que intermedeia a interação entre a máquina e o aluno. A figura 3.1 apresenta as interações
entre os módulos da arquitetura proposta por Beck et al. (1996).

 - Modelo de Comunicação
Modelo de estudante - Módulo Pedagógico
6 }
Z >
 6
Z
Z
 Z
Conhecimento de Domı́nio Modelo de Especialista

Figura 3.1: Componentes de um STI, segundo Beck et al. (1996)

Uma alternativa com alterações mais significativas é a de Gugerty (1997). Gugerty


(1997) propõe a criação de sistemas tutoriais inteligentes sem módulos de estudante.
Tais sistemas seriam, então, ferramentas computacionais de auxı́lio a professores. Esses
sistemas são chamados sistemas tutoriais inteligentes não-diagnósticos, em oposição aos
sistemas tutoriais inteligentes tradicionais que fazem um diagnóstico do estado afetivo
e/ou cognitivo do estudante. De fato, a experiência tem mostrado que sistemas tutoriais
inteligentes são caros e difı́ceis de se desenvolver, embora bastante efetivos (Murray, 1999),
e o módulo de estudante é a parte mais difı́cil de se desenvolver (Burns e Capps, 1988).
Ademais, o estado atual da tecnologia informática ainda não oferece uma largura de
banda de informações sobre o usuário suficiente para uma avaliação significativa do estado
cognitivo e afetivo do aluno e, no final das contas, os ganhos pedagógicos do uso de sistemas
tutoriais inteligentes não-diagnósticos são consideráveis (Gugerty, 1997). Embora esse
tipo de sistema tutorial fuja do modelo tradicional, ele é bastante promissor e pode servir
como referência em vários aspectos para o nosso sistema.
Como se percebe, há várias divergências sobre como organizar a arquitetura de um
sistema tutorial inteligente. Entretanto, essas são, quase sempre, divergências 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á tentar situar o Tutorial ICC no estado da arte dos sistemas
tutoriais inteligentes. O que é interessante que o Tutorial ICC tenha? O que outros
sistemas nos ensinam?
Uma primeira diferenciação a ser feita é entre os sistemas tutoriais inteligentes shell e
tool. Um shell é um framework para desenvolvimento de sistemas tutoriais inteligentes; ge-
ralmente, é mais voltado para programadores de computadores, que podem customizá-los,
e são mais genéricos. Já tools são mais voltados para o público em geral, fornecendo inter-
faces que permitem não programadores registrarem o conhecimento no sistema (Murray,
1999). Nessa categorização, Tutorial ICC é claramente um tool.

10
Murray (1999) divide os sistemas tutoriais inteligentes em sete categorias não ortogo-
nais em função dos seus domı́nios de atuação e áreas em que seu uso é mais adequado.
As categorias, sumarizadas na tabela 3.1, são as seguintes:

1. Planejamento e sequenciamento de currı́culos


Os sistemas tutoriais inteligentes de planejamento e sequenciamento de currı́culos
definem unidades de instrução cujo fluxo de apresentação é decidido pelo sistema
de acordo com as necessidades do aluno. Para o estudante, esses sistemas são 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ção de conteúdos. A ordem de apresentação
de conteúdos deve, porém, ser escolhida pelo sistema de forma automatizada, sem
interferência humana, assim como deve se adequar especificamente ao desempenho
de cada aluno.
2. Estratégias tutoriais
Diz-se que um sistema tutorial inteligente tem foco em estratégias tutoriais (ou
estratégias de ensino) quando tem a capacidade de decidir quais as melhores es-
tratégias de apresentação de conteúdo para o aluno. Esses sistemas são semelhantes
aos sistemas de planejamento e sequenciamento de currı́culos, mas agem em um
nı́vel de abstração mais baixo. Enquanto os sistemas de planejamento e sequencia-
mento de currı́culos tomam decisões sobre quais componentes do fluxo da matéria
vão apresentar; sistemas de estratégias tutoriais escolhem o melhor momento para
apresentar ferramentas de ensino, e não só conteúdo. Por exemplo, um sistema que
decida explicar mais detalhadamente um determinado tópico do ensino e escolha
quando apresentar uma determinada explicação ou um exemplo são sistemas de
estratégias tutoriais.
3. Simulação de dispositivos e treinamento em equipamentos
Vários sistemas tutoriais inteligentes buscam simular certos dispositivos para o estu-
dante. A interação 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ção 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 é especialmente útil quando se quer
ensinar o uso de equipamentos caros, frágeis, perigosos ou inacessı́veis. Tais sistemas
também são interessantes pois permitem que se dê uma resposta mais didática ao
estudante, ao invés do erro real gerado pelo dispositivo.
4. Sistemas especialistas e tutores cognitivos
É bastante comum o uso de simulações cognitivas em sistemas tutoriais inteligentes.
Sistemas tutoriais inteligentes que usam esse método possuem um mecanismo de
simulação de cognição que, baseado em regras, tentam criar um modelo de cognição
do atual estágio de conhecimento do aluno. Esse modelo é utilizado pelo módulo

11
especialista para definir o melhor fluxo de ensino. Esses sistemas são chamados
de sistemas tutores cognitivos, ou sistemas de modelagem de cognição. Murray
(1999) põe na mesma categoria tanto esses sistemas quanto os sistemas que fazem
uso de sistemas especialistas para a resolução de problemas. A diferença é que
sistemas especialistas são utilizados no módulo especialista para encontrar a solução
de problemas didáticos e não para modelar o estado cognitivo do estudante.
5. Múltiplos tipos de conhecimento
Quanto um sistema tutorial inteligente baseia-se em uma determinada teoria do
conhecimento para escolher a maneira mais adequada de apresentar uma parte do
conteúdo, diz-se que o sistema possui múltiplos tipos de conhecimentos. Por exem-
plo, um sistema com múltiplos tipos de conhecimento pode dividir o conhecimento
a ser transmitido em três categorias: fatos, conceitos e procedimentos. Cada com-
ponente da habilidade maior a ser ensinada contaria com um método especı́fico de
ensino, dependendo de qual das três categorias acima melhor modela o componente.
Esses sistemas tendem a ser mais fáceis de configurar, mas são menos flexı́veis.
6. Sistemas de propósito especı́fico
Embora sistemas tutoriais inteligentes genéricos tenham atraı́do bastante interesse,
também pode ser interessante projetar sistemas tutoriais inteligentes para áreas es-
pecı́ficas. Não raramente, sistemas genéricos surgem do desenvolvimento de um
sistema especı́fico que vai gradativamente se tornando parametrizável e reutilizável.
Por um lado, esses sistemas de propósito especı́fico atingem um público-alvo bem
restrito; por outro lado, podem utilizar ferramentas didáticas especı́ficas mais po-
derosas.
7. Hipermı́dia adaptativa/inteligente
Com a crescente sofisticação de sistemas de hipermı́dia (notadamente, a Web), um
passo natural seria o desenvolvimento de sistemas tutoriais inteligentes baseados
em hipermı́dia adaptativa (ou hipermı́dia inteligente). De fato, sistemas tutoriais
inteligentes baseados na Web têm se tornado predominantes nessa área de pesquisa.
Esses sistemas permitem a apresentação, ordenação, filtragem etc. de links em
função de vários aspectos da disciplina ou do desempenho do aluno, como fluxo
de apresentação, dificuldade, adequação de pré-requisitos etc. Comumente, tais
sistemas são sistemas de planejamento e sequenciamento de currı́culo, ou sistemas
de estratégias tutoriais com uma interface baseada em hipermı́dia.

Embora essa classificação mais pareça a “enciclopédia chinesa” de Jorge Luis Bor-
ges (Foucault, 2002) que uma taxonomia tradicional, ela é muito útil. O próprio Murray
a descreve mais como um “saco de dicas” que uma “caixa de ferramentas”. De qual-
quer forma, Tutorial ICC pode se encaixar mais ou menos bem em várias dessas ca-
tegorias. Nosso objetivo inicial é, a princı́pio, torná-lo um sistema de planejamento e
sequenciamento de currı́culos, ou, mais provavelmente, um sistema de estratégias tuto-
riais; naturalmente, podemos torná-lo ambos. Do mesmo modo, já hoje o Tutorial ICC

12
Categoria Vantagens Desvantagens Variações
Planejamento Executar regras para Pouca fidelidade ao As regras podem ser
e sequenci- sequenciamento de modelo de estudante; fixas ou alteráveis pelo
amento de módulos e programas representação superfi- autor
currı́culos cial de habilidades
Estratégias Estratégias tutoriais Pouca fidelidade ao Método de estratégia
tutoriais variáveis dentro do modelo de estudante; de representação,
módulo; conjunto so- representação superfi- fonte de expertise
fisticado de primitivas cial de habilidades instrucional
e múltiplas estratégias
tutoriais
Simulação de Tutoramento de iden- Estratégias instrutivas Fidelidade da si-
dispositivos tificação de compo- limitadas; modelagem tuação, facilidade
e treina- nentes, operação e re- de estudante limitada de composição de
mento em solução de problemas; tutorial
equipamentos habilidades procedu-
rais
Sistemas Modelo do domı́nio Dificuldade de cons- Modelos de habilidade
especialistas de especialização mais trução; limitação a ha- baseados em cognição
e tutores profundo e executável; bilidades procedurais ou desempenho
cognitivos facilidade de inclusão ou de solução de pro-
de erros e comporta- blemas; estratégias de
mento de novato instrução limitadas
Múltiplos Representação clara Limitado a fatos, con- Inclusão de sequenci-
tipos de e método instrutivos ceitos e procedimentos amento curricular in-
conhecimento pré-definidos para simples; estratégias teligente; variação dos
fatos, conceitos e tutoriais pré-definidas tipos de conhecimento
procedimentos e tarefas suportados
Sistemas de Modelos de sistemas Ferramentas limitadas Grau de inflexibili-
propósito provêem uma grande ao tipo de tutor que dade
especı́fico ajuda na composição suportam; inflexibili-
do conteúdo; um dade na representação
projeto ou princı́pio e pedagogia
pedagógico especı́fico
pode ser enfatizado
Hipermı́dia Acessı́vel pela Web; Interação limitada; Foco em micro ou ma-
adaptati- uniformidade de in- largura de banda de crovisão; grau de inte-
va/inteligente terface de usuário; resposta de modelo de ratividade.
seleção adaptativa e estudante limitada
anotação de hiper-
ligação

Tabela 3.1: Categorias de STIs, segundo Murray (1999)

13
fornece simulações de um computador, tornando-o um potencial sistema de simulação
de dispositivos. Como programação exige o conhecimento de uma série de fatos, concei-
tos e habilidades, é também bem provável que o Tutorial ICC se torne um sistema de
múltiplos conhecimentos. Como, afinal, o Tutorial ICC é um sistema Web, ele é, desde
já, um sistema de hipermı́dia, e o transformaremos em um sistema de hipermı́dia adapta-
tiva. Estudando cada um dos cases apresentados em Murray (1999), podemos encontrar
diversas idéias para nos auxiliar no nosso projeto.

3.3 Vantagem dos sistemas tutoriais inteligentes


Os sistemas de aprendizagem auxiliada por computador (SAAC) fornecem uma série de
vantagens aos professores e estudantes de programação. Por exemplo, dado o aumento
na demanda por cursos focados em Tecnologia da Informação, o número de aluno nas
turmas de disciplinas de programação tende a crescer bastante, como comentamos no
capı́tulo 1; SAACs permitem que as partes mais fáceis de assimilar do conteúdo 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álogo,
estes sistemas viabilizam cursos de educação a distância (EaD). Tais sistemas também
permitem que o aluno possa estudar em seu próprio ritmo, algo que pode ser bastante
positivo para a aprendizagem, conforme comentado na seção 2.3. O Tutorial ICC, sobre
o qual trabalhamos, é um exemplo sistema de aprendizagem auxiliada por computador
(SAAC).
Entretanto, SAACs têm desvantagens. Uma destas desvantagens é a despersonalização
do ensino. Mesmo cursos tradicionais de programação não alcançam o ideal de cursos
personalizados, com foco nas dificuldades dos alunos; SAACs tradicionais tendem a ser
ainda mais problemáticos. De modo análogo, estes sistemas não se adaptam ao ritmo de
aprendizagem e estilo de estudo dos estudantes.
Técnicas de desenvolvimento de STIs podem ser utilizadas em SAACs para tentar su-
perar essas desvantagens. De fato, vários STIs se adaptam ao ritmo, estilo e personalidade
do aluno. A médio prazo, espera-se que o Tutorial ICC torne-se adaptável aos diversos
nı́veis de dificuldade dos alunos.

3.4 O papel do trabalho corrente


Neste trabalho, nosso objetivo é prover ao Tutorial ICC uma série de exemplos, orga-
nizados em taxonomias de exemplos hierárquicas, que permitam que alunos em diversos
estágios e ritmos de aprendizagem analisar cenários simples e complexos de acordo com
sua própria capacidade. Esses cenários devem conter um enunciado, uma solução em
código-fonte Pascal e um script de execução de “tira-teima”, que representa graficamente
a execução do programa, através de uma applet Java. Também faz parte do trabalho uma
representação da posição do aluno na taxonomia.
A maneira como essas tarefas foram desenvolvidas é 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 é o método de desenvolvimento de uma forma de estruturar problemas
que denominamos taxonomias hierárquicas de exemplos. O método envolve uma série de
passos, seus próprios termos e algumas recomendações. Abaixo, seguem estes resultados.

4.1 Taxonomia hierárquica de exemplos


Uma taxonomia é, literalmente, a ciência ou técnica de classificação (Houaiss et al., 2001,
pp. 2680—2681). No nosso trabalho, uma taxonomia de exemplos é uma classificação
de um conjunto de exemplos; por extensão, uma taxonomia de exemplos é também um
conjunto de exemplos organizados segundo uma determinada classificação. Por sua vez,
uma taxonomia hierárquica de exemplos é uma taxonomia na qual os exemplos são orga-
nizados de forma estruturada, como árvores. Também dizemos, neste trabalho, que uma
taxonomia hierárquica é uma árvore de exemplos, de modo que é possı́vel que nos refi-
ramos a alguma propriedade de árvores, mas se referindo a uma taxonomia hierárquica.
Como trataremos apenas de taxonomias hierárquicas de exemplos, toda vez que usarmos
o termo “taxonomia” o significado será “taxonomia de exemplos hierárquica”.
Cada taxonomia exemplifica o uso de um conjunto de caracterı́sticas removı́veis. Uma
caracterı́stica removı́vel é um conceito, técnica ou padrão que o estudante deve aprender.
A raiz da árvore da taxonomia deve utilizar todas as caracterı́sticas removı́veis; seus
nós diretamente subordinados devem explorar subconjuntos diferentes das taxonomias
da raiz, e os filhos desses nós apresentarão subconjuntos dos subconjuntos que seus pais
apresentam.
Na prática, nós utilizamos taxonomias com duas ou três caracterı́sticas removı́veis.
Se a taxonomia tiver duas caracterı́sticas removı́veis, os nós filhos da raiz deverão ter,
cada um, uma caracterı́stica. Parece natural que cada um desses nós tenha ele mesmo
um nó filho sem nenhuma caracterı́stica; entretanto, não seria muito didático fazer o
estudante descer mais um nı́vel nos exemplos para observar um exemplo que sequer apre-
senta uma das caracterı́sticas da árvore. Deste modo, o nó que não contém nenhuma

15
das caracterı́sticas removı́veis torna-se filho do nó principal. A figura 4.1 apresenta uma
representação gráfica dessa árvore. O travessão é o rótulo do nó sem caracterı́sticas.

C1, C2

Z
Z
 Z
 Z
 Z
 Z
 Z
 Z
 Z
 Z

  
Z
— C1 C2
  

Figura 4.1: Representação de taxonomia com duas caracterı́sticas removı́veis

Se a taxonomia tiver três caracterı́sticas removı́veis, o exemplo raiz deve usar as três. A
raiz teria, usualmente, três nós filhos, cada um apresentando duas das três caracterı́sticas
removı́veis. Esse nó filho é, por sua vez, raiz de uma subárvore que tem a estrutura de uma
taxonomia de duas caracterı́sticas removı́veis. A figura 4.2 apresenta uma representação
gráfica dessa árvore. O travessão é o rótulo do nó sem caracterı́sticas.


C1, C2, C3

, l
, l
, l
, l
, l
, l
, l
, l

,  l
C1, C2 C1, C3 C2, C3

LL  
LL LL
L L L
L L L
L L L
L L L

 L 
  L 
 L



— C1 C2 — C1 C3 — C2 C3

Figura 4.2: Representação de taxonomia com três caracterı́sticas removı́veis

Se uma taxonomia tem uma das estruturas apresentadas acima, dizemos que é uma
taxonomia totalmente preenchida. Embora tenhamos focado em gerar taxonomias total-
mente preenchidas, nem sempre é possı́vel ou interessante “forçar” o total preenchimento

16
de uma taxonomia. Por exemplo, muitas vezes o exemplo sem caracterı́sticas removı́veis
em uma taxonomia pode ser simples demais e não precisa ser apresentado. Isto ocorre co-
mumente com taxonomias de três caracterı́sticas, e a árvore resultante possui a estrutura
representada na figura 4.3. A seção 5.2 apresenta uma taxonomia com esta estrutura.


C1, C2, C3

, l
, l
, l
, l
, l
, l
, l
, l

,  l
C1, C2 C1, C3 C2, C3
  
 B  B  B
 B  B  B
 B  B  B
 B  B  B
 B  B  B

  B 
  B 
  B
C1 C2 C1 C3 C2 C3
     

Figura 4.3: Representação de taxonomia sem nó sem caracterı́sticas

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

17

C1, C2, C3

, l
, l
, l
, l
, l
, l
, l
, l

,  l
C1, C2 C1, C3 C2, C3
  
 B
 B
 B
 B
 B

  B  
C1 C2 C1 C2
   

Figura 4.4: Representação de uma taxonomia não-ortogonal

4.2 Enunciados e soluções


Dados os conceitos apresentados na seção 4.1, o processo para o desenvolvimento de ta-
xonomias de problemas pôde ser facilmente definido. Primeiro, definı́amos conjuntos de
duas ou três caracterı́sticas removı́veis — idealmente, conjunto de caracterı́sticas que
usualmente aparecem de fato próximas 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árquica. Para cada
um dos enunciados, elaboramos um pequeno programa que resolva o problema.
A elaboração de enunciados apresenta uma série de questões. Por exemplo, qual é
o melhor estilo: enunciados que apresentem problemas da vida real, ou enunciados abs-
tratos? Conforme comentamos na seção 2.2, há estudantes que lidariam melhor com um
estilo, enquanto outros apreciariam mais o outro — e nem consideramos outros parâmetros
que variam em função do tipo de personalidade! Nossa abordagem foi experimentar enun-
ciados de ambos os estilos. Em breve, poderemos avaliar os resultados1 .
Outra questão foi: como exercitar bugs conceituais dos estudantes? Na seção 2.2
comentamos que há vários enganos que estudantes cometem recorrentemente. Esses en-
ganos podem servir de guia para os exemplos, mas ainda há o desafio de inseri-los em
enunciados. Do mesmo modo, há padrões de programação importantes e úteis que os
1
Um estilo que pode ser promissor são os enunciados baseados em abstrações com estado, especialmente
jogos, como o Jogo da Vida, Snake ou Tetris. De fato, em conversas e observações anedóticas com calouros,
notamos que esses problemas são especialmente apreciados.

18
estudantes devem conhecer, e deve haver enunciados que os apresentem. Em verdade,
bugs conceituais e padrões importantes são boas caracterı́sticas removı́veis.
Também se questionou qual deve ser a relação entre os enunciados de uma taxono-
mia. Os enunciados devem ser independentes ou relacionados? Nossa hipótese é que os
enunciados devem ser relacionados, e os mais simples devem ser versões ou “passos” dos
enunciados mais completos. Isto, supomos, mantém o estudante no contexto mental do
problema, facilitando sua compreensão.
Uma vez definidos os enunciados, devemos desenvolver os programas que os soluci-
onam. A linguagem de programação em que foram solucionados foi aquela já utilizada
no Tutorial ICC: Pascal. Pascal é uma boa escolha também porque é uma linguagem
didática, como explicado na seção 2.3.
Um desafio na criação dos enunciados é: como criar um enunciado que “force” —
isto é, torne mais natural — o aluno a utilizar as caracterı́sticas que queremos? Depois
de criarmos algumas taxonomias, notamos que esta é uma questão secundária: embora
seja realmente interessante criar enunciados que levem intuitivamente às caracterı́sticas
removı́veis escolhidas, são os desenvolvedores das taxonomias que escolhem como soluci-
onarão os enunciados. Isto é interessante de se ter em mente porque, por vezes, alguns
enunciados tornam-se pouco intuitivos para forçar a solução de um problema em uma
determinada direção. Este esforço, porém, não é necessário. A taxonomia apresentada na
seção 5.2 é um bom exemplo prático disso.

Figura 4.5: Screenshot da applet Java executando um “tira-teima”

19
4.3 “Tira-teima” e roteiros
Um dos recursos mais notáveis do Tutorial ICC são os “tira-teimas”: representações
gráficas da execução de um programa. Esses “tira-teimas” são apresentados através de
uma applet Java, apresentada na figura 4.5. Os “tira-teimas” são compostos de duas
partes: um programa cuja execução será simulada e um script especı́fico que simulará a
execução. Denominamos tais scripts de roteiros.
Cada linha de um roteiro inicia com um número inteiro; este número é o ı́ndice da
linha do programa simulado que será realçada no programa quando a linha do roteiro
for executada. Após este ı́ndice, podem vir zero ou mais comandos separados por ponto-
e-vı́rgula. Se não houver nenhum comando a ser executado na linha, apenas o ponto-e-
vı́rgula segue o número; se houver mais de um, os comandos devem vir entre chaves. Há,
basicamente, comandos de declaração de variáveis (que aparecem como caixas coloridas
na applet de tira-teima, comandos de escrita (que imprimem um valor no console da applet
e alteração de valores de variáveis. A figura 4.6 apresenta o exemplo do roteiro utilizado
para o exemplo apresentado na seção 5.4.3.1.

1;
3;
4 real a , b ;
6;
7 writeln ( " Digite a parte real : " ) ;
8 { writeln ( " 3.0 " ) ; a = 3.0;}
9 writeln ( " Digite a parte imaginaria : " ) ;
10 { writeln ( " 0.0 " ) ; b = 0.0;}
11;
18;
19;
22;
23 writeln ( " 3.0 + 0.0 i e um real nao - negativo . " ) ;
24;

Figura 4.6: Exemplo de roteiro de “tira-teima”

Um roteiro pode percorrer apenas um caminho dentro de um programa. Por exemplo,


se há um comando if com uma cláusula else no programa, um roteiro pode passar
apenas pela cláusula then ou pela cláusula else. Isto levanta uma questão importante:
como escolher o caminho que um roteiro deve percorrer em um programa?
Nós utilizamos alguns critérios 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ção 5.1.3.4 por exemplo, possui como caracterı́stica
removı́vel a presença da cláusula else no comando if. O roteiro deste programa iria,
então, passar pelo comando da cláusula else, ao invés de passar pela cláusula then.
Outro critério adotado foi:

Dentre dois caminhos possı́veis, o roteiro deve passar pelo caminho mais complexo
ou que gere mais saı́da para o console da applet.

Este critério foi adotado porque acreditamos que, quanto mais linhas de código o
estudante observar serem executadas, mais oportunidades haverá para fixar conceitos.
Além disso, execuções sem saı́da podem ser bastante confusas: para o iniciante, é bem
possı́vel que um programa que não imprima nada pareça um programa que não faça nada.

4.4 Localização na taxonomia


Os vários exemplos são apresentados em páginas HTML separadas, mas sentimos a ne-
cessidade de prover ao estudante uma maneira de ele se localizar em uma determinada
taxonomia. A solução foi criar imagens de árvores, nas quais o exemplo em que o estu-
dante se encontra é destacado através de cores. A figura 4.7 apresenta a representação de
uma árvore.

Figura 4.7: Representação da localização do aluno na taxonomia

21
4.5 Resumo
Dados os conceitos acima, o processo de criação de taxonomias para um capı́tulo pode
ser resumido da seguinte maneira:

1. selecionar conceitos e estruturas relevantes — isto é, caracterı́sticas removı́veis — a


partir do tema do capı́tulo;
2. agrupar as caracterı́sticas removı́veis em conjuntos de duas ou três caracterı́sticas.
Idealmente, as caracterı́sticas são conceitualmente próximas 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ão criar enunciados
para alguns subconjuntos que sejam triviais ou inviáveis. Os enunciados de uma
taxonomia devem, idealmente, ser versões mais simples ou mais completas de um
problema;
4. para cada enunciado, desenvolver uma solução, em linguagem Pascal;
5. para cada solução, desenvolver um roteiro de “tira-teima”;
6. inserir os programas e roteiros em páginas HTML do Tutorial ICC;
7. para cada página, criar uma representação gráfica da taxonomia da qual a página
faz parte, e inserir essa representação na página.

Naturalmente, os passos não precisam seguir forçosamente esta ordem, mas é usual
que sejam seguidos assim.
O capı́tulo 5 apresenta a aplicação deste processo em um capı́tulo do Tutorial ICC.

22
Capı́tulo 5

Exemplos de Taxonomias

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ão if-then-else e case-of. Julgamos os conceitos por trás
destes comandos sofisticados o suficiente para antevermos alguns desafios da criação de
taxonomias, mas simples o suficiente para que não nos perdêssemos no seu desenvolvi-
mento; por isso, capı́tulo 3 do tutorial foi escolhido para o desenvolvimento da primeira
taxonomia.
Chegamos a várias conclusões e questionamentos durante a criação desta taxonomia e,
portanto, elegemos a taxonomia deste capı́tulo como um bom exemplo para ser analisado.

5.1 Árvore 1
Na primeira árvore do capı́tulo 3, propomos ao aluno um problema que possa ser resol-
vido com o comando if-then — assim sendo, todos os problemas da árvore devem ser
solucionados utilizando a estrutura condicional. As caracterı́sticas removı́veis, nesta pri-
meira árvore, são o uso do comando else e a presença de um comando composto, formado
por vários outros comandos agrupados pelos delimitadores de blocos begin-end. Como
há duas caracterı́sticas removı́veis, essa árvore possui dois nı́veis de hierarquia e quatro
exemplos.

5.1.1 Caracterı́sticas removı́veis


C1. uso de blocos begin-end

C2. uso de else


1
O primeiro capı́tulo é, basicamente, para apresentação de conceitos sobre computadores. Nesse
sentido, não há como criar uma taxonomia de exemplos de programação para o capı́tulo.

23
5.1.2 Numeração dos exemplos
C1 C2 Exemplo
• • 1 (subseção 5.1.3.1)
– – 1.1 (subseção 5.1.3.2)
• – 1.2 (subseção 5.1.3.3)
– • 1.3 (subseção 5.1.3.4)

5.1.3 Enunciados e programas


5.1.3.1 Exemplo 1
Enunciado Uma companhia de seguros vende seguros de carros. O preço de um seguro
anual é 5%, ou 1/20 do preço do carro. Entretanto, a companhia só vende seguros para
pessoas com mais de 25 anos.
Faça um programa que leia o preço 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á:

’ Valor do seguro : R $ 1000.00. ’

Se o motorista não tiver idade para contratar o seguro, imprima duas linhas. A
primeira linha será:

’ Voce nao pode contratar o seguro . ’

Supondo que o motorista tenha 22 anos, a segunda linha será:

’ podera contaratar em 3 anos . ’

Solução A solução 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ço de um seguro
anual é 5%, ou 1/20 do preço do carro. Entretanto, a companhia só vende seguros para
pessoas com mais de 25 anos.
Faça 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ção A solução 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ço de um seguro
anual é 5%, ou 1/20 do preço do carro. Entretanto, a companhia só vende seguros para
pessoas com mais de 25 anos.
Faça 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ão tenha idade para
contratar o seguro, deve imprimir a mensagem:

25
’ Voce nao pode contratar o seguro . ’

Além disso, deve também informar quando o cliente terá idade para contratar o seguro.
Supondo que o cliente tenha 22 anos, a mensagem será:

’ Podera contratar em 3 anos . ’

Solução A solução 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ço de um seguro
anual é 5%, ou 1/20 do preço do carro. Entretanto, a companhia só vende seguros para
pessoas com mais de 25 anos.
Faça um programa que leia o preço 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á:

’ Valor do seguro : R $ 1000.00. ’

Se o motorista não tiver idade para contratar o seguro, imprima a mensagem:

’ Voce nao pode contratar o seguro . ’

26
Solução A solução usada foi a seguinte

program exemplo1_3 ;

var
idade : integer ;
preco : real ;

begin
writeln ( ’ Qual e a sua idade ? ’) ;
readln ( idade ) ;
writeln ( ’ Qual e o preco de seu carro ? ’) ;
readln ( preco ) ;
if idade >= 25
then
writeln ( ’ Valor do seguro : R $ ’ , preco /20:2:2 , ’. ’)
else
writeln ( ’ Voce nao pode contratar o seguro . ’) ;
end .

5.1.4 Comentários
No exemplo 1, tı́nhamos de apresentar ambas as caracterı́sticas removı́veis. Na árvore ori-
ginal, acrescentamos a caracterı́stica C2 colocando blocos de comando tanto na cláusula
then quanto na cláusula else. Entretanto, decidimos posteriormente que seria mais inte-
ressante colocar o comando composto em apenas uma das cláusulas: deste modo, espera-se
que o aluno compreenda que é possı́vel ter um comando composto em uma das cláusulas
tendo um comando simples na outra cláusula. Julgamos relevante inserir, sempre que
possı́vel, esse tipo de assimetria nos problemas. Além disso, decidimos colocar o comando
composto na cláusula else porque, no exemplo 1.2, o comando composto já fora colocado
em uma cláusula then.

5.2 Árvore 2
Nosso objetivo na segunda árvore do capı́tulo 3 é apresentar exemplos de aplicação, ao
aluno, do uso dos operadores booleanos and, or e not. A árvore tem três caracterı́sticas
removı́veis, que são o uso do operador and, o uso do operador or e o uso do operador not. O
exemplo maior utiliza as três caracterı́sticas removı́veis e possui três exemplos diretamente
subordinados; cada um desses exemplos possui duas das caracterı́sticas removı́veis, e
possuem dois exemplos subordinados, cada um exercendo uma caracterı́stica removı́vel
do exemplo superior.

27
5.2.1 Caracterı́sticas removı́veis
C1. uso do operador and

C2. uso do operador or

C3. uso do operador not

5.2.2 Numeração dos exemplos


c1 c2 c3 Exemplo
• • • 2 (subseção 5.2.3.1)
• • – 2.1 (subseção 5.2.3.2)
• – • 2.2 (subseção 5.2.3.3)
– • • 2.3 (subseção 5.2.3.4)
• – – 2.1.1, 2.2.1 (subseção 5.2.3.5)
– • – 2.1.2, 2.3.1 (subseção 5.2.3.6)
– – • 2.2.2, 2.3.2 (subseção 5.2.3.7)
– – – — (ver comentários na subseção 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á trabalhar em seu
território satisfaça duas condições. A primeira condição é que o contratador do estrangeiro
envie uma carta à embaixada. Além disso, o estrangeiro deve ter US$ 10 mil em uma
conta do paı́s de origem ou ter um imóvel no paı́s de origem.
Faça um programa que pergunte ao usuário se ele tem a carta do empregador, pergunte
se ele tem US$ 10 mil reais em uma conta no paı́s de origem e pergunte se ele tem um
imóvel. Se o usuário não tiver a carta ou alguma das duas outras condições não for
satisfeita, imprima a mensagem:

’ Voce nao pode trabalhar no pais . ’

Caso contrário, não imprima nada. As respostas que o programa espera são ’s’ (para
“sim”) ou ’n’ (para “não”).

Solução A solução 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á trabalhar em seu
território satisfaça duas condições. A primeira condição é que o contratador do estrangeiro
envie uma carta à embaixada. Além disso, o estrangeiro deve ter US$ 10 mil em uma
conta do paı́s de origem ou ter um imóvel no paı́s de origem.
Faça um programa que pergunte ao usuário se ele tem a carta do empregador, pergunte
se ele tem US$ 10 mil reais em uma conta no paı́s de origem e pergunte se ele tem um
imóvel. Se o usuário tiver a carta e alguma das duas outras condições for satisfeita,
imprima a mensagem:

’ Voce pode trabalhar no pais . ’

Caso contrário, não imprima nada. As respostas que o programa espera são ’s’ (para
“sim”) ou ’n’ (para “não”).

Solução A solução 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á trabalhar em seu
território satisfaça duas condições. A primeira condição é que o contratador do estrangeiro
envie uma carta à embaixada. Além disso, o estrangeiro deve ter US$ 10 mil em uma
conta do paı́s de origem ou ter um imóvel no paı́s de origem.
Faça um programa que pergunte ao usuário se ele tem US$ 10 mil em uma conta e
pergunte se ele tem um imóvel. Se o usuário tiver o dinheiro mas não tiver o imóvel,
imprima a mensagem:

’ Mesmo sem imovel , voce pode trabalhar no pais se tiver uma carta
.’

Caso contrário, não imprima nada. As respostas que o programa espera são ’s’ (para
“sim”) ou ’n’ (para “não”).

Solução A solução 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á trabalhar em seu
território satisfaça duas condições. A primeira condição é que o contratador do estrangeiro
envie uma carta à embaixada. Além disso, o estrangeiro deve ter US$ 10 mil em uma
conta do paı́s de origem ou ter um imóvel no paı́s de origem.
Faça um programa que pergunte ao usuário se ele tem US$ 10 mil em uma conta e
pergunte se ele tem um imóvel. Se o usuário não tiver o dinheiro nem o imóvel, imprima
a mensagem:

’ Voce nao pode trabalhar no pais . ’

30
Caso contrário, não imprima nada. As respostas que o programa espera são ’s’ (para
“sim”) ou ’n’ (para “não”).

Solução A solução 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á trabalhar em seu
território satisfaça duas condições. A primeira condição é que o contratador do estrangeiro
envie uma carta à embaixada. Além disso, o estrangeiro deve ter US$ 10 mil em uma
conta do paı́s de origem ou ter um imóvel no paı́s de origem.
Faça um programa que pergunte ao usuário se ele tem a carta do empregador e per-
gunte se ele tem um imóvel. Se o usuário tiver a carta e o imóvel, imprima a mensagem:

’ Voce pode trabalhar no pais . ’

Caso contrário, não imprima nada. As respostas que o programa espera são ’s’ (para
“sim”) ou ’n’ (para “não”).

Solução A solução 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á trabalhar em seu
território satisfaça duas condições. A primeira condição é que o contratador do estrangeiro
envie uma carta à embaixada. Além disso, o estrangeiro deve ter US$ 10 mil em uma
conta do paı́s de origem ou ter um imóvel no paı́s de origem.
Faça um programa que pergunte ao usuário se ele tem US$ 10 mil em uma conta e
pergunte se ele tem um imóvel. Se o usuário tiver o dinheiro ou o imóvel, imprima a
mensagem:

’ Voce so precisa da carta . ’

Caso contrário, imprima a mensagem:

’ Voce nao pode trabalhar no pais . ’

As respostas que o programa espera são ’s’ (para “sim”) ou ’n’ (para “não”).

Solução A solução 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á trabalhar em seu
território satisfaça duas condições. A primeira condição é que o contratador do estrangeiro
envie uma carta à embaixada. Além disso, o estrangeiro deve ter US$ 10 mil em uma
conta do paı́s de origem ou ter um imóvel no paı́s de origem.
Faça um programa que pergunte ao usuário se ele tem a carta do empregador. Se ele
não tiver a carta, imprima a mensagem:

’ Voce nao pode trabalhar no pais . ’

Caso contrário, não imprima nada. As respostas que o programa espera são ’s’ (para
“sim”) ou ’n’ (para “não”).

Solução A solução 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ários
Para mostrar uma aplicação prática destes operadores, utilizamos ainda o comando if. É
interessante notar que procuramos evitar utilizar a cláusula else, justamente para “forçar”
ao aluno que pense em termos dos operadores. Isso provavelmente não é necessário:
como programas implementando os enunciados já são apresentados, não é preciso forçar
o estudante a pensar de certa maneira — basta apresentar um enunciado que leve a uma
solução intuitiva utilizando as caracterı́sticas removı́veis do problema. Ademais, evitar
utilizar a cláusula else acabou tornado os enunciados menos intuitivos. Por exemplo,
enquanto a solução do exemplo 2 possui um comando if arbitrariamente sem cláusula else
, poderı́amos acrescentá-la que conseguirı́amos ainda assim utilizar todos os operadores,
como fizemos no exemplo da seção 5.2.3.6.
A implementação de árvores de três nı́veis apresenta vários desafios. Primeiro, são
árvores maiores. Além disso, como podemos notar na árvore 2, elas não necessariamente
levam a árvores totalmente preenchidas, que era nosso objetivo inicial: não há na árvore
2 um exemplo a que falte todas as caracterı́sticas removı́veis. Não acrescentamos este

33
exemplo porque ele possuiria apenas um comando if, o que já foi exercitado na árvore
12 . A árvore 4 é também não totalmente preenchida, embora por razões diferentes3 .
Outro aspecto caracterı́stico das árvores de três caracterı́sticas é a repetição de de
exemplos. Como há três exemplos subordinados ao exemplo maior, cada um destes exem-
plos possui também seus subordinados com uma caracterı́stica só. Por exemplo, obser-
vando a tabela da subseção 5.2.2, percebe-se que os exemplos 2.1.1 e 2.2.1 exercitam a
mesma caracterı́stica, que é o uso do operador and. Assim sendo, decidimos repetir o
enunciado e a solução do exemplo 2.1.1 no exemplo 2.2.1.

5.3 Árvore 3
A terceira árvore deste capı́tulo considera o uso de comandos do tipo if-then, não aninha-
dos, em seqüência. As caracterı́sticas removı́veis, nesta primeira árvore, são a presença
de um comando else para a primeira ocorrência de if-then e a presença de um comando
else para a segunda ocorrência. Como há duas caracterı́sticas removı́veis, temos uma
árvore de profundidade 2 e quatro exemplos.

5.3.1 Caracterı́sticas removı́veis


C1. primeiro comando if-then possui cláusula else

C2. segundo comando if-then possui cláusula else

5.3.2 Numeração dos exemplos


C1 C2 Exemplo
• • 3 (subseção 5.3.3.1)
– – 3.1 (subseção 5.3.3.2)
• – 3.2 (subseção 5.3.3.3)
– • 3.3 (subseção 5.3.3.4)

5.3.3 Enunciados e programas


5.3.3.1 Exemplo 3
Enunciado Um servidor público tem a possibilidade de aumentar sua remuneração se
apresentar os tı́tulos de especialização e/ou de mestrado.
O servidor poderá apresentar apenas um diploma para cada titulação e só poderá
acumular os adicionais de titulações diferentes.
Faça um programa que calcule a remuneração final de um servidor considerando os
seguintes dados:
2
A subseção 5.1.3.2 apresenta este exemplo.
3
A seção 5.4 apresenta essa árvore.

34
ˆ Vencimento: R$ 1.000,00
ˆ Adicional de especialização: 3% do Vencimento
ˆ Adicional de mestrado: 7% do Vencimento
ˆ Remuneração final é a soma do vencimento e adicionais.

O programa deverá ler a resposta do usuário para as seguintes perguntas acerca dos
tı́tulos:

’ Possui diploma de especializacao ? ’

’ Possui diploma de mestrado ? ’

Se o servidor tem especialização, o programa deverá imprimir a seguinte mensagem:

’ Voce tem direito ao adicional de especializacao . ’

Caso contrário:

’ Voce nao tem direito ao adicional de especializacao . ’

Se o servidor tem mestrado, o programa deverá imprimir a seguinte mensagem:

’ Voce tem direito ao adicional de mestrado . ’

Caso contrário:

’ Voce nao tem direito ao adicional de mestrado . ’

Por último, deverá imprimir a remuneração final. Caso a remuneração calculada pelo
programa for iguai a R$ 1100, imprima:

’ Sua remuneracao e de 1100. ’

35
Solução A solução usada foi a seguinte

program exemplo3 ;

var
especializacao , mestrado : char ;
vencimento , remuneracao : real ;

begin
vencimento := 1000;
remuneracao := vencimento ;
writeln ( ’ Possui diploma de especializacao ? ’) ;
readln ( especializacao ) ;
writeln ( ’ Possui diploma de mestrado ? ’) ;
readln ( mestrado ) ;
if ( especializacao = ’s ’)
then
begin
remuneracao := remuneracao + (0.03 * vencimento ) ;
writeln ( ’ Voce tem direito ao adicional de especializacao .
’) ;
end
else
writeln ( ’ Voce nao tem direito ao adicional de
especializacao . ’) ;
if ( mestrado = ’s ’)
then
begin
remuneracao := remuneracao + ( vencimento * 0.07) ;
writeln ( ’ Voce tem direito ao adicional de mestrado . ’) ;
end
else
writeln ( ’ Voce nao tem direito ao adicional de mestrado . ’) ;
writeln ( ’ Sua remuneracao e de ’ , remuneracao :4:2) ;
end .

5.3.3.2 Exemplo 3.1


Enunciado Um servidor público tem a possibilidade de aumentar sua remuneração se
apresentar os tı́tulos de especialização e/ou de mestrado.
O servidor poderá apresentar apenas um diploma para cada titulação e só poderá
acumular os adicionais de titulações diferentes.
Faça um programa que calcule a remuneração final de um servidor considerando os
seguintes dados:

ˆ Vencimento: R$ 1.000,00

36
ˆ Adicional de especialização: 3% do Vencimento
ˆ Adicional de mestrado: 7% do Vencimento
ˆ Remuneração final é a soma do vencimento e adicionais.

O programa deverá ler a resposta do usuário para as seguintes perguntas acerca dos
tı́tulos:

’ Possui diploma de especializacao ? ’

’ Possui diploma de mestrado ? ’

Por último, deverá imprimir a remuneração final. Caso a remuneração calculada pelo
programa for iguai a R$ 1100:

’ Sua remuneracao e de 1100. ’

Solução A solução 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úblico tem a possibilidade de aumentar sua remuneração se
apresentar os tı́tulos de especialização e/ou de mestrado.
O servidor poderá apresentar apenas um diploma para cada titulação e só poderá
acumular os adicionais de titulações diferentes.
Faça um programa que calcule a remuneração final de um servidor considerando os
seguintes dados:

ˆ Vencimento: R$ 1.000,00
ˆ Adicional de especialização: 3% do Vencimento
ˆ Adicional de mestrado: 7% do Vencimento
ˆ Remuneração final é a soma do vencimento e adicionais.

O programa deverá ler a resposta do usuário para as seguintes perguntas acerca dos
tı́tulos:

’ Possui diploma de especializacao ? ’

’ Possui diploma de mestrado ? ’

Se o servidor tem especialização, o programa deverá imprimir a seguinte mensagem:

’ Voce tem direito ao adicional de especializacao . ’

Caso contrário, imprima:

’ Subsidiamos cursos de especializacao . ’

Logo depois, se o servidor tem mestrado, o programa deverá imprimir a seguinte


mensagem:

’ Voce tem direito ao adicional de mestrado . ’

Caso contrário, não imprima nada.


Por último, deverá imprimir a remuneração final. Caso a remuneracao calculada pelo
programa seja R$ 1100:

’ Sua remuneracao e de 1100 ’

38
Solução A solução usada foi a seguinte

program exemplo3_2 ;

var
especializacao , mestrado : char ;
vencimento , remuneracao : real ;

begin
vencimento := 1000;
remuneracao := vencimento ;
writeln ( ’ Possui diploma de especializacao ? ’) ;
readln ( especializacao ) ;
writeln ( ’ Possui diploma de mestrado ? ’) ;
readln ( mestrado ) ;
if ( especializacao = ’s ’)
then
begin
remuneracao := remuneracao + (0.03 * vencimento ) ;
writeln ( ’ Voce tem direito a adicional de especializacao ’)
;
end
else
writeln ( ’ Subsidiamos cursos de especializacao . ’) ;
if ( mestrado = ’s ’)
then
begin
remuneracao := remuneracao + ( vencimento * 0.07) ;
writeln ( ’ Voce tem direito a adicional de mestrado . ’) ;
end ;
writeln ( ’ Sua remuneracao e de ’ , remuneracao :4:2) ;
end .

5.3.3.4 Exemplo 3.3


Enunciado Um servidor público tem a possibilidade de aumentar sua remuneração se
apresentar os tı́tulos de especialização e/ou de mestrado.
O servidor poderá apresentar apenas um diploma para cada titulação e só poderá
acumular os adicionais de titulações diferentes.
Faça um programa que calcule a remuneração final de um servidor considerando os
seguintes dados:
ˆ Vencimento: R$ 1.000,00
ˆ Adicional de especialização: 3% do Vencimento
ˆ Adicional de mestrado: 7% do Vencimento

39
ˆ Remuneração final é a soma do vencimento e adicionais.

O programa deverá ler a resposta do usuário para as seguintes perguntas acerca dos
tı́tulos:

’ Possui diploma de especializacao ? ’

’ Possui diploma de mestrado ? ’

Se o servidor tem especialização, o programa deverá imprimir a seguinte mensagem:

’ Voce tem direito ao adicional de especializacao . ’

Caso contrário, não deve imprimir nada.


Logo depois, se o servidor tem mestrado, o programa deverá imprimir a seguinte
mensagem:

’ Voce tem direito ao adicional de mestrado . ’

Caso contrário, deve imprimir:

’ Subsidiamos cursos de mestrado . ’

Por último, deverá imprimir a remuneração final. Caso a remuneração calculada pelo
programa seja R$ 1100:

’ Sua remuneracao e de 1100 ’

Solução A solução 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ários
Essa árvore busca apresentar ao aluno o uso de comandos if em série. A primeira questão
que se levantou foi: qual deve ser o número de comandos if a serem apresentados em série?
Inicialmente, cogitamos apresentar exemplos com três comandos if em série, uma vez que
tı́nhamos em mente utilizar árvores com três caracterı́sticas removı́veis4 . Entretanto, os
programas ficaram muito grandes, o que provavelmente os tornaria cansativos para os
alunos. Decidimos, então, utilizar dois comandos if em série, com duas caracterı́sticas
removı́veis.
De fato, notamos que árvores com três caracterı́sticas removı́veis tendem a gerar pro-
gramas maiores, além de, naturalmente, árvores com mais nós, o que pode ser cansativo
ao aluno. Naturalmente, há exceções nas quais as árvores de três caracterı́sticas são me-
nos cansativas e até mais naturais. A árvore 2 (apresentada na seção 5.2) e a árvore 6
(apresentada na seção 5.6) são bons exemplos de exceções.

5.4 Árvore 4
A quarta árvore do capı́tulo 3 apresenta o uso de comandos if-then aninhados. As
caracterı́sticas removı́veis são a presença da cláusula else no if-then interno, a presença
do if-then interno na cláusula then externa5 e a presença do if-then interno na cláusula
4
Como terı́amos três comandos if, poderı́amos definir como caracterı́sticas removı́veis a presença da
cláusula else no primeiro comando, a presença da cláusula else no segundo comando e a presença da
cláusula else no terceiro comando, analogamente ao que fizemos com dois comandos if.
5
Isto é, o if-then interno só será executado se a condição do if-then externo for satisfeita.

41
else externa6 . Como há três caracterı́sticas removı́veis, a árvore possui três nı́veis de
hierarquia. A árvore possui oito exemplos.

5.4.1 Caracterı́sticas removı́veis


C1. há uma cláusula else em pelo menos um if-then interno
C2. há um comando if-then na cláusula then externa
C3. há um comando if-then na cláusula else externa

5.4.2 Numeração dos exemplos


C1 C2 C3 Exemplo
• • • 4 (subseção 5.4.3.1)
– • • 4.1 (subseção 5.4.3.2)
• – • 4.2 (subseção 5.4.3.3)
• • – 4.3 (subseção 5.4.3.4)
– – • 4.1.1, 4.2.1 (subseção 5.4.3.5)
– • – 4.1.2, 4.3.1 (subseção 5.4.3.5)
• – – — (ver comentários na subseção 5.4.4)
– – – — (ver comentários na subseção 5.4.4)

5.4.3 Enunciados e programas


5.4.3.1 Exemplo 4
Enunciado Os números complexos têm a forma a + bi e podem ser reais (caso b = 0)
e não reais (caso b 6= 0). Se o número for real, ele pode ser negativo (se a < 0) ou
não-negativo (se a ≥ 0). Eventualmente, o número real pode ser neutro, isto é, igual a
zero. Se a = 0 e b 6= 0, o número complexo é um número imaginário.
Faça um programa que leia o valor da parte real a e o valor da parte imaginária b
de um número complexo. Se o número for não real (b 6= 0), verifique se o número é
imaginário (a = 0). Se o número for imaginário, imprima a mensagem:

’ < valor de a >+ < valor de b > i e imaginario . ’

Se o número não for imaginário, não imprima nada.


Se o número for real (b = 0), verifique se o número é negativo. Se for, imprima

’ < valor de a >+ < valor de b > i e real negativo . ’

Se não for negativo, imprima

’ < valor de a >+ < valor de b > i e real nao - negativo . ’


6
Ou seja, o if-then interno só será executado se a condição do if-then externo não for satisfeita.

42
Solução A solução usada foi a seguinte
program exemplo4 ;

var
a , b : real ;

begin
writeln ( ’ Digite a parte real : ’) ;
readln ( a ) ;
writeln ( ’ Digite a parte imaginaria : ’) ;
readln ( b ) ;
if b <> 0
then
begin
if a = 0
then
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e imaginario . ’) ;
end
else
if a < 0
then
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e real negativo . ’)
else
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e real nao - negativo . ’) ;
end .

5.4.3.2 Exemplo 4.1


Enunciado Os números complexos têm a forma a + bi e podem ser reais (caso b = 0)
e não reais (caso b 6= 0). Se o número for real, ele pode ser negativo (se a < 0) ou
não-negativo (se a ≥ 0). Eventualmente, o número real pode ser neutro, isto é, igual a
zero. Se a = 0 e b 6= 0, o número complexo é um número imaginário.
Faça um programa que leia o valor da parte real a e o valor da parte imaginária b
de um número complexo. Se o número for não real (b 6= 0), verifique se o número é
imaginário (a = 0). Se o número for imaginário, imprima a mensagem:

’ < valor de a >+ < valor de b > i e imaginario . ’

Se o número não for imaginário, não imprima nada.


Se o número for real (b = 0), verifique se o número é negativo. Se for, imprima

’ < valor de a >+ < valor de b > i e real negativo . ’

Se não for negativo, não imprima nada.

43
Solução A solução usada foi a seguinte
program exemplo4_1 ;

var
a , b : real ;

begin
writeln ( ’ Digite a parte real : ’) ;
readln ( a ) ;
writeln ( ’ Digite a parte imaginaria : ’) ;
readln ( b ) ;
if b <> 0
then
begin
if a = 0
then
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e imaginario . ’) ;
end
else
if a < 0
then
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e real negativo . ’) ;
end .

5.4.3.3 Exemplo 4.2


Enunciado Os números complexos têm a forma a + bi e podem ser reais (caso b = 0)
e não reais (caso b 6= 0). Se o número for real, ele pode ser negativo (se a < 0) ou
não-negativo (se a ≥ 0). Eventualmente, o número real pode ser neutro, isto é, igual a
zero. Se a = 0 e b 6= 0, o número complexo é um número imaginário.
Faça um programa que leia o valor da parte real a e o valor da parte imaginária b de
um número complexo. Se o número for não real (b 6= 0), imprima a mensagem:

’ < valor de a >+ < valor de b > i e nao real . ’

Se o número não for imaginário, não imprima nada.


Se o número for real (b = 0), verifique se o número é negativo. Se for, imprima

’ < valor de a >+ < valor de b > i e real negativo . ’

Se não for negativo, imprima:

’ < valor de a >+ < valor de b > i e real nao - negativo . ’

44
Solução A solução usada foi a seguinte
program exemplo4_2 ;

var
a , b : real ;

begin
writeln ( ’ Digite a parte real : ’) ;
readln ( a ) ;
writeln ( ’ Digite a parte imaginaria : ’) ;
readln ( b ) ;
if b <> 0
then
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e nao - real . ’)
else
if a < 0
then
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e real negativo . ’)
else
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e real nao - negativo . ’) ;
end .

5.4.3.4 Exemplo 4.3


Enunciado Os números complexos têm a forma a + bi e podem ser reais (caso b = 0)
e não reais (caso b 6= 0). Se o número for real, ele pode ser negativo (se a < 0) ou
não-negativo (se a ≥ 0). Eventualmente, o número real pode ser neutro, isto é, igual a
zero. Se a = 0 e b 6= 0, o número complexo é um número imaginário.
Faça um programa que leia o valor da parte real a e o valor da parte imaginária b de
um número complexo. Se o número for imaginário (a = 0), imprima a mensagem:

’ < valor de a >+ < valor de b > i e imaginario . ’

Se o número não for imaginário, mas também não for real imprima:

’ < valor de a >+ < valor de b > i e nao real . ’

Se o número for real (b = 0), imprima a mensagem:

’ < valor de a >+ < valor de b > i e real . ’

45
Solução A solução usada foi a seguinte
program exemplo4_3 ;

var
a , b : real ;

begin
writeln ( ’ Digite a parte real : ’) ;
readln ( a ) ;
writeln ( ’ Digite a parte imaginaria : ’) ;
readln ( b ) ;
if b <> 0
then
if a = 0
then
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e imaginario . ’)
else
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e nao - real . ’)
else
writeln ( a :2:2 , ’+ ’ , b :2:2 , ’i e real . ’) ;
end .

5.4.3.5 Exemplos 4.1.1 e 4.2.1


Enunciado Os números complexos têm a forma a + bi e podem ser reais (caso b = 0)
e não reais (caso b 6= 0). Se o número for real, ele pode ser negativo (se a < 0) ou
não-negativo (se a ≥ 0). Eventualmente, o número real pode ser neutro, isto é, igual a
zero. Se a = 0 e b 6= 0, o número complexo é um número imaginário.
Faça um programa que leia o valor da parte real a e o valor da parte imaginária b de
um número complexo. Se o número for não real (b 6= 0), imprima a mensagem:

’ < valor de a >+ < valor de b > i e nao real . ’

Se o número for real (b = 0), verifique se o número é negativo. Se for, imprima

’ < valor de a >+ < valor de b > i e real negativo . ’

Solução A solução 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úmeros complexos têm a forma a + bi e podem ser reais (caso b = 0)
e não reais (caso b 6= 0). Se o número for real, ele pode ser negativo (se a < 0) ou
não-negativo (se a ≥ 0). Eventualmente, o número real pode ser neutro, isto é, igual a
zero. Se a = 0 e b 6= 0, o número complexo é um número imaginário.
Faça um programa que leia o valor da parte real a e o valor da parte imaginária b
de um número complexo. Se o número for não real (b 6= 0), verifique se o número é
imaginário (a = 0). Se o número for imaginário, imprima a mensagem:

’ < valor de a >+ < valor de b > i e imaginario . ’

Se o número não for real mas também não for imaginário, não imprima nada.
Se o número for real (b = 0), imprima a mensagem

’ < valor de a >+ < valor de b > i e real . ’

Solução A solução 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ários
Nós buscamos sempre fazer árvores totalmente preenchidas nas taxonomias. Por vezes,
isso não é interessante; por exemplo, na árvore da seção 5.2 não há nenhum nó que equiva-
lha aos problemas sem caracterı́sticas removı́veis, pois o problema desse nó seria bastante
trivial. No caso da árvore dessa seção, é inviável fazer a árvore completa: é impossı́vel
excluir mutuamente as caracterı́sticas removı́veis C2 e C3 e manter a caracterı́stica C1:
C1 depende de que um comando if esteja dentro de uma cláusula then ou de uma cláusula
else — mas a remoção das caracterı́sticas C2 e C3 impedem que haja um comando if
em qualquer uma das cláusulas. Além disso, um nó que não tenha nenhuma das carac-
terı́sticas removı́veis pareceu-nos simples demais para constar na árvore, assim como na
árvore 2. Consequentemente, os nós 4.2 e 4.3 possuem apenas um problema subordinado.
Essa configuração não aparenta ser muito boa: não sabemos se é conveniente ao aluno
descer um nı́vel da árvore para estudar apenas um exemplo.
Na solução7 do exemplo 4, é interessante notar que, enquanto o comando if dentro
da cláusula else possui tanto a cláusula then quanto a cláusula else, o comando if
dentro da cláusula then externa possui apenas a cláusula then. Isso foi uma decisão
consciente: é relevante para mostrar ao aluno como inserir um comando if sem uma
cláusula else dentro de uma cláusula then8 . Além disso, essa configuração é assimétrica:
os comandos dentro da cláusula then externa e else externa possuem estruturas diferentes.
Acreditamos que uma apresentação assimétrica incentiva o aluno a compreender melhor
a ortogonalidade do comando, e exercita melhor seu raciocı́nio. Essa é uma questão vasta
que escapa ao escopo do nosso projeto.

5.5 Árvore 5
A quinta árvore apresenta o uso de comandos if em cascata. Em outras palavras, essa
árvore visa exercitar o aluno no uso (bastante comum) de comandos if com cláusulas
else em uma estrutura semelhante a
if condicao1 then
comando1
7
Ver seção 5.4.3.1.
8
Para fazer isso, nota-se que é preciso usar os agrupadores begin e end. Caso contrário, a cláusula
else do if interno será associada ao if externo.

48
else if condicao2 then
comando2
else if condicao3 then
comando3
else if condicao4 then
comando4 ;
Suas caracterı́sticas removı́veis são a presença de else ao final da cascata, presença de
if interno com else e presença de if interno sem else. O comando if interno ocorrerá
entre outros comandos dentro do bloco begin-end do if-then que o contém.
Como há três caracterı́sticas removı́veis, temos uma árvore de profundidade 3.

5.5.1 Caracterı́sticas removı́veis


C1. presença de else ao final da cascata

C2. presença de if-then interno com else

C3. presença de if-then interno sem else

5.5.2 Numeração dos exemplos


C1 C2 C3 Exemplo
• • • 5 (subseção 5.5.3.1)
• • – 5.1 (subseção 5.5.3.2)
• – • 5.2 (subseção 5.5.3.3)
– • • 5.3 (subseção 5.5.3.4)
• – – 5.1.1, 5.2.1 (subseção 5.5.3.5)
– • – 5.1.2, 5.3.1 (subseção 5.5.3.6)
– – • 5.2.2, 5.3.2 (subseção 5.5.3.7)
– – – — (ver comentários na subseção 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 às das terças às quintas.
Faça um programa que forneça tais informações de acordo com as seguintes condições:
O usuário deverá informar um número entre 3 e 5 informando o dia da semana conforme
a seguinte mensagem: Digite um numero de 3 a 5 que corresponda ao dia da semana:
Se o dia escolhido for o dia 3, o programa deverá solicitar a idade do usuário:

’ Digite sua idade : ’

49
Se a idade for maior que zero, o programa deverá imprimir o desconto, onde o numero
da porcentagem é igual à idade. Por exemplo, se o usuário digitar a idade 30 o programa
deverá imprimir:

’ Desconto : 30% ’

Caso contrário, quando a idade for menor ou igual a zero, o programa deverá imprimir
a mensagem:

’ Idade invalida : sem descondo ’

Se o dia escolhido for o dia 5, o programa deverá imprimir a pergunta:

’ Possui cupom de desconto ? ’

Se o usuário digitar s, o programa deverá imprimir:

’ Desconto : 10% ’

O programa deverá, também, imprimir o prato do dia conforme o dia escolhido.

ˆ Se o dia escolhido for 3, terça-feira, o programa deverá imprimir:

’ Prato do dia : macarronada ’

ˆ Se o dia escolhido for 4, quarta-feira, o programa deverá imprimir:

’ Prato do dia : galinhada ’

ˆ Se o dia escolhido for 5, quinta-feira, o programa deverá imprimir:

’ Prato do dia : feijoada ’

ˆ Se o dia escolhido for qualquer numero diferente dos anteriores, o programa deverá
imprimir:

’ Restaurante fechado ’

50
Solução A solução usada foi a seguinte
program exemplo5 ;

var
temcupom : char ;
idade , dia : integer ;

begin
write ( ’ Digite um numero de 3 a 6 que corresponda ao dia da
semana : ’) ;
readln ( dia ) ;
if dia = 3
then
begin
write ( ’ Digite sua idade : ’) ;
readln ( idade ) ;
if idade > 0
then
writeln ( ’ Desconto : ’ , idade , ’% ’)
else
writeln ( ’ Idade invalida : sem desconto . ’) ;
writeln ( ’ Prato do dia : macarronada ’) ;
end
else
if dia = 4
then
writeln ( ’ Prato do dia : galinhada ’)
else
if dia = 5
then
begin
write ( ’ Possui cupom de desconto ? ’) ;
readln ( temcupom ) ;
if temcupom = ’s ’
then
writeln ( ’ Desconto : 10% ’) ;
writeln ( ’ Prato do dia : feijoada ’) ;
end
else
writeln ( ’ Restaurante fechado ’) ;
end .

5.5.3.2 Exemplo 5.1


Enunciado Um restaurante quer informar aos seus clientes o prato do dia e descontos
promocionais. Ele funciona às das terças às quintas.

51
Faça um programa que forneça tais informações de acordo com as seguintes condições:
O usuário deverá informar um número entre 3 e 5 informando o dia da semana conforme
a seguinte mensagem: Digite um numero de 3 a 5 que corresponda ao dia da semana:
Se o dia escolhido for o dia 4, o programa deverá solicitar a idade do usuário:

’ Digite sua idade : ’

Se a idade for maior que zero, o programa deverá imprimir o desconto, onde o numero
da porcentagem é igual à idade. Por exemplo, se o usuário digitar a idade 30 o programa
deverá imprimir:

’ Desconto : 30% ’

Caso contrário, quando a idade for menor ou igual a zero, o programa deverá imprimir
a mensagem:

’ Idade invalida : sem descondo ’

O programa deverá, também, imprimir o prato do dia conforme o dia escolhido.

ˆ Se o dia escolhido for 3, terça-feira, o programa deverá imprimir:

’ Prato do dia : macarronada ’

ˆ Se o dia escolhido for 4, quarta-feira, o programa deverá imprimir:

’ Prato do dia : galinhada ’

ˆ Se o dia escolhido for 5, quinta-feira, o programa deverá imprimir:

’ Prato do dia : feijoada ’

ˆ Se o dia escolhido for qualquer numero diferente dos anteriores, o programa deverá
imprimir:

’ Restaurante fechado ’

52
Solução A solução usada foi a seguinte
program exemplo5_1 ;

var
idade , dia : integer ;

begin
write ( ’ Digite um numero de 3 a 5 que corresponda ao dia da
semana : ’) ;
readln ( dia ) ;
if dia = 3
then
writeln ( ’ Prato do dia : macarronada ’)
else
if dia = 4
then
begin
write ( ’ Digite sua idade : ’) ;
readln ( idade ) ;
if idade > 0
then
writeln ( ’ Desconto : ’ , idade , ’% ’)
else
writeln ( ’ Idade invalida : sem desconto ’) ;
writeln ( ’ Prato do dia : galinhada ’) ;
end
else
if dia = 5
then
writeln ( ’ Prato do dia : feijoada ’)
else
writeln ( ’ Restaurante fechado ’) ;
end .

5.5.3.3 Exemplo 5.2


Enunciado Um restaurante quer informar aos seus clientes o prato do dia e descontos
promocionais. Ele funciona às das terças às quintas.
Faça um programa que forneça tais informações de acordo com as seguintes condições:
O usuário deverá informar um número entre 3 e 5 informando o dia da semana conforme
a seguinte mensagem: Digite um numero de 3 a 5 que corresponda ao dia da semana:
Se o dia escolhido for o dia 4, o programa deverá solicitar a idade do usuário:

’ Possui cupom de desconto ? ’

53
Se o usuário digitar ’s’, o programa deverá imprimir:

’ Desconto : 10% ’

O programa deverá, também, imprimir o prato do dia conforme o dia escolhido.

ˆ Se o dia escolhido for 3, terça-feira, o programa deverá imprimir:

’ Prato do dia : macarronada ’

ˆ Se o dia escolhido for 4, quarta-feira, o programa deverá imprimir:

’ Prato do dia : galinhada ’

ˆ Se o dia escolhido for 5, quinta-feira, o programa deverá imprimir:

’ Prato do dia : feijoada ’

ˆ Se o dia escolhido for qualquer numero diferente dos anteriores, o programa deverá
imprimir:

’ Restaurante fechado ’

Solução A solução 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 às das terças às quintas.
Faça um programa que forneça tais informações de acordo com as seguintes condições:
O usuário deverá informar um número entre 3 e 5 informando o dia da semana conforme
a seguinte mensagem: Digite um numero de 3 a 5 que corresponda ao dia da semana:
Se o dia escolhido for o dia 3, o programa deverá solicitar a idade do usuário:

’ Digite sua idade : ’

Se a idade for maior que zero, o programa deverá imprimir o desconto, onde o numero
da porcentagem é igual à idade. Por exemplo, se o usuário digitar a idade 30 o programa
deverá imprimir:

’ Desconto : 30% ’

Caso contrário, quando a idade for menor ou igual a zero, o programa deverá imprimir
a mensagem:

’ Idade invalida : sem descondo ’

Se o dia escolhido for o dia 5, o programa deverá imprimir a pergunta:

’ Possui cupom de desconto ? ’

Se o usuário digitar s, o programa deverá imprimir:

’ Desconto : 10% ’

55
O programa deverá, também, imprimir o prato do dia conforme o dia escolhido.

ˆ Se o dia escolhido for 3, terça-feira, o programa deverá imprimir:

’ Prato do dia : macarronada ’

ˆ Se o dia escolhido for 4, quarta-feira, o programa deverá imprimir:

’ Prato do dia : galinhada ’

ˆ Se o dia escolhido for 5, quinta-feira, o programa deverá imprimir:

’ Prato do dia : feijoada ’

ˆ Se o dia escolhido for qualquer numero diferente dos anteriores, o programa deverá
não imprimir nada.

Solução A solução 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 às das terças às quintas.
Faça um programa que forneça tais informações de acordo com as seguintes condições:
O usuário deverá informar um número entre 3 e 5 informando o dia da semana conforme
a seguinte mensagem: Digite um numero de 3 a 5 que corresponda ao dia da semana:
O programa deverá, também, imprimir o prato do dia conforme o dia escolhido.

ˆ Se o dia escolhido for 3, terça-feira, o programa deverá imprimir:

’ Prato do dia : macarronada ’

ˆ Se o dia escolhido for 4, quarta-feira, o programa deverá imprimir:

’ Prato do dia : galinhada ’

ˆ Se o dia escolhido for 5, quinta-feira, o programa deverá imprimir:

’ Prato do dia : feijoada ’

ˆ Se o dia escolhido for qualquer numero diferente dos anteriores, o programa deverá
imprimir:

’ Restaurante fechado ’

57
Solução A solução usada foi a seguinte
program exemplo5_1_1 ;

var
dia : integer ;

begin
write ( ’ Digite um numero de 3 a 5 que corresponda ao dia da
semana : ’) ;
readln ( dia ) ;
if dia = 3
then
writeln ( ’ Prato do dia : macarronada ’)
else
if dia = 4
then
writeln ( ’ Prato do dia : galinhada ’)
else
if dia = 5
then
writeln ( ’ Prato do dia : feijoada ’)
else
writeln ( ’ Restaurante fechado ’) ;
end .

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 às das terças às quintas.
Faça um programa que forneça tais informações de acordo com as seguintes condições:
O usuário deverá informar um número entre 3 e 5 informando o dia da semana conforme
a seguinte mensagem: Digite um numero de 3 a 5 que corresponda ao dia da semana:
Se o dia escolhido for o dia 4, o programa deverá solicitar a idade do usuário:

’ Digite sua idade : ’

Se a idade for maior que zero, o programa deverá imprimir o desconto, onde o numero
da porcentagem é igual à idade. Por exemplo, se o usuário digitar a idade 30 o programa
deverá imprimir:

’ Desconto : 30% ’

Caso contrário, quando a idade for menor ou igual a zero, o programa deverá imprimir
a mensagem:

58
’ Idade invalida : sem descondo ’

O programa deverá, também, imprimir o prato do dia conforme o dia escolhido.

ˆ Se o dia escolhido for 3, terça-feira, o programa deverá imprimir:

’ Prato do dia : macarronada ’

ˆ Se o dia escolhido for 4, quarta-feira, o programa deverá imprimir:

’ Prato do dia : galinhada ’

ˆ Se o dia escolhido for 5, quinta-feira, o programa deverá imprimir:

’ Prato do dia : feijoada ’

ˆ Se o dia escolhido for qualquer numero diferente dos anteriores, o programa deverá
não imprimir nada.

Solução A solução 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 às das terças às quintas.
Faça um programa que forneça tais informações de acordo com as seguintes condições:
O usuário deverá informar um número entre 3 e 5 informando o dia da semana conforme
a seguinte mensagem: Digite um numero de 3 a 5 que corresponda ao dia da semana:
Se o dia escolhido for o dia 4, o programa deverá imprimir a pergunta:

’ Possui cupom de desconto ? ’

Se o usuário digitar s, o programa deverá imprimir:

’ Desconto : 10% ’

O programa deverá, também, imprimir o prato do dia conforme o dia escolhido.

ˆ Se o dia escolhido for 3, terça-feira, o programa deverá imprimir:

’ Prato do dia : macarronada ’

ˆ Se o dia escolhido for 4, quarta-feira, o programa deverá imprimir:

’ Prato do dia : galinhada ’

ˆ Se o dia escolhido for 5, quinta-feira, o programa deverá imprimir:

’ Prato do dia : feijoada ’

ˆ Se o dia escolhido for qualquer numero diferente dos anteriores, o programa deverá
não imprimir nada.

60
Solução A solução usada foi a seguinte
program exemplo5_2_2 ;

var
temcupom : char ;
dia : integer ;

begin
write ( ’ Digite um numero de 2 a 5 que corresponda ao dia da
semana : ’) ;
readln ( dia ) ;
if dia = 3
then
writeln ( ’ Prato do dia : macarronada ’)
else
if dia = 4
then
begin
write ( ’ Possui cupom de desconto ? ’) ;
readln ( temcupom ) ;
if temcupom = ’s ’
then
writeln ( ’ Desconto : 10% ’) ;
writeln ( ’ Prato do dia : galinhada ’) ;
end
else
if dia = 5
then
writeln ( ’ Prato do dia : feijoada ’) ;
end .

5.5.4 Comentários
A árvore foi assim estabelecida de modo a exercitar o uso de sequências de comandos if-
then mutualmente exclusivas, uma configuração em cascata. A partir de tal configuração,
estabelecemos três caracterı́sticas removı́veis atendendo os critérios seguintes:

ˆ Uso do comando final else complementando a configuração em cascata


ˆ Uso de comandos avulsos if-then e else dentro de uma configuração em cascata

A configuração em cascata sugere a resolução de problemas nos quais o programador


deverá cobrir uma listas de possı́veis condições exclusivas entre si, bem determinadas
ou não. Neste sentido, o uso do comando final else cobre as condições indeterminadas,
estendendo o conceito já apresentado para configurações mais simples.

61
O uso de comandos comandos avulsos if-then e else tem o objetivo de indicar ao
aluno a possibilidade de inclusão destes comandos dentro da configuração proposta na
árvore tal como quaisquer outros comandos dentro do bloco begin-end.

5.6 Árvore 6
A sexta árvore encerra o capı́tulo de comandos de decisão com a apresentação de estruturas
case. Estas estruturas estendem e simplificam a experiência adquirida com comandos if.
A sua fundamentação ocorre sobre três caracterı́sticas removı́veis: presença de intervalos;
presença de else; presença de blocos de comandos. Árvore de profundidade 3.

5.6.1 Caracterı́sticas removı́veis


C1. presença de bloco, begin-end, de comandos.

C2. presença de cláusula else

C3. presença de intervalos

5.6.2 Numeração dos exemplos


C1 C2 C3 Exemplo
• • • 6 (subseção 5.6.3.1)
• • – 6.1 (subseção 5.6.3.2)
• – • 6.2 (subseção 5.6.3.3)
– • • 6.3 (subseção 5.6.3.4)
• – – 6.1.2, 6.2.2 (subseção 5.6.3.6)
– • – 6.1.3, 6.3.2 (subseção 5.6.3.7)
– – • 6.2.3 (subseção 5.6.3.8)
– – – 6.1.1, 6.2.1, 6.3.1 (subseção 5.6.3.5)

5.6.3 Enunciados e programas


5.6.3.1 Exemplo 6
Enunciado Uma agência de consultoria financeira classifica os paı́ses em uma escala de
1 a 5. Paı́ses nos nı́veis 1 e 2 são ruins para se investir. Paı́ses no nı́vel 3 são razoáveis
para se investir. Paı́ses no nı́vel 4 são bons para se investir, e paı́ses no nı́vel 5 são os
melhores.
Escreva um programa que pergunta o nome de um paı́s e o seu nı́vel no ranking da
agência. Se o paı́s for nı́vel 1 ou 2, imprima a mensagem:

’ < nome do pais > e ruim para investir ’

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ão seja nenhum desses, imprima a mensagem:

’ Nivel invalido ’

Solução A solução 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ência de consultoria financeira classifica os paı́ses em uma escala
de 1 a 5. Um paı́s no nı́vel 1 é um péssimo lugar para se investir. Paı́ses no nı́vel 2 são
locais ruins para se investir. Paı́ses no nı́vel 3 são medianos, razoáveis para se investir.
Qualquer paı́s 4 já é bom para se investir, e se estiver no nı́vel 5, o paı́s é ótimo.
Escreva um programa que pergunta o nome de um paı́s e o seu nı́vel no ranking da
agência. Se o paı́s for nı́vel 1, imprima a mensagem:

’ < 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ão seja nenhum desses, imprima a mensagem:

’ Nivel invalido ’

64
Solução A solução usada foi a seguinte

program exemplo6_1 ;

var
pais : string ;
nivel : integer ;

begin
writeln ( ’ Qual o nome do pais ? ’) ;
readln ( pais ) ;
writeln ( ’ Qual o nivel do pais ? ’) ;
readln ( nivel ) ;
case nivel of
1 : writeln ( pais , ’ e pessimo para investir ’) ;
2 : begin
writeln ( pais , ’ e ruim para investir ’) ;
writeln ( ’ Recomendamos nao investir nesse pais ’) ;
end ;
3 : begin
writeln ( pais , ’ e razoavel para investir ’) ;
writeln ( ’ Recomendamos investir em paises de nivel 4 ’) ;
end ;
4 : writeln ( pais , ’ e bom para investir ’) ;
5 : writeln ( pais , ’ e otimo para investir ’) ;
else writeln ( ’ Nivel invalido ’) ;
end ;
end .

5.6.3.3 Exemplo 6.2


Enunciado Uma agência de consultoria financeira classifica os paı́ses em uma escala de
1 a 5. Paı́ses nos nı́veis 1 e 2 são ruins para se investir. Paı́ses no nı́vel 3 são razoáveis
para se investir. Paı́ses no nı́vel 4 são bons para se investir, e paı́ses no nı́vel 5 são os
melhores, e são geralmente um ou dois.
Escreva um programa que pergunta o nome de um paı́s e o seu nı́vel no ranking da
agência. Se o paı́s for nı́vel 1 ou 2, imprima a mensagem:

’ < nome do pais > e ruim para investir ’

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ão seja nenhum desses, não imprima nada.

Solução A solução 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ência de consultoria financeira classifica os paı́ses em uma escala de
1 a 5. Paı́ses nos nı́veis 1 e 2 são ruins para se investir. Paı́ses no nı́vel 3 são razoáveis
para se investir. Paı́ses no nı́vel 4 são bons para se investir, e paı́ses no nı́vel 5 são os
melhores, e são geralmente um ou dois.
Escreva um programa que pergunta o nome de um paı́s e o seu nı́vel no ranking da
agência. Se o paı́s for nı́vel 1 ou 2, imprima a mensagem:
’ < nome do pais > e ruim para investir ’

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ão seja nenhum desses, imprima a mensagem:


’ Nivel invalido ’

Solução A solução 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ência de consultoria financeira classifica os paı́ses em uma escala
de 1 a 5. Um paı́s no nı́vel 1 é um péssimo lugar para se investir. Paı́ses no nı́vel 2 são
locais ruins para se investir. Paı́ses no nı́vel 3 são medianos, razoáveis para se investir.
Qualquer paı́s 4 já é bom para se investir, e se estiver no nı́vel 5, o paı́s é ótimo.
Escreva um programa que pergunta o nome de um paı́s e o seu nı́vel no ranking da
agência. Se o paı́s for nı́vel 1, imprima a mensagem:

’ < 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ão seja nenhum desses, não imprima nada.

Solução A solução 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ência de consultoria financeira classifica os paı́ses em uma escala
de 1 a 5. Um paı́s no nı́vel 1 é um péssimo lugar para se investir. Paı́ses no nı́vel 2 são
locais ruins para se investir. Paı́ses no nı́vel 3 são medianos, razoáveis para se investir.
Qualquer paı́s 4 já é bom para se investir, e se estiver no nı́vel 5, o paı́s é ótimo.
Escreva um programa que pergunta o nome de um paı́s e o seu nı́vel no ranking da
agência. Se o paı́s for nı́vel 1, imprima a mensagem:

’ < 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ão seja nenhum desses, não imprima nada.

69
Solução A solução usada foi a seguinte

program exemplo6_1_2 ;

var
pais : string ;
nivel : integer ;

begin
writeln ( ’ Qual o nome do pais ? ’) ;
readln ( pais ) ;
writeln ( ’ Qual o nivel do pais ? ’) ;
readln ( nivel ) ;
case nivel of
1 : writeln ( pais , ’ e pessimo para investir ’) ;
2 : begin
writeln ( pais , ’ e ruim para investir ’) ;
writeln ( ’ Recomendamos nao investir nele ’) ;
end ;
3 : begin
writeln ( pais , ’ e razoavel para investir ’) ;
writeln ( ’ Recomendamos investir em paises de nivel 4 ’) ;
end ;
4 : writeln ( pais , ’ e bom para investir ’) ;
5 : writeln ( pais , ’ e otimo para investir ’) ;
end ;
end .

5.6.3.7 Exemplos 6.1.3 e 6.3.2


Enunciado Outra agência de consultoria financeira classifica os paı́ses em uma escala
de 1 a 5. Um paı́s no nı́vel 1 é um péssimo lugar para se investir. Paı́ses no nı́vel 2 são
locais ruins para se investir. Paı́ses no nı́vel 3 são medianos, razoáveis para se investir.
Qualquer paı́s 4 já é bom para se investir, e se estiver no nı́vel 5, o paı́s é ótimo.
Escreva um programa que pergunta o nome de um paı́s e o seu nı́vel no ranking da
agência. Se o paı́s for nı́vel 1, imprima a mensagem:

’ < 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ão seja nenhum desses, imprima a mensagem:

’ Nivel invalido ’

Solução A solução 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ência de consultoria financeira classifica os paı́ses em uma escala de
1 a 5. Paı́ses nos nı́veis 1 e 2 são ruins para se investir. Paı́ses no nı́vel 3 são razoáveis
para se investir. Paı́ses no nı́vel 4 são bons para se investir, e paı́ses no nı́vel 5 são os
melhores, e são geralmente um ou dois.
Escreva um programa que pergunta o nome de um paı́s e o seu nı́vel no ranking da
agência. Se o paı́s for nı́vel 1 ou 2, imprima a mensagem:

’ < nome do pais > e 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ão seja nenhum desses, não imprima nada.

Solução A solução 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ários
As árvores de 1 a 5 apresentaram o uso do comando if. Elas foram concebidas por
agrupamentos de caracterı́sticas afins cujo critério para afinidade e seleção atendem a
determinadas premissas didáticas.
No entanto, ainda restava-nos definir uma configuração que represente os comandos
case. Em geral, a opção por utilizar estes comandos ocorre quando o programador pre-
tende simplificar rotinas que poderiam ser desenvolvidas com o uso de if.Um uso tı́pico
do comando case ocorre em substituição de comandos if em cascata. Um valor é ava-
liado e o fluxo de execução do programa é desviado para uma entre diversas opções que
corresponda aquele valor. Tal como ocorre no uso de if, a execução do programa pode
ser desviada para um simples comando ou um bloco de comandos. Também contamos
com a opção da cláusula else a fim de cobrir todo o universo de possibilidades para a
variável avaliada.
A sofisticação possibilitada por uso do comando case apresenta uma caracterı́stica
nova: pode-se definir a execução a partir de um valor ou de uma série de valores que
configurem um intervalo sem o uso de operadores lógicos.

73
Capı́tulo 6

Conclusões e Trabalhos Futuros

Dados os desafios do ensino de programação, uma das abordagens para lidar com eles
é o uso de softwares de auxı́lio à aprendizagem. Um modelo de software de auxı́lio à
aprendizagem bastante promissor são os sistemas tutoriais inteligentes, que permitem a
adaptação do tutorial às necessidades do estudante. O Tutorial ICC evolui nesta direção,
não tanto para se tornar um STI em todos os sentidos, mas sim para tornar-se um sistema
tutorial dotado de inteligência.
Este trabalho dá mais um passo nessa direção. Nós desenvolvemos taxonomias de
exemplos que exercitam diversos aspectos da aprendizagem de programação em nı́veis de
dificuldades diferentes.
Um framework conceitual para o desenvolvimento de taxonomias é uma idéia nova.
A parte prática de nosso trabalho focou-se em desenvolver este framework e aplicá-lo ao
desenvolvimento de taxonomias. Assim sendo, o resultado do nosso trabalho inclui, além
das taxonomias em si, um framework com uma terminologia, conceitos e procedimentos
próprios, que podem auxiliar o desenvolvimento e evolução de taxonomias de exemplos
hierárquicas.
Certamente, porém, os vários aspectos das taxonomias de exemplos estão longe de
serem exaustivamente explorados. Eventuais trabalhos futuros podem focar, por exem-
plo, na pesquisa de conceitos e dificuldades mais relevantes para os estudantes. Nossa
abordagem atual nesse sentido foi nos basearmos nas experiências de professores, mas
certamente há outras maneiras de se isolar conceitos e dificuldades relevantes.
Outro possı́vel objeto de trabalho futuro é uma avaliação da eficácia do uso de taxo-
nomias de exemplos. Uma vez que se tenha uma melhor idéia da eficácia das taxonomias,
outro passo seria uma pesquisa no aprimoramento do framework de desenvolvimento de
taxonomias, de modo a gerar árvores cada vez mais eficientes.
Ademais, pesquisas para desenvolver interfaces mais adaptativas e intuitivas para as
taxonomias são também bastante interessantes. Vale lembrar que as taxonomias são
apenas um dos módulos do sistema, e um sistema tutorial dotado de alguma inteligência
possui uma série de desafios no que tange à sua interface.

74
Referências

ACM. Computing Curricula 2005. Technical report, Association for Computing Machi-
nery (ACM), Association for Information Systems (AIS), Computer Society (IEEE-CS),
2005. Acessado dia 31 de agosto de 2008. 1, 2

Joseph Beck, Mia Stern, e Erik Haugsjaa. Applications of AI in Education. ACM Cross-
roads, 1996. xii, 9, 10

Peter Brusilovsky, John Eklund, e Elmar Schwarz. Web-based education for all: A tool
for development adaptive courseware. In Proceedings of Seventh International World
Wide Web inproceedings, Abril 1998. Acessado dia 31 de agosto de 2008. 1

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újo Chaves Júnior e Eliza Silveira Bastos. Interface orientada a estilos de
aprendizagem em um tutorial para ensino de computação, dezembro 2008. Monogra-
fia apresentada como requisito parcial para conclusão do Bacharelado em Ciência da
Computação e Licenciatura em Computação na Universidade de Brası́lia. 5

J. Wei Chen. Designing a web-based van hiele model for teaching and learning computer
programming to promote collaborative learning. In Fifth IEEE International inprocee-
dings on Advanced Learning Technologies, pages 313—317, 2005. 1

Rodrigo Pereira dos Santos e Heitor Augustus Xavier Costa. TBC-AED e TBC-
AED/WEB: Um desafio no ensino de algoritmos, estruturas de dados e programação.
Acessado em http://www.weimig2005.unis.edu.br/artigos/TBC-AED.pdf, 2005. 1

Mauri Ferrandin e Simone Lilian Stephani. Ferramenta para o ensino de programação via
internet. In SULCOMP-I Congresso Sul Catarinense de Computação, 2005. 1

75
Michel Foucault. As Palavras e as Coisas. Martins Fontes, 3 edition, 2002. No prefácio,
Foucault se refere a um texto de Borges sobre uma “certa enciclopédia chinesa”. 12

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ônio Houaiss, Mauro de Salles Villar, e Francisco Manoel Mello Franco. Dicionário
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ärvinen. 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ência para orientação de alunos novatos
em uma biblioteca universitária: o caso da Universidade de Brası́lia. Tese de doutorado,
Universidade de Brası́lia, Brası́lia, 2006. 1

John Self. The defining characteristics of Intelligent Tutoring Systems research: ITSs care,
precisely. International Journal of Artificial Intelligence in Education, (10):350—364,
1999. 8

John Self. Student Models in Computer-Aided Instruction. International Journal of


Man-Machine Studies, (6):261—276, março 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êndice A

Taxonomias do Capı́tulo 2 do
Tutorial ICC

A.1 Árvore 1
Uso de constantes e variáveis de vários tipos e formatação na saı́da dos dados.

A.1.1 Caracterı́sticas removı́veis


C1. uso de constantes e variáveis de vários tipos

C2. formatação na saı́da dos dados

A.1.2 Numeração dos exemplos


C1 C2 Exemplo
• • 1
– – 1.1
– • 1.2
• – 1.3

A.1.3 Enunciados
A.1.3.1 Exemplo 1
Faça um programa que peça ao usuário para entrar com o nome (string), a idade (integer)
e o peso (real) de 3 pessoas.
O programa deve gerar uma tabela na saı́da alinhando os dados das pessoas, reservando
10 caracteres para o nome, 5 para a idade e 6 para o peso, sendo este último escrito com
dois algarismos depois da vı́rgula.
O programa deve colocar um tı́tulo sobre os dados indicando nome, idade e peso.

78
A.1.3.2 Exemplo 1.1
Faça um programa que peça ao usuário para entrar com o nome (string), a idade (integer)
e o peso (real) de 3 pessoas.
O programa deve escrever na tela 3 linhas, cada uma contendo o nome, idade e peso
de cada pessoa.

A.1.3.3 Exemplo 1.2


Faça um programa que peça ao usuário para entrar com o nome (string), a idade (integer)
e o peso (real) de 3 pessoas.
O programa deve escrever na tela 3 linhas, cada uma contendo o nome, idade e peso
de cada pessoa, formatando as saı́das do seguinte modo: 10 caracteres para o nome, 5
para a idade e 6 para o peso, sendo este último escrito com dois algarismos depois da
vı́rgula.

A.1.3.4 Exemplo 1.3


Faça um programa que peça ao usuário para entrar com o nome (string), a idade (integer)
e o peso (real) de 3 pessoas.
O programa deve escrever na tela 3 linhas, cada uma contendo o nome, idade e peso
de cada pessoa.
O programa deve colocar um tı́tulo sobre os dados indicando nome, idade e peso.

A.2 Árvore 2
Uso de expressões aritméticas e uso de funções.

A.2.1 Caracterı́sticas removı́veis


C1. uso de expressões aritméticas com vários operadores

C2. uso de funções

A.2.2 Numeração dos exemplos


C1 C2 Exemplo
• • 2
– – 2.1
– • 2.2
• – 2.3

79
A.2.2.1 Exemplo 2
Faça um programa para ler dois ângulos (em graus) alfa e beta.
Transforme os ângulos para radianos e a seguir calcule os valores reais x e y dados
pelas expressões:
x = (cos2 (alf a) − sen2 (beta))/(2cos(alf a))
y = sen2 (alf a) − cos2 (beta)
O programa deve imprimir na tela os valores de x e de y.
Em seguida, deve trocar esses valores entre si e imprimı́-los novamente.

A.2.2.2 Exemplo 2.1


Faça 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ça um programa para ler dois ângulos (em graus) alfa e beta.
Transforme os ângulos para radianos e a seguir calcule os valores reais x e y dados
por:
x = cos(alf a)
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ça 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êndice B

Taxonomias do Capı́tulo 4 do
Tutorial ICC

B.1 Árvore 1
Comando for-do. Número determinado de laços. Exemplo utilizado: série de números
reais.

B.1.1 Caracterı́sticas removı́veis


C1. força cálculo de cada termo

C2. termos têm sinais alternantes

B.1.2 Numeração 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érie 1/2, −1/4, 1/6 − 1/8, ... faça um programa que imprima os dez primeiros
elementos da série, e a seguir imprima a soma desses dez elementos.

B.1.3.2 Exemplo 1.1


Dada a série 1/2, 1/4, 1/6, 1/8, ... faça um programa que imprima a soma dos dez primeiros
elementos.

81
B.1.3.3 Exemplo 1.2
Dada a série 1/2, −1/4, 1/6, −1/8, ... faça um programa que imprima a soma dos dez
primeiros elementos.

B.1.3.4 Exemplo 1.3


Dada a série 1/2, 1/4, 1/6, 1/8, ... faça um programa que imprima os dez primeiros ele-
mentos da série, e a seguir imprima a soma desses dez elementos.

B.2 Árvore 2
Comando repeat-until com final do laço especificado nos próprios dados.

B.2.1 Caracterı́sticas removı́veis


C1. primeiro elemento da série requer tratamento diferenciado

C2. há um if dentro do laço

B.2.2 Numeração dos exemplos


C1 C2 Exemplo
• • 2
– – 2.1
– • 2.2
• – 2.3

B.2.3 Enunciados
B.2.3.1 Exemplo 2
Faça um programa que leia uma sequência de números inteiros diferentes de zero.
O programa deve imprimir o maior e menor valor da sequência.
O programa deve parar quando o valor lido for igual a zero. O zero não faz parte da
sequência.

B.2.3.2 Exemplo 2.1


Faça um programa que leia uma sequência de números inteiros diferentes de zero.
O programa deve imprimir o valor da soma dos elementos da sequência.
O programa deve parar quando o valor lido for igual a zero. O zero não faz parte da
sequência.

82
B.2.3.3 Exemplo 2.2
Faça um programa que leia uma sequência de números inteiros diferentes de zero.
O programa deve imprimir o valor da soma dos elementos positivos e a soma dos
elementos negativos da sequência.
O programa deve parar quando o valor lido for igual a zero. O zero não faz parte da
sequência.

B.2.3.4 Exemplo 2.3


Faça um programa que leia uma sequência de números inteiros diferentes de zero.
O programa deve imprimir o maior valor da sequência.
O programa deve parar quando o valor lido for igual a zero. O zero não faz parte da
sequência.

B.3 Árvore 3
Comando repeat-until com pergunta ao usuário para cada laço.

B.3.1 Caracterı́sticas removı́veis


C1. primeiro elemento da série requer tratamento diferenciado

C2. há crı́tica de dados de entrada

B.3.2 Numeração dos exemplos


C1 C2 Exemplo
• • 3
– – 3.1
– • 3.2
• – 3.3

B.3.3 Enunciados
B.3.3.1 Exemplo 3
3 Faça um programa que leia uma sequência de números inteiros.
O programa deve imprimir o maior e menor valor da sequência.
O programa deve perguntar ao usuário, em cada leitura, se deseja continuar ou parar.
O usuário deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar.
Se o usuário entrar com um caractere diferente de ’s’ ou ’n’, o programa deve repetir
a pergunta.

83
B.3.3.2 Exemplo 3.1
Faça um programa que leia uma sequência de números inteiros.
O programa deve imprimir o valor da soma dos elementos da sequência.
O programa deve perguntar ao usuário, em cada leitura, se deseja continuar ou parar.
O usuário deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar.

B.3.3.3 Exemplo 3.2


Faça um programa que leia uma sequência de números inteiros.
O programa deve imprimir o maior e menor valor da sequência.
O programa deve perguntar ao usuário, em cada leitura, se deseja continuar ou parar.
O usuário deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar.

B.3.3.4 Exemplo 3.3


Faça um programa que leia uma sequência de números inteiros.
O programa deve imprimir o valor da soma dos elementos da sequência.
O programa deve perguntar ao usuário, em cada leitura, se deseja continuar ou parar.
O usuário deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar.
Se o usuário entrar com um caractere diferente de ’s’ ou ’n’, o programa deve repetir
a pergunta.

B.4 Árvore 4
Comando repeat-until com final do laço dependendo de alguma condição determinada
ao longo do programa.

B.4.1 Caracterı́sticas removı́veis


C1. condição é uma expressão booleana

C2. há um laço dentro de outro

B.4.2 Numeração dos exemplos


C1 C2 Exemplo
• • 4
– – 4.1
– • 4.2
• – 4.3

84
B.4.3 Enunciados
B.4.3.1 Exemplo 4
Faça um programa que escreva todos os números primos entre 1 e 100, um em cada linha.

B.4.3.2 Exemplo 4.1


faça um programa que leia um determinado valor inteiro. O programa deve evitar que o
usuário entre com valores não positivos.
O programa deve imprimir todos os divisores do número lido.

B.4.3.3 Exemplo 4.2


Faça um programa que imprima o menor divisor diferente de 1 de todos os números entre
2 e 20.

B.4.3.4 Exemplo 4.3


Faça um programa que leia um número inteiro. O programa deve evitar que o usuário
entre com valores negativos.
O programa deve imprimir uma mensagem dizendo se o número é primo ou se não é
primo.

B.5 Árvore 5
Comando while-do com final do laço especificado nos próprios dados

B.5.1 Caracterı́sticas removı́veis


C1. primeiro elemento exige tratamento diferenciado

C2. há um if dentro do laço

B.5.2 Numeração dos exemplos


C1 C2 Exemplo
• • 5
– – 5.1
– • 5.2
• – 5.3

85
B.5.3 Enunciados
B.5.3.1 Exemplo 5
Faça um programa que leia uma sequência de números inteiros diferentes de zero.
O programa deve imprimir o maior e o menor valor da sequência.
O programa deve parar quando o valor lido for igual a zero. O zero não faz parte da
sequência.

B.5.3.2 Exemplo 5.1


Faça um programa que leia uma sequência de números inteiros diferentes de zero.
O programa deve imprimir o valor da soma dos elementos da sequência.
O programa deve parar quando o valor lido for igual a zero. O zero não faz parte da
sequência.

B.5.3.3 Exemplo 5.2


Faça um programa que leia uma sequência de números inteiros diferentes de zero.
O programa deve imprimir o valor da soma dos elementos positivos e a soma dos
elementos negativos da sequência.
O programa deve parar quando o valor lido for igual a zero. O zero não faz parte da
sequência.

B.5.3.4 Exemplo 5.3


Faça um programa que leia uma sequência de números inteiros diferentes de zero.
O programa deve imprimir o maior valor da sequência.
O programa deve parar quando o valor lido for igual a zero. O zero não faz parte da
sequência.

B.6 Árvore 6
Comando while-do com pergunta ao usuário para cada laço

B.6.1 Caracterı́sticas removı́veis


C1. primeiro elemento da série requer tratamento diferenciado

C2. há crı́tica de dados de entrada

86
B.6.2 Numeração dos exemplos
C1 C2 Exemplo
• • 6
– – 6.1
– • 6.2
• – 6.3

B.6.3 Enunciados
B.6.3.1 Exemplo 6
Faça um programa que leia uma sequência de números inteiros.
O programa deve imprimir o maior e menor valor da sequência.
O programa deve perguntar ao usuário, em cada leitura, se deseja continuar ou parar.
O usuário deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar.
Se o usuário entrar com um caractere diferente de ’s’ ou ’n’, o programa deve repetir
a pergunta.

B.6.3.2 Exemplo 6.1


Faça um programa que leia uma sequência de números inteiros.
O programa deve imprimir o valor da soma dos elementos da sequência.
O programa deve perguntar ao usuário, em cada leitura, se deseja continuar ou parar.
O usuário deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar.

B.6.3.3 Exemplo 6.2


Faça um programa que leia uma sequência de números inteiros.
O programa deve imprimir o valor da soma dos elementos da sequência.
O programa deve perguntar ao usuário, em cada leitura, se deseja continuar ou parar.
O usuário deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar.
Se o usuário entrar com um caractere diferente de ’s’ ou ’n’, o programa deve repetir
a pergunta.

B.6.3.4 Exemplo 6.3


Faça um programa que leia uma sequência de números inteiros.
O programa deve imprimir o maior e menor valor da sequência.
O programa deve perguntar ao usuário, em cada leitura, se deseja continuar ou parar.
O usuário deve entrar com um ’s’ se quiser continuar, ou com um ’n’ se quiser parar.
—————————————————————-

87
B.7 Árvore 7
grupo 7. Comando while-do com final do laço dependendo de alguma condição determi-
nada ao longo do programa.
Comando while-do com pergunta ao usuário para cada laço

B.7.1 Caracterı́sticas removı́veis


C1. condição é uma expressão booleana

C2. há um laço dentro de outro

B.7.2 Numeração dos exemplos


C1 C2 Exemplo
• • 7
– – 7.1
– • 7.2
• – 7.3

B.7.3 Enunciados
B.7.3.1 Exemplo 7
Faça um programa que escreva todos os números primos entre 1 e 100, um em cada linha.

B.7.3.2 Exemplo 7.1


Faça um programa que leia um determinado valor inteiro. O programa deve evitar que o
usuário entre com valores não positivos.
O programa deve imprimir todos os divisores do número lido.

B.7.3.3 Exemplo 7.2


Faça um programa que imprima o menor divisor diferente de 1 de todos os números entre
2 e 20.

B.7.3.4 Exemplo 7.3


Faça um programa que leia um número inteiro. O programa deve evitar que o usuário
entre com valores negativos.
O programa deve imprimir uma mensagem dizendo se o número é primo ou se não é
primo.

88
Apêndice C

Taxonomias do Capı́tulo 4 do
Tutorial ICC

C.1 Árvore 1
Apenas um arquivo de entrada (sem uso de \lstinlineeoln!! e apenas variáveis de tipo
\lstinlineinteger!!).

C.1.1 Caracterı́sticas removı́veis


C1. perguntar ao usuário o nome do arquivo a ser lido

C2. várias linhas no arquivo

C.1.2 Numeração dos exemplos


C1 C2 Exemplo
• • 1
– – 1.1
– • 1.2
• – 1.3

C.1.3 Enunciados
C.1.3.1 Exemplo 1
Faça um programa que leia um arquivo tipo text contendo, em cada linha, uma sequencia
de 5 números inteiros.
O programa deve escrever na tela, para cada linha do arquivo, o valor da soma dos 5
elementos da sequencia.
O programa deve perguntar ao usuário o nome do arquivo a ser lido.

89
C.1.3.2 Exemplo 1.1
Faça um programa que leia um arquivo tipo text contendo uma única linha com 5 números
inteiros.
O programa deve escrever na tela o valor da soma dos 5 elementos.
O nome do programa é dado no próprio comando assign.

C.1.3.3 Exemplo 1.2


Faça um programa que leia um arquivo tipo text contendo, em cada linha, uma sequencia
de 5 números inteiros.
O programa deve escrever na tela, para cada linha do arquivo, o valor da soma dos 5
elementos correspondentes.
O nome do programa é dado no próprio comando assign.

C.1.3.4 Exemplo 1.3


Faça um programa que leia um arquivo tipo text contendo uma única linha com uma
sequencia de 5 números inteiros.
O programa deve escrever na tela o valor da soma dos 5 elementos.
O programa deve perguntar ao usuário o nome do arquivo a ser lido.

C.2 Árvore 2
Apenas um arquivo de entrada com uso de eoln e variáveis de vários tipos diferentes.

C.2.1 Caracterı́sticas removı́veis


C1. vários tipos de variáveis no arquivo

C2. primeira linha do arquivo requer tratamento diferenciado

C.2.2 Numeração dos exemplos


C1 C2 Exemplo
• • 2
– – 2.1
– • 2.2
• – 2.3

90
C.2.3 Enunciados
C.2.3.1 Exemplo 2
Faça um programa que leia um arquivo tipo text contendo, em cada linha, um nome
(string de 10 caracteres), uma idade (inteiro) e uma sequencia de notas (reais) de tamanho
indefinido (a sequencia pode ter tamanho zero).
O programa deve determinar qual a pessoa cuja soma das notas é a maior, entre todas
as pessoas presentes no arquivo. O programa deve escrever na tela o nome dessa pessoa
seguido de sua idade e do valor da soma das suas notas.

C.2.3.2 Exemplo 2.1


Faça um programa que leia um arquivo tipo text contendo, em cada linha, uma sequencia
de notas (reais) de tamanho indefinido (a sequencia pode ter tamanho zero).
O programa deve escrever na tela, em cada linha, o valor da soma das notas da linha
correspondente.

C.2.3.3 Exemplo 2.2


Faça um programa que leia um arquivo tipo text contendo, em cada linha, uma sequencia
de notas (reais) de tamanho indefinido (a sequencia pode ter tamanho zero).
O programa deve determinar qual a linha cuja soma das notas é a maior, entre todas
as linhas presentes no arquivo. O programa deve escrever na tela o valor dessa soma
máxima.

C.2.3.4 Exemplo 2.3


Faça um programa que leia um arquivo tipo text contendo, em cada linha, um nome
(string de 10 caracteres), uma idade (inteiro) e uma sequencia de notas (reais) de tamanho
indefinido (a sequencia pode ter tamanho zero).
O programa deve escrever na tela, em cada linha, o nome da pessoa, sua idade e o
valor da soma das suas notas.

C.3 Árvore 3
Apenas um arquivo de saı́da, entrada via teclado.

C.3.1 Caracterı́sticas removı́veis


C1. vários tipos de variáveis no arquivo

C2. saı́da formatada (tabela)

91
C.3.2 Numeração dos exemplos
C1 C2 Exemplo
• • 3
– – 3.1
– • 3.2
• – 3.3

C.3.3 Enunciados
C.3.3.1 Exemplo 3
Faça um programa que leia via teclado, 4 linhas, cada uma delas contendo 5 campos: o
primeiro é um nome (string[10]), o segundo é uma idade (integer) e os outros três são
notas (real).
O programa deve gerar um arquivo contendo em cada linha o conjunto de dados de
cada linha de entrada, formatando-os como uma tabela com o tı́tulo de cada campo.

C.3.3.2 Exemplo 3.1


Faça um programa que leia via teclado, 4 linhas, cada uma delas contendo três 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ça um programa que leia via teclado, 4 linhas, cada uma delas contendo 5 campos: o
primeiro é um nome (string[10]), o segundo é uma idade (integer) e os outros três são
notas (real).
O programa deve gerar um arquivo contendo em cada linha o conjunto de dados de
cada linha de entrada.

C.3.3.4 Exemplo 3.3


Faça um programa que leia via teclado, 4 linhas, cada uma delas contendo três notas
(real).
O programa deve gerar um arquivo contendo em cada linha o conjunto de dados de
cada linha de entrada, formatando-os como uma tabela com o tı́tulo de cada campo.

C.4 Árvore 4
Um arquivo de entrada e outro de saı́da.

92
C.4.1 Caracterı́sticas removı́veis
C1. com uso de eoln

C2. saı́da formatada (tabela)

C.4.2 Numeração dos exemplos


C1 C2 Exemplo
• • 4
– – 4.1
– • 4.2
• – 4.3

C.4.3 Enunciados
C.4.3.1 Exemplo 4
Faça um programa que leia um arquivo tipo text contendo, em cada linha, um nome
(string de 10 caracteres), uma idade (inteiro) e uma sequencia de notas (reais) de tamanho
indefinido (a sequencia pode ter tamanho zero).
O programa deve gerar um arquivo contendo, em cada linha, o nome da pessoa, sua
idade e a soma de suas notas, formatando-os como uma tabela com o tı́tulo de cada
campo.

C.4.3.2 Exemplo 4.1


Faça um programa que leia um arquivo tipo text contendo, em cada linha, um nome
(string de 10 caracteres), uma idade (inteiro) e uma sequencia de 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ça um programa que leia um arquivo tipo text contendo, em cada linha, um nome
(string de 10 caracteres), uma idade (inteiro) e uma sequencia de notas (reais) de tamanho
indefinido (a sequencia pode ter tamanho zero).
O programa deve gerar um arquivo contendo, em cada linha, o nome da pessoa, sua
idade e a soma de suas notas.

C.4.3.4 Exemplo 4.3


Faça um programa que leia um arquivo tipo text contendo, em cada linha, um nome
(string de 10 caracteres), uma idade (inteiro) e uma sequencia de 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 Árvore 5
Um arquivo de entrada e dois de saı́da.

C.5.1 Caracterı́sticas removı́veis


C1. com uso de eoln

C2. vários tipos de variáveis no arquivo

C.5.2 Numeração dos exemplos


C1 C2 Exemplo
• • 5
– – 5.1
– • 5.2
• – 5.3

C.5.3 Enunciados
C.5.3.1 Exemplo 5
Faça um programa que leia um arquivo tipo text contendo, em cada linha, um nome
(string de 10 caracteres) e uma sequencia de notas (reais) de tamanho indefinido (a
sequencia pode ter tamanho zero).
O programa deve gerar dois arquivos, um para os alunos cuja soma das notas ultrapasse
o valor 10, e outro para os alunos cuja soma das notas seja menor ou igual a 10.
Em cada um dos arquivos de saı́da o programa deve escrever, em cada linha, o nome
seguido do valor da soma das notas.

C.5.3.2 Exemplo 5.1


Faça 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ça um programa que leia um arquivo tipo text contendo, em cada linha uma sequencia
de notas (reais) de tamanho indefinido (a sequencia pode ter tamanho zero).
O programa deve gerar dois arquivos, um para os alunos cuja soma das notas ultrapasse
o valor 10, e outro para os alunos cuja soma das notas seja menor ou igual a 10.
Em cada um dos arquivos de saı́da o programa deve escrever, em cada linha, o valor
da soma das notas da linha correspondente no arquivo de entrada.

C.5.3.4 Exemplo 5.3


Faça 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êndice D

Taxonomias do Capı́tulo 6 do
Tutorial ICC

D.1 Árvore 1
Utiliza apenas um vetor de números inteiros dispostos aleatoriamente.

D.1.1 Caracterı́sticas removı́veis


C1. pára percorrimento em determinda condição

C2. atua apenas sobre alguns elementos, sob determinada condição

D.1.2 Numeração dos exemplos


C1 C2 Exemplo
• • 1
– – 1.1
– • 1.2
• – 1.3

D.1.3 Enunciados
D.1.3.1 Exemplo 1
Faça um programa para trabalhar com um vetor de 10 elementos inteiros. Os dados do
vetor devem ser lidos de um arquivo.
O programa deve percorrer o vetor, a partir do primeiro elemento, até encontrar o
primeiro elemento par.
O programa deve escrever o valor da soma dos elementos percorridos antes de encontrar
o primeiro elemento par.

96
D.1.3.2 Exemplo 1.1
Faça um programa para trabalhar com um vetor de 10 elementos inteiros. Os dados do
vetor devem ser lidos de um arquivo.
O programa deve escrever o valor da soma de todos os elementos do vetor.

D.1.3.3 Exemplo 1.2


Faça um programa para trabalhar com um vetor de 10 elementos inteiros. Os dados do
vetor devem ser lidos de um arquivo.
O programa deve escrever a soma de todos os elementos pares presentes no vetor.

D.1.3.4 Exemplo 1.3


Faça um programa para trabalhar com um vetor de 10 elementos inteiros. Os dados do
vetor devem ser lidos de um arquivo.
O programa deve escrever a posição, dentro do vetor, do primeiro elemento par en-
contrado. Se não houver nenhum número par o programa deve escrever o valor 0.

D.2 Árvore 2
Utiliza dois vetores de caracteres, um ordenado e outro não; o não-ordenado pode conter
elementos repetidos.

D.2.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ção dos exemplos


C1 C2 Exemplo
• • 2
– – 2.1
– • 2.2
• – 2.3

D.2.3 Enunciados
D.2.3.1 Exemplo 2
Faça um programa que leia dois vetores,a e b, de 10 caracteres cada um, de dois arquivos
diferentes. O vetor a tem os elementos em ordem crescente e não tem elementos repetidos.
O vetor b tem os elementos dispostos aleatoriamente e pode ter elementos repetidos.

97
O programa deve escrever uma linha para cada elemento de b. Cada linha deve conter
o elemento de b, seguido de um inteiro que indica a posição desse elemento no vetor a. Se
o elemento não estiver presente no vetor a, o programa deve escrever 0.

D.2.3.2 Exemplo 2.1


Faça um programa que leia dois vetores,a e b, de 10 caracteres cada um, de dois arquivos
diferentes. O vetor a tem os elementos em ordem crescente e não tem elementos repetidos.
O vetor b tem os elementos dispostos aleatoriamente e pode ter elementos repetidos.
O programa deve escrever na tela o número de vezes que o primeiro elemento do vetor
a está presente no vetor b.

D.2.3.3 Exemplo 2.2


Faça um programa que leia dois vetores,a e b, de 10 caracteres cada um, de dois arquivos
diferentes. O vetor a tem os elementos em ordem crescente e não tem elementos repetidos.
O vetor b tem os elementos dispostos aleatoriamente e pode ter elementos repetidos.
O programa deve escrever na tela qual a posição da primeira ocorrência, no vetor b,
do primeiro elemento do vetor a. Se primeiro elemento de a não estiver presente no vetor
b, o programa deve escrever 0.

D.2.3.4 Exemplo 2.3


Faça um programa que leia dois vetores,a e b, de 10 caracteres cada um, de dois arquivos
diferentes. O vetor a tem os elementos em ordem crescente e não tem elementos repetidos.
O vetor b tem os elementos dispostos aleatoriamente e pode ter elementos repetidos.
O programa deve escrever uma linha para cada combinação de elementos dos vetores
a e b.

D.3 Árvore 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ção dos exemplos
C1 C2 Exemplo
• • 3
– – 3.1
– • 3.2
• – 3.3

D.3.3 Enunciados
D.3.3.1 Exemplo 3
Faça um programa que leia dois vetores de 5 elementos cada, de dois arquivos. Um dos
vetores guarda os nomes de alunos (string[10]) e o outro guarda suas notas (reais).
O programa deve escrever na tela os nomes e as notas, um aluno por linha, com os
nomes dos alunos em ordem alfabética.

D.3.3.2 Exemplo 3.1


Faça um programa que leia dois vetores de 5 elementos cada, de dois arquivos. Um dos
vetores guarda os nomes de alunos (string[10]) e o outro guarda suas notas (reais).
O programa deve escrever na tela apenas a nota máxima do conjunto de notas.

D.3.3.3 Exemplo 3.2


Faça um programa que leia dois vetores de 5 elementos cada, de dois arquivos. Um dos
vetores guarda os nomes de alunos (string[10]) e o outro guarda suas notas (reais).
O programa deve escrever na tela o nome e a nota do aluno que tiver a nota máxima
do conjunto dado.

D.3.3.4 Exemplo 3.3


Faça um programa que leia dois vetores de 5 elementos cada, de dois arquivos. Um dos
vetores guarda os nomes de alunos (string[10]) e o outro guarda suas notas (reais).
O programa deve escrever na tela os nomes de todos os alunos, um por linha, em
ordem alfabética. Em seguida deve escrever todas as notas, na mesma linha, em ordem
decrescente.

D.4 Árvore 4
Utiliza uma matriz de 3 por 5 inteiros.

99
D.4.1 Caracterı́sticas removı́veis
C1. usa ordenação

C2. processa linhas de forma independente uma da outra

D.4.2 Numeração dos exemplos


C1 C2 Exemplo
• • 4
– – 4.1
– • 4.2
• – 4.3

D.4.3 Enunciados
D.4.3.1 Exemplo 4
Faça um programa que leia, de um arquivo, uma matriz de 3 linhas e 5 colunas, de
números inteiros. Cada linha do arquivo deve conter uma linha da matriz.
O programa deve alterar a ordem dos elementos em cada linha da matriz, de modo
que cada uma das linhas fique ordenada em ordem crescente.
O programa deve escrever a nova matriz na tela, uma linha da matriz para cada linha
da tela.

D.4.3.2 Exemplo 4.1


Faça um programa que leia, de um arquivo, uma matriz de 3 linhas e 5 colunas, de
números inteiros. Cada linha do arquivo deve conter uma linha da matriz.
O programa deve determinar o valor máximo entre os elementos da primeira linha da
matriz.

D.4.3.3 Exemplo 4.2


Faça um programa que leia, de um arquivo, uma matriz de 3 linhas e 5 colunas, de
números inteiros. Cada linha do arquivo deve conter uma linha da matriz.
O programa deve deteminar o valor máximo de cada linha da matriz. O programa
deve escrever em cada linha da tela o valor máximo de cada linha da matriz.

D.4.3.4 Exemplo 4.3


Faça um programa que leia, de um arquivo, uma matriz de 3 linhas e 5 colunas, de
números inteiros. Cada linha do arquivo deve conter uma linha da matriz.
O programa deve alterar a ordem dos elementos 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 Árvore 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ção dos exemplos


C1 C2 Exemplo
• • 5
– – 5.1
– • 5.2
• – 5.3

D.5.3 Enunciados
D.5.3.1 Exemplo 5
Faça um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de números
inteiros. Cada linha do arquivo deve conter uma linha da matriz.
O programa deve transpor a matriz, percorrendo os elementos abaixo da diagonal
principal.
O programa deve escrever a nova matriz na tela, uma linha da matriz para cada linha
da tela.

D.5.3.2 Exemplo 5.1


Faça um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de números
inteiros. Cada linha do arquivo deve conter uma linha da matriz.
O programa deve escrever na tela o valor do maior elemento de toda a matriz.

D.5.3.3 Exemplo 5.2


Faça um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de números
inteiros. Cada linha do arquivo deve conter uma linha da matriz.
O programa deve trocar a primeira coluna da matriz com a última.
O programa deve escrever a nova matriz na tela, uma linha da matriz para cada linha
da tela.

101
D.5.3.4 Exemplo 5.3
Faça um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de números
inteiros. Cada linha do arquivo deve conter uma linha da matriz.
O programa deve igualar a zero todos os elementos situados abaixo da diagonal prin-
cipal da matriz.
O programa deve escrever a nova matriz na tela, uma linha da matriz para cada linha
da tela.

D.6 Árvore 6
Utiliza matriz quadrada de 5 por 5 inteiros.

D.6.1 Caracterı́sticas removı́veis


C1. processa apenas elementos acima da diagonal secundária

C2. não processa elementos da diagonal secundária

D.6.2 Numeração dos exemplos


C1 C2 Exemplo
• • 6
– – 6.1
– • 6.2
• – 6.3

D.6.3 Enunciados
D.6.3.1 Exemplo 6
Faça um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de números
inteiros. Cada linha do arquivo deve conter uma linha da matriz.
O programa deve igualar a zero todos os elementos situados acima da diagonal se-
cundária da matriz.
O programa deve escrever a nova matriz na tela, uma linha da matriz para cada linha
da tela.

D.6.3.2 Exemplo 6.1


Faça um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de números
inteiros. Cada linha do arquivo deve conter uma linha da matriz. O programa deve igualar
a zero todos os elementos da diagonal 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ça um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de números
inteiros. Cada linha do arquivo deve conter uma linha da matriz.
O programa deve igualar a zero todos os elementos da diagonal secundária da matriz.
O programa deve escrever a nova matriz na tela, uma linha da matriz para cada linha
da tela.

D.6.3.4 Exemplo 6.3


Faça um programa que leia, de um arquivo, uma matriz quadrada de 5 por 5 de números
inteiros. Cada linha do arquivo deve conter uma linha da matriz.
O programa deve igualar a zero todos os elementos situados acima da diagonal se-
cundária da matriz e também os elementos da diagonal secundária da matriz.
O programa deve escrever a nova matriz na tela, uma linha da matriz para cada linha
da tela.

103
Apêndice E

Taxonomias do Capı́tulo 7 do
Tutorial ICC

E.1 Árvore 1
Registro dentro de outro registro.

E.1.1 Caracterı́sticas removı́veis


C1. a data é outro registro dentro do principal

C2. primeiro elemento do conjunto requer tratamento diferenciado

E.1.2 Numeração dos exemplos


C1 C2 Exemplo
• • 1
– – 1.1
– • 1.2
• – 1.3

E.1.3 Enunciados
E.1.3.1 Exemplo 1
Faça um programa que leia um arquivo text contendo em cada linha: um nome (string
[10]), um dia (inteiro), um mês (inteiro), um ano (inteiro) e uma dı́vida (real).
Os dados de cada pessoa devem ser colocados em um registro com os campos nome,
nascimento e divida. O campo nascimento é outro registro contendo os campos dia, mês
e ano.
O programa deve escrever na tela os dados da pessoa mais nova de todo o conjunto.

104
E.1.3.2 Exemplo 1.1
Faça um programa que leia um arquivo text contendo em cada linha: um nome (string
[10]), um dia (inteiro), um mês (inteiro), um ano (inteiro) e uma dı́vida (real).
Os dados de cada pessoa devem ser colocados em um registro com os campos nome,
dia, mês, ano e divida.
O programa deve escrever na tela o valor da somas das dı́vidas de todas as pessoas do
conjunto.

E.1.3.3 Exemplo 1.2


Faça um programa que leia um arquivo text contendo em cada linha: um nome (string
[10]), um dia (inteiro), um mês (inteiro), um ano (inteiro) e uma dı́vida (real).
Os dados de cada pessoa devem ser colocados em um registro com os campos nome,
dia, mês, ano e divida.
O programa deve escrever na tela os dados da pessoa mais nova de todo o conjunto.

E.1.3.4 Exemplo 1.3


Faça um programa que leia um arquivo text contendo em cada linha: um nome (string
[10]), um dia (inteiro), um mês (inteiro), um ano (inteiro) e uma dı́vida (real).
Os dados de cada pessoa devem ser colocados em um registro com os campos nome,
nascimento e divida. O campo nascimento é outro registro contendo os campos dia, mês
e ano.
O programa deve escrever na tela o valor da somas das dı́vidas de todas as pessoas do
conjunto.

E.2 Árvore 2
Array dentro de registro.

E.2.1 Caracterı́sticas removı́veis


C1. a data é outro registro dentro do principal

C2. primeiro elemento do conjunto requer tratamento diferenciado

E.2.2 Numeração dos exemplos


C1 C2 Exemplo
• • 2
– – 2.1
– • 2.2
• – 2.3

105
E.2.3 Enunciados
E.2.3.1 Exemplo 2
Faça um programa que leia um arquivo text contendo em cada linha: um nome (string
[10]) e cinco notas (reais).
Os dados de cada pessoa devem ser colocados em um registro com os campos nome e
notas. O campo notas é um array contendo cinco notas (reais).
O programa deve escrever na tela os dados da pessoa com a média das notas mais
baixa.

E.2.3.2 Exemplo 2.2


Faça um programa que leia um arquivo text contendo em cada linha: um nome (string
[10]) e três 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édia de todas as notas de todas as pessoas.

E.2.3.3 Exemplo 2.2


Faça um programa que leia um arquivo text contendo em cada linha: um nome (string
[10]) e três 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édia das notas mais
baixa.

E.2.3.4 Exemplo 2.3


Faça um programa que leia um arquivo text contendo em cada linha: um nome (string
[10]) e cinco notas (reais).
Os dados de cada pessoa devem ser colocados em um registro com os campos nome e
notas. O campo notas é um array contendo cinco notas (reais).
O programa deve escrever na tela a média de todas as notas de todas as pessoas.

E.3 Árvore 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ção dos exemplos
C1 C2 Exemplo
• • 3
– – 3.1
– • 3.2
• – 3.3

E.3.3 Enunciados
E.3.3.1 Exemplo 3
Faça um programa que leia um arquivo contendo, em cada linha, o nome de um aluno
(string[10]) e 5 notas (reais).
Os dados de cada aluno devem ser colocados um registro com os seguintes campos:
um nome (string[10]), um array de 5 notas (reais) e uma média (real). O programa deve
construir um array de 10 registros desse tipo. Observe que nesse caso o arquivo não pode
ter mais de 10 linhas.
O programa deve ler os dados de cada aluno e colocá-lo no elemento correspondente
do array de registros, calculando e guardando também a média de cada aluno.
O programa deve escrever na tela uma relação dos nomes e médias dos alunos, em
ordem decrescente do valor da média.

E.3.3.2 Exemplo 3.1


Faça 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ês notas: nota1, nota2, nota3 (reais) e uma média (real). O
programa deve construir um array de 10 registros desse tipo. Observe que nesse caso o
arquivo não pode ter mais de 10 linhas.
O programa deve ler os dados de cada aluno e colocá-lo no elemento correspondente
do array de registros, calculando e guardando também a média de cada aluno.
O programa deve escrever na tela a relação de nomes e médias, na mesma ordem em
que estavam no arquivo de origem.

E.3.3.3 Exemplo 3.2


Faça um programa que leia um arquivo contendo, em cada linha, o nome de um aluno
(string[10]) e 5 notas (reais).
Os dados de cada aluno devem ser colocados um registro com os seguintes campos:
um nome (string[10]), um array de 5 notas (reais) e uma média (real). O programa deve
construir um array de 10 registros desse tipo. Observe que nesse caso o arquivo não pode
ter mais de 10 linhas.

107
O programa deve ler os dados de cada aluno e colocá-lo no elemento correspondente
do array de registros, calculando e guardando também a média de cada aluno.
O programa deve escrever na tela a relação de nomes e médias, na mesma ordem em
que estavam no arquivo de origem.

E.3.3.4 Exemplo 3.3


Faça 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ês notas: nota1, nota2, nota3 (reais) e uma média (real). O
programa deve construir um array de 10 registros desse tipo. Observe que nesse caso o
arquivo não pode ter mais de 10 linhas.
O programa deve ler os dados de cada aluno e colocá-lo no elemento correspondente
do array de registros, calculando e guardando também a média de cada aluno.
O programa deve escrever na tela uma relação dos nomes e médias dos alunos, em
ordem decrescente do valor da média.

108

Вам также может понравиться