arranjosnca.ufma.br/~geraldo/lp/3.1_vetores_matrizes.pdf · 2017-04-16 · uma coleção de...
TRANSCRIPT
Introdução • Um ARRANJO ( VETOR, MATRIZ ou STRING) é
uma coleção de variáveis do mesmo tipo que é referenciada por um nome comum.
• Um elemento específico em um ARRANJO é acessado por meio de um ÍNDICE.
• VETORES e STRINGS são ARRANJOS unidimensionais. Isto é, necessita-se apenas um ÍNDICE para acessar um elemento.
2
Introdução • MATRIZES são ARRANJOS multidimensionais. Ou
seja, dois ou mais ÍNDICES são necessários para acessar um elemento de uma MATRIZ.
• Em C, ARRAJOS são armazenados em posições de memória contíguas. O endereço mais baixo corresponde ao primeiro elemento e mais alto, ao último elemento.
3
Introdução • Todo vetor ou matriz são ponteiros de memória • Eles determinam uma maneira de acessar a memória alocada
• Neste caso, o ponteiro significa a “porta de entrada” para uma coleção de dados homogênea • Aponta para a posição inicial
4
Vetores • Declaração ESPECIFICADORES ID[ TAMANHO ] = { LISTA_INICIALIZADORES };
Onde os elementos em vermelho são opcionais.
Especificadores representam o tipo de variável
5
Exemplos de declaração • int vetor [10]; //sem inicialização
• float testando [5] = {1,2,3,4,5}; //com inicialização
• char strings[20];
• double meuvetor[11] 6
Índices • Índices começam em 0 e vão até (TAMANHO – 1)
• ID[0] - primeiro elemento • ID[1] - segundo elemento • ... • ID[TAMANHO - 1] - último elemento
• não há verificação automática se o acesso aos elementos ocorre dentro da faixa 0 .. TAMANHO -1; o programador tem de tomar esta tarefa para si!
7
Lendo e imprimindo vetor #include <iostream> using namespace std; int main() {
int vetor[5]; int i; for (i=0; i<5; i++) cin >> vetor[i];
for (i=0; i<5; i++) cout << vetor[i] << "\n”;
} 8
Operações • Internamente, todos os elementos do vetor são do Ypo que o vetor foi declarado.
• Todas as operações pré-‐existentes para aquele Ypo conYnuam exisYndo • aritméYcas • lógica …
9
Somando elementos de um vetor #include <iostream> using namespace std; int main() {
int vetor[5], i, soma=0; for (i=0; i<5; i++) cin >> vetor[i];
for (i=0; i<5; i++) soma += vetor[i];
cout << soma << "\n”;
}
10
Matrizes • Declaração ESPECIFICADORES ID[ TAMANHO1]
[TAMANHO2] ... [TAMANHOn]={LISTA_INICIALIZADORES};
Onde os elementos em vermelho são
opcionais.
11
Exemplos • int minhamatriz[3][4]; //sem inicialização
• int meuteste[2][2] = {1,2,3,4}; //com inicilização • float pontos[10][2];
12
Índices • Índices de cada dimensão i começam em 0 e vão
até TAMANHO - 1 • ID[0][0]...[0] - primeiro elemento • ... • ID[TAMANHO1 - 1][TAMANHO2 - 1] ... [TAMANHOn
-1] - ultimo elemento • não há verificação automática se o acesso aos
elementos ocorre dentro da faixa 0 .. TAMANHOi -1; o programador tem de tomar esta tarefa para si!
13
Exemplo #include <iostream> using namespace std; int main() {
int matriz[2][2]; int i, j, soma=0;
for (i=0; i<2; i++) for (j=0; j<2; j++) cin >> matriz[i][j]; //conYnua no próximo de slide
14
Tamanho do vetor • Em muitas aplicações, o tamanho do vetor não é conhecido
• Para resolver este problema, deve-‐se usar a alocação dinâmica • E declarar vetores ou matrizes como ponteiros
• Operadores: • new -‐> aloca um vetor • delete -‐> remove da memória o vetor
18
Declaração como ponteiros • Basta incluir o operador * antes do idenYficador da variável
• Exemplo vetor: • int *vetor; • floar *meuteste;
• Exemplo matrix (dois asteriscos por conta das duas dimensões) • int **matriz; • floar **minhamatriz;
19
Usando o new • Imagine um vetor declarado:
• int *vetor
• E que você obteve uma certa variável n com o usuário, que representa o tamanho do vetor: • cin >> n
• Para usar o new e alocar dinâmicamente memória, use: • vetor = new int[n];
20
vetor = new int[n]; • Por partes:
• vetor: nome da variável que irá receber a memória
• new: operador que obtém a memória • int: Ypo de memória que deve retornar para vetor
• []: representa que a memória será acessada através de um vetor
• n representa a quanYdade de inteiros que deve ser alocada no vetor
21
Exemplos //1 int *meuvetor; meuvetor = new int[10];
//2 float *teste; int n; cin >> n; teste = new float[n]; 22
Uma vez alocado … • Depois da memória alocada, pode-‐se usar tranquilamente.
• Mas obrigatoriamente deve ser desalocada quando terminar o uso.
• Para tanto, use delete
23
Como usar o delete //um teste qualquer float *teste; int n; cin >> n; teste = new float[n]; //use //depois de usar, elimine a memória alocada delete []teste; 24
delete []teste • Por partes
• delete : operador usado para remover memória
• []: especificar que está sendo apagado um vetor
• teste: idenYficador da variável que terá memória removida
25
Exemplo simples #include <iostream> using namespace std; int main() {
int *vetor; int i, soma=0, n;
cin >> n; vetor = new int [n]; //aloca o vetor
//conYnua no próximo slide
26
for (i=0; i<n; i++) cin >> vetor[i];
for (i=0; i<n; i++) soma += vetor[i];
cout << soma << "\n";
delete []vetor; //remove o vetor
}
27
Agora com matriz #include <iostream> using namespace std; int main() {
int **matriz; int i, j, soma=0, n;
cin >> n; matriz = new int *[n]; //aloca linhas for (i=0; i<n; i++) matriz[i] = new int [n]; //aloca a memória de
cada linha //conYnua no outro slide
28
//le os elementos da matrix for (i=0; i<n; i++) for (j=0; j<n; j++) cin >> matriz[i][j];
for (i=0; i<n; i++) for (j=0; j<n; j++) soma += matriz[i][j];
cout << soma << "\n";
//conYnua no outro slide
29