Foros del Web » Programación para mayores de 30 ;) » C/C++ »

duda apuntadores a funciones y for

Estas en el tema de duda apuntadores a funciones y for en el foro de C/C++ en Foros del Web. Bien en realidad tengo un par de dudas pero creo que es innecesario abrir 2 temas... Bueno primero con el que me urge mas, estoy ...
  #1 (permalink)  
Antiguo 23/03/2016, 15:01
 
Fecha de Ingreso: febrero-2015
Mensajes: 20
Antigüedad: 9 años, 2 meses
Puntos: 0
Pregunta duda apuntadores a funciones y for

Bien en realidad tengo un par de dudas pero creo que es innecesario abrir 2 temas...
Bueno primero con el que me urge mas, estoy haciendo un sistema sencillo de menús con apuntadores a funciones, pero tengo problemas con el parámetro ya que me tira muchas advertencias, y en todos los intentos el programa falla en ejecucion..
Código C:
Ver original
  1. #include <stdio.h>
  2. #define ESTUDIANTES 3
  3. #define EXAMENES 4
  4.  
  5. void imprimeCalificaciones(const int calificacion[][EXAMENES]);
  6. void calificacionMinima(const int calificacion[][EXAMENES]);
  7. void calificacionMaxima(const int calificacion[][EXAMENES]);
  8. void promedioEstudiante(const int calificacion[][EXAMENES]);
  9.  
  10. int main()
  11. {
  12.     int opcion;
  13.     void (*procesaCalificaciones[4])(int [][EXAMENES]) = {imprimeCalificaciones,calificacionMinima,calificacionMaxima,promedioEstudiante};
  14.     int calificaciones[ESTUDIANTES][EXAMENES] = {
  15.                                                 {76,89,65,76},
  16.                                                 {78,90,89,95},
  17.                                                 {78,97,58,87}
  18.                                                 };
  19.     do{
  20.         printf("Elija una opcion:\n");
  21.         printf("0 imprima el arreglo de calificaciones\n");
  22.         printf("1 Encuentra la calificacion minima\n");
  23.         printf("2 Encuentra la calificacion maxima\n");
  24.         printf("3 imprime el promedio de todos los examenes de cada estudiante\n");
  25.         printf("4 fin del programa\n");
  26.         scanf("%d", opcion);
  27.         if (opcion >= 0 && opcion < 4){
  28.             (*procesaCalificaciones[opcion])(calificaciones);
  29.         }
  30.     }while(opcion != 4);
  31.    
  32.     return 0;
  33. }
  34.  
  35. void calificacionMinima(const int calificacion[][EXAMENES])
  36. {
  37.     int i, j;
  38.     int minimo = 100;
  39.    
  40.     for(i = 0; i < ESTUDIANTES; i++){
  41.         for(j = 0; j < EXAMENES; j++){
  42.             if (calificacion[i][j] < minimo)
  43.               minimo = calificacion[i][j];
  44.         }
  45.     }
  46.    
  47.     printf("La calificacion minima es de %d\n", minimo);
  48. }
  49.  
  50. void calificacionMaxima(const int calificacion[][EXAMENES])
  51. {
  52.     int i, j;
  53.     int maxima = 0;
  54.    
  55.     for(i = 0; i < ESTUDIANTES; i++){
  56.         for(j = 0; j < EXAMENES; j++){
  57.             if (calificacion[i][j] > maxima)
  58.               maxima = calificacion[i][j];
  59.         }
  60.     }
  61.    
  62.     printf("La calificacion maxima es de %d\n", maxima);
  63. }
  64.  
  65. void imprimeCalificaciones(const int calificaciones[][EXAMENES])
  66. {
  67.     int j, i;
  68.    
  69.     printf("Examen1\tExamen2\tExamen3\tExamen4\n");
  70.     for(i = 0; i < ESTUDIANTES; i++){
  71.         printf("Estudiante %d\t", i+1);
  72.         for(j = 0; j < EXAMENES; j++){
  73.             printf("%d\t", calificaciones[i][j]);
  74.         }
  75.         printf("\n");
  76.     }
  77. }
  78.  
  79. void promedioEstudiante(const int calificaciones[][EXAMENES])
  80. {
  81.     int i, j;
  82.     float promedio;
  83.     printf("Promedios:\n");
  84.     for(i = 0; i < ESTUDIANTES; i++){
  85.         promedio = 0;
  86.         printf("Estudiante %d = ", i+1);
  87.         for(j = 0; j < EXAMENES; j++){
  88.             promedio += calificaciones[i][j];
  89.         }
  90.         promedio/=EXAMENES;
  91.         printf("%.2f\n", promedio);
  92.     }
  93. }
