Você está na página 1de 8

14/03/2017 Programar em C++/Vetores - Wikilivros

Programar em C++/Vetores
Origem: Wikilivros, livros abertos por um mundo aberto.
< Programar em C++

ndice
1 Vetores e Matrizes
1.1 Vetores
1.2 Matrizes
1.3 Declarando arranjo
1.4 Constantes
1.5 Declarar constantes
1.6 Iniciao
1.7 Caracter array
1.8 Arrays de vrias dimenses
1.9 Iniciando
1.10 Const Constant arrays
1.11 Atribuir valores ao array
1.12 Arrays como statements de funes
1.13 Arrays como argumentos de funes

Vetores e Matrizes
Faamos uma pequena reviso de conceitos:

Vetores e matrizes so variveis compostas homogneas, ou seja, so agrupamentos de dados que


individualmente ocupam o mesmo tamanho na memria e so referenciados pelo mesmo nome,
geralmente so individualizadas usando-se ndices.
Vetores distinguem-se das matrizes apenas pela caracterstica de ter dimenso (1 x n) ou (n x 1),
essencialmente vetores so matrizes linha ou matrizes coluna.

Em linguagem "C" vetores e matrizes so usados abundantemente para compor estruturas de dados necessrias
para composio de diversos recursos. Esta usa, mais explicitamente, vetores de caracteres para definir cadeias
de texto, o que conhecido como o mais trivial uso de vetores. Alm deste recurso, o "C" tambm define meio
de criao de matrizes tipo (n x m), provendo, desta forma os recursos necessrios para criao destes
conjuntos de dados.

A linguagem "C++" suporta os mesmos recursos e permite a criao de matrizes de objetos. Uma vez que um
objeto essencialmente um tipo de dado criado pelo programador, todas as caractersticas bsicas legadas aos
"tipos" em geral so observados nos tipos criados (classes de objetos).

Vetores
Os vetores em C++ seguem a mesma notao da linguagem "C", via de regra declara-se o tipo seguido de um
asterisco. Para acessar o valor apontado pela varivel usa-se um asterisco de forma semelhante, como pode ser
visto no trecho de cdigo abaixo:

int *x;
int a = 3;
https://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Vetores 1/8
14/03/2017 Programar em C++/Vetores - Wikilivros

x = &a;

cout <<" O valor do contedo da posio 0x" ; // O valor da posio 0x23A0209112


cout << hex << x << "de memria " << *x << endl; // de memria 3

Matrizes
Podemos imaginar que uma matriz um conjunto de vetores que ocupam uma determinada rea de memria
referenciada por um nome comum. Matrizes de tipos primitivos so conseguidas atravs de associaes do
operador [ ], como por exemplo:

char A[32][16];
int B[12][26][10];

Definindo nossas classes de objetos poderemos declarar matrizes de objetos:

class Record
{ int D;
float X,Y;
char desc[12];

public :
Record ();

void addFData (float A, float B);


float getFDataX ();
float getFDataY ();
...
...
...
};

