marcoshuck

Funciones con argumentos opcionales

Apr 8th, 2014
445
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.66 KB | None | 0 0
  1. /*
  2.  
  3.         Uso de listas de argumentos de longitud variable - Deitel&Deitel - Página 484 (Otros temas de C) - Capítulo 14
  4.                                 UTN - FRP | 2014 | Informática II
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <stdarg.h> // Nuevo
  9.  
  10. double promedio(unsigned int i, ...); /*
  11.                                        *   Protito de una función con una lista de argumentos variable.
  12.                                        *   Observación: los "..." siempre van al final.
  13.                                        */
  14.  
  15. // Main
  16. int main(int argc, char *argv[])
  17. {
  18.     double W = 37.5,
  19.     X = 22.5,
  20.     Y = 1.7,
  21.     Z = 10.2;
  22.    
  23.     printf("%s%.1f\n%s%.1f\n%s%.1f\n%s%.1f\n\n", "W = ", W, "X = ", X, "Y = ", Y, "Z = ", Z);
  24.     printf("%s%.3f\n%s%.3f\n%s%.3f\n\n",
  25.     "El promedio de W y X es ", promedio(2, W, X), /* Nuevo */
  26.     "El promedio de W, X y Y es ", promedio(3, W, X, Y), /* Nuevo */
  27.     "El promedio de W, X, Y y Z es ", promedio(4, W, X, Y, Z) /* Nuevo */ );
  28.     system("PAUSE");   
  29.     return 0;
  30. }
  31.  
  32. // Calculo de promedio a través de la función definida anteriormente
  33. double promedio(unsigned int i, ...)
  34. {
  35.     // Variables
  36.     double total = 0;
  37.  
  38.     // Contador para seleccionar argumentos
  39.     unsigned int j;
  40.    
  41.     va_list ap; // -> Almacena la información necesaria para va_start y va_end // Nuevo
  42.    
  43.     va_start(ap, i); // Inicialización del objeto va_list // Nuevo
  44.    
  45.     // Procesar lista de argumentos de longitud variable
  46.     for (j = 1; j <= i; j++)
  47.         total += va_arg(ap, double); // Nuevo
  48.    
  49.     // Limpia la lista de argumentos de longitud variable
  50.     va_end(ap); // Nuevo
  51.    
  52.     return total/i;
  53. }
Advertisement
Add Comment
Please, Sign In to add comment