Você está na página 1de 30

Vetores (Arrays)

Algoritmos e Programação II – Turma 02D


2º semestre de 2023

Prof. André Kishimoto


Prof. Gustavo Scalabrini Sampaio
Prof. Leandro Carlos Fernandes

(Conteúdo adaptado do material elaborado e gentilmente cedido pela


profa. Ana Grasielle Dionisio Correa e prof. Tomaz Mikio Sasaki)
Variáveis Compostas Homogêneas

• Interpretada como um conjunto (coleção) de valores de um


mesmo tipo. Podem ser
• Unidimensionais (Vetores)
• Multidimensionais (Matrizes)
• Requerem novos conceitos para serem manipuladas
Vetores

• Também conhecido como arrays ou, ainda, arranjos.


• Tipo de dado usado para representar uma coleção de variáveis
de um mesmo tipo.
• Cada variável dentro dessa coleção é chamada de elemento do vetor.
• Estrutura de dados homogênea e unidimensional.
Vetores

Cada elemento do vetor é identificado por um índice.


• Número que indica a posição do elemento dentro vetor.
• Usado para acessar (ou alterar) o conteúdo armazenado na
memória por cada elemento (como uma variável simples).
• Em C, o índice começa em zero.
• Isto é, o primeiro elemento do vetor tem índice zero.
Vetores

Vetores em C possuem:
• Nome
Segue regras de nomenclatura de variáveis/identificadores.
• Tipo
Qual é o tipo de dado armazenado pelo vetor.
• Tamanho
Quantos elementos (dados) podem ser armazenados na memória.
Vetores

Sintaxe em C:
tipo nome_do_vetor[tamanho];

• O que diferencia a declaração de um vetor de qualquer outra variável é a


parte que acompanha seu nome, isto é, o par de colchetes [ ].
• tamanho representa o número de elementos (capacidade do vetor).
• O índice do vetor varia de 0 a (tamanho - 1).
Vetores

• As variáveis compostas são alocadas sequencialmente na


memória, onde o endereço mais baixo corresponde ao primeiro
elemento (índice 0) do vetor.

• Os elementos do vetor são guardados em sequência contínua na


memória, ou seja, um seguido do outro (diferente de variáveis
separadas).
Variáveis [simples] x Variáveis Compostas

(Neste exemplo, estamos assumindo que uma variável ocupa 1 byte de memória no
computador...)
• Uma variável simples possui um endereço único.
• Armazena somente um dado por vez.
Variáveis [simples] x Variáveis Compostas

(Neste exemplo, estamos assumindo que cada elemento do vetor ocupa 1 byte de memória no
computador...)
• Uma variável composta armazena N valores sequencialmente na
memória (N = quantidade de elementos do vetor).
• Exemplo: vetor com 6 elementos (“vetor de tamanho 6”).
Vetores

Dado um índice i de um vetor, o computador busca o conteúdo da


memória no endereço E[i] = E[0] + i
• i é o índice do elemento a ser acessado
• E[i] é o endereço do elemento de índice i
• E[0] é o endereço do primeiro elemento
Vetores

(Neste exemplo, estamos assumindo que cada elemento do vetor ocupa 1 byte de memória)
Ler a nota de 3 alunos de uma disciplina e
calcular a média.

Exemplo 1
Exemplo SEM uso de
vetores

12
Ler a nota de 3 alunos de uma disciplina e
calcular a média.

Exemplo 2
Exemplo COM uso de
vetores

13
A inicialização dos valores atribuídos aos
elementos de um vetor pode ser feita no
momento da sua declaração:

Exemplo 3
Inicialização

14
Observe que não precisamos explicitar o
tamanho do vetor quando declaramos e
iniciamos o vetor com valores (o compilador faz
isso pra gente):

Exemplo 4
Inicialização

15
Vetores

• Em linguagem C, não existe declaração de vetor dinâmico (*).


