Aula 9 Matrizes clssicas e vectores em C

  • Slides: 76
Download presentation
Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa! Introdução à Programação 2003/2004

Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa! Introdução à Programação 2003/2004

Ler três inteiros e escrevê-los por ordem inversa Como generalizar para 100, por exemplo?

Ler três inteiros e escrevê-los por ordem inversa Como generalizar para 100, por exemplo? #include <iostream> using namespace std; int main() { cout << "Introduza três inteiros: "; int a, b, c; cin >> a >> b >> c; cout << c << endl << b << endl << a << endl; Para simplificar ignoram -se possíveis erros de extracção! } 2 Introdução à Programação 2003/2004

Adaptação para 100 inteiros ¢ 3 Basta acrescentar 97 variáveis, obviamente… Introdução à Programação

Adaptação para 100 inteiros ¢ 3 Basta acrescentar 97 variáveis, obviamente… Introdução à Programação 2003/2004

Ler 100 inteiros e escrevê-los por ordem inversa #include <iostream> Pouco prático… using namespace

Ler 100 inteiros e escrevê-los por ordem inversa #include <iostream> Pouco prático… using namespace std; int main() { cout << "Introduza 100 inteiros: "; int a 1, a 2, a 3, …, a 100; cin >> a 1 >> a 2 >> a 3 >> … >> a 100; cout << a 100 << endl << a 99 << endl … << a 1 << endl; } 4 Introdução à Programação 2003/2004

Ler 100 inteiros e escrevê-los por Matriz de 100 ordem inversa inteiros #include <iostream>

Ler 100 inteiros e escrevê-los por Matriz de 100 ordem inversa inteiros #include <iostream> using namespace std; int main() { cout << "Introduza 100 inteiros: "; int valores[100]; ? } 5 Introdução à Programação 2003/2004

Tipo dos elementos Nome da matriz Número de elementos Sintaxe double m[4]; m[2] =

Tipo dos elementos Nome da matriz Número de elementos Sintaxe double m[4]; m[2] = 2. 2; double x = m[3]; Indexações Como uma variável 6 Introdução à Programação 2003/2004

Organização Índices: 1º elemento: índice 0 2º elemento: índice 1 … nº elemento: índice

Organização Índices: 1º elemento: índice 0 2º elemento: índice 1 … nº elemento: índice n-1 double m[4]; m: double[4] 7 m[0]: m[1]: m[2]: m[3]: ? ? Introdução à Programação 2003/2004

Inicialização Com lixo! double m[4]; m: double[4] 8 m[0]: m[1]: m[2]: m[3]: ? ?

Inicialização Com lixo! double m[4]; m: double[4] 8 m[0]: m[1]: m[2]: m[3]: ? ? Introdução à Programação 2003/2004

Inicialização explícita double m[4] = {0. 0, 1. 1, 2. 2, 3. 3}; m:

Inicialização explícita double m[4] = {0. 0, 1. 1, 2. 2, 3. 3}; m: double[4] 9 m[0]: m[1]: m[2]: m[3]: 0 1, 1 2, 2 3, 3 Introdução à Programação 2003/2004

Inicialização implícita (I) double m[4] = {0. 0, 1. 1}; m: double[4] 10 m[0]:

Inicialização implícita (I) double m[4] = {0. 0, 1. 1}; m: double[4] 10 m[0]: m[1]: m[2]: m[3]: 0 1, 1 0 0 Introdução à Programação 2003/2004

Inicialização implícita (II) double m[4] = {}; m: double[4] 11 m[0]: m[1]: m[2]: m[3]:

Inicialização implícita (II) double m[4] = {}; m: double[4] 11 m[0]: m[1]: m[2]: m[3]: 0 0 Introdução à Programação 2003/2004

Problemas das matrizes (I) ¢ ¢ 12 Inicializadas implicitamente com lixo Inicialização explícita exaustiva…

Problemas das matrizes (I) ¢ ¢ 12 Inicializadas implicitamente com lixo Inicialização explícita exaustiva… Introdução à Programação 2003/2004

Ler 100 inteiros e escrevê-los por ordem inversa #include <iostream> using namespace std; Absurdo!

