arranjosnca.ufma.br/~geraldo/lp/3.1_vetores_matrizes.pdf · 2017-04-16 · uma coleção de...

30
Arranjos Vetores, Matrizes e Strings

Upload: haxuyen

Post on 11-Feb-2019

215 views

Category:

Documents


0 download

TRANSCRIPT

Arranjos Vetores, Matrizes e Strings

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

 for  (i=0;  i<2;  i++)        for  (j=0;  j<2;  j++)          soma  +=  matriz[i][j];    

   cout  <<  soma  <<  "\n";  

}    

15

Matrizes

16

Determinando  tamanho  durante  a  execução  

17

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

//desaloca  a  matriz  for  (i=0;  i<n;  i++)  

 delete  []matriz[i];    //primeiro  a  parte  mais  interna  

     delete  []matriz;    //depois  a  parte  mais  

externa    }      

30