Resultados 1 al 14 de 14

Introdución a la programación estructurada (Modula 2)

Ver modo hilado

Mensaje anterior Mensaje anterior   Próximo mensaje Próximo mensaje
  1. #1 Introducción a la programación estructurada (Modula 2) Capítulo 1 
    Moderador HH
    Fecha de ingreso
    Mar 2003
    Ubicación
    Galiza
    Mensajes
    3.919
    Descargas
    8
    Uploads
    1
    PEQUEÑA INTRODUCCIÓN A LA PROGRAMACIÓN ESTRUCTURADA

    Introducción

    Primeramente, ¿de que va esto? Pues simplemente de una pequeña introducción informal a la programación, específicamente a la programación estructurada. Y, ¿por qué informal? Simplemente, porque esto será una introducción, pero no con los tintes clásicos de manual de un lenguaje de programación, sino unas pequeñas nociones de programación, que una vez adquiridas os servirán para introduciros en el estudio serio de cualquier otro lenguaje. Por ejemplo, no empezare con el clásico "Hola Mundo", que desde «Keningan & Richy» parece que es obligado en cualquier manual de programación que se precie. En lugar de lo anterior, os pondré un pequeño fragmento de código y posteriormente os lo desmenuzare. Advierto, buena parte de los ejemplos no tendrán ninguna utilidad práctica, solo servirán para introducir la correspondiente explicación.

    En cuanto al lenguaje me decanto por Modula 2, tal vez, junto a Pascal, el mejor y más utilizado lenguaje para la iniciación a la programación. No es un lenguaje que se suela utilizar para crear grandes proyectos, aunque no pongo en duda que se pueda realizar alguna maravilla con él, pero no es casualidad que sea el más elegido para la introducción a la programación. Por otro lado, provablemente, además del código en Modula 2 también pondré el programa en otro lenguaje (como "C"), para que vayáis viendo que no hay tanta diferencia entre unos lenguajes y otros.

    Pero empecemos con un poco de código fuente. Para empezar pues he elegido el código de un generador del triángulo de FLOYD de 1 a N, tiene un poco de todo lo básico y es un ejemplo que hace algo (como odio esos libros donde el primer código que sirve para algo está por encima de la página 100):

    Código:
    MODULE Floyd; 
        FROM InOut IMPORT WriteLn, WriteString, ReadInt, WriteInt; 
        VAR 
           N: INTEGER; 
           I: INTEGER; 
           L: INTEGER; 
           U: INTEGER; 
    (*N es el rango del triángulo, I es el contador, L representa la linea y U al último número de la linea*) 
    BEGIN 
        WriteString("Dime un número: "); 
        ReadInt(N); 
        WriteLn; 
        L:=1; 
        U:=1; 
        FOR I:=1 TO N DO 
           IF I>U THEN 
              WriteLn; 
              L:=L+1; 
              U:=U+L 
           END; 
           WriteInt(I,5) 
        END; 
        IF N>0 THEN WriteLn END 
    END Floyd.
    El resultado esperado es algo así:

    Código:
    Dime un número: 10 
        1 
        2    3 
        4    5    6 
        7    8    9   10
    Como por algún sitio hay que empezar, pues empecemos por el principio:

    MODULE Nombre_Programa;
    ... Declaración de variables, importación de funciones y declaración de tipos
    BEGIN
    ... Sentencias a través de las cuales el programa hará lo que nosotros querremos que haga
    END NombrePrograma.

    Esta es la estructura Básica de cualquier programa en Modula 2. Todo programa en Modula 2 comienza por la sentencia MODULE seguida por el nombre que recibirá el programa (internamente). Posteriormente, si que las hay, se procede a declarar variables (serian el equivalente a variables globales de otros lenguajes), tipos e importar las funciones de librerías que vayamos a utilizar. La etiqueta BEGIN (obligatoria siempre al igual que MODULE y END) nos indica en donde empezara la codificación de los algoritmos (entiendase algoritmo como código que realiza proporciona ciertos resultados). Para finalizar, todos los módulos terminan en un END final seguido del nombre del módulo. Si se trata de módulo principal de la aplicación, después del nombre del programa siempre va un punto (".").

    Por otro lado, después de cada sentencia, declaración..., siempre tiene que ir un punto y coma (";") [1], aunque en algunas sentencias no es necesario codificarlo porque ya esta implícito porque la siguiente sentencia es un "END" [2]. Debido a lo anterior, se pueden escribir más de una sentencia por linea, aunque no es aconsejable para mantener legibilidad en el código, excepto en alguna ocasión muy contada en donde la unión de sentencias tenga significado conjunto [3].

    NOTA:
    Código:
    1 [WriteString("Dime un número: ");] 
    2 [WriteInt(I,5) 
        END;] 
    3 [IF N>0 THEN WriteLn END]
    En otros capítulos ya desarrollaremos más esto, por ahora solo se intenta dar una visión superficial del lenguaje Modula2.

    Ahora toca entrar en temas en donde ya es muy importante comprender lo que se dice para entender la teoría, para lo cual diré ejemplos del mundo físico que podríamos considerar parejos, por lo menos en funcionalidad. A pesar de lo anterior, solo daré nociones, será en temas próximos en donde se darán las explicaciones completas y detalladas. Bien empecemos; las variables: ¿Que son las variables? ¿Para que sirven?... es lo que intentare explicaros.

    Podría poneros 20 definiciones de variable y esperar que captéis lo que es una variable, pero es muy sencillo preguntar a un par de personas, que están intentando aprender a programar, si entienden que es una variable y se ve claramente que muchos no pillan el concepto a la primera, te sueltan la teoría pero si les dices bien dime una similitud en el mundo real muchos no saben que contestar. Motivo, simple, las definiciones que suelen poner muchos textos son buenas o bastante buenas, pero muchas veces presuponen conocimientos que el que esta aprendiendo a programar no posee. Un buen ejemplo es la definición de variable clásica de los años 80: "Una variable es una posición de memoria" que ya tiene su tela la definición, pero por encima, muy usualmente, aun completaban la definición con algo como "que tiene un tamaño acorde a su tipo y cuyo valor puede variar durante la ejecución del programa" ... Llegados a este punto el estudiante de programación se encuentra conque, por encima de no tener ni idea de que es una variable, pues tampoco sabe que es una posición de memoria.

    Una buena explicación de variable es considerarla como un cajón. En un cajón puedes tener calzoncillos, calcetines, pantalones o dinero... bien si eres alguien como yo, pues en un cajón al mismo tiempo tienes calzoncillos, calcetines..., en ese caso es mejor pensar en los cajones de las mujeres, gracias a Dios no todas son así, las cuales tienen todas las bragas en un cajón, los calcetines en otro... Ahora piensa que los cajones son pequeñitos y solo cabe una pieza por cada cajón, por encima como tienes diferentes tipos de piezas, pues tienes muchos cajones, pero en un cajón para bragas nunca pondrás unos calcetines, aunque en un cajón para bragas hoy tienes un tanga, mañana una braguita, pasado una braga de esas inmensas y al siguiente otra vez una braguita... y si comprendes eso, pues no tienes porque tener problemas con qué es una variable. Definición: una variable es un contenedor (véase cajón) en donde se pueden guardar datos, y es posible cambiar su contenido a lo largo de la ejecución del programa, pero solo se pueden cambiar su contenido por otro similar.

    La siguiente definición importantes es la de librería (o biblioteca) y funciones incorporadas en las librerías. Mucha gente piensa en una librería como una biblioteca de la vida real y se equivoca, tiene su parecido, pero no es el mejor ejemplo. Un buen ejemplo sería pensar en librerías como en profesionales: fontaneros, electricistas, carpinteros... cada uno de ellos hace una serie de tareas, por ejemplo, que quieres poner un nuevo enchufe pues llamas al electricista y le dar la orden (equivalente a utilizar una función) de que te lo ponga. Un ejemplo especifico de librería con un montón de funciones, pues mi madre, mi madre plancha, friega, hace de comer, lava... que quiero que me planche unos pantalones, pues la llamo y le digo que quiero que me planche esos pantalones, ella coge los pantalones los plancha y me los devuelve planchados...

    Un tema que también es importante tocar es "¿qué es un compilador?". Por ahora nos llega con saber que es un programa que convierte un programa escrito en lenguaje humano a lenguaje que pueda entender la maquina, un buen ejemplo es un traductor. Aunque los compiladores no se limitan solo a traducir, es un tema que escapa a la finalidad de este capítulo, más adelante ya se explicara más detalladamente, y las diferencias entre compilador e interprete.

    Bien, ahora que ya tenemos una idea de que es una librería, una función y una variable, es el momento de empezar a explicar el pequeño programa.

    (*N es el rango del triángulo, I es el contador, L representa la linea y U al último número de la linea*)

    Esta linea no tiene mucha explicación, ya que simplemente es un comentario, no influye en el programa, su función es para cuando alguien lee el código, porque en los comentarios se puede poner datos como autor, nombre programa... pero su principal función es la de dejar pistas de lo que va sucediendo por si tienes que volver a modificar ese código o lo hace otro programador, y sepa lo que está echo, no porque no se entienda sin ellos, sino porque se ahorra tiempo y hace más fácil el trabajo. Es muy importante documentar los programas, especialmente cuando tienen ya cierto tamaño.

    FROM InOut IMPORT WriteLn, WriteString, ReadInt, WriteInt;

    Aquí le decimos al Compilador que si usamos las funciones "WriteLn", "WriteString"... pues que son de la librería "InOut", con lo cual a partir de aquí ya podemos usar esas funciones sin preocuparnos. Y es que lo que realmente hacemos es decirle al compilador: "si te encuentras con estás etiquetas, sabete que son funciones y que están en tal librería". Todos los lenguajes modernos tienen alguna forma de referenciar de donde sacas las funciones que uses en tus programas, sean estás funciones echas por ti, por otro o librerias estandar.

    Código:
        VAR 
           N: INTEGER; 
           I: INTEGER; 
           L: INTEGER; 
           U: INTEGER;
    Este código lo que hace es crear las variables "N","I","L" y,"U" además las creamos de un tipo especifico, en este caso son INTEGER, que puede decirse que el tipo INTEGER es el tipo ENTERO que todos conocemos de matemáticas (Ej: 1, 7, 12, -4), solo con una limitación, el número tiene que estar comprendido aproximadamente entre -32000 y 32000, y alguno se dirá "¿Por que?" pues yo siempre respondo con: "coge una calculadora y veras que que también tiene un limite de cifras, y si una calculadora tiene límite, pues un ordenador que es como una calculadora mucho más potente y sofisticada también". Hay más tipos de variables, pero los explicare en el próximo capitulo. Aunque hay lenguajes en donde no tienes que declarar las variables antes de usarlas, o el tipo es dinámico (ahora pueden contener un número, pero en la siguiente instrucción puden contener una letra, y en la siguiente...), normalmente es buena idea declarar las variables, y aunque fuese posible utilizar variables dinámicas, si tienes la opción de definirlas con un tipo, hazlo, es muy buena política.

    Código:
       WriteString("Dime un número: "); 
        ReadInt(N); 
        WriteLn;
    Aquí lo que hacemos es utilizar alguna de las funciones que antes referenciamos. Son funciones simples aunque muy especificas. No es la finalidad de este artículo explicarlas detalladamente, pero siempre viene bien ir conociendo las más usadas. "WriteString()" nos sirve para sacar por pantalla un texto, que puede ser algo tan simple como "a" o más complejo como "Hola hoy es Viernes, 9 de Marzo de 2007". "ReadInt()" nos sirve para poder utilizar un número INTEGER que nosotros pulsemos a través del teclado (Vuelve a leer el párrafo anterior). Además guarda ese número en la variable indicada, que por supuesto, tiene que ser una variable de INTEGER. Y "WriteLn" hace lo mismo que si nosotros pulsamos la tecla Intro cuando estamos en un terminal, que no es otra cosa que saltar de linea.

    Código:
        L:=1; 
        U:=1;  
        L:=L+1; 
        U:=U+L
    Aquí estamos ante una de las partes más importantes, operaciones con variables. Las 2 primeras lineas son una asignación de valor, que en cristiano significa que en la variable L pasa a haber un "1" al igual que en la variable "U", y es que el operador ":=" que significa: "evalúas y realizas las operaciones que hay a la derecha y guardas el resultado en la izquierda". "L:=L+1;" es un ejemplo de lo anterior, antes de que se ejecute esa operación, la variable "L" guardaba el valor "1", después de ejecutada la instrucción "L" guarda el valor "2", porque lo que hacemos es cogemos el valor de "L" y le sumamos "1" y guardamos el resultado en "L". Un ejemplo seria que tu tienes 5€ en la cartera, llegas a un cajero y sacas 100€ y guardas ese dinero en la cartera. Al final de la operación en la cartera tienes 105€. No lo confundáis con un "=" matemático, pensad siempre en la calculadora, vuelvo a repetir: "un ordenador no es más que una calculadora muy sofisticada a la que actualmente se le agregaron más funciones", el ENIAC, ENUVIAC y todos los demás padres de los actuales ordenadores eran básicamente calculadoras. La última sentencia ("U:=U+L") es similar a la anterior, excepto que en este caso la operación se hace entre 2 variables, aquí la operación seria: el valor de "U" (que es "1") le sumamos el valor de "L" (que es "2") y lo guardamos en "U" (que pasa a guardar un "3"). Si entendéis esto y lo anterior, ya podéis hacer programas muy sencillos, pero era lo máximo que podían hacer lasa computadoras de los años 40.

    IF N>0 THEN WriteLn END

    La mejor manera de entender está sentencia es traducirla a lenguaje natural (español, inglés...), y su traducción viene siendo: "Si el valor de la variable N es mayor de 0 (cero) entonces hago un Salto de Linea". Y es que la estructura "IF Condicion THEN Sentencias END;" lo que nos permite es comprobar si se da una condición y si se da se hacen ciertas acciones, sino pues no. La sentencia IF es una estructura de control, y como su nombre indica, nos permite controlar lo que sucede dependiendo de unas condiciones. No tiene más secretos.

    FOR I:=1 TO N DO
    END;

    Está estructura es bastante más compleja que la anterior, esta ya no es una estructura de control pura, sino que su principal utilización es como estructura de repetición (Haz las siguientes sentencias X veces). En concreto en el actual ejemplo, la tradición simplificada a lenguaje natural sería: "Repite estas sentencias N veces". Aunque su traducción más real es: "tomando la variable I como 1 y subiendo por cada ejecución su valor en 1, repetir las siguientes instrucciones hasta que el valor de I sea igual al valor de N", supongo que se podrá expresar mejor, pero por desgracia el Don de la Palabra no se encuentra entre mis virtudes.

    Bueno, lo dejamos por hoy, solo deciros que para que podáis practicar os dejo el compilador FST en la dirección http://iberhack.googlepages.com/instalar.rar. Es un compilador de Modula 2 que funciona en los entornos Windows, aunque a través de la linea de comandos. Para arrancarlo tenéis que ir a la ruta [depende del Windows]\M2\sistema\fst-40s\bin\mc.exe. Tiene un editor (Edit) muy sencillo en donde escribir el código y posteriormente también compilarlo, linkarlo y Ejecutarlo (Como el TuboPascal pero a lo cutre). Si después encuentro en donde tenia el XDS u otro de los gráficos os lo subo y lo dejo para que podáis bajarlo. Si tenéis problemas o dudas con el FST no dudéis en poneros en contacto conmigo. Para Linux hay el Mocka.

    Para terminar, os dejo el mismo programa en otro lenguaje, hace casi exactamente lo mismo que el de Modula 2.

    Código:
    #include <iostream>  //cout y cin son 2 funciones de esta librería de C++ 
    int N, I, L, U; 
    //N es el rango del triangulo, I es el contador, L representa la linea y U al último número de la linea 
    void main() { 
       cout << "Dime un número: "; 
       cin >> N; 
       cout << "/n"; 
       L=1; 
       U=1; 
       for (I=1;I==N;I++) { 
       if (I>U) { 
          cout << "/n"; 
          L=L+1; //serviría L++ que es exactamente lo mismo o ++L, aunque en este último caso no seria exactamente el mismo algoritmo que en caso de Modula 2. 
          U=U+L; 
       } 
       cout << "    "; //esto es simplemente para que aparezcan unos espacios en blando entre unos números y otros. 
       cout << I; 
       } 
       If (N>0) { cout << "/n"; } 
    }
    Un Saludo

    PD: si veo que hay gente que se interesa porque siga con este pequeño cursillo de programación básica seguiré haciendo capítulos. El próximo capitulo: "Tipos de Variables y Funciones básicas de consola".

    PD2: Bueno después quemo el documento en un PDF que quedo un poco churro al hacer copy desde el Word.

    PD3: Si alguien quiere copiarlo puede hacerlo, yo lo hice para el que lo quiera, aunque si hace el favor me menciona poniendo mi correo si lo va a redestribuir.
    Última edición por Giskard; 31-03-2007 a las 22:08
    He conocido muchos dioses. Quien niegue su existencia está tan ciego como el que confía en ellos con una fe desmesurada. Robert E. Howard
    La suerte ayuda a la mente preparada.
    Citar  
     

Temas similares

  1. modula 2
    Por Francis en el foro PROGRAMACION DESKTOP
    Respuestas: 1
    Último mensaje: 14-06-2010, 00:25
  2. Introducción a la programación estructurada. Capítulo 2
    Por gondar_f en el foro PROGRAMACION DESKTOP
    Respuestas: 3
    Último mensaje: 11-11-2007, 03:32
  3. Introdución a NAT [zirkua]
    Por zirkua en el foro REDES Y TECNOLOGIAS WIRELESS
    Respuestas: 0
    Último mensaje: 12-07-2007, 20:21
  4. Punteros Modula-2
    Por Cypress en el foro PROGRAMACION DESKTOP
    Respuestas: 2
    Último mensaje: 10-04-2007, 04:12
  5. Curso basico de programacion estructura (Modula 2) Tema2
    Por gondar_f en el foro HACK HiSPANO
    Respuestas: 3
    Último mensaje: 31-03-2007, 20:48

Marcadores

Marcadores