Ler 100 inteiros e escrevê-los por ordem inversa #include <iostream> using namespace std; Absurdo! Por extensão não se ganhou nada! int main() { cout << "Introduza 100 inteiros: "; int valores[100]; cin >> valores[1]; cin >> valores[2]; … ? } 13 Introdução à Programação 2003/2004

Ler 100 inteiros e escrevê-los por ordem inversa #include <iostream> using namespace std; Extracção

Ler 100 inteiros e escrevê-los por ordem inversa #include <iostream> using namespace std; Extracção dos 100 inteiros e armazenamento na matriz por compreensão int main() { cout << "Introduza 100 inteiros: "; int valores[100]; for(int i = 0; i != 100; ++i) cin >> valores[i]; ? } 14 Introdução à Programação 2003/2004

Ler 100 inteiros e escrevê-los por ordem inversa #include <iostream> using namespace std; Inserção

Ler 100 inteiros e escrevê-los por ordem inversa #include <iostream> using namespace std; Inserção dos 100 inteiros por ordem inversa int main() { cout << "Introduza 100 inteiros: "; int valores[100]; for(int i = 0; i != 100; ++i) cin >> valores[i]; for(int i = 100; i != 0; --i) cout << valores[i - 1] << endl; } 15 Introdução à Programação 2003/2004

Ler 100 inteiros e escrevê-los por ordem inversa #include <iostream> using namespace std; Preferível!

Ler 100 inteiros e escrevê-los por ordem inversa #include <iostream> using namespace std; Preferível! int main() { cout << "Introduza 100 inteiros: "; int valores[100]; for(int i = 0; i != 100; ++i) cin >> valores[i]; for(int i = 99; i != -1; --i) cout << valores[i] << endl; } 16 Introdução à Programação 2003/2004

Elementos fictícios Elemento inicial Primeiro elemento double m[4]; m: double[4] m[-1]: m[0]: m[1]: m[2]:

Elementos fictícios Elemento inicial Primeiro elemento double m[4]; m: double[4] m[-1]: m[0]: m[1]: m[2]: m[3]: m[4]: ? ? ? Último Elemento elemento final 17 Introdução à Programação 2003/2004

Ciclos com matrizes ¢ Directo l ¢ Inverso l 18 Do primeiro ao elemento

Ciclos com matrizes ¢ Directo l ¢ Inverso l 18 Do primeiro ao elemento final, exclusive Do último ao elemento inicial, exclusive Introdução à Programação 2003/2004

Adaptação para 1000 inteiros ¢ 19 Basta substituir 100 por 1000, obviamente… Introdução à

Adaptação para 1000 inteiros ¢ 19 Basta substituir 100 por 1000, obviamente… Introdução à Programação 2003/2004

Ler 1000 inteiros e escrevê-los por ordem inversa #include <iostream> using namespace std; Ops…

Ler 1000 inteiros e escrevê-los por ordem inversa #include <iostream> using namespace std; Ops… int main() { cout << "Introduza 1000 inteiros: "; int valores[1000]; for(int i = 0; i != 1000; ++i) cin >> valores[i]; for(int i = 99; i != -1; --i) cout << valores[i] << endl; } 20 Introdução à Programação 2003/2004

Ler 1000 inteiros e escrevê-los por ordem inversa #include <iostream> using namespace std; Constante!

Ler 1000 inteiros e escrevê-los por ordem inversa #include <iostream> using namespace std; Constante! int main() { int const número_de_valores = 1000; cout << "Introduza “ << número_de_valores << “ inteiros: "; int valores[número_de_valores]; for(int i = 0; i != número_de_valores; ++i) cin >> valores[i]; for(int i = número_de_valores - 1; i != -1; --i) cout << valores[i] << endl; } 21 Introdução à Programação 2003/2004

Generalização (I) ¢ ¢ 22 E se se pretender generalizar a leitura para qualquer

Generalização (I) ¢ ¢ 22 E se se pretender generalizar a leitura para qualquer número de inteiros, dado pelo utilizador? Basta usar uma variável, obviamente… Introdução à Programação 2003/2004

