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 •Matrizes •Representação linear Matrizes – Matrizes aparecem com grande frequência em diversos problemas. – A seguir, será apresentada a implementação de um TAD para matrizes cheias (densas) usando a representação linear vista em sala de aula de ED. – TAD TMat2D TAD TMat2D •Dados –M x N elementos •Operações –Construir (Criar) matriz com M linhas e N colunas –Destruir (Liberar) matriz –Consultar (Acessar) elemento na posição (i,j) – Atribuir (Alterar) o valor do elemento na posição (i,j) –etc. TAD TMat2D (representação linear) TAD TMat2D •Observações: –O TAD TMat2D será implementado usando uma representação linear – isto é, um vetores. –Sendo assim, é necessário transformar os índices i e j da matriz, no índice K correspondente do vetor. –Logo, K = I * N + J TAD TMat2D •Para implementar o TAD TMat2D em C++ deve- se criar os seguintes arquivos: –TMat2D.h •Definição da classe TMat2D •Dados e operações do TAD –TMat2D.cpp •MI – Modulo de implementação do TAD TMat2D TMat2D.h class TMat2D { private: float *vet; int m, n; int detInd(int linha, int coluna); public: TMat2D(int mm, int nn); void atribui(int linha, int coluna, float valor); float consulta(int linha, int coluna); ~TMat2D(); }; TMat2D.cpp (1) #include "TMat2D.h" #include <iostream> #include <cstdlib> using namespace std; TMat2D::TMat2D(int mm, int nn) { cout << "Construtor (TMat2D)" << endl; m = mm; n = nn; vet = new float[m*n]; } TMat2D::~TMat2D() { cout << "Destrutor (TMat2D)" << endl; delete [] vet; } TMat2D.cpp (2) int TMat2D::detInd(int linha, int coluna) { if(linha >= 0 && linha < m && coluna >= 0 && coluna < n) return n*linha + coluna; else return -1; } TMat2D.cpp (3) float TMat2D::consulta(int linha, int coluna) { int k = detInd(linha, coluna); if(k != -1) return vet[k]; else { cout << "Indice invalido!" << endl; exit(1); } } TMat2D.cpp (4) void TMat2D::atribui(int linha, int coluna, float valor) { int k = detInd(linha, coluna); if(k != -1) vet[k] = valor; else { cout << "Indice invalido!" << endl; exit(1); } } PA usando o TAD TMat2D #include <iostream> #include "TMat2D.h" // inclui o TAD TMat2D0 using namespace std; int main(){ int i,j; float valor; TMat2D *mat = new TMat2D(3,3);// cria matriz for (i=0;i<3;i++){ for (j=0;j<3;j++){ cin >> valor; // le dados do teclado mat->atribui(i,j,valor);//preenche a //matriz } } mat->imprimir();//implementar de forma a //atender o exercício 1 delete mat; // libera matriz return 0; } Exercícios 1. Implementar uma operação no MI do TAD TMat2D para imprimir a matriz. 2. Implementar uma função no PA que determina se uma matriz é ou não simétrica. 3. Implementar uma função no PA para encontrar o maior valor da matriz. 4. Implementar uma operação no MI do TAD TMat2D para calcular e retornar a multiplicação de 2 matrizes. Uma delas é passada implicitamente e a outra como parâmetro, protótipo: TMat2D* TMat2D::Multiplica(TMat2D *M) Exercícios 5. Implementar uma operação no MI do TAD TMat2D para criar e retornar a transposta da matriz. Utilizar o seguinte protótipo: TMat2D* TMat2D::Transposta(); Obs: essa operação não deve alterar a matriz original, apenas criar uma nova matriz e copiar os elementos de forma correta para a nova matriz. 6. Implementar a operação no MI do TAD TMat2D que realiza o produto de uma matriz por um vetor. O vetor será representado por um array de objetos do domínio float. Deve-se verificar se número de elementos n do vetor é igual ao número de linhas da matriz. Exercícios Essa operação deve possuir o seguinte protótipo: float* TMat2D::ProdMatVet(int n, float v[]); onde v representa o vetor a ser multiplicado pela matriz. O resultado é um vetor (float*) que deve ser alocado de forma dinâmica dentro da função e retornado ao final.
Compartilhar