Você está na página 1de 231

TREINAMENTOS

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

Formatao de Data e Hora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220


Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221

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

cobrem assuntos com um nvel intermedirio de dificuldade. J as sees com o cone


assuntos considerados de nvel avanado.

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 }

rea das variveis

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

1.1 O que um Computador?

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

Figura 1.1: Principais elementos de um computador

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.

Figura 1.2: Porta Ethernet

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.

Figura 1.3: Porta Paralela

www.k19.com.br

I NTRODUO

PS/2: Teclados e mouses antigos so conectados aos computadores atravs dessa porta.

Figura 1.4: Porta PS/2

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.

Figura 1.5: Porta USB

HDMI: Essa porta utilizada para transmisso digital de udio e vdeo.

Figura 1.6: Porta HDMI

1.3 Formato Binrio


Os computadores so capazes de receber, armazenar e enviar dados. Contudo, os computadores
s trabalham com dados em formato binrio. A maior parte das pessoas no est acostumada a
utilizar o formato binrio no seu dia a dia.

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

Tabela 1.1: Representao decimal e binria

A quantidade mnima de dgitos binrios necessrios para definir a representao binria de um


nmero depende da grandeza do mesmo. Por exemplo, para representar o nmero 4, so necessrios
pelo menos trs dgitos binrios. Agora, para representar o nmero 29, so necessrios pelo menos
cinco dgitos binrios.

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

Tabela 1.2: Representao binria de caracteres seguindo o padro ASCII

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.

Imagens, udios e vdeos


Como vimos, os nmeros e os caracteres de um texto so facilmente representados em formato
binrio. Contudo, os computadores tambm so capazes de manipular imagens, udio e vdeo. Para
esses tipos de dados, a transformao para formato binrio bem mais complicada. Pesquise por
PNG, MP3 e AVI que so formatos binrios de imagens, udios e vdeos atravs dos seguinte endereos:
PNG - http://www.w3.org/TR/PNG/
MP3 - http://en.wikipedia.org/wiki/MP3
AVI - http://en.wikipedia.org/wiki/Audio_Video_Interleave
Resumidamente, para que um dado possa ser manipulado por um computador, ele deve ser convertido para o formato binrio de acordo com algum padro.

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

Contudo, no h um consenso na indstria de hardware e software quanto utilizao desses


padres. Muitos sistemas operacionais informam a capacidade dos dispositivos de armazenamento
misturando o padro SI e o padro IEC 80000-13. Eles costumam utilizar os smbolos do padro
SI com os valores do padro IEC 80000-13. J os fabricantes dos dispositivos de armazenamento
preferem utilizar plenamente as unidades do SI.
Unidades no Padronizadas
Nome
Smbolo Bytes
byte
B
10240
kilobyte
kB
10241
megabyte
MB
10242
gigabyte
GB
10243
terabyte
TB
10244
petabyte
PB
10245
exabyte
EB
10246
zettabyte
ZB
10247
yottabyte
YB
10248
Tabela 1.4: Unidades no padronizadas adotadas em muitos sistemas operacionais

Para exemplificar a confuso gerada pela utilizao de unidades no padronizadas, considere o


disco rgido ST9750420AS fabricado pela Seagate Technology.
A capacidade real desse HD 750156374016 bytes. Utilizando o padro IEC 80000-13, podemos
dizer que esse disco rgido tem aproximadamente 698,63 GiB. Por outro lado, utilizando o padro SI,
podemos dizer que esse disco rgido tem aproximadamente 750,15 GB.
A Seagate Technology, assim como as outras fabricantes de discos rgidos, preferem arredondar
para baixo a capacidade real dos HDs ao anunciar esses produtos aos clientes. Sendo assim, a Seagate
Technology anuncia que a capacidade do HD ST9750420AS 750 GB. Portanto, a capacidade real
um pouco maior do que a capacidade anunciada. Provavelmente, os compradores no se sentiro
prejudicados j que a capacidade real maior do que a anunciada.
Agora vem a confuso. Sistemas operacionais como Windows 8 e OS X anteriores verso 10.6
utilizam unidades de medida no padronizadas e informam aos usurios que o HD ST9750420AS de
6

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.

1.5 Arquiteturas de Processadores


Os processadores s entendem operaes definidas em formato binrio. Para ilustrar, considere
as operaes apresentadas na Figura 1.7. Essas operaes so fictcias.

GRAVA REG-1

19

GRAVA REG-2

11

001001010011
001010001011
SOMA

REG-1 REG-2 REG-3

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

processadores de tipos diferentes.

SOMA

Arquitetura X

REG-2

REG-1

0110001100100001
SOMA

Arquitetura Y

REG-3

REG-1 REG-2 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.

1.6 O que um Programa?


Os comandos que os processadores dos computadores oferecem so extremamente bsicos. Normalmente, so comandos para realizar operaes aritmticas como adio, subtrao, diviso e multiplicao, bem como operaes para armazenar ou recuperar dados do disco rgido, da memria
RAM, dos registradores e de outros dispositivos de armazenamento. Geralmente, tarefas mais complexas so resolvidas atravs de sequncias desses comandos bsicos.
Por exemplo, para calcular a mdia aritmtica dos nmeros 10, 15 e 20, devemos obter o valor do
somatrio desses nmeros atravs de operaes bsicas de adio. Depois, podemos utilizar uma
operao bsica de diviso para dividir o valor desse somatrio por 3 e assim obter o valor 15, que
a mdia dos nmeros.
Uma sequncia de comandos bsicos de processador que resolve uma determinada tarefa recebe o nome de programa. Os programas so armazenados em arquivos comumente chamados de
executveis.
Na prtica, os programas so formados por instrues que dependem da arquitetura do processador. Consequentemente, um mesmo programa pode no funcionar em processadores de arquiteturas diferentes.

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;
}

Figura 1.9: Analogia entre programar e pintar

1.7 Linguagem de Mquina


Como vimos anteriormente, o formato dos comandos que um computador pode executar depende basicamente da arquitetura do seu processador. Como existem diversas arquiteturas diferentes, um mesmo comando pode funcionar em um computador e no funcionar em outro. O formato
dos comandos aceitos por um determinado processador define a linguagem de mquina ou cdigo
de mquina desse processador.
Comandos definidos em linguagem de mquina so perfeitos para os computadores processarem. Por outro lado, eles so extremamente complexos para as pessoas entenderem. Podemos verificar essa complexidade observando o trecho do programa Chrome exibido na Figura 1.10.
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000010000000000100000000
000000000000111000011111101110100000111000000000101101000000100
111001101001000011011100000000001010011001100110100100001010101
000110100001101001011100110010000001110000011100100110111101100
111011100100110000101101101001000000110001101100001011011100110
111001101111011101000010000001100010011001010010000001110010011
Figura 1.10: Um trecho do programa Chrome

1.8 Linguagem de Programao


Como voc j deve ter percebido, extremamente complexo para uma pessoa escrever um programa diretamente em linguagem de mquina. Para tornar o desenvolvimento de programas uma
tarefa vivel, foram criadas as linguagens de programao. Essas linguagens permitem que pessoas
possam criar programas de uma forma muito mais simples. Confira um trecho de cdigo escrito com
a linguagem de programao C#:
1
2
3
4
5
6
7

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

Figura 1.11: Processo de compilao e execuo de um programa

1.10 Sistemas Operacionais


Normalmente, os programas instalados em um computador so armazenados no disco rgido.
Para executar um programa, as instrues que definem esse programa devem ser copiadas do disco
rgido para a memria RAM. Essa cpia realizada atravs dos comandos oferecidos pelo processador.
Geralmente, as pessoas no possuem conhecimentos tcnicos suficientes para utilizar os comandos dos processadores. Dessa forma, elas no conseguiriam copiar as instrues de um programa do
disco rgido para a memria RAM. Consequentemente, elas no conseguiriam executar programas
atravs dos computadores.
Para facilitar a interao entre os usurios e os computadores, foram criados programas especiais denominados sistemas operacionais. Os sistemas operacionais funcionam como intermedirios
entre os usurios e os computadores. Os principais sistemas operacionais atuais oferecem uma interface visual. Atravs dessa interface os usurios podem controlar o funcionamento dos computadores.

10

www.k19.com.br

11

I NTRODUO

Figura 1.12: Interao entre usurio e sistema operacional

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.

Figura 1.13: Interao entre programa e sistema operacional

As principais tarefas de um sistema operacional so:


Gerenciar a execuo dos programas.
Controlar o acesso memria RAM e ao disco rgido.
Administrar os dispositivos conectados ao computador.
Simplificar a interao entre os programas e o computador.
Simplificar a interao entre o usurio e o computador.
Sistemas operacionais diferentes podem oferecer recursos diferentes para os programas. No processo de compilao, geralmente, os programas so preparados para utilizar os recursos de um determinado sistema operacional. Dessa forma, um programa que funciona em um determinado sistema
operacional pode no funcionar em outro sistema operacional.

www.facebook.com/k19treinamentos

11

I NTRODUO

12

1.11 Mquinas Virtuais


Como vimos anteriormente, o cdigo fonte de um programa deve ser compilado para que esse
programa possa ser executado por um computador. Alm disso, vimos que os compiladores geram
executveis especficos para um determinado sistema operacional e uma determinada arquitetura
de processador. Qual o impacto disso para quem desenvolve sistemas para mltiplas plataformas?
A empresa que deseja ter uma aplicao disponvel para diversos sistemas operacionais (Windows, Linux, OS X, etc) e diversas arquiteturas de processadores (x86, x86_64, ARM, etc) dever desenvolver e manter um programa para cada plataforma (a combinao de um sistema operacional e
uma arquitetura de processador). Consequentemente, os custos dessa empresa seriam muito altos.
PROGRAMA 1

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

Para diminuir os custos e aumentar a produtividade, podemos utilizar as chamadas mquinas


virtuais. As mquinas virtuais so programas especiais que permitem que um programa possa ser
executado em diversas plataformas diferentes. Nesse cenrio, o desenvolvimento e a execuo de
um programa so realizados atravs dos seguintes passos:

1. O programador escreve o cdigo fonte do programa utilizando uma linguagem de programao.


2. O compilador traduz o cdigo fonte para um cdigo intermedirio escrito em uma linguagem
que a mquina virtual entende.
3. A mquina virtual processa o cdigo intermedirio e o traduz para cdigo de mquina.
4. O cdigo de mquina executado no computador.

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

Figura 1.15: Ilustrao do funcionamento da mquina virtual

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.12 Editores de Texto


O cdigo fonte de um programa C# pode ser criado atravs de editores de texto simples. No
Windows, recomendamos a utilizao do Notepad ou do Notepad++. No Linux, recomendamos a
utilizao do gedit. No OS X, recomendamos a utilizao do TextWrangler. Esses editores so todos
gratuitos.

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.

1.14 Hello World em C#


Vamos criar o nosso primeiro programa para entendermos como funciona o processo de codificao, compilao e execuo de um programa em C#.

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

Por enquanto, no se preocupe em entender perfeitamente o cdigo do arquivo HelloWorld.cs.


Apenas observe que, na primeira linha, foi definida uma classe chamada HelloWorld. O corpo dessa
classe delimitado pela chave de abertura da segunda linha e a chave de fechamento da ltima linha.
No corpo da classe HelloWorld, o mtodo Main foi definido. O corpo desse mtodo delimitado pela
chave de abertura da quarta linha e a chave de fechamento da sexta linha. No corpo do mtodo
Main, a instruo System.Console.WriteLine("HelloWorld") indica que a mensagem HelloWorld deve
ser exibida na tela. Essa instruo deve terminar com ponto e vrgula.
O prximo passo abrir um terminal, entrar na pasta introducao e depois compilar o arquivo
HelloWorld.cs.
C :\ Users \ K19 > cd introducao
C :\ Users \ K19 \ introducao > csc HelloWorld . cs

Terminal 1.1: Compilando o arquivo HelloWorld.cs no Windows

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

Terminal 1.2: Listando o diretrio atual do terminal em ambiente Windows

Agora, podemos executar o arquivo HelloWorld.exe.


C :\ Users \ K19 \ introducao > HelloWorld . exe
Hello World

Terminal 1.3: Executando o programa em ambiente Windows

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.

1.15 O que o Mtodo Main?


Um programa basicamente uma sequncia de instrues. As instrues de um programa escrito em C# devem ser definidas dentro do mtodo Main.
1 class Programa
2 {
3
static void Main ()
4
{
5
PRIMEIRA INSTRUO
6
SEGUNDA INSTRUO
7
TERCEIRA INSTRUO
8
...
9
}
10 }
Cdigo C# 1.3: Mtodo Main

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

Em seguida, a linha 6 executada e o caractere B exibido na sada padro.

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

Seguindo o fluxo de execuo, a linha 7 executada e o caractere C exibido na sada padro.

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

1.16 Variaes do Mtodo Main


A forma tradicional do mtodo Main mostrada no cdigo a seguir.
1 static void Main ()
Cdigo C# 1.7: Forma tradicional do mtodo Main

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

Acrescentar um array de strings como parmetro.


1 static void Main ( string [] args )
Cdigo C# 1.9: Acrescentar um array de strings como parmetro

Os colchetes podem ser definidos direita do nome do parmetro.


1 static void Main ( string args [])
Cdigo C# 1.10: Alterando a posio dos colchetes

1.17 Argumentos de Linha de Comando


Considere um programa que calcula a mdia das notas dos alunos de uma escola. Esse programa
poderia receber as notas de um determinado aluno, calcular a mdia e depois exibi-la na tela.
Ao executar um programa em C#, podemos passar argumentos na linha de comando para o mtodo Main. Por exemplo, suponha que o cdigo compilado desse programa tenha sido armazenado
em um arquivo chamado Programa.exe. No exemplo abaixo, esse programa foi executado sem nenhum argumento de linha de comando.
C :\ Users \ K19 \ introducao > Programa . exe

Terminal 1.7: Executando o programa sem argumentos de linha de comando

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

Terminal 1.8: Executando o programa com trs argumentos de linha de comando

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

Terminal 1.10: Argumentos de linha de comando

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 "

Terminal 1.11: Argumentos de linha de comando

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

Programa . exe Argumentos K19 Livros Lgica

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

Em seguida, a linha 6 executada e o segundo argumento da linha de comando exibido. Sendo


assim, a palavra Livros exibida na sada padro.
2

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

Seguindo o fluxo de execuo, a linha 7 executada e o terceiro argumento da linha de comando


exibido na sada padro, isto , a palavra Lgica exibida.
3

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

1.18 Exibindo Mensagens


Geralmente, as linguagens de programao possuem comandos para exibir mensagens na sada
padro (tela do terminal). Nos programas em C#, podemos utilizar o seguinte trecho de cdigo para
exibir uma mensagem na sada padro.
1 System . Console . WriteLine ( " MENSAGEM " ) ;
Cdigo C# 1.15: Exibindo uma mensagem na sada padro

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

System . Console . WriteLine ( " \ tRafael " ) ;


System . Console . WriteLine ( " Linha1 \ nLinha2 " ) ;
System . Console . WriteLine ( " Digite \ sim \ " ) ;
System . Console . WriteLine ( " Jonas disse : \" Ol \" " ) ;
System . Console . WriteLine ( " C :\\ K19 \\ Livros " ) ;
Cdigo C# 1.16: Exemplos de uso das sequncias de escape

Rafael
Linha1
Linha2
Digite sim
Jonas disse : " Ol "
C :\ K19 \ Livros

Terminal 1.16: Exemplos de uso das sequncias de escape

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

Tambm possvel comentar um bloco com os marcadores /* e */.


www.facebook.com/k19treinamentos

21

I NTRODUO
1
2
3
4
5

22

System . Console . WriteLine ( " K19 " ) ;


/* comentrio de bloco
todo esse trecho
est comentado */
System . Console . WriteLine ( " Rafael Cosentino " ) ;

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

1.21 Engenharia Reversa


Talvez voc j tenha desmontado um brinquedo ou algum aparelho eletrnico para tentar descobrir como ele funciona. Ao fazer isso, mesmo sem saber, voc praticou engenharia reversa.
Muitas empresas praticam engenharia reversa para entender o funcionamento dos produtos dos
concorrentes. Pases tambm utilizam esse tipo de abordagem para avaliar a capacidade militar dos
outros pases.

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.

1.23 Erro: Compilar um arquivo inexistente


Um erro de compilao comum em C# compilar um arquivo inexistente. Normalmente, esse
erro ocorre porque o arquivo foi salvo em outra pasta ou com um nome diferente.
No exemplo abaixo, o nome do arquivo que deveria ser compilado Programa.cs. Contudo, na
compilao, esquecemos da letra a e solicitamos a compilao de um arquivo chamado Program.cs.
Como esse arquivo no existe, um erro de compilao gerado.
C :\ Users \ K19 \ introducao > csc Program . cs
error CS2001 : O arquivo de origem Program . cs no pde ser encontrado
warning CS2008 : Nenhum arquivo de origem especificado

Terminal 1.17: Erro de compilao

1.24 Erro: Executar utilizando a extenso .cs


Um erro comum em C# tentar executar um programa utilizando a extenso .cs. Observe, no
exemplo a seguir, esse erro ocorrendo.
C :\ Users \ K19 \ introducao > Program . cs
Program .cs no reconhecido como um comando interno
ou externo , um programa opervel ou um arquivo em lotes .

Terminal 1.18: Erro de tentativa de execuo

1.25 Erro: No fechar os blocos


Um erro de compilao comum em C# esquecer de fechar os blocos com chave. Observe, nos
exemplos a seguir, esse erro ocorrendo.

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

A mensagem que o compilador do C# exibe semelhante apresentada abaixo.


Programa . cs (6 ,2): error CS1513 : } esperada

Terminal 1.19: Erro de compilao

1.26 Erro: No fechar as aspas


Um erro de compilao comum em C# esquecer de fechar as aspas. No exemplo a seguir, falta
uma aspas dupla na linha 5.
1 class Programa
2 {
3
static void Main ()
4
{
5
System . Console . WriteLine ( " K19 ) ;
6
}
7 }
Cdigo C# 1.23: Programa.cs

Veja a mensagem que o compilador do C# exibe quando as aspas no so fechadas corretamente.


Programa . cs (5 ,28): error CS1010 : Newline em constante

Terminal 1.20: Erro de compilao

1.27 Erro: Trocar maisculas e minsculas


Um erro de compilao comum em C# utilizar letras maisculas onde deveriam ser utilizadas
letras minsculas ou vice-versa. No exemplo a seguir, o identificador System foi escrito com s, porm
o correto com S.
1 class HelloWorld
2 {
3
static void Main ()
4
{
5
system . Console . WriteLine ( " Hello World " ) ;

24

www.k19.com.br

25

I NTRODUO

6
}
7 }
Cdigo C# 1.24: HelloWorld.cs

Veja a mensagem de erro do compilador C#.


HelloWorld . cs (5 ,3): error CS0103 : O nome system no existe no contexto atual

Terminal 1.21: Erro de compilao

1.28 Erro: Esquecer o ponto e vrgula


Para encerrar uma instruo, devemos utilizar o caractere ;. No inserir esse caractere no final
das instrues gera erro de compilao. No exemplo abaixo, falta um ponto e vrgula no final da linha
5.
1 class HelloWorld
2 {
3
static void Main ()
4
{
5
System . Console . WriteLine ( " Hello World " )
6
}
7 }
Cdigo C# 1.25: HelloWorld.cs

Veja a mensagem de erro do compilador C#.


HelloWorld . cs (5 ,42): error CS1002 : ; esperado

Terminal 1.22: Erro de compilao

1.29 Erro: Esquecer o Main


Todo programa deve ter um ponto de partida. Em C#, todo programa precisa do mtodo Main.
Se voc esquecer de definir o mtodo Main, obter um erro de compilao.
1 class HelloWorld
2 {
3
static void main ()
4
{
5
System . Console . WriteLine ( " Hello World " ) ;
6
}
7 }
Cdigo C# 1.26: 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

Terminal 1.23: Erro de compilao

www.facebook.com/k19treinamentos

25

I NTRODUO

26

1.30 Erro: Utilizar sequncias de escape invlidas


Utilizar sequncias de escape invlidas gera erro de compilao. No exemplo abaixo, a sequncia
\x foi utilizada. Contudo, ela no uma sequncia de escape vlida.
1 class HelloWorld
2 {
3
static void Main ()
4
{
5
System . Console . WriteLine ( " Hello \ xWorld " ) ;
6
}
7 }
Cdigo C# 1.27: HelloWorld.cs

Veja a mensagem do compilador C#.


HelloWorld . cs (5 ,34): error CS1009 : Seqncia de escape no reconhecida

Terminal 1.24: Erro de compilao

1.31 Resumo
1

Os principais elementos de um computador so: CPU, memria RAM e HD.

A CPU executa as instrues dos programas.

Geralmente, os arquivos dos usurios e dados dos programas instalados no computador so


armazenados no HD.

Geralmente, quando o usurio executa um programa, os dados desse programa so copiados


do HD para memria RAM.

Os dados armazenados na memria RAM so descartados quando o computador desligado.

Os dados armazenados no HD no so descartados quando o computador desligado.

Os computadores se comunicam com outros computadores ou com dispositivos perifricos


atravs de portas como ethernet, paralela, USB e HDMI.

26

Os dados manipulados por um computador so definidos em formato binrio.

www.k19.com.br

27
9

I NTRODUO

Os principais padres de codificao de caracteres so ASCII e Unicode.

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

Os comandos que um processador pode executar so definidos pela sua arquitetura.

13

Processadores de arquiteturas diferentes entendem comandos diferentes.

14

Atualmente, as arquiteturas de processador mais utilizadas so: x86, x86_64 e ARM.

15

Um programa uma sequncia de instrues que resolve uma determinada tarefa.

16

As linguagens de programao so mais fceis para pessoas entenderem do que as linguagens


de mquina.

17

Os programas so definidos em linguagem de programao.

18

Os compiladores traduzem o cdigo fonte de um programa para cdigo de mquina.

19

Os sistemas operacionais gerenciam a execuo dos programas; controlam o acesso memria


RAM e ao disco rgido; administram os dispositivos conectados ao computador; simplificam a interao entre os programas e o computador; e simplificam a interao entre o usurio e o computador.

20

As mquinas virtuais permitem a criao de programas portveis.

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

Ao executar um programa em C#, podemos passar argumentos de linha de comando.

23

No cdigo fonte de um programa em C#, comentrios so inseridos com os marcadores //,


/* e */.

www.facebook.com/k19treinamentos

27

I NTRODUO

28

24

A maioria das linguagens de programao so case sensitive.

25

A indentao melhora a legibilidade do cdigo fonte.

26

Cdigo escrito em linguagem C# geralmente armazenado em arquivos com a extenso .cs.

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

2.1 O que uma Varivel?


Considere um programa que calcula a mdia das notas dos alunos de uma escola. Para calcular
essa mdia, o programa precisa realizar operaes aritmticas com os valores das notas dos alunos.
Para isso, esses valores devem ser armazenados em variveis.
As variveis so utilizadas para armazenar os dados que um programa deve manipular. Toda
varivel possui um nome (identificador). Para acessar ou alterar o contedo de uma varivel, necessrio utilizar o nome dessa varivel.
Em C#, toda varivel possui um tipo. O tipo de uma varivel determina o que pode ou no ser
armazenado nela. Por exemplo, podemos determinar que uma varivel s pode armazenar nmeros
inteiros.
Geralmente, toda varivel est associada a uma posio da memria RAM. Portanto, quando armazenamos um valor em uma varivel, na verdade, estamos armazenando esse valor em algum lugar
da memria RAM. Dessa forma, os identificadores das variveis so utilizados para acessar a memria RAM.
numeroDaConta

numeroDaConta = 4823
MEMRIA RAM

4823

numeroDaConta

MEMRIA RAM

Figura 2.1: Processo de atribuio do valor numrico 4823 varivel numeroDaConta

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.

2.2 Declarando e Inicializando Variveis


Toda varivel deve ser declarada antes de ser utilizada. Na declarao, obrigatrio determinar
o nome da varivel. Por outro lado, o tipo da varivel pode ser definido explcita ou implicitamente.
No exemplo abaixo, trs variveis foram declaradas: a varivel chamada numeroDaConta do tipo int,

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

Pare para pensar...


O que aconteceria se o compilador C# permitisse utilizar uma varivel no inicializada?
Um programador da linguagem C (no C#), responderia essa pergunta facilmente, pois em C
possvel utilizar uma varivel sem inicializ-la. Quando uma varivel declarada, um espao
na memria RAM do computador reservado para essa varivel. Esse espao pode ter sido
utilizado anteriormente, por outro programa e pode conter dados antigos. Dessa forma, se uma
varivel no inicializada for utilizada, o valor antigo armazenado no espao de memria RAM
associado a essa varivel ser utilizado.
Muitos programadores C esquecem de inicializar suas variveis com valores adequados. Isso

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.

2.3 Exibindo os Valores das Variveis


O valor de uma varivel pode ser exibido na sada padro. Na primeira linha do exemplo abaixo,
a varivel numero foi declarada e inicializada com o valor 10. Depois, o valor dessa varivel foi exibido
na tela atravs do mtodo WriteLine.
1 int numero = 10;
2
3 System . Console . WriteLine ( numero ) ;

Pare para pensar...


Qual a diferena entre as duas linhas a seguir?
1 System . Console . WriteLine ( numero ) ;
2 System . Console . WriteLine ( " numero " ) ;

Na primeira linha, o valor armazenado na varivel numero exibido na sada padro. Na segunda
linha, o texto numero exibido na sada padro.

2.4 Copiando Valores


Uma varivel pode receber uma cpia do valor armazenado em outra varivel. Na primeira linha
do exemplo abaixo, a varivel a do tipo int foi declarada e inicializada com o valor 1. Na sequncia, a
varivel b tambm do tipo int foi inicializada com uma cpia do valor armazenado na varivel a.
1 int a = 1;
2
3 int b = a ;

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

2.5 Tipos Simples


Como vimos anteriormente, toda varivel possui um tipo. Na linguagem C#, h um conjunto
bsico de tipos denominados tipos simples. Os tipos simples so utilizados com muita frequncia e
servem como base para a criao de outros tipos. Os tipos simples da linguagem C# so apresentados
na Tabela 2.1.
Nome

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

Aproximadamente de 1.7 10308 a 1.7 10308


28

a 3.4 10

38

a 7.9 10

28

decimal

Real

Aproximadamente de 7.9 10

bool

Booleano

O valor true (verdadeiro) ou o valor false (falso)

4 bytes
8 bytes
16 bytes
1 byte

Tabela 2.1: Tipos simples

Os tipos simples sero classificados da seguinte forma:

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

Escolher entre os tipos simples numricos e o tipo BigInteger semelhante a optar


pelo uso de um carro ou de um caminho. De fato, o caminho capaz de transportar tudo o
que um carro capaz de transportar e muito mais. Por outro lado, estacionar um caminho em
um shopping, por exemplo, bem mais complicado do que estacionar um carro. Alm disso, o
gasto de combustvel do caminho ser provavelmente maior do que o gasto do carro.

Valores mnimos e mximos


Os programadores no precisam decorar com exatido os valores mnimos e mximos aceitos
por cada tipo simples numrico. Na linguagem C#, esses valores podem ser acessados atravs das
constantes apresentadas na Tabela 2.2.

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

a codificao UTF-16 do padro Unicode (http://www.unicode.org/). De forma abstrata, podemos


dizer que uma varivel do tipo char armazena um caractere.

2.6 Nullable Types


Em C#, o valor null representa o vazio. Para expressar que uma varivel est vazia, podemos
armazenar o valor null nessa varivel. Os tipos simples vistos anterioremente no permitem o armazenamento do valor null. Da surgem os nullable types. Os nullable types correspondentes aos
tipos simples sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal e bool so sbyte?,
byte?, short?, ushort?, int?, uint?, long?, ulong?, char?, float?, double?, decimal? e bool? respectivamente.
Observe que o nome dos nullable types correspondentes aos tipos simples so exatamente o nome
dos tipos simples com o caractere ? no final.

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.

2.8 Data e Hora


A linguagem C# possui um tipo especfico para armazenar data e hora. Em C#, muito comum
utilizarmos o tipo DateTime.
1 System . DateTime exatamenteAgora = System . DateTime . Now ;
Cdigo C# 2.18: Data e hora atuais - DateTime

No cdigo acima, a data e hora atuais do computador so associadas varivel exatamenteAgora.


Tambm podemos definir datas e horas especficas.

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)

Figura 2.2: Data e hora especficas - DateTime

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.

2.9 Valores Literais


Os valores inseridos diretamente no cdigo fonte so chamados de valores literais.

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.

Pare para pensar...


Como vimos, as variveis do tipo string aceitam o valor null. No exemplo abaixo, o valor
null foi armazenado na varivel nome que do tipo string.
1 string nome = null ;

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

Tabela 2.3: Nmeros de 0 a 21 representados em decimal e hexadecimal

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

Por padro, independentemente da grandeza do nmero, os valores literais reais so tratados


como double. Por exemplo, considere o valor 19.09. Esse valor poderia ser tratado como float, double
ou decimal. Contudo, por padro, ele ser tratado como double. Dessa forma, o cdigo a seguir gera
um erro de compilao.
1 float a = 19.09;
Cdigo C# 2.27: Erro de compilao

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

O caractere E ( maisculo) pode ser utilizado no lugar do caractere e ( minsculo).


1 double a = 1.74 E3 ; // 1740 na forma exponencial
Cdigo C# 2.30: Forma exponencial

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

1 char c = \ x3A9 ; // 937 em notao hexadecimal


Cdigo C# 2.34: Utilizando o cdigo dos caracteres

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

Para solucionar esse problema, podemos utilizar a sequncia de escape \\.


1 string a = " C :\\ k19 \\ rafael \\ cosentino " ;
Cdigo C# 2.37: Utilizando a sequncia de escape \\

Outra forma de solucionar esse problema acrescentar o caractere @ no comeo da string.


1 string a = @ " C :\ k19 \ rafael \ cosentino " ;
Cdigo C# 2.38: Utilizando o caractere @

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

1 const int a = 10;


2
3 a = 5; // erro de compilao
Cdigo C# 2.40: Tentando alterar o valor de uma constante

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

2.11 Nmeros Aleatrios


Para realizar mostrar alguns exemplos, utilizaremos nmeros aleatrios. Em C#, esses nmeros
podem ser gerados facilmente. No exemplo a seguir, utilizamos a classe Random e o mtodo NextDouble
para gerar nmeros aleatrios do tipo double maiores ou iguais a 0 e menores do que 1.
1 System . Random gerador = new System . Random () ;
2
3 double numero = gerador . NextDouble () ;
Cdigo C# 2.42: Gerando nmeros aleatrios

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

double minimo = -5.0;


double maximo = 17.3;
// minimo <= numero < maximo
double numero = minimo + gerador . NextDouble () * ( maximo - minimo ) ;
Cdigo C# 2.43: Gerando nmeros aleatrios num intervalo especfico

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

2.12 Convenes de Nomenclatura


Os nomes das variveis so fundamentais para o entendimento do cdigo fonte. Considere o
exemplo a seguir.
1 int j ;
2 int f ;
3 int m ;

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.

2.13 Regras de Nomenclatura


A linguagem C# possui regras tcnicas relacionadas nomenclatura das variveis. O nome (identificador) de uma varivel uma sequncia limitada de caracteres que:

1. Deve comear com uma letra ou com o caractere _.


2. Se for igual a uma palavra reservada (ver Tabela 2.4), necessrio adicionar o prefixo @.
3. Pode conter letras e dgitos.

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

2.14 Palavras Reservadas


Toda linguagem de programao possui um conjunto de palavras reservadas. Em geral, essas
palavras representam os comandos da linguagem. Na Tabela 2.4, so apresentadas as palavras reservadas da linguagem C#.
abstract
byte
class
delegate
event
fixed
if
internal
new
override
readonly
short
struct
try
unsafe
volatile

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

Tabela 2.4: Palavras reservadas da linguagem C#

2.15 Erro: Variveis com nomes repetidos


Um erro de compilao comum em C# ocorre quando duas ou mais variveis so declaradas com
nome repetido em um mesmo bloco. No exemplo abaixo, trs variveis com o mesmo nome foram
declaradas.
1 class Programa
2 {
3
static void Main ()
4
{
5
int a = 10;
6
7
double a = 10.7;
8
9
int a = 5;
10
}
11 }

www.facebook.com/k19treinamentos

49

VARIVEIS

50

Cdigo C# 2.55: Programa.cs

A mensagem de erro de compilao seria semelhante apresentada abaixo.


Programa . cs (7 ,10): error CS0128 : A local variable named a is already defined
in this scope
Programa . cs (7 ,14): error CS0266 : Cannot implicitly convert type double to
int . An explicit conversion exists ( are you missing a cast ?)
Programa . cs (9 ,7): error CS0128 : A local variable named a is already defined in
this scope

Terminal 2.4: Erro de compilao

2.16 Erro: Esquecer a inicializao de uma varivel local


Outro erro de compilao comum em C# ocorre quando utilizamos uma varivel local no inicializada. No exemplo abaixo, a varivel a foi utilizada sem antes ter sido inicializada.
1 class Programa
2 {
3
static void Main ()
4
{
5
int a ;
6
7
System . Console . WriteLine ( a ) ;
8
}
9 }
Cdigo C# 2.56: Programa.cs

A mensagem de erro de compilao seria semelhante apresentada abaixo.


Programa . cs (7 ,28): error CS0165 : Use of unassigned local variable a

Terminal 2.5: Erro de compilao

2.17 Erro: Trocar aspas simples por aspas duplas ou vice-versa


Mais um erro comum em C# ocorre quando utilizamos aspas simples onde deveramos usar aspas duplas ou vice-versa. Veja um exemplo de programa em C# que utiliza aspas duplas onde deveria
haver aspas simples.
1 class Programa
2 {
3
static void Main ()
4
{
5
char c = " A " ;
6
}
7 }
Cdigo C# 2.57: Programa.cs

A mensagem de erro de compilao seria semelhante apresentada abaixo.

50

www.k19.com.br

51

VARIVEIS
Programa . cs (5 ,12): error CS0029 : Cannot implicitly convert type string to
char

Terminal 2.6: Erro de compilao

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

A mensagem de erro de compilao seria semelhante apresentada abaixo.


Programa . cs (5 ,14): error CS1012 : Too many characters in character literal

Terminal 2.7: Erro de compilao

2.18 Erro: Utilizar o separador decimal errado


Outro erro de compilao comum em C# ocorre quando no utilizamos o separador decimal
correto. No exemplo abaixo, as casas decimais no foram separadas com o caractere . (ponto).
1 class Programa
2 {
3
static void Main ()
4
{
5
double d = 19 ,09;
6
}
7 }
Cdigo C# 2.59: Programa.cs

A mensagem de erro de compilao seria semelhante apresentada abaixo.


Programa . cs (5 ,17): error CS1001 : Identifier expected

Terminal 2.8: Erro de compilao

2.19 Erro: Valores incompatveis com os tipos das variveis


Tambm um erro de compilao comum em C# atribuir valores incompatveis com os tipos das
variveis. No exemplo abaixo, tentamos armazenar um valor do tipo double em uma varivel do tipo
int.
1 class Programa
2 {
3
static void Main ()
4
{

www.facebook.com/k19treinamentos

51

VARIVEIS

52

5
int a = 19.09;
6
}
7 }
Cdigo C# 2.60: Programa.cs

A mensagem de erro de compilao seria semelhante apresentada abaixo.


Programa . cs (5 ,11): error CS0266 : Cannot implicitly convert type double to
int . An explicit conversion exists ( are you missing a cast ?)

Terminal 2.9: Erro de compilao

2.20 Erro: Esquecer dos caracteres de tipagem para float ou decimal


Quando desejamos utilizar valores literais dos tipos float ou decimal, no podemos esquecer dos
caracteres de tipagem (F, f, M e m). Veja alguns exemplos de programa em C# com esse problema.
1 class Programa
2 {
3
static void Main ()
4
{
5
float a = 3.14;
6
}
7 }
Cdigo C# 2.61: Programa.cs

A mensagem de erro de compilao seria semelhante apresentada abaixo.


Programa . cs (5 ,13): error CS0664 : Literal of type double cannot be implicitly
converted to type float ; use an F suffix to create a literal of this
type

Terminal 2.10: Erro de compilao

1 class Programa
2 {
3
static void Main ()
4
{
5
decimal a = 3.14;
6
}
7 }
Cdigo C# 2.62: Programa.cs

A mensagem de erro de compilao seria semelhante apresentada abaixo.


Programa . cs (5 ,15): error CS0664 : Literal of type double cannot be implicitly
converted to type decimal ; use an M suffix to create a literal of
this type

Terminal 2.11: Erro de compilao

52

www.k19.com.br

53

VARIVEIS

2.21 Resumo
1

As variveis so utilizadas para armazenar os dados que um programa deve manipular.

Toda varivel possui um nome (identificador).

Em C#, as variveis so classificadas em tipos (tipadas).

Para armazenar um valor em uma varivel, esse valor deve ser compatvel com o tipo da vari-

vel.

Em C#, as variveis devem ser inicializadas antes de serem utilizadas.

A linguagem C# possui treze tipos simples: byte, sbyte, short, ushort, int, uint, long, ulong, float,

double, decimal, bool e char.

As variveis de tipos simples no aceitam o valor null.

Para armazenar nmeros inteiros grandes, podemos utilizar o tipo BigInteger.

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

Em C#, os valores literais do tipo float devem possuir o sufixo f ou F.

12

Em C#, o separador de casas decimais o . (ponto).

13

Em C#, os valores literais booleanos so true e false.

14

Strings literais so definidas dentro de aspas duplas.

15

O valor de uma constante no pode ser modificado.

www.facebook.com/k19treinamentos

53

VARIVEIS
16

54

Podemos gerar nmeros aleatrios em C# com o mtodo NextDouble() da classe System.Random.

17

As convenes de nomenclatura de variveis so importantes para melhorar a legibilidade do


cdigo.

18

Em C#, as convenes de nomenclatura de variveis so baseadas em letras maisculas e minsculas.

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 (

&

*=

/=

-=

==

!=

<

&&

||

<=
!

%=
>

++

>=

? :

--

3.2 Converses Entre Tipos Simples


Considere um nmero inteiro dentro do intervalo de valores do tipo int. Esse valor pode ser
armazenado em uma varivel do tipo long, pois todos os valores que esto no intervalo do tipo int
tambm esto no intervalo do tipo long.
Por causa disso, podemos copiar diretamente qualquer valor armazenado em uma varivel do
tipo int para uma varivel do tipo long. Veja o exemplo a seguir.
1 int a = 19;
2 long b = a ;
Cdigo C# 3.1: Compatibilidade

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

Tabela 3.1: Compatibilidade dos tipos simples

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

Em geral, quando h o risco de obter valores indesejados, os compiladores exigem a operao


de casting. Isso funciona como um alerta para o programador. Contudo, em alguns casos, mesmo
com esse risco, os compiladores no exigem a operao de casting. No exemplo abaixo, a varivel do
tipo long armazena o valor 9223372036854775807. Ao copiar o contedo dessa varivel para uma
varivel do tipo float, o valor obtido 9223372000000000000.

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.

3.3 Converso Entre Tipos Simples e String


Considere uma varivel do tipo string associada sequncia de caracteres 19. No podemos
copiar o valor dessa varivel para uma varivel do tipo int, pois um erro de compilao seria gerado.
1 string a = " 19 " ;
2 int b = a ;
Cdigo C# 3.7: Erro de compilao - Incompatibilidade

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()

Tabela 3.2: Converso

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

Ao executar a linha 8, o valor armazenado na varivel i exibido na sada padro.

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

3.4 Operadores Aritmticos


Os operadores aritmticos funcionam de forma muito semelhante aos operadores da Matemtica. Os operadores aritmticos so:
+ (adio)
- (subtrao)
* (multiplicao)
/ (diviso)
% (mdulo)
Nesta seo, vamos considerar a utilizao dos operadores aritmticos apenas com valores dos
tipos simples. Veja no cdigo a seguir alguns exemplos de uso desses operadores.
1
2
3
4
5
6
7
8
9

System . Console . WriteLine (1 + 2) ; // exibe : 3


System . Console . WriteLine (3 - 1) ; // exibe : 2
System . Console . WriteLine (2 * 3) ; // exibe : 6
System . Console . WriteLine (10 / 2) ; // exibe : 5
System . Console . WriteLine (10 % 4) ; // exibe : 2
Cdigo C# 3.14: Exemplo de uso dos operadores aritmticos

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

O mtodo Sqrt devolve NaN quando aplicado a valores negativos.

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

System . Console . WriteLine (6 % 5) ; // exibe : 1


System . Console . WriteLine (6 % -5) ; // exibe : 1
System . Console . WriteLine ( -6 % 5) ; // exibe : -1
System . Console . WriteLine ( -6 % -5) ; // exibe : -1

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

Agora, se o divisor for a constante 0, um erro de compilao ocorrer.


1 const a = 0;
2 int b = 10 / a ; // Ocorrer um erro de compilao

error CS0020 : Division by constant zero

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

1 double b = 10.0 / 0; // O resultado ser Infinity


2 double c = -10.0 / 0; // O resultado ser - Infinity
3 double d = 0.0 / 0; // O resultado ser NaN

3.5 Tipo do Resultado de uma Operao Aritmtica


No exemplo abaixo, a varivel b1 foi inicializada com o valor 1, a varivel b2 foi inicializada com o
valor 2 e a varivel b3 foi inicializada com resultado da operao b1 + b2. Contudo, na linguagem C#,
operaes aritmticas envolvendo valores do tipo byte devolvem valores do tipo int. Dessa forma, o
resultado da operao b1 + b2 no pode ser armazenado diretamente na varivel b3.
1 byte b1 = 1;
2
3 byte b2 = 2;
4
5 byte b3 = b1 + b2 ; // erro de compilao
Cdigo C# 3.21: Resultado das operaes aritmticas

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.

3.6 Diviso Inteira


Considere uma operao de diviso entre valores inteiros. Por exemplo, uma diviso entre valores
do tipo int.
1 int a = 5;
2 int b = 2;
3 System . Console . WriteLine ( a / b ) ; // exibe : 2
Cdigo C# 3.24: Diviso inteira

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

Pare para pensar...


Considerando o que foi discutido anteriormente a respeito de diviso inteira e casting,

www.facebook.com/k19treinamentos

63

O PERADORES

64

qual o resultado da operao do exemplo a seguir?


1 double d = ( double ) (5 / 2) ;

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 ()

3.7 Overflow e Underflow


Considere duas variveis do tipo int chamadas a e b. A varivel a armazena o maior valor do tipo
int, ou seja, armazena o valor 2147483647. A varivel b armazena o menor valor do tipo int, ou seja,

armazena o valor -2147483648.


Em C#, o resultado da operao a + 1 do tipo int porque os dois operandos so do tipo int.
Matematicamente, o resultado dessa operao 2147483648. Contudo, o maior valor aceito pelo
tipo int 2147483647. Nesse caso, a operao a + b gera um overflow e o valor obtido -2147483648.
Analogamente, a operao b - 1 causa um underflow e o seu resultado 2147483647.
1 System . Console . WriteLine ( a + 1) ; // overflow : -2147483648
2 System . Console . WriteLine ( b - 1) ; // underflow : 2147483647

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

3.8 Regras para Operaes Aritmticas com Valores Especiais


Os resultados das operaes aritmticas com float ou double envolvendo os valores Infinity, 0
e NaN seguem as seguintes regras:
Se pelo menos um dos operandos for NaN, o resultado ser NaN.
A soma de infinitos de sinais opostos NaN.
A soma de +Infinity com +Infinity +Infinity, assim como a soma de Infinity com Infinity
Infinity.
A soma de +Infinity com um valor finito +Infinity, assim como a soma de Infinity com um
valor finito Infinity.
A soma de zeros de sinais opostos +0.
A soma de +0 com +0 +0, assim como a soma de 0 com 0 0.
Tanto na multiplicao quanto na diviso, o sinal do resultado determinado como na Matemtica.
Multiplicar Infinity por 0 resulta em NaN.
Multiplicar Infinity por Infinity resulta em Infinity.
Dividir Infinity por Infinity resulta em NaN.
Dividir Infinity por um valor finito resulta em Infinity.
Dividir um valor finito por Infinity resulta em 0.
Dividir 0 por 0 resulta NaN.
Dividir 0 por um valor finito diferente de 0 resulta em 0.
Dividir um valor finito diferente de 0 por 0 resulta em Infinity.
Nas operaes de mdulo, o sinal do resultado o sinal do dividendo.
Nas operaes de mdulo, se o dividendo for Infinity ou o divisor for 0, o resultado NaN.
Nas operaes de mdulo, se o dividendo for Infinity e o divisor for Infinity, o resultado
NaN.
Nas operaes de mdulo, se o dividendo for 0 e o divisor finito, o resultado igual ao dividendo.

70

www.k19.com.br

71

O PERADORES

3.9 Concatenao de Strings


Como vimos anteriormente, o operador + utilizado para realizar a operao aritmtica de adio. Mas, ele tambm pode ser utilizado para concatenar strings.
1
2
3
4
5
6

string s1 = " Marcelo " ;


string s2 = " " ;
string s3 = " Martins " ;
// " Marcelo Martins "
string s4 = s1 + s2 + s3 ;

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

string s1 = " Idade : " ;


int idade = 30;
// " Idade : 30"
string s2 = s1 + idade ;

Pare para pensar...


As expresses so avaliadas da esquerda para a direita. Dessa forma, considere o seguinte trecho de cdigo:
1 System . Console . WriteLine (1 + 2 + 3 + " testando " ) ;
2 System . Console . WriteLine ( " testando " + 1 + 2 + 3) ;

O que seria exibido nesse caso?

Pare para pensar...


Como vimos, quando um dos operandos do operador + do tipo string, a operao que
ser realizada a de concatenao. Dessa forma, o que seria exibido na sada padro com o
cdigo abaixo?
1 System . Console . WriteLine ( a + a ) ;

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

3.11 Operadores de Atribuio


Um operador de atribuio altera o valor armazenado em uma varivel. Nesta seo, vamos
considerar a utilizao dos operadores de atribuio com valores dos tipos simples.
= (atribuio simples)
+= (incremental)
-= (decremental)
*= (multiplicativa)
/= (divisria)
%= (modular)
++ (incremento)
-- (decremento)

Operador de atribuio simples


O operador = chamado de operador de atribuio simples. Esse operador armazena o valor da
expresso sua direita na varivel sua esquerda. O resultado devolvido por essa operao o valor
armazenado na varivel.
Essa operao s permitida se o tipo do valor da expresso direita compatvel com o tipo da
varivel esquerda (ver Tabela 3.1).
No exemplo abaixo, so declaradas duas variveis do tipo int. Na primeira linha, o operador =
utilizado para armazenar o valor 1 na varivel a. Na segunda linha, esse operador utilizado para
armazenar em b uma cpia do valor armazenado na varivel a.
www.facebook.com/k19treinamentos

73

O PERADORES

74

1 int a = 1;
2 int b = a ;

Operadores de atribuio compostos


Os operadores de atribuio +=, -=, *=, /=, %=, ++ e -- so chamados de operadores compostos, pois
alm de modificar o valor de uma varivel, eles realizam a operao aritmtica correspondente. Por
exemplo, a operao a += b faz com que a varivel a passe a armazenar o valor de a + b.
Confira, no cdigo abaixo, exemplos de utilizao desses operadores.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

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

Agora, no exemplo a seguir, a operao a = b invlida. Portanto, a operao a += b tambm


invlida.
1 ulong a = 1;
2 short b = 1;
3 a += b ; // invlida , pois a = b invlida

Os operadores de atribuio compostos reduzem a quantidade de cdigo escrito. Eles funcionam


como atalhos para realizar operaes aritmticas em conjunto com operaes de atribuio.

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

Na sequncia, a linha 7 executada. Utilizando o operador *=, o valor armazenado na varivel a


multiplicado por 2. O resultado dessa operao armazenado na prpria varivel a. Dessa forma,
aps a execuo dessa linha, o valor contido nessa varivel ser 20.
3

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

Por fim, a linha 10 executada e o valor da varivel a exibido na sada padro.

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

3.12 Operadores de Comparao


Muitas vezes precisamos determinar a equivalncia entre dois valores ou a relao de grandeza
(se maior ou menor) entre eles. Nessas situaes, utilizamos os operadores de comparao (tambm chamados de operadores relacionais). As operaes realizadas com os operadores relacionais
devolvem valores do tipo bool. Os operadores relacionais so:
== (igualdade)
!= (desigualdade)
< (menor)
<= (menor ou igual)
> (maior)
>= (maior ou igual)
Nesta seo, vamos considerar a utilizao dos operadores de comparao com valores dos tipos
simples. Veja, no cdigo abaixo, alguns exemplos de utilizao desses operadores.
1
2
3
4
5
6

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

7 b = ( valor > 1) ; // b = true


8 b = ( valor >= 1) ; // b = true
Cdigo C# 3.64: Exemplo de uso dos operadores relacionais em C#

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

3.13 Operadores Lgicos


Nesta seo, apresentamos os operadores lgicos considerando suas aplicaes apenas a operandos do tipo bool.
Considere um jogo de dados no qual o jogador faz dois lanamentos de dado. Se o resultado do
primeiro lanamento for menor do que 3 e o resultado do segundo for maior do 4, o jogador ganha.
Caso contrrio, ele perde. Suponha que o resultado do primeiro lanamento seja armazenado em
uma varivel chamada a e o resultado do segundo em uma varivel chamada b.
Como verificar se o jogador ganhou? Podemos utilizar um operador lgico. Os operadores lgicos
da linguagem C# so:
& (E simples)
&& (E duplo)
| (OU simples)
|| (OU duplo)
(OU exclusivo)
Os operandos de uma operao lgica so valores do tipo bool e o resultado de uma operao
lgica tambm um valor do tipo bool.
www.facebook.com/k19treinamentos

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

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) ;
System . Console . WriteLine ( a < 3 && b > 4) ;
Cdigo C# 3.69: Exemplo de uso dos operadores & e &&

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

a < 3 && b > 4


V
F
F
F

Tabela 3.3: Tabela verdade dos operadores & e &&

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

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) ;
System . Console . WriteLine ( a < 3 || b > 4) ;
Cdigo C# 3.70: Exemplo de uso dos operadores | e ||

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

Tabela 3.4: Tabela verdade dos operadores | e ||

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

Vamos visualizar o resultado do operador atravs da tabela verdade.


a<3
V
V
F
F

b>4
V
F
V
F

a<3b>4
F
V
V
F

Tabela 3.5: Tabela verdade do operador

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
?

a < 3 && b > 4


V
F
F

Tabela 3.6: Tabela verdade do operador &&

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

Tabela 3.7: Tabela verdade do operador ||

Pare para pensar...


Considerando o comportamento dos operadores lgicos &, &&, | e ||, o que seria exibido
com as seguintes instrues?
1 int i = 10;
2

www.facebook.com/k19treinamentos

81

O PERADORES
3
4
5
6
7

System . Console . WriteLine ( i >


System . Console . WriteLine ( i >
System . Console . WriteLine ( i >
System . Console . WriteLine ( i >
System . Console . WriteLine ( i ) ;

82
100 & i ++ < 500) ;
100 && i ++ < 500) ;
0 | i ++ < 500) ;
0 || i ++ < 500) ;

Pare para pensar...


A linguagem C# possui os operadores lgicos & e &&. Tambm possui os operadores | e
||. Agora, a pergunta que no quer calar: por qu no existe o operador ?

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

3.14 Operador Ternrio ?:


Considere um programa que controla as notas dos alunos de uma escola. Para exemplificar, vamos gerar a nota de um aluno aleatoriamente.
1 System . Random gerador = new System . Random () ;
2 double nota = 10.0 * gerador . NextDouble () ;

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

Figura 3.1: Operador ternrio

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;

3.15 Operador de Negao


Valores booleanos podem ser invertidos com o operador de negao !, ou seja, o valor true pode
ser substitudo por false e vice-versa. Por exemplo, podemos verificar se uma varivel do tipo double
armazena um valor maior do que 5 de duas formas diferentes. A primeira delas verifica diretamente
se o nmero maior do que 5 com o uso do operador >.
1 d > 5

A segunda forma utiliza o operador de negao e verifica se o nmero no menor ou igual a 5.


1 !( d <= 5)

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

Por fim, a linha 8 executada e a mensagem APROVADO exibida na sada padro.

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

3.16 Incremento e Decremento


Os operadores ++ e -- podem ser utilizados de duas formas diferentes, antes ou depois de uma
varivel de tipo simples numrico.
1 int i = 10;
2 i ++; // ps incremento
3 i - -; // ps decremento
Cdigo C# 3.96: Ps incremento e ps decremento

1 int i = 10;
2 ++ i ; // pr incremento
3 --i ; // pr decremento
Cdigo C# 3.97: Pr incremento e pr decremento

No primeiro exemplo, o operador ++ foi utilizado direita da varivel i. J no segundo exemplo,


ele foi utilizado esquerda da varivel i. A primeira forma de utilizar o operador ++ chamada de
ps incremento. A segunda chamada de pr incremento. Analogamente, o operador -- foi utilizado
na forma de ps decremento no primeiro exemplo e pr decremento no segundo exemplo.
Mas, qual a diferena entre pr incremento e ps incremento (ou entre pr decremento e ps
decremento)? As operaes de incremento (ou decremento) alteram o valor de uma varivel e devolvem um valor. Tanto o pr incremento quanto o ps incremento adicionam 1 ao valor armazenado
em uma varivel. O pr incremento devolve o valor armazenado na varivel aps o seu incremento.
O ps incremento, por outro lado, devolve o valor armazenado na varivel antes de seu incremento.
O comportamento anlogo para as operaes de pr e ps decremento. Vejamos alguns exemplos
a seguir.
1 int i = 10;
2 System . Console . WriteLine ( i ++ == 10) ; // exibe : true
3 System . Console . WriteLine ( i ) ; // exibe : 11

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

parao utilizar o valor armazenado na varivel i depois do incremento.


Analogamente, a comparao utilizaria o valor novo da varivel i se o operador -- fosse utilizado
na forma de pr decremento.

Pare para pensar...


Considere o comportamento do pr incremento, ps incremento, pr decremento e ps
decremento. O que seria exibido no exemplo abaixo?
1
2
3
4
5

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

Ao executar a linha 9, o valor da varivel a ser exibido na sada padro.

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

3.17 Avaliando uma Expresso


A ordem de avaliao das operaes de uma expresso determina o resultado dessa expresso.
Por exemplo, considere a expresso 2 + 3 5. Se a operao de adio for efetuada primeiro, o resultado dessa expresso ser 40. Por outro lado, se a multiplicao for efetuada antes da adio, o
resultado ser 17. Dizemos que essa expresso ambgua.
Para avaliar uma expresso, devemos primeiramente eliminar qualquer ambiguidade presente
na expresso. Para isso, vamos utilizar a Tabela 3.8.

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

Tabela 3.8: Precedncia de operadores

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

Agora, h um empate na precedncia dos operadores de multiplicao e diviso. Como, nesse


caso, a prioridade do operador mais esquerda, a multiplicao a prxima operao.

1 +

(7

* 3) / 4 / ((double)((int)x)) - y

Na sequncia, o operador de diviso mais esquerda possui prioridade sobre os outros.

1 +

((7

* 3) / 4) / ((double)((int)x)) - y

Entre os operadores restantes, o operador de diviso possui prioridade sobre os outros.


96

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

Por fim, o ltimo operador o de subtrao.

((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)

O resultado dessa expresso 21.


((1 + ((21 / 4) / ((double)((int)x)))) - y)

Agora, o par de parnteses interno mais esquerda envolve a expresso 21 / 4.


((1 + ((21 / 4) / ((double)((int)x)))) - y)

Como essa uma diviso entre dois valores inteiros, o resultado dessa expresso 5.
((1 + (5 / ((double)((int)x)))) - y)

Em seguida, o par de parnteses interno mais esquerda envolve a expresso (int)x


((1 + (5 / ((double)((int)x)))) - y)

www.facebook.com/k19treinamentos

97

O PERADORES

98

Como o valor de x 4.57, o resultado dessa expresso 4.


((1 + (5 / ((double)4))) - y)

Agora, o par de parnteses interno mais esquerda envolve a expresso (double)4.

((1 + (5 /

((double)4)))

- y)

O valor dessa expresso 4.0.

((1 + (5 /

4.0))

- y)

Em seguida, o par de parnteses interno mais esquerda envolve a expresso 5 / 4.0.

((1 +

(5

/ 4.0)) - y)

O valor dessa expresso 1.25.

((1 +

1.25)

- y)

Agora, o par de parnteses a ser processado o que envolve a expresso 1 + 1.25.


((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)

Finalmente, processamos o ltimo par de parnteses da expresso.

(2.25

- y)

Como o valor armazenado em y 2.25, o valor dessa ltima expresso 0.0.

0.0

3.18 Manipulao de Strings


Nesta seo, mostraremos como manipular strings.
98

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

Caractere em determinada posio


Podemos acessar um determinado caractere de uma string atravs do operador []. No exemplo
abaixo, a varivel s armazena uma referncia para a string com contedo Rafael Cosentino. Para
acessar o terceiro caractere dessa string, por exemplo, podemos fazer s[2].
1
2
3
4
5
6
7
8
9

string s = " Rafael Cosentino " ;


char a = s [0]; // obtm o primeiro caractere
char b = s [9]; // obtm o dcimo caractere
char c = s [15]; // obtm o dcimo sexto ( ltimo ) caractere
System . Console . WriteLine ( a ) ; // exibe : R
System . Console . WriteLine ( b ) ; // exibe : s
System . Console . WriteLine ( c ) ; // exibe : o

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

string s = " K11 - Orientao a Objetos em C # " ;


bool resultado1 = s . Contains ( " Objetos " ) ;
bool resultado2 = s . Contains ( " objetos " ) ;
System . Console . WriteLine ( resultado1 ) ; // exibe : True
System . Console . WriteLine ( resultado2 ) ; // exibe : False

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

string s = " K11 - Orientao a Objetos em C # " ;


bool resultado1 = s . EndsWith ( " C # " ) ;
bool resultado2 = s . EndsWith ( " Objetos " ) ;
System . Console . WriteLine ( resultado1 ) ; // exibe : True
System . Console . WriteLine ( resultado2 ) ; // exibe : False

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

string s = " K11 - Orientao a Objetos em C # " ;


bool resultado1 = s . StartsWith ( " C # " ) ;
bool resultado2 = s . StartsWith ( " K11 " ) ;
System . Console . WriteLine ( resultado1 ) ; // exibe : False
System . Console . WriteLine ( resultado2 ) ; // exibe : True

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.

3.19 Operaes com Data e Hora


Algumas operaes so especficas para data e hora. A seguir, apresentaremos algumas dessas
operaes.

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

DateTime dt = new DateTime (2010 , 8 , 27) ;


// Acrescentando 140 dias
dt = dt . AddDays (140) ;
// Subtraindo 2 anos
dt = dt . AddYears ( -2) ;
// Acrescentando 72 horas
dt = dt . AddHours (72) ;

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

DateTime dt1 = new DateTime (2010 , 8 , 27) ;


DateTime dt2 = DateTime . Now ; // data e hora atuais
System . Console . WriteLine ( dt1 < dt2 ) ; // exibe : True
System . Console . WriteLine ( dt1 > dt2 ) ;

// 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.

3.20 Erro: Utilizar operandos e operadores incompatveis


Um erro de compilao comum ocorre quando um operador aplicado a valores incompatveis.
Veja alguns exemplos de programas em C# com esse problema.
1 class Programa
2 {
3
static void Main ()
4
{
5
string s1 = " K19 " ;
6
string s2 = " Treinamentos " ;
7
8
System . Console . WriteLine ( s1 - s2 ) ;
9
}
10 }
Cdigo C# 3.127: Programa.cs

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

Terminal 3.35: Erro de compilao

No cdigo abaixo, o operador > usado com operandos do tipo bool.


1 class Programa
2 {
3
static void Main ()
4
{
5
bool b1 = true ;

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

Terminal 3.36: Erro de compilao

No cdigo a seguir, o operador de negao ! aplicado a um valor do tipo int.


1 class Programa
2 {
3
static void Main ()
4
{
5
int i = 1;
6
7
System . Console . WriteLine (! i ) ;
8
}
9 }
Cdigo C# 3.129: Programa.cs

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

Terminal 3.37: Erro de compilao

3.21 Erro: Diviso inteira por zero


Um erro de execuo comum ocorre quando um valor numrico inteiro divido pelo valor inteiro
0. Veja um exemplo de programa em C# com esse problema.
1 class Programa
2 {
3
static void Main ()
4
{
5
int a = 10;
6
int b = 100 / ( a - 10) ;
7
}
8 }
Cdigo C# 3.130: Programa.cs

Ao executar o programa, a instruo da linha 6 provoca um erro de execuo devido diviso do


valor inteiro 100 pelo valor inteiro 0.
Unhandled Exception : System . DivideByZeroException : Attempted to divide by zero .

104

www.k19.com.br

105

O PERADORES
at Programa . Main ()

Terminal 3.38: Erro de execuo

3.22 Erro: Armazenamento de valores incompatveis


Um erro comum ocorre quando tentamos armazenar em uma varivel um valor que no compatvel com o tipo dessa varivel. A seguir, apresentamos alguns exemplos onde esse tipo de problema acontece. Considere o cdigo abaixo.
1 class Programa
2 {
3
static void Main ()
4
{
5
double a = 10.0;
6
int b = 5 + a ;
7
}
8 }
Cdigo C# 3.131: Programa.cs

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 ?)

Terminal 3.39: Erro de compilao

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

Como 3.14 um valor do tipo double, isso provoca um erro de compilao.


Programa . cs (5 ,13): error CS0664 : Literal of type double cannot be implicitly
converted to type float ; use an F suffix to create a literal of this
type

Terminal 3.40: Erro de compilao

3.23 Erro: Castings no permitidos


Algumas operaes de castings no so permitidas em C#. Por exemplo, considere a converso
de um nmero inteiro para string.
www.facebook.com/k19treinamentos

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

Terminal 3.41: Erro de compilao

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

O cdigo acima apresenta o seguinte erro de compilao.


Programa . cs (6 ,11): error CS0030 : Cannot convert type string to int

Terminal 3.42: Erro de compilao

Para converter uma string para um int, podemos usar o mtodo ToInt32 da classe System.Convert.

3.24 Resumo
1

Os operadores so utilizados para manipular os valores armazenados nas variveis ou valores


literais.

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

Operaes de casting podem gerar resultados bem diferentes dos desejados.

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.

As operaes aritmticas de adio, subtrao, multiplicao, diviso e resto so realizadas


respectivamente atravs dos operadores +, -, *, / e %.

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.

A diviso entre valores inteiros desconsidera a parte fracionria do resultado.

10

Operaes aritmticas podem produzir overflow e underflow.

11

O operador + tambm utilizado para realizar a concatenao de strings.

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

Operadores relacionais devolvem valores booleanos.

15

As operaes lgicas E, OU e OU EXCLUSIVO so realizadas atravs dos operadores: &, &&, |, ||

e .

16

O operador && no avalia o segundo operando se o valor do primeiro operando for false.

17

O operador || no avalia o segundo operando se o valor do primeiro operando for true.

18

O primeiro argumento do operador ternrio ?: deve ser um valor booleano.


www.facebook.com/k19treinamentos

107

O PERADORES
19

O operador de negao ! inverte os valores booleanos.

20

O operador ++ pode ser utilizado na forma de pr e ps incremento.

21

O operador -- pode ser utilizado na forma de pr e ps decremento.

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.2 Instrues de Deciso


Considere um parque de diverses como os da Disney. Nesses parques, para garantir a segurana, alguns brinquedos possuem restries de acesso. Em geral, essas restries esto relacionadas altura dos visitantes. Em alguns parques, a altura do visitante obtida por sensores instalados
na entrada dos brinquedos e um programa de computador libera ou bloqueia o acesso de acordo
com altura obtida. Ento, o programa deve decidir se executa um trecho de cdigo de acordo com
uma condio. Essa deciso pode ser realizada atravs das instrues de deciso oferecidas pelas
linguagens de programao.
Nos exemplos vistos nos captulos anteriores, a ordem da execuo das linhas de um programa
exatamente a ordem na qual elas foram definidas no cdigo fonte. As instrues de deciso permitem decidir se um bloco de cdigo deve ou no ser executado. As instrues de deciso so capazes
de criar um desvio no fluxo de execuo de um programa.
Neste captulo, veremos as seguintes instrues de deciso: if, else e switch.

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

contrrio, ou seja, se a condio for false, o bloco de comandos no ser executado.


A condio da instruo if deve ser um valor do tipo bool. A Figura 4.1 ilustra o fluxo de execuo
da instruo if.

condio

false

true
bloco de
comandos

Figura 4.1: Fluxograma da instruo if

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

System . Random gerador = new System . Random () ;


double altura = gerador . NextDouble () ;
System . Console . WriteLine ( altura ) ;
if ( altura < 0.89)
{
System . Console . WriteLine ( " Acesso bloqueado " ) ;
}
System . Console . WriteLine ( " The Barnstormer " ) ;

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

System . Random gerador = new System . Random () ;


double altura = gerador . NextDouble () ;
System . Console . WriteLine ( altura ) ;
if ( altura < 0.89)
{
System . Console . WriteLine ( " Acesso bloqueado " ) ;
}
System . Console . WriteLine ( " The Barnstormer " ) ;

altura = 0.75

Em seguida, a linha 3 executada e o valor armazenado na varivel altura exibido no terminal.

System . Random gerador = new System . Random () ;


double altura = gerador . NextDouble () ;
System . Console . WriteLine ( altura ) ;
if ( altura < 0.89)
{
System . Console . WriteLine ( " Acesso bloqueado " ) ;
}
System . Console . WriteLine ( " The Barnstormer " ) ;

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

System . Random gerador = new System . Random () ;


double altura = gerador . NextDouble () ;
System . Console . WriteLine ( altura ) ;
if ( altura < 0.89)
{
System . Console . WriteLine ( " Acesso bloqueado " ) ;
}
System . Console . WriteLine ( " The Barnstormer " ) ;

altura = 0.75

0.75

A linha 6 executada porque a condio do if da linha 4 verdadeira. Dessa forma, a mensagem


Acesso bloqueado exibida no terminal.
5

1
2
3
4
5
6
7
8

System . Random gerador = new System . Random () ;


double altura = gerador . NextDouble () ;
System . Console . WriteLine ( altura ) ;
if ( altura < 0.89)
{
System . Console . WriteLine ( " Acesso bloqueado " ) ;
}
System . Console . WriteLine ( " The Barnstormer " ) ;

altura = 0.75

0.75
Acesso bloqueado

Por fim, a linha 8 executada e a mensagem The Barnstormer exibida no terminal.

www.facebook.com/k19treinamentos

111

C ONTROLE DE F LUXO

1
2
3
4
5
6
7
8

System . Random gerador = new System . Random () ;


double altura = gerador . NextDouble () ;
System . Console . WriteLine ( altura ) ;
if ( altura < 0.89)
{
System . Console . WriteLine ( " Acesso bloqueado " ) ;
}
System . Console . WriteLine ( " The Barnstormer " ) ;

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

System . Random gerador = new System . Random () ;


double altura = gerador . NextDouble () ;
System . Console . WriteLine ( altura ) ;
if ( altura < 0.89)
{
System . Console . WriteLine ( " Acesso bloqueado " ) ;
}
System . Console . WriteLine ( " The Barnstormer " ) ;

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

System . Random gerador = new System . Random () ;


double altura = gerador . NextDouble () ;
System . Console . WriteLine ( altura ) ;
if ( altura < 0.89)
{
System . Console . WriteLine ( " Acesso bloqueado " ) ;
}
System . Console . WriteLine ( " The Barnstormer " ) ;

Prosseguindo, na linha 3, o valor armazenado na varivel altura exibido no terminal.

1
2
3
4
5
6
7
8

altura = 0.97

System . Random gerador = new System . Random () ;


double altura = gerador . NextDouble () ;
System . Console . WriteLine ( altura ) ;
if ( altura < 0.89)
{
System . Console . WriteLine ( " Acesso bloqueado " ) ;
}
System . Console . WriteLine ( " The Barnstormer " ) ;

altura = 0.97

0.97

112

www.k19.com.br

113

C ONTROLE DE F LUXO

Na linha 4, a comparao da condio do if devolve false pois o valor da varivel altura no


menor do que 0.89.
4

1
2
3
4
5
6
7
8

System . Random gerador = new System . Random () ;


double altura = gerador . NextDouble () ;
System . Console . WriteLine ( altura ) ;
if ( altura < 0.89)
{
System . Console . WriteLine ( " Acesso bloqueado " ) ;
}
System . Console . WriteLine ( " The Barnstormer " ) ;

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

System . Random gerador = new System . Random () ;


double altura = gerador . NextDouble () ;
System . Console . WriteLine ( altura ) ;
if ( altura < 0.89)
{
System . Console . WriteLine ( " Acesso bloqueado " ) ;
}
System . Console . WriteLine ( " The Barnstormer " ) ;

altura = 0.97

0.97
The Barnstormer

4.4 Instruo else


Muitas vezes, queremos executar um bloco de comandos caso uma condio seja verdadeira e
outro bloco de comandos caso essa condio seja falsa. Para isso, podemos utilizar as instrues de
deciso if e else. Veja abaixo, a estrutura dessas instrues.
1
2
3
4
5
6
7
8

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

Figura 4.2: Fluxograma das instrues if e 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

System . Random gerador = new System . Random () ;


double altura = gerador . NextDouble () ;
System . Console . WriteLine ( altura ) ;
if ( altura < 0.89)
{
System . Console . WriteLine ( " Acesso bloqueado " ) ;
}
else
{
System . Console . WriteLine ( " Acesso liberado " ) ;
}
System . Console . WriteLine ( " The Barnstormer " ) ;

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

System . Random gerador = new System . Random () ;


double altura = gerador . NextDouble () ;
System . Console . WriteLine ( altura ) ;
if ( altura < 0.89)
{
System . Console . WriteLine ( " Acesso bloqueado " ) ;
}
else
{
System . Console . WriteLine ( " Acesso liberado " ) ;
}
System . Console . WriteLine ( " The Barnstormer " ) ;

altura = 0.75

Na linha 3, o valor armazenado na varivel altura exibido no terminal.


System . Random gerador = new System . Random () ;
double altura = gerador . NextDouble () ;
System . Console . WriteLine ( altura ) ;
if ( altura < 0.89)
{
System . Console . WriteLine ( " Acesso bloqueado " ) ;
}
else
{
System . Console . WriteLine ( " Acesso liberado " ) ;
}
System . Console . WriteLine ( " The Barnstormer " ) ;

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

System . Random gerador = new System . Random () ;


double altura = gerador . NextDouble () ;
System . Console . WriteLine ( altura ) ;
if ( altura < 0.89)
{
System . Console . WriteLine ( " Acesso bloqueado " ) ;
}
else
{
System . Console . WriteLine ( " Acesso liberado " ) ;
}
System . Console . WriteLine ( " The Barnstormer " ) ;

altura = 0.75

0.75

A linha 6 executada porque a condio do if da linha 4 verdadeira. Dessa forma, a mensagem


Acesso bloqueado exibida no terminal.
5

www.facebook.com/k19treinamentos

115

C ONTROLE DE F LUXO

1
2
3
4
5
6
7
8
9
10
11
12

System . Random gerador = new System . Random () ;


double altura = gerador . NextDouble () ;
System . Console . WriteLine ( altura ) ;
if ( altura < 0.89)
{
System . Console . WriteLine ( " Acesso bloqueado " ) ;
}
else
{
System . Console . WriteLine ( " Acesso liberado " ) ;
}
System . Console . WriteLine ( " The Barnstormer " ) ;

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

System . Random gerador = new System . Random () ;


double altura = gerador . NextDouble () ;
System . Console . WriteLine ( altura ) ;
if ( altura < 0.89)
{
System . Console . WriteLine ( " Acesso bloqueado " ) ;
}
else
{
System . Console . WriteLine ( " Acesso liberado " ) ;
}
System . Console . WriteLine ( " The Barnstormer " ) ;

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

System . Random gerador = new System . Random () ;


double altura = gerador . NextDouble () ;
System . Console . WriteLine ( altura ) ;
if ( altura < 0.89)
{
System . Console . WriteLine ( " Acesso bloqueado " ) ;
}
else
{
System . Console . WriteLine ( " Acesso liberado " ) ;
}
System . Console . WriteLine ( " The Barnstormer " ) ;

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

System . Random gerador = new System . Random () ;


double altura = gerador . NextDouble () ;
System . Console . WriteLine ( altura ) ;
if ( altura < 0.89)
{
System . Console . WriteLine ( " Acesso bloqueado " ) ;
}
else
{
System . Console . WriteLine ( " Acesso liberado " ) ;
}
System . Console . WriteLine ( " The Barnstormer " ) ;

altura = 0.97

Na linha 3, o valor armazenado na varivel altura exibido no terminal.


System . Random gerador = new System . Random () ;
double altura = gerador . NextDouble () ;
System . Console . WriteLine ( altura ) ;
if ( altura < 0.89)
{
System . Console . WriteLine ( " Acesso bloqueado " ) ;
}
else
{
System . Console . WriteLine ( " Acesso liberado " ) ;
}
System . Console . WriteLine ( " The Barnstormer " ) ;

altura = 0.97

0.97

Na linha 4, a comparao da condio do if devolve false pois o valor da varivel altura no


menor do que 0.89.
4

1
2
3
4
5
6
7
8
9
10
11
12

System . Random gerador = new System . Random () ;


double altura = gerador . NextDouble () ;
System . Console . WriteLine ( altura ) ;
if ( altura < 0.89)
{
System . Console . WriteLine ( " Acesso bloqueado " ) ;
}
else
{
System . Console . WriteLine ( " Acesso liberado " ) ;
}
System . Console . WriteLine ( " The Barnstormer " ) ;

altura = 0.97

0.97

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 10 e a mensagem Acesso liberado exibida no terminal.
5

www.facebook.com/k19treinamentos

117

C ONTROLE DE F LUXO

1
2
3
4
5
6
7
8
9
10
11
12

System . Random gerador = new System . Random () ;


double altura = gerador . NextDouble () ;
System . Console . WriteLine ( altura ) ;
if ( altura < 0.89)
{
System . Console . WriteLine ( " Acesso bloqueado " ) ;
}
else
{
System . Console . WriteLine ( " Acesso liberado " ) ;
}
System . Console . WriteLine ( " The Barnstormer " ) ;

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

System . Random gerador = new System . Random () ;


double altura = gerador . NextDouble () ;
System . Console . WriteLine ( altura ) ;
if ( altura < 0.89)
{
System . Console . WriteLine ( " Acesso bloqueado " ) ;
}
else
{
System . Console . WriteLine ( " Acesso liberado " ) ;
}
System . Console . WriteLine ( " The Barnstormer " ) ;

altura = 0.97

0.97
Acesso liberado
The Barnstormer

4.5 Instrues de Deciso Encadeadas


Considere um programa de computador que controla os saques efetuados nos caixas eletrnicos
de um banco. Nesse banco, os saques efetuados das 6 horas at as 22 horas no podem ser superiores
a R$ 5.000,00. Por outro lado, os saques efetuados depois das 22 horas e antes das 6 horas no podem
ser superiores a R$ 400,00. Podemos implementar essa lgica utilizando as instrues de deciso
oferecidas pelas linguagens de programao.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

if ( hora >= 6 && hora <= 22)


{
if ( valor <= 5000)
{
System . Console . WriteLine ( " Saque efetuado com sucesso " ) ;
}
else
{
System . Console . WriteLine ( " Valor mximo de saque R$ 5000 ,00 " ) ;
}
}
else
{
if ( valor <= 400)
{
System . Console . WriteLine ( " Saque efetuado com sucesso " ) ;

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

double nota = 8.2;


if ( nota >= 5.0)
{
System . Console . WriteLine ( " Aprovado " ) ;
if ( nota < 8.0)
{
System . Console . WriteLine ( " Sua nota foi regular " ) ;
}
else
{
System . Console . WriteLine ( " Sua nota foi tima " ) ;
}
}
else
{
System . Console . WriteLine ( " Reprovado " ) ;
}

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

double nota = 8.2;


if ( nota >= 5.0)
{
System . Console . WriteLine ( " Aprovado " ) ;
if ( nota < 8.0)
{
System . Console . WriteLine ( " Sua nota foi regular " ) ;
}
else
{
System . Console . WriteLine ( " Sua nota foi tima " ) ;
}
}
else
{
System . Console . WriteLine ( " Reprovado " ) ;
}

nota = 8.2

Como a condio do if da linha 2 verdadeira, a linha 4 executada e a palavra Aprovado


exibida na sada padro.
3

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

double nota = 8.2;


if ( nota >= 5.0)
{
System . Console . WriteLine ( " Aprovado " ) ;
if ( nota < 8.0)
{
System . Console . WriteLine ( " Sua nota foi regular " ) ;
}
else
{
System . Console . WriteLine ( " Sua nota foi tima " ) ;
}
}
else
{
System . Console . WriteLine ( " Reprovado " ) ;
}

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

double nota = 8.2;


if ( nota >= 5.0)
{
System . Console . WriteLine ( " Aprovado " ) ;
if ( nota < 8.0)
{
System . Console . WriteLine ( " Sua nota foi regular " ) ;
}
else
{
System . Console . WriteLine ( " Sua nota foi tima " ) ;
}
}
else
{
System . Console . WriteLine ( " Reprovado " ) ;
}

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

double nota = 8.2;


if ( nota >= 5.0)
{
System . Console . WriteLine ( " Aprovado " ) ;
if ( nota < 8.0)
{
System . Console . WriteLine ( " Sua nota foi regular " ) ;
}
else
{
System . Console . WriteLine ( " Sua nota foi tima " ) ;
}
}
else
{
System . Console . WriteLine ( " Reprovado " ) ;
}

120

nota = 8.2

www.k19.com.br

121

C ONTROLE DE F LUXO

Aprovado
Sua nota foi tima

4.6 Instrues de Repetio


Considere um programa que gera bilhetes de loteria. O nmero do primeiro bilhete 1000, do
segundo 1001, do terceiro 1002 e assim por diante at o ltimo bilhete numerado com 9999. Para
esse tipo de tarefa, podemos utilizar as instrues de repetio oferecidas pelas linguagens de programao.
Como vimos, as instrues de deciso permitem que um determinado trecho de cdigo seja executado ou no. Agora, as instrues de repetio permitem que um determinado trecho de cdigo
seja executado vrias vezes.
Veremos neste captulo as instrues de repetio while, for e do-while.

4.7 Instruo while


A instruo de repetio while recebe como parmetro uma condio. O cdigo no corpo do while
ser executado de acordo com essa condio. A sintaxe dessa instruo a seguinte:
1 while ( condio )
2 {
3
bloco de comandos
4 }

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

Figura 4.3: Fluxograma da instruo while

Considere um programa que exibe na tela cem mensagens de acordo com o seguinte padro:
Mensagem nmero 1
Mensagem nmero 2
...
Mensagem nmero 100

Terminal 4.19: Programa que exibe mensagens

Esse programa poderia ser implementado sem as instrues de repetio.


1
2
3
4

System . Console . WriteLine ( " Mensagem nmero 1 " ) ;


System . Console . WriteLine ( " Mensagem nmero 2 " ) ;
...
System . Console . WriteLine ( " Mensagem nmero 100 " ) ;
Cdigo C# 4.33: Exibindo a frase Mensagem nmero x

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

// Varivel que indica o ndice da prxima mensagem que deve exibida .


int i = 1;
while ( i <= 100)
{
System . Console . WriteLine ( " Mensagem nmero " + i ) ;
i ++;
}
Cdigo C# 4.34: Exibindo a frase Mensagem nmero x

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

Na linha 1, a varivel numero declarada e inicializada com o valor 1000.


int numero = 1000;
while ( numero <= 1002)
{
System . Console . WriteLine ( " Bilhete " + numero ) ;
numero ++;
}
System . Console . WriteLine ( " FIM " ) ;

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

int numero = 1000;


while ( numero <= 1002)
{
System . Console . WriteLine ( " Bilhete " + numero ) ;
numero ++;
}
System . Console . WriteLine ( " FIM " ) ;

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

int numero = 1000;


while ( numero <= 1002)
{
System . Console . WriteLine ( " Bilhete " + numero ) ;
numero ++;
}
System . Console . WriteLine ( " FIM " ) ;

124

numero = 1000

Bilhete 1000

Ao executar a linha 5, a varivel numero incrementada para 1001.

1
2
3
4
5
6
7

int numero = 1000;


while ( numero <= 1002)
{
System . Console . WriteLine ( " Bilhete " + numero ) ;
numero ++;
}
System . Console . WriteLine ( " FIM " ) ;

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

int numero = 1000;


while ( numero <= 1002)
{
System . Console . WriteLine ( " Bilhete " + numero ) ;
numero ++;
}
System . Console . WriteLine ( " FIM " ) ;

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

int numero = 1000;


while ( numero <= 1002)
{
System . Console . WriteLine ( " Bilhete " + numero ) ;
numero ++;
}
System . Console . WriteLine ( " FIM " ) ;

numero = 1001

Bilhete 1000
Bilhete 1001

124

Ao executar a linha 5, a varivel numero incrementada para 1002.

www.k19.com.br

125

1
2
3
4
5
6
7

C ONTROLE DE F LUXO

int numero = 1000;


while ( numero <= 1002)
{
System . Console . WriteLine ( " Bilhete " + numero ) ;
numero ++;
}
System . Console . WriteLine ( " FIM " ) ;

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

int numero = 1000;


while ( numero <= 1002)
{
System . Console . WriteLine ( " Bilhete " + numero ) ;
numero ++;
}
System . Console . WriteLine ( " FIM " ) ;

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

int numero = 1000;


while ( numero <= 1002)
{
System . Console . WriteLine ( " Bilhete " + numero ) ;
numero ++;
}
System . Console . WriteLine ( " FIM " ) ;

numero = 1002

Bilhete 1000
Bilhete 1001
Bilhete 1002

10

1
2
3
4
5
6
7

Ao executar a linha 5, a varivel numero incrementada para 1003.


int numero = 1000;
while ( numero <= 1002)
{
System . Console . WriteLine ( " Bilhete " + numero ) ;
numero ++;
}
System . Console . WriteLine ( " FIM " ) ;

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

int numero = 1000;


while ( numero <= 1002)
{
System . Console . WriteLine ( " Bilhete " + numero ) ;
numero ++;
}
System . Console . WriteLine ( " FIM " ) ;

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

int numero = 1000;


while ( numero <= 1002)
{
System . Console . WriteLine ( " Bilhete " + numero ) ;
numero ++;
}
System . Console . WriteLine ( " FIM " ) ;

numero = 1003

Bilhete 1000
Bilhete 1001
Bilhete 1002
FIM

4.8 Instruo for


A instruo for outra instruo de repetio e tem a mesma finalidade da instruo while. Podemos resolver problemas que envolvem repeties com a instruo while ou for. Veja a sintaxe da
instruo for:
1 for ( inicializao ; condio ; atualizao )
2 {
3
bloco de comandos
4 }

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

Figura 4.4: Fluxograma da instruo for

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 ++;
}

Podemos reescrever esse cdigo com a instruo de repetio for.


1
2
3
4
5
6

// inicializao ; condio ; atualizao


for ( int i = 1; i <= 100; i ++)
{
// comandos
System . Console . WriteLine ( " Mensagem nmero " + 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 }

O segundo argumento do for, a condio, possui o valor padro true.

Pare para pensar...


Sabendo que o segundo argumento do for, a condio, possui o valor padro true, como
podemos interromper a execuo do lao do exemplo a seguir?
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

Na linha 1, a varivel numero declarada e inicializada com o valor 1000.

www.k19.com.br

129

1
2
3
4
5

C ONTROLE DE F LUXO

for ( int numero = 1000; numero <= 1002; numero ++)


{
System . Console . WriteLine ( " Bilhete " + numero ) ;
}
System . Console . WriteLine ( " FIM " ) ;

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

for ( int numero = 1000; numero <= 1002; numero ++)


{
System . Console . WriteLine ( " Bilhete " + numero ) ;
}
System . Console . WriteLine ( " FIM " ) ;

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

for ( int numero = 1000; numero <= 1002; numero ++)


{
System . Console . WriteLine ( " Bilhete " + numero ) ;
}
System . Console . WriteLine ( " FIM " ) ;

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

for ( int numero = 1000; numero <= 1002; numero ++)


{
System . Console . WriteLine ( " Bilhete " + numero ) ;
}
System . Console . WriteLine ( " FIM " ) ;

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

for ( int numero = 1000; numero <= 1002; numero ++)


{
System . Console . WriteLine ( " Bilhete " + numero ) ;
}
System . Console . WriteLine ( " FIM " ) ;

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

for ( int numero = 1000; numero <= 1002; numero ++)


{
System . Console . WriteLine ( " Bilhete " + numero ) ;
}
System . Console . WriteLine ( " FIM " ) ;

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

for ( int numero = 1000; numero <= 1002; numero ++)


{
System . Console . WriteLine ( " Bilhete " + numero ) ;
}
System . Console . WriteLine ( " FIM " ) ;

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

for ( int numero = 1000; numero <= 1002; numero ++)


{
System . Console . WriteLine ( " Bilhete " + numero ) ;
}
System . Console . WriteLine ( " FIM " ) ;

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

for ( int numero = 1000; numero <= 1002; numero ++)


{
System . Console . WriteLine ( " Bilhete " + numero ) ;
}
System . Console . WriteLine ( " FIM " ) ;

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

for ( int numero = 1000; numero <= 1002; numero ++)


{
System . Console . WriteLine ( " Bilhete " + numero ) ;
}
System . Console . WriteLine ( " FIM " ) ;

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

for ( int numero = 1000; numero <= 1002; numero ++)


{
System . Console . WriteLine ( " Bilhete " + numero ) ;
}
System . Console . WriteLine ( " FIM " ) ;

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

for ( int numero = 1000; numero <= 1002; numero ++)


{
System . Console . WriteLine ( " Bilhete " + numero ) ;
}
System . Console . WriteLine ( " FIM " ) ;

numero = 1003

Bilhete 1000
Bilhete 1001
Bilhete 1002
FIM

4.9 Instrues de Repetio Encadeadas


Considere o programa de computador que gera os ingressos das apresentaes de um determinado teatro. Esse teatro foi dividido em 4 setores com 200 cadeiras cada. Os ingressos devem conter
o nmero do setor e o nmero da cadeira. Podemos utilizar laos encadeados para implementar esse
programa.
1 for ( int i = 1; i <= 4; i ++)
2 {
3
for ( int j = 1; j <= 200; j ++)
4
{
5
System . Console . WriteLine ( " SETOR : " + i + " CADEIRA : " + j ) ;
6
}
7 }

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 ++;
}

1 for ( int i = 1; i <= 4; i ++)


2 {
3
int j = 1;
4
while ( j <= 200)
5
{
6
System . Console . WriteLine ( " SETOR : " + i + " CADEIRA : " + j ) ;
7
j ++;
8
}
9 }

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.

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=0

Em seguida, a condio do lao verificada. Como o valor armazenado na varivel i 0, a


operao i <= 2 devolve true.
2

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=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

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=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.

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=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

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=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

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=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

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 }

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.

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=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

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=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

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=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

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

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.

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

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

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

Em seguida, a condio do lao da linha 3 testada. Como o valor armazenado na varivel j 2,


o resultado da operao j <= 2 true.
14

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

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

Ao final da execuo do corpo do lao da linha 3, o valor da varivel j atualizado. Como j


armazena o valor 2, a operao j++ atribui o valor 3 varivel j.
16

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=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

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=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.

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=2

i = 0, j = 1
i = 0, j = 2
i = 1, j = 2

19

136

Aps a atualizao do valor da varivel i, a condio do lao da linha 1 verificada. Como a

www.k19.com.br

137

C ONTROLE DE F LUXO

varivel i armazena o valor 2, o resultado da operao i <= 2 true.


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=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

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=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.

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=2
j=3

i = 0, j = 1
i = 0, j = 2
i = 1, j = 2

Ao final da execuo do corpo do lao da linha 1, o valor da varivel i atualizado. Como i


armazena o valor 2, essa varivel passa a armazenar o valor 3 aps a operao i++.
22

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=3

i = 0, j = 1
i = 0, j = 2
i = 1, j = 2

www.facebook.com/k19treinamentos

137

C ONTROLE DE F LUXO

138

Em seguida, a condio do lao da linha 1 verificada. Como a varivel i armazena o valor 3, a


operao i <= 2 devolve false. Assim, a execuo do lao da linha 1 encerrada.
23

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=3

i = 0, j = 1
i = 0, j = 2
i = 1, j = 2

4.10 Instruo break


Considere um jogo de dados no qual o jogador ganha quando a soma dos nmeros obtidos em
lanamentos consecutivos de um dado ultrapassar um determinado valor. Antes de comear o jogo,
necessrio definir a quantidade mxima de lanamentos e o valor que deve ser ultrapassado para
obter a vitria. Eventualmente, se o valor desejado for ultrapassado antes do ltimo lanamento,
no necessrio continuar jogando o dado pois a vitria j est garantida. Podemos implementar
um programa de computador para simular a execuo desse jogo. Nesse programa, podemos utilizar
a instruo break para interromper os lanamentos se o valor desejado for ultrapassado.
A instruo break no uma instruo de repetio, mas est fortemente relacionada s instrues while e for. Ela pode ser utilizada para forar a parada de um lao.
No exemplo abaixo, a lgica para simular o jogo descrito anteriormente considera que a quantidade mxima de lanamentos 100 e o valor desejado 360.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

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 " ) ;

O trecho (int)(gerador.NextDouble() * 6 + 1) gera um nmero inteiro entre 1 e 6. Esse trecho


simula o lanamento de um dado. A varivel soma acumula os nmeros gerados. A instruo if
utilizada para verificar se a soma ultrapassou o valor desejado. Dentro do corpo do if, utilizamos
o comando break para interromper as iteraes do lao for pois, quando a soma ultrapassa 360, a
138

www.k19.com.br

139

C ONTROLE DE F LUXO

vitria j est garantida.

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

System . Random gerador = new System . Random () ;


int soma = 0;
for ( int i = 1; i <= 2; 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 > 7)
{
System . Console . WriteLine ( " Voc ganhou com " + i + " lanamentos ");
break ;
}

15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;

140

Na linha 2, a varivel soma declarada e inicializada com o valor 0.

www.k19.com.br

141

1
2
3
4
5
6
7
8
9
10
11
12
13
14

C ONTROLE DE F LUXO

System . Random gerador = new System . Random () ;


int soma = 0;
for ( int i = 1; i <= 2; i ++)
{
System . Console . WriteLine ( " Lanamento : " + i ) ;
int numero = ( int ) ( gerador . NextDouble () * 6 + 1) ;

soma = 0

System . Console . WriteLine ( " Nmero : " + numero ) ;


soma += numero ;
System . Console . WriteLine ( " Soma : " + soma ) ;
if ( soma > 7)
{
System . Console . WriteLine ( " Voc ganhou com " + i + " lanamentos ");
break ;
}

15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;

1
2
3
4
5
6
7
8
9
10
11
12
13
14

Na linha 3, a inicializao do for executada. A varivel i criada e inicializada com o valor 1.


System . Random gerador = new System . Random () ;
int soma = 0;
for ( int i = 1; i <= 2; i ++)
{
System . Console . WriteLine ( " Lanamento : " + i ) ;
int numero = ( int ) ( gerador . NextDouble () * 6 + 1) ;

soma = 0
i=1

System . Console . WriteLine ( " Nmero : " + numero ) ;


soma += numero ;
System . Console . WriteLine ( " Soma : " + soma ) ;
if ( soma > 7)
{
System . Console . WriteLine ( " Voc ganhou com " + i + " lanamentos ");
break ;
}

15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;

Na linha 3, a condio do for testada. Como o valor da varivel i menor ou igual a 2, a


condio devolve true.
4

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

System . Random gerador = new System . Random () ;


int soma = 0;
for ( int i = 1; i <= 2; i ++)
{
System . Console . WriteLine ( " Lanamento : " + i ) ;
int numero = ( int ) ( gerador . NextDouble () * 6 + 1) ;

soma = 0
i=1

System . Console . WriteLine ( " Nmero : " + numero ) ;


soma += numero ;
System . Console . WriteLine ( " Soma : " + soma ) ;
if ( soma > 7)
{
System . Console . WriteLine ( " Voc ganhou com " + i + " lanamentos ");
break ;
}

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

System . Random gerador = new System . Random () ;


int soma = 0;
for ( int i = 1; i <= 2; i ++)
{
System . Console . WriteLine ( " Lanamento : " + i ) ;
int numero = ( int ) ( gerador . NextDouble () * 6 + 1) ;

soma = 0
i=1

System . Console . WriteLine ( " Nmero : " + numero ) ;


soma += numero ;
System . Console . WriteLine ( " Soma : " + soma ) ;
if ( soma > 7)
{
System . Console . WriteLine ( " Voc ganhou com " + i + " lanamentos ");
break ;
}

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

System . Random gerador = new System . Random () ;


int soma = 0;
for ( int i = 1; i <= 2; i ++)
{
System . Console . WriteLine ( " Lanamento : " + i ) ;
int numero = ( int ) ( gerador . NextDouble () * 6 + 1) ;

soma = 0
i=1
numero = 5

System . Console . WriteLine ( " Nmero : " + numero ) ;


soma += numero ;
System . Console . WriteLine ( " Soma : " + soma ) ;
if ( soma > 7)
{
System . Console . WriteLine ( " Voc ganhou com " + i + " lanamentos ");
break ;
}

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

Prosseguindo, a linha 8 executada e a mensagem Nmero: 5 exibida no terminal.


System . Random gerador = new System . Random () ;
int soma = 0;
for ( int i = 1; i <= 2; i ++)
{
System . Console . WriteLine ( " Lanamento : " + i ) ;
int numero = ( int ) ( gerador . NextDouble () * 6 + 1) ;

soma = 0
i=1
numero = 5

System . Console . WriteLine ( " Nmero : " + numero ) ;


soma += numero ;
System . Console . WriteLine ( " Soma : " + soma ) ;
if ( soma > 7)
{
System . Console . WriteLine ( " Voc ganhou com " + i + " lanamentos ");
break ;
}

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

System . Random gerador = new System . Random () ;


int soma = 0;
for ( int i = 1; i <= 2; i ++)
{
System . Console . WriteLine ( " Lanamento : " + i ) ;
int numero = ( int ) ( gerador . NextDouble () * 6 + 1) ;

soma = 5
i=1
numero = 5

System . Console . WriteLine ( " Nmero : " + numero ) ;


soma += numero ;
System . Console . WriteLine ( " Soma : " + soma ) ;
if ( soma > 7)
{
System . Console . WriteLine ( " Voc ganhou com " + i + " lanamentos ");
break ;
}

15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
Lanamento : 1
Nmero : 5

Na sequncia, a linha 11 executada e a mensagem Soma: 5 exibida no terminal.

1
2
3
4
5
6
7
8
9
10
11
12
13
14

System . Random gerador = new System . Random () ;


int soma = 0;
for ( int i = 1; i <= 2; i ++)
{
System . Console . WriteLine ( " Lanamento : " + i ) ;
int numero = ( int ) ( gerador . NextDouble () * 6 + 1) ;

soma = 5
i=1
numero = 5

System . Console . WriteLine ( " Nmero : " + numero ) ;


soma += numero ;
System . Console . WriteLine ( " Soma : " + soma ) ;
if ( soma > 7)
{
System . Console . WriteLine ( " Voc ganhou com " + i + " lanamentos ");
break ;
}

15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
Lanamento : 1
Nmero : 5
Soma : 5

Prosseguindo, a linha 12 executada e a condio do if testada. Como o valor da varivel soma


no maior do que 7, a condio devolve false.
10

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

System . Random gerador = new System . Random () ;


int soma = 0;
for ( int i = 1; i <= 2; i ++)
{
System . Console . WriteLine ( " Lanamento : " + i ) ;
int numero = ( int ) ( gerador . NextDouble () * 6 + 1) ;

soma = 5
i=1
numero = 5

System . Console . WriteLine ( " Nmero : " + numero ) ;


soma += numero ;
System . Console . WriteLine ( " Soma : " + soma ) ;
if ( soma > 7)
{
System . Console . WriteLine ( " Voc ganhou com " + i + " lanamentos ");
break ;
}

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

System . Random gerador = new System . Random () ;


int soma = 0;
for ( int i = 1; i <= 2; i ++)
{
System . Console . WriteLine ( " Lanamento : " + i ) ;
int numero = ( int ) ( gerador . NextDouble () * 6 + 1) ;

soma = 5
i=2

System . Console . WriteLine ( " Nmero : " + numero ) ;


soma += numero ;
System . Console . WriteLine ( " Soma : " + soma ) ;
if ( soma > 7)
{
System . Console . WriteLine ( " Voc ganhou com " + i + " lanamentos ");
break ;
}

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

System . Random gerador = new System . Random () ;


int soma = 0;
for ( int i = 1; i <= 2; i ++)
{
System . Console . WriteLine ( " Lanamento : " + i ) ;
int numero = ( int ) ( gerador . NextDouble () * 6 + 1) ;

soma = 5
i=2

System . Console . WriteLine ( " Nmero : " + numero ) ;


soma += numero ;
System . Console . WriteLine ( " Soma : " + soma ) ;
if ( soma > 7)
{
System . Console . WriteLine ( " Voc ganhou com " + i + " lanamentos ");
break ;
}

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

System . Random gerador = new System . Random () ;


int soma = 0;
for ( int i = 1; i <= 2; i ++)
{
System . Console . WriteLine ( " Lanamento : " + i ) ;
int numero = ( int ) ( gerador . NextDouble () * 6 + 1) ;

soma = 5
i=2

System . Console . WriteLine ( " Nmero : " + numero ) ;


soma += numero ;
System . Console . WriteLine ( " Soma : " + soma ) ;
if ( soma > 7)
{
System . Console . WriteLine ( " Voc ganhou com " + i + " lanamentos ");
break ;
}

15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
Lanamento : 1
Nmero : 5
Soma : 5
Lanamento : 2

14 Na sequncia, a linha 6 executada. Um nmero aleatrio entre 1 e 6 gerado e armazenado na


varivel numero. Suponha que o nmero gerado tenha sido o 3.

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

System . Random gerador = new System . Random () ;


int soma = 0;
for ( int i = 1; i <= 2; i ++)
{
System . Console . WriteLine ( " Lanamento : " + i ) ;
int numero = ( int ) ( gerador . NextDouble () * 6 + 1) ;

soma = 5
i=2
numero = 3

System . Console . WriteLine ( " Nmero : " + numero ) ;


soma += numero ;
System . Console . WriteLine ( " Soma : " + soma ) ;
if ( soma > 7)
{
System . Console . WriteLine ( " Voc ganhou com " + i + " lanamentos ");
break ;
}

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

Prosseguindo, a linha 8 executada e a mensagem Nmero: 3 exibida no terminal.


System . Random gerador = new System . Random () ;
int soma = 0;
for ( int i = 1; i <= 2; i ++)
{
System . Console . WriteLine ( " Lanamento : " + i ) ;
int numero = ( int ) ( gerador . NextDouble () * 6 + 1) ;

soma = 5
i=2
numero = 3

System . Console . WriteLine ( " Nmero : " + numero ) ;


soma += numero ;
System . Console . WriteLine ( " Soma : " + soma ) ;
if ( soma > 7)
{
System . Console . WriteLine ( " Voc ganhou com " + i + " lanamentos ");
break ;
}

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

System . Random gerador = new System . Random () ;


int soma = 0;
for ( int i = 1; i <= 2; i ++)
{
System . Console . WriteLine ( " Lanamento : " + i ) ;
int numero = ( int ) ( gerador . NextDouble () * 6 + 1) ;

soma = 8
i=2
numero = 3

System . Console . WriteLine ( " Nmero : " + numero ) ;


soma += numero ;
System . Console . WriteLine ( " Soma : " + soma ) ;
if ( soma > 7)
{
System . Console . WriteLine ( " Voc ganhou com " + i + " lanamentos ");
break ;
}

15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
Lanamento : 1
Nmero : 5
Soma : 5
Lanamento : 2
Nmero : 3

Na sequncia, a linha 11 executada e a mensagem Soma: 8 exibida no terminal.

17

1
2
3
4
5
6
7
8
9
10
11
12
13
14

System . Random gerador = new System . Random () ;


int soma = 0;
for ( int i = 1; i <= 2; i ++)
{
System . Console . WriteLine ( " Lanamento : " + i ) ;
int numero = ( int ) ( gerador . NextDouble () * 6 + 1) ;

soma = 8
i=2
numero = 3

System . Console . WriteLine ( " Nmero : " + numero ) ;


soma += numero ;
System . Console . WriteLine ( " Soma : " + soma ) ;
if ( soma > 7)
{
System . Console . WriteLine ( " Voc ganhou com " + i + " lanamentos ");
break ;
}

15
16
17 }
18 System . Console . WriteLine ( " Jogue Novamente " ) ;
Lanamento : 1
Nmero : 5
Soma : 5
Lanamento : 2
Nmero : 3
Soma : 8

Prosseguindo, a linha 12 executada e a condio do if testada. Como o valor da varivel soma


maior do que 7, a condio devolve true.
18

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

System . Random gerador = new System . Random () ;


int soma = 0;
for ( int i = 1; i <= 2; i ++)
{
System . Console . WriteLine ( " Lanamento : " + i ) ;
int numero = ( int ) ( gerador . NextDouble () * 6 + 1) ;

soma = 8
i=2
numero = 3

System . Console . WriteLine ( " Nmero : " + numero ) ;


soma += numero ;
System . Console . WriteLine ( " Soma : " + soma ) ;
if ( soma > 7)
{
System . Console . WriteLine ( " Voc ganhou com " + i + " lanamentos ");
break ;
}

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

System . Random gerador = new System . Random () ;


int soma = 0;
for ( int i = 1; i <= 2; i ++)
{
System . Console . WriteLine ( " Lanamento : " + i ) ;
int numero = ( int ) ( gerador . NextDouble () * 6 + 1) ;

soma = 8
i=2
numero = 3

System . Console . WriteLine ( " Nmero : " + numero ) ;


soma += numero ;
System . Console . WriteLine ( " Soma : " + soma ) ;
if ( soma > 7)
{
System . Console . WriteLine ( " Voc ganhou com " + i + " lanamentos ");
break ;
}

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

Agora, a linha 15 executada. Dessa forma, a instruo break interrompe o lao.

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

System . Random gerador = new System . Random () ;


int soma = 0;
for ( int i = 1; i <= 2; i ++)
{
System . Console . WriteLine ( " Lanamento : " + i ) ;
int numero = ( int ) ( gerador . NextDouble () * 6 + 1) ;

soma = 8
i=2
numero = 3

System . Console . WriteLine ( " Nmero : " + numero ) ;


soma += numero ;
System . Console . WriteLine ( " Soma : " + soma ) ;
if ( soma > 7)
{
System . Console . WriteLine ( " Voc ganhou com " + i + " lanamentos ");
break ;
}

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

Por fim, a linha 18 executada e a mensagem Jogue Novamente exibida no terminal.

21

1
2
3
4
5
6
7
8
9
10
11
12
13
14

System . Random gerador = new System . Random () ;


int soma = 0;
for ( int i = 1; i <= 2; i ++)
{
System . Console . WriteLine ( " Lanamento : " + i ) ;
int numero = ( int ) ( gerador . NextDouble () * 6 + 1) ;

soma = 8

System . Console . WriteLine ( " Nmero : " + numero ) ;


soma += numero ;
System . Console . WriteLine ( " Soma : " + soma ) ;
if ( soma > 7)
{
System . Console . WriteLine ( " Voc ganhou com " + i + " lanamentos ");
break ;
}

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

4.11 Instruo continue


Considere uma variao do jogo de dados proposto anteriormente. Nessa nova verso, somente
valores pares devem ser somados. Em outras palavras, os valores mpares devem ser descartados.
Nesse caso, podemos utilizar a instruo continue. Essa instruo permite que, durante a execuo
150

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 ++)

afeta o terceiro lao

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 }

0; i < 10; i ++)

// afeta o lao mais externo


= 0; j < 10; j ++)
k = 0; k < 10; k ++)

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

System . Random gerador = new System . Random () ;


for ( int i = 1; i <= 2; i ++)
{
int numero = ( int ) ( gerador . NextDouble () * 100 + 1) ;
if ( numero % 2 == 0)
{
continue ;
}
System . Console . WriteLine ( i ) ;
}

Em seguida, na linha 2, a varivel i declarada e inicializada com o valor 1.


System . Random gerador = new System . Random () ;
for ( int i = 1; i <= 2; i ++)
{
int numero = ( int ) ( gerador . NextDouble () * 100 + 1) ;
if ( numero % 2 == 0)
{
continue ;
}
System . Console . WriteLine ( i ) ;
}

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

System . Random gerador = new System . Random () ;


for ( int i = 1; i <= 2; i ++)
{
int numero = ( int ) ( gerador . NextDouble () * 100 + 1) ;
if ( numero % 2 == 0)
{
continue ;
}
System . Console . WriteLine ( i ) ;
}

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

System . Random gerador = new System . Random () ;


for ( int i = 1; i <= 2; i ++)
{
int numero = ( int ) ( gerador . NextDouble () * 100 + 1) ;
if ( numero % 2 == 0)
{
continue ;
}
System . Console . WriteLine ( i ) ;
}

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

System . Random gerador = new System . Random () ;


for ( int i = 1; i <= 2; i ++)
{
int numero = ( int ) ( gerador . NextDouble () * 100 + 1) ;
if ( numero % 2 == 0)
{
continue ;
}
System . Console . WriteLine ( i ) ;
}

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

System . Random gerador = new System . Random () ;


for ( int i = 1; i <= 2; i ++)
{
int numero = ( int ) ( gerador . NextDouble () * 100 + 1) ;
if ( numero % 2 == 0)
{
continue ;
}
System . Console . WriteLine ( i ) ;
}

i=1
numero = 38

Devido ao desvio causado pela instruo continue, o fluxo de execuo vai para a atualizao do

for na linha 2. Dessa forma, a varivel i incrementada para 2.


1
2
3
4
5
6
7
8
9
10

System . Random gerador = new System . Random () ;


for ( int i = 1; i <= 2; i ++)
{
int numero = ( int ) ( gerador . NextDouble () * 100 + 1) ;
if ( numero % 2 == 0)
{
continue ;
}
System . Console . WriteLine ( i ) ;
}

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

System . Random gerador = new System . Random () ;


for ( int i = 1; i <= 2; i ++)
{
int numero = ( int ) ( gerador . NextDouble () * 100 + 1) ;
if ( numero % 2 == 0)
{
continue ;
}
System . Console . WriteLine ( i ) ;
}

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

System . Random gerador = new System . Random () ;


for ( int i = 1; i <= 2; i ++)
{
int numero = ( int ) ( gerador . NextDouble () * 100 + 1) ;
if ( numero % 2 == 0)
{
continue ;
}
System . Console . WriteLine ( i ) ;
}

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

System . Random gerador = new System . Random () ;


for ( int i = 1; i <= 2; i ++)
{
int numero = ( int ) ( gerador . NextDouble () * 100 + 1) ;
if ( numero % 2 == 0)
{
continue ;
}
System . Console . WriteLine ( i ) ;
}

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

System . Random gerador = new System . Random () ;


for ( int i = 1; i <= 2; i ++)
{
int numero = ( int ) ( gerador . NextDouble () * 100 + 1) ;
if ( numero % 2 == 0)
{
continue ;
}
System . Console . WriteLine ( i ) ;
}

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

System . Random gerador = new System . Random () ;


for ( int i = 1; i <= 2; i ++)
{
int numero = ( int ) ( gerador . NextDouble () * 100 + 1) ;
if ( numero % 2 == 0)
{
continue ;
}
System . Console . WriteLine ( i ) ;
}

156

i=3

97

13 Na sequncia, a condio do for testada. Como valor da varivel i no menor ou igual a 2,


essa condio devolve false. Dessa forma, o lao finalizado.

1
2
3
4
5
6
7
8
9
10

System . Random gerador = new System . Random () ;


for ( int i = 1; i <= 2; i ++)
{
int numero = ( int ) ( gerador . NextDouble () * 100 + 1) ;
if ( numero % 2 == 0)
{
continue ;
}
System . Console . WriteLine ( i ) ;
}

i=3

97

156

www.k19.com.br

157

C ONTROLE DE F LUXO

4.12 Blocos Sem Chaves


Normalmente, os blocos de cdigo associados s instrues de deciso if e else ou s instrues
de repetio while e for so delimitados com chaves { }. Contudo, as chaves podem ser omitidas
nos blocos que possuem apenas um comando. Veja alguns exemplos.
1 if ( a < 10)
2
a = a * 2 + 1;
3 else
4
a = a / 2 + 1;

1 while ( a < 10)


2
a = a * 2 + 1;

1 for ( int i = 1; i < 10; i ++)


2
a = a * 2 + 1;

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;
}

O trecho em destaque, apesar de conter diversas linhas de cdigo, considerado um comando


nico. Dessa forma, podemos omitir as chaves que envolvem esse trecho. Reescrevendo o cdigo,
teramos o seguinte resultado:
1 if ( a < 10)
2
a = a * 2
3 else if ( a <
4
a = a * 3
5 else
6
a = a * 4

+ 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

4.13 Laos Infinitos


Um lao interrompido quando a condio de um lao for falsa ou quando utilizamos a instruo
break. Dessa forma, considere os seguintes laos.
1
2
3
4
5

int i = 1;
while ( i < 10)
{
System . Console . WriteLine ( " K19 " ) ;
}

1 for ( int i = 1; i < 10;)


2 {
3
System . Console . WriteLine ( " K19 " ) ;
4 }

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.

4.14 Instruo switch


A instruo switch uma instruo de deciso. Ela permite definir o que deve ser executado
quando o valor de uma determinada chave for igual a certos valores. Veja a seguir a sintaxe dessa
instruo.
1 switch ( chave )
2 {
3
case expressao1 : bloco1
4
case expressao2 : bloco2
5
case expressao3 : bloco3
6
default : bloco4
7 }
Cdigo C# 4.144: Sintaxe da instruo switch

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

System . Random gerador = new System . Random () ;


int chave = ( int ) ( gerador . NextDouble () * 10) ;
switch ( chave )
{
case 0:
System . Console . WriteLine (0) ;
goto case 2;
case 1:
System . Console . WriteLine (1) ;
break ;
case 2:
System . Console . WriteLine (2) ;
goto default ;
default :
System . Console . WriteLine ( " default " ) ;
}

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

Em seguida, a linha 2 executada. A instruo switch verifica o valor armazenado na varivel

tipoDeSeguro para decidir qual case deve ser selecionado.


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

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

4.15 Instruo do-while


A instruo de repetio do-while anloga instruo while. A sintaxe do do-while :
1 do
2 {
3
bloco de comandos
4 } while ( condio ) ;
Cdigo C# 4.154: Sintaxe da instruo do-while

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

Figura 4.5: Fluxograma da instruo do-while

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 " ) ;

Em seguida, a linha 4 executada e o valor armazenado na varivel a exibido na sada padro.

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

Agora, a linha 5 executada e o valor armazenado na varivel a atualizado com o operador ++


e essa varivel passa a armazenar o valor 2.
3

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

false. Sendo assim, o lao terminar.


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

164

Por fim, a linha 7 executada e a mensagem FIM exibida na sada padro.

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

4.16 Unreachable Code


O compilador tenta identificar instrues que nunca seriam executadas. Algumas dessas instrues geram o aviso unreachable code. No exemplo abaixo, a instruo contador++ nunca seria
executada, pois ela precedida pela instruo break. Nesse caso, ocorreria um unreachable code.
1
2
3
4
5
6

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

const int contador = 10;


while ( contador < 10)
{
System . Console . WriteLine ( contador ) ; // aviso - unreachable code
}

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

const int contador = 0;


while ( contador < 10)
{
System . Console . WriteLine ( contador ) ;
}
System . Console . WriteLine ( " FIM " ) ; // aviso - unreachable code

4.17 Erro: No utilizar condies booleanas


Um erro de compilao comum em C# ocorre quando no utilizamos condies booleanas nas
instrues if, while ou for.

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

A mensagem de erro de compilao seria semelhante apresentada abaixo.


Programa . cs (10 ,7): error CS0029 : Cannot implicitly convert type double to
bool

Terminal 4.90: Erro de compilao

4.18 Erro: Else sem if


Um erro de compilao comum em C# ocorre quando o comando else no est associado ao
comando if.
1 class Programa
2 {
3
static void Main ()
4
{
5
int a = 1;
6
if ( a < 10)
7
System . Console . WriteLine ( a ) ;
8
System . Console . WriteLine ( " Menor " ) ;
9
else
10
System . Console . WriteLine ( a ) ;
11
System . Console . WriteLine ( " Maior " ) ;
12
}
13 }
Cdigo C# 4.169: 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

Terminal 4.91: Erro de compilao

4.19 Erro: Else com condio


166

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

Terminal 4.92: Erro de compilao

4.20 Erro: Ponto e vrgula excedente


Um erro de lgica comum em C# pode ocorrer quando o caractere ; adicionado em excesso.
1 class Programa
2 {
3
static void Main ()
4
{
5
for ( int i = 0; i < 10; i ++) ;
6
{
7
System . Console . WriteLine ( " ************** " ) ;
8
}
9
}
10 }
Cdigo C# 4.171: Programa.cs

Observe o caractere ; depois dos argumentos do for. Na verdade, no h erros de compilao


nesse cdigo. Contudo, podemos considerar que h um erro de lgica, pois o lao no tem corpo. O
bloco depois do for executar apenas uma vez pois no est associado ao lao.
Veja o resultado da execuo desse programa.
**************

Terminal 4.93: Erro de lgica

4.21 Erro: Lao infinito


Um erro de lgica comum em C# pode ocorrer quando a condio de um lao sempre verdadeira.

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.

4.22 Erro: Chave do switch com tipos incompatveis


Um erro de compilao comum em C# ocorre quando a chave da instruo switch uma expresso de um tipo incompatvel.
1 class Programa
2 {
3
static void Main ()
4
{
5
double a = 1;
6
switch ( a )
7
{
8
case 0.0: System . Console . WriteLine (0) ;
9
case 1.0: System . Console . WriteLine (1) ;
10
}
11
}
12 }
Cdigo C# 4.173: Programa.cs

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

Terminal 4.94: Erro de compilao

4.23 Erro: Casos do switch com expresses no constantes


Em C#, uma expresso constante uma expresso que deve ser avaliada em tempo de compilao. Esse tipo de expresso envolve envolve apenas valores literais, variveis do tipo const ou enum
types. Um erro de compilao comum ocorre quando um dos casos da instruo switch no uma
expresso constante.
1 class Programa
2 {
3
static void Main ()
4
{

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 ;
}

Cdigo C# 4.174: Programa.cs

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

Terminal 4.95: Erro de compilao

4.24 Erro: Break ou continue fora de um lao


Um erro de compilao ocorre quando a instruo break utilizada fora de um lao ou de um
switch ou quando a instruo continue utilizada fora de um lao. Confira o exemplo abaixo.
1 class Programa
2 {
3
static void Main ()
4
{
5
int a = 1;
6
7
if ( a == 1)
8
{
9
System . Console . WriteLine ( " Igual a 1 " ) ;
10
break ;
11
}
12
else
13
{
14
System . Console . WriteLine ( " Diferente de 1 " ) ;
15
continue ;
16
}
17
}
18 }
Cdigo C# 4.175: Programa.cs

No cdigo acima, ocorrem erros de compilao nas linhas 10 e 15.


Programa . cs (10 ,4): error CS0139 : No enclosing loop out of which to break or
continue
Programa . cs (15 ,4): error CS0139 : No enclosing loop out of which to break or
continue

Terminal 4.96: Erro de compilao

4.25 Erro: Usar vrgula ao invs de ponto e vrgula no lao for


www.facebook.com/k19treinamentos

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

No cdigo acima, ocorrem erros de compilao na linha 5.


Programa . cs (5 ,20): error CS1002 : ; expected
Programa . cs (5 ,22): error CS1002 : ; expected

Terminal 4.97: Erro de compilao

A vrgula s pode ser utilizada na separao de inicializaes de variveis no primeiro argumento


do for ou na separao de instrues vlidas no terceiro argumento do for.

4.26 Resumo
1

Os programas de computador utilizam as instrues de deciso para determinar se um bloco


de cdigo ser executado ou no de acordo com determinada condio.

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.

Os programas de computador utilizam as instrues de repetio para executar repetidas vezes


um determinado bloco de cdigo.

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

fors dentro de whiles ou fors.

A instruo break interrompe a execuo de um lao.

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

O corpo de um lao do-while sempre executado pelo menos uma vez.

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.

5.2 O que um Array?


Um array uma estrutura de dados capaz de armazenar uma coleo de variveis. Todo array
possui uma capacidade. Essa capacidade a quantidade de variveis que o array armazena. As
variveis contidas em um array no possuem nome. Para identific-las, elas so numeradas de 0 at
a c apaci d ad e 1. Dessa forma, o ndice da primeira varivel 0, o ndice da segunda varivel 1,
o ndice da terceira varivel 2 e assim sucessivamente. Como as variveis dentro de um array so
organizadas de forma sequencial, comum utilizar o termo posio para se referir a essas variveis.
Por exemplo, utilizaremos posio 10 ou invs de varivel 10.
Basicamente, um array como um armrio com gavetas numeradas a partir do nmero 0.

www.facebook.com/k19treinamentos

173

A RRAY

174

Figura 5.1: Um armrio com gavetas numeradas

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

Figura 5.2: Um armrio de livros no pode guardar revistas

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

Figura 5.3: Controle remoto de uma TV

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

Na declarao das variveis que armazenam referncias de arrays, no permitido informar a


capacidade dos arrays.
1 int [10] numeros ; // erro de compilao
Cdigo C# 5.4: Informando a capacidade na declarao

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

1 int [] numeros ; // declarao


2
3 numeros = new int [10]; // inicializao
Cdigo C# 5.5: Inicializao

A declarao e a inicializao podem ser realizadas na mesma linha.


1 int [] numeros = new int [10]; // declarao e inicializao
Cdigo C# 5.6: Declarao e inicializao na mesma linha

TIPO DE DADO QUE SER


ARMAZENADO PELO ARRAY

int[]

INFORMA O TIPO DO
NOVO OBJETO

IDENTIFICADOR DA VARIVEL

nomeDoArray

INFORMA QUE A VARIVEL


SER UM ARRAY

new
INSTANCIA UM
NOVO OBJETO

int[10];
INFORMA A QUANTIDADE
DE POSIES DO ARRAY

Figura 5.4: Declarao e inicializao de um 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

5.6 Acessando o Contedo de um Array


Para acessar as posies de um array, necessrio indicar o ndice da posio desejada dentro
de colchetes. No exemplo abaixo, a varivel numeros guarda a referncia de um array com 10 posies
para armazenar valores do tipo int. Essa varivel foi utilizada para acessar a posio 5 (sexta posio)
do array.
1 int [] numeros = new int [10];
2
3 System . Console . WriteLine ( numeros [5]) : // acessando a posio 5
Cdigo C# 5.8: Acessando o contedo de um array

176

www.k19.com.br

177

A RRAY

5.7 Alterando o Contedo de um Array


Para alterar o contedo das posies de um array, necessrio indicar o ndice da posio desejada dentro de colchetes. No exemplo abaixo, a varivel numeros guarda a referncia de um array com
10 posies para armazenar valores do tipo int. Essa varivel foi utilizada para alterar o contedo da
posio 5 (sexta posio) do array.
1 int [] numeros = new int [10];
2
3 numeros [5] = 10;
Cdigo C# 5.9: Alterando o contedo de um array

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

double [] precos = new double [3];


precos [0] = 17.54;
precos [1] = 23.81;
System . Console . WriteLine ( precos [0]) ;
System . Console . WriteLine ( precos [1]) ;
System . Console . WriteLine ( precos [2]) ;

precos[0] = 0.0
precos[1] = 0.0
precos[2] = 0.0

Em seguida, a linha 2 executada e o valor real 17.54 armazenado na varivel de ndice 0 do


array criado na linha 1.
2

1
2
3
4
5
6

double [] precos = new double [3];


precos [0] = 17.54;
precos [1] = 23.81;
System . Console . WriteLine ( precos [0]) ;
System . Console . WriteLine ( precos [1]) ;
System . Console . WriteLine ( precos [2]) ;

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

double [] precos = new double [3];


precos [0] = 17.54;
precos [1] = 23.81;
System . Console . WriteLine ( precos [0]) ;
System . Console . WriteLine ( precos [1]) ;
System . Console . WriteLine ( precos [2]) ;

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

double [] precos = new double [3];


precos [0] = 17.54;
precos [1] = 23.81;
System . Console . WriteLine ( precos [0]) ;
System . Console . WriteLine ( precos [1]) ;
System . Console . WriteLine ( precos [2]) ;

precos[0] = 17.54
precos[1] = 23.81
precos[2] = 0.0

17.54

Continuando, a linha 5 ser executada e o valor armazenado na varivel de ndice 1 do array


criado na linha 1 exibido na sada padro.
5

1
2
3
4
5
6

double [] precos = new double [3];


precos [0] = 17.54;
precos [1] = 23.81;
System . Console . WriteLine ( precos [0]) ;
System . Console . WriteLine ( precos [1]) ;
System . Console . WriteLine ( precos [2]) ;

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

double [] precos = new double [3];


precos [0] = 17.54;
precos [1] = 23.81;
System . Console . WriteLine ( precos [0]) ;
System . Console . WriteLine ( precos [1]) ;
System . Console . WriteLine ( precos [2]) ;

precos[0] = 17.54
precos[1] = 23.81
precos[2] = 0.0

17.54
23.81
0

5.8 Outras Formas de Inicializao


Na criao de um determinado array, possvel definir o seu contedo inicial. No exemplo
abaixo, 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, com o valor 3. A capacidade do array a quantidade de elementos dentro das chaves. Nessa abordagem, a
capacidade pode ou no ser informada dentro dos colchetes.
1 int [] numeros = new int []{1 , 2 , 3};

1 int [] numeros = new int [3]{1 , 2 , 3};

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

1 int [] numeros = {1 , 2 , 3};

5.9 Percorrendo um Array


Ao utilizar um array, uma das tarefas mais comuns acessar todas ou algumas posies desse
array de forma sistemtica para realizar algum processamento sobre o contedo dessas posies.
Para percorrer um array, podemos utilizar qualquer instruo de repetio. Contudo, normalmente, a instruo de repetio for a mais utilizada para essa tarefa. No exemplo abaixo, um array
com 100 posies para armazenar valores do tipo int foi criado. Todas as posies foram inicializadas com o valor padro 0. A referncia desse array foi armazenada na varivel numeros. Em seguida,
no primeiro lao, os mltiplos de 2 a partir do 0 foram armazenados nesse array. No segundo lao,
os valores armazenados no array foram exibidos na sada padro.
1
2
3
4
5
6
7
8
9
10
11

int [] numeros = new int [100];


for ( int i = 0; i < 100; i ++)
{
numeros [ i ] = i * 2;
}
for ( int i = 0; i < 100; i ++)
{
System . Console . WriteLine ( numeros [ i ]) ;
}
Cdigo C# 5.19: Percorrendo um array para inserir e acessar valores

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

int [] numeros = new int [ 100];


for ( int i = 0; i < 100; i ++)
{
numeros [ i ] = i * 2;
}
for ( int i = 0; i < 100; i ++)
{
System . Console . WriteLine ( numeros [ i ]) ;
}
Cdigo C# 5.20: Capacidade hard-coded

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

int [] numeros = new int [100];


for ( int i = 0; i < numeros . Length ; i ++)
{
numeros [ i ] = i * 2;
}
for ( int i = 0; i < numeros . Length ; i ++)
{
System . Console . WriteLine ( numeros [ i ]) ;
}
Cdigo C# 5.21: Utilizando a propriedade Length

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.

5.10 Array Multidimensional


At agora, utilizamos apenas arrays unidimensionais. Contudo, os arrays podem ser multidimensionais, ou seja, podemos criar arrays com duas ou mais dimenses. Por exemplo, um array
bidimensional pode ser utilizado para representar uma tabela, uma matriz ou at um tabuleiro de
batalha naval.

180

www.k19.com.br

181

A RRAY

Utilizando a analogia anterior, um array bidimensional como um armrio no qual possvel


armazenar em cada gaveta outro armrio. Essa analogia pode ser expandida para arrays tridimensionais, quadridimensionais e etc.

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

Na declarao das variveis que armazenam referncias de arrays, no permitido informar a


capacidade dos arrays.
1 int [10 , 10] a ; // erro de compilao
2 int [10][10] b ; // erro de compilao
Cdigo C# 5.28: Informando a capacidade na declarao

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

int [][] numeros = new int [5][];


numeros [0]
numeros [1]
numeros [2]
numeros [3]
numeros [4]

=
=
=
=
=

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

O prximo cdigo cria 1 array bidimensional e 3 unidimensionais. O array bidimensional tem


capacidade para guardar 30 referncias de arrays unidimensionais que armazenam valores do tipo
int. O primeiro array unidimensional tem 10 posies, o segundo tem 20 posies e o terceiro tem
30 posies. As referncias do primeiro, do segundo e do terceiro arrays unidimensionais foram
armazenadas respectivamente na primeira, na segunda e na terceira posio do array bidimensional.
As demais posies do array bidimensional continuam vazias, ou seja, com o valor null. Dessa
forma, temos espao para armazenar 60 (ou seja, 10 + 20 + 30) valores do tipo int.
1
2
3
4
5

int [][] numeros = new int [30][];


numeros [0] = new int [10];
numeros [1] = new int [20];
numeros [2] = new int [30];
Cdigo C# 5.31: Inicializando um array multidimensional irregular

Outras formas de inicializao


No exemplo abaixo, foi criado um array bidimensional retangular. A capacidade da primeira
dimenso 3 e a capacidade da segunda dimenso 2.
1 int [ ,] numeros = new int [ ,]{{1 , 2} , {3 , 4} , {5 , 6}};

O mesmo array do exemplo anterior pode ser criado da seguinte forma.


1 int [ ,] numeros = {{1 , 2} , {3 , 4} , {5 , 6}};

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

Nesse outro exemplo, armazenamos o valor 1 na posio [1, 2, 3].


1 int [ , ,] numeros = . . .
2

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

O prximo exemplo armazena o valor 1 na posio [0, 1, 2, 3].


1 int [ , , ,] numeros = . . .
2
3 numeros [0 , 1 , 2 , 3] = 1;
Cdigo C# 5.37: 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

O prximo exemplo armazena o valor 1 na quarta posio (posio 3) do terceiro (posio 2)


array unidimensional do segundo (posio 1) array bidimensional do primeiro (posio 0) array tridimensional.
1 int [][][][] numeros = . . .
2
3 numeros [0][1][2][3] = 1;
Cdigo C# 5.40: Acessando as posies de um array multidimensional irregular

Percorrendo um array multidimensional


Para percorrer um array multidimensional retangular, podemos utilizar laos encadeados. A
quantidade de laos encadeados igual quantidade de dimenses desse array. No exemplo abaixo,
o primeiro for percorre a primeira dimenso e o segundo for a segunda dimenso. O mtodo GetLength
recebe o ndice de uma dimenso e devolve a capacidade dessa dimenso.
1 int [ ,] numeros = new int [10 , 20];
2
3 for ( int i = 0; i < numeros . GetLength (0) ; i ++)
4 {
5
for ( int j = 0; j < numeros . GetLength (1) ; j ++)
6
{
7
numeros [i , j ] = i * j ;

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

int [ , ,] numeros = new int [10 , 20 , 30];


for ( int i = 0; i < numeros . GetLength (0) ; i ++)
{
for ( int j = 0; j < numeros . GetLength (1) ; j ++)
{
for ( int k = 0; k < numeros . GetLength (2) ; k ++)
{
numeros [i , j , k ] = i * j * k ;
}
}
}
Cdigo C# 5.42: Percorrendo um array tridimensional retangular

Analogamente, para percorrer um array multidimensional irregular, tambm podemos utilizar


laos encadeados. No exemplo abaixo, utilizamos dois laos encadeados para percorrer um array
bidimensional irregular.
1
2
3
4
5
6
7
8
9
10
11

int [][] numeros = new int [10][];


for ( int i = 0; i < numeros . Length ; i ++)
{
numeros [ i ] = new int [ i + 1];
for ( int j = 0; j < numeros [ i ]. Length ; j ++)
{
numeros [ i ][ j ] = i * j ;
}
}
Cdigo C# 5.43: Percorrendo um array bidimensional irregular

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

int [][][] numeros = new int [10][][];


for ( int i = 0; i < numeros . Length ; i ++)
{
numeros [ i ] = new int [ i + 1][];
for ( int j = 0; j < numeros [ i ]. Length ; j ++)
{
numeros [ i ][ j ] = new int [ j + 1];
for ( int k = 0; k < numeros [ i ][ j ]. Length ; k ++)
{
numeros [ i ][ j ][ k ] = i * j * k ;
}
}
}
Cdigo C# 5.44: Percorrendo um array tridimensional irregular

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

int [ ,] x = new int [2 , 2];


x [0 , 0] = 1;
x [0 , 1] = 2;
x [1 , 0] = 3;
x [1 , 1] = 4;
System . Console . WriteLine ( x [0 ,
System . Console . WriteLine ( x [0 ,
System . Console . WriteLine ( x [1 ,
System . Console . WriteLine ( x [1 ,

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

int [ ,] x = new int [2 , 2];


x [0 , 0] = 1;
x [0 , 1] = 2;
x [1 , 0] = 3;
x [1 , 1] = 4;
System . Console . WriteLine ( x [0 ,
System . Console . WriteLine ( x [0 ,
System . Console . WriteLine ( x [1 ,
System . Console . WriteLine ( x [1 ,

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

int [ ,] x = new int [2 , 2];


x [0 , 0] = 1;
x [0 , 1] = 2;
x [1 , 0] = 3;
x [1 , 1] = 4;
System . Console . WriteLine ( x [0 ,
System . Console . WriteLine ( x [0 ,
System . Console . WriteLine ( x [1 ,
System . Console . WriteLine ( x [1 ,

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

int [ ,] x = new int [2 , 2];


x [0 , 0] = 1;
x [0 , 1] = 2;
x [1 , 0] = 3;
x [1 , 1] = 4;
System . Console . WriteLine ( x [0 ,
System . Console . WriteLine ( x [0 ,
System . Console . WriteLine ( x [1 ,
System . Console . WriteLine ( x [1 ,

x[0][0] = 1
x[0][1] = 2
0]) ;
1]) ;
0]) ;
1]) ;

x[1][0] = 3
x[1][1] = 0

Continuando, a linha 5 executada e o valor inteiro 4 armazenado na varivel de ndice [1, 1]


do array criado na linha 1.
5

1
2
3
4
5
6
7
8
9

int [ ,] x = new int [2 , 2];


x [0 , 0] = 1;
x [0 , 1] = 2;
x [1 , 0] = 3;
x [1 , 1] = 4;
System . Console . WriteLine ( x [0 ,
System . Console . WriteLine ( x [0 ,
System . Console . WriteLine ( x [1 ,
System . Console . WriteLine ( x [1 ,

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

int [ ,] x = new int [2 , 2];


x [0 , 0] = 1;
x [0 , 1] = 2;
x [1 , 0] = 3;
x [1 , 1] = 4;
System . Console . WriteLine ( x [0 ,
System . Console . WriteLine ( x [0 ,
System . Console . WriteLine ( x [1 ,
System . Console . WriteLine ( x [1 ,

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

int [ ,] x = new int [2 , 2];


x [0 , 0] = 1;
x [0 , 1] = 2;
x [1 , 0] = 3;
x [1 , 1] = 4;
System . Console . WriteLine ( x [0 ,
System . Console . WriteLine ( x [0 ,
System . Console . WriteLine ( x [1 ,
System . Console . WriteLine ( x [1 ,

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

int [ ,] x = new int [2 , 2];


x [0 , 0] = 1;
x [0 , 1] = 2;
x [1 , 0] = 3;
x [1 , 1] = 4;
System . Console . WriteLine ( x [0 ,
System . Console . WriteLine ( x [0 ,
System . Console . WriteLine ( x [1 ,
System . Console . WriteLine ( x [1 ,

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

int [ ,] x = new int [2 , 2];


x [0 , 0] = 1;
x [0 , 1] = 2;
x [1 , 0] = 3;
x [1 , 1] = 4;
System . Console . WriteLine ( x [0 ,
System . Console . WriteLine ( x [0 ,
System . Console . WriteLine ( x [1 ,
System . Console . WriteLine ( x [1 ,

x[0][0] = 1
x[0][1] = 2
0]) ;
1]) ;
0]) ;
1]) ;

x[1][0] = 3
x[1][1] = 4

1
2
3
4

5.11 Erro: Utilizar valores incompatveis como ndices de um array


Um erro de compilao ocorre quando usamos como ndice de um array um valor de tipo incompatvel com int.
1 class Programa
2 {
3
static void Main ()
4
{
5
double i = 1;
6
double [] numeros = new double [5];
7
System . Console . WriteLine ( numeros [ i ]) ;
8
}
9 }
Cdigo C# 5.54: Programa.cs

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 ?)

Terminal 5.8: Erro de compilao

188

www.k19.com.br

189

A RRAY

5.12 Erro: Definir outras dimenses ao criar arrays irregulares


Na criao de um array irregular, ocorre um erro de compilao quando definimos outras dimenses alm da primeira dimenso.
1 class Programa
2 {
3
static void Main () {
4
int [][] a = new int [3][5];
5
}
6 }
Cdigo C# 5.55: Programa.cs

No cdigo acima, declaramos um array de duas dimenses. Em sua inicializao, na linha 4,


definimos a segunda dimenso do array e isso provoca um erro de compilao.
Programa . cs (4 ,26): error CS0178 : Invalid rank specifier : expected , or ]

Terminal 5.9: Erro de compilao

5.13 Erro: Acessar uma posio invlida de um array


Ocorre um erro de execuo quando tentamos acessar uma posio invlida de um array.
1 class Programa
2 {
3
static void Main ()
4
{
5
int [] a = new int [5];
6
System . Console . WriteLine ( a [5]) ;
7
}
8 }
Cdigo C# 5.56: Programa.cs

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 ()

Terminal 5.10: Erro de execuo

5.14 Resumo
1

Os arrays so estruturas de dados simples que permitem o armazenamento sequencial de


dados.

As posies de um array so numeradas sequencialmente iniciando com 0.


www.facebook.com/k19treinamentos

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

Na tentativa de acesso uma posio inexistente de um array, um erro de execuo gerado.

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.

6.2 Estrutura Geral de um Mtodo


Ento, definiremos um mtodo para exibir o cabealho dos documentos na sada padro e reaproveit-lo sempre que for necessrio. Observe a declarao do mtodo ExibeCabecalho no exemplo
abaixo.
1 static void ExibeCabecalho ()
2 {
3
System . Console . WriteLine ( " ------------ K19 Treinamentos ------------" ) ;
4
System . Console . WriteLine ( " ----------- contato@k19 . com . br -----------" ) ;
5 }

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 }

------------ K19 Treinamentos ---------------------- contato@k19 . com . br ----------Recibo : R$ 545 ,00


------------ K19 Treinamentos ---------------------- contato@k19 . com . br ----------Atestado de Matrcula : Jonas Keizo Hirata

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 }

Observe as duas modificaes realizadas no mtodo CalculaJuroSimples. A primeira alterao a


retirada da palavra reservada void e a insero da palavra reservada double em seu lugar. A palavra
void indicava que o mtodo no devolvia nenhuma resposta ao final do seu processamento. A palavra double indica que o mtodo devolver um valor do tipo double ao final do seu processamento. A
segunda modificao a utilizao do comando return para devolver como resposta o juro calculado,
que um valor do tipo double.
Agora, a resposta pode ser recuperada no mtodo Main e armazenada em uma varivel por exemplo.
1 class Programa
2 {
3
static void Main ()
4
{
5
double resposta1 = CalculaJuroSimples (10000 , 0.015 , 12) ;
6
7
double resposta2 = CalculaJuroSimples (25400 , 0.02 , 30) ;
8
9
System . Console . WriteLine ( " Juro : " + resposta1 ) ;
10
System . Console . WriteLine ( " Juro : " + resposta2 ) ;
11
}
12
13
static double CalculaJuroSimples ( double capital , double taxa , int periodo )
14
{
15
double juro = capital * taxa * periodo ;
16
return juro ;
17
}
18 }

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 }

1 static char Metodo ()


2 {
3
// corpo de um mtodo que devolve char
4 }

1 static float Metodo ()


2 {
3
// corpo de um mtodo que devolve float
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

6.5 Passagem de Parmetros


No exemplo abaixo, duas variveis foram definidas no mtodo Main: a e b. Analogamente, duas variveis com os mesmos nomes foram definidas no mtodo ExibeSoma. Apesar de terem nomes iguais,
as variveis do mtodo Main so independentes das variveis do mtodo ExibeSoma e vice e versa.
1 class Programa
2 {
3
static void Main ()
4
{
5
double a = 5.6;
6
double b = 7.1;
7
8
ExibeSoma (a , b ) ;
9
}
10
11
static double ExibeSoma ( double a , double b )
12
{
13
System . Console . WriteLine ( a + b ) ;
14
}
15 }
Cdigo C# 6.21: Programa.cs

Na linha 8, quando o mtodo ExibeSoma chamado, o valor armazenado na varivel a do mtodo


Main copiado para a varivel a do mtodo ExibeSoma. Analogamente, o valor armazenado na varivel
b do mtodo Main copiado para a varivel b do mtodo ExibeSoma.

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

Em seguida, na linha 6, o mtodo Troca chamado. O valor armazenado na varivel a do mtodo

Main passado como argumento nessa chamada de mtodo.


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

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

static double MaximoEntreTresValores ( double a , double b , double c )


{
if ( a >= b && a >= c )
{
return a ;
}
else if ( b >= a && b >= c )
{
return b ;
}
else
{
return c ;
}
}
static double Maximo ( double a , double b )
{
if ( a >= b )
{
return a ;
}
else
{
return b ;
}
}

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

static double Maximo ( double a , double b , double c , double d )


{
// codigo
}
static double Maximo ( double a , double b , double c )
{
// codigo
}
static double Maximo ( double a , double b )
{
// codigo
}

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) ;

A possibilidade de criar mtodos com o mesmo nome denominada sobrecarga.

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

static double Metodo ( double a , double b )


{
// codigo
}
static double Metodo ( double c , double d )
{
// codigo
}

6.7 Parmetros Variveis


No exemplo abaixo, o mtodo CalculaSomatorio recebe como parmetro exatamente trs valores
do tipo double. Depois, ele calcula e devolve o somatrio desses valores.
1 static double CalculaSomatorio ( double a , double b , double c )
2 {
3
return a + b + c ;
4 }

As chamadas abaixo so exemplos de utilizao do mtodo CalculaSomatorio.


1
2
3
4

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

Agora, no exemplo abaixo, o parmetro do mtodo CalculaSomatorio um parameter-array. O


que caracteriza esse parmetro ser um parameter-array a utilizao da palavra chave params.
1 static double CalculaSomatorio ( params double [] valores )
2 {
3
4 }

A utilizao de um parameter-array na definio do mtodo CalculaSomatorio permite que zero ou


mais valores do tipo double sejam passados como argumento. Dessa forma, as chamadas abaixo so
todas vlidas.
1
2
3
4

double
double
double
double

s1
s2
s3
s4

=
=
=
=

CalculaSomatorio () ;
CalculaSomatorio (5.1) ;
CalculaSomatorio (5.5 , 4.2) ;
CalculaSomatorio (1.9 , 2.1 , 5.0) ;

A cada chamada, os argumentos do mtodo CalculaSomatorio so armazenados em um array. Uma


referncia desse array armazenada no parmetro valores. Dentro do corpo do mtodo CalculaSomatorio, o array pode ser manipulado normalmente.
1 static double CalculaSomatorio ( params double [] valores )
2 {
3
double soma = 0;
4
for ( int i = 0; i < valores . Length ; i ++)
5
{
6
soma += valores [ i ];
7
}
8
return soma ;
9 }

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 }

As seguintes chamadas so exemplos de utilizao do mtodo CalculaMedia.


1
2
3
4

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

static void Metodo1 ( params int [] valores ) { }


static void Metodo2 ( int a , params string [] valores ) { }
static void Metodo3 ( double a , char c , params double [] valores ) { }
static void Metodo4 ( string a , params char [] valores ) { }

Por outro lado, os mtodos abaixo esto incorretos.


1 static void Metodo1 ( params int [] valores , double a ) { }
2
3 static void Metodo2 ( params string [] valores , params int [] numeros ) { }
4
5 static void Metodo3 ( params double [] valores , char c , int i ) { }

Uma concluso imediata da regra de utilizao de parameter-arrays que todo mtodo pode ter
no mximo um parameter-array.

6.8 Erro: Parmetros incompatveis


Um erro de compilao comum em C# ocorre quando um mtodo chamado com parmetros
incompatveis.
1 class Programa
2 {
3
static void Main ()
4
{
5
Metodo () ;
6
Metodo (10.1 , 10.1 , " k19 " ) ;
7
Metodo ( " 10 " , " 10.1 " , " k19 " ) ;
8
}
9
10
static void Metodo ( int a , double b , string c )
11
{
12
return a + b + c ;
13
}
14 }
Cdigo C# 6.44: Programa.cs

A mensagem de erro de compilao seria semelhante apresentada abaixo.


Programa . cs (5 ,3): error CS1501 : No overload for method Metodo takes 0
arguments
Programa . cs (10 ,14): ( Location of symbol related to previous error )
Programa . cs (6 ,3): error CS1502 : The best overloaded method match for
Programa . Metodo ( int , double , string ) has some invalid arguments
Programa . cs (6 ,10): error CS1503 : Argument 1: cannot convert from double to
int
Programa . cs (7 ,3): error CS1502 : The best overloaded method match for
Programa . Metodo ( int , double , string ) has some invalid arguments
Programa . cs (7 ,10): error CS1503 : Argument 1: cannot convert from string to
int

204

www.k19.com.br

205

M TODOS

Programa . cs (7 ,16): error CS1503 : Argument 2: cannot convert from string to


double
Programa . cs (12 ,3): error CS0127 : Since Programa . Metodo ( int , double , string )
returns void , a return keyword must not be followed by an object
expression

Terminal 6.4: Erro de compilao

6.9 Erro: Resposta incompatvel


Um erro de compilao comum em C# ocorre quando armazenamos a resposta de um mtodo
em variveis de tipos incompatveis.
1 class Programa
2 {
3
static void Main ()
4
{
5
int a = Metodo () ;
6
double b = Metodo () ;
7
bool c = Metodo () ;
8
}
9
10
static string Metodo ()
11
{
12
return " k19 " ;
13
}
14 }
Cdigo C# 6.45: Programa.cs

A mensagem de erro de compilao seria semelhante apresenta abaixo.


Programa . cs (5 ,11): error CS0029 : Cannot implicitly convert type string to
int
Programa . cs (6 ,14): error CS0029 : Cannot implicitly convert type string to
double
Programa . cs (7 ,12): error CS0029 : Cannot implicitly convert type string to
bool

Terminal 6.5: Erro de compilao

6.10 Erro: Esquecer a instruo return


Um erro de compilao comum em C# ocorre quando um mtodo que deve devolver uma resposta (um mtodo no void) no a devolve. Isso pode acontecer, por exemplo, quando a instruo
return no est presente no corpo do mtodo. Veja o exemplo abaixo.
1 class Programa
2 {
3
static void Main ()
4
{
5
int resposta = Teste () ;
6
}
7
8
static int Teste ()
9
{
10
System . Console . WriteLine (1) ;
11
}
12 }

www.facebook.com/k19treinamentos

205

M TODOS

206

Cdigo C# 6.46: Programa.cs

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

Terminal 6.6: Erro de compilao

O cdigo a seguir possui o mesmo problema.


1 class Programa
2 {
3
static void Main ()
4
{
5
int resposta = Teste () ;
6
}
7
8
static int Teste ()
9
{
10
System . Random gerador = new System . Random () ;
11
double valor = gerador . NextDouble () ;
12
if ( valor > 0.5)
13
{
14
return 1;
15
}
16
}
17 }
Cdigo C# 6.47: Programa.cs

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

Terminal 6.7: Erro de compilao

6.11 Erro: No utilizar parnteses


Um erro de compilao comum em C# ocorre quando no utilizamos parnteses na declarao
ou na chamada de um mtodo. No exemplo abaixo, o mtodo Teste foi declarado 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.48: Programa.cs

A mensagem de erro de compilao seria semelhante apresenta abaixo.

www.facebook.com/k19treinamentos

207

M TODOS

208

Programa . cs (10 ,3): error CS1014 : A get or set accessor expected

Terminal 6.8: Erro de compilao

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

A mensagem de erro de compilao seria semelhante apresenta abaixo.


Programa . cs (5 ,3): error CS0201 : Only assignment , call , increment , decrement ,
await , and new object expressions can be used as a statement

Terminal 6.9: Erro de compilao

6.12 Resumo
1

Para evitar a repetio de um determinado trecho de cdigo, podemos criar um mtodo.

Um mtodo possui uma marcao de retorno, um nome, uma lista de parmetros e um corpo.

Um mtodo pode ter zero ou mais parmetros.

Um parmetro uma varivel local de um mtodo.

A palavra reservada void utilizada em mtodos que no devolvem resposta.

A palavra reservada return utilizada para finalizar um mtodo e devolver uma resposta caso o
mtodo no seja void.

208

As variveis locais de um mtodo no podem ser alteradas em outro mtodo.

www.k19.com.br

209

M TODOS

Sobrecarga a possibilidade de definir mtodos com o mesmo nome.

Mtodos com o mesmo nome devem ter lista de parmetros diferentes.

10

Um mtodo pode receber uma quantidade varivel de parmetros utilizando parameter-array.

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

Figura 7.1: Controle remoto de uma TV

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

7.2 Pool de Strings


Um objeto do tipo string pode ter at 2147483647 de caracteres. Cada caractere ocupa 16 bits.
Potencialmente, o espao necessrio para manter objetos do tipo string bem maior do que o espao
necessrio para manter objetos da maior parte dos outros tipos. Por isso, em diversas linguagens de
programao, inclusive em C#, objetos do tipo string so compartilhados para diminuir o espao
ocupado por eles.
Por exemplo, na linha 5 do cdigo abaixo, ao utilizar a string literal Rafael, um objeto do tipo
string criado para armazenar essa sequncia de caracteres. Esse objeto colocado no pool de

strings. Uma referncia desse objeto armazenada na varivel a.


Na linha 6, a string literal Rafael utilizada pela segunda vez. O objeto criado na linha anterior est no pool de strings e possui o mesmo contedo. Sendo assim, ao invs de criar um novo
objeto, reaproveita-se o mesmo. Uma referncia desse objeto armazenada na varivel b. Portanto,
as variveis a e b guardam referncias para o mesmo objeto.
1 class Programa
2 {
3
static void Main ()
4
{
5
string a = " Rafael " ;
6
string b = " Rafael " ;
7
}
8 }
Cdigo C# 7.2: strings literais

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

mesmo contedo que esteja no pool de strings.


No exemplo abaixo, um objeto do tipo string foi criado na linha 5 com o operador new. Consequentemente, esse objeto no armazenado no pool de strings. Na linha 6, o mtodo Intern
devolve uma referncia do objeto do tipo string que possui o mesmo contedo do objeto criado
na linha 5.
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 = string . Intern ( a ) ;
7
}
8 }
Cdigo C# 7.4: Utilizando o mtodo Intern

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
------------------------------------------

Separando as informaes do cupom fiscal


Considere que a largura da tela do dispositivo permite a exibio de 42 caracteres por linha. Para
separar as informaes presentes no cupom fiscal, podemos utilizar linhas formadas por 42 caracteres iguais. No exemplo acima, escolhemos o caractere - e utilizamos o seguinte comando para
exibir cada uma dessas linhas:
1 System . Console . WriteLine ( " ------------------------------------------" ) ;

Exibindo o ttulo do cupom fiscal


O ttulo CUPOM FISCAL deve ser exibido na segunda linha de forma centralizada. Como o
dispositivo permite a exibio de 42 caracteres por linha e esse ttulo possui 12 caracteres, so necessrios 15 espaos em branco esquerda do texto CUPOM FISCAL para centralizar esse ttulo. Para
resolver esse problema, podemos usar o mtodo WriteLine acrescentado os 15 espaos em branco
diretamente no cdigo.
1 System . Console . WriteLine ( "

CUPOM FISCAL " ) ;

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 ( "

{0} " , " CUPOM FISCAL " ) ;

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.

Parmetros da string de formatao


Podemos definir zero ou mais parmetros na string de formatao. Cada parmetro deve ser
definido dentro de colchetes. A correspondncia entre os parmetros da string de formatao e os
argumentos do mtodo WriteLine definida atravs da indexao desses parmetros. O ndice de um
parmetro um nmero inteiro que deve aparecer imediatamente aps o caractere {.
3

"Bola"

37.65

System.Console.WriteLine("{0} {1} {2}", produto, quantidade, preco);


"Bola 3 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

System.Console.WriteLine("{1} {2} {0}", produto, quantidade, preco);


"3 37.65 Bola"

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

abaixo, o primeiro e o terceiro parmetros da string de formatao foram associados ao argumento


A e o segundo parmetro ao argumento B. Dessa forma, a mensagem A B A seria exibida.
System.Console.WriteLine("{0} {1} {0}", "A", "B");
A B A

Definindo a quantidade mnima de caracteres


Para cada parmetro da string de formatao, podemos definir a quantidade mnima de caracteres que devem ser utilizados quando a string de formatao combinada com os demais argumentos
do mtodo WriteLine.
No exemplo abaixo, o primeiro parmetro ocupa pelo menos 10 caracteres, o segundo parmetro
ocupa pelo menos 20 caracteres e o terceiro pelo menos 15 caracteres.
System.Console.WriteLine("{0,10} {1,20} {2,15}", produto, quantidade, preco);

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 " ) ;

Como o parmetro {0,16} define que a quantidade mnima de caracteres 16 e o argumento


PRODUTO possui apenas 7 caracteres, 9 espaos so adicionados esquerda desse argumento.
Sendo assim, seria exibido na sada padro a string
PRODUTO. Portanto, o argumento
PRODUTO seria alinhado direita.
Os espaos utilizados para completar a quantidade mnima de caracteres podem ser inseridos
direita do argumento PRODUTO. Para isso, basta substituir o parmetro {0,16} por {0,-16}. Veja
o exemplo a seguir.
1 System . Console . WriteLine ( " {0 , -16} " , " PRODUTO " ) ;

Exibindo os ttulos das colunas do cupom fiscal


O cupom fiscal possui quatro colunas para apresentar o nome, o preo unitrio, a quantidade e
o preo total de cada produto. Devemos definir a largura de cada coluna e o espaamento entre elas,
lembrando que cada linha permite no mximo 42 caracteres.
www.facebook.com/k19treinamentos

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.

Figura 7.2: Larguras das colunas do cupom fiscal

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 " );

Exibindo os nomes dos produtos


No cupom fiscal, a coluna que apresenta os nomes dos produtos deve ocupar 16 caracteres horizontalmente. Na string de formatao, podemos definir a quantidade mnima de caracteres como
vimos anteriormente.
1 System . Console . WriteLine ( " {0 ,16} " , nome ) ;

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 ) ;

Exibindo os preos unitrios dos produtos


No cupom fiscal, a coluna que apresenta os preos unitrios dos produtos deve ocupar 10 caracteres horizontalmente. Na string de formatao, podemos definir a quantidade mnima de caracteres
como vimos anteriormente.
1 System . Console . WriteLine ( " {0 , -16} {1 ,10} " , nome , preco ) ;

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 ) ;

Exibindo as quantidades dos produtos


No cupom fiscal, a coluna que apresenta as quantidades dos produtos deve ocupar 3 caracteres horizontalmente. Na string de formatao, podemos definir a quantidade mnima de caracteres
como vimos anteriormente.
1 System . Console . WriteLine ( " {0 , -16} {1 ,10: N } {2 ,3} " , nome , preco , quantidade ) ;

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

Exibindo os preos totais dos produtos


No cupom fiscal, a coluna que apresenta os preos totais dos produtos deve ocupar 10 caracteres horizontalmente. Na string de formatao, podemos definir a quantidade mnima de caracteres
como vimos anteriormente.
1 System . Console . WriteLine ( " {0 , -16} {1 ,10: N } {2: D3 } {3 ,10: N } " , nome , preco , quantidade , total ) ;

Lembre-se que por padro, na formatao de nmeros reais, os valores so exibidos com duas
casas decimais.

Exibindo o valor total da compra


O total da compra deve ser exibido com duas casas decimais em uma linha separada. Para isso
podemos utilizar a string de formatao abaixo.
1 System . Console . WriteLine ( " TOTAL : {0: N } " , totalDaCompra ) ;

Mais Sobre
Mais detalhes sobre o funcionamento das formataes podem ser obtidos no endereo:
http://msdn.microsoft.com/en-us/library/txafckwd.aspx

7.6 Formatao de Data e Hora


Normalmente, o formato padro para exibir data e hora varia de pas para pas ou de regio para
regio. Por exemplo, os brasileiros esto mais acostumados com o formato de data dia/ms/ano.
Por outro lado, os americanos costumam utilizar o formato ms/dia/ano.
Em C#, podemos formatar datas e horas facilmente. No cdigo exemplo abaixo, a formatao
dia/ms/ano hora:minuto:segundos est sendo aplicada.
1 System . DateTime fundacaoK19 =
2
new System . DateTime (2010 , 7 , 27 , 10 , 32 , 15) ;
3
4 string fundacaoK19Formatada = fundacaoK19 . ToString ( " dd / MM / yyyy HH : mm : ss " ) ;
Cdigo C# 7.27: Aplicando o formado "dia/ms/ano hora:minuto:segundos

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

Quando o caractere d utilizado de forma simples na mscara de formatao, os dias de 1 at 9


so formatados com apenas um dgito. Quando utilizamos dd, os dias de 1 at 9 so formatados com
apenas dois dgitos (01, 02, 03, ..., 09). Analogamente, para o ms, ano, hora, minutos e segundos.

7.7 Resumo
1

Para controlar um objeto do tipo string, necessrio utilizar uma referncia desse objeto.

Strings literais so armazenadas no pool de strings.

O pool de strings permite que objetos do tipo string sejam reutilizados a fim de diminuir o
consumo de memria.

O contedo de um objeto do tipo string no pode ser alterado.

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.

Datas e horas podem ser formatados com atravs do mtodo ToString.

www.facebook.com/k19treinamentos

221