Ponteiros

Preciso identificar se uma matriz quadrada de numeros inteiros é uma matriz identidade ou não. Se for matriz identidade ela tem que me retornar 1, e se não for precisa retornar 0 (matriz identidade é aquela em que a diagonal principal contém apenas 1s e o resto da matriz contém zeros). A função recebe como parâmetro a matriz de inteiros, usando a representação de matrizes através de ponteiro simples e um inteiro que indica a posição da matriz. Essa função deve obedecer o protótipo:
int ehMatrizIdentidade ( const int * mat, int n );

Estou desde ontem batendo cabeça com esse código e ainda não consegui fazer funcionar. Alguém pode me ajudar?
obs: usei o New porque no final de tudo os vetores tem que ser deletados.

#include <iostream>
using namespace std;

int ehMatrizIdentidade(const int ** mat, int n) {
    bool control = true;
	for(int i = 0; i<=n; i++){
		for(int j = 0; j <= n; j++){
			if(i==j){
				if(mat[0][2] +j != 1){
					control = false;
				}
			}else{
				if(mat[0][2] +j != 0){
					control = false;
				}
			}
		}
	}
	
	if(control == true ){
	return 1;
	} else {
		return 0;
	}
}

int main(){
int** mat = new int*[3];
int i, j;
for(int i = 0; i <3; i++){
 	mat[i] = new int [3];
 		for(i=0; i <= 3; i++){
			for(j=0;j <=3; j++){
				cout<<"Insira os valores da matriz: ";
   				cin>> mat[i][j];
 
 			}			
		 }
	}
	
	cout<< ehMatrizIdentidade(mat, 3);
		
	delete[]mat;
}

Minha solução usa um array comum. Aí eu tento simular 2 dimensões. Bom, ficou assim:

#include <iostream>

bool isIdentity(int* matrix, const int size) {
    for (int i = 0; i < size; i++)
        for (int j = 0; j < size; j++)
            if ( ( i == j && matrix[ i * size + j ] != 1 )
              || ( i != j && matrix[ i * size + j ] != 0 ) ) return false;
    return true;
}

int main() {
    int* m1 = new int[3 * 3];
    m1[0] = 1; m1[1] = 2; m1[2] = 3;
    m1[3] = 4; m1[4] = 5; m1[5] = 6;
    m1[6] = 1; m1[7] = 2; m1[8] = 3;

    int* m2 = new int[3 * 3];
    m2[0] = 1; m2[1] = 0; m2[2] = 0;
    m2[3] = 0; m2[4] = 1; m2[5] = 0;
    m2[6] = 0; m2[7] = 0; m2[8] = 1;

    std::cout << isIdentity(m1, 3) << std::endl;
    std::cout << isIdentity(m2, 3) << std::endl;

    delete[] m1;
    delete[] m2;
}

Muito obrigado, me ajudou bastante. Ponteiro ainda me confunde um bocado.

1 curtida

eu acho que a notação de C para ponteiros é um tanto confusa.

ainda mais se vc pensar de onde veio isso tudo. Se vc olhar como assembler funciona, vai ver como é natural acessar as posições de memoria. e trabalhar com dados mais complexos que o byte tem la seus desafios. ouve uma epoca q todo o programador tinha q começar seus programas definindo como fazer a multiplicação e divisão de numeros de ponto flutuante. isso só foi ser normalizado “recentemente” pela IEEE ( norma 754 é de 1985 pra vc ter uma ideia).

quando vc estuda assembler vc percebe por que C possui goto, porque if compara se é 0 ou diferente de 0, etc. e C++ vai trazer uma camada de abstração maior, vai tentar corrigir coisas no C, etc.

minha dica é vc observar a coisa do ponto de vista historico. quando vc entende o que motivou o que, e quais as premissas basicas, a ficha cai.

1 curtida

Sim, acho que por isso o prof manda usar c++. Eu entendo mais ou menos, mas as vezes em um código grande eu acabo, como se diz… emperrando. Chega um ponto que travo e não consigo sair do lugar por um tempo.

isso acontece com todo mundo. basta praticar bastante e vc vai controlar isso. pra tem coisas mais complexas por ai pra gente ficar emperrado :wink:

É verdade. Obrigado pelo conselho :grin: