elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Función que diga si dos columnas/filas de una matriz son iguales.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Función que diga si dos columnas/filas de una matriz son iguales.  (Leído 2,095 veces)
hackersanfe

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Función que diga si dos columnas/filas de una matriz son iguales.
« en: 4 Diciembre 2018, 19:10 pm »

Buenas tardes, estoy intentando realizar esta función en C, sin embargo no se me ocurre la manera correcta de llegar a ella. Concretamente mi ejercicio es:

"Escribe un programa, que en primer lugar, genere una matriz de NxM elementos enteros con números aleatorios comprendidos entre 1 y 20 (N y M constantes enteras globales).
El programa además de generar la matriz, deberá escribir sus valores y escribir un mensaje indicando si hay o no dos columnas iguales en la matriz, en caso de no haberlas, solo en ese caso, deberá escribir un mensaje indicando si hay o no dos filas iguales en la matriz. Si no hubiera ni dos filas iguales, ni dos columnas iguales escribirá un mensaje indicándolo.
También escribirá el valor máximo y la fila y columna en la que se encuentra la primera aparición del valor máximo (haciendo un recorrido por filas)."

Se trata de una función de NxM.
Si me podeis dar una idea de como seria el hacerla me ayudariais un monton. Porque en mi cabeza parece facil (y seguro que lo es) pero no llego a ello... un saludo y gracias por cualquier ayuda recibida.
Código:
#include<stdlib.h>
#include<time.h>
#include <stdio.h>
#define N 3
#define M 6

void escribirMat (int mat[N][M]);
void generaMat (int mat[N][M]);
void matrizMaxPos (int mat[N][M], int *max, int *fil, int *col);
int columnasIguales(int mat[N][M]);


int main()
{
    int mat[N][M];
    int *max=0,*fila=0,*columna=0;
    generaMat(mat);
    escribirMat(mat);
    matrizMaxPos(mat,&max,&fila,&columna);
    printf("\nMaximo: %d y aparece por primera vez en la fila %d y columna %d.\n",max,fila,columna);
    if(columnasIguales(mat)==1){
        printf("\nHay al menos dos columnas iguales.\n");
    }
    else printf("\nNinguna columna igual.\n");
    return 0;
}


void generaMat(int mat[N][M])
{
    int f,c;
    srand(time(NULL));
    for(f=0; f<N; f++)
        for(c=0; c<M; c++)
            mat[f][c]=rand()%20+1;
}

void matrizMaxPos (int mat[N][M], int *max, int *fil, int *col){
    int i,j,enc=0;
    for(i=0;i<N;i++){
        for(j=0;j<M;j++){
            if(*max<mat[i][j])
                *max=mat[i][j];
        }
    }
    for(i=0;i<N;i++){
        for(j=0;j<M;j++){
            if(*max==mat[i][j]&&!enc){
                *fil=i+1;
                *col=j+1;
                enc=1;
            }
        }
    }
}

int columnasIguales(int mat[N][M]){
    int i=0,j=0,iguales=0;
    if((mat[i][j]==mat[i][j+1]&&i<N-1&&j<M-1)&&(mat[i+1][j]==mat[i+1][j+1]&&i<N-1&&j<M-1)&&(mat[i+2][j]==mat[i+2][j+1]&&i<N-1&&j<M-1))
        iguales=1;
    else{
        i++;
        j++;
    }
    return iguales;
}

void escribirMat (int mat[N][M]){
    int i,j;
    for(i=0;i<N;i++){
        for(j=0;j<M;j++){
            printf("%d ", mat[i][j]);
        }
        printf("\n");
    }
}


« Última modificación: 4 Diciembre 2018, 19:55 pm por hackersanfe » En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 834



Ver Perfil
Re: Función que diga si dos columnas/filas de una matriz son iguales.
« Respuesta #1 en: 4 Diciembre 2018, 19:14 pm »

Especifica qué parte es la que no sabes implementar... si es desde meter los valores en la matriz o comparar dos filas o columnas...
Y si tienes algo de código hecho ponlo también en el mensaje para que lo veamos. :-X


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
hackersanfe

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Función que diga si dos columnas/filas de una matriz son iguales.
« Respuesta #2 en: 4 Diciembre 2018, 19:28 pm »

