aula 9 matrizes clássicas e vectores em c++ melhor alternativa!
TRANSCRIPT
![Page 1: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/1.jpg)
Aula 9
Matrizes clássicas e vectores em C++
Melhor alternativa!
![Page 2: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/2.jpg)
2003/2004Introdução à Programação2
Ler três inteiros e escrevê-los por ordem inversa
#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; }
Como generalizar para 100, por exemplo?
Para simplificar ignoram-se possíveis erros de extracção!
![Page 3: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/3.jpg)
2003/2004Introdução à Programação3
Adaptação para 100 inteiros
Basta acrescentar 97 variáveis, obviamente…
![Page 4: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/4.jpg)
2003/2004Introdução à Programação4
Ler 100 inteiros e escrevê-los por ordem inversa
#include <iostream>
using namespace std;
int main() { cout << "Introduza 100 inteiros: "; int a1, a2, a3, …, a100; cin >> a1 >> a2 >> a3 >> … >> a100;
cout << a100 << endl << a99 << endl … << a1 << endl; }
Pouco prático…
![Page 5: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/5.jpg)
2003/2004Introdução à Programação5
Ler 100 inteiros e escrevê-los por ordem inversa
#include <iostream>
using namespace std;
int main() { cout << "Introduza 100 inteiros: "; int valores[100];
?}
Matriz de 100 inteiros
![Page 6: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/6.jpg)
2003/2004Introdução à Programação6
Sintaxe
double m[4];
m[2] = 2.2;double x = m[3];
Tipo dos elementosNome da matrizNúmero de
elementos
Indexações
Como uma variável
![Page 7: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/7.jpg)
2003/2004Introdução à Programação7
Organização
double m[4];
m[0]:
?
m: double[4]
m[1]:
?
m[2]:
?
m[3]:
?
Índices:1º elemento: índice 02º elemento: índice 1…nº elemento: índice n-1
![Page 8: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/8.jpg)
2003/2004Introdução à Programação8
Inicialização
double m[4];
Com lixo!
m[0]:
?
m: double[4]
m[1]:
?
m[2]:
?
m[3]:
?
![Page 9: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/9.jpg)
2003/2004Introdução à Programação9
Inicialização explícita
double m[4] = {0.0, 1.1, 2.2, 3.3};
m[0]:
0
m: double[4]
m[1]:
1,1
m[2]:
2,2
m[3]:
3,3
![Page 10: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/10.jpg)
2003/2004Introdução à Programação10
Inicialização implícita (I)
double m[4] = {0.0, 1.1};
m[0]:
0
m: double[4]
m[1]:
1,1
m[2]:
0
m[3]:
0
![Page 11: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/11.jpg)
2003/2004Introdução à Programação11
Inicialização implícita (II)
double m[4] = {};
m[0]:
0
m: double[4]
m[1]:
0
m[2]:
0
m[3]:
0
![Page 12: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/12.jpg)
2003/2004Introdução à Programação12
Problemas das matrizes (I)
Inicializadas implicitamente com lixo Inicialização explícita exaustiva…
![Page 13: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/13.jpg)
2003/2004Introdução à Programação13
Ler 100 inteiros e escrevê-los por ordem inversa
#include <iostream>
using namespace std;
int main() { cout << "Introduza 100 inteiros: "; int valores[100]; cin >> valores[0]; cin >> valores[1]; cin >> valores[2]; …
?}
Absurdo! Por extensão não se ganhou nada!
![Page 14: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/14.jpg)
2003/2004Introdução à Programação14
Ler 100 inteiros e escrevê-los por ordem inversa
#include <iostream>
using namespace std;
int main() { cout << "Introduza 100 inteiros: "; int valores[100]; for(int i = 0; i != 100; ++i) cin >> valores[i];
?}
Extracção dos 100 inteiros e armazenamento na matriz por compreensão
![Page 15: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/15.jpg)
2003/2004Introdução à Programação15
Ler 100 inteiros e escrevê-los por ordem inversa
#include <iostream>
using namespace std;
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;}
Inserção dos 100 inteiros por ordem inversa
![Page 16: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/16.jpg)
2003/2004Introdução à Programação16
Ler 100 inteiros e escrevê-los por ordem inversa
#include <iostream>
using namespace std;
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;}
Preferível!
![Page 17: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/17.jpg)
2003/2004Introdução à Programação17
Elementos fictícios
double m[4];
m[0]:
?
m: double[4]
m[1]:
?
m[2]:
?
m[3]:
?
Elemento inicial
m[-1]: m[4]:
?
Elemento final
Primeiro elemento
Último elemento
![Page 18: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/18.jpg)
2003/2004Introdução à Programação18
Ciclos com matrizes
Directo Do primeiro ao elemento final, exclusive
Inverso Do último ao elemento inicial, exclusive
![Page 19: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/19.jpg)
2003/2004Introdução à Programação19
Adaptação para 1000 inteiros
Basta substituir 100 por 1000, obviamente…
![Page 20: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/20.jpg)
2003/2004Introdução à Programação20
Ler 1000 inteiros e escrevê-los por ordem inversa
#include <iostream>
using namespace std;
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;}
Ops…
![Page 21: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/21.jpg)
2003/2004Introdução à Programação21
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;}
Constante!
![Page 22: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/22.jpg)
2003/2004Introdução à Programação22
Generalização (I)
E se se pretender generalizar a leitura para qualquer número de inteiros, dado pelo utilizador?
Basta usar uma variável, obviamente…
![Page 23: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/23.jpg)
2003/2004Introdução à Programação23
Ler inteiros e escrevê-los por ordem inversa#include <iostream>
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];
…}
Erro! Tem de ser constante!
![Page 24: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/24.jpg)
2003/2004Introdução à Programação24
Ler inteiros e escrevê-los por ordem inversa#include <iostream>
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];
…}
Erro! Tem de ser constante conhecida pelo compilador!
![Page 25: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/25.jpg)
2003/2004Introdução à Programação25
Problemas das matrizes (II)
Inicializadas implicitamente com lixo Inicialização explícita exaustiva… De dimensão fixa De dimensão conhecida pelo compilador
![Page 26: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/26.jpg)
2003/2004Introdução à Programação26
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;}
![Page 27: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/27.jpg)
2003/2004Introdução à Programação27
Vamos modularizar
Leitura dos valores do teclado Escrita invertida dos valores no ecrã
![Page 28: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/28.jpg)
2003/2004Introdução à Programação28
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…
escreveInvertida(…);}
![Page 29: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/29.jpg)
2003/2004Introdução à Programação29
escreveInvertida()
/** Escreve no ecrã os elementos da matriz passada como argumento começando no último. */void escreveInvertida(…) { … }
![Page 30: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/30.jpg)
2003/2004Introdução à Programação30
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:
Leitura afecta estado do programa (cin): procedimento
Devolução de valor: função Rotina mista é má ideia!
![Page 31: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/31.jpg)
2003/2004Introdução à Programação31
Problemas das matrizes (III)
Inicializadas implicitamente com lixo Inicialização explícita exaustiva… De dimensão fixa De dimensão conhecida pelo compilador Não se podem devolver
![Page 32: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/32.jpg)
2003/2004Introdução à Programação32
lêPara()
/** Lê do teclado valores inteiros que coloca por ordem nos elementos da matriz passada como argumento. */void lêPara(…) { …}
![Page 33: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/33.jpg)
2003/2004Introdução à Programação33
Passagem de matriz como argumento
lêPara(): passagem por referência escreveInvertida(): passagem por valor
![Page 34: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/34.jpg)
2003/2004Introdução à Programação34
escreveInvertida()
/** 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 escreveInvertida(int valores[número_de_valores]) { … }
![Page 35: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/35.jpg)
2003/2004Introdução à Programação35
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!
![Page 36: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/36.jpg)
2003/2004Introdução à Programação36
Passagem de matriz como argumento
Sempre por referência! Necessário precaver alterações do argumento
em escreveInvertida()!
Mentira piedosa…Explicação no 2º semestre…(tem a ver com ponteiros)
![Page 37: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/37.jpg)
2003/2004Introdução à Programação37
Problemas das matrizes (IV)
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…)
![Page 38: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/38.jpg)
2003/2004Introdução à Programação38
escreveInvertida()
/** 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 escreveInvertida(int const valores[número_de_valores]) { … }
Não é a matriz que é constante! São os seus elementos!
![Page 39: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/39.jpg)
2003/2004Introdução à Programação39
Ler 1000 inteiros e escrevê-los por ordem inversa…
/** … */void lêPara(int valores[número_de_valores]) { … }
/** … */void escreveInvertida(int const valores[número_de_valores]) { … }
int main() { int const número_de_valores = 1000;
…}
Invisível aqui!Invisível aqui!
![Page 40: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/40.jpg)
2003/2004Introdução à Programação40
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]) { … }
/** … */void escreveInvertida(int const valores[número_de_valores]) { … }
int main() { …}
Mas o C++ ignora dimensão de matrizes usadas como parâmetro!(mais uma vez, tem a ver com ponteiros)
Mas o C++ ignora dimensão de matrizes usadas como parâmetro!(mais uma vez, tem a ver com ponteiros)
![Page 41: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/41.jpg)
2003/2004Introdução à Programação41
Problemas das matrizes (V)
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
![Page 42: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/42.jpg)
2003/2004Introdução à Programação42
Ler 1000 inteiros e escrevê-los por ordem inversa…
int const número_de_valores = 1000;
/** … */void lêPara(int valores[]) { … }
/** … */void escreveInvertida(int const valores[]) { … }
int main() { …}
Dimensão arbitráriaDimensão arbitrária
![Page 43: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/43.jpg)
2003/2004Introdução à Programação43
Em falta
Invocar procedimentos em main() Corpo dos procedimentos
![Page 44: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/44.jpg)
2003/2004Introdução à Programação44
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);
escreveInvertida(valores);}
![Page 45: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/45.jpg)
2003/2004Introdução à Programação45
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]; }
![Page 46: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/46.jpg)
2003/2004Introdução à Programação46
escreveInvertida()
/** 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 escreveInvertida(int const valores[]) { for(int i = número_de_valores - 1; i != -1; --i) cout << valores[i] << endl; }
Ainda constante global!
![Page 47: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/47.jpg)
2003/2004Introdução à Programação47
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]; lêPara(valores, número_de_valores);
escreveInvertida(valores, número_de_valores);}
Dimensão passada como argumentoDimensão passada como argumento
![Page 48: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/48.jpg)
2003/2004Introdução à Programação48
lêPara()
/** Lê do teclado valores inteiros que coloca por ordem nos elementos da matriz passada como argumento. @pre 0 ≤ número_de_valores número_de_valores ≤ dim(valores) 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[], 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]; }
Não há forma de saber dimensão de matriz parâmetro!
![Page 49: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/49.jpg)
2003/2004Introdução à Programação49
Problemas das matrizes (VI)
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
![Page 50: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/50.jpg)
2003/2004Introdução à Programação50
escreveInvertida()
/** Escreve no ecrã os elementos da matriz passada como argumento começando no último. @pre 0 ≤ número_de_valores 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 escreveInvertida(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; }
![Page 51: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/51.jpg)
2003/2004Introdução à Programação51
Finalmente uma vantagem!
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…
![Page 52: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/52.jpg)
2003/2004Introdução à Programação52
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;
![Page 53: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/53.jpg)
2003/2004Introdução à Programação53
Indexação fora dos limites (II)
Que sucede? Programa aborta Escreve 3 -1 Escreve -1 3 Escreve 0 -1 ou -1 0 ou 0 3 ou … Escreve 0 0
Sorte!
Pior caso!
![Page 54: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/54.jpg)
2003/2004Introdução à Programação54
Explicação (escreve 3 -1)
m[0]:
0
m: double
[3]
m[1]:
1
m[2]:
2
b:
?
a:
?
…
…
Memória
3
-1
![Page 55: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/55.jpg)
2003/2004Introdução à Programação55
Problemas das matrizes (VII)
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
![Page 56: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/56.jpg)
2003/2004Introdução à Programação56
Mais problemas…
double valores1[2] = {1.1, 2.2};double valores2[2] = {3.3, 4.4};
if(valores1 != valores2) valores1 = valores2;
Impossível!Impossível!
![Page 57: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/57.jpg)
2003/2004Introdução à Programação57
Problemas das matrizes (VIII)
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
![Page 58: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/58.jpg)
2003/2004Introdução à Programação58
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;
![Page 59: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/59.jpg)
2003/2004Introdução à Programação59
Matrizes n-dimensionais (II)
double (m[2])[3] = {…};
m[0][0]:
1
m[0]: double[3]
m[0][1]:
2
m[0][2]:
3
m[1][0]:
4
m[1]: double[3]
m[1][1]:
5
m[1][2]:
6
m: double[2][3]
![Page 60: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/60.jpg)
2003/2004Introdução à Programação60
Vectores: A solução
#include <vector>
std::vector<double> v(10);
std::vector<double> v(10, 13.0);
std::vector<double> v;
Tipo dos itensNome do vector
Número de itensInicializado com 10 itens de valor zero
Inicializado com 10 itens de valor 13
Inicializado com 0 itens!
Classe genérica
![Page 61: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/61.jpg)
2003/2004Introdução à Programação61
Acedendo à dimensão de vectores
vector<double> v(10, 13.0);cout << v.size() << endl;
instância.operação(argumento, …);
Invocação da operação size().
Instância para a qual a operação é invocada
Nome da operação a invocar
Argumentos a passar à operação
![Page 62: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/62.jpg)
2003/2004Introdução à Programação62
vector<…>::size()
Devolve inteiro sem sinal Tipo não-especificado:
unsigned short int? unsigned int? unsigned long int?
Tipo exacto é sinónimo devector<…>::size_type
![Page 63: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/63.jpg)
2003/2004Introdução à Programação63
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);
escreveInvertido(valores); }
![Page 64: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/64.jpg)
2003/2004Introdução à Programação64
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]; }
![Page 65: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/65.jpg)
2003/2004Introdução à Programação65
escreveInvertida()
/** 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 escreveInvertido(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!
![Page 66: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/66.jpg)
2003/2004Introdução à Programação66
escreveInvertida()
/** 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 escreveInvertido(vector<int> valores) { for(vector<int>::size_type i = valores.size(); i != 0; --i) cout << valores[i - 1] << endl; }
![Page 67: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/67.jpg)
2003/2004Introdução à Programação67
Leitura com devolução (I)
vector<int> vectorLido(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 = vectorLido(número_de_valores);
escreveInvertido(valores); }
Não é função nem procedimento! Má ideia!
![Page 68: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/68.jpg)
2003/2004Introdução à Programação68
Leitura com devolução (II)
vector<int> vectorLido(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; }
Não é função nem procedimento! Má ideia!
![Page 69: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/69.jpg)
2003/2004Introdução à Programação69
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
![Page 70: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/70.jpg)
2003/2004Introdução à Programação70
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 escreveInvertido(vector<int> const& valores) { for(vector<int>::size_type i = valores.size(); i != 0; --i) cout << valores[i - 1] << endl; }
Sinónimo que proíbe alteraçõesInútil para tipos básicos!
![Page 71: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/71.jpg)
2003/2004Introdução à Programação71
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);
escreveInvertido(valores); }
![Page 72: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/72.jpg)
2003/2004Introdução à Programação72
Redimensionando
vector<int> v(5, 1); v.resize(8); // Novos itens com zero.
v.resize(9, 2); // Novos itens com 2.
v.resize(2);
![Page 73: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/73.jpg)
2003/2004Introdução à Programação73
Vantagens dos vectores
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
![Page 74: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/74.jpg)
2003/2004Introdução à Programação74
Problemas dos vectores
Índices não verificados Inicialização exaustiva impossível
![Page 75: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/75.jpg)
2003/2004Introdução à Programação75
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 de numero_de_valores inteiros sucessivos. @post cout.fail() cout sofreu inserções dos numero_de_valores inteiros lidos pela sua ordem inversa. */void leEInverteInteiros(int const numero_de_valores){ assert(0 <= numero_de_valores);
if(numero_de_inteiros_a_ler != 0) { int valor; cin >> valor; leEInverteInteiros(numero_de_valores - 1); cout << valor << endl; }}
Onde ficam guardados os valores?
![Page 76: Aula 9 Matrizes clássicas e vectores em C++ Melhor alternativa!](https://reader033.vdocuments.site/reader033/viewer/2022051615/552fc11a497959413d8c96a8/html5/thumbnails/76.jpg)
2003/2004Introdução à Programação76
Aula 9: Sumário
Matrizes clássicas do C++: Agregado indexável de instâncias do mesmo tipo Sintaxe: definição e inicialização Particularidades:
• dimensão constante• proibidas atribuições, comparações e devoluções• passagens sempre por referência• indexações fora dos limites não verificadas
Indexação fora dos limites: sintomatologia Vectores:
Vantagens face a matrizes Operações da classe genérica vector