Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Lgica de Programao
Lgica de Programao em C#
28 de novembro de 2015
Sumrio
ii
Prefcio
vii
ii
Introduo
1.1 O que um Computador? . . . . . . . . . . .
1.2 Comunicao . . . . . . . . . . . . . . . . . .
1.3 Formato Binrio . . . . . . . . . . . . . . . . .
1.4 Unidades . . . . . . . . . . . . . . . . . . . . .
1.5 Arquiteturas de Processadores . . . . . . . . .
1.6 O que um Programa? . . . . . . . . . . . . .
1.7 Linguagem de Mquina . . . . . . . . . . . .
1.8 Linguagem de Programao . . . . . . . . . .
1.9 Compilador . . . . . . . . . . . . . . . . . . . .
1.10 Sistemas Operacionais . . . . . . . . . . . . .
1.11 Mquinas Virtuais . . . . . . . . . . . . . . . .
1.12 Editores de Texto . . . . . . . . . . . . . . . . .
1.13 Terminal . . . . . . . . . . . . . . . . . . . . .
1.14 Hello World em C# . . . . . . . . . . . . . . . .
1.15 O que o Mtodo Main? . . . . . . . . . . . .
1.16 Variaes do Mtodo Main . . . . . . . . . . .
1.17 Argumentos de Linha de Comando . . . . . .
1.18 Exibindo Mensagens . . . . . . . . . . . . . .
1.19 Comentrios . . . . . . . . . . . . . . . . . . .
1.20 Indentao . . . . . . . . . . . . . . . . . . . .
1.21 Engenharia Reversa . . . . . . . . . . . . . . .
1.22 Ofuscadores . . . . . . . . . . . . . . . . . . .
1.23 Erro: Compilar um arquivo inexistente . . . .
1.24 Erro: Executar utilizando a extenso .cs . . .
1.25 Erro: No fechar os blocos . . . . . . . . . . .
1.26 Erro: No fechar as aspas . . . . . . . . . . . .
1.27 Erro: Trocar maisculas e minsculas . . . .
1.28 Erro: Esquecer o ponto e vrgula . . . . . . .
1.29 Erro: Esquecer o Main . . . . . . . . . . . . .
1.30 Erro: Utilizar sequncias de escape invlidas
1.31 Resumo . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
2
3
5
7
8
9
9
10
10
12
14
14
14
16
17
18
20
21
22
22
23
23
23
23
24
24
25
25
26
26
Variveis
2.1 O que uma Varivel? . . . . . . . . .
2.2 Declarando e Inicializando Variveis
2.3 Exibindo os Valores das Variveis . .
2.4 Copiando Valores . . . . . . . . . . .
2.5 Tipos Simples . . . . . . . . . . . . .
2.6 Nullable Types . . . . . . . . . . . . .
2.7 String . . . . . . . . . . . . . . . . . .
2.8 Data e Hora . . . . . . . . . . . . . . .
2.9 Valores Literais . . . . . . . . . . . . .
2.10 Constantes . . . . . . . . . . . . . . .
2.11 Nmeros Aleatrios . . . . . . . . . .
2.12 Convenes de Nomenclatura . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
29
29
29
31
31
33
38
38
38
39
44
45
46
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
www.k19.com.br
iii
S UMRIO
2.13
2.14
2.15
2.16
2.17
2.18
2.19
2.20
2.21
3
Regras de Nomenclatura . . . . . . . . . . . . . . . . . . . . . . .
Palavras Reservadas . . . . . . . . . . . . . . . . . . . . . . . . . .
Erro: Variveis com nomes repetidos . . . . . . . . . . . . . . . .
Erro: Esquecer a inicializao de uma varivel local . . . . . . .
Erro: Trocar aspas simples por aspas duplas ou vice-versa . . .
Erro: Utilizar o separador decimal errado . . . . . . . . . . . . .
Erro: Valores incompatveis com os tipos das variveis . . . . .
Erro: Esquecer dos caracteres de tipagem para float ou decimal
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
48
49
49
50
50
51
51
52
53
Operadores
3.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2 Converses Entre Tipos Simples . . . . . . . . . . . . . . . .
3.3 Converso Entre Tipos Simples e String . . . . . . . . . . .
3.4 Operadores Aritmticos . . . . . . . . . . . . . . . . . . . .
3.5 Tipo do Resultado de uma Operao Aritmtica . . . . . .
3.6 Diviso Inteira . . . . . . . . . . . . . . . . . . . . . . . . . .
3.7 Overflow e Underflow . . . . . . . . . . . . . . . . . . . . . .
3.8 Regras para Operaes Aritmticas com Valores Especiais
3.9 Concatenao de Strings . . . . . . . . . . . . . . . . . . . .
3.10 Operadores Unrios + e - . . . . . . . . . . . . . . . . . . . .
3.11 Operadores de Atribuio . . . . . . . . . . . . . . . . . . .
3.12 Operadores de Comparao . . . . . . . . . . . . . . . . . .
3.13 Operadores Lgicos . . . . . . . . . . . . . . . . . . . . . . .
3.14 Operador Ternrio ?: . . . . . . . . . . . . . . . . . . . . . .
3.15 Operador de Negao . . . . . . . . . . . . . . . . . . . . . .
3.16 Incremento e Decremento . . . . . . . . . . . . . . . . . . .
3.17 Avaliando uma Expresso . . . . . . . . . . . . . . . . . . .
3.18 Manipulao de Strings . . . . . . . . . . . . . . . . . . . . .
3.19 Operaes com Data e Hora . . . . . . . . . . . . . . . . . .
3.20 Erro: Utilizar operandos e operadores incompatveis . . .
3.21 Erro: Diviso inteira por zero . . . . . . . . . . . . . . . . .
3.22 Erro: Armazenamento de valores incompatveis . . . . . .
3.23 Erro: Castings no permitidos . . . . . . . . . . . . . . . . .
3.24 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
55
55
55
57
60
62
63
68
70
71
73
73
77
79
86
87
89
94
98
102
103
104
105
105
106
Controle de Fluxo
4.1 Introduo . . . . . . . . . . . . . . .
4.2 Instrues de Deciso . . . . . . . . .
4.3 Instruo if . . . . . . . . . . . . . . .
4.4 Instruo else . . . . . . . . . . . . .
4.5 Instrues de Deciso Encadeadas .
4.6 Instrues de Repetio . . . . . . .
4.7 Instruo while . . . . . . . . . . . . .
4.8 Instruo for . . . . . . . . . . . . . .
4.9 Instrues de Repetio Encadeadas
4.10 Instruo break . . . . . . . . . . . .
4.11 Instruo continue . . . . . . . . . .
4.12 Blocos Sem Chaves . . . . . . . . . .
4.13 Laos Infinitos . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
109
109
109
109
113
118
121
121
126
131
138
150
157
158
www.facebook.com/k19treinamentos
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
iii
S UMRIO
4.14
4.15
4.16
4.17
4.18
4.19
4.20
4.21
4.22
4.23
4.24
4.25
4.26
5
iv
iv
Instruo switch . . . . . . . . . . . . . . . . . . . . . . . .
Instruo do-while . . . . . . . . . . . . . . . . . . . . . .
Unreachable Code . . . . . . . . . . . . . . . . . . . . . . .
Erro: No utilizar condies booleanas . . . . . . . . . .
Erro: Else sem if . . . . . . . . . . . . . . . . . . . . . . . .
Erro: Else com condio . . . . . . . . . . . . . . . . . . .
Erro: Ponto e vrgula excedente . . . . . . . . . . . . . . .
Erro: Lao infinito . . . . . . . . . . . . . . . . . . . . . .
Erro: Chave do switch com tipos incompatveis . . . . .
Erro: Casos do switch com expresses no constantes . .
Erro: Break ou continue fora de um lao . . . . . . . . . .
Erro: Usar vrgula ao invs de ponto e vrgula no lao for
Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
158
162
165
165
166
166
167
167
168
168
169
169
170
Array
5.1 Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2 O que um Array? . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.3 Referncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.4 Declarao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.5 Inicializao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.6 Acessando o Contedo de um Array . . . . . . . . . . . . . . . .
5.7 Alterando o Contedo de um Array . . . . . . . . . . . . . . . . .
5.8 Outras Formas de Inicializao . . . . . . . . . . . . . . . . . . .
5.9 Percorrendo um Array . . . . . . . . . . . . . . . . . . . . . . . .
5.10 Array Multidimensional . . . . . . . . . . . . . . . . . . . . . . .
5.11 Erro: Utilizar valores incompatveis como ndices de um array .
5.12 Erro: Definir outras dimenses ao criar arrays irregulares . . . .
5.13 Erro: Acessar uma posio invlida de um array . . . . . . . . .
5.14 Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
173
173
173
174
175
175
176
177
178
179
180
188
189
189
189
Mtodos
6.1 Introduo . . . . . . . . . . . . .
6.2 Estrutura Geral de um Mtodo .
6.3 Parmetros . . . . . . . . . . . . .
6.4 Resposta . . . . . . . . . . . . . .
6.5 Passagem de Parmetros . . . . .
6.6 Sobrecarga . . . . . . . . . . . . .
6.7 Parmetros Variveis . . . . . . .
6.8 Erro: Parmetros incompatveis .
6.9 Erro: Resposta incompatvel . . .
6.10 Erro: Esquecer a instruo return
6.11 Erro: No utilizar parnteses . . .
6.12 Resumo . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
191
191
191
193
193
198
200
202
204
205
205
207
208
.
.
.
.
.
211
211
212
213
214
215
String
7.1 Referncias . .
7.2 Pool de Strings
7.3 Imutabilidade
7.4 StringBuilder .
7.5 Formatao . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
www.k19.com.br
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
S UMRIO
7.6
7.7
www.facebook.com/k19treinamentos
S UMRIO
vi
vi
www.k19.com.br
Prefcio
O contedo deste livro uma introduo lgica de programao e linguagem C#. Apesar de
introdutrio, os tpicos deste livro so apresentados com bastante profundidade. Portanto, este material no adequado para quem procura apenas um conhecimento superficial sobre programao.
O leitor no precisa ter experincia com programao. Mas, necessrio estar acostumado a
utilizar computadores no seu dia a dia e ter conhecimento sobre os tpicos bsicos de matemtica
abordados no ensino fundamental.
Organizao
No Captulo 1, sero apresentados os principais elementos de um computador e alguns conceitos
bsicos como linguagem de mquina, linguagem de programao, compilador, sistema operacional
e mquina virtual. Alm disso, o leitor ter o primeiro contato com um programa escrito em linguagem C#.
No Captulo 2, o conceito de varivel ser apresentado. Veremos o processo de criao de variveis utilizando a linguagem C#. Alm disso, mostraremos os tipos primitivos dessa linguagem e
tambm o tipo String.
No Captulo 3, veremos como as variveis podem ser manipuladas atravs dos operadores da
linguagem C#. Sero apresentadas as operaes de converso, as aritmticas, as de atribuio, as de
comparao e as lgicas. Alm disso, mostraremos o funcionamento do operador de negao e do
operador ternrio.
No Captulo 4, sero apresentadas as instrues de deciso e de repetio da linguagem C#. Veremos como o fluxo de execuo de um programa pode ser controlado com as instrues if, else,
while, for, switch, do, break e continue.
No Captulo 5, ser apresentado o conceito de array. Mostraremos como criar e manipular arrays
unidimensionais ou multidimensionais. Alm disso, discutiremos os principais erros relacionados
aos arrays.
No Captulo 6, mostraremos como reutilizar cdigo atravs da criao de mtodos. Veremos
como definir e utilizar os parmetros e o retorno de um mtodo. Alm disso, apresentaremos o conceito de sobrecarga e varargs.
No Captulo 7, caractersticas especficas dos objetos do tipo string sero discutidas. Dentre elas,
falaremos sobre imutabilidade, pool de strings e string builder. Alm disso, mostraremos os recursos
da plataforma .NET para formatao de strings.
Sees
As sees so classificadas de acordo com o nvel de dificuldade. Sees que tratam de assuntos
considerados bsicos, so marcadas com a figura . A imagem
est associada s sees que
www.facebook.com/k19treinamentos
vii
S UMRIO
viii
abordam
Simulaes
Para facilitar o entendimento do leitor, diversas simulaes ilustradas foram adicionadas neste
livro. O objetivo das simulaes mostrar passo a passo a execuo de um programa. A imagem
abaixo apresenta a ilustrao de um passo de uma simulao.
rea de cdigo
1 class Variavel
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = a;
7
System.Console.WriteLine (a);
System.Console.WriteLine (b);
8
}
9
10 }
a=2
b=2
Na rea de cdigo, apresentado o cdigo do programa cuja a execuo est sendo simulada. Na
rea das variveis, possvel visualizar as variveis criadas at o momento e os seus valores atuais. A
linha ou instruo que est sendo executada no passo atual destacada na rea de cdigo. Na rea
das variveis, as variveis que foram alteradas no passo atual da simulao so apresentadas em uma
caixa de cor laranja e as que no foram alteradas em uma caixa de cor azul.
As mensagens exibidas pelos programas na sada padro so apresentadas na rea de sada. As
linhas exibidas no passo atual da simulao sero destacadas com uma crculo laranja.
1 class Variavel
2 {
3
static void main ()
{
4
int a = 2;
5
int b = a;
6
System.Console.WriteLine (a);
7
System.Console.WriteLine (b);
8
}
9
10 }
a=2
b=2
2
2
rea de sada
viii
www.k19.com.br
CAPTULO
I NTRODUO
HD
Atualmente, os computadores esto presentes no cotidiano da maioria das pessoas. Voc, provavelmente, j est acostumado a utilizar computadores no seu dia a dia. Mas, ser que voc conhece
o funcionamento bsico de um computador? A seguir, listaremos os principais elementos de um
computador e suas respectivas funes.
Memria RAM
ULA + UC
CPU
Registradores
HD (Disco Rgido): A principal funo dos HDs armazenar dados. Geralmente, os documentos
que os usurios salvam, por exemplo, arquivos de texto, planilhas eletrnicas, apresentaes,
imagens, udios e vdeos so guardados nos HDs. Normalmente, os dados e as operaes dos
programas que os usurios instalam nos computadores tambm so mantidos nos discos rgidos. O contedo armazenado nos HDs persistente, ou seja, no descartado quando os
computadores so desligados. Geralmente, os discos rgidos so capazes de armazenar uma
grande quantidade de dados. Contudo, as operaes de acesso e de armazenamento de dados
no considerada rpida.
www.facebook.com/k19treinamentos
I NTRODUO
Memria RAM: A principal funo da memria RAM armazenar dados. O acesso e o armazenamento de dados na memria RAM bem mais rpido do que nos HDs. Por isso, quando os
usurios executam um programa, os dados e operaes desse programa so copiados do HD
para a memria RAM. Analogamente, os documentos abertos pelos usurios tambm so copiados do HD para a memria RAM. Geralmente, a quantidade de dados que podemos armazenar na memria RAM bem menor do que a quantidade de dados que podemos armazenar
nos HDs. Quando os computadores so desligados, os dados guardados na memria RAM so
descartados.
CPU (Unidade Central de Processamento - Processador): Basicamente, a tarefa da CPU executar
operaes aritmticas e operaes lgicas. A UC (Unidade de Controle), a ULA (Unidade Lgica e Aritmtica) e os registradores so componentes bsicos da CPU. Normalmente, a UC
copia uma operao de um programa armazenado na memria RAM e guarda os dados dessa
operao nos registradores. Na sequncia, a ULA executa a operao acessando os dados armazenados nos registradores e guarda o resultado dessa operao tambm nos registradores.
Por fim, a UC copia o resultado armazenado nos registradores para a memria RAM.
1.2 Comunicao
Os computadores so capazes de se comunicar com dispositivos perifricos como teclado, mouse,
monitor, caixa de som, impressoras, projetores, entre outros. Eles tambm so capazes de se comunicar com outros computadores. Essa comunicao realizada atravs das diversas portas fsicas
que os computadores possuem. A seguir, listaremos algumas portas fsicas e as suas respectivas funes.
Ethernet: Utilizada para conectar um computador a uma rede local de computadores. Atravs dessa
porta, um computador pode enviar e receber dados de outros computadores.
Paralela: Essa porta foi criada para conectar um computador a uma impressora. Hoje, utilizada
tambm para conectar computadores a scanners, cmeras de vdeo, entre outros dispositivos.
www.k19.com.br
I NTRODUO
PS/2: Teclados e mouses antigos so conectados aos computadores atravs dessa porta.
USB: Atualmente, a porta mais utilizada. Diversos dispositivos so conectados aos computadores
atravs das portas USB. Por exemplo, teclados, mouses, impressoras, celulares, HDs externos,
entre outros.
Analogia
M
K
P B 0O
K X
E 8
T
80
E
1
B
Y
K
19
Os textos que voc est acostumado a escrever ou ler so escritos com as letras do
Alfabeto Latino. As 26 letras bsicas do Alfabeto Latino so: A, B, C, D, E, F, G, H, I, J, K, L, M, N,
O, P, Q, R, S, T, U, V, W, X, Y e Z.
Em outras partes do mundo, outros alfabetos so utilizados. Por exemplo, na Grcia, as pessoas
utilizam o Alfabeto Grego. No Mundo rabe, o Alfabeto rabe. Na China, o Alfabeto Chins.
Por analogia, podemos dizer que os computadores utilizam o Alfabeto Binrio. Esse alfabeto
composto pelo caractere 0 e pelo caractere 1. Todos os dados manipulados por um computador
devem ser definidos em formato binrio, ou seja, com os caracteres 0 e 1.
Nmeros
As pessoas esto acostumadas a lidar com os nmeros em formato decimal. Os computadores,
por outro lado, trabalham com nmeros em formato binrio. Veja, a seguir, as representaes decimal e binria de alguns nmeros.
www.facebook.com/k19treinamentos
I NTRODUO
Decimal
0
1
2
3
4
5
6
7
8
9
Binrio
0
1
10
11
100
101
110
111
1000
1001
Decimal
10
11
12
13
14
15
16
17
18
19
Binrio
1010
1011
1100
1101
1110
1111
10000
10001
10010
10011
Decimal
20
21
22
23
24
25
26
27
28
29
Binrio
10100
10101
10110
10111
11000
11001
11010
11011
11100
11101
Caracteres
Nos computadores, os caracteres de um texto tambm devem ser definidos em formato binrio.
Para realizar essa transformao, primeiramente, cada caractere associado a um valor numrico
inteiro. Por exemplo, o caractere A e o caractere ? so normalmente associados aos valores 65 e
63, respectivamente. A representao binria de cada caractere corresponde representao binria
do valor numrico associado a esse caractere.
Os caracteres so mapeados para formato binrio atravs de padres como ASCII (http://pt.
wikipedia.org/wiki/ASCII) e Unicode (http://pt.wikipedia.org/wiki/Unicode). Veja, a seguir,
a representao binria de alguns caracteres de acordo com o padro ASCII.
Caractere
A
B
C
D
E
F
G
H
I
J
K
Decimal
65
66
67
68
69
70
71
72
73
74
75
Binrio
01000001
01000010
01000011
01000100
01000101
01000110
01000111
01001000
01001001
01001010
01001011
Caractere
L
M
N
O
P
Q
R
S
T
U
V
Decimal
76
77
78
79
80
81
82
83
84
85
86
Binrio
01001100
01001101
01001110
01001111
01010000
01010001
01010010
01010011
01010100
01010101
01010110
Normalmente, cada caractere corresponde a uma sequncia composta por oito ou dezesseis dgitos binrios. A quantidade de dgitos utilizados limita a quantidade de caracteres que podem ser
4
www.k19.com.br
I NTRODUO
representados. Por exemplo, com oito dgitos binrios, podemos representar no mximo 256 caracteres. Com dezesseis dgitos binrios, podemos representar at 65536 caracteres.
1.4 Unidades
Voc deve estar acostumado a medir distncias utilizando as unidades de comprimento do Sistema Internacional de Medidas (International System of Units SI) como milmetro, centmetro,
metro e quilmetro. Os americanos e os ingleses utilizam com maior frequncia as unidades de
medida do Imperial Unit como polegada, p, jarda e milha.
De forma anloga, importante ser capaz de medir a quantidade de dados que um computador
pode armazenar ou transmitir. Essa mensurao pode ser realizada com ajuda das unidades de medida. A unidade de medida bsica o bit. Cada 0 ou 1 que um computador armazena ou transmite
um bit. Por padro, um byte corresponde a 8 bits. O smbolo utilizado para representar o byte a
letra B.
A Comisso Eletrotcnica Internacional (International Electrotechnical Commission IEC) e o
Sistema Internacional de Medidas (International System of Units SI) definem unidades de medida
relacionadas ao byte. As unidades do padro IEC 80000-13 utilizam valores que so potncias de
1024. J as unidades baseadas no SI utilizam valores que so potncias de 1000. Veja a Tabela 1.3.
www.facebook.com/k19treinamentos
I NTRODUO
Nome
byte
kibibyte
mebibyte
gibibyte
tebibyte
pebibyte
exbibyte
zebibyte
yobibyte
IEC
Smbolo
B
KiB
MiB
GiB
TiB
PiB
EiB
ZiB
YiB
Bytes
10240
10241
10242
10243
10244
10245
10246
10247
10248
Nome
byte
kilobyte
megabyte
gigabyte
terabyte
petabyte
exabyte
zettabyte
yottabyte
SI
Smbolo
B
kB
MB
GB
TB
PB
EB
ZB
YB
Bytes
10000
10001
10002
10003
10004
10005
10006
10007
10008
Tabela 1.3: Unidades de medida segundo o padro IEC 80000-13 e o Sistema Internacional de Unidades
www.k19.com.br
I NTRODUO
750 GB possui capacidade igual a 698,63 GB. Os usurios que no sabem que esses sistemas operacionais adotam unidades de medida diferentes das adotadas pelos fabricantes de HD se sentem
enganados.
GRAVA REG-1
19
GRAVA REG-2
11
001001010011
001010001011
SOMA
EXIBE
REG-3
010001010011
011011000000
Figura 1.7: Instrues de processador
Nesse exemplo fictcio, os trs primeiros bits das instrues definem qual operao o processador deve executar. A operao GRAVA representada pelo cdigo 001, a operao SOMA
representada pelo cdigo 010 e a operao EXIBE representada pelo cdigo 011.
As operaes do tipo GRAVA servem para armazenar um valor em um registrador. Por isso,
necessrio indicar o valor e o nmero do registrador onde esse valor deve ser armazenado. Tanto o
valor quanto o nmero do registrador so definidos em formato binrio.
As operaes do tipo SOMA servem para somar os valores armazenados em dois registradores
e guardar o resultado em um terceiro registrador. Por isso, necessrio indicar o nmero de trs registradores. Os valores armazenados nos dois primeiros registradores so adicionados e o resultado
armazenado no terceiro registrador.
As operaes do tipo EXIBE servem para exibir na tela o valor armazenado em um registrador.
Por isso, necessrio indicar o nmero de um registrador. O valor armazenado nesse registrador
exibido na tela.
A primeira instruo indica ao processador que o valor 19 deve ser gravado no registrador 1. A
segunda instruo indica que o valor 11 deve ser armazenado no registrador 2. J a terceira instruo
determina a realizao da adio dos valores anteriormente armazenados nos registradores 1 e 2 alm
de indicar que o resultado deve ser armazenado no registrador 3. Por ltimo, a quarta instruo
determina ao processador que o valor do registrador 3 deve ser exibido na tela.
No h um padro universal para o formato das instrues que os processadores podem executar. Consequentemente, as mesmas operaes podem ser definidas de formas diferentes em dois
processadores distintos. Considere o exemplo fictcio a seguir com algumas instrues para dois
www.facebook.com/k19treinamentos
I NTRODUO
SOMA
Arquitetura X
REG-2
REG-1
0110001100100001
SOMA
Arquitetura Y
REG-3
010001010011
Figura 1.8: Instrues de processadores diferentes
As duas instrues mostradas na Figura 1.8 indicam aos processadores que o valor do registrador
1 deve ser adicionado ao valor do registrador 2 e o resultado deve ser armazenado no registrador 3.
Contudo, as sequncias binrias dessas instrues so diferentes porque os processadores so de
arquiteturas diferentes.
As instrues que um processador pode executar so definidas pela sua arquitetura. As arquiteturas de processadores mais utilizadas atualmente so x86, x86_64 e ARM.
Analogia
M
K
P B 0O
K X
E 8
T
80
E
1
B
Y
K
19
Da mesma forma que pintores so capazes de produzir pinturas sofisticadas utilizando apenas tinta, pincel e quadro, programadores so capazes de criar programas sofisticados
a partir dos recursos bsicos oferecidos pelos computadores.
www.k19.com.br
I NTRODUO
class Xpto{
private int xpto;
private String lala;
public Xpto(int x,
String l){
this.xpto = xpto;
this.lala = lala;
}
double soma = 0;
for ( int i = 0; i < numeros . Length ; i ++)
{
soma += numeros [ i ];
}
System . Console . WriteLine ( " A soma " + soma ) ;
Cdigo C# 1.1: Exemplo de cdigo em C#
www.facebook.com/k19treinamentos
I NTRODUO
10
Por enquanto, voc no precisa se preocupar em entender o que est escrito no cdigo acima.
Observe apenas que um programa escrito em linguagem de programao bem mais fcil de ser
compreendido do que um programa escrito em linguagem de mquina.
1.9 Compilador
Vimos que os computadores so capazes de processar o cdigo escrito em linguagem de mquina. Tambm vimos que invivel desenvolver um programa em linguagem de mquina. Por isso,
existem as linguagens de programao. Da surge uma pergunta: se os computadores entendem apenas comandos em linguagem de mquina, como eles podem executar cdigo escrito em linguagem
de programao?
Na verdade, os computadores no executam cdigo escrito em linguagem de programao. Esse
cdigo que denominado cdigo fonte deve ser traduzido para cdigo em linguagem de mquina.
Essa traduo realizada por programas especiais chamados compiladores.
while(true){
if(x < 1){
return 0;
}
return 1;
}
CDIGO FONTE
PROCESSADOR
COMPILADOR
CDIGO DE MQUINA
NO EXECUTA
while(true){
if(x < 1){
return 0;
}
return 1;
}
CDIGO FONTE
PROCESSADOR
EXECUTA
10
www.k19.com.br
11
I NTRODUO
Em sistemas operacionais como o Windows, geralmente, o usurio clica duas vezes em um cone
correspondente ao programa que ele deseja executar e o Windows se encarrega de copiar as instrues desse programa do disco rgido para a memria RAM. Dessa forma, o usurio no precisa
conhecer os comandos dos processadores para executar um programa.
Os sistemas operacionais controlam a execuo dos programas. Inclusive, eles permitem que vrios programas sejam executados simultaneamente. Alm disso, oferecem diversas funcionalidades
aos usurios, como controlar o volume das caixas de som, o brilho do monitor, o acesso internet
entre outros.
Os sistemas operacionais tambm oferecem diversos servios aos prprios programas. Por exemplo, as impressoras configuradas pelos usurios so gerenciadas pelos sistemas operacionais. Qualquer programa que deseja interagir com uma impressora pode utilizar os recursos oferecidos pelos
sistemas operacionais para esse propsito. Sendo assim, os sistemas operacionais funcionam como
intermedirios entre os programas e os computadores.
www.facebook.com/k19treinamentos
11
I NTRODUO
12
PLATAFORMA 1
EXECUTA
PROGRAMA 2
PLATAFORMA 2
EXECUTA
PROGRAMA 2
PLATAFORMA 3
NO EXECUTA
Figura 1.14: Ilustrao mostrando que cada plataforma necessita de um executvel especfico
12
www.k19.com.br
13
I NTRODUO
PROGRAMA
MQUINA VIRTUAL 1
PLATAFORMA 1
EXECUTA
MQUINA VIRTUAL 2
PLATAFORMA 2
EXECUTA
MQUINA VIRTUAL 3
PLATAFORMA 3
EXECUTA
Na analogia da Figura 1.15, o programa seria o plugue, as mquinas virtuais seriam os adaptadores e as plataformas seriam as tomadas. Como as tomadas seguem padres diferentes, so necessrios adaptadores para encaixar o mesmo plugue em todas as tomadas. Analogamente, como as
plataformas seguem padres diferentes, so necessrias mquinas virtuais para executar o mesmo
programa em todas as plataformas.
Para cada plataforma, uma mquina virtual especfica necessria. Todas as mquinas virtuais
devem saber ler as instrues do programa que desejamos executar para depois traduzi-las para a
linguagem de mquina da plataforma correspondente. Dessa forma, as mquinas virtuais atuam
como tradutores.
Assim como qualquer coisa, algum precisa desenvolver as mquinas virtuais. Qualquer pessoa
pode desenvolver uma mquina virtual. Contudo, essa uma tarefa que exige conhecimento tcnico
muito avanado. Por isso, normalmente, os programadores que desenvolvem os programas no desenvolvem as mquinas virtuais. Geralmente, as mquinas virtuais so desenvolvidas por grandes
empresas ou so projetos de cdigo aberto que envolvem programadores experientes do mundo inteiro.
As mquinas virtuais podem ser gratuitas ou pagas. Os maiores exemplos de mquinas virtuais so a Oracle JVM (Java Virtual Machine), a OpenJDK JVM, a Microsoft CLR (Common Language
Runtime) e a Mono CLR.
A nossa explicao sobre mquinas virtuais pode dar a entender que elas funcionam apenas
como meros tradutores ou adaptadores. Contudo, importante destacar que as mquinas virtuais oferecem diversos outros recursos como gerenciamento de memria e otimizao em tempo de
execuo.
www.facebook.com/k19treinamentos
13
I NTRODUO
14
1.13 Terminal
A maior parte dos usurios dos computadores no possui conhecimento sobre programao. Esses usurios interagem com os computadores atravs das interfaces visuais oferecidas pelos sistemas
operacionais. Geralmente, essas interfaces visuais no exigem conhecimentos tcnicos.
Os sistemas operacionais oferecem tambm interfaces baseadas em texto. Essas interfaces no
so muito agradveis para a maior parte dos usurios. Porm, geralmente, elas so mais prticas
para os programadores.
No Windows, o programa Command Prompt e o programa Windows Power Shell permitem que
os usurios controlem o computador atravs de uma interface baseada em texto. Nos sistemas operacionais da famlia Unix, h diversos programas que oferecem esse tipo de interface. Geralmente,
esses programas so chamados de Terminal.
Importante
No sistema operacional Windows, para compilar e executar um programa escrito em
C#, necessrio ter instalado o .NET Framework ou uma implementao alternativa da plataforma .NET. A partir do Windows Vista, o sistema operacional Windows j vem com .NET
Framework instalado.
Um programa escrito em C# tambm pode ser compilado e executado em outros sistemas operacionais como o Ubuntu e o OS X atravs da plataforma Mono (http://www.mono-project.
com).
O primeiro passo escrever o cdigo fonte do programa. Qualquer editor de texto pode ser utilizado. No exemplo abaixo, o cdigo fonte foi armazenado no arquivo HelloWorld.cs. O nome do
arquivo no precisa ser HelloWorld nem a extenso precisa ser .cs. Contudo, recomendamos que essa
extenso seja sempre utilizada nos arquivos que armazenam cdigo fonte C#. Considere que o arquivo HelloWorld.cs foi salvo na pasta introducao.
1 class HelloWorld
2 {
3
static void Main ()
4
{
5
System . Console . WriteLine ( " Hello World " ) ;
14
www.k19.com.br
15
I NTRODUO
6
}
7 }
Cdigo C# 1.2: HelloWorld.cs
O comando cd altera o diretrio atual do terminal. No exemplo acima, esse comando foi utilizado
para alterar o diretrio atual do terminal para introducao.
O comando csc aciona o compilador da linguagem C#. No exemplo acima, esse comando foi
utilizado para compilar o arquivo HelloWorld.cs. O compilador traduz o cdigo fonte desse arquivo e
armazena o cdigo compilado em um novo arquivo chamado HelloWorld.exe.
Para conferir se o arquivo HelloWorld.exe foi criado, podemos utilizar o comando dir no Command
Prompt do Windows. Esse comando lista o contedo da pasta atual do terminal.
C :\ Users \ K19 \ introducao > dir
O volume na unidade C no tem nome
O Nmero de Serie do Volume 063 B -6 F3D
Pasta de C :\ Users \ K19 \ introducao
14 -07 -2009
14 -07 -2009
14 -07 -2009
14 -07 -2009
06:41
<DIR >
.
06:41
<DIR >
..
06:52
106 HelloWorld . cs
06:52
425 HelloWorld . exe
2 File ( s )
531 bytes
2 Dir ( s ) 57 ,925 ,980 ,160 bytes disponveis
Mais Sobre
A maioria das linguagens de programao so case sensitive. Isso significa que elas
diferenciam as letras maisculas das minsculas. Portanto, ao escrever o cdigo de um programa, devemos tomar cuidado para no trocar uma letra maiscula por uma letra minscula
www.facebook.com/k19treinamentos
15
I NTRODUO
16
ou vice-versa.
O mtodo Main o comeo do programa. Podemos dizer que o ponto de partida de um programa em C# a primeira instruo do mtodo Main. As demais instrues so executadas na ordem
em que esto definidas no cdigo. Eventualmente, durante a execuo das instrues, algum erro
pode ocorrer e interromper o fluxo do processamento.
De acordo com a especificao da linguagem C#, o mtodo Main deve ser definido com o modificador static. Opcionalmente, ele pode ser definido com o modificador public e receber um array de
strings como parmetro. O tipo de retorno pode ser void ou int.
Lembre-se
O funcionamento dos arrays ser abordado no Captulo ??. Os conceitos de mtodo, parmetro e tipo de retorno sero apresentados no Captulo ??.
Lembre-se
Neste livro, no sero abordados o conceito de classe e os modificadores public e static.
Simulao
Veremos, a seguir, uma simulao de execuo de um programa em C#.
A execuo iniciada na primeira linha do mtodo Main. Ou seja, ela comea na linha 5 do cdigo
abaixo. A instruo presente nessa linha exibe o caractere A na sada padro.
1
16
www.k19.com.br
17
I NTRODUO
1 class ExibeMensagens
2 {
3
static void Main ()
4
{
5
System . Console . WriteLine ( " A " ) ;
6
System . Console . WriteLine ( " B " ) ;
7
System . Console . WriteLine ( " C " ) ;
8
}
9 }
A
1 class ExibeMensagens
2 {
3
static void Main ()
4
{
5
System . Console . WriteLine ( " A " ) ;
6
System . Console . WriteLine ( " B " ) ;
7
System . Console . WriteLine ( " C " ) ;
8
}
9 }
A
B
1 class ExibeMensagens
2 {
3
static void Main ()
4
{
5
System . Console . WriteLine ( " A " ) ;
6
System . Console . WriteLine ( " B " ) ;
7
System . Console . WriteLine ( " C " ) ;
8
}
9 }
A
B
C
Algumas variaes da forma tradicional do mtodo Main so aceitas. Por exemplo, acrescentar o
modificador public.
1 public static void Main ()
Cdigo C# 1.8: Acrescentando o modificador public
www.facebook.com/k19treinamentos
17
I NTRODUO
18
Agora, no prximo exemplo, o programa foi executado com trs argumentos de linha de comando: K19, Livros e Lgica.
C :\ Users \ K19 \ introducao > Programa . exe K19 Livros Lgica
A cada execuo do programa, argumentos diferentes podem ser passados na linha de comando.
Esses argumentos podem ser recuperados dentro do mtodo Main. No exemplo abaixo, criamos um
programa que exibe na sada padro o primeiro, o segundo e o terceiro argumentos da linha de comando. O primeiro argumento acessado atravs da varivel args[0]. O segundo argumento acessado atravs da varivel args[1]. O terceiro argumento acessado atravs da varivel args[2].
1 class Programa
2 {
3
static void Main ()
4
{
5
System . Console . WriteLine ( args [0]) ;
6
System . Console . WriteLine ( args [1]) ;
7
System . Console . WriteLine ( args [2]) ;
8
}
9 }
Cdigo C# 1.11: Recuperando os argumentos de linha de comando
A seguir apresentamos a sada do programa ao execut-lo com trs argumentos de linha de comando.
18
www.k19.com.br
19
I NTRODUO
C :\ Users \ K19 \ introducao > Programa . exe K19 Livros Lgica
K19
Livros
Lgica
Terminal 1.9: Sada do programa ao execut-lo com trs argumentos de linha de comando
Mais Sobre
O funcionamento dos arrays ser abordado no Captulo ??.
Voc no pode esquecer que, ao executar um programa, os argumentos de linha de comando so
separados por espao e o primeiro parmetro vem imediatamente direita do nome do arquivo que
contm o cdigo compilado. O ndice do primeiro argumento 0, do segundo 1, do terceiro 2 e
assim sucessivamente.
C :\ Users \ K19 \ introducao > Programa . exe arg0 arg1 arg2
Para definir um argumento de linha de comando que contm um ou mais espaos, o caractere
aspas dupla deve ser utilizado para delimitar esse argumento.
C :\ Users \ K19 \ introducao > Programa . exe " Rafael Cosentino " " Rafael Lobato " " Marcelo Martins "
Simulao
Veremos, a seguir, uma simulao de execuo de um programa em C# que exibe os trs primeiros argumentos da linha de comando na sada padro.
Suponha que o programa armazenado no arquivo Programa.exe seja executado com os argumentos K19, Livros e Lgica, como no exemplo abaixo.
1
Como sabemos, o fluxo de execuo do programa inicia na primeira linha do mtodo Main. Ou
seja, ele comea na linha 5 do cdigo abaixo. A instruo presente nessa linha exibe o primeiro
argumento da linha de comando, isto , exibe K19 na sada padro.
1 class Argumentos
2 {
3
static void Main ()
4
{
5
System . Console . WriteLine ( args [0]) ;
6
System . Console . WriteLine ( args [1]) ;
7
System . Console . WriteLine ( args [2]) ;
8
}
9 }
K19
www.facebook.com/k19treinamentos
19
I NTRODUO
20
1 class Argumentos
2 {
3
static void Main ()
4
{
5
System . Console . WriteLine ( args [0]) ;
6
System . Console . WriteLine ( args [1]) ;
7
System . Console . WriteLine ( args [2]) ;
8
}
9 }
K19
Livros
1 class Argumentos
2 {
3
static void Main ()
4
{
5
System . Console . WriteLine ( args [0]) ;
6
System . Console . WriteLine ( args [1]) ;
7
System . Console . WriteLine ( args [2]) ;
8
}
9 }
K19
Livros
Lgica
Para adicionar quebras de linha ou tabulaes nas mensagens, necessrio utilizar as chamadas sequncias de escape. Uma quebra de linha definida com a sequncia de escape \n. Uma
tabulao, com \t.
Na Tabela 1.5, as sequncias de escape da linguagem C# so apresentadas.
20
www.k19.com.br
21
I NTRODUO
Sequncia de escape
\t
\v
\b
\n
\r
\f
\
\"
\\
Descrio
Adiciona uma tabulao (tab)
Adiciona uma tabulao vertical
Volta para o caractere anterior (backspace)
Adiciona uma quebra de linha (newline)
Volta para o incio da linha (carriage return)
Adiciona uma quebra de pgina (formfeed)
Adiciona o caractere aspas simples
Adiciona o caractere aspas dupla
Adiciona uma barra invertida
Tabela 1.5: Sequncias de escape
1
2
3
4
5
Rafael
Linha1
Linha2
Digite sim
Jonas disse : " Ol "
C :\ K19 \ Livros
O mtodo WriteLine adiciona uma quebra de linha no final da mensagem exibida. Para exibir
mensagens sem quebra de linha, podemos utilizar o mtodo Write.
1 System . Console . Write ( " MENSAGEM SEM QUEBRA DE LINHA " ) ;
1.19 Comentrios
Podemos acrescentar comentrios em qualquer ponto do cdigo fonte. Geralmente, os comentrios funcionam como anotaes que o programador adiciona no cdigo fonte para explicar a lgica
do programa. Eles so teis tanto para o prprio programador que os escreveu quanto para outros
programadores que, eventualmente, precisam ler e/ou alterar o cdigo fonte.
Os compiladores ignoram os comentrios inseridos no cdigo fonte. Portanto, no cdigo de mquina gerado pela compilao do cdigo fonte, os comentrios no so inseridos.
Em C#, para comentar uma linha, podemos utilizar a marcao //.
1 System . Console . WriteLine ( " K19 " ) ;
2 // comentrio de linha
3 System . Console . WriteLine ( " Rafael Cosentino " ) ;
Cdigo C# 1.18: Comentrio de linha
21
I NTRODUO
1
2
3
4
5
22
1.20 Indentao
A organizao do cdigo fonte fundamental para o entendimento da lgica de um programa.
Cada linguagem de programao possui os seus prprios padres de organizao. Observe a organizao padro do cdigo fonte escrito com a linguagem de programao C#.
1 class Programa
2 {
3
static void Main ()
4
{
5
System . Console . WriteLine ( " K19 " ) ;
6
System . Console . WriteLine ( " Lgica de Programao em C # " ) ;
7
}
8 }
Cdigo C# 1.20: Programa.cs
Para visualizar facilmente a organizao dos blocos (trechos delimitados por chaves), o cdigo
fonte deve ser indentado. A indentao consiste em deixar uma certa quantidade de espaos em
branco ou tabulaes no comeo de cada linha.
No exemplo acima, as linhas 5 e 6 esto dentro do corpo do mtodo Main que por sua vez est
dentro do corpo da classe Programa. Por isso, essas duas linhas foram indentadas com duas tabulaes. As linhas 3, 4 e 7 esto dentro do corpo da classe Programa mas no esto dentro do corpo do
mtodo Main. Por isso, essas trs linhas foram indentadas com apenas uma tabulao.
Um cdigo corretamente indentado mais fcil de ler. Consequentemente, a sua manuteno se
torna mais simples.
Mais Sobre
Voc pode verificar a conveno de indentao da linguagem C# definida pela Microsoft no seguinte endereo:
http://msdn.microsoft.com/en-us/library/ff926074.aspx
22
www.k19.com.br
23
I NTRODUO
A engenharia reversa tambm aplicada na rea de software. As instrues do cdigo de mquina de um programa podem ser traduzidas para alguma linguagem de programao atravs de
programas especiais que so chamados de decompiladores.
Normalmente, o cdigo em linguagem de programao gerado a partir da decompilao do cdigo de mquina de um programa no fcil de entender. Geralmente, possvel, apesar de normalmente ser muito difcil, modificar o funcionamento de um programa para qualquer que seja o
propsito utilizando a abordagem da engenharia reversa.
1.22 Ofuscadores
Para dificultar o processo de engenharia reversa, podemos utilizar ferramentas que modificam o
cdigo fonte ou o cdigo compilado com o intuito de prejudicar o processo de decompilao. Essas
ferramentas so chamadas de ofuscadores.
Na maior parte dos casos, a utilizao de ofuscadores torna invivel ou muito custosa a aplicao
de engenharia reversa com intuito de copiar ou piratear um software.
www.facebook.com/k19treinamentos
23
I NTRODUO
24
1 class Programa
2 {
3
static void Main ()
4
{
5
// instrues
6 }
Cdigo C# 1.21: Programa.cs
1 class Programa
2 {
3
static void Main ()
4
{
5
// instrues
Cdigo C# 1.22: Programa.cs
24
www.k19.com.br
25
I NTRODUO
6
}
7 }
Cdigo C# 1.24: HelloWorld.cs
Observe que no cdigo C# acima, o mtodo Main foi definido com letra minscula. Contudo, no
C#, o correto com maiscula. Ao compilar o cdigo, o seguinte erro exibido.
error CS5001 : O programa c :\ Users \ K19 \ introducaoHelloWorld . exe no contm um mtodo Main
static adequado para um ponto de entrada
www.facebook.com/k19treinamentos
25
I NTRODUO
26
1.31 Resumo
1
26
www.k19.com.br
27
9
I NTRODUO
10
Algumas unidades de medida para dados binrios do padro IEC 80000-13 so: bit, byte (B),
kibibyte (KiB), mebibyte (MiB), gibibyte (GiB) e tebibyte (TiB).
11
Algumas unidades de medida para dados binrios do SI so: bit, byte (B), kilobyte (kB), megabyte (MB), gigabyte (GB) e terabyte (TB).
12
13
14
15
16
17
18
19
20
21
Todo programa necessita de um ponto de partida. O ponto de partida dos programas escritos
em C# a primeira instruo do mtodo Main.
22
23
www.facebook.com/k19treinamentos
27
I NTRODUO
28
24
25
26
27
Em C#, o mtodo WriteLine utilizado para exibir mensagens com quebra de linha na sada
padro.
28
28
Em C#, o mtodo Write utilizado para exibir mensagens sem quebra de linha na sada padro.
www.k19.com.br
CAPTULO
VARIVEIS
numeroDaConta = 4823
MEMRIA RAM
4823
numeroDaConta
MEMRIA RAM
A Figura 2.1 ilustra o processo de armazenamento do valor 4823 na varivel numeroDaConta. Essa
varivel est associada terceira posio da memria RAM. Lembre-se que esse valor armazenado
em formato binrio.
www.facebook.com/k19treinamentos
29
VARIVEIS
30
a varivel saldo do tipo double e a varivel contaAtiva do tipo bool. Os tipos dessas variveis foram
definidos explicitamente.
1 int numeroDaConta ;
2 double saldo ;
3 bool contaAtiva ;
Cdigo C# 2.1: Declarao de variveis
Duas ou mais variveis de um mesmo tipo podem ser declaradas na mesma instruo. Nesse
caso, o tipo deve ser definido apenas uma vez. Os nomes das variveis devem ser separados por
vrgula. No exemplo abaixo, trs variveis do tipo double foram declaradas: saldo, limite e taxa.
1 double saldo , limite , taxa ;
Cdigo C# 2.2: Declarao de duas ou mais variveis na mesma instruo
Toda varivel deve ser inicializada antes de sua utilizao. O processo de inicializao consiste
em atribuir a uma varivel o seu primeiro valor. No exemplo abaixo, a varivel numeroDaConta foi declarada na linha 1 e inicializada com o valor 3466 na linha 2.
1 int numeroDaConta ;
2 numeroDaConta = 3466;
Cdigo C# 2.3: Declarao e inicializao de uma varivel
Tambm possvel declarar e inicializar uma varivel em apenas uma linha. No exemplo abaixo,
a varivel numeroDaConta foi declarada e inicializada com o valor 3466 na linha 1.
1 int numeroDaConta = 3466;
Cdigo C# 2.4: Declarao e inicializao de uma varivel
Quando uma varivel local declarada e inicializada em uma nica instruo, o tipo dessa varivel pode ser definido implicitamente. Para isso, basta utilizar a palavra chave var. No exemplo abaixo,
o tipo da varivel numeroDaConta foi definido implicitamente devido a utilizao da palavra chave var.
Como a varivel numeroDaConta foi inicializada com um valor do tipo int, ela ser do tipo int.
1 var numeroDaConta = 3466;
Cdigo C# 2.5: Declarao e inicializao de uma varivel com o comando var
30
www.k19.com.br
31
VARIVEIS
provoca muitos erros de lgica. Em C#, esse problema no existe pois as variveis devem sempre
ser inicializadas antes de serem utilizadas.
Na primeira linha, o valor armazenado na varivel numero exibido na sada padro. Na segunda
linha, o texto numero exibido na sada padro.
Alterar o valor armazenado em uma varivel no afeta o valor armazenado em uma outra varivel. No exemplo abaixo, a varivel a foi inicializada com o valor 1 e a varivel b foi inicializada com
uma cpia do valor armazenado na varivel a. Depois, os valores armazenados nessas duas variveis
foram modificados. A varivel a recebeu o valor 2 e a varivel b recebeu o valor 3. Lembre-se que alterar o valor da varivel a no afeta o valor armazenado na varivel b e vice-versa. Portanto, ao exibir
os valores armazenados nessas variveis, os nmeros 2 e 3 sero apresentados na sada padro.
1
2
3
4
5
6
7
8
9
10
11
int a = 1;
int b = a ;
a = 2;
b = 3;
System . Console . WriteLine ( a ) ; // exibe o valor 2
System . Console . WriteLine ( b ) ; // exibe o valor 3
www.facebook.com/k19treinamentos
31
VARIVEIS
32
Simulao
Para ilustrar a cpia de valores de variveis, simularemos a execuo de um programa em C#.
A execuo iniciada na primeira linha do mtodo Main. Assim, a execuo comea na linha 5
do cdigo abaixo. A instruo dessa linha declara a varivel a do tipo int e a inicializa com o valor 2.
1
1 class Variavel
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = a ;
7
System . Console . WriteLine ( a ) ;
8
System . Console . WriteLine ( b ) ;
9
}
10 }
a=2
2
Em seguida, a linha 6 executada. Nessa linha, declarada a varivel b do tipo int e seu valor
inicializado com o valor armazenado na varivel a.
1 class Variavel
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = a ;
7
System . Console . WriteLine ( a ) ;
8
System . Console . WriteLine ( b ) ;
9
}
10 }
a=2
b=2
Seguindo o fluxo de execuo, a linha 7 executada. A instruo dessa linha exibe na sada
padro o valor armazenado na varivel a. Assim, o nmero 2 exibido na sada padro.
3
1 class Variavel
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = a ;
7
System . Console . WriteLine ( a ) ;
8
System . Console . WriteLine ( b ) ;
9
}
10 }
a=2
b=2
4
Em seguida, a linha 8 executada. A instruo dessa linha exibe na sada padro o valor armazenado na varivel b.
32
www.k19.com.br
33
VARIVEIS
1 class Variavel
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = a ;
7
System . Console . WriteLine ( a ) ;
8
System . Console . WriteLine ( b ) ;
9
}
10 }
a=2
b=2
2
2
Tipo
Intervalo
Espao
sbyte
Inteiro
De -128 a 127
1 byte
byte
Inteiro
De 0 a 255
1 byte
short
Inteiro
De -32768 a 32767
2 bytes
ushort
Inteiro
De 0 a 65535
2 bytes
int
Inteiro
De -2147483648 a 2147483647
4 bytes
uint
Inteiro
De 0 a 4294967295
4 bytes
long
Inteiro
De -9223372036854775808 a 9223372036854775807
8 bytes
ulong
Inteiro
De 0 a 18446744073709551615
8 bytes
char
Inteiro
De 0 a 65535
2 bytes
38
float
Real
Aproximadamente de 3.4 10
double
Real
a 3.4 10
38
a 7.9 10
28
decimal
Real
Aproximadamente de 7.9 10
bool
Booleano
4 bytes
8 bytes
16 bytes
1 byte
Numricos: sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double e decimal.
Inteiros: sbyte, byte, short, ushort, int, uint, long, ulong e char.
Reais: float, double e decimal.
Booleano: bool.
www.facebook.com/k19treinamentos
33
VARIVEIS
34
Mais Sobre
O tipo float e o tipo double aceitam tambm os valores Infinity, 0 e NaN (Not
a Number). Os valores Infinity so representados pelas constantes float.NegativeInfinity,
float.PositiveInfinity, double.NegativeInfinity e double.PositiveInfinity. O valor NaN representado pelas constantes float.NaN e double.NaN. Veremos mais sobre esses valores adiante.
BigInteger
Para armazenar nmeros inteiros que extrapolam os intervalos de valores dos tipos simples numricos, podemos utilizar o tipo BigInteger.
http://msdn.microsoft.com/en-us/library/system.numerics.biginteger
Qualquer nmero aceito por um tipo simples inteiro pode ser armazenado em uma varivel do
tipo BigInteger. Alm desses valores, o tipo BigInteger capaz de armazenar muitos outros. Assim,
algum poderia argumentar que optar por uma varivel do tipo BigInteger sempre a melhor escolha.
No entanto, o uso de BigInteger tem algumas desvantagens em relao ao uso dos tipos simples
inteiros. Uma delas que uma varivel do tipo BigInteger ocupa mais espao. Alm disso, operaes
envolvendo os valores armazenados em variveis do tipo BigInteger so consideravelmente mais lentas do que as operaes envolvendo os tipos simples inteiros.
Analogia
M
K
P B 0O
K X
E 8
T
80
E
1
B
Y
K
19
34
www.k19.com.br
35
VARIVEIS
Tipo
sbyte
byte
short
ushort
int
uint
long
ulong
char
float
double
decimal
Mnimo
sbyte.MinValue
byte.MinValue
short.MinValue
ushort.MinValue
int.MinValue
uint.MinValue
long.MinValue
ulong.MinValue
char.MinValue
float.MinValue
double.MinValue
decimal.MinValue
Mximo
sbyte.MaxValue
byte.MaxValue
short.MaxValue
ushort.MaxValue
int.MaxValue
uint.MaxValue
long.MaxValue
ulong.MaxValue
char.MaxValue
float.MaxValue
double.MaxValue
decimal.MaxValue
Tabela 2.2: Constantes para os valores mnimos e mximos dos tipos simples
Por exemplo, para exibir o maior valor que uma varivel do tipo int pode armazenar, podemos
utilizar o seguinte cdigo.
1 System . Console . WriteLine (2147483647) ;
Contudo, algum que venha a ler esse cdigo pode no reconhecer esse nmero como sendo o
maior valor do tipo int. Uma situao como essa pode comprometer o entendimento do cdigo por
parte do leitor. Para melhorar a legibilidade do cdigo, podemos utilizar a constante int.MaxValue.
1 System . Console . WriteLine ( int . MaxValue ) ;
Mais Sobre
A propriedade Epsilon dos tipos float e double armazena o menor valor positivo que
esses tipos podem armazenar.
Nmeros inteiros
Nmeros inteiros podem ser armazenados em variveis dos tipos sbyte, byte, short, ushort, int,
uint, long ou ulong. Basicamente, para escolher o tipo mais apropriado, devemos considerar a grandeza dos nmeros que desejamos armazenar.
Por exemplo, considere a numerao dos andares de um prdio. Nesse prdio, h 3 subsolos
numerados com -1, -2 e -3, o trreo numerado com 0 e os outros 20 andares com os nmeros
de 1 a 20. Precisamos armazenar o nmero de um andar qualquer desse prdio. De acordo com a
Tabela 2.1, o tipo sbyte aceita valores entre -128 e 127. Portanto, o tipo sbyte uma escolha adequada
para a nossa varivel.
Atualmente, os motores dos automveis comuns no ultrapassam 10.000 RPM (rotaes por minuto). Dessa forma, possvel armazenar a rotao mxima de um automvel em uma varivel do
tipo short.
www.facebook.com/k19treinamentos
35
VARIVEIS
36
No livro O crebro feminino, a neuropsiquiatra Louann Brizendine afirmou que, em mdia, uma
mulher fala 20 mil palavras por dia. Vamos considerar que, em um dia atpico, uma mulher pode falar
cerca de 40 mil palavras. Dessa forma, para armazenar a quantidade de palavras que uma mulher
fala em um dia, seria razovel utilizar uma varivel do tipo int.
Atualmente, a populao mundial de aproximadamente 7 bilhes de pessoas. Para armazenar
esse valor, devemos utilizar uma varivel do tipo long.
Na Tabela 2.1, voc pode verificar que a quantidade de espao ocupado por uma varivel depende do seu tipo. Para diminuir a quantidade de memria RAM utilizada, podemos priorizar o uso
dos tipos que ocupam menos espao.
Nmeros reais
Nmeros reais podem ser armazenados em variveis dos tipos float, double e decimal. Para escolher o tipo mais apropriado, devemos considerar a grandeza e a preciso dos nmeros que desejamos
armazenar. O tipo double permite armazenar valores de maior grandeza e de maior preciso quando
comparado ao tipo float. O tipo decimal permite armazenar valores com maior preciso mas com
menor grandeza quando comparado aos tipos double e float.
O menor valor que pode ser representado pelo tipo double aproximadamente 1.7 10308 e
o maior aproximadamente 1.7 10308 . A quantidade de valores reais entre esses dois nmeros
infinita. Contudo, o tipo double permite apenas a representao de uma quantidade finita de valores
nesse intervalo.
Por exemplo, o nmero 1 pode ser representado em double. Depois do nmero 1, o prximo valor
que pode ser representado em double 1.0000000000000002220446049250313080847263336181640625
(esse valor igual a 1 + 252 ). Depois desse nmero, o prximo nmero que pode ser representado
1.000000000000000444089209850062616169452667236328125 (que igual a 1 + 251 ).
De maneira geral, um valor que no pode ser representado em double substitudo pelo valor
mais prximo que pode ser representado. Por exemplo, o nmero 1.0000000000000003 no pode ser
representado em double. Assim, esse nmero substitudo pelo valor mais prximo que pode ser
representado em double, que 1.0000000000000002220446049250313080847263336181640625.
O tipo float funciona de forma anloga ao tipo double. O menor valor do tipo float aproximadamente 3.4 1038 e o maior aproximadamente 3.4 1038 .
O valor especial NaN (Not-a-Number) representa o resultado de algumas operaes invlidas
envolvendo valores do tipo float ou do tipo double. O valor especial Infinity representa o infinito. O
resultado de algumas operaes envolvendo valores do tipo float ou do tipo double pode ser +Infinity
ou Infinity.
Armadilha
Ao exibir nmeros com muitas casas decimais, o mtodo WriteLine realiza arredondamentos. No exemplo abaixo, ao tentar exibir o valor 1.0000000000000003, o mtodo WriteLine
exibe o valor 1.
1 System . Console . WriteLine (1.0000000000000003) ; // exibe 1
36
www.k19.com.br
37
VARIVEIS
O tipo decimal funciona de forma anloga aos tipos double e float. O menor valor do tipo decimal
aproximadamente 7.9 1028 e o maior aproximadamente 7.9 1028 . Como vimos, a vantagem
do tipo decimal em relao aos tipos float e double a preciso. Por exemplo, o valor 0.1 pode ser
representado em decimal mas no pode ser representado em float ou double. Por outro lado, a desvantagem do tipo decimal em relao aos tipos float e double a grandeza. Por exemplo, no podemos
representar nmeros superiores a 7.9 1028 com o tipo decimal mas podemos com os tipos float ou
double.
Curiosidade
No dia 25 de Fevereiro de 1991, em Dhahran, na Arbia Saudita, durante a Guerra do
Golfo, o sistema antimssil americano chamado Patriot falhou e no conseguiu interceptar um
mssil iraquiano. Esse mssil atingiu o seu alvo, um alojamento americano. No total, 28 soldados
americanos morreram e outras 100 pessoas ficaram feridas.
A falha ocorreu devido a um problema de preciso numrica no software que controlava o sistema Patriot. O sistema Patriot possui um relgio interno que armazena em dcimos de segundos o tempo de funcionamento do equipamento desde a sua ltima inicializao. O software multiplicava esse valor por 0.1 para obter o tempo de funcionamento do equipamento em
segundos. O resultado dessa multiplicao era utilizado para calcular a trajetria dos msseis
que deveriam ser interceptados.
Contudo, o formato numrico utilizado pelo software para armazenar o valor 0.1 o Ponto Fixo
de 24 bits. Esse valor no pode ser representado nesse formato. Sendo assim, o software realizava os clculos com o valor mais prximo que pode ser representado em Ponto Fixo de 24 bits.
Para ser mais especfico, o software realizava os clculos com o valor 0.099999904632568359375.
Depois de 100 horas de funcionamento, essa falta de preciso causava um desvio de aproximadamente 687 metros nos clculos das trajetrias do msseis. Isso causou a falha do dia 25 de
Fevereiro de 1991.
Oficiais das foras armadas americanas disseram que uma verso corrigida do software foi finalizada no dia 16 de Fevereiro de 1991. Mas, essa verso s chegou em Dhahran no dia 26 de
Fevereiro de 1991. Ou seja, um dia depois da falha fatal.
Se esse software tivesse sido desenvolvido com a linguagem de programao C#, o problema
descrito acima poderia ser resolvido com a utilizao do tipo decimal. O valor 0.1 pode ser representado no formato adotado pelo tipo decimal.
Verdadeiro ou falso
Variveis do tipo bool podem armazenar o valor true (verdadeiro) ou o valor false (falso). No
podemos armazenar nmeros em variveis do tipo bool.
Caracteres
Tecnicamente, uma varivel do tipo char armazena um nmero inteiro entre 0 e 65.535. Contudo,
o valor armazenado em um varivel do tipo char representa o cdigo de um caractere de acordo com
www.facebook.com/k19treinamentos
37
VARIVEIS
38
2.7 String
Na linguagem C#, o tipo string um dos mais importantes e mais utilizados. O tipo string usado
para armazenar texto (sequncia de caracteres). No exemplo abaixo, a varivel texto do tipo string
foi associada sequncia de caracteres K19 Treinamentos.
1 string texto = " K19 Treinamentos " ;
Cdigo C# 2.17: Utilizando o tipo string
Qualquer caractere definido na codificao UTF-16 do padro Unicode pode ser utilizado para
formar uma string.
O espao utilizado por uma string depende da quantidade de caracteres que ela possui. Cada
caractere ocupa 16 bits. Portanto, a string K19 Treinamentos, que possui 16 caracteres (o caractere
espao tambm deve ser contabilizado), ocupa 256 bits.
O tipo string permite o armazenamento o valor null.
38
www.k19.com.br
39
VARIVEIS
java.util.Calendar c = new java.util.GregorianCalendar( 1982 ,
Ano
11 ,
Ms (0 ~ 11)
12 ,
Dia (1 ~ 31)
10 ,
Hora (0 ~ 23)
5 ,
Minuto (0 ~ 59)
30 )
Segundo (0 ~ 59)
No exemplo acima, o primeiro parmetro define o ano; o segundo o ms; o terceiro o dia; o
quarto a hora; o quinto os minutos; e o sexto os segundos. Dessa forma, a data 12 de Dezembro de
1982 e hora 10:05:30 foram associadas varivel c.
Null
Considere um programa que utiliza uma varivel do tipo double? para armazenar a variao do
Dlar em relao ao Real. Essa varivel deve ser atualizada diariamente.
1 double ? variacao ;
No dia 30 de Abril de 2014, a variao foi de 0, 139%. Ento, nesse dia, o valor 0.139 foi armazenado na varivel variacao.
1 variacao = -0.139;
No dia seguinte, 1 de Maio de 2014, devido ao feriado internacional do dia do trabalho, o mercado
financeiro no funcionou. Dessa forma, a cotao do Dlar em relao ao Real no sofreu alterao.
Nesse dia, qual valor deveria ser armazenado na varivel variacao?
Provavelmente, nesse caso, o mais intuitivo seria utilizar o valor 0. Contudo, a utilizao desse
valor gera uma ambiguidade. A varivel variacao armazenaria o valor 0 quando o mercado financeiro
no funciona, ou seja, nos sbados, domingos, feriados e datas extraordinrias. Mas, tambm armazenaria o valor 0 quando as operaes financeiras realizadas em um determinado dia no alteram a
cotao do Dlar em relao ao Real. Se o programa precisa diferenciar essas duas situaes, o valor
0 no pode ser utilizado para esses dois casos.
Para resolver esse problema, nos dias em que o mercado financeiro no funciona, o valor null
poderia ser armazenado na varivel variacao. O null um valor especial que representa o vazio.
1 variacao = null ;
www.facebook.com/k19treinamentos
39
VARIVEIS
40
Importante
As variveis de tipos simples no aceitam o valor null. Mas, os nullable types correspondentes aos tipos simples aceitam.
Se a palavra chave null for definida dentro de aspas dupla, a varivel nome seria associada
sequncia de caracteres null e no armazenaria o valor null.
1 string nome = " null " ;
Booleanos
O valor verdadeiro representado pelo valor literal true e o valor falso pelo valor literal false.
1 bool a = true ;
2 bool b = false ;
Cdigo C# 2.24: Utilizando valores literais booleanos
Inteiros
Nmeros inteiros podem ser escritos nos formatos decimal e hexadecimal. A representao de
um nmero em cada um desses formatos uma sequncia composta por um ou mais dgitos. No
formato decimal, so usados os dgitos de 0 a 9. J no formato hexadecimal, so usados os dgitos de
0 a 9 e as letras de A a F. A letra A corresponde ao valor 10, a letra B corresponde ao valor 11 e assim
sucessivamente. A Tabela 2.3 apresenta os nmeros inteiros de 0 a 21 representados em cada um
desses formatos.
40
www.k19.com.br
41
VARIVEIS
Decimal
0
1
2
3
4
5
6
7
8
9
10
Hexadecimal
0
1
2
3
4
5
6
7
8
9
A
Decimal
11
12
13
14
15
16
17
18
19
20
21
Hexadecimal
B
C
D
E
F
10
11
12
13
14
15
Em C#, valores literais inteiros podem ser escritos no cdigo fonte em decimal ou hexadecimal.
Mas como podemos observar na Tabela 2.3, o nmero 10 em formato decimal tem a mesma representao que o nmero 16 em formato hexadecimal. Para diferenci-los, a linguagem C# define
algumas regras.
Para utilizar o formato hexadecimal, devemos acrescentar o prefixo 0x ou o prefixo 0X.
Qualquer outra sequncia formada por dgitos de 0 a 9 estar no formato decimal.
No cdigo abaixo, o nmero 19 atribudo a variveis do tipo int utilizando os formatos decimal
e hexadecimal.
1
2
3
4
5
// 19 em decimal
int c = 19;
// 19 em hexadecimal
int d = 0 x13 ;
Cdigo C# 2.25: Nmero 19 nos formatos decimal e hexadecimal
Por padro, o tipo de um valor literal inteiro ser o primeiro dos seguintes tipos no qual esse
valor pode ser representado: int, uint, long e ulong. Por exemplo, o valor 1000000000 (1 bilho) pode
ser representado com o tipo int. Portanto, ele ser do tipo int. O valor 4000000000 (4 bilhes) no
pode ser representado com o tipo int mas pode ser representado com o tipo uint. Portanto, ele ser
do tipo uint. O valor 10000000000 (10 bilhes) no pode ser representado com o tipo uint mas pode
ser representado com o tipo long. Portanto, ele ser do tipo long. O valor 10000000000000000000
(10 quinquilhes) no pode ser representado com o tipo long mas pode ser representado com o tipo
ulong. Portanto, ele ser do tipo ulong.
O tipo de um valor literal inteiro terminado com o sufixo U (u maisculo) ou u (u minsculo) ser
o primeiro dos seguintes tipos no qual esse valor pode ser representado: uint e ulong. Por exemplo, o
valor 1000000000U (1 bilho) pode ser representado com o tipo uint. Portanto, ele ser do tipo uint.
O valor 10000000000000000000U (10 quinquilhes) no pode ser representado com o tipo uint mas
pode ser representado com o tipo ulong. Portanto, ele ser do tipo ulong.
Agora, o tipo de um valor literal inteiro terminado com o sufixo L (le maisculo) ou l (le minsculo) ser o primeiro dos seguintes tipos no qual esse valor pode ser representado: long e ulong. Por
www.facebook.com/k19treinamentos
41
VARIVEIS
42
exemplo, o valor 1000000000L (1 bilho) pode ser representado com o tipo long. Portanto, ele ser do
tipo long. O valor 10000000000000000000L (10 quinquilhes) no pode ser representado com o tipo
long mas pode ser representado com o tipo ulong. Portanto, ele ser do tipo ulong.
Por fim, um valor literal inteiro terminado com um dos seguintes sufixos: UL, Ul, uL, ul, LU, Lu,
lU ou lu ser do tipo ulong.
Reais
Valores literais reais so definidos com o separador de casas decimais . (ponto). Veja alguns
exemplos:
1 double a = 19.19;
2
3 double b = 0.19;
4
5 double c = .19;
Cdigo C# 2.26: Valores literais reais
Para resolver esse problema, devemos utilizar o sufixo F (fe maisculo) ou f (fe minsculo). Ao
utilizar um desses sufixos, indicamos ao compilador que o valor literal real deve ser tratado como
float.
1 float a = 19.09 F ;
2
3 float b = 19.09 f ;
Cdigo C# 2.28: Utilizando o sufixo F e f
De forma anloga, podemos indicar que um valor literal do tipo decimal utilizando o sufixo M
(eme maisculo) ou m (eme minsculo).
Para indicar que um valor literal do tipo double, podemos utilizar o sufixo D (d maisculo) ou
d (d minsculo). Esses sufixos so redundantes para valores literais reais pois, por padro, esses
valores j so do tipo double.
Tambm podemos definir valores literais reais na forma exponencial. No exemplo abaixo, a varivel a foi inicializada com o valor 1.74e3. Esse valor o resultado da multiplicao do nmero
esquerda do caractere e ( minsculo) por 10 elevado ao nmero direita do caractere e ( minsculo). Em outras palavras, esse valor igual a 1.74 103 , ou seja, igual a 1740.
1 double a = 1.74 e3 ; // 1740 na forma exponencial
Cdigo C# 2.29: Forma exponencial
42
www.k19.com.br
43
VARIVEIS
Caracteres
Caracteres literais so definidos dentro de aspas simples. No exemplo abaixo, a varivel a foi
inicializada com o cdigo numrico do caractere K.
1 char a = K ;
Cdigo C# 2.31: Caracteres literais
O cdigo do caractere K 75. Dessa forma, tecnicamente, a varivel a do exemplo acima armazena o valor 75.
Importante
Apenas um caractere pode ser definido dentro de aspas simples.
Importante
Para definir os caracteres \, e " (barra invertida, aspas simples e aspas duplas), devemos acrescentar uma \ (barra invertida) frente desses caracteres. Assim, devemos utilizar as
sequncias de escape \\, \ e \". Veja o exemplo a seguir.
1 char a = \\ ;
2
3 char b = \ ;
4
5 char c = \ " ;
A quantidade de caracteres definidos pela codificao UTF-16 do padro Unicode muito maior
do que a quantidade de teclas do seu teclado. Dessa forma, voc no pode digitar a maior parte dos
caracteres aceitos pela linguagem C#.
Para definir caracteres que no esto associados s teclas do seu teclado, voc pode utilizar o
cdigo de cada caractere. Por exemplo, para definir o caractere (mega), podemos utilizar o cdigo
937.
No exemplo abaixo, utilizamos o valor \u03A9 dentro de aspas simples. O nmero direita do
caractere u (u minsculo) o cdigo do caractere desejado em notao hexadecimal com 4 dgitos.
1 char b = \ u03A9 ; // 937 em notao hexadecimal com 4 dgitos
Cdigo C# 2.33: Utilizando o cdigo dos caracteres
Tambm podemos utilizar o prefixo \x em conjunto com o cdigo hexadecimal do caractere desejado.
www.facebook.com/k19treinamentos
43
VARIVEIS
44
Strings
Strings literais so definidas dentro de aspas duplas. No exemplo abaixo, a varivel a foi associada
sequncia de caracteres K19 Treinamentos.
1 string a = " K19 Treinamentos " ;
Cdigo C# 2.35: Strings literais
Para simplificar, uma string literal uma sequncia de caracteres literais dentro de aspas duplas.
Importante
Para utilizar os caracteres \ e " (barra invertida e aspas duplas) dentro de uma string,
devemos usar as sequncias de escape \\ e \", respectivamente.
No exemplo abaixo, ocorre um erro de compilao.
1 string a = " C :\ k19 \ rafael \ cosentino " ;
Cdigo C# 2.36: Erro de compilao
2.10 Constantes
Podemos utilizar a palavra reservada const para declarar constantes. Uma constante como uma
varivel cujo contedo no pode ser alterado. No exemplo abaixo, a constante a do tipo int foi declarada com o uso da palavra reservada const e inicializada com o valor 10. Esse valor no pode ser mais
alterado.
1 const int a = 10;
Por exemplo, no cdigo abaixo, a constante a foi inicializada com o valor 10. Depois dessa inicializao, na tentativa de trocar o valor dessa constante, um erro de compilao gerado.
44
www.k19.com.br
45
VARIVEIS
A inicializao de uma constante precisa ser realizada junto com a sua declarao.
1 const int a ; // erro de compilao
Cdigo C# 2.41: Declarando uma constante sem inicializ-la
Podemos adaptar o intervalo dos nmeros gerados com algumas operaes matemticas. Suponha que voc queira gerar aleatoriamente um nmero que seja maior ou igual a um certo valor
mnimo e menor do que um certo valor mximo. O cdigo abaixo exemplifica como essa tarefa pode
ser feita.
1
2
3
4
5
A classe Random tambm possui o mtodo Next, que gera um nmero inteiro no negativo aleatrio menor do que um determinado valor. No exemplo abaixo, usamos esse mtodo para gerar um
nmero inteiro aleatrio entre 0 e 10.
1 int limite = 11;
2
3 // 0 <= numero < limite
4 int numero = gerador . Next ( limite ) ;
Cdigo C# 2.44: Gerando nmeros inteiros aleatrios
Simulao
Vamos simular a execuo de um programa em C# que gera um nmero aleatrio atravs do
mtodo NextDouble e o exibe na sada padro.
www.facebook.com/k19treinamentos
45
VARIVEIS
46
A execuo inicia na primeira linha do mtodo Main. Assim, a execuo comea na linha 5 do
cdigo abaixo. A instruo dessa linha cria um objeto capaz de gerar nmeros aleatrios.
1
1 class NumeroAleatorio
2 {
3
static void Main ()
4
{
5
System . Random gerador = new System . Random () ;
6
double a = gerador . NextDouble () ;
7
System . Console . WriteLine ( a ) ;
8
}
9 }
Agora, o fluxo de execuo segue para a linha 6. A instruo dessa linha declara a varivel a do
tipo double e a inicializa com o valor devolvido pelo mtodo NextDouble.
2
1 class NumeroAleatorio
2 {
3
static void Main ()
4
{
5
System . Random gerador = new System . Random () ;
6
double a = gerador . NextDouble () ;
7
System . Console . WriteLine ( a ) ;
8
}
9 }
a = 0.87
Em seguida, a linha 7 executada. A instruo presente nessa linha exibe o valor da varivel a na
sada padro.
3
1 class NumeroAleatorio
2 {
3
static void Main ()
4
{
5
System . Random gerador = new System . Random () ;
6
double a = gerador . NextDouble () ;
7
System . Console . WriteLine ( a ) ;
8
}
9 }
a = 0.87
0.87
Voc consegue deduzir quais dados sero armazenados nas variveis j, f e m? Provavelmente, no.
Vamos melhorar um pouco os nomes dessas variveis.
1 int jan ;
46
www.k19.com.br
47
VARIVEIS
2 int fev ;
3 int mar ;
Agora, talvez, voc tenha uma vaga ideia. Vamos melhorar mais um pouco os nomes dessas
variveis.
1 int janeiro ;
2 int fevereiro ;
3 int marco ;
Agora sim! Voc j sabe para que servem essas variveis? Se voc parar para pensar ainda no
sabe muita coisa sobre elas. Ento, importante melhorar mais uma vez o nome dessas variveis.
1 int numeroDePedidosEmJaneiro ;
2 int numeroDePedidosEmFevereiro ;
3 int numeroDePedidosEmMarco ;
Finalmente, os nomes das variveis conseguem expressar melhor a inteno delas. Consequentemente, a leitura e o entendimento do cdigo fonte seria mais fcil.
Geralmente, bons nomes de variveis so compostos por vrias palavras como no exemplo a
seguir.
1 int numeroDeCandidatosAprovados ;
Quando o nome de uma varivel composto, fundamental adotar alguma conveno para
identificar o incio e o trmino das palavras. A separao natural das palavras na lngua portuguesa
so os espaos. Contudo, os nomes das variveis em C# no podem possuir espaos. No adotar
uma conveno de nomenclatura para identificar o incio e o termino das palavras como escrever
um texto em portugus sem espaos entre as palavras. Em alguns casos, o leitor no saberia como
separar as palavras. Considere o exemplo abaixo.
salamesadia
O que est escrito no texto acima? A resposta depende da diviso das palavras. Voc pode ler
como sala mesa dia ou salame sadia. Dessa forma, fica clara a necessidade de deixar visualmente
explcita a diviso das palavras.
Em algumas linguagens de programao, delimitadores so utilizados para separar as palavras
que formam o nome de uma varivel.
numero_de_candidatos_aprovados;
numero-de-candidatos-aprovados;
Em outras linguagens de programao, letras maisculas e minsculas so utilizadas para separar as palavras.
NumeroDeCandidatosAprovados;
numeroDeCandidatosAprovados;
www.facebook.com/k19treinamentos
47
VARIVEIS
48
Em C#, a conveno de nomenclatura adotada para separar as palavras que formam o nome de
uma varivel o Camel Case, que consiste em escrever o nome da varivel com a primeira letra de
cada palavra em maiscula com exceo da primeira letra da primeira palavra.
1 int numeroDaConta ; // segue a conveno
2 int Numerodaconta ; // no segue a conveno
Cdigo C# 2.53: Conveno para nomes de variveis
Tambm devemos nos lembrar que a linguagem C# case sensitive. Dessa forma, numeroDaConta
e Numerodaconta so consideradas variveis diferentes.
Importante
Considere um cdigo C# que declara uma varivel chamada pontuao. Note o uso dos
caracteres e no nome dessa varivel. Geralmente, os cdigos desses caracteres so diferentes em cada padro de codificao. Por exemplo, no UTF-8, o cdigo do caractere
50087, enquanto que no ISO-8859-1 231.
Suponha que esse cdigo tenha sido salvo em um arquivo que utiliza a codificao UTF-8. Se
ele for aberto em um editor que utiliza a codificao ISO-8859-1, o caractere no ser apresentado corretamente, dificultando a leitura ou a modificao do cdigo fonte.
Para evitar esse tipo de problema, a recomendao utilizar apenas as letras de A a Z (tanto
maisculas quanto minsculas) e os dgitos de 0 a 9 pois, geralmente, os cdigos desses caracteres no variam de codificao para codificao.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
48
// vlido
int numeroDaConta ;
// invlido pois o nome de uma varivel no pode comear com dgito
int 2 outraVariavel ;
// invlido pois o nome de uma varivel no pode ser igual a uma palavra reservada
double double ;
// invlido pois o nome de uma varivel no pode conter espaos
double saldo da conta ;
// vlido
int umaVariavelComUmNomeSuperHiperMegaUltraGigante ;
// vlido
www.k19.com.br
49
17
18
19
20
21
22
23
VARIVEIS
int numeroDaContaCom8Digitos_semPontos ;
// invlido pois o caractere # no considerado uma letra
int # telefone ;
// vlido pois apesar de ser igual a uma palavra reservada possui o prefixo @
int @static ;
Cdigo C# 2.54: Exemplos de nomes de variveis vlidos e invlidos
as
case
const
do
explicit
float
implicit
is
null
params
ref
sizeof
switch
typeof
ushort
while
base
catch
continue
double
extern
for
in
lock
object
private
return
stackalloc
this
uint
using
bool
char
decimal
else
false
foreach
int
long
operator
protected
sbyte
static
throw
ulong
virtual
break
checked
default
enum
finally
goto
interface
namespace
out
public
sealed
string
true
unchecked
void
www.facebook.com/k19treinamentos
49
VARIVEIS
50
50
www.k19.com.br
51
VARIVEIS
Programa . cs (5 ,12): error CS0029 : Cannot implicitly convert type string to
char
Agora, veja um exemplo de programa em C# que utiliza aspas simples onde deveria haver aspas
duplas.
1 class Programa
2 {
3
static void Main ()
4
{
5
string s = K19 Treinamentos ;
6
}
7 }
Cdigo C# 2.58: Programa.cs
www.facebook.com/k19treinamentos
51
VARIVEIS
52
5
int a = 19.09;
6
}
7 }
Cdigo C# 2.60: Programa.cs
1 class Programa
2 {
3
static void Main ()
4
{
5
decimal a = 3.14;
6
}
7 }
Cdigo C# 2.62: Programa.cs
52
www.k19.com.br
53
VARIVEIS
2.21 Resumo
1
Para armazenar um valor em uma varivel, esse valor deve ser compatvel com o tipo da vari-
vel.
A linguagem C# possui treze tipos simples: byte, sbyte, short, ushort, int, uint, long, ulong, float,
Uma varivel do tipo string pode ser associada a uma sequncia de caracteres.
10
Em C#, para trabalhar com datas e horas, podemos usar o tipo System.DateTime.
11
12
13
14
15
www.facebook.com/k19treinamentos
53
VARIVEIS
16
54
17
18
54
www.k19.com.br
CAPTULO
O PERADORES
3.1 Introduo
Para manipular os valores literais ou os dados armazenados nas variveis de uma aplicao, devemos utilizar os operadores oferecidos pela linguagem de programao que estamos utilizando. Os
principais tipos de operaes so:
Converses
Aritmticas (
Atribuies (
+=
Comparaes (
Lgicas (
&
*=
/=
-=
==
!=
<
&&
||
<=
!
%=
>
++
>=
? :
--
Agora, considere um nmero inteiro dentro do intervalo de valores do tipo long. No podemos
garantir que esse valor possa ser armazenado em uma varivel do tipo int porque o intervalo do tipo
long mais abrangente do que o intervalo do tipo int. Por exemplo, o nmero 2147483648 est no
intervalo do tipo long mas no est no intervalo do tipo int.
Por causa disso, no podemos copiar diretamente um valor armazenado em uma varivel do tipo
long para uma varivel do tipo int. A tentativa de realizar esse tipo de cpia gera erro de compilao
mesmo que o valor armazenado na varivel do tipo long seja compatvel com int. Veja o exemplo a
seguir.
www.facebook.com/k19treinamentos
55
O PERADORES
56
1 long a = 19;
2 int b = a ;
Cdigo C# 3.2: Erro de compilao - Incompatibilidade
Observe, na Tabela 3.1, a compatibilidade entre os tipos simples. Note, por exemplo, que um
valor do tipo int pode ser convertido automaticamente para long, float ou double. Por outro lado, um
valor do tipo long no pode ser convertido automaticamente para byte, short, char ou int.
Para
De
sbyte
byte
short
char
ushort
int
uint
long
ulong
float
double
decimal
sbyte
byte
short
char
ushort
int
uint
long
ulong
float
double
decimal
3
7
7
7
7
7
7
7
7
7
7
7
7
3
7
7
7
7
7
7
7
7
7
7
3
3
3
7
7
7
7
7
7
7
7
7
7
7
7
3
7
7
7
7
7
7
7
7
7
3
7
3
3
7
7
7
7
7
7
7
3
3
3
3
3
3
7
7
7
7
7
7
7
3
7
3
3
7
3
7
7
7
7
7
3
3
3
3
3
3
3
3
7
7
7
7
7
3
7
3
3
7
3
7
3
7
7
7
3
3
3
3
3
3
3
3
3
3
7
7
3
3
3
3
3
3
3
3
3
3
3
7
3
3
3
3
3
3
3
3
3
7
7
3
Para copiar o valor armazenado em uma varivel para outra varivel de um tipo incompatvel,
necessrio realizar uma operao de casting. Esse tipo de operao fora a converso dos valores.
No exemplo abaixo, o valor da varivel a, que do tipo long, foi copiado para a varivel b, que do
tipo int, com uma operao de casting.
1 long a = 19;
2 int b = ( int ) a ;
Cdigo C# 3.3: Casting
Operaes de casting podem gerar resultados indesejados. Considere que uma varivel do tipo
long armazena o valor 3000000000. Se uma operao de casting for aplicada para copiar esse valor
para uma varivel do tipo int, o valor obtido na cpia ser -1294967296.
1 long a = 3000000000;
2 int b = ( int ) a ; // b = -1294967296
Cdigo C# 3.4: Valores indesejados com casting
56
www.k19.com.br
57
O PERADORES
1 long a = 9223372036854775807;
2 float b = a ; // b = 9223372000000000000
Cdigo C# 3.5: Valores indesejados mesmo sem casting
O tipo bool no compatvel com os outros tipos simples. Alm disso, no possvel utilizar
operaes de casting para realizar converses de booleanos. No exemplo abaixo, a varivel a do
tipo int e a varivel b do tipo bool. A tentativa de copiar o valor da varivel b para a varivel c, que
do tipo int, com casting gera erro de compilao. Analogamente, a tentativa de copiar o valor da
varivel a para varivel d, que do tipo bool, com casting tambm gera erro de compilao.
1
2
3
4
5
6
7
int a = 10;
bool b = true ;
int c = ( int ) b ; // erro de compilao
bool d = ( bool ) a ; // erro de compilao
Cdigo C# 3.6: Converso de booleanos
Curiosidade
No dia 6 de Junho de 1996, a Agncia Espacial Europeia lanava o voo 501 do foguete
Ariane 5. O objetivo da misso era transportar satlites para o espao. Esses satlites seriam
utilizados para analisar o impacto da atividade solar sobre a atmosfera terrestre. O desenvolvimento desse projeto levou uma dcada e custou cerca de 7 bilhes de dlares.
O lanamento do foguete, no entanto, no ocorreu como o esperado. Em menos de um minuto
aps o incio do lanamento, o foguete desviou-se de sua trajetria e explodiu, causando um
prejuzo direto de cerca de 360 milhes de dlares.
A exploso foi causada por uma falha no software que controlava o foguete. Essa falha ocorreu
devido a uma operao de converso de um valor que estava no formato ponto flutuante de 64
bits para o formato inteiro de 16 bits. Como o valor era superior a 32767, ele no poderia ser
representado no formato inteiro de 16 bits. Dessa forma, o valor obtido na converso desencadeou uma falha no sistema de controle do foguete, levando sua exploso.
Fazendo um paralelo com a linguagem C#, esse problema poderia ocorrer na converso de um
valor do tipo double para um valor do tipo short.
www.facebook.com/k19treinamentos
57
O PERADORES
58
Nesses casos, necessrio realizar uma converso de string para int. Em C#, essa converso pode
ser realizada com o uso do mtodo ToInt32 da classe System.Convert. Confira o exemplo abaixo.
1 string a = " 19 " ;
2 int b = System . Convert . ToInt32 ( a ) ;
Cdigo C# 3.8: Converso de string para int
A Tabela 3.2 a seguir mostra os mtodos utilizados para converter valores do tipo string para
valores simples.
De string para
byte
sbyte
short
ushort
int
uint
long
ulong
float
double
decimal
bool
Mtodo
Convert.ToByte()
Convert.ToSByte()
Convert.ToInt16()
Convert.ToUInt16()
Convert.ToInt32()
Convert.ToUInt32()
Convert.ToInt64()
Convert.ToUInt64()
Convert.ToSingle()
Convert.ToDouble()
Convert.ToDecimal()
Convert.ToBoolean()
O mtodo ToBoolean() devolve true se a string passada como parmetro for igual a true independentemente das letras serem maisculas ou minsculas (por exemplo, TRUE, tRuE, etc). Caso
contrrio, esse mtodo devolve false se a string passada como parmetro for igual a false independentemente das letras serem maisculas ou minsculas (por exemplo, FALSE, fAlSe, etc). Caso
contrrio, um erro de execuo gerado.
Para os demais mtodos, se o argumento no respeitar as regras estabelecidas na documentao da plataforma .NET, um erro de execuo ser gerado. O cdigo abaixo exemplifica casos que
provocam erros de execuo.
1
2
3
4
5
// FormatException
System . Convert . ToByte ( " " ) ;
System . Convert . ToInt16 ( " abc " ) ;
System . Convert . ToInt32 ( " 18 + 1 " ) ;
System . Convert . ToDouble ( " K19 " ) ;
Cdigo C# 3.9: Erros de converso
58
www.k19.com.br
59
O PERADORES
Simulao
Veremos, a seguir, a simulao de um programa em C# para ilustrar alguns tipos de converses.
Ao executar a primeira linha do mtodo Main, uma varivel do tipo string chamada s ser criada
e associada sequncia de caracteres 3.14.
1
1 class Conversao
2 {
3
static void Main ()
4
{
5
string s = " 3.14 " ;
6
double d = System . Convert . ToDouble ( s ) ;
7
int i = ( int ) d ;
8
System . Console . WriteLine ( i ) ;
9
}
10 }
s = 3.14
2
Em seguida, na execuo da linha 6, o mtodo ToDouble da classe System.Convert converte a string
3.14 para um valor do tipo double. Esse valor armazenado na varivel d.
1 class Conversao
2 {
3
static void Main ()
4
{
5
string s = " 3.14 " ;
6
double d = System . Convert . ToDouble ( s ) ;
7
int i = ( int ) d ;
8
System . Console . WriteLine ( i ) ;
9
}
10 }
s = 3.14
d = 3.14
Na execuo da linha 7, o valor do tipo double armazenado na varivel d convertido para o tipo
int atravs de uma operao de casting. O valor obtido nessa converso armazenado na varivel
i. Como o tipo int no permite o armazenamento de casas decimais, o resultado da converso o
valor inteiro 3.
3
1 class Conversao
2 {
3
static void Main ()
4
{
5
string s = " 3.14 " ;
6
double d = System . Convert . ToDouble ( s ) ;
7
int i = ( int ) d ;
8
System . Console . WriteLine ( i ) ;
9
}
10 }
s = 3.14
d = 3.14
i=3
www.facebook.com/k19treinamentos
59
O PERADORES
60
1 class Conversao
2 {
3
static void Main ()
4
{
5
string s = " 3.14 " ;
6
double d = System . Convert . ToDouble ( s ) ;
7
int i = ( int ) d ;
8
System . Console . WriteLine ( i ) ;
9
}
10 }
s = 3.14
d = 3.14
i=3
Armadilha
Como a preciso dos tipos float e double limitada, algumas operaes aritmticas podem gerar valores incorretos. Por exemplo, o resultado da operao 0.9F - 0.8F
deveria ser 0.1. Contudo, na linguagem C#, nem o valor 0.9 e nem o valor 0.8 podem
ser representados em float ou double. Assim, valores aproximados so utilizados. O nmero 0.9 substitudo pelo valor 0.89999997615814208984375 e o nmero 0.8 substitudo
pelo valor 0.800000011920928955078125. Portanto, o resultado da operao no 0.1, mas
0.099999964237213134765625. O mtodo WriteLine exibe esse resultado arredondado.
1 System . Console . WriteLine (0.9 F - 0.8 F ) ; // exibe : 0.09999996
60
www.k19.com.br
61
O PERADORES
Mais Sobre
As operaes de potenciao, raiz quadrada e valor absoluto podem ser realizadas atravs dos mtodos System.Math.Pow, System.Math.Sqrt e System.Math.Abs.
1 System . Console . WriteLine ( System . Math . Pow (2 , 5) ) ; // exibe 32
2
3 System . Console . WriteLine ( System . Math . Sqrt (9) ) ; // exibe 3
4
5 System . Console . WriteLine ( System . Math . Abs ( -19.3) ) ; // exibe 19.3
Cdigo C# 3.16: Potenciao, raiz quadrada e valor absoluto
Mdulo
Em Matemtica, o mdulo de um nmero x o valor numrico de x desconsiderando o seu
sinal (valor absoluto). Por exemplo, o mdulo de 2 2 e expressamos esse valor da seguinte forma:
|2| = 2. Em C#, a palavra mdulo tem outro significado. Ela indica o resto da diviso de um nmero
por outro.
Podemos calcular o resto da diviso de um nmero por outro atravs do operador %. Por exemplo,
o resto da diviso do nmero 6 pelo nmero 5 1. Para calcul-lo, utilizamos a operao 6 % 5.
Nas operaes de mdulo, o sinal do resultado igual ao sinal do dividendo. Veja alguns exemplos abaixo.
1
2
3
4
Diviso por 0
Nas operaes de diviso ou de mdulo envolvendo nmeros inteiros, se o divisor for uma varivel que armazena o valor 0, o erro de execuo System.DivideByZeroException ocorrer.
1 int a = 0;
2 int b = 10 / a ; // Ocorrer DivideByZeroException
Por outro lado, nas operaes de diviso ou mdulo envolvendo pelo menos um nmero real, o
resultado ser Infinity, -Infinity ou NaN.
www.facebook.com/k19treinamentos
61
O PERADORES
62
Neste caso, poderamos aplicar uma operao de casting no resultado da operao b1 + b2.
1 byte b1 = 1;
2
3 byte b2 = 2;
4
5 byte b3 = ( byte ) ( b1 + b2 ) ;
Cdigo C# 3.22: Utilizando casting
Para saber o tipo do resultado de uma operao aritmtica, devemos aplicar as seguintes regras:
Se pelo menos um dos operandos for do tipo decimal, o resultado ser do tipo decimal.
Caso contrrio, se pelo menos um dos operandos for do tipo double, o resultado ser do tipo
double.
Caso contrrio, se pelo menos um dos operandos for do tipo float, o resultado ser do tipo
float.
Caso contrrio, se pelo menos um dos operandos for do tipo ulong, o resultado ser do tipo
ulong.
Caso contrrio, se pelo menos um dos operandos for do tipo long, o resultado ser do tipo long.
Caso contrrio, se um dos operandos for do tipo uint e o outro do tipo sbyte, short ou int, o
resultado ser do tipo long.
Caso contrrio, se pelo menos um dos operandos for do tipo uint, o resultado ser do tipo uint.
Caso contrrio, o resultado ser do tipo int.
De acordo com as regras acima, no exemplo a seguir, o resultado da operao a + b um valor do
tipo int. O resultado da operao b + c um valor do tipo double. Por fim, o resultado da operao a
+ c tambm um valor do tipo double.
1 byte a = 1;
2
62
www.k19.com.br
63
3
4
5
6
7
8
9
10
11
O PERADORES
short b = 2;
double c = 3.14;
int resutaldo1 = a + b ;
double resultado2 = b + c ;
double resultado3 = a + c ;
Cdigo C# 3.23: Determinando o tipo do resultado de uma operao aritmtica
Importante
No so permitidas operaes binrias envolvendo um valor do tipo decimal e um valor
do tipo double ou float. Tambm no so permitidas operaes binrias envolvendo um valor
do tipo ulong e um valor do tipo sbyte, short, int ou long.
Matematicamente, o resultado da operao 5/2 2.5. Contudo, no exemplo acima, o valor obtido
na diviso a / b 2. Quando ocorre uma diviso entres dois valores inteiros, a parte fracionria do
resultado descartada.
Podemos, explicitamente, converter um dos valores envolvidos na diviso ou at mesmo os dois
para algum tipo que aceita nmeros reais. Dessa forma, a diviso no seria inteira e a parte fracionria no seria descartada. Essas converses podem ser realizadas com operaes de casting. No
exemplo abaixo, o resultado de cada uma das operaes de diviso 2.5. Lembre-se que as operaes
de casting so realizadas antes das operaes aritmticas.
1
2
3
4
5
6
7
8
9
10
11
int a = 5;
int b = 2;
// convertendo o valor armazenado na varivel " a "
System . Console . WriteLine (( double ) a / b ) ; // exibe : 2.5
// convertendo o valor armazenado na varivel " b "
System . Console . WriteLine ( a / ( double ) b ) ; // exibe : 2.5
// convertendo os valores armazenados nas variveis " a " e " b "
System . Console . WriteLine (( double ) a / ( double ) b ) ; // exibe : 2.5
Cdigo C# 3.25: Castings
www.facebook.com/k19treinamentos
63
O PERADORES
64
Simulao
Nessa simulao, realizaremos operaes aritmticas e operaes de casting. Alm disso, mostraremos as diferenas entre diviso inteira e diviso real.
Ao executar o programa, a primeira linha do mtodo Main ser processada. O valor 0 ser armazenado na varivel a.
1
1 class Operacoes
2 {
3
static void Main ()
4
{
5
int a = 0;
6
System . Console . WriteLine (13 % 4) ;
7
System . Console . WriteLine (10 / 4) ;
8
System . Console . WriteLine (( double ) 10 / 4) ;
9
System . Console . WriteLine (10 / ( double ) 4) ;
10
System . Console . WriteLine (( double ) (10 / 4) ) ;
11
System . Console . WriteLine (10.0 / a ) ;
12
System . Console . WriteLine (0.0 / a ) ;
13
System . Console . WriteLine (0 / a ) ;
14
}
15 }
a=0
2
Na sequncia, a linha 6 ser executada. O operador % calcular o resto da diviso entre os nmeros 13 e 4. O resultado dessa operao 1.
1 class Operacoes
2 {
3
static void Main ()
4
{
5
int a = 0;
6
System . Console . WriteLine (13 % 4) ;
7
System . Console . WriteLine (10 / 4) ;
8
System . Console . WriteLine (( double ) 10 / 4) ;
9
System . Console . WriteLine (10 / ( double ) 4) ;
10
System . Console . WriteLine (( double ) (10 / 4) ) ;
11
System . Console . WriteLine (10.0 / a ) ;
12
System . Console . WriteLine (0.0 / a ) ;
13
System . Console . WriteLine (0 / a ) ;
14
}
15 }
a=0
O fluxo de execuo prossegue e a linha 7 ser executada. A diviso entre os nmeros inteiros
10 e 4 ser realizada com a utilizao do operador /. Como os dois operandos dessa operao so
valores inteiros, ocorre uma diviso inteira. Por isso, o resultado ser 2 e no 2.5.
3
64
www.k19.com.br
65
O PERADORES
1 class Operacoes
2 {
3
static void Main ()
4
{
5
int a = 0;
6
System . Console . WriteLine (13 % 4) ;
7
System . Console . WriteLine (10 / 4) ;
8
System . Console . WriteLine (( double ) 10 / 4) ;
9
System . Console . WriteLine (10 / ( double ) 4) ;
10
System . Console . WriteLine (( double ) (10 / 4) ) ;
11
System . Console . WriteLine (10.0 / a ) ;
12
System . Console . WriteLine (0.0 / a ) ;
13
System . Console . WriteLine (0 / a ) ;
14
}
15 }
a=0
1
2
4
Em seguida, a linha 8 executada. Assim como na linha 7, o operador / ser utilizado para
calcular a diviso entre os nmeros 10 e 4. Contudo, uma operao de casting converte o literal 10,
que do tipo int, para double antes da diviso. Como pelo menos um dos operandos um valor real,
ocorrer uma diviso real. Sendo assim, o resultado ter casas decimais e ser exibido o nmero 2.5
na sada padro.
1 class Operacoes
2 {
3
static void Main ()
4
{
5
int a = 0;
6
System . Console . WriteLine (13 % 4) ;
7
System . Console . WriteLine (10 / 4) ;
8
System . Console . WriteLine (( double ) 10 / 4) ;
9
System . Console . WriteLine (10 / ( double ) 4) ;
10
System . Console . WriteLine (( double ) (10 / 4) ) ;
11
System . Console . WriteLine (10.0 / a ) ;
12
System . Console . WriteLine (0.0 / a ) ;
13
System . Console . WriteLine (0 / a ) ;
14
}
15 }
a=0
1
2
2.5
Na sequncia, a linha 9 executada. Assim como nas linhas 7 e 8, o operador / ser utilizado
para calcular a diviso entre os nmeros 10 e 4. Antes da diviso, uma operao de casting converte o
literal 4, que do tipo int, para double. Como pelo menos um dos operandos um valor real, ocorrer
uma diviso real. Sendo assim, o resultado ser 2.5.
5
www.facebook.com/k19treinamentos
65
O PERADORES
1 class Operacoes
2 {
3
static void Main ()
4
{
5
int a = 0;
6
System . Console . WriteLine (13 % 4) ;
7
System . Console . WriteLine (10 / 4) ;
8
System . Console . WriteLine (( double ) 10 / 4) ;
9
System . Console . WriteLine (10 / ( double ) 4) ;
10
System . Console . WriteLine (( double ) (10 / 4) ) ;
11
System . Console . WriteLine (10.0 / a ) ;
12
System . Console . WriteLine (0.0 / a ) ;
13
System . Console . WriteLine (0 / a ) ;
14
}
15 }
66
a=0
1
2
2.5
2.5
Continuando, a linha 10 executada. Assim como nas linhas 7, 8 e 9, o operador / ser utilizado
para calcular a diviso entre os nmeros 10 e 4. Note que essa operao foi delimitada com parnteses. Sendo assim, a diviso ser executada antes da operao de casting. Como os dois operandos
dessa diviso so nmeros inteiros, o resultado no ter casas decimais. Sendo assim, esse resultado
ser 2. Em seguida, o casting transformar esse valor inteiro em real. Consequentemente, ser exibido o nmero 2 na sada padro.
6
1 class Operacoes
2 {
3
static void Main ()
4
{
5
int a = 0;
6
System . Console . WriteLine (13 % 4) ;
7
System . Console . WriteLine (10 / 4) ;
8
System . Console . WriteLine (( double ) 10 / 4) ;
9
System . Console . WriteLine (10 / ( double ) 4) ;
10
System . Console . WriteLine (( double ) (10 / 4) ) ;
11
System . Console . WriteLine (10.0 / a ) ;
12
System . Console . WriteLine (0.0 / a ) ;
13
System . Console . WriteLine (0 / a ) ;
14
}
15 }
a=0
1
2
2.5
2.5
2
A prxima linha que ser executada a 11. Nessa linha, a diviso entre o literal 10.0 que do tipo
double e o valor armazenado na varivel a que 0 realizada com a utilizao do operador /. Como
pelo menos um dos operandos um valor real, ocorrer a diviso real. Sendo assim, o resultado
dessa operao Infinity.
66
www.k19.com.br
67
O PERADORES
1 class Operacoes
2 {
3
static void Main ()
4
{
5
int a = 0;
6
System . Console . WriteLine (13 % 4) ;
7
System . Console . WriteLine (10 / 4) ;
8
System . Console . WriteLine (( double ) 10 / 4) ;
9
System . Console . WriteLine (10 / ( double ) 4) ;
10
System . Console . WriteLine (( double ) (10 / 4) ) ;
11
System . Console . WriteLine (10.0 / a ) ;
12
System . Console . WriteLine (0.0 / a ) ;
13
System . Console . WriteLine (0 / a ) ;
14
}
15 }
a=0
1
2
2.5
2.5
2
Infinity
A prxima linha que ser executada a 12. Nessa linha, a diviso entre o literal 0.0 que do tipo
double e o valor armazenado na varivel a que 0 realizada com a utilizao do operador /. Como
pelo menos um dos operandos um valor real, ocorrer a diviso real. Sendo assim, o resultado
dessa operao NaN.
1 class Operacoes
2 {
3
static void Main ()
4
{
5
int a = 0;
6
System . Console . WriteLine (13 % 4) ;
7
System . Console . WriteLine (10 / 4) ;
8
System . Console . WriteLine (( double ) 10 / 4) ;
9
System . Console . WriteLine (10 / ( double ) 4) ;
10
System . Console . WriteLine (( double ) (10 / 4) ) ;
11
System . Console . WriteLine (10.0 / a ) ;
12
System . Console . WriteLine (0.0 / a ) ;
13
System . Console . WriteLine (0 / a ) ;
14
}
15 }
a=0
1
2
2.5
2.5
2
Infinity
NaN
9
Continuando a execuo, a linha 13 executada e a diviso do literal 0 que do tipo int pelo
valor armazenado na varivel a que 0 calculada com o operador /. Essa operao considerada
uma diviso inteira porque os dois operandos so valores inteiros. Uma diviso inteira por 0 gera um
erro de execuo, o DivideByZeroException.
www.facebook.com/k19treinamentos
67
O PERADORES
68
1 class Operacoes
2 {
3
static void Main ()
4
{
5
int a = 0;
6
System . Console . WriteLine (13 % 4) ;
7
System . Console . WriteLine (10 / 4) ;
8
System . Console . WriteLine (( double ) 10 / 4) ;
9
System . Console . WriteLine (10 / ( double ) 4) ;
10
System . Console . WriteLine (( double ) (10 / 4) ) ;
11
System . Console . WriteLine (10.0 / a ) ;
12
System . Console . WriteLine (0.0 / a ) ;
13
System . Console . WriteLine (0 / a ) ;
14
}
15 }
a=0
1
2
2.5
2.5
2
Infinity
NaN
Unhandled Exception : System . DivideByZeroException : Attempted to divide by zero .
at Programa . Main ()
Lembrando que o menor valor aceito pelo tipo long long.MinValue e o maior long.MaxValue, as
operaes do exemplo abaixo causam underflow e overflow.
1 int a = 1;
2 System . Console . WriteLine ( long . MinValue - a ) ; // underflow : 9223372036854775807
3 System . Console . WriteLine ( long . MaxValue + a ) ; // overflow : -9223372036854775808
Nas operaes aritmticas envolvendo valores do tipo float ou double, tambm pode ocorrer overflow ou underflow. No overflow, o resultado pode ser inifinito. No underflow, o resultado ser 0.
1
2
3
4
5
6
7
8
68
int a = 2;
System . Console . WriteLine ( float . MaxValue * a ) ; // overflow : Infinity
System . Console . WriteLine ( float . MinValue * a ) ; // overflow : - Infinity
System . Console . WriteLine ( float . Epsilon / a ) ; // underflow : 0.0
System . Console . WriteLine ( double . MaxValue * a ) ; // overflow : Infinity
System . Console . WriteLine ( double . MinValue * a ) ; // overflow : - Infinity
System . Console . WriteLine ( double . Epsilon / a ) ; // underflow : 0.0
www.k19.com.br
69
O PERADORES
Simulao
Nessa simulao, mostraremos um exemplo de overflow e de underflow.
Ao executar o programa, a primeira linha do mtodo Main ser processada. Nessa linha, declarada a varivel a do tipo int e inicializada com o maior valor do tipo int.
1
1 class OverflowUnderflow
2 {
3
static void Main ()
4
{
5
int a = int . MaxValue ;
6
int b = int . MinValue ;
7
System . Console . WriteLine ( a + 1) ;
8
System . Console . WriteLine ( b - 1) ;
9
}
10 }
a = 2147483647
Na linha 6, declarada a varivel b do tipo int e inicializada com o menor valor do tipo int.
1 class OverflowUnderflow
2 {
3
static void Main ()
4
{
5
int a = int . MaxValue ;
6
int b = int . MinValue ;
7
System . Console . WriteLine ( a + 1) ;
8
System . Console . WriteLine ( b - 1) ;
9
}
10 }
a = 2147483647
b = -2147483648
3
Na linha 7, exibido o valor de a + 1. Como o resultado dessa expresso ultrapassa o valor
mximo do tipo int, ocorre um overflow e o resultado dessa operao ser -2147483648.
1 class OverflowUnderflow
2 {
3
static void Main ()
4
{
5
int a = int . MaxValue ;
6
int b = int . MinValue ;
7
System . Console . WriteLine ( a + 1) ;
8
System . Console . WriteLine ( b - 1) ;
9
}
10 }
a = 2147483647
b = -2147483648
-2147483648
Na linha 8, exibido o valor de b - 1. Como o resultado dessa operao menor do que o limite
mnimo do tipo int, ocorre um underflow e o resultado dessa operao ser 2147483647.
4
www.facebook.com/k19treinamentos
69
O PERADORES
70
1 class OverflowUnderflow
2 {
3
static void Main ()
4
{
5
int a = int . MaxValue ;
6
int b = int . MinValue ;
7
System . Console . WriteLine ( a + 1) ;
8
System . Console . WriteLine ( b - 1) ;
9
}
10 }
a = 2147483647
b = -2147483648
-2147483648
2147483647
70
www.k19.com.br
71
O PERADORES
No exemplo abaixo, o operador + foi aplicado a valores do tipo int e do tipo string. Nesse caso, o
valor do tipo int automaticamente convertido para string e a concatenao realizada. De maneira
geral, quando o operador + for aplicado a um valor do tipo string e outro diferente de string, esse
ltimo ser convertido para string e a concatenao ser realizada.
1
2
3
4
5
Simulao
Nessa simulao, realizaremos operaes de concatenao.
Ao executar o programa, a primeira linha do mtodo Main ser processada. Nessa linha, uma
varivel chamada s do tipo string ser associada string K.
1
www.facebook.com/k19treinamentos
71
O PERADORES
1 class Concatenacoes
2 {
3
static void Main ()
4
{
5
string s = " K " ;
6
s = " Cursos " + s ;
7
s = s + 19;
8
System . Console . WriteLine ( s ) ;
9
}
10 }
72
s = K
2
Em seguida, a linha 6 ser executada e a string Cursos ser concatenada esquerda da string
K. Essa concatenao produz a string Cursos K. Essa string associada varivel s atravs do
operador =.
1 class Concatenacoes
2 {
3
static void Main ()
4
{
5
string s = " K " ;
6
s = " Cursos " + s ;
7
s = s + 19;
8
System . Console . WriteLine ( s ) ;
9
}
10 }
s = Cursos K
Na sequncia, a linha 7 executada. O literal 19, que do tipo int, convertido automaticamente
para string. Em seguida, a string 19 concatenada direita da string Cursos K. Essa concatenao
produz a string Cursos K19. Essa string associada varivel s atravs do operador =.
3
1 class Concatenacoes
2 {
3
static void Main ()
4
{
5
string s = " K " ;
6
s = " Cursos " + s ;
7
s = s + 19;
8
System . Console . WriteLine ( s ) ;
9
}
10 }
s = Cursos K19
Por fim, a linha 8 ser executada e a mensagem Cursos K19 ser exibida na sada padro.
1 class Concatenacoes
2 {
3
static void Main ()
4
{
5
string s = " K " ;
6
s = " Cursos " + s ;
7
s = s + 19;
8
System . Console . WriteLine ( s ) ;
9
}
10 }
s = Cursos K19
Cursos K19
72
www.k19.com.br
73
O PERADORES
3.10 Operadores Unrios + e Nesta seo, vamos considerar a utilizao dos operadores unrios apenas com valores dos tipos
simples. O operador unrio + preserva o sinal dos valores numricos enquanto o operador unrio inverte o sinal desses valores. O resultado gerado por esses operadores segue as seguintes regras.
O resultado do tipo int quando o operando do tipo sbyte, byte, short, ushort, char ou int.
O resultado do tipo long quando o operando do tipo uint ou long.
O resultado do tipo ulong quando o operando do tipo ulong. O operador unrio - no pode
ser aplicado a valores do tipo ulong.
O resultado do tipo float quando o operando do tipo float.
O resultado do tipo double quando o operando do tipo double.
O resultado do tipo decimal quando o operando do tipo decimal.
1 System . Console . WriteLine (+1) ; // exibe : 1
2 System . Console . WriteLine ( -1) ; // exibe : -1
73
O PERADORES
74
1 int a = 1;
2 int b = a ;
int valor = 1;
valor += 2; // valor = 3
valor -= 1; // valor = 2
valor *= 6; // valor = 12
valor /= 3; // valor = 4
valor %= 3; // valor = 1
valor ++; // valor = 2
valor - -; // valor = 1
Cdigo C# 3.53: Exemplo de uso dos operadores de atribuio
Nas instrues com os operadores de atribuio compostos, h uma operao de casting implcita. Assim, as instrues do exemplo acima so equivalentes s instrues do cdigo abaixo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int valor = 1;
valor = ( int ) ( valor + 2) ; // valor = 3
valor = ( int ) ( valor - 1) ; // valor = 2
valor = ( int ) ( valor * 6) ; // valor = 12
valor = ( int ) ( valor / 3) ; // valor = 4
valor = ( int ) ( valor % 3) ; // valor = 1
valor = ( int ) ( valor + 1) ; // valor = 2
valor = ( int ) ( valor - 1) ; // valor = 1
Cdigo C# 3.54: Utilizando os operadores aritmticos
Para utilizar os operadores de atribuio compostos, a operao de atribuio simples e a operao aritmtica correpondente devem ser vlidas se aplicadas individualmente aos mesmos operandos. No exemplo abaixo, a varivel a do tipo int e a varivel b do tipo short. Para determinar se
a operao a += b vlida, devemos verificar se as operaes a = b e a + b so permitidas. Como
vimos na Seo 3, a operao a = b vlida. Tambm vimos na Seo 3 que a operao a + b vlida.
Portanto, a operao a += b tambm vlida.
1 int a = 1;
74
www.k19.com.br
75
O PERADORES
2 short b = 1;
3 a += b ; // vlida , pois a = b vlida e a + b vlida
Mais Sobre
Qual o resultado de uma operao de atribuio? O resultado de uma operao de
atribuio o valor do segundo operando. No exemplo abaixo, a operao a = 1 devolve o valor
1, que do tipo int.
1 int a ;
2
3 System . Console . WriteLine ( a = 1) ; // exibe : 1
Cdigo C# 3.57: Utilizando os operadores aritmticos
Simulao
Nessa simulao, mostraremos um exemplo de utilizao dos operadores de atribuio.
Ao executar o programa, a primeira linha do mtodo Main ser processada. Nessa linha, uma
varivel chamada a do tipo int declarada e inicializada com o valor 7.
1
1 class Atribuicao
2 {
3
static void Main ()
4
{
5
int a = 7;
6
a += 3;
7
a *= 2;
8
a ++;
9
a -= 2;
10
System . Console . WriteLine ( a ) ;
11
}
12 }
a=7
2
Em seguida, a linha 6 executada. Utilizando o operador +=, o valor 3 adicionado ao valor da
varivel a. O resultado dessa operao armazenado na prpria varivel a. Dessa forma, depois da
execuo dessa linha, o valor contido nessa varivel ser 10.
www.facebook.com/k19treinamentos
75
O PERADORES
1 class Atribuicao
2 {
3
static void Main ()
4
{
5
int a = 7;
6
a += 3;
7
a *= 2;
8
a ++;
9
a -= 2;
10
System . Console . WriteLine ( a ) ;
11
}
12 }
76
a = 10
1 class Atribuicao
2 {
3
static void Main ()
4
{
5
int a = 7;
6
a += 3;
7
a *= 2;
8
a ++;
9
a -= 2;
10
System . Console . WriteLine ( a ) ;
11
}
12 }
a = 20
Agora, a linha 8 executada. Utilizando o operador ++, o valor 1 adicionado ao valor armazenado na varivel a. O resultado dessa operao armazenado na prpria varivel a. Dessa forma,
depois dessa linha, o valor contido nessa varivel ser 21.
4
1 class Atribuicao
2 {
3
static void Main ()
4
{
5
int a = 7;
6
a += 3;
7
a *= 2;
8
a ++;
9
a -= 2;
10
System . Console . WriteLine ( a ) ;
11
}
12 }
a = 21
5
Continuando a execuo, a linha 9 ser processada. Como a varivel a armazena o valor 21, a
operao a -= 2 faz com que a varivel a passe a armazenar o valor 19.
76
www.k19.com.br
77
O PERADORES
1 class Atribuicao
2 {
3
static void Main ()
4
{
5
int a = 7;
6
a += 3;
7
a *= 2;
8
a ++;
9
a -= 2;
10
System . Console . WriteLine ( a ) ;
11
}
12 }
a = 19
1 class Atribuicao
2 {
3
static void Main ()
4
{
5
int a = 5;
6
a += 3;
7
a *= 2;
8
a ++;
9
a -= 2;
10
System . Console . WriteLine ( a ) ;
11
}
12 }
a = 19
19
int valor = 2;
bool b ;
b = ( valor == 2) ;
b = ( valor != 2) ;
b = ( valor < 2) ;
b = ( valor <= 2) ;
//
//
//
//
b
b
b
b
=
=
=
=
true
false
false
true
www.facebook.com/k19treinamentos
77
O PERADORES
78
No permitida a utilizao desses operadores para comparar valores dos tipos simples numricos com valores do tipo bool. Alm disso, no possvel usar esses operadores quando um operando
do tipo long e o outro do tipo ulong. Uma ltima restrio a de que os operadores que envolvem
ordem (<, <=, > e >=) no podem ser aplicados a operandos do tipo bool.
Mais Sobre
Se um dos operandos do operador != for NaN ento o resultado ser true. Para os demais operadores, se um dos operandos for NaN ento o resultado ser false.
Simulao
Nessa simulao, mostraremos um exemplo de utilizao dos operadores de comparao.
Ao executar o programa, a primeira linha do mtodo Main ser processada. Nessa linha, uma
varivel chamada a do tipo int declarada e inicializada com o valor 1.
1
1 class Comparacoes
2 {
3
static void Main ()
4
{
5
int a = 1;
6
System . Console . WriteLine ( a == 1) ;
7
System . Console . WriteLine ( a > 5) ;
8
System . Console . WriteLine ( a <= 3) ;
9
}
10 }
a=1
Na sequncia, a linha 6 ser executada. O operador == foi utilizado para verificar se o valor
armazenado na varivel a igual a 1. Como a varivel a armazena o valor 1, essa operao devolve
true.
2
1 class Comparacoes
2 {
3
static void Main ()
4
{
5
int a = 1;
6
System . Console . WriteLine ( a == 1) ;
7
System . Console . WriteLine ( a > 5) ;
8
System . Console . WriteLine ( a <= 3) ;
9
}
10 }
a=1
True
Na sequncia, a linha 7 ser executada. O operador > foi utilizado para verificar se o valor armazenado na varivel a maior do que 5. Como a varivel a armazena o valor 1, essa operao devolve
3
78
www.k19.com.br
79
O PERADORES
false.
1 class Comparacoes
2 {
3
static void Main ()
4
{
5
int a = 1;
6
System . Console . WriteLine ( a == 1) ;
7
System . Console . WriteLine ( a > 5) ;
8
System . Console . WriteLine ( a <= 3) ;
9
}
10 }
a=1
True
False
Em seguida, a linha 8 ser executada. O operador <= foi utilizado para verificar se o valor armazenado na varivel a menor ou igual a 3. Como a varivel a armazena o valor 1, essa operao devolve
true.
4
1 class Comparacoes
2 {
3
static void Main ()
4
{
5
int a = 1;
6
System . Console . WriteLine ( a == 1) ;
7
System . Console . WriteLine ( a > 5) ;
8
System . Console . WriteLine ( a <= 3) ;
9
}
10 }
a=1
True
False
True
79
O PERADORES
80
Os operadores & (E simples) e && (E duplo) devolvem true se e somente se as duas condies
forem true.
1
2
3
4
5
6
A tabela verdade uma forma prtica de visualizar o resultado dos operadores lgicos. Veja a
seguir a tabela verdade dos operadores & e &&.
a<3
V
V
F
F
b>4
V
F
V
F
a<3&b>4
V
F
F
F
Considere agora uma mudana nas regras do jogo. Suponha que o jogador ganha se no primeiro lanamento o resultado for menor do que 3 ou no segundo lanamento o resultado for
maior do que 4. Para verificar se o jogador ganha o jogo, podemos usar os operadores OU. Os
operadores | (OU simples) e || (OU duplo) devolvem true se pelo menos uma das condies
for true.
1
2
3
4
5
6
Tambm, podemos utilizar a tabela verdade para visualizar o resultado dos operadores | e ||.
a<3
V
V
F
F
b>4
V
F
V
F
a<3|b>4
V
V
V
F
a < 3 || b > 4
V
V
V
F
Agora, suponha que o jogador ganha o jogo se uma das situaes abaixo ocorrer:
(i) No primeiro lanamento, o resultado menor do que 3 e, no segundo lanamento, o
resultado no maior do que 4.
(ii) No primeiro lanamento, o resultado no menor do que 3 e, no segundo lanamento, o
resultado maior do que 4.
Nesse tipo de jogo, podemos utilizar o operador OU exclusivo para verificar se o jogador
vencedor. O operador (OU exclusivo) devolve true se e somente se exatamente uma das condies for true (ou seja, uma delas deve ser true e a outra deve ser false).
80
www.k19.com.br
81
1
2
3
4
5
O PERADORES
System . Random gerador = new System . Random () ;
int a = gerador . Next (6) + 1;
int b = gerador . Next (6) + 1;
System . Console . WriteLine ( a < 3 ^ b > 4) ;
Cdigo C# 3.71: Exemplo de uso do operador
b>4
V
F
V
F
a<3b>4
F
V
V
F
Os operadores & e && produzem o mesmo resultado. Ento, qual a diferena entre eles? O operador & sempre avalia as duas condies. Por outro lado, o operador && no avalia a segunda condio
se o valor da primeira condio for false. De fato, esse comportamento plausvel, pois se o valor da
primeira condio for false, o resultado da operao false independentemente do valor da segunda
condio. Dessa forma, podemos simplificar a tabela verdade do operador &&.
a<3
V
V
F
b>4
V
F
?
Analogamente, podemos deduzir a diferena entre os operadores | e ||. As duas condies sempre so avaliadas quando utilizamos o operador |. Agora, quando utilizamos o operador ||, a segunda condio avaliada se e somente se o valor da primeira condio for false. Realmente, esse
comportamento aceitvel, pois o resultado da operao true quando o valor da primeira condio for true independentemente do valor da segunda condio. Dessa forma, podemos simplificar a
tabela verdade do operador ||.
a<3
V
F
F
b>4
?
V
F
a < 3 || b > 4
V
V
F
www.facebook.com/k19treinamentos
81
O PERADORES
3
4
5
6
7
82
100 & i ++ < 500) ;
100 && i ++ < 500) ;
0 | i ++ < 500) ;
0 || i ++ < 500) ;
Simulao
Nessa simulao, mostraremos um exemplo de utilizao dos operadores lgicos.
Ao executar o programa, a primeira linha do mtodo Main ser processada. Nessa linha, uma
varivel chamada a do tipo int declarada e inicializada com o valor 2.
1
1 class Logicos
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a > 0 || b < 0) ;
8
System . Console . WriteLine ( a == 2 && b != 10) ;
9
System . Console . WriteLine ( a <= 0 ^ b >= 1) ;
10
}
11 }
a=2
Na sequncia, a linha 6 ser executada e uma varivel chamada b do tipo int declarada e
inicializada com o valor 10.
2
1 class Logicos
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a > 0 || b < 0) ;
8
System . Console . WriteLine ( a == 2 && b != 10) ;
9
System . Console . WriteLine ( a <= 0 ^ b >= 1) ;
10
}
11 }
a=2
b = 10
3
Agora, na linha 7, a operao a > 0 ser executada. Como o valor armazenado na varivel a 2,
o resultado dessa operao ser true.
82
www.k19.com.br
83
O PERADORES
1 class Logicos
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a > 0 || b < 0) ;
8
System . Console . WriteLine ( a == 2 && b != 10) ;
9
System . Console . WriteLine ( a <= 0 ^ b >= 1) ;
10
}
11 }
a=2
b = 10
Em seguida, ainda na linha 7, o operador || devolver true sem avaliar o lado direito (b < 0) pois,
como vimos no passo anterior, o lado esquerdo (a > 0) devolveu true.
4
1 class Logicos
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a > 0 || b < 0) ;
8
System . Console . WriteLine ( a == 2 && b != 10) ;
9
System . Console . WriteLine ( a <= 0 ^ b >= 1) ;
10
}
11 }
a=2
b = 10
Para finalizar a linha 7, o resultado da expresso a > 0 || b < 0, que true, ser exibido na sada
padro.
5
1 class Logicos
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a > 0 || b < 0) ;
8
System . Console . WriteLine ( a == 2 && b != 10) ;
9
System . Console . WriteLine ( a <= 0 ^ b >= 1) ;
10
}
11 }
a=2
b = 10
True
6
Em seguida, na linha 8, a operao a == 2 ser executada. Como a varivel a armazena o valor 2,
o resultado dessa operao true.
www.facebook.com/k19treinamentos
83
O PERADORES
1 class Logicos
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a > 0 || b < 0) ;
8
System . Console . WriteLine ( a == 2 && b != 10) ;
9
System . Console . WriteLine ( a <= 0 ^ b >= 1) ;
10
}
11 }
84
a=2
b = 10
True
Na sequncia, ainda na linha 8, como o lado esquerdo (a == 2) do operador && true, o lado
direito (b != 10) desse operador deve ser avaliado. Como a varivel b armazena o valor 10, o resultado
de b != 10 false.
7
1 class Logicos
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a > 0 || b < 0) ;
8
System . Console . WriteLine ( a == 2 && b != 10) ;
9
System . Console . WriteLine ( a <= 0 ^ b >= 1) ;
10
}
11 }
a=2
b = 10
True
Continuando na linha 8, o operador && devolver o valor false pois, como vimos no passo anterior, o lado direito (b != 10) devolveu false.
8
1 class Logicos
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a > 0 || b < 0) ;
8
System . Console . WriteLine ( a == 2 && b != 10) ;
9
System . Console . WriteLine ( a <= 0 ^ b >= 1) ;
10
}
11 }
a=2
b = 10
True
Para finalizar a linha 8, o resultado da expresso a == 2 && b != 10, que false, ser exibido na
sada padro.
9
84
www.k19.com.br
85
O PERADORES
1 class Logicos
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a > 0 || b < 0) ;
8
System . Console . WriteLine ( a == 2 && b != 10) ;
9
System . Console . WriteLine ( a <= 0 ^ b >= 1) ;
10
}
11 }
a=2
b = 10
True
False
Agora, na linha 9, a operao a <= 0 ser executada. Como a varivel a armazena o valor 2, o
resultado dessa operao false.
10
1 class Logicos
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a > 0 || b < 0) ;
8
System . Console . WriteLine ( a == 2 && b != 10) ;
9
System . Console . WriteLine ( a <= 0 ^ b >= 1) ;
10
}
11 }
a=2
b = 10
True
False
Em seguida, ainda linha 9, a operao b >= 1 ser executada. Como a varivel b armazena o valor
10, o resultado dessa operao true.
11
1 class Logicos
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a > 0 || b < 0) ;
8
System . Console . WriteLine ( a == 2 && b != 10) ;
9
System . Console . WriteLine ( a <= 0 ^ b >= 1) ;
10
}
11 }
a=2
b = 10
True
False
12 Continuando na linha 9, o operador devolver true pois, como vimos nos passos anteriores, o
lado esquerdo (a <= 0) false e o lado direito (b >= 1) true.
www.facebook.com/k19treinamentos
85
O PERADORES
86
1 class Logicos
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a > 0 || b < 0) ;
8
System . Console . WriteLine ( a == 2 && b != 10) ;
9
System . Console . WriteLine ( a <= 0 ^ b >= 1) ;
10
}
11 }
a=2
b = 10
True
False
Para finalizar a linha 9, o resultado da expresso a <= 0 b >= 1, que true, ser exibido na sada
padro.
13
1 class Logicos
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a > 0 || b < 0) ;
8
System . Console . WriteLine ( a == 2 && b != 10) ;
9
System . Console . WriteLine ( a <= 0 ^ b >= 1) ;
10
}
11 }
a=2
b = 10
True
False
True
O programa deve exibir a mensagem aprovado se nota de um aluno for maior ou igual a 5 e
reprovado se a nota for menor do que 5. Esse problema pode ser resolvido com o operador ternrio.
nota >= 5 ? aprovado : reprovado
Condio
Valor 1
Valor 2
Quando a condio (nota >= 5) true, o operador ternrio devolve o primeiro valor ("aprovado").
Caso contrrio, devolve o segundo valor ("reprovado"). Podemos guardar o resultado do operador
ternrio em uma varivel ou simplesmente exibi-lo.
86
www.k19.com.br
87
O PERADORES
1 string resultado = nota >= 5 ? " aprovado " : " reprovado " ;
2 System . Console . WriteLine ( nota >= 5 ? " aprovado " : " reprovado " ) ;
No exemplo anterior, o operador ternrio foi utilizado com valores do tipo string. Contudo, podemos utiliz-lo com qualquer tipo de valor. Veja o exemplo a seguir.
1 int i = nota >= 5 ? 1 : 2;
2 double d = nota >= 5 ? 0.1 : 0.2;
Simulao
Nessa simulao, mostraremos um exemplo de utilizao do operador ternrio e do operador de
negao.
Ao executar o programa, a primeira linha do mtodo Main ser processada. Nessa linha, uma
varivel chamada nota do tipo double declarada e inicializada com o valor 6.3.
1
1 class TernarioNegacao
2 {
3
static void Main ()
4
{
5
double nota = 6.3;
6
bool reprovado = !( nota >= 5) ;
7
string s = reprovado ? " REPROVADO " : " APROVADO " ;
8
System . Console . WriteLine ( s ) ;
9
}
10 }
nota = 6.3
2
Em seguida, na linha 6, a operao nota >= 5 executada. Como a varivel nota armazena o valor
6.3, o resultado dessa operao true.
www.facebook.com/k19treinamentos
87
O PERADORES
1 class TernarioNegacao
2 {
3
static void Main ()
4
{
5
double nota = 6.3;
6
bool reprovado = !( nota >= 5) ;
7
string s = reprovado ? " REPROVADO " : " APROVADO " ;
8
System . Console . WriteLine ( s ) ;
9
}
10 }
88
nota = 6.3
3
Ainda na linha 6, o operador de negao aplicado ao resultado da operao nota >= 5. Como
vimos no passo anterior, essa operao devolveu true. Dessa forma, a expresso !(nota >= 5) devolve
false. Esse valor armazenado na varivel reprovado.
1 class TernarioNegacao
2 {
3
static void Main ()
4
{
5
double nota = 6.3;
6
bool reprovado = !( nota >= 5) ;
7
string s = reprovado ? " REPROVADO " : " APROVADO " ;
8
System . Console . WriteLine ( s ) ;
9
}
10 }
nota = 6.3
reprovado = false
Agora, na linha 7, o operador ternrio utilizado. Como o valor armazenado na varivel reprovado
false, esse operador devolve APROVADO. Essa string associada varivel s.
4
1 class TernarioNegacao
2 {
3
static void Main ()
4
{
5
double nota = 6.3;
6
bool reprovado = !( nota >= 5) ;
7
string s = reprovado ? " REPROVADO " : " APROVADO " ;
8
System . Console . WriteLine ( s ) ;
9
}
10 }
nota = 6.3
reprovado = false
s = APROVADO
1 class TernarioNegacao
2 {
3
static void Main ()
4
{
5
double nota = 6.3;
6
bool reprovado = !( nota >= 5) ;
7
string s = reprovado ? " REPROVADO " : " APROVADO " ;
8
System . Console . WriteLine ( s ) ;
9
}
10 }
nota = 6.3
reprovado = false
s = APROVADO
APROVADO
88
www.k19.com.br
89
O PERADORES
1 int i = 10;
2 ++ i ; // pr incremento
3 --i ; // pr decremento
Cdigo C# 3.97: Pr incremento e pr decremento
Observe que o operador ++ foi utilizado nas expresses do exemplo acima em conjunto com o
operador ==. Como dois operadores foram utilizados na mesma expresso, voc pode ter dvida em
relao a quem ser executado primeiro. O incremento com o operador ++ ser realizado antes ou
depois da comparao com o operador ==?
O incremento ocorrer antes da comparao. Contudo, como o operador ++ foi utilizado na forma
de ps incremento, a operao i++ devolver o valor antigo da varivel i. Dessa forma, a comparao
utilizar o valor armazenado na varivel i antes do incremento.
Analogamente, a comparao utilizaria o valor antigo da varivel i se o operador -- fosse utilizado
na forma de ps decremento.
Agora, considere a utilizao do operador ++ na forma de pr incremento.
1 int i = 10;
2 System . Console . WriteLine (++ i == 10) ; // exibe : false
3 System . Console . WriteLine ( i ) ; // exibe : 11
Nesse ltimo exemplo, a operao ++i devolver o valor novo da varivel i. Dessa forma, a comwww.facebook.com/k19treinamentos
89
O PERADORES
90
int i = 10;
int j = 10;
System . Console . WriteLine ( i ++ == i - 1) ;
System . Console . WriteLine (++ j == j ) ;
Simulao
Nessa simulao, mostraremos um exemplo de utilizao dos operadores de incremento e decremento.
Ao executar o programa, a primeira linha do mtodo Main ser processada. Nessa linha, uma
varivel chamada a do tipo int declarada e inicializada com o valor 2.
1
1 class IncrementoDecremento
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a ++ == 2 || b ++ == 10) ;
8
System . Console . WriteLine (++ a < 4 && --b == 10) ;
9
System . Console . WriteLine ( a ) ;
10
System . Console . WriteLine ( b ) ;
11
}
12 }
a=2
Em seguida, a linha 6 ser executada. Nessa linha, uma varivel chamada b do tipo int declarada e inicializada com o valor 10.
2
1 class IncrementoDecremento
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a ++ == 2 || b ++ == 10) ;
8
System . Console . WriteLine (++ a < 4 && --b == 10) ;
9
System . Console . WriteLine ( a ) ;
10
System . Console . WriteLine ( b ) ;
11
}
12 }
90
a=2
b = 10
www.k19.com.br
91
O PERADORES
Em seguida, na linha 7, a operao a++ ser executada. Dessa forma, a varivel a passa a armazenar o valor 3. Como o operador ++ foi utilizado na forma de ps incremento, essa operao devolve o
valor antigo da varivel a, ou seja, devolve 2.
3
1 class IncrementoDecremento
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a ++ == 2 || b ++ == 10) ;
8
System . Console . WriteLine (++ a < 4 && --b == 10) ;
9
System . Console . WriteLine ( a ) ;
10
System . Console . WriteLine ( b ) ;
11
}
12 }
a=3
b = 10
Agora, ainda na linha 7, a operao de igualdade a++ == 2 ser executada para verificar se o
resultado da operao a++ igual a 2. No passo anterior, vimos que a operao a++ devolveu 2. Dessa
forma, o resultado da expresso a++ == 2 ser true.
4
1 class IncrementoDecremento
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a ++ == 2 || b ++ == 10) ;
8
System . Console . WriteLine (++ a < 4 && --b == 10) ;
9
System . Console . WriteLine ( a ) ;
10
System . Console . WriteLine ( b ) ;
11
}
12 }
a=3
b = 10
Continuando na linha 7, o operador lgico || devolver true sem avaliar o lado direito (b++ == 10)
porque, como vimos no passo anterior, o lado esquerdo (a++ == 2) devolveu true.
5
1 class IncrementoDecremento
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a ++ == 2 || b ++ == 10) ;
8
System . Console . WriteLine (++ a < 4 && --b == 10) ;
9
System . Console . WriteLine ( a ) ;
10
System . Console . WriteLine ( b ) ;
11
}
12 }
a=3
b = 10
Para finalizar a linha 7, o valor da expresso a++ == 2 || b++ == 10, que true, ser exibido na
sada padro.
6
www.facebook.com/k19treinamentos
91
O PERADORES
1 class IncrementoDecremento
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a ++ == 2 || b ++ == 10) ;
8
System . Console . WriteLine (++ a < 4 && --b == 10) ;
9
System . Console . WriteLine ( a ) ;
10
System . Console . WriteLine ( b ) ;
11
}
12 }
92
a=3
b = 10
True
Em seguida, na linha 8, a operao ++a ser avaliada. Dessa forma, o valor armazenado na
varivel a passa a ser 4. Como o operador ++ foi utilizado na forma de pr incremento, a operao ++a
devolve o novo valor da varivel a, ou seja, devolve 4.
7
1 class IncrementoDecremento
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a ++ == 2 || b ++ == 10) ;
8
System . Console . WriteLine ( ++ a < 4 && --b == 10) ;
9
System . Console . WriteLine ( a ) ;
10
System . Console . WriteLine ( b ) ;
11
}
12 }
a=4
b = 10
True
Na sequncia, ainda na linha 8, a operao de desigualdade ++a < 4 ser avaliada. No passo
anterior, vimos que a operao ++a devolveu 4. Dessa forma, a expresso ++a < 4 devolver false.
8
1 class IncrementoDecremento
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a ++ == 2 || b ++ == 10) ;
8
System . Console . WriteLine ( ++ a < 4 && --b == 10) ;
9
System . Console . WriteLine ( a ) ;
10
System . Console . WriteLine ( b ) ;
11
}
12 }
a=4
b = 10
True
Continuando na linha 8, o operador && devolver false sem avaliar o lado direito (--b == 10) pois,
como vimos no passo anterior, o lado esquerdo (++a < 4) devolveu false.
9
92
www.k19.com.br
93
O PERADORES
1 class IncrementoDecremento
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a ++ == 2 || b ++ == 10) ;
8
System . Console . WriteLine ( ++ a < 4 && --b == 10) ;
9
System . Console . WriteLine ( a ) ;
10
System . Console . WriteLine ( b ) ;
11
}
12 }
a=4
b = 10
True
Para finalizar a linha 8, o resultado da expresso ++a < 4 && --b == 10, que false, ser exibido
na sada padro.
10
1 class IncrementoDecremento
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a ++ == 2 || b ++ == 10) ;
8
System . Console . WriteLine (++ a < 4 && --b == 10) ;
9
System . Console . WriteLine ( a ) ;
10
System . Console . WriteLine ( b ) ;
11
}
12 }
a=4
b = 10
True
False
11
1 class IncrementoDecremento
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a ++ == 2 || b ++ == 10) ;
8
System . Console . WriteLine (++ a < 4 && --b == 10) ;
9
System . Console . WriteLine ( a ) ;
10
System . Console . WriteLine ( b ) ;
11
}
12 }
a=4
b = 10
True
False
4
12
Por fim, ao executar a linha 10, o valor da varivel b ser exibido na sada padro.
www.facebook.com/k19treinamentos
93
O PERADORES
1 class IncrementoDecremento
2 {
3
static void Main ()
4
{
5
int a = 2;
6
int b = 10;
7
System . Console . WriteLine ( a ++ == 2 || b ++ == 10) ;
8
System . Console . WriteLine (++ a < 4 && --b == 10) ;
9
System . Console . WriteLine ( a ) ;
10
System . Console . WriteLine ( b ) ;
11
}
12 }
94
a=4
b = 10
True
False
4
10
94
www.k19.com.br
95
O PERADORES
Precedncia
1
Operador
++
-++
--
+
!
(tipo)
*
/
%
+
<
<=
>
>=
6
7
8
9
10
11
12
==
!=
&
|
&&
||
? :
=
+=
13
-=
*=
/=
%=
Operao
Ps incremento
Ps decremento
Pr incremento
Pr decremento
Mais unrio
Menos unrio
Negao
Casting
Multiplicao
Diviso
Mdulo
Adio
Subtrao
Menor
Menor ou igual
Maior
Maior ou igual
Igualdade
Diferena
E simples
Ou exclusivo
Ou simples
E duplo
Ou duplo
Ternrio
Atribuio
Incremental
Decremental
Multiplicativa
Divisria
Modular
Desempate
Direita Esquerda
Esquerda Direita
Esquerda Direita
Esquerda Direita
Esquerda Direita
Esquerda Direita
Esquerda Direita
Esquerda Direita
Esquerda Direita
Esquerda Direita
Direita Esquerda
Direita Esquerda
Importante
O fato de um operador ter precedncia sobre outro no significa que ele ser executado
primeiro. Por exemplo, de acordo com a Tabela 3.8, o operador de pr incremento (++) possui
precedncia sobre o operador de diviso (/). Sabendo disso, considere o cdigo abaixo.
1 class DivisaoPorZero {
2
static void Main () {
3
int x = 0;
4
System . Console . WriteLine (1 / x + ++ x ) ;
5
}
6 }
Cdigo C# 3.113: DivisaoPorZero.cs
Se a ordem de processamento das operaes de uma expresso fosse a mesma da ordem indu-
www.facebook.com/k19treinamentos
95
O PERADORES
96
zida pela precedncia, a operao ++x seria executada antes da operao de diviso. Nesse caso,
o cdigo acima no apresentaria erro de execuo e exibiria o valor 1.
Contudo, na expresso 1 / x + ++x, a primeira operao realizada a de diviso. Assim, esse
cdigo produz um erro de execuo causado por uma diviso por zero.
De acordo com a Tabela 3.8, o operador de multiplicao tem precedncia sobre o operador de
adio. Dessa forma, a multiplicao tem maior prioridade do que a adio. Sendo assim, a expresso 2 + 3 5 equivalente expresso (2 + (3 5)). Portanto, o resultado dessa expresso 17.
Agora, considere a expresso 1 1 + 1. Se a operao de subtrao for executada antes da adio,
o resultado ser 1. Por outro lado, se a adio for efetuada antes da subtrao, o resultado ser 1.
Nessa expresso, todos os operadores possuem a mesma precedncia. Nesse caso, devemos nos orientar pela ltima coluna da Tabela 3.8 para determinar qual operador tem maior prioridade. Como
o desempate desses operadores realizado da esquerda para a direita, a subtrao tem maior prioridade do que a adio nessa expresso em particular. Portanto, a expresso 1 1 + 1 equivalente
expresso ((1 1) + 1). Logo, o resultado dessa expresso 1.
Ento, para eliminar ambiguidades em uma expresso, devemos acrescentar parnteses de acordo
com a prioridade dos operadores. Vamos exemplificar essa tarefa com a seguinte expresso, onde os
operadores esto destacados com a cor vermelha.
1 + 7 * 3 / 4 / (double)(int)x - y
As operaes de casting possuem maior precedncia nessa expresso. De acordo com a Tabela 3.8, quando h mais de uma operao de casting, a operao mais direita possui prioridade
sobre as outras. Dessa forma, devemos adicionar parnteses para envolver essa operao.
1 + 7 * 3 / 4 / (double)((int)x) - y
Considerando os operadores restantes (na cor vermelha), a outra operao de casting possui prioridade. Assim, ela deve ser envolvida com parnteses.
1 + 7 * 3 / 4 /
((double)((int)x))
- y
1 +
(7
* 3) / 4 / ((double)((int)x)) - y
1 +
((7
* 3) / 4) / ((double)((int)x)) - y
www.k19.com.br
97
O PERADORES
1 +
(((7
* 3) / 4) / ((double)((int)x))) - y
Agora, restam os operadores de adio e de subtrao. Como o operador de adio est mais
esquerda, ele tem prioridade.
(1
+ (((7 * 3) / 4) / ((double)((int)x)))) - y
((1
+ (((7 * 3) / 4) / ((double)((int)x)))) - y)
Ao final desse processo, obtemos uma expresso sem ambiguidade. Agora, basta processar as
operaes de acordo com a seguinte regra: executar sempre o par de parnteses interno mais esquerda at o valor da expresso ser obtido. Um par de parnteses formado por um abre parnteses e um fecha parnteses. Dizemos que um par de parnteses interno se ele no contm
parnteses. No exemplo abaixo, os trs pares de parnteses em destaque so internos.
( ( )
Suponha que as variveis x e y sejam do tipo double e armazenem os valores 4.57 e 2.25, respectivamente. O par de parnteses interno mais esquerda envolve a expresso 7 * 3.
((1 + (((7 * 3) / 4) / ((double)((int)x)))) - y)
Como essa uma diviso entre dois valores inteiros, o resultado dessa expresso 5.
((1 + (5 / ((double)((int)x)))) - y)
www.facebook.com/k19treinamentos
97
O PERADORES
98
((1 + (5 /
((double)4)))
- y)
((1 + (5 /
4.0))
- y)
((1 +
(5
/ 4.0)) - y)
((1 +
1.25)
- y)
Como essa expresso composta por um nmero do tipo int e um nmero do tipo double, o valor
dessa expresso 2.25.
(2.25 - y)
(2.25
- y)
0.0
www.k19.com.br
99
O PERADORES
Quantidade de caracteres
A propriedade Length devolve a quantidade de caracteres (comprimento) de uma string.
1 string s = " Rafael Cosentino " ;
2
3 int length = s . Length ;
4
5 System . Console . WriteLine ( length ) ; // exibe : 16
O nmero entre colchetes deve estar entre zero e o comprimento da string menos um. Um erro
de execuo ocorrer se um nmero fora desse intervalo for usado. Note que um erro de execuo
ocorrer se esse operador for utilizado com a string vazia.
Contains
O mtodo Contains verifica se uma determinada sequncia de caracteres est contida em uma
string. Esse mtodo recebe como parmetro uma sequncia de caracteres e devolve true se e somente
se essa sequncia est contida em um determinada string.
No exemplo abaixo, o mtodo Contains aplicado string cuja referncia est armazenada na
varivel s. Como essa string possui a sequncia de caracteres Objetos, a instruo da linha 6 exibe
true. Como essa string no contm a sequncia de caracteres objetos, a instruo da linha 7 exibe
false.
1
2
3
4
5
6
7
www.facebook.com/k19treinamentos
99
O PERADORES
100
EndsWith
possvel verificar se uma string termina com uma determinada sequncia de caracteres. Para
isso, podemos usar o mtodo EndsWith. Esse mtodo recebe uma sequncia de caracteres como parmetro. Ele devolve true se e somente se uma determinada string termina com essa sequncia de
caracteres.
No exemplo a seguir, o mtodo EndsWith foi aplicado string cuja referncia est armazenada na
varivel s. Como essa string termina com C#, a instruo da linha 6 exibe True. Como essa string
no termina com Objetos, a instruo da linha 7 exibe False.
1
2
3
4
5
6
7
StartsWith
possvel tambm verificar se uma string comea com uma determinada sequncia de caracteres. Podemos fazer isso com o mtodo StartsWith. Esse mtodo recebe uma sequncia de caracteres
como parmetro. Ele devolve true se e somente se uma determinada string comea com essa sequncia de caracteres.
No exemplo abaixo, o mtodo StartsWith aplicado string cuja referncia est armazenada na
varivel s. Como essa string no comea com C#, a instruo da linha 6 exibe False. Como essa
string comea com K11, a instruo da linha 7 exibe True.
1
2
3
4
5
6
7
Replace
Podemos realizar substituies em uma string com o mtodo Replace. Esse mtodo recebe duas
strings como parmetros e devolve um objeto do tipo string. Considere o exemplo abaixo.
1 string s1 = " Matamos o tempo , o tempo nos enterra " ; // Machado de Assis
2
3 s1 = s1 . Replace ( " o tempo " , " um coveiro " ) ;
4
5 System . Console . WriteLine ( s1 ) ; // exibe : Matamos um coveiro , um coveiro nos enterra
Na linha 3, o mtodo Replace substituir cada ocorrncia de o tempo na string cuja referncia
est em s1 por um coveiro. Assim, ele devolve Matamos um coveiro, um coveiro nos enterra.
100
www.k19.com.br
101
O PERADORES
Na verdade, o primeiro parmetro desse mtodo uma expresso regular, mas esse assunto est
fora do escopo deste livro.
Substring
possvel extrair um trecho de uma string com o mtodo Substring. H duas formas de utilizar
esse mtodo. Na primeira, ele recebe apenas um parmetro. Esse parmetro indica a posio do
primeiro caractere do trecho desejado. O trmino desse trecho ser o ltimo caractere da string. Veja
o exemplo abaixo.
1 string s1 = " Porta corta fogo " ;
2
3 string s2 = s1 . Substring (9) ;
4
5 System . Console . WriteLine ( s2 ) ; // exibe : ta fogo
Na linha 3, o mtodo Substring invocado com o argumento 9. Assim, ele devolve a substring de
Porta corta fogo que comea na posio 9 e se estende at o fim. Logo, a instruo da linha 5 exibe
ta fogo.
Na segunda forma de utilizar o mtodo Substring, dois parmetros do tipo int so necessrios: a e
b. O mtodo ento devolve o trecho que comea com o caractere na posio a e possui b caracteres.
Vejamos um exemplo.
1 string s1 = " O elevador chegou " ;
2
3 string s2 = s1 . Substring (2 , 8) ;
4
5 System . Console . WriteLine ( s2 ) ; // exibe : elevador
Na linha 3, o mtodo Substring invocado com os argumentos 2 e 8. Assim, ele devolve a substring
de O elevador chegou que comea na posio 2 e possui 8 caracteres. Logo, a instruo da linha 5
exibe elevador.
ToUpper
Podemos transformar em maisculas todas as letras contidas em uma string com o mtodo
ToUpper. No exemplo abaixo, esse mtodo aplicado string cujo contedo Rafael Cosentino.
Esse mtodo ento devolve a string com todas as letras maisculas, ou seja, devolve RAFAEL COSENTINO.
1 string s1 = " Rafael Cosentino " ;
2
3 string s2 = s1 . ToUpper () ;
4
5 System . Console . WriteLine ( s2 ) ; // exibe : RAFAEL COSENTINO
www.facebook.com/k19treinamentos
101
O PERADORES
102
ToLower
Tambm podemos transformar em minsculas todas as letras contidas em uma string com o
mtodo ToLower. No exemplo a seguir, esse mtodo aplicado string cujo contedo Rafael Cosentino. Assim, esse mtodo devolve a string rafael cosentino.
1 string s1 = " Rafael Cosentino " ;
2
3 string s2 = s1 . ToLower () ;
4
5 System . Console . WriteLine ( s2 ) ; // exibe : rafael cosentino
Trim
Com o mtodo Trim das strings, podemos eliminar os espaos em branco do comeo e do trmino
de uma string. Veja o exemplo abaixo.
1
2
3
4
5
6
string s1 = "
Rafael
Cosentino
";
string s2 = s1 . Trim () ;
// " Rafael
Cosentino "
System . Console . WriteLine ( s2 ) ;
No cdigo acima, a chamada ao mtodo Trim devolve a string que no possui espaos antes de
Rafael e no possui espaos aps Cosentino. Observe que os espaos entre Rafael e Cosentino
no so removidos.
Add
Podemos modificar uma data e hora acrescentando ou subtraindo milisegundos, segundos, minutos, horas, dias, meses ou anos. Essa tarefa pode ser realizada com os mtodos AddMilliseconds,
AddSeconds, AddMinutes, AddHours, AddDays, AddMonths e AddYears da classe DateTime.
1
2
3
4
5
6
7
8
9
10
102
www.k19.com.br
103
O PERADORES
Na primeira linha do cdigo acima, criado um objeto do tipo DateTime para representar a data 27
de Agosto de 2010. Na linha 4, foram adicionados 140 dias a essa data. Assim, obtemos a data 14 de
Janeiro de 2011. Na linha 7, so subtrados dois anos dessa data. Assim, a data obtida 14 de Janeiro
de 2009. Na ltima linha, so adicionadas 72 horas. Assim, a data obtida 17 de Janeiro de 2009.
Comparaes
Podemos comparar datas e horas com os operadores de comparao. Veja o exemplo abaixo.
1
2
3
4
5
6
// exibe : False
Na primeira linha do cdigo acima, criado um objeto do tipo DateTime que representa a data
27 de Agosto de 2010. Na segunda linha, um objeto do tipo DateTime criado para representar a
data no momento de execuo dessa instruo. Na linha 4, usamos o operador < para verificar se a
primeira data anterior segunda. Na linha 6, usamos o operador > para verificar se a primeira data
posterior segunda.
O operador - no pode ser aplicado a valores do tipo string. A mensagem de erro de compilao
seria semelhante apresentada abaixo.
Programa . cs (8 ,28): error CS0019 : Operator - cannot be applied to operands of
type string and string
www.facebook.com/k19treinamentos
103
O PERADORES
104
6
bool b2 = false ;
7
8
System . Console . WriteLine ( b1 > b2 ) ;
9
}
10 }
Cdigo C# 3.128: Programa.cs
Apenas os operadores de igualdade e desigualdade podem ser aplicados a valores do tipo bool. A
mensagem de erro de compilao seria semelhante apresentada abaixo.
Programa . cs (8 ,28): error CS0019 : Operator > cannot be applied to operands of
type bool and bool
O operador de negao no pode ser aplicado a valores de tipos primitivo numricos. A mensagem de erro de compilao seria semelhante apresentada abaixo.
Programa . cs (7 ,28): error CS0023 : Operator ! cannot be applied to operand of
type int
104
www.k19.com.br
105
O PERADORES
at Programa . Main ()
Nesse exemplo, declaramos a varivel a do tipo double e a varivel b do tipo int. Na linha 6, tentamos armazenar o valor de uma expresso cujo resultado do tipo double na varivel b. Como b do
tipo int, isso provoca um erro de compilao.
Programa . cs (6 ,11): error CS0266 : Cannot implicitly convert type double to
int . An explicit conversion exists ( are you missing a cast ?)
No exemplo abaixo, declaramos uma varivel do tipo float e tentamos inicializ-la com o valor
3.14.
1 class Programa
2 {
3
static void Main ()
4
{
5
float a = 3.14;
6
}
7 }
Cdigo C# 3.132: Programa.cs
105
O PERADORES
106
1 class Programa
2 {
3
static void Main ()
4
{
5
int a = 19;
6
string b = ( string ) a ;
7
}
8 }
Cdigo C# 3.133: Programa.cs
A converso de um nmero inteiro para string no permitida com o uso de casting. A classe
Programa acima no compila a apresenta o seguinte erro de compilao.
Programa . cs (6 ,14): error CS0030 : Cannot convert type int to string
Para converter um nmero inteiro para string, podemos usar o mtodo ToString. A converso de
string para int tambm no permitida usando uma operao de casting.
1 class Programa
2 {
3
static void Main ()
4
{
5
string b = " 19 " ;
6
int a = ( int ) b ;
7
}
8 }
Cdigo C# 3.134: Programa.cs
Para converter uma string para um int, podemos usar o mtodo ToInt32 da classe System.Convert.
3.24 Resumo
1
No necessrio fazer casting para copiar o valor armazenado em uma varivel de tipo simples
para outra varivel de tipo simples desde que o tipo da primeira varivel seja compatvel com o tipo
da segunda. Ver Tabela 3.1.
Apesar do tipo long ser compatvel com o tipo float, copiar valores armazenados em uma varivel do tipo long para uma varivel do tipo float pode gerar resultados indesejados.
106
www.k19.com.br
107
4
O PERADORES
A converso de valores dos tipos byte, sbyte, short, ushort, int, uint, long, ulong, float, double,
decimal e bool para string pode ser realizada atravs dos mtodos ToByte, ToSByte, ToInt16, ToUInt16,
ToInt32, ToUInt32, ToInt64, ToUInt64, ToSingle, ToDouble, ToDecimal e ToBoolean da classe System.Convert,
respectivamente.
Na diviso entre valores inteiros, se o divisor for zero, ocorrer o erro de execuo System.DivideByZeroException.
Na diviso entre valores reais, se o divisor for zero, o resultado poder ser +Infinity, -Infinity ou
NaN.
10
11
12
O contedo de uma varivel pode ser modificado atravs dos operadores de atribuio: =, +=,
-=, *=, /=, %=, ++ e --.
13
Podemos comparar o contedo das variveis ou os valores literais atravs dos operadores relacionais: ==, !=, <, <=, > e >=.
14
15
e .
16
O operador && no avalia o segundo operando se o valor do primeiro operando for false.
17
18
107
O PERADORES
19
20
21
108
108
www.k19.com.br
CAPTULO
C ONTROLE DE F LUXO
4.1 Introduo
Neste captulo, mostraremos instrues que permitem controlar o fluxo de execuo de um programa. Essas instrues aumentam a inteligncia do cdigo. Basicamente, as linguagens de programao oferecem dois tipos de instrues para controlar o fluxo de execuo dos programas: instrues de deciso e de repetio.
4.3 Instruo if
A instruo de deciso if utilizada quando um determinado trecho de cdigo deve ser executado apenas se uma condio for true. A sintaxe da instruo if a seguinte:
1 if ( condio )
2 {
3
bloco de comandos
4 }
Como funciona a instruo if? Se a condio for true, o bloco de comandos ser executado. Caso
www.facebook.com/k19treinamentos
109
C ONTROLE DE F LUXO
110
condio
false
true
bloco de
comandos
Simulao
A altura mnima para o ingresso na atrao The Barnstormer do parque temtico da Disney
Magic Kingdom 0.89 metros. Vamos simular a execuo do programa que controla o acesso dos
visitantes a essa atrao.
Na linha 1, um objeto do tipo System.Random criado. Esse objeto ser utilizado para gerar nmeros aleatrios.
1
1
2
3
4
5
6
7
8
Ao executar a linha 2, um nmero aleatrio do tipo double gerado com o mtodo NextDouble().
Vamos utilizar esse nmero para representar a altura de um visitante que deseja ingressar na atrao
The Barnstormer. Esse valor armazenado na varivel altura. Suponha que o valor 0.75 tenha sido
gerado.
2
110
www.k19.com.br
111
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
C ONTROLE DE F LUXO
altura = 0.75
altura = 0.75
0.75
4
Na sequncia, a linha 4 executada e a comparao da condio do if devolve true pois o valor
da varivel altura menor do que 0.89.
1
2
3
4
5
6
7
8
altura = 0.75
0.75
1
2
3
4
5
6
7
8
altura = 0.75
0.75
Acesso bloqueado
www.facebook.com/k19treinamentos
111
C ONTROLE DE F LUXO
1
2
3
4
5
6
7
8
112
altura = 0.75
0.75
Acesso bloqueado
The Barnstormer
Simulao
1
Na linha 1, um objeto do tipo System.Random criado. Esse objeto ser utilizado para gerar nmeros aleatrios.
1
2
3
4
5
6
7
8
Na sequncia, na linha 2, um nmero aleatrio do tipo double gerado com o mtodo NextDouble().
Vamos utilizar esse nmero para representar a altura de um visitante que deseja ingressar na atrao
The Barnstormer. Esse valor armazenado na varivel altura. Suponha que o valor 0.97 tenha sido
gerado.
2
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
altura = 0.97
altura = 0.97
0.97
112
www.k19.com.br
113
C ONTROLE DE F LUXO
1
2
3
4
5
6
7
8
altura = 0.97
0.97
5
A linha 6 no executada porque a condio do if da linha 4 falsa. Dessa forma, o fluxo de
execuo vai direto para a linha 8 e a mensagem The Barnstormer exibida no terminal.
1
2
3
4
5
6
7
8
altura = 0.97
0.97
The Barnstormer
if ( condio )
{
bloco de comandos
}
else
{
bloco de comandos
}
No exemplo acima, se a condio do if for true, o bloco de comandos do if ser executado. Caso
contrrio, ou seja, se a condio for false, o bloco de comandos do else ser executado.
A instruo else no pode aparecer sozinha no cdigo sem estar vinculada a uma instruo if.
A instruo else pode ser traduzida em portugus para seno. Em portugus, assim como em C#,
no faz sentido dizer seno sem antes dizer se. Por isso, no podemos utilizar a instruo else
sem antes ter utilizado a instruo if. A Figura 4.2 exibe o fluxograma das instrues if e else.
www.facebook.com/k19treinamentos
113
C ONTROLE DE F LUXO
114
true
condio
bloco de
comandos
do if
false
bloco de
comandos
do else
Simulao
A altura mnima para o ingresso na atrao The Barnstormer do parque temtico da Disney
Magic Kingdom 0.89 metros. Vamos simular a execuo do programa que controla o acesso dos
visitantes a essa atrao.
1
Na linha 1, um objeto do tipo System.Random criado. Esse objeto ser utilizado para gerar nmeros aleatrios.
1
2
3
4
5
6
7
8
9
10
11
12
Prosseguindo, na linha 2, um nmero aleatrio do tipo double gerado com o mtodo NextDouble().
Vamos utilizar esse nmero para representar a altura de um visitante que deseja ingressar na atrao
The Barnstormer. Esse valor armazenado na varivel altura. Suponha que o valor 0.75 tenha sido
gerado.
2
114
www.k19.com.br
115
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
C ONTROLE DE F LUXO
altura = 0.75
altura = 0.75
0.75
Na linha 4, a comparao da condio do if devolve true pois o valor da varivel altura menor
do que 0.89.
4
1
2
3
4
5
6
7
8
9
10
11
12
altura = 0.75
0.75
www.facebook.com/k19treinamentos
115
C ONTROLE DE F LUXO
1
2
3
4
5
6
7
8
9
10
11
12
116
altura = 0.75
0.75
Acesso bloqueado
Por fim, o fluxo de execuo pula para a linha 12 e a mensagem The Barnstormer exibida
no terminal.
6
1
2
3
4
5
6
7
8
9
10
11
12
altura = 0.75
0.75
Acesso bloqueado
The Barnstormer
Simulao
Na linha 1, um objeto do tipo System.Random criado. Esse objeto ser utilizado para gerar nmeros aleatrios.
1
1
2
3
4
5
6
7
8
9
10
11
12
2 Em seguida, na linha 2, um nmero aleatrio do tipo double gerado com o mtodo NextDouble().
Vamos utilizar esse nmero para representar a altura de um visitante que deseja ingressar na atrao
116
www.k19.com.br
117
C ONTROLE DE F LUXO
The Barnstormer. Esse valor armazenado na varivel altura. Suponha que o valor 0.97 tenha sido
gerado.
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
altura = 0.97
altura = 0.97
0.97
1
2
3
4
5
6
7
8
9
10
11
12
altura = 0.97
0.97
www.facebook.com/k19treinamentos
117
C ONTROLE DE F LUXO
1
2
3
4
5
6
7
8
9
10
11
12
118
altura = 0.97
0.97
Acesso liberado
Por fim, o fluxo de execuo continua e a linha 12 executada exibindo a mensagem The
Barnstormer.
6
1
2
3
4
5
6
7
8
9
10
11
12
altura = 0.97
0.97
Acesso liberado
The Barnstormer
118
www.k19.com.br
119
C ONTROLE DE F LUXO
17
18
19
20
21
22 }
}
else
{
System . Console . WriteLine ( " Valor mximo de saque R$ 400 ,00 " ) ;
}
Simulao
Nessa simulao, mostraremos um exemplo de utilizao de instrues de deciso encadeadas.
Ao executar a primeira linha, uma varivel chamada nota do tipo double declarada e inicializada
com o valor 8.2.
1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
nota = 8.2
Na sequncia, a linha 2 ser executada. Como a varivel nota armazena o valor 8.2, a operao
nota >= 5.0 devolve true.
2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
nota = 8.2
www.facebook.com/k19treinamentos
119
C ONTROLE DE F LUXO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
120
nota = 8.2
Aprovado
Continuando a execuo, a linha 5 ser processada. Como a varivel nota armazena o valor 8.2,
a operao nota < 8.0 devolve false.
4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
nota = 8.2
Aprovado
Como a condio do if da linha 5 falsa, o fluxo de execuo direcionado para a linha 11.
Assim, a mensagem Sua nota foi tima exibida na sada padro.
5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
120
nota = 8.2
www.k19.com.br
121
C ONTROLE DE F LUXO
Aprovado
Sua nota foi tima
Traduzindo para o portugus a instruo while como enquanto, fica mais fcil entender o seu
funcionamento. O cdigo acima poderia ser lido da seguinte forma: Enquanto a condio for verdadeira, execute o bloco de comandos do while.
A condio da instruo while deve ser um valor do tipo bool. Veja na Figura 4.3 o fluxo de execuo da instruo while.
www.facebook.com/k19treinamentos
121
C ONTROLE DE F LUXO
122
condio
false
true
bloco de
comandos
Considere um programa que exibe na tela cem mensagens de acordo com o seguinte padro:
Mensagem nmero 1
Mensagem nmero 2
...
Mensagem nmero 100
O cdigo acima teria cem linhas de instrues. Contudo, utilizando a instruo while, o cdigo
fica bem mais simples.
1
2
3
4
5
6
7
8
At agora, o uso da instruo while parece ser mais uma convenincia do que uma necessidade.
Vamos mudar um pouco o exemplo anterior para verificar a importncia das instrues de repetio.
Suponha que a frase Mensagem nmero x tenha de ser exibida um nmero aleatrio de vezes, mas
que no seja possvel determinar o nmero mximo de vezes que ela ser executada. Por exemplo,
122
www.k19.com.br
123
C ONTROLE DE F LUXO
suponha que a mensagem deva ser exibida enquanto o valor sorteado pelo mtodo NextDouble for
menor do que 0.99999.
1
2
3
4
5
6
7
8
9
int i = 0;
System . Random gerador = new System . Random () ;
while ( gerador . NextDouble () < 0.99999)
{
System . Console . WriteLine ( " Mensagem nmero " + ( i + 1) ) ;
i ++;
}
Cdigo C# 4.35: Exibindo a frase Mensagem nmero x um nmero aleatrio de vezes
A cada vez que executado, o programa acima pode exibir uma quantidade diferente de mensagens. Esse comportamento seria possvel sem a utilizao de uma instruo de repetio?
Simulao
Vamos simular a execuo de um programa que gera bilhetes de loteria. Para no alongar muito
a simulao, apenas 3 bilhetes sero gerados. Esses bilhetes devem ser numerados sequencialmente
iniciando com o nmero 1000.
1
2
3
4
5
6
7
numero = 1000
2
Na linha 2, a condio do while testada. Como o valor da varivel numero menor ou igual a
1002, a condio numero <= 1002 devolve true.
1
2
3
4
5
6
7
numero = 1000
Como a condio da linha 2 devolveu true, o corpo do while ser executado. Ao executar a linha
4, a mensagem Bilhete 1000 exibida no terminal.
3
www.facebook.com/k19treinamentos
123
C ONTROLE DE F LUXO
1
2
3
4
5
6
7
124
numero = 1000
Bilhete 1000
1
2
3
4
5
6
7
numero = 1001
Bilhete 1000
5
O fluxo de execuo volta para a linha 2 e a condio do while testada novamente. Mais uma
vez, o valor da varivel numero menor ou igual a 1002. Dessa forma, a condio numero <= 1002 devolve
true.
1
2
3
4
5
6
7
numero = 1001
Bilhete 1000
Como a condio da linha 2 devolveu true, o corpo do while ser executado. Ao executar a linha
4, a mensagem Bilhete 1001 exibida no terminal.
6
1
2
3
4
5
6
7
numero = 1001
Bilhete 1000
Bilhete 1001
124
www.k19.com.br
125
1
2
3
4
5
6
7
C ONTROLE DE F LUXO
numero = 1002
Bilhete 1000
Bilhete 1001
8
Agora, o fluxo de execuo volta para a linha 2 e a condio do while testada novamente. O
valor da varivel numero igual a 1002. Dessa forma, a condio numero <= 1002 ainda devolve true.
1
2
3
4
5
6
7
numero = 1002
Bilhete 1000
Bilhete 1001
Como a condio da linha 2 devolveu true, o corpo do while ser executado. Ao executar a linha
4, a mensagem Bilhete 1002 exibida no terminal.
9
1
2
3
4
5
6
7
numero = 1002
Bilhete 1000
Bilhete 1001
Bilhete 1002
10
1
2
3
4
5
6
7
numero = 1003
Bilhete 1000
Bilhete 1001
Bilhete 1002
Mais uma vez, o fluxo de execuo volta para a linha 2 para testar a condio do while. Finalmente, o valor da varivel numero no menor ou igual a 1002. Dessa forma, a condio devolve false.
11
www.facebook.com/k19treinamentos
125
C ONTROLE DE F LUXO
1
2
3
4
5
6
7
126
numero = 1003
Bilhete 1000
Bilhete 1001
Bilhete 1002
12 Como a condio da linha 2 falsa, o corpo do while no ser mais executado. Portanto, o lao
interrompido e o fluxo de execuo pula para a linha 7. Ao executar essa linha, a mensagem FIM
exibida no terminal.
1
2
3
4
5
6
7
numero = 1003
Bilhete 1000
Bilhete 1001
Bilhete 1002
FIM
No lugar da inicializao, devemos inserir os comandos que sero executados antes do incio do
lao. No lugar da condio, devemos inserir uma expresso booleana que ser verificada antes de
cada iterao (repetio) do lao. Assim, como na instruo while, o lao continuar a ser executado
enquanto essa condio for verdadeira. No lugar da atualizao, devemos inserir os comandos que
sero executadas ao final de cada iterao do lao. A Figura 4.4 exibe o fluxograma da instruo for.
126
www.k19.com.br
127
C ONTROLE DE F LUXO
inicializao
condio
false
true
bloco de
comandos
atualizao
Importante
O termo iterao utilizado quando nos referimos repetio de uma ou mais aes. O
cdigo do corpo de um lao pode ser executado diversas vezes. A cada vez que ele executado,
dizemos que ocorre uma iterao.
Considere o seguinte trecho de cdigo que utiliza a instruo de repetio while.
1
2
3
4
5
6
7
8
9
10
11
12
// inicializao
int i = 1;
// condio
while ( i <= 100)
{
// comandos
System . Console . WriteLine ( " Mensagem nmero " + i ) ;
// atualizao
i ++;
}
www.facebook.com/k19treinamentos
127
C ONTROLE DE F LUXO
128
Perceba que o cdigo ficou mais compacto sem prejudicar a compreenso. Na linha em destaque,
declaramos e inicializamos a varivel i (int i = 1), definimos a condio de execuo (i <= 100) e
definimos que ao final de cada iterao devemos atualizar a varivel i (i++). Diferentemente do while,
no for, a inicializao, a condio e a atualizao do lao so definidas na mesma linha.
Mais Sobre
Vimos que a instruo for possui 3 argumentos: inicializao, condio e atualizao.
Esses argumentos podem ser mais complexos do que os utilizados anteriormente. Podemos
declarar e/ou inicializar diversas variveis na inicializao. Podemos definir condies mais
sofisticadas com uso dos operadores lgicos. Podemos atualizar o valor de diversas variveis na
atualizao. Veja um exemplo.
1 for ( int i = 1 , j = 2; i % 2 != 0 || j % 2 == 0; i += j , j += i )
2 {
3
// comandos
4 }
Mais Sobre
Os trs argumentos da instruo for (inicializao, condio e atualizao) so opcionais. Consequentemente, o seguinte cdigo vlido apesar de ser estranho no primeiro momento.
1 for (;;)
2 {
3
// comandos
4 }
Simulao
Novamente, vamos simular a execuo de um programa que gera bilhetes de loteria. Mas agora,
vamos utilizar a instruo de repetio for. Para no alongar muito a simulao, apenas 3 bilhetes
sero gerados. Esses bilhetes devem ser numerados sequencialmente iniciando com o nmero 1000.
128
www.k19.com.br
129
1
2
3
4
5
C ONTROLE DE F LUXO
numero = 1000
Na linha 1, a condio do for testada. Como o valor da varivel numero menor ou igual a 1002,
a condio devolve true.
2
1
2
3
4
5
numero = 1000
Como a condio da linha 1 devolveu true, o corpo do for ser executado e a mensagem Bilhete
1000 exibida no terminal.
3
1
2
3
4
5
numero = 1000
Bilhete 1000
Agora, o fluxo de execuo volta para a linha 1 e a atualizao do for executada. Dessa forma,
a varivel numero incrementada para 1001.
4
1
2
3
4
5
numero = 1001
Bilhete 1000
Depois da atualizao, a condio do for testada novamente. Mais uma vez, o valor da varivel
numero menor ou igual a 1002. Dessa forma, a condio devolve true.
5
1
2
3
4
5
numero = 1001
Bilhete 1000
Como a condio da linha 1 devolveu true, o corpo do for ser executado. Ao executar a linha 3,
a mensagem Bilhete 1001 exibida no terminal.
6
www.facebook.com/k19treinamentos
129
C ONTROLE DE F LUXO
1
2
3
4
5
130
numero = 1001
Bilhete 1000
Bilhete 1001
Mais uma vez, o fluxo de execuo volta para a atualizao do for da linha 1. Dessa forma, a
varivel numero incrementada para 1002.
7
1
2
3
4
5
numero = 1002
Bilhete 1000
Bilhete 1001
Agora, a condio do for testada novamente. O valor da varivel numero ainda menor ou igual
a 1002. Dessa forma, a condio devolve true.
8
1
2
3
4
5
numero = 1002
Bilhete 1000
Bilhete 1001
Como a condio da linha 1 devolveu true, o corpo do for ser executado. Ao executar a linha 3,
a mensagem Bilhete 1002 exibida no terminal.
9
1
2
3
4
5
numero = 1002
Bilhete 1000
Bilhete 1001
Bilhete 1002
Mais uma vez, o fluxo de execuo retorna para executar a atualizao do for da linha 1. Assim,
a varivel numero incrementada para 1003.
10
1
2
3
4
5
numero = 1003
Bilhete 1000
Bilhete 1001
Bilhete 1002
130
www.k19.com.br
131
C ONTROLE DE F LUXO
Agora, a condio do for testada novamente. Finalmente, o valor da varivel numero no menor
ou igual a 1002. Dessa forma, a condio devolve false.
11
1
2
3
4
5
numero = 1003
Bilhete 1000
Bilhete 1001
Bilhete 1002
Como a condio do for da linha 1 falsa, o lao interrompido e o fluxo de execuo pula
para a linha 5. Ao executar essa linha, a mensagem FIM exibida no terminal.
12
1
2
3
4
5
numero = 1003
Bilhete 1000
Bilhete 1001
Bilhete 1002
FIM
No exemplo acima, para cada iterao do lao externo, h 200 iteraes do lao interno. Portanto,
o corpo do lao interno executa 800 vezes. Esse valor exatamente a quantidade de ingressos.
Alm de encadear fors, podemos encadear whiles. Veja algumas variaes do exemplo anterior.
1
2
3
4
5
6
7
8
9
10
11
int i = 1;
while ( i <= 4)
{
int j = 1;
while ( j <= 200)
{
System . Console . WriteLine ( " SETOR : " + i + " CADEIRA : " + j ) ;
j ++;
}
i ++;
}
www.facebook.com/k19treinamentos
131
C ONTROLE DE F LUXO
1
2
3
4
5
6
7
8
9
10
132
int i = 1;
while ( i <= 4)
{
int j = 1;
for ( int j = 1; j <= 200; j ++)
{
System . Console . WriteLine ( " SETOR : " + i + " CADEIRA : " + j ) ;
}
i ++;
}
Simulao
A seguir, simulamos a execuo de dois laos do tipo for encadeados.
1 Na linha 1, temos a execuo de um lao for. Primeiramente, ocorre a declarao de uma varivel
do tipo int chamada i, que inicializada com o valor 0.
i=0
i=0
Como a condio do lao da linha 1 verdadeira, a linha 3 executada. Nessa linha, temos
um lao for. Assim, sua execuo comea pela inicializao. A varivel j do tipo int declarada e
inicializada com o valor de i+1. Como i armazena o valor 0, a varivel j inicializada com o valor 1.
3
132
www.k19.com.br
133
C ONTROLE DE F LUXO
i=0
j=1
4
Em seguida, a condio do lao da linha 3 verificada. Como a varivel j armazena o valor 1, a
operao j <= 2 devolve true.
i=0
j=1
Como a condio do lao da linha 3 verdadeira, a linha 5 executada. Assim, os valores armazenados nas variveis i e j so exibidos na sada padro.
5
i=0
j=1
i = 0, j = 1
Aps a execuo do corpo do lao da linha 3, o fluxo desviado para a atualizao do lao. Assim,
a operao j++ executada e a varivel j passa a armazenar o valor 2.
6
i=0
j=2
i = 0, j = 1
7
Aps a atualizao do lao da linha 3, a condio desse lao verificada. Como a varivel j
armazena o valor 2, a operao j <= 2 devolve true.
www.facebook.com/k19treinamentos
133
C ONTROLE DE F LUXO
134
i=0
j=2
i = 0, j = 1
8
Como a condio do lao da linha 3 verdadeira, o corpo desse lao executado. Assim, a
instruo da linha 5 executada e os valores das variveis i e j so exibidos na sada padro.
i=0
j=2
i = 0, j = 1
i = 0, j = 2
Aps a execuo do corpo do lao da linha 3, o fluxo direcionado para a atualizao do lao.
Assim, a operao j++ executada e a varivel j passa a armazenar o valor 3.
9
i=0
j=3
i = 0, j = 1
i = 0, j = 2
Aps a atualizao do lao da linha 3, a condio desse lao verificada. Como a varivel j
armazena o valor 3, o resultado da operao j <= 2 false e a execuo desse lao encerrada.
10
i=0
j=3
i = 0, j = 1
i = 0, j = 2
11
Ao final da execuo do corpo do lao da linha 1, o fluxo de execuo direcionado para a
atualizao desse lao. Assim, a operao i++ processada e o valor 1 atribudo varivel i.
134
www.k19.com.br
135
C ONTROLE DE F LUXO
i=1
i = 0, j = 1
i = 0, j = 2
12 Aps a atualizao do lao da linha 1, a condio desse lao avaliada. Como o valor armazenado
em i 1, a operao i <= 2 devolve true.
i=1
i = 0, j = 1
i = 0, j = 2
Como a condio do lao da linha 1 verdadeira, o corpo desse lao executado. Assim, o lao
da linha 3 executado. O lao da linha 3 comea pela declarao e inicializao da varivel j do tipo
int. Como a varivel i armazena o valor 1, o resultado da operao i+1 2. Portanto, o valor 2
atribudo varivel j.
13
i=1
j=2
i = 0, j = 1
i = 0, j = 2
i=1
j=2
i = 0, j = 1
i = 0, j = 2
Como a condio do lao da linha 3 verdadeira, o corpo desse lao executado. Assim, a
instruo da linha 5 processada e os valores armazenados nas variveis i e j so exibidos na sada
15
www.facebook.com/k19treinamentos
135
C ONTROLE DE F LUXO
136
padro.
1 for ( int i = 0; i <= 2; i ++)
2 {
3
for ( int j = i + 1; j <= 2; j ++)
4
{
5
System . Console . WriteLine ( " i = " + i + " , j = " + j ) ;
6
}
7 }
i=1
j=2
i = 0, j = 1
i = 0, j = 2
i = 1, j = 2
i=1
j=3
i = 0, j = 1
i = 0, j = 2
i = 1, j = 2
Aps a atualizao do lao da linha 3, sua condio testada. Como a varivel j armazena o
valor 3, a operao j <= 2 devolve false e a execuo desse lao encerrada.
17
i=1
j=3
i = 0, j = 1
i = 0, j = 2
i = 1, j = 2
18
Depois da execuo do corpo do lao da linha 1, o valor da varivel i atualizado. Como i
armazena o valor 1, a operao i++ atribui o valor 2 varivel i.
i=2
i = 0, j = 1
i = 0, j = 2
i = 1, j = 2
19
136
www.k19.com.br
137
C ONTROLE DE F LUXO
i=2
i = 0, j = 1
i = 0, j = 2
i = 1, j = 2
Como a condio do lao da linha 1 verdadeira, o corpo desse lao executado. Sendo assim,
o lao da linha 3 processado. Isso comea com a declarao e inicializao da varivel j. Como i
armazena o valor 2, a varivel j inicializada com o valor 3.
20
i=2
j=3
i = 0, j = 1
i = 0, j = 2
i = 1, j = 2
21
Em seguida, a condio do lao da linha 3 testada. Como a varivel j armazena o valor 3, a
operao j <= 2 devolve false. Assim, a execuo desse lao encerrada.
i=2
j=3
i = 0, j = 1
i = 0, j = 2
i = 1, j = 2
i=3
i = 0, j = 1
i = 0, j = 2
i = 1, j = 2
www.facebook.com/k19treinamentos
137
C ONTROLE DE F LUXO
138
i=3
i = 0, j = 1
i = 0, j = 2
i = 1, j = 2
int soma = 0;
System . Random gerador = new System . Random () ;
for ( int i = 1; i <= 100; i ++)
{
System . Console . WriteLine ( " Lanamento : " + i ) ;
int numero = ( int ) ( gerador . NextDouble () * 6 + 1) ;
System . Console . WriteLine ( " Nmero : " + numero ) ;
soma += numero ;
System . Console . WriteLine ( " Soma : " + soma ) ;
if ( soma > 360)
{
System . Console . WriteLine ( " Voc ganhou com " + i + " lanamentos " ) ;
break ;
}
}
System . Console . WriteLine ( " Jogue Novamente " ) ;
www.k19.com.br
139
C ONTROLE DE F LUXO
Importante
A instruo break deve aparecer somente dentro do corpo de um lao ou dentro do
corpo de um switch. Veremos a instruo switch neste captulo.
Importante
Quando a instruo break utilizada dentro de uma cadeia de laos, ela interrompe o
lao mais interno. No exemplo abaixo, trs laos encadeados foram definidos.
1 for ( int i = 0; i < 10; i ++)
2 {
3
for ( int j = 0; j < 10; j ++)
4
{
5
for ( int k = 0; k < 10; k ++)
6
{
7
}
8
}
9 }
Se a instruo break for utilizada em qualquer lugar dentro do corpo do terceiro lao, esse lao
ser interrompido.
1 for ( int i = 0; i < 10; i ++)
2 {
3
for ( int j = 0; j < 10; j ++)
4
{
5
for ( int k = 0; k < 10; k ++)
6
{
7
...
8
break ; // interrompe o terceiro lao
9
...
10
}
11
}
12 }
Caso contrrio, se a instruo break for utilizada dentro do corpo do segundo lao mas fora do
terceiro lao, o segundo lao ser interrompido.
1 for ( int i = 0; i < 10; i ++)
2 {
3
for ( int j = 0; j < 10; j ++)
4
{
5
...
6
break ; // interrompe o segundo lao
7
...
8
for ( int k = 0; k < 10; k ++)
9
{
10
}
11
}
12 }
Caso contrrio, se a instruo break for utilizada dentro do primeiro lao mas fora do segundo
lao, o primeiro lao ser interrompido.
1 for ( int i = 0; i < 10; i ++)
2 {
www.facebook.com/k19treinamentos
139
C ONTROLE DE F LUXO
3
4
5
6
7
8
9
10
11
12 }
140
...
break ; // interrompe o primeiro lao
...
for ( int j = 0; j < 10; j ++)
{
for ( int k = 0; k < 10; k ++)
{
}
}
Simulao
Vamos simular a execuo do jogo de dados descrito anteriormente. Para no alongar muito a
simulao, considere que o nmero mximo de lanamentos 2 e o valor que deve ser ultrapassado
7.
1
Na linha 1, um objeto do tipo System.Random criado. Esse objeto ser utilizado para gerar nmeros aleatrios.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
140
www.k19.com.br
141
1
2
3
4
5
6
7
8
9
10
11
12
13
14
C ONTROLE DE F LUXO
soma = 0
15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
soma = 0
i=1
15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
www.facebook.com/k19treinamentos
141
C ONTROLE DE F LUXO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
142
soma = 0
i=1
15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
Como a condio da linha 3 devolveu true, o corpo do for ser executado. Ao executar a linha 5,
a mensagem Lanamento: 1 exibida no terminal.
5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
soma = 0
i=1
15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
Lanamento : 1
6
Na sequncia, a linha 6 executada. Um nmero aleatrio entre 1 e 6 gerado e armazenado na
varivel numero. Suponha que o nmero 5 tenha sido gerado.
142
www.k19.com.br
143
1
2
3
4
5
6
7
8
9
10
11
12
13
14
C ONTROLE DE F LUXO
soma = 0
i=1
numero = 5
15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
Lanamento : 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
soma = 0
i=1
numero = 5
15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
Lanamento : 1
Nmero : 5
Adiante, a linha 9 executada e o valor da varivel numero incrementado na varivel soma. Dessa
forma, a varivel soma passa a armazenar o valor 5.
8
www.facebook.com/k19treinamentos
143
C ONTROLE DE F LUXO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
144
soma = 5
i=1
numero = 5
15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
Lanamento : 1
Nmero : 5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
soma = 5
i=1
numero = 5
15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
Lanamento : 1
Nmero : 5
Soma : 5
144
www.k19.com.br
145
1
2
3
4
5
6
7
8
9
10
11
12
13
14
C ONTROLE DE F LUXO
soma = 5
i=1
numero = 5
15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
Lanamento : 1
Nmero : 5
Soma : 5
Como a condio da linha 12 falsa, o corpo do if no ser executado e o fluxo de execuo vai
para a atualizao do for na linha 3. Dessa forma, a varivel i incrementada para 2.
11
1
2
3
4
5
6
7
8
9
10
11
12
13
14
soma = 5
i=2
15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
Lanamento : 1
Nmero : 5
Soma : 5
12 Novamente, na linha 3, a condio do for testada. Como o valor da varivel i menor ou igual
a 2, a condio devolve true.
www.facebook.com/k19treinamentos
145
C ONTROLE DE F LUXO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
146
soma = 5
i=2
15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
Lanamento : 1
Nmero : 5
Soma : 5
Como a condio da linha 3 devolveu true, o corpo do for ser executado. Ao executar a linha 5,
a mensagem Lanamento: 2 exibida no terminal.
13
1
2
3
4
5
6
7
8
9
10
11
12
13
14
soma = 5
i=2
15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
Lanamento : 1
Nmero : 5
Soma : 5
Lanamento : 2
146
www.k19.com.br
147
1
2
3
4
5
6
7
8
9
10
11
12
13
14
C ONTROLE DE F LUXO
soma = 5
i=2
numero = 3
15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
Lanamento : 1
Nmero : 5
Soma : 5
Lanamento : 2
15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
soma = 5
i=2
numero = 3
15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
Lanamento : 1
Nmero : 5
Soma : 5
Lanamento : 2
Nmero : 3
Adiante, a linha 9 executada e o valor da varivel numero incrementado na varivel soma. Dessa
forma, a varivel soma passa a armazenar o valor 8.
16
www.facebook.com/k19treinamentos
147
C ONTROLE DE F LUXO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
148
soma = 8
i=2
numero = 3
15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
Lanamento : 1
Nmero : 5
Soma : 5
Lanamento : 2
Nmero : 3
17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
soma = 8
i=2
numero = 3
15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
Lanamento : 1
Nmero : 5
Soma : 5
Lanamento : 2
Nmero : 3
Soma : 8
148
www.k19.com.br
149
1
2
3
4
5
6
7
8
9
10
11
12
13
14
C ONTROLE DE F LUXO
soma = 8
i=2
numero = 3
15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
Lanamento : 1
Nmero : 5
Soma : 5
Lanamento : 2
Nmero : 3
Soma : 8
Como a condio da linha 12 verdadeira, o corpo do if ser executado. Ao executar a linha 14,
a mensagem Voc ganhou com 2 lanamentos exibida no terminal.
19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
soma = 8
i=2
numero = 3
15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
Lanamento : 1
Nmero : 5
Soma : 5
Lanamento : 2
Nmero : 3
Soma : 8
Voc ganhou com 2 lanamentos
20
www.facebook.com/k19treinamentos
149
C ONTROLE DE F LUXO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
150
soma = 8
i=2
numero = 3
15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
Lanamento : 1
Nmero : 5
Soma : 5
Lanamento : 2
Nmero : 3
Soma : 8
Voc ganhou com 2 lanamentos
21
1
2
3
4
5
6
7
8
9
10
11
12
13
14
soma = 8
15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
Lanamento : 1
Nmero : 5
Soma : 5
Lanamento : 2
Nmero : 3
Soma : 8
Voc ganhou com 2 lanamentos
Jogue Novamente
www.k19.com.br
151
C ONTROLE DE F LUXO
de um lao, uma determinada iterao seja abortada, fazendo com que o fluxo de execuo continue
para a prxima iterao.
O cdigo abaixo simula o jogo de dados discutido anteriormente com a variao proposta.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int soma = 0;
System . Random gerador = new System . Random () ;
for ( int i = 1; i <= 100; i ++)
{
System . Console . WriteLine ( " Lanamento : " + i ) ;
int numero = ( int ) ( gerador . NextDouble () * 6 + 1) ;
System . Console . WriteLine ( " Nmero : " + numero ) ;
if ( numero % 2 != 0)
{
continue ;
}
soma += numero ;
System . Console . WriteLine ( " Soma : " + soma ) ;
if ( soma > 180)
{
System . Console . WriteLine ( " Voc ganhou com " + i + " lanamentos " ) ;
break ;
}
}
System . Console . WriteLine ( " Jogue Novamente " ) ;
No trecho destacado, calculamos o resto da diviso do nmero gerado aleatoriamente por dois.
Alm disso, na condio do if, verificamos se esse valor diferente de zero. Se essa condio for
verdadeira, significa que o nmero gerado aleatoriamente mpar e consequentemente deve ser
descartado. No corpo do if, utilizamos a instruo continue para abortar a iterao atual.
Importante
Quando aplicada a laos while, a instruo continue pula para a condio do lao. Por
outro lado, quando aplicada a laos for, ela pula para a atualizao do lao.
Importante
Quando a instruo continue utilizada dentro de uma cadeia de laos, ela afeta o lao
mais interno. No exemplo abaixo, trs laos encadeados foram definidos.
1 for ( int i = 0; i < 10; i ++)
2 {
3
for ( int j = 0; j < 10; j ++)
4
{
5
for ( int k = 0; k < 10; k ++)
6
{
7
}
8
}
9 }
Se a instruo continue for utilizada em qualquer lugar dentro do corpo do terceiro lao, esse lao
www.facebook.com/k19treinamentos
151
C ONTROLE DE F LUXO
152
ser afetado.
1 for ( int i = 0; i <
2 {
3
for ( int j = 0; j
4
{
5
for ( int k = 0;
6
{
7
...
8
continue ; //
9
...
10
}
11
}
12 }
10; i ++)
< 10; j ++)
k < 10; k ++)
Caso contrrio, se a instruo continue for utilizada dentro do corpo do segundo lao mas fora
do terceiro lao, o segundo lao ser afetado.
1 for ( int i = 0; i < 10; i ++)
2 {
3
for ( int j = 0; j < 10; j ++)
4
{
5
...
6
continue ; // afeta o segundo lao
7
...
8
for ( int k = 0; k < 10; k ++)
9
{
10
}
11
}
12 }
Caso contrrio, se a instruo continue for utilizada dentro do terceiro lao mas fora do segundo
lao, o primeiro lao ser afetado.
1 for ( int i =
2 {
3
...
4
continue ;
5
...
6
for ( int j
7
{
8
for ( int
9
{
10
}
11
}
12 }
Simulao
Vamos simular a execuo de um programa que gera aleatoriamente dois nmeros inteiros entre
1 e 100 e exibe no terminal apenas os mpares.
Na linha 1, um objeto do tipo System.Random criado. Esse objeto ser utilizado para gerar nmeros aleatrios.
1
152
www.k19.com.br
153
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
C ONTROLE DE F LUXO
i=1
3
Na sequncia, a condio do for testada. Como o valor da varivel i menor ou igual a 2, essa
condio devolve true.
1
2
3
4
5
6
7
8
9
10
i=1
O corpo do for executado porque a condio da linha 2 devolveu true. Ao executar a linha 4,
um nmero aleatrio entre 1 e 100 gerado e armazenado na varivel numero. Suponha que o valor
gerado seja 38.
4
1
2
3
4
5
6
7
8
9
10
www.facebook.com/k19treinamentos
i=1
numero = 38
153
C ONTROLE DE F LUXO
154
Na linha 5, verificamos se o resto da diviso do valor da varivel numero por 2 igual a 0. Como
essa varivel est armazenando o valor 38, a condio do if devolve true, pois o resto da diviso de
38 por 2 0.
5
1
2
3
4
5
6
7
8
9
10
i=1
numero = 38
6
Como a condio da linha 5 devolveu true, o corpo do if executado. Ao executar a linha 7, a
instruo continue pula para a prxima iterao.
1
2
3
4
5
6
7
8
9
10
i=1
numero = 38
Devido ao desvio causado pela instruo continue, o fluxo de execuo vai para a atualizao do
i=2
8
Na sequncia, a condio do for testada. Como valor da varivel i menor ou igual a 2, essa
condio devolve true.
1
2
3
4
5
6
7
8
9
10
154
i=2
www.k19.com.br
155
C ONTROLE DE F LUXO
O corpo do for executado porque a condio da linha 2 devolveu true. Ao executar a linha 4,
um nmero aleatrio entre 1 e 100 gerado e armazenado na varivel numero. Suponha que o valor
gerado seja 97.
9
1
2
3
4
5
6
7
8
9
10
i=2
numero = 97
Na linha 5, verificamos se o resto da diviso do valor da varivel numero por 2 igual a 0. Como
essa varivel est armazenando o valor 97, a condio do if devolve false, pois o resto da diviso de
97 por 2 no 0.
10
1
2
3
4
5
6
7
8
9
10
i=2
numero = 97
Como a condio da linha 5 devolveu false, o corpo do if no executado. Dessa forma, o fluxo
de execuo vai direto para a linha 9 e o valor 97 exibido no terminal.
11
1
2
3
4
5
6
7
8
9
10
i=2
numero = 97
97
12
Prosseguindo, o fluxo de execuo vai para a atualizao do for na linha 2. Dessa forma, a
varivel i incrementada para 3.
www.facebook.com/k19treinamentos
155
C ONTROLE DE F LUXO
1
2
3
4
5
6
7
8
9
10
156
i=3
97
1
2
3
4
5
6
7
8
9
10
i=3
97
156
www.k19.com.br
157
C ONTROLE DE F LUXO
Lembre-se
Na linguagem C#, apenas blocos de cdigo com apenas um comando podem ser associados s instrues de deciso if e else ou s instrues de repetio while e for.
Normalmente, no delimitar com chaves os blocos de cdigo com dois ou mais comandos gera
erros de lgica ou at mesmo erros de compilao. Para evitar esses problemas, a utilizao das
chaves mesmo em blocos com apenas um comando recomendada.
Considere o seguinte trecho de cdigo.
1
2
3
4
5
6
7
8
9
if ( a < 10)
a = a * 2 + 1;
else
{
if ( a < 20)
a = a * 3 + 1;
else
a = a * 4 + 1;
}
+ 1;
20)
+ 1;
+ 1;
Os leitores mais desavisados desse cdigo podem assumir a existncia da instruo else if. Contudo, essa instruo no existe na linguagem C#. Na verdade, nesse exemplo, o segundo if pertence
ao corpo do primeiro else.
www.facebook.com/k19treinamentos
157
C ONTROLE DE F LUXO
158
int i = 1;
while ( i < 10)
{
System . Console . WriteLine ( " K19 " ) ;
}
Observe que a condio nunca devolver o valor false. Como a varivel i inicializada com o
valor 1 e no mais atualizada, a condio i < 10 ser sempre verdadeira. Dessa forma, os laos
acima nunca sero interrompidos. Eles sero executados indefinidamente. Esses laos so chamados popularmente de laos infinitos.
Vamos considerar a utilizao da instruo switch com chaves dos tipos sbyte, byte, short, ushort,
int, uint, long, ulong, char e string.
Para cada caso, exceto para caso padro (default), necessrio definir uma expresso constante
compatvel com o tipo da chave do switch. No permitido definir dois casos com expresses de
mesmo valor. Tambm no permitido definir mais do que um caso padro.
Quando o valor da chave for igual ao valor da expressao1, o bloco 1 ser executado. Quando o
valor da chave for igual ao valor da expressao2, os bloco 2 ser executado. Quando o valor da chave
for igual ao valor da expressao3, o bloco 3 ser executado. Quando o valor da chave no for igual ao
valor da expressao1, expressao2 ou expressao3, apenas o bloco 4 ser executado.
No final de cada bloco, necessrio utilizar a instruo break para interromper o switch ou acionar
outro bloco com o comando goto. No exemplo abaixo, quando a chave for igual a 0, o programa
exibir 0, 2 e default. Quando a chave for igual a 1, o programa exibir apenas 1. Quando a chave
158
www.k19.com.br
159
C ONTROLE DE F LUXO
for igual a 2, o programa exibir 2 e default. Caso contrrio, o programa exibir apenas default.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Mais Sobre
O nmero de casos que podem ser declarados em um switch ilimitado. Alm disso, o
caso padro (default) opcional. Tecnicamente, um switch sem nenhum caso vlido. Portanto,
o cdigo a seguir est correto.
1
2
3
4
5
int x = 1;
switch ( x )
{
}
Cdigo C# 4.146: Um switch vazio
O mesmo bloco pode ser associado a vrios casos. No exemplo abaixo, se a nota for A ou B, a
mensagem timo ser exibida na sada padro. Se a nota for C, a mensagem Regular ser exibida
na sada padro. Se a nota for D ou E, a mensagem Ruim ser exibida na sada padro.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
char nota = A ;
switch ( nota )
{
case A :
case B :
System . Console . WriteLine ( " timo " ) ;
break ;
case C :
System . Console . WriteLine ( " Regular " ) ;
break ;
case D :
case E :
System . Console . WriteLine ( " Ruim " ) ;
break ;
}
Cdigo C# 4.147: Um bloco associado a vrios casos
www.facebook.com/k19treinamentos
159
C ONTROLE DE F LUXO
160
Simulao
Nessa simulao, mostraremos um exemplo de utilizao da instruo switch.
Ao executar a linha 1, uma varivel do tipo int chamada tipoDeSeguro declarada e inicializada
com o valor 2.
1
1
2
3
4
5
6
7
8
9
10
11
12
13
int tipoDeSeguro = 2;
switch ( tipoDeSeguro )
{
case 1:
System . Console . WriteLine ( " CARRO RESERVA " ) ;
goto case 2;
case 2:
System . Console . WriteLine ( " GUINCHO E VIDROS " ) ;
goto case 3;
case 3:
System . Console . WriteLine ( " ROUBO E COLISO " ) ;
break ;
}
tipoDeSeguro = 2
int tipoDeSeguro = 2;
switch ( tipoDeSeguro )
{
case 1:
System . Console . WriteLine ( " CARRO RESERVA " ) ;
goto case 2;
case 2:
System . Console . WriteLine ( " GUINCHO E VIDROS " ) ;
goto case 3;
case 3:
System . Console . WriteLine ( " ROUBO E COLISO " ) ;
break ;
}
tipoDeSeguro = 2
3 Como o valor da varivel tipoDeSeguro armazena o valor 2, o fluxo de execuo direcionado para
a linha 8. Na execuo dessa linha, a mensagem GUINCHO E VIDROS exibida na sada padro.
1
2
3
4
5
6
7
8
9
10
11
12
13
int tipoDeSeguro = 2;
switch ( tipoDeSeguro )
{
case 1:
System . Console . WriteLine ( " CARRO RESERVA " ) ;
goto case 2;
case 2:
System . Console . WriteLine ( " GUINCHO E VIDROS " ) ;
goto case 3;
case 3:
System . Console . WriteLine ( " ROUBO E COLISO " ) ;
break ;
}
tipoDeSeguro = 2
GUINCHO E VIDROS
160
www.k19.com.br
161
C ONTROLE DE F LUXO
A prxima linha a ser executada a linha 9. Ao executar essa linha, o fluxo de execuo direcionado para a linha 11.
4
1
2
3
4
5
6
7
8
9
10
11
12
13
int tipoDeSeguro = 2;
switch ( tipoDeSeguro )
{
case 1:
System . Console . WriteLine ( " CARRO RESERVA " ) ;
goto case 2;
case 2:
System . Console . WriteLine ( " GUINCHO E VIDROS " ) ;
goto case 3;
case 3:
System . Console . WriteLine ( " ROUBO E COLISO " ) ;
break ;
}
tipoDeSeguro = 2
GUINCHO E VIDROS
A prxima linha a ser executada a linha 11. Ao executar essa linha, a mensagem ROUBO E
COLISO ser exibida na sada padro.
5
1
2
3
4
5
6
7
8
9
10
11
12
13
int tipoDeSeguro = 2;
switch ( tipoDeSeguro )
{
case 1:
System . Console . WriteLine ( " CARRO RESERVA " ) ;
goto case 2;
case 2:
System . Console . WriteLine ( " GUINCHO E VIDROS " ) ;
goto case 3;
case 3:
System . Console . WriteLine ( " ROUBO E COLISO " ) ;
break ;
}
tipoDeSeguro = 2
GUINCHO E VIDROS
ROUBO E COLISO
A prxima linha a ser executada a linha 12. Ao executar essa linha, a instruo break interrompe
o switch.
6
1
2
3
4
5
6
7
8
9
10
11
12
13
int tipoDeSeguro = 2;
switch ( tipoDeSeguro )
{
case 1:
System . Console . WriteLine ( " CARRO RESERVA " ) ;
goto case 2;
case 2:
System . Console . WriteLine ( " GUINCHO E VIDROS " ) ;
goto case 3;
case 3:
System . Console . WriteLine ( " ROUBO E COLISO " ) ;
break ;
}
tipoDeSeguro = 2
GUINCHO E VIDROS
ROUBO E COLISO
www.facebook.com/k19treinamentos
161
C ONTROLE DE F LUXO
162
A condio deve ser um valor do tipo bool. Veja na Figura 4.5 o fluxograma da instruo do-while.
bloco de
comandos
true
condio
false
No exemplo abaixo, a varivel x que do tipo int foi inicializada com o valor 10. Na primeira iterao, a condio do while falsa, pois o valor da varivel x no menor do que 10. Consequentemente,
o bloco do while no ser executado nem ao menos uma vez.
1
2
3
4
5
6
int x = 10;
while ( x < 10)
{
System . Console . WriteLine ( x ) ;
x ++;
}
Cdigo C# 4.155: Um while que no executa
No exemplo abaixo, substitumos a instruo while pela instruo do-while. Nesse caso, o bloco
do lao sempre ser executado ao menos uma vez, pois a condio do lao verificada somente no
final das iteraes e no no comeo como ocorre no while.
1 int x = 10;
2 do
3 {
4
System . Console . WriteLine ( x ) ;
162
www.k19.com.br
163
C ONTROLE DE F LUXO
5
x ++;
6 } while ( x < 10) ;
Cdigo C# 4.156: Utilizando a instruo do-while
Simulao
Nessa simulao, mostraremos um exemplo de utilizao da instruo do-while.
Na execuo da linha 1, uma varivel do tipo int chamada a declarada e inicializada com o
valor 1.
1
1
2
3
4
5
6
7
int a = 1;
do
{
System . Console . WriteLine ( a ) ;
a ++;
} while ( a < 3) ;
System . Console . WriteLine ( " FIM " ) ;
1
2
3
4
5
6
7
a=1
int a = 1;
do
{
System . Console . WriteLine ( a ) ;
a ++;
} while ( a < 3) ;
System . Console . WriteLine ( " FIM " ) ;
a=1
1
2
3
4
5
6
7
int a = 1;
do
{
System . Console . WriteLine ( a ) ;
a ++;
} while ( a < 3) ;
System . Console . WriteLine ( " FIM " ) ;
a=2
4
Na sequncia, a linha 6 executada. Como a varivel a armazena o valor 2, a operao a < 3
devolve true. Sendo assim, o lao continua executando.
www.facebook.com/k19treinamentos
163
C ONTROLE DE F LUXO
1
2
3
4
5
6
7
164
int a = 1;
do
{
System . Console . WriteLine ( a ) ;
a ++;
} while ( a < 3) ;
System . Console . WriteLine ( " FIM " ) ;
a=2
5
Continuando a execuo, a linha 4 processada e o valor armazenado na varivel a exibido na
sada padro.
1
2
3
4
5
6
7
int a = 1;
do
{
System . Console . WriteLine ( a ) ;
a ++;
} while ( a < 3) ;
System . Console . WriteLine ( " FIM " ) ;
a=2
1
2
Com a execuo da linha 5, o valor da varivel a atualizado com o operador ++ e essa varivel
passa a armazenar o valor 3.
6
1
2
3
4
5
6
7
int a = 1;
do
{
System . Console . WriteLine ( a ) ;
a ++;
} while ( a < 3) ;
System . Console . WriteLine ( " FIM " ) ;
a=3
1
2
Agora, a linha 6 executada. Como a varivel a armazena o valor 3, a operao a < 3 devolve
int a = 1;
do
{
System . Console . WriteLine ( a ) ;
a ++;
} while ( a < 3) ;
System . Console . WriteLine ( " FIM " ) ;
a=3
1
2
164
www.k19.com.br
165
1
2
3
4
5
6
7
C ONTROLE DE F LUXO
int a = 1;
do
{
System . Console . WriteLine ( a ) ;
a ++;
} while ( a < 3) ;
System . Console . WriteLine ( " FIM " ) ;
a=3
1
2
FIM
int contador = 0;
while ( contador < 100)
{
break ;
contador ++; // aviso - unreachable code
}
Analogamente, o mesmo problema ocorre no cdigo abaixo. A constante contador foi inicializada
com o valor 10. Por ser uma constante, no podemos alterar o seu contedo. Dessa forma, o corpo
do while nunca seria executado. Nesse caso, novamente ocorreria um unreachable code. Se contador
fosse uma varivel, nenhum aviso seria gerado pelo compilador.
1
2
3
4
5
Tambm podemos observar esse problema no exemplo abaixo. A constante contador foi inicializada com o valor 0. Dessa forma, a condio do while sempre verdadeira. Como no h nada que
interrompa o lao, as linhas depois do corpo do while nunca seriam executadas. Nesse caso, mais
uma vez ocorreria um unreachable code.
1
2
3
4
5
6
www.facebook.com/k19treinamentos
165
C ONTROLE DE F LUXO
166
1 class Programa
2 {
3
static void Main ()
4
{
5
System . Random gerador = new System . Random () ;
6
double a = gerador . NextDouble () ;
7
double b = gerador . NextDouble () ;
8
9
if ( a + b )
10
{
11
a *= 2;
12
}
13
else
14
{
15
a /= 2;
16
}
17
}
18 }
Cdigo C# 4.168: Programa.cs
Observe que o corpo do comando if possui apenas uma instruo, j que as chaves no foram
utilizadas. Dessa forma, a instruo System.Console.WriteLine("Menor") separa o comando else do if.
Programa . cs (9 ,3): error CS1525 : Invalid expression term else
Programa . cs (9 ,7): error CS1002 : ; expected
www.k19.com.br
167
C ONTROLE DE F LUXO
Um erro de compilao em C# ocorre quando a instruo else seguida por uma condio.
1 class Programa
2 {
3
static void Main ()
4
{
5
int a = 1;
6
if ( a < 10)
7
System . Console . WriteLine ( " Menor " ) ;
8
else ( a > 10)
9
System . Console . WriteLine ( " Maior " ) ;
10
}
11 }
Cdigo C# 4.170: Programa.cs
No cdigo acima, ocorre um erro de compilao na linha 8, pois a instruo else no admite uma
condio como na instruo if.
Programa . cs (8 ,15): error CS1002 : ; expected
www.facebook.com/k19treinamentos
167
C ONTROLE DE F LUXO
168
1 class Programa
2 {
3
static void Main ()
4
{
5
int a = 1;
6
while ( a < 10)
7
{
8
System . Console . WriteLine ( a ) ;
9
}
10
}
11 }
Cdigo C# 4.172: Programa.cs
Observe que a condio a < 10 sempre verdadeira porque a varivel a foi inicializada com o
valor 1 e ela nunca alterada. Consequentemente, o corpo do while ser executado indefinidamente.
No cdigo acima, ocorre um erro de compilao na linha 7, pois a chave da instruo switch do
tipo double.
Programa . cs (7 ,11): error CS0151 : A switch expression or case label must be a
bool , char , string , integral , enum , or corresponding nullable type
168
www.k19.com.br
169
C ONTROLE DE F LUXO
5
6
7
8
9
10
11
12
13
14
15
16
17
}
18 }
int a = 1;
int b = 2;
switch ( a )
{
case 1:
System . Console . WriteLine (1) ;
break ;
case b :
System . Console . WriteLine ( b ) ;
break ;
}
No cdigo acima, ocorre um erro de compilao na linha 13, pois a expresso do segundo caso
da instruo switch no constante.
Programa . cs (13 ,9): error CS0150 : A constant value is expected
169
C ONTROLE DE F LUXO
170
Ocorrem erros de compilao ocorre quando os argumentos do lao for so separados por vrgula
ao invs de ponto e vrgula.
1 class Programa
2 {
3
static void Main ()
4
{
5
for ( int i = 0 , i < 10 , i ++)
6
{
7
System . Console . WriteLine ( i ) ;
8
}
9
}
10 }
Cdigo C# 4.176: Programa.cs
4.26 Resumo
1
Para utilizar a instruo de deciso if, devemos definir uma condio e um corpo. O corpo o
bloco de cdigo que ser executado se e somente se a condio for true.
Para utilizar a instruo else, devemos definir um corpo. Essa instruo sempre est associada
instruo if. O corpo do else executado se e somente se a condio do if correspondente for
false.
Instrues de deciso podem ser encadeadas. Em outras palavras, podemos definir ifs e elses
dentro de ifs ou elses.
Para utilizar a instruo de repetio while, devemos definir uma condio e um corpo. O
corpo executado se e somente se a condio for true. Aps cada execuo do corpo, a condio
reavaliada para decidir se o corpo deve ser executado novamente.
170
www.k19.com.br
171
C ONTROLE DE F LUXO
Para utilizar a instruo de repetio for, devemos definir uma inicializao, uma condio,
uma atualizao e um corpo. Primeiro, a inicializao executada e em seguida a condio avaliada. Se a condio for true, o corpo executado. Caso contrrio, a execuo do lao encerrada.
Aps cada execuo do corpo, a atualizao processada e a condio reavaliada para decidir se o
corpo deve ser executado novamente.
Instrues de repetio podem ser encadeadas. Em outra palavras, podemos definir whiles e
10
A instruo continue interrompe a execuo de uma iterao. No while, o continue desvia o fluxo
de execuo para a condio. No for, o continue desvia o fluxo de execuo para a atualizao.
11
Quando o corpo do if possui apenas um comando, ele no precisa ser delimitado com chaves.
A mesma regra vale para o else, while, do-while e for.
12
13
Se a condio de um lao sempre true, o corpo desse lao ser executado repetidamente sem
parar (laos infinitos).
www.facebook.com/k19treinamentos
171
C ONTROLE DE F LUXO
172
172
www.k19.com.br
CAPTULO
A RRAY
5.1 Introduo
Considere um programa de computador que realiza clculos matemticos com os preos dos
produtos de um supermercado. Por exemplo, esse programa calcula a mdia dos preos e encontra
o produto mais barato.
Para manipular os preos dos produtos, dentro de um programa, esses valores devem ser armazenados em variveis.
1
2
3
4
double preco1 ;
double preco2 ;
double preco3 ;
...
Como uma varivel do tipo double armazena somente um valor de cada vez, seria necessrio criar
uma varivel para cada produto. Considerando que em um supermercado existem milhares de produtos, essa abordagem no prtica, pois seria necessrio criar uma grande quantidade de variveis.
Nesses casos, podemos utilizar arrays.
www.facebook.com/k19treinamentos
173
A RRAY
174
Quando um array criado, necessrio definir o tipo de valor que pode ser armazenado em cada
posio. Na analogia com armrio, seria como se tivssemos que definir o que pode ser guardado em
cada gaveta. Por exemplo, se definirmos que um armrio deve guardar livros, ento somente livros
podem ser armazenados nas gavetas desse armrio. No poderemos guardar revistas ou jornais.
REVISTA
LIVRO
5.3 Referncias
Em C#, os arrays so objetos. Para manipular (controlar) um objeto, necessrio possuir uma
referncia do mesmo. Uma referncia de um array como o controle remoto de uma TV. Atravs do
controle remoto, podemos controlar a TV. Atravs da referncia, podemos controlar o array.
174
www.k19.com.br
175
A RRAY
1
2
-/--
0
CH
Importante
Os arrays no so armazenados em variveis. Somente as referncias dos arrays so
armazenadas em variveis.
5.4 Declarao
Antes de criar um array, necessrio declarar uma varivel para armazenar a referncia desse
array. Nessa declarao, o tipo da varivel o tipo das variveis contidas no array seguido dos caracteres [ e ] (colchetes).
1 int [] numeros ;
Cdigo C# 5.2: Declarao
Duas ou mais variveis podem ser declaradas na mesma instruo. No exemplo abaixo, as variveis numeros, codigos e matriculas so do tipo array de int. Os nomes das variveis devem ser separados
por vrgula.
1 int [] numeros , codigos , matriculas ;
Cdigo C# 5.3: Declarando diversas variveis na mesma instruo
5.5 Inicializao
Para criar um array, podemos utilizar o operador new. Na criao de um array, a capacidade deve
ser informada dentro dos colchetes. Essa capacidade pode ser qualquer valor no negativo que pode
ser convertido implicitamente para os tipos simples int, uint, long ou ulong.
No exemplo abaixo, o operador new cria um array com 10 posies para armazenar valores do tipo
int e devolve a referncia do mesmo. Essa referncia armazenada na varivel numeros.
www.facebook.com/k19treinamentos
175
A RRAY
176
int[]
INFORMA O TIPO DO
NOVO OBJETO
IDENTIFICADOR DA VARIVEL
nomeDoArray
new
INSTANCIA UM
NOVO OBJETO
int[10];
INFORMA A QUANTIDADE
DE POSIES DO ARRAY
Quando um array criado, todas as posies so inicializadas com valores padro. Se as variveis
contidas no array forem de um tipo simples numrico, todas so inicializadas com o valor 0. Se elas
forem do tipo simples bool, todas so inicializadas com o valor false. Se elas forem de um tipo no
simples, todas so inicializadas com o valor null.
1 int [] numeros = new int [10]; // as posies so inicializadas com 0
2
3 bool [] aprovados = new bool [10]; // as posies so inicializadas com false
4
5 string [] nomes = new string [10]; // as posies so inicializadas com null
Cdigo C# 5.7: Valores padro
176
www.k19.com.br
177
A RRAY
Simulao
Nessa simulao, mostraremos um exemplo de utilizao de array.
Ao executar a linha 1, um array com trs variveis do tipo double criado. Essas trs variveis so
inicializadas com o valor real 0.0.
1
1
2
3
4
5
6
precos[0] = 0.0
precos[1] = 0.0
precos[2] = 0.0
1
2
3
4
5
6
precos[0] = 17.54
precos[1] = 0.0
precos[2] = 0.0
3
Na sequncia, a linha 3 executada e o valor real 23.81 armazenado na varivel de ndice 1 do
array criado na linha 1.
1
2
3
4
5
6
www.facebook.com/k19treinamentos
precos[0] = 17.54
precos[1] = 23.81
precos[2] = 0.0
177
A RRAY
178
Agora, a linha 4 ser executada e o valor armazenado na varivel de ndice 0 do array criado na
linha 1 exibido na sada padro.
4
1
2
3
4
5
6
precos[0] = 17.54
precos[1] = 23.81
precos[2] = 0.0
17.54
1
2
3
4
5
6
precos[0] = 17.54
precos[1] = 23.81
precos[2] = 0.0
17.54
23.81
6
Por fim, a linha 6 ser executada e o valor armazenado na varivel de ndice 2 do array criado na
linha 1 exibido na sada padro.
1
2
3
4
5
6
precos[0] = 17.54
precos[1] = 23.81
precos[2] = 0.0
17.54
23.81
0
O mesmo array pode ser criado de uma forma mais simples. No exemplo abaixo, novamente, um
array para armazenar valores do tipo int foi criado com capacidade para trs variveis. A primeira
posio foi inicializada com o valor 1, a segunda, com o valor 2 e a terceira foi inicializada com o
valor 3.
178
www.k19.com.br
179
A RRAY
A propriedade Length
No exemplo anterior, a capacidade do array foi inserida diretamente no cdigo fonte em trs
pontos diferentes. Essa prtica pode dificultar algumas mudanas na lgica do cdigo. Em particular, para alterar a capacidade do array de 100 posies para 50 posies, trs lugares devem ser
alterados. Basicamente, todos os lugares onde a capacidade do array foi inserida diretamente no
cdigo teriam de ser alterados.
1
2
3
4
5
6
7
8
9
10
11
Para facilitar esse tipo de modificao, podemos utilizar a propriedade Length. Todo array possui
essa propriedade e ela armazena a capacidade do array. No exemplo abaixo, o array foi criado com
100 posies. Nos laos, utilizamos a propriedade Length para recuperar a capacidade do array.
www.facebook.com/k19treinamentos
179
A RRAY
1
2
3
4
5
6
7
8
9
10
11
180
Agora, para alterar a capacidade do array de 100 posies para 50 posies, um nico ponto do
cdigo deve ser alterado.
O lao foreach
Como vimos, o for tradicional pode ser utilizado para percorrer as posies de um array.
1 for ( int i = 0; i < numeros . Length ; i ++)
2 {
3
System . Console . WriteLine ( numeros [ i ]) ;
4 }
Cdigo C# 5.22: Percorrendo um array com o for tradicional
Se o objetivo for somente percorrer as posies de um array sem modificar o seu contedo, podemos utilizar o lao foreach. O exemplo abaixo apresenta a sintaxe desse lao.
1 foreach ( int numero in numeros )
2 {
3
System . Console . WriteLine ( numero ) ;
4 }
Cdigo C# 5.23: Sintaxe do lao foreach
direita da palavra chave in, necessrio indicar a varivel que contm uma referncia do array
que desejamos percorrer. No exemplo acima, a varivel numeros foi indicada. esquerda da palavra
chave in, necessrio declarar uma varivel compatvel com o tipo das variveis armazenadas no
array. No exemplo acima, a varivel numero do tipo int foi declarada. Na primeira iterao do lao,
o valor armazenado na primeira posio do array copiado e guardado na varivel numero. Na segunda iterao, o valor da segunda posio do array copiado e guardado na varivel numero e assim
sucessivamente at a ltima posio do array.
180
www.k19.com.br
181
A RRAY
3
3
1
0
Figura 5.5: Abstrao de um array multidimensional
Basicamente, os arrays multidimensionais so arrays de arrays. H dois tipos de arrays multidimensionais: os retangulares (rectangular arrays) e os irregulares (jagged arrays).
Declarao
No exemplo abaixo, a varivel numeros pode armazenar uma referncia de um array bidimensional retangular. A quantidade de dimenses igual quantidade de vrgulas definidas dentro dos
colchetes mais um.
1 int [ ,] numeros ;
Cdigo C# 5.24: Array bidimensional retangular
Agora, no prximo exemplo, a varivel numeros pode guardar uma referncia de um array bidimensional irregular. A quantidade de dimenses igual quantidade de pares de colchetes.
1 int [][] numeros ;
Cdigo C# 5.25: Array bidimensional irregular
No exemplo abaixo, a varivel x pode guardar uma referncia de um array bidimensional retangular, a varivel y pode guardar uma referncia de um array tridimensional retangular e a varivel z
pode guardar uma referncia de um array quadridimensional retangular.
1 int [ ,] x ; // bidimensional retangular
www.facebook.com/k19treinamentos
181
A RRAY
182
2
3 int [ , ,] y; // tridimensional retangular
4
5 int [ , , ,] z ; // quadrimensional retangular
Cdigo C# 5.26: Arrays multidimensionais retangulares
No exemplo abaixo, a varivel x pode guardar uma referncia de um array bidimensional irregular, a varivel y pode guardar uma referncia de um array tridimensional irregular e a varivel z pode
guardar uma referncia de um array quadridimensional irregular.
1 int [][] x ; // bidimensional irregular
2
3 int [][][] y ; // tridimensional irregular
4
5 int [][][][] z ; // quadrimensional irregular
Cdigo C# 5.27: Arrays multidimensionais irregulares
Inicializao
Na criao de um array multidimensional retangular, a capacidade de todas as dimenses deve
ser definida. No exemplo abaixo, um array bidimensional retangular foi criado. A primeira dimenso
foi definida com capacidade igual a 10 e a segunda dimenso com capacidade igual a 20. Dessa
forma, temos espao para armazenar 200 (isto , 10 20) valores do tipo int.
1 int [ ,] numeros = new int [10 , 20];
Cdigo C# 5.29: Inicializando um array multidimensional retangular
Por outro lado, na criao de um array multidimensional irregular, apenas a capacidade da primeira dimenso deve ser definida. No exemplo abaixo, um array bidimensional irregular foi criado.
A primeira dimenso foi definida com capacidade igual a 5. Em cada posio desse array, podemos
armazenar uma referncia de um array unidimensional. Podemos definir capacidades diferentes
para esses arrays unidimensionais.
1
2
3
4
5
6
7
=
=
=
=
=
new
new
new
new
new
int [1];
int [2];
int [3];
int [4];
int [5];
Cdigo C# 5.30: Inicializando um array multidimensional irregular
182
www.k19.com.br
183
A RRAY
No prximo exemplo, foi criado um array bidimensional irregular com capacidade 2. Na primeira
posio desse array, armazenamos uma referncia de um array unidimensional com capacidade 3.
Na segunda posio, armazenamos uma referncia de outro array unidimensional com capacidade
2. No primeiro array unidimensional, os valores 1, 2 e 3 foram armazenados. No segundo array
unidimensional, os valors 4 e 5 foram armazenados.
1 int [][] numeros = new int [][] { new int [] { 1 , 2 , 3 } , new int [] { 4 , 5 } };
Acesso
Para acessar uma posio em um array multidimensional retangular, necessrio definir um
ndice para cada dimenso. No exemplo abaixo, armazenamos o valor 1 na posio [2, 3].
1 int [ ,] numeros = . . .
2
3 numeros [2 , 3] = 1;
Cdigo C# 5.35: Acessando as posies de um array multidimensional retangular
www.facebook.com/k19treinamentos
183
A RRAY
184
3 numeros [1 , 2 , 3] = 1;
Cdigo C# 5.36: Acessando as posies de um array multidimensional retangular
Agora, para acessar uma posio em um array multidimensional irregular, tambm necessrio
definir um ndice para cada dimenso. No exemplo abaixo, armazenamos o valor 1 na quarta posio
(posio 3) do terceiro (posio 2) array unidimensional.
1 int [][] numeros = . . .
2
3 numeros [2][3] = 1;
Cdigo C# 5.38: Acessando as posies de um array multidimensional irregular
Nesse outro exemplo, armazenamos o valor 1 na quarta posio (posio 3) do terceiro (posio
2) array unidimensional do segundo (posio 1) array bidimensional.
1 int [][][] numeros = . . .
2
3 numeros [1][2][3] = 1;
Cdigo C# 5.39: Acessando as posies de um array multidimensional irregular
184
www.k19.com.br
185
A RRAY
8
}
9 }
Cdigo C# 5.41: Percorrendo um array bidimensional retangular
No prximo exemplo, percorremos todas as posies de um array tridimensional retangular utilizando trs laos encadeados.
1
2
3
4
5
6
7
8
9
10
11
12
No prximo exemplo, trs laos encadeados foram utilizados para percorrer um array tridimensional irregular.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
www.facebook.com/k19treinamentos
185
A RRAY
186
Simulao
Nessa simulao, mostraremos um exemplo de utilizao de array multidimensional.
Ao executar a linha 1, um array bidimensional retangular 2 por 2 do tipo int criado. Todas as
posies desse array so inicializadas com valor padro do tipo int, ou seja, todas as posies so
inicializadas com o valor 0.
1
1
2
3
4
5
6
7
8
9
x[0][0] = 0
x[0][1] = 0
0]) ;
1]) ;
0]) ;
1]) ;
x[1][0] = 0
x[1][1] = 0
2
Em seguida, a linha 2 executada e o valor inteiro 1 armazenado na varivel de ndice [0, 0] do
array criado na linha 1.
1
2
3
4
5
6
7
8
9
x[0][0] = 1
x[0][1] = 0
0]) ;
1]) ;
0]) ;
1]) ;
x[1][0] = 0
x[1][1] = 0
3
Na sequncia, a linha 3 executada e o valor inteiro 2 armazenado na varivel de ndice [0, 1]
do array criado na linha 1.
1
2
3
4
5
6
7
8
9
x[0][0] = 1
x[0][1] = 2
0]) ;
1]) ;
0]) ;
1]) ;
x[1][0] = 0
x[1][1] = 0
Agora, a linha 4 executada e o valor inteiro 3 armazenado na varivel de ndice [1, 0] do array
criado na linha 1.
4
186
www.k19.com.br
187
1
2
3
4
5
6
7
8
9
A RRAY
x[0][0] = 1
x[0][1] = 2
0]) ;
1]) ;
0]) ;
1]) ;
x[1][0] = 3
x[1][1] = 0
1
2
3
4
5
6
7
8
9
x[0][0] = 1
x[0][1] = 2
0]) ;
1]) ;
0]) ;
1]) ;
x[1][0] = 3
x[1][1] = 4
Em seguida, a linha 6 ser executada e o valor armazenado na varivel de ndice [0, 0] do array
criado na linha 1 exibido na sada padro.
6
1
2
3
4
5
6
7
8
9
x[0][0] = 1
x[0][1] = 2
0]) ;
1]) ;
0]) ;
1]) ;
x[1][0] = 3
x[1][1] = 4
Na sequncia, a linha 7 ser executada e o valor armazenado na varivel de ndice [0, 1] do array
criado na linha 1 exibido na sada padro.
7
1
2
3
4
5
6
7
8
9
x[0][0] = 1
x[0][1] = 2
0]) ;
1]) ;
0]) ;
1]) ;
x[1][0] = 3
x[1][1] = 4
1
2
www.facebook.com/k19treinamentos
187
A RRAY
188
Na sequncia, a linha 8 ser executada e o valor armazenado na varivel de ndice [1, 0] do array
criado na linha 1 exibido na sada padro.
8
1
2
3
4
5
6
7
8
9
x[0][0] = 1
x[0][1] = 2
0]) ;
1]) ;
0]) ;
1]) ;
x[1][0] = 3
x[1][1] = 4
1
2
3
Por fim, a linha 9 ser executada e o valor armazenado na varivel de ndice [1, 1] do array criado
na linha 1 exibido na sada padro.
9
1
2
3
4
5
6
7
8
9
x[0][0] = 1
x[0][1] = 2
0]) ;
1]) ;
0]) ;
1]) ;
x[1][0] = 3
x[1][1] = 4
1
2
3
4
No cdigo acima, ocorre um erro de compilao na linha 7, pois um valor de tipo double foi utilizado como ndice do array.
Programa . cs (7 ,36): error CS0266 : Cannot implicitly convert type double to
int . An explicit conversion exists ( are you missing a cast ?)
188
www.k19.com.br
189
A RRAY
No cdigo acima, tentamos acessar a posio de nmero 5 do array a. Apesar do array possuir 5
posies, elas devem ser acessadas com ndices que variam de 0 a 4.
Unhandled Exception : System . IndexOutOfRangeException : Index was outside the boun
ds of the array .
at Programa . Main ()
5.14 Resumo
1
189
A RRAY
190
A capacidade de um array retangular pode ser obtida atravs do mtodo GetLength e a capacidade de um array irregular pode ser obtida atravs do atributo Length.
190
www.k19.com.br
CAPTULO
M TODOS
6.1 Introduo
Considere o sistema de uma empresa que precisa gerar diversos tipos de documentos como recibos, atestados e relatrios. Os dados da empresa devem aparecer no cabealho desses documentos.
1 System . Console . WriteLine ( " ------------ K19 Treinamentos ------------" ) ;
2 System . Console . WriteLine ( " ----------- contato@k19 . com . br -----------" ) ;
Cdigo C# 6.1: Cabealho
As duas linhas de cdigo acima exibem o cabealho dos documentos. Toda vez que um documento gerado, esse trecho de cdigo deve ser executado. A primeira abordagem para resolver esse
problema replicar essas duas linhas toda vez que for necessrio. Contudo, essa replicao tornar
a manuteno do sistema mais complicada.
Por exemplo, suponha que o sistema j esteja funcionando e o trecho de cdigo que exibe o cabealho dos documentos tenha sido replicado muitas vezes. Agora, considere uma mudana simples
no cabealho dos documentos. O telefone da empresa deve aparecer depois do email. Para atender
a essa nova regra, ser necessrio modificar o cdigo fonte em vrios lugares.
De forma geral, toda vez que houver uma alterao no cabealho, ser necessrio modificar muitos lugares do cdigo fonte. Consequentemente, a manuteno do sistema ser mais demorada.
Para facilitar eventuais mudanas no cabealho, podemos utilizar o conceito de mtodo. Um mtodo permite que um determinado trecho de cdigo possa ser reutilizado vrias vezes.
www.facebook.com/k19treinamentos
191
M TODOS
192
A palavra chave static permite que o mtodo ExibeCabecalho possa ser utilizado sem a criao
de um objeto. O conceito de objeto no faz parte do contedo deste livro. Portanto, utilizaremos o
modificador static na declarao de todos os mtodos desse material.
A palavra chave void indica que o mtodo ExibeCabecalho no devolver nenhuma resposta depois
de ser executado.
direita da palavra chave void, definimos o nome do mtodo. Em nosso caso, o nome do mtodo
ExibeCabecalho. Os nomes dos mtodos so utilizados para cham-los posteriormente.
Depois do nome do mtodo, os parmetros so definidos dentro de parnteses. Como o mtodo
ExibeCabecalho no precisa de parmetros, nada foi definido dentro dos parnteses.
Por fim, direita dos parmetros, foi definido o corpo do mtodo ExibeCabecalho. No corpo de um
mtodo, colocamos as instrues que devem ser executadas quando esse mtodo for chamado.
Observe, no cdigo abaixo, o mtodo ExibeCabecalho sendo chamado duas vezes.
1 class Programa
2 {
3
static void Main ()
4
{
5
// chamando o mtodo ExibeCabecalho
6
ExibeCabecalho () ;
7
System . Console . WriteLine ( " Recibo : R$ 545 ,00 " ) ;
8
9
System . Console . WriteLine () ;
10
11
// chamando mtodo ExibeCabecalho
12
ExibeCabecalho () ;
13
System . Console . WriteLine ( " Atestado de Matrcula : Jonas Keizo Hirata " ) ;
14
}
15
16
static void ExibeCabecalho ()
17
{
18
System . Console . WriteLine ( " ------------ K19 Treinamentos ------------" ) ;
19
System . Console . WriteLine ( " ----------- contato@k19 . com . br -----------" ) ;
20
}
21 }
Agora, acrescentar o telefone da empresa no cabealho dos documentos muito fcil. Basta
alterar o cdigo do mtodo ExibeCabecalho.
1 static void ExibeCabecalho ()
2 {
3
System . Console . WriteLine ( " ------------ K19 Treinamentos ------------" ) ;
4
System . Console . WriteLine ( " ----------- contato@k19 . com . br -----------" ) ;
5
System . Console . WriteLine ( " -------------- 11 2387 -3791 --------------" ) ;
6 }
192
www.k19.com.br
193
M TODOS
6.3 Parmetros
Considere um programa de computador que realiza operaes financeiras como o clculo de
juro simples por exemplo. Para evitar repetio de cdigo, podemos definir um mtodo para realizar
esse clculo e reutiliz-lo toda vez que for necessrio.
1 static void CalculaJuroSimples ()
2 {
3
double juro = 10000 * 0.015 * 12;
4 }
Observe que o mtodo acima considera um capital fixo de R$ 10.000,00, uma taxa de juro fixa de
1,5% e um perodo fixo de 12 meses. De fato, esse mtodo no muito til porque toda vez que ele
for chamado, ele realizar o clculo com esses valores fixos.
Para tornar o mtodo CalculaJuroSimples mais til, devemos parametriz-lo. Basicamente, os parmetros de um mtodo so variveis que permitem que valores diferentes sejam passados a cada
chamada desse mtodo.
1 static void CalculaJuroSimples ( double capital , double taxa , int periodo )
2 {
3
double juro = capital * taxa * periodo ;
4 }
No cdigo acima, trs parmetros foram definidos para o mtodo CalculaJuroSimples: capital, taxa
e periodo. O primeiro parmetro do tipo double, o segundo tambm do tipo double e o terceiro do
tipo int.
Agora, nas chamadas do mtodo CalculaJuroSimples, devemos passar os trs valores necessrios
para o clculo do juro simples. No exemplo a seguir, o mtodo Main chama o mtodo CalculaJuroSimples
duas vezes. Na primeira chamada, os valores passados como parmetros so 10000, 0.015 e 12. Na
segunda chamada, os valores passados como parmetros so 25400, 0.02 e 30.
1 class Programa
2 {
3
static void Main ()
4
{
5
CalculaJuroSimples (10000 , 0.015 , 12) ;
6
7
CalculaJuroSimples (25400 , 0.02 , 30) ;
8
}
9
10
static void CalculaJuroSimples ( double capital , double taxa , int periodo )
11
{
12
double juro = capital * taxa * periodo ;
13
}
14 }
6.4 Resposta
O valor calculado dentro do mtodo CalculaJuroSimples armazenado em uma varivel local. Essa
varivel no pode ser acessada dentro do mtodo Main. Em outras palavras, o mtodo Main no tem
acesso ao valor do juro que foi calculado dentro do mtodo CalculaJuroSimples.
www.facebook.com/k19treinamentos
193
M TODOS
194
Todo mtodo pode, ao final do seu processamento, devolver uma resposta para quem o chamou.
O comando return indica o valor de resposta de um mtodo.
1 static double CalculaJuroSimples ( double capital , double taxa , int periodo )
2 {
3
double juro = capital * taxa * periodo ;
4
return juro ;
5 }
Um mtodo pode devolver outros tipos de valores. Para isso, basta modificar a marcao de
retorno definindo o tipo de valor que o mtodo devolver. Veja alguns exemplos.
1 static int Metodo ()
2 {
3
// corpo de um mtodo que devolve int
4 }
194
www.k19.com.br
195
M TODOS
Simulao
Nessa simulao, mostraremos um exemplo de chamada de mtodo.
Na execuo da linha 5, uma varivel do tipo int chamada a declarada e inicializada com o
valor 1. Essa varivel uma varivel local do mtodo Main.
1
1 class Metodos
2 {
3
static void Main ()
4
{
5
int a = 1;
6
int b = 2;
7
int c = soma (a , b ) ;
8
System . Console . WriteLine ( c ) ;
9
}
10
static int soma ( int a , int b )
11
{
12
int c = a + b ;
13
return c ;
14
}
15 }
amain = 1
Na sequncia, a linha 6 executada e uma varivel do tipo int chamada b declarada e inicializada com o valor 2. Essa varivel uma varivel local do mtodo Main.
2
1 class Metodos
2 {
3
static void Main ()
4
{
5
int a = 1;
6
int b = 2;
7
int c = soma (a , b ) ;
8
System . Console . WriteLine ( c ) ;
9
}
10
static int soma ( int a , int b )
11
{
12
int c = a + b ;
13
return c ;
14
}
15 }
amain = 1
bmain = 2
3
Em seguida, na linha 7, o mtodo soma chamado. Os valores armazenados nas variveis a e b do
mtodo Main so passados como argumentos nessa chamada de mtodo.
www.facebook.com/k19treinamentos
195
M TODOS
1 class Metodos
2 {
3
static void Main ()
4
{
5
int a = 1;
6
int b = 2;
7
int c = soma (a , b ) ;
8
System . Console . WriteLine ( c ) ;
9
}
10
static int soma ( int a , int b )
11
{
12
int c = a + b ;
13
return c ;
14
}
15 }
196
amain = 1
bmain = 2
Agora, as variveis a e b do mtodo soma recebem os valores passados como argumentos no passo
anterior. Essas variveis so variveis locais do mtodo soma.
4
1 class Metodos
2 {
3
static void Main ()
4
{
5
int a = 1;
6
int b = 2;
7
int c = soma (a , b ) ;
8
System . Console . WriteLine ( c ) ;
9
}
10
static int soma ( int a , int b )
11
{
12
int c = a + b ;
13
return c ;
14
}
15 }
amain = 1
bmain = 2
asoma = 1
bsoma = 2
Na sequncia, ao executar a linha 12, a soma dos valores armazenados nas variveis a e b do
mtodo soma armazenada na varivel c. Essa varivel c uma varivel local do mtodo soma
5
1 class Metodos
2 {
3
static void Main ()
4
{
5
int a = 1;
6
int b = 2;
7
int c = soma (a , b ) ;
8
System . Console . WriteLine ( c ) ;
9
}
10
static int soma ( int a , int b )
11
{
12
int c = a + b ;
13
return c ;
14
}
15 }
amain = 1
bmain = 2
asoma = 1
bsoma = 2
csoma = 3
Em seguida, ao executar a linha 13, o valor armazenado na varivel c do mtodo soma devolvido
como resposta para o mtodo Main.
6
196
www.k19.com.br
197
M TODOS
1 class Metodos
2 {
3
static void Main ()
4
{
5
int a = 1;
6
int b = 2;
7
int c = soma (a , b ) ;
8
System . Console . WriteLine ( c ) ;
9
}
10
static int soma ( int a , int b )
11
{
12
int c = a + b ;
13
return c ;
14
}
15 }
amain = 1
bmain = 2
asoma = 1
bsoma = 2
csoma = 3
Agora, o fluxo de execuo volta para o mtodo Main. Na linha 7, a varivel c desse mtodo recebe
a resposta da chamada do mtodo soma.
7
1 class Metodos
2 {
3
static void Main ()
4
{
5
int a = 1;
6
int b = 2;
7
int c = soma (a , b ) ;
8
System . Console . WriteLine ( c ) ;
9
}
10
static int soma ( int a , int b )
11
{
12
int c = a + b ;
13
return c ;
14
}
15 }
amain = 1
bmain = 2
cmain = 3
Por fim, na execuo da linha 8, o valor da varivel c do mtodo Main exibido na sada padro.
1 class Metodos
2 {
3
static void Main ()
4
{
5
int a = 1;
6
int b = 2;
7
int c = soma (a , b ) ;
8
System . Console . WriteLine ( c ) ;
9
}
10
static int soma ( int a , int b )
11
{
12
int c = a + b ;
13
return c ;
14
}
15 }
amain = 1
bmain = 2
cmain = 3
www.facebook.com/k19treinamentos
197
M TODOS
198
Alteraes nos valores armazenados nas variveis do mtodo ExibeSoma no afetam o contedo
das variveis do mtodo Main e vice e versa.
Para exemplificar esse comportamento, considere o cdigo abaixo. Na linha 5, a varivel a do
mtodo Main foi declarada e inicializada com o valor 1. Na chamada do mtodo Teste, na linha 7, o
valor armazenado nessa varivel copiado para a varivel a do mtodo Teste. O contedo da varivel
a do mtodo Teste alterado na linha 14 e essa varivel passa a armazenar o valor 2. Quando o fluxo
de execuo volta para o mtodo Main, o mtodo WriteLine utilizado para exibir o valor da varivel a
do mtodo Main. Essa varivel armazena o valor 1. Portanto, na sada padro, o nmero 1 ser exibido.
1 class Programa
2 {
3
static void Main ()
4
{
5
int a = 1;
6
7
Teste ( a ) ;
8
9
System . Console . WriteLine ( a ) ; // exibe 1
10
}
11
12
static void Teste ( int a )
13
{
14
a = 2;
15
}
16 }
Cdigo C# 6.22: Programa.cs
198
www.k19.com.br
199
M TODOS
Simulao
Nessa simulao, mostraremos um exemplo de passagem de parmetros.
Na execuo da linha 5, uma varivel do tipo int chamada a declarada e inicializada com o
valor 1. Essa varivel uma varivel local do mtodo Main.
1
1 class Parametros
2 {
3
static void Main ()
4
{
5
int a = 1;
6
Troca ( a ) ;
7
System . Console . WriteLine ( a ) ;
8
}
9
static void Troca ( int a )
10
{
11
a = 2;
12
}
13 }
amain = 1
amain = 1
Agora, a varivel a do mtodo Troca recebe o valor passado como argumento no passo anterior.
Essa varivel uma varivel local do mtodo Troca.
3
1 class Parametros
2 {
3
static void Main ()
4
{
5
int a = 1;
6
Troca ( a ) ;
7
System . Console . WriteLine ( a ) ;
8
}
9
static void Troca ( int a )
10
{
11
a = 2;
12
}
13 }
www.facebook.com/k19treinamentos
amain = 1
atroca = 1
199
M TODOS
200
Na execuo da linha 11, o valor da varivel a do mtodo Troca alterado. Essa alterao no
afeta o valor da varivel a do mtodo Main, pois essas variveis so independentes.
4
1 class Parametros
2 {
3
static void Main ()
4
{
5
int a = 1;
6
Troca ( a ) ;
7
System . Console . WriteLine ( a ) ;
8
}
9
static void Troca ( int a )
10
{
11
a = 2;
12
}
13 }
amain = 1
atroca = 2
O fluxo de execuo volta para o mtodo Main. Ao executar a linha 7, o valor da varivel a do
mtodo Main exibido na sada padro, ou seja, o nmero 1 exibido na sada padro.
5
1 class Parametros
2 {
3
static void Main ()
4
{
5
int a = 1;
6
Troca ( a ) ;
7
System . Console . WriteLine ( a ) ;
8
}
9
static void Troca ( int a )
10
{
11
a = 2;
12
}
13 }
amain = 1
6.6 Sobrecarga
No exemplo abaixo, o mtodo Maximo recebe como parmetro exatamente dois valores do tipo
double e devolve o maior deles.
1 static double Maximo ( double a , double b )
2 {
3
if ( a > b )
4
{
5
return a ;
6
}
7
else
8
{
9
return b ;
10
}
11 }
Esse mtodo pode ser utilizado toda vez que temos dois valores do tipo double e desejamos descobrir qual o maior. As chamadas abaixo mostram a utilizao do mtodo Maximo.
1 double m1 = Maximo (7.8 , 9.8) ;
2 double m2 = Maximo (3.2 , 1.7) ;
3 double m3 = Maximo (5.4 , 4.9) ;
200
www.k19.com.br
201
M TODOS
Agora, considere que, com bastante frequncia, necessrio descobrir o mximo entre trs valores do tipo double. Para resolver esse problema, o mtodo MaximoEntreTresValores foi definido.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Os dois mtodos acima possuem objetivos muito parecidos. Um deles descobre quem o maior
entre dois valores do tipo double. O outro descobre quem o maior entre trs valores do tipo double.
Esses mtodos podem ser utilizados de forma semelhante ao apresentado no cdigo abaixo.
1 double m1 = Maximo (7.8 , 9.8) ;
2 double m2 = MaximoEntreTresValores (3.2 , 1.7 , 4.1) ;
De forma anloga e conforme a necessidade, poderamos definir o mtodo MaximoEntreQuatroValores ou MaximoEntreCincoValores. Do ponto de vista prtico, no interessante ter mtodos com objetivos to semelhantes mas com nomes diferentes.
Para simplificar, podemos definir diversos mtodos com o mesmo nome. No exemplo abaixo,
trs mtodos chamados Maximo foram definidos. As quantidades de parmetros que esses mtodos
recebem so diferentes.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
www.facebook.com/k19treinamentos
201
M TODOS
202
Nas chamadas desses mtodos, eles so diferenciados de acordo com a quantidade de argumentos utilizados. No cdigo a seguir, a primeira chamada aciona o mtodo Maximo que recebe dois parmetros. A segunda chamada aciona o mtodo Maximo que recebe trs parmetros. A terceira chamada
aciona o mtodo Maximo que recebe quatro parmetros.
1 double m1 = Maximo (7.8 , 9.8) ;
2 double m2 = Maximo (3.2 , 1.7 , 4.1) ;
3 double m3 = Maximo (7.5 , 6.3 , 9.7 , 8.8) ;
Regra
Dois mtodos podem ter o mesmo nome se as respectivas listas de parmetros so diferentes em
quantidade ou tipo. Se essa regra no for respeitada ocorrer erro de compilao.
No exemplo abaixo, h uma sobrecarga invlida porque os dois mtodos que possuem o mesmo
nome tambm possuem listas de parmetros equivalentes. Os dois recebem dois parmetros do tipo
double.
1
2
3
4
5
6
7
8
9
double
double
double
double
s1
s2
s3
s4
=
=
=
=
CalculaSomatorio (1.5 ,
CalculaSomatorio (5.1 ,
CalculaSomatorio (5.5 ,
CalculaSomatorio (1.9 ,
2.7 ,
1.7 ,
4.2 ,
2.1 ,
6.4) ;
3.2) ;
4.7) ;
5.0) ;
Observe que o mtodo CalculaSomatorio s pode ser utilizado para calcular o somatrio de exatamente trs valores do tipo double. Contudo, ele seria mais til se pudesse calcular o somatrio de
zero ou mais valores do tipo double. Para isso, o mtodo CalculaSomatorio precisa ser capaz de receber
zero ou mais valores como parmetro.
202
www.k19.com.br
203
M TODOS
double
double
double
double
s1
s2
s3
s4
=
=
=
=
CalculaSomatorio () ;
CalculaSomatorio (5.1) ;
CalculaSomatorio (5.5 , 4.2) ;
CalculaSomatorio (1.9 , 2.1 , 5.0) ;
Agora, considere um mtodo que calcula e devolve a mdia aritmtica de valores do tipo double.
Matematicamente, no faz sentido calcular a mdia aritmtica de zero nmeros. Portanto, esse mtodo deve receber pelo menos um argumento do tipo double.
No exemplo abaixo, o mtodo CalculaMedia foi definido com um parmetro do tipo double e um
parameter-array de double. Sendo assim, a cada chamada desse mtodo, necessrio passar como
argumento pelo menos um valor do tipo double.
1 static double CalculaMedia ( double valor , params double [] valores )
2 {
3
double soma = valor ;
4
for ( int i = 0; i < valores . Length ; i ++)
5
{
6
soma += valores [ i ];
7
}
8
return soma / (1 + valores . Length ) ;
9 }
double
double
double
double
m1
m2
m3
m4
=
=
=
=
CalculaMedia (3.5) ;
CalculaMedia (5.1 , 6.7) ;
CalculaMedia (5.5 , 4.2 , 8.9) ;
CalculaMedia (1.9 , 2.1 , 5.0 , 8.8) ;
www.facebook.com/k19treinamentos
203
M TODOS
204
Regra
H uma regra fundamental relacionada utilizao de parameter-arrays. O parameter-array, se
existir, deve ser o ltimo parmetro do mtodo correspondente. Dessa forma, as listas de parmetros
dos mtodos abaixo esto corretas.
1
2
3
4
5
6
7
Uma concluso imediata da regra de utilizao de parameter-arrays que todo mtodo pode ter
no mximo um parameter-array.
204
www.k19.com.br
205
M TODOS
www.facebook.com/k19treinamentos
205
M TODOS
206
Note que o mtodo Teste no devolve uma resposta. Como esse mtodo no void ocorre um
erro de compilao. A mensagem de erro de compilao seria semelhante apresenta abaixo.
206
www.k19.com.br
207
M TODOS
Programa . cs (8 ,13): error CS0161 : Programa . Teste () : not all code paths return a
value
No exemplo acima, se o valor gerado pelo mtodo NextDouble for menor ou igual a 0.5, o mtodo
Teste no devolver resposta. Novamente, como esse mtodo no void ocorre um erro de compilao. A mensagem de erro de compilao seria semelhante apresenta abaixo.
Programa . cs (8 ,13): error CS0161 : Programa . Teste () : not all code paths return a
value
www.facebook.com/k19treinamentos
207
M TODOS
208
Nesse outro exemplo, o mtodo Teste foi declarado corretamente, mas foi chamado sem parnteses.
1 class Programa
2 {
3
static void Main ()
4
{
5
Teste ;
6
}
7
8
static void Teste ()
9
{
10
System . Console . WriteLine ( " K19 " ) ;
11
}
12 }
Cdigo C# 6.49: Programa.cs
6.12 Resumo
1
Um mtodo possui uma marcao de retorno, um nome, uma lista de parmetros e um corpo.
A palavra reservada return utilizada para finalizar um mtodo e devolver uma resposta caso o
mtodo no seja void.
208
www.k19.com.br
209
M TODOS
10
www.facebook.com/k19treinamentos
209
M TODOS
210
210
www.k19.com.br
CAPTULO
S TRING
7.1 Referncias
Em C#, as strings so objetos. Para controlar um objeto, necessrio possuir uma referncia
desse objeto. Uma referncia de uma string como um controle remoto de uma TV. Atravs de um
controle remoto, podemos controlar uma TV. Atravs de uma referncia, podemos controlar uma
string.
1
2
-/--
0
CH
Importante
As variveis do tipo string no armazenam os objetos do tipo string. Elas armazenam
referncias para esses objetos.
Ao executar o cdigo abaixo, um objeto do tipo string ser criado com o contedo Rafael. A
referncia desse objeto ser armazenada na varivel nome.
1 class Programa
2 {
3
static void Main ()
4
{
5
string nome = " Rafael " ;
6
}
7 }
www.facebook.com/k19treinamentos
211
S TRING
212
O pool de strings um repositrio no qual objetos do tipo string so armazenados para serem
reaproveitados. No pool de strings no h strings repetidas (objetos do tipo string que armazenam a
mesma sequncia de caracteres).
Importante
Objetos do tipo string criados com o operador new no so colocados no pool de strings.
Dessa forma, eles no so reaproveitados. No exemplo abaixo, dois objetos do tipo string com o
mesmo contedo sero criados. A varivel a armazenar uma referncia do primeiro objeto e a
varivel b armazenar uma referncia do segundo objeto.
1 class Programa
2 {
3
static void Main ()
4
{
5
string a = new string ( new char []{ R , a , f , a , e , l }) ;
6
string b = new string ( new char []{ R , a , f , a , e , l }) ;
7
}
8 }
Cdigo C# 7.3: Criando strings com o operador new
Mais Sobre
Considere um objeto do tipo string. Esse objeto pode estar ou no no pool de strings.
Atravs do mtodo Intern, podemos obter uma referncia para um objeto do tipo string com o
212
www.k19.com.br
213
S TRING
No exemplo seguinte, um objeto do tipo string foi criado na linha 5 com a utilizao da string
literal Rafael. Consequentemente, esse objeto armazenado no pool de strings. Na linha 6, o
mtodo intern devolve uma referncia do objeto criado na linha 5.
1 class Programa
2 {
3
static void Main ()
4
{
5
string a = " Rafael " ;
6
string b = string . Intern ( a ) ;
7
}
8 }
Cdigo C# 7.5: Utilizando o mtodo intern
7.3 Imutabilidade
O contedo de um objeto do tipo string no pode ser alterado. Por isso, as strings so consideradas imutveis. Alguns mtodos dos objetos do tipo string podem sugerir que o contedo de uma
string pode ser alterado. Contudo, esses mtodos, geralmente, criam uma cpia da string original
com determinadas alteraes.
Por exemplo, na linha 5 do cdigo abaixo, uma string foi criada de forma literal com o contedo
rafael. Uma referncia dessa string foi armazenada na varivel a. Na linha 6, o mtodo ToUpper
foi utilizado. Esse mtodo cria uma cpia da string original substituindo as letras minsculas por
letras maisculas e devolve uma referncia dessa cpia. Dessa forma, a varivel b armazenar uma
referncia de um objeto do tipo string com o contedo RAFAEL.
1 class Programa
2 {
3
static void Main ()
4
{
5
string a = " rafael " ;
6
string b = a . ToUpper () ;
7
8
System . Console . WriteLine ( a ) ; // rafael
9
System . Console . WriteLine ( b ) ; // RAFAEL
10
}
www.facebook.com/k19treinamentos
213
S TRING
214
11 }
Cdigo C# 7.6: Utilizando o mtodo toUpperCase
7.4 StringBuilder
Em algumas situaes, necessrio montar uma string atravs de concatenaes sucessivas.
No exemplo abaixo, uma lista de nmeros criada atravs de uma sequncia de concatenaes.
1 class Programa
2 {
3
static void Main ()
4
{
5
string numeros = " " ;
6
for ( int i = 0; i < 1000; i ++)
7
{
8
numeros = numeros + i + " " ;
9
}
10
System . Console . WriteLine ( numeros ) ;
11
}
12 }
Cdigo C# 7.7: Montando uma lista de nmeros com concatenaes
A cada concatenao, um novo objeto do tipo string criado. No for do cdigo anterior, duas mil
concatenaes sero realizadas ao total. Dessa forma, dois mil objetos do tipo string sero criados.
A criao de muitos objetos prejudica a performance dos programas.
Nessas situaes, podemos utilizar um objeto do tipo StringBuilder. Na linha 5 do exemplo abaixo,
um string builder vazio foi criado. No corpo do for, o mtodo Append foi utilizado para adicionar contedo ao string builder. Depois do lao, o mtodo ToString foi utilizado para obter uma string com o
contedo armazenado no string builder.
1 class Programa
2 {
3
static void Main ()
4
{
5
System . Text . StringBuilder builder = new System . Text . StringBuilder () ;
6
for ( int i = 0; i < 1000; i ++)
7
{
8
builder . Append ( i ) ;
9
builder . Append ( " " ) ;
10
}
11
string numeros = builder . ToString () ;
12
System . Console . WriteLine ( numeros ) ;
13
}
14 }
Cdigo C# 7.8: Montando uma lista de nmeros com StringBuilder
Diferentemente das concatenaes com o operador +, o mtodo Append no cria novos objetos.
Portanto, a performance do programa no comprometida.
214
www.k19.com.br
215
S TRING
7.5 Formatao
Considere um programa que registra as compras dos clientes nos caixas de um supermercado.
Quando uma compra finalizada, o programa deve exibir o cupom fiscal. Esse cupom deve conter
o nome, o preo unitrio e a quantidade de cada produto, alm do valor total por produto e o valor
total da compra. O preo unitrio deve ser exibido com 2 casas decimais e alinhado direita. A
quantidade deve ser exibida sempre com 3 dgitos. O preo total por produto deve ser exibido com 2
casas decimais e alinhado direita. Veja o exemplo abaixo.
-----------------------------------------CUPOM FISCAL
-----------------------------------------PRODUTO
UNITRIO QTD
TOTAL
-----------------------------------------Sorvete
18.75 002
37.50
Chocolate
5.00 003
15.00
Refrigerante
3.89 014
54.46
Bolacha
1.80 058
104.40
-----------------------------------------TOTAL: 211.36
------------------------------------------
At agora, utilizamos o mtodo WriteLine com apenas um parmetro. Contudo, h uma verso
desse mtodo que recebe uma string e uma quantidade varivel de parmetros. Essa string chamada de string de formatao. Os demais argumentos so combinados com a string de formatao
para definir a mensagem que ser exibida.
www.facebook.com/k19treinamentos
215
S TRING
216
No exemplo abaixo, quando a string de formatao for combinada com o segundo argumento
do mtodo WriteLine, o trecho {0} ser substitudo por CUPOM FISCAL. Dessa forma, o ttulo do
cupom fiscal ser exibido da forma desejada.
1 System . Console . WriteLine ( "
Os 15 espaos em branco acrescentados diretamente no cdigo fonte podem gerar algumas dificuldades. Por exemplo, no fcil verificar se h exatamente 15 espaos em branco olhando o cdigo
fonte. Para melhorar a legibilidade do cdigo, podemos trocar o trecho {0} por {0, 27}. O nmero
27 indica a quantidade minma de caracteres que devem ser utilizados para formar a mensagem que
ser exibida.
1 System . Console . WriteLine ( " {0 ,27} " , " CUPOM FISCAL " ) ;
No exemplo acima, quando a string de formatao for combinada com o segundo argumento do
mtodo WriteLine, o trecho {0,27} ser substitudo por CUPOM FISCAL. Contudo, 15 espaos em
branco sero adicionados esquerda desse texto para completar a quantidade mnima de caracteres
que 27.
"Bola"
37.65
A ordem de utilizao dos parmetros na string de formatao no precisa ser igual ordem dos
demais argumentos do mtodo WriteLine. No exemplo abaixo, o primeiro parmetro da string de
formatao foi combinado com o argumento 3. O segundo parmetro com o argumento 37.65.
Por fim, o terceiro parmetro com o argumento Bola.
"Bola"
37.65
Dois ou mais parmetros na string de formatao podem ser associados a um mesmo argumento
do mtodo WriteLine. Para isso, basta que esses parmetros possuam o mesmo ndice. No exemplo
216
www.k19.com.br
217
S TRING
Alinhamento
No exemplo abaixo, quando a string de formatao for combinada com os demais argumentos
do mtodo WriteLine, o parmetro {0,16} ser substitudo pelo argumento PRODUTO.
1 System . Console . WriteLine ( " {0 ,16} " , " PRODUTO " ) ;
217
S TRING
218
Para cada produto, vamos reservar 16 caracteres para o nome, 10 para o preo unitrio, 3 para
a quantidade e 10 para o preo total. Com essa diviso, as quatro colunas ocupam 39 caracteres na
horizontal. Para separar as colunas utilizaremos 1 espao em branco. Dessa forma, os 42 caracteres
de cada linha sero ocupados.
No exemplo abaixo, a string de formatao do mtodo WriteLine possui quatro parmetros para os
ttulos das colunas. Observe as quantidades mnimas de caracteres definidas para cada parmetro.
Note tambm que o sinal - foi utilizada no primeiro parmetro para alinhar o primeiro ttulo
esquerda.
1 System . Console . WriteLine ( " {0 , -16} {1 ,10} {2 ,3} {3 ,10} " ," PRODUTO " ," UNITRIO " ," QTD " ," TOTAL " );
Com a string de formatao acima, se o nome de um produto tiver menos do que 16 caracteres, espaos em branco sero acrescentados esquerda desse nome para completar a quantidade
mnima de caracteres. Dessa forma, os nomes dos produtos sero alinhados direita.
Contudo, de acordo com a especificao do cupom fiscal, os nomes dos produtos devem ser
alinhados esquerda. Sendo assim, os espaos em branco utilizados para completar os 16 caracteres
devem ser acrescentados direita dos nomes dos produtos.
Para alinhar os nomes dos produtos esquerda, devemos acrescentar o caractere - na string de
formatao como no exemplo abaixo.
1 System . Console . WriteLine ( " {0 , -16} " , nome ) ;
218
www.k19.com.br
219
S TRING
Agora, devemos considerar os nomes dos produtos que possuem mais do que 16 caracteres.
Nesse caso, podemos utilizar o mtodo Substring para extrair os primeiros 16 caracteres desses nomes.
1 nome = nome . Substring (0 , System . Math . Min ( nome . Length , 16) ) ;
2 System . Console . WriteLine ( " {0 , -16} " , nome ) ;
Os preos unitrios devem ser exibidos com duas casas decimais. Para controlar a quantidade de
casas decimais, devemos utilizar a formatao de nmeros reais. Para isso, necessrio adicionar,
na string de formatao, no parmetro correspondente aos preos dos produtos, o trecho :N.
1 System . Console . WriteLine ( " {0 , -16} {1 ,10: N } " , nome , preco ) ;
Por padro, quando utilizamos a formatao de nmeros reais, os valores so exibidos com duas
casas decimais. Podemos modificar esse comportamento acrescentando a quantidade desejada de
casas decimais imediatamente depois do caractere N. No exemplo abaixo, os preos seriam exibidos com 4 casas decimais.
1 System . Console . WriteLine ( " {0 , -16} {1 ,10: N4 } " , nome , preco ) ;
As quantidades dos produtos so nmeros inteiros. Para poder utilizar as opes de formatao
de nmeros inteiros, devemos adicionar o caractere D.
1 System . Console . WriteLine ( " {0 , -16} {1 ,10: N } {2 ,3: D } " , nome , preco , quantidade ) ;
Como as quantidades dos produtos devem ser exibidas sempre com trs caracteres, eventualmente, zeros devem ser adicionados esquerda dessas quantidades. Para que isso ocorra automaticamente, devemos substituir o parmetro {2,3:D} por {2:D3} na string de formatao.
1 System . Console . WriteLine ( " {0 , -16} {1 ,10: N } {2: D3 } " , nome , preco , quantidade ) ;
www.facebook.com/k19treinamentos
219
S TRING
220
Lembre-se que por padro, na formatao de nmeros reais, os valores so exibidos com duas
casas decimais.
Mais Sobre
Mais detalhes sobre o funcionamento das formataes podem ser obtidos no endereo:
http://msdn.microsoft.com/en-us/library/txafckwd.aspx
Na mscara de formatao, devemos utilizar os caracteres especiais para definir o formato desejado. Veja o que cada caractere indica.
d: dia
M: ms
y: ano
220
www.k19.com.br
221
S TRING
H: hora
m: minutos
s: segundos
7.7 Resumo
1
Para controlar um objeto do tipo string, necessrio utilizar uma referncia desse objeto.
O pool de strings permite que objetos do tipo string sejam reutilizados a fim de diminuir o
consumo de memria.
Ao invs de realizar concatenaes sucessivas para montar uma string, devemos utilizar objetos do tipo System.Text.StringBuilder, pois um nmero excessivo de concatenaes pode prejudicar
o desempenho dos programas em C#.
O mtodo WriteLine pode ser utilizado para exibir strings formatadas na sada padro.
www.facebook.com/k19treinamentos
221