• Isto é, o tamanho do vetor deve ser definido em tempo de compilação, e
não em tempo de execução.
• O valor que dimensiona o vetor deve ser um número literal inteiro.
• Um literal inteiro (ex. 5) ou uma macro (ex. #define TAMANHO (5)), que é convertida
para um literal inteiro pelo pré-processador.

(*) Considerando que um vetor dinâmico é algo diferente de um vetor alocado


dinamicamente (assunto futuro do curso) e diferente de VLA (Variable Length Array, vetor
de tamanho variável).
Dependendo da versão da linguagem C e do compilador usado, VLA pode ser opcional ou
obrigatório (C99 VLA: obrigatório, C11: opcional, C23: obrigatório) (ver próximos slides).
Exemplo 5
VLA

17
Se esse código vai compilar ou não,
depende da versão da linguagem C e
do compilador...

Exemplo 5 (1)
(2)
VLA

(3)

18

(1) Código compilado sem problemas.


(2) VLA tratado como warning (-Wvla) (compilação OK).
(3) VLA tratado como erro (-Werror=vla) (erro de compilação).
Exemplo 6
• Como faríamos se não
conhecêssemos de
antemão quantos itens
entrariam no vetor?

• O exemplo a seguir aceita


até 50 notas e pode ser
facilmente modificado para
aceitar qualquer número
de notas, desde que
TAMANHO <= 50.

19
Vetores

• Em linguagem C, não há sistema que avise quando o limite de um vetor foi


excedido, ou seja, se transpusermos o fim do vetor durante uma operação
de atribuição, os valores sobressalentes irão se sobrepor a outros dados da
memória, armazenados em sequência.

• Como não foi reservado espaço para guardar novos valores do vetor, esses
dados irão se sobrepor a outras variáveis na memória.
• Provavelmente ocorrerá um erro durante a execução do programa!

• Providenciar a verificação do limite do vetor é responsabilidade do


programador. A solução é não permitir que o usuário digite dados acima do
limite em elementos do vetor.
Exemplo 7

No programa anterior (exemplo 6)...

21
Vetores

Calculando o tamanho de um vetor


• A função sizeof(var) retorna o tamanho alocado na memória para uma
variável var.
• Ou seja, essa função sozinha não retorna quantos elementos cabem no vetor e sim a
quantidade de bytes que a variável ocupa.
• Para calcular o tamanho do vetor, fazemos a divisão de sizeof(var)
por sizeof(tipo_var).
• Se var é um vetor de inteiros, saber quantos bytes ocupa um inteiro fará
com que o resultado da divisão seja a quantidade de elementos do vetor.
• Portanto, tamanho do vetor de inteiros = sizeof(var) / sizeof(int)
Exemplo 8
Calculando o tamanho
de um vetor

23
Vetores e Funções

• Podemos criar funções que recebem vetores como parâmetro.


• Porém, precisamos ter em mente uma particularidade da
linguagem C:
Quando um vetor é passado como parâmetro de uma função, o
vetor perde a sua dimensão e se torna um ponteiro (“array to
pointer decay”).
Vetores e Funções

• O que a função recebe como parâmetro, na verdade, é o


endereço de memória do primeiro elemento do vetor
(&vetor[0]).
• A informação de quantos blocos da memória são ocupados pelo vetor é
perdida!
• Com isso, não conseguimos calcular o tamanho do vetor que foi
passado como parâmetro da função, já que sizeof(vetor)
retornará o tamanho de um ponteiro.
• Como resolver essa limitação? Passamos um parâmetro adicional
com a informação do tamanho do vetor!
Vetores e Funções

• Outro ponto importante quando passamos um vetor para uma


função é que a passagem de parâmetro não é por valor.
• Ou seja, não há uma cópia local do vetor dentro da função.
• A passagem de parâmetro é feita por ponteiro (assunto futuro).
• Por conta disso, qualquer alteração do conteúdo do vetor feita
dentro da função é refletida na variável original (a que foi
passada como parâmetro da função).
• Isso acontece porque a função recebe o endereço de memória do
primeiro elemento do vetor – logo, a função acessa/modifica
diretamente a memória do vetor.
Exemplo 9
sizeof() “incorreto”
dentro da função

27
Exemplo 10
Função que recebe vetor e
parâmetro adicional
contendo tamanho do vetor

28
MENOTTI, D.; OLIVEIRA, L. CI-1002: Programação 2. Disponível em: <
https://wiki.inf.ufpr.br/maziero/doku.php?id=prog2:start>. Acesso em: 03 de
janeiro de 2023.

Referências DEITEL, P.; DEITEL, H. C: Como programar. 6ª edição. Editora Pearson,


2011. (disponível na Biblioteca Virtual Pearson)

KISHIMOTO, A. Programação de computadores: desenvolvimento de


jogos digitais com GameMaker: Studio. 1ª edição. Edição do autor, 2016.

29

Você também pode gostar