Buscar

06.LabII.TADMatrizesEspeciais-Triangular

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.

Continue navegando