creo que el problema esta en el parámetro que reciben las funciones a las que apunta procesaCalificaciones, pero no estoy seguro..
¿Cual es la forma correcta de indicarle al arreglo de apuntadores a funciones que las funciones reciben un arreglo de 2 subíndices?

Bueno la segunda duda es más una incomodidad que tengo:
Código C:
Ver original
  1. for( ;*s1 = *s2; s1++,s2++){
  2.   ;
  3. }
s1 es un apuntador al carácter nulo de una cadena y s2 es un apuntador al inicio de otra cadena,
De modo que la instrucción anterior asigna la cadena s2 a s1 en donde se quedo esta ultima, de modo que si la cadena1 = "hola" y cadena2 = "adios", al final de la instrucción for, cadena1 sera igual a "holaadios".
El ciclo for se rompe en cuanto asigna el carácter nulo de la cadena2 a cadena1, mi duda es ¿porque?, no entiendo el porque se rompe el ciclo.
Le doy mas prioridad a la primera duda, Espero que me puedan ayudar, de antemano gracias
  #2 (permalink)  
Antiguo 24/03/2016, 00:00
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Respuesta: duda apuntadores a funciones y for

Jajajaja. Me hiciste recordar lo horrible que la sintaxis de C se puede poner.

No es una buena práctica usar apuntadores a funciones y mucho menos que acepten como parámetros arreglos multidimensionales.

Respondiendo a tu duda. Ayudaría mucho que pusieras las advertencias que te lanza el compilador.
El primer detalle que veo es que te falta un const en tu arreglo de apuntadores. Eso o quitale el const a las funciones.

Por otro lado en el scanf donde pides la opción te falta un &.

De verdad. Deberías leer lo que te dice el compilador. Te hubieras ahorrado este post y tiempo.

Saludos
  #3 (permalink)  
Antiguo 24/03/2016, 00:08
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Respuesta: duda apuntadores a funciones y for

Olvide tu segunda pregunta.

En C, cuando un expresión da como resultado cero, entonces se considera falsa. Agradezcamos que en C++ hay tipo booleano

Cual es el valor de una asignación? Pues el valor que tenga la variable asignada después de la asignación.

En el ejemplo que pones, cuando s2 apunte a cero (caracter nulo) la asignación *s1=*s2 pasa el cero a *s1 y la condición se evalua con ese valor. Y como es cero, entonces se rompe el ciclo.

Creo que strcat usa un algoritmo así.

Saludos
  #4 (permalink)  
Antiguo 30/03/2016, 13:54
 
Fecha de Ingreso: enero-2014
Mensajes: 60
Antigüedad: 10 años, 3 meses
Puntos: 1
Respuesta: duda apuntadores a funciones y for

hola braedu, mis conocimientos son bastante limitados, la manera de inicializar el array de funciones creo que no es correcta, he encontrado un ejemplo de array de funciones que quizas te sirva

http://c.conclase.net/curso/?cap=020d

me parece muy interesante esta manera de llamara a las funciones de un menu sin utilizar ni ifs ni swich, cuando tengas la solucion no dejes de ponerla en el foro, por mi parte voy a informarme mas a ver si te puedo ser de mas ayuda

la segunda cuestion instru la ha explicado muy bien asi que no hace falta añadir nada

suerte

Última edición por vizen; 30/03/2016 a las 14:17
  #5 (permalink)  
Antiguo 01/04/2016, 13:56
 
Fecha de Ingreso: enero-2014
Mensajes: 60
Antigüedad: 10 años, 3 meses
Puntos: 1
Respuesta: duda apuntadores a funciones y for

hola braedu, la inicializacion del array de funciones era correcto, fallo mio

lo que tienes incorrecto es la llamada al array de funciones que le sobraba el parentesis y el asterisco

intente hacerlo con punteros y me pasaba lo mismo, con una dimension bien pero al añadir la segunda me daba errores, y asi se me ocurrio una solucion
poner el array multidimensional en una estructura, y funciono bien

no se si es la mejor opcion pero funciona, le he hecho algun pequeño cambio, te envio el codigo:

