Resultados 1 al 14 de 14

Introducin a la programacin estructurada (Modula 2)

  1. #1 Introduccin a la programacin estructurada (Modula 2) Captulo 1 
    Moderador HH
    Fecha de ingreso
    Mar 2003
    Ubicacin
    Galiza
    Mensajes
    3.919
    Descargas
    8
    Uploads
    1
    PEQUEA INTRODUCCIN A LA PROGRAMACIN ESTRUCTURADA

    Introduccin

    Primeramente, de que va esto? Pues simplemente de una pequea introduccin informal a la programacin, especficamente a la programacin estructurada. Y, por qu informal? Simplemente, porque esto ser una introduccin, pero no con los tintes clsicos de manual de un lenguaje de programacin, sino unas pequeas nociones de programacin, que una vez adquiridas os servirn para introduciros en el estudio serio de cualquier otro lenguaje. Por ejemplo, no empezare con el clsico "Hola Mundo", que desde Keningan & Richy parece que es obligado en cualquier manual de programacin que se precie. En lugar de lo anterior, os pondr un pequeo fragmento de cdigo y posteriormente os lo desmenuzare. Advierto, buena parte de los ejemplos no tendrn ninguna utilidad prctica, solo servirn para introducir la correspondiente explicacin.

    En cuanto al lenguaje me decanto por Modula 2, tal vez, junto a Pascal, el mejor y ms utilizado lenguaje para la iniciacin a la programacin. 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 ms elegido para la introduccin a la programacin. Por otro lado, provablemente, adems del cdigo en Modula 2 tambin pondr el programa en otro lenguaje (como "C"), para que vayis viendo que no hay tanta diferencia entre unos lenguajes y otros.

    Pero empecemos con un poco de cdigo fuente. Para empezar pues he elegido el cdigo de un generador del tringulo de FLOYD de 1 a N, tiene un poco de todo lo bsico y es un ejemplo que hace algo (como odio esos libros donde el primer cdigo que sirve para algo est por encima de la pgina 100):

    Cdigo:
    MODULE Floyd; 
        FROM InOut IMPORT WriteLn, WriteString, ReadInt, WriteInt; 
        VAR 
           N: INTEGER; 
           I: INTEGER; 
           L: INTEGER; 
           U: INTEGER; 
    (*N es el rango del tringulo, I es el contador, L representa la linea y U al ltimo nmero de la linea*) 
    BEGIN 
        WriteString("Dime un nmero: "); 
        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:

    Cdigo:
    Dime un nmero: 10 
        1 
        2    3 
        4    5    6 
        7    8    9   10
    Como por algn sitio hay que empezar, pues empecemos por el principio:

    MODULE Nombre_Programa;
    ... Declaracin de variables, importacin de funciones y declaracin de tipos
    BEGIN
    ... Sentencias a travs de las cuales el programa har lo que nosotros querremos que haga
    END NombrePrograma.

    Esta es la estructura Bsica 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 libreras que vayamos a utilizar. La etiqueta BEGIN (obligatoria siempre al igual que MODULE y END) nos indica en donde empezara la codificacin de los algoritmos (entiendase algoritmo como cdigo que realiza proporciona ciertos resultados). Para finalizar, todos los mdulos terminan en un END final seguido del nombre del mdulo. Si se trata de mdulo principal de la aplicacin, despus del nombre del programa siempre va un punto (".").

    Por otro lado, despus de cada sentencia, declaracin..., siempre tiene que ir un punto y coma (";") [1], aunque en algunas sentencias no es necesario codificarlo porque ya esta implcito porque la siguiente sentencia es un "END" [2]. Debido a lo anterior, se pueden escribir ms de una sentencia por linea, aunque no es aconsejable para mantener legibilidad en el cdigo, excepto en alguna ocasin muy contada en donde la unin de sentencias tenga significado conjunto [3].

    NOTA:
    Cdigo:
    1 [WriteString("Dime un nmero: ");] 
    2 [WriteInt(I,5) 
        END;] 
    3 [IF N>0 THEN WriteLn END]
    En otros captulos ya desarrollaremos ms esto, por ahora solo se intenta dar una visin superficial del lenguaje Modula2.

    Ahora toca entrar en temas en donde ya es muy importante comprender lo que se dice para entender la teora, para lo cual dir ejemplos del mundo fsico que podramos considerar parejos, por lo menos en funcionalidad. A pesar de lo anterior, solo dar nociones, ser en temas prximos en donde se darn las explicaciones completas y detalladas. Bien empecemos; las variables: Que son las variables? Para que sirven?... es lo que intentare explicaros.

    Podra poneros 20 definiciones de variable y esperar que captis lo que es una variable, pero es muy sencillo preguntar a un par de personas, que estn 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 teora 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 definicin de variable clsica de los aos 80: "Una variable es una posicin de memoria" que ya tiene su tela la definicin, pero por encima, muy usualmente, aun completaban la definicin con algo como "que tiene un tamao acorde a su tipo y cuyo valor puede variar durante la ejecucin del programa" ... Llegados a este punto el estudiante de programacin se encuentra conque, por encima de no tener ni idea de que es una variable, pues tampoco sabe que es una posicin de memoria.

    Una buena explicacin de variable es considerarla como un cajn. En un cajn puedes tener calzoncillos, calcetines, pantalones o dinero... bien si eres alguien como yo, pues en un cajn 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 cajn, los calcetines en otro... Ahora piensa que los cajones son pequeitos y solo cabe una pieza por cada cajn, por encima como tienes diferentes tipos de piezas, pues tienes muchos cajones, pero en un cajn para bragas nunca pondrs unos calcetines, aunque en un cajn para bragas hoy tienes un tanga, maana 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. Definicin: una variable es un contenedor (vase cajn) en donde se pueden guardar datos, y es posible cambiar su contenido a lo largo de la ejecucin del programa, pero solo se pueden cambiar su contenido por otro similar.

    La siguiente definicin importantes es la de librera (o biblioteca) y funciones incorporadas en las libreras. Mucha gente piensa en una librera como una biblioteca de la vida real y se equivoca, tiene su parecido, pero no es el mejor ejemplo. Un buen ejemplo sera pensar en libreras 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 funcin) de que te lo ponga. Un ejemplo especifico de librera con un montn 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 tambin 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 captulo, ms adelante ya se explicara ms detalladamente, y las diferencias entre compilador e interprete.

    Bien, ahora que ya tenemos una idea de que es una librera, una funcin y una variable, es el momento de empezar a explicar el pequeo programa.

    (*N es el rango del tringulo, I es el contador, L representa la linea y U al ltimo nmero de la linea*)

    Esta linea no tiene mucha explicacin, ya que simplemente es un comentario, no influye en el programa, su funcin es para cuando alguien lee el cdigo, porque en los comentarios se puede poner datos como autor, nombre programa... pero su principal funcin es la de dejar pistas de lo que va sucediendo por si tienes que volver a modificar ese cdigo 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 ms fcil el trabajo. Es muy importante documentar los programas, especialmente cuando tienen ya cierto tamao.

    FROM InOut IMPORT WriteLn, WriteString, ReadInt, WriteInt;

    Aqu le decimos al Compilador que si usamos las funciones "WriteLn", "WriteString"... pues que son de la librera "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 ests etiquetas, sabete que son funciones y que estn en tal librera". Todos los lenguajes modernos tienen alguna forma de referenciar de donde sacas las funciones que uses en tus programas, sean ests funciones echas por ti, por otro o librerias estandar.

    Cdigo:
        VAR 
           N: INTEGER; 
           I: INTEGER; 
           L: INTEGER; 
           U: INTEGER;
    Este cdigo lo que hace es crear las variables "N","I","L" y,"U" adems 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 matemticas (Ej: 1, 7, 12, -4), solo con una limitacin, el nmero 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 tambin tiene un limite de cifras, y si una calculadora tiene lmite, pues un ordenador que es como una calculadora mucho ms potente y sofisticada tambin". Hay ms tipos de variables, pero los explicare en el prximo capitulo. Aunque hay lenguajes en donde no tienes que declarar las variables antes de usarlas, o el tipo es dinmico (ahora pueden contener un nmero, pero en la siguiente instruccin puden contener una letra, y en la siguiente...), normalmente es buena idea declarar las variables, y aunque fuese posible utilizar variables dinmicas, si tienes la opcin de definirlas con un tipo, hazlo, es muy buena poltica.

    Cdigo:
       WriteString("Dime un nmero: "); 
        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 artculo explicarlas detalladamente, pero siempre viene bien ir conociendo las ms usadas. "WriteString()" nos sirve para sacar por pantalla un texto, que puede ser algo tan simple como "a" o ms complejo como "Hola hoy es Viernes, 9 de Marzo de 2007". "ReadInt()" nos sirve para poder utilizar un nmero INTEGER que nosotros pulsemos a travs del teclado (Vuelve a leer el prrafo anterior). Adems guarda ese nmero 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.

    Cdigo:
        L:=1; 
        U:=1;  
        L:=L+1; 
        U:=U+L
    Aqu estamos ante una de las partes ms importantes, operaciones con variables. Las 2 primeras lineas son una asignacin 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: "evalas 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 operacin, la variable "L" guardaba el valor "1", despus de ejecutada la instruccin "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 operacin en la cartera tienes 105. No lo confundis con un "=" matemtico, pensad siempre en la calculadora, vuelvo a repetir: "un ordenador no es ms que una calculadora muy sofisticada a la que actualmente se le agregaron ms funciones", el ENIAC, ENUVIAC y todos los dems padres de los actuales ordenadores eran bsicamente calculadoras. La ltima sentencia ("U:=U+L") es similar a la anterior, excepto que en este caso la operacin se hace entre 2 variables, aqu la operacin 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 entendis esto y lo anterior, ya podis hacer programas muy sencillos, pero era lo mximo que podan hacer lasa computadoras de los aos 40.

    IF N>0 THEN WriteLn END

    La mejor manera de entender est sentencia es traducirla a lenguaje natural (espaol, ingls...), y su traduccin 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 condicin 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 ms secretos.

    FOR I:=1 TO N DO
    END;

    Est estructura es bastante ms compleja que la anterior, esta ya no es una estructura de control pura, sino que su principal utilizacin es como estructura de repeticin (Haz las siguientes sentencias X veces). En concreto en el actual ejemplo, la tradicin simplificada a lenguaje natural sera: "Repite estas sentencias N veces". Aunque su traduccin ms real es: "tomando la variable I como 1 y subiendo por cada ejecucin 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 podis practicar os dejo el compilador FST en la direccin http://iberhack.googlepages.com/instalar.rar. Es un compilador de Modula 2 que funciona en los entornos Windows, aunque a travs de la linea de comandos. Para arrancarlo tenis 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 cdigo y posteriormente tambin compilarlo, linkarlo y Ejecutarlo (Como el TuboPascal pero a lo cutre). Si despus encuentro en donde tenia el XDS u otro de los grficos os lo subo y lo dejo para que podis bajarlo. Si tenis problemas o dudas con el FST no dudis 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.

    Cdigo:
    #include <iostream>  //cout y cin son 2 funciones de esta librera 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 nmero de la linea 
    void main() { 
       cout << "Dime un nmero: "; 
       cin >> N; 
       cout << "/n"; 
       L=1; 
       U=1; 
       for (I=1;I==N;I++) { 
       if (I>U) { 
          cout << "/n"; 
          L=L+1; //servira 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 nmeros y otros. 
       cout << I; 
       } 
       If (N>0) { cout << "/n"; } 
    }
    Un Saludo

    PD: si veo que hay gente que se interesa porque siga con este pequeo cursillo de programacin bsica seguir haciendo captulos. El prximo capitulo: "Tipos de Variables y Funciones bsicas de consola".

    PD2: Bueno despus 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 edicin por Giskard; 31-03-2007 a las 22:08
    He conocido muchos dioses. Quien niegue su existencia est tan ciego como el que confa 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
    Ubicacin
    Mxico
    Mensajes
    1.156
    Descargas
    4
    Uploads
    0
    Muchas gracias por tu aportaci&#243;n gondar_f.
    Mientras el mundo permanezca no acabarn la fama y la gloria de Mxico-Tenochtitlan
    Citar  
     

  3. #3  
    Moderador HH
    Fecha de ingreso
    Sep 2004
    Ubicacin
    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
    Ubicacin
    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 confa 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
    Ubicacin
    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
    Ubicacin
    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
    Ubicacin
    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 confa 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
    Ubicacin
    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

    Cdigo:
     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 edicin por Cypress; 17-03-2007 a las 02: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
    Ubicacin
    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 edicin por gondar_f; 18-03-2007 a las 16:55
    He conocido muchos dioses. Quien niegue su existencia est tan ciego como el que confa 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
    Ubicacin
    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)

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

    Cdigo:
    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
    Cdigo:
    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 edicin por Cypress; 18-03-2007 a las 20: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
    Ubicacin
    Mxico
    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 acabarn la fama y la gloria de Mxico-Tenochtitlan
    Citar  
     

  12. #12  
    Moderador HH
    Fecha de ingreso
    Mar 2003
    Ubicacin
    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 confa 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
    Ubicacin
    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, 00:25
  2. Introduccin a la programacin estructurada. Captulo 2
    Por gondar_f en el foro PROGRAMACION DESKTOP
    Respuestas: 3
    ltimo mensaje: 11-11-2007, 03:32
  3. Introducin 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