elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 00:44  


Tema destacado: Sigue las noticias más importantes de elhacker.net en ttwitter!

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  C:Calcular montañas en los datos almacenados en una matriz
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: C:Calcular montañas en los datos almacenados en una matriz  (Leído 701 veces)
deifk

Desconectado Desconectado

Mensajes: 13


Ver Perfil
C:Calcular montañas en los datos almacenados en una matriz
« en: 17 Enero 2012, 15:57 »

Hola de nuevo!
Tengo un problema al realizar una funcion ya que nose muy bien por donde empezar, el caso es que tengo una serie de datos que he pasado de un fichero a una matriz en este caso 5x5, pero supongamos NXM. El problema que se plantea es el siguiente:

Los datos almacenados son alturas y tengo que comparar las alturas con las de los 8 vecinos, logicamente los extremos de la matriz no tienen 8 vecinos y no entran dentro del problema.

Si la altura es mayor que la de los 8 vecinos, tengo que sacar por pantalla esa altura y sus coordenadas, todo esto mediante una funcion.

Mi problema es el no saber desarrollar la funcion, no tengo muy claro las variables a utilizar, aparte de los i,j para recorrer la matriz, los valores que debo poner dentro de los for.

Siento no poner codigo pero es que no se me ocurre nada decente, puedo pegar el resto del programa si es ayuda pero creo que no tiene nada que ver.

Mi prototipo de funcion es(ya que solo imprime valores y no los devuelve):

void Muestra_montanas(float matriz [][M])
{

}

Gracias
Un saludo


En línea
El_Java

Desconectado Desconectado

Mensajes: 132



Ver Perfil WWW
Re: C:Calcular montañas en los datos almacenados en una matriz
« Respuesta #1 en: 17 Enero 2012, 17:08 »

Solo tienes que comparar la casilla en la que estás con las 8 de alrededor:
horizontal : sumar +-1 a las columnas si columnas > 0 o columnas < M-1
vertical: sumar +-1 a las filas si filas > 0 o filas < N-1
diagonal: sumar +-1 a las filas y las columnas, las condiciones para evitar salirte de la matriz es una mezcla de las 4 anteriores.
y para saber cuantas son menores que la casilla en la que estás basta con poner un contador a 0 y cada vez que se cumpla la condicion sumarle 1

