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

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ordenar estructuras en c
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ordenar estructuras en c  (Leído 3,938 veces)
javieer

Desconectado Desconectado

Mensajes: 14


Ver Perfil
ordenar estructuras en c
« en: 12 Abril 2018, 09:59 am »

Hola,

me podeis ayudar con este programa ? tengo creada una estructura asi con persona 1, persona 2 i no se como ordenarlas a traves de una función: en caso de que las dos personas sean "ALTO" comparar el nombre, si el nombre es igual comparar el apellido i si son iguales el dni,comparando persona 1 con persona 2 (0´si son iguales,-1 si persona 1 es inferior a persona 2 i 1 si es superior) lo podria hacer con un for?

typedef struct{
    
    char nombre[20];
    char apellido[20];
    altura alt;
    char dni[20]
    
}persona;

gracias.


« Última modificación: 12 Abril 2018, 11:02 am por javieer » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: ordenar estructuras en c
« Respuesta #1 en: 12 Abril 2018, 13:50 pm »

Yo iniciaría con un int llamado comparación a 0.
Un if comparando las alturas: si p1 es mayor 'comparación' a -1, si p2 es mayor 'comparación' a 1.
Si los dos son iguales 'comparación' seguirá a 0.
El segundo if: si 'comparación' vale 0:
Comparar el nombre. Como antes.
Si los dos nombres son iguales 'comparación' seguirá a 0.
El tercer if: si 'comparación' vale 0:
Compara los apellidos....
Supongo que ya has pillado el algoritmo pues se repite para todas las decisiones.

Al final devuelves 'comparación'.


« Última modificación: 12 Abril 2018, 20:52 pm por MAFUS » En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: ordenar estructuras en c
« Respuesta #2 en: 12 Abril 2018, 16:34 pm »

Como  te dice Mafus... te concreto un poquito más

La función general... nos paramos en el detalle de la comparación de dos elementos.
Donde se invoca una segunda función (básicamente sería sobrecargar el operador, pero bueno, aquí la llamamos EsMenor).
Código:
Funcion OrdenarMetodoX(Array de Estructura Persona P() )
    ....

    Si EsMenor(P(k), P(k+1)) = False
       ... lo que tengas que hacer, típicamente intercambiar la pareja.
    Fin si

    ....
Fin funcion

Si es mayor o igual, no pasa nada, pero podría ser al revés, según lo que convenga.
Código:
Buleano = Funcion EsMenor( Persona p1, Persona p2)
    entero r

    r = Signo(p2.Alto-p1.Alto )
    // Signo es una función que devuelve el signo de un valor, que devuelve -1, 0 ó 1, indicando si el valor es menor de cero, igual a cero o mayor de cero.
    // Al caso el valor es la resta de ambos en el orden correcto, para expresar como nos interese, esto es:  1 = p1 es menor que p2
    Si (r=0)        
        r = CadenaEsMenor(p1.Nombre, p2.Nombre)
        Si (r=0)  
            r = CadenaEsMenor(p1.Apellido, p2.Apellido)
            Si (r=0)
                r = Signo(p2.Dni - p1.Dni)                
            fin si
        fin si
    fin si

    // si tras analizar todo, son iguales, equivale a ser menor, así no se exige cambiar el orden
    // cambiar de orden de uno, por otro idéntico, es perder el tiempo...
    devolver (r > -1)  // Devuelve TRUE si p1 es menor o igual que p2
fin funcion

Compara cadenas y Devuelve -1, 0 ó 1 para 'es mayor, igual o menor respectivamente (puede cambiarse si se precisa).
Código:
Entero Funcion CadenaEsMenor(string p1, string p2)
    entero r

     // Un buleano tiene todos sus bits a 1, si es TRUE, por eso puede hacerse un test,
     //      y obtener un resultado aritmético (en según que lenguajes, puede necesitar un 'Cast'eo ).
    r = (( p2 > p1) and 1)              // 1 si p1 es menor que p2
    Si (r=0)                                   // Si es 0, p1 puede ser aún mayor o igual que p2
        r =  (((p1 = p2) and 1) -1)    // 0 si p1 = p2, -1 si p1 > p2
    Fin si
            
    Devolver r
Fin funcion
« Última modificación: 12 Abril 2018, 16:44 pm por NEBIRE » En línea

javieer

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: ordenar estructuras en c
« Respuesta #3 en: 13 Abril 2018, 11:50 am »

muchas gracias a los dos por contestar!! , aqui estoy luchando con los if  ;-) :laugh:
En línea

Kenji-chan

Desconectado Desconectado

Mensajes: 104


Ver Perfil
Re: ordenar estructuras en c
« Respuesta #4 en: 13 Abril 2018, 15:36 pm »

yo he echo una versión algo diferente.
ya que según la definición de javieer si en la comparación de el primer parámetro es mayor retornamos si es menor retornamos pero si son iguales pasamos a comparar el segundo parámetro de modo que:
Citar
//funcion que devuelve -1 si a > b, 1 si a < b y 0 si a == b
int cmpPersona(_persona a, _persona b){
   si a.altura > b.altura return -1;
   sino a.altura == b.altura
            /*hacemos lo mismo con los demas parametros
            /*cuando lleguemos al ultimo parámetro y los dos son iguales
               entonces las dos estructuras son iguales por lo tanto retornamos 0*/
            sino a.dni == b.dni
                return 0
            finsi
   finsi
      
   /*a qui solo llegaremos si un parámetro de a es menor que b
   return 1;
}

ahora en el main nos quedaría comparar las dos estructuras para saber cual de las dos es mayor

Citar
   switch(cmpPersona(a,b)){*/
      case -1: fprintf(stdout, "a es > b\n"); break;
      case 1: fprintf(stdout, "a es < b\n"); break;
      case 0: fprintf(stdout, "a es == b\n"); break;
   }

y si lo que queremos es ordenar una lista de (TDA)personas
usaríamos un algoritmo de ordenación ya conocido para el ejemplo usara el método de la burbuja

Citar
void burbuja(_persona* array){
   int i, j;
   _persona aux;
   for(i=1; i<max; i++){
      for(j=0; j<max-i; j++){
         if(cmpPersona(array[j], array[j-1]) > 0){
            aux = array[j+1];
            array[j+1] = array[j];
            array[j] = aux;
         }
      }
   }
}
En línea

javieer

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: ordenar estructuras en c
« Respuesta #5 en: 16 Abril 2018, 12:00 pm »

gracias por la respuesta! me ha servido bastante la verdad  ;-)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ordenar Estructuras
Programación C/C++
Ezio_Auditore 0 2,451 Último mensaje 15 Diciembre 2010, 09:25 am
por Ezio_Auditore
Estructuras.....
Programación C/C++
Rodri 1 2,731 Último mensaje 6 Octubre 2011, 19:46 pm
por satu
Estructuras en C++
Programación C/C++
jjrl1984 1 1,868 Último mensaje 18 Diciembre 2012, 02:27 am
por naderST
Duda ordenar estructuras c++
Programación C/C++
dbr69 3 2,224 Último mensaje 1 Febrero 2016, 09:12 am
por ivancea96
Estructuras dentro de Estructuras (Visual Basic 2013)
.NET (C#, VB.NET, ASP)
Tazmania40 0 1,869 Último mensaje 3 Marzo 2017, 21:44 pm
por Tazmania40
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines