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
{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. |
/*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*/ } |
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
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. |
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); } |
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:
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.
Promedio 3
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. |
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); } |
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]
Promedio 4
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. |
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); } |
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
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. |
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); } |
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.