Em algumas aplicações podemos ter uma quantidade muito grande de dados do mesmo tipo para processar, e criar uma variável para cada dado seria muito complicado.
Em algumas aplicações temos sequências de algum tipo e o programa precisa funcionar para qualquer sequência, independente dos valores nela ou do tamanho da sequência.
Imagine que você precisa fazer um programa para calcular as médias finais dos alunos de APC.
Para cada aluno, você deve ler as notas de 3 provas. Deve então e calcular e mostrar a média de cada um.
Com o que aprendemos até agora, é possível resolver esse problema. No entanto, você precisaria de: 40 x 3 provas = 120 variáveis!!
E se fosse um programa para calcular as médias da UnB inteira?
E se você precisar adicionar uma nota? Ou fazer qualquer alteração no cálculo?
Para essas situações usamos vetores (também chamados arrays).
Vetores são sequências ordenadas e indexáveis de um mesmo tipo (int, float, double, char, … )
Vetores possuem:
int array[100]; // vetor “array” de tipo int com tamanho 100 float nums[] = {3.14, 2.71, 1.44, 9.98}; // vetor “nums” de tipo float inicializado
Vetores podem ser inicializados na declaração, e somente nesse caso não é necessário indicar o tamanho
int array[3] = {1, 4 ,-8}
Vetores são indexados de 0 até n-1, ou seja, a primeira posição do vetor se encontra no índice 0.
índice: 0 1 2 valor: [1] [4] [-8]
Os valores de um vetor podem ser acessados em tempo constante, para isso, basta indicar qual posição deseja acessar.
int array[3] = {1, 4 ,-8} int a,b,c,x = 2; a = array[0]; // a = 1 b = array[1]; // b = 4 c = array[x]; // c = -8
Deve-se atentar bastante para não acessar um índice que não existe. O acesso de um vetor por um índice inválido causa um erro chamado Segmentation Fault.
Índices negatios (-1, -2 … ) ou maiores ou iguais ao tamanho do vetor (n , n+1 …) causam falha de segmentação.
int n = 31230; int array[3] = {1, 4 ,-8}; printf("%d\n",array[n]); // Irá ocorrer falha de segmentaçãoDownload Code Code Execution
Executando o programa no terminal
$ gcc -Wall -ansi -o segfault segfault.c $ ./segfault Segmentation fault (core dumped) $
Exemplos:
int main(){ int a[3] = {1, 4, -8}; int b[3], i; for(i = 0; i < 3; i++){ b[i] = a[i] * 2; } return 0; }Download Code Code Execution
Apos vários jantares a Luz de Veras, permitiu que Veras tivesse uma idéia que possibilitasse esquentar o clima entre duas turmas de programação, visando o aumento do rendimento das notas dos alunos. Ambas as turmas possuem N alunos, e cada aluno tirou uma nota Xi na prova (Xi representa a nota do iésimo aluno). A disputa seria feita da seguinte forma: se o aluno i da turma A, tirou uma nota maior que o aluno i da turma B, então a turma A ganha um ponto, caso contrário a turma B ganha 1 ponto. Sua tarefa é ajudar Veras a descobrir quantos pontos cada turma fez, sabendo que ambas as turmas possuem a mesma quantidade de alunos.
int n,i, resp = 0; scanf("%d", &n); double turmaA[n], turmaB[n]; for(i = 0; i < n; i++) scanf("%lf", &turmaA[i]); for(i = 0; i < n; i++) scanf("%lf", &turmaB[i]); for(i = 0; i < n; i++){ if(turmaA[i] > turmaB[i]){ resp++; } } printf("A turma A possui %d pontos\n",resp); printf("A turma B possui %d pontos\n",n-resp);Download Code
/* returns the max between two numbers */ int Max(int a, int b){ return a > b ? a : b; } /* returns the biggest element in array */ int maxElement(int* array, int n){ int i; int max = array[0]; for(i = 1; i < n; i++){ max = Max(array[i], max); } return max; } int main(){ int array[] = {0, -1, 3, -10, 4, 22, -5, 2}; int maior = maxElement(array, 8); printf("O maior elemento é %d\n", maior); }Download Code Code Execution
int Max(int* array, int n); /* cabeçalho 1 */ int Max(int array[], int n); /* cabeçalho 2 */
Substituição em Vetor I | Preenchimento de Vetor I | Seleçao em Vetor I |
Troca em Vetor I | Fibonacci em Vetor | Preenchimento de Vetor II |
Preenchimento de Vetor III | Preenchimento de Vetor IV | Menor e Posição |
int k = 100; /* future size of array */ int* array = (int*) malloc(k * sizeof(int)); /* sizeof(int) returns size of int in bytes*/ memset(array, 0, sizeof(array)); free(array); /* array doesn't existe any more */