Arrays - Vetores I

O que são arrays?

Uma array (fala-se "arrei"), também conhecida como "arranjo" é uma estrutura que armazena dentro de si vários tipos de dados, como por exemplo, um grupo de variáveis de um mesmo tipo.

Quando você está lidando com algum programa que lhe exija um número demasiado de variáveis (por exemplo) você normalmente vai utilizar uma array para suprir essa tarefa, e não diversas variáveis.

Tipos de arrays:

Existem muitos tipos de arrays. Todos elas são definidas pela sua dimensão.
Trarei nessas aulas apenas dois tipos de arrays: Unidimensionais (que contém apenas uma dimensão), também conhecidas como "vetores", e as arrays bidimensionais (com duas dimensões) que são chamadas de matrizes ou vetores de vetores, sendo a última melhor abordada na próxima aula.
Nessa aula iremos tratar do assunto sobre vetores, portanto tudo o que for explicado a partir daqui será direcionado às arrays unidimensionais, que constantemente chamarei de vetor.

Onde utilizar o vetor?

Vamos imaginar a seguinte situação: Um professor precisa calcular as médias semestrais de 30 alunos de sua sala com base da nota de 2 provas que eles fizeram.
Para tal, ele necessitará de um programa que solicite os nomes dos alunos, suas notas nas provas, e ao final do recebimento dessas informações, o programa exibará ao professor a média dos alunos e seus respectivos nomes.
Como iremos exibir as médias e os nomes ao final do código, nós iremos precisar de 30 variáveis do tipo float para armazenamos as 30 médias dos alunos, e mais 30 variáveis de string para armazenar os nomes deles.
Sem a utilização de um vetor, o que teríamos inicialmente seria esta situação:



Perceba que já temos aqui um código relativamente grande e repetitivo, sem dizer que só trabalhamos com apenas dois alunos neste exemplo, imagine se tivesse sido colocado de fato os trinta alunos? Dá para imaginar a quantidade de linhas que esse programa teria, não é mesmo?

Para acabarmos com este problema, o mais correto (e sensato) seria utilizarmos aqui dois vetores: Um para armazenar as 30 médias dos alunos e um outro para armazenar os seus nomes, dessa forma o código ficaria mais compacto e consequentemente utilizaríamos bem menos variáveis, também tornaria seu trabalho mais fácil e produtivo e o código ficaria mais ''bonito'' e leve.

Conte-me mais sobre os vetores...

Depois de perceber o quanto a utilização de vetores em seus códigos pode ser vantajoso, creio que tenha ficado com curiosidade em saber como eles funcionam.

Como já dito, o vetor pode conter vários objetos dentro de si, como um agrupamento de variáveis de um mesmo tipo, ou seja, pode armazenar os 30 nomes necessários.
Graficamente falando, se fosse possível visualizar um vetor, ele seria assim:



Perceba que este é um vetor de strings, que irá comportar variáveis do tipo "texto", para os nomes dos alunos.
Esse vetor nomeado de "nomes", contém 4 espaços, onde cada um deles irá "guardar" algum valor que você deseje, por exemplo:

Perceba que agora o vetor possui 4 elementos inseridos dentro dele, as strings "João", "Maria", "Pedro" e "Taís".

Você pode criar um vetor em seu console de aplicações com a seguinte sintaxe:

string[] nomes = new string[4];

Onde "string[]" define o tipo do seu vetor (que no caso seria de string), e os colchetes sugerem que está se tratando de um vetor e não apenas de uma variável.
"nomes" é o nome do seu vetor, e está sendo atribuído a ele sua instância através da utilização da palavra reservada "new", que por fim, define o tamanho do seu vetor com "string[4];'', ou seja, que este vetor terá tamanho 4, comportará 4 elementos do tipo string, como no exemplo gráfico acima.

Quando você cria seu vetor como fizemos agora, graficamente ele seria como mostrado na primeira imagem de exemplo, ou seja, com suas colunas vazias.
Para inserir valores em seu vetor para que fique como na imagem 2, você simplesmente abre um par de chaves ao lado da instância do vetor e dentro delas colocará os elementos que deseja, separando-os por vírgulas:


Posições nos vetores:

Como os vetores possuem diversas informações dentro de si, às vezes fica difícil saber em qual "ambiente" do vetor está um determinado elemento, por isso suas colunas que armazenam os valores são chamadas de "posição do vetor" ou simplesmente "índice do vetor".
Os índices são numerados da seguinte forma:



Ou seja, podemos dizer que a string "João" está na posição 0 do vetor, bem como a string "Taís" se encontra na posição 3 do mesmo.
Em qualquer situação, o índice da posição de elementos do seu vetor iniciará em 0, portanto, se este vetor possui 4 elementos, seu último índice é 3 e não 4.
valor do último índice do vetor = tamanho do vetor - 1 tamanho deste vetor = 4 valor do último índice deste vetor = 4 - 1 valor do último índice deste vetor = 3 NÃO CONFUNDA ÍNDICE COM O TAMANHO DO VETOR!
O vetor apesar de possuir seu índice máximo até 3, possui ainda de fato 4 elementos, já que inicia do zero.

Por tanto, para "acessar" valores esporadicamente em seu vetor, basta informar seu nome seguido do índice que será acessado, por exemplo, trocar o elemento do índice 2 que contém a string "Pedro" e colocar "José".
Veja como isto é feito em C#:



