el lenguaje basic introducción

43
El lenguaje BASIC. Introducción BASIC es un lenguaje de programación de propósito general que ofrece economía sintáctica, control de flujo, estructuras sencillas y un buen conjunto de operadores. Es un lenguaje que no está especializado en ningún tipo de aplicación. Esto lo hace un lenguaje versátil y potente, con un campo de aplicación ilimitado y, sobre todo, se puede aprender rápidamente. En poco tiempo, un programador puede utilizar la totalidad del lenguaje. La palabra BASIC proviene de la expresión inglesa Beginner's All-purpose Symbolic Instruction Code: código de instrucciones simbólicas de propósito general para principiantes. El BASIC fue el primer lenguaje de programación desarrollado. Lo fue a mediados de la década de los sesenta por los profesores John G. Kemeny y Thomas E. Kurtz en el Dartmouth College, en California. Su código se basa en el vocabulario inglés y en las expresiones matemáticas. Consta de cientos de instrucciones para utilización de gráficos, procesado de textos, uso de variables, archivos, etc. EL BASIC utiliza un alfabeto formado por los caracteres alfabéticos: A -Z, cifras 0-9, caracteres especiales como operadores aritméticos: +, -, *, etc., y otros: (,),$, etc. El lenguaje BASIC es, originalmente, un lenguaje interpretado. Existen dos tipos de lenguaje: interpretados y compilados. Los interpretados son aquellos que necesitan del código fuente para funcionar (por ejemplo, GW -BASIC y QBasic). Los compilados, convierten el código fuente en un archivo objeto y éste en un archivo ejecutable. Este es el caso del lenguaje C y de las versiones más completas y recientes del BASIC. Existen muchas versiones (im plementaciones) del lenguaje BASIC. En el esquema siguiente se puede observar la evolución del desarrollo de los diferentes lenguajes de programación y, entre ellos, la de BASIC. AÑO LENGUAJE INVENTOR DESCRIPCION 1900s BINARIO Bool primer lenguaje 1946 Plankalkul Konrad Zuse creado para jugar al ajedrez 1949 Short Code lenguaje traducido a mano 1950 ASM (ensamblador) lenguaje ensamblador 1951 A-0 Grace Hopper fue el primer compilador 1952 AUTOCODE Alick E. Glennie compilador muy rudimentario 1956 FORTRAN IBM sistema de TRAducción de FORmulas matemáticas 1956 COBOL Compilador 1958 ALGOL 58 1960 LISP Intérprete orientado a la Inteligencia Artificial 1961 FORTRAN IV IBM sistema de TRAducción de FORmulas matemáticas

Upload: laqr

Post on 06-Jun-2015

15.899 views

Category:

Documents


0 download

DESCRIPTION

Tutorial lenguaje basic

TRANSCRIPT

Page 1: El lenguaje BASIC  Introducción

El lenguaje BASIC. Introducción

BASIC es un lenguaje de programación de propósito general que ofrece economíasintáctica, control de flujo, estructuras sencillas y un buen conjunto de operadores. Es unlenguaje que no está especializado en ningún tipo de aplicación. Esto lo hace un lenguajeversátil y potente, con un campo de aplicación ilimitado y, sobre todo, se puede aprenderrápidamente. En poco tiempo, un programador puede utilizar la totalidad del lenguaje.

La palabra BASIC proviene de la expresión inglesa Beginner's All-purpose SymbolicInstruction Code: código de instrucciones simbólicas de propósito general paraprincipiantes.

El BASIC fue el primer lenguaje de programación desarrollado. Lo fue a mediados de ladécada de los sesenta por los profesores John G. Kemeny y Thomas E. Kurtz en elDartmouth College, en California. Su código se basa en el vocabulario inglés y en lasexpresiones matemáticas. Consta de cientos de instrucciones para utilización de gráficos,procesado de textos, uso de variables, archivos, etc. EL BASIC utiliza un alfabeto formadopor los caracteres alfabéticos: A-Z, cifras 0-9, caracteres especiales como operadoresaritméticos: +, -, *, etc., y otros: (,),$, etc.

El lenguaje BASIC es, originalmente, un lenguaje interpretado. Existen dos tipos delenguaje: interpretados y compilados. Los interpretados son aquellos que necesitan delcódigo fuente para funcionar (por ejemplo, GW-BASIC y QBasic). Los compilados,convierten el código fuente en un archivo objeto y éste en un archivo ejecutable. Este es elcaso del lenguaje C y de las versiones más completas y recientes del BASIC.

Existen muchas versiones (implementaciones) del lenguaje BASIC. En el esquemasiguiente se puede observar la evolución del desarrollo de los diferentes lenguajes deprogramación y, entre ellos, la de BASIC.

AÑO LENGUAJE INVENTOR DESCRIPCION1900s BINARIO Bool primer lenguaje

1946 Plankalkul Konrad Zuse creado para jugar al ajedrez1949 Short Code lenguaje traducido a mano

1950 ASM (ensamblador) lenguaje ensamblador

1951 A-0 Grace Hopper fue el primer compilador

1952 AUTOCODE Alick E. Glennie compilador muy rudimentario

1956 FORTRAN IBM sistema de TRAducción deFORmulas matemáticas

1956 COBOL Compilador

1958 ALGOL 58

1960 LISP Intérprete orientado a la InteligenciaArtificial

1961 FORTRAN IV IBM sistema de TRAducción deFORmulas matemáticas

Page 2: El lenguaje BASIC  Introducción

1961 COBOL 61 Extendido

1960 ALGOL 60 Revisado

1964 PASCAL Niklaus Wirth programación estructurada

1964 BASICUniversidad deDartmouth(california)

Beginners All Purpose SymbolicInstruction Code

1965 SNOBOL

1965 APL sólo anotación

1965 COBOL 65

1966 PL/I

1966 FORTRAN 66 IBM sistema de TRAducción deFORmulas matemáticas

1967 SIMULA 67

1968 ALGOL 68

1968 SNOBOL4

1970s GW-BASIC antiguo y clásico BASIC

1970 APL/360

1972 SMALLTALKCentro deInvestigación deXerox en Palo Alto

pequeño y rapido

1972 C Laboratorios Bell lenguaje con tipos

1974 COBOL 74

1975 PL /I Lenguaje sencillo

1977 FORTRAN 77 IBM sistema de TRAducción deFORmulas matemáticas

1980s SMALLTALK/V Digitalk pequeño y rapido

1980 C con clases Laboratorios Bell lenguaje con clases

1981 PROLOG

Ministerio Japonésde ComercioInternacional eIndustria (MITI)

Lenguaje estandar para laInteligencia Artificial

1982 ADAMinisterio deDefensa de losEE.UU

lenguaje muy seguro

1984 C++AT&T BellLaboratories (BjarneStroustrup)

compilador

1985 CLIPPER compilador para bases de datos

1985 QuickBASIC 1.0 Microsoft® compilador de BASIC

1986 QuickBASIC 2.0 Microsoft® soporte de tarjeta gráfica EGA

1987 QuickBASIC 3.0 Microsoft® 43 lineas con la tarjeta EGA

1987 QuickBASIC 4.0 Microsoft® tarjetas Hercules, VGA

1987 CLIPPER SUMMER '87 compilador para bases de datos

1988 QuickBASIC 4.5 Microsoft® tarjeta SVGA

1989 QuickBASIC 7.1 Microsoft® ultima version de QuickBASIC

1989 ASIC v5.0 interprete tipo QBASIC shareware

1990s VISUAL C++

1990s VISUAL BASICScript Microsoft® lenguaje de script

1990 HTML Tim Berners-Lee para internet

Page 3: El lenguaje BASIC  Introducción

1991 QBasic 1.0 Microsoft® para MS-DOS 5.0. Compatible 99.9%con QuickBasic

1993 XML C. M. Sperberg-McQueen para internet

1993 SGML Charles F. Goldfarb para internet

1993 QBasic 1.1 Microsoft® para MS-DOS 6.0

1990s WML para internet

1990s ASP Microsoft® para internet

1990s PHP para internet

1995 JAVA Sun Microsystems para internet y proposito general

1995 CLIPPER 5.01 compilador para bases de datos

1995 GNAT ADA95Ministerio deDefensa de losEE.UU

lenguaje muy seguro

1995 FORTRAN 95 IBM sistema de TRAducción deFORmulas matemáticas

1991 VISUAL BASIC 1.0 Microsoft®

1992 VISUAL BASIC 2.0 Microsoft®

1993 VISUAL BASIC 3.0 Microsoft®

1994 VISUAL BASIC 4.0 Microsoft®

1995 VISUAL BASIC 5.0 Microsoft®

1998 VISUAL BASIC 6.0 Microsoft®

1990s C#

2001 VISUAL BASIC .NET Microsoft® La evolución de Visual Basic

QuickBasic es un lenguaje de programación de alto nivel, que se puede utilizar de formacompilada. Tiene varios predecesores. El primero fue BasicA, desarrollado por Microsoft aprincipios de los 80. Sus características principales:

tenía pocas instrucciones era un lenguaje interpretado se requería números identificativos de cada línea de có digo, haciendo la

programación tediosa y limitada los archivos fuente se guardaban en un formato propio

El siguiente predecesor de QuickBasic se denominaba GW -Basic, aparecido a finales de los80 con algunas mejoras:

los archivos fuente se guardaban en u n formato de texto regular, legibles por otrosprogramas

la interfaz de programación era ligeramente más amigable

GW-Basic no era todavía demasiado adecuado para un uso masivo, de modo que Microsoften 1987 crea una actualización de Basic denominada Quic kBasic, con las siguientesventajas:

una interfaz de usuario bastante sencilla una extensa ayuda on-line que incluía índice, e ideas y ejemplos acerca de cómo

usar cada instrucción utilidades básicas de edición, como búsquedas y sustituciones, cortado y pegado,

etc., que aumentaban la productividad no era preciso incluir números de línea

Page 4: El lenguaje BASIC  Introducción

Microsoft incluyó con el sistema operativo MS -DOS 5.0 una versión reducida deQuickBasic denominada QBasic 1.0. Esta versión y su actualización posterior, 1.1, seutilizaban sólo de forma interpretada pero sus posibilidades eran todavía bastante amplias.En lo que resta nos referiremos específicamente a la implementación de BASICdenominada QBasic por su versatilidad y sencillez de uso.

Fundamentos de BASIC. El programa

La mejor forma de aprender un lenguaje es programando con él. El programa más sencilloque se puede escribir en BASIC es el siguie nte:

Como podemos imaginar, este programa sin una sola instrucción no hace nada, pero seinterpreta correctamente y nos da una idea de que no se necesita mucho para empezar aprogramar en BASIC. Esto no es cierto en otros lenguajes como C, en los que ha y queutilizar obligatoriamente encabezados de programa y limitadores de bloques de sentencias.

Un programa algo más complicado, pero que hace algo, es el siguiente:

' Este es mi primer programa en BASIC

CLSPRINT "Bienvenido a la programación en lenguaj e BASIC"

END

Con él visualizamos en la pantalla el mensaje:

Bienvenido a la programación en lenguaje BASIC

En el programa se incluye la línea:

CLS

Esta línea constituye una sentencia. La sentencia consta únicamente de la instrucción CLS ,y ésta produce el resultado de borrar la pantalla.

La siguiente sentencia incluye la instrucción PRINT. Ésta toma como argumento una cadenade caracteres limitados por dobles comillas " " y la imprime en la salida habitual, quegeneralmente es la pantalla del PC en el que trabajamos.

La instrucción END termina el programa. Ni siquiera es obligatorio finalizar con END,aunque es conveniente por una cuestión de claridad. De cualquier manera, si extraemos esasentencia, el programa funcionará exactamente igual (el programa finaliza automáticamentecuando no se encuentran más líneas de código).

La inclusión de comentarios en un programa es una saludable práctica, como lo reconocerácualquiera que haya tratado de leer un listado hecho por otro programador o por sí mismo,varios meses atrás. Para el intérprete o el compilador, los comentarios son inexistentes, porlo que no generan líneas de código ejecutable, permitiendo abundar en ellos tanto como se

Page 5: El lenguaje BASIC  Introducción

desee. En el lenguaje BASIC se toma como comentario todo carácter que sigue a la comillasimple: ' o a la palabra clave REM.

Como se observa, un programa en QBasic es simplemente un fichero de caracteres quecontiene un conjunto de instrucciones que un programa especial, el intérprete, se encargade transformar en un código que la computadora puede ejecutar (aunque no se genera unarchivo .EXE).

Antes de continuar hagamos un inciso sobre la nomenclatura utilizada en QBasic paradesignar a distintos elementos del lenguaje:

Elemento Definición

SentenciaInstrucción(Comando)

Es una instrucción que realiza una operación. Se utilizan estaspalabras de forma intercambiable. Se usa mucho la forma comandodebido a su utilización en inglés.

Palabra claveKeyword

Una palabra que forma parte del lenguaje QBasic. Cuando se utilizauna palabra clave en una sentencia, QBasic automáticamente laconvierte a mayúsculas. No se puede utilizar una palabra clave paradar nombre a una constante o variable (palabra reservada).

CadenaString

Una cadena de texto (caracteres). En Qbasic se delimita concomillas, por ejemplo, "Bienvenido". La cadena "" (vacía) es válida.

NúmeroDesigna a números enteros, decimales de precisión simple ydecimales de precisión doble.

Constante

Un valor (cadena o número) que no cambia a lo largo de la ejecucióndel programa. Hay dos clases de constantes; las constantes literalesestán escritas directamente en el código: "Hola", 16; las constantessimbólicas o con nombre son valores constantes a los que se lesasigna un nombre. Por ejemplo, LONG_MAX en lugar de 16. Lasconstantes simbólicas se definen usando la palabra clave CONST.

Variable

Un contenedor con nombre para un número o una cadena. Son elmedio para que el programa "recuerde" datos. Se pueden crearvariables de varias maneras: calculando un valor, tomando unaentrada de usuario, leyendo un archivo, etc.

OperadorDesigna una operación matemática. Los operadores pueden seraritméticos, relacionales o lógicos.

FunciónDevuelve una cadena o un número. Puede tomar uno o másparámetros de entrada para calcular el result ado.

ComentarioNo hace nada en el programa. Se utiliza como una nota explicativaque contribuye a clarificar el código y a recordar más tarde lo que sehizo.

BloqueDesigna a un conjunto de líneas dentro de la estructura del programa,que guardan una relación de algún tipo entre sí.

Bucle Designa a un grupo de líneas que se ejecutan una serie de veces.

La estructura general de un módulo de código en QBasic consta de un programa principal yde varios subprogramas y/o funciones:

' Programa principal

declaración de funciones y subprogramasdeclaración de variablessentencias

ENDSUB Subprograma1 ( )

Page 6: El lenguaje BASIC  Introducción

declaración de variablessentencias

END SUBFUNCTION Funcion1 ( )

declaración de variablessentencias

END FUNCTION

...

...

...

SUB Subprograman( )

declaración de variablessentencias

END SUBFUNCTION Funcionn ( )

declaración de variablessentencias

END FUNCTION

