algoritmos qbasic manual 26875 completo

Upload: pablo-riveros

Post on 14-Oct-2015

168 views

Category:

Documents


21 download

TRANSCRIPT

  • Algoritmos en QBASIC. ManualAutor: abraham sopla

    1

    mailxmail - Cursos para compartir lo que sabes

  • Presentacin del curso

    Este manual de QBASIC es una coleccin linkografica y bibliogrfica sobre el uso deQBASIC frente a la propuesta de solucionar los casos ms comunes de los algoritmos en QBASIC.En este tutorial de QBSIC est divido en dos partes. La primera referida al uso ydominio del lenguaje y el segunda parte se encuentran un conjunto de ejerciciospropuestos en la web, adecuados para resolverlos en lenguaje QBASIC mas elcompendio de 39 algoritmos que resolvemos al final de este documento queincluyen muchos problemas prcticos habidos a lo largo de los ocho aos deexperiencia como docente universitario.

    2

    mailxmail - Cursos para compartir lo que sabes

  • 1. Introduccin. computacin con QBASIC

    El presente trabajo es una coleccin linkografica y bibliogrfica sobre el uso deQBASIC frente a la propuesta de solucionar los casos ms comunes de algoritmiadiseado para guiar a los estudiante en el curso de computacin I que se dicta en laCarrera Profesional de Ingeniera Agroindustrial de la Universidad Nacional ToribioRodrguez de Mendoza de Amazonas.EL texto est dividido en dos partes. La primera referida al uso y dominio dellenguaje y el segunda parte se encuentran un conjunto de ejercicios propuestos enla web, adecuados para resolverlos en lenguaje Qbasic mas el compendio de 39algoritmos que resolvemos al final de este documento que incluyen muchosproblemas prcticos habidos a lo largo de los ocho aos de experiencia comodocente universitario, los mismos que en su oportunidad han sido solicitados porlos estudiantes de la universidad y algunos centros de estudios superiores al e-mail [email protected], otros son propuestos como ejercicios exmenes degraduacin en el I.S.T. Per Japn, entre ellos estn los ms conocidos como losreferidos al factorial, serie Fibonacii, cambio de base de nmeros, Mnimo ComnMltiplo y Mximo Comn Divisor, ordenacin, entre otros. Para cada solucin seusa el lenguaje Basic, quedando claro que los mismos se podrn escribir en otroslenguajes.Por otro lado agradecer seguir proponindome la solucin de otros problemas dealgoritmos en cualquier lenguaje como C++, Pascal, Basic, Power Builder, PHP, etc.,aparte que tambin puede encontrar otros algoritmos en pseudo cdigo yprogramados en lenguaje C++ en mi texto electrnico Algoritmos y Lenguaje Cpublicado en la web de MailxMail, muy sencillo para principiantes en la vidauniversitaria. Los mismos que para probarlos bastan copiar y pegar lospseudocdigos al lenguaje Qbasic y copiarlos al block de notas y guardarlos con laextensin .bas y ejecutarlos desde el Basic. Finalmente slo queda decir: ojalnuestro esfuerzo le sirva en algo.

    3

    mailxmail - Cursos para compartir lo que sabes

  • 2. El QBASIC es sencillo y no requiere una estructurabsica

    Veamos en un momento como sera un programa en lenguaje PASCAL que haga lomismo que el nuestro: En lenguaje Pascal Program Hola; uses crt; begin clrscr; writeln("Hola Mundo");end. Y lo mismo en lenguaje C: #include < stdio.h > int main(void) { clrscr();cprintf("Hola Mundo"); return(0); } Podemos ver que en los dos estn las instrucciones para borrar la pantalla (clrscr)yla de escribir (writeln en

    PASCAL y cprintf en C), pero Por que llevan punto ycoma al final? y Qu son esos smbolos y esas otras palabras tan raras?...En otros lenguajes de programacin hace falta escribir un "esqueleto bsico"donde montar las instrucciones, en QBasic no. Nos limitamos a escribir lo quequeremos que haga el programa y ya est.Estas estructuras bsicas son necesarias en los otros lenguajes ms avanzados, peroen QBasic como slo vamos a aprender as lo tenemos ms fcil sin tener queescribir cosas que todava no entendemos.ESCRIBIR COMENTARIOS Se usan comentarios dentro del listado del programa para explicar sufuncionamiento. Lo que pongamos en los comentarios no altera para nada elfuncionamiento del programa.Los comentarios Ayudan a documentar el programa, sobre todo cuando sonprogramas largosEn QBasic para escribir un comentario ponemos un apstrofo ('). Veamos el ejemplocon comentarios:

    ' Nombre: PROGRAMA HOLA MUNDO ' Sirve para: Escribe en la pantalla "HolaMundo" ' Hecho por : Kike Barrueto 2005 Agosto 10 ' CLS 'Borra la pantalla PRINT "Hola Mundo" 'Escribe "Hola mundo"

    Una cabecera describiendo el programa y a continuacin a la derecha de algunasinstrucciones, en este caso de todas, hemos explicado para que sirven.En los programas ya terminados es conveniente poner la cabecera siempre yexplicar las instrucciones ms complicadas.El formato de la cabecera vendr especificado en el proyecto, por ejemplo quecontenga el nombre del programa, una descripcin corta, el autor y la fecha. Ennuestros programas no es necesario ser tan estrictos.Una Idea: poner comentarios para que un trozo de programa no se ejecute. ' Cls ' Print "Hola Mundo" este programa no hace nada

    4

    mailxmail - Cursos para compartir lo que sabes

  • 3. Variables en QBASIC

    Vamos a escribir un programa un poco ms complicado que nos pregunte nuestronombre y nos salude. El resultado (lo que se ve en pantalla al ejecutarlo) podra serel siguiente:Cmo te llamas? Kike Hola Kike El programa borrar la pantalla luego nos preguntar por nuestro nombre, nosdejar escribirlo con el teclado y cuando lo hagamos lo guardar en "algn sitio",despus escribir "Hola " seguido de nuestro nombre que lo habr sacado del "sitio"donde lo guard antes.Vamos a ver cmo ser el cdigo: CLS INPUT "Cmo te llamas? ", nombre$ PRINT "hola "; nombre$ Ahora tenemos una instruccin nueva, INPUT, que lleva dos parmetros separadospor una coma. Esta instruccin lo que hace es dejar al usuario del programa queescriba algo con el teclado y cuando pulse la tecla Enter lo guarda en memoria.La primera parte "Cmo te llamas?" la escribe en pantalla tal como est para que elusuario sepa lo que se le pregunta.La segunda parte es una Variable, es decir el nombre que le hemos puesta a un"trozo" de la memoria del ordenador dnde vamos a guardar lo que ha escrito elusuario y que le hemos llamadonombre$para despus poder localizarlo.La siguiente instruccin, PRINT,es la misma que en el anterior programa. Lo quehace es escribir lo que lleva detrs. En esta ocasin va a escribir dos cosas, primero"Hola " con su espacio detrs tal como aparece dentro de las comillas, y acontinuacin todo seguido escribir el valor que haya guardado en la variablenombre$.No escribir Hola nombre$porque nombre$ no est entre comillas.Esto de las variables es una de las cosas ms importantes de los lenguajes deprogramacin. Los programas van a manejar datos que estarn grabados en lamemoria del ordenador. Si no existieran las variables tendramos que saber enqu posicin exacta los guardamos y despus para recuperarlos habra queescribir los nmeros de las direcciones de memoria y saber exactamentecunto largo son los datos. Esto es muy complicado (Esto es lo que se hace en losLenguajes Ensambladores), para hacerlo aqu ms sencillo usaremos los nombres devariables y QBasic se encargar de ver en qu lugar fsico de la memoria mete lainformacin y despus de saber recuperarla cuando se la pidamos.TIPOS DE DATOS Nuestros programas van a poder trabajar con varios tipos de informacin,como son letras, nmeros con o sin decimales, etc. Nuestro programa anteriorusaba una variable de texto o de cadena de caracteres para almacenar nuestronombre, pero en otros casos habr que almacenar nmeros ms o menos grandes,por ejemplo.Veamos ahora los tipos de datos que hay en QBasic.

    NOMBRE SUFIJO DESCRIPCIN MNIMO Y MXIMO5

    mailxmail - Cursos para compartir lo que sabes

  • NOMBRE SUFIJO DESCRIPCIN MNIMO Y MXIMOSTRING $ Texto con cualquier carcter 0 a 32767 caracteresINTEGER % Nmeros enteros -32768 a 32767

    LONG & Nmeros enteros msgrandes2.147.483.647 a-2.147.483.648

    SINGLE ! Nmeros con decimales 2,8x1045 a -2,8x1045DOUBLE # Nmeros con ms decimales 4,9x10324 a -4,9x10324

    Vamos ahora a ver lo que significa esta tabla.En QBasic las variables van a ser de uno de estos cinco tipos.Si queremos almacenar palabras, nombres, fechas, horas, cdigos postales,nmeros de telfono, DNIs, matrculas, etc. tendremos que usar una variable de tipoCadena (STRING)cuyo nombre llevar al final el carcter $.

    Para guardar nmeros tendremos que usar alguno de los otros cuatro tipos devariables.

    Si nuestros nmeros no van a llevar decimales usaremos una variable de tipo entero(INTEGER)que ocupa poca memoria (2 bytes) y adems el ordenador trabaja conellas muy rpido.Si los nmeros enteros van a llegar a ser mayores de 32.767 tendremos que utilizaruna variable de tipo Entero largo (LONG) en la que "caben" hasta nmeros mayoresque dos mil millones.Si vamos a usar nmeros reales (que pueden llevar decimales) tendremos que usarvariables de precisin sencilla (SINGLE).

    Para algn clculo que necesite obtener resultados con muchos decimales usaremoslas variables de doble precisin (DOUBLE) que son ms lentas de manejar y ocupanms memoria que las anteriores.Si intentamos guardar en una variable un valor ms grande (o ms pequeo si esnegativo) de lo que permite su tipo de datos, se producir un "Error de Tiempo deEjecucin" y el programa se parar.NOMBRES DE VARIABLES Cada variable llevar un nombre que nosotros decidamos para usarla en nuestroprograma. Tenemos que elegir nombres que no sean demasiado largos y que tenganalgo que ver con lo que va a contener la variable.Los nombres de variables deben cumplir estas condiciones:

    Deben tener entre 1 y 40 caracteres. Pueden incluir letras y nmeros. No pueden llevar la ni letras acentuadas. El primer carcter tiene que ser una letra.Estos nombres de variable son vlidos.

    6

    mailxmail - Cursos para compartir lo que sabes

  • Edad

    fechaNacimiento

    jugador1

    iva16porCiento

    vidasRestantes

    Estos otros nombres no son vlidos

    2jugadores (No empieza por una letra) ao (Contiene la ) elPatioDeMiCasaEsParticularYCuandoLlueveSeMoja (Muy Largo) puntuacin (Lleva acento)Hay que tener en cuenta que QBasic no distingue de maysculas y minsculas, porlo tanto una variable que se llame nivel ser la misma que Nivel, NIVEL o niVEL. Dehecho cuando cambiemos las maysculas y minsculas de una variable se cambiarntodas las que ya haya escritas en el resto del programa, es decir, si hemos escrito enun sitio puntos y despus escribimos PuntoS en otro sitio, la anterior tambin secambiar a PuntoS.

    Por convenio los nombres de las variables se escriben todo en minsculas paradiferenciarlos visualmente de las Palabras Claves que se van poniendo enmaysculas automticamente. Si una variable lleva dos palabras se suele escribir laprimera letra de la segunda palabra en maysculas para separar un poco, porejemplo nombreJugador totalActivo o nuevoRegistro.

    En las variables que deberan llevar la hay varias formas: Para ao se sueleescribir cosas como ano, anno o

    anyo.De los acentos pasamos. En Visual Basic sepueden usar nombres de variables con y acentos, pero en QBasic no.DECLARACIN DE VARIABLES

    En otros lenguajes de programacin (la mayora) hay que Declarar las variables alprincipio del programa. Esto significa escribir una instruccin que diga algo ascomo "Voy a usar una variable que se va a llamar nombre y va a ser de tipocadena"y as con cada una de las variables que vayamos a usar en el programa. EnQBasic NO hace falta declarar las variables.

    La primera vez que escribimos el nombre de una variable QBasic reserva en memoriael espacio para utilizarla y ya est disponible durante el resto del programa, peroCmo sabe QBasic del tipo que queremos que sea la variable?En la tabla de tipos de datos haba una columna que pona Sufijo y que para cadatipo de datos tena un smbolo distinto.

    NOMBRE SUFIJOSTRING $INTEGER %LONG &

    7

    mailxmail - Cursos para compartir lo que sabes

  • SINGLE !DOUBLE #

    Para indicar el tipo escribiremos uno de estos sufijos detrs del nombre de lavariable, por ejemplo si nombre va a contener texto escribiremos nombre$ (Comohicimos en el ejemplo). A esto se llama declaracin implcita, ya que dentro delnombre va incluido el tipo de datos.Ahora Qu pasa si escribimos en distintos sitios el mismo nombre de variable condistintos sufijos?, por ejemplo:variable$ = "Esto es un texto"

    variable% = 2000

    PRINT variable$

    PRINT variable%

    Lo que ocurrir es que QBasic entiende que son dos variables completamentedistintas, cada una de un tipo y nos da como resultado:Esto es un texto

    2000

    Esto puede producir un Error de Lgica, es decir, el programa funcionaperfectamente, pero a lo mejor no hace lo que esperbamos. Para evitar esto hayque poner a las variables nombres ms descriptivos, y si en este caso de verdadqueramos dos variables es mejor ponerles nombres distintos para evitarconfusiones.

    En la prctica a partir de ahora vamos a poner el sufijo $ a las variables decadena y las dems las dejamos sin sufijo para que sean reales que admitennmeros muy grandes con o sin decimales. Si furamos a hacer programas muydepurados sera conveniente usar los otros tipos de variables cuando fueranecesario para que fueran ms eficientes con el consumo de memoria.Las variables al ser usadas la primera vez antes de asignarles (guardar enellas) ningn valor contienen un texto de longitud cero si son de cadena, o elnmero 0 si son de otro tipo. En otros lenguajes de programacin esto no es as ycontienen cualquier valor que hubiera en esa posicin de memoria de otrosprogramas que la hubieran usado antes, por lo que se pueden producir errores.Aqu no.Lo ltimo que queda es saber que el Tiempo de Vida de una variable es desde quese usa por primera vez (desde que se declara o se ejecuta la lnea donde su nombreaparece por primera vez) hasta que el programa termina, despus su valor se pierde.No podemos contar con que tengamos valores en memoria guardados de la vezanterior que ejecutamos el programa.

    8

    mailxmail - Cursos para compartir lo que sabes

  • 4. Leer desde el teclado (INPUT)La orden que usaremos en QBasic para leer lo que el usuario escribe en elteclado es INPUT. Ya la hemos usado, pero vamos a verla con ms tranquilidad.

    Su sintaxis ms comn sera:INPUT "Pregunta al usuario", variable

    "Pregunta al usuario" es una cadena de texto entre comillas que aparecer enpantalla para que el usuario la vea y sepa lo que se le est preguntando. No puedeser una variable ni una expresin, solamente una cadena entre comillas. En otroslenguajes de programacin no se da esta posibilidad y hay que escribir un rtulojusto antes usando otra instruccin. Variable es el nombre de la variable dnde se almacenar la informacin queescriba el usuario.

    Al ejecutar esta instruccin se escribe en la pantalla el texto que hay entre comillas ya la derecha aparece el cursor intermitente para que el usuario escriba. El programaestar parado hasta que el usuario escriba lo que quiera y pulse la tecla "Enter".Entonces se almacena en la variable lo que ha escrito el usuario (El valor anteriorque pudiera tener la variable se pierde) y el programa sigue con la siguienteinstruccin que haya.El usuario podr desplazarse con las flechas del teclado por el texto que estescribiendo para corregir algn error antes de pulsar "Enter"Para que lo que escriba el usuario no salga justo pegado al texto de la pregunta loque se suele hacer es escribir un espacio en blanco al final dentro de las comillas.Si escribimos...

    INPUT "Cmo te llamas?",variable$

    El resultado despus de que el usuario termine de escribir seraCmo te llamas?Kike

    Pero si lo ponemos con el espacio al final...INPUT "Cmo te llamas? ",variable$

    El resultado es parecido pero se ve mejorCmo te llamas? Kike

    La variable tiene que ser del tipo correcto, si le pedimos al usuario que escriba unapalabra, la variable debe de ser de tipo cadena y si no tendr que ser de tiponumrico con o sin decimales.Si solo ponemos la variable, sin pregunta al usuario, aparecer un interrogante. Esdecir, si ponemos...INPUT nombre_variable

    Aparecer en la pantalla

    9

    mailxmail - Cursos para compartir lo que sabes

  • ?_

    Para que no aparezca indicacin alguna, solo el cursor, hay que poner las comillasvacas, por ejemplo...INPUT "", nombre_variable

    Esto puede ser til cuando la pregunta que hacemos al usuario incluye algn clculoo expresin de cadena. Como INPUT no permite evaluar expresiones en la preguntaal usuario, esta pregunta habr que mostrarla antes en una instruccin PRINTnormal de las que veremos ms adelante con su punto y coma al final, y acontinuacin poner el INPUT de esta forma para leer la informacin del usuario.ESCRIBIR EN PANTALLA - PRINT Como ya hemos dicho, la forma ms bsica de dar al usuario los resultados denuestro programa es a travs de la pantalla.En temas posteriores se explica cmo conseguir crear las pantallas de losprogramas para que cada cosa aparezca en un sitio determinado y con distintoscolores, recuadros, etc, pero por ahora para aprender a programar nos limitaremosa escribir cosas una debajo de otra como en MS-DOS.

    Usaremos la pantalla de texto de forma que cuando lleguemos a escribir en la lneams baja de la pantalla todo subir hacia arriba y desaparecer lo que hubiera en laprimera lnea.Para aclarar la pantalla y no liarnos con lo anterior hemos puesto en todos losejemplos CLS como primera instruccin para que se borre de la pantalla lo quehubiera de ejecuciones anteriores del programa actual o de otro, y se empiece aescribir en la parte superior.Ahora vamos a ver con ms detalle la instruccin PRINT que es la que usamosparara escribir en la pantalla.Una aclaracin. Si a alguien le parece que PRINT significa imprimir tiene razn, eninformtica a escribir en la pantalla del ordenador tambin se le puede llamarimprimir en pantalla. Adems esta orden PRINT tambin se utiliza para imprimircomo se ver ms adelante.La sintaxis de la instruccin es:PRINT texto

    Donde texto puede ser una cadena de caracteres entre comillas, que se escribir talcual.

    PRINT "Esto es un texto"

    O el nombre de una variable.mensaje$ = "Prueba superada"

    PRINT mensaje$

    En este caso se escribir el valor de que tenga la variable, en nuestro ejemplo seescribira Prueba Superada.

    1 0

    mailxmail - Cursos para compartir lo que sabes

  • La variable tambin puede ser de tipo numrico...PRINT total%

    Tambin podemos escribir el resultado de operaciones matemticas...PRINT 2+2

    En este caso se escribir 4. Las operaciones matemticas (Expresiones) las veremoscon detalle en el tema siguiente.Despus de escribir algo el cursor (invisible) pasa a la lnea de abajo, por ejemploPRINT "Uno"

    PRINT "Dos"

    PRINT "Tres"

    Escribira...Uno

    Dos

    Tres

    Pero en algn caso nos puede interesar que no sea as y que se escriba losiguiente a continuacin en la misma lnea. Para hacerlo no tenemos ms queescribir un punto y coma al final de la instruccin sobre la que queremosseguir, por ejemplo:PRINT "Uno";

    PRINT "Dos";

    PRINT "Tres"

    PRINT "Cuatro"

    Escribira...UnoDosTres

    Cuatro

    Normalmente en una instruccin PRINT se suelen escribir varias cosas, como vimosen el programa saludador que primero escriba la palabra Hola y despus nuestronombre que estaba almacenado en la variable nombre$. Para hacer esto no hay msque separar con punto y coma (;) las distintas "cosas" que queremos escribir, porejemplo:nombrePrograma = "Super Juego"

    nombreUsuario = "KB"

    PRINT "Hola "; nombreUsuario; ", bienvenido a "; nombrePrograma

    Escribira...Hola KB, bienvenido a Super Juego

    1 1

    mailxmail - Cursos para compartir lo que sabes

  • Observa que los espacios entre palabras hay que ponerlos en algn sitio dentro delas comillas, de lo contrario saldra todo junto, incluso alguna vez es necesariohacer...

    PRINT unaVariable$ ; " "; otraVariable$

    ...para que no salga todo junto.Ahora vamos a probar con esto:PRINT 2; 3; 4

    Visto la anterior, el resultado tendra que ser...2 3 4

    pero no, es2 3 4

    QBasic escribe siempre los nmeros con un espacio delante y otro detrs. Lo que haescrito exactamente es: Espacio 2 Espacio Espacio 3 Espacio Espacio 4 Espacio, elltimo espacio no lo vemos pero tambin lo ha escrito.Una consecuencia de esto ser que los nmeros por ahora nunca van a salir justo enla parte izquierda de la pantalla, sino una posicin ms adelante, por ejemplo...PRINT "Prueba"

    PRINT 25

    PRINT 74

    PRINT "Fin prueba"

    Escribira...

    Prueba

    2 5

    7 4

    Fin Prueba

    Pero de esto no nos tenemos que preocupar. Si intentamos arreglarlo vamos acomplicar nuestros programas innecesariamente. Ya habr tiempo de dibujarpantallas en los temas de ampliacin.Una cosa que s podemos hacer ya es usar lo que se llama "Posiciones detabulacin". Esto es que QBasic divide cada lnea de la pantalla en posiciones quecomienzan cada 14 caracteres, la primera en la posicin 1, la segunda en la 14, latercera en la 28, etc. Y si nosotros separamos las expresiones de la orden PRINT concomas en vez de puntos y comas los textos se escribirn en estas posiciones en vezde justo pegado a la anterior. Vamos con un ejemplo:PRINT "Uno", "Dos", "Tres"

    PRINT "Cuatro", "Cinco", "Seis"

    1 2

    mailxmail - Cursos para compartir lo que sabes

  • PRINT "Siete", "Ocho", "Nueve"

    Que escribira en pantalla...Uno Dos Tres

    Cuatro Cinco Seis

    Siete Ocho Nueve

    Esto ser muy til en los listados que veremos ms adelante. Por supuesto en unamisma instruccin podemos separar unas cosas con comas y otras con puntos ycomas, segn haga falta.EJERCICIOS

    1. Escribir un Programa que imprima sus datos personales como:Universidad Nacional Toribio Rodrguez de Mendoza de AmazonasNombres:

    Primer Apellido:Segundo Apellido:Edad:

    Especialidad2. Crear un programa que capture los valores de la base y altura de un triangulo.Calcule el rea del triangulo.3. Crear un programa que capture los valores de la base menor, base mayor, yaltura de un trapecio y calcule su rea.

    1 3

    mailxmail - Cursos para compartir lo que sabes

  • 5. Introduccin a los operadores

    En este tema vamos a ver cmo construir las expresiones matemticas y lgicasnecesarias para que nuestros programas sea capaces de hacer clculos.Una expresin sera lo equivalente a las frmulas que escribimos en una hoja declculo (Excel), es decir una sucesin de nmeros, operadores (signos ms, menos,etc.) y nombres de variables, entre otras cosas, colocados en el orden correcto.Operador de asignacin

    Lo primero que vamos a ver en este tema es un operador que nos permita guardar"algo" en una variable. En el programa Saludador para guardar nuestro nombre en lavariablenombre$ usbamos directamente la instruccin INPUT que se encargaba deleer los datos del teclado y guardarlos directamente en la variable. Aqu noemplebamos el operador de asignacin, pero despus hemos hecho cosas como:mensaje$ = "Prueba superada"

    o al declarar las constantes hacamos:CONST iva = 16

    En estos ejemplos se puede ver que hemos usado el signo Igual para "Asignar" a lavariable que hay a su izquierda el valor de la "Expresin" que hay a su derecha, porlo tanto ya podemos decir que el signo igual es el operador de asignacin en ellenguaje Basic.En el caso ms sencillo:total = 500

    Hacemos que en la variable total se almacene el nmero 500, perdindose el valorque tuviera anteriormente.Tambin podemos hacer:total = total + 100

    En este caso estamos usando la variable total como un "acumulador" ya que vamos aalmacenar en ella el valor que tenga antes de la asignacin ms cien. Dicho de otraforma, si la variable vala 500 ahora le vamos a almacenar su valor de 500 ms 100,con lo que al final de la asignacin pasar a valer 600. En el siguiente apartado seexplican algunas cosas sobre estas asignaciones.Es importante tener claro que a una variable solo le podemos asignar los datosadecuados a su tipo, por ejemplo si a una variable de cadena le asignamos unaexpresin numrica o a una variable numrica le asignamos una cadena se producirun Error de Tiempo de Ejecucin y el programa se parar.Tambin hay que tener en cuenta que si a una variable de tipo entero le asignamosuna expresin cuyo valor es con decimales, el nmero almacenado se redondear,por ejemplo...num% = 10 / 3

    1 4

    mailxmail - Cursos para compartir lo que sabes

  • Har que num% valga 3 en vez de 3.3333, igual quenum% = 20 / 3

    Har que num% valga 7 en vez de 6.6666. Esta vez se ha redondeado hacia arriba.Tiene que quedar claro que la variable "destino" siempre va a la izquierda del signoigual, y la expresin a la derecha.Las expresiones nunca van a ir solas. Siempre van en una asignacin o en unaestructura condicional que ya veremos ms adelante.Contadores y acumuladores

    Estas dos palabras se usan mucho en programacin para referirse a variables quevan incrementando su valor a lo largo de la ejecucin del programa.Normalmente sern de tipo numrico y no se tratan de ninguna forma en especial,solo que al asignarles un valor se hace de forma que el anterior no se pierda, porejemplo:nivel = nivel + 1

    total = total + subtotalLinea

    vidas = vidas - 1

    tamao = tamao * 2

    Es muy importante inicializarlas de forma correcta siguiendo estas normas: Si vamos a sumar o restar la inicializaremos a cero al principio del programa paraque no empiecen con valores residuales. Si vamos a multiplicar las inicializamos a 1, porque si valen cero todo lo quemultipliquemos por ella seguir valiendo cero.La diferencia entre acumuladores y contadores es que los acumuladores seincrementan con cualquier nmero, como por ejemplo el total de una factura,mientras que los contadores se incrementan siempre con el mismo nmero,normalmente 1.

    Operadores aritmticos

    Llamamos operadores aritmticos a los signos que usaremos para haceroperaciones aritmticas como sumas, restas, etc.

    OPERADOR NOMBRE+ Suma- Resta* Multiplicacin/ DivisinMOD Resto de divisin (Mdulo)^ Potencias

    1 5

    mailxmail - Cursos para compartir lo que sabes

  • El operador suma lo que hace es sumar valores. Se pueden encadenar tantas sumascomo queramos, por ejemplototal = 2 + 74 + 7 + 25 + 82

    El operador resta resta un valor a otro, por ejemplo:neto = peso - tara

    El operador asterisco hace multiplicaciones, por ejemplo:elDoble = n * 2

    El operador divisin divide un valor entre otro, por ejemplo:kilos = gramos / 1000

    El operador MOD nos devuelve el resto de una divisin. Es especialmente til paradeducir si un nmero es par, ya que al dividir un par entre 2 el resto siempre es 0.Se usa entre los dos operandos igual que los smbolos anteriores, veremos sufuncionamiento y su utilizacin en los temas siguientes.El operador "acento circunflejo" sirve para calcular potencias, por ejemplo 5^2 escinco al cuadrado o tambin 5*5. Tambin podramos calcular potencias decimalescomo 4^2.5. Para escribir este smbolo pulsa maysculas y la tecla correspondientedos veces, oirs un pitido y solo entonces aparecer escrito en la pantalla. Siaparece dos veces borra uno.Operadores relacionales o de comparacin

    Estos operadores hacen que una expresin devuelva un valor lgico, es decir, en vezde un nmero devolver VERDADERO o FALSO. Esto nos ser muy til en lasestructuras condicionales que veremos en los siguientes temas, dnde veremosmuchos ejemplos de su utilizacin.OPERADOR NOMBRE= Igual> Mayor que< Menor que> = Mayor o igual que< = Menor o igual que< > Distinto de

    En QBasic el signo igual sirve tanto para asignaciones como para comparaciones,pero nunca se confunden ya que QBasic los evala de una u otra forma segn dndeestn escritos.Operadores lgicos

    Estos operadores tambin devuelven un valor VERDADERO o FALSO a partir de losvalores de las dos expresiones lgicas que unen. Igual que los anteriores seexplicarn en los temas siguientes dedicados a estructuras condicionales.

    OPERADOR NOMBRE

    1 6

    mailxmail - Cursos para compartir lo que sabes

  • OPERADOR NOMBREAND Operador YOR Operador ONOT Operador monario de negacinXOR Operador O exclusivoEQV Operador de equivalenciaIMP Operador de implicacin

    Los tres primeros son las puertas lgicas elementales del lgebra de Boole, los otrossepueden construir a partir de las anteriores y por eso no suelen estar en otroslenguajes de programacin y no hablaremos de ellos aqu.AND devuelve verdadero si las dos expresiones que une son verdaderas, en casocontrario devuelve falso. Por ejemplo:esNavidad = ((mes = 12) AND (dia = 25))

    Podemos asegurar que es Navidad si el mes es 12 y el da es 25. Si el mes no esdiciembre no ser navidad aunque estemos a 25, tampoco si es un da de diciembredistinto de 25 y mucho menos si ni es diciembre ni es 25. Usamos por primera vezlos parntesis para dar ms claridad, ms adelante se explica cmo hacerlo.OR devuelve verdadero si alguna de las dos expresiones que une es verdadera, o lasdos lo son. Si las dos son falsas devuelve falso, por ejemplo:puedesComprar = ((tuDinero > 0) OR (precio = 0))

    En este caso la variable puedesComprar sera verdadero si tu dinero es mayor quecero (aprovechamos para dar un ejemplo del operador >) o si el precio es gratis, olas dos cosas. Solo sera falso si no tienes dinero y el producto a comprar valedinero, con lo que las dos partes de la expresin seran falsas y el resultado tambin.NOT es un operador "monario". Esto significa que slo tiene un operando, adiferencia de los otros que siempre estn entre dos operandos. Lo que hace NOT esinvertir el resultado de una expresin, es decir, si es verdadera devuelve falso y si esfalsa devuelve verdadero.

    Para detallar los posibles valores que devuelven los operadores lgicos seconstruyen las llamadas "Tablas de la verdad" que representan todas lascombinaciones posibles y los valores devueltos por cada operador.

    TABLA DE LA VERDAD PARA ANDVERDADERO AND VERDADERO = VERDADEROVERDADERO AND FALSO = FALSOFALSO AND VERDADERO = FALSOFALSO AND FALSO = FALSOTABLA DE LA VERDAD PARA ORVERDADERO OR VERDADERO = VERDADEROVERDADERO OR FALSO = VERDADEROFALSO OR VERDADERO = VERDADERO

    1 7

    mailxmail - Cursos para compartir lo que sabes

  • FALSO OR VERDADERO = VERDADEROFALSO OR FALSO = FALSOTABLA DE LA VERDAD PARA NOTNOT VERDADERO = FALSONOT FALSO = VERDADERO

    Observa que la variable puedesComprar y la esNavidad del ejemplo anterior puedenser de cualquier tipo numrico para poder ser verdaderas o falsas. QBasic entiendeque una variable (o el resultado de una expresin) es falsa si vale 0 y verdadera encualquier otro caso. Otros lenguajes tienen un tipo de datos especfico para estassituaciones, pero aqu puede valer cualquier tipo de datos numrico.Es normal declarar constantes al principio de los programas para poder usar laspalabras VERDADERO y FALSO en las expresiones y darle ms claridad. Se hara:CONST FALSO = 0

    pero para verdadero podemos hacer...CONST VERDADERO = NOT FALSO

    con lo que hacemos que VERDADERO sea justo lo contrario de FALSO. Muy lgico.

    1 8

    mailxmail - Cursos para compartir lo que sabes

  • 6. Funciones incluidas en el lenguajeEl lenguaje BASIC incluye un montn de funciones que nos harn algunos clculossin necesidad de tener que programar nosotros todo lo necesario.Una funcin es una palabra que, insertada dentro de una expresin, llama a unpequeo "programita" que hace los clculos y nos devuelve un resultado. Veamoseste ejemplo:CLS

    INPUT "Escribe un nmero: ", num

    raiz = SQR(num)

    PRINT "Su raz cuadrada es ";raiz

    Este programa nos pide que escribamos un nmero y lo guarda en la variable num.A continuacin calcula la raz cuadrada del nmero usando la funcin SQR y gualdael resultado en la variable raiz para al final escribirlo en pantalla. No hemos tenidoque programar ni conocer las operaciones matemticas necesarias para calcular laraz cuadrada de un nmero, lo ha hecho automticamente la funcin.Observa la forma de decirle a la funcin cual es el nmero que queremos que utilicepara calcular la raz cuadrada: Lo metemos entre parntesis despus del nombre dela funcin. Este nmero se dice que es un Parmetro que pasamos a la funcin. Sialguna funcin no necesita parmetros no ponemos nada, en otros lenguajes hayque poner los parntesis vacos detrs del nombre de la funcin, pero en QBasic no.El parmetro no tiene por qu ser un nmero constante, puede ser a su vez otraexpresin.En la instruccin PRINT podemos incluir cualquier expresin, por lo tanto en elejemplo anterior nos podamos haber ahorrado la variable raiz escribiendodirectamente:

    CLS

    INPUT "Escribe un nmero: ", num

    PRINT "Su raz cuadrada es "; SQR(num)

    Las funciones tienen tipo de datos como las variables, es decir, nos devuelven unresultado que puede ser cadena, entero, etc. y por lo tanto pueden llevar un sufijode identificacin de tipo a continuacin del nombre, por ejemplo la funcin TIMERnos devuelve el nmero de segundos que han pasado desde las doce de la noche enformato numrico:segundos = TIMER

    mientras que la funcin TIME$ nos devuelve la hora actual en formato de cadena detexto con la hora, los minutos y los segundos separados por dos puntos:horaActual$ = TIME$

    PRINT "Son las "; horaActual$

    1 9

    mailxmail - Cursos para compartir lo que sabes

  • En este caso para guardar el valor devuelto por TIME$ hemos tenido que usar unavariable de cadena. Ambas funciones no llevan parmetros porque si lo quehacemos es preguntar la hora no tenemos que decir nada ms, ya la propia funcinver como saca la hora del reloj interno del ordenador.Si una funcin lleva varios parmetros se pondrn separados por comas dentro delos parntesis, por ejemplo:PRINT STRING$ (20,"Z")

    La funcin STRING$ devolver una cadena con veinte zetas, es decir"ZZZZZZZZZZZZZZZZZZZZ". Para hacerlo necesita saber dos cosas: cuantas y cualletra tiene que repetir, por eso le damos dos parmetros separados por una coma.Observa tambin en el ejemplo que el primer parmetro debe de ser un nmero (ouna expresin numrica) y el segundo tiene que ser una cadena (o una expresin decadenas). Para saber de que tipo es cada parmetro y el tipo del resultado quedevuelve la funcin es muy importante consultar la ayuda de QBasic todas las vecesque haga falta. Si intentamos pasar parmetros de otro tipo se producir un error detipos y el programa se parar.Tambin se producir un error de "Llamada a funcin no vlida" si la funcin no escapaz de hacer los clculos con los parmetros que le hemos pasado, aunque seandel tipo correcto. Por ejemplo, sabemos que no existe raz cuadrada para losnmeros menores que cero, por lo que se producir un error de este tipo si hacemosPRINT SQR (-14)

    En caso de que pasemos como parmetro una expresin, por ejemploPRINT SQR(miVariable)

    hay que tener mucho cuidado de que esta expresin no pueda llegar a valer menosque cero.Estas son algunas de las funciones ms usadas. En temas posteriores irnapareciendo ms. Para verlas todas y todos los tipos de datos que necesitan ydevuelven mira la ayuda del QBasic.

    FUNCIN DESCRIPCIN EJEMPLOSQR(num) Raz cuadrada SQR(16) devuelve 4INT(decimal) Pasa a entero qitandodecimales INT(1.6) devuelve 1

    CINT(decimal) Redondea a entero (Max= 32767) CINT(1,6) devuelve 2

    CLNG(decimal) Redondea a entero largo CLNG(100000.2) devuelve100000SIN(num) Calcula el seno SIN(40) devuelve 0.64278COS(num) Calcula el coseno COS(40) devuelve 0.76604TAN(num) Calcula la tangente TAN(40) devuelve 0.839009

    Devuelve la longitud de

    2 0

    mailxmail - Cursos para compartir lo que sabes

  • LEN(Cadena) Devuelve la longitud dela cadena LEN("RONDA") devuelve 5

    RTRIM(Cadena) Devuelve una cadena sinespacios al final RTRIM("Fin. ") devuelve "Fin."

    UCASE$(Cadena)Devuelve la cadenapasada a maysculas (Nofunciona col la ni conlos acentos)

    UCASE$("Toma Castaa")devuelve "TOMA CASTAA"

    MID$(Cadena,inicio, largo)

    Devuelve una subcadenadel tamao indicado aparir de la posicinindicada.

    MID$("Programacin",5,4)devuelve "rama"

    STRING$(largo,carcter)

    Devuelve una cadenaformada por un nmerode caracteres repetidos

    STRING$(10,"#") devuelve"##########"

    TIME$ Devuelve la hora actualcomo cadena

    Devuelve por ejemplo"16:45:08"

    DATE$Devuelve la fecha actualcomo cadena en formatomes-dia-ao

    Devuelve por ejemplo "01-20-2006"

    INKEY$Devuelve la letra de laltima tecla pulsadaantes de llegar a ejecutarla funcin.

    Devolvera "A" si la ltima teclapulsada fue la "A mayscula"

    En una de las ampliaciones de este curso se habla de un conjunto de funciones muytiles para el manejo de cadenas y en otro se explica en detalle la funcin INKEY$que es especialmente til para detectar teclas pulsadas en mens, juegos, preguntasque se responden con s o no, etc.

    2 1

    mailxmail - Cursos para compartir lo que sabes

  • 7. Estructuras condicionales IF

    INTRODUCCIN A LOS BLOQUES DE CONTROL

    Hasta ahora al ejecutar nuestros programas se han ejecutado todas las instruccionesque aparecen en el listado del cdigo fuente del programa, desde la primera hasta laltima.A partir de ahora vamos a poder conseguir que una o varias instrucciones solo selleguen a ejecutar si se cumple una condicin, que si no se cumple se ejecuten otras,o incluso que algunas instrucciones se ejecuten ms de una vez (Esto lo veremos enlos siguientes temas).ALTERNATIVA SIMPLE. INSTRUCCIN IF

    Empecemos con un ejemplo. Un programa que nos pida la nota de un examen y nosfelicite si est aprobado.CLS

    INPUT "Escribe la nota del examen: ", nota

    IF nota >= 14 THEN

    PRINT "Enhorabuena, has aprobado."

    END IF

    PRINT "Gracias por usar el programa."

    Ahora ejecutemos el programa. Hemos sacado un 14:Escribe la nota del examen: 14

    Enhorabuena, has aprobado.

    Gracias por usar el programa.

    Volvamos a lanzar el programa, esta vez hemos sacado un 4:Escribe la nota del examen: 4

    Gracias por usar el programa.

    Esta ltima vez se ha saltado una de las instrucciones del listado Por qu?Porque hemos usado la instruccin IF (si en ingls), una de las ms importantes detodo lenguaje de programacin estructurado, y le hemos puesto como condicinque el valor almacenado en la variable nota sea mayor o igual que cinco con lo quehacemos que todas las instrucciones que haya entre IF y END IF solo se ejecuten siesta expresin es VERDADERA.Vamos a ver con ms tranquilidad la sintaxis de la instruccin IF

    IF condicin THEN

    instrucciones

    2 2

    mailxmail - Cursos para compartir lo que sabes

  • END IF

    SI la condicin es VERDADERA, ENTONCES (THEN) se ejecutarn las instruccioneshasta llegar a END IF (FIN SI). Despus se seguir con el resto del programaSi la condicin es falsa se saltar todo el bloque IF y se ejecutarn las siguientesinstrucciones del programa que haya despus del END IF.

    SANGRA

    En el ejemplo anterior puedes ver que las instrucciones que hay dentro del bloque IFestn escritas un poco ms a la derecha que las dems, no justo en el margenizquierdo.Esto se hace por comodidad, para poder saber de un vistazo cuales son lasinstrucciones que hay dentro del bloque. En la mayora de lenguajes no esobligatorio (En COBOL s), pero siempre es muy recomendable hacerlo as para darmayor claridad al cdigo fuente del programa.Para hacer esto basta con pulsar la tecla TABULADOR antes de escribir la instruccin,mejor que escribir espacios. En las opciones de QBasic se puede especificar eltamao de la tabulacin (Cuantos espacios se escriben). Por defecto tiene 8, pero esmejor un nmero ms bajo entre 3 y 5 como ya veremos ms adelante.Esta tcnica tambin se conoce como encolumnado o indentacin (En ingls sellama indent).ANIDACIN

    Como hemos visto en la sintaxis de la instruccin IF, dentro del bloque deinstrucciones a ejecutar se puede usar cualquier instruccin, por lo tanto tambin sepueden usar otras instrucciones IF. A esto es a lo que se llama anidacin deinstrucciones. Veamos un ejemplo que nos diga si un nmero es par (usando eloperador MOD) y en este caso nos diga tambin si el nmero es mayor que 10:CLS

    INPUT "Escribe un nmero: ", num

    IF num MOD 2 = 0 THEN

    PRINT "Es un nmero par"

    IF num > 10 THEN

    PRINT "Es mayor que 10"

    END IF

    END IF

    Ejemplos de la ejecucin de este programa pueden ser...Escribe un nmero: 7

    Escribe un nmero: 8

    Es un nmero par

    Escribe un nmero: 12

    2 3

    mailxmail - Cursos para compartir lo que sabes

  • Escribe un nmero: 12

    Es un nmero par

    Es mayor que 10

    Aqu si la primera condicin se cumple se escribe "Es par" y adems se hace otracomprobacin que se podr cumplir o no. Nunca se va a llegar a la segundacomprobacin si la primera no se ha cumplido.Es muy importante observar que cada IF lleva su END IF correspondiente y que elbloque de instrucciones del segundo IF est encolumnado todava ms a la derechaque el anterior.Cuando escribimos un programa en papel es comn unir con una lnea cada IF consu END IF para aclarar el listado.CLS

    INPUT "ESCRIBE UN NUMERO: ", num

    IF num MOD 2 = 0 THEN

    PRINT "el numero es par"

    IF num > 10 THEN

    PRINT "el numero es mayor que 10"

    END IF

    END IF

    INSTRUCCIN IF SIMPLIFICADA

    Si el bloque de instrucciones de una instruccin IF slo va a llevar una instruccinpodemos escribirla en la misma lnea detrs del THEN y ahorrarnos el END IF.

    Para el ejemplo del examen podamos haber hecho:CLS

    INPUT "Escribe la nota del examen: ", nota

    IF nota >= 5 THEN PRINT "Enhorabuena, has aprobado."

    PRINT "Gracias por usar el programa."

    Esto es til en algunos casos, pero si vemos que nos vamos a liar es mejor poner el END IF como hemos visto antes, aunque si nos acostumbramos a poner siempre losencolumnados no hay por qu equivocarse.

    2 4

    mailxmail - Cursos para compartir lo que sabes

  • ALTERNATIVA DOBLE

    INSTRUCCIN IF-THEN-ELSE

    En el ejemplo del examen estara bien que "si no" aprueba, decirle que hasuspendido. Lo podemos hacer de esta forma:CLS

    INPUT "Escribe la nota del examen: ", nota

    IF nota >= 5 THEN

    PRINT "Enhorabuena, has aprobado."

    ELSE

    PRINT "Lo siento, has suspendido."

    END IF

    PRINT "Gracias por usar el programa."

    En este caso se comprueba la condicin del IF. Si es verdadera se ejecuta su bloquede instrucciones y despus se sigue con lo que venga detrs del END IF, igual queantes. Ahora viene lo nuevo, si la condicin no se cumple se ejecuta el bloque deinstrucciones del ELSE hasta el END IF, y despus se sigue con lo que haya detrs.De esta forma nos aseguramos de que siempre se ejecuta uno y solo uno de los dosbloques de instrucciones segn la condicin sea verdadera o falsa.Dentro del bloque del ELSE tambin puede ir cualquier tipo de instruccin, incluidootro bloque IF o del tipo que sea.Veamos un ejemplo "especialmente malo" de un programa que nos diga el nombrede un mes a partir de su nmero. En temas posteriores simplificaremos bastanteeste problema.CLS

    INPUT "Escribe el nmero del mes: ", mes

    IF mes = 1 THEN

    PRINT "Enero"

    ELSE

    IF mes = 2 THEN

    PRINT "Febrero"

    ELSE

    IF mes = 3 THEN

    PRINT "Marzo"

    ELSE

    IF mes = 4 THEN

    2 5

    mailxmail - Cursos para compartir lo que sabes

  • PRINT "Abril"

    ELSE

    IF mes = 5 THEN

    PRINT "Mayo"

    ELSE

    IF mes = 6 THEN

    PRINT "Junio"

    ELSE

    IF mes = 7 THEN

    PRINT "Julio"

    ELSE

    IF mes = 8 THEN

    PRINT "Agosto"

    ELSE

    IF mes = 9 THEN

    PRINT "Septiembre"

    ELSE

    IF mes = 10 THEN

    PRINT "Octubre"

    ELSE

    IF mes = 11 THEN

    PRINT "Noviembre"

    ELSE

    IF mes = 12 THEN

    PRINT "Diciembre"

    ELSE

    END IF

    END IF

    END IF

    END IF

    END IF

    2 6

    mailxmail - Cursos para compartir lo que sabes

  • END IF

    END IF

    END IF

    END IF

    END IF

    END IF

    END IF

    PRINT "S'ACAB"

    Muy sencillo: Si es enero lo escribimos, si no miramos si es febrero, si no a ver si esmarzo, etc. as hasta diciembre. Si no es diciembre sacamos un mensaje de mes novlido. Observa que cada IF tiene su ELSE y su END IF correspondiente abajo.Normalmente nunca llegaremos a estas estructuras tan anidadas, pero aqu sepuede ver la importancia de que el tamao de tabulacin no sea muy grande.Observa que si haces que la ventana del navegador sea ms estrecha podra pasar(segn los programas) que algunas lneas de las ms largas pasan abajo y se nosestropea toda nuestra jerarqua. En QBasic y en los otros editores de programacinesto no ocurre porque no tienen salto de lnea automtico para que no pase eso,pero de todas formas es muy incmodo tener que ir moviendo la barra dedesplazamiento horizontal a izquierda y derecha para ver nuestro listado.ALTERNATIVA MLTIPLE

    INSTRUCCIN ELSEIF

    Vamos a arreglar un poco el ejemplo anterior para no tener tantos END IF.CLS

    INPUT "Escribe el nmero del mes: ", mes

    IF mes = 1 THEN

    PRINT "Enero"

    ELSEIF mes = 2 THEN

    PRINT "Febrero"

    ELSEIF mes = 3 THEN

    PRINT "Marzo"

    ELSEIF mes = 4 THEN

    PRINT "Abril"

    ELSEIF mes = 5 THEN

    PRINT "Mayo"

    ELSEIF mes = 6 THEN

    2 7

    mailxmail - Cursos para compartir lo que sabes

  • PRINT "Junio"

    ELSEIF mes = 7 THEN

    PRINT "Julio"

    ELSEIF mes = 8 THEN

    PRINT "Agosto"

    ELSEIF mes = 9 THEN

    PRINT "Septiembre"

    ELSEIF mes = 10 THEN

    PRINT "Octubre"

    ELSEIF mes = 11 THEN

    PRINT "Noviembre"

    ELSEIF mes = 12 THEN

    PRINT "Diciembre"

    ELSE

    PRINT "Mes no vlido"

    END IF

    PRINT "S'ACAB"

    A la Palabra Clave ELSE le hemos colocado directamente la otra condicin parasimplificar un poco el Algoritmo, pero viene a ser prcticamente lo mismo. Veamosla sintaxis de forma un poco ms clara:IF condicin THEN

    bloqueInstrucciones

    ELSEIF otra condicin THEN

    bloqueInstrucciones

    ELSE

    bloqueInstrucciones

    END IF

    Si la condicin del IF se cumple se ejecutan sus instrucciones y ya est.Si no, se comprueba la condicin del primer ELSEIF y si es verdadera se ejecutan susinstrucciones y ya est.Si no, se comprueba la condicin del siguiente ELSEIF y si es verdadera se ejecutansus instrucciones y ya est.Si la condicin del ltimo ELSEIF no se cumple se ejecuta el bloque ELSE si existe.

    2 8

    mailxmail - Cursos para compartir lo que sabes

  • Puede haber tantos bloques ELSEIF con su condicin como sea necesario, pero soloun bloque ELSE (o ninguno) al final. Si no hay bloque ELSE puede suceder que no seejecute nada porque no se cumpla ninguna de las condiciones.Las condiciones no tienen que estar relacionadas de ninguna forma, aqu siemprehemos preguntado por el mes, pero podamos haber comprobado cualquier otracosa, o poner los meses desordenados.Esta estructura ELSEIF no se usa mucho y no existe en algunos otros lenguajes deprogramacin, en su lugar se usan los IF anidados como vimos en el ejemplolargusimo anterior o la estructura SELECT que veremos en el tema siguiente.Una ltima cosa antes de acabar con los IF. Si escribimos ENDIF todo junto, QBasic yVisual Basic nos lo corrigen automticamente. Esto es porque en alguna versin muyantigua del lenguaje BASIC se escriba as.

    2 9

    mailxmail - Cursos para compartir lo que sabes

  • 8. Estructura de seleccin SELECT

    En el ejemplo de instrucciones IF anidadas nos sala un pedazo de listado para decirel nombre del mes. Despus lo arreglamos un poco con las instrucciones ELSEIF.Ahora vamos a hacerlo todava un poco mejor.CLS

    INPUT "Escribe el nmero del mes: ", mes

    SELECT CASE mes

    CASE 1

    PRINT "Enero"

    CASE 2

    PRINT "Febrero"

    CASE 3

    PRINT "Marzo"

    CASE 4

    PRINT "Abril"

    CASE 5

    PRINT "Mayo"

    CASE 6

    PRINT "Junio"

    CASE 7

    PRINT "Julio"

    CASE 8

    PRINT "Agosto"

    CASE 9

    PRINT "Septiembre"

    CASE 10

    PRINT "Octubre"

    CASE 11

    PRINT "Noviembre"

    CASE 12

    PRINT "Diciembre"

    3 0

    mailxmail - Cursos para compartir lo que sabes

  • CASE ELSE

    PRINT "Mes no vlido"

    END SELECT

    PRINT "SE ACAB"

    Hemos usado una estructura nueva: La instruccin SELECT.Esta estructura es equivalente a las anteriores de IF anidados, pero es ms fcil demanejar y el programa queda ms estructurado.Si has entendido la estructura IF no te ser muy difcil entender esta.Lo primero es escribir las Palabras Clave SELECT CASE seguidas de una expresin.Esta expresin es normalmente simplemente una variable que puede ser de cadenao numrica. En este caso no tiene que devolver VERDADERO o FALSO como en los IFya que no se usan operadores relacionales ni lgicos, solo los aritmticos cuandohace falta.

    A continuacin para cada resultado posible se pone la Palabra Clave CASE y laexpresin a comparar con la del principio. Si la comparacin es verdadera se ejecutael bloque de instrucciones entre este CASE y el siguiente y se sale de la estructura. Sila condicin es falsa se ejecuta el bloque del CASE ELSE si existe y si no nada.Las expresiones de los cases se pueden poner de una de las siguientes formas:CASE 1

    Una expresin (En este caso un nmero), igual que en el ejemplo.CASE 1, 2, 3

    Varias expresiones separadas por comas.CASE 1 TO 3

    Un intervalo de valores, ambos inclusive, separados por la palabra clave TO. En estecaso si la expresin inicial era de tipo entero sern vlidos los resultados 1, 2 y 3,pero si era de tipo real sern vlidos todos los nmeros posibles entre el 1 y el 3como por ejemplo el 1.517512 y el 2.17521.CASE IS > 2

    CASE IS = 5

    CASE IS 8

    CASE IS

  • relacionales para no dejarnos "fuera" ningn valor posible, pero podemos llegar aescribir una estructura SELECT tan mal hecha como esta sin que el programa deningn error de ejecucin.SELECT CASE n

    CASE 1

    CASE 1

    CASE 3

    CASE 2 TO 4

    CASE IS < 5

    CASE IS

  • CASE 6: PRINT "Junio"

    CASE 7: PRINT "Julio"

    CASE 8: PRINT "Agosto"

    CASE 9: PRINT "Septiembre"

    CASE 10: PRINT "Octubre"

    CASE 11: PRINT "Noviembre"

    CASE 12: PRINT "Diciembre"

    CASE ELSE: PRINT "Mes no vlido"

    END SELECT

    con lo que conseguimos un listado casi la mitad ms corto.Por supuesto las expresiones tambin pueden ser de cadenas:INPUT "Escribe el nombre de un perifrico del ordenador: ", perif$

    SELECT CASE perif$

    CASE "Teclado", "Ratn"

    PRINT "Es un perifrico de entrada"

    CASE "Monitor", "Impresora"

    PRINT "Es un perifrico de salida"

    CASE "Mdem"

    PRINT "Es un perifrico de entrada/salida"

    CASE ELSE

    PRINT "Este perifrico no lo conozco"

    END SELECT

    Y por supuesto los bloques de instrucciones de los CASE pueden contener cualquiertipo de instrucciones anidadas en su interior como bloques IF, otro SELECT, etc.Si estos bloques se hacen muy largos no te asustes, solucionaremos el problemacuando lleguemos a Programacin Modular donde el SELECT servir como menpara dar entrada a distintos procedimientos o subprogramas.Casi todos los lenguajes tienen una estructura equivalente a SELECT, pero en elcaso del lenguaje C es bastante mala. Hay que tener en cuenta de que en loslenguajes de los sistemas de bases de datos (SQL) existe una instruccin SELECTque no tiene nada que ver con esto, sirve para sacar informacin de las bases dedatos.

    3 3

    mailxmail - Cursos para compartir lo que sabes

  • 9. Estructura de repeticin for... next

    Introduccin a estructuras de control repetitivas

    En los siguientes temas vamos a ver las instrucciones que existen en laProgramacin Estructurada para conseguir que un bloque de instrucciones sepuedan ejecutar ms de una vez sin necesidad de escribirlas repetidas en el listadodel cdigo fuente del programa.En lenguaje ensamblador y en las versiones antiguas da BASIC se usan instruccionesde tipo GOTO que continan la ejecucin del programa en otra parte, pero esto dalugar a programas muy reliados (Cdigo "espagueti") que son muy difciles dedepurar y pueden contener errores. Para solucionar el problema en la ProgramacinEstructuradas existen estructuras de control que encierran un conjunto deinstrucciones (con una instruccin al principio y otra al final) y lo que hacen esejecutar el bloque de instrucciones entero un nmero determinado de veces,mientras se cumpla una condicin o hasta que se cumpla una condicin, segn seala estructura. A estas estructuras tambin se las conoce como "Bucles" o "Lazos".Cmo detener un programa

    Al usar estas estructuras nos podemos encontrar con el problema de que si elprograma no est escrito correctamente nunca se salga de la estructura de controlproducindose el efecto llamado "Bucle infinito" que puede llegar a bloquear elordenador.

    En un programa normal ya compilado y terminado que se ejecute bajo Windowspuede pasar que el ordenador se bloquee y aparezca una pantalla azul recuerdo deBill Gates de tipo "El sistema est ocupado o no responde...", con lo que casi seguroque vamos a tener que reiniciar el ordenador.En los entornos de programacin esto normalmente no llegar a ocurrir. En caso deque nuestro programa se bloquee puede que se agoten los recursos del sistema y elprograma se detenga dando un error de tiempo de ejecucin y volviendo al editorde cdigo.Si el programa se queda bloqueado se puede pulsar la siguiente combinacin deteclas:Control + Pausa para detener la ejecucin del programa y volver al editor decdigo donde habr que repasar el cdigo para que esto no ocurra y el programafuncione siempre bien. En algunos casos tras pulsar esta combinacin de teclashabr que pulsar una vez la tecla ENTER para desbloquear el programa.Instruccin FOR...NEXT

    Empecemos con un ejemplo como siempre. Vamos a escribir un programa queescriba los nmeros del 1 al 5 usando las instrucciones que ya conocemos.CLS

    PRINT 1

    PRINT 2

    PRINT 3

    3 4

    mailxmail - Cursos para compartir lo que sabes

  • PRINT 4

    PRINT 5

    Como se puede ver es un programa bastante tonto. Hay cinco instrucciones casiiguales. Solo cambia el valor de la expresin que cada vez vale lo que en lainstruccin anterior ms uno, por lo tanto tambin podamos haber hecho esto:CLS

    n = 0

    n = n + 1

    PRINT n

    n = n + 1

    PRINT n

    n = n + 1

    PRINT n

    n = n + 1

    PRINT n

    n = n + 1

    PRINT n

    Se puede comprobar que el resultado es el mismo que en el programa anterior yahora s que tenemos cinco pares de instrucciones completamente idnticos. Vamosa hacer el mismo programa con la nueva instruccin FOR ("Para" en castellano):CLS

    FOR n = 1 TO 5

    PRINT n

    NEXT

    Ya est. Mira que sencillo, pero ahora viene la explicacin.Esto lo que hace es que se ejecute lo que hay entre el FOR y el NEXT cinco vecessiguiendo estos pasos: La primera vez n vale 1, como pone en la instruccin. Se ejecuta el bloque de instrucciones con n valiendo 1 AUTOMTICAMENTE n se incrementa en 1, pasando a valer 2 Se comprueba que n es menor o igual que 5, y como lo es se sigue. Se ejecuta el bloque de instrucciones con n valiendo 2 AUTOMTICAMENTE n se incrementa en 1, pasando a valer 3 Se comprueba que n es menor o igual que 5, y como lo es se sigue.

    3 5

    mailxmail - Cursos para compartir lo que sabes

  • Se comprueba que n es menor o igual que 5, y como lo es se sigue. Se ejecuta el bloque de instrucciones con n valiendo 3 AUTOMTICAMENTE n se incrementa en 1, pasando a valer 4 Se comprueba que n es menor o igual que 5, y como lo es se sigue. Se ejecuta el bloque de instrucciones con n valiendo 4 AUTOMTICAMENTE n se incrementa en 1, pasando a valer 5 Se comprueba que n es menor o igual que 5, y como lo es se sigue. Se ejecuta el bloque de instrucciones con n valiendo 5 AUTOMTICAMENTE n se incrementa en 1, pasando a valer 6 Se comprueba que n es menor o igual que 5, y como ya no lo es se sale del bucle yse ejecuta la siguiente instruccin que venga detrs del NEXT.Todo esto puede parecer muy complicado, pero con la prctica conseguiremos queesta sea una de las instrucciones ms fciles de entender de la programacin, slohabr que detenerse a pensar en estos pasos cuando algn programa no haga loque queremos y no demos con el error.Veamos la sintaxis de la instruccin FOR:FOR contador = inicio TO final

    bloqueInstrucciones

    NEXT

    contador es la variable que usaremos como contador (el FOR la modificaautomticamente) y tendr que ser de tipo numrico, normalmente entero aunquetambin puede ser real. Ya hemos hablado de los contadores en el tema de losoperadores de asignacin.inicio es una expresin numrica cuyo valor tomar el contador la primera vez.final es una expresin numrica cuyo valor lo usar el FOR de forma que soloentrar si el contador no supera al valor de esta expresin. En nuestro ejemplo elfinal era 5 y cuando el contador (n) llegaba a valer 6 ya no entrbamos.Ahora vamos a ver dos normas muy importantes que hay que seguir siempre con loscontadores de los FOR

    No debemos modificar el valor de esta variable dentro del bucle, ya lo haceautomticamente la instruccin FOR. Dicho de otra forma: No debemos asignarningn valor a esta variable hasta despus de terminar el FOR. Una vez terminado el FOR no debemos leer el valor de la variable contador porquesu valor queda indeterminado. Podremos usar esta variable ms adelante sipreviamente le asignamos un valor antes de intentar leerla.Estas normas nos las podramos saltar sin dar un error de ejecucin, pero puedeque el mismo algoritmo de distintos resultados en distintas versiones de BASIC, yaque el contador es manejado internamente por el intrprete del lenguaje de

    3 6

    mailxmail - Cursos para compartir lo que sabes

  • programacin y puede que no siempre se haga de la misma forma.Los valores inicio y fin no tienen por que ser expresiones constantes. En esteejemplo escribiremos los nmeros desde uno hasta donde quiera el usuario:CLS

    INPUT "Escribe hasta dnde quieres llegar: ", max

    FOR n = 1 TO max

    PRINT n

    NEXT

    No es necesario que tengamos que usar siempre el valor del contador para calcularalgo. Este FOR escribe "Hecho en Ronda" siete veces:FOR n = 1 TO 7

    PRINT "Hecho en Ronda"

    NEXT

    y este hace exctamente lo mismo:FOR n = 82 TO 88

    PRINT "Hecho en Ronda"

    NEXT

    El siguiente escribe los pares del 2 al 10, es decir, 2, 4, 6, 8, 10.FOR n = 1 TO 5

    PRINT n * 2

    NEXT

    En QBasic hay una forma de hacer esto ms fcilmente:FOR n = 2 TO 10 STEP 2

    PRINT n

    NEXT

    Antes veamos que el FOR incrementa automticamente al contador en 1 en cadapasada. Usando la palabra clave STEP seguida de una expresin numricaconseguimos modificar este incremento.Otro ejemplo con STEP que se explica solo.CLS

    INPUT "Escribe un nmero: ", s

    PRINT "Estos son los nmeros del 0 al 100 de "; s; " en "; s

    FOR n = 0 TO 100 STEP s

    3 7

    mailxmail - Cursos para compartir lo que sabes

  • PRINT n

    NEXT

    Todo esto funciona muy bien, espero que se entienda. Pero puede surgir una duda,supongamos que escribimos el nmero 7 y el programa escribe de siete en siete,dando este resultado:

    Escribe un nmero: 7

    Estos son los nmeros del 0 al 100 de 7 en 7

    0

    7

    1 4

    2 1

    2 8

    3 5

    4 2

    4 9

    5 6

    6 3

    7 0

    7 7

    8 4

    9 1

    9 8

    Como se puede ver, no se ha alcanzado el 100 es porque el siguiente valor quesera el 105 ya supera al 100 que es valor final del FOR y no se ejecuta.Tambin puede ocurrir que la expresin del STEP valga 0. En este caso el FORincrementar en cero el contador con lo que nunca se llegar al valor final y seproducir un bucle infinito. Habr que pulsar Ctrl+Pausa para detener el programa ycorregir el cdigo.Ahora ya podemos hacer que un FOR funcione hacia atrs, escribiendo la expresinfinal menor que la inicial y una expresin negativa en el STEP. Como ejemplo un FOR que escriba los nmeros del 10 al 1.FOR n = 10 TO 1 STEP -1

    PRINT n

    NEXT

    Si no usamos el STEP negativo y escribimos el valor final menor que el inicial, nunca

    3 8

    mailxmail - Cursos para compartir lo que sabes

  • se ejecutar el bloque FOR. Si un programa no funciona bien porque un FOR no seejecuta nunca ser conveniente revisar esto.Como siempre, dentro del bloque FOR puede ir cualquier tipo de instrucciones,incluido otro FOR. Veamos un ejemplo:FOR i = 1 TO 8

    FOR j = 1 TO 5

    PRINT "Hola"

    NEXT

    NEXT

    Cuntas veces escribir "Hola" este programa? Si el FOR interior se ejecuta entero 8veces y cada vez escribe "Hola" 5 veces, en total lo har 8 por 5 igual a 40 veces, esdecir, el producto.Este tipo de instrucciones son especialmente tiles en algoritmos que ya veremosms adelante como el recorrido de matrices. Hay que tener cuidado de no usar lamisma variable contador para los dos FOR, ya que romperamos la regla de nomodificar el valor del contador del primer FOR y el programa no funcionara bien.QBasic permite escribir a continuacin del NEXT el nombre del contador del FOR,por ejemplo:FOR i = 1 TO 8

    FOR j = 1 TO 5

    PRINT "Hola"

    NEXT j

    NEXT i

    Esto puede ser til para saber en un listado muy complicado a que FOR correspondecada NEXT, pero si encolumnamos correctamente nuestro programa esto no sernecesario.

    El FOR en Basic es bastante flexible. En otros lenguajes funciona de otra forma oincluso puede que ni siquiera exista, ya que como veremos a continuacin no esimprescindible para construir un algoritmo.

    3 9

    mailxmail - Cursos para compartir lo que sabes

  • 10. Fdsafdsaestructura de repeticin WHILE...END

    En este tema vamos a ver una estructura repetitiva ms primitiva que el PARA ya queno maneja automticamente el contador y por lo tanto es ms difcil de utilizar,pero usada correctamente puede ser bastante ms flexible.Recordemos el ejemplo de escribir los nmeros del 1 al 5 con la instruccin FOR.FOR n = 1 TO 5

    PRINT n

    NEXT

    Ahora veremos como se hace lo mismo en QBasic usando la instruccin WHILE(Mientras).n = 1

    WHILE n

  • Volvemos al WHILE y se comprueba su condicin: como n vale 5 que es menor oigual que 5, entramos. Se ejecutan las instrucciones del bloque con n valiendo 5. La ltima instruccinincrementa n en 1, con lo que pasa a valer 6. Volvemos al WHILE y se comprueba su condicin: como n vale 6 que ya no esmenor o igual que 5, no entramos y pasamos a la siguiente instruccin que hayadetrs del WEND.Se puede ver que el funcionamiento es parecido al del FOR, solo que aqu lotenemos que controlar todo nosotros. Las dos reglas que dijimos sobre loscontadores del FOR ya aqu no tienen sentido porque de hecho nosotros vamos atener que incrementar el contador haciendo una asignacin y una vez terminadopodemos estar seguro del valor que tiene la variable.Una norma que s conviene respetar (Aunque no siempre es necesario) es que lainstruccin que incrementa el contador sea la ltima del bloque, ya que si est enotro sitio ejecutaremos unas instrucciones con un valor y las dems con el otro, conlo que nos podemos liar. Un error muy tpico es que se nos olvide de poner lainstruccin de incrementar el contador, produciendo un bucle infinito que har quenuestro programa no termine nunca. Si un programa se bloquea es convenienterevisar esto.

    Tambin puede pasar que no lleguemos a entrar al MIENTRAS porque la condicinya sea falsa la primera vez, por ejemplo:contador = 120

    WHILE contador < 100

    PRINT "Esto no se va a llegar a escribir nunca.

    contador = contador + 1

    WEND

    Hasta ahora hemos hablado de contador, pero como veremos en los ejemplospodemos usar un acumulador, o ninguno de los dos, ya que la condicin del WHILEpuede ser cualquiera y no hay porqu contar ni acumular algo siempre.Veamos algunos ejemplos de MIENTRAS:Rutina que escribe del 0 al 100 de 2 en 2:c = 0

    WHLE c

  • WHILE c >= 1

    PRINT c

    c = c - 1

    WEND

    Calcular el factorial de un nmero que pedimos al usuario (Este ejemplo se mejoraren otro tema ms adelante):INPUT "Escribe un nmero para calcular su factorial: ", num

    c = 1

    factorial = 1

    WHILE c

  • 11. Estructura de repeticin DO...LOOP

    ESTRUCTURA DO...LOOP

    Esta estructura es similar a la WHILE, solo que la condicin se especifica al final delbloque, con lo que puede ser ms fcil de entender y nunca tendremos que hacer"lecturas anticipadas" ya que siempre se entra por lo menos una vez.La principal novedad de este bloque es que podemos repetir las instrucciones MIENTRAS se cumpla la condicin o HASTA que se cumpla.El siguiente ejemplo escribe los nmeros del 1 al 5 usando una instruccinDO...LOOP WHILE que hace que el bucle se ejecute MIENTRAS nuestro contador seamenor que 5.n = 0

    DO

    n = n + 1

    PRINT n

    LOOP WHILE n < 5

    Observa que el contador se incrementa al principio del bucle, y por lo tanto laprimera vez que escribamos n, ya tendr el valor de 1. La ltima vez escribir 5 y alllegar a la condicin se comprobar que NO es menor que 5 y ya salimos.Ahora haremos lo mismo con la instruccin DO... LOOP UNTIL que ejecutar elbloque HASTA QUE el contador llegue a valer 5.n = 0

    DO

    n = n + 1

    PRINT n

    LOOP UNTIL n = 5

    Esto es parecido. Observa que la condicin es justo la contraria. La ltima vez n vale5 y despus de escribirla se comprueba que la condicin es verdadera y se sale delbucle.

    Las instrucciones DO...LOOP UNTIL son normalmente las ms fciles decomprender. En la ayuda de QBasic recomiendan que se dejen de usar lasinstrucciones WHILE...WEND para usar mejor las DO...LOOP, pero algunas veces sermejor usar las WHILE...WEND como en el caso de los ficheros secuenciales que yaveremos ms adelante.DEPURACIN DE DATOS DE ENTRADA

    Ahora ya estamos en condiciones de ver una forma de conseguir que un programaque requiere la intervencin del usuario para introducir datos de entrada no avance HASTA QUE el usuario no escriba los datos correctos.

    4 3

    mailxmail - Cursos para compartir lo que sabes

  • En el tema de Entrada/Salida vimos que QBasic es capaz de controlar que no semetan valores fuera de rango, por ejemplo que si el programa pide un entero no sepueda escribir un nmero mayor de 32767. Aqu lo que vamos a ver es comoconseguir que se pidamos un mes el programa no avance hasta que el usuarioescriba un nmero entre 1 y 12. Esto lo deberamos hacer en cualquier programasiempre que pidamos al usuario que escriba algo.Para hacer este control lo que hacemos es meter la instruccin INPUT dentro de unbloque REPETIR, del que no salimos HASTA que la respuesta sea correcta oMIENTRAS sea incorrecta.Vamos a ver unos ejemplos que aclararn todas las posibles situaciones.Leer un nmero menor que 100CLS

    DO

    INPUT "Escribe un nmero menor que 100: ",num

    LOOP UNTIL num < 100

    Aqu no seguimos hasta que el nmero sea menor que 100. En el siguiente ejemploseguiremos repitiendo la pregunta mientras el nmero sea mayor o igual que 100CLS

    DO

    INPUT "Escribe un nmero menor que 100: ",num

    LOOP WHILE num >= 100

    Puedes volver a comprobas aqu que para el mismo problema la condicin del LOOPWHILE es justo la inversa a la del LOOP UNTIL.Ahora pedimos un mes, que tiene que ser entre 1 y 12CLS

    DO

    INPUT "Escribe un mes (0 a 12): ",mes

    LOOP UNTIL (mes >= 1) AND (mes 12)

    4 4

    mailxmail - Cursos para compartir lo que sabes

  • LOOP WHILE (mes < 1) OR (mes > 12)

    Ahora no salimos MIENTRAS alguna de las dos condiciones se cumpla, son justo lascontrarias a la del ejemplo anterior, ya que usamos el operador OR que tambin sepuede decir que es el contrario al AND.Por ltimo vamos a ver un problema muy tpico: Un programa que nos pide unaclave de acceso para poder seguir. Este es el caso ms sencillo en el que nopasamos hasta que no demos con la clave, otros problemas ms complicados seranque el programa terminara tras varios intentos fallidos o que admitiera varias clavesllevndonos segn la que sea a una parte del programa.CONST ClaveCorrecta$="brete Ssamo"

    CLS

    DO

    INPUT "Escribe la clave: ",clavePrueba$

    LOOP UNTIL clavePruebas = claveCorrecta$

    PRINT "Ya has entrado"

    Recordar tambin que en un programa terminado para explotacin la clave nunca vaa estar en el listado del programa, sino que ser obtenida de algn tipo de fichero obase de datos para que el usuario tenga la posibilidad de cambiarla.

    4 5

    mailxmail - Cursos para compartir lo que sabes

  • 12. Arrays. QBASIC

    INTRODUCCIN A LOS ARRAYS

    Hasta ahora hemos usado variables para guardar la informacin que maneja elprograma. Una variable con su nombre y su tipo para cada dato (nombre, cantidad,nivel, precio, edad...) que nos haca falta. Pero Qu ocurre si nuestro programatiene que manejar una coleccin de datos muy grande como los nombres de unaagenda o los precios de un catlogo? Se podra hacer usando 100 variables distintaspero el algoritmo llegara a ser terriblemente complicado y muy poco funcional. Eneste apartado vamos a ver cmo podemos asignar un mismo nombre de variablepara muchos datos y referirnos a cada uno de ellos de forma individual usando unnmero al que llamaremos ndice.Usaremos unas estructuras de datos llamadas arrays, de las que se dice que son"Estructuras estticas de almacenamiento interno". Son estticas porque su tamao se declara al principio del programa y ya no sepuede modificar. Si hacemos un programa que trabaje con 100 nombres siempre lohar con 100 aunque solo lleguemos a usar 20, y nunca podr trabajar con ms de100.

    Son de almacenamiento interno porque estn en la memoria RAM del ordenador,como variables que son, y su tiempo de vida slo dura mientras se ejecuta elprograma. Al terminar se pierde su contenido.En programacin normalmente se conocen como "Arrays" aunque su nombre mscorrecto en castellano sera "formaciones".Como veremos en los apartados siguientes, los arrays de 1 dimensin se llamanvectores, los de 2 dimensiones se llaman matrices y los de 3 o ms se llamanpoliedros o arrays multidimensionales.En informtica muchas veces se llama vector a cualquier array. En la ayuda deQBasic (y de Visual Basic) siempre llaman Matriz a cualquier array, por lo que hayque tener cuidado de no liarse.VECTORES

    Imaginemos un bloque de pisos de cuatro plantas.

    Vamos a escribir un programa de la forma que sabemos hasta ahora que nospregunte el nombre de la persona vive en cada piso y una vez que ha recopiladotoda esa informacin, nos deje preguntarle quien vive en el piso que nosotros

    4 6

    mailxmail - Cursos para compartir lo que sabes

  • queramos.CLS

    INPUT "Nombre de quien vive en el 1: ", nombre1$

    INPUT "Nombre de quien vive en el 2: ", nombre2$

    INPUT "Nombre de quien vive en el 3: ", nombre3$

    INPUT "Nombre de quien vive en el 4: ", nombre4$

    DO

    INPUT "Escribe un piso para ver quien vive en l: ",n

    LOOP WHILE (n < 1) OR (n > 4)

    SELECT CASE n

    CASE 1: PRINT "En el 1 vive "; nombre1$

    CASE 2: PRINT "En el 2 vive "; nombre2$

    CASE 3: PRINT "En el 3 vive "; nombre3$

    CASE 4: PRINT "En el 4 vive "; nombre4$

    END SELECT

    El resultado podra ser este:Nombre de quien vive en el 1: Paca

    Nombre de quien vive en el 2: Manolo

    Nombre de quien vive en el 3: Lola

    Nombre de quien vive en el 4: Pepe

    Escribe un piso para ver quien vive en l: 3

    En el 3 vive Lola

    Un listado un poco largo para hacer algo tan sencillo. Si en vez de cuatro pisosfueran 40 tendramos un programa casi diez veces ms largo con muchas partescasi iguales, pero que no podemos meter en bucles repetitivos porque cada variablees distinta. Observa que comprobamos que el piso sea entre 1 y 4, a partir de ahorava a ser muy importante depurar los datos de entrada, ya veremos por qu.Ahora vamos a escribir un programa que haga lo mismo que el anterior, pero usandoun VECTOR.DIM nombre$ (1 TO 4)

    FOR n = 1 TO 4

    PRINT "Nombre de quien vive en el"; n; ": ";

    INPUT "", nombre$(n)

    NEXT

    4 7

    mailxmail - Cursos para compartir lo que sabes

  • NEXT

    DO

    INPUT "Escribe un piso para ver quien vive: ",n

    LOOP WHILE (n < 1) OR (n > 4)

    PRINT "En el";n;" vive ";nombre$(n)

    El resultado sera similar, pero el listado es mucho ms corto, especialmente todo el SELECT CASESELECT CASE anterior que se ha transformado en una sola instruccin.Vamos a ver este programa lnea a lnea.La primera instruccin es nueva. En ella lo que hacemos es DECLARAR una variableque se va a llamar nombre$ (como lleva el $ va a ser de tipo texto) y va a poderguardar cuatro valores a los que accederemos con subndices que van desde el 1hasta el 4. Para determinar este intervalo de valores hay que usar nmeros enterosconstantes, no valen expresiones matemticas.En el siguiente bloque FOR, que se ejecutar 4 veces lo que hacemos es ir pidiendoal usuario que escriba los nombres. La primera vez guardamos lo que escriba en laposicin 1 del vector porque hacemos referencia al ndice 1 entre parntesis acontinuacin del nombre del vector. La siguiente vez al ndice 2, la siguiente vez al3 y la ltima vez que se ejecute el bucle hacemos referencia al ndice 4. A esto es alo que se llama "Recorrer el vector" ya que hemos hecho algo con cada uno de suselementos. Normalmente esto lo haremos siempre con un bucle FOR, que es lo mscmodo. La pregunta de "nombre de quien vive en..." no est en el INPUT porqueesta instruccin no evala expresiones, por eso est antes en un PRINT normal conun punto y coma al final para que el cursor no pase a la siguiente lnea.Ahora ya tenemos dentro del vector los cuatro nombres para usarlos comoqueramos haciendo referencia al nombre del vector y al subndice entre parntesis.Para hacer referencia a los subndices de un array se puede usar cualquierexpresin, no tiene porqu ser un nmero constante, pero hay que tener cuidado deno hacer nunca referencia a ndices que no existanEn el siguiente bloque pedimos al usuario que escriba el nmero de un piso y loguardamos en la variable N. Obligamos a que sea un nmero entre 1 y 4.Al final viene lo espectacular. Para acceder a cualquiera de los ndices del vector sepuede hacer directamente tomando el valor de la variable N como subndice sinnecesidad de controlar cada valor por separado como antes.Vamos con otro ejemplo para que todo esto vaya quedando cada vez ms claro.En temas anteriores tenamos un programa para escribir el nombre de un mes apartir de su nmero. Lo hicimos con muchos IF anidados, despus con ELSEIF y porltimo con SELECT CASE que ya quedaba mucho ms corto, pero de ninguna formanos libramos de escribir todo el SELECT CASE y todos los meses en cualquier partedel programa dnde queramos que se escriba el nombre de algn mes.Ahora vamos a plantear el problema de otra forma:DIM mese$ (1 TO 12)

    mese$(1)="Enero"

    4 8

    mailxmail - Cursos para compartir lo que sabes

  • mese$(2)="Febrero"

    mese$(3)="Marzo"

    mese$(4)="Abril"

    mese$(5)="Mayo"

    mese$(6)="Junio"

    mese$(7)="Julio"

    mese$(8)="Agosto"

    mese$(9)="Septiembre"

    mese$(10)="Octubre"

    mese$(11)="Noviembre"

    mese$(12)="Diciembre"

    '(...)

    PRINT mese$(2) 'Escribe Febrero

    '(...)

    n = 6

    PRINT mese$(n) 'Escribe Junio

    Hemos declarado un vector de cadenas de 12 posiciones llamado mese$. Alprincipio del programa llenamos el vector con los nombres de los meses, cada unoen su lugar correcto. Donde nos haga falta el nombre de un mes slo tendremosque usar el vector y referirnos al mes que queramos. De esta forma meses (3) nosdevolver "Marzo" y si n vale 11 entonces meses(n) nos devolver "Noviembre".En los dos ejemplos que hemos puesto los ndices de los vectores han empezado enel 1, pero esto no tiene que ser siempre as. En QBasic pueden empezar porcualquier nmero incluso negativo, aunque lo ms normal es que siempre empiecenpor 1 o por 0. El valor ms bajo posible para los ndices es -32768 y el ms alto es32767. Por supuesto el final del intervalo no puede ser menor que el principio.Veamos algunos ejemplos ms de declaracin de vectores.DIM alumno$(1 TO 30) '30 cadenas

    DIM nota (1 TO 30) '30 nmeros reales

    DIM ventas_verano%(6 TO 9) '4 enteros

    Tambin podemos declarar vectores de un solo elemento, aunque esto puede queno tenga mucho sentido.DIM nmero (1 TO 1)

    Para determinar el tamao de cualquier vector usamos la siguiente frmula:LTIMO INDICE - PRIMER NDICE + 1

    4 9

    mailxmail - Cursos para compartir lo que sabes

  • As en el ejemplo de los meses resulta 12 - 1 + 1 = 12 elementos, muy sencillo no?pero a veces terminaremos contando con los dedos.Para inicializar un vector (Borrarlo entero) no hace falta recorrerlo, podemos hacer:ERASE (nombre_vector)

    Y el vector se quedar lleno de ceros si es numrico o de cadenas vacas ("") si es decadenas. Recordemos que en QBasic todas las variables estn a cero al principio,pero en otros lenguajes no.Ahora vamos a ver el problema ms tpico de los vectores (y en general de todos losarrays). No podemos intentar acceder a subndices que no existen. En caso de quellegue a ocurrir en QBasic se producir un error de tipo "Subndice fuera delintervalo" y el programa se detendr sin mayores consecuencias. En muchos otroslenguajes no ocurrir nada, pero si estamos leyendo sacaremos datos de otrasposiciones de memoria que no son nuestras de ms all del final del vector y siestamos escribiendo lo haremos sobreescribiendo otros datos importantes para elprograma o incluso para el sistema operativo (DOS o WINDOWS) con lo que casiseguro conseguiremos que el ordenador se quede bloqueado. Imagina que en unprograma (No de QBasic) ocurre esto y va a parar a un registro estratgico delsistema operativo un nmero que equivale de alguna forma a la llamada al programade formatear el disco duro, no veas el estropicio.De ah la importancia de depurar los datos de entrada, especialmente los que van aservir como ndices para arrays. Si en nuestro primer ejemplo no depuramos el datodel piso que pedimos al usuario y este escribe uno que no est entre cero y cuatro,al acceder al vector se producira este error.MATRICES

    Ahora imaginemos este otro bloque de pisos, para el que tenemos que hacer unprograma similar al anterior.

    Vamos a escribir el programa. Ser igual que el anterior, habr que controlar lascuatro plantas pero adems dentro de cada una habr que controlar las tres puertasque hay en cada rellano (1, 2 y 3).DIM nombre$ (1 TO 4, 1 TO 3)

    FOR piso = 1 TO 4

    5 0

    mailxmail - Cursos para compartir lo que sabes

  • FOR puerta = 1 TO 3

    PRINT "Nombre de quien vive en el"; piso; ""; puerta; ": ";

    INPUT "", nombre$(piso, puerta)

    next

    NEXT

    PRINT "Para saber quien vive en un piso..."

    DO

    INPUT " Escribe el piso: ",piso

    LOOP WHILE (piso < 1) OR (piso > 4)

    DO

    INPUT " Escribe la puerta: ", puerta

    LOOP WHILE (puerta < 1) OR (puerta > 3)

    PRINT "En el";piso;"";puerta;" vive ";nombre$(piso, puerta)

    Se puede ver que es muy parecido, pero hemos utilizado una MATRIZ, que es un arrayarray de dos dimensiones, mientras que un vector es un array de una soladimensin. Por si hay alguna duda de lo que hace este programa vamos a ver unposible resultado.Nombre de quien vive en el 1 1: Paca

    Nombre de quien vive en el 1 2: Gloria

    Nombre de quien vive en el 1 3: Fernando

    Nombre de quien vive en el 2 1: Mari

    Nombre de quien vive en el 2 2: Juan

    Nombre de quien vive en el 2 3: Manolo

    Nombre de quien vive en el 3 1: Lola

    Nombre de quien vive en el 3 2: Rosa

    Nombre de quien vive en el 3 3: Mario

    Nombre de quien vive en el 4 1: Pepe

    Nombre de quien vive en el 4 2: Nacho

    Nombre de quien vive en el 4 3: Luisa

    Para ver quien vive en un piso...

    Escribe la planta: 3

    Escribe la puerta: 2

    5 1

    mailxmail - Cursos para compartir lo que sabes

  • En el 3 2 vive Rosa

    Lo ms novedoso es la forma de declarar la matriz, igual que el vector pero esta vezhabr que usar dos intervalos separados por una coma. Y por lo tanto siempre quenos refiramos a la matriz habr que usar dos subndices.Para recorrer la matriz hay que usar dos FOR anidados. Esta vez la hemos recorridopor filas (pisos en nuestro ejemplo) ya que el "FOR piso" est fuera y hasta que nose ejecute entero el "FOR puerta" en cada piso no pasamos al siguiente. Pararecorrerla por columnas (puertas) bastara con intercambiar los FOR:FOR puerta = 1 TO 3

    FOR piso = 1 TO 4

    '(...)

    next

    NEXT

    Para el ordenador es completamente intrascendente que lo hagamos de una forma uotra, l no entiende de filas horizontales ni columnas verticales, de hecho almacenatodos los elementos seguidos uno detrs de otro y hace operaciones matemticascon los dos subndices para determinar la nica posicin del elemento.Esto se puede ver fcilmente pensando en la posicin de los buzones de correos enel portal del bloque de pisos.

    Cada piso tiene su buzn, el del 2 2 es el quinto porque tiene delante los tres dela primera planta y es el segundo de la segunda. Para calcular las posiciones se hacealgo as como ((PLANTA-1)*N_total_de_PUERTAS)+PUERTA, que sale ((2-1)*3)+2 = 5.A nosotros esto no nos interesa porque lo hace QBasic automticamente. Siprogramamos en otros lenguajes ms primitivos s que habra que preocuparse deesto porque slo existen vectores de una dimensin.

    POLIEDROS

    Lo ms normal es usar vectores (1 dimensin) o matrices (2 dimensiones), peroQBasic puede llegar a manejar arrays con hasta 60 dimensiones.Veamos un caso rebuscado de un array de tres dimensiones ampliando los ejemplosanteriores de los bloques de pisos.

    5 2

    mailxmail - Cursos para compartir lo que sabes

  • En este caso nuestro bloque tiene tres portales (1 a 3) y cada uno de ellos tienecuatro plantas y tres puertas igual que antes.Para declarar el poliedro habra que hacer:DIM nombre$ (1 TO 3, 1 TO 4, 1 TO 3)

    La primera dimensin va a ser para los portales, la segunda para los pisos y latercera para las puertas.Para recorrer el array haramos:FOR portal = 1 TO 3

    FOR piso = 1 TO 4

    FOR puerta = 1 TO 3

    '(...)

    NEXT

    NEXT

    NEXT

    Esta vez tenemos tres bucles FOR anidados y las instrucciones que pongamosdentro de todo se ejecutarn 36 veces que es el producto de todas las dimensiones.Ya empezamos a liarnos pensando en recorrer el array primero por portales o no,etc... Todava podemos tener una representacin visual del problema, pero siusamos arrays de cuatro, cinco o ms dimensiones ya esto no ser as y la habremosliado del todo. En estos casos lo mejor ser plantear el problema de otra forma ousar estructuras de datos ms flexibles que ya veremos ms adelante.AHORRAR ESPACIO EN LOS ARRAYS DE CADENAS

    Hasta ahora no hemos sido demasiado estrictos en el ahorro de memoria ya que nisiquiera estamos declarando las variables. Nuestros programas de QBasic son muysencillos y usan muy pocas variables, pero al trabajar con arrays hay que darsecuenta que basta con declarar una matriz de 20 por 20 elementos para que segasten 400 posiciones de memoria.En las cadenas QBasic no nos limita el nmero de caracteres que vamos a poder

    5 3

    mailxmail - Cursos para compartir lo que sabes

  • meter en ellas y para que esto funcione se gasta cierta cantidad de memoria (unos10 bytes), que si multiplicamos por 400 posiciones de memoria son casi 4 KB, unacantidad respetable para programas tan pequeos.Puede ocurrir que en nuestra matriz de cadenas no lleguemos a almacenar palabrasms largas de por ejemplo 15 letras con los que nos convendra limitar el tamao delas cadenas y ahorrarnos esos 10 bytes en cada posicin.Para declarar un array de cadenas de tamao limitado haramos:DIM matriz(1 TO 20, 1 TO 20) AS STRING * 15

    Las palabras clave AS STRING declaran explcitamente la variable como de tipocadena (Esta ser la forma normal de hacerlo en Visual Basic), por eso ya no esnecesario poner el $ al final del nombre. Si a continuacin ponemos un asterisco yun nmero estamos limitando el tamao de las cadenas con lo que QBasic ya notendr que determinarlo automticamente constantemente, con lo que ahorraremosmemoria y el programa funcionar algo ms rpido.Si asignamos a estas variables una cadena de ms de 15 caracteres no ocurre nada,simplemente la cadena se corta y slo se almacenan los primeros 15 caracteres, losdems se pierden.En los tipos numricos no podemos ahorrar nada, pero en los arrays de cadenasdeberamos hacer siempre esto, especialmente si van a contener muchos elementos.

    5 4

    mailxmail - Cursos para compartir lo que sabes

  • 13. Matrices orladas en QBASIC

    Imaginemos el juego del buscaminas en el que tenemos una matriz de 8 por 8elementos (Casillas) que van a contener un 1 si contienen una mina o un cero siestn vacas.

    Cuando el usuario destape una casilla, si no contiene una mina, habr que escribir elnmero de minas que la rodean. Para hacer esto habr que sumar los valores de lascasillas que hay arriba a la izquierda, arriba, arriba a la derecha, a la derecha, abajoa la derecha, abajo, abajo a la izquierda y a la izquierda.Si estamos en una casilla del interior del tablero esto funciona perfectamente, perosi estamos en el borde nos encontramos con el problema de que haramosreferencia a posiciones de fuera de la matriz con lo que se producira un error de"Subndice fuera del intervalo".Para evitar esto habra que comprobar que si estamos en el borde superior no secuenten las casillas superiores, si estamos en el inferior no se cuenten las de abajo,si estamos en una esquina solo se cuenten las tres de dentro, etc. con lo quetendramos en total nueve rutinas diferentes, as como que controlar cul de ellasusar segn por donde est la casilla que estamos destapando.Para solucionar este problema lo que se suele hacer es dotar a la matriz de ms filasy columnas de forma que todos los elementos que realmente nos interesan estnrodeados por un "borde" de elementos vacos que estarn ah slo para poder hacerreferencia a ellos sin salirnos de la matriz.

    Una representacin grfica de la matriz orlada podra ser esta, donde hay un bordede "casillas" que no vamos a usar nunca para poner minas, pero a las que podemosreferirnos siempre que sea necesario sin salirnos de la matriz. En el ejemplo que nosocupa, estas posiciones contendran el valor 0 ya que estn vacas.

    Esta tcnica se aplica mucho en juegos de este tipo, en programas de imgenes y encualquier lugar donde se tenga que acceder a posiciones de una matriz y puedanproducirse problemas en los bordes. En el caso de vectores habra que aadir unelemento ms al principio y otro al final, para los poliedros sera como envolverlocompletamente y en el caso de arrays de ms de cuatro dimensiones ya es difcil

    5 5

    mailxmail - Cursos para compartir lo que sabes

  • imaginarse como se hara.Hay que recordar que en QBasic se pueden usar subndices negativos, pero en lamayora de otros lenguajes de programacin esto no es as.El nico inconveniente de las matrices orladas es que ocupan ms memoria,exactamente (2*(alto+ancho))+4 posiciones ms. Este gasto de recursos estjustificado en la mayora de los casos ya que se consigue simplificar mucho losprogramas.FORMACIONES DINMICAS

    En otros lenguajes de programacin ms avanzados como C o Pascal existen lo quese llaman "Estructuras de almacenamiento dinmicas" que son tcnicas deprogramacin que mediante la utilizacin de punteros (Variables especiales quecontienen direcciones de memoria) permiten acceder directamente a la memoria delordenador y colocar los datos en estructuras como listas enlazadas, rboles, pilas,colas, tablas hash, etc. cuyo tamao cambia constantemente durante la ejecucindel programa sin estar definido de ninguna forma en el cdigo del programa. Poreso se dice que son estructuras de almacenamiento dinmicas.Como QBasic (ni Visual Basic) no trabaja directamente con punteros no podemosllegar a utilizar