Logicamente, no te lo voy a dar hecho, y tampoco puedo decir literalmente como hacerlo, pero sí que puedo intentar orientarte para saber que hacer más o menos, lo más engorroso de este problema es tener cuidado con las posiciones 0, N-1 y M-1 (porque las posiciones que rodean a estas casillas no son 8.

Un saludo!


En línea
soyloqbuskas

Desconectado Desconectado

Mensajes: 94


¡El conocimiento es de todos!


Ver Perfil
Re: C:Calcular montañas en los datos almacenados en una matriz
« Respuesta #2 en: 17 Enero 2012, 17:20 »

Buenas defik!
Para hacer ese procedimiento debes recorrer la matriz que se hace con 2 bucles for anidados:

Código:
for(i=0;i<N;i++){
     for(j=0;j<M;j++){
    
          //codigo de comprobacion de los valores

     }
}

Y para comprobar los valores debes usar condicionales, como ejemplo cojamos esta matriz 3x3

        0   1   2  (i)
    
    0  2   4   5
  
    1  3   9   6

    2  1   3   2
   (j)

En el caso del 9, para comprobar si es mayor que los demas debes comparar las posicion (1,1) con las posiciones: (0,0) , (0,1) , (0,2) , (1,0) , (1,2) , (2,0) , (2,1) , (2,2)

O lo que es lo mismo dada una posicion (i,j) lo tienes que comparar con las posiciones: (i-1,j-1) , (i,j-1) , (i+1,j-11) , (i-1,j) , (i+1,j) , (i-1,j+1) , (i,j+1) , (i+1,j+1)

Si al hacer todas estas comparaciones te sale que la posicion (i,j) es mayor, entonces es una montaña.

Asi que dentro de los 2 bucles debes meter 8 if() que haga cada una de estas comparaciones y los 8 resultados te deben salir positivos.

Y Para que te funcione con los laterales lo unico que debes hacer es que cuando compares las posiciones  (i,j) con por ejemplo (i-1,j), debes comprobar que i-1 no es menor que 0.

Y con esto tienes hecho el procemiento. Es un poco lioso porque tiene muchas condiciones pero bueno...

Espero haberte servido de ayuda, un saludo.
En línea

"Si tienes 1 manzana y yo tengo otra manzana...
y las intercambiamos, ambos seguiremos teniendo 1 manzana.
Pero...si tu tienes 1 idea y yo tengo otra idea...
y las intercambiamos, ambos tendremos 2 ideas."


George Bernard Shaw
rir3760


Desconectado Desconectado

Mensajes: 382


Ver Perfil
Re: C:Calcular montañas en los datos almacenados en una matriz
« Respuesta #3 en: 17 Enero 2012, 17:28 »

Solo agregar que, si lo permite el enunciado, se puede agregar un borde de centinelas para así evitar los casos especiales (con su costo, por supuesto).

Por ejemplo en el caso de la matriz 5x5:
Código:
0 0 0 0 0 0 0
0 X X X X X 0
0 X X X X X 0
0 X X X X X 0
0 X X X X X 0
0 X X X X X 0
0 0 0 0 0 0 0
Donde las Xs son los valores de matriz y los 0s los centinelas. De esa forma se puede desarrollar una función que, dada una coordenada, verifique si esta es mayor que cualquiera de sus ocho vecinos retornando verdadero o falso (según corresponda).

Un saludo
En línea

The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
deifk

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Re: C:Calcular montañas en los datos almacenados en una matriz
« Respuesta #4 en: 17 Enero 2012, 20:36 »

Gracias a todos, ahora lo mirare mas detalladamente , ahora se por donde van los tiros.

Un saludo

P.D: No pretendia que me lo dierais hecho, solo queria una indicacion hacia el camino correcto como las que me habeis dado, gracias
En línea
deifk

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Re: C:Calcular montañas en los datos almacenados en una matriz
« Respuesta #5 en: 18 Enero 2012, 15:18 »

Hola de nuevo! compilando el programa me da el siguiente error:

/tmp/ccu9rC1z.o: In function `main':
ejercicio4.c:(.text+0x2e): undefined reference to `Muestra_montanas'
collect2: ld devolvió el estado de salida 1

Os pego el codigo completo a ver si me podeis decir cual es el fallo:

------------------------------------------------------------------------------

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define M 5
#define N 5

void Lee_Fichero(char [], float[][M]);
void Muestra_montanas(float [][M]);
 

main()
{
  int num;
  float m1[N][M];
  
  Lee_Fichero("cartografia.dat",m1);
  Muestra_montanas(m1);
}

void Lee_Fichero(char nombre[],float matriz[N][M])
{
 
  FILE *f1;
  int i,j;
  
  f1=fopen(nombre,"r");
  
  if(f1!=NULL)
  {
    for(i=0; i<N;i++)
    {
     for(j=0;j<M;j++)
      {
      fscanf(f1,"%f", matriz[j]);
      }
    }  
    fclose(f1);
  }
  else
  {  
    printf("Error en la apertura del fichero %s\n",nombre);
    exit(-1);
  }
}  
void Muestra_Montanas(float m[N][M])
{
  float max_altura;
  int i,j;
  
  max_altura=m[j];
  for(i=1;i<N-1;i++)
  {
    for(j=1; j<M-1;j++)
    {
    if(m[j]>m[j-1] && m[j]>m[j+1] &&m[j]>m[i-1][j-1] && m[j]>m[i+1][j-1] && m[j]>m[i-1][j] && m[j]>m[i+1][j] && m[j]>m[i-1][j+1] && m[j]>m[i+1][j+1])
       {
        max_altura=m[j];
        printf("Las coordenadas de la montaña son %d y %d y su altura %f", i, j, max_altura);
        }
    }
  }  
    
    
}    

------------------------------------------------------------------
En línea
Xandrete

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: C:Calcular montañas en los datos almacenados en una matriz
« Respuesta #6 en: 18 Enero 2012, 15:47 »

Simple. Tienes una función cuyo prototipo es void Muestra_montanas(float [][M]), pero en el encabezado de la definición de dicha función has puesto Muestra_Montanas. Fíjate en el mensaje de error del compilador, lo dice bastante claro.

Saludos.
« Última modificación: 18 Enero 2012, 15:58 por Xandrete » En línea
deifk

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Re: C:Calcular montañas en los datos almacenados en una matriz
« Respuesta #7 en: 18 Enero 2012, 15:58 »

Dios mira que mire a ver si era algo de eso..
ahora bien me compila pero al ejecutar me da un error de segmentacion, a que se puede deber?
gracias
un saludo
« Última modificación: 18 Enero 2012, 16:02 por deifk » En línea
Xandrete

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: C:Calcular montañas en los datos almacenados en una matriz
« Respuesta #8 en: 18 Enero 2012, 16:01 »

que imbecil soy mira que lo mire asi por encima lo de las mayusculas..

No, hombre. Tampoco te llames imbécil, que no es para tanto. A todos se nos ha olvidado alguna vez un ; u otra tontería de éstas  ;)
En línea
deifk

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Re: C:Calcular montañas en los datos almacenados en una matriz
« Respuesta #9 en: 18 Enero 2012, 21:38 »

alguna idea del porque de un error de segmentacion?
En línea
Xandrete

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: C:Calcular montañas en los datos almacenados en una matriz
« Respuesta #10 en: 18 Enero 2012, 23:03 »

Código
fscanf(f1,"%f", matriz[j]);

Supongo que en todo caso sería

Código
fscanf(f1,"%f", matriz[i][j]);

La función Muestra_montanas la tienes plagada de errores de este tipo. Recuerda que para acceder a un elemento de una matriz hacen falta dos índices.

Saludos
« Última modificación: 18 Enero 2012, 23:05 por Xandrete » En línea
deifk

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Re: C:Calcular montañas en los datos almacenados en una matriz
« Respuesta #11 en: 18 Enero 2012, 23:06 »

el caso es que al pegar el codigo todos los "i" de la matriz se han borrado ponen como que estan y luego no salen, asi que nose que podra ser
En línea
Xandrete

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: C:Calcular montañas en los datos almacenados en una matriz
« Respuesta #12 en: 18 Enero 2012, 23:12 »

Ah, claro. Eso es porque no utilizas las etiquetas para adjuntar código ([ code=c ] [ /code ]). La etiqueta [ i ] [ /i ] sirve para escribir en cursiva. Ya que estamos, a partir de ahora usa [ code ] para pegar código. Será más fácil de leer. Si puedes, hazlo ahora (no me gustaría tener que intuir cosas allá donde no las hay).
En línea
deifk

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Re: C:Calcular montañas en los datos almacenados en una matriz
« Respuesta #13 en: 18 Enero 2012, 23:19 »

Disculpas, he posteado escasas veces y no era consciente de estas herramientas, a ver si asi alguien me puede decir el porque del "error de segmentacion"
Gracias!

Código
#include <stdio.h> 
#include <string.h>
#include <stdlib.h>
 
#define M 5
#define N 5
 
void Lee_Fichero(char [], float[][M]);
void Muestra_montanas(float [][M]);
 
 
main()
{
 float m1[N][M];
 
 Lee_Fichero("cartografia.dat",m1);
 Muestra_montanas(m1);
}
 
void Lee_Fichero(char nombre[],float matriz[N][M])
{
 
 FILE *f1;
 int i,j;
 
 f1=fopen(nombre,"r");
 
 if(f1!=NULL)
 {
   for(i=0; i<N;i++)
   {
    for(j=0;j<M;j++)
     {
 
     fscanf(f1,"%f", matriz[i][j]);
     }
   }
   fclose(f1);
 }  
 else
 {
   printf("Error en la apertura del fichero %s\n",nombre);
   exit(-1);
 }
}
void Muestra_montanas(float m[N][M])
{
 float max_altura;
 int i,j;
 
 max_altura=m[i][j];
 for(i=1;i<N-1;i++)
 {
   for(j=1; j<M-1;j++)
   {
   if(m[i][j]>m[i][j-1] && m[i][j]>m[i][j+1] &&m[i][j]>m[i-1][j-1] && m[i][j]>m[i+1][j-1] && m[i][j]>m[i-1][j] && m[i][j]>m[i+1][j] && m[i][j]>m[i-1][j+1] && m[i][j]>m[i+1][j+1
      {
       max_altura=m[i][j];
       printf("Las coordenadas de la montaña son %d y %d y su altura %f", i, j, max_altura);
       }
   }
 }
 
 
En línea
Xandrete

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: C:Calcular montañas en los datos almacenados en una matriz
« Respuesta #14 en: 18 Enero 2012, 23:26 »

Tranqui, no pasa nada.

Ya había visto el error antes de que postearas. Mira:

Código
  float max_altura;
 int i,j;
 
 max_altura=m[i][j];

Ni i ni j están inicializadas, por tanto el valor que tienen es impredecible (o, dicho de otra manera, es basura). Por tanto, seguramente la violación de segmento se produce cuando accedes a m[  i][j] sin haberles dado un valor previo a j,i.

Joder, he tenido que reeditar el post 100 veces porque esta vez fui yo quien se hizo la picha un lío con lo de las cursivas.
« Última modificación: 18 Enero 2012, 23:29 por Xandrete » En línea
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[C] Calcular determinante de una matriz de orden 'n'
Programación C/C++
Kasswed 7 10,137 Último mensaje 8 Febrero 2012, 14:56
por do-while
Calcular Datos de un Datagridview
.NET
PFLOPS 4 3,772 Último mensaje 31 Marzo 2009, 19:11
por Hadess_inf
[Encuesta] ¿Te dan miedo las montañas rusas? « 1 2 »
Foro Libre
pitoloko 15 1,754 Último mensaje 8 Agosto 2011, 16:24
por ruben_linux
Organizar introduccion de datos en Matriz
Programación C/C++
NecBalaam 2 322 Último mensaje 22 Agosto 2011, 17:01
por rir3760
El TC incluye los datos almacenados en un ordenador en el derecho a la intimidad
Noticias
wolfbcn 0 469 Último mensaje 18 Noviembre 2011, 21:59
por wolfbcn
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines