Buscar

ALGORITMOS E PROGRAMAÇÃO II - SENAC EAD

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 3, do total de 149 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 6, do total de 149 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 9, do total de 149 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Prévia do material em texto

Rafael Sanches Rocha
Algoritmos e 
programação II 
com C#
AL
GO
RI
TM
OS
 E
 P
RO
GR
AM
AÇ
ÃO
 II
 C
OM
 C
#SÉRIE 
UNIVERSITÁRIA
A Série Universitária foi desenvolvida pelo Senac 
São Paulo com o intuito de preparar profissionais 
para o mercado de trabalho. Os títulos abrangem 
diversas áreas, abordando desde conhecimentos 
teóricos e práticos adequados às exigências 
profissionais até a formação ética e sólida.
Algoritmos e programação II com C# é uma 
obra voltada aos problemas de programação 
envolvendo a manipulação de dados e às soluções 
utilizadas por meio de algoritmos. São discutidas, 
entre outras questões, os problemas de busca e 
ordenação de dados, as diferentes abordagens 
de implementação de um algoritmo por meio 
de iteratividade e recursividade, os vetores, as 
matrizes e a leitura e escrita de arquivos. É feita, 
ainda, uma introdução sobre classes e objetos. 
O objetivo do livro é proporcionar uma visão 
geral da manipulação de dados por algoritmos, 
apresentando ao leitor aspectos essenciais à 
análise e ao desenvolvimento de programas.
e-
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
Dados Internacionais de Catalogação na Publicação (CIP)
(Simone M. P. Vieira - CRB 8a/4771)
Rocha, Rafael Sanches
  Algoritmos e programação II com C# / Rafael Sanches Rocha. – São 
Paulo : Editora Senac São Paulo, 2022. (Série Universitária
  Bibliografia.
  e-ISBN 978-85-396-3703-4 (ePub/2022)
  e-ISBN 978-85-396-3704-1 (PDF/2022)
  1. Desenvolvimento de sistemas 2. Linguagem de programação  
3. Algoritmos : Programação 4. Programação recursiva I. Título. II. Série 
22-1696t CDD – 005.13
 003 
 BISAC COM051300 
 COM051230
Índice para catálogo sistemático:
1. Linguagem de programação : Algoritmos 005.13
2. Desenvolvimento de sistemas 003
M
at
er
ia
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ad
o 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
a 
Re
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.
ALGORITMOS E 
PROGRAMAÇÃO II COM C#
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
Rafael Sanches Rocha
Administração Regional do Senac no Estado de São Paulo
Presidente do Conselho Regional
Abram Szajman
Diretor do Departamento Regional
Luiz Francisco de A. Salgado
Superintendente Universitário e de Desenvolvimento
Luiz Carlos Dourado
M
at
er
ia
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ad
o 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
a 
Re
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.
Editora Senac São Paulo
Conselho Editorial
Luiz Francisco de A. Salgado 
Luiz Carlos Dourado 
Darcio Sayad Maia 
Lucila Mara Sbrana Sciotti 
Luís Américo Tousi Botelho
Gerente/Publisher
Luís Américo Tousi Botelho
Coordenação Editorial/Prospecção
Dolores Crisci Manzano 
Ricardo Diana
Administrativo
grupoedsadministrativo@sp.senac.br
Comercial
comercial@editorasenacsp.com.br
Acompanhamento Pedagógico
Mônica Rodrigues dos Santos
Designer Educacional
Patrícia Pinheiro de Sant’Ana
Revisão Técnica
Gustavo Moreira Calixto
Revisão de Texto
Alexandre Napoli
Projeto Gráfico
Alexandre Lemes da Silva 
Emília Corrêa Abreu
Capa
Antonio Carlos De Angelis
Editoração Eletrônica
Creali Comunicação e Marketing
Ilustrações
Valdemir Nunes da Costa
Imagens
Adobe Stock Photos
E-book
Rodolfo Santana
Proibida a reprodução sem autorização expressa.
Todos os direitos desta edição reservados à
Editora Senac São Paulo
Rua 24 de Maio, 208 – 3o andar 
Centro – CEP 01041-000 – São Paulo – SP
Caixa Postal 1120 – CEP 01032-970 – São Paulo – SP
Tel. (11) 2187-4450 – Fax (11) 2187-4486
E-mail: editora@sp.senac.br 
Home page: http://www.livrariasenac.com.br
© Editora Senac São Paulo, 2022
Sumário
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
Capítulo 1
Estrutura de dados linear 
(vetor), 7
1 Preparação do ambiente, 8
2 Declaração e criação de vetores, 11
3 Resolução de problemas utilizando 
vetores, 19
4 Utilização de funções com 
vetores, 23
Considerações finais, 26
Referências, 27
Capítulo 2
Estrutura de dados 
bidimensional (matriz), 29
1 Declaração e criação de 
matrizes, 30
2 Resolução de problemas 
utilizando matrizes, 34
3 Utilização de funções com 
matrizes, 39
Considerações finais, 47
Referência, 47
Capítulo 3
Manipulação de arquivos em 
CSharp, 49
1 Utilização de arquivos em 
CSharp, 50
2 Leitura de dados em um arquivo, 54
3 Escrita de dados em um arquivo, 62
Considerações finais, 64
Referência, 65
Capítulo 4
Algoritmos de busca em 
vetores, 67
1 Busca linear, 68
2 Busca binária, 70
3 Conceitos de análise de 
algoritmos, 74
Considerações finais, 78
Referências, 78
Capítulo 5
Algoritmos de ordenação 
elementares, 79
1 Ordenação pelo método bolha, 80
2 Ordenação por seleção, 83
3 Ordenação por inserção, 85
Considerações finais, 87
Referências, 88
Capítulo 6
Algoritmos recursivos, 89
1 Definição de um problema 
recursivo, 90
2 Estratégia para escrever um 
algoritmo recursivo, 95
3 Teste de mesa para um algoritmo 
recursivo, 99
Considerações finais, 104
Referências, 105
6 Algoritmos e programação II com C# Ma
te
ria
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ad
o 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
a 
Re
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.
Capítulo 7
Algoritmos de ordenação 
eficientes, 107
4 MergeSort – execução e análise de 
complexidade, 108
5 QuickSort – execução e análise de 
complexidade, 120
Considerações finais, 137
Referências, 138
Capítulo 8
Tipos abstratos de dados, 139
1 Definição e utilização de TAD, 140
2 Definição de classes, atributos, 
métodos e construtores, 142
3 Implementação de TAD utilizando 
classes, 146
Considerações finais, 151
Referência, 152
Sobre o autor, 155
7
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
Capítulo 1
Estrutura de dados 
linear (vetor)
Quando é necessário armazenar temporariamente dados durante 
a execução de programas, recorremos a variáveis como espaços em 
memória. Ao longo da execução de um programa, diversas variáveis 
podem estar em uso, muitas das quais podem apresentar relação entre 
si (por exemplo, diferentes variáveis para armazenar a nota ou o nome 
de cada aluno de uma turma). Dependendo da quantidade de alunos a 
ser tratada nesse programa, é necessário criar muitas variáveis.
Essa declaração manual de diversas variáveis, além de ser trabalho-
sa, por se basear em um processo manual repetitivo de criar diferentes 
variáveis com nomes similares (por exemplo, nota1, nota2, etc.), pode 
8 Algoritmos e programação II com C# Ma
te
ria
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ado 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
a 
Re
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.
incorrer em erros de digitação ao nomear as variáveis ou atribuir valo-
res, levando a problemas na lógica da execução do programa.
Para minimizar esse problema, há o vetor, que, como vamos conferir 
em mais detalhes ao longo deste capítulo, é uma estrutura muito utiliza-
da para simplificar o processo de criação de diversas variáveis usadas 
para armazenar valores similares. A seguir, aprenderemos a criar esses 
vetores, inserir valores e recuperá-los. Serão abordados alguns proble-
mas em que o uso de vetores é uma boa escolha, além de ser a forma 
mais eficiente de percorrer todas as posições dessa estrutura. Por fim, 
veremos como utilizar vetores como parâmetro e retorno de funções.
A compreensão da utilização de vetores é essencial para o desen-
volvimento de sua habilidade com lógica de programação. Mas não se 
preocupe: esse é um assunto simples que será abordado em detalhes 
a seguir.
1 Preparação do ambiente
Antes de avançar para o novo conteúdo, é preciso definir a ferramen-
ta a ser utilizada no desenvolvimento e na execução dos programas. 
Essas ferramentas são conhecidas como ambientes de desenvol-
vimento integrado ou, em inglês, integrated development environments 
(IDEs). Aqui, adotaremos a linguagem de programação C# (lê-se C sharp) 
para o desenvolvimento dos códigos; portanto, é preciso escolher um IDE 
que suporte essa linguagem. Um IDE muito utilizado, e que recomenda-
mos, é o Microsoft Visual Studio – você pode baixar gratuitamente a ver-
são Comunidade (ou Community), que traz todos os recursos necessários 
para a compilação e execução dos projetos em C# (MICROSOFT, 2022).
Ao iniciar o Microsoft Visual Studio, deve-se criar um novo projeto 
para cada programa que será desenvolvido. A figura 1 indica, primeira-
mente, a utilização do caminho Arquivo > Novo > Projeto... 
9Estrutura de dados linear (vetor)
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
Figura 1 – Página inicial do Microsoft Visual Studio
Em seguida, é preciso dar um nome para o novo projeto, como indi-
cado na figura 2.
Figura 2 – Janela de novo projeto
Observe a estrutura de código que será criada, exemplificada na fi-
gura 3.
10 Algoritmos e programação II com C# Ma
te
ria
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ad
o 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
a 
Re
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.
Figura 3 – Código padrão de um projeto recém-criado
Não se deve alterar, apagar ou renomear essa estrutura de códigos. 
Todos os códigos apresentados a seguir deverão ser inseridos entre a 
abertura de chaves ( { ), presente na linha 8, e o fechamento de chaves 
( } ), presente na linha 10. Claramente, conforme for inserida mais de 
uma linha de código, o fechamento das chaves passará para as linhas 
de baixo. Portanto, fique atento para não alterar nenhuma das oito pri-
meiras e não remover nenhuma das três últimas linhas (que são três 
fechamentos de chaves).
Conforme novos códigos são apresentados, deve-se apagar a linha 9 
dessa estrutura, removendo, portanto, a seguinte linha de código:
Console.WriteLine("Hello World!");
 A partir dessa linha, que agora deve estar em branco, é preciso seguir 
inserindo os códigos apresentados na sequência, exceto em algumas si-
tuações, para as quais serão fornecidas outras orientações.
Por fim, para executar o programa, é necessário pressionar CTRL + F5. 
Uma janela aparecerá com o resultado da execução, conforme mostrado 
na figura 4.
Figura 4 – Janela (console) gerada para mostrar o resultado da execução do programa
11Estrutura de dados linear (vetor)
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
PARA SABER MAIS 
Você pode utilizar qualquer IDE que já conheça e pelo qual tenha prefe-
rência. Aqui, apenas foi apresentada uma opção de ferramenta para ser 
utilizada na continuidade deste estudo. Também não é necessário baixar 
e instalar um IDE, podendo-se optar por uma execução on-line, direta-
mente em um site, pelo navegador. Entre os diversos sites que permitem 
a digitação e execução de códigos em C# (além de outras linguagens), 
estão o Replit (REPLIT, 2022) e o .NET Fiddle (ENTECH SOLUTIONS, 2022).

2 Declaração e criação de vetores 
Todo programa faz uso de variáveis, que são posições de memória 
com um nome e a capacidade de armazenar determinado tipo de va-
lor. Podemos imaginar uma variável como uma gaveta que recebe uma 
etiqueta chamada “roupas” (o nome da gaveta, por si só, permite supor 
o que há dentro dela, sem necessidade de abri-la). Essa gaveta servirá 
para armazenar somente roupas (o tipo de conteúdo) e, dentro dela, 
será guardada uma quantidade de roupas (o conteúdo, ou seja, o valor 
da gaveta). A figura 5 ilustra esse exemplo.
Figura 5 – Representação de uma variável por meio de uma gaveta
Valor a ser armazenado é o 
conteúdo da gaveta, ou seja, o que 
vai ser guardado dentro da variável.
Tipo de dado é “roupa”, ou 
seja, o formato do valor que é 
armazenado nessa variável.
Nome da variável é “roupas”. 
Indica com facilidade a que se refere 
o valor armazenado na gaveta.
ROUPAS
12 Algoritmos e programação II com C# Ma
te
ria
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ad
o 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
a 
Re
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.
Quando abstraímos o conceito de uma gaveta do mundo real para 
a programação, utilizamos o conceito de variável. Não temos mais ca-
misas, calçados ou demais itens físicos para armazenar em um pro-
grama; portanto, são outros tipos de conteúdo que armazenamos em 
variáveis, com valores que podem ser processados em código. Esses 
diferentes tipos de valor são chamados de “tipos de dados”. A tabela 1 
indica alguns dos principais tipos de dados primitivos da linguagem de 
programação C#.
Tabela 1 – Tipos de dados em C# 
DESCRIÇÃO REPRESENTAÇÃO EM C# VALORES POSSÍVEIS DE ARMAZENAR
Inteiro int -2.147.483.648 até 2.147.483.647
Inteiro long
-9.223.372.036.854.775.808 até 
9.223.372.036.854.775.807
Decimal double ±5.0 × 10−324 até ±1.7 × 10308
Caractere char Unicode UTF-16 (U+0000 até U+FFFF)
Lógico bool true ou false
A partir dessa tabela, podemos montar um exemplo com variáveis 
para representar os dados de uma pessoa.
Uma variável chamada altura é do tipo double e pode receber o va-
lor 1,80.
Uma variável chamada peso é do tipo int e recebe o valor 75.
Uma variável chamada quitacao_eleitoral é do tipo bool e recebe o 
valor true.
A seguir, são ilustradas, na linguagem C#, a declaração e a atribuição 
dessas três variáveis:
13Estrutura de dados linear (vetor)
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
double altura = 1.80;
int peso = 75;
bool quitacao_eleitoral= true;
Porém, em algum momento, um programa poderá ter diversas variá-
veis usadas para a mesma finalidade. Observe, por exemplo, o código a 
seguir, no qual três variáveis possuem a finalidade de armazenar o valor 
da nota de diferentes alunos:
double nota_aluno_1 = 8.7;
double nota_aluno_2 = 5.4;
double nota_aluno_3 = 6.2;
double media = (nota_aluno_1 + nota_aluno_2 + nota_aluno_3) / 3;
Nesse trecho, deseja-se calcular a média das notas de todos os alu-
nos de uma turma. Para isso, é necessário fazer a declaração de uma 
nova variável para armazenar cada nota. Nesse exemplo, temos apenas 
três alunos, mas, pensando em uma sala de aula real, poderia haver 
muitos mais, o que se refletiria em mais linhas de código.
Contudo, podemos observar que todas essas variáveis têm uma re-
lação entre si: elas são utilizadas para armazenar o mesmo tipo de dado 
e para a mesma finalidade. São dados do tipo double que representam 
notas, e cada variável corresponde à nota de um aluno diferente.
Em casos assim, podemos agrupar as variáveis semelhantes em 
uma única estrutura chamada vetor, ou array unidimensional, reduzindo 
o código e ganhando clareza na relação entre as variáveis.
Se uma única variável pode ser comparada a uma gaveta, um vetor 
pode ser comparado a um gaveteiro. A primeira gaveta poderia guar-
dar as roupas de uma pessoa, a segunda gaveta, as roupas de outra, e 
assim por diante, ou seja, cada gaveta corresponderia a uma variável 
diferente. A figura 6 ilustra esse exemplo.
14 Algoritmos e programação II com C# Ma
te
ria
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ad
o 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
a 
Re
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.
Figura 6 – Representação de um vetor por meio de um gaveteiro
ROUPAS PAI
ROUPAS FILHO
ROUPAS MÃE
Tipo de dado é “roupa” 
para todas as gavetas.
Cada gaveta é equivalente a 
uma variável distinta e pode ter 
um valor (conteúdo) diferente.
Em um vetor, cada uma dessas “gavetas” é chamada de posição, e 
cada posição é indicada por um índice. A primeira posição do vetor é 
indicada pelo índice zero (0), e a última posição, pelo índice que corres-
ponde ao tamanho do vetor – 1. Na figura 7, é feita uma comparação 
entre três variáveis e um vetor que representa o mesmo conjunto des-
sas variáveis, e que, portanto, poderia ser utilizado para substituir todas 
elas. Na figura, é indicado o conteúdo (valor) de cada variável e, para o 
vetor, são indicados todos os seus valores, as posições e os índices de 
cada posição. Um vetor que armazena três valores possui um tamanho 
3, sendo o valor da primeira posição armazenado no índice 0 e o último 
valor armazenado no índice 2, que corresponde ao tamanho do vetor (3 
menos 1).
15Estrutura de dados linear (vetor)
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
Figura 7 – Comparação entre variáveis e vetor
VARIÁVEIS VETOR
TIPO: INTEIRO
NOME VALORES NOME
POSIÇÃO
ÍNDICE
TAMANHO: 3
TIPO: INTEIRO
VALORES
 variável 1 variáveis5 5
1 2 3
0 1 2
3
3
9
9
 variável 2
 variável 3
Na linguagem C#, temos algumas alternativas para a criação do vetor.
2.1 Declaração e atribuição dos valores em uma única 
instrução
Neste caso, no momento de criação do vetor, já se possuem todos 
os dados que serão inseridos em todas as suas posições.
Para isso, utiliza-se a regra expressa a seguir:
tipo_de_dado[ ] nome_do_vetor = { valor_pos_0, valor_pos_1, ... , valor_ultima_pos} ;
IMPORTANTE 
A indicação dos colchetes logo após o tipo de dado indica que essa 
estrutura é um vetor, e não mais uma única variável.
 
Exemplo de criação de vetor na linguagem C#:
double[] notas = {8.7,5.4,6.2};
16 Algoritmos e programação II com C# Ma
te
ria
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ad
o 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
a 
Re
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.No código anterior, foi criado um vetor de números racionais (double) 
chamado notas, de tamanho 3, no qual a primeira posição (índice 0) 
armazena o valor 8.7, a segunda posição (índice 1) armazena 5.4 e a 
terceira posição (índice 2) armazena 6.2.
Assim como em qualquer variável, é permitido alterar e recuperar o 
valor armazenado em uma posição do vetor. Isso é feito de maneira 
muito similar a quando usamos uma única variável. O único detalhe adi-
cional é a necessidade de informar o índice no vetor em que se deseja 
inserir ou recuperar o valor.
Assim, para inserir um valor em uma posição específica do vetor, é 
utilizada a seguinte regra:
nome_do_vetor[índice_desejado] = novo_valor;
Em código, um novo valor é atribuído a uma posição específica do 
vetor da seguinte forma:
notas[1] = 6.4;
No exemplo anterior, o valor 6.4 substitui o valor 5.4 que aparecia no 
índice 1 do vetor notas. 
E para recuperar o valor de uma posição específica, basta utili-
zar o nome do vetor acrescido de colchetes, indicando o índice a ser 
acessado:
outra_variavel = nome_do_vetor[índice_desejado];
Em C#, o acesso e o uso do valor armazenado em uma posição do 
vetor são feitos como demonstrado a seguir:
double nota_do_jose = notas[1];
17Estrutura de dados linear (vetor)
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
Nesse exemplo, se supomos que a segunda posição do vetor 
(índice 1) representa a nota do aluno José, podemos criar uma variável 
exclusiva para receber o valor da sua nota armazenada no vetor, assim 
como copiar o valor de uma variável para outra.
IMPORTANTE 
O vetor sempre começa com sua primeira posição apontada pelo índice 
0. A segunda posição, portanto, é indicada pelo número 1, e assim por 
diante. Outro detalhe importante é que, em todas as posições do vetor, 
só pode haver o mesmo tipo de dado.
 
2.2 Declaração do vetor com o tamanho definido para 
posteriormente receber os valores
Nesta abordagem, primeiramente é declarado o vetor e posteriormen-
te são atribuídos os valores de cada posição. Esse procedimento é bas-
tante comum em um programa interativo, no qual o usuário insere o valor 
de cada uma das posições, não cabendo ao programador definir esses 
valores diretamente no código. O método também é muito utilizado quan-
do os dados são obtidos em um momento posterior à criação do vetor.
Para essa abordagem, primeiro é preciso declarar o vetor da seguin-
te forma:
tipo_de_dado[ ] nome_do_vetor = new tipo_de_dado[tamanho_do_vetor];
Depois, deve-se atribuir o valor de cada uma das posições, como de-
monstrado no item anterior.
Em código, a declaração do vetor pode ser feita da seguinte forma:
double[] notas = new double[3];
18 Algoritmos e programação II com C# Ma
te
ria
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ad
o 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
a 
Re
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.Perceba que, nesse caso, o número 3 representa o tamanho do vetor. 
Assim, está sendo criado um vetor de três posições, começando no índi-
ce 0 e terminando no índice 2. É precisoatenção para repetir o mesmo 
tipo de dado nos dois lados do operador de atribuição.
2.3 Declaração do vetor sem predefinição do tamanho
Dessa forma, primeiramente declara-se o vetor, depois define-se o ta-
manho do vetor e, por fim, o valor de cada posição. Esse método é utili-
zado quando o programador sabe que será necessário um vetor (pois o 
programa lidará com uma sequência de dados do mesmo tipo), mas não 
sabe qual será a quantidade, ou seja, qual deverá ser o tamanho do vetor.
O método divide a declaração do vetor em duas partes. Na primeira, 
define-se apenas o nome do vetor:
tipo_de_dado[ ] nome_do_vetor;
Na segunda, após a definição do tamanho do vetor, é concluída sua 
criação:
nome_do_vetor = new tipo_de_dado[tamanho_do_vetor];
Em código, essa criação seria feita da seguinte forma:
double[] notas;
notas = new double[3];
Contudo, é mais comum que a declaração do vetor não seja concluí-
da com um número explícito. Usualmente, após a declaração parcial do 
vetor, uma variável recebe um valor que indica qual deve ser o tamanho 
do vetor. Essa variável é, então, utilizada para finalizar a declaração do 
vetor, como no exemplo a seguir:
19Estrutura de dados linear (vetor)
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
double[] notas;
int tamanho_vetor = valor_digitado_pelo_usuario;
notas = new double[tamanho_vetor];
PARA PENSAR 
Uma variável representa um único valor; portanto, seu nome tende a 
ser apresentado no singular. Um vetor, por outro lado, representa um 
conjunto de valores; por isso, seu nome costuma ser apresentado no 
plural.
 
3 Resolução de problemas utilizando vetores
A utilização de vetores é muito comum quando é necessário acessar 
os dados de todas as posições para realizar alguma operação com es-
ses valores em conjunto.
Tomemos como exemplo o vetor de notas criado no subcapítulo 2:
double[] notas = {8.7,5.4,6.2};
Uma operação comum seria calcular a média de todos esses dados 
para obter a média da turma, como no exemplo a seguir:
double media = (notas[0] + notas[1] + notas[2]) / 3;
Assim, estaríamos somando todos os valores de cada posição e di-
vidindo-os por 3, que é a quantidade total de valores do vetor ou, ainda, 
o seu tamanho.
Porém, essa é uma abordagem que adotamos para calcular a mé-
dia de variáveis isoladas. Pense na dificuldade que seria calcular essa 
média conforme a quantidade de variáveis aumenta para dezenas ou 
20 Algoritmos e programação II com C# Ma
te
ria
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ad
o 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
a 
Re
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.mesmo centenas... Nesse caso, seria necessário adicionar cada uma 
delas na fórmula da média!
Como todos os valores de notas estão em um mesmo vetor, há uma 
forma mais prática de fazer esse cálculo. Para isso, vamos utilizar a 
estrutura de repetição para ou, em código, o comando for:
double soma = 0;
for (int i = 0; i < 3; i++)
soma += notas[i];
double media = soma / 3;
Nesse código, é criada uma variável para armazenar a soma de todas 
as notas. Em seguida, é utilizado o comando for para percorrer todas as 
posições do vetor. Observe que, para isso, a variável de controle começa 
no índice 0 e vai até o índice anterior ao tamanho do vetor (que corres-
ponde à sua última posição). Dentro do for, a cada iteração, é acessada 
uma nova posição do vetor (começando em 0 e indo até a última), e 
o valor nessa posição é acrescentado à variável soma. Encerradas as 
repetições do for, a variável soma é dividida por 3, que equivale à quanti-
dade de notas. O valor resultante é atribuído à variável media.
Um último ajuste pode ser feito nesse algoritmo para deixá-lo ainda 
mais versátil:
double soma = 0;
for (int i = 0; i < notas.Length; i++)
soma += notas[i];
double media = soma / notas.Length;
Perceba que o valor 3, que indicava o tamanho do vetor, foi substitu-
ído por notas.Length (acrescentou-se .Length ao nome do vetor). Esse 
comando busca diretamente no vetor notas o seu tamanho ou com-
primento (em inglês, length) e, portanto, equivale exatamente ao valor 
3. A vantagem de usá-lo é que, se você alterar a declaração do vetor, 
aumentando seu tamanho e acrescentando mais um valor, não será 
21Estrutura de dados linear (vetor)
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
necessário ajustar o valor numérico (3) usado no algoritmo anterior, tan-
to no for quanto no cálculo da média. Portanto, o algoritmo mostrado 
no exemplo anterior conseguirá calcular a média dos dados de um vetor 
independentemente do tamanho.
IMPORTANTE 
Podemos nos referir a cada espaço de armazenamento em um vetor 
como “posição”, indicando o primeiro espaço como 1 (primeira posição) 
e o último espaço com o valor do tamanho do vetor. Porém, em códi-
go, precisamos utilizar o “índice”, que conceitualmente tem a mesma 
finalidade de indicar um espaço específico do vetor. O primeiro espaço, 
no entanto, é representado pelo valor 0 (índice zero), e o último índice 
corresponde ao tamanho do vetor – 1.
 
Assim como utilizamos o comando for para percorrer um vetor, re-
cuperando o valor de cada posição a fim de realizar alguma operação, 
podemos usá-lo também para auxiliar no preenchimento do vetor, per-
mitindo que um usuário escolha os valores que serão inseridos em cada 
posição. Confira o exemplo a seguir:
Console.WriteLine("Defina quantos alunos há na turma:");
int tamanho = int.Parse(Console.ReadLine());
double[] notas = new double[tamanho];
//Armazenando as notas
for (int i = 0; i < notas.Length; i++) {
 Console.WriteLine("Digite a nota do aluno " + (i + 1) + 
":");
 notas[i] = double.Parse(Console.ReadLine(), 
CultureInfo.InvariantCulture);
}
//Recuperando as notas para calcular a média
double soma = 0;
for (int i = 0; i < notas.Length; i++) {
 Console.WriteLine("Nota do aluno " + (i + 1) + 
": "+notas[i]);
soma += notas[i];
22 Algoritmos e programação II com C# Ma
te
ria
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ad
o 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
a 
Re
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.
}
double media = soma / notas.Length;
Console.WriteLine("Média das notas na turma é: "+media);
Nesse algoritmo, o usuário é solicitado a digitar a quantidade de alu-
nos na turma; esse valor será armazenado na variável tamanho. Em se-
guida, um vetor chamado notas será criado com esse tamanho.
Depois, é utilizado um for para percorrer todos os índices do vetor 
(de 0 até o índice anterior ao tamanho do vetor, ou seja, seu último ín-
dice). Para cada iteração, o usuário será solicitado a digitar a nota do 
aluno correspondente àquele índice. Nesse ponto, foi feito um ajuste 
na impressão em tela para mostrar o primeiro aluno começando pelo 
valor 1 em vez de 0 (apenas por uma questão de convenção visual). O 
valor digitado pelo usuário é armazenado no respectivo índice do vetor 
e, assim, é repetido para todos os índices.
Ao finalizar o preenchimento de todas as notas no vetor, realiza-se 
a impressão dessas notas armazenadas. Para isso, novamente é utili-
zada a estrutura for. Todos os índices são acessados, um em cada ite-
ração, imprimindo o valor armazenado naqueleíndice. Também a cada 
iteração, o valor armazenado é adicionado à variável soma. Assim, ao 
terminar de acessar todos os índices, todos os valores terão sido adi-
cionados a essa variável. Depois de encerrado o for, a variável soma é 
dividida pelo tamanho do vetor, de modo a obter a média das notas da 
turma. A figura 8 mostra a tela de interação desse programa.
Figura 8 – Janela (console) gerada para mostrar o resultado da execução do programa
23Estrutura de dados linear (vetor)
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
Portanto, o for é muito utilizado junto de vetores, pois facilita bastante 
a manipulação dessa estrutura e aumenta as possibilidades de seu uso.
4 Utilização de funções com vetores
Vetores podem ser manipulados como outras variáveis e, inclusive, 
utilizados como argumentos e retornos de funções.
No exemplo a seguir, há uma demonstração do uso de função com 
um vetor como parâmetro. Nesse caso, um vetor contendo as notas 
dos alunos será passado como argumento de uma função responsável 
por calcular a média e retornar esse valor, que será então armazenado 
e impresso em tela.
A seguir, o código que pode ser inserido no método main da classe 
principal:
double[] notas = { 8.7, 5.4, 6.2 };
double media = calcularMedia(notas);
Console.WriteLine("A média da turma é: "+media);
Perceba que o nome do vetor foi usado como argumento da função 
chamada calcularMedia, como se faria com um tipo de dado primitivo.
A seguir, o código da função calcularMedia, que pode ser criada na 
classe principal, abaixo do método main:
static double calcularMedia(double[] notas)
{
double soma = 0;
for (int i = 0; i < notas.Length; i++)
soma += notas[i];
return soma / notas.Length;
}
Nessa função, há o retorno de um valor do tipo double que represen-
ta a média das notas. Na assinatura da função, o parâmetro de entrada 
24 Algoritmos e programação II com C# Ma
te
ria
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ad
o 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
a 
Re
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.é um vetor, que é representado de forma semelhante aos demais tipos 
de dados. É necessário indicar seu tipo, acrescido de colchetes, para 
expressar que se trata de um vetor, e adicionar o nome da variável que 
será utilizada dentro do corpo da função para representar esse vetor de 
entrada. Dentro da função, ocorre algo já visto no subcapítulo anterior: 
o vetor tem todas as suas posições acessadas, os valores de cada uma 
são somados e, no final, obtém-se a média desses valores, sendo a mé-
dia retornada pela função.
Outra forma de utilizar vetores em funções é como o retorno de uma 
função. O exemplo a seguir é de uma função que recebe um vetor de 
entrada e inverte os valores de todas as posições (o valor da primeira 
posição é trocado com o valor da última posição, o valor da segunda po-
sição é trocado com o valor da penúltima posição, e assim por diante).
A seguir, o código a ser inserido no método main:
double[] notas = { 8.7, 5.4, 6.2 };
inverterVetor(notas);
for (int i=0;i<notas.Length;i++)
Console.Write(notas[i]+"|");
Console.WriteLine();
No trecho anterior, o vetor de notas é passado como argumento da 
função inverterVetor. Essa função inverte os dados do vetor original, por 
isso não há necessidade de um retorno. Por fim, são impressos todos 
os novos valores desse vetor para atestar que os valores originais foram 
realmente invertidos.
Resta criar a função inverterVetor. Para isso, logo abaixo do método 
main, insira o seguinte código:
static void inverterVetor(double[] vetor)
{
25Estrutura de dados linear (vetor)
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
double temp;
for (int i = 0; i < vetor.Length/2; i++){
temp = vetor[i];
vetor[i] = vetor[vetor.Length - 1 - i];
vetor[vetor.Length - 1 - i] = temp;
}
}
Na assinatura dessa função, seu retorno corresponde a um vetor de 
double. No corpo da função, são percorridas as posições do vetor de en-
trada até a posição intermediária, pois, quando a execução do algoritmo 
alcançar essa posição, já terão sido invertidos todos os valores. 
O processo de inversão equivale a armazenar o valor da posição atu-
al em uma variável temporária; obter o valor da posição equivalente no 
final do vetor e armazená-lo na posição atual; e, por último, armazenar 
o valor da variável temporária na posição final equivalente. Esse vetor 
com as posições invertidas é, então, retornado pela função.
Quando um vetor for passado como argumento de uma função e 
alterações de dados forem realizadas nesse vetor, dentro da função, na 
verdade será alterado o vetor original fora da função. Observe o trecho 
de código abaixo:
double[] n = notas;
Mesmo que seja copiado um vetor para outro, e sejam alterados os 
valores do vetor n, também serão alterados os respectivos valores do 
vetor notas. Dessa forma, está sendo criada uma cópia da referência 
em memória do vetor original, e não dos seus valores. Assim, ambos os 
vetores apontam para o mesmo endereço de memória, sendo, por isso, 
o mesmo vetor (DEITEL, 2003).
Portanto, se quiser criar uma cópia de um vetor, de forma a poder 
alterar os dados nessa cópia sem interferir no original, você terá de criar 
esse novo vetor copiando valor a valor do vetor original, como no código 
a seguir:
26 Algoritmos e programação II com C# Ma
te
ria
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ad
o 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
a 
Re
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.
double[] notas = { 8.7, 5.4, 6.2 };
double[] n = new double[notas.Length];
for (int i = 0; i < notas.Length; i++)
 n[i] = notas[i];
Dessa forma, você poderá operar sobre o vetor n sem receio de alte-
rar o vetor notas.
Considerações finais
A utilização de vetores é muito importante para a simplificação e a 
clareza de um código. Além disso, é essencial associar o uso de uma 
estrutura de repetição como o for para facilitar o acesso a todas as 
posições do vetor quando é necessário preencher ou recuperar todos 
os seus valores.
Os vetores podem armazenar qualquer tipo de dado, porém o mes-
mo tipo de dado declarado na criação do vetor tem que ser armaze-
nado em todas as suas posições. Também é importante lembrar que, 
ao acessar uma posição do vetor, indicamos seu índice, e o índice da 
primeira posição começa com o valor zero. Por representarem um 
conjunto de valores, os vetores ainda podem ser usados em funções, 
com argumento ou retorno, assim como é feito com os tipos de dados 
primitivos (variáveis isoladas).
Pratique a criação de vetores com diferentes tipos de dados. 
Manipule seus dados por meio de funções. Faça cópia de vetores para 
se acostumar a não apontar para a mesma referência do vetor origi-
nal. Essa prática é essencial para reforçar sua habilidade com vetores, 
o que será muito útil no avanço do estudo de programação.
27Estrutura de dados linear (vetor)
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
Referências
DEITEL, H. M. et al.C#: como programar. São Paulo: Pearson Universidades, 
2003.
ENTECH SOLUTIONS. Dot net fiddle. C# online compiler. Dunellen, NJ: ENTech 
Solutions, c2022. Disponível em: https://dotnetfiddle.net/. Acesso em: 12 fev. 
2022.
MICROSOFT. Visual Studio. Versão 17.2. [S. l.]: Microsoft, c2022. Disponível em: 
https://visualstudio.microsoft.com/pt-br/downloads/. Acesso em: 12 fev. 2022.
REPLIT. The collaborative browser based IDE. [S. l.]: Replit, c2022. Disponível 
em: https://replit.com/. Acesso em: 12 fev. 2022.
https://visualstudio.microsoft.com/pt-br/downloads/
29
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
Capítulo 2
Estrutura de dados 
bidimensional 
(matriz)
O conceito de matrizes expande a definição de vetores. Enquanto os 
vetores funcionam como uma “lista” unidimensional de diversas posi-
ções, “uma ao lado da outra”, para armazenar diversos valores, as ma-
trizes funcionam como uma “tabela”, permitindo armazenar os valores 
em diversas posições distribuídas por suas linhas e colunas. Por isso, 
recebem a definição de bidimensionais.
Essa estrutura auxilia na representação de problemas que dependem 
da disposição bidimensional dos dados. Exemplos disso são as coorde-
nadas de diferentes elementos em um mapa e as posições de peças em 
um tabuleiro. Podemos até mesmo representar uma imagem por meio 
de uma matriz na qual cada posição guarda um valor que representa a 
cor de um pixel.
30 Algoritmos e programação II com C# Ma
te
ria
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ad
o 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
a 
Re
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.
A forma de criação dessas estruturas é muito similar à dos vetores, 
e veremos exemplos práticos delas ao longo deste capítulo, no qual em-
pregaremos matrizes no desenvolvimento da lógica de jogos de tabulei-
ro. Veremos como criar matrizes, acessar seus valores, percorrer todas 
as suas posições, aplicá-las em problemas práticos e usá-las por meio 
de funções.
A depender das necessidades do programa a ser desenvolvido, as 
matrizes são um grande recurso. Ter uma boa compreensão do uso 
dessas estruturas é muito importante para identificar a possibilidade de 
sua aplicação em um problema e de uma implementação bem-sucedi-
da em seu código.
1 Declaração e criação de matrizes
Como já visto, vetores são estruturas que permitem armazenar di-
versos valores em cada posição, sendo todos eles de um mesmo tipo. 
Uma representação do vetor é uma sequência de espaços, um ao lado 
do outro, em que cada um é uma posição a armazenar um valor. Por 
essa representação sequencial, começando no índice 0 e terminando 
no índice que corresponde ao tamanho do vetor – 1, podemos nos re-
ferir ao vetor como uma estrutura de dados linear ou uma estrutura de 
dados unidimensional. Também é comum o termo array unidimensional.
Embora o vetor auxilie muito no agrupamento de valores que pos-
suem alguma relação entre si, em alguns casos é necessária a repre-
sentação de valores em mais de uma dimensão. Para isso, é preciso 
utilizar uma estrutura de dados bidimensional, ou array bidimensional, 
também conhecida simplesmente por matriz.
A figura 1 traz um exemplo da representação de um vetor e de uma 
matriz, indicando, em cada posição, o índice de cada um.
31Estrutura de dados bidimensional (matriz)
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
Figura 1 – Exemplo de vetor e matriz
VETOR
NOME
POSIÇÃO
ÍNDICE
TAMANHO: 3
TIPO: INTEIRO
VALORES
 variáveis
1 2 3
0 1 2
35 9
MATRIZ
NOME
ÍNDICES
1ª coluna última coluna
TAMANHO: 4x3
TIPO: INTEIRO
VALORES
 variáveis (0,0) (0,1) (0,2)
(1,0) (1,1) (1,2)
(2,0) (2,1) (2,2)
11 8 2
0 15 7
35
(3,0) (3,1) (3,2)
2 9 10
9
1ª
 li
nh
a
úl
tim
a 
lin
ha
Em um vetor, basta um valor para identificar cada posição, pois, con-
forme discutido, ele é uma estrutura de dimensão única. Como a matriz 
possui duas dimensões, são necessários dois valores para indicar cada 
posição: um para a linha e outro para a coluna. A matriz também começa 
pelo índice 0 e, por isso, sua primeira posição é indicada por (0,0), sendo 
o primeiro valor o índice da linha e o segundo valor o índice da coluna.
A forma de declaração de uma matriz segue as mesmas regras da for-
ma de criação de um vetor, como já visto. O único detalhe a atentar é que, 
agora, em vez de haver somente a abertura e o fechamento de colchetes, 
deve-se colocar uma vírgula no meio desse par de colchetes para indicar 
que se trata de uma estrutura de duas dimensões (matriz). 
Para comparação, ao criar um vetor com posições já preenchidas, 
basta declarar:
double[] notas = {8.7,5.4,6.2};
32 Algoritmos e programação II com C# Ma
te
ria
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ad
o 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
a 
Re
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.
Para criar uma matriz com diversos valores, deve-se indicar uma 
vírgula no meio do par de colchetes ( [,] ) e, na atribuição do conjunto 
de valores, criar diversas linhas com valores. Conforme foi feito para 
o vetor, uma linha com valores está entre chaves, e os valores estão 
separados por vírgula. Para a matriz, diversas dessas linhas devem ser 
criadas (conforme a quantidade de linhas da matriz) e separadas por 
vírgula, e todas devem estar entre outro par de chaves. Observe o exem-
plo a seguir:
double[,] notas = { { 8.7, 5.4, 6.2 },
{ 3.8, 2.7, 8.5 },
{ 9.1, 0.9, 4.2 },
{ 7.1, 1.8, 8.8 } };
Não é necessário representá-la dessa forma; é possível deixar todos 
os valores em uma única linha. No entanto, nessa representação, pode-
mos visualizar facilmente que se trata de uma matriz 4 x 3 (4 linhas x 3 
colunas).
De forma similar ao vetor, podemos alterar o valor de uma posição 
específica na matriz, desde que sejam apontados corretamente os dois 
índices necessários.
IMPORTANTE 
Na matriz, o primeiro índice corresponde à linha e o segundo, à coluna. 
Assim como no vetor, os índices começam por zero.
 
No exemplo a seguir, a nota na linha de índice zero e coluna de índice 
1 (valor de 5.4) receberá o valor de 6.4:
notas[0,1] = 6.4;
33Estrutura de dados bidimensional (matriz)
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
A seguir, o valor da última linha e última coluna (8.8) será copiado 
para outra variável:
double nota_do_antonio = notas[3, 2];
Também é possível fazer a declaração de uma matriz vazia para pre-
encher os valores posteriormente. Em código, a declaração do vetor por 
esse método pode ser feita da seguinte forma:
double[] notas = new double[3];
Para declarar uma matriz, basta indicar o tamanho das duas dimen-
sões: primeiro, a quantidade de linhas; depois, a quantidade de colunas 
dentro dos colchetes.
double[,] notas = new double[4,3];
Por fim, pode-se realizar a declaração da matriz sem um tamanho 
predefinido e informá-lo posteriormente. Em código, a criação do vetor 
pode ser feita assim:
double[] notas;
notas = new double[3];
Para criar a matriz, a abordagem equivalenteé:
double[,] notas;
notas = new double[4,3];
Desse modo, podemos declarar e atribuir valores a matrizes de for-
ma muito similar à dos vetores. A única diferença está em que, ao lidar 
com estruturas de duas dimensões, devemos sempre informar dois 
índices para identificar corretamente a posição desejada na matriz.
34 Algoritmos e programação II com C# Ma
te
ria
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ad
o 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
a 
Re
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.
PARA SABER MAIS 
Além das estruturas de dados unidimensionais e bidimensionais, po-
demos criar estruturas de dados multidimensionais. É possível formar 
uma estrutura de três dimensões ( [,,] ) ou mais utilizando três índices ou 
mais, seguindo a mesma analogia feita nesta seção.

Para finalizar, esses arrays demonstrados são denominados retangu-
lares, pois possuem o mesmo número de colunas para todas as linhas. 
Já nos arrays irregulares, cada linha pode ter uma quantidade diferente 
de colunas (DEITEL, 2003). Porém, na continuidade deste livro, utilizare-
mos a implementação de arrays retangulares, que, conforme demons-
trado, atendem à maior parte dos problemas de programação.
2 Resolução de problemas utilizando matrizes
As matrizes são estruturas ideais para a representação de situações 
que necessitam de coordenadas, como jogos de tabuleiro. Por serem 
baseados em tabuleiros com linhas e colunas, damas, xadrez e Go são 
alguns exemplos de jogos que podem usar matrizes para a representa-
ção da posição das peças.
Veremos nesta seção uma implementação lógica do jogo de campo 
minado. Assim, teremos um exemplo da utilização de matriz e de como 
interagir com essa estrutura para apoiar a finalidade do jogo.
Primeiramente, devemos definir a regra de representação da área do 
jogo. Vamos utilizar uma matriz de 10 x 10, em que haverá uma bandeira 
e cinco bombas. Essa área pode ser representada por uma matriz de ze-
ros; as bombas, pelo número 1; e a bandeira, pelo número 2. A seguir, são 
apresentados os códigos de criação dessa matriz e do campo minado:
35Estrutura de dados bidimensional (matriz)
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
 int[,] campo = new int[10,10];//matriz com posições dos elementos do campo
int[,] jogo = new int[10, 10];//matriz que registra ações do jogador
int qtdLinhas = campo.GetLength(0);
int qtdColunas = campo.GetLength(1);
for (int l = 0; l < qtdLinhas; l++)
{
for (int c = 0; c < qtdColunas; c++)
{
campo[l, c] = 0;
jogo[l, c] = -1;
}
}
//Posicionamento aleatório da bandeira
Random gerador = new Random();
int linha = gerador.Next(qtdLinhas);
int coluna = gerador.Next(qtdColunas);
campo[linha, coluna] = 2;
//Posicionamento aleatório das bombas
int bombasPosicionadas = 0;
do
{
linha = gerador.Next(qtdLinhas);
coluna = gerador.Next(qtdColunas);
if (campo[linha,coluna]==0)
{
campo[linha, coluna] = 1;
bombasPosicionadas++;
}
} while (bombasPosicionadas<5);
Duas matrizes são utilizadas nessa implementação: a matriz campo 
é usada para registrar o posicionamento das bombas (pelo número 1), 
da bandeira (pelo número 2) e das posições vazias (pelo número 0); 
a matriz jogo inicia com –1 em todos os campos e é utilizada para a 
visualização do jogador. Conforme o jogador indica posições, elas são 
preenchidas com 0, até a indicação de uma posição com uma bomba 
ou a bandeira. A variável qtdLinhas armazena o tamanho da matriz na 
36 Algoritmos e programação II com C# Ma
te
ria
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ad
o 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
a 
Re
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.
primeira dimensão (número de linhas), e a variável qtdColunas, na se-
gunda dimensão (número de colunas).
Em seguida, a matriz campo é percorrida para ter todas as suas posi-
ções inicializadas com 0, enquanto a matriz jogo é inicializada com –1. 
Observe que esse preenchimento é feito com a utilização de duas estru-
turas for, uma dentro da outra. Esta é a forma padrão de percorrer uma 
matriz: enquanto o for externo alterna entre as linhas, o for interno alter-
na entre as colunas. Dessa forma, é possível acessar todas as posições 
da matriz na sequência apresentada na figura 2, que traz um exemplo 
de matriz 5 x 5, com a indicação dos índices de todas as posições e da 
sequência percorrida para acessá-las.
Figura 2 – Sequência para percorrer uma matriz
(0,0)
(1,0)
(2,0)
(3,0)
(4,0)
(1,1)
(2,1)
(3,1)
(4,1)
(1,2)
(2,2)
(3,2)
(4,2)
(1,3)
(2,3)
(3,3)
(4,3)
(1,4)
(2,4)
(3,4)
(4,4)
(0,1) (0,2) (0,3) (0,4)
Depois de preenchidas as duas matrizes, são gerados dois números 
aleatórios: um de linha (entre 0 e qtdLinhas – 1) e outro de coluna (entre 
0 e qtdColunas – 1). Esses números são usados como índices para posi-
cionar a bandeira (número 2) na matriz campo.
Por fim, são geradas cinco bombas (número 1) para serem posi-
cionadas no campo. Um contador registra quantas bombas já foram 
37Estrutura de dados bidimensional (matriz)
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
criadas. Novamente, são gerados números aleatórios de linha e coluna, 
mas desta vez é feita uma verificação para garantir que não haja outra 
bomba ou bandeira na mesma posição. Se a posição estiver vazia (nú-
mero 0), a bomba será posicionada.
Tendo sido preparado o campo do jogo, o próximo passo é criar a 
interface de interação do usuário. Para isso, segue o código:
bool fimJogo = false;
do
{
for (int l = 0; l < qtdLinhas; l++)
{
for (int c = 0; c < qtdColunas; c++)
{
 Console.Write(string.Format("{0} ", 
jogo[l, c]));
}
 Console.Write(Environment.NewLine + 
Environment.NewLine);
}
Console.Write("Selecione uma linha [1-10]: ");
linha = Convert.ToInt32(Console.ReadLine()) -1;
Console.Write("Selecione uma coluna [1-10]: ");
coluna = Convert.ToInt32(Console.ReadLine()) -1;
switch (campo[linha, coluna])
{
case 0:
jogo[linha, coluna] = 0;
Console.Write("Continue tentando.\n\n");
break;
case 1:
jogo[linha, coluna] = 1;
Console.Write("BOOOM. Você perdeu.\n\n");
fimJogo = true;
break;
default:
jogo[linha, coluna] = 2;
38 Algoritmos e programação II com C# Ma
te
ria
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ad
o 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
a 
Re
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.
Console.Write("Parabéns. Você ganhou!\n\n");
fimJogo = true;
break;
}
} while (!fimJogo);
A variável booleana fimJogo indica quando o usuário venceu ou per-
deu a partida, encerrando a interação. A interação ocorre dentro de uma 
estrutura de repetição do-while. Inicialmente, uma estrutura de dois for 
é utilizada para percorrer a matriz jogo, imprimindo todos os seus valo-
res. São impressas exatamente na disposição da matriz 10 linhas e 10 
colunas. Os valores –1 indicam posições ocultas, e os valores 0 indicam 
posições que o usuário escolheu e que estavam vazias. Em seguida, o 
usuário digita um valor de linha e um valor decoluna entre 1 e 10. Então, 
é realizado um teste na posição indicada, mas na matriz campo. Se nes-
sa posição o valor for 0, a matriz jogo, nessa mesma posição, receberá 
o valor 0, e o laço se repetirá para o jogador continuar tentando. Se o 
valor for 1, o que indica a presença de bomba, será mostrada a men-
sagem de que o jogador perdeu, e a variável fimJogo receberá o valor 
true, fazendo com que o laço se encerre. Se o valor for 2, será exibida a 
mensagem de sucesso, e o laço também se encerrará.
IMPORTANTE 
Para percorrer uma matriz, utiliza-se um for dentro de outro. O for mais 
externo percorre as linhas da matriz, e o for mais interno, as colunas. Ao 
apontar para uma posição da matriz dentro do for interno, utilizam-se a 
variável de controle do for externo como indicação da linha e a variável 
de controle do for interno como indicação da coluna.
 
39Estrutura de dados bidimensional (matriz)
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
A figura 3 indica um trecho de interação com o jogo desenvolvido.
Figura 3 – Interação com o campo minado
Com essa demonstração, percebemos como utilizar matrizes em 
jogos que possuem tabuleiros ou dimensões e como empregá-las na 
implementação, tanto para a escrita de valores quanto para a leitura.
Agora, propomos que você altere e personalize esse jogo. Como su-
gestão, você pode incluir um contador de jogadas – se o jogador exceder 
o seu limite, perderá. Além disso, você pode definir o tamanho da matriz e 
a quantidade de bombas como variáveis escolhidas pelo jogador.
3 Utilização de funções com matrizes
Assim como os vetores, as matrizes também podem ser usadas 
como argumentos de funções. Vamos conferir um possível cenário 
para esse uso em uma implementação do jogo da velha.
A seguir, o código inicial do jogo:
40 Algoritmos e programação II com C# Ma
te
ria
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ad
o 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
a 
Re
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.
char[,] tabuleiro = new char[3, 3];
int linha;
int coluna;
bool fimJogo = false;
int jogador = 1;
int jogada = 0;
//preenchimento da matriz com espaços em branco
for (int l = 0; l < 3; l++)
for (int c = 0; c < 3; c++)
tabuleiro[l, c] = ' ';
do
{
//impressão do tabuleiro atual
imprimirTabuleiro(tabuleiro);
if (jogador == 1)
Console.Write("JOGADOR 1:\n");
else
Console.Write("JOGADOR 2:\n");
Console.Write("Selecione uma linha [1-3]: ");
linha = Convert.ToInt32(Console.ReadLine()) - 1;
Console.Write("Selecione uma coluna [1-3]: ");
coluna = Convert.ToInt32(Console.ReadLine()) - 1;
jogada++;
 //chamada de função para verificar as consequências da 
//jogada realizada
fimJogo = conferirJogada(tabuleiro,linha,coluna,jogador,
jogada);
//troca de jogador
if (jogador == 1)
jogador = 2;
else
jogador = 1;
} while (!fimJogo);
41Estrutura de dados bidimensional (matriz)
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
Nesse código, é criada uma matriz chamada tabuleiro, de 3 x 3. As 
variáveis linha e coluna armazenam a posição escolhida pelo jogador; a 
variável fimJogo indica se a partida terminou (para sair do laço); a variável 
jogador informa se é a vez do jogador 1 ou do jogador 2; e a variável joga-
da comunica em qual jogada a partida está (são nove jogadas no total). 
Após a inicialização das variáveis, o tabuleiro é preenchido com es-
paços em branco em todas as posições. Em seguida, a execução en-
tra em um laço enquanto a variável fimJogo for false. Esse laço inicia 
chamando uma função para imprimir o tabuleiro, permitindo ao jogador 
visualizar seu estado atual. Em seguida, informa-se por mensagem qual 
jogador deve realizar a jogada. Os valores inseridos pelo jogador são 
armazenados nas variáveis linha e coluna. A contagem de jogadas é 
incrementada. É chamada a função conferirJogada, que possui como 
argumentos a matriz tabuleiro, o valor de linha e coluna da jogada atual, 
a indicação de qual jogador fez a jogada e em qual jogada a partida está. 
O retorno é um booleano que, quando true, indica que o jogo acabou. 
Após o retorno da função, a indicação do jogador é alternada; enquanto 
o resultado dessa função não for true, o laço se repetirá, agora para o 
outro jogador.
Percebemos o uso de duas funções, o que leva o código a ter mais 
clareza quanto às etapas da lógica do algoritmo, permitindo criar fun-
ções a serem reutilizadas em várias partes do programa. Confira, a se-
guir, a função imprimirTabuleiro:
static void imprimirTabuleiro(char[,] tabuleiro)
{
for (int l = 0; l < 3; l++)
{
for (int c = 0; c < 3; c++)
{
 Console.Write(string.Format("{0}", 
tabuleiro[l, c]));
if (c < 2)
Console.Write("|");
42 Algoritmos e programação II com C# Ma
te
ria
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ad
o 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
a 
Re
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.
}
Console.Write(Environment.NewLine);
if (l < 2)
Console.Write("-----");
Console.Write(Environment.NewLine);
}
}
Essa função recebe como argumento a matriz tabuleiro. Todas as 
suas posições serão percorridas conforme demonstrado na seção an-
terior. Nesse trecho, o valor máximo foi fixado em 3 porque esse é o 
tamanho padrão de um tabuleiro de jogo da velha. Para cada posição, é 
impresso seu valor; com exceção da última posição da linha, é impresso 
também o caractere “|” para criar uma representação visual de separa-
ção horizontal entre os elementos, similar à do tabuleiro real. Após cada 
linha, exceto a última, é impressa uma sequência do caractere “–” para 
representar a separação vertical dos elementos do tabuleiro.
Essa função não realiza alterações sobre a matriz recebida, mas a 
próxima função, conferirJogada, efetua alteração na matriz que é re-
cebida como argumento. Essa matriz é passada por referência, assim 
como ocorre para os vetores; portanto, as alterações que forem rea-
lizadas nessa matriz dentro da função se refletirão na matriz original. 
Porém, é exatamente isso que queremos neste caso, como observado 
a seguir:
static bool conferirJogada(char[,] tabuleiro, int linha, int 
coluna, int jogador, int jogada)
{
bool trinca = false;
if (jogador == 1)
tabuleiro[linha, coluna] = 'X';
else
tabuleiro[linha, coluna] = 'O';
//verificar na mesma linha
for (int c = 0; c < 3; c++)
43Estrutura de dados bidimensional (matriz)
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
{
if (tabuleiro[linha, c] != tabuleiro[linha, coluna])
break;
if (c == 2)
trinca = true;
}
//verificar na mesma coluna
if (!trinca)
{
for (int l = 0; l < 3; l++)
{
 if (tabuleiro[l, coluna] != tabuleiro[linha, 
coluna])
break;
if (l == 2)
trinca = true;
}
}
//verificar na diagonal principal
if (!trinca)
{
if (linha == coluna)
{
for (int cont = 0; cont < 3; cont++)
{
 if (tabuleiro[cont, cont] != tabuleiro[linha, 
coluna])
break;
if (cont == 2)
trinca = true;
}
}
}
//verificar na diagonal secundária
if (!trinca)
{
if (linha + coluna == 3 - 1)
{
for (int cont = 0; cont< 3; cont++)
{
44 Algoritmos e programação II com C# Ma
te
ria
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ad
o 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
a 
Re
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.
 if (tabuleiro[cont, 3-cont-1] != 
tabuleiro[linha, coluna])
break;
if (cont == 2)
trinca = true;
}
}
}
if (trinca)
{
Console.WriteLine();
imprimirTabuleiro(tabuleiro);
Console.Write("JOGADOR "+jogador+" VENCEU!\n\n");
return true;
}
if (jogada == 9)
{
Console.WriteLine();
imprimirTabuleiro(tabuleiro);
Console.Write("EMPATE!\n\n");
return true;
}
else
{
Console.Write("\nPRÓXIMO JOGADOR...\n\n");
return false;
}
}
A variável trinca indica se uma sequência de três valores iguais foi 
formada na horizontal, vertical ou diagonal. De início, os valores dos ar-
gumentos de linha e coluna são marcados na matriz tabuleiro com X, 
caso o argumento jogador seja 1, ou O, caso o jogador seja 2. Esse é 
o ponto em que a função altera a matriz tabuleiro por passagem por 
referência. Essa alteração se reflete na matriz original que foi passada 
como argumento para essa função, de forma semelhante ao que ocorre 
com os vetores.
45Estrutura de dados bidimensional (matriz)
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
Em seguida, são realizadas quatro verificações para detectar se a 
última marcação na matriz formou uma trinca. Primeiro, é verificada a 
linha da posição marcada. São percorridos os índices de 0 a 2. Nessa 
verificação, apenas o índice da coluna será alterado, uma vez que a li-
nha se mantém. Caso seja encontrado nessa linha um valor diferente 
do recém-preenchido na última posição marcada, a linha não é uma 
trinca; portanto, o comando break encerra essa verificação, saindo ime-
diatamente do for e mantendo a variável trinca com o valor false. Caso 
a verificação alcance a última posição, e não tenha entrado no primeiro 
if, todos os elementos dessa linha são iguais; portanto, a variável trinca 
recebe o valor true. Caso essa primeira verificação seja falsa, são reali-
zadas outras três, somente enquanto o valor de trinca for false. 
A segunda verificação ocorre na coluna da posição marcada, de for-
ma análoga à primeira verificação por linha; a terceira verificação ocorre 
na diagonal principal da matriz. Como nem todas as posições estão na 
diagonal, é preciso identificar se a posição marcada se encontra nessa 
diagonal; para isso, é verificado se o valor de linha é igual ao valor de 
coluna. Caso os valores sejam iguais, é realizada uma verificação simi-
lar às anteriores. A diferença dessa verificação na diagonal em relação 
às anteriores, por linha ou coluna, é que, em vez de fixar uma linha ou 
uma coluna, ambos os índices variam a cada verificação. Por fim, ocor-
re a verificação na diagonal secundária. Para entrar nessa condição, a 
posição marcada precisa corresponder a um valor de soma da linha 
e da coluna igual ao tamanho da matriz menos um. A verificação das 
posições ocorre de forma incremental para a linha e decremental, na 
mesma proporção, para a coluna. 
Encerrando-se as verificações, caso o valor da trinca seja true, é cha-
mada a função imprimirTabuleiro para mostrar a disposição final das 
marcações, junto com a mensagem indicativa de qual jogador venceu. 
O retorno como true fará com que, no ponto original de chamada dessa 
função, encerre-se o laço de repetição, finalizando o jogo.
46 Algoritmos e programação II com C# Ma
te
ria
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ad
o 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
a 
Re
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.
Caso não tenha se formado uma trinca, mas a jogada seja a final 
(de número nove), também são impressos o tabuleiro atualizado e uma 
mensagem declarando empate. Caso contrário, o jogo continua retor-
nando false, permitindo a repetição do laço. 
A figura 4 indica um trecho de interação com o jogo desenvolvido.
Figura 4 – Interação com o jogo da velha
Após implementar e compreender bem esse código, você pode prati-
car seu entendimento sobre matrizes realizando otimizações nele. Uma 
sugestão é mostrar uma mensagem de erro quando o jogador escolher 
uma posição já marcada anteriormente, permitindo que ele tente es-
colher outra posição. Outra sugestão é otimizar o término da partida, 
de modo que, se não houver mais possibilidade de vitória de nenhum 
jogador, o jogo imediatamente declare empate, eliminando a necessida-
de de preencher todas as posições do tabuleiro. Por fim, observe como 
são realizadas quatro verificações dentro da função conferirJogada 
47Estrutura de dados bidimensional (matriz)
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
para identificar se foi formada uma trinca. Repare como as quatro lógi-
cas são semelhantes. Tente criar uma nova função que, de acordo com 
os argumentos que receber, realize a verificação desejada. Utilize essa 
nova função quatro vezes dentro da função conferirJogada.
Considerações finais
Matrizes são estruturas muito úteis para o armazenamento de da-
dos que dependem de posições bidimensionais; além disso, elas podem 
ter grande aplicação em jogos de tabuleiro.
Essas estruturas são similares aos vetores e compartilham com eles 
diversas regras de uso: a forma como são feitas suas declarações é 
muito semelhante; suas posições somente podem armazenar um tipo 
de dado; os índices (que começam em zero) devem ser apontados para 
acessar uma posição da estrutura; uma forma fácil de percorrer todas 
as suas posições é por meio do for (no caso das matrizes, dois for: um 
para as colunas e um para as linhas).
Siga as sugestões ao final das seções e tente implementar as me-
lhorias indicadas nos jogos. Depois, escolha um jogo de tabuleiro e 
tente implementá-lo você mesmo, utilizando uma matriz. O exercí-
cio com matrizes é fundamental para desenvolver o domínio sobre 
o uso dessas estruturas, o que ajudará muito em sua evolução como 
programador.
Referência
DEITEL, Harvey M. et al. C#: como programar. São Paulo: Pearson Universidades, 
2003.
49
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
Capítulo 3
Manipulação de 
arquivos em CSharp
Um aspecto importante no desenvolvimento de qualquer aplicação é 
a implementação de um recurso para a persistência de dados, ou seja, 
a capacidade de o programa salvar e recuperar dados ao ser reinicia-
do. Esse recurso é muito útil para o desenvolvimento de um jogo, pois 
permite a adição de opções de configuração para os jogadores e para 
as partidas, possibilitando salvar preferências e resultados, criando um 
histórico de interação e promovendo maior dinamismo.
O ideal, para aplicações mais sofisticadas, é o uso de um banco de 
dados para o armazenamento de informações, porém, para aplicações 
mais simples ou mesmo com poucos dados gerados, você pode utilizar 
50 Algoritmos e programação II com C# Ma
te
ria
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ad
o 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
aRe
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.
arquivos para reter os dados gerados pelo programa. Essa é uma abor-
dagem simples, fácil e ideal em seu primeiro contato com alguma for-
ma de persistência de dados.
Neste capítulo, apresentaremos exemplos de implementação dos 
recursos de leitura e escrita no código do jogo do campo minado de-
senvolvido no capítulo anterior. Dessa forma, você aprenderá a editar e 
introduzir essa funcionalidade em qualquer programa.
A utilização de arquivos é um recurso simples que trará uma dinâmi-
ca mais atrativa ao seu jogo. Procure adicionar esse importante recurso 
ao desenvolvimento de seus jogos para transmitir maior qualidade aos 
projetos.
1 Utilização de arquivos em CSharp
A utilização de arquivos por programas remete ao uso de documen-
tos simples, criados e armazenados no diretório de pastas do sistema 
operacional. Esses arquivos são utilizados como uma forma simples 
e eficiente de armazenar alguns dados da aplicação, permitindo que o 
programa seja encerrado sem perdê-los e, quando reiniciado, recorra à 
leitura do arquivo para restaurar os dados salvos na aplicação.
Em um jogo, a utilização desse recurso pode ser essencial para imple-
mentar funcionalidades que necessitem da gravação de dados, como a 
definição de checkpoints, os itens que o jogador possui no momento em 
que salvou o jogo, rankings e scores obtidos em partidas, etc. Neste capí-
tulo, implementaremos o salvamento e a leitura do histórico de vitórias e 
derrotas de um jogador no campo minado, além do carregamento de um 
campo especificado no arquivo de texto. Após compreender como imple-
mentar esse procedimento, você poderá empregar o mesmo recurso em 
outros aspectos desse e de outros jogos.
51Manipulação de arquivos em CSharp
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
Antes de iniciar a criação do arquivo e do código, é importante com-
preender o procedimento empregado por trás dessa ação. O processo 
de leitura ou escrita em um arquivo estabelece um fluxo entre o progra-
ma e o arquivo, de forma que o arquivo fica inacessível a outras solici-
tações enquanto é manipulado pelo programa. Isso é feito para evitar 
inconsistências causadas pela alteração de dados por duas fontes dis-
tintas, simultaneamente.
Por isso, um procedimento comum é estabelecer o fluxo, realizar as 
manipulações desejadas e fechar o fluxo, liberando o arquivo para ou-
tros acessos e desalocando o uso de memória. Adotamos essas etapas 
tanto para o processo de leitura quanto para o processo de escrita. Os 
códigos que veremos neste capítulo oferecerão um exemplo da imple-
mentação desses passos na gravação e no carregamento de dados.
PARA SABER MAIS 
Embora estejamos aprendendo a usar arquivos para a persistência de 
dados de um jogo digital, essa implementação é aplicável a qualquer 
tipo de software. Podemos utilizar arquivos para salvar dados de usu-
ários de um cadastro de clientes ou os produtos e as quantidades de 
um registro de estoque.
 
O primeiro passo para trabalhar com a leitura de dados por um pro-
grama é criar um arquivo que será acessado por ele. Para o projeto que 
desenvolveremos neste capítulo, devemos criar um arquivo de texto 
(extensão txt) com o nome “campo”.
O segundo passo é definir onde salvar esse arquivo. É interessante 
que ele esteja junto à pasta do projeto que o utiliza. Caso você utilize 
o Visual Studio para os estudos, recomenda-se colocar esse arquivo 
na pasta principal do projeto, junto ao arquivo de extensão sln. Veja na 
figura 1 onde foi salvo o arquivo mencionado.
52 Algoritmos e programação II com C# Ma
te
ria
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ad
o 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
a 
Re
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.
Figura 1 – Localização do arquivo campo.txt
PARA SABER MAIS 
O Visual Studio é apenas uma sugestão usada para exemplificar o con-
teúdo deste capítulo, mas você pode utilizar o ambiente de desenvolvi-
mento em que se sentir mais confortável para programar, como o Replit 
ou o .NET Fiddle, entre outros.
 
Perceba que o caminho pode ser diferente em seu computador, de-
pendendo de como instalou o Visual Studio e do destino que definiu 
para salvar os projetos criados. Em nosso exemplo, o local de salva-
mento dos projetos foi definido dentro da pasta repos, que está dentro 
da pasta source, a qual, por sua vez, está dentro da pasta do usuário 
Rafael.
Após posicionar o arquivo no local desejado, é importante definir 
os conceitos de caminho absoluto e caminho relativo. No código que 
implementaremos a seguir, teremos que indicar onde se encontra o ar-
quivo que desejamos acessar; para isso, devemos apontar o caminho 
até ele utilizando uma das duas formas mencionadas.
 O caminho absoluto corresponde à indicação de sequência de pas-
tas, desde a raiz do disco rígido até a pasta em que se encontra o ar-
quivo desejado (incluindo o nome do arquivo e sua extensão).
Portanto, o caminho absoluto para o arquivo posicionado, de acordo 
com a figura 1, é:
53Manipulação de arquivos em CSharp
M
aterial para uso exclusivo de aluno m
atriculado em
 curso de Educação a Distância da Rede Senac EAD, da disciplina correspondente. Proibida a reprodução e o com
partilham
ento digital, sob as penas da Lei. ©
 Editora Senac São Paulo.
C:\Users\Rafael\source\repos\Capitulo3\campo.txt
Contudo, ao utilizar esse caminho no código, é preciso duplicar as 
barras para evitar que a linguagem interprete que deve executar algum 
comando no meio da string que armazena o caminho, já que esses co-
mandos iniciam com o sinal de barra invertida (\).
IMPORTANTE 
Ao programar para o ambiente do Windows e indicar um caminho de 
arquivo salvo em uma string, temos que duplicar as barras dos diretó-
rios. Para o exemplo deste subcapítulo, o caminho ficaria:
C:\\Users\\Rafael\\source\\repos\\Capitulo3\\campo.txt
 
Outra forma de indicar o arquivo é apontar o caminho relativo. Para 
isso, toma-se como referência o diretório que executa o projeto. No 
caso do Visual Studio, esse diretório é a pasta netcoreapp2.1. A figura 2 
indica sua localização, quatro níveis abaixo da pasta Capitulo3, indicada 
anteriormente, que é onde o arquivo campo.txt se encontra.
Figura 2 – Localização da pasta de referência dos projetos do Visual Studio
Portanto, para apontar para o arquivo campo.txt usando um caminho 
relativo, é necessário retornar quatro níveis. Na construção da string do 
54 Algoritmos e programação II com C# Ma
te
ria
l p
ar
a 
us
o 
ex
cl
us
ivo
 d
e 
al
un
o 
m
at
ric
ul
ad
o 
em
 c
ur
so
 d
e 
Ed
uc
aç
ão
 a
 D
is
tâ
nc
ia
 d
a 
Re
de
 S
en
ac
 E
AD
, d
a 
di
sc
ip
lin
a 
co
rre
sp
on
de
nt
e.
 P
ro
ib
id
a 
a 
re
pr
od
uç
ão
 e
 o
 c
om
pa
rti
lh
am
en
to
 d
ig
ita
l, s
ob
 a
s 
pe
na
s 
da
 L
ei
. ©
 E
di
to
ra
 S
en
ac
 S
ão
 P
au
lo
.caminho, uma forma de indicar a volta de um nível de pasta é utilizar 
dois pontos (..). Assim, é necessário realizar esse procedimento qua-
tro vezes para indicar o percurso da pasta netcoreapp2.1 até a pasta 
Capitulo3, onde se encontra o arquivo. O caminho relativo, portanto, é:
..\..\..\..\campo.txt
Assim como no caminho absoluto, ao criar a string com esse cami-
nho, é necessário duplicar as barras. Portanto, em código, o caminho 
relativo é:
..\\..\\..\\..\\campo.txt
IMPORTANTE 
Preste atenção

Outros materiais

Outros materiais