ID | Asunto | Fecha | Nick | |
58205 | El antiguo GWBASIC | 19/03/18 01:06 | nicolas2018alcub | | |
¡Hola amigos! Soy reciente en este foro. Tengo 37 años de edad y soy fanático de lo retro. Mediante DOSBOX puedo correr el GW-BASIC 2x y 3x tanto en ordenadores convencionales como en mis tablets e incluso smartphones con Android O.S Jajaja Estoy haciendo pruebas con la instrucción GOTO de esas épocas. Tengo in programa así:
1 CLS 2 A = 1 3 PRINT A 4 A = A + 1 5 IF A <= 10 THEN 6 GOTO 3 7 ELSE 8 END 9 END IF RUN
El tema que entra como en un bucle hasta el infinito, imprimiendome por pantalla números desde el 1 hasta "el infinuto" y la idea de este programs es que "corte" cuando A sea igual que 10. ¿Por qué no corta o no para el programa?. Yo le puse que si A es menor o igual que 10 que realice el salto a la línea 3 para que vuelva a imprimir el valor de la variable A e incremente a de uno en uno, en caso contrario que termine el programa. O sea que si A "sobrepasa" el 10 deberia acabar el programa y no seguir y seguir. ¿Por qué no corta?. Espero respuestas, amigos, por favor. Saludos. Nicolás Matías Funtalas |
|
ID | Asunto | Fecha | Nick | |
58207 | Re: El antiguo GWBASIC (Resp: 58205) | 22/03/18 17:46 | nicolas2018alcub | | |
Pero respondan. Respondan , por favor...
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
58208 | Re: El antiguo GWBASIC (Resp: 58205) | 23/03/18 19:36 | Ramón Sola | | |
Hola, me parece una cuestión interesante. Yo soy un poquito más joven pero también he desarrollado cierta curiosidad por los programas y los sistemas antiguos. BASIC no es un lenguaje demasiado extraño para mí.
El dialecto BASIC que implementa GWBASIC es relativamente primitivo. No contempla el IF estructurado que se cierra con ENDIF o END IF, sino más bien un IF-THEN-ELSE "clásico". La cláusula ELSE es opcional y no todos los BASIC de la época la admiten. THEN y ELSE deben aparecer en la misma línea del IF para que tengan efecto. Extrañamente, el analizador de GWBASIC acepta ELSE como sentencia independiente sin rechistar, aunque en apariencia no hace nada. Supuestamente es una limitación o un "bug" del intérprete.
El programa no hace lo que se pretende. Aparentemente, una cláusula THEN vacía es correcta o por lo menos "no ilegal", así que la línea 6 no implica una "continuación" del THEN sino una sentencia aparte. Dicho de otro modo, el IF de la línea 5 no produce efecto alguno y la ejecución pasa a la 6 directamente, con lo cual se regresa a la 3 y se repite el ciclo.
Dado que los IF-THEN-ELSE no son estructurados, las decisiones se deben resolver con una o más sentencias en la misma línea (dentro del THEN o del ELSE, si procede) o con saltos (GOTO) según la complejidad de las acciones. Por tanto, el GOTO 3 pasaría al THEN: 5 IF A <= 10 THEN GOTO 3
Esta construcción es correcta pero redundante. Se puede simplificar de dos formas: 5 IF A <= 10 THEN 3 5 IF A <= 10 GOTO 3
Las líneas siguientes sobrarían porque el programa terminaría ahí, después de contar hasta 10. Si hubiera más acciones se colocarían en un ELSE detrás del THEN (por ejemplo, THEN 3 ELSE PRINT "FIN") o en las líneas siguientes.
De todas formas este es un ejemplo de prueba. Cuando se conoce el número exacto de iteraciones y el incremento o decremento de la variable es fijo, la construcción FOR-NEXT resulta más clara.
Otra cosa sería obtener, por ejemplo, la suma parcial de los primeros números naturales hasta cierto límite.
1 CLS 2 A = 1 3 B = 1 4 PRINT A, B 5 A = A + 1 6 B = B + A 7 IF B <= 100 GOTO 4 8 PRINT "FIN"
Este tipo de bucle también se puede construir con WHILE-WEND.
4 WHILE B <= 100 5 PRINT A, B 6 A = A + 1 7 B = B + A 8 WEND
El WHILE comprueba la condición al principio, mientras que el IF permite más flexibilidad. Otros dialectos de BASIC contemplan un bucle REPEAT-UNTIL que comprueba la condición al final. Esta sería una condición de terminación del bucle, contraria a la de WHILE.
Realmente, el segmento de programa equivalente a un bucle WHILE requeriría colocar un IF con la condición contraria que dirija a la línea siguiente al WEND (o END si el programa tiene que acabar) y un GOTO hacia el IF como sustituto del WEND.
4 IF B > 100 GOTO 9 5 PRINT A, B 6 A = A + 1 7 B = B + A 8 GOTO 4 9 PRINT "FIN"
Acerca de la línea 9 del programa original, "END IF" no es una sentencia válida en este BASIC. GWBASIC detecta estos errores en tiempo de ejecución, no mientras se introducen las líneas numeradas. (Continúa...) [Editado: Ramón Sola, 23/03/2018 19:36:22, Mensaje cortado]
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |
|
ID | Asunto | Fecha | Nick | |
58209 | Re: El antiguo GWBASIC (Resp: 58208) | 23/03/18 19:37 | Ramón Sola | | |
Si esta respuesta resuelve tu duda, por favor pulsa en la de este mensaje. Gracias. |