Bueno, bueno: ya hemos hablado un poco de variables; qu� son, y cosas que podemos hacer con ellas. Tambi�n hablamos un poco por encima de lo que es un algoritmo, pero a�n no sabemos cosas sobre ellos. Una posible "definici�n rigurosa" ser�a la siguiente (no hay que tomarla como un dogma de fe):
Un algoritmo es una sucesion finita de pasos no ambiguos que se pueden llevar a cabo en un tiempo finito. |
---|
Sucesi�n finita es lo contrario de infinita: esto quiere decir que se acaba en alg�n momento ;)
Pasos no ambiguos son pasos tan claros que hasta una m�quina los puede entender, de ah� la necesidad de la no ambig�edad ;)
Lo del tiempo finito es una cuesti�n pr�ctica: no creo que tengamos tanta paciencia (ni que lleguemos vivos, sobre todo) como para ver la salida de un programa que calcule Pi :)
No vamos a entrar en filosof�as de qu� puede ser considerado como un algoritmo, qu� no lo es, etc... , no porque no sea interesante en s�, sino porque a nosotros lo que nos preocupa en estos momentos es aprender a resolver problemas, y a eso es a lo que vamos.
No hay que confundirse: un algoritmo no es lo mismo que un programa, para hacer un programa necesitamos algo m�s: unas estructuras de datos.
Hay distintas formas de escribir un algoritmo, bien usando un lenguaje espec�fico de descripci�n de algoritmos, bien mediante representaciones gr�ficas.
Yo he elegido la primera: el pseudoc�digo. Que sea un lenguaje espec�fico no significa que haya que aprender un idioma nuevo, lo �nico que quiere decir es que hay unas cuantas palabras que son clave, y que son las palabras que, de acuerdo a unas reglas muy sencillitas, nos ayudan a describir el algoritmo.
La estructura del pseudoc�digo es bastante parecida a la de algunos lenguajes de programaci�n (por ejemplo, el Pascal), por ello me ha parecido la m�s recomendable.
El pseudoc�digo tiene algunas ventajas:
- Es f�cil hacer cambios si nos equivocamos en la l�gica del programa
- Es independiente del lenguaje de programaci�n que vaya a usarse; un algoritmo que est� escrito en pseudoc�digo es f�cilmente traducible a muchos lenguajes de programaci�n.
Y ya, sin m�s pre�mbulos, vamos a lo que nos interesa: nosotros queremos resolver problemas con el ordenador, �no es as�? Pues veamos con qu� herramientas nos podemos defender para escribir nuestros propios algoritmos.
� Elementos b�sicos para la descripci�n de algoritmos
� El principio y el fin
Para delimitar el comienzo y el final de un algoritmo, o de un trozo de algoritmo (por ejemplo, en los bucles, y otros, como vamos a ver), haremos lo siguiente:
inicio ... Aqui va el algoritmo en cuestion fin
Tambi�n, en vez de inicio y fin se puede usar "empezar" y "fin", o lo que querais, pero siempre quedando clara la intenci�n. No hay que ser estrictamente riguroso con la aplicaci�n del "inicio-fin", muchas veces, una buena indentaci�n hace su papel.
�Asignaciones
Sobre las asignaciones ya hablamos la vez pasada, al tratar el tema de las variables, vamos a recordarlo brevemente:
Cuando hayamos declarado una variable, llegar� un momento en el que querremos que la variable tome alg�n valor. Por ejemplo, tenemos una variable de tipo entero que se llama I y queremos asignarle el valor 3, entonces, escribiremos:
I <- 3
�Comentarios
Poner comentarios de lo que vamos haciendo es muy �til, sobre todo cuando llega la hora de revisar el algoritmo, si no, m�s de una vez nos encontraremos diciendo "uumm... �qu� demonios hac�a esto?"
No cuesta nada documentar el c�digo y nos ahorrar� dolores de cabeza :) La convenci�n que seguiremos ser� poner los comentario entre llaves. As�, {esto ser� un comentario}
�Estructuras de control
Las estructuras de control tienen una finalidad bastante definida: su objetivo es ir se�alando el orden en que tienen que sucederse los pasos de un algoritmo.
Veamos un ejemplo: supongamos que acabamos de mostrar un mensaje en la pantalla que pregunte al usuario "�desea seguir adelante?".
Obviamente, de la respuesta del usuario va a depender la siguiente acci�n del programa. Por ejemplo, si este mensaje se nos presenta tras haber pulsado un bot�n de cerrar la aplicaci�n, si nosotros elegimos "S�", la aplicaci�n se cerrar�, y si elegimos "No", la aplicaci�n seguir� adelante. El programador tiene que haber escrito c�digo para las dos posibilidades, aunque cuando el programa est� funcionando, s�lo se elegir� una.
Las estructuras de control son de tres tipos:
- Secuenciales
- Selectivas
- Repetitivas
�Estructuras secuenciales
Una estructura de control secuencial, en realidad, no es m�s que escribir un paso del algoritmo detr�s de otro, el que primero se haya escrito ser� el que primero se ejecute (al implementarlo, por ejemplo).
Veamos un ejemplo: queremos leer el radio de un c�rculo, calcular su �rea y mostrar por pantalla al usuario el resultado.
Declaracion de variables REAL: radio, area fin declaracion de variables inicio mostrar por pantalla 'dame el radio del circulo' leer del teclado la variable radio area <- 3.14159*radio mostrar por pantalla 'el area del circulo es:' mostrar por pantalla el contenido de la variable area fin
Notar una cosa: cuando queremos hacer cosas relativas a entrada o salida por alg�n dispositivo, como el teclado, la pantalla o la impresora, yo pongo cosas como "mostrar por pantalla", o "leer del teclado". Dado que cada lenguaje de programaci�n tiene sus funciones de entrada/salida, no uso la forma particular de ninguno, simplemente, lo que le dir�amos al ordenador en caso de que fuera una persona ("oye, por favor, s�came esto por impresora").
Por otro lado, cuando queramos decir que nos muestre el contenido de una variable, yo he puesto "mostrar por pantalla el contenido de la variable area", pero pod�a haber puesto igualmente "mostrar por pantalla area", o cosas similares. Vosotros eleg�s la forma que os resulte m�s clara o m�s c�moda, lo importante es que las intenciones sean claras, o, lo que es lo mismo, "no ambiguas" ;)
Adem�s, si os fijais, para que quede claro que una cosa es mostrar por pantalla una cadena, y otra cosa es mostrar por pantalla el valor de una variable, el texto que aparece entre ' ' es una cadena, mientras que el que no aparece entre ' ' no es una cadena, sino que se refiere a una variable.
Ahora vamos a pasar a las estructuras selectivas y a las repetitivas. Para ello, necesitamos primero hablar un poco de... CONDICIONES.
La palabra condici�n nos sugiere frases como "lo har� a condici�n de que me dejes tu boli". Analicemos esta frase con un poco de detenimiento.
Decimos "lo har�", pero, �"lo har�" siempre, pase lo que pase? o, por el contrario, �"lo har�" si antes hay algo que debe cumplirse? En la frase est� claro que no se ha dicho "lo har�" sin m�s, si no que hay como una peque�a cl�usula "SI me dejas tu boli".
Ya nos ha vuelto a aparecer el SI; esto parece querer decir que debe ser algo importante.
Lo que significa "SI me dejas tu boli" es lo siguiente, en caso de que la acci�n "dejarme tu boli" sea cierta (o verdad, usar� ambas palabras), yo "lo har�". Pero si la acci�n "dejarme tu boli" es falsa (o mentira), yo NO "lo har�".
En esto reside el "quid" de las estructuras que vamos a ver a continuaci�n: se EVALUA una condici�n, y se act�a en consecuencia, seg�n que la condici�n sea VERDADERA o FALSA.
�Estructuras selectivas
Estas estructuras se utilizan para TOMAR DECISIONES (por eso tambi�n se llaman estructuras de decisi�n o alternativas). Lo que se hace es EVALUAR una condici�n, y, a continuaci�n, en funci�n del resultado, se lleva a cabo una opci�n u otra.
Alternativas simples
Son los conocidos "si... entonces". Se usan de la siguiente manera (una vez m�s, la escritura es m�s o menos personal, siempre que las intenciones queden claras para todos): yo quiero evaluar una condici�n, y si se cumple (es decir, si es cierta), entonces realizar� una serie de pasos. Esto lo podemos escribir as�:
SI se cumple la condicion, ENTONCES: Hago el paso 1 .... Hago el paso N fin del SI
Muy estrictamente, ser�a:
SI se cumple la condicion, ENTONCES: inicio Hago el paso 1 .... Hago el paso N fin fin del SI
pero con una buena sangr�a nos podemos evitar escribir de m�s ;)
Es importante cerrar el SI, ya que, si no se cumple la condici�n, el programa seguir� a continuaci�n de donde termina el SI.
Por ejemplo, queremos calcular la ra�z cuadrada de un n�mero; sin embargo todos sabemos (�supongo! ;)) que la ra�z cuadrada de un n�mero negativo NO es un n�mero real. Esto quiere decir que, tras leer el n�mero por teclado, tendremos que ver si es positivo, ya que s�lo en este caso podremos calcular su ra�z cuadrada.
Veamos como queda:
Declaracion de variables REAL: numero, raiz fin declaracion de variables inicio mostrar por pantalla 'introduce un numero' leer del teclado la variable numero SI numero >= 0 ENTONCES: raiz <- raiz_cuadrada(numero) mostrar por pantalla 'la raiz cuadrada es:' mostrar por pantalla raiz fin del SI fin
Como extraer una ra�z cuadrada es una operaci�n que, en principio, no es elemental, yo he puesto raiz_cuadrada(numero), eso significa que, en alguna parte, tengo definida una funci�n que me calcula la ra�z cuadrada de un n�mero. Ya hablaremos de funciones y subrutinas m�s adelante, pero hago esta aclaraci�n para que conste que raiz_cuadrada no forma parte de ning�n tipo de especificaci�n de pseudoc�digo ;-)
Sin embargo, hubiera sido bonito haber podido avisar al usuario de que no pod�amos calcular la ra�z cuadrada en caso de que el n�mero fuera negativo, pero no os preocupeis, para ello tenemos las...
Alternativas dobles
O el famoso tr�o "si ... entonces ... sino" ;-D
Se usan de esta forma: queremos evaluar una condici�n, si es verdad, realizar� una serie de pasos, y SI NO es verdad (es decir, si es falsa, si es una puerca mentira cochina... ;) ), entonces realizar� otra serie de pasos. Esto lo podemos escribir as�:
SI se cumple la condicion, ENTONCES: Hago el paso A1 .... Hago el paso AN y SI NO se cumple la condicion, ENTONCES: Hago el paso B1 .... Hago el paso BM fin del SI
Con esto, nuestro algoritmo para la ra�z cuadrada quedar�a:
Declaracion de variables REAL: numero, raiz fin declaracion de variables inicio mostrar por pantalla 'introduce un numero' leer del teclado la variable numero SI numero >= 0 ENTONCES: raiz <- raiz_cuadrada(numero) mostrar por pantalla 'la raiz cuadrada es:' mostrar por pantalla raiz SI NO es numero >=0 ENTONCES: {es decir, si numero es negativo} mostrar por pantalla 'lo siento, no puedo calcular la raiz cuadrada de un numero negativo' fin del SI fin
Alternativas m�ltiples
Es muy probable que tengamos la necesidad de incluir en nuestros programas alternativas con muchas opciones posibles. Esto lo podr�amos hacer a base de anidar "si ... entonces ... si no", pero si es un n�mero elevado de alternativas, se hace demasiado farragoso como para resultar inteligibles. Por ejemplo, si queremos hacer un men� que d� a elegir cuatro opciones, un posible algoritmo ser�a:
{Algoritmo MENU a base de 'si ... entonces ... sino'} Declaracion de variables ENTEROS: opcion fin declaracion de variables inicio mostrar por pantalla 'menu de opciones:' mostrar por pantalla '1. Diccionario de sinonimos' mostrar por pantalla '2. Diccionario de antonimos' mostrar por pantalla '3. Buscar palabra' mostrar por pantalla '4. Salir' leer del teclado la variable opcion SI opcion = 1 ENTONCES {lo que toque a esta opcion} SI NO, ENTONCES SI opcion = 2 ENTONCES {lo que toque a esta opcion} SI NO, ENTONCES SI opcion = 3 ENTONCES {lo que toque a esta opcion} SI NO, ENTONCES SI opcion = 4 ENTONCES {lo que toque a esta opcion} SI NO, ENTONCES mostrar por pantalla 'opcion incorrecta' fin del SI fin del SI fin del SI fin del SI fin
Farragoso, �verdad?
Para evitar esto (�os imaginais que en vez de cuatro fueran 20 las alternativas?), est� la estructura "seg�n sea". La idea es esta; por ejemplo, como en el algoritmo que hemos puesto del men�, pedimos al usuario que entre una opci�n, y hay cuatro posibilidades, cuatro posibles valores para los que haremos algo.
Entonces, SEGUN lo que valga la variable opci�n, elegiremos una alternativa de entre todas las posibles.
La forma de escribir esto en pseudoc�digo es:
SEGUN SEA la variable o la expresion HACER VALOR1: {las acciones que toque} ... VALORN: {las acciones que toque} por defecto: {las acciones que toque} fin SEGUN
�Qu� pinta ah� ese 'por defecto'?
No es m�s que una alternativa por si acaso se elige alguna opci�n no contemplada entre las que se ofrece.
Como ejemplo, vamos a ver nuestro men� utilizando la alternativa m�ltiple SEGUN SEA:
{Algoritmo MENU a base de 'segun sea'} Declaracion de variables ENTEROS: opcion fin declaracion de variables inicio mostrar por pantalla 'menu de opciones' mostrar por pantalla '1. Diccionario de sinonimos' mostrar por pantalla '2. Diccionario de antonimos' mostrar por pantalla '3. Buscar palabra' mostrar por pantalla '4. Salir' leer del teclado la variable opcion SEGUN SEA opcion HACER: opcion = 1 : {lo que toque a esta opcion} opcion = 2 : {lo que toque a esta opcion} opcion = 3 : {lo que toque a esta opcion} opcion = 4 : {lo que toque a esta opcion} por defecto: {mostrar un posible mensaje de error} fin SEGUN fin
As� queda mucho m�s claro, no s�lo para nosotros, si no para cualquier persona que tuviera que leerlo; adem�s, es una forma m�s sencilla de manejar una alternativa m�ltiple :)
Podemos abreviar un poquito el texto; es igualmente v�lido poner, dentro del SEGUN, lo siguiente:
SEGUN SEA opcion HACER: 1 : {lo que toque a esta opcion} 2 : {lo que toque a esta opcion} 3 : {lo que toque a esta opcion} 4 : {lo que toque a esta opcion} por defecto: {mostrar un posible mensaje de error} fin SEGUN
Me quedan las estructuras repetitivas, que las veremos en la pr�xima entrega, si no esto puede ser mucho trago de golpe O:)
En cualquier caso, ya teneis cosas para ir empezando a pensar en la escritura de algoritmos. Yo sugiero los siguientes...
�Ejercicios
�Sobre estructuras secuenciales
- Escribid un algoritmo que calcule el �rea de un tri�ngulo.
- Escribid un algoritmo que calcule el �rea de un rect�ngulo.
- Escribid un algoritmo que calcule el �rea de un trapecio.
- Escribid un algoritmo que calcule el precio de un art�culo tras aplicarle un 16% de IVA.
- Escribid un algoritmo que intercambie el contenido de dos variables.
�Sobre estructuras selectivas
- Escribid un algoritmo que resuelva una ecuaci�n de segundo grado, teniendo en cuenta todas las posibles alternativas.
- Dise�ad un esquema de men� de opciones, por ejemplo, un men� para seleccionar un libro a leer de entre siete disponibles.
- Escribid un algoritmo que lea tres n�meros e imprima por pantalla el mayor de ellos.
- Escribid un algoritmo que lea tres n�meros e imprima por pantalla el menor de ellos.
De momento, eso es todo, cuando tengamos las estructuras repetitivas ya podremos hacer muchas m�s cosas :)
Estoy *especialmente* interesada en el ejercicio 5 de las estructuras secuenciales y en el ejercicio 4 de las selectivas, lo digo por si no podeis hacer toda la faena... ;)