Capítulo 07: Vetores - PUC-Rioinf1005/material/slides/vetores.pdf · Na linguagem C, quando...

download Capítulo 07: Vetores - PUC-Rioinf1005/material/slides/vetores.pdf · Na linguagem C, quando declaramos um vetor (conceito análogo ao de ... Busca em Vetores Pegando o algoritmo

If you can't read please download the document

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