void function ()
{
Record A[32][16];
...
...
...

Ou seja, podemos adotar a mesma sintaxe para criar matrizes de objetos. Este procedimento pode ser usado
com o cuidado de se avaliar antes a quantidade de memria disponvel para que a matriz no ultrapasse esse
limite fsico, muitas vezes delimitada pelo hardware ou pelo sistema operacional. Lembremos que, um objeto
precisa do espao equivalente a soma de suas variveis internas para ser alocado na memria.

Declarando arranjo
Os arrays permitem fazer o seguinte:

int a1, a2, a3,.a100; equivalente a ter int a[100];

Ou seja permite declarar muitas variveis de uma forma bem simples, poupa escrita e bastante compreensvel.

O nmero que est dentro de brackets [] o size declarator. Ele que vai permitir ao computador dizer
quantas variveis a serem geradas e logo quanta memria dever ser reservada. A memria reservada
para as variveis vo ser todas seguidas, um int a seguir ao outro
H uma forma para no dizer o valor deste size declarator, mas isso apenas acontece antes da compilao,
ou seja o compilador que vai fazer esse preenchimento por ns, visualizando o nosso cdigo e contanto
os membros que colocmos. Isto um automatismo dos compiladores recentes. chama-se a isto iniciao
implcita que vamos ver nesta seco.

https://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Vetores 2/8
14/03/2017 Programar em C++/Vetores - Wikilivros

As variveis geradas pelos arrays vo ser todos do mesmo tipo.


Reparem que o valor do size declarator um nmero. literal, ele no vai mudar quando o programa
estiver a correr. Por isso quando no soubermos o nmero de elementos o que fazemos?

Veja uma tentativa:

#include <iostream>
using namespace std;
int main ()
{
int numTests ;
cout << "Enter the number of test scores:" ;
cin >> numTests ;
int testScore [numTests ];
return 0;
}

Isto vai dar um erro de compilao, porque o array est a espera de uma constante e no uma varivel. H uma
maneira de contornar isto que atravs da memria dinmica que vamos dar mais tarde, num capitulo prprio,
pois isto vai envolver muitos conceitos.

Constantes
Reparem que h uma diferena entre literais e constantes, apesar de em ambos os casos o valor no alterado
durante a execuo do programa, a constant um nome que representa o valor, o literal o valor.

Declarar constantes
exatamente como declarar uma varivel com duas diferenas:

1. A declarao comea com a palavra const. Isto vai dizer ao compilador que uma constante e no uma
varivel
2. Teremos de atribuir logo o valor na declarao, ou seja, fazer a iniciao

Exemplo:

const int numTests = 3;

Portanto se tentarmos colocar um outro valor ao numTest, isso vai dar um erro de compilao

Array index

a[100] composto por a[0], a[1], a[99] ( De a[0], a[1], a[99] existe 100 posies)

Pergunta: Porque que o ndex comea em zero e no um? Ou seja temos as 100 posies que pedimos mas o
ndex comea no zero e no no 1. A razo disto tem a ver com offset que refere ao valor adicionado para o
endereo base para produzir a segunda address. Bem no entendi bem! Eu explico de novo: O endereo
(address) do primeiro elemento do array, o mesmo do que o endereo base do prprio array. ah espera a, o
que esto a dizer que o endereo do array igual ao do primeiro elemento do array. Assim o valor que teria de
ser adicionado, ao endereo base do array, para conseguirmos o endereo do primeiro elemento seria zero.
Agora sim, percebi!

Erro: Um erro comum esquecer que o index comea no zero, e portanto quando se querem referir ao ltimo
elemento, esquecem-se que tm de subtrair uma unidade. O que advm desse esquecimento que podem estar a
alterar memria pertencente a uma varivel, instruo,..de um outro programa. Ou seja vai existir violao de
dados.
https://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Vetores 3/8
14/03/2017 Programar em C++/Vetores - Wikilivros

Se o array for declarado globalmente em vez de ser localmente, ento cada elemento inicializado ao valor
defaut que zero.

Iniciao
Iniciao, se bem se recordam atribuir um valor a uma varivel ao mesmo tempo que declaramos a varivel.
Podemos fazer a iniciao de um array de 2 maneiras:

1) explicit array sizing

int testScore[3] = { 74, 87, 91 };


float milesPerGallon[4] = { 44.4, 22.3, 11.6, 33.3};
char grades[5] = {'A', 'B', 'C', 'D', 'F' };
string days[7] = {"Sunday", "Monday", "Tuesday", "Wednesday","Thursday", "Friday", "Saturday"};

Pergunta: O que que acontece se dermos mais valores de atribuio do que elementos do array?

int a[3] = { 74, 87, 91, 45 };

Isto vai dar um erro de compilao too many initializers

Pergunta: O que que acontece se tivermos menos valores do que os elementos?

int a[3] = { 74 };

No acontece nada simplesmente no temos valores para a[1] e a[2]. Porm em alguns compiladores os
elementos no inicializados ficam com os valores defaut, que no caso dos ints 0 no caso dos floats 0.0 e nos
caracteres o caractere nulo ("\0"). No entanto se no inicializarmos um dos elementos, os restantes elementos
tero de ser no inicializados pois caso contrrio teremos um erro de compilao

