Ayer me dieron la nota del último examen de programación y como no, para todos mis lectores interesados en la programación (Willy tu no vales, lo siento jeje) os dejo el ejercicio de dicho examen enterito y resuelto. Es exactamente el que entregue con algún comentario añadido, por cierto saque un 10, por si alguien duda si está bien jeje.

Para situarnos, el examen pedía que se utilizase funciones para cada una de las operaciones, asignación dinámica de memoria, arrays de punteros... La estructura de datos tal cual yo la interpreté quedaría de esta manera:

Una tabla de cadena de caracteres con el nombre de cada curso de la ESO, en total son 9, .
Una tabla de cadena de caracteres con el nombre de la evaluación, en total son tres.
Un vector que almacena el número de alumnos por curso.
Un vector que almacena el número total de faltas de los alumnos por curso.
Una tabla donde se almacenan el total de aprobado por curso y para cada una de las evaluaciones. Para las operaciones no necesitamos almacenar los suspendidos ya que se deducen del número del número total de alumnos del curso menos el número de aprobados.

Viéndolo así parece sencillo, pero no lo es tanto si no tienes los conceptos claros, por lo que nada mejor que un buen dibujito para ilustrar la estructura de datos:

(clickea encima de la imagen para verlo en grande)
daniel y yone

Las flechitas indican la relación de los índices de los diferentes índices entre si, por ejemplo la tabla aprobados, las columnas corresponden con los índices del vector evaluaciones y las filas con los índices del vector curso. Los vectores Faltas y Alumnos corresponden también con los índices del vector curso.

Las operaciones que pedía el ejercicio son:
Total de faltas de asistencia en un nivel dado desde teclado.
Porcentaje de aprobado y suspendidos en el primer ciclo de la eso.
Total de faltas de asistencia en un nivel dado desde teclado.

Ya estamos listos para meternos en el código, pa’dentro chulín jeje.

Descargar | Código examen FUT

C:
  1. /*Yone Rocha Perez*/
  2. #include <conio .h>
  3. #include <stdio .h>
  4. #include <stdlib .h>
  5. #define N 9 //numero de cursos
  6. void reservar(int **v);
  7. int ** reservar();
  8. void cargar_alumnos(int *alu, char **curso);
  9. void cargar_faltas(int *faltas, char **curso);
  10. void asistencia_nivel(int *faltas, char **curso);
  11. void aprobado_suspendido(char **curso, char **eva, int *alu, int **apro);
  12. void top_faltas(int *faltas, char **curso);
  13. void liberar(int **matriz);
  14. void liberar_vector(int *v);
  15. void main()
  16. {
  17.     char *curso[]={"1ºESOA","1ºESOB","2ºESOA", "2ºESOB", "2ºESOC","3ºESOA", "3ºESOB", "4ºESOA", "4ºESOB"};
  18.     char *evaluaciones[]={"Primera","Segunda","Tercera"};
  19.     int *alumnos, *faltas, **aprobados;
  20.     /*Reservar memoria*/
  21.     reservar(&alumnos);
  22.     reservar(&faltas);
  23.     aprobados=reservar();
  24.  
  25.    /*Operaciones*/
  26.     cargar_alumnos(alumnos, curso);
  27.     cargar_faltas(faltas, curso);
  28.     asistencia_nivel(faltas, curso);
  29.     aprobado_suspendido(curso, evaluaciones, alumnos, aprobados);
  30.     top_faltas(faltas, curso);
  31.  
  32.     /*liberar memoria*/
  33.     liberar(aprobados);
  34.     liberar_vector(alumnos);
  35.    liberar_vector(faltas);
  36. }
  37. /*Reservar memorias para los vectores*/
  38. void reservar(int **v)
  39. {
  40.     *v = (int *)malloc(N*sizeof(int));
  41. }
  42. void liberar_vector(int *v)
  43. {
  44.     free (v);
  45. }
  46.  
  47. /*Reservamos para el array aprobados*/
  48. int ** reservar()
  49. {
  50.     int **reservo, i;
  51.     reservo=(int **)malloc(sizeof(int*)*N);
  52.     for (i=0;i<n ;i++)
  53.     {
  54.         reservo[i]=(int *)malloc(sizeof(int)*3);
  55.     }
  56.     return(reservo);
  57. }
  58. void liberar(int **matriz)
  59. {
  60.     int i;
  61.     for (i=0;i<N;i++)
  62.     {
  63.         free(matriz[i]);
  64.     }
  65.     free(matriz);
  66. }
  67.  
  68. /*Cargar los datos*/
  69. void cargar_alumnos(int *alu, char **curso)
  70. {
  71.  int i;
  72.  printf("\n**********************************************");
  73.  for(i=0;i<N;i++)
  74.  {
  75.       printf("\nAlumnos %s:", curso[i]);
  76.       scanf("%d",alu+i);fflush(stdin);
  77.  }
  78. }
  79.  
  80. void cargar_faltas(int *faltas, char **curso)
  81. {
  82.  int i;
  83.  printf("\n**********************************************");
  84.  for(i=0;i<N;i++)
  85.  {
  86.       printf("\nFaltas %s:", curso[i]);
  87.       scanf("%d",faltas+i);fflush(stdin);
  88.  }
  89. }
  90. /*Total de faltas de asistencia en un nivel dado desde teclado*/
  91. void asistencia_nivel(int *faltas, char **curso)
  92. {
  93.     int i, suma=0;
  94.     char nivel;
  95.     printf("\nIntroduzca  el nivel del que desea saber las faltas [1-4]: ");
  96.     nivel=getche();
  97.     for(i=0;i<N;i++)
  98.     {
  99.         if(nivel==*(curso[i]+0))
  100.         {
  101.             suma+=*(faltas+i);
  102.         }
  103.     }
  104.     printf("\n\nEl nivel %cº de la eso tiene %d faltas.", nivel, suma );
  105.     printf("\n\nPresione una tecla para continuar");
  106.     getche();
  107. }
  108. /*Porcentaje de aprobado y suspendidos en el primer ciclo de la eso*/
  109. void aprobado_suspendido(char **curso, char **eva, int *alu, int **apro)
  110. {
  111.     int i, j;
  112.     int aprob, susp;
  113.     clrscr();
  114.     printf("\n\n:::::Cantidad de aprobados y suspendidos:::::::\n");
  115.     for(i=0;i&lt;5;i++)
  116.     {
  117.         printf("\n\n-------------------------------------------");
  118.         printf("\nCurso %s: ", curso[i]);
  119.         for(j=0;j&lt;3;j++)
  120.         {
  121.             printf("\n\t%s evaluacion:", eva[j]);
  122.             do{
  123.                 printf("\n\t\tIntroduzca nº de aprobados: ");
  124.                 scanf("%d", &aprob);
  125.                 printf("\n\t\tIntroduzca nº de suspendidos: ");
  126.                 scanf("%d", &susp);
  127.             }while((aprob+susp)!=alu[i]);
  128.          *(apro[i]+j)=aprob;
  129.  
  130.         }
  131.     }
  132.     printf("\n\nPresione una tecla para continuar");
  133.     getche();
  134.     clrscr();
  135.     /*visualizamos tabla*/
  136.     printf("\n:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::");
  137.     printf("\n\n\n:::Porcentaje de aprobados y suspendidos 1 ciclo de la ESO:::\n");
  138.    /*Es hastas 5 pq es donde termina el primer ciclo de la eso*/
  139.     for(i=0;i&lt;5;i++)
  140.     {
  141.         printf("\n\n-------------------------------------------");
  142.         printf("\nCurso %s: ", curso[i]);
  143.       for(j=0;j&lt;3;j++)
  144.         {
  145.             printf("\n\t%s evaluacion:\n",eva[j]);
  146.             printf("\t\tAprobados: %d", (*(apro[i]+j)*100)/alu[i]);
  147.             printf("\n\t\tSuspendido: %d", ((*(alu+i)-*(apro[i]+j))*100)/alu[i]);
  148.         }
  149.     }
  150.    printf("\n\nPresione una tecla para continuar");
  151.     getche();
  152.     clrscr();
  153. }
  154.  
  155. /*Total de faltas de asistencia en un nivel dado desde teclado*/
  156. void top_faltas(int *faltas, char **curso)
  157. {
  158.     int i, max=faltas[0], pos=0;
  159.     for(i=0;i<N;i++)
  160.     {
  161.         if(*(faltas+i)>max)
  162.         {
  163.             max=*(faltas+i);
  164.          pos=i;
  165.         }
  166.     }
  167.     printf("\n\n**********************************************");
  168.     printf("\n\nEl curso con mas faltas es %s con %d faltas.", curso[pos], max );
  169.  
  170. }