Resultados 1 al 14 de 14

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

  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 23: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  
     

  2. #2  
    Moderador HH
    Fecha de ingreso
    Feb 2002
    Ubicación
    México
    Mensajes
    1.156
    Descargas
    4
    Uploads
    0
    Muchas gracias por tu aportaci&#243;n gondar_f.
    Mientras el mundo permanezca no acabarán la fama y la gloria de México-Tenochtitlan
    Citar  
     

  3. #3  
    Moderador HH
    Fecha de ingreso
    Sep 2004
    Ubicación
    AR
    Mensajes
    867
    Descargas
    2
    Uploads
    0
    Dos palabras:
    im presionante

    Gracias!
    La inspiracion es una impredecible puta. Usualmente ella me besa cuando nadie mas quiere hacerlo.
    Citar  
     

  4. #4  
    Moderador HH
    Fecha de ingreso
    Mar 2003
    Ubicación
    Galiza
    Mensajes
    3.919
    Descargas
    8
    Uploads
    1
    Muchas gracias.
    Despu&#233;s ha ver si pongo unos ejercicios sencillos que se puedan hacer sin m&#225;s info.

    Un Saludo
    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  
     

  5. #5  
    Colaborador HH
    Fecha de ingreso
    Jun 2006
    Ubicación
    Uruguay
    Mensajes
    1.451
    Descargas
    11
    Uploads
    0
    UUuu... genial.. este lenguaje lo estoy aprendiendo en la facu este a&#241;o.

    http://www.excelsior-usa.com/cgi-bin/soupermail.pl

    ^ese es el compilador que usamos( Native XDS-x86 )... tambien esta para linux.

    Saludos,
    Cypress

    P.s Muy bueno gondar_f
    Louis Armstrong le dice a Ella Fitzgerald
    "take another drink of wine, and maybe you change your mind"
    Citar  
     

  6. #6  
    Moderador HH Avatar de ABODUJANA
    Fecha de ingreso
    Jun 2006
    Ubicación
    Por Tetouan
    Mensajes
    921
    Descargas
    14
    Uploads
    0
    Espero que lleges asta el final gondar_f (1 lenguaje bien aprendido puede ser la clave)
    Para cuando la PDF ?

    Gracias por todo...
    Citar  
     

  7. #7  
    Moderador HH
    Fecha de ingreso
    Mar 2003
    Ubicación
    Galiza
    Mensajes
    3.919
    Descargas
    8
    Uploads
    1
    Hola:

    Estos d&#237;as estube ocupado, a ver si a lo largo del f&#237;n de semana hago el siguiente cap&#237;tulo "Tipos de Variables y Funciones B&#225;sicas".

    Para cuando la PDF ?
    Lo estuve pensando, y la versi&#243;n PDF la sacare cuando tenga echos varios capitulos m&#225;s, para que sea un manual b&#225;sico pero completo.

    ^ese es el compilador que usamos( Native XDS-x86 )... tambien esta para linux.
    Es el mejor compilador para Modula 2 que existe... pero antes era de pago y por eso se sol&#237;a usar mas el FST, que por cierto, hay un entorno visual explendido para el FST, muy parecido al UltraEdit y que te permite no tener que tocar para nada el FST ya que todo lo puedes hacer desde el entorno visual (compilar, linkar, editar...). Aunque ahora que veo que el XDS es freeware me parece que al FST no le va a quedar mercado. Gracias por la direcci&#243;n del XDS (http://www.excelsior-usa.com/xdsdl.html).

    Un Saludo
    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  
     

  8. #8  
    Colaborador HH
    Fecha de ingreso
    Jun 2006
    Ubicación
    Uruguay
    Mensajes
    1.451
    Descargas
    11
    Uploads
    0
    Hay que decir que estas usando el estandar PIM, y no el ISO. (InOut es de PIM)

    Yo estube intentando usar el ISO, pero ni me salio sumar c:=a+b

    Los ejemplos que tengo de la facultad son todos con PIM, pero preferiria usar ISO ya que es Estandar.


    -------------------------------------------------
    Ya que esta reabierto el tema.. tengo una pregunta que me esta carcomiendo la cabeza.
    Estoy haciendo el practico, la letra dice esto:

    Escribir una funci&#243;n recursiva que verifique si 2 listas son iguales (mismos elementos en el mismo orden).

    Y este es mi codigo, pero no compila

    Código:
     MODULE probando;
    FROM InOut IMPORT ReadCard,WriteCard,WriteString;
    TYPE cadena = ARRAY[1..8] OF CHAR;
    VAR
    	a,b: cadena;
    	i,j,conta:CARDINAL;
    PROCEDURE p (a,b: ARRAY OF CHAR; VAR conta:CARDINAL):BOOLEAN;
    
    	1)conta:=conta+1;
    	IF a[conta] = b[conta] and conta <= 8 then
    		p;
    	ELSE
    		writestring ("Nop, lo siento ;)");
    	2)END3);
    
    	
    END 4)p5);
    BEGIN
    	conta:=0;
    	FOR i := 1 TO 2 DO
    		FOR j:= 1 TO 8 DO
    			IF i = 1 THEN
    				WriteString ("Ingrese el n&#186; ",j);
    				Readcard (a[j]);
    			ELSE
    				WriteString ("Ingrese el n&#186; ",j);
    				Readcard (b[j]);
    			END;
    		end;
    	end;
    	p;			
    	
    END probando.
    Estos son lo errores que me da le compilador:
    Cita Iniciado por el XDS
    1) Expected Start of declaration (* estoy pasando el parametro.. porque me pide que lo declare? *)
    2) Function procedure without RETURN statment (* no entiendo que me quiere decir *)
    3) Identifier Expected (*no se porque pone eso*)
    4) Idenrifier does not mactch block name (* el nombre del procedimiento es p, no se porque dice esto *)
    5) Expected simbol "." (* no es el fin del programa, por qu&#233; se confunde? *)
    Perdon si son muy tontas estas preguntas.. es que recien es el segundo programa que hago en modula2.
    Última edición por Cypress; 17-03-2007 a las 03:41
    Louis Armstrong le dice a Ella Fitzgerald
    "take another drink of wine, and maybe you change your mind"
    Citar  
     

  9. #9  
    Moderador HH
    Fecha de ingreso
    Mar 2003
    Ubicación
    Galiza
    Mensajes
    3.919
    Descargas
    8
    Uploads
    1
    Hola Cypress:
    En cuanto a tu c&#243;digo, hay varios errores que aprecio a primera vista, aunque te advierto que cada compilador es un mundo, y aunque como bien tu dices, casi todos se basan en la especificaci&#243;n original del Modula 2, realmente son pocos los que la siguen al pie de la letra estrictamente.
    El error que te da 5 y el 4, es porque no hacen un RETURN, m&#225;s concretamente tendr&#237;as que hacer un RETURN p, m&#225;s concretamente tendr&#237;a deber&#237;a ser:
    RETURN p
    END p;
    Por otro lado, tu en ning&#250;n momento asignas un valor a p cundo trabaja como variable (josu es que ni siquiera esta inicializado). Y cuando la llamas como funcion tampoco le pasas los valores. Por otro lado, recuerda que Modula 2 es muy estricta con los tipos (precisamente una de sus grandes cualidades para la ense&#241;anza) y resulta que tu en un lado defines un tipo "cadena" y creas 2 variables como "cadena" y en la cabezera de "p" realizas una nueva defrinici&#243;n que no coincide con la anterior. Y aunque en muchos compiladores de Modula 2 eso traga cuando son STRINGS, en otros no, y creo que ese es uno de los problemas aunque no te lo de.
    El error 2 es por lo que comente antes, de repente utilizas "p" pero ni le cargas valores ni lo usas para un "RETURN" ni nada, simplemente pones "p;", cuando tendr&#237;a que ser algo por el estilo de "p:=TRUE;" o "p:=FALSE;" y posteriormente hacer el RETURN, aunque tambi&#233;n podr&#237;as hacer directamente un "RETURN p:=TRUE;" si tu compilador lo permite (no todos lo permiten) porque esto es lo que denomina programaci&#243;n sucia "dirty" (algo as&#237; se escribe) en programaci&#243;n estructurada tu debes hacer el RETURN para cerrar la funci&#243;n y devolver el valor, para darle mayor claridad al c&#243;digo y porque se considera que todas las estructuras de decisi&#243;n y repetici&#243;n tienen que cerrarse antes de que se cierre la Funci&#243;n o Procedimiento (en Modula 2 hay muy pocas diferencias entre ambos tipos, simplemente es funci&#243;n cuando devuelve algo explicitamente y sino es Procedimiento).
    writestring ("Nop, lo siento ");
    Deber&#237;a ser:
    WriteString("Nop, lo siento ")
    END;
    Aunque no deber&#237;a de dar fallo, simplemente a lo sumo un Warning, salvo que el XDS (no recuerdo ahora si tenia era estricto hasta tal punto) te obliga a escribir siempre "WriteString" y no otra de las formas como "WRITESTRING", aunque no me estra&#241;aria, recuerda que Modula 2 es Case sensitive (distingue mayusculas y minusculas).
    En cuanto al fallo 1, pues sinceramente no estoy seguro, aunque mucho me temo que es porque tu cuando llamas a la funci&#243;n "p" no le pasaste los parametros, con lo cual, "conta" es redefinido como una nueva variable y sin inicializarla ya haces operaciones matem&#225;ticas con ella.
    Por cierto, &#191;tu est&#225;s seguro que "WriteString ("Ingrese el n&#186; ",j);" es correcto? por lo menos yo no sab&#237;a que se pod&#237;a usar un WriteString as&#237;, yo para eso habr&#237;a echo:
    WriteString("Ingrese el n&#186; ");
    WriteCard(j);
    ReadCard(a[j]);
    Bueno, despu&#233;s te lo miro m&#225;s detenidamente y te comento....

    Un Saludo
    Última edición por gondar_f; 18-03-2007 a las 17:55
    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  
     

  10. #10  
    Colaborador HH
    Fecha de ingreso
    Jun 2006
    Ubicación
    Uruguay
    Mensajes
    1.451
    Descargas
    11
    Uploads
    0
    Muuuuuuuuuuuuuchas gracias!!.. me di cuenta de algunas cosas que habia echo mal, tambien tuve errores de proprociones titanicas en el primer codigo (jajjaja) que ya pude arreglar (Modula-2 no es joda.. este programita tonto me ha llevado muucho tiempo, supongo que sera hasta que me acostumbre al compilador &#172;&#172.

    Tambien pasan unas cosas extremadamente raras.

    Aqui el codigo y despues lo comento. (este anda bien)

    Código:
    MODULE probando1;
    FROM InOut IMPORT Read,WriteCard,WriteString,WriteLn;
    TYPE cadena = ARRAY[1..8] OF CHAR;
    VAR
    	a,b: cadena;
    	i,j,conta:CARDINAL;
    	eqf:BOOLEAN;
    PROCEDURE p (a,b: cadena; VAR conta:CARDINAL):BOOLEAN;
    BEGIN
    	conta:=conta+1;
    	IF (a[conta] = b[conta]) AND (conta <= 8) THEN
    		IF conta = 8 THEN
    			a)RETURN TRUE;
    			
    		ELSE
    			
    			b)RETURN p(a,b,conta);
    		END;
    		
    	ELSE
    		WriteString ("Nop, lo siento ;)");		
    		RETURN FALSE;
    	END;
    	
    END p;
    BEGIN
    	conta:=0;
    	FOR i := 1 TO 2 DO
    		FOR j:= 1 TO 8 DO
    			IF i = 1 THEN
    				c)WriteString ("Ingrese el n&#186; ");
    				WriteCard(j,0);
    				WriteLn;
    				d)Read (a[j]); (* esto si que es bien raro *)
    				Read (a[j]);
    			ELSE
    				WriteString ("Ingrese el n&#186; ");
    				WriteCard(j,0);
    				WriteLn;
    				Read (b[j]);				
    				Read (b[j]);
    			END;
    		END;
    	END;
    	
    	e)eqf:= p(a,b,conta);
    	f)IF eqf THEN
    		WriteString ("Son Iguales");
    	END;
    	
    END probando1.
    Bien ah&#237; el codigo.. con respecto a los errores que tuve al principio..
    1) el primero fue porque me olvide de poner el begin :P
    2) el error no estaba donde decia el compilador.. estaba en que tenia que poner RETURN p(a,b,conta) <= se me habia olvidado de pasar los valores en el primer codigo (este si que es un error grabe)
    3) Valla uno a saber que queria :P
    4) y 5) tampoco se que querian :P
    -------

    Bien ahora marco unas cosas
    a) "RETURN TRUE;" <= esta es la forma correcta, no funciona "RETURN p:=TRUE;" hay que poner el valor de primera.. ya que esta dentro de la funci&#243;n. (Si estoy tirando fruta diganeme ya que es lo que estoy suponiendo. pero puede ser que no sea correcto )
    b) Aqui si hay que poner "RETURN p(a,b,conta);" ya que esto pasando los valores
    C) Aca tenias Razon gondar_f es que pense que podia funcionar igual que en Pascal.

    d) La primera cosa rara.. Se pone Read, y no ReadString.

    En los modulos de definicion aparece esto para cada uno:

    Código:
    PROCEDURE Read(VAR v: CHAR);
    PROCEDURE ReadString(VAR v: ARRAY OF CHAR);
    ^^ Inicialmente habia puesto ReadString ya que tenia que leer una cadena de caracteres.. pero, me daba error. As&#237; que me fui con Read.. y no he tendio problemas :P

    d) Por qu&#233; dos veces Read? Yo me pregunto lo mismo.. cuando lo hice por primera vez puse un solo read, y al compilarlo y ejecutarlo.. pasaba esto:


    Tuve la loca idea de poner dos Read y funcion&#243;, de locos, verdad? :P Jaja


    e) Me daba problemas poner "RETURN p(a,b,conta);" entonces.. me defini una variable.. y funciono perfecto. (esto se me ocurrio mirando codigos de otras personas, gracias http://www.google.com/codesearch, donde encontre algunos codigos que me dieron ideas)

    f) Aca otra cosa que me di cuenta que no funcionaba, intente poner
    Código:
    IF eqf THEN WriteString ("Son Iguales");
    pero me daba error.. es que parece que modula-2 no te permite hacer eso..
    por eso esos bolques feos :P

    Bueno eso es todo!! Al fin salio el programita tonto ese.. El viernes recien tengo consulta de practico.. a ver si me dicen por qu&#233; lo de los dos Read.

    Bueno.. espero que les sirva a otros tambien.

    Saludos,
    Cypress
    Última edición por Cypress; 18-03-2007 a las 21:41
    Louis Armstrong le dice a Ella Fitzgerald
    "take another drink of wine, and maybe you change your mind"
    Citar  
     

  11. #11  
    Moderador HH
    Fecha de ingreso
    Feb 2002
    Ubicación
    México
    Mensajes
    1.156
    Descargas
    4
    Uploads
    0
    d) Por qu&#233; dos veces Read? Yo me pregunto lo mismo.. cuando lo hice por primera vez puse un solo read, y al compilarlo y ejecutarlo.. pasaba esto...
    Nunca he programado en Modula, pero supongo que ese error, como en C, es debido a que se debe limpiar el buffer, es decir, cuando uno presiona un n&#250;mero, se guarda tambi&#233;n el ENTER, o un caracter nulo. Por lo tanto, siempre hay que limpiar el buffer de entrada antes de pedir un dato (en C la funci&#243;n es fflush(stdin), no s&#233; si haya algo parecido en modula).

    Saludos
    Mientras el mundo permanezca no acabarán la fama y la gloria de México-Tenochtitlan
    Citar  
     

  12. #12  
    Moderador HH
    Fecha de ingreso
    Mar 2003
    Ubicación
    Galiza
    Mensajes
    3.919
    Descargas
    8
    Uploads
    1
    Juas lo del BEGIN no me fijara bueno, lo importante es que ahora el programa ya tiene otra pinta, que no quiero ofenderte, pero el c&#243;digo anterior parecia un poco chapuzas...

    Sinceramente, raro si que es lo de que no te deje usar ReadString, y lo de Read 2 veces tambi&#233;n... la &#250;nica explicaci&#243;n que le puedo encontrar es:
    que la definici&#243;n de variable string que hiciste no fuera aceptable para tu compilador, basicamente hay 3 tipos de variables aceptables como String:
    Forma 1:
    TYPE string= [0..N] ARRAY OF CHAR;
    (*TYPE string= ARRAY OF CHAR; es otra opci&#243;n*)
    VAR cadena: string;
    Forma 2:
    VAR string: [0..N] ARRAY OF CHAR;
    Forma 3:
    VAR string: ARRAY OF CHAR;
    (*simplemente es una variaci&#243;n del anterior poniendo el string como vector abierto*)
    NOTA: string y cadena pueden ser cualquier identificador v&#225;lido de Modula2

    Muchas veces hay fallos porque la gente en lugar de declarar las variables STRING as&#237; comete algun fallo del tipo:
    VAR cadena: [1..10] ARRAY OF CHAR;
    En este caso es un Array, pero no un STRING valido (aunque haya compiladores que lo acepten)... ya que para ser un STRING tiene que empezar siempre en 0 y tiene un tama&#241;o N porque el &#250;ltimo caracter es siempre "0c".
    Tu declaras la cadena como:
    TYPE cadena = ARRAY[1..8] OF CHAR;
    , por lo cual seguramente es el fallo...

    En cuanto a lo de tener que poner 2 veces Read, pues no se que decirte, realmente es "raro raro". Aun as&#237; te recomiendo que hagas un cambio, en lugar de asiganar el valor directamente al Array, pues que lo pases primero por una variable:
    VAR c: CHAR;
    ...
    c:="5"; (*por inicializarlo a un valor*)
    Read(c);
    a[j]:=c;
    Esta es una forma mucho m&#225;s correcta (la otra tambi&#233;n lo es, pero en menor grado, aunque tiene que funcionar siempre) en programaci&#243;n estructurada, ya que tal como lo haces, realizas una doble asignaci&#243;n en un solo paso y la programaci&#243;n estructurada purista (cumpliendo normas y recomendaciones -&#233;stas &#250;ltimas no obligatorias-) dice que jam&#225;s se deben hacer operaciones multiples, y en tu caso primero guardas un valor CHAR en una variable y posteriormente el valor en un Array (aunque el array estea compuesto de CHARs se considera una doble asignaci&#243;n)...pero es una medida para que el c&#243;digo sea m&#225;s claro, no ofecta al programa en si.
    Realmente, la &#250;nica posible explicaci&#243;n (y es bien rebuscada) es que tengas que hacerlo 2 veces porque ese nodo del Array no este inicializado y la primera vez se inicialice y la segunda cargue el valor, aunque realmente me parece una jilipollez, vete tu a saber, porque hay que recordad que aunque externamente (para el programador) los arrays en Modula 2 son estaticos, realmente, internamente (para el compilador y posteriormente en ejecuci&#243;n) son din&#225;micos...

    Por otro lado, lo que dice Giskard tiene mucha l&#243;gica, aunque precisamente una de las pecualidades del Modula 2 es que tambi&#233;n se pueden capturar Intros directamente (si cuando te pide la variable pulsas directamente Intro)... aunque no deber&#237;a de suceder eso si escribes algo, ya que solo guarda un caracter y siempre el primero desde la posici&#243;n inicial del cursor y te&#243;ricamente no guarda estados anteriores... pero como cada compilador es un mundo... y puede ser que aqui suceda eso.

    En cuanto a tu error "f" yo le encuentro una explicaci&#243;n, anque tendr&#237;a que saber cual erra la siguiente linea de c&#243;digo. Y la expliaci&#243;n es simple, que despues venga un END y en ese caso no debe ponerse el ";", aun as&#237;, funciono o no, jam&#225;s debes hacer eso en programaci&#243;n estructurada (bueno, puedes hacerlo pero entonces estar&#237;as programando no programando estructuradamente), ya que estas poniendo en una sola linea de c&#243;digo 2 operaciones, y en este caso 2 operaciones complejas... si bien parece que queda muy bien visualmente, cuando el progrma tiene cierta extensi&#243;n, eso resta legibilidadad al c&#243;digo y adem&#225;s complica la funci&#243;n del precompilador...

    Un Saludo

    PD: a ver si en los proximos d&#237;as remato el segundo tema, que al final me retrase de lo previsto, juas menudo fin de semana que tuve...
    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  
     

  13. #13  
    Iniciado
    Fecha de ingreso
    Jul 2004
    Ubicación
    Cadifornia
    Mensajes
    24
    Descargas
    0
    Uploads
    0
    Dios de mi vida... Uno de los mios... Bien por ti gondar_f. Yo empece por pascal y en la uni empece con modula2. Pascal no tenia mucho que envidiar en potencia a c.

    Un saludo.
    Citar  
     

  14. #14  
    Iniciado
    Fecha de ingreso
    Apr 2011
    Mensajes
    3
    Descargas
    3
    Uploads
    0
    Muy interesante el tema, gracias.
    Citar  
     

Temas similares

  1. modula 2
    Por Francis en el foro PROGRAMACION DESKTOP
    Respuestas: 1
    Último mensaje: 14-06-2010, 01: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, 04:32
  3. Introdución a NAT [zirkua]
    Por zirkua en el foro REDES Y TECNOLOGIAS WIRELESS
    Respuestas: 0
    Último mensaje: 12-07-2007, 21:21
  4. Punteros Modula-2
    Por Cypress en el foro PROGRAMACION DESKTOP
    Respuestas: 2
    Último mensaje: 10-04-2007, 05: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, 21:48

Marcadores

Marcadores