Código c:
Ver original
  1. #include <stdio.h>
  2.  
  3. #define ESTUDIANTES 3
  4. #define EXAMENES 4
  5.  
  6. typedef  struct {
  7.   int calificaciones[ESTUDIANTES][EXAMENES];
  8. }Notas_Curso;
  9.  
  10. void imprimeCalificaciones(Notas_Curso*);
  11. void calificacionMinima(Notas_Curso*);
  12. void calificacionMaxima(Notas_Curso*);
  13. void promedioEstudiante(Notas_Curso*);
  14.  
  15. void (*procesaCalificaciones[4])(Notas_Curso*) =
  16.     {
  17.         imprimeCalificaciones,
  18.         calificacionMinima,
  19.         calificacionMaxima,
  20.         promedioEstudiante
  21.     };
  22.  
  23. int main()
  24. {
  25.   int opcion;
  26.   Notas_Curso curso;
  27.  
  28.   for(int i=0, j=3; i<ESTUDIANTES; i++)
  29.     for(int ii=0; ii<EXAMENES; ii++){
  30.       if(j==10) j=3;
  31.       curso.calificaciones[i][ii]=++j;
  32.     }
  33.  
  34.   do{
  35.     printf("\n\n\n\n\t\t\tElija una opcion:\n\n\n");
  36.     printf("\t\t1 imprima el arreglo de calificaciones\n\n");
  37.     printf("\t\t2 Encuentra la calificacion minima\n\n");
  38.     printf("\t\t3 Encuentra la calificacion maxima\n\n");
  39.     printf("\t\t4 imprime el promedio de cada estudiante\n\n");
  40.     printf("\t\t5 fin del programa\n\n\n\n\n\n\n");
  41.     scanf("%d", &opcion); opcion--;
  42.     if (opcion >= 0 && opcion < 4){
  43.       procesaCalificaciones[opcion](&curso);
  44.     }
  45.   }while(opcion != 4);
  46.  
  47.   return 0;
  48. }
  49.  
  50. void imprimeCalificaciones(Notas_Curso* curso)
  51. {
  52.   printf("\n\t\tExamen1\tExamen2\tExamen3\tExamen4\n");
  53.   for(int i = 0; i < ESTUDIANTES; i++){
  54.     printf("Estudiante %d\t", i+1);
  55.     for(int j = 0; j < EXAMENES; j++)
  56.       printf("%5d\t", curso->calificaciones[i][j]);
  57.     printf("\n");
  58.   }
  59. }
  60.  
  61. void calificacionMinima(Notas_Curso* curso)
  62. {
  63.   int minimo = EXAMENES * 10;
  64.  
  65.   for(int i = 0; i < ESTUDIANTES; i++)
  66.     for(int j = 0; j < EXAMENES; j++)
  67.       if (curso->calificaciones[i][j] < minimo)
  68.         minimo = curso->calificaciones[i][j];
  69.  
  70.   printf("\n\nLa calificacion minima es de %d puntos\n", minimo);
  71. }
  72.  
  73. void calificacionMaxima(Notas_Curso* curso)
  74. {
  75.   int maxima = 0;
  76.  
  77.   for(int i = 0; i < ESTUDIANTES; i++)
  78.     for(int j = 0; j < EXAMENES; j++)
  79.       if (curso->calificaciones[i][j] > maxima)
  80.         maxima = curso->calificaciones[i][j];
  81.  
  82.   printf("\n\nLa calificacion maxima es de %d puntos\n", maxima);
  83. }
  84.  
  85. void promedioEstudiante(Notas_Curso* curso)
  86. {
  87.   float promedio;
  88.   printf("\n\nPromedios:\n\n");
  89.   for(int i = 0; i < ESTUDIANTES; i++){
  90.     promedio = 0;
  91.     printf("\tEstudiante %d = ", i+1);
  92.     for(int j = 0; j < EXAMENES; j++)
  93.       promedio += curso->calificaciones[i][j];
  94.     promedio/=EXAMENES;
  95.     printf("%.2f\n", promedio);
  96.   }
  97. }

espero te sirva de alguna ayuda

suerte
  #6 (permalink)  
Antiguo 01/04/2016, 15:38
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 5 meses
Puntos: 52
Respuesta: duda apuntadores a funciones y for

vizen.

Según el estándar de C++, no hay diferencia entre usar (*funcion)() o funcion() cuando se trata de un puntero.

Sin embargo, Dennis Ritchie en su libro de C, no menciona que se pueda usar funcion() cuando función es un puntero. Sólo menciona la notación (*funcion)().

Si usas un compilador de C++, ya no hay problema. Sería interesante hacer una prueba en un compilador de C puro. No se si con el estándar C11 esto haya cambiado.

Saludos
  #7 (permalink)  
Antiguo 02/04/2016, 02:27
 
Fecha de Ingreso: enero-2014
Mensajes: 60
Antigüedad: 10 años, 3 meses
Puntos: 1
Respuesta: duda apuntadores a funciones y for

hola Instru, el programa lo he compilado en code::blocks con el compilador gcc y el estandar c11, he probado con el estandar c99 y tambien quitando el -std=c99, es decir con el estandar c89 (cambiando los for) y tambien compila

la idea de funcion() y no (*funcion)(), es por que esta asi en el ejemplo que encontre y puse mas arriba, pense ( sin probarlo ) que podia ser una es uno de los errores de braedu ( equivocandome claro ).

gcc compila tanto c como c++ creo, asi que no se como tendria que hacer para comprobar si compila con c puro ¿¿??

cualquier sugerencia es bienvenida

Etiquetas: apuntadores, cadena, funcion, funciones, int, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:22.