esinf - structures of information

33
 Estruturas de Informação Departamento de Engenharia Informática (DEI/ISEP) Fátima Rodrigues [email protected]  Aspectos Essenciais em C++

Upload: danielsilva

Post on 08-Oct-2015

7 views

Category:

Documents


0 download

DESCRIPTION

Essential C about structures

TRANSCRIPT

  • 5/19/2018 ESINF - Structures of Information

    1/36

    Estruturas de Informao

    Departamento de Engenharia Informtica (DEI/ISEP)

    Ftima Rodrigues

    [email protected]

    Aspectos Essenciais em C++

  • 5/19/2018 ESINF - Structures of Information

    2/36

    Referncias

  • 5/19/2018 ESINF - Structures of Information

    3/36

    Operador de Referncia &

    Uma declarao de varivel associa trs atributos fundamentais varivel: nome, tipo, endereo de varivel

    int n ;

    n

    int n = 44 ;

    00064fdf0

    int

    00064fdf0

    3

    n

    Em C++ possvel obter o endereo de uma varivel utilizando ooperador referncia &

    int

    44

    voidmain()

    { int n = 44 ;

    cout

  • 5/19/2018 ESINF - Structures of Information

    4/36

    Referncias

    Uma referncia um nome alternativo (alias) para outra varivelTipo& nome-ref = nome-var

    voidmain (){

    int n = 44 ;

    int& rn = n ; // rn sinnimo de n

    cout

  • 5/19/2018 ESINF - Structures of Information

    5/36

    Passagem de Parmetros

  • 5/19/2018 ESINF - Structures of Information

    6/36

    Passagem de Parmetros por Valor

    void troca(int x, int y)

    {

    int temp = x;

    x = y;

    y = temp;

    }

    voidmain()

    {

    int a = 1, b = 2;

    6

    ,

    cout

  • 5/19/2018 ESINF - Structures of Information

    7/36

    Passagem de Parmetros por Referncia

    voidtroca(int& x, int& y)

    {

    int temp = x;

    x = y;

    y = temp;

    }

    voidmain()

    {

    int a = 1, b = 2;

    troca(a, b);

    7

    cout

  • 5/19/2018 ESINF - Structures of Information

    8/36

    Passagem de Parmetros por Referncia

    Constantevoidtroca (const int& x, const int& y)

    {

    int temp = x ;

    x = y ; // ERRO: obj. const. no admite atribuies

    y = temp ; // ERRO: idem}

    O parmetro formal substitui o actual, mas como constante, no

    8

    a m te a tera o e va or

    Caso no se pretenda alterar o valor do parmetro actual usa-se:Passagem por valor no caso de tipos de dados primitivosPassagem por referncia constante para tipos de dados no

    primitivos, tipos de dados que ocupem grande quantidade deespao de armazenamento, pois a passagem por referncia impedeque o argumento seja duplicado

  • 5/19/2018 ESINF - Structures of Information

    9/36

    Valores de Retorno

  • 5/19/2018 ESINF - Structures of Information

    10/36

    Valores de Retorno

    Um tipo de retorno de uma funo pode ser uma referncia desde queo valor devolvido seja um lvalue no local funo

    intmax (int& m, int& n) //tipo de retorno uma referncia

    { return (m > n ? m : n) ; //m e n so referncias no locais}

    Quando devolvido um valor (objecto), aquilo que devolvido

    10

    copiado no ambiente de retorno, recorrendo-se ao construtor cpia

    Por questes de eficincia, no caso da devoluo de tipos noprimitivos, no se deve usar o retorno por valor mas o retorno por

    referncia, para se evitar a invocao do construtor cpia

    S podemos devolver referncias de objectos globais funo

  • 5/19/2018 ESINF - Structures of Information

    11/36

    Funes que retornam referncias

    Exemplo:

    int v[5] = {2,4,6,8,10};

    int& elemento(int i)

    {

    return v[i];

    }

    11

    voidmain ()

    {

    elemento(3) = 7; // mesmo que v[3] = 7

    elemento(3)++ ; // mesmo que v[3]++

    }

    Permite que funes apaream do lado esquerdo de atribuies!H um alis entre a funo e o objecto que ela devolve, noexemplo possvel alterar um valor de uma posio do vectorinvocando elemento(i)++

  • 5/19/2018 ESINF - Structures of Information

    12/36

    Apontadores

  • 5/19/2018 ESINF - Structures of Information

    13/36

    Variveis Dinmicas

    Algumas Linguagens de Programao permitem ao programadorexplicitamente criar/destruir variveis durante a execuo doprograma

    A rea de armazenamento destas variveis - variveis dinmicas - a Heap

    Ao contrrio das variveis normais, as variveis dinmicas no

    13

    ,

    no tem sequer um identificador

    Uma varivel dinmica sempre acedida atravs de uma varivelapontador

  • 5/19/2018 ESINF - Structures of Information

    14/36

    Apontadores e Endereos

    Um apontador uma varivel que contm o endereo de um objectoem memria (varivel, elemento de array, etc.)Ex:

    int* pn = &n ; //pn um apontador que contm o endereo de um inteiro

    00064fdf0

    44n

    14

    voidmain(){ int n = 44 ;

    cout

  • 5/19/2018 ESINF - Structures of Information

    15/36

    Operador new

    int* pn ;

    Declara um apontador para inteiro, ou seja, atribui um endereo a pn,mas a memria nesse endereo ainda no est alocada, logo pn no

    aponta para nenhuma memria alocada e portanto no pode seracedido

    15

    operador new

    pn = new int ;

    Uma varivel dinmica do tipo int criada, e o seu endereo colocado no apontador pn

  • 5/19/2018 ESINF - Structures of Information

    16/36

    Operador de Desreferncia

    Se pn apontar para n podemos aceder o valor de n atravs de pn

    A expresso *pn ser avaliada como o valor de n, ou seja, ocontedo do apontado por pn

    Aceder ou modificar a varivel dinmica criada feito atravs doapontador pn usando o operador *int* pn = new int ;

    *pn = 7 ; // coloca 7 na varivel dinmica

    16

    cin >> *pn ; // l do teclado o valor a armazenar na varivel dinmica

    if (*pn == 0) // testa se a var. dinmica contm 0

    voidmain()

    { int n = 44 ;

    cout

  • 5/19/2018 ESINF - Structures of Information

    17/36

    Apontadores com zero e por inicializar

    A nica constante que faz sentido atribuir a um apontador 0 (zero),para significar que no est a apontar para nada (porque garantidoque 0 no endereo vlido para dados)

    -Podem-se comparar apontadores com a constante 0

    double* p = new double ;

    if (p == 0) abort() ;

    else *p = 3.14159 ;

    17

    Se um apontador ainda no foi inicializado, no se pode aceder aoobjecto apontado (com operador desreferncia *)

    float *p ; // p um apontador para float, no inicializado !

    *p = 1.0 ; // Erro: p no foi alocado

    float x;

    float* p = &x; // OK: inicializa p com endereo de x

    float* q;

    q = new float; // OK: aloca memria para 1 float

    *q = 3.14159 ; // OK: *q foi alocado

  • 5/19/2018 ESINF - Structures of Information

    18/36

    Apontadores para Apontadores

    A varivel ppn aponta para pn, que aponta para n. Assim *ppn umalis para pn, da mesma maneira que *pn um um alis para n, logo

    int** ppn = &pn

    18

    **ppn tambm um alis para n

    voidmain()

    { int n = 44 ;

    cout

  • 5/19/2018 ESINF - Structures of Information

    19/36

    Exemplo de manipulao de apontadores

    int x = 1, y = 2;

    int *p, *q;

    p = &x;

    q = p;

    y = *p;

    se paponta para x, *p

    pode ocorrer em

    qualquer contexto em

    que xpoderia ocorrer

    // p e q so apontadores para int

    // coloca em p o endereo de x

    // p agora aponta para x

    // copia para q o contedo de p

    // q agora tambm aponta para x

    // coloca em y o valor do objecto apontado por p

    19

    *p = -1;

    (*q)++;

    y agora vale 1

    // coloca no objecto apontado por p o valor -1

    // x agora vale -1

    // incrementa o valor do objecto apontado por q

    // x agora vale 0

  • 5/19/2018 ESINF - Structures of Information

    20/36

    Valores vlidos para um Apontador

    Um apontador pode obter um valor vlido por:1. Cpia de outro apontador

    Por atribuio Por passagem de parmetro

    2. Atribuio do endereo de um objecto Aplicao do operador unrio & a um objecto Valor retornado pelo operador new

    int var1 = 8 ;

    =

    int var1 = 8 ;

    int var2 = 15

    20

    int *ap1, *ap2 ;

    ap1 = &var1 ;

    ap2 = &var2 ;

    cout

  • 5/19/2018 ESINF - Structures of Information

    21/36

    Apontadores para Objectos

    class Ponto{

    public:

    double x;

    double y;

    }

    Ponto* p = new Ponto ;

    (*p).x = 22 ; // equivalente a p->x = 22 ;

    21

    Como p um apontador para um objecto Ponto, *p um objecto Ponto

    (*p).x acede ao seu membro x

    So necessrios parntesis na expresso (*p).x pois o operador directode seleco de membro . tem precedncia sobre o operadordesreferncia *

    As duas notaes (*p).x e p->x so equivalentes

  • 5/19/2018 ESINF - Structures of Information

    22/36

    Arrays

  • 5/19/2018 ESINF - Structures of Information

    23/36

    Declarao de Arrays

    int a[10];

    o tamanho do array uma constante do tipo inteiro positivo

    o smbolo a armazena o endereo de memria do array

    Array de dimenso n uma sequncia de objectos do mesmo tiponumerados consecutivamente de 0, , n-1

    23

    ou outro tipo qualquer elementos deste array: a[0] , a[1], ...., a[9]

    a:a[0]

    a[exp] pode ocorrer em qualquer contexto em que uma variveldo tipo int poderia ocorrer

    a[3] a[9]

  • 5/19/2018 ESINF - Structures of Information

    24/36

    Inicializao de arrays

    floatponto[2] = {1.0, 3.0};

    o mesmo que

    floatponto[2];

    ponto[0] = 1.0;

    ponto[1] = 3.0;

    char se aradores 3 = ' ' ' n' ' t'

    indicar lista de valores iniciaisentre chavetas (s ao declarar

    o array!)

    24

    o mesmo que

    char separadores[] = {' ', '\n', '\t'};

    int a[4] = {3, 5};

    o mesmo que

    int a[4] = {3, 5, 0, 0};

    o compilador calcula otamanho

    os valores em falta socolocados a zero

  • 5/19/2018 ESINF - Structures of Information

    25/36

    Cpia e Comparao de Arrays

    No se pode usar o operador de atribuio (=) com arrays para copiaro contedo de um array para outro array ( necessrio copiarelemento a elemento)

    int a[2], b[2];...

    a = b; // ERRADO!

    a[0] = b[0]; a[1] = b[1]; // OK!

    25

    No se podem usar os operadores de comparao (== !=) comarrays para comparar os contedos de dois arrays ( necessriocomparar elemento a elemento)

    if (a == b) // No compara contedos mas endereos!!

    if (a[0] == b[0] && a[1] == b[1]) // OK!!

  • 5/19/2018 ESINF - Structures of Information

    26/36

    Arrays e Funes

    Uma funo no pode retornar um array (i.e., o tipo de retorno nopode ser array)

    No possvel passar um array por valor a uma funo

    Uma funo pode ter argumentos do tipo array, mas estes sosempre passados "por referncia"

    -Usar o qualificador const quando se pretende que o array

    26

    passa o n o se a a era o pe a un o

    -O comprimento do array pode ser omitido na declarao de umargumento do tipo array - a funo pode receber um array dequalquer comprimento !

    no caso de arrays de arrays, s o 1 comprimento pode seromitido

  • 5/19/2018 ESINF - Structures of Information

    27/36

    Arrays e Funes

    int somatorio (int a[], int n){ int sum = 0 ;

    for (int i=0; i < n; i++)sum += a[i] ;

    return sum ;}

    intmain (){ int a[] = {11, 33, 55, 77} ;

    Uma funo incapaz de calcularo tamanho de um array a elapassado

    O tamanho do array tem de serpassado explicitamente funoque o processa

    27

    int size = sizeof(a)/sizeof(int) ;cout

  • 5/19/2018 ESINF - Structures of Information

    28/36

    Arrays Multi-dimensionais

    int a[3][4];

    a um array de 3 arrays de 4 inteiros

    int a[3, 4];

    28

    a[][0] a[][1] a[][2] a[][3]

    a[0][3]

    a[0][]

    a[1][]

    a[2][]

    a[0, 3]

  • 5/19/2018 ESINF - Structures of Information

    29/36

    Inicializao de arrays (cont.)

    Inicializao de arrays de caracteres com strings literais:

    char s[4] = "Ola";

    o mesmo que

    char s[4] = {'O', 'l', 'a', '\0'};

    marca fim da string

    29

    Tambm se pode escrever:

    char s[] = "Ola";

    int a[2][3] = {{0, 1, 1}, {2, 3, 2}};

    Inicializao de arrays de arrays

  • 5/19/2018 ESINF - Structures of Information

    30/36

    Operaes com Apontadores para Eltos de Arrays

    int a[4];

    int *p = &a[2];

    Pode-se somar ou subtrair um inteiro a um apontador

    -pointer+ n : avana n elementos do tipo apontado porpointer

    -pointer - n : recua n elementos do tipo apontado porpointer

    -p+1 d &a[3]

    a: a[2]

    p:

    30

    Pode-se incrementar ou decrementar um apontadorp++; //p fica com &a[3]

    Podem-se subtrair apontadores do mesmo tipo (d a distncia entreeles, em n de elementos do tipo apontado)

    p - &a[0] d 2

    Podem-se comparar apontadores do mesmo tipo

    p > &a[0] d true

  • 5/19/2018 ESINF - Structures of Information

    31/36

    Relao entre apontadores e arrays

    O nome de um array pode ser usado como apontador para o seuprimeiro elemento

    int a[4] = {1, 2, 3, 4};

    int *p = a ; // mesmo que: int *p = &a[0]p = a + 2 ; // mesmo que: p = &a[0] + 2 ou ainda: p = &a[2]

    Quando se passa um array a uma funo, de facto passa-se (por valor)

    31

    Na declarao de argumentos da funo, pode-se escrevervoid geravalores (int ap[])

    ou equivalentemente (tornando explcito o que se passa na realidade)

    void geravalores (int *ap)

    Pode-se usar a notao indexada com apontadores

    p[1] = 2; // mesmo que: *(p+1) = 2;

  • 5/19/2018 ESINF - Structures of Information

    32/36

    Apontadores para percorrer Arrays

    mesmo que *(&a[0] + i)

    O operador[] equivalente ao

    operador desreferncia *

    intprocura (int x, const int a[], int n){

    for (int i = 0; i < n; i++)

    if (x == a[i] )

    return i;

    return -1;

    }

    32

    intprocura (int x, const int a[], int n){

    for (const int *p1 = a , *p2 = a + n; p1 < p2; p1++)

    if (x == *p1)

    return p1 - a;

    return -1;

    }mesmo que a[i]

  • 5/19/2018 ESINF - Structures of Information

    33/36

    Apontadores para Arrays

    Apontador para elemento de array Apontador para array(embora s vezes se fale em apontador para array querendo significarapontador para o 1 elemento do array - o endereo o mesmo mas otipo diferente)

    Apontadores para arrays surgem quando se trabalha com arrays dearrays

    int a[2][3];

    33

    int (*p1)[3]; // p1 apontador para array de 3 int's// lgica: *p1 um array de 3 inteiros

    p1 = a; // mesmo que p1 = &a[0]

    // p1 fica a apontar para o 1 sub-array de a

    int *p2; // p2 um apontador para inteiro (que por acaso pode ser um// elemento de um array)

    p2 = *p1 // p2 fica a apontar para a[0][0]

  • 5/19/2018 ESINF - Structures of Information

    34/36

    Alocao e libertao dinmica de memria

    new tipo - cria um objecto do tipo indicado e retorna o seu endereo,ou 0 em caso de erro

    -objecto fica alojado numa zona de memria dinmica chamada"heap"

    -pode-se inicializar objecto com: new tipo (valor-inicial)-endereo retornado deve ser atribudo a apontador do tipo: tipo *

    -destruir objecto (libertando memria) com: delete apontador ;

    34

    new tipo [tamanho] - cria um array de objectos do tipo e tamanhoindicados e retorna o endereo do 1 objecto do array

    -endereo retornado deve ser atribudo a apontador do tipo: tipo *

    -destruir array (libertando memria) com: delete [ ] apontador ;

    -til para criar arrays de tamanho conhecido apenas durante aexecuo do programa !

    -Quando as posies de memria inicialmente alocadas a um arrayso esgotadas necessrio re-alocar novo bloco de memria

  • 5/19/2018 ESINF - Structures of Information

    35/36

    Exemplo com Arrays Dinmicos!

    #include

    using namespace std ;

    main()

    {

    int n;

    cout > n;

    int *v = new int [n] ;

    " "

    Array dinmico,alocado em tempo de

    35

    for (int i = 0; i < n; i++)cin >> v[i] ;

    cout = 0; i--)

    cout

  • 5/19/2018 ESINF - Structures of Information

    36/36

    Re-Alocao de memria

    #include using namespace std ;

    voidmain(){ charpt ;int i=0, ind=0, cap=10 ;char *v = new char [cap] ;

    cout > pt ;while (pt != '*'){if (i < cap)

    36

    v[i] = pt ;

    i++ ; }else // realoca o dobro do espao{

    cap *= 2 ;char* novoarr = new char [cap] ;

    for (int j = 0 ; j < i ; ++j) //copia array v para o novonovoarr[j] = v[j] ;

    delete [] v ; //liberta a memria

    v = novoarr ; }cout > pt;

    }