Baixe o app para aproveitar ainda mais
Prévia do material em texto
Laboratório de Programação II Departamento de Ciência da Computação UFJF Aula de hoje •Casos especiais de Matrizes: Matriz Triangular •Representação linear Matriz Triangular –Definição: Uma matriz é considerada triangular se todos os elementos abaixo ou acima da diagonal principal são nulos. –A seguir, será apresentada a implementação de um TAD para matrizes triangulares inferiores, usando a representação linear vista na aula de ED. –TAD TMatTriang TAD TMatTriang •Dados – Numa matriz triangular de ordem n (quadrada n x n), o total de elementos a serem representados é: n(n+1)/2 •Operações –Construir (Criar) a representação linear da matriz –Destruir (Liberar) a representação linear da matriz –Consultar (Acessar) o elemento na posição (i,j) –Atribuir (Alterar) o valor do elemento da posição (i,j) –etc. TAD TMatTriang (representação linear) TAD TMatTriang •Observações: –O TAD TMatTriang será implementado usando uma representação linear – isto é, um vetor. –Sendo assim, é necessário transformar os índices i e j da matriz, no índice K correspondente do vetor. –Logo, K = (i*(i+1)/2) + j TAD TMatTriang •Para implementar o TAD TMatTriang em C++ deve-se criar os seguintes arquivos: –TMatTriang.h •Definição da classe TMatTriang •Dados e operações do TAD –TMatTriang.cpp •MI – Modulo de implementação do TAD TMatTriang TMatTriang.h class TMatTriang { int n; // ordem da matriz triangular float *vet; // representação linear da // triangular bool Verifica(int i, int j); public: TMatTriang(int ordemMatriz); float Consulta(int i, int j); void Atribui(int i, int j, float valor); ~TMatTriang(); }; TMatTriang.cpp (1) #include "TMaTriang.h" #include <iostream> #include <cstdlib> using namespace std; TMatTriang::TMatTriang(int ordemMatriz) { n = ordemMatriz; //m: tamanho do vetor vet int m = n*(n + 1)/2; vet = new float[m];//aloca m floats para vet } TMatTriang::~TMatTriang() //desaloca a memória alocada pelo construtor { delete [] vet; } TMatTriang.cpp (2) bool TMatTriang::Verifica(int i, int j) { //verifica validade dos indices de linha e coluna if(i >= 0 && i < n && j >= 0 && j < n) return true; else return false; //indice invalido }; TMatTriang.cpp (3) float TMatTriang::Consulta(int i, int j) { if(Verifica(i, j)) { if(i >= j) { int k = i*(i + 1)/2 + j; return vet[k]; } else return 0.0; } else cout<<“Não consulta: Indice invalido”<<endl; exit(1); // finaliza o programa } TMatTriang.cpp (4) void TMatTriang::Atribui(int i, int j, float valor) { if(Verifica(i, j)) { if(i >= j) { int k = i*(i + 1)/2 + j; vet[k] = valor; } else if(valor != 0.0) cout<<“Não atribui:elemento[“<<i<<“,” <<j<<“] fora do triangulo inferior” <<endl; } else cout<<“Não atribui: Indice invalido” <<endl; } PA usando o TAD TMatTriang #include <iostream> #include "TMatTriang.h" // inclui o TAD TMatTriang using namespace std; int main() { TMatTriang *mat = new TMatTriang(2); mat->Atribui(0, 0, 1.2); mat->Atribui(1, 0, 2.2); mat->Atribui(1, 1, 3.2); printf("%f", mat->Consulta(1,1)); delete mat; return 0; } Exercícios 1. Implementar o TAD matriz simétrica usando o TAD da matriz triangular inferior anteriormente implementado. Ver abaixo o TAD TMatSim. class TMatSim { // representação da matriz simétrica por uma // triangular inferior TMatTriang *MatTriagInf; public: TMatSim(int ordemMatriz); float Consulta(int i, int j); void Atribui(int i, int j, float valor); void Imprime(void); ~TMatSim(); }; Exercícios Desenvolver: a) Construtor (inicializa variáveis e aloca memória, se necessário); b) Destrutor (desaloca memória que foi alocada no construtor); c) Verificar a validade dos índices i e j da matriz. d) Consultar o valor real da posição de índices i e j (válidos) da matriz simétrica. e) Atribuir um valor real para a posição de índices i e j (válidos) da matriz simétrica. Exercícios 1. Resolução. a) Criar o projeto PMatSimetrica b) Fazer uma cópia dos arquivos (foram implementados): TMatTriang.cpp TMatTriang.h na mesma pasta do projeto PMatSimetrica c) Incluir estes arquivos no projeto PMatSimetrica (usar botão direito do mouse sobre o nome do projeto PMatSimetrica) Exercícios 1. Resolução. d) Criar o aquivo MatSimetrica.h #include "TMatTriang.h" // inclui o TAD TMatTriang class TMatSim { // representação da matriz simétrica por uma // triangular inferior TMatTriang *MatTriagInf; public: TMatSim(int ordemMatriz); float Consulta(int i, int j); void Atribui(int i, int j, float valor); void Imprime(void); ~TMatSim(); }; Exercícios 1. Resolução. e) Criar o arquivo MatSimetrica.cpp Construtor e destrutor #include "MatSimetrica.h" #include <iostream> using namespace std; TMatSim::TMatSim(int ordemMatriz){ //cria um objeto da da matriz triangular inferior //essa matriz representará a matriz simétrica MatTriagInf = new TMatTriang(ordemMatriz); } TMatSim::~TMatSim(){ //desaloca a memória alocada pelo construtor delete MatTriagInf; } Exercícios 1. Resolução. e) Criar o arquivo MatSimetrica.cpp Consulta float TMatSim::Consulta(int i, int j) { //a operação consulta() da matriz triangular //inferior verificará os índices if(i >= j)//valor está na triangulo inferior return MatTriagInf->Consulta(i, j); else //valor está na triangulo superior return MatTriagInf->Consulta(j, i); } Exercícios 1. Resolução. e) Criar o arquivo MatSimetrica.cpp Atribui void TMatSim::Atribui(int i, int j, float valor) { //a operação consulta() da matriz triangular //inferior verificará os índices if(i >= j)//valor está na triangulo inferior return MatTriagInf->Atribui(i, j, valor); else //valor está na triangulo superior return MatTriagInf->Atribui(j, i, valor); } Exercícios 1. Resolução. e) Criar o arquivo MatSimetrica.cpp Imprime void TMatSim::Imprime(int Ordem) { cout<<endl; for(int i=0; i<Ordem; i++) { for(int j=0; j<Ordem; j++) cout<<Consulta(i, j)<<"\t"; cout<<endl; } } Exercícios 1. Resolução. e) Criar o arquivo MatSimetrica.cpp main #include <iostream> #include "MatSimetrica.h" using namespace std; int main(){ int Ordem = 8; TMatSim *m = new TMatSim(Ordem); for(int i=0; i<Ordem; i++) for(int j=0; j<Ordem; j++) m->Atribui(i,j,i*Ordem + j + 1); m->Imprime(Ordem); delete m; return 0; } Exercícios 2. Implementar o TAD matriz anti-simétrica usando o TAD da matriz triangular inferior já implementado. Ver a seguir o TAD TMatAntiSimetrica. class TMatAntiSimetrica { // representação da matriz anti-simétrica por // uma triang. inferior TMatTriang *MatTriagInf; public: TMatAntiSimetrica(int ordemMatriz); float Consulta(int i, int j); void Atribui(int i, int j, float valor); ~TMatAntiSimetrica(); }; Exercícios Desenvolver: a) Construtor (inicializa variáveis e aloca memória, se necessário); b) Destrutor (desaloca memória que foi alocada no construtor); c) Verificar a validade dos índices i e j da matriz. d) Consultar o valor real da posição de índices i e j (válidos) da matriz anti-simétrica. e) Atribuir um valor real para a posição de índices i e j (válidos) da matriz anti-simétrica.
Compartilhar