Ver Mensaje Individual
  #1 (permalink)  
Antiguo 23/03/2016, 15:01
braedu555
 
Fecha de Ingreso: febrero-2015
Mensajes: 20
Antigüedad: 9 años, 9 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