using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string[] nomes = new string[4] {"João", "Maria", "Pedro", "Taís"}; nomes[2] = "José"; } } }

Em outras palavras, você também pode inicializar seu vetor dessa outra forma:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string[] nomes = new string[4]; nomes[0] = "João"; nomes[1] = "Maria"; nomes[2] = "Pedro"; nomes[3] = "Taís"; } } } 

Claro que da primeira forma mostrada fica mais compacto e simples, porém o acesso nos elementos do vetor pode ser feito para outros fins.

Dinamizando o código:

Agora que já sabe como criar, instanciar e armazenar valores no vetor, vamos colocar em prática o exemplo do início da aula, com relação às médias dos alunos.

Como vamos precisar armazenar os nomes e médias de 30 alunos, vamos criar dois vetores, um do tipo string para os nomes e o outro do tipo float para as médias, ambos com tamanho 30:


using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string[] nomesAlunos = new string[30]; float[] mediasAlunos = new float[30]; float nota1, nota2; } } } 

Também criamos duas variáveis do tipo "float" para armazenar as duas notas de cada aluno.

Agora precisamos perguntar 30 vezes o nome de cada aluno e suas notas, para só depois efetuarmos o cálculo da média:



Perceba que apesar de termos diminuído o número de variáveis, o código continua grande e repetitivo mesmo com a utilização de vetores, assim como estava no primeiro exemplo dessa aula, lembra-se?
Então agora está se perguntando... Qual a vantagem de usar o vetor além de diminuir o número de variáveis?

Imagine que podemos deixar esse código muito menor (muito mesmo) apenas utilizando o laço de repetição "for".
O laço vai servir para duas coisas no código: Primeiro para não termos que ficar escrevendo as mesmas linhas novamente (referentes ao Console.WriteLine e ReadLine)

Segundo: Ele vai trabalhar em conjunto com o vetor.
Veja bem, ao invés de colocar manualmente algo dentro de cada elemento do seu vetor, você pode utilizar o contador do laço como índice, ou seja, cada vez que ele recebe o incremento e aumentar em 1, consequentemente aumentará o índice do vetor em +1 também, veja só:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string[] nomesAlunos = new string[30]; float[] mediasAlunos = new float[30]; float nota1, nota2; for (int i = 0; i < 30; i++) { Console.WriteLine("Informe o nome do aluno(a)"); nomesAlunos[i] = Console.ReadLine(); } } } } 

Note que ao invés de utilizar "nomesAlunos[0]" ou algum outro índice pré determinado, eu utilizei o contador "i" como referência do índice neste vetor? "nomesAluno[i]", logo, este "i" está alternando seu valor constantemente de um em um, ou seja, num primeiro momento iniciará em 0, e colocarei o nome digitado pelo usuário dentro do índice 0 do vetor, quando ele receber o incremento estará igual a 1, portanto o próximo nome que o usuário digitar vai ficar armazenado no índice "1" do vetor, e assim sucessivamente.

Um código que antes se tornaria extenso e trabalhoso foi resumido em apenas poucas linhas, o que não poderia ser feito primariamente com as variáveis normais.

Faça a mesma coisa com o vetor que vai armazenar as médias dos alunos:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string[] nomesAlunos = new string[30]; float[] mediasAlunos = new float[30]; float nota1, nota2; for (int i = 0; i < 30; i++) { Console.WriteLine("Informe o nome do aluno(a)"); nomesAlunos[i] = Console.ReadLine(); Console.WriteLine("Informe a primeira nota de {0}", nomesAlunos[i]); nota1 = float.Parse(Console.ReadLine()); Console.WriteLine("Informe a segunda nota de {0}", nomesAlunos[i]); nota2 = float.Parse(Console.ReadLine()); mediasAlunos[i] = (nota1 + nota2) / 2; } } } } Agora para exibir todos os resultados dentro dos dois vetores (o conteúdo de ambos), basta utilizar outro laço que vai percorrer o vetor todo, até que todos os nomes e médias sejam exibidos:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string[] nomesAlunos = new string[30]; float[] mediasAlunos = new float[30]; float nota1, nota2; for (int i = 0; i < 30; i++) { Console.WriteLine("Informe o nome do aluno(a)"); nomesAlunos[i] = Console.ReadLine(); Console.WriteLine("Informe a primeira nota de {0}", nomesAlunos[i]); nota1 = float.Parse(Console.ReadLine()); Console.WriteLine("Informe a segunda nota de {0}", nomesAlunos[i]); nota2 = float.Parse(Console.ReadLine()); mediasAlunos[i] = (nota1 + nota2) / 2; } for (int j = 0; j < 30; j++) { Console.WriteLine("O aluno {0} teve média de: {1}", nomesAlunos[j], mediasAlunos[j]); Console.ReadKey(); } } } }

Na execução do código (trocando 30 alunos para 5, para exemplificar melhor) teremos algo assim:



Agora viu como utilizar vetores para um código como esse economiza linhas de código, tempo, trabalho e variáveis?
Imagine ter de fazer a mesma tarefa para uma escola então (com cerca de 4000 alunos) sem o uso de vetores, apenas com as variáveis? Não gosto nem de saber...

Final desta aula:

A introdução sobre os vetores termina por aqui, na próxima aula abordaremos mais alguns elementos importantes sobre este tipo de estrutura e falaremos um pouco sobre matrizes também, então até lá e bons estudos!

Comentários