Cuando la envergadura del programa es grande se suele fragmentar el módulo en variaspartes, incluyendo cada parte en un fichero s eparado. Normalmente colocaremos en cadafichero todas las subrutinas y funciones que se encarguen de una tarea del programa. Portanto, un programa en QBasic puede estar formado por diferentes módulos o fuentes. Esconveniente mantener los fuentes de un t amaño no muy grande -para encadenar laejecución de los diferentes módulos se utiliza la instrucción CHAIN (CHAINnombre.archivo$-.

Las variables y los tipos básicos

Introducción

Si se deseara imprimir los resultados de multiplicar un número fijo por otro que adoptavalores entre 0 y 9, la forma normal de programar esto sería crear una constante para elprimer número y un par de variables para el segundo y para el resultado del producto. Unavariable no es más que un nombre para identificar una (o varias) posiciones de memoriadonde el programa guarda los distintos valores de una misma entidad . En un programaBASIC es conveniente definir todas las variables que se utilizarán antes de comenzar ausarlas, a fin de indicarle al intérprete o compilador de que tipo serán y, por tanto, cuántamemoria debe destinar para albergar a cada una de ellas, aunque en QBasic no esobligatorio. Veamos un ejemplo:

' Multiplica dos números enteros

DIM multiplicador AS INTEGER ' defino <multiplicador> comoun entero

DIM resultado AS INTEGER ' defino <resultado> como unentero

multiplicador = 1000 ' asigno valores

Page 7: El lenguaje BASIC  Introducción

resultado = 2 * multiplicador

PRINT "Resultado = ", resultado ' muestro el resultadoEND

Así, una variable es un lugar donde se puede almacenar temporalmente un dato. En BASIClas variables tienen un nombre que las identifica, y sirve para hacer referencia a ellas.También tienen un tipo, que es el tipo de datos que puede almacenar. El valor de lasvariables es, como su propio nombre indica, variable. Podemos alterar su valor en cualquierpunto del programa.

Identificadores, tipos y tamaños

Para dar un nombre a una variable tenemos qu e usar un identificador. La longitud de unidentificador puede variar entre uno y varios caracteres, por lo general, 40. En la mayoríade los casos el primer carácter debe ser una letra. A continuación se muestran variosejemplos de nombres de identificado res correctos e incorrectos:

Correcto Incorrecto

cuenta 1cuenta

prueba23 prueba*

puerto.paralelo puerto_paralelo

El lenguaje QBasic no es sensible a mayúsculas y minúsculas (no es case sensitive), demodo que para el intérprete es lo mismo el identific ador cuenta que otro denominadoCuenta.

Los intérpretes y compiladores reservan determinados términos ó palabras claves(keywords), para el uso sintáctico del lenguaje, tales como: CLS, PRINT, END, etc. y no sepueden utilizarla en nombres de variables.

Para crear una variable en un lugar determinado del un programa escribiremos primero eltipo de variable y luego el identificador con el que queremos nombrar la variable. A esto sele denomina definir una variable . La forma general de la definición es:

DIM identificador [AS tipo]DIM identificador[sufijo]

Por ejemplo:

DIM numero AS INTEGER ' crea la variable numero, de tipo númeroentero

DIM numero% ' crea la variable numero, de tipo númeroentero

DIM frase AS STRING ' crea la variable frase, de tipo cad enaDIM frase$ ' crea la variable frase, de tipo cadenaDIM a!, b# ' crea dos variables a y b, de tipo número

de precisión simple y doble, respect.DIM a AS SINGLE, b AS DOUBLE ' crea dos variables a y b, ...

En QBasic, las variables no se pueden inic ializar (es decir, establecer un valor inicial) en elmomento de creación. Por ejemplo, es incorrecto:

Page 8: El lenguaje BASIC  Introducción

DIM numero% = 0 ' incorrecto, falla el intérpreteDIM frase$ = "Hola" ' incorrecto, falla el intérprete

La asignación de valores a las variables hay que realizarla posteriormente a la definición delas mismas.

En QBasic, se pueden definir variables en cualquier parte de un programa.

Los tipos de datos atómicos definidos por QBasic son:

cadenas de caracteres números enteros números en coma flotante

Tipo Sufijo Tamaño Intervalo Descripción

STRING $

conjuntode

caracteres(de 8 bits)

0 a 32 767caracteres

Las variables string son las que almacenan texto.Ejemplos: "¿Qué estás haciendo?", "Alpha Sigma Pi","323" (esto no es un número porque se delimita concomillas).

INTEGER % 16 bits-32 768 a 32

767

Las variables enteras almacenan números enteros (sinparte decimal).Ejemplos: 4323, 1, -7543, 30000 (no se utilizanseparadores de millares).

LONG & 32 bits-2 147 483 648

a 2 147 483647

Almacenan también enteros.Ejemplos: 54500, 0, 123456789.

SINGLE ! 32 bits

3.4 E-38 a3.4E+38(aprox. 6dígitos deprecisión)

Las variables de precisión simple almacenan númerosde coma flotante con 6 dígitos de precisión.Ejemplos: 123.456, 12300000000000,.0000000000000008.

DOUBLE # 64 bits

1.7 E-308 a1.7 E+308(aprox. 12dígitos deprecisión)

Las variables de precisión doble almacenan números decoma flotante con 12 dígitos de precisión.Ejemplos:10000000000000000000000000000000000000000000,.000000000000000400005.

Veamos el siguiente programa de ejemplo acerca del uso de variables:

' Convierte grados Centígrados a FahrenheitDIM cels!, fahr!

cels = 25 ' Temperatura en º Cfahr = 32 + 9 * fahr / 5 ' Temperatura en º Fahrenheit

PRINT ">>> ";cels;" ºC son ";fahr;" ºF

END

En él se definen dos variables single, se asigna un valor a la primera y se calcula lasegunda mediante una expresión aritmética. En la instrucción PRINT, el ; indica que seconcatenen los valores a mostrar.

Page 9: El lenguaje BASIC  Introducción

En Qbasic no es obligatorio definir el tipo de datos de una variable antes de utilizarla,aunque si es conveniente. De hecho, el programa anterior también funciona así:

' Convierte grados Centígrados a Fahrenheitcels = 25 ' Temperatura en º Cfahr = 32 + 9 * fahr / 5 ' Temperatura en º Fahrenheit

PRINT ">>> ";cels;" ºC son ";fahr;" ºF

END

En este caso es el intérprete el que asigna automáticamente el tipo de los datos a lasvariables. Esto facilita bastante la tarea de programar, sobre todo a usuarios inexpertos,aunque no es lo más eficiente.

La instrucción LET

La sentencia LET asigna un valor a una variable. La sintaxis de uso es:

[LET] variable = expresión

expresión es una expresión del mismo tipo que la variable - número o string -. No se puedeponer un valor string en una variable numérica y viceversa. La palabra clave LET esopcional. En la mayor parte de los usos se prescinde de LET y de deja sólo variable =

expresión (es más claro y sencillo). Si se intenta poner un valor decimal en una variableentera el valor se redondea. Se pueden poner valores enteros en variables Single y Double.

Ejemplos:

LET micadena$ = "Esto es una prueba."LET resultado% = var1% + var2% - var3%mezcla# = i% + l& + s! + d#

Ámbito o alcance de las variables

Otra característica de las variables es su alcance. El alcance se refiere a los lugares de unprograma en los que podemos utilizar una determinada variable. Distinguiremos así dostipos principales de variables:

globales locales

Una variable es global cuando es accesible desde todo el programa, y es local cuando solopuede acceder a ella la función que la creó.

Variable Global Variable Local

Page 10: El lenguaje BASIC  Introducción

' Muestra un número enteroDIM SHARED x1%x1% = 100

MuestraENDSUB Muestra

PRINT x1%END SUB

' Muestra un número enteroDIM x2%x2% = 100

MuestraENDSUB Muestra

PRINT x2%END SUB

En el primer caso el resultado que se obtiene al ejecutar el programa es:

100

mientras que en el segundo es:

0

La palabra clave SHARED consigue que la variable x1 sea global, es decir, a ccesible entodo el código (todos los subprogramas) del módulo. Por el contrario, x2 es local y sólo seconserva su valor en el programa principal, no siendo accesible desde los subprogramas.

Otro ejemplo:

Variable Global Variable Local' Muestra un número entero

ValorPRINT x1%

ENDSUB Valor

SHARED x1% ' Aquí sólo se escribe SHARED,' no DIM SHARED

x1% = 100END SUB

' Muestra un número enteroValorPRINT x2%

ENDSUB Valor

DIM x2%PRINT x2%

END SUB

De nuevo, el resultado que se obtiene al ejec utar el programa es en el primer caso:

100

mientras que en el segundo:

0

Entrada y salida de datos

Introducción: funciones para E/S de datos

Unas de las principales vías de comunicación de un programa con el usuario son la pantalla(terminal) y el teclado. La entrada y salida de datos por estos medios se pueden realizarmediante varias instrucciones de QBasic. Las fundamental es son:

PRINT INPUT

Page 11: El lenguaje BASIC  Introducción

y algunas más avanzadas:

PRINT USING LINE INPUT

Otras que permiten el control de la salida por pantalla son:

LOCATE CLS

PRINT: Salida por pantalla

Comenzaremos con la instrucción principales de salida de datos: PRINT.

La función PRINT escribe texto y/o números en la pantalla (aunque también en un archivo).Su uso en sencillo, sólo hay que añadir detrás de la palabra clave la lista de datos que sedesea visualizar. Por ejemplo:

' Muestra un mensaje

PRINT "Hola"PRINT "mundo"

END

El resultado es:

Holamundo

Nótese que PRINT imprime un sal to de línea tras el texto. Se puede inhibir el saltoautomático de línea si se añade ; tras el texto:

' Muestra un mensaje

PRINT "Hola";PRINT "mundo"

END

cuyo resultado es:

Hola mundo

Un ejemplo de uso con valores numéricos y de texto es:

' Muestra valores numéricos

a% = 50b% = 100

PRINT "El valor de a es"; a%; " y el valor de b es"; b%

END

Page 12: El lenguaje BASIC  Introducción

cuyo resultado es:

El valor de a es 50 y el valor de b es 100

Nótese que al concatenar el texto con los números mediante ; se añade automáticamente unespacio en blanco antes de cada valor numérico.

Si en lugar de utilizar ; se utiliza , para la concatenación:

' Muestra valores numéricos

a% = 50b% = 100

PRINT "El valor de a es", a%; " y el valor de b es", b%

END

el resultado es:

El valor de a es 50 y el valor de b es 100

es decir, produce una separación de 14 espacios.

INPUT: lectura del teclado

Algo muy usual en un programa es esperar que el usuario introduzca datos por el teclado.Para ello contamos con la instrucción INPUT. Un ejemplo:

' Lee un número entero desde el tecladoDIM num%

PRINT "Introduce un número";INPUT num%

PRINT "Has tecleado el número"; num%END

Este programa muestra el mensaje Introduce un número? (nótese la interrogaciónañadida) y espera a que el usuario introduzca un entero. Si el usuario escribe 23 y pulsaINTRO lo que se observa es:

Introduce un número? 23Has tecleado el número 23

Podemos preguntar por más de una variable a la vez en un solo INPUT:

' Lee varios enteros desde el tecladoDIM a%, b%, c%

PRINT "Introduce tres números";INPUT a%, b%, c%

Page 13: El lenguaje BASIC  Introducción

PRINT "Has tecleado los números"; a%; b%; c%END

De esta forma, cuando el usuario ejecuta el programa debe introducir los tres datosseparados por una coma y finalizar con un retorno de carro.

Introduce tres números? 1,2,3Has tecleado los números 1 2 3

Es muy común escribir un mensaje con PRINT antes de realizar un INPUT, como en losdos ejemplos anteriores. Pero INPUT facilita la labor si se utiliza así:

' Lee un entero desde el tecladoDIM num%

INPUT "Introduce un número: ", num%

PRINT "Has tecleado el número"; num%END

que produce la salida:

Introduce un número: 23Has tecleado el número 23

La utilización de INPUT para introducción de cadenas de texto es similar:

' Lee una cadena de caracteres desde el tecladoDIM palabra AS STRING

INPUT "Escribe una palabra: ", palabra

PRINT "He guardado: "; palabraEND

cuyo resultado es, si se escribe el texto y se pulsa INTRO:

Escribe una palabra: TecnologíaHe guardado: Tecnología

Se puede limitar el tamaño de la cadena que se almacena si se especifica la longitudmáxima de dicha cadena en la instrucción DIM:

DIM palabra AS STRING*5 ' Define palabra como unacadena de texto

' de una longitud máxima de 6caracteres......

en este caso el resultado es:

Escribe una palabra: TecnologíaHe guardado: Tecno

Page 14: El lenguaje BASIC  Introducción

PRINT USING

Esta instrucción es similar a PRINT pero es capaz de dar un formato especificado de salidaa los datos. La sintaxis de uso es:

PRINT USING formato; lista_de_expresiones

donde formato es una cadena de texto que contiene distintos especificadores que aplicanformato a la lista_de_expresiones . Esta lista no es más que un conjunto de expresionesnuméricas o de texto concatenadas con ; o ,.

Los especificadores que se pueden utilizar en formato son:

Caracteres que dan formato a una expresión numérica # Posición de dígito. ¦ -Después del dígito, imprime . Posición de punto decimal. ¦ elsigno para los números , A la izquierda del punto decimal, ¦negativos. imprime una coma cada 3 dígitos. ¦ $$Imprime $ adelante. + Posición del signo de número. ¦ ** Llenaespacios adelante con *^^^^ Imprime con formato exponencial. ¦ **$Combina ** y $$.

Caracteres que dan formato a una expresión de texto & Imprime la cadena completa. ¦ \ \Imprime los primeros n ! Imprime sólo el primer carácter ¦caracteres, donde n es el de la cadena. ¦ númerode espacios entre

Caracteres utilizados para imprimir caracteres literales _ Imprime el carácter de formato ¦Cualquier carácter que no siguiente como literal. ¦ estéen la tabla será ¦impreso como literal.

Veamos un ejemplo en el que se da formato a expresiones numéricas y de texto:

' Calcula el importe total de un conjunto de productos

INPUT "Introduzca el nombre del producto: ", nombreitem$INPUT "¿Cuántos elementos?: ", numitems%INPUT "¿Cuál es el importe unitario?: ", importeitem!

importetotal! = numitems% * importeitem!

PRINTPRINT "Producto Cantidad Importe Importe Total"PRINT "-------- -------- --------- -------------"

PRINT USING "\ \ ##,### ###,###.## #,###,###.##";nombreitem$; numitems%; importeitem!; importetotal!END

Este programa produce el resultado:

Page 15: El lenguaje BASIC  Introducción

Introduzca el nombre del producto: relé¿Cuántos elementos?: 30¿Cuál es el importe unitario?: 1.5

Producto Cantidad Importe Importe Total-------- -------- --------- -------------relé 30 1.50 45.00

LINE INPUT

Esta instrucción es sumamente similar a INPUT, si bien almacena en una sola variable todala entrada proporcionada desde teclado hasta encontrar un retorno de carro y no consideralas comas (,) separadores de variables (como sucedía con INPUT).

Por ejemplo:

' Lee una cadena de caracteres desde el tecladoDIM frase AS STRING

LINE INPUT "Escribe una frase: ", frase

PRINT "He guardado: "; fraseEND

Si al ejecutar este programa se introduce la primera oración del Quijote se obtiene:

Introduce una frase: En un lugar de la Mancha, de cuyo nombre ...He guardado: En un lugar de la Mancha, de cuyo nombre ...

Posicionado del cursor y borrado de pantalla

LOCATE: posicionado del cursor

Hemos visto que cuando usamos PRINT se escribe en la posición actual del cursor y semueve éste al final de la cadena que hemos escrito. Pero ¿qué sucede cuando queremosescribir en una posición determinada de la pantalla?. La solución está en la función LOCATE.Supongamos que queremos escribir 'Hola' en la fila 20, columna 10 de la pantalla:

' Muestra Hola en la fila 20, columna 10

LOCATE 20, 10PRINT "Hola"

END

Obsérvese que primero se indica la fila (y) y luego la columna (x). La esquina superiorizquierda es la posición (1, 1).

Page 16: El lenguaje BASIC  Introducción

CLS

Ahora ya sólo resta saber cómo se limpia la pantalla. Ello es tan fácil como usar:

CLS

(clear screen, borrar pantalla).

Esta función no sólo borra la pantalla, sino que sitúa el cursor en la posición (1, 1), en laesquina superior izquierda.

' Borra pantalla y muestra mensaje

CLSPRINT "Hola"

END

Subprogramas y Funciones

Introducción

Los subprogramas y funciones son rutinas, procedimientos o conjuntos de sentencias querealizan una labor específica. Los subprogramas o subrut inas nacieron de la necesidad deno repetir innecesariamente un trabajo ya hecho. Pueden invocarse desde el cuerpo delprograma principal cuantas veces se desee. Están en el núcleo de lo que se denominaprogramación estructurada.

En QBasic existen dos clases de subrutinas o procedimientos:

los subprogramas propiamente dichos (procedimientos SUB), que realizan unconjunto de tareas y no devuelven ningún valor.

las funciones (procedimientos FUNCTION), que devuelven un valor de un tipo que sepuede especificar.

Los subprogramas y las funciones admiten parámetros (argumentos), que son datos que lepasan al procedimiento las sentencias que la llaman.

La sintaxis habitual en la definición de un subprograma es:

SUB identificador [(lista_de_parámetros)]bloque_de_código

END SUB

donde:

- identificador es el nombre del subprograma. Debe ser un identificador valido;- lista_de_parámetros es una lista de variables, separadas por comas, que conforman los datosque le pasamos al subprograma.- bloque_de_código es un conjunto de sentencias.

La lista de parámetros o argumentos es opcional. Podemos escribir como ejemplo:

Page 17: El lenguaje BASIC  Introducción

' Ejemplo de uso de un subprograma

holaEND

' Subprograma que muestra un mensaje de bienvenidaSUB hola

PRINT "Hola"

END SUB

que simplemente es una función que cuando es llamada imprime en pantalla un mensaje desaludo.Cuando el programa al ejecutarse alcanza el cierre del procedimiento ( END SUB), éstefinaliza y devuelve el control al punto del programa que lo llamó.

La sintaxis habitual en la definición de una función es:

FUNCTION identificador [tipo] [(lista_de_parámetros)]bloque_de_código

nombre_de_la_función = expresión

bloque_de_códigoEND FUNCTION

donde:

- identificador es el nombre de la función. Debe ser un identificador valido;- tipo es un sufijo [%, !, etc] o una expresión AS INTEGER, AS SINGLE, etc. que define eltipo de datos que devlelve la función.- lista_de_parámetros es una lista de variables, separadas por comas, que conforman los datosque le pasamos a la función.- nombre_de_la_función = expresión es una sentencia que produce que la función retorneel valor determinado por expresión.- bloque_de_código es un conjunto de sentencias.

El tipo es opcional. La lista de argumentos es también opcional. Podemos escribir comoejemplo:

' Ejemplo de uso de una función

INPUT "Introduce dos enteros: ", s1%, s2%

PRINT "La suma es: "; Suma%(s1%, s2%)END

' Función que suma dos enteros y devuelve la suma como otro enteroFUNCTION Suma% (s1%, s2%)

Suma% = s1% + s2%

END FUNCTION

Cuando el programa al ejecutarse alcanza el cierre del procedimiento ( END FUNCTION), éstefinaliza y devuelve un valor de tipo entero al programa que lo llamó.

Page 18: El lenguaje BASIC  Introducción

Retorno de valores

Cuando la función finaliza hemos dicho que se devuelve un valor. Para obligar a la funcióna retornar un determinado valor se utiliza la sentencia

nombre_de_la_función = expresión

donde el valor de expresión es el que se asigna a la función. Por ejemplo:

FUNCTION lista%

lista% = 1

END FUNCTION

devuelve el entero 1 cada vez que es llamada. En QBasic podemos devolver cualquier tipode datos de los llamados escalares. Los tipos de datos escalares son los tipos numéricos y eltipo string. En QBASIC no se pueden devolver vectores ( array).

Paso de parámetros a un subprograma

Utilizando la lista de argumentos podemos pasar parámetros a una función. En esta lista sesuele colocar un conjunto de identificadores, separados por comas, que representan cadauno de ellos a uno de los parámetros de la función. Obsérvese que el orden de losparámetros es importante. Para llamar a la función habrá que colocar los parámetros en elorden en que la función los espera.

Cada parámetro puede tener un tipo diferente. Para declarar el tipo de los parámetrosañadiremos su tipo tras el identificador. Así:

SUB imprime (numero%, letra$)

PRINT numero%, letra$

END SUB

es una función que admite dos variables, una entera y otra de tipo cadena.

En los lenguajes de programación estructurada hay dos formas de pasar variables a unafunción:

por referencia, o por valor

Cuando la variable se pasa por referencia, la función puede acceder a la variable original.Este enfoque es habitual en lenguajes como el BASIC. (En C, sin embargo, todos losparámetros se pasan por valor. La función recibe una copia de los pa rámetros y variables, yno puede acceder a las variables originales. Cualquier modificación que efectuemos sobreun parámetro no se refleja en la variable original. Esto hace que no podamos alterar elvalor de la variable por equivocación.)

Por ejemplo, el programa:

' Imprime valores

Page 19: El lenguaje BASIC  Introducción

n% = 1l$ = "A"

CLS

PRINT n%imprime n%, l$PRINT n%

END

SUB imprime (numero%, letra$)

numero% = 2

PRINT numero%, letra$

END SUB

da como resultado:

12 A2

Es decir, la variable n, que originalmente valía 1, toma el valor 2 tras la llamada alprocedimiento imprime.

Declaración y comprobación de tipos

Al igual que para las variables, cuando un procedimiento (función o subprograma) se va ausar en un programa, o cuando un procedimiento se define en otro fichero (procedimientoexterno), se debe declarar antes del lugar donde se define. La declaración de unprocedimiento consiste en especificar el tipo de datos que va a retornar, cuando se trata deuna función, y el número de argumentos y su tipo. Una declaración típica de función es:

DECLARE {FUNCTION | SUB} nombre_del_procedimiento[sufijo][([lista_de_parámetros])]

Esto avisa al intérprete/compilador de que el procedimiento lo vamos a definir después.

La lista de parámetros con tipo difiere de la lista de argumen tos antes presentada en que eltipo de cada argumento se coloca dentro de la lista, tras de su correspondiente identificador,como hacíamos en la definición de variables. Por ejemplo:

DECLARE FUNCTION imprime$(numero AS INTEGER, letra AS STRING)DECLARE FUNCTION imprime$(numero%, letra%)

declara una función que devuelve un carácter y tiene dos parámetros, un entero y uncarácter.

NOTA:DECLARE es requerido si se hace una llamada a un procedimiento FUNCTION o a uno SUB sinCALL (véanse los ejemplos). QBasic generara automáticamente instrucciones DECLARE

cuando se guarda un programa.

Page 20: El lenguaje BASIC  Introducción

La lista de argumentos permite al intérprete/compilador hacer comprobación de tipos, yaque el tipo y numero de argumentos debe coincidir en la declaración, definición y llamada auna función.

Véase, por ejemplo, el programa:

DECLARE FUNCTION imprime$ (numero%, char$) ' Declara la función"imprime"

' EjemploDIM caracter AS STRING

CLS

caracter = imprime(100, "a")PRINT "El carácter escrito fue ";caracter

END

' Define una función que imprime un entero y un carácter.' Devuelve el mismo carácter de entrada.

FUNCTION imprime$(numero AS INTEGER, letra AS STRI NG)

PRINT numero, letra

imprime$ = letra

END FUNCTION

EjemplosSubprograma sin argumentos (no devuelve nada)

Este programa llama a la función BorraPantalla que despeja la pantalla mediante la ordenCLS (clear screen) y muestra el mensaje "la pantalla está limpia". Por supuesto, es de nulautilidad pero sirve para empezar.

DECLARE SUB BorraPantalla ()

' LLamada a un subprograma sin argumentosBorraPantalla ' Llamamos al subprograma

' También podríamos escribir: CALLBorraPantallaEND

SUB BorraPantalla

CLSPRINT "La pantalla está limpia"

END SUB

Subprograma con argumentos (no devuelve nada)

En este ejemplo la función compara toma dos números, los compara y nos dice cuál esmayor.

DECLARE SUB compara (a AS INTEGER, b AS INTEGER)

' Compara números

Page 21: El lenguaje BASIC  Introducción

DIM num1 AS INTEGER, num2 AS INTEGER

INPUT "Introduzca dos números: ", num1, num2

compara num1, num2 ' Llamamos al subprogramas con sus dosargumentos

' También podríamos escribir: CALLcompara(num1, num2)END

SUB compara (a AS INTEGER, b AS I NTEGER) ' Pasamos los parámetrosa y b a la función

IF a > b THENPRINT a; " es mayor que "; b

ELSEPRINT b; " es mayor que "; a

END IFEND SUB

Función con argumentos (devuelve un valor)

Este ejemplo es como el anterior pero devuelve como resultado el mayor de los dosnúmeros.

DECLARE FUNCTION compara% (a AS INTEGER, b AS INTEGER)

' Compara númerosDIM num1 AS INTEGER, num2 AS INTEGERDIM resultado AS INTEGER

INPUT "Introduzca dos números: ", num1, num2

resultado = compara(num1, num2) ' Almacenamos enresultado el valor que devuelve la función

PRINT "El mayor de los dos es "; resultado

END

FUNCTION compara% (a AS INTEGER, b AS INTEGER) ' Pasamos losparámetros a y b a la función

IF a > b THENcompara% = a

ELSEcompara% = b

END IF

END FUNCTION

En este ejemplo podíamos haber hecho también:

PRINT "El mayor de los dos es "; compara(num1, num2)

De esta forma nos hubiésemos ahorrado tener que definir la variable resultado.

Page 22: El lenguaje BASIC  Introducción

Control de flujo

Introducción

En Qbasic las sentencias se ejecutan sucesivamente una tras otra (secuencialmente). Estodefine un camino o dirección según la cual se va desarrollado el programa. Sin embargo,habrá momentos en que el programa deba ejecutar determinadas partes dependiendo delestado en el que se halle el propio programa o las variables externas. Esto permitirmodificar el orden de la ejecución para adaptarse al estado del programa y bifurcar hacianuevas subrutinas cuando se cumplan ciertas condiciones, que el programador fija deantemano. Los mecanismos en QBasic que permiten llevar esto a cabo son:

La instrucción IF

La primera sentencia de control es la sentencia if. Admite dos tipos de sintaxis:

IF expresión THEN sentencia_1 [ELSE sentencia_2]

o también:

IF expresión THEN[bloque_sentencias_1]

[ELSEIF expresion_2 THEN[bloque_sentencias_2]]...

ELSE[bloque_sentencias_n]

END IF

Esta sentencia es equivalente a la que poseen la mayoría de lenguajes de programación ysirve para bifurcar en un punto de programa. Permite al programa tomar dec isiones. En suprimera forma, la sentencia_1 sólo se ejecuta si el resultado de evaluar la expresión esverdadero (no cero); en caso contrario, se ejecuta sentencia_2. En la segunda forma,tenemos varias posibilidades: si al evaluar la expresión el resultado es verdadero seejecutan las instrucciones bloque_sentencias_1, pero si el resultado es falso se evalúa laexpresión_2 y si ésta es verdadera se ejecuta bloque_sentencias_2, y asísucesivamente. En cualquier caso sólo una de los bloques de sentencias s e ejecuta.

Veamos algunos ejemplos:

IF num% = 1 THEN PRINT "la variable num vale 1" ELSEPRINT "la variable num no vale 1"

Tras evaluarse la expresión IF y ejecutarse la sentencia adecuada, el programa continúa conla línea siguiente a la de la última se ntencia del IF. Para la sentencia IF vale comoexpresión cualquiera válida en QBasic, incluso las llamadas a funciones:

IF suma(num1, num2) >= 0 THENPRINT "La suma de num1 y num2 es positiva"

END IF

Page 23: El lenguaje BASIC  Introducción

Como sentencias valen cualquier tipo de sentencia válida en QBasic, entre ellas la propiasentencia IF. En este caso hablaremos de sentencias IF anidadas. Por ejemplo:

IF num > 0 THENIF num = 1 THEN

PRINT "num es igual a 1"ELSEIF num > 1 THEN

PRINT "num es mayor que 1"ELSE

PRINT "num es menor que 1"END IF

END IF

En este caso, si la variable num es menor o igual que cero el programa no mostrará ningúnmensaje, y en caso contrario se mostrará el mensaje correspondiente a la comparación delvalor con la unidad.

El bucle WHILE

Un bucle es un conjunto de sentencias que se ejecutan repetidamente hasta que se alcanzauna condición de fin de bucle, o condición de salida. El bucle while es el tipo de bucle mássencillo. En su modo más simple se escribe:

WHILE expresiónbloque_sentencias

WEND

El bucle while comienza por evaluar la expresión. Si es cierta, se ejecutabloque_sentencias . Entonces se vuelve a evaluar la expresión. De nuevo, si esverdadera, se vuelve a ejecutar bloque_sentencias . Este proceso continúa hasta que elresultado de evaluar la expresión es falso. Por esto se le llama a esta expresión lacondición de salida. Por ejemplo:

variable% = 10

WHILE variable% >= 1PRINT "la variable vale "; variable%

variable% = variable% -1WEND

En este caso se imprime el valor de la variable hasta que se llega a 1. Normalmente, en lassentencias del bucle WHILE se coloca alguna instrucción que modifique la expresión decontrol, como vemos en el ejemplo anterior.

Page 24: El lenguaje BASIC  Introducción

El bucle DO - WHILE

La sintaxis de este bucle es:

DO [{WHILE | UNTIL} expresión]bloque_sentencias

LOOP

o también:

DObloque_sentencias

LOOP [{WHILE | UNTIL} expresión]

Su funcionamiento es análogo el del bucle WHILE, salvo que la expresión de control sepuede evaluar al final del bucle (si se utiliza la segunda opc ión de sintaxis). Esto nosgarantiza que el bucle DO_WHILE se ejecuta al menos una vez. Incluye también laposibilidad de ejecutar el bucle mientras ( WHILE) expresión sea verdadera o hasta (UNTIL)que expresión sea verdadera.

Por ejemplo:

n% = 9

DOPRINT "número actual "; n%n% = n% -1

LOOP WHILE n% >= 0

este programa muestra el valor de n hasta que vale 0. Y el siguiente produce el mismoresultado.

n% = 9

DOPRINT "número actual "; n%n% = n% -1

LOOP UNTIL n% = -1

El bucle FOR

La sintaxis del bucle FOR es:

FOR contador = inicio TO fin [STEP incremento]bloque_sentencias

NEXT [contador]

Este bucle se utiliza para realizar un conjunto de acciones un número determinado deveces.Su versión más sencilla es:

FOR i% = 0 TO 10PRINT "i vale "; i%

NEXT i%

Esta versión del bucle imprime el valor de i desde 0 con un incremento de una unidadmientras que esta variable no alcance el valor 10.

Page 25: El lenguaje BASIC  Introducción

FOR i% = 1 TO 10 STEP 2PRINT "i vale "; i%

NEXT

Y en este ejemplo se muestran los valores 1, 3, 5, 7 y 9 (desde 1 con un incremento de 2).

El bucle FOR es equivalente a un bucle WHILE escrito del siguiente modo:

contador = inicioWHILE contador <= fin

bloque_sentenciascontador = contador + incremento

WEND

Este bucle WHILE puede servirnos para sali r fácilmente de dudas al escribir un bucle FOR, yaque se ve claramente el orden de ejecución de las expresiones y sentencias dentro del bucleFOR. Como se ve, en cada pasada del bucle FOR se sigue el orden: evaluación del valor delcontador, ejecución de bloque_sentencias y e incremento del contador.

Las sentencia EXIT

Hay veces en que interesa romper un bucle en una determinada posición, para finalizar suejecución. Esto suele ser habitual cuando el bucle tiene una gran complicación o cuandonecesitamos salir "por las malas" de él. Esto último suele ser frecuente cuando en el buclese producen "condiciones de error". Para este tipo de salto disponemos de la sentenciaEXIT.

Su sintaxis es:

EXIT {DO | FOR}

La sentencia EXIT rompe la ejecución de un bucle o bloque de instrucciones y continúa enla instrucción que sigue al bucle o bloque. Por ejemplo:

a% = 10

DO WHILE 1PRINT a%IF a% <= 1 THEN EXIT DOa% = a% -1

LOOP

Aunque en apariencia este es un bucle sin fin, ya que la condición WHILE 1 es siemprecierta, este bucle se acaba cuando la variable a valga 1. El bucle simplemente imprime suvalor y decrementa la variable.

Otro ejemplo:

FOR i% = 1 TO 10PRINT i%INPUT a$IF a$ = "S" THEN EXIT FOR

NEXT

el cual imprime enteros entre 1 y 10 h asta que se introduce por teclado la la pulsación S.

Page 26: El lenguaje BASIC  Introducción

EXIT también se utiliza con procedimientos SUB o FUNCTION, para abandonar elprocedimiento antes de ejecutar todas las sentencias que preceden al correspondiente END{SUB | FUNCTION}.

La sentencia de selección múltiple SELECT CASE

Esta sentencia sirve para agrupar varias sentencias IF en una sola, en el caso particular enel que una variable es comparada a diferentes valores, todos ellos constantes, y que realizaacciones si coincide con ellos. Su sint axis es:

SELECT CASE expresión_controlCASE lista_expresiones_1

bloque_sentencias_1[CASE lista_expresiones_2]

[bloque_sentencias_2]]...[CASE ELSE

[bloque_sentencias_n]]END SELECT

Su sintaxis es más complicada que la de anteriores bucles, ya que agrupa un mayor númerode acciones y posibilidades en una sola sentencia. El modo de funcionamiento es elsiguiente:

primero se evalúa la expresión de control. A continuación se compara con lista_expresiones_1 de la primera etiqueta CASE.

Si son iguales, se ejecuta bloque_sentencias_1. Si no, se compara conlista_expresiones_2 , y así sucesivamente.

Se repite el proceso hasta agotar todas las etiquetas case. Si al llegar a la etiquetaELSE no se ha ejecutado ninguna sentencia ésta es la acción por defect o. La etiquetaELSE es opcional. Si no la ponemos el programa simplemente salta fuera del SELCT

CASE.

Vamos a ver un ejemplo de múltiples casos con IF y luego con SELECT CASE:

' Ejemplo de selcción con IFDIM num AS INTEGER

INPUT "Introduce un número ", num

IF num = 1 THENPRINT "Es un 1"

ELSEIF num = 2 THENPRINT "Es un 2"

ELSEIF num = 3 THENPRINT "Es un 3"

ELSEPRINT "No es ni 1, ni 2, ni 3"

END IFEND

Ahora con SELECT CASE:

' Ejemplo de selección con SELCT CASEDIM num AS INTEGER

INPUT "Introduce un número ", num

Page 27: El lenguaje BASIC  Introducción

SELECT CASE numCASE 1

PRINT "Es un 1"CASE 2

PRINT "Es un 2"CASE 3

PRINT "Es un 3"CASE ELSE

PRINT "No es ni 1, ni 2, ni 3"END SELECT

END

Como vemos, el código con SELECT CASE es más cómodo de leer.

Esta sentencia tiene además otras posibilidades. Veamos el siguiente ejemplo:

' Otro ejemploINPUT "Escriba nivel de riesgo aceptable (1 -10): ", Total

SELECT CASE TotalCASE IS >= 8

PRINT "Riesgo y ganancia máximos."PRINT "Seleccione plan de inversiones en bolsa

de valores."CASE 3 TO 7

PRINT "Riesgo y ganancia de moderados a altos."PRINT "Seleccione fondo mutuo o bonos de

corporaciones."CASE 1, 2

PRINT "Sin riesgo, pocas ganancias."PRINT "Seleccione plan de pensión individ ual."

END SELECTEND

En él observamos que en lista_expresiones se pueden utilizar las siguientes formas:

expresión[, expresión] ... expresión TO expresión IS operador_relacional expresión

Arrays (vectores o matrices)

Introducción

Una posible definición de array sería:

