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

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Consulta - Punteros
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Consulta - Punteros  (Leído 2,369 veces)
Cero++

Desconectado Desconectado

Mensajes: 52



Ver Perfil WWW
Consulta - Punteros
« en: 12 Diciembre 2018, 16:59 pm »

Buenas, otra vez yo! Necesito me aclaren esto, porque la verdad es que no entiendo para qué debería hacer la función que me están pidiendo, a ver si me pueden esclarecer un poco.
Consigna:
Código
  1. Escriba una funcion busca_mayor() que permita buscar el mayor elemento de un arreglo de structs segun diferentes criterios.
  2. La funcion debe recibir como argumentos el arreglo de structs de tipo alumno, el tamanio del mismo, y un puntero a otra funcion que utilizara para comparar dos elementos de tipo alumno y saber cual es el mayor de ellos.
  3. struct alumno {
  4. char nombre[50];
  5. int dni, edad, calificacion;
  6. };
  7. Implemente funciones que comparen dos alumnos segun su dni, segun su edad,
  8. segun su calificacion, y segun su nombre alfabeticamente, y genere un programa cliente que permita ingresar los datos de N alumnos y buscar el mayor segun el
  9. criterio que el usuario seleccione mediante un menu.

Esto fue lo que hice yo:  //No quiero que me hagan los ejercicios, solo que me ayuden en las dudas que tengo, así puedo terminar de comprenderlos, sino nunca voy a poder razonarlos si me los hacen
Código
  1. #include <iostream>
  2. using namespace std;
  3. struct alumno {
  4. char nombre[50];
  5. int dni, edad, calificacion;
  6. };
  7. alumno Busca_mayor(alumno a[], int size);
  8. alumno Compara_nombre(alumno a[], int size);
  9. alumno Compara_dni(alumno a[], int size);
  10. alumno Compara_edad(alumno a[], int size);
  11. alumno Compara_calificacion(alumno a[], int size);
  12. int main(int argc, char *argv[]) {
  13. alumno *A=nullptr; int size;
  14. /*Carga del arreglo*/
  15. ....
  16. ....
  17. /*Ejemplo de seleccion de funcion*/
  18. switch(op){
  19. case 1:
  20. alumno aux=Compara_nombre(A,size);
  21. cout<<"El mayor es: "<<aux.nombre; //Solo es un ejemplo...
  22. case 2:
  23. case 3:
  24. case 4:
  25. default:
  26. }
  27.  
  28. return 0;
  29. }
  30. /*Como deberia usar esta funcion, no entiendo, si ya con las otras
  31. funciones ya puedo obtener el mayor de los alumnos, cual es la funcion que cumple?*/
  32. alumno Busca_mayor(alumno a[], int size, int *p){ //Como usaria el tercer argumento? no entiendo
  33.  
  34. }
  35. alumno Compara_nombre(alumno a[], int size){
  36. alumno aux;
  37. for(int i=0;i<size;i++) {
  38. if(a[i].nombre<a[i+1].nombre){
  39. aux=a[i+1];
  40. }
  41. }
  42. return aux;
  43. }
  44. alumno Compara_dni(alumno a[], int size){
  45. alumno aux;
  46. for(int i=0;i<size;i++) {
  47. if(a[i].dni<a[i+1].dni){
  48. aux=a[i+1];
  49. }
  50. }
  51. return aux;
  52. }
  53. alumno Compara_edad(alumno a[], int size){
  54. alumno aux;
  55. for(int i=0;i<size;i++) {
  56. if(a[i].edad<a[i+1].edad){
  57. aux=a[i+1];
  58. }
  59. }
  60. return aux;
  61. }
  62. alumno Compara_calificacion(alumno a[], int size){
  63. alumno aux;
  64. for(int i=0;i<size;i++) {
  65. if(a[i].calificacion<a[i+1].calificacion){
  66. aux=a[i+1];
  67. }
  68. }
  69. return aux;
  70. }


En línea

Código:
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Consulta - Punteros
« Respuesta #1 en: 12 Diciembre 2018, 17:27 pm »

El tercer argumento es un puntero a función por el cual le pasarás la función que realmente va a comparar.
Es cómo la función qsort, fíjate en ella.

La idea es: cada función que compara dos elementos por [lo que sea] devuelve:
  • un entero negativo si al_1 es menor a al_2
  • 0 si al_1 es igual a al_2
  • un entero positivo si al_1 es mayor a al_2

La firma de estas funciones auxiliares sería algo así:
Código:
int funcion(alumno *al_1, alumno *al_2);
Las funciones reciben punteros para no andar copiando estructuras enteras cada vez, por tanto dentro de la función tendrás que usar notación de punteros para acceder a los miembros.

La firma de tu función principal sería
Código:
alumno* Busca_mayor(alumno *base, size_t size, int (*comparar) (alumno *al_1, alumno *al_2))

Dentro de ella tendrás que buscar el mayor de tu array haciendo uso de la función de comparación para ir encontrado el mayor de los elementos comparados.


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Consulta - Punteros
« Respuesta #2 en: 12 Diciembre 2018, 18:45 pm »

La firma de estas funciones auxiliares sería algo así:
Código:
int funcion(alumno *al_1, alumno *al_2);
Las funciones reciben punteros para no andar copiando estructuras enteras cada vez, por tanto dentro de la función tendrás que usar notación de punteros para acceder a los miembros.

Otra alternativa, ya que el programa es en C++ y no en C es pasar los parámetros por referencia.
Código
  1. int funcion(const alumno &al_1, const alumno &al_2)
Personalmente prefiero usar está opción y evitas usar la notación de punteros. Te lo dejo como alternativa. :-X
En línea

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

Desconectado Desconectado