Ler inteiros e escrevê-los por ordem inversa #include <iostream> Erro! Tem de ser constante!

Ler inteiros e escrevê-los por ordem inversa #include <iostream> Erro! Tem de ser constante! using namespace std; int main() { cout << “Introduza o número de valores a ler: “; int número_de_valores; cin >> número_de_valores; cout << "Introduza “ << número_de_valores << “ inteiros: "; int valores[número_de_valores]; … } 23 Introdução à Programação 2003/2004

Ler inteiros e escrevê-los por ordem inversa #include <iostream> Erro! Tem de ser constante

Ler inteiros e escrevê-los por ordem inversa #include <iostream> Erro! Tem de ser constante conhecida pelo compilador! using namespace std; int main() { cout << “Introduza o número de valores a ler: “; int n; cin >> n; int const número_de_valores = n; cout << "Introduza “ << número_de_valores << “ inteiros: "; int valores[número_de_valores]; … } 24 Introdução à Programação 2003/2004

Problemas das matrizes (II) ¢ ¢ 25 Inicializadas implicitamente com lixo Inicialização explícita exaustiva…

Problemas das matrizes (II) ¢ ¢ 25 Inicializadas implicitamente com lixo Inicialização explícita exaustiva… De dimensão fixa De dimensão conhecida pelo compilador Introdução à Programação 2003/2004

Ler 1000 inteiros e escrevê-los por ordem inversa #include <iostream> using namespace std; int

Ler 1000 inteiros e escrevê-los por ordem inversa #include <iostream> using namespace std; int main() { int const número_de_valores = 1000; cout << "Introduza “ << número_de_valores << “ inteiros: "; int valores[número_de_valores]; for(int i = 0; i != número_de_valores; ++i) cin >> valores[i]; for(int i = número_de_valores - 1; i != -1; --i) cout << valores[i] << endl; } 26 Introdução à Programação 2003/2004

Vamos modularizar ¢ ¢ 27 Leitura dos valores do teclado Escrita invertida dos valores

Vamos modularizar ¢ ¢ 27 Leitura dos valores do teclado Escrita invertida dos valores no ecrã Introdução à Programação 2003/2004

Ler 1000 inteiros e escrevê-los por ordem inversa #include <iostream> using namespace std; …

Ler 1000 inteiros e escrevê-los por ordem inversa #include <iostream> using namespace std; … int main() { int const número_de_valores = 1000; cout << "Introduza “ << número_de_valores << “ inteiros: "; int valores[número_de_valores]; // Leitura… escreve. Invertida(…); } 28 Introdução à Programação 2003/2004

escreve. Invertida() /** Escreve no ecrã os elementos da matriz passada como argumento começando

escreve. Invertida() /** Escreve no ecrã os elementos da matriz passada como argumento começando no último. */ void escreve. Invertida(…) { … } 29 Introdução à Programação 2003/2004

E a leitura? ¢ ¢ Procedimento, que altera a matriz recebida, preenchendo-a… …ou função,

E a leitura? ¢ ¢ Procedimento, que altera a matriz recebida, preenchendo-a… …ou função, que devolve uma matriz preenchida? C++ proíbe devolução de matrizes! Mas era má ideia devolver: l l l 30 Leitura afecta estado do programa (cin): procedimento Devolução de valor: função Rotina mista é má ideia! Introdução à Programação 2003/2004

Problemas das matrizes (III) ¢ ¢ ¢ 31 Inicializadas implicitamente com lixo Inicialização explícita

Problemas das matrizes (III) ¢ ¢ ¢ 31 Inicializadas implicitamente com lixo Inicialização explícita exaustiva… De dimensão fixa De dimensão conhecida pelo compilador Não se podem devolver Introdução à Programação 2003/2004

lêPara() /** Lê do teclado valores inteiros que coloca por ordem nos elementos da

lêPara() /** Lê do teclado valores inteiros que coloca por ordem nos elementos da matriz passada como argumento. */ void lêPara(…) { … } 32 Introdução à Programação 2003/2004

Passagem de matriz como argumento ¢ ¢ 33 lêPara(): passagem por referência escreve. Invertida():

Passagem de matriz como argumento ¢ ¢ 33 lêPara(): passagem por referência escreve. Invertida(): passagem por valor Introdução à Programação 2003/2004

escreve. Invertida() /** Escreve no ecrã os elementos da matriz passada como argumento começando

escreve. Invertida() /** Escreve no ecrã os elementos da matriz passada como argumento começando no último. @pre V. @post cout. fail() cout sofreu inserções dos número_de_valores elementos da matriz valores pela sua ordem inversa. */ void escreve. Invertida(int valores[número_de_valores]) { … } 34 Introdução à Programação 2003/2004

lêPara() /** Lê do teclado valores inteiros que coloca por ordem nos elementos da

lêPara() /** Lê do teclado valores inteiros que coloca por ordem nos elementos da matriz passada como argumento. @pre cin. good() cin permite extracção de número_de_valores inteiros sucessivos. @post cin. fail() cin já não contém os primeiros número_de_valores inteiros que continha inicialmente a matriz valores contém-nos pela mesma ordem. */ void lêPara(int valores[número_de_valores]) { … } Falta dizer que passagem é por referência! 35 Introdução à Programação 2003/2004

Passagem de matriz como argumento ¢ ¢ Sempre por referência! Necessário precaver alterações do

Passagem de matriz como argumento ¢ ¢ Sempre por referência! Necessário precaver alterações do argumento em escreve. Invertida()! Mentira piedosa… Explicação no 2º semestre… (tem a ver com ponteiros) 36 Introdução à Programação 2003/2004

Problemas das matrizes (IV) ¢ ¢ ¢ 37 Inicializadas implicitamente com lixo Inicialização explícita

Problemas das matrizes (IV) ¢ ¢ ¢ 37 Inicializadas implicitamente com lixo Inicialização explícita exaustiva… De dimensão fixa De dimensão conhecida pelo compilador Não se podem devolver Passagem sempre por referência (mentirita…) Introdução à Programação 2003/2004

escreve. Invertida() /** Escreve no ecrã os elementos da matriz passada como argumento começando

escreve. Invertida() /** Escreve no ecrã os elementos da matriz passada como argumento começando no último. @pre V. @post cout. fail() cout sofreu inserções dos número_de_valores elementos da matriz valores pela sua ordem inversa. */ void escreve. Invertida(int const valores[número_de_valores]) { … } Não é a matriz que é constante! São os seus elementos! 38 Introdução à Programação 2003/2004

Ler 1000 inteiros e escrevê-los por ordem inversa … /** … */ void lêPara(int

Ler 1000 inteiros e escrevê-los por ordem inversa … /** … */ void lêPara(int valores[número_de_valores]) { … } Invisível aqui! /** … */ void escreve. Invertida(int const valores[número_de_valores]) { … } int main() { int const número_de_valores = 1000; … } 39 Introdução à Programação 2003/2004

Ler 1000 inteiros e escrevê-los por ordem inversa … int const número_de_valores = 1000;

Ler 1000 inteiros e escrevê-los por ordem inversa … int const número_de_valores = 1000; /** … */ void lêPara(int valores[número_de_valores]) { C++ … ignora dimensão de } Mas o matrizes usadas como parâmetro! (mais uma /** vez, … */tem a ver com void escreve. Invertida(int ponteiros) const valores[número_de_valores]) { … } int main() { … } 40 Introdução à Programação 2003/2004

Problemas das matrizes (V) ¢ ¢ ¢ ¢ 41 Inicializadas implicitamente com lixo Inicialização

Problemas das matrizes (V) ¢ ¢ ¢ ¢ 41 Inicializadas implicitamente com lixo Inicialização explícita exaustiva… De dimensão fixa De dimensão conhecida pelo compilador Não se podem devolver Passagem sempre por referência (mentirita…) Dimensão ignorada em parâmetros Introdução à Programação 2003/2004

Ler 1000 inteiros e escrevê-los por ordem inversa … int const número_de_valores = 1000;

Ler 1000 inteiros e escrevê-los por ordem inversa … int const número_de_valores = 1000; /** … */ void lêPara(int valores[]) { … } Dimensão arbitrária /** … */ void escreve. Invertida(int const valores[]) { … } int main() { … } 42 Introdução à Programação 2003/2004

Em falta ¢ ¢ 43 Invocar procedimentos em main() Corpo dos procedimentos Introdução à

Em falta ¢ ¢ 43 Invocar procedimentos em main() Corpo dos procedimentos Introdução à Programação 2003/2004

Ler 1000 inteiros e escrevê-los por ordem inversa #include <iostream> using namespace std; int

Ler 1000 inteiros e escrevê-los por ordem inversa #include <iostream> using namespace std; int const número_de_valores = 1000; … int main() { cout << "Introduza “ << número_de_valores << “ inteiros: "; int valores[número_de_valores]; lêPara(valores); escreve. Invertida(valores); } 44 Introdução à Programação 2003/2004

lêPara() /** Lê do teclado valores inteiros que coloca por ordem nos elementos da

lêPara() /** Lê do teclado valores inteiros que coloca por ordem nos elementos da matriz passada como argumento. @pre cin. good() cin permite extracção de número_de_valores inteiros sucessivos. @post cin. fail() cin já não contém os primeiros número_de_valores inteiros que continha inicialmente a matriz valores contém-nos pela mesma ordem. */ void lêPara(int valores[]) { assert(cin. good()); for(int i = 0; i != número_de_valores; ++i) cin >> valores[i]; } 45 Introdução à Programação 2003/2004

escreve. Invertida() /** Escreve no ecrã os elementos da matriz passada como argumento começando

escreve. Invertida() /** Escreve no ecrã os elementos da matriz passada como argumento começando no último. Ainda constante global! @pre V. @post cout. fail() cout sofreu inserções dos número_de_valores elementos da matriz valores pela sua ordem inversa. */ void escreve. Invertida(int const valores[]) { for(int i = número_de_valores - 1; i != -1; --i) cout << valores[i] << endl; } 46 Introdução à Programação 2003/2004

Ler 1000 inteiros e escrevê-los por ordem inversa #include <iostream> using namespace std; …

Ler 1000 inteiros e escrevê-los por ordem inversa #include <iostream> using namespace std; … Dimensão passada como int main() argumento { int const número_de_valores = 1000; cout << "Introduza “ << número_de_valores << “ inteiros: "; int valores[número_de_valores]; lêPara(valores, número_de_valores); escreve. Invertida(valores, número_de_valores); } 47 Introdução à Programação 2003/2004

lêPara() /** Lê do teclado valores inteiros que coloca por ordem nos elementos da

lêPara() /** Lê do teclado valores inteiros que coloca por ordem nos elementos da matriz passada como argumento. Não há forma de saber @pre 0 ≤ número_de_valores de matriz número_de_valores ≤ dim(valores)dimensão cin. good() cin permite extracção de número_de_valores inteiros parâmetro! sucessivos. @post cin. fail() cin já não contém os primeiros número_de_valores inteiros que continha inicialmente a matriz valores contém-nos pela mesma ordem. */ void lêPara(int valores[], int const número_de_valores) { assert(0 <= número_de_valores); assert(cin. good()); for(int i = 0; i != número_de_valores; ++i) cin >> valores[i]; } 48 Introdução à Programação 2003/2004

Problemas das matrizes (VI) ¢ ¢ ¢ ¢ 49 Inicializadas implicitamente com lixo Inicialização

Problemas das matrizes (VI) ¢ ¢ ¢ ¢ 49 Inicializadas implicitamente com lixo Inicialização explícita exaustiva… De dimensão fixa De dimensão conhecida pelo compilador Não se podem devolver Passagem sempre por referência (mentirita…) Dimensão ignorada em parâmetros Não há forma de saber dimensão de matriz parâmetro Introdução à Programação 2003/2004

escreve. Invertida() /** Escreve no ecrã os elementos da matriz passada como argumento começando

escreve. Invertida() /** Escreve no ecrã os elementos da matriz passada como argumento começando no último. @pre 0 ≤ número_de_valores ≤ dim(valores). @post cout. fail() cout sofreu inserções dos número_de_valores elementos da matriz valores pela sua ordem inversa. */ void escreve. Invertida(int const valores[], int const número_de_valores) { assert(0 <= número_de_valores); for(int i = número_de_valores - 1; i != -1; --i) cout << valores[i] << endl; } 50 Introdução à Programação 2003/2004

Finalmente uma vantagem! ¢ ¢ 51 Procedimentos genéricos Funcionam com matrizes de dimensão arbitrária

Finalmente uma vantagem! ¢ ¢ 51 Procedimentos genéricos Funcionam com matrizes de dimensão arbitrária Número de valores passado pode ser diferente da dimensão das matrizes Mas… índices não verificados… Introdução à Programação 2003/2004

Indexação fora dos limites (I) int a = 0; int m[3] = {0, 1,

Indexação fora dos limites (I) int a = 0; int m[3] = {0, 1, 2}; int b = 0; m[-1] = -1; m[3] = 3; cout << a << ‘ ‘ << b << endl; 52 Introdução à Programação 2003/2004

Indexação fora dos limites (II) Que sucede? Sorte! ¢ Programa aborta ¢ Escreve 3

Indexação fora dos limites (II) Que sucede? Sorte! ¢ Programa aborta ¢ Escreve 3 -1 ¢ Escreve -1 3 ¢ Escreve 0 -1 ou -1 0 ou 0 3 ou … ¢ Escreve 0 0 Pior caso! 53 Introdução à Programação 2003/2004

Explicação (escreve 3 -1) … a: Memória ? 3 m: double[3] m[2]: 2 m[1]:

Explicação (escreve 3 -1) … a: Memória ? 3 m: double[3] m[2]: 2 m[1]: 1 m[0]: 0 b: -1 ? … 54 Introdução à Programação 2003/2004

Problemas das matrizes (VII) ¢ ¢ ¢ ¢ ¢ 55 Inicializadas implicitamente com lixo

Problemas das matrizes (VII) ¢ ¢ ¢ ¢ ¢ 55 Inicializadas implicitamente com lixo Inicialização explícita exaustiva… De dimensão fixa De dimensão conhecida pelo compilador Não se podem devolver Passagem sempre por referência (mentirita…) Dimensão ignorada em parâmetros Não há forma de saber dimensão de matriz parâmetro Índices não verificados Introdução à Programação 2003/2004

Mais problemas… double valores 1[2] = {1. 1, 2. 2}; double valores 2[2] =

Mais problemas… double valores 1[2] = {1. 1, 2. 2}; double valores 2[2] = {3. 3, 4. 4}; if(valores 1 != valores 2) valores 1 = valores 2; Impossível! 56 Introdução à Programação 2003/2004

Problemas das matrizes (VIII) ¢ ¢ ¢ 57 Inicializadas implicitamente com lixo Inicialização explícita

Problemas das matrizes (VIII) ¢ ¢ ¢ 57 Inicializadas implicitamente com lixo Inicialização explícita exaustiva… De dimensão fixa De dimensão conhecida pelo compilador Não se podem devolver Passagem sempre por referência (mentirita…) Dimensão ignorada em parâmetros Não há forma de saber dimensão de matriz parâmetro Índices não verificados Atribuições inválidas Comparações inválidas Introdução à Programação 2003/2004

Matrizes n-dimensionais (I) double m[2][3] = { {1, 2, 3}, {4, 5, 6} };

Matrizes n-dimensionais (I) double m[2][3] = { {1, 2, 3}, {4, 5, 6} }; ¢ Duas linhas e três colunas Matriz de matrizes ¢ Indexável: ¢ m[1][2] = 12. 0; 58 Introdução à Programação 2003/2004

Matrizes n-dimensionais (II) double (m[2])[3] = {…}; m: double[2][3] m[0]: double[3] m[1]: double[3] m[0][0]:

Matrizes n-dimensionais (II) double (m[2])[3] = {…}; m: double[2][3] m[0]: double[3] m[1]: double[3] m[0][0]: m[0][1]: m[0][2]: m[1][0]: m[1][1]: m[1][2]: 1 2 3 4 5 6 59 Introdução à Programação 2003/2004

Vectores: A solução #include <vector> Classe genérica Tipo dos itens Nome do vector Número

Vectores: A solução #include <vector> Classe genérica Tipo dos itens Nome do vector Número de itens Inicializado com 10 itens de valor zero std: : vector<double> v(10); Inicializado com 10 itens de valor 13 Inicializado com 0 itens! std: : vector<double> v(10, 13. 0); std: : vector<double> v; 60 Introdução à Programação 2003/2004

Acedendo à dimensão de vectores Instância para a vector<double> v(10, 13. 0); Nome da

Acedendo à dimensão de vectores Instância para a vector<double> v(10, 13. 0); Nome da operação qual a operação é a invocar invocada cout << v. size() << endl; Argumentos a passar à operação Invocação da operação size(). instância. operação(argumento, …); 61 Introdução à Programação 2003/2004

vector<…>: : size() ¢ ¢ Devolve inteiro sem sinal Tipo não-especificado: l l l

vector<…>: : size() ¢ ¢ Devolve inteiro sem sinal Tipo não-especificado: l l l ¢ unsigned short int? unsigned long int? Tipo exacto é sinónimo de vector<…>: : size_type 62 Introdução à Programação 2003/2004

Ler 1000 inteiros e escrevê-los por ordem inversa #include <iostream> #include <vector> using namespace

Ler 1000 inteiros e escrevê-los por ordem inversa #include <iostream> #include <vector> using namespace std; … int main() { int const número_de_valores = 1000; cout << "Introduza " << número_de_valores << " inteiros: "; vector<int> valores(número_de_valores); lêPara(valores); escreve. Invertido(valores); } 63 Introdução à Programação 2003/2004

lêPara() /** Lê do teclado valores inteiros que coloca por ordem nos itens do

lêPara() /** Lê do teclado valores inteiros que coloca por ordem nos itens do vector passado como argumento. @pre cin. good() cin permite extracção de valores. size() inteiros sucessivos. @post cin. fail() cin já não contém os primeiros valores. size() inteiros que continha inicialmente o vector valores contém-nos pela mesma ordem. */ void lêPara(vector<int>& valores) { assert(cin. good()); for(vector<int>: : size_type i = 0; i != valores. size(); ++i) cin >> valores[i]; } 64 Introdução à Programação 2003/2004

escreve. Invertida() /** Escreve no ecrã os elementos do vector passado como argumento começando

escreve. Invertida() /** Escreve no ecrã os elementos do vector passado como argumento começando no último. @pre V. @post cout. fail() cout sofreu inserções dos valores. size() itens do vector valores pela sua ordem inversa. */ void escreve. Invertido(vector<int> const valores) { for(vector<int>: : size_type i = valores. size() - 1; i != -1; --i) cout << valores[i] << endl; } i é de um tipo sem sinal. Nunca poderá chegar a -1. Guarda sempre verdadeira! 65 Introdução à Programação 2003/2004

escreve. Invertida() /** Escreve no ecrã os elementos do vector passado como argumento começando

escreve. Invertida() /** Escreve no ecrã os elementos do vector passado como argumento começando no último. @pre V. @post cout. fail() cout sofreu inserções dos valores. size() itens do vector valores pela sua ordem inversa. */ void escreve. Invertido(vector<int> valores) { for(vector<int>: : size_type i = valores. size(); i != 0; --i) cout << valores[i - 1] << endl; } 66 Introdução à Programação 2003/2004

é função nem Leitura com devolução. Não (I) procedimento! Má ideia! vector<int> vector. Lido(int

é função nem Leitura com devolução. Não (I) procedimento! Má ideia! vector<int> vector. Lido(int número_de_valores) { assert(cin. good()); vector<int> valores(número_de_valores); for(vector<int>: : size_type i = 0; i != valores. size(); ++i) cin >> valores[i]; return valores; } … int main() { … vector<int> valores = vector. Lido(número_de_valores); escreve. Invertido(valores); } 67 Introdução à Programação 2003/2004

é função nem Leitura com devolução. Não (II) procedimento! Má ideia! vector<int> vector. Lido(int

é função nem Leitura com devolução. Não (II) procedimento! Má ideia! vector<int> vector. Lido(int número_de_valores) { assert(cin. good()); vector<int> valores; for(int i = 0; i != número_de_valores; ++i) { int valor; cin >> valor; valores. push_back(valor); } return valores; } 68 Introdução à Programação 2003/2004

Vectores por valor? ¢ Vectores podem-se passar por valor Implica cópia do vector Vectores

Vectores por valor? ¢ Vectores podem-se passar por valor Implica cópia do vector Vectores podem ser grandes Passagem por referência não faz cópia Mas permite alterações no parâmetro… ¢ Ideal: vantagens de ambos ¢ ¢ 69 Introdução à Programação 2003/2004

Passagem por referência constante /** Escreve no ecrã os elementos do vector passado como

Passagem por referência constante /** Escreve no ecrã os elementos do vector passado como argumento começando no último. @pre V. @post cout. fail() cout sofreu inserções dos valores. size() itens do vector valores pela sua ordem inversa. */ void escreve. Invertido(vector<int> const& valores) { for(vector<int>: : size_type i = valores. size(); i != 0; --i) Sinónimo que proíbe alterações cout << valores[i - 1] << endl; Inútil para } tipos básicos! 70 Introdução à Programação 2003/2004

Generalização … int main() { cout << "Quantos valores quer que sejam lidos? ";

Generalização … int main() { cout << "Quantos valores quer que sejam lidos? "; int número_de_valores; cin >> número_de_valores; cout << "Introduza " << número_de_valores << " inteiros: "; vector<int> valores(número_de_valores); lêPara(valores); escreve. Invertido(valores); } 71 Introdução à Programação 2003/2004

Redimensionando vector<int> v(5, 1); v. resize(8); // Novos itens com zero. v. resize(9, 2);

Redimensionando vector<int> v(5, 1); v. resize(8); // Novos itens com zero. v. resize(9, 2); // Novos itens com 2. v. resize(2); 72 Introdução à Programação 2003/2004

Vantagens dos vectores ¢ ¢ ¢ ¢ ¢ 73 Inicializados implicitamente com zero Inicialização

Vantagens dos vectores ¢ ¢ ¢ ¢ ¢ 73 Inicializados implicitamente com zero Inicialização explícita abreviada… Dimensão variável Podem-se devolver Podem-se passar por valor ou por referência Dimensão não é nunca ignorada Pode-se saber dimensão Atribuições válidas Comparações válidas Introdução à Programação 2003/2004

Problemas dos vectores ¢ ¢ 74 Índices não verificados Inicialização exaustiva impossível Introdução à

Problemas dos vectores ¢ ¢ 74 Índices não verificados Inicialização exaustiva impossível Introdução à Programação 2003/2004

Solução recursiva /** Lê o número de inteiros passado como argumento e escreve-os pela

Solução recursiva /** Lê o número de inteiros passado como argumento e escreve-os pela ordem inversa. @pre 0 ≤ numero_de_valores cin. good() cin permite extracção Onde ficam guardados ossucessivos. de numero_de_valores inteiros @post cout. fail() valores? cout sofreu inserções dos numero_de_valores inteiros lidos pela sua ordem inversa. */ void le. EInverte. Inteiros(int const numero_de_valores) { assert(0 <= numero_de_valores); if(numero_de_inteiros_a_ler != 0) { int valor; cin >> valor; le. EInverte. Inteiros(numero_de_valores - 1); cout << valor << endl; } } 75 Introdução à Programação 2003/2004

Aula 9: Sumário ¢ Matrizes clássicas do C++: l l l Agregado indexável de

Aula 9: Sumário ¢ Matrizes clássicas do C++: l l l Agregado indexável de instâncias do mesmo tipo Sintaxe: definição e inicialização Particularidades: • • l ¢ Indexação fora dos limites: sintomatologia Vectores: l l 76 dimensão constante proibidas atribuições, comparações e devoluções passagens sempre por referência indexações fora dos limites não verificadas Vantagens face a matrizes Operações da classe genérica vector Introdução à Programação 2003/2004