Capítulo 07: Vetores - PUC-Rioinf1005/material/slides/vetores.pdf · Na linguagem C, quando...
Transcript of Capítulo 07: Vetores - PUC-Rioinf1005/material/slides/vetores.pdf · Na linguagem C, quando...
-
INF1004 e INF1005 Programao 1
CAP. 07 - Vetores
1
Captulo 07: Vetores
Pontifcia Universidade CatlicaDepartamento de Informtica
INF1004 e INF1005 Programao 1
Introduo
A partir de agora vamos poder usar um mecanismo que nos permita armazenar um conjunto de valores na memria do computador. Posteriormente, estes valores podem ser livremente processados de forma
eficiente, pois j estariam na memria do computador.
Podemos armazenar um conjunto de valores na memria do computador atravs do uso de vetores (arrays, em ingls): O vetor a forma mais simples de organizarmos dados na memria do
computador. Com vetores, os valores so armazenados na memria do computador em
seqncia, um aps o outro, e podemos livremente acessar qualquer valor do conjunto.
Na linguagem C, quando declaramos um vetor (conceito anlogo ao de declarao de uma varivel simples) devemos informar a dimenso do vetor, isto , o nmero mximo de elementos que poder ser armazenado no espao de memria que reservado para o vetor. Devemos tambm informar o tipo dos valores que sero armazenados no vetor (por exemplo, int, float ou double). Em um vetor, s podemos armazenar valores de um mesmo tipo.
-
INF1004 e INF1005 Programao 1
CAP. 07 - Vetores
2
Exemplo de
Declarao e Inicializao
int x[10];
Esta declarao reserva um espao de memria para armazenar 10
valores inteiros e este espao de memria referenciado pelo nome x.
Inicializao de algumas posies do vetor x:
x[0] = 5;
x[1] = 11;
x[4] = 0;
x[9] = 3;
Exemplo
de Declarao e Inicializao
int a, b[20]; /* declara uma varivel simples e um vetor */
float c[10]; /* declara um vetor */
double d[30], e, f[5]; /* declara dois vetores e uma varivel simples */
Declara e j inicializa:
int v[5] = {12, 5, 34, 32, 9};
-
INF1004 e INF1005 Programao 1
CAP. 07 - Vetores
3
Exemplo: Imprimindo os valores
armazenados em um vetor
#include
int main (void)
{
int i;
float v[6] = {2.3, 5.4, 1.0, 7.6, 8.8, 3.9};
for (i=0; i
-
INF1004 e INF1005 Programao 1
CAP. 07 - Vetores
4
Exemplo: Clculo do Mximo
#include
int main (void)
{
int i;
float v[6] = {2.3, 5.4, 1.0, 7.6, 8.8, 3.9};
float maior_valor = v[0];
for (i=0; imaior_valor)
maior_valor = v[i];
}
printf("%f", maior_valor);
return 0;
}
Exemplo: Clculo Mdia
Dada um turma com n alunos (onde n conhecido a priori), obter a
notas dos alunos e calcula a mdia da turma.
-
INF1004 e INF1005 Programao 1
CAP. 07 - Vetores
5
#include
#define NUM_ALUNOS 6
int main (void) {
float notas[NUM_ALUNOS];
float media, soma = 0.0;
int i;
/* leitura dos dados via teclado para armazenar no
vetor */
for(i=0;i
-
INF1004 e INF1005 Programao 1
CAP. 07 - Vetores
6
Vetores Passados para Funes
Alm de passarmos variveis simples como parmetros, podemos passar vetores tambm: Quando passamos um vetor como parmetro, a funo chamada
recebe uma referncia para o vetor.
Isso significa que a funo chamada, quando acessa os elementos, acessa as mesmas posies de memria que a funo que declarou vetor.
Por essa razo, se atribuirmos um valor a um elemento do vetor passado como parmetro, este elemento tambm alterado no vetor original.
Portanto, podemos declarar um vetor numa funo e chamar uma outra funo auxiliar para acessar e/ou modificar seus elementos.
Vetores Passados para Funes:
Voltando ao Exemplo Anterior
Com o uso de funes auxiliares podemos reescrever
os cdigos anterior:
Uma funo para ler os valores e armazen-los em um vetor; e
Uma funo para calcular a mdia.
-
INF1004 e INF1005 Programao 1
CAP. 07 - Vetores
7
#include
#define NUM_ALUNOS 6
void ler_dados (float vet[], int num) {
int i;
/* leitura dos dados para armazenar no vetor */
for(i=0;i
-
INF1004 e INF1005 Programao 1
CAP. 07 - Vetores
8
Busca em Vetores
Problema: Implemente uma funo que busca por um
inteiro em um vetor de inteiros.
int busca(int n, int[] vet, int elem) {
int i;
int ind_elem = -1;
for(i = 0 ; i < n ; i++) {
if(vet[i] == elem) {
ind_elem = i;
}
}
return ind_elem;
} Percorre o vetor at o final procurandoo elemento desejado. Se achar, guarda seundice, se no a varivel ind_elem j estcom o valor -1 de retorno.
Busca em Vetores
Pegando o algoritmo anterior, podemos alter-lo para
que ele volte a retornar o ndice da primeira ocorrncia
do elemento desejado:int busca(int n, int[] vet, int elem) {
int i;
int ind_elem = -1;
for(i = 0 ; i < n ; i++) {
if(vet[i] == elem) {
ind_elem = i;
break;
}
}
return ind_elem;
}
Este comando usado para imediatamente interromper um lao (execuo do for, while ou do-whileque ele est sendo chamado) e o programa continua a execuo no comando seguinte ao comando lao.
-
INF1004 e INF1005 Programao 1
CAP. 07 - Vetores
9
Busca em Vetores (vetor ordenado)
int busca_ord(int n, int[] vet, int elem) {
int i;
for(i = 0 ; i < n ; i++) {
if(vet[i]) {
return i;
}
else if(vet[i] > elem) {
return -1;
}
}
return -1;
}
Valor Mximo / Mnimo
float maximo ( int n, float v[]){
int i ;
float vmax = v [0] ;
for (i = 1; i < n ; i++){
if (v[i] > vmax){
vmax = v [ i ] ;
}
}
return vmax;
}
float minimo ( int n, float v[]){
int i ;
float vmin = v [0] ;
for (i = 1; i < n ; i++){
if (v[i] < vmin){
vmin = v [ i ] ;
}
}
return vmin;
}
-
INF1004 e INF1005 Programao 1
CAP. 07 - Vetores
10
Valor Mximo: Se quisssemos retornar o valor e o ndice
do maior elemento do vetor?
#include
#define CAPACIDADE_VETOR 10
void maximo (int n, float v[], float *vmax, int *imax){
int i ;
float maior_valor = v[0];
int ind_maiorvalor = 0;
for(i = 1; i < n ; i++){
if (v[i] > maior_valor){
maior_valor = v[i];
ind_maiorvalor = i;
}
}
*vmax = maior_valor;
*imax = ind_maiorvalor;
}
void leitura_dados (int n, float v[]) {
int i;
for(i=0;i
-
INF1004 e INF1005 Programao 1
CAP. 07 - Vetores
11
Vetores e Ponteiros:
Aritmtica de Ponteiros
A linguagem C tambm suporta aritmtica de ponteiros. Podemos somar e subtrair valores, desde que o valor do ponteiro resultante aponte para dentro da rea reservada do vetor.
Exemplo: se p representa o ponteiro para um inteiro, p+1 representa um ponteiro para o prximo inteiro armazenado na memria, isto , o valor de p incrementado de 4 bytes.
Por tanto, escrever &v[i] equivalente a escrever (v+i). E escrever v[i] equivalente a escrever *(v+i).
Exemplo
int main (void){
int v[2];
int *p;
p = v;
p = p + 1;
*p = 5;
return 0;
}
Varivel Endereo Contedo
v[0] 0
v[1] 4
p 8 0
12
-
INF1004 e INF1005 Programao 1
CAP. 07 - Vetores
12
Exemplo
int main (void){
int v[2];
int *p;
p = v;
p = p + 1;
*p = 5;
return 0;
}
Varivel Endereo Contedo
v[0] 0
v[1] 4 5
p 8 4
12
Relao entre vetores e ponteiros
#include
int main (void) {
int i;
float v[6] = {2.3, 5.4, 1.0,
7.6, 8.8, 3.9};
for (i=0; i