ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
º
ɻ˻ɻɻ˻ɻÉ˻ɻɻËɻɻÉ
ɻ˻ɻɻËÉ»
º
º
̼̹ººº»Ì¹Ì¹ºÊºÌ¹º ºººººº
ººÌ¹Ì¹È»ºº
º
º Ê
ÊÈȼȼÊÈÊÊÊ ÊÊÊȼÊȼ¼È¼
ȹʼÊÊȼÊȼ
º
ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹
º É˻ɻ˻»ÉË É»
É» º
º
º ºÊºººººººº ºº
¹ º
PROGRAMACION ESTRUCTURADA º
º Ê Êȼʼȼȼȼ
ȼ º
º
ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹
º
º
º
EN ESTA LECCION APRENDERAS...
º
º
º
º ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ º
º ³
³ º
º ³ þ La sintaxis de la sentencia CALL
.............. 3 ³ º
º ³ þ ¨Qu‚ son procedimientos?
...................... 5 ³ º
º ³ þ La diferencia entre subrutina
³ º
º ³ y procedimiento
...............................
6 ³ º
º ³ þ La sintaxis de la sentencia DECLARE SUB
....... 7 ³ º
º ³ þ La sintaxis de la funci¢n DECLARE SUB ........ 7
³ º
º ³ þ La importancia de los procedimientos
.......... 8 ³ º
º ³ þ ¨Qu‚ es una variable compartida?
.............. 10 ³ º
º ³ þ La sintaxis de la funci¢n DIM SHARED
.......... 12 ³ º
º ³ þ La sintaxis de la funci¢n ASC
................. 16 ³ º
º ³ þ La sintaxis de la estructura
l¢gica
³ º
º ³ IF/ELSE IF/ELSE/END
IF ........................ 20 ³ º
º ³
³ º
º ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ º
º
º
ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹
º É»Ë»Ë É»É» ɻɻ»É
º
º
º ººÌ¹º Ì º
¹ººÈ¹ º
PROGRAMACION DESCENDENTE PARTE II º
º ȹʼȼȼȼ ȼȼ Ê
º
º
ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍËÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
º É»Ë»Ë É»É» ɻɻ»É
º
º
º ººÌ¹º Ì º
¹ººÈ¹ º
PROGRAMACION DESCENDENTE PARTE II º
º ȹʼȼȼȼ ȼȼ Ê
º
º
ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÊÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
LLENANDO EL PROCEDIMIENTO SeleccionaConv
----------------------------------------
Para llenar el procedimiento...
SUB SeleccionaConv
'-----------------
PRINT "SELECCIONA CONVERSION"
END SUB
...usaremos el programa original que hicimos en
GW-Basic.
De modo que buscamos la subrutina con el mismo
nombre en dicho
programa...
190 'Selecciona conversion
200 '---------------------
210 CLS
220 PRINT
230 PRINT "CONVIERTE:"
240 PRINT
250 PRINT "
1) C a F"
260 PRINT "
2) F a C"
270 PRINT
280 INPUT "Escoge por n£mero"; T$
290 IF T$
<> "1" AND T$ <> "2" THEN GOTO 190
300 LET T = VAL(T$)
310 RETURN
Estudiando detenidamente sus sentencias, en
la misma,
decidimos quedarnos con todas las instrucciones con
excepci¢n de
la l¡nea 290 que posee el sentencia de control
GOTO. Como el
QBasic no usa n£meros de l¡nea, no podemos dejar esta
instrucci¢n
intacta.
Tenemos que cambiarla. El que sigue,
es el
procedimiento en QBasic con la mencionada instrucci¢n
adaptada a
este int‚rprete...
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB304 PROGRAMACION
DESCENDENTE PARTE II 3
³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
SUB SeleccionaConv
'-----------------
CLS
PRINT
PRINT
"CONVIERTE:"
PRINT
PRINT " 1) C a F"
PRINT " 2) F a C"
PRINT
INPUT "Escoge
por n£mero", T$
IF T$
<> "1" AND T$ <> "2" THEN CALL SeleccionaConv
'Otra vez.
LET T = VAL(T$)
END SUB
Comparemos
las dos l¡neas, para que puedas apreciar mejor el
cambio hecho...
IF T$ <>
"1" AND T$ <> "2" THEN CALL SeleccionaConv 'Otra vez.
290 IF T$ <> "1" AND
T$ <> "2" THEN GOTO 190
Observa, c¢mo la l¡nea de QBasic (la que no tiene n£mero de
l¡nea), en vez de ir de nuevo al
procedimiento usando
el
enunciado GOTO conjuntamente con un n£mero de l¡nea, como
ocurre
en la l¡nea de GW-Basic, lo hace "llamando" a esta con
su nombre.
Nota, adem s, que usamos el enunciado CALL y le a¤adimos la
frase
'Otra vez, como una l¡nea REM. Hicimos esto £ltimo para aumentar
la legibilidad de la l¡nea. Veamos como se leer¡a
la l¡nea
usando nuestro lenguaje...
IF T$
<> "1" AND T$ <> "2" THEN CALL SeleccionaConv
'Otra vez.
ÀÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÙ ÀÂÄÙ ÀÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÙ
³
³
³
ENTONCES
³
Si T$ no es
igual a 1
LLAMA al procedimineto
Y
SleccionaConv
T$ no
es igual a 2
de nuevo
La sentencia CALL es opcional,
es decir, puedes usarlo si
quieres. Lo
hemos usado aqu¡ porque mejora la legibilidad de la
l¡nea.
Su funci¢n es
transferir el control a un procedimiento
SUB. Su sintaxis
es...
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ CALL name (argumentlist) ³
ÀÄÄÅÄÄÄÄÄÅÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÙ
ÚÄÄÄÄÄÄÄÄÄÄÙ ³ ³
³
nombre de ³
transfiere
control la subrutina ÀÄ variables o constantes
a
a pasar a la subrutina
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB304 PROGRAMACION
DESCENDENTE PARTE II 4
³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
PROCEDIMIENTOS: SUBRUTINAS Y FUNCIONES
--------------------------------------
Es preciso que hagamos un par‚ntesis aqu¡, para informarte
un poco m s lo que significan las subrutinas en QBasic. En otros
int‚rpretes Basic, como Basica y
GW-Basic puedes hacer tus
programas como lo desees.
Claro que, lo recomendable es que lo
hagas de la forma en que
est escrito este programa de
temperatura hecho en GWBasic o Basica.
Como te hemos explicado antes, este es un
programa bien
ordenado, f cil de leer, cambiar y mejorar. Pero el programa
pudo haber sido escrito de la forma desordenada y dif¡cil de
leer
como lo est el siguiente programa...
ÚÄÄÄÄÄÄÄÄÄÂÄÄ> 10 REM
TEMPERATURE CONVERSION
³
³ 20
CLS
³
³ 30
INPUT "CONVERT 1) C TO F 2) F
TO C";T
³
³ ÚÄ 40 IF T=1 THEN GOTO 70 'Convert C to F.
³ ÚÄÅÄÅÄ 50 IF T=2 THEN GOTO
110 'Convert F to C.
³ ³ ÀÄÅÄ 60 GOTO 10
³ ³ À> 70 PRINT :INPUT
"ENTER C";C:PRINT
³ ³ 80 LET
F=9/5*C+32
³ ³ 90 PRINT
C;"C";"=";F;"F":PRINT
³ ÚÄÄÄÄÅÄÄÄÄÄ 100 GOTO 150
³ ³ ÀÄÄÄÄ> 110 PRINT :INPUT
"ENTER F";F
³ ³ 120
LET C=(F-32)*5/9
³ ³ 130 PRINT
³ ³ 140
PRINT F;"F";"=";C;"C":PRINT
³ ÀÄÄÄÂÄÄÄÄÄ> 150 INPUT
"ANOTHER(Y/N)";S$
ÀÄÄÄÄÄÄÅÄÄÄÄÄÄ 160 IF
S$="Y" OR S$="y" THEN GOTO 10
³ 170 IF
S$="N" OR S$="n" THEN END
ÀÄÄÄÄÄÄ 180 GOTO 150
F¡jate, que aunque es un programa corto funciona bien. Sin
embargo, al leerlo, encontrar s una gran
cantidad de saltos
(indicados por la flechas) que dificultan
su lectura.
Te
imaginas, entonces, lo dif¡cil que ser¡a
leerlo si fuera un
programa largo!
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB304 PROGRAMACION
DESCENDENTE PARTE II 5
³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
De ah¡, lo importante que es dividir los
programas en
peque¤os miniprogramas o subrutinas para que lleven
a cabo una
TAREA espec¡fica.
Y en ese modo de PROCEDER, es
que se
fundamenta el QBasic...
¨QUE SON PROCEDIMIENTOS?
------------------------
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ EL
QBASIC ³
³ DIVIDE UN PROGRAMA COMPLEJO ³
³
EN PEQUE¥AS TAREAS ³
³ LLAMADAS
PROCEDIMIENTOS. ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Aprendiste en lecciones anteriores, que el programa primero
queda definido en una RUTINA PRINCIPAL que llama (call) a
otras
subrutinas enterrando en ellas los detalles del
mismo. Pues en
QBasic, a cada una de estas tareas espec¡ficas o algoritmos
(¨los
recuerdas?) se les llama PROCEDIMIENTOS. Un procedimiento es un
m‚todo de poner en ejecuci¢n una orden o una tarea
ordenadamente.
As¡ que...
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³
El PROCEDIMIENTO EN QBasic ³
³ ES EL METODO POR
MEDIO DEL CUAL ³
³ UN CONJUNTO DE
INSTRUCIONES SE EJECUTAN ³
³ UNA DETRAS
DE LA OTRA ³
³
PARA QUE LA COMPUTADORA ³
³ LLEVE A CABO UNA TAREA
ESPECIFICA ³
³
CON LA CONDICION ³
³ DE QUE ESTE
DEBIDAMENTE DEFINIDO ³
³ ANTES
DE EJECUTARSE ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
A estos PROCEDIMIENTOS, el QBasic le asigna un nombre. De
modo que, con s¢lo llamarlo (call) por su nombre,
ejecutamos las
instrucciones que tiene en su interior.
Como puedes deducir de su definici¢n, un procedimiento puede
ser una SUBRUTINA o una FUNCION
(subrutina ya previamente
definada o definida por el programador). Para que una subrutina
sea un procedimiento tiene
que estar definida antes de
ejecutarse.
La funci¢n es de por s¡ un procedimiento
porque
siempre se define antes de llevarse a cabo.
De modo que...
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB304 PROGRAMACION
DESCENDENTE PARTE II 6
³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
DIFERENCIA ENTRE SUBRUTINA Y PROCEDIMIENTO
------------------------------------------
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ UN
PROCEDIMIENTO ³
³ NO ES EQUIVALENTE
A UNA SUBRUTINA ³
³ COMO LA
CONOCEMOS ³
³ EN LOS DEMAS INTERPRETES DE BASIC ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Los PROCEDIMIENTOS son
subrutinas previamente definidas
que no usan para nada la sentencia RETURN.
As¡ que, es preciso que diferenciemos un PROCEDIMIENTO
de
una SUBRUTINA CONVENCIONAL (la de GW-Basic y
Basica). Aunque
ambas estructuras comparten la
caracter¡stica de ejecutarse
cu ntas veces sean llamadas...
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ LAS
SUBRUTINAS CONVENCIONALES, ³
³
EN QBASIC,
³
³ SOLO FUNCIONAN
DENTRO DE UN PROCEDIMIENTO, ³
³
Y NO FUERA DE EL.
³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Establecida la diferencia, desde
ahora en adelante,
llamaremos a las subrutinas convencionales (las
que usan las
sentencias GOSUB y RETURN) subrutinas; y a
las subrutinas del
Qbasic, procedimientos SUB o meramente
procedimientos. De esta
manera, evitaremos confundir unas con los otros.
Como las subrutinas en QBasic, son procedimentos, tienen que
definirse antes de usarse. Por eso es que cuando creaste los
procedimientos....
SeleccionaConv
HazConv
PideOtraConv
TerminaPrg
...viste c¢mo estos se
defin¡an y se colocaban
autom ticamente al principio del programa siempre
que guardabas
(save) el mismo. Observa abajo, c¢mo es que estos
quedan
definidos...
DECLARE SUB SeleccionaConv ()
DECLARE SUB HazConv ()
DECLARE SUB PideOtraConv ()
DECLARE SUB TerminaPrg ()
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB304 PROGRAMACION
DESCENDENTE PARTE II 7
³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
...con la sentencia DECLARE SUB (declara subrutina) seguido
del nombre que los designa. Observa tambi‚n,
el par de
par‚ntesis despu‚s del nombre. Es aqu¡ donde se colocaran los
par metros o valores que habr de usar el
procedimiento en sus
instrucciones, para poder llevar a
cabo la tarea espec¡fica
encomendada. La
sintaxis completa es...
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ DECLARE SUB name (parameter list) ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÙ
ÚÄÄÄÄÄÄÄÄÙ una o m s variables
nombre
a ser utilizadas por
del procedimiento el procedimiento en
sus instrucciones
Si el procedimiento a declararse fuera una
funci¢n su
sintaxis ser¡a:
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ DECLARE FUNCTION
name (parameter list) ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÙ
ÚÄÄÄÄÄÄÄÄÙ
una o m s variables
nombre a ser
utilizadas por
de la funci¢n la funci¢n en sus
instrucciones
M s adelante, cuando hablemos de las funciones abundaremos
m s sobre ellas.
Por el momento, conf¢rmate con la sintaxis dada.
Puedes llamar a los procedimientos con s¢lo
escribir su
nombre, como puedes ver en estos ejemplos...
IF T$ <> "1" AND T$ <> "2" THEN
SeleccionaConv
REM
Conversi¢n de temperaturas
REM --------------------------
CLS
SeleccionaConv
HazConv
PideOtraConv
TerminaPrg
END
...o puedes llamarlos tambi‚n usando CALL, as¡...
IF T$ <> "1" AND T$ <> "2" THEN CALL
SeleccionaConv
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB304 PROGRAMACION
DESCENDENTE PARTE II 8
³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
REM Conversi¢n de temperaturas
REM --------------------------
CLS
CALL SeleccionaConv
CALL HazConv
CALL PideOtraConv
CALL TerminaPrg
END
Es sumamente importante que te fijes, que lo que
estamos
actualmente haciendo, al convertir el programa
de temperatura
escrito originalmente en GWBasic a QBasic, es llevando a
cabo la
transici¢n de BASIC a QBasic. Pero no es solamente eso, lo que
estamos haciendo es movi‚ndonos a
UNA MANERA DE PROGRAMAR
SUMAMENTE AVANZADA Y QUE PUEDE APLICARSE A OTROS
LENGUAJES DE
PROGRAMACION.
LA IMPORTANCIA DE LOS PROCEDIMIENTOS
------------------------------------
A medida que avancemos en el estudio del QBasic veremos cu n
poderosos resultan ser los procedimientos. El procedimiento como
m‚todo para simplificar la programaci¢n, no solamente en
Basic,
sino tambi‚n en otros lenguajes, ofrece
estas tres ventajas
principales:
Primero, es un peque¤o programa dentro de
un programa
principal que lleva a cabo una tarea espec¡fica
que se puede
manejar separadamente.
Tiene una sola entrada y una sola salida.
Nos permite concentrarnos en esa tarea en
particular, en vez de
considerar todos los problemas que nos trae el programa
completo.
Segundo, simplifica la lectura de todo el programa haciendo
que este sea modular.
Leamos una vez m s la rutina principal del
programa de temperatura...
REM Conversi¢n de temperaturas
REM
--------------------------
CLS
SeleccionaConv
HazConv
PideOtraConv
TerminaPrg
END
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB304 PROGRAMACION
DESCENDENTE PARTE II 9
³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Observa, c¢mo el nombre de cada procedimiento nos
da un
bosquejo o resumen de lo que se supone haga el programa.
Nota,
tambi‚n, c¢mo la rutina principal, esconde los detalles del
mismo
en los procedimientos.
Si quieres saber m s sobre el programa,
pues v‚ al procedimiento correspondiente.
Tercero, con el procedimiento se
evita repetir una
instrucci¢n igual o varias instrucciones iguales.
Volviendo al procedimiento...
SUB SeleccionaConv
'-----------------
CLS
PRINT
PRINT
"CONVIERTE:"
PRINT
PRINT " 1) C a F"
PRINT " 2) F a C"
PRINT
INPUT "Escoge
por n£mero", T$
IF T$
<> "1" AND T$ <> "2" THEN CALL SeleccionaConv
'Otra vez.
LET T = VAL(T$)
END SUB
...la l¡nea...
IF T$ <>
"1" AND T$ <> "2" THEN CALL SeleccionaConv 'Otra vez.
...tiene el prop¢sito de evitar que el programa se interrumpa
de s£bito si se digitara otros n£meros o caracteres que no
sean
el 1 ¢ el 2.
De ser as¡, la instrucci¢n l¢gica de
control
IF/AND/THEN, llamar¡a de nuevo al procedimiento
SeleccionaConv
para que se digite un nuevo n£mero.
Observa que utilizamos la variable alfanum‚rica T$
para
almacenar la selecci¢n hecha. Pudimos haber usado una variable
num‚rica para este prop¢sito. Si hubi‚semos hecho esto £ltimo, y
si hubi‚semos digitado, digamos una letra en vez de un n£mero,
el
programa se hubiese detenido con el mensaje...
Redo from start
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB304 PROGRAMACION
DESCENDENTE PARTE II 10 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Aunque el mensaje se interrumpe por un momento para
luego
empezar con el mensaje INPUT Escoge por n£mero, lo cierto
es que
el programa se interrumpe.
Para evitar esto, usamos una variable
alfanum‚rica (T$) en vez de una num‚rica (T). Como la variable
alfa T$, acepta tanto letras como n£meros, al digitar una letra,
en lugar de un n£mero, la
misma es aceptada evitando la
interrupci¢n del programa, y por lo tanto,
el despliegue en
pantalla del aviso de error que mencionamos.
Ahora bien, si utilizamos T$, esto no quiere
decir que
hallamos resuelto de una vez y por todas
el problema de la
interrupci¢n moment nea del
programa.
Todav¡a queda otra
oportunidad de que el programa se interrumpa, y
esta es, que
digitemos un n£mero diferente de 1 y 2. Para evitar esto, es que
usamos el enunciado l¢gico estructural
IF/AND/THEN. En
‚l,
instruimos a la computadora que vuelva a ejecutar la subrutina
si
el n£mero digitado no es ni el 1 ni el 2.
Una vez resuelto el problema de la no deseada interrupci¢n
momentanea del programa, nos queda algo m s
por hacer, y es
convertir el valor alfa de la variable T$ a un valor
num‚rico,
que es lo que queremos. Por esa raz¢n, es que convertimos el
valor alfa de la variable alfanum‚rica a un valor n£merico con
la
funci¢n VAL en la
l¡nea...
LET T = VAL(T$)
¨QUE ES UNA VARIABLE COMPARTIDA?
--------------------------------
...que luego almacenamos en la variable num‚rica T.
Ahora
ocurre algo interesante con el uso de las variables
en QBasic.
Esta variable num‚rica T
va ser usada en un pr¢ximo
procedimiento, llamado HazConv. O sea, que dicho
valor no
solamente lo vamos a usar en este procedimiento solamente
(valor
local), sino en otro.
Pues...
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ CUANDO
USAMOS EL VALOR ³
³ DE UNA VARIABLE
NUMERICA O ALFANUMERICA ³
³
EN VARIAS PROCEDIMIENTOS ³
³
DECIMOS QUE ES UNA ³
³
VARIABLE COMPARTIDA ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB304 PROGRAMACION
DESCENDENTE PARTE II 11 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Lo mismo ocurre con la variable alfa T$,
pero con la
diferencia de que aunque la misma
s¢lo va a usarse en el
procedimiento donde aparece, si la opci¢n seleccionada
no es el
n£mero 1 o el 2, el procedimiento vuelve a repetirse. En este
caso, tambi‚n la variable va ser compartida por el
procedimiento
mismo.
Ahora bien, no basta con saber que una variable va a usarse
en varios procedimientos de un programa, o en
el procedimiento
mismo, hay que se¤al rselo al int‚rprete QBasic, para que ‚ste
lo
use adecuadamente.
En nuestro ejemplo, le hicimos saber al
QBasic que las variables T$ y T la vamos a compartir con otros
procedimentos (aunque sea en el procedimiento mismo)
de esta
forma...
DECLARE SUB SeleccionaConv ()
DECLARE SUB HazConv ()
DECLARE SUB PideOtraConv ()
DECLARE SUB TerminaPrg ()
'
'Variables compartidas:
DIM SHARED T
DIM SHARED T$
'
REM Conversi¢n de temperaturas
REM --------------------------
CLS
SeleccionaConv
HazConv
PideOtraConv
TerminaPrg
END
...escribiendo...
'Variables compartidas:
DIM SHARED T
DIM SHARED T$
...antes de la RUTINA PRINCIPAL. Observa que el t¡tulo
'Variables compartidas:, nos
dice que inmediatamente se
mencionaran las variables a ser
compartidas entre todos los
procedimientos SUB o FUNCTION en el programa.
La sintaxis m s
simple es...
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB304 PROGRAMACION
DESCENDENTE PARTE II 12 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ DIM SHARED variable ³
ÀÄÄÅÄÄÄÄÅÄÄÄÄÄÄÄÅÄÄÄÄÄÙ
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³ ÀÄ el nombre de la
DIMensiona o
declara ³ variable
num‚rica
la
variable
COMPARTIDA
o alfanum‚rica
³
Especifica
que la variable va a ser compartida con los
los procedimientos SUB o FUNCTION
Esta sintaxis es simple. Hay otras
versiones m s
elaboradas. Por el momento conf¢rmate con esta. A medida que nos
adentremos m s en nuestro curso, te daremos las otras versiones.
Ahora que hemos llenado el procedimiento SeleccionaConv, el
programa todo, aparecer¡a como sigue....
DECLARE SUB SeleccionaConv ()
DECLARE SUB HazConv ()
DECLARE SUB PideOtraConv ()
DECLARE SUB TerminaPrg ()
'
'Variables compartidas:
DIM SHARED T
DIM SHARED T$
'
REM Conversi¢n de temperaturas
REM --------------------------
CLS
SeleccionaConv
HazConv
PideOtraConv
TerminaPrg
END
SUB SeleccionaConv
'-----------------
CLS
PRINT
PRINT
"CONVIERTE:"
PRINT
PRINT " 1) C a F"
PRINT " 2) F a C"
PRINT
INPUT "Escoge
por n£mero", T$
IF T$
<> "1" AND T$ <> "2" THEN CALL SeleccionaConv
'Otra vez.
LET T = VAL(T$)
END SUB
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB304 PROGRAMACION
DESCENDENTE PARTE II 13 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
SUB HazConv
'----------
PRINT "HAZ LA COVERSION"
END SUB
SUB PideOtraConv
'---------------
PRINT "PIDE CONVERSION"
END SUB
SUB TerminaPrg
'-------------
PRINT "TERMINA PROGRAMA"
END SUB
Lo que nos resta es ejecutar el programa con F5 (run) para
asegurarnos que funciona bien. Si lo ejecutas,
ver s lo
siguiente...
CONVIERTE:
1) C a F
2) F a C
Escoge por n£mero 1
HAZ LA CONVERSION
PIDE CONVERSION
TERMINA CONVERSION
...si el despliegue en pantalla es como el indicado arriba,
entonces, la subrutina SeleccionaConv que acabaste de llenar
est
funcionando bien.
Esto significa que est s preparado para llenar
la pr¢xima subrutina....
LLENANDO EL PROCEDIMIENTO HazConv
---------------------------------
SUB HazConv
'----------
PRINT "HAZ LA COVERSION"
END SUB
Como estamos llenando los procedimientos del programa
de
QBasic usando el programa en GW-Basic, buscamos la subrutina...
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB304 PROGRAMACION
DESCENDENTE PARTE II 14 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
330 'Haz la conversi¢n
340 '-----------------
350 IF T = 1 THEN
360
'Convierte C a F:
370 CLS
380 PRINT
390 INPUT "ENTRA C"; C$
400 IF ASC(C$) < 48 OR
ASC(C$) > 57 THEN GOTO 330
410 LET C = VAL(C$)
420 PRINT
430 LET F = 9 / 5 * C + 32
440 PRINT C; "C";
"="; F; "F"
450 PRINT
460 END IF
470 IF T = 2 THEN
480
'Convierte F a C:
490 CLS
500 PRINT
510 INPUT "ENTRA F"; F$
520 IF ASC(F$) < 48 OR
ASC(F$) > 57 THEN GOTO 330
530 LET F = VAL(F$)
540 PRINT
550 LET C = (F - 32) * 5 / 9
560 PRINT F; "F";
"="; C; "C"
570 PRINT
580 END IF
590 RETURN
...en dicho programa.
Despu‚s de leer detenidamente la
misma, deducimos que las £nicas l¡neas
que ameritan sufrir
cambios son...
400 IF ASC(C$) < 48 OR
ASC(C$) > 57 THEN GOTO 330
520 IF ASC(F$) < 48 OR
ASC(F$) > 57 THEN GOTO 330
590 RETURN
En la l¡nea 400 tenemos que cambiar...
THEN GOTO 330 por THEN CALL HazConv 'Otra vez.
...y en la l¡nea 520 tenemos que cambiar...
THEN GOTO 330 por THEN
CALL HazConv 'Otra vez.
La l¡nea 590, no la necesitar s, as¡ que ign¢rala.
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB304 PROGRAMACION
DESCENDENTE PARTE II 15 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Pues bien, una vez que localizas las l¡neas que
ameritan
cambio, vas a llenar el procedimiento HazConv en el
programa de
temperatura de QBasic.
Procede de la misma forma que lo hiciste
al llenar el procedimeinto SeleccionaConv. Despu‚s que hayas
llenado el mismo, este deber aparecer as¡...
SUB HazConv
'----------
IF T = 1 THEN
'Convierte C
a F:
CLS
PRINT
INPUT
"ENTRA C"; C$
IF ASC(C$) < 48 OR ASC(C$) > 57 THEN CALL HazConv 'Otra vez.
LET C
= VAL(C$)
PRINT
LET F
= 9 / 5 * C + 32
PRINT
C; "C"; "="; F; "F"
PRINT
END IF
IF T = 2 THEN
'Convierte F
a C:
CLS
PRINT
INPUT
"ENTRA F"; F$
IF ASC(F$) < 48 OR ASC(F$) > 57 THEN CALL HazConv 'Otra vez.
LET F
= VAL(F$)
PRINT
LET C =
(F - 32) * 5 / 9
PRINT
F; "F"; "="; C; "C"
PRINT
END IF
END SUB
Observa, que se est n utilizando dos
nuevas variables
alfanum‚ricas llamadas C$ y F$ para almacenar
temporeramente los
valores cent¡grados o fahrenheit respectivamente. Si los
valores
son aceptados, se pasar n luego a las variable
num‚ricas C ¢ F,
seg£n sea el caso.
Ahora bien, las variables alfas C$ y F$ no solamente se usan
para almacenar los valores
temporeros arriba mencionados.
Tambi‚n se est n utilizando para probar si los
mismos son los
correctos.
De ah¡ que aparezcan tambi‚n en las
estructuras
l¢gicas de control IF/OR/THEN.
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB304 PROGRAMACION
DESCENDENTE PARTE II 16 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
En otras palabras, tambi‚n se usar n como base para llamar a
al mismo procedimeinto, en caso de que los valores almacenados
en
ellas no sean los verdaderos. Por consiguiente,
debemos
considerarlas tambi‚n como variables
compartidas aunque sean
compartidas por los mismos procedimientos. De modo que, debemos
indicarle esto al int‚rprete de QBasic as¡:
DECLARE SUB SeleccionaConv ()
DECLARE SUB HazConv ()
DECLARE SUB PideOtraConv ()
DECLARE SUB TerminaPrg ()
'
'Variables compartidas:
DIM SHARED T
DIM SHARED T$
DIM SHARED C$
DIM SHARED F$
'
REM Conversi¢n de temperaturas
REM --------------------------
CLS
SeleccionaConv
HazConv
PideOtraConv
TerminaPrg
END
Como los valores de las variables num‚ricas C y F se van a
usar s¢lo en este procedimiento
(valores locales), no es
necesario que los consideremos como variables compartidas,
de
modo que no se a¤aden bajo el t¡tulo de 'Variables
compartidas,
en la RUTINA PRINCIPAL.
Consideremos ahora las l¡neas...
IF ASC(C$) < 48 OR ASC(C$) > 57 THEN CALL HazConv 'Otra vez.
IF ASC(F$) < 48 OR ASC(F$) > 57 THEN CALL HazConv 'Otra vez.
En ambas l¡neas, la funci¢n ACS significa...
funci¢n ASC extrae
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ cualquier
c¢digo
ASCII ÄÄÄÄÅ
ASC(stringexpression$) ÅÄ expresi¢n
del 1er
caracter ÀÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÙ de cadena
de una
cadena
ASC ("a12")
ÀÄÄÄÄÂÄÄÄÄÙ
9 7
a c¢digo 97
ÀÄ c¢digo del primer caracter
en "a12"
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB304 PROGRAMACION
DESCENDENTE PARTE II 17 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
EL c¢digo ASCII (American Standard Code for
Information
Interchange) contiene el n£mero de c¢digo para cualquier
s¡mbolo
que usamos.
Estos van del n£mero 000 al n£mero 127 para
el
c¢digo regular, y del 128 hasta el 255 para el c¢digo
extendido.
El QBasic, en su secci¢n Help tiene todos los
c¢digos. Para
obtenerlos, presiona ALT, luego H, selecciona Contents y
bajo la
secci¢n Quick References, selecciona ASCII Character Codes.
Algunos
ejemplos son:
032 sp 048 0 064 @
080 P 096 ` 112 p
033 ! 049 1 065 A 081 Q
097 a 113 q
034
" 050 2 066 B 082 R
098 b 114 r
035 # 051 3 067 C 083 S
099 c 115 s
036 $ 052 4 068 D 084 T
100 d 116 t
037 % 053 5 069 E 085 U
101 e 117 u
038
& 054 6 070 F 086 V
102 f 118 v
039 ' 055 7 071 G 087 W
103 g 119 w
040 ( 056 8 072 H 088 X
104 h 120 x
041 ) 057 9 073 I 089 Y
105 i 121 y
042 * 058 : 074 J 090 Z
106 j 122 z
043 + 059 ; 075 K 091 [
107 k 123 {
044 , 060 < 076 L 092 \
108 l 124 |
045 - 061 = 077 M 093 ]
109 m 125 }
046 . 062 > 078 N 094 ^
110 n 126 ~
047 / 063 ? 079 O 095 _
111 o 127
Observa que los c¢digos ASCII(aski) del 0 al 9 son:
048 0 053 5
049 1 054 6
050 2 055 7
051 3 056 8
052 4 057 9
Nota que cualquier caracter cuyo c¢digo sea...
menor que 48 o mayor que 57
< 48 > 57
...no es un n£mero.
Con esto en mente, y si suponemos que C$="a12",
veamos que
significa la siguiente l¡nea l¢gica...
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB304 PROGRAMACION
DESCENDENTE PARTE II 18 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
IF ASC(C$) < 48
OR ASC(C$) > 57 THEN CALL HazConv 'Otra vez.
ÀÄ¿
ÀÄÄ¿
³
³
IF
ASC("a12")<48 OR ASC("a12")>57 THEN CALL HazConv
'Otra vez.
ÀÄÄÄÄÄÄÂÄÄÄÄÄÄÄÙ ÀÄÄÄÄÄÄÂÄÄÄÄÄÄÄÙ ³ ÀÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÙ
Si el c¢digo
ASCII ³ ENTONCES LLAMA el procedimiento
del primer
caracter ³
HazConv otra vez.
de "a12"
es menor
³
que 48
³
O el c¢digo ASCII
del primer caracter
de "a12" es mayor
que 57
Como en "a12" el primer caracter es a
y su c¢digo es 97
(mayor que 57), no pasa la prueba, y por lo tanto, el valor de
C$
es rechazado y el procedimiento HazConv es vuelto
a llamar para
entrar un nuevo valor.
Como puedes apreciar, esta estructura l¢gica
IF/OR/THEN,
prueba los valores almacenados en C$. Si el primer caracter de
dicho valor no es un n£mero, el mismo es rechazado y se volver
a
llamar el procedimiento HazConv para pedir un nuevo valor. Con
esto, tambi‚n se evita,
que el programa se interrumpa
s£bitamente.
La l¡nea...
IF ASC(F$) < 48 OR ASC(F$) > 57 THEN CALL HazConv 'Otra vez.
...cumple la misma funci¢n que la anterior pero usando
la
variable F$.
LLENANDO EL PROCEDIMIENTO PideOtraConv
--------------------------------------
Continuando con el llenado de las subrutinas en el programa
de temperatura QBasic a partir del
programa de temperatura
GWBasic, consideremos ahora la subrutina...
610 'Pide otra conversi¢n
620 '--------------------
630 INPUT "OTRA CONVERSION (S/N)"; S$
640 IF S$ =
"S" OR S$ = "s" THEN GOTO 100 'Run program.
650 IF S$ =
"N" OR S$ = "n" THEN GOTO 670
660 GOTO 610
670 RETURN
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB304 PROGRAMACION
DESCENDENTE PARTE II 19 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Esta es la forma en que la traducimos en QBasic:
SUB PideOtraConv
'---------------
LOCATE 12, 1: PRINT
"
"
LOCATE 12, 1: PRINT
"Otra conversi¢n (S/N)";
INPUT S$
IF S$ =
"S" OR S$ = "s" THEN
RUN 'programa otra vez.
END IF
IF S$
<> "S" AND S$ <> "s" AND S$ <>
"N" AND S$ <> "n" THEN
CALL PideOtraConv
END IF
END SUB
Como puedes ver, ha habido cambios "pro forma", cambios
de
forma pero no substanciales. Puedes traducir la subrutina como
tu quieras.
Lo importante es, que el procedimiento resultante,
tenga una sola entrada y una sola salida.
Nota, c¢mo en la segunda estructura IF/THEN se prueba el
valor de S$ para ver si sus valores son S y s o N y
n. Si los
valores no son estos, se repite el procedimiento
PideOtraConv.
Recuerda que CALL es opcional. Lo usamos aqu¡ porque quisimos.
Otra manera de hacer esta prueba es la siguiente versi¢n del
mismo procedimiento:
SUB PideOtraConv
'---------------
LOCATE 12, 1: PRINT
"
"
LOCATE 12, 1: PRINT
"Otra conversi¢n (S/N)";
INPUT S$
IF S$ =
"S" OR S$ = "s" THEN
RUN 'programa otra vez.
ELSEIF S$
<> "S" AND S$ <> "s" AND S$ <>
"N" AND S$ <> "n" THEN
CALL PideOtraConv
ELSE
END IF
END SUB
Nota, c¢mo en una sola estructura l¢gica
IF/THEN hemos
incluido todas las instrucciones que en la versi¢n
anterior nos
tom¢ dos estructuras l¢gicas IF/THEN. A pesar de eso, creemos
que la primera versi¢n, la de las dos estructuras IF/THEN
es m s
f cil de entender. La sintaxis para esta £ltima estructura
es...
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB304 PROGRAMACION
DESCENDENTE PARTE II 20 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ IF condition1 THEN ³
³
[statementblock-1] ³
³ [ELSEIF condition2 THEN ³
³ [statementblock-2]]...
³
³ [ELSE
³
³
[statementblock-n]]
³
³ END IF
³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
Antes de comenzar a llenar el £ltimo procedimeiento de este
programa, recuerda que tienes que DECLARAR LA VARIABLE S$
COMO
VARIABLE COMPARTIDA (SHARED) en la RUTINA PRINCIPAL en la
secci¢n
de 'Variables compartidas:, as¡:
DECLARE SUB SeleccionaConv ()
DECLARE SUB HazConv ()
DECLARE SUB PideOtraConv ()
DECLARE SUB TerminaPrg ()
'
'Variables compartidas:
DIM SHARED T
DIM SHARED T$
DIM SHARED C$
DIM SHARED F$
DIM SHARED S$
'
REM Conversi¢n de temperaturas
REM --------------------------
CLS
SeleccionaConv
HazConv
PideOtraConv
TerminaPrg
END
LLENANDO EL PROCEDIMIENTO TerminaPrg
------------------------------------
He aqu¡ como traducimos la subrutina TerminaPrg del programa
GWBasic al procedimiento con el mismo nombre
en el programa
esquel‚tico en
QBasic...
690 'Termina programa
700 '----------------
710 CLS
720 PRINT "EL PROGRAMA SE ACABO"
730 PRINT
740 RETURN
ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
³ QB304 PROGRAMACION
DESCENDENTE PARTE II 21 ³
ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
SUB TerminaPrg
'-------------
CLS
PRINT : PRINT :
PRINT
PRINT
PRINT "
EL PROGRAMA HA TERMINADO"
PRINT
PRINT "
SI DESEAS EJECUTARLO OTRA VEZ"
PRINT
PRINT "
PRESIONA F5"
END SUB
F¡jate, que el procedimiento, lo hemos
elaborado m s.
Puedes hacerlo como te plazca, siempre y
cuando cumpla con su
cometido que es el desplegar
un mensaje que indique la
terminaci¢n del programa.
Has aprendido en esta lecci¢n c¢mo traducimos un programa de
GWBasic a QBasic. Naturalmente, que como el
programa de
temperatura en GWBasic estaba
hecho bien estructuralmente
hablando, la traducci¢n a QBasic se nos hizo sumamente sencilla.
En
la pr¢xima lecci¢n escribiremos otro programa en QBasic,
y lo haremos a partir de cero, esto es,
desde que se crea el
mismo hasta que se termina.
Pero antes de despedirnos, te daremos a continuaci¢n varias
versiones del mismo programa de
temperatura. El
programa
original escrito en GWBasic, y dos versiones en
QBasic: la que
hiciste en esta lecci¢n y otra versi¢n
del mismo programa.
Estudia todas las versiones cuidadosamente. Si puedes hacer una
propia, magn¡fico!
PROGRAMA DE TEMPERATURA
VERSION ORIGINAL EN GWBASIC
100 'Conversi¢n de temperaturas
110 '--------------------------
120 CLS
130 GOSUB
190 'Selecciona conversi¢n.
140 GOSUB
330 'Haz la conversi¢n.
150 GOSUB
610 'Pide otra conversi¢n.
160 GOSUB
690 'Termina programa.
170 END
180 '
190 'Selecciona conversion
200 '---------------------
210 CLS
220 PRINT
230 PRINT "CONVIERTE:"
240 PRINT
250 PRINT " 1)
C a F"
260 PRINT "
2) F a C"
270 PRINT
280 INPUT "Escoge por n£mero"; T$
290 IF T$
<> "1" AND T$ <> "2" THEN GOTO 190
300 LET T = VAL(T$)
310 RETURN
320 '
330 'Haz la conversi¢n
340 '-----------------
350 IF T = 1 THEN
360
'Convierte C a F:
370 CLS
380 PRINT
390 INPUT "ENTRA C"; C$
400 IF ASC(C$) < 48 OR ASC(C$)
> 57 THEN GOTO 330
410 LET C = VAL(C$)
420 PRINT
430 LET F = 9 / 5 * C + 32
440 PRINT C; "C";
"="; F; "F"
450 PRINT
460 END IF
470 IF T = 2 THEN
480
'Convierte F a C:
490 CLS
500 PRINT
510 INPUT "ENTRA F"; F$
520 IF ASC(F$) < 48 OR
ASC(F$) > 57 THEN GOTO 330
530 LET F = VAL(F$)
540 PRINT
550 LET C = (F - 32) * 5 / 9
560 PRINT F; "F";
"="; C; "C"
570 PRINT
580 END IF
590 RETURN
600 '
610 'Pide otra conversi¢n
620 '--------------------
630 INPUT "OTRA CONVERSION (S/N)"; S$
640 IF S$ =
"S" OR S$ = "s" THEN GOTO 100
650 IF S$ =
"N" OR S$ = "n" THEN GOTO 670
660 GOTO 610
670 RETURN
680 '
690 'Termina programa
700 '----------------
710 CLS
720 PRINT "EL PROGRAMA SE ACABO"
730 PRINT
740 RETURN
PROGRAMA DE TEMPERATURA ESQUEMATICO
EN QBASIC
DECLARE SUB SeleccionaConv ()
DECLARE SUB HazConv ()
DECLARE SUB PideOtraConv ()
DECLARE SUB TerminaPrg ()
'
REM Conversi¢n de temperaturas
EM --------------------------
CLS
SeleccionaConv
HazConv
PideOtraConv
TerminaPrg
END
SUB SeleccionaConv
'-----------------
PRINT "SELECCIONA CONVERSION"
END SUB
SUB HazConv
'----------
PRINT "HAZ LA COVERSION"
END SUB
SUB PideOtraConv
'---------------
PRINT "PIDE CONVERSION"
END SUB
SUB TerminaPrg
'-------------
PRINT "TERMINA PROGRAMA"
END SUB
VERSION 1 DEL PROGRAMA DE TEMPERATURA
EN QBASIC
DECLARE SUB SeleccionaConv ()
DECLARE SUB HazConv ()
DECLARE SUB PideOtraConv ()
DECLARE SUB TerminaPrg ()
'
'Variables compartidas:
DIM SHARED T
DIM SHARED T$
DIM SHARED C$
DIM SHARED F$
DIM SHARED S$
'
REM Conversi¢n de temperaturas
REM --------------------------
CLS
SeleccionaConv
HazConv
PideOtraConv
TerminaPrg
END
SUB HazConv
'----------
IF T = 1 THEN
'Convierte C
a F:
CLS
PRINT
INPUT
"ENTRA C"; C$
IF ASC(C$) < 48 OR ASC(C$) > 57 THEN CALL HazConv 'Otra vez.
LET C
= VAL(C$)
PRINT
LET F
= 9 / 5 * C + 32
PRINT
C; "C"; "="; F; "F"
PRINT
END IF
IF T = 2 THEN
'Convierte F
a C:
CLS
PRINT
INPUT
"ENTRA F"; F$
IF ASC(F$) < 48 OR ASC(F$) > 57 THEN CALL HazConv 'Otra vez.
LET F
= VAL(F$)
PRINT
LET C
= (F - 32) * 5 / 9
PRINT
F; "F"; "="; C; "C"
PRINT
END IF
END SUB
SUB PideOtraConv
'---------------
LOCATE 12, 1: PRINT
"
"
LOCATE 12, 1: PRINT
"Otra conversi¢n (S/N)";
INPUT S$
IF S$ =
"S" OR S$ = "s" THEN
RUN 'programa otra vez.
END IF
IF S$
<> "S" AND S$ <> "s" AND S$ <>
"N" AND S$ <> "n" THEN
CALL PideOtraConv
END IF
END SUB
SUB SeleccionaConv
'-----------------
CLS
PRINT
PRINT
"CONVIERTE:"
PRINT
PRINT " 1) C a F"
PRINT " 2) F a C"
PRINT
INPUT "Escoge
por n£mero"; T$
IF T$
<> "1" AND T$ <> "2" THEN CALL SeleccionaConv
'Otra vwz.
LET T = VAL(T$)
END SUB
SUB TerminaPrg
'-------------
CLS
PRINT : PRINT :
PRINT
PRINT
PRINT "
EL PROGRAMA HA TERMINADO"
PRINT
PRINT "
SI DESEAS EJECUTARLO OTRA VEZ"
PRINT
PRINT "
PRESIONA F5"
END SUB
VERSION 2 DEL PROGRAMA DE TEMPERATURA
EN QBASIC
DECLARE SUB SeleccionaConv ()
DECLARE SUB HazConv ()
DECLARE SUB PideOtraConv ()
DECLARE SUB TerminaPrg ()
'
'Variables compartidas:
DIM SHARED T, T$,
C$, F$, S$
'
REM Conversi¢n de temperaturas
REM --------------------------
CLS
SeleccionaConv
HazConv
PideOtraConv
TerminaPrg
END
SUB HazConv
'----------
IF T = 1 THEN
'Convierte C
a F:
CLS
PRINT
INPUT
"ENTRA C"; C$
IF ASC(C$) < 48 OR ASC(C$) > 57 THEN
CALL HazConv 'Otra vez.
END IF
LET C
= VAL(C$)
PRINT
LET F
= 9 / 5 * C + 32
PRINT
C; "C"; "="; F; "F"
PRINT
END IF
IF T = 2 THEN
'Convierte F
a C:
CLS
PRINT
INPUT
"ENTRA F"; F$
IF ASC(F$) < 48 OR ASC(F$) > 57 THEN
CALL HazConv 'Otra vez.
END IF
LET F
= VAL(F$)
PRINT
LET C
= (F - 32) * 5 / 9
PRINT
F; "F"; "="; C; "C"
PRINT
END IF
END SUB
SUB PideOtraConv
'---------------
LOCATE 12, 1: PRINT
"
"
LOCATE 12, 1: PRINT
"Otra conversi¢n (S/N)";
INPUT S$
IF S$ =
"S" OR S$ = "s" THEN
RUN 'programa otra vez.
END IF
IF S$
<> "S" AND S$ <> "s" AND S$ <>
"N" AND S$ <> "n" THEN
CALL PideOtraConv
END IF
END SUB
SUB SeleccionaConv
'-----------------
CLS
PRINT
PRINT
"CONVIERTE:"
PRINT
PRINT " 1) C a F"
PRINT " 2) F a C"
PRINT
INPUT "Escoge
por n£mero"; T$
IF T$
<> "1" AND T$ <> "2" THEN
CALL SeleccionaConv 'Otra vez.
END IF
LET T = VAL(T$)
END SUB
SUB TerminaPrg
'-------------
CLS
PRINT : PRINT :
PRINT
PRINT
PRINT "
EL PROGRAMA HA TERMINADO"
PRINT
PRINT "
SI DESEAS EJECUTARLO OTRA VEZ"
PRINT
PRINT "
PRESIONA F5"
END SUB