Mensajes: 52



Ver Perfil WWW
Re: Consulta - Punteros
« Respuesta #3 en: 13 Diciembre 2018, 20:07 pm »

Estuve pensando desde ayer las respuestas que me dieron, pero, no entiendo, no importa, gracias de todos modos  ;D
En línea

Código:
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Consulta - Punteros
« Respuesta #4 en: 13 Diciembre 2018, 20:51 pm »

Si tienes que buscar el mayor de un array de enteros, es simple:
Código
  1. int BuscaMayor(int *array, int size){
  2.    int mayor = array[0];
  3.    for(int i = 1; i < size; i++)
  4.        if(array[i] > mayor)
  5.            mayor = array[i]
  6.    return mayor;
  7. }
Pero esto es porque para saber si un número es mayor que otro basta con el operador ">". Sin embargo cuando comparas estructuras tú decides que campo indica que objeto es mayor que otro. Entonces ya no sirve usar el operador ">", tienes que usar una función que haga lo mismo que ese operador, es decir, que de dos objetos te diga cual es mayor.
Imagina un stuct de persona, con nombre y edad:
Código
  1. struct Persona{
  2.    string nombre;
  3.    int edad;
  4.    int dni;
  5. };
Nosotros decidimos cuando una persona es mayor que otra, lo más lógico es con la edad, entonces hacemos una función que reciba dos personas y devuelva un entero positivo (1) si el primero es mayor, un entero negativo (-1) si el primero es menor y un 0 si son iguales...
Código
  1. int compararPorEdad(Persona p1, Persona p2){
  2.    int comparacion = 0;
  3.    if(p1.edad > p2.edad)
  4.        comparacion = 1;
  5.    else if(p1.edad < p2.edad)
  6.        comparacion = -1;
  7.    return comparacion;
  8. }

Entonces ahora para buscar el mayor de un array de personas sería algo así:
Código
  1. Persona mayorPersona(Persona *personas, int size){
  2.    Persona mayor = personas[0];
  3.    for(int i = 1; i < size; i++)
  4.        if(compararPersonas(personas[i], mayor) == 1)
  5.            mayor = personas[i];
  6.    return mayor;
  7. }
Aquí en vez de usar el operador ">" hemos tenido que usar la función que hemos creado porque si usas el operador ">" con dos estructuras, el programa no sabe cual es mayor (a no ser que sobrecargues ese operador, que eso lo estudiarás más adelante).

Entonces si tienes más de un criterio de ordenación, por ejemplo quieres que el mayor sea e que tiene el DNI más alto. Entonces tendrías una función como <int compararPorEdad(Persona p1, Persona p2)> pero que será <int compararPorDni(Persona p1, Persona p2)>.

El objetivo es que puedas usar la función <Persona personaMayor(Persona *personas, int size)> con el criterio que quieras. Entonces ese criterio lo pasas como tercer parámetro, pasas la función que compara.
Código
  1. Persona personaMayor(Persona *personas, int size, int (*comparacion)(Persona p1, Persona p2));
Y usas la función <int comparacion(Persona p1, Persona p2)> para comparar cada dos personas del array. Suerte :-X
En línea

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

Desconectado Desconectado

Mensajes: 52



Ver Perfil WWW
Re: Consulta - Punteros
« Respuesta #5 en: 18 Diciembre 2018, 00:56 am »

Y usas la función <int comparacion(Persona p1, Persona p2)> para comparar cada dos personas del array. Suerte :-X
Te soy sincero, no entiendo la aplicación, tengo una forma de hacerlo, pero no usaría ese maldito puntero  >:(
Hice esto, pero hasta ahí llegue con lo que me explicaste y llegue a entender, obviamente, no funciona
Código
  1. alumno Busca_mayor(alumno a[], int size, int (*p)(alumno a1, alumno a2)){
  2. alumno aux;
  3. for(int i=0;i<size;i++) {
  4. if(*p(a[i],a[i+1])<0){
  5. aux=a[i+1];
  6. }else{
  7. if(*p(a[i],a[i+1])>0){
  8. aux=a[i];
  9. }
  10. }
  11. }
  12. return aux;
  13. }
  14. int Compara_nombre(alumno a1, alumno a2){
  15. if(a1.nombre<a2.nombre){
  16. return -1;
  17. }else{
  18. if(a1.nombre==a2.nombre){
  19. return 0;
  20. }
  21. }
  22. return 1;
  23. }
En línea

Código:
Ser diligente es lo ÚNICO que importa para lograr el éxito[c/ode]
CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Consulta - Punteros
« Respuesta #6 en: 18 Diciembre 2018, 04:43 am »

Cuando invoques la funcion usando el puntero p, elige una de estas 2 opciones, ambas deberian funcionar.

- Usa p sin *,  osea  p( parametros... )
- Desreferencia primero,      (*p)( parametros .. )
En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Consulta punteros (C)
Programación C/C++
HRSLASH 8 3,967 Último mensaje 3 Septiembre 2012, 07:38 am
por do-while
[C] (Consulta) Mezclando punteros y arreglos.
Programación C/C++
class_OpenGL 5 4,590 Último mensaje 16 Mayo 2016, 18:51 pm
por class_OpenGL
(Consulta) Punteros a punteros en C
Programación C/C++
class_OpenGL 1 2,010 Último mensaje 19 Julio 2016, 14:29 pm
por class_OpenGL
(Consulta) - Declaracion de punteros en Null
Programación C/C++
palacio29 2 1,739 Último mensaje 16 Mayo 2019, 09:29 am
por MAFUS
Consulta sobre punteros y doble punteros
Programación C/C++
palacio29 4 3,330 Último mensaje 17 Mayo 2019, 20:40 pm
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines