Sumário - Novatec Editora

Propaganda
Aprenda a
Programar com
Minecraft
T r a n s fo r m e s e u m u n d o c o m
o poder do Python
Craig Richardson
novatec
Copyright © 2015 by Craig Richardson. Title of English-language original: Learn to Program with
Minecraft, ISBN 978-1-59327-670-6, published by No Starch Press. Portuguese-language edition
copyright © 2016 by Novatec Editora Ltda. All rights reserved.
Copyright © 2015 por by Craig Richardson. Título original em Inglês: Learn to Program with
Minecraft, ISBN 978-1-59327-670-6, publicado pela No Starch Press. Edição em Português copyright
© 2016 pela Novatec Editora Ltda. Todos os direitos reservados.
© Novatec Editora Ltda. 2016.
Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998. É proibida a reprodução
desta obra, mesmo parcial, por qualquer processo, sem prévia autorização, por escrito, do autor e da
Editora.
Editor: Rubens Prates IG20160408
Assistente editorial: Priscila A. Yoshimatsu
Tradução: Patrícia Gavazzi
Revisão gramatical: Solange Martins e Smirna Cavalheiro
Revisão técnica: Rafael Milléo
Editoração eletrônica: Carolina Kuwabata
ISBN: 978-85-7522-493-9
Histórico de impressões:
Abril/2016
Primeira edição
Novatec Editora Ltda.
Rua Luís Antônio dos Santos 110
02460-000 – São Paulo, SP – Brasil
Tel.: +55 11 2959-6529
E-mail: [email protected]
Site: novatec.com.br
Twitter: twitter.com/novateceditora
Facebook: facebook.com/novatec
LinkedIn: linkedin.com/in/novatec
IG20160411
SUMÁRIO
AgradecimentosXIII
IntroduçãoXV
Por que aprender a programar? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XVI
Por que Python? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XVI
Por que Minecraft? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XVI
O que o livro aborda? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XVII
Fontes online . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XIX
Vamos começar a aventura! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XIX
1 Instalações e configurações: preparando-se para
a aventura
21
Configurando o seu PC Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Instalando o Minecraft . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Instalando o Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Instalando o Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Instalando a API do Minecraft Python e o Spigot . . . . . . . . . . . . . . . . . . . . . .
Executando o Spigot e criando um jogo . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Recomeçando um novo mundo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Jogando offline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Alterando para o Modo de Sobrevivência . . . . . . . . . . . . . . . . . . . . . . . . . .
Configurando o seu Mac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Instalando o Minecraft . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Instalando o Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Instalando o Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Instalando a API do Minecraft Python e o Spigot . . . . . . . . . . . . . . . . . . . . . .
Executando o Spigot e criando um jogo . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Recomeçando um novo mundo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Jogando offline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Alterando para o Modo de Sobrevivência . . . . . . . . . . . . . . . . . . . . . . . . . .
Configurando o seu Raspberry Pi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Conhecendo o IDLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Conhecendo o Shell Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Diga olá ao editor de texto do IDLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
22
23
24
26
28
30
31
32
33
33
35
36
37
39
40
41
41
42
44
44
45
Quando usar o Shell Python ou o editor de texto . . . . . . . . . . . . . . . . . . . . . 47
Os Prompts utilizados neste livro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Testando a configuração do Minecraft Python . . . . . . . . . . . . . . . . . . . . . . . . . 48
2 Teletransportando com variáveis
O que é um programa? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Armazenando dados em variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A estrutura das linguagens de programação . . . . . . . . . . . . . . . . . . . . . . . .
Regras de sintaxe para variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Mudando os valores das variáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Números inteiros (Integers) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Números de ponto flutuante (floats) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Reduzindo a velocidade de teletransporte com o módulo time . . . . . . . . . . . . . .
Depuração (debugging) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
O que você aprendeu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
51
51
52
53
55
55
56
63
65
69
72
3 Construindo rápido e viajando longe com a
matemática73
Expressões e declarações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Operadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Adição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Subtração . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Usando operadores matemáticos em argumentos . . . . . . . . . . . . . . . . . . . . .
Multiplicação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Divisão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Potenciação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Parênteses e ordem das operações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Truques úteis de matemática . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Operadores abreviados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Brincando com números aleatórios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
O que você aprendeu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4 Comunicando-se com Strings
73
74
75
79
80
85
86
89
89
90
90
91
93
95
O que são strings? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
A função print() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
A função input() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Concatenando strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Convertendo números em strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Concatenando números inteiros e decimais . . . . . . . . . . . . . . . . . . . . . . . . 103
Convertendo strings em números inteiros com int() . . . . . . . . . . . . . . . . . . . . . 104
Recuperando-se dos erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .107
O que você aprendeu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
VIII Sumário
5 Descobrindo o que é verdadeiro (true) e falso
(false) com booleanos
113
Básico sobre o tipo booleano . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Concatenando o tipo booleano . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
Operadores de comparação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
Igual a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
Diferente de . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Maior que e menor que . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Maior ou igual a e Menor ou igual a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Operadores lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
E (and) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Ou (or) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Negação (not) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Ordem dos operadores lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Meu número está entre dois outros? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
O que você aprendeu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
6 Fazendo minigames com declarações if
(condicionais) 137
Usando declarações if (se) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Declarações else (senão) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Declarações elif (senão-se) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Encadeando declarações elif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Declarações if aninhadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Usando declarações if para testar diversos valores . . . . . . . . . . . . . . . . . . . . .
Operadores booleanos e declarações if . . . . . . . . . . . . . . . . . . . . . . . . . . . .
O que você aprendeu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
138
141
144
147
150
152
156
159
7 Festas dançantes e desfiles de flores com loops
while161
Um simples loop while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Controlando loops com uma variável de contagem . . . . . . . . . . . . . . . . . . . .
Loops while infinitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Condições extravagantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Operadores booleanos e loops while . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Verificando um intervalo de valores com loops while . . . . . . . . . . . . . . . . . .
Declarações if aninhadas e loops while . . . . . . . . . . . . . . . . . . . . . . . . . . .
Interrompendo um loop while com break . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Declarações while-else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
O que você aprendeu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8 Funções: obtendo superpoderes
161
166
169
170
174
174
177
180
182
185
187
Definindo as suas próprias funções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
Chamando uma função . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Funções recebem argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Sumário IX
Refatorando um programa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Comentários com Docstrings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Quebras de linhas em argumentos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Valores de retorno da função . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Usando declarações if e loops while em funções . . . . . . . . . . . . . . . . . . . . . .
Declarações if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Loops while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Variáveis locais e globais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
O que você aprendeu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9 Acertando blocos com listas e dicionários
Usando listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Acessando um elemento de uma lista . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Mudando um elemento de uma lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Manipulando listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Adição de um elemento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Inserção de um elemento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Remoção de um elemento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Tratando strings como listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Tuplas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Definindo variáveis com tuplas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Retornando uma tupla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Outras funcionalidades das listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Comprimento da lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Escolhendo um elemento aleatoriamente . . . . . . . . . . . . . . . . . . . . . . . . . .
Copiando uma lista . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Elementos e estruturas if . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dicionários . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Definindo um dicionário . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Acessando elementos em dicionários . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Mudando e adicionando um elemento em um dicionário . . . . . . . . . . . . . .
Removendo elementos de dicionários . . . . . . . . . . . . . . . . . . . . . . . . . . . .
O que você aprendeu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10 Minecraft fazendo mágica com loops for
Um simples loop for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A função range() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Brincando com range() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Outras funções das listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Percorrendo um dicionário . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Loops for-else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Interrompendo um loop for-else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Loops for aninhados e listas multidimensionais . . . . . . . . . . . . . . . . . . . . . . . .
Pensando em duas dimensões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Acessando valores em listas 2D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Gerando listas 2Ds com loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
X Sumário
192
195
196
196
200
201
204
206
211
213
214
215
215
218
218
219
219
222
223
223
226
227
227
230
232
234
237
237
238
241
241
244
245
246
248
251
252
256
258
259
261
261
266
269
Pensando em três dimensões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Saída de listas 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Acessando valores em listas 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
O que você aprendeu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
272
273
278
285
11 Salvando e carregando construções com arquivos
e módulos
287
Usando arquivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Abrindo um arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Escrevendo e salvando um arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Lendo um arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Lendo uma linha de um arquivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Parte 1: escrevendo a lista de tarefas . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Parte 2: exibindo a lista de tarefas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Usando módulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
O módulo pickle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Importando o pickle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Importando uma função com a cláusula from . . . . . . . . . . . . . . . . . . . . . .
Importando todas as funções com * . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Fornecendo um apelido ao módulo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Parte 1: salvando a construção . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Parte 2: carregando a construção . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Armazenando grande quantidade de dados com o módulo shelve . . . . . . . . .
Abrindo um arquivo com shelve . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Adicionando, modificando e acessando elementos com shelve . . . . . . . . . .
Parte 1: salvando uma estrutura em uma coleção . . . . . . . . . . . . . . . . . . . .
Parte 2: carregando uma estrutura de uma coleção . . . . . . . . . . . . . . . . . .
Instalando novos módulos com pip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Usando pip no Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Usando pip em um Mac ou em um Raspberry Pi . . . . . . . . . . . . . . . . . . . .
Usando um módulo do pip: Flask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
O que você aprendeu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
288
288
290
290
291
292
294
295
296
296
297
298
299
300
304
305
306
306
307
308
312
313
314
314
316
12 Dominando a programação orientada a objetos319
Básico sobre programação orientada a objetos . . . . . . . . . . . . . . . . . . . . . . .
Criando uma classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Criando um objeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Acessando atributos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Entendendo os métodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Retornando valores como métodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Criando múltiplos objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Atributos de classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Entendendo a herança . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Herdando uma classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Adicionando novos métodos a subclasses . . . . . . . . . . . . . . . . . . . . . . . . .
Alterando métodos e atributos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
320
320
321
322
324
330
333
336
338
339
340
343
Sumário XI
O que você aprendeu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
Posfácio351
Guia de IDs dos blocos
353
FONTES359
Requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Se você estiver usando Windows 7, 8 ou 10 . . . . . . . . . . . . . . . . . . . . . . . . . .
Se estiver usando OS X 10.10 ou versão posterior . . . . . . . . . . . . . . . . . . . . .
Se estiver usando um Raspberry Pi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
XII Sumário
359
359
359
360
Download