Especifica qué parte es la que no sabes implementar... si es desde meter los valores en la matriz o comparar dos filas o columnas...
Y si tienes algo de código hecho ponlo también en el mensaje para que lo veamos. :-X
Ya está compañero.
Especificamente lo que no se implementar es la comparacion de la primera columna con la segunda, la primera con la tercera, la primera con la cuarta... hasta que se hayan comparado todas con todas. La funcion que aparece ahi de columnas iguales no me funciona por cierto, es lo que intente yo pero nada.
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 834



Ver Perfil
Re: Función que diga si dos columnas/filas de una matriz son iguales.
« Respuesta #3 en: 4 Diciembre 2018, 20:28 pm »

Primero tienes que cambiar la declaración siguiente:
Código
  1. int *max=0,*fila=0,*columna=0;
No tienes que declararlos como punteros si luego los pasas a la función usando "&".

Ahora la función, por ejemplo una forma de comparar cada columna de una forma visual es la siguiente:
Código
  1. int compararColumnas(int matriz[FILAS][COLUMNAS]){
  2. int iguales = 0;
  3. int columnaAComparar[FILAS];
  4.  
  5. for(int i = 0; i < COLUMNAS-1 && !iguales; i++){
  6. for(int j = 0; j < FILAS; j++) // copiamos la columna a comparar en columnaAComparar
  7. columnaAComparar[j] = matriz[j][i];
  8.  
  9. for(int m = i+1; m < COLUMNAS && !iguales; m++){ // para cada columna en adelante, mientras no sean iguales...
  10. iguales = 1; // ...suponemos que la columna m es igual a la columna i guardada en columnaAComparar
  11. for(int n = 0; n < FILAS && iguales; n++) // recorremos la columna m mientras no lleguemos al final y sean iguales
  12. if(matriz[n][m] != columnaAComparar[n])
  13. iguales = 0;
  14. }
  15. }
  16. return iguales;
  17. }

También puedes ahorrarte el copiar la columna a comparar en cada iteración. Así ganas eficiencia aunque se ve peor por eso para que lo veas bien te lo dejo así y ya tú cuando lo entiendas puedes cambiarlo para no tener que usar un array auxiliar. Suerte.
« Última modificación: 5 Diciembre 2018, 19:49 pm por YreX-DwX » En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
hackersanfe

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Función que diga si dos columnas/filas de una matriz son iguales.
« Respuesta #4 en: 4 Diciembre 2018, 23:55 pm »

Muchisimas gracias, la verdad es que aunque exista otra manera mas eficiente de hacerla, esa me parece clarisima. Gracias de verdad. ;-)
En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Función que diga si dos columnas/filas de una matriz son iguales.
« Respuesta #5 en: 5 Diciembre 2018, 02:05 am »

Me gusto la solucion propuesta.

Mientras la miraba se me ocurrio otra, pero es definitivamente mas complicada, asi que la presento solo para incluir una idea adicional.

Si uno mantiene adicionalmente algun valor para cada columna / fila (por ejemplo la suma de los elementos), se puede descartar rapidamente si una fila es candidata a ser igual a otra.

Código:
  1   2   3  4
  4   5   6  8
  7   8   9  0
[12  15  18  12]  <-- sumas


Solo es necesario comparar la 1a y 4ta columna.
Lo que significa para el codigo propuesto es hacer 1 comparacion que controle si hay que hacer el ciclo for de la linea 11 o no.

La modificacion es, en la linea 10, cambiar la asignacion y hacer:
Código
  1.             iguales = (sumas[i] == sumas[m]);

El arreglo sumas se crea en generaMat.

En línea

hackersanfe

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: Función que diga si dos columnas/filas de una matriz son iguales.
« Respuesta #6 en: 5 Diciembre 2018, 18:58 pm »

Me gusto la solucion propuesta.

Mientras la miraba se me ocurrio otra, pero es definitivamente mas complicada, asi que la presento solo para incluir una idea adicional.

