Cómo Promediar

Comencemos con un problema simple, el de sacar el promedio de 18 y 20. Para llegar a una solución, el programador le pregunta a su cliente ¿que números desea promediar?, el cliente le responde que 18 y 20, el programador realiza el mismo los cálculos y utiliza la computadora tan solo como una maquina de escribir, la cual transcribe los resultados. Siendo el codigo el que sigue:

Promedio 1

Lenguaje PASCAL

{En el Lenguaje Pascal los comentarios se delimitan entre llaves
El programa debe comenzar con la palabra Program seguida de un identificador}
Program promedio_1;
{El resto del código debe colocarse entre la palabras
Begin y End. para indicar el cuerpo del programa}
Begin
Write(' El promedio de 18 y 20 es 19 ');
{En el Pascal los caracteres entre comillas simples ('') se definen como cadenas
de caracteres, al comenzar una comilla es necesario cerrarla en la misma linea,
ya que si no se encuentra la comilla de cierre antes del fin de linea se interpreta
como una cadena demasiado larga para ser manejada}
End.

Lenguaje C

/*Los comentarios en Lenguaje C se delimitan entre estos simbolos */
/* el programa principal se denomina main, y es una función */
main()
/* el cuerpo del programa esta encerrado entre llaves { } */
{
printf(" El promedio de 18 y 20 es 19 \n ");
/* En C la cadena de caracteres se delimita entre comillas dobles (" "), es */
/* necesario tener el mismo cuidado de no omitir el cierre de una comilla*/
}

Lenguaje FORTRAN

C       En fortran los comentarios se denotan con una letra C 
C       en la primera columna del codigo, nótese que no es necesario 
C       indicar el comienzo del programa como en los otros casos, 
C       nótese también que las instrucciones comienzan en la octava 
C       columna, esto es porque el compilador del lenguaje Fortran 
C       reserva estas columnas para fines que ya explicaremos
        print *, 'El Promedio de 18 y 19 es 20'
C       En Fortran las cadenas de caracteres se delimitan con comillas simples
C       (' '), similares a la de Pascal
        end

Sin duda es una buena solución, pero no muy flexible verdad, que sucede si yo deseo ahora cambiar los números, habrá que realizar otro programa, y así para cada par de números que se deseen promediar.

Ahora el cliente le pide al programador que su programa le muestre el resultado de otro par de números. El programador pregunta nuevamente ¿que números desea promediar?, el cliente responde que cualquier par de números, pero que los sabra en el momento de ejecutar el programa. Con esta información el programador realiza un programa que pregunta que par de números se van a promediar, calcula el promedio con la ecuación [1] y luego lo muestra en pantalla, utilizando la computadora como calculadora y maquina de escribir.

Promedio 2

Lenguaje PASCAL

Program promedio_2;
{La declaración de variables en PASCAL se realiza antes del comienzo
del cuerpo del programa indicando esta sección con la palabra VAR
seguido del identificador de la variable y el tipo de variable}
Var A, B, Promedio : real;
Begin
{Noten que en pascal todas las instrucciones o sentencias terminan en punto y
coma (;) excepto el begin, este punto y coma es el indicador de fin de linea en
pascal, por lo que el compilador asumira que todo lo que este entre dos punto y
coma (;) es una sola instrucción}
Write (' Primer número: ');
Readln (A);
Write('Segundo número: ');
Readln (b); {Observen que la variable se ha definido en mayuscula y en el código
se utiliza en minuscula, para Pascal no hay diferencia entre una y otra}
Promedio:=(A + B) / 2;
Write ('El promedio de ', A,' y ', B,' es ', promedio :9:3); 
End.

Lenguaje C

main()
{
/* En el lenguaje C las variables se definen en al comienzo del cuerpo del
programa, colocando primero el tipo de variable y luego el identificador */
float A, B, promedio;
printf(" Primer número: ");
scanf(" %f", &A);
/* Observen el signo & que se coloca antes del nombre de la variable */
/* este signo le indica a la instrucció,n scanf que modifique el valor */
/*que tenía la variable y coloque el nuevo valor, además observen que no */
/* intercabiamos mayusculas por minusculas, el Lenguaje C es sensible a este */
/* cambio, por lo que puede interpretar acciones y/o variables diferentes*/
printf(" Segundo número: ");
scanf(" %f", &B);
promedio = (A + B)/2;
printf (" El promedio de %f y %f es : %f \n", A, B, promedio);
}

Lenguaje FORTRAN

C       En Fortran la definición de variables se realiza en la parte 
C       superior del programa, se comienza con el tipo de variable y luego con el 
C       identificador,en fortran no es necesario definir variables pero es una practica 
C       sana de programación definir todas las variables utilizadas en el programa
        real a, b, promedio
        print *, 'Primer Numero: '
        read *,a
        print *, 'Segundo Numero: '
        read *,b
        promedio = (a + b)/2
        print *, 'El promedio de ',a,' y ',b,' es ',promedio
        end

Noten la diferencia de como se leen y escriben las variables, en PASCAL y FORTRAN tan solo se llama la instrucción y se coloca el nombre de la variable para ambos procesos, en C para leer una variable se le coloca un signo & antes del nombre de la variable, y para escribir solo el nombre de la variable. La instrucción de leer una variable, modifica el valor que esta tenia en memoria anteriormente, en lenguaje FORTRAN y PASCAL no se observa este detalle ya que estos lenguajes procesan de forma interna y modifican el valor de la variable en memoria de forma transparente al programador, muy diferente en el lenguaje C, donde es necesario indicar explícitamente que se hará con la variable, si se requiere solo su valor se indica el nombre, si se desea modificar debe colocarse el signo & que le indica al compilador que tome la dirección de memoria de la variable, no el valor que esta contiene. Podemos diferenciar dos conceptos para utilizar las variables en instrucciones, funciones y procedimientos en un programa:

  1. Utilizar la variable por valor, utilizando el valor almacenado en memoria para la operación, de esta manera no se puede modificar
  2. Utilizar la variable por referencia, se utiliza la dirección de memoria de la variable, esto permite modificar el valor de la variable dentro de la función o procedimiento.

El cliente ahora desea promediar más de dos números, por lo que le pide al programador que modifique nuevamente su programa, y le pregunta a su cliente ¿cuantos números desea promediar?, el cliente le responde cualquier cantidad de números. El programador se ve obligado a realizar otra pregunta ¿sabe cuantos números desea promediar?, el cliente le responde que si, lo sabra al ejecutar el programa, por lo que el programador realiza un programa que pregunta primero cuantos números va a promediar, luego lee cada número y utliza la ecuación [2] a fin de obtener el promedio.

Observen que en la ecuación [2] existe una suma desde i=1 hasta n, la forma de colocar esta en codigo es en una estructura de repetición la cual se hara n veces, en cada ciclo se sumara un termino en la variable que previamente se inicia en cero, de esta forma el programador puede en pocas lineas realizar la suma de una gran cantidad de números.

Promedio 3

Lenguaje PASCAL

Program promedio_3;
Var
 Total, contador : integer;
 Num, promedio : real;
Begin
Write (' Números a promediar: ');
Readln (Total);
Promedio:=0;{Inicializamos la variable en cero para la suma}
For contador:=1 to Total do
{En pascal la Estructura de repetir n veces se forma como la 
traducción de para variable=inico hasta fin hacer, y luego la
instrucción a repetir, en el caso de tener que repetir más
de una instrucción es necesario colocar estas entre un begin y un end 
como marcadores del bloque de instrucciones a realizar, al cerrar el bloque es 
necesario colocar un punto y coma, una buena practica de programación es 
colocar los marcadores de bloque begin y end y luego colocar las instrucciones 
entre ellas, asi como dejar una pequeña sangria para ubicar facilmente 
los bloques de instrucciones}
 Begin
  Write('Número: ');
  Readln (Num);
  Promedio := Promedio + Num / Total;
End;
{La suma de promedio con el incremento actual se puede asignar en la misma 
variable promedio, quedando esta con el nuevo valor para el proximo ciclo en el 
cual se le sumara nuevamente el incremento, por esta razón es que 
promedio se inicio con el valor cero, para que sea nula la contribución 
en el primer ciclo}
Writeln('El Promedio es: ', promedio:9:3);
End.

Lenguaje C

main()
{
 int total, contador;
 float num, promedio=0;
 printf(" Números a Promediar: ");
 scanf("%d", &total);
/* En C la estructura de repetición no es tan literal como en el Pascal */
/* tiene tres parametros que indican el numero de ciclos y las instrucciones */
/* se agrupan en bloques entre llaves, al cerrar el bloque se debe colocar */
/* un terminador de linea, es decir un punto y coma (;) */
 for (contador = 1; contador <= total; contador++)
 {
  printf(" Número: ");
  scanf("%f", &num);
  promedio = promedio + num / total;
 }
 printf("%s%f \n"," El Promedio es: ", promedio);
}

Lenguaje FORTRAN

        integer total, contador
        real num, promedio
        print *, 'Números a promediar: '
        read *,total
        promedio = 0
        do 100 contador = 1, total, 1
C       La estructura de repetición en Fortran  realizara todas las 
C       instrucciones siguientes hasta que encuentre la etiqueta correspondiente
        print *, 'Numero: '
        read *,num
        promedio = promedio + num/total
    100 continue
C       Las etiquetas son números que se utilizan para definir bloques o saltos 
C       en las instrucciones y para ello se coloca el número en la quinta 
C       columna de la linea a marcar
        print *, 'El promedio es ',promedio
        end

Este programa utiliza la computadora como una maquina capaz de realizar una tarea de forma repetitiva, realizando la suma repetida de los números a promediar, de esta manera aprovechamos un poco más la computadora que en los ejemplos anteriores.

Este ejemplo permite promediar una cantidad de números que conocemos previamente, ahora aplicando algunos conceptos matemáticos a la ecuación [2], podemos reescribirla como [3]

Con esta ecuación podemos realizar un pequeño cambio al programa anterior.

Promedio 4

Lenguaje PASCAL

Program promedio_4;
Var
Total, contador : integer;
Num, promedio : real;
Begin
Write (' Números a promediar: ');
Readln (Total);
Promedio:=0;
to Total do
 Begin
  Write('Número: ');
  Readln (Num);
  Promedio := Promedio + Num;
 End;
Promedio := Promedio / Total ;
Writeln('El Promedio es: ', promedio:9:3);
End.

Lenguaje C

main()
{
int total, contador;
float num, promedio=0;
printf(" Números a Promediar: ");
scanf(" %d", &total);
for (contador = 1; contador <= total; contador++)
{
 printf (" Número: ");
 scanf (" %f", &num);
 promedio = promedio + num;
}
promedio = promedio / total;
printf (" %s%f \n"," El Promedio es: ", promedio);
}

Lenguaje FORTRAN

        integer total, contador
        real num, promedio
        print *, 'Números a promediar: '
        read *,total
        promedio = 0
        do 100 contador = 1, total, 1
        print *, 'Numero: '
        read *,num
        promedio = promedio + num
    100 continue
        promedio = promedio/total
        print *, 'El promedio es ',promedio
        end

La diferencia entre los dos ultimos programas esta en la expresión matemática usada, te invitamos a usar cada una de estas expresiones y evaluarlas manualmente, ¿Cuál prefieres utilizar?, te dejo esa pregunta y como dato evalua los dos programas a ver si tardan el mismo tiempo de ejecución en el procesador

Nuevamente el inconforme cliente decide que se cambie el programa, esta vez no sabe cuantos números se promediaran, obligando al programador a preguntar ¿cuando decide terminar de promediar?, el cliente responde que al introducir un número cero puede detenerse. El programador para resolver este nuevo reto, decide utilizar la ecuación [3], pero esta vez con una estrutura de repetición que termine si el número leído es cero, en cada ciclo que el número no sea cero se aumentará un contador que será quien llevará la cuenta de los números a promediar. En codigo tenemos:

Promedio 5

Lenguaje PASCAL

Program promedio_5;
Var
 contador : integer;
 Num, promedio : real;
Begin
 Write (' Para terminar introduzca un cero (0) ');
 Promedio:=0;
 Contador:=0;
 Repeat
  Begin
   Write('Número: ');
   Readln (Num);
   Promedio := Promedio + Num;
   Contador := contador + 1;
  End
 Until Num=0;
 Promedio := Promedio / contador ;
 Writeln('El Promedio es: ', promedio:9:3);
End.

Lenguaje C

main()
{
 int contador = 0;
 float num, promedio = 0;
 do
 {
  printf(" Número: ");
  scanf(" %f", &num);
  promedio = promedio + num;
  contador++;
 } while (num != 0 );
 promedio = promedio / contador;
 printf(" %s%f \n"," El Promedio es: ", promedio);
}

Lenguaje FORTRAN

        integer contador
        real< num, promedio
        promedio = 0
        num = 1.00
        contador = 0
        do while ( num .NE. 0.00)
         print *, 'Numero: '
         read *,num
         promedio = promedio + num
         contador = contador +1
        end do
        promedio = promedio/contador
        print *, 'El promedio es ',promedio
        end

Este programa leerá el número, lo sumara, revisara si es distinto de cero, si lo es incrementara un contador, repitiendo esta operación hasta que el número sea cero, al dejar de repetir divide la suma entre el contador que tendrá la cantidad de números distintos de cero que se han sumado, y luego muestra el promedio. En este programa se utilizan tres de sus propiedades, el calculo, la capacidad de repetición y la capacidad de decisión, estas tres propiedades permiten distinguir a la computadora de las demás maquinas construidas por el hombre, ya que estas son la base para resolver un gran número de problemas, realizando una tarea repetidamente, realizando cálculos y tomando decisiones hasta solucionar el problema.

Observe bien los distintos códigos, la estructura del programa es similar para los tres lenguajes. Existe una diferencia en el lazo de repetición para el lenguaje FORTRAN, se utilizo un lazo Mientras se cumpla Repito con una bandera (band) inicializado de tal forma que se repita al menos una vez, de esta manera logramos implementar el lazo de repetición Repito Hasta que se cumpla, utilizada en PASCAL y C, el motivo es que FORTRAN no tiene este lazo de repetición, pero como observan no es necesario, ya que se puede conseguir uno equivalente con un poco más de código y variables.

Intentemos comparar cada uno de los algoritmos utilizados para resolver los problemas presentados:

Promedio 1

Es la solución más rápida del problema, además de la más económica, ya que el programador no invirtió más de cinco minutos elaborando el programa. Su principal defecto es ser el más cerrado, ya que no permite calcular el promedio de ningún otro par de números.

Promedio 2

Esta solución resuelve el principal problema de la anterior, permite calcular el promedio de dos números cualquiera, esto lo hace a consta de tiempo de ejecución pues debe esperar a que el operador le indique proporcione los números a promediar. El programador debió invertir cerca de diez minutos en la realización de este programa, lo que duplica el precio del primero. Aunque permite promediar cualquier par de números, solo permite promediar dos números lo que lo hace limitado

Promedio 3

En este se pueden promediar cualquier cantidad de números, se debe decir de antemano la cantidad de números a promediar, el programador debió dedicar aproximadamente 30 minutos para elaborar este programa, lo que triplica el valor del segundo. El principal problema es que si se equivoca el operador en la cantidad de números a promediar tendrá que ejecutar nuevamente el programa, otro defecto es que no permite sacar el promedio de una cantidad indeterminada de números, es decir si no se conoce previamente la cantidad de números a promediar.

Promedio 4

El algoritmo de esta solución es semejante al anterior, posee una ventaja y es que puede permitir ver el promedio acumulado hasta ese número con una breve modificación, pero su velocidad de ejecución es diferente.

Promedio 5

Este algoritmo resuelve el problema de desconocer de antemano la cantidad de números a promediar, la consecuencia de esta ventaja es que incrementa tanto el tiempo de ejecución del programa como su tiempo de realización por parte del programador, incrementando considerablemente su precio.

Pueden existir otros algoritmos que permitan resolver este problema, los que se han presentado aquí son solo unas de ellas, queda como reto plantearse el problema de como promediar sin saber la cantidad de números a promediar y los números tomar cualquier valor, otro problema que no se ha considerado es la posibilidad de corregir un número errado.

 

Como pueden ver hasta ahora, para el problema simple del promedio, lo hemos resuelto mediante varios algoritmos, algunos más flexibles que otros, se han desarrollado independiente del lenguaje de programación, ya que los hemos realizado en FORTRAN, PASCAL y en C, es fácil utilizar otros lenguajes de programación, sólo se necesita conocer la sintaxis de cada una de las instrucciones en ese lenguaje.