2) implicit array sizing

int testScore[ ] = { 74, 87, 91 };


float milesPerGallon[ ] = { 44.4, 22.3, 11.6, 33.3};
char grades[ ] = {'A', 'B', 'C', 'D', 'F' };

Aqui o compilador faz o trabalho por ns, conta os elementos e preenche o nmero de elementos

Caracter array

char name[ ] = {'J', 'e', 'f', 'f', '\0' };


char name[ ] = "Jeff";

Ambas as inicializaes so permitidas. Porm tomar ateno ultima iniciao! Quando colocmos as aspas
duplas o compilador acrescenta o "\0" na array que cria! No tem []!! Esta at costuma ser a preferida pelos
programadores, ao estilo de strings (Na verdade as strings so arrays de char mas vamos falar disso num
capitulo prprio)

O char "\0" o escape sequence para caracterer null. Este escape sequence sinaliza ao cout o fim do character
array. o ltimo elemento do array preenchido! Se no tivssemos este carcter apareceriam estranhos
caracteres a seguir ao "jeff", chamados "caracteres-lixo". (porqu?) Isto no significa que o ltimo elemento
deva ser sempre o null carcter
https://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Vetores 4/8
14/03/2017 Programar em C++/Vetores - Wikilivros

Arrays de vrias dimenses


Podemos ter duas dimenses

tipo_da_varivel nome_da_varivel [altura][largura];

como tambm poderamos ter infinitas

tipo_da_varivel nome_da_varivel [tam1][tam2] ... [tamN];

Iniciando

float vect [6] = { 1.3, 4.5, 2.7, 4.1, 0.0, 100.1 };


int matrx [3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
char str [10] = { 'J', 'o', 'a', 'o', '\0' };
char str [10] = "Joao";
char str_vect [3][10] = { "Joao", "Maria", "Jose" };

Peguemos no exemplo:

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

Na memria teramos as coisas assim. ou seja os elementos so seguidos e do mesmo tipo

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


1 2 3 4 5 6

Portanto ter int a [2][3] equivalente a ter int a [6] o nome que se d que diferente.

Pergunta: ser pedido espao par 6 ints ou antes um espao com o tamanho de 6 ints? Como ns sabemos que
os arrays os elementos tm endereos de memoria consecutivos, por isso, no podem ser pedidos 6 ints, pois se
fosse esse o caso, poderia acontecer que eles no ficassem juntos.

Const Constant arrays

const int daysInMonth [] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

Recordar que temos de inicializar quando queremos fazer uma constante array

Atribuir valores ao array

#include <iostream>
using namespace std;
int main ()
{
int testScore[3];
cout << "Enter test score #1: ";
cin >> testScore[0];
cout << "Enter test score #2: ";

https://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Vetores 5/8
14/03/2017 Programar em C++/Vetores - Wikilivros
cin >> testScore[1];
cout << "Enter test score #3: ";
cin >> testScore[2];
cout << "Test score #1: " << testScore[0] << endl;
cout << "Test score #2: " << testScore[1] << endl;
cout << "Test score #3: " << testScore[2] << endl;
return 0;
}

Podemos atribuir o valor 1 a 1, mas para poupar escrita de programao melhor utilizar as funes
anteriormente revistas como o for

#include <iostream>
using namespace std;
int main ()
{
int testScore[3];
for (int i = 0; i < 3; i++)
{
cout << "Enter test score #" << i + 1 << ": ";
cin >> testScore[i];
}
for (i = 0; i < 3; i++)
{
cout << "Test score #" << i + 1 << ": " << testScore[i] << endl;
}
return 0;
}

Ou melhor ainda podemos usar uma constante, para tornar o nosso cdigo mais abstracto.

#include <iostream>
using namespace std;
const int MAX = 3;
int main ()
{
int testScore[MAX];
for (int i = 0; i < MAX; i++)
{
cout << "Enter test score #" << i + 1 << ": ";
cin >> testScore[i];
}
for (i = 0; i < MAX; i++)
{
cout << "Test score #" << i + 1 << ": " << testScore[i] << endl;
}
return 0;
}

Lembram-se da histria de termos o endereo do array igual ao endereo do 1 elemento do array?

#include <iostream>
using namespace std;
const int MAX = 3;
int main ()
{
int testScore[3] = { 74, 87, 91 };
cout << testScore[0] <<"\n";
cout << testScore <<"\n"; //array base e no um elemento particular do array
return 0;
}

Pois bem vemos que quando mandamos imprimir o array, ele d um endereo. Pois o valor do nome do array
o endereo do array.

https://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Vetores 6/8
14/03/2017 Programar em C++/Vetores - Wikilivros

Arrays como statements de funes


Pegando no programa

#include <iostream>
using namespace std;
const int MAX = 3;
int main ()
{
int testScore[MAX];
for (int i = 0; i < MAX; i++)
{
cout << "Enter test score #" << i + 1 << ": ";
cin >> testScore[i];
}
for (i = 0; i < MAX; i++)
{
cout << "Test score #" << i + 1 << ": " << testScore[i] << endl;
}
return 0;
}

Vamos torn-lo mais modular, escrevendo uma funo para atribuir valores ao array e outa funo para mostrar
os valores do array

#include <iostream>
using namespace std;
void assignValues(int[], int);
void displayValues(int[], int);
const int MAX = 3;
int main ()
{
int testScore[MAX];
assignValues(testScore, MAX);
displayValues(testScore, MAX);
return 0;
}
void assignValues(int tests[], int num)
{
for (int i = 0; i < num; i++)
{
cout << "Enter test score #" << i + 1 << ": ";
cin >> tests[i];
}
}
void displayValues(int scores[], int elems)
{
for (int i = 0; i < elems; i++)
{
cout << "Test score #" << i + 1 << ": "<< scores[i] << endl;
}
}

Arrays como argumentos de funes

// arrays as parameters
#include <iostream>
using namespace std;
void printarray (int array[], int length) /*funo com 2 argumentos,um deles um array */
{
for (int n=0; n<length; n++)
cout << array[n] << " ";
cout << "\n";
}
int main ()
{
int a[] = {5, 10, 15};

https://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Vetores 7/8
14/03/2017 Programar em C++/Vetores - Wikilivros
printarray (a,3); //passo array como argumento
return 0;
}

Este exemplo por acaso est muito curioso

Pergunta: mas agora deveramos perguntar se neste caso tnhamos uma passagem por valor ou referncia.

Quando um array passado para uma funo, a funo recebe no a cpia do array mas invs disso o endereo,
address do primeiro elemento do array, que igual ao valor do array (base).

Assim todas as modificaes que se efectuarem na funo que foi chamada iro repercutir-se no array passado.

Vamos confirmar:

#include <iostream>
using namespace std;
void doubleThem (int a[], int size);
int main()
{
int a;
int myInts [10] = {1,2,3,4,5,6,7,8,9,10};
doubleThem (myInts , 10); //passei o array base
for (a=0; a<10; a++)
{
cout << myInts [a] <<\t;
}
return 0;
}
void doubleThem (int a[], int size)
{
int i;
for (i = 0; i < size; i++)
{
a[i] = 2 * a[i];
}
}

Obtido em "https://pt.wikibooks.org/w/index.php?title=Programar_em_C%2B%2B/Vetores&oldid=438517"

Categoria: Livro/Programar em C++

Esta pgina foi modificada pela ltima vez (s) 20h13min de 31 de outubro de 2016.
Este texto disponibilizado nos termos da licena Creative Commons Atribuio-Compartilhamento pela
mesma Licena 3.0 Unported; pode estar sujeito a condies adicionais. Consulte as Condies de Uso
para mais detalhes.

https://pt.wikibooks.org/wiki/Programar_em_C%2B%2B/Vetores 8/8

Você também pode gostar