Si uno mantiene adicionalmente algun valor para cada columna / fila (por ejemplo la suma de los elementos), se puede descartar rapidamente si una fila es candidata a ser igual a otra.

Código:
 1   2   3  4
  4   5   6  8
  7   8   9  0
[12  15  18  12]  <-- sumas


Solo es necesario comparar la 1a y 4ta columna.
Lo que significa para el codigo propuesto es hacer 1 comparacion que controle si hay que hacer el ciclo for de la linea 11 o no.

La modificacion es, en la linea 10, cambiar la asignacion y hacer:
Código
  1.             iguales = (sumas[i] == sumas[m]);

El arreglo sumas se crea en generaMat.


Claro, es una implementacion un poco mas complicada en mi opinion, pero tambien seria valida.
Ahora estoy intentando hacer que me funcione el modelo que paso el compañero para que haga lo mismo con las filas, de momento no lo estoy consiguiendo, esto es lo que he hecho:
Código:
int compararFilas(int mat[N][M])
{
    int iguales=0,i,j,m,n;
    int filaAComparar[N];
    for(i=0; i<N-1&&!iguales; i++)
    {
        for(j=0; j<M; j++)
            filaAComparar[j]=mat[j][i];

        for(m=i+1; m<M; m++)
       {
            iguales=1;
            for(n=0; n<N&&iguales; n++) /
                if(mat[n][m]!=filaAComparar[n])
                    iguales=0;
        }


    }
    return iguales;
}
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 834



Ver Perfil
Re: Función que diga si dos columnas/filas de una matriz son iguales.
« Respuesta #7 en: 5 Diciembre 2018, 19:19 pm »

Tienes que ver qué índice representa a las filas y qué índice a las columnas. No vale eso de coger un código cambiarle el nombre y que haga otra cosa.
Edit: Además mira a ver cuál debería ser el tamaño de tu array auxiliar... Suerte.
« Última modificación: 5 Diciembre 2018, 19:34 pm por YreX-DwX » En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Función que diga si dos columnas/filas de una matriz son iguales.
« Respuesta #8 en: 5 Diciembre 2018, 19:36 pm »

Parece que la logica original hay que modifcarla un poco, pues si existen 2 coliumnas iguales, pero justo las ultimas 2 que se comparan no son iguales, la funcion va a retornar 0.

Es lo que se quiere?
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 834



Ver Perfil
Re: Función que diga si dos columnas/filas de una matriz son iguales.
« Respuesta #9 en: 5 Diciembre 2018, 19:44 pm »

Parece que la logica original hay que modifcarla un poco, pues si existen 2 coliumnas iguales, pero justo las ultimas 2 que se comparan no son iguales, la funcion va a retornar 0.

Es lo que se quiere?

Es cierto, faltaría meterle la condición de que no sean iguales a uno de los <for> para que en cuanto haya dos iguales salga del todo. Fallo mío :-X Con estas correcciones ya debería funcionar. :silbar:
Edit: Ya está modificado el código original (creo que no tiene más fallos, si alguien encuentra alguno que me lo comente). Y Hackersanfe, te recomiendo que lo pienses por ti mismo, el reto está en conseguir hacerlo funcionar sin mirar la solución, mirándola es muy fácil.
« Última modificación: 5 Diciembre 2018, 19:52 pm por YreX-DwX » En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Leer matriz por filas y almacenarla por columnas
Programación C/C++
mariyop 1 4,962 Último mensaje 28 Noviembre 2011, 17:50 pm
por rir3760
Obtener size() de columnas y filas de una matriz
Programación C/C++
Stone20 1 1,629 Último mensaje 15 Abril 2012, 13:15 pm
por Stone20
Suma de filas y columnas de una matriz en C
Programación C/C++
estudiante_1 1 15,668 Último mensaje 30 Diciembre 2015, 22:19 pm
por MAFUS
Suma de filas y columnas de una matriz
.NET (C#, VB.NET, ASP)
Ahinoam 2 4,770 Último mensaje 15 Diciembre 2016, 23:59 pm
por Ahinoam
Quitar filas y columnas de una matriz en c
Programación C/C++
victiman 0 2,116 Último mensaje 6 Junio 2017, 22:40 pm
por victiman
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines