Manual Basico Lenguaje BASIC
-
Upload
fernando-castano -
Category
Documents
-
view
478 -
download
12
Transcript of Manual Basico Lenguaje BASIC
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 1/48
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 uncampo 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 S ymbolic I nstructionC ode: 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 delos sesenta por los profesores John G. Kemeny y Thomas E. Kurtz en el Dartmouth College, enCalifornia. Su código se basa en el vocabulario inglés y en las expresiones matemáticas. Consta decientos 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 parafuncionar (por ejemplo, GW-BASIC y QBasic). Los compilados, convierten el código fuente en unarchivo objeto y éste en un archivo ejecutable. Este es el caso del lenguaje C y de las versiones máscompletas y recientes del BASIC.
Existen muchas versiones (implementaciones) del lenguaje BASIC. En el esquema siguiente se puede observar la evolución del desarrollo de los diferentes lenguajes de programación y, entreellos, 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 deFORmulas matemáticas
1956 COBOL Compilador
1958 ALGOL 58
1960 LISPIntérprete orientado a la Inteligencia Artificial
1961 FORTRAN IV IBMsistema de TRAducción deFORmulas matemáticas
1961 COBOL 61 Extendido
1960 ALGOL 60 Revisado
1964 PASCAL Niklaus Wirth programación estructurada
1964 BASICUniversidad deDartmouth(california)
Beginners All Purpose SymbolicInstruction Code
1
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 2/48
1965 SNOBOL
1965 APL sólo anotación
1965 COBOL 65
1966 PL/I
1966 FORTRAN 66 IBMsistema 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 IBMsistema 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 la Inteligencia Artificial
1982 ADAMinisterio deDefensa de los
EE.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
1991 QBasic 1.0 Microsoft®para MS-DOS 5.0. Compatible 99.9%con QuickBasic
1993 XMLC. 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
2
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 3/48
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 los
EE.UU
lenguaje muy seguro
1995 FORTRAN 95 IBMsistema 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 forma compilada.Tiene varios predecesores. El primero fue BasicA, desarrollado por Microsoft a principios de los80. 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 los 80 conalgunas mejoras:
• los archivos fuente se guardaban en un formato de texto regular, legibles por otros programas
• 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 Microsoft en 1987crea una actualización de Basic denominada QuickBasic, con las siguientes ventajas:
• 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
Microsoft incluyó con el sistema operativo MS-DOS 5.0 una versión reducida de QuickBasicdenominada QBasic 1.0. Esta versión y su actualización posterior, 1.1, se utilizaban sólo de forma
interpretada pero sus posibilidades eran todavía bastante amplias. En lo que resta nos referiremosespecíficamente a la implementación de BASIC denominada QBasic por su versatilidad y sencillezde uso.
3
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 4/48
La mejor forma de aprender un lenguaje es programando con él. El programa más sencillo que se puede escribir en BASIC es el siguiente:
Como podemos imaginar, este programa sin una sola instrucción no hace nada, pero se interpreta
correctamente y nos da una idea de que no se necesita mucho para empezar a programar en BASIC.Esto no es cierto en otros lenguajes como C, en los que hay que utilizar obligatoriamenteencabezados 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 lenguaje 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 cadena decaracteres limitados por dobles comillas " " y la imprime en la salida habitual, que generalmente esla pantalla del PC en el que trabajamos.
La instrucción END termina el programa. Ni siquiera es obligatorio finalizar con END, aunque esconveniente por una cuestión de claridad. De cualquier manera, si extraemos esa sentencia, el
programa funcionará exactamente igual (el programa finaliza automáticamente cuando no seencuentran 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, variosmeses atrás. Para el intérprete o el compilador, los comentarios son inexistentes, por lo que nogeneran líneas de código ejecutable, permitiendo abundar en ellos tanto como se desee. En ellenguaje BASIC se toma como comentario todo carácter que sigue a la comilla simple: ' o a la
palabra clave REM.
Como se observa, un programa en QBasic es simplemente un fichero de caracteres que contiene unconjunto de instrucciones que un programa especial, el intérprete, se encarga de transformar en uncódigo que la computadora puede ejecutar (aunque no se genera un archivo .EXE).
Antes de continuar hagamos un inciso sobre la nomenclatura utilizada en QBasic para designar adistintos elementos del lenguaje:
4
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 5/48
Elemento Definición
SentenciaInstrucción(Comando)
Es una instrucción que realiza una operación. Se utilizan estas palabras de formaintercambiable. Se usa mucho la forma comando debido a su utilización eninglés.
Palabra clave Keyword
Una palabra que forma parte del lenguaje QBasic. Cuando se utiliza una palabra
clave en una sentencia, QBasic automáticamente la convierte a mayúsculas. Nose puede utilizar una palabra clave para dar nombre a una constante o variable(palabra reservada).
CadenaString
Una cadena de texto (caracteres). En Qbasic se delimita con comillas, por ejemplo, "Bienvenido". La cadena "" (vacía) es válida.
NúmeroDesigna a números enteros, decimales de precisión simple y decimales de
precisión doble.
Constante
Un valor (cadena o número) que no cambia a lo largo de la ejecución del programa. Hay dos clases de constantes; las constantes literales están escritasdirectamente en el código: "Hola", 16; las constantes simbólicas o con nombre
son valores constantes a los que se les asigna un nombre. Por ejemplo,LONG_MAX en lugar de 16. Las constantes simbólicas se definen usando la palabra clave CONST.
VariableUn contenedor con nombre para un número o una cadena. Son el medio para queel programa "recuerde" datos. Se pueden crear variables de varias maneras:calculando un valor, tomando una entrada de usuario, leyendo un archivo, etc.
Operador Designa una operación matemática. Los operadores pueden ser aritméticos,relacionales o lógicos.
FunciónDevuelve una cadena o un número. Puede tomar uno o más parámetros deentrada para calcular el resultado.
Comentario No hace nada en el programa. Se utiliza como una nota explicativa quecontribuye a clarificar el código y a recordar más tarde lo que se hizo.
BloqueDesigna a un conjunto de líneas dentro de la estructura del programa, queguardan 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 y devarios subprogramas y/o funciones:
' Programa principal
declaración de funciones y subprogramasdeclaración de variablessentencias
ENDSUB Subprograma1 ( )
declaración de variablessentencias
END SUBFUNCTION Funcion1 ( )
declaración de variablessentencias
5
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 6/48
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 varias partes,incluyendo cada parte en un fichero separado. Normalmente colocaremos en cada fichero todas las
subrutinas y funciones que se encarguen de una tarea del programa. Por tanto, un programa enQBasic puede estar formado por diferentes módulos o fuentes. Es conveniente mantener los fuentesde un tamaño no muy grande -para encadenar la ejecución de los diferentes módulos se utiliza lainstrucción CHAIN (CHAIN nombre.archivo$-.
Introducción
Si se deseara imprimir los resultados de multiplicar un número fijo por otro que adopta valores entre0 y 9, la forma normal de programar esto sería crear una constante para el primer número y un par de variables para el segundo y para el resultado del producto. Una variable no es más que un
nombre para identificar una (o varias) posiciones de memoria donde el programa guarda losdistintos valores de una misma entidad . En un programa BASIC es conveniente definir todas lasvariables que se utilizarán antes de comenzar a usarlas, a fin de indicarle al intérprete o compilador de que tipo serán y, por tanto, cuánta memoria debe destinar para albergar a cada una de ellas,aunque en QBasic no es obligatorio. Veamos un ejemplo:
' Multiplica dos números enteros
DIM multiplicador AS INTEGER ' defino <multiplicador> como un enteroDIM resultado AS INTEGER ' defino <resultado> como un entero
multiplicador = 1000 ' asigno valores
resultado = 2 * multiplicador
PRINT "Resultado = ", resultado ' muestro el resultadoEND
Así, una variable es un lugar donde se puede almacenar temporalmente un dato. En BASIC lasvariables tienen un nombre que las identifica, y sirve para hacer referencia a ellas. También tienenun tipo, que es el tipo de datos que puede almacenar. El valor de las variables es, como su propionombre indica, variable. Podemos alterar su valor en cualquier punto del programa.
6
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 7/48
Identificadores, tipos y tamaños
Para dar un nombre a una variable tenemos que usar un identificador. La longitud de unidentificador puede variar entre uno y varios caracteres, por lo general, 40. En la mayoría de loscasos el primer carácter debe ser una letra. A continuación se muestran varios ejemplos de nombresde identificadores 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), de modo que para el intérprete es lo mismo el identificador cuenta que otro denominado Cuenta.
Los intérpretes y compiladores reservan determinados términos ó palabras claves (keywords), parael uso sintáctico del lenguaje, tales como: CLS, PRINT, END, etc. y no se pueden utilizarla ennombres de variables.
Para crear una variable en un lugar determinado del un programa escribiremos primero el tipo devariable y luego el identificador con el que queremos nombrar la variable. A esto se le denominadefinir 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úmero enteroDIM numero% ' crea la variable numero, de tipo número entero
DIM frase AS STRING ' crea la variable frase, de tipo cadenaDIM 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 inicializar (es decir, establecer un valor inicial) en el
momento de creación. Por ejemplo, es incorrecto: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 de lasmismas.
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
7
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 8/48
• números en coma flotante
TipoSufijo
Tamaño Intervalo Descripción
STRING $conjunto decaracteres(de 8 bits)
0 a 32 767 caracteres
Las variables string
son lasque almacenantexto.Ejemplos: "¿Quéestás haciendo?","Alpha Sigma Pi",
"323"(esto no es unnúmero porque sedelimita con
comillas).
INTEGER
% 16 bits -32 768 a 32 767
Las variablesenteras almacenannúmeros enteros(sin parte decimal).Ejemplos: 4323, 1,-7543, 30000 (no se utilizanseparadores demillares).
LONG & 32 bits -2 147 483 648 a 2 147 483 647Almacenan tambiénenteros.Ejemplos: 54500, 0,123456789.
SINGLE ! 32 bits3.4 E-38 a 3.4E+38
(aprox. 6 dígitos de precisión)
Las variables de precisión simplealmacenan númerosde coma flotantecon 6 dígitos de
precisión.Ejemplos: 123.456,
12300000000000, .0000000000000008.
DOUBLE # 64 bits 1.7 E-308 a 1.7 E+308(aprox. 12 dígitos de precisión)
Las variables de precisión doblealmacenan númerosde coma flotantecon 12 dígitos de
precisión.Ejemplos:
10000000000000000000000000000000
8
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 9/48
000000000000, .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 la segundamediante una expresión aritmética. En la instrucción PRINT, el ; indica que se concatenen losvalores a mostrar.
En Qbasic no es obligatorio definir el tipo de datos de una variable antes de utilizarla, aunque si esconveniente. 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 las variables. Estofacilita bastante la tarea de programar, sobre todo a usuarios inexpertos, aunque no es lo máseficiente.
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 puede poner un valor string en una variable numérica y viceversa. La palabra clave LET es opcional. En lamayor parte de los usos se prescinde de LET y de deja sólo variable = expresión (es más claro
9
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 10/48
y sencillo). Si se intenta poner un valor decimal en una variable entera 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 un programa
en los que podemos utilizar una determinada variable. Distinguiremos así dos tipos principales devariables:
• globales • locales
Una variable es global cuando es accesible desde todo el programa, y es local cuando solo puedeacceder a ella la función que la creó.
Variable Global Variable Local' Muestra un número entero
DIM SHARED x1%x1% = 100
MuestraENDSUB Muestra
PRINT x1%END SUB
' Muestra un número entero
DIM 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, accesible en todo elcódigo (todos los subprogramas) del módulo. Por el contrario, x2 es local y sólo se conserva suvalor en el programa principal, no siendo accesible desde los subprogramas.
Otro ejemplo:
Variable Global Variable Local
10
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 11/48
' Muestra un número enteroValorPRINT 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 ejecutar el programa es en el primer caso:
100
mientras que en el segundo:
0
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 realizar mediantevarias instrucciones de QBasic. Las fundamentales son:
• INPUT
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 usoen sencillo, sólo hay que añadir detrás de la palabra clave la lista de datos que se desea visualizar.Por ejemplo:
' Muestra un mensaje
PRINT "Hola"PRINT "mundo"
11
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 12/48
END
El resultado es:
Holamundo
Nótese que PRINT imprime un salto de línea tras el texto. Se puede inhibir el salto automático delí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
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 un espacioen 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:
12
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 13/48
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 ellocontamos 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ón añadida) yespera a que el usuario introduzca un entero. Si el usuario escribe 23 y pulsa INTRO lo que seobserva 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%
PRINT "Has tecleado los números"; a%; b%; c%END
De esta forma, cuando el usuario ejecuta el programa debe introducir los tres datos separados 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 los dosejemplos 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%
13
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 14/48
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 longitud máxima dedicha cadena en la instrucción DIM:
DIM palabra AS STRING*5 ' Define palabra como una cadena de texto' de una longitud máxima de 6 caracteres
...
...
en este caso el resultado es:
Escribe una palabra: TecnologíaHe guardado: Tecno
PRINT USING
Esta instrucción es similar a PRINT pero es capaz de dar un formato especificado de salida a losdatos. La sintaxis de uso es:
PRINT USING formato; lista_de_expresiones
donde formato es una cadena de texto que contiene distintos especificadores que aplican formato ala lista_de_expresiones . Esta lista no es más que un conjunto de expresiones numéricas o detexto concatenadas con ; o ,.
Los especificadores que se pueden utilizar en formato son:
Caracteres que dan formato a una expresión numérica
14
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 15/48
# Posición de dígito. ¦ - Después deldígito, imprime. Posición de punto decimal. ¦ el signo 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. ¦ ** Llena espaciosadelante 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 elde la cadena. ¦ número de
espacios entre
Caracteres utilizados para imprimir caracteres literales
_ Imprime el carácter de formato ¦ Cualquiercarácter que nosiguiente 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:
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
15
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 16/48
LINE INPUT
Esta instrucción es sumamente similar a INPUT, si bien almacena en una sola variable toda laentrada proporcionada desde teclado hasta encontrar un retorno de carro y no considera las comas(,) separadores de variables (como sucedía con INPUT).
Por ejemplo:' Lee una cadena de caracteres desde el teclado
DIM 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 • CLS : borrado de la pantalla
LOCATE: posicionado del cursor
Hemos visto que cuando usamos PRINT se escribe en la posición actual del cursor y se mueve ésteal final de la cadena que hemos escrito. Pero ¿qué sucede cuando queremos escribir en una posicióndeterminada de la pantalla?. La solución está en la función LOCATE. Supongamos que queremosescribir '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 superior izquierda esla posición (1, 1).
CLS
16
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 17/48
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 la esquinasuperior izquierda.
' Borra pantalla y muestra mensaje
CLSPRINT "Hola"
END
Introducción
Los subprogramas y funciones son rutinas, procedimientos o conjuntos de sentencias que realizanuna labor específica. Los subprogramas o subrutinas nacieron de la necesidad de no repetir innecesariamente un trabajo ya hecho. Pueden invocarse desde el cuerpo del programa principalcuantas veces se desee. Están en el núcleo de lo que se denomina programación estructurada.
En QBasic existen dos clases de subrutinas o procedimientos:
• los subprogramas propiamente dichos (procedimientos SUB), que realizan un conjunto detareas y no devuelven ningún valor.
• las funciones (procedimientos FUNCTION), que devuelven un valor de un tipo que se puedeespecificar.
Los subprogramas y las funciones admiten parámetros (argumentos), que son datos que le pasan 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 datos que 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:
' Ejemplo de uso de un subprograma
holaEND
' Subprograma que muestra un mensaje de bienvenidaSUB hola
17
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 18/48
PRINT "Hola"
END SUB
que simplemente es una función que cuando es llamada imprime en pantalla un mensaje de saludo.Cuando el programa al ejecutarse alcanza el cierre del procedimiento (END SUB), éste finaliza ydevuelve 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 el tipo dedatos que devlelve la función.- lista_de_parámetros es una lista de variables, separadas por comas, que conforman los datos que le
pasamos a la función.- nombre_de_la_función = expresión es una sentencia que produce que la función retorne el valor determinado por e xpresión.- bloque_de_código es un conjunto de sentencias.
El tipo es opcional. La lista de argumentos es también opcional. Podemos escribir como ejemplo:
' 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), éste finalizay devuelve un valor de tipo entero al programa que lo llamó.
Retorno de valores
18
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 19/48
Cuando la función finaliza hemos dicho que se devuelve un valor. Para obligar a la función aretornar 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 tipo de datosde los llamados escalares. Los tipos de datos escalares son los tipos numéricos y el tipo string . EnQBASIC 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 se suelecolocar un conjunto de identificadores, separados por comas, que representan cada uno de ellos auno de los parámetros de la función. Obsérvese que el orden de los parámetros es importante. Parallamar a la función habrá que colocar los parámetros en el orden en que la función los espera.
Cada parámetro puede tener un tipo diferente. Para declarar el tipo de los parámetros añadiremos sutipo 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 una función:
• por referencia, o• por valor
Cuando la variable se pasa por referencia, la función puede acceder a la variable original. Esteenfoque es habitual en lenguajes como el BASIC. (En C, sin embargo, todos los parámetros se
pasan por valor. La función recibe una copia de los parámetros y variables, y no puede acceder a lasvariables originales. Cualquier modificación que efectuemos sobre un parámetro no se refleja en lavariable original. Esto hace que no podamos alterar el valor de la variable por equivocación.)
Por ejemplo, el programa:' Imprime valores
19
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 20/48
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 al procedimientoimprime.
Declaración y comprobación de tipos
Al igual que para las variables, cuando un procedimiento (función o subprograma) se va a usar enun programa, o cuando un procedimiento se define en otro fichero (procedimiento externo), se debedeclarar antes del lugar donde se define. La declaración de un procedimiento consiste en especificar el tipo de datos que va a retornar, cuando se trata de una función, y el número de argumentos y sutipo. 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 argumentos antes presentada en que el tipo decada argumento se coloca dentro de la lista, tras de su correspondiente identificador, comohací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 un carácter.
NOTA:DECLARE es requerido si se hace una llamada a un procedimiento FUNCTION o a uno SUB sin CALL
20
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 21/48
(véanse los ejemplos). QBasic generara automáticamente instrucciones DECLARE cuando seguarda un programa.
La lista de argumentos permite al intérprete/compilador hacer comprobación de tipos, ya que el tipoy numero de argumentos debe coincidir en la declaración, definición y llamada a una 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 STRING)
PRINT numero, letra
imprime$ = letra
END FUNCTION
Ejemplos
Subprograma sin argumentos (no devuelve nada)
Este programa llama a la función BorraPantalla que despeja la pantalla mediante la orden CLS
(clear screen) y muestra el mensaje "la pantalla está limpia". Por supuesto, es de nula utilidad perosirve para empezar.
DECLARE SUB BorraPantalla ()
' LLamada a un subprograma sin argumentosBorraPantalla ' Llamamos al subprograma
' También podríamos escribir: CALL BorraPantallaEND
SUB BorraPantalla
CLSPRINT "La pantalla está limpia"
END SUB Subprograma con argumentos (no devuelve nada)
21
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 22/48
En este ejemplo la función compara toma dos números, los compara y nos dice cuál es mayor.
DECLARE SUB compara (a AS INTEGER, b AS INTEGER)
' Compara númerosDIM num1 AS INTEGER, num2 AS INTEGER
INPUT "Introduzca dos números: ", num1, num2
compara num1, num2 ' Llamamos al subprogramas con sus dos argumentos' También podríamos escribir: CALL compara(num1,
num2)END
SUB compara (a AS INTEGER, b AS INTEGER) ' Pasamos los parámetros a y b a lafunción
IF a > b THENPRINT a; " es mayor que "; b
ELSE
PRINT b; " es mayor que "; aEND IF
END SUB
Función con argumentos (devuelve un valor)
Este ejemplo es como el anterior pero devuelve como resultado el mayor de los dos números.
DECLARE FUNCTION compara% (a AS INTEGER, b AS INTEGER)
' Compara númerosDIM num1 AS INTEGER, num2 AS INTEGER
DIM resultado AS INTEGER
INPUT "Introduzca dos números: ", num1, num2
resultado = compara(num1, num2) ' Almacenamos en resultado el valorque devuelve la función
PRINT "El mayor de los dos es "; resultado
END
FUNCTION compara% (a AS INTEGER, b AS INTEGER) ' Pasamos los parámetros a y ba 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.
22
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 23/48
Introducción
Las expresiones son sentencias que tras realizar una determinada acción devuelven un resultado.Consideraremos a continuación dos tipos fundamentales de expresiones:
• la asignación• las que utilizan operadores
Asignación
El primer tipo a considerar dada su importancia es la asignación. La sintaxis de una asignación es:
[LET] variable = expresión
expresión es una expresión del mismo tipo que la variable -- número o string . No se puede poner unvalor string en una variable numérica y viceversa. La palabra clave LET es opcional. En la mayor
parte de los usos se prescinde de LET y de deja sólo variable = expresión (es más claro ysencillo). Si se intenta poner un valor decimal en una variable entera 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#
Operadores
El segundo tipo de expresiones son los operadores. Hay varios tipos de operadores:
• aritméticos• relacionales y lógicos• de manipulación de bits
Operadores aritméticos
Los cuales realizan las operaciones aritméticas básicas. Estas expresiones tienen como sintaxis:
num1 operador num2
Los operadores aritméticos son:
23
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 24/48
+ adición, operador de suma- substracción, operador de diferencia* multiplicación/ división\ división entera (redondea la división al entero inferior más próximo)MOD resto de la división (operador módulo)
Por ejemplo:
i% = a% + 1j = b * 4 + 10 / 2
Operadores de comparación (relacionales) y lógicos
Los relacionales son:
< menor que> mayor que<= menor o igual que>= mayor o igual que= igual que<> distinto de
Los lógicos son:
AND YOR ONOT NO
La sintaxis para estas expresiones es:
expresión1 operador expresión2
El valor que devuelve es de tipo entero: devuelve un 0 si el resultado de la comparación es falso yun -1 (no cero) si el resultado de la comparación es verdadero. Cuando lo que comparamos son
caracteres, se compara realmente su código ASCII.
Por ejemplo:
1 > 2 devuelve 0 (falso)1 = 1 devuelve -1 (verdadero)"a" < "b" devuelve -1 (verdadero)(1 > 2) OR (1 = 1) devuelve -1 (verdadero)NOT (1 = 1) devuelve 0 falso
Por supuesto, expresión1 y expresión 2 pueden contener variables, no sólo valores literales.
24
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 25/48
Operadores de manipulación de bits
Los operadores Booleanos realizan un manejo de bits, es decir, operaciones Booleanas. Generan unvalor verdadero (no cero) o falso (cero) que puede ser utilizado al tomar una decisión.
Para el manejo de dichos bits, contamos con los operadores descritos en la siguiente tabla .
AND Y (bit a bit)OR O inclusivaXOR O exclusivaNOT Complemento a unoEQV EquivalenciaIMP Implicación
Estos operadores general los resultados esquematizados en la tabla siguiente ( V es verdadero -nocero- y F es falso -cero-):
expresión1
expresión2
AND OR XOR NOT EQV IMP
V V V V F V V VF F F V V F F FV V F V V F F VF F F F F F V V
Las operaciones Booleanas se realizan después de las operaciones de las aritméticas y relacionales,
en el orden de precedencia.Como los operadores Booleanos realizan cálculos bit a bit, el uso de valores que no sean 0 parafalso y -1 para verdadero puede producir resultados inesperados.Estos operadores muestran manipulan internamente, es decir bit a bit , las variables. Estosoperadores sólo se aplican a expresiones de tipo entero o entero largo, de modo que las expresionesse convierten en enteros antes de realizar una operación booleana.
Describiremos mediante unos pocos ejemplos la operatoria de manejo de bits. Analicemos primerocomo funciona el operador ANDSi suponemos tener dos variables del tipo char, una de ella de valor 85 (hex. 55 ), otra de valor 71 (hex. 47) y realizamos el Y a nivel bits de ellas, obtendremos :
bits decimal hexadecimal0 1 0 1 0 1 0 1 85 55AND AND AND0 1 0 0 0 1 1 1 71 47
------------------------- ------- -------0 1 0 0 0 1 0 1 69 45
Nótese que la operación es del tipo lógico entre bits, por lo que los resultados numéricos tienen poco ó ningún significado y sólo se han puesto con fines de ejemplo.
De la misma manera para la operación OR (O inclusiva), para las mismas variables anterioresobtendremos el resultado:
0 1 0 1 0 1 1 1 87 57
25
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 26/48
Analizando ahora la XOR (O exclusiva) tendremos, para las mismas variables anteriores:
0 0 0 1 0 0 1 0 18 12
Introducción
En Qbasic las sentencias se ejecutan sucesivamente una tras otra (secuencialmente). Esto define uncamino o dirección según la cual se va desarrollado el programa. Sin embargo, habrá momentos enque el programa deba ejecutar determinadas partes dependiendo del estado en el que se halle el
propio programa o las variables externas. Esto permitir modificar el orden de la ejecución paraadaptarse al estado del programa y bifurcar hacia nuevas subrutinas cuando se cumplan ciertascondiciones, que el programador fija de antemano. Los mecanismos en QBasic que permiten llevar esto a cabo son:
• la instrucción IF• el bucle WHILE• el bucle DO - WHILE• el bucle FOR • la instrucción EXIT
• la selección múltiple SELECT CASE
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 y sirve para bifurcar en un punto de programa. Permite al programa tomar decisiones. En su primera forma, lasentencia_1 sólo se ejecuta si el resultado de evaluar la expresión es verdadero (no cero); encaso contrario, se ejecuta sentencia_2. En la segunda forma, tenemos varias posibilidades: si alevaluar la expresión el resultado es verdadero se ejecutan las instrucciones bloque_ sentencias_1,
pero si el resultado es falso se evalúa la expresión_2 y si ésta es verdadera se ejecutabloque_sentencias_2, y así sucesivamente. En cualquier caso sólo una de los bloques desentencias se ejecuta.
Veamos algunos ejemplos:
26
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 27/48
IF num% = 1 THEN PRINT "la variable num vale 1" ELSE PRINT "lavariable num no vale 1"
Tras evaluarse la expresión IF y ejecutarse la sentencia adecuada, el programa continúa con la líneasiguiente a la de la última sentencia del IF. Para la sentencia IF vale como expresión cualquieraválida en QBasic, incluso las llamadas a funciones:
IF suma(num1, num2) >= 0 THENPRINT "La suma de num1 y num2 es positiva"
END IF
Como sentencias valen cualquier tipo de sentencia válida en QBasic, entre ellas la propia sentenciaIF. 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 THENPRINT "num es mayor que 1"
ELSEPRINT "num es menor que 1"
END IFEND IF
En este caso, si la variable num es menor o igual que cero el programa no mostrará ningún mensaje,y en caso contrario se mostrará el mensaje correspondiente a la comparación del valor con launidad.
El bucle WHILE
Un bucle es un conjunto de sentencias que se ejecutan repetidamente hasta que se alcanza unacondición de fin de bucle, o condición de salida. El bucle while es el tipo de bucle más sencillo. Ensu modo más simple se escribe:
WHILE expresión
bloque_sentenciasWEND
El bucle while comienza por evaluar la expresión. Si es cierta, se ejecuta bloque_sentencias.Entonces se vuelve a evaluar la expresión. De nuevo, si es verdadera, se vuelve a ejecutar bloque_sentencias . Este proceso continúa hasta que el resultado de evaluar la expresión esfalso. Por esto se le llama a esta expresión la condición de salida. Por ejemplo:
variable% = 10
WHILE variable% >= 1PRINT "la variable vale "; variable%
variable% = variable% -1
27
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 28/48
WEND
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 de control,como vemos en el ejemplo anterior.
El bucle DO - WHILE
La sintaxis de este bucle es:
DO [{WHILE | UNTIL} expresión]bloque_sentencias
LOOP
o también:
DO bloque_sentencias
LOOP [{WHILE | UNTIL} expresión]
Su funcionamiento es análogo el del bucle WHILE, salvo que la expresión de control se puedeevaluar al final del bucle (si se utiliza la segunda opción de sintaxis). Esto nos garantiza que el
bucle DO_WHILE se ejecuta al menos una vez. Incluye también la posibilidad de ejecutar el buclemientras (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 mismo resultado.
n% = 9
DOPRINT "número actual "; n%n% = n% -1
LOOP UNTIL n% = -1
El bucle FOR
28
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 29/48
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 de veces.Suversió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 unidad mientras queesta variable no alcance el valor 10.
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 salir fácilmente de dudas al escribir un bucle FOR, ya que seve claramente el orden de ejecución de las expresiones y sentencias dentro del bucle FOR. Como seve, en cada pasada del bucle FOR se sigue el orden: evaluación del valor del contador, ejecución debloque_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 bucle se
producen "condiciones de error". Para este tipo de salto disponemos de la sentencia EXIT.
Su sintaxis es:
EXIT {DO | FOR}
La sentencia EXIT rompe la ejecución de un bucle o bloque de instrucciones y continúa en lainstrucción que sigue al bucle o bloque. Por ejemplo:
29
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 30/48
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 siempre cierta, este bucle se acaba cuando la variable a valga 1. El bucle simplemente imprime su valor y decrementa lavariable.
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 hasta que se introduce por teclado la la pulsación S.
EXIT también se utiliza con procedimientos SUB o FUNCTION, para abandonar el procedimiento antesde 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 en el queuna variable es comparada a diferentes valores, todos ellos constantes, y que realiza acciones sicoincide con ellos. Su sintaxis 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úmero deacciones y posibilidades en una sola sentencia. El modo de funcionamiento es el siguiente:
• primero se evalúa la expresión de control.• A continuación se compara con lista_expresiones_1de la primera etiqueta CASE. Si son
iguales, se ejecuta bloque_ sentencias_1. Si no, se compara con lista_expresiones_2, yasí sucesivamente.
• Se repite el proceso hasta agotar todas las etiquetas case. Si al llegar a la etiqueta ELSE nose ha ejecutado ninguna sentencia ésta es la acción por defecto. La etiqueta ELSE esopcional. Si no la ponemos el programa simplemente salta fuera del SELCT CASE.
30
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 31/48
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
SELECT CASE numCASE 1
PRINT "Es un 1"CASE 2
PRINT "Es un 2"CASE 3
PRINT "Es un 3"
CASE ELSEPRINT "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, 2PRINT "Sin riesgo, pocas ganancias."PRINT "Seleccione plan de pensión individual."
END SELECTEND
En él observamos que en lista_expresiones se pueden utilizar las siguientes formas:
31
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 32/48
• expresión[, expresión] ...• expresión TO expresión
• IS operador_relacional expresión
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 quesabemos 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!
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. Precisamentees aquí donde son de utilidad los arrays. Vamos a repetir el programa anterior con 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 declaramos una variable lo que estamos haciendo es reservar una zona de la memoria para ella. Cuando declaramos el array de este ejemplo reservamos espacioen memoria para 24 variables de tipo SINGLE. El tamaño del array (24) lo indicamos entre
paréntesis al definirlo. Esta es la parte de la definición que dice: Un array es un conjunto de datosdel mismo tipo identificados por el mismo nombre.
32
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 33/48
La parte final de la definición dice: y se distinguen mediante el índice. En el ejemplo recorremos lamatriz mediante un bucle FOR y vamos dando valores a los distintos elementos de la matriz. Paraindicar a qué elemento nos referimos usamos un número entre paréntesis (en este caso la variablehora), 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 tiene el 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 el número total deelementos; en cambio, cuando usamos la matriz, el número entre corchetes es el índice.
Declaración de un array
La forma general de declarar un array es la siguiente:
DIM identificador_del_array[sufijo_tipo_dato](dimensión) [AS tipo_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 variables deltipo_de_dato como las indicada en dimensión.
dimensión también se puede especificar dando los límites superior e inferior de los subíndices delarray:
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 24 variables
Inicialización de un array
En QBasic se inicializan los arrays al asignar valores a cada elemento de los mismos. Es decir, por ejemplo:
33
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 34/48
temp!(9) = 20temp!(12) = 25temp!(20) = 23
Ahora el elemento 10, es decir, temp!(9), valdrá 20. El elemento 13 valdrá 25, y el elemento 21valdrá 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.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 inicial 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 osubíndice). Pero las matrices pueden contar con más dimensiones. La utilización de matricesmultidimensionales no es más que la extensión natural de la correspondiente a unidimensionales.
Supongamos que deseamos controlar mensualmente las temperaturas registradas durante todo unmes. Podemos definir una matriz que dependa de dos índices: el día del mes y la hora 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 23
34
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 35/48
PRINT "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, inferior_2 TO superior_2)
Y para acceder al elemento caracterizado por los subíndices i,j de la matriz no hay más queescribir la expresión matriz(i,j).
Esto es generalizable a más dimensiones.
Paso de un array a un procedimiento
En QBasic podemos pasar un array entero a una función. Lo que tenemos que hacer es poner comoargumento de la función el identificador del array seguido de () para que se reconozca como tal.Considérese este ejemplo:
DECLARE FUNCTION sumar% (m() AS INTEGER) ' Declara la función cuyo argumentoes 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() sinespecificar la dimensión
suma% = 0FOR i% = 0 TO 10
suma% = suma% + m(i%)NEXT i%
sumar = suma%
END
35
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 36/48
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 tome ladimensión del array utilizado en la llamada al procedimiento en el programa principal.
Los archivos o ficheros brindan una forma de guardar permanentemente los datos y resultados denuestros programas.
Es importante indicar que los ficheros no son únicamente los archivos que guardamos en el discoduro. En QBasic algunos dispositivos del ordenador (como el puerto serie de comunicaciones) setratan 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) y muestra sucontenido 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 para lectura
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 lineaLOOP
CLOSE #1 ' Cierra el archivoEND
Analizaremos este ejemplo poco a poco deteniéndonos en:
• Apertura del fichero para lectura: OPEN • Lectura de líneas del fichero: LINE INPUT # • Comprobación de fin de fichero: EOF() •
Cierre del fichero: CLOSE
y, posteriormente, nos referiremos a:
• Lectura de caracteres del fichero: INPUT$()
Apertura del fichero para lectura: OPEN
Ahora es preciso abrir el fichero. Para ello usamos la función OPEN. Esta sentencia tiene el siguienteformato:
36
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 37/48
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 una variable yse puede abrir de diversas formas. Esto se especifica con el parámetro modo . Los modos posiblesson:
INPUTespecifica que el archivo va a ser abierto para leer informaciónde forma secuencial.
OUTPUT especifica 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.
APPEND
especifica 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 archivousando instrucciones GET o PUT.
nº_archivo es un identificador que permite distinguir los distintos ficheros que se utilizan, cuandose 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 la función INPUT # quelee texto del archivo hasta que encuentra una coma (,).
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 en linea y el puntero del fichero se coloca al principio de la línea siguiente.
Comprobación de fin de fichero: EOF()
37
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 38/48
Cuando entramos en el bucle WHILE, la lectura se realiza hasta que se encuentre el final del fichero.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 un valor verdadero (no 0). Si no se ha llegado al final de fichero devuelve falso (0). Por eso lo usamos delsiguiente 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. Es importanteno olvidar este paso pues el fichero podría corromperse. Al cerrarlo se vacían los buffers y seguarda el fichero en disco. Un fichero se cierra mediante la instrucción CLOSE. Esta función tiene elsiguiente formato:
CLOSE [#]nº_archivo
Aquí nº_archivo es el identificador del archivo indicado en OPEN cuando el archivo se abrió:
CLOSE #1
CLOSE sin argumentos cierra todos los archivos abiertos.
Lectura de caracteres del fichero: INPUT$()
Esta función es muy útil para leer caracteres un nº de caracteres determinado del archivo. Suformato es:
INPUT(nº_caracteres, [#]nº_archivo)
Esta función lee desde el fichero nº_archivo el número de bytes especificado por nº_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ácter
38
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 39/48
DIM letra AS STRING*1
OPEN "origen.txt" FOR INPUT AS #1 ' Abre el archivo para lectura
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 ahacerlo de nuevo mediante un ejemplo. En éste, abrimos un fichero origen.txt y lo copiamos enotro destino.txt. Además, el fichero se muestra en pantalla (las partes nuevas se han destacado ennegrita).
' Ejemplo de escritura de archivosDIM linea AS STRING
OPEN "origen.txt" FOR INPUT AS #1 ' Abre el archivo origen paralectura
OPEN "destino.txt" FOR OUTPUT AS #2 ' Abre el archivo destino paraescritura
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 poco deteniéndonos
en:
• Apertura del fichero para escritura: OPEN • Escritura de caracteres en el fichero: PRINT # • Comprobación de fin de fichero• Cierre del fichero: CLOSE
Apertura del fichero para escritura: OPEN
39
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 40/48
El siguiente paso, como antes, es abrir el fichero usando OPEN. La diferencia es que ahora tenemosque abrirlo en modo escritura. Usamos el modo OUTPUT (crea el fichero, o lo vacía si existe) porquequeremos crear un fichero:
OPEN "destino.txt" FOR OUTPUT AS #2
Escritura de caracteres en el archivo: PRINT #
Como se puede observar en el ejemplo, la lectura del fichero se hace igual que antes, con LINE
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 fichero origen.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 aparecerían concatenadas
(es decir, no se producirían saltos de línea)
Comprobación fin de fichero
Como siempre que leemos datos de un fichero debemos comprobar si hemos llegado al final. Sólodebemos comprobar si estamos al final del fichero que leemos. No tenemos que comprobar el finaldel fichero en el que escribimos puesto que lo estamos creando y aún no tiene final.
Cierre del fichero: CLOSE
Y, por fin, lo que nunca debemos olvidar al trabajar con ficheros: cerrarlos. Debemos cerrar tantolos ficheros que leemos como aquellos sobre los que escribimos.
CLOSE #1, #2
Obsérvese que cerramos ambos archivos con una única instrucción.
40
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 41/48
Otras funciones para el manejo de ficheros
• WRITE #
• GET y PUT
• Posicionamiento en el archivo: SEEK
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 de texto.Para notar la diferencia considérese el siguiente 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 una variable.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 registro que será leído o
escrito. Para archivos binarios la posición de byte donde se inicia el proceso de leer oescribir.
• variable Para GET, es una variable utilizada para recibir información del archivo. ParaPUT, una variable que contiene la información de salida que ser escrita en el archivo. La
41
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 42/48
variable generalmente tiene el tipo de datos definido por el usuario.
Por ejemplo:
TYPE RegistroPrueba ' Define un tipo de datos con un texto de20 caracteres y un número de precisión simple
Alumno AS STRING * 20Nota AS SINGLE
END 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 o escribir endicha posición. La función LOC devuelve la posición actual del puntero del archivo 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 o escritura:
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ón de byte conrelació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%
42
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 43/48
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, se posiciona en elsegundo registro y lo lee; proporciona la salida:
Datos: 2 Registro actual: 2
Introducción
Para intercambiar información con dispositivos exteriores, el computador utiliza los puertos deentrada y salida (E/S). Estos puertos se caracterizan por la dirección que tienen asignada en el mapade memoria, y es posible la comunicación con los mismos enviando o recogiendo bytes a/en dichadirección. Así, nos centraremos ahora en las funciones de acceso a los puertos hardware que
proporciona Qbasic.
Al igual que en determinadas circunstancias es preciso comunicarse con dispositivos externos,también es necesario intercambiar información con el propio PC. Ello se realiza con frecuencialeyendo y escribiendo valores en/a determinadas posiciones de la memoria del mismo. Por ejemplo,
podemos conocer el estado en el que se encuentra el teclado del PC sin más que acceder al valor almacenado en el segmento 0x40, offset 0x17 de la memoria. 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 hardware actualmente instalado en el PC y, entre otras cosas, determinar en quédirecciones de E/S se hallan los puertos hardware mencionados en el párrafo anterior. Así existenen QBasic algunas funciones que proporcionan acceso a la memoria.
Acceso a los puertos hardware
• Lectura del puerto• Escritura en el puerto
Lectura del puerto
Para recoger información procedente de un puerto hardware (lectura del puerto), Qbasic proporciona la funciñon INP. Esta función devuelve un byte leído del puerto (hardware) de E/S.
Esta función se utiliza de la siguiente manera:
valor% = INP(puerto_dir)
donde:
43
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 44/48
puerto_dir es la dirección (valor entero: 0-65.535) que identifica el puerto hardware de la cual sequiere 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 elPC (en la dirección de E/S 378h):%
' Lee un byte del puerto paraleloDIM valor AS INTEGER DIM puerto AS INTEGER: puerto = &H378 ' dirección del puerto paralelo
valor = INP(puerto)PRINT "El byte leído del puerto "; puerto; " es "; valor
END
Escritura en el puerto
Para enviar información a un puerto hardware (escritura en el puerto), Qbasic proporciona lafunció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_dires la dirección del puerto hardware en la cual se quiere escribir (un entero: 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 bidireccional instalado enel PC (en la dirección de E/S 378h):
' Envía un carácter al puerto paraleloDIM valor AS INTEGR DIM puerto AS INTEGER: puerto = &H378 ' dirección del puerto paralelo
valor = ASC("C") ' valor contiene el código ASCII de la letra C (el
entero: 67)
OUT puerto, valorPRINT "Valor "; valor; " enviado al puerto "; puerto
END
Acceso a la memoria
• Lectura de la memoria• Escritura en la memoria
44
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 45/48
Lectura de la memoria
Para leer la información almacenada en la memoria, QBasic proporciona la función PEEK. Éstadevuelve el valor de byte almacenado en la posición de memoria designada por segmento:offset(direccionamiento segmentado de la memoria).
Esta función se declaran de la siguiente manera:
valor% = PEEK(direcció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ón de 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 en un PC,y qué direcciones de E/S tienen asignadas. Para ello, es preciso leer en la posición de memoria 408huna tabla de 3 palabras de 16 bits (2 bytes) que contienen las direcciones de los puertos paralelo
presentes en el sistema:
' Determina los puertos paralelo instalados en el PC y sus direcciones
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% + 1ELSE
PRINT "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:45
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 46/48
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 memoria especificada.
Como ejemplo, veamos cómo se fuerza por software la activación de "Bloq Mayús". Para ello hayque cambiar el bit 6 de la posición 417h, lugar de las variables de la BIOS donde residen los
banderines de estado del teclado:
' Cambia el estado de Bloq Mayús
DEF SEG = 0
Estado% = PEEK(&H417) ' Lee el estado del tecladoPOKE &H417, (Estado% XOR &H40) ' Cambia el estado del Bloq Mayús, bit 6
END
Trataremos de dar unas breves indicaciones acerca de cuál es la forma más correcta de programar.Qué aspecto dar al código fuente para que sea más legible y elegante, cómo distribuir el códigofuente, 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 la máscorrecta; es, simplemente, un estilo. Cada uno tiene su estilo personal, aunque conviene quetampoco sea 'muy personal', si es para compartirlo. El tabular la escritura del código lo hace máslegible y fácil de mantener.
46
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 47/48
Los comentarios
El código fuente debe estar bien documentado, de tal forma que si se lo pasamos a otra persona pueda entenderlo sin grandes dificultades. Quizá se piense: "mi código es mío y nunca se lo voy adejar a nadie, así que para que voy a comentarlo". Parece lógico, pero imagínese que se abandonatemporalmente y en el futuro se quiere retocar el programa. Es muy probable el olvido de por qué sehizo tal o cual cosa, (pasa muy a menudo) y es preciso gastar un montón de tiempo descifrando algoque en su día estaba entendido perfectamente.
Aquí está un ejemplo de un programa mal comentado:
' Empiezo el programa
DIM cadena AS STRING, i AS INTEGER ' declaro una variable llamadacadena y otra llamada i
PRINT "Introduce una cadena: " ' Imprimo el mensaje 'Introduce unacadena'
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 un programa deuso habitual. Todo el mundo (que lleva un poco de tiempo programando en BASIC) sabe que conFOR se realiza un bucle repetitivo y que con END se finaliza el programa.
Los comentarios deben decirnos qué es lo que hace el programa, para qué sirven las variables yexplicar las partes críticas 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> se almacenará eltexto introducido
' <i> será el contador decaracteres de <cadena>
PRINT "Introduce una cadena: "INPUT "", cadena
FOR i=1 TO LEN(cadena) ' Muestra cada carácter hasta lalongitud de la cadena
PRINT MID$(cadena, i, 1)NEXT i
END
47
5/17/2018 Manual Basico Lenguaje BASIC - slidepdf.com
http://slidepdf.com/reader/full/manual-basico-lenguaje-basic 48/48
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 pase eltiempo es difícil descifrar para que era cada una.
Los nombres de las variables
Cuando hacemos un programa con prisas o por no pensar mucho damos a las variables cualquier nombre. Supongamos un programa con una sección de declaración de variables como 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 es convenienteque aparte de indicar para qué sirve cada variable les demos nombres descriptivos:
DIM cuenta.x%, cuenta.y%, cuenta.z% ' Nº de posiciones x, y, zDIM x.minimo#, x.maximo#DIM y.minimo#, y.maximo# ' Esquinas del rectánguloDIM tecla.inicio$, tecla.fin$ ' Pulsaciones de comienzo y fin' ... etc
48