"Un conjunto de datos del mismo tipo, identificados por el mismo nombre, y que se puedendistinguir mediante un número de índice."

Pero ¿qué quiere decir esto y para qué lo queremos?. Pues bien, supongamos que queremosalmacenar la temperatura media de cada hora del día y la temperatura promedio del día.Con lo que sabemos hasta ahora podríamos hacer algo así:

' Declaramos 24 variables, una para cada hora del díaDIM temp1!, temp2!, temp3!, temp4!, temp5!, temp6!,

temp7!, temp8!

Page 28: El lenguaje BASIC  Introducción

DIM temp9!, temp10!, temp11!, temp12!, temp13!, temp14!,temp15!, temp16!

DIM temp17!, temp18!, temp19!, temp20!, temp21!, temp22! ,temp23!, temp0!

DIM media!

' Asignamos el valor de cada unaINPUT "Introduzca las temperaturas desde las 0 hasta las 23

separadas por comas: ", temp0!, temp1!, ... temp23!

media = ( temp0! + temp1! + temp2! ... + temp23! ) / 24PRINT "La temperatura media es "; media!

Los puntos ... se utilizan por brevedad en el ejemplo; no constituyen una expresión válida en QBasic .

Observamos que hay que realizar un notable trabajo repetitivo de escritura de código.Precisamente es aquí donde son de utilidad lo s arrays. Vamos a repetir el programa anteriorcon un array:

DIM temp!(24) ' Con esto declaramos las 24 variablesDIM media!DIM hora%

' Ahora damos valor a cada unaFOR hora% = 0 TO 23

PRINT "Introduzca temperatura de las"; hora%; "horas:";

INPUT "", temp!(hora%)media! = media! + temp!(hora%)

NEXT hora%media! = media! / 24

PRINT "La temperatura media es "; media!

El programa resulta más rápido de escribir y más cómodo para el usuario que el anterior.

Como ya hemos comentado, cuando decl aramos una variable lo que estamos haciendo esreservar una zona de la memoria para ella. Cuando declaramos el array de este ejemploreservamos espacio en memoria para 24 variables de tipo SINGLE. El tamaño del array (24)lo indicamos entre paréntesis al d efinirlo. Esta es la parte de la definición que dice: Unarray es un conjunto de datos del mismo tipo identificados por el mismo nombre .

La parte final de la definición dice: y se distinguen mediante el índice . En el ejemplorecorremos la matriz mediante un bucle FOR y vamos dando valores a los distintoselementos de la matriz. Para indicar a qué elemento nos referimos usamos un número entreparéntesis (en este caso la variable hora), este número es lo que se llama índice del array.

En el ejemplo anterior el primer elemento de una matriz tiene el índice 0, el segundo tieneel 1, y así sucesivamente. De modo que si queremos dar un valor al elemento 4 (índice 3)haremos:

temp!(3) = 20

No hay que confundirse. En la declaración del array el número entre corchetes es elnúmero total de elementos; en cambio, cuando usamos la matriz, el número entre corcheteses el índice.

Page 29: El lenguaje BASIC  Introducción

Declaración de un array

La forma general de declarar un array es la siguiente:

DIM identificador_del_array[sufijo_tipo_dato](dimensión) [AStipo_de_dato]

donde:

el sufijo_tipo_dato o tipo_de_dato indican uno de los tipos de datos conocidos ( %,!, INTEGER, SINGLE , etc). En el ejemplo era SINGLE (!)

El identificador_del_array es el nombre que le damos (en el ejemplo era temp). La dimensión es el número de elementos que tiene el array.

Como se ha indicado antes, al declarar un array reservamos en memoria tantas variablesdel tipo_de_dato como las indicada en dimensión.

dimensión también se puede especificar dando los límites superior e inferior de lossubíndices del array:

DIM identificador_del_array[sufijo_tipo_dato]( [inferior TO] superior)

En el ejemplo anterior podríamos haber puesto también:

DIM temp(0 TO 23) AS SINGLE ' Con esto declaramos las 24variables

Inicialización de un array

En QBasic se inicializan los arrays al asignar valores a cada elemento de los mismos. Esdecir, por ejemplo:

temp!(9) = 20temp!(12) = 25temp!(20) = 23

Ahora el elemento 10, es decir, temp!(9), valdrá 20. El elemento 13 valdrá 25, y elelemento 21 valdrá 23. El resto, si no se asignan, tomarán valor 0 por defecto. Por ejemplo,el programa:

DIM temp!(24), hora%

temp!(9) = 20temp!(12) = 25temp!(20) = 23

FOR hora% = 0 TO 23PRINT "La temperatura a las";hora%;" era de";

temp!(hora%);"grados."NEXT hora%

dará como resultado:

La temperatura a las 0 era de 0 grados.La temperatura a las 1 era de 0 grados.

Page 30: El lenguaje BASIC  Introducción

La temperatura a las 2 era de 0 grados.La temperatura a las 3 era de 0 grados....La temperatura a las 9 era de 20 grados....La temperatura a las 12 era de 25 grados....La temperatura a las 20 era de 23 grados.La temperatura a las 21 era de 0 grados.La temperatura a las 22 era de 0 grados.La temperatura a las 23 era de 0 grados.

Vemos que los elementos a los que no se ha asignado valor inici al son nulos

Arrays de más de una dimensión

En las secciones anteriores veíamos ejemplos de matrices con una sola dimensión (un sóloíndice o subíndice). Pero las matrices pueden contar con más dimensiones. La utilizaciónde matrices multidimensionales no es más que la extensión natural de la correspondiente aunidimensionales.

Supongamos que deseamos controlar mensualmente las temperaturas registradas durantetodo un mes. Podemos definir una matriz que dependa de dos índices: el día del mes y lahora del día. Por ejemplo:

DIM temp!(31,24) ' Matriz de temperaturas "día,hora"DIM dia%, hora%

' Ahora damos valor a cada unaFOR dia%=1 TO 31

FOR hora% = 0 TO 23PRINT "Introduzca la temperatura del

día";dia%;"a las"; hora%; "horas: ";INPUT "", temp!(dia%,hora%)

PRINT "La temperatura introducida es: ";temp!(dia%,hora%)

NEXT hora%NEXT dia%

Vemos que para dimensionar la matriz no tenemos más que utilizar:

DIM matriz(dimension1,dimension2)

o también:

DIM matriz(inferior_1 TO superior_1, infe rior_2 TO superior_2)

Y para acceder al elemento caracterizado por los subíndices i,j de la matriz no hay másque escribir la expresión matriz(i,j).

Esto es generalizable a más dimensiones.

Page 31: El lenguaje BASIC  Introducción

Paso de un array a un procedimiento

En QBasic podemos pasar un array entero a una función. Lo que tenemos que hacer esponer como argumento de la función el identificador del array seguido de () para que sereconozca como tal. Considérese este ejemplo:

DECLARE FUNCTION sumar% (m() AS INTEGER) ' Declara la funcióncuyo argumento es una matriz

' Ejemplo de paso de un array a una funciónDIM matriz(10) AS INTEGER

FOR contador% = 1 TO 10matriz(contador%) = 2*contador% ' Asigna

valores a los elementosPRINT contador%, matriz(contador%)

NEXT contador%PRINT "La suma es "; sumar(matriz())

END

FUNCTION sumar%( m() AS INTEGER ) ' El argumento es el array m()sin especificar la dimensión

suma% = 0FOR i% = 0 TO 10

suma% = suma% + m(i%)NEXT i%

sumar = suma%END

Este programa muestra los 10 elementos de un array y halla su suma. Obsérvese que en elargumento de la función sumar se especifica el array pero sin dimensiones, para que tomela dimensión del array utilizado en la llamada al procedimiento en el programa principal.

Manejo de archivos

Los archivos o ficheros brindan una forma de guardar permanentemente los datos yresultados de nuestros programas.

Es importante indicar que los ficheros no son únicamente los archivos que guardamos en eldisco duro. En QBasic algunos dispositivos del ordenador (como e l puerto serie decomunicaciones) se tratan como ficheros.

Lectura de archivos. Operaciones y funciones básicas

Para comenzar, vamos a analizar un ejemplo que lee un fichero de texto ( origen.txt) ymuestra su contenido en la pantalla:

' Lee un archivo de texto línea a líneaDIM linea AS STRING

OPEN "origen.txt" FOR INPUT AS #1 ' Abre el archivo paralectura

Page 32: El lenguaje BASIC  Introducción

PRINT "Contenido del fichero:"DO WHILE NOT EOF(1) ' Comprueba si se ha alcanzado

el fin del archivoLINE INPUT #1, linea ' Lee una línea del archivo

(hasta RC/LF: salto de línea)PRINT linea

LOOP

CLOSE #1 ' Cierra el archivoEND

Analizaremos este ejemplo poco a poc o deteniéndonos en:

Apertura del fichero para lectura: OPEN

Ahora es preciso abrir el fichero. Para ello usamos la función OPEN. Esta sentencia tiene elsiguiente formato:

OPEN nombre_archivo$ [FOR modo] AS [#]nº_archivo%

En el ejemplo usábamos:

OPEN "origen.txt" FOR INPUT AS #1

El nombre de fichero se puede indicar directamente (como en el ejemplo) o usando unavariable y se puede abrir de diversas formas. Esto se especifica con el parámetro modo. Losmodos posibles son:

INPUTespecifica que el archivo va a ser abierto para leer informaciónde forma secuencial.

OUTPUTespecifica que el archivo va a ser abierto para escribir información deforma secuencial.

RANDOMespecifica que el archivo va a ser abierto en el modo de accesoaleatorio. RANDOM es el modo de archivo predeterminado.

APPENDespecifica que el archivo va a ser abierto para añadir información desalida secuencial y coloca el puntero de archivo al final del archivo. Unainstrucción PRINT # o WRITE # añade la información al archivo.

BINARYespecifica el modo de archivo binario. En este modo, es posibleleer o escribir información en cualquier posición de byte del archi vousando instrucciones GET o PUT.

nº_archivo es un identificador que permite distinguir los distintos ficheros que se utilizan,cuando se usan varios simultáneamente.

Lectura de caracteres del fichero: LINE INPUT #

Ahora ya podemos empezar a leer el fichero. Para ello podemos utilizar la función LINE

NPUT #, que lee las líneas de texto del archivo de una en una. Se puede usar tambié n lafunción INPUT # que lee texto del archivo hasta que encuentra una coma (,).

Page 33: El lenguaje BASIC  Introducción

El formato de la instrucción INPUT # es:

[LINE] INPUT #nº_archivo, variable$

En este caso lo usamos como:

LINE INPUT #1, linea

donde linea es una variable string. Tomamos una línea de fichero, la almacenamos enlinea y el puntero del fichero se coloca al principio de la línea siguiente.

Comprobación de fin de fichero: EOF()

Cuando entramos en el bucle WHILE, la lectura se realiza hasta que se encuentre el final delfichero. La detección del final del fichero se puede llevar a cabo con la función EOF().

Esta función es de la forma:

EOF(nº_archivo)

Esta función comprueba si se ha llegado al final de nº_archivo, en cuyo caso devuelve unvalor verdadero (no 0). Si no se ha llegado al final de fichero devue lve falso (0). Por eso lousamos del siguiente modo:

DO WHILE NOT EOF(1)

o

DO UNTIL EOF(1)

Cierre del fichero: CLOSE

Una vez realizadas todas las operaciones deseadas sobre el fichero hay que cerrarlo. Esimportante no olvidar este paso pues el fichero podría corromperse. Al cerrarlo se vacíanlos buffers y se guarda el fichero en disco. Un fichero se cierra mediante la instrucció nCLOSE. Esta función tiene el siguiente formato:

CLOSE [#]nº_archivo

Aquí nº_archivo es el identificador del archivo indicado en OPEN cuando el archivo seabrió:

CLOSE #1

CLOSE sin argumentos cierra todos los archivos abiertos.

Page 34: El lenguaje BASIC  Introducción

Lectura de caracteres del fichero: INPUT$()

Esta función es muy útil para leer caracteres un nº de caracteres determinado del archivo.Su formato es:

INPUT(nº_caracteres, [#]nº_archivo)

Esta función lee desde el fichero nº_archivo el número de bytes especificado pornº_caracteres.

Por ejemplo, el siguiente programa muestra todo el contenido del fichero"origen.txt" byte a byte.

' Lee un archivo de texto carácter a carácterDIM letra AS STRING*1

OPEN "origen.txt" FOR INPUT AS #1 ' Abre el archivo paralectura

PRINT "Contenido del fichero:"DO WHILE NOT EOF(1) ' Comprueba si se ha alcanzado

el fin del archivoletra = INPUT$(1,1) ' Lee un carácter del archivoPRINT letra;

LOOP

CLOSE #1 ' Cierra el archivoEND

Escritura de archivos. Operaciones y funciones básicas

Vamos a completar ahora la parte que faltaba en la sección anterior: escribir en un fichero.Vamos a hacerlo de nuevo mediante un eje mplo. En éste, abrimos un fichero origen.txt

y lo copiamos en otro destino.txt. Además, el fichero se muestra en pantalla (las partesnuevas se han destacado en negrita).

' Ejemplo de escritura de archivosDIM linea AS STRING

OPEN "origen.txt" FOR INPUT AS #1 ' Abre el archivo origenpara lectura

OPEN "destino.txt" FOR OUTPUT AS #2 ' Abre el archivodestino para escritura

DO WHILE NOT EOF(1)LINE INPUT #1, linea ' Lee una línea del archivo

origenPRINT #2, linea ' Escribe la línea en el

archivo destinoPRINT linea ' Muestra contenido en pantalla

LOOP

CLOSE #1, #2END

Como en el caso de la lectura de archivos, analizaremos este ejemplo poco a pocodeteniéndonos en:

Page 35: El lenguaje BASIC  Introducción

Apertura del fichero para escritura: OPEN

El siguiente paso, como antes, es abrir el fichero usando OPEN. La diferencia es que ahoratenemos que abrirlo en modo escritura. Usamos el modo OUTPUT (crea el fichero, o lo vacíasi existe) porque queremos crear un fichero:

OPEN "destino.txt" FOR OUTPUT AS #2

Escritura de caracteres en el arc hivo: PRINT #

Como se puede observar en el ejemplo, la lectura del fichero se hace igual que antes, conLINE INPUT #. Para la escritura usamos la función PRINT , cuya sintaxis es:

PRINT #nº_archivo, lista_expresioens

En este caso lo usamos como:

PRINT #2, linea

De esta forma vamos escribiendo en el fichero destino.txt el contenido del ficheroorigen.txt.

Si hubiésemos escrito la anterior instrucción así:

PRINT #2, linea;

(nótese el ; final) en el archivo destino.txt las líneas del archivo origen apare ceríanconcatenadas (es decir, no se producirían saltos de línea)

Comprobación fin de fichero

Como siempre que leemos datos de un f ichero debemos comprobar si hemos llegado alfinal. Sólo debemos comprobar si estamos al final del fichero que leemos. No tenemos quecomprobar el final del fichero en el que escribimos puesto que lo estamos creando y aún notiene final.

Cierre del fichero: CLOSE

Y, por fin, lo que nunca debemos olvidar al trabajar con ficheros: cerrarlos. Debemos cerrartanto los ficheros que leemos como aquellos sobre los que escribimos.

CLOSE #1, #2

Obsérvese que cerramos ambos archivos con una única instrucción.

Page 36: El lenguaje BASIC  Introducción

Otras funciones para el manejo de ficheros

WRITE

Esta sentencia es muy similar a PRINT #, de hecho, la sintaxis es idéntica:

WRITE #nº_archivo, lista_expresioens

Sin embargo, WRITE inserta comas (,) entre los datos y comillas (") alrededor de cadenas detexto. Para notar la diferencia considérese el sig uiente ejemplo:

OPEN "destino.txt" FOR OUTPUT AS #1

PRINT #1, 1, 2, "Tecnología"

WRITE #1, 1, 2, "Tecnología"

CLOSE #1

Como resultado, en el archivo "destino.txt" se escribirá:

1 2 Tecnología1,2,"Tecnología"

GET y PUT

GET lee información de un archivo colocándola en un buffer de acceso aleatorio o en unavariable.PUT escribe una variable o un buffer de acceso aleatorio en un archivo.

La sintaxis es:

GET [#]numarchivo%[,[numregistro&][,variable]]PUT [#]numarchivo%[,[numregistro&][,variable]]

numarchivo% es el número de un archivo abierto. numregistro&: para archivos de acceso aleatorio, es el número del regi stro que

será leído o escrito. Para archivos binarios la posición de byte donde se inicia elproceso de leer o escribir.

variable Para GET, es una variable utilizada para recibir información del archivo.Para PUT, una variable que contiene la información de salida que ser escrita en elarchivo. La variable generalmente tiene el tipo de datos definido por el usuario.

Por ejemplo:

TYPE RegistroPrueba ' Define un tipo de datos conun texto de 20 caracteres y un número de precisión simple

Alumno AS STRING * 20

Page 37: El lenguaje BASIC  Introducción

Nota AS SINGLEEND TYPEDIM MiClase AS RegistroPrueba ' Declara una variable edl tipo

anterior

OPEN "FINAL.DAT" FOR RANDOM AS #1 LEN = LEN(MiClase)

MiClase.Alumno = "Pérez Ruiz"MiClase.Nota = 9PUT #1, 1, MiClaseCLOSE #1

OPEN "FINAL.DAT" FOR RANDOM AS #1 LEN = LEN(MiClase)GET #1, 1, MiClasePRINT "Estudiante:"; MiClase.AlumnoPRINT "Nota:"; MiClase.NotaCLOSE #1

Este programa produce la salida:

Estudiante: Pérez RuizNota: 9

Posicionamiento en el fichero: LOC y SEEK

Supongamos que queremos posicionarnos en un byte concreto de un archivo para leer oescribir en dicha posición. La función LOC devuelve la posición actual del puntero delarchivo identificado por nº_archivo. Su sintaxis es:

LOC(nº_archivo%)

La instrucción SEEK establece la posición del archivo para la siguiente acción de lectura oescritura:

SEEK [#]nº_archivo%, posición&

numarchivo% es el número de un archivo abierto. posición& es la posición donde ocurrirá la siguiente acción de leer o escribir. Para

archivos de acceso aleatorio, un número de registro. Para otros archivos, la posiciónde byte con relación al principio del archivo. El primer byte ocupa la posición 1.

OPEN "prueba.txt" FOR RANDOM AS #1

FOR i% = 1 TO 10PUT #1, , i%

NEXT i%

SEEK #1, 2 ' Se posiciona en el segundo registroGET #1, , i% ' Lee el registro donde se halla posicionadoPRINT "Datos: "; i%; " Registro actual : "; LOC(1)

Este programa escribe secuencialmente 10 registros con los enteros entre 1 y 10, seposiciona en el segundo registro y lo lee; proporciona la salida :

Datos: 2 Registro actual: 2

Page 38: El lenguaje BASIC  Introducción

Manejo de los puertos hardware y acceso amemoria

Introducción

Para intercambiar información con dispositivos exteriores, el computador utiliza los puertosde entrada y salida (E/S). Estos puertos se caracterizan por la dirección que tienen asignadaen el mapa de memoria, y es posible la comunicación con los mismos enviando orecogiendo bytes a/en dicha dirección. Así, nos centraremos ahora en las funciones deacceso a los puertos hardware que proporciona Qbasic.

Al igual que en determinadas circunstancias es preciso comunicarse con dispositivosexternos, también es necesario intercamb iar información con el propio PC. Ello se realizacon frecuencia leyendo y escribiendo valores en/a determinadas posiciones de la memoriadel mismo. Por ejemplo, podemos conocer el estado en el que se encuentra el teclado delPC sin más que acceder al valo r almacenado en el segmento 0x40, offset 0x17 de lamemoria. Con él podemos discernir si la tecla "bloq mayús" está pulsada o no, si la tecla"Alt" está pulsada o no, etc. Asimismo, podemos recoger información del hardwareactualmente instalado en el PC y, entre otras cosas, determinar en qué direcciones de E/S sehallan los puertos hardware mencionados en el párrafo anterior. Así existen en QBasicalgunas funciones que proporcionan acceso a la memoria.

Acceso a los puertos hardware

Lectura del puerto

Para recoger información procedente de un puerto hardware (lectura del puerto), Qbasicproporciona la funciñon INP. Esta función devuelve un byte leído del puerto ( hardware) deE/S.

Esta función se utiliza de la siguiente manera:

valor% = INP(puerto_dir)

donde:

puerto_dir es la dirección (valor entero: 0-65.535) que identifica el puerto hardware de lacual se quiere leer y valor% y es una variable entera en la que se almacena el byte leído (0 -255).

En el siguiente ejemplo vamos a obtener un byte del puerto paralelo (bidireccional )instalado en el PC (en la dirección de E/S 378h): %

' Lee un byte del puerto paralelo

Page 39: El lenguaje BASIC  Introducción

DIM valor AS INTEGERDIM puerto AS INTEGER: puerto = &H378 ' dirección del puerto

paralelo

valor = INP(puerto)PRINT "El byte leído del puerto "; puerto; " es "; va lor

END

Escritura en el puerto

Para enviar información a un puerto hardware ( escritura en el puerto), Qbasic proporcionala función OUT. Esta función envía un byte a un puerto (hardware) de E/S.

La sintaxis de la función es:

OUT puerto_dir%, valor%

donde:

puerto_dir es la dirección del puerto hardware en la cual se quiere escribir (unentero: 0-65.535);

valor es el byte (0-255) que se envía al puerto.

En el siguiente ejemplo vamos a enviar la letra C al primer puerto paralelo bidireccionalinstalado en el PC (en la dirección de E/S 378h):

' Envía un carácter al puerto paraleloDIM valor AS INTEGRDIM puerto AS INTEGER: puerto = &H 378 ' dirección del puerto

paralelo

valor = ASC("C") ' valor contiene el código ASCII de laletra C (el entero: 67)

OUT puerto, valorPRINT "Valor "; valor; " enviado al puerto "; puerto

END

Acceso a la memoria

Lectura de la memoria

Para leer la información almacenada en la memoria, QBasic proporciona la función PEEK.Ésta devuelve el valor de byte almacenado en la posición d e memoria designada porsegmento:offset (direccionamiento segmentado de la memoria).

Esta función se declaran de la siguiente manera:

valor% = PEEK(dirección%)

Page 40: El lenguaje BASIC  Introducción

donde:

dirección es la posición de memoria relativa a la dirección del segmento actual,establecida por DEF SEG (dirección es un entero: 0-65.535)

valor es el byte (0-255) que se lee de la memoria.

NOTA: DEF SEG establece el segmento de memoria sobre el que se realizará la operaciónde lectura (un valor entre 0 y 65.535). Por ejemplo DEF SEG = 0.

Como ejemplo, veamos cómo se determina cuántos puertos paralelo se hallan instalados enun PC, y qué direcciones de E/S tienen asignadas. Para ello, es preciso leer en la posiciónde memoria 408h una tabla de 3 palabras de 16 bits (2 bytes) que contienen las direccionesde los puertos paralelo presentes en el sistema:

' Determina los puertos paralelo instalados en el PC y susdirecciones

DEF SEG = 0 ' selecciona el segmento de memoria 0

FOR puerto% = 0 TO 2 ' número de puerto paralelo: 0 (LPT1),1 (LPT2), 2 (LPT3)

' dirección del puertodir% = PEEK(&H408 + puerto% * 2) + 256 * PEEK(&H408 +

puerto% * 2 + 1)IF dir% = 0 THEN

PRINT "No hay puerto asignado a LPT"; puerto% +1

ELSEPRINT "La direcci¢n de LPT"; puerto% + 1; " es

"; dir%END IF

NEXT puerto%END

Escritura en la memoria

Para almacenar un dato en la posición de memoria designada por segmento:offset,QBasic proporciona la función POKE. Ésta almacena un carácter (1 byte).

La sintaxis de la función es:

POKE dirección%, valor%

donde:

dirección es la posición de memoria relativa a la dirección del segmento actual,establecida por DEF SEG (dirección es un entero: 0-65.535)

valor es el byte (0-255) que se desea escribir en la dirección de memoriaespecificada.

Como ejemplo, veamos cómo se fuerza por software la activación de "Bloq Mayús". Paraello hay que cambiar el bit 6 de la posición 417h, lugar de las variables de la BIOS donderesiden los banderines de estado del teclado:

' Cambia el estado de Bloq Mayús

Page 41: El lenguaje BASIC  Introducción

DEF SEG = 0

Estado% = PEEK(&H417) ' Lee el estado del tecladoPOKE &H417, (Estado% XOR &H40) ' Cambia el estado del Bloq

Mayús, bit 6END

Estilo de programación

Trataremos de dar unas breves indicaciones acerca de cuál es la forma más correcta deprogramar. Qué aspecto dar al código fuente para que sea más legible y elegante, cómodistribuir el código fuente, etc

Aspecto del código

Obsérvese el siguiente código:

DIM cadena AS STRING, i AS INTEGERPRINT "Introduce una cadena:"; : INPUT "", cadena$:FOR i%=1 TO LEN(cadena)PRINT MID$(cadena, i%, 1)NEXT i%END

Ahora compárese con este otro:

' Muestra uno a uno los caracteres de una cadenaDIM cadena AS STRING, i AS INTEGERR

PRINT "Introduce una cadena:";INPUT "", cadena

FOR i=1 TO LEN(cadena)PRINT MID$(cadena, i, 1)

NEXT iEND

Parece claro que la segunda es más conveniente. Desde luego no es la única forma, ni lamás correcta; es, simplemente, un estilo. Cada uno tiene su esti lo personal, aunqueconviene que tampoco sea 'muy personal', si es para compartirlo. El tabular la escritura delcódigo lo hace más legible y fácil de mantener.

Page 42: El lenguaje BASIC  Introducción

Los comentarios

El código fuente debe estar bien documentado, de tal forma que si se lo pa samos a otrapersona pueda entenderlo sin grandes dificultades. Quizá se piense: "mi código es mío ynunca se lo voy a dejar a nadie, así que para que voy a comentarlo". Parece lógico, peroimagínese que se abandona temporalmente y en el futuro se quiere r etocar el programa. Esmuy probable el olvido de por qué se hizo tal o cual cosa, (pasa muy a menudo) y espreciso gastar un montón de tiempo descifrando algo que en su día estaba entendidoperfectamente.

Aquí está un ejemplo de un programa mal comentado:

' Empiezo el programa

DIM cadena AS STRING, i AS INTEGER ' declaro una variablellamada cadena y otra llamada i

PRINT "Introduce una cadena: " ' Imprimo el mensaje'Introduce una cadena'

INPUT "", cadena ' Pregunto por el valor de cadena

FOR i=1 TO LEN(cadena) ' Hago un bucle repetitivoPRINT MID$(cadena, i, 1)

NEXT i ' Cierro el bucle

END ' Termino el programa

Estos comentarios están bien si el código forma parte de algún curso, pero no de unprograma de uso habitual. Todo el mundo (q ue lleva un poco de tiempo programando enBASIC) sabe que con FOR se realiza un bucle repetitivo y que con END se finaliza elprograma.

Los comentarios deben decirnos qué es lo que hace el programa, para qué sirven lasvariables y explicar las partes críti cas o confusas del programas. Algo mas correcto sería:

' EJEMPLO.BAS' Programa ejemplo creado para el curso de BASIC (QBasic 1.1)' Víctor R. González, 2/02/2002

DIM cadena AS STRING, i as INTEGER ' En <cadena> sealmacenará el texto introducido

' <i> será el contadorde caracteres de <cadena>

PRINT "Introduce una cadena: "INPUT "", cadena

FOR i=1 TO LEN(cadena) ' Muestra cada carácterhasta la longitud de la cadena

PRINT MID$(cadena, i, 1)NEXT i

END

Este programa es tan sencillo que no tiene puntos oscuros para comentar.

Es importante indicar para qué se van a usar las variables. Cuando tengamos muchas y paseel tiempo es difícil descifrar para que era cada una.

Page 43: El lenguaje BASIC  Introducción

Los nombres de las variables

Cuando hacemos un programa con prisas o por no pensar mucho damos a las variablescualquier nombre. Supongamos un programa con una sección de declaración de variablescomo la que sigue:

DIM i%, j%, k%DIM x1#, x2#, x3#, x4#DIM a$, b$' ... muchas más variables

¿Cómo podemos acordarnos al cabo de un tiempo de qué era cada variable?. Por eso esconveniente que aparte de indicar para qué sirve cada variable les demos nombresdescriptivos:

DIM cuenta.x%, cuenta.y%, cuenta.z% ' Nº de posiciones x, y,z

DIM x.minimo#, x.maximo#DIM y.minimo#, y.maximo# ' Esquinas del

rectánguloDIM tecla.inicio$, tecla.fin$ ' Pulsaciones de

comienzo y fin' ... etc

2002 Víctor R. González