Citar
Escribir un programa que encuentre una matriz de números reales simétrica. Para ello una función entera con entrada a la matriz determinará si ésta es simétrica. En otra función se generará la matriz con números aleatorios de 1 a 19.
Utilizar aritmética de apuntadores en la primera función; en la segunda, indexación.
Utilizar aritmética de apuntadores en la primera función; en la segunda, indexación.
En el ejercicio, pues como verán, lo hice de las dos formas, no de sobrado, sino por saber como trabajan por separado. Y pues mi problema no nisiquiera de programación, sino que no he podido dar con el chiste de hacer una maldita matriz transpuesta, cambiando de lugar los elementos de la matriz para que luego deba hacer la comprobación de si existe o no una matriz simétrica.
Para que me entiendan dejo el ejemplo de una matriz transpuesta:
Donde se puede ver, que los elementos de las filas y las columnas quedan "transpuestos" unos con otros, menos la diagonal principal, cambiando de lugar, la simetria se da cuando después del cambio los valores númericos de los elementos siguen siendo los mismos, de esta forma:
Y pues mi problema radica en que no he podido hacer la transposición, ya trate de varias maneras, pero me falla la lógica, no he podido dar con el chiste, me dan una mano amig@s???
he aquí el código, no es nada complicado:
Código
#include <iostream> #include <cstdio> #include <cstdlib> #include <time.h> using namespace std; void generarNumeros(int **matriz, int tam) { //Generando nçumeros aleatorios con indexación /*for (int i =0; i < tam; i++) { for(int j=0; j < tam; j++) { matriz[i][j] = 1 + rand() % 19; } }*/ //Generando nçumeros aleatorios con aritmetica de punteros for (int i=0; i < tam; i++ ) { for(int j=0; j < tam; j++) { *(*(matriz+i)+j) = 1 + rand() % 19; } } } void imprimirMatriz(int **matriz, int tam) { // Imprimiendo por indexación /*for (int i =0; i < tam; i++) { for(int j=0; j < tam; j++) { cout << matriz[i][j]; cout << " "; } cout << endl; }*/ // Imprimiendo por aritmetica de punteros for (int i=0; i < tam; i++ ) { for(int j=0; j < tam; j++) { cout << *(*(matriz+i)+j); cout << " "; } cout << endl; } } void transpuesta(int **matriz, int tam) { int aux; for (int i=0; i < tam; i++ ) { for(int j=0; j < tam; j++) { if(i == j) { aux = *(*(matriz+i)+j); *(*(matriz+i)+j) = *(*(matriz+j)+i); *(*(matriz+j)+i) = aux; } } } } int main() { srand(time(0)); int tamanyo; int **matrizPrincipal; // puntero para dos dimensiones del arreglo cout << "Problema 11.2 ----_____----" << endl << endl; cout << "Ingrese el tamaño de la matriz: "; cin >> tamanyo; matrizPrincipal = new int*[tamanyo]; /*asignacion de memoria de n punteros a enteros*/ for (int i =0; i < tamanyo; i++) matrizPrincipal[i] = new int[tamanyo]; /*asignacion de memoria para cada entero*/ /*comprobar si fue creado */ if (matrizPrincipal == NULL) { cout << "No se pudo crear la matriz" << endl; } generarNumeros(matrizPrincipal, tamanyo); imprimirMatriz(matrizPrincipal, tamanyo); cout << endl << endl; // matriz transpuesta cout << endl << "***MATRIZ TRANSPUESTA***" << endl; transpuesta(matrizPrincipal, tamanyo); imprimirMatriz(matrizPrincipal, tamanyo); return 0; }
Si ven las librerias adicionales como "cstdio" o "cstdlib" era porque estaba probando el tipico caso de printf vs cout. Aunque creo que srand() debe funcionar con cstdlib...en fin, no da problemas de compilación, el problema esta en la función "transpuesta(int **matriz, int tam)", pues no he podido dar con el truco de transponer los elementos.
Les agradezco el interés y la ayuda, slsd