Está en la página 1de 88

mailxmail - Cursos para compartir lo que sabes

Algoritmos en QBASIC. Manual


Autor: abraham sopla

mailxmail - Cursos para compartir lo que sabes

Presentacin del curso


Este manual de QBASIC es una coleccin linkografica y bibliogrfica sobre el uso de QBASIC 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 y dominio del lenguaje y el segunda parte se encuentran un conjunto de ejercicios propuestos en la web, adecuados para resolverlos en lenguaje QBASIC mas el compendio de 39 algoritmos que resolvemos al final de este documento que incluyen muchos problemas prcticos habidos a lo largo de los ocho aos de experiencia como docente universitario.

mailxmail - Cursos para compartir lo que sabes

1. Introduccin. computacin con QBASIC


El presente trabajo es una coleccin linkografica y bibliogrfica sobre el uso de QBASIC frente a la propuesta de solucionar los casos ms comunes de algoritmia diseado para guiar a los estudiante en el curso de computacin I que se dicta en la Carrera Profesional de Ingeniera Agroindustrial de la Universidad Nacional Toribio Rodrguez de Mendoza de Amazonas. EL texto est dividido en dos partes. La primera referida al uso y dominio del lenguaje y el segunda parte se encuentran un conjunto de ejercicios propuestos en la web, adecuados para resolverlos en lenguaje Qbasic mas el compendio de 39 algoritmos que resolvemos al final de este documento que incluyen muchos problemas prcticos habidos a lo largo de los ocho aos de experiencia como docente universitario, los mismos que en su oportunidad han sido solicitados por los estudiantes de la universidad y algunos centros de estudios superiores al e-mail abrahamsopla@hotmail.com, otros son propuestos como ejercicios exmenes de graduacin en el I.S.T. Per Japn, entre ellos estn los ms conocidos como los referidos al factorial, serie Fibonacii, cambio de base de nmeros, Mnimo Comn Mltiplo y Mximo Comn Divisor, ordenacin, entre otros. Para cada solucin se usa el lenguaje Basic, quedando claro que los mismos se podrn escribir en otros lenguajes. Por otro lado agradecer seguir proponindome la solucin de otros problemas de algoritmos en cualquier lenguaje como C++, Pascal, Basic, Power Builder, PHP, etc., aparte que tambin puede encontrar otros algoritmos en pseudo cdigo y programados en lenguaje C++ en mi texto electrnico Algoritmos y Lenguaje C publicado en la web de MailxMail, muy sencillo para principiantes en la vida universitaria. Los mismos que para probarlos bastan copiar y pegar los pseudocdigos al lenguaje Qbasic y copiarlos al block de notas y guardarlos con la extensin .bas y ejecutarlos desde el Basic. Finalmente slo queda decir: ojal nuestro esfuerzo le sirva en algo.

mailxmail - Cursos para compartir lo que sabes

2. El QBASIC es sencillo y no requiere una estructura bsica


Veamos en un momento como sera un programa en lenguaje PASCAL que haga lo mismo 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)y la de escribir (writeln en PASCAL y cprintf en C), pero Por que llevan punto y coma 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 que queremos que haga el programa y ya est. Estas estructuras bsicas son necesarias en los otros lenguajes ms avanzados, pero en QBasic como slo vamos a aprender as lo tenemos ms fcil sin tener que escribir cosas que todava no entendemos. ESCRIBIR COMENTARIOS Se usan comentarios dentro del listado del programa para explicar su funcionamiento. Lo que pongamos en los comentarios no altera para nada el funcionamiento del programa. Los comentarios Ayudan a documentar el programa, sobre todo cuando son programas largos En QBasic para escribir un comentario ponemos un apstrofo ('). Veamos el ejemplo con comentarios: ' Nombre: PROGRAMA HOLA MUNDO ' Sirve para: Escribe en la pantalla "Hola Mundo" ' 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 algunas instrucciones, en este caso de todas, hemos explicado para que sirven. En los programas ya terminados es conveniente poner la cabecera siempre y explicar las instrucciones ms complicadas. El formato de la cabecera vendr especificado en el proyecto, por ejemplo que contenga el nombre del programa, una descripcin corta, el autor y la fecha. En nuestros 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

mailxmail - Cursos para compartir lo que sabes

3. Variables en QBASIC
Vamos a escribir un programa un poco ms complicado que nos pregunte nuestro nombre y nos salude. El resultado (lo que se ve en pantalla al ejecutarlo) podra ser el siguiente: Cmo te llamas? Kike Hola Kike El programa borrar la pantalla luego nos preguntar por nuestro nombre, nos dejar 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 separados por una coma. Esta instruccin lo que hace es dejar al usuario del programa que escriba 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 el usuario 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 el usuario y que le hemos llamadonombre$para despus poder localizarlo. La siguiente instruccin, PRINT,es la misma que en el anterior programa. Lo que hace 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 a continuacin todo seguido escribir el valor que haya guardado en la variable nombre$.No escribir Hola nombre$porque nombre$ no est entre comillas. Esto de las variables es una de las cosas ms importantes de los lenguajes de programacin. Los programas van a manejar datos que estarn grabados en la memoria del ordenador. Si no existieran las variables tendramos que saber en qu posicin exacta los guardamos y despus para recuperarlos habra que escribir los nmeros de las direcciones de memoria y saber exactamente cunto largo son los datos. Esto es muy complicado (Esto es lo que se hace en los Lenguajes Ensambladores), para hacerlo aqu ms sencillo usaremos los nombres de variables y QBasic se encargar de ver en qu lugar fsico de la memoria mete la informacin 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 anterior usaba una variable de texto o de cadena de caracteres para almacenar nuestro nombre, 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 5

MNIMO Y MXIMO

mailxmail - Cursos para compartir lo que sabes


NOMBRE SUFIJO DESCRIPCIN MNIMO Y MXIMO STRING $ Texto con cualquier carcter 0 a 32767 caracteres INTEGER % Nmeros enteros -32768 a 32767 Nmeros enteros ms 2.147.483.647 a LONG & grandes -2.147.483.648 SINGLE ! Nmeros con decimales 2,8x1045 a -2,8x1045 DOUBLE # 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 tipo Cadena (STRING)cuyo nombre llevar al final el carcter $. Para guardar nmeros tendremos que usar alguno de los otros cuatro tipos de variables. 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 con ellas muy rpido. Si los nmeros enteros van a llegar a ser mayores de 32.767 tendremos que utilizar una variable de tipo Entero largo (LONG) en la que "caben" hasta nmeros mayores que dos mil millones. Si vamos a usar nmeros reales (que pueden llevar decimales) tendremos que usar variables de precisin sencilla (SINGLE). Para algn clculo que necesite obtener resultados con muchos decimales usaremos las variables de doble precisin (DOUBLE) que son ms lentas de manejar y ocupan ms memoria que las anteriores. Si intentamos guardar en una variable un valor ms grande (o ms pequeo si es negativo) de lo que permite su tipo de datos, se producir un "Error de Tiempo de Ejecucin" y el programa se parar. NOMBRES DE VARIABLES Cada variable llevar un nombre que nosotros decidamos para usarla en nuestro programa. Tenemos que elegir nombres que no sean demasiado largos y que tengan algo 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.

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, por lo tanto una variable que se llame nivel ser la misma que Nivel, NIVEL o niVEL. De hecho cuando cambiemos las maysculas y minsculas de una variable se cambiarn todas las que ya haya escritas en el resto del programa, es decir, si hemos escrito en un sitio puntos y despus escribimos PuntoS en otro sitio, la anterior tambin se cambiar a PuntoS. Por convenio los nombres de las variables se escriben todo en minsculas para diferenciarlos visualmente de las Palabras Claves que se van poniendo en maysculas automticamente. Si una variable lleva dos palabras se suele escribir la primera letra de la segunda palabra en maysculas para separar un poco, por ejemplo nombreJugador totalActivo o nuevoRegistro. En las variables que deberan llevar la hay varias formas: Para ao se suele escribir cosas como ano, anno o anyo.De los acentos pasamos. En Visual Basic se pueden 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 al principio del programa. Esto significa escribir una instruccin que diga algo as como "Voy a usar una variable que se va a llamar nombre y va a ser de tipo cadena"y as con cada una de las variables que vayamos a usar en el programa. En QBasic NO hace falta declarar las variables. La primera vez que escribimos el nombre de una variable QBasic reserva en memoria el espacio para utilizarla y ya est disponible durante el resto del programa, pero Cmo 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 cada tipo de datos tena un smbolo distinto.

NOMBRE SUFIJO STRING $ 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 la variable, por ejemplo si nombre va a contener texto escribiremos nombre$ (Como hicimos en el ejemplo). A esto se llama declaracin implcita, ya que dentro del nombre va incluido el tipo de datos. Ahora Qu pasa si escribimos en distintos sitios el mismo nombre de variable con distintos 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 completamente distintas, 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 funciona perfectamente, pero a lo mejor no hace lo que esperbamos. Para evitar esto hay que poner a las variables nombres ms descriptivos, y si en este caso de verdad queramos dos variables es mejor ponerles nombres distintos para evitar confusiones. En la prctica a partir de ahora vamos a poner el sufijo $ a las variables de cadena y las dems las dejamos sin sufijo para que sean reales que admiten nmeros muy grandes con o sin decimales. Si furamos a hacer programas muy depurados sera conveniente usar los otros tipos de variables cuando fuera necesario para que fueran ms eficientes con el consumo de memoria. Las variables al ser usadas la primera vez antes de asignarles (guardar en ellas) ningn valor contienen un texto de longitud cero si son de cadena, o el nmero 0 si son de otro tipo. En otros lenguajes de programacin esto no es as y contienen cualquier valor que hubiera en esa posicin de memoria de otros programas 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 que se usa por primera vez (desde que se declara o se ejecuta la lnea donde su nombre aparece 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 vez anterior que ejecutamos el programa.

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 el teclado 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 en pantalla para que el usuario la vea y sepa lo que se le est preguntando. No puede ser una variable ni una expresin, solamente una cadena entre comillas. En otros lenguajes de programacin no se da esta posibilidad y hay que escribir un rtulo justo antes usando otra instruccin. Variable es el nombre de la variable dnde se almacenar la informacin que escriba el usuario. Al ejecutar esta instruccin se escribe en la pantalla el texto que hay entre comillas y a la derecha aparece el cursor intermitente para que el usuario escriba. El programa estar 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 anterior que pudiera tener la variable se pierde) y el programa sigue con la siguiente instruccin que haya. El usuario podr desplazarse con las flechas del teclado por el texto que est escribiendo para corregir algn error antes de pulsar "Enter" Para que lo que escriba el usuario no salga justo pegado al texto de la pregunta lo que 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 sera Cmo te llamas?Kike Pero si lo ponemos con el espacio al final... INPUT "Cmo te llamas? ",variable$ El resultado es parecido pero se ve mejor Cmo te llamas? Kike La variable tiene que ser del tipo correcto, si le pedimos al usuario que escriba una palabra, la variable debe de ser de tipo cadena y si no tendr que ser de tipo numrico con o sin decimales. Si solo ponemos la variable, sin pregunta al usuario, aparecer un interrogante. Es decir, si ponemos... INPUT nombre_variable Aparecer en la pantalla

mailxmail - Cursos para compartir lo que sabes


?_ Para que no aparezca indicacin alguna, solo el cursor, hay que poner las comillas vacas, por ejemplo... INPUT "", nombre_variable Esto puede ser til cuando la pregunta que hacemos al usuario incluye algn clculo o expresin de cadena. Como INPUT no permite evaluar expresiones en la pregunta al usuario, esta pregunta habr que mostrarla antes en una instruccin PRINT normal de las que veremos ms adelante con su punto y coma al final, y a continuacin 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 de nuestro programa es a travs de la pantalla. En temas posteriores se explica cmo conseguir crear las pantallas de los programas para que cada cosa aparezca en un sitio determinado y con distintos colores, recuadros, etc, pero por ahora para aprender a programar nos limitaremos a escribir cosas una debajo de otra como en MS-DOS. Usaremos la pantalla de texto de forma que cuando lleguemos a escribir en la lnea ms baja de la pantalla todo subir hacia arriba y desaparecer lo que hubiera en la primera lnea. Para aclarar la pantalla y no liarnos con lo anterior hemos puesto en todos los ejemplos CLS como primera instruccin para que se borre de la pantalla lo que hubiera de ejecuciones anteriores del programa actual o de otro, y se empiece a escribir en la parte superior. Ahora vamos a ver con ms detalle la instruccin PRINT que es la que usamos parara escribir en la pantalla. Una aclaracin. Si a alguien le parece que PRINT significa imprimir tiene razn, en informtica a escribir en la pantalla del ordenador tambin se le puede llamar imprimir en pantalla. Adems esta orden PRINT tambin se utiliza para imprimir como 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 tal cual. 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 se escribira Prueba Superada.

10

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 veremos con detalle en el tema siguiente. Despus de escribir algo el cursor (invisible) pasa a la lnea de abajo, por ejemplo PRINT "Uno" PRINT "Dos" PRINT "Tres" Escribira... Uno Dos Tres Pero en algn caso nos puede interesar que no sea as y que se escriba lo siguiente a continuacin en la misma lnea. Para hacerlo no tenemos ms que escribir un punto y coma al final de la instruccin sobre la que queremos seguir, por ejemplo: PRINT "Uno"; PRINT "Dos"; PRINT "Tres" PRINT "Cuatro" Escribira... UnoDosTres Cuatro Normalmente en una instruccin PRINT se suelen escribir varias cosas, como vimos en el programa saludador que primero escriba la palabra Hola y despus nuestro nombre que estaba almacenado en la variable nombre$. Para hacer esto no hay ms que separar con punto y coma (;) las distintas "cosas" que queremos escribir, por ejemplo: nombrePrograma = "Super Juego" nombreUsuario = "KB" PRINT "Hola "; nombreUsuario; ", bienvenido a "; nombrePrograma Escribira... Hola KB, bienvenido a Super Juego

11

mailxmail - Cursos para compartir lo que sabes


Observa que los espacios entre palabras hay que ponerlos en algn sitio dentro de las comillas, de lo contrario saldra todo junto, incluso alguna vez es necesario hacer... 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... 234 pero no, es 2 3 4 QBasic escribe siempre los nmeros con un espacio delante y otro detrs. Lo que ha escrito exactamente es: Espacio 2 Espacio Espacio 3 Espacio Espacio 4 Espacio, el ltimo espacio no lo vemos pero tambin lo ha escrito. Una consecuencia de esto ser que los nmeros por ahora nunca van a salir justo en la parte izquierda de la pantalla, sino una posicin ms adelante, por ejemplo... PRINT "Prueba" PRINT 25 PRINT 74 PRINT "Fin prueba" Escribira... Prueba 25 74 Fin Prueba Pero de esto no nos tenemos que preocupar. Si intentamos arreglarlo vamos a complicar nuestros programas innecesariamente. Ya habr tiempo de dibujar pantallas en los temas de ampliacin. Una cosa que s podemos hacer ya es usar lo que se llama "Posiciones de tabulacin". Esto es que QBasic divide cada lnea de la pantalla en posiciones que comienzan cada 14 caracteres, la primera en la posicin 1, la segunda en la 14, la tercera en la 28, etc. Y si nosotros separamos las expresiones de la orden PRINT con comas en vez de puntos y comas los textos se escribirn en estas posiciones en vez de justo pegado a la anterior. Vamos con un ejemplo: PRINT "Uno", "Dos", "Tres" PRINT "Cuatro", "Cinco", "Seis"

12

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 una misma instruccin podemos separar unas cosas con comas y otras con puntos y comas, segn haga falta. EJERCICIOS 1. Escribir un Programa que imprima sus datos personales como:

Universidad Nacional Toribio Rodrguez de Mendoza de Amazonas Nombres: Primer Apellido: Segundo Apellido: Edad: Especialidad 2. 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, y altura de un trapecio y calcule su rea.

13

mailxmail - Cursos para compartir lo que sabes

5. Introduccin a los operadores


En este tema vamos a ver cmo construir las expresiones matemticas y lgicas necesarias para que nuestros programas sea capaces de hacer clculos. Una expresin sera lo equivalente a las frmulas que escribimos en una hoja de clculo (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 la variablenombre$ usbamos directamente la instruccin INPUT que se encargaba de leer los datos del teclado y guardarlos directamente en la variable. Aqu no emplebamos 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 la variable que hay a su izquierda el valor de la "Expresin" que hay a su derecha, por lo tanto ya podemos decir que el signo igual es el operador de asignacin en el lenguaje Basic. En el caso ms sencillo: total = 500 Hacemos que en la variable total se almacene el nmero 500, perdindose el valor que tuviera anteriormente. Tambin podemos hacer: total = total + 100 En este caso estamos usando la variable total como un "acumulador" ya que vamos a almacenar en ella el valor que tenga antes de la asignacin ms cien. Dicho de otra forma, 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 se explican algunas cosas sobre estas asignaciones. Es importante tener claro que a una variable solo le podemos asignar los datos adecuados a su tipo, por ejemplo si a una variable de cadena le asignamos una expresin numrica o a una variable numrica le asignamos una cadena se producir un 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 asignamos una expresin cuyo valor es con decimales, el nmero almacenado se redondear, por ejemplo... num% = 10 / 3

14

mailxmail - Cursos para compartir lo que sabes


Har que num% valga 3 en vez de 3.3333, igual que num% = 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 signo igual, y la expresin a la derecha. Las expresiones nunca van a ir solas. Siempre van en una asignacin o en una estructura condicional que ya veremos ms adelante. Contadores y acumuladores Estas dos palabras se usan mucho en programacin para referirse a variables que van 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, por ejemplo: 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 para que no empiecen con valores residuales. Si vamos a multiplicar las inicializamos a 1, porque si valen cero todo lo que multipliquemos por ella seguir valiendo cero. La diferencia entre acumuladores y contadores es que los acumuladores se incrementan 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 hacer operaciones aritmticas como sumas, restas, etc.

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

15

mailxmail - Cursos para compartir lo que sabes


El operador suma lo que hace es sumar valores. Se pueden encadenar tantas sumas como queramos, por ejemplo total = 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 para deducir 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 su funcionamiento y su utilizacin en los temas siguientes. El operador "acento circunflejo" sirve para calcular potencias, por ejemplo 5^2 es cinco al cuadrado o tambin 5*5. Tambin podramos calcular potencias decimales como 4^2.5. Para escribir este smbolo pulsa maysculas y la tecla correspondiente dos veces, oirs un pitido y solo entonces aparecer escrito en la pantalla. Si aparece dos veces borra uno. Operadores relacionales o de comparacin Estos operadores hacen que una expresin devuelva un valor lgico, es decir, en vez de un nmero devolver VERDADERO o FALSO. Esto nos ser muy til en las estructuras condicionales que veremos en los siguientes temas, dnde veremos muchos 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 dnde estn escritos. Operadores lgicos Estos operadores tambin devuelven un valor VERDADERO o FALSO a partir de los valores de las dos expresiones lgicas que unen. Igual que los anteriores se explicarn en los temas siguientes dedicados a estructuras condicionales.

OPERADOR NOMBRE 16

mailxmail - Cursos para compartir lo que sabes


OPERADOR NOMBRE AND Operador Y OR Operador O NOT Operador monario de negacin XOR Operador O exclusivo EQV Operador de equivalencia IMP Operador de implicacin
Los tres primeros son las puertas lgicas elementales del lgebra de Boole, los otros sepueden construir a partir de las anteriores y por eso no suelen estar en otros lenguajes de programacin y no hablaremos de ellos aqu. AND devuelve verdadero si las dos expresiones que une son verdaderas, en caso contrario 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 es diciembre no ser navidad aunque estemos a 25, tampoco si es un da de diciembre distinto de 25 y mucho menos si ni es diciembre ni es 25. Usamos por primera vez los 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 las dos 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 que cero (aprovechamos para dar un ejemplo del operador >) o si el precio es gratis, o las dos cosas. Solo sera falso si no tienes dinero y el producto a comprar vale dinero, 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, a diferencia de los otros que siempre estn entre dos operandos. Lo que hace NOT es invertir el resultado de una expresin, es decir, si es verdadera devuelve falso y si es falsa devuelve verdadero. Para detallar los posibles valores que devuelven los operadores lgicos se construyen las llamadas "Tablas de la verdad" que representan todas las combinaciones posibles y los valores devueltos por cada operador.

TABLA DE LA VERDAD PARA AND VERDADERO AND VERDADERO = VERDADERO AND FALSO = FALSO AND VERDADERO = FALSO AND FALSO =

VERDADERO FALSO FALSO FALSO

TABLA DE LA VERDAD PARA OR VERDADERO OR VERDADERO = VERDADERO VERDADERO OR FALSO = VERDADERO FALSO OR VERDADERO = VERDADERO 17

mailxmail - Cursos para compartir lo que sabes


FALSO FALSO OR VERDADERO = VERDADERO OR FALSO = FALSO

TABLA DE LA VERDAD PARA NOT NOT VERDADERO = FALSO NOT FALSO = VERDADERO
Observa que la variable puedesComprar y la esNavidad del ejemplo anterior pueden ser de cualquier tipo numrico para poder ser verdaderas o falsas. QBasic entiende que una variable (o el resultado de una expresin) es falsa si vale 0 y verdadera en cualquier otro caso. Otros lenguajes tienen un tipo de datos especfico para estas situaciones, pero aqu puede valer cualquier tipo de datos numrico. Es normal declarar constantes al principio de los programas para poder usar las palabras 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.

18

mailxmail - Cursos para compartir lo que sabes

6. Funciones incluidas en el lenguaje


El lenguaje BASIC incluye un montn de funciones que nos harn algunos clculos sin necesidad de tener que programar nosotros todo lo necesario. Una funcin es una palabra que, insertada dentro de una expresin, llama a un pequeo "programita" que hace los clculos y nos devuelve un resultado. Veamos este 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 gualda el resultado en la variable raiz para al final escribirlo en pantalla. No hemos tenido que programar ni conocer las operaciones matemticas necesarias para calcular la raz 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 utilice para calcular la raz cuadrada: Lo metemos entre parntesis despus del nombre de la funcin. Este nmero se dice que es un Parmetro que pasamos a la funcin. Si alguna funcin no necesita parmetros no ponemos nada, en otros lenguajes hay que 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 otra expresin. En la instruccin PRINT podemos incluir cualquier expresin, por lo tanto en el ejemplo anterior nos podamos haber ahorrado la variable raiz escribiendo directamente: 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 un resultado que puede ser cadena, entero, etc. y por lo tanto pueden llevar un sufijo de identificacin de tipo a continuacin del nombre, por ejemplo la funcin TIMER nos devuelve el nmero de segundos que han pasado desde las doce de la noche en formato numrico: segundos = TIMER mientras que la funcin TIME$ nos devuelve la hora actual en formato de cadena de texto con la hora, los minutos y los segundos separados por dos puntos: horaActual$ = TIME$ PRINT "Son las "; horaActual$

19

mailxmail - Cursos para compartir lo que sabes


En este caso para guardar el valor devuelto por TIME$ hemos tenido que usar una variable de cadena. Ambas funciones no llevan parmetros porque si lo que hacemos es preguntar la hora no tenemos que decir nada ms, ya la propia funcin ver como saca la hora del reloj interno del ordenador. Si una funcin lleva varios parmetros se pondrn separados por comas dentro de los 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 cual letra 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 (o una expresin numrica) y el segundo tiene que ser una cadena (o una expresin de cadenas). Para saber de que tipo es cada parmetro y el tipo del resultado que devuelve la funcin es muy importante consultar la ayuda de QBasic todas las veces que haga falta. Si intentamos pasar parmetros de otro tipo se producir un error de tipos y el programa se parar. Tambin se producir un error de "Llamada a funcin no vlida" si la funcin no es capaz de hacer los clculos con los parmetros que le hemos pasado, aunque sean del tipo correcto. Por ejemplo, sabemos que no existe raz cuadrada para los nmeros menores que cero, por lo que se producir un error de este tipo si hacemos PRINT SQR (-14) En caso de que pasemos como parmetro una expresin, por ejemplo PRINT SQR(miVariable) hay que tener mucho cuidado de que esta expresin no pueda llegar a valer menos que cero. Estas son algunas de las funciones ms usadas. En temas posteriores irn apareciendo ms. Para verlas todas y todos los tipos de datos que necesitan y devuelven mira la ayuda del QBasic.

FUNCIN SQR(num) INT(decimal) CINT(decimal) CLNG(decimal) SIN(num) COS(num) TAN(num)

DESCRIPCIN Raz cuadrada Pasa a entero qitando decimales Redondea a entero (Max = 32767) Redondea a entero largo Calcula el seno Calcula el coseno Calcula la tangente Devuelve la longitud de 20

EJEMPLO SQR(16) devuelve 4 INT(1.6) devuelve 1 CINT(1,6) devuelve 2 CLNG(100000.2) devuelve 100000 SIN(40) devuelve 0.64278 COS(40) devuelve 0.76604 TAN(40) devuelve 0.839009

mailxmail - Cursos para compartir lo que sabes


LEN(Cadena) RTRIM(Cadena) Devuelve la longitud de la cadena Devuelve una cadena sin espacios al final Devuelve la cadena pasada a maysculas (No funciona col la ni con los acentos) Devuelve una subcadena del tamao indicado a parir de la posicin indicada. Devuelve una cadena formada por un nmero de caracteres repetidos Devuelve la hora actual como cadena Devuelve la fecha actual como cadena en formato mes-dia-ao Devuelve la letra de la ltima tecla pulsada antes de llegar a ejecutar la funcin. LEN("RONDA") devuelve 5 RTRIM("Fin. ") devuelve "Fin." UCASE$("Toma Castaa") devuelve "TOMA CASTAA"

UCASE$(Cadena)

MID$(Cadena, inicio, largo) STRING$(largo, carcter) TIME$ DATE$

MID$("Programacin",5,4) devuelve "rama" STRING$(10,"#") devuelve "##########" Devuelve por ejemplo "16:45:08" Devuelve por ejemplo "01-202006" Devolvera "A" si la ltima tecla pulsada fue la "A mayscula"

INKEY$

En una de las ampliaciones de este curso se habla de un conjunto de funciones muy tiles 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, preguntas que se responden con s o no, etc.

21

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 instrucciones que aparecen en el listado del cdigo fuente del programa, desde la primera hasta la ltima. A partir de ahora vamos a poder conseguir que una o varias instrucciones solo se lleguen 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 en los siguientes temas). ALTERNATIVA SIMPLE. INSTRUCCIN IF Empecemos con un ejemplo. Un programa que nos pida la nota de un examen y nos felicite 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 de todo lenguaje de programacin estructurado, y le hemos puesto como condicin que el valor almacenado en la variable nota sea mayor o igual que cinco con lo que hacemos que todas las instrucciones que haya entre IF y END IF solo se ejecuten si esta expresin es VERDADERA. Vamos a ver con ms tranquilidad la sintaxis de la instruccin IF IF condicin THEN instrucciones

22

mailxmail - Cursos para compartir lo que sabes


END IF SI la condicin es VERDADERA, ENTONCES (THEN) se ejecutarn las instrucciones hasta llegar a END IF (FIN SI). Despus se seguir con el resto del programa Si la condicin es falsa se saltar todo el bloque IF y se ejecutarn las siguientes instrucciones del programa que haya despus del END IF. SANGRA En el ejemplo anterior puedes ver que las instrucciones que hay dentro del bloque IF estn escritas un poco ms a la derecha que las dems, no justo en el margen izquierdo. Esto se hace por comodidad, para poder saber de un vistazo cuales son las instrucciones que hay dentro del bloque. En la mayora de lenguajes no es obligatorio (En COBOL s), pero siempre es muy recomendable hacerlo as para dar mayor 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 el tamao de la tabulacin (Cuantos espacios se escriben). Por defecto tiene 8, pero es mejor un nmero ms bajo entre 3 y 5 como ya veremos ms adelante. Esta tcnica tambin se conoce como encolumnado o indentacin (En ingls se llama indent). ANIDACIN Como hemos visto en la sintaxis de la instruccin IF, dentro del bloque de instrucciones a ejecutar se puede usar cualquier instruccin, por lo tanto tambin se pueden usar otras instrucciones IF. A esto es a lo que se llama anidacin de instrucciones. Veamos un ejemplo que nos diga si un nmero es par (usando el operador 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

23

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 otra comprobacin que se podr cumplir o no. Nunca se va a llegar a la segunda comprobacin si la primera no se ha cumplido. Es muy importante observar que cada IF lleva su END IF correspondiente y que el bloque de instrucciones del segundo IF est encolumnado todava ms a la derecha que el anterior. Cuando escribimos un programa en papel es comn unir con una lnea cada IF con su 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 instruccin podemos 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 los encolumnados no hay por qu equivocarse.

24

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 ha suspendido. 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 bloque de instrucciones y despus se sigue con lo que venga detrs del END IF, igual que antes. Ahora viene lo nuevo, si la condicin no se cumple se ejecuta el bloque de instrucciones 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 dos bloques de instrucciones segn la condicin sea verdadera o falsa. Dentro del bloque del ELSE tambin puede ir cualquier tipo de instruccin, incluido otro bloque IF o del tipo que sea. Veamos un ejemplo "especialmente malo" de un programa que nos diga el nombre de un mes a partir de su nmero. En temas posteriores simplificaremos bastante este 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

25

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

26

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 es marzo, etc. as hasta diciembre. Si no es diciembre sacamos un mensaje de mes no vlido. Observa que cadaIF tiene su ELSE y su END IF correspondiente abajo. Normalmente nunca llegaremos a estas estructuras tan anidadas, pero aqu se puede 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 nos estropea toda nuestra jerarqua. En QBasic y en los otros editores de programacin esto 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 de desplazamiento 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

27

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 para simplificar un poco el Algoritmo, pero viene a ser prcticamente lo mismo. Veamos la 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 sus instrucciones y ya est. Si no, se comprueba la condicin del siguiente ELSEIF y si es verdadera se ejecutan sus instrucciones y ya est. Si la condicin del ltimo ELSEIF no se cumple se ejecuta el bloque ELSE si existe.

28

mailxmail - Cursos para compartir lo que sabes


Puede haber tantos bloques ELSEIF con su condicin como sea necesario, pero solo un bloque ELSE (o ninguno) al final. Si no hay bloque ELSE puede suceder que no se ejecute nada porque no se cumpla ninguna de las condiciones. Las condiciones no tienen que estar relacionadas de ninguna forma, aqu siempre hemos preguntado por el mes, pero podamos haber comprobado cualquier otra cosa, o poner los meses desordenados. Esta estructura ELSEIF no se usa mucho y no existe en algunos otros lenguajes de programacin, en su lugar se usan los IF anidados como vimos en el ejemplo largusimo 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 y Visual Basic nos lo corrigen automticamente. Esto es porque en alguna versin muy antigua del lenguaje BASIC se escriba as.

29

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 decir el 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"

30

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 de manejar 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 cadena o numrica. En este caso no tiene que devolver VERDADERO o FALSO como en los IF ya que no se usan operadores relacionales ni lgicos, solo los aritmticos cuando hace falta. A continuacin para cada resultado posible se pone la Palabra Clave CASE y la expresin a comparar con la del principio. Si la comparacin es verdadera se ejecuta el bloque de instrucciones entre este CASE y el siguiente y se sale de la estructura. Si la 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 T O. En este caso 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 3 como por ejemplo el 1.517512 y el 2.17521. CASE IS > 2 CASE IS = 5 CASE IS <> 8 CASE IS <= 6 Usando operadores relacionales. En el primer ejemplo sern vlidos todos los valores mayores que 2, en el segundo slo el 5, en el tercero cualquiera menos el 8 y en el ltimo los que sean menor o igual que 6. Si se nos olvida la palabra clave IS, QBasic la escribir por nosotros. Normalmente escribiremos las expresiones de los CASE de la forma ms sencilla posible evitando intervalos muy extraos y teniendo cuidado con los operadores

31

mailxmail - Cursos para compartir lo que sabes


relacionales para no dejarnos "fuera" ningn valor posible, pero podemos llegar a escribir una estructura SELECT tan mal hecha como esta sin que el programa de ningn error de ejecucin. SELECT CASE n CASE 1 CASE 1 CASE 3 CASE 2 TO 4 CASE IS < 5 CASE IS <= 5 CASE <> 100 CASE 16 TO 34 END SELECT Hay expresiones repetidas, valores que entran en varias expresiones como el 3, un desastre. Que ocurrira aqu? Lo primero es que nunca ocurrira nada porque no hemos puesto bloques de instrucciones en los CASE, pero si las hubiramos puesto pasara lo siguiente. QBasic empieza a comprobar por los CASE hasta que encuentre uno que le venga bien. Cuando lo encuentra ejecuta su bloque de instrucciones y sale del SELECT CASE aunque otros bloques posteriores tambin hubieran servido. En este caso si el valor de n es 1 se ejecuta el primer CASE 1, el segundo no se llega a ejecutar nunca. Si el valor de n es 3 se ejecuta el CASE 3 y se sale, aunque los cuatro siguientes tambin hubieran servido. Si el valor de n es 100 no se ejecuta nada porque ningn CASE sirve y tampoco hay un CASE ELSE. Las expresiones de los cases normalmente sern simplemente nmeros (o cadenas) y algn intervalo alguna vez para poder estar seguro de que se va a ejecutar siempre el bloque correcto y nuestro programa va a funcionar bien. Entre el SELECT CASE y el primer CASE no puede haber nada. Si los bloques de instrucciones van a llevar slo una instruccin sencilla podemos ponerla a continuacin de la expresin del CASE separndola con dos puntos, por ejemplo nuestro ejemplo de los meses quedara as: 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"

32

mailxmail - Cursos para compartir lo que sabes


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 cualquier tipo de instrucciones anidadas en su interior como bloques IF, otro SELECT, etc. Si estos bloques se hacen muy largos no te asustes, solucionaremos el problema cuando lleguemos a Programacin Modular donde el SELECT servir como men para dar entrada a distintos procedimientos o subprogramas. Casi todos los lenguajes tienen una estructura equivalente a SELECT, pero en el caso del lenguaje C es bastante mala. Hay que tener en cuenta de que en los lenguajes de los sistemas de bases de datos (SQL) existe una instruccin SELECT que no tiene nada que ver con esto, sirve para sacar informacin de las bases de datos.

33

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 la Programacin Estructurada para conseguir que un bloque de instrucciones se puedan ejecutar ms de una vez sin necesidad de escribirlas repetidas en el listado del cdigo fuente del programa. En lenguaje ensamblador y en las versiones antiguas da BASIC se usan instrucciones de tipo GOTO que continan la ejecucin del programa en otra parte, pero esto da lugar a programas muy reliados (Cdigo "espagueti") que son muy difciles de depurar y pueden contener errores. Para solucionar el problema en la Programacin Estructuradas existen estructuras de control que encierran un conjunto de instrucciones (con una instruccin al principio y otra al final) y lo que hacen es ejecutar el bloque de instrucciones entero un nmero determinado de veces, mientras se cumpla una condicin o hasta que se cumpla una condicin, segn sea la 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 el programa no est escrito correctamente nunca se salga de la estructura de control producindose el efecto llamado "Bucle infinito" que puede llegar a bloquear el ordenador. En un programa normal ya compilado y terminado que se ejecute bajo Windows puede pasar que el ordenador se bloquee y aparezca una pantalla azul recuerdo de Bill Gates de tipo "El sistema est ocupado o no responde...", con lo que casi seguro que vamos a tener que reiniciar el ordenador. En los entornos de programacin esto normalmente no llegar a ocurrir. En caso de que nuestro programa se bloquee puede que se agoten los recursos del sistema y el programa se detenga dando un error de tiempo de ejecucin y volviendo al editor de cdigo. Si el programa se queda bloqueado se puede pulsar la siguiente combinacin de teclas:Control + Pausa para detener la ejecucin del programa y volver al editor de cdigo donde habr que repasar el cdigo para que esto no ocurra y el programa funcione siempre bien. En algunos casos tras pulsar esta combinacin de teclas habr 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 que escriba los nmeros del 1 al 5 usando las instrucciones que ya conocemos. CLS PRINT 1 PRINT 2 PRINT 3

34

mailxmail - Cursos para compartir lo que sabes


PRINT 4 PRINT 5 Como se puede ver es un programa bastante tonto. Hay cinco instrucciones casi iguales. Solo cambia el valor de la expresin que cada vez vale lo que en la instruccin 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 y ahora s que tenemos cinco pares de instrucciones completamente idnticos. Vamos a 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 veces siguiendo 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.

35

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 y se ejecuta la siguiente instruccin que venga detrs del NEXT. Todo esto puede parecer muy complicado, pero con la prctica conseguiremos que esta sea una de las instrucciones ms fciles de entender de la programacin, slo habr que detenerse a pensar en estos pasos cuando algn programa no haga lo que 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 modifica automticamente) y tendr que ser de tipo numrico, normalmente entero aunque tambin puede ser real. Ya hemos hablado de los contadores en el tema de los operadores 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 solo entrar si el contador no supera al valor de esta expresin. En nuestro ejemplo el final 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 los contadores de los FOR No debemos modificar el valor de esta variable dentro del bucle, ya lo hace automticamente la instruccin FOR. Dicho de otra forma: No debemos asignar ningn valor a esta variable hasta despus de terminar el FOR. Una vez terminado el FOR no debemos leer el valor de la variable contador porque su valor queda indeterminado. Podremos usar esta variable ms adelante si previamente le asignamos un valor antes de intentar leerla. Estas normas nos las podramos saltar sin dar un error de ejecucin, pero puede que el mismo algoritmo de distintos resultados en distintas versiones de BASIC, ya que el contador es manejado internamente por el intrprete del lenguaje de

36

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 este ejemplo 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 calcular algo. 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 cada pasada. Usando la palabra clave STEP seguida de una expresin numrica conseguimos 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

37

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 14 21 28 35 42 49 56 63 70 77 84 91 98 Como se puede ver, no se ha alcanzado el 100 es porque el siguiente valor que sera 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 FOR incrementar en cero el contador con lo que nunca se llegar al valor final y se producir un bucle infinito. Habr que pulsar Ctrl+Pausa para detener el programa y corregir el cdigo. Ahora ya podemos hacer que un FOR funcione hacia atrs, escribiendo la expresin final 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

38

mailxmail - Cursos para compartir lo que sabes


se ejecutar el bloque FOR. Si un programa no funciona bien porque un FOR no se ejecuta 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 8 veces y cada vez escribe "Hola" 5 veces, en total lo har 8 por 5 igual a 40 veces, es decir, el producto. Este tipo de instrucciones son especialmente tiles en algoritmos que ya veremos ms adelante como el recorrido de matrices. Hay que tener cuidado de no usar la misma variable contador para los dos FOR, ya que romperamos la regla de no modificar 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 corresponde cada NEXT, pero si encolumnamos correctamente nuestro programa esto no ser necesario. El FOR en Basic es bastante flexible. En otros lenguajes funciona de otra forma o incluso puede que ni siquiera exista, ya que como veremos a continuacin no es imprescindible para construir un algoritmo.

39

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 que no 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 <= 5 PRINT n n = n + 1 WEND Esto lo que hace es ejecutar el bloque de instrucciones (Lo que hay entre el WHILE y el WEND) una y otra vez mientras se cumpla la condicin del WHILE. Un poco ms difcil que con el FOR. Vamos a verlo paso a paso: Usaremos como contador la variable n y por tanto la tenemos que inicializar nosotros al valor que queramos que tenga la primera vez, en este caso 1. Se comprueba la condicin del WHILE: como n vale 1 que es menor o igual que 5, entramos. Se ejecutan las instrucciones del bloque con n valiendo 1. La ltima instruccin incrementa n en 1, con lo que pasa a valer 2. Volvemos al WHILE y se comprueba su condicin: como n vale 2 que es menor o igual que 5, entramos. Se ejecutan las instrucciones del bloque con n valiendo 2. La ltima instruccin incrementa n en 1, con lo que pasa a valer 3. Volvemos al WHILE y se comprueba su condicin: como n vale 3 que es menor o igual que 5, entramos. Se ejecutan las instrucciones del bloque con n valiendo 3. La ltima instruccin incrementa n en 1, con lo que pasa a valer 4. Volvemos al WHILE y se comprueba su condicin: como n vale 4 que es menor o igual que 5, entramos. Se ejecutan las instrucciones del bloque con n valiendo 4. La ltima instruccin incrementa n en 1, con lo que pasa a valer 5.

40

mailxmail - Cursos para compartir lo que sabes


Volvemos al WHILE y se comprueba su condicin: como n vale 5 que es menor o igual que 5, entramos. Se ejecutan las instrucciones del bloque con n valiendo 5. La ltima instruccin incrementa 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 es menor o igual que 5, no entramos y pasamos a la siguiente instruccin que haya detrs del WEND. Se puede ver que el funcionamiento es parecido al del FOR, solo que aqu lo tenemos que controlar todo nosotros. Las dos reglas que dijimos sobre los contadores del FOR ya aqu no tienen sentido porque de hecho nosotros vamos a tener que incrementar el contador haciendo una asignacin y una vez terminado podemos estar seguro del valor que tiene la variable. Una norma que s conviene respetar (Aunque no siempre es necesario) es que la instruccin que incrementa el contador sea la ltima del bloque, ya que si est en otro sitio ejecutaremos unas instrucciones con un valor y las dems con el otro, con lo que nos podemos liar. Un error muy tpico es que se nos olvide de poner la instruccin de incrementar el contador, produciendo un bucle infinito que har que nuestro programa no termine nunca. Si un programa se bloquea es conveniente revisar esto. Tambin puede pasar que no lleguemos a entrar al MIENTRAS porque la condicin ya 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 ejemplos podemos usar un acumulador, o ninguno de los dos, ya que la condicin del WHILE puede 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 <= 100 PRINT c c = c + 2 WEND Escribir de 50 hasta 1 hacia atrs: c = 50

41

mailxmail - Cursos para compartir lo que sabes


WHILE c >= 1 PRINT c c = c - 1 WEND Calcular el factorial de un nmero que pedimos al usuario (Este ejemplo se mejorar en otro tema ms adelante): INPUT "Escribe un nmero para calcular su factorial: ", num c = 1 factorial = 1 WHILE c <= num factorial = factorial * c c = c + 1 WEND PRINT "El factorial de; num; "es; factorial Leer nmeros por teclado hasta que se escriba el 0: INPUT "Escribe nmeros (0 para salir):, num WHILE num <> 0 INPUT "Escribe nmeros (0 para salir):, num WEND Este ltimo ejemplo presenta lo que se conoce como lectura anticipada. Antes de llegar al WHILE hemos tenido que conseguir el valor de la variable num porque si no lo hacemos puede pasar que num valga cero y por lo tanto no lleguemos a entrar al bucle. Esto es til en casos como la lectura de ficheros secuenciales, pero otras veces conviene evitarlo para no repetir instrucciones. Veremos cmo hacerlo en el siguiente tema. Una ltima cosa es que hay una teora en informtica que dice que cualquier algoritmo puede ser programado usando solamente instrucciones MIENTRAS. Es decir, ni bloques IF, ni ELSE, ni CASE, ni FOR, ni otras estructuras que veremos ms adelante. Yo no lo he comprobado, pero si a alguien le ha gustado mucho este tema ya puede empezar a hacerlo.

42

mailxmail - Cursos para compartir lo que sabes

11. Estructura de repeticin DO...LOOP


ESTRUCTURA DO...LOOP Esta estructura es similar a la WHILE, solo que la condicin se especifica al final del bloque, 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 instruccin DO...LOOP WHILE que hace que el bucle se ejecute MIENTRAS nuestro contador sea menor 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 la primera vez que escribamos n, ya tendr el valor de 1. La ltima vez escribir 5 y al llegar 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 el bloque 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 vale 5 y despus de escribirla se comprueba que la condicin es verdadera y se sale del bucle. Las instrucciones DO...LOOP UNTIL son normalmente las ms fciles de comprender. En la ayuda de QBasic recomiendan que se dejen de usar las instrucciones WHILE...WEND para usar mejor las DO...LOOP, pero algunas veces ser mejor usar las WHILE...WEND como en el caso de los ficheros secuenciales que ya veremos ms adelante. DEPURACIN DE DATOS DE ENTRADA Ahora ya estamos en condiciones de ver una forma de conseguir que un programa que requiere la intervencin del usuario para introducir datos de entrada no avance HASTA QUE el usuario no escriba los datos correctos.

43

mailxmail - Cursos para compartir lo que sabes


En el tema de Entrada/Salida vimos que QBasic es capaz de controlar que no se metan valores fuera de rango, por ejemplo que si el programa pide un entero no se pueda escribir un nmero mayor de 32767. Aqu lo que vamos a ver es como conseguir que se pidamos un mes el programa no avance hasta que el usuario escriba un nmero entre 1 y 12. Esto lo deberamos hacer en cualquier programa siempre que pidamos al usuario que escriba algo. Para hacer este control lo que hacemos es meter la instruccin INPUT dentro de un bloque REPETIR, del que no salimos HASTA que la respuesta sea correcta o MIENTRAS sea incorrecta. Vamos a ver unos ejemplos que aclararn todas las posibles situaciones. Leer un nmero menor que 100 CLS 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 ejemplo seguiremos repitiendo la pregunta mientras el nmero sea mayor o igual que 100 CLS 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 LOOP WHILE es justo la inversa a la del LOOP UNTIL. Ahora pedimos un mes, que tiene que ser entre 1 y 12 CLS DO INPUT "Escribe un mes (0 a 12): ",mes LOOP UNTIL (mes >= 1) AND (mes <= 12) En este caso tenemos un intervalo y por lo tanto hay que controlar dos condiciones que uniremos con el operador AND, con lo que no seguimos HASTA que la primera se cumpla Y la segunda tambin. Tambin lo podamos haber hecho con un bloque DO...LOOP WHILE CLS DO INPUT "Escribe un mes (0 a 12): ",mes LOOP WHILE (mes < 1) OR (mes > 12)

44

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 las contrarias a la del ejemplo anterior, ya que usamos el operador OR que tambin se puede decir que es el contrario al AND. Por ltimo vamos a ver un problema muy tpico: Un programa que nos pide una clave de acceso para poder seguir. Este es el caso ms sencillo en el que no pasamos hasta que no demos con la clave, otros problemas ms complicados seran que el programa terminara tras varios intentos fallidos o que admitiera varias claves llevndonos 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 va a estar en el listado del programa, sino que ser obtenida de algn tipo de fichero o base de datos para que el usuario tenga la posibilidad de cambiarla.

45

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 el programa. 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 programa tiene que manejar una coleccin de datos muy grande como los nombres de una agenda o los precios de un catlogo? Se podra hacer usando 100 variables distintas pero el algoritmo llegara a ser terriblemente complicado y muy poco funcional. En este apartado vamos a ver cmo podemos asignar un mismo nombre de variable para muchos datos y referirnos a cada uno de ellos de forma individual usando un nmero 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 se puede modificar. Si hacemos un programa que trabaje con 100 nombres siempre lo har con 100 aunque solo lleguemos a usar 20, y nunca podr trabajar con ms de 100. 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 el programa. Al terminar se pierde su contenido. En programacin normalmente se conocen como "Arrays" aunque su nombre ms correcto en castellano sera "formaciones". Como veremos en los apartados siguientes, los arrays de 1 dimensin se llaman vectores, los de 2 dimensiones se llaman matrices y los de 3 o ms se llaman poliedros o arrays multidimensionales. En informtica muchas veces se llama vector a cualquier array. En la ayuda de QBasic (y de Visual Basic) siempre llaman Matriz a cualquier array, por lo que hay que 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 nos pregunte el nombre de la persona vive en cada piso y una vez que ha recopilado toda esa informacin, nos deje preguntarle quien vive en el piso que nosotros

46

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 pisos fueran 40 tendramos un programa casi diez veces ms largo con muchas partes casi iguales, pero que no podemos meter en bucles repetitivos porque cada variable es distinta. Observa que comprobamos que el piso sea entre 1 y 4, a partir de ahora va 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 usando un VECTOR. DIM nombre$ (1 TO 4) FOR n = 1 TO 4 PRINT "Nombre de quien vive en el"; n; ": "; INPUT "", nombre$(n) NEXT

47

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 CA SELECT 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 variable que se va a llamar nombre$ (como lleva el $ va a ser de tipo texto) y va a poder guardar cuatro valores a los que accederemos con subndices que van desde el 1 hasta el 4. Para determinar este intervalo de valores hay que usar nmeros enteros constantes, no valen expresiones matemticas. En el siguiente bloque FOR, que se ejecutar 4 veces lo que hacemos es ir pidiendo al usuario que escriba los nombres. La primera vez guardamos lo que escriba en la posicin 1 del vector porque hacemos referencia al ndice 1 entre parntesis a continuacin del nombre del vector. La siguiente vez al ndice 2, la siguiente vez al 3 y la ltima vez que se ejecute el bucle hacemos referencia al ndice 4. A esto es a lo que se llama "Recorrer el vector" ya que hemos hecho algo con cada uno de sus elementos. Normalmente esto lo haremos siempre con un bucle FOR, que es lo ms cmodo. La pregunta de "nombre de quien vive en..." no est en el INPUT porque esta instruccin no evala expresiones, por eso est antes en un PRINT normal con un 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 como queramos haciendo referencia al nombre del vector y al subndice entre parntesis. Para hacer referencia a los subndices de un array se puede usar cualquier expresin, no tiene porqu ser un nmero constante, pero hay que tener cuidado de no hacer nunca referencia a ndices que no existan En el siguiente bloque pedimos al usuario que escriba el nmero de un piso y lo guardamos 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 se puede hacer directamente tomando el valor de la variable N como subndice sin necesidad 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 a partir de su nmero. Lo hicimos con muchos IF anidados, despus con ELSEIF y por ltimo con SELECT CASE que ya quedaba mucho ms corto, pero de ninguna forma nos libramos de escribir todo el SELECT CASE y todos los meses en cualquier parte del 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"

48

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$. Al principio del programa llenamos el vector con los nombres de los meses, cada uno en su lugar correcto. Donde nos haga falta el nombre de un mes slo tendremos que usar el vector y referirnos al mes que queramos. De esta forma meses (3) nos devolver "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 en el 1, pero esto no tiene que ser siempre as. En QBasic pueden empezar por cualquier nmero incluso negativo, aunque lo ms normal es que siempre empiecen por 1 o por 0. El valor ms bajo posible para los ndices es -32768 y el ms alto es 32767. 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 que no tenga mucho sentido. DIM nmero (1 TO 1) Para determinar el tamao de cualquier vector usamos la siguiente frmula: LTIMO INDICE - PRIMER NDICE + 1

49

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 de cadenas. 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 los arrays). No podemos intentar acceder a subndices que no existen. En caso de que llegue a ocurrir en QBasic se producir un error de tipo "Subndice fuera del intervalo" y el programa se detendr sin mayores consecuencias. En muchos otros lenguajes no ocurrir nada, pero si estamos leyendo sacaremos datos de otras posiciones de memoria que no son nuestras de ms all del final del vector y si estamos escribiendo lo haremos sobreescribiendo otros datos importantes para el programa o incluso para el sistema operativo ( OS o WINDOWS) con lo que casi D seguro conseguiremos que el ordenador se quede bloqueado. Imagina que en un programa (No de QBasic) ocurre esto y va a parar a un registro estratgico del sistema operativo un nmero que equivale de alguna forma a la llamada al programa de formatear el disco duro, no veas el estropicio. De ah la importancia de depurar los datos de entrada, especialmente los que van a servir como ndices para arrays. Si en nuestro primer ejemplo no depuramos el dato del 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 un programa similar al anterior.

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

50

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 array array de dos dimensiones, mientras que un vector es un array de una sola dimensin. Por si hay alguna duda de lo que hace este programa vamos a ver un posible 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

51

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 vez habr que usar dos intervalos separados por una coma. Y por lo tanto siempre que nos refiramos a la matriz habr que usar dos subndices. Para recorrer la matriz hay que usar dos FOR anidados. Esta vez la hemos recorrido por filas (pisos en nuestro ejemplo) ya que el "FOR piso" est fuera y hasta que no se ejecute entero el "FOR puerta" en cada piso no pasamos al siguiente. Para recorrerla 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 u otra, l no entiende de filas horizontales ni columnas verticales, de hecho almacena todos los elementos seguidos uno detrs de otro y hace operaciones matemticas con los dos subndices para determinar la nica posicin del elemento. Esto se puede ver fcilmente pensando en la posicin de los buzones de correos en el portal del bloque de pisos.

Cada piso tiene su buzn, el del 2 2 es el quinto porque tiene delante los tres de la primera planta y es el segundo de la segunda. Para calcular las posiciones se hace algo 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. Si programamos en otros lenguajes ms primitivos s que habra que preocuparse de esto porque slo existen vectores de una dimensin.

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

52

mailxmail - Cursos para compartir lo que sabes

En este caso nuestro bloque tiene tres portales (1 a 3) y cada uno de ellos tiene cuatro 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 la tercera 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 pongamos dentro 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 si usamos arrays de cuatro, cinco o ms dimensiones ya esto no ser as y la habremos liado del todo. En estos casos lo mejor ser plantear el problema de otra forma o usar 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 ni siquiera estamos declarando las variables. Nuestros programas de QBasic son muy sencillos y usan muy pocas variables, pero al trabajar con arrays hay que darse cuenta que basta con declarar una matriz de 20 por 20 elementos para que se gasten 400 posiciones de memoria. En las cadenas QBasic no nos limita el nmero de caracteres que vamos a poder

53

mailxmail - Cursos para compartir lo que sabes


meter en ellas y para que esto funcione se gasta cierta cantidad de memoria (unos 10 bytes), que si multiplicamos por 400 posiciones de memoria son casi 4 KB, una cantidad respetable para programas tan pequeos. Puede ocurrir que en nuestra matriz de cadenas no lleguemos a almacenar palabras ms largas de por ejemplo 15 letras con los que nos convendra limitar el tamao de las 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 tipo cadena (Esta ser la forma normal de hacerlo en Visual Basic), por eso ya no es necesario poner el $ al final del nombre. Si a continuacin ponemos un asterisco y un nmero estamos limitando el tamao de las cadenas con lo que QBasic ya no tendr que determinarlo automticamente constantemente, con lo que ahorraremos memoria 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, los dems se pierden. En los tipos numricos no podemos ahorrar nada, pero en los arrays de cadenas deberamos hacer siempre esto, especialmente si van a contener muchos elementos.

54

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 8 elementos (Casillas) que van a contener un 1 si contienen una mina o un cero si estn vacas.

Cuando el usuario destape una casilla, si no contiene una mina, habr que escribir el nmero de minas que la rodean. Para hacer esto habr que sumar los valores de las casillas que hay arriba a la izquierda, arriba, arriba a la derecha, a la derecha, abajo a la derecha, abajo, abajo a la izquierda y a la izquierda. Si estamos en una casilla del interior del tablero esto funciona perfectamente, pero si estamos en el borde nos encontramos con el problema de que haramos referencia 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 se cuenten 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 que tendramos en total nueve rutinas diferentes, as como que controlar cul de ellas usar 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 filas y columnas de forma que todos los elementos que realmente nos interesan estn rodeados por un "borde" de elementos vacos que estarn ah slo para poder hacer referencia a ellos sin salirnos de la matriz. Una representacin grfica de la matriz orlada podra ser esta, donde hay un borde de "casillas" que no vamos a usar nunca para poner minas, pero a las que podemos referirnos siempre que sea necesario sin salirnos de la matriz. En el ejemplo que nos ocupa, 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 en cualquier lugar donde se tenga que acceder a posiciones de una matriz y puedan producirse problemas en los bordes. En el caso de vectores habra que aadir un elemento ms al principio y otro al final, para los poliedros sera como envolverlo completamente y en el caso de arrays de ms de cuatro dimensiones ya es difcil

55

mailxmail - Cursos para compartir lo que sabes


imaginarse como se hara. Hay que recordar que en QBasic se pueden usar subndices negativos, pero en la mayora 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 est justificado en la mayora de los casos ya que se consigue simplificar mucho los programas. FORMACIONES DINMICAS En otros lenguajes de programacin ms avanzados como C o Pascal existen lo que se llaman "Estructuras de almacenamiento dinmicas" que son tcnicas de programacin que mediante la utilizacin de punteros (Variables especiales que contienen direcciones de memoria) permiten acceder directamente a la memoria del ordenador y colocar los datos en estructuras como listas enlazadas, rboles, pilas, colas, tablas hash, etc. cuyo tamao cambia constantemente durante la ejecucin del programa sin estar definido de ninguna forma en el cdigo del programa. Por eso se dice que son estructuras de almacenamiento dinmicas. Como QBasic (ni Visual Basic) no trabaja directamente con punteros no podemos llegar a utilizar estas estructuras. En algn caso puede suceder que necesitemos almacenar elementos en un array (Vector, matriz, etc...), pero no podamos saber de antemano cuanto grande va a tener que ser y tampoco nos merezca la pena poner un lmite arbitrario que se alcanzar en seguida o bien no llegar a ser usado nunca desperdiciando mucha memoria. Para solucionar en parte este problema QBasic nos da la posibilidad de declarar los arrays arrays usando la instruccin REDIM en lugar de DIM y despus en cualquier parte del programa poder redimensionarlos tantas veces como queramos usando valores que pueden ser variables. Veamos un ejemplo: REDIM mat(1 TO 1) INPUT "Cuantos nmeros vamos a almacenar?", maxi REDIM mat(1 TO maxi) FOR n = 1 TO maxi INPUT mat(n) NEXT INPUT "Cuantos nmeros vamos a almacenar ahora?", maxi2 REDIM mat(1 TO maxi2) FOR n = 1 TO maxi2 INPUT mat(n) NEXT Se puede ver que declaramos un vector de enteros de slo un elemento usando REDIM REDIM, a continuacin pedimos al usuario que escriba un nmero y despus

56

mailxmail - Cursos para compartir lo que sabes


volvemos a redimensionar el vector con este nmero de elementos para ya recorrerla como hemos hecho siempre. A continuacin repetimos el proceso volviendo a redimensionar el vector, perdindose la primera serie de nmeros que almacen en ella el usuario. Aqu hay que aclarar algunas cosas: La primera orden REDIM mat(1 to 1) nos la podamos haber ahorrado, pero siempre es costumbre declarar las variables al principio del programa para tener una visin global de las variables que hay sin tener que recorrer el listado completo. Si al declarar un array con la orden DIM usamos variables en vez de valores constantes lo declaramos como dinmico y despus podr ser redimensionado. Para redimensionar un array dinmico ya existente habr que hacerlo siempre con la orden REDIM y en QBasic tendremos que usar las dimensiones que ya tiene, es decir, si antes era una matriz con dos dimensiones al redimensionarlo tenemos que especificar dos intervalos, ni ms ni menos, y por supuesto el mismo tipo de datos. Al redimensionar un array se borran todos los valores que tuviera, quedando entero inicializado a valores cero o cadenas vacas. Visto esto slo queda por decir que siempre que sea posible se evite el uso de arrays dinmicos ya que el manejo interno de la memoria es mucho menos eficiente y podra dar lugar a errores como los tpicos de "Memoria agotada". Para evitar que los arrays sean dinmicos usar siempre valores constantes (nmeros) para definir sus dimensiones al declararlos con la orden DIM al principio del programa.

57

mailxmail - Cursos para compartir lo que sabes

14. Ejercicios propuestos


EJERCICIOS 1: EXPRESIONES SECUENCIALES 1. Qu tipo de datos resulta ms adecuado para representar cada uno de los conceptos siguientes : a) El sueldo de un trabajador b) La edad de una persona c) El nmero de hijos d) El estado civil e) El estado de caducado o no de un producto f) El N de telfono g) La direccin. 2. Escribir y explicar lnea a lnea el siguiente programa mediante un comentario cadena$ = "Soy una cadena" entero% = 1200 enterolargo& = 198108 simple! = 1.5688 doble# = 3.458D+301 CLS PRINT cadena$ PRINT "Soy un entero:"; entero% PRINT "Soy un entero largo:"; enterolargo& PRINT "Soy un simple:"; simple! PRINT "Soy un doble:"; doble# 3. Escribir un programa para calcular la distancia recorrida por un objeto en un movimiento rectilneo uniforme. 4. Escribir un programa para calcular la distancia recorrida por un objeto en un movimiento rectilneo acelerado. Dado: t=tiempo, Vo=Velocidad Inicial, Vf=Velocidad Fina, g=Aceleracin, entre otros datos. Ejemplo: 5. Evalu la expresin: , donde: K es una constante equivalente a 0.007 X es una variable equivalente a {24.7, 60} 6. Escribir un programa que pida una cantidad en soles y la convierta en euros.

7. A partir del programa anterior escribir uno que pase de soles a libras esterlinas, pidiendo primero cuantas soles es una libra.

58

mailxmail - Cursos para compartir lo que sabes


esterlinas, pidiendo primero cuantas soles es una libra. 8. Para cada uno de los puntos siguientes escribir un programa que pida los datos necesarios y calcule el rea y el permetro de la figura indicada: a) Un cuadrado b) Un rectngulo c) Un tringulo d) Un crculo. 9. Escribir un programa para calcular el importe de una venta en un supermercado. El usuario debe indicar el nombre del producto, el precio por unidad y el N de unidades y el programa sacar por pantalla el nombre del producto, el N de unidades vendidas y el precio total. Preste especial atencin a qu tipo de datos resulta ms adecuado para cada representar cada cantidad. 10. Escribir un programa que calcule la nmina de un trabajador de la manera siguiente. El trabajador cobra un precio fijo por hora y se le retiene un 5% en concepto de Seguro Social. El programa debe pedir el nombre del trabajador, las horas trabajadas y el precio que cobra por hora. Como salida debe imprimir el sueldo bruto, la retencin y el sueldo neto. EJERCICIOS 2. OPERADORES Y EXPRESIONES 1. Evaluar las siguientes expresiones:

(a) 5 / 2 + 20 % 6 (b) 4 * 6 / 2 - 15 / 2 (c) 5 * 15 / 2 / (4 - 2) (d) 8 == 16 || 7 != 4 && 4 < 1 (e) (4 * 3 < 6 || 3 > 5 - 2) && 3 + 2 < 12 2. Suponiendo que a, b, c son variables enteras que tienen asignados los valores a=8, b=3, c=-5 determinar el valor de las siguientes expresiones: a) a + b + c b) 2 * b + 3 * (a-c) c) a/b d) a%b e) a/c f ) a%c g) a * b /c h) a * (b/c) i) (a*c)%b j) a * (c%b) 3. Suponiendo que previamente se ha realizado la declaracin x=7, y=2: enteros, calcular el valor de la variable y tras evaluar cada una de las siguientes sentencias de asignacin: (a) y = -2 + --x; (b) y += 2; (c) y = (y == x); (d) y = y++ - x; 4. Escribir un programa que pida un nmero entero y saque por pantalla el cociente y el resto de la divisin entera entre ambos. 5. Escribir un programa que pida una hora en segundos y la saque por pantalla en el formato hh:mm:ss, es decir horas, minutos y segundos. EJERCICIOS 3. ESTRUCTURAS DE CONTROL (1). ESTRUCTURAS ALTERNATIVAS (BIFURCACIONES) 1. Escribir un programa que pida dos nmeros y saque el mayor de ellos por pantalla. Una versin mejorada informar de si los dos nmeros son iguales. 2. Escribir un programa que pida un nmero e indique si se trata de un nmero par. 3. Escribir un programa que pida una nota e imprima por pantalla la calificacin en formato Apto o No Apto segn si la nota es mayor o menor que 5. 4. Escribir un programa que permita jugar a doble o nada: El jugador apuesta una cantidad y tira una moneda. Si sale cara obtiene el doble de la cantidad apostada. Si sale cruz la pierde todo.

59

mailxmail - Cursos para compartir lo que sabes


5. Escribir un programa que lea tres valores enteros y muestre por pantalla el mximo y el mnimo de ellos. 6. Escribir un programa que pida un nmero entero y determine si es mltiplo de 2 y de 5. 7. Escribir un programa que pida la nota de un examen (un N real entre 0 y 10) e imprima por pantalla la calificacin en formato Suspenso, si la nota es menor que 5, Aprobado si est entre 5 inclusive y 7 sin incluir, Notable si est entre 7 inclusive y 9 sin incluir, Sobresaliente si est entre 9 inclusive y 10 sin incluir y Matrcula de honor si la nota es igual a 10. 8. Escribir un programa que, dado el nombre o nmero del mes, y la informacin de si el ao es bisiesto saque por pantalla el nmero de das del mes 9. Escribir un programa que, pida la fecha de nacimiento de una persona e imprima por pantalla su signo zodiacal EJERCICIOS 4. ESTRUCTURAS DE CONTROL (2). ESTRUCTURAS ITERATIVAS (REPETICIONES) 1. Modificar el programa del juego de doble o nada para que permita ir jugando hasta que el jugador decida abandonar el juego. El programa debe sacar por pantalla el nmero de jugadas y el total ganado por el jugador (si ha perdido debe ser una cantidad negativa). 2. Escribir un programa para jugar a adivinar un nmero entre 1 y 10 (generado al azar por el ordenador) hasta acertarlo o decirlos todos. 3. Uno de los usos ms habituales para los bucles condicionales es la validacin de entradas. Escribir un programa que pida una contrasea y permita tres intentos. Si el usuario da la contrasea correcta responde "Enhorabuena!" y queda inactivo, con este mensaje. En caso contrario el programa escribe "Lo siento, contrasea equivocada" y se cierra de inmediato. 4. Escribir un programa que pida un nmero y saque por pantalla su tabla de multiplicar. 5. Escribir un programa para calcular el promedio de una lista de nmeros positivos acabada en un nmero negativo. 6. Escribir un programa para sumar los nmeros enteros de 1 a 100 utilizando a. estructura (repetir); b. estructura (mientras); c. estructura (des de). 7. Escribir un programa que lea una lista de nmeros y determine cuantos son positivos, y cuntos son negativos. 8. Escribir un programa que dados dos nmeros, uno real (base) y un entero positivo (exponente), saque por pantalla todas las potencias con base el numero dado y exponentes entre uno y el exponente introducido. 9. Escribir un programa que imprima por pantalla los codigos ASCII correspondientes a los N 32 al 127 EJERCICIOS 5. ESTRUCTURAS DE DATOS (1). VECTORES, MATRICES Y CADENAS Vectores y matrices

60

mailxmail - Cursos para compartir lo que sabes


1. Escribir un programa que lea diez nmeros, los guarde en un vector y a continuacin los imprima en orden inverso al de su entrada 2. Escribir un programa que lea tres nmeros y los guarde en un vector. A continuacin los ordenar y guardar los valores ordenados en otro vector. Finalmente sacar ambas listas de nmeros por la pantalla 3. Repetir el ejercicio anterior con un nmero cualquiera de valores

4. Escribir un programa que llene una matriz de 5 por 5 de valores aleatorios. A continuacin el programa debe imprimirla por pantalla. Opcional: El programa puede tambin imprimir las sumas de las filas y las columnas 5. Escribir un programa que pida un nmero e imprima por pantalla su tabla de sumar. Por ejemplo si el nmero fuera el 3 la tabla debera ser:

+ 0 1 2 3

0 0 1 2 3

1 1 2 3 4

2 2 3 4 5

3 3 4 5 6

Cadenas de caracteres 1. Escribir un programa que pida una frase acabada en un punto y cuente las palabras que contiene. 2. Escribir un programa que pida una palabra y cuente el nmero de vocales y consonantes que contiene. 3. Escribir un programa que lea una frase y la escriba en maysculas

4. Escribir un programa que sirva para generar cdigos de usuario por el procedimiento siguiente: Tiene que leer el nombre y los dos apellidos de una persona y devolver un cdigo de usuario formado por las tres primeras letras del primer apellido, las tres primeras letras del segundo apellido y las tres primeras letras del nombre. Por ejemplo, si la cadena de entrada es: JORGE GUIDO SANTAMARIA debe devolver GUISANJOR. EJERCICIOS 6. FUNCIONES 1. Disear una funcin que calcule el promedio de varios nmeros introducidos por el teclado. Hacer dos versiones, una para un nmero fijo de valores y otra para un nmero cualquiera de valores. 2. Escribir una funcin que intercambie el valor de dos variables, es decir si X=5 e Y=7 tras aplicar la funcin, por ejemplo haciendo "intercambiar(X,Y)" se tiene que X=7 e Y=5. 3. Disear una funcin que calcule la potencia ensima de un nmero, es decir que calcule X n paraX, real y n entero. 4. Disear una funcin "aMayusculas()" que convierta una cadena de texto en maysculas

61

mailxmail - Cursos para compartir lo que sabes


5. Disear dos funciones "EurosASoles()" y "SolesAEuros()" que realicen las conversiones de monedas de forma que se puedan utilizar directamente dentro de una expresin del tipo: "Imprimir valEuros son EurosAPts(valEuros)" 6. Disear una funcin "EsBisiesto()" que decida si un ao es bisiesto o no

7. Escribir una funcin "EsMultiplo" que sirva para determinar si un nmero es mltiplo de otra. Utilizarla en un programa que pida la antigedad de un trabajador y calcule cuantos trienios de antigedad tiene. 8. Modularizar el programa nomina1.c utilizando tres funciones. Una para la entrada, una para los clculos y una para la salida de resultados 9. Repetir la modularizacin anterior utilizando funciones que pasen parmetros

10. Hacer un programa salarios.c que utilice las funciones anteriores dentro de un bucle para calcular las nominas de un nmero indeterminado de trabajadores 11. Escribir dos funciones Entrada() y Salida() que incluyan todas las operaciones de entrada de datos y salida de resultados para el programa del ejercicio N 1.5 (terminal punto de venta)

62

mailxmail - Cursos para compartir lo que sabes

15. 39 ejercicios resueltos (1/4)


1. Programa que permite ingresar e imprimir cierta cantidad de nmeros y luego realizar la bsqueda de cualquiera de los nmeros ingresados. Imprime el nmero y la posicin en donde se encuentra el nmero buscado. DIM Numeros(100) AS INTEGER INPUT "cuantos nmeros va ingresar ", n DO INPUT "NMERO: ", num IF num > 100 AND num < 500 THEN i=i+1 Numeros(i) = num END IF LOOP WHILE i <= n 'IMPRIMIENDO LOS NMEROS FOR i = 1 TO n PRINT Numeros(i) NEXT 'Busqueda INPUT "dame un valor a buscar ", busca FOR i = 1 TO n IF busca = Numeros(i) THEN PRINT "Posicion ", i, " Nmero: ", Numeros(i) EXIT FOR END IF NEXT 2. Programa que permite ingresar 8 nmeros y realizar la bsqueda del mayor y menor imprimiendo tambin su posicin. DIM Numeros(1 TO 8) AS INTEGER FOR i = 1 TO 8 INPUT "NMERO : ", num Numeros(i) = num

63

mailxmail - Cursos para compartir lo que sabes


NEXT 'IMPRIMIENDO LOS NMEROS FOR i = 1 TO 8 PRINT Numeros(i) NEXT 'Busqueda del mayor may = 0 men = 10000 FOR i = 1 TO 8 IF may < Numeros(i) THEN may = Numeros(i) PosMay = i END IF IF men > Numeros(i) THEN men = Numeros(i) PosMen = i END IF NEXT PRINT "El mayor es: "; may, "Posicin ", PosMay PRINT "El Menor es: "; men, "Posicin ", PosMen 3. Programa que soporta ingresar e imprimir cierta cantidad de nmeros mayores de 100 y menores de 500. Permite realizar la bsqueda de un nmero cualquiera imprimindolo junto a su posicin. DIM Numeros(100) AS INTEGER INPUT "cuantos nmeros va ingresar ", n DO INPUT "NMERO : ", num IF num > 100 AND num < 500 THEN i=i+1 Numeros(i) = num END IF LOOP WHILE i <= n

64

mailxmail - Cursos para compartir lo que sabes


'IMPRIMIENDO LOS NMEROS FOR i = 1 TO n PRINT Numeros(i) NEXT 'Busqueda INPUT "dame un valor a buscar ", busca FOR i = 1 TO n IF busca = Numeros(i) THEN PRINT "Posicion ", i, " Nmero: ", Numeros(i) EXIT FOR END IF NEXT 4. Elaborar un algoritmo que permita ingresar 20 nmeros y muestre todos los nmeros ingresados menores e iguales a 25. DIM Numeros AS STRING CLS FOR i = 1 TO 20 INPUT "Nmero: ", Numero IF Numero <= 25 THEN Numeros = Numeros + ", " + STR$(Numero) END IF NEXT PRINT "Nmeros Menores o Iguales que 25: ", Numeros 5. Elaborar un algoritmo, que permita el ingreso de 10 nmeros enteros. El programa debe sumar todos los nmeros que sean mltiplos de 3 e imprimirlo. CLS FOR i = 1 TO 10 INPUT "numero: ", Numero IF Numero MOD 3 = 0 THEN Suma = Suma + Numero END IF NEXT

65

mailxmail - Cursos para compartir lo que sabes


PRINT "La suma es: ", Suma 6. Disear un algoritmo que me permita calcular los 5 primeros nmeros perfecto (un nmero es perfecto, cuando la suma de sus divisores, sin incluirlo al nmero es exactamente el mismo nmero). El 6 es un nmero perfecto ya que sus divisores son 1,2 y 3 suman 6. La solucin hace que el computador tome un buen tiempo para completar los 5 nmeros. CLS Num = 5 C = 0 DO WHILE C < 5 Num = Num + 1 Suma = 0 FOR i = 1 TO INT(Num / 2) IF Num MOD i = 0 THEN Suma = Suma + i END IF NEXT IF Num = Suma THEN C=C+1 PRINT "El Numero", Num END IF LOOP

7. Hacer un programa que calcule el factorial de un nmero ingresado por el teclado. Pudiendo ser solucionado de varias formas.

Primera Forma CLS INPUT "Ingrese un numero: ", Num Factorial = 1 DO i = i + 1 Factorial = Factorial * i LOOP WHILE i < Num

66

mailxmail - Cursos para compartir lo que sabes


LOOP WHILE i < Num 'PRINT "Factorial= ", Factorial Segunda Forma CLS INPUT "Ingrese un numero: ", Num Factorial = 1 DO WHILE i < Num i = i + 1 Factorial = Factorial * i LOOP PRINT "Factorial= ", Factorial Tercera Forma CLS INPUT "Ingrese un numero: ", Num Factorial = 1 FOR i = 1 TO Num Factorial = Factorial * i NEXT PRINT "Factorial= ", Factorial 8. Escribir un algoritmo que determine si un ao es bisiesto. Teniendo en cuenta que un ao es bisiesto si es mltiplo de 4. Los aos mltiplos de 100 no son bisiestos, salvo si ellos son tambin mltiplos de 400. CLS INPUT "ingrese un numero: ", N IF N MOD 4 <> 0 THEN PRINT "El Ao", N, "NO es bisiesto" ELSE IF N MOD 4 = 0 AND N MOD 400 <> 0 AND N MOD 100 = 0 THEN PRINT "El Ao", N, "NO es bisiesto" END IF IF N MOD 4 = 0 AND N MOD 400 = 0 AND N MOD 100 = 0 THEN PRINT "El Ao", N, "SI es bisiesto"

67

mailxmail - Cursos para compartir lo que sabes


END IF IF N MOD 4 = 0 AND N MOD 400 <> 0 AND N MOD 100 <> 0 THEN PRINT "El Ao"; N, "SI es bisiesto" END IF END IF 9. Hacer un programa que sume los nmeros que son mltiplos de 3, 5 y de 7 entre 100 y 300. CLS Num = 100 DO WHILE Num <= 300 Num = Num + 1 IF Num MOD 3 = 0 OR Num MOD 5 = 0 OR Num MOD 7 = 0 THEN Acumulado = Acumulado + Num END IF LOOP PRINT "Acumulado", Acumulado 10. Escribir la serie de fibonacci de n. La serie es: 1, 1, 2, 3, 5, 8, 13, 21, 34 n elementos. Este problema se puede resolver usando procesos recursivos, solucin que se encuentra en Algoritmos y Leguaje C CLS INPUT "Cantidad de Elementos de la Serie Fibonacii: ", CaElementos Con = 0 nAct = 1 nAnt = 1 DO WHILE (Con < CaElementos) PRINT nAnt nSig = nAnt + nAct nAnt = nAct nAct = nSig Con = Con + 1 LOOP

68

mailxmail - Cursos para compartir lo que sabes

16. 39 ejercicios resueltos (2/4)


11. Programa que suma los n primeros nmeros naturales. CLS INPUT "Cantidad: ", N FOR i = 0 TO N suma = suma + i NEXT PRINT suma 12. Dada la duracin (en minutos) en una llamada telefnica. Calcular su costo de la siguiente manera: Hasta 3 minutos el costo es de 0.50 Por encima de 3 minutos al costo hay que sumar 0.10 por cada minuto adicional a los 3 primeros. CLS INPUT "Minutos: ", NM IF NM <= 3 THEN Costo = NM * .5 ELSE Costo = 3 * .5 + (NM - 3) * (.6) END IF PRINT Costo Total por la LLamada, Costo 13. Hacer un programa para convertir un nmero natural en romano. Solucin adquirida de la pgina de Microsoft, soporta la conversin hasta el ao 3999. DIM I AS INTEGER, Digit AS INTEGER, Temp AS STRING CONST Digits = "IVXLCDM" INPUT "Numero Narutal: ", N I=1 Temp = "" DO WHILE N > 0 Digit = N MOD 10 N = N \ 10

69

mailxmail - Cursos para compartir lo que sabes


SELECT CASE Digit CASE 1 Temp = MID$(Digits, I, 1) + Temp CASE 2 Temp = MID$(Digits, I, 1) + MID$(Digits, I, 1) + Temp CASE 3 Temp = MID$(Digits, I, 1) + MID$(Digits, I, 1) + Temp CASE 4 Temp = MID$(Digits, I, 2) + Temp CASE 5 Temp = MID$(Digits, I + 1, 1) + Temp CASE 6 Temp = MID$(Digits, I + 1, 1) + MID$(Digits, I, 1) + CASE 7 Temp = MID$(Digits, I + 1, 1) + MID$(Digits, I, 1) + Temp CASE 8 Temp = MID$(Digits, I + 1, 1) + MID$(Digits, I, 1) + MID$(Digits, I, 1) + MID$(Digits, I, 1) + Temp CASE 9 Temp = MID$(Digits, I, 1) + MID$(Digits, I + 2, 1) + END SELECT I=I+2 LOOP PRINT "Nmero en Romano", Temp 14. Dada una hora, por ejemplo en horas, minutos, y hacer un programa para calcular la hora en el siguiente segundo. CLS INPUT "Hora: ", Hora INPUT "Minuto: ", Minuto INPUT "Segundo: ", Segundo IF Segundo = 59 THEN Temp MID$(Digits, I, 1) + Temp MID$(Digits, I, 1) +

70

mailxmail - Cursos para compartir lo que sabes


Segundo = 0 Minuto = Minuto + 1 IF Minuto = 60 THEN Minuto = 0 Hora = Hora + 1 END IF END IF PRINT Hora, ":", Minuto, ":", Segundo 15. Hacer un programa para calcular el pago por un boleto de viaje con la condicin de que: si el recorrido supera los 800 kilmetros o a su vez el nmero de das de estada es mayor a 7 el descuento es del 3%, si el pago por km recorrido es de 12.5 soles. CLS INPUT "Ingrese el Kilometraje: ", Kil INPUT "Ingrese el Numero de Dias: ", NDE IF Kil > 800 AND NDE > 7 THEN Boleto= Kil * 12.5 - Kil * 12.5 * .03 ELSE Boleto = Kil * 12.5 END IF PRINT Boleto 16. Programa de la tabla de multiplicar descendente. Primera Forma CLS FOR i = 12 TO 0 STEP -1 PRINT "2x", i, "="; 2 * i NEXT Segunda Forma CLS DO PRINT "2x", i, "="; 2 * i i = i + 1 LOOP WHILE i <= 12

71

mailxmail - Cursos para compartir lo que sabes


Tercera Forma CLS DO WHILE i <= 12 PRINT "2x", i, "="; 2 * i i = i + 1 LOOP Cuarta Forma CLS DO UNTIL i >= 13 PRINT "2x", i, "="; 2 * i i = i + 1 LOOP 17. Calcular el total de las ventas de cinco clientes en un restaurante. Ante cualquier consumo que supere los 70 soles se har un descuento del 5%. Imprima el monto total consumido. CLS FOR i = 1 TO 5 INPUT "Pague: ", Consumo PRINT "Pago por el Men: ", Consumo Total = Total + Consumo IF Total > 70 THEN Total = Total - Total * .05 END IF NEXT PRINT "Total a Pagar: ", Total 18. Hacer un programa que permita calcular el mnimo comn mltiplo de 3 nmeros. DIM a, b, c, d, acum AS LONG INPUT "Primer Nmero: ", a INPUT "Segundo Nmero: ", b INPUT "Tercer Nmero: ", c d = 2

72

mailxmail - Cursos para compartir lo que sabes


acum = 1 WHILE ((a <> 1) OR (b <> 1) OR (c <> 1)) WHILE ((a MOD d = 0) OR (b MOD d = 0) OR (c MOD d = 0)) IF (a MOD d = 0) THEN a=a/d ELSE a=a END IF IF (b MOD d = 0) THEN b = b / d ELSE b=b END IF IF (c MOD d = 0) THEN c=c/d ELSE c=c END IF acum = acum * d WEND d = d + 1 WEND PRINT "Mnimo Comn Mltiplo: ", acum 19. Hacer un programa que calcule el mximo comn divisor de 3 nmeros ingresados por el teclado. DIM a, b, c, d, mcd AS LONG INPUT "Primer Nmero: ", a INPUT "Segundo Nmero: ", b INPUT "Tercer Nmero: ", c d = 2 mcd = 1 r = 0

73

mailxmail - Cursos para compartir lo que sabes


IF ((a <> 1) AND (b <> 1) AND (c <> 1)) THEN WHILE ((a MOD d = 0) AND (b MOD d = 0) AND (c MOD d = 0)) r = r + 1 a = a / d b = b / d c = c / d WEND mcd = 2 ^ r END IF PRINT "Mximo Comn Divisor: ", mcd

74

mailxmail - Cursos para compartir lo que sabes

17. 39 ejercicios resueltos (3/4)


20. Dado un texto, escribir un programa que imprima la cantidad de cada una de las vocales incluidas en el texto. DIM Tama AS INTEGER DIM Texto AS STRING CLS INPUT "ESCRIBA UN TEXTO: ", Texto$ Texto$ = UCASE$(Texto) Tama = LEN(Texto$) FOR i = 1 TO Tama IF MID$(Texto$, i, 1) = "A" THEN va = va + 1 END IF NEXT FOR i = 1 TO Tama IF MID$(Texto$, i, 1) = "E" THEN ve = ve + 1 END IF NEXT FOR i = 1 TO Tama IF MID$(Texto$, i, 1) = "I" THEN vi = vi + 1 END IF NEXT FOR i = 1 TO Tama IF MID$(Texto$, i, 1) = "O" THEN vo = vo + 1 END IF NEXT FOR i = 1 TO Tama IF MID$(Texto$, i, 1) = "U" THEN

75

mailxmail - Cursos para compartir lo que sabes


IF MID$(Texto$, i, 1) = "U" THEN vu = vu + 1 END IF NEXT PRINT "Vocales a: ", va PRINT "Vocales e: ", ve PRINT "Vocales i: ", vi PRINT "Vocales o: ", vo PRINT "Vocales u: ", vu 21. Hacer un programa que permita calcular todos los nmeros primos entre dos nmeros ingresados por el teclado. DIM i, N1, N2, j AS INTEGER INPUT "NMERO INFERIOR: ", N1 INPUT "NMERO SUPERIOR: ", N2 FOR i = N1 TO N2 j = 2 DO WHILE i MOD j <> o j = j + 1 IF i = j THEN PRINT " ", i END IF LOOP NEXT 22. Escriba un programa que determine cuantas vocales, consonantes y espacios en blanco existen en un texto. DIM i AS INTEGER DIM Textito, Captura AS STRING INPUT "INGRESE EL TEXTO: ", Textito$ Textito$ = UCASE$(Textito$) FOR i = 1 TO LEN(Textito$) Captura$ = MID$(Textito$, i, 1) SELECT CASE Captura

76

mailxmail - Cursos para compartir lo que sabes


CASE IS = "A": vocal = vocal + 1 CASE IS = "E": vocal = vocal + 1 CASE IS = "I": vocal = vocal + 1 CASE IS = "O": vocal = vocal + 1 CASE IS = "U": vocal = vocal + 1 END SELECT IF MID$(Textito$, i, 1) = " " THEN blanco = blanco + 1 END IF NEXT PRINT "Vocales: "; vocal PRINT "Espacios en blanco: ", blanco PRINT "Consonantes: ", LEN(Textito$) - (vocal + blanco) 23. Hacer un programa que pase un nmero natural menor de 9 a un nmero de otra base. DIM p, A, B, j AS LONG DIM Vec1(9) AS INTEGER INPUT "NUMERO MAYOR DE 2 Y MENOR DE 10: ", A INPUT "NUMERO BASE: ", B i = 0 IF ((A >= 2) AND (A <= 10)) THEN DO WHILE (A > 0) i = i + 1 Vec1(i) = A MOD B A=A\B LOOP j = i END IF FOR p = j TO 1 STEP -1 PRINT STR$(Vec1(p)) NEXT 24. Escribir un programa que imprima los nmeros del 1 al 10, cada uno de

77

mailxmail - Cursos para compartir lo que sabes


ellos con su respectiva factorial. FOR i = o TO 10 IF i = 0 OR i = 1 THEN f=1 ELSE f = f * i END IF PRINT "Factorial" + STR$(i) + "==>" + STR$(f) NEXT 25. Escriba un programa que permita ingresar un nmero n entero positivo mayor o igual que 10 y menor o igual que 50; luego imprima los mltiplos menores que 1000 as como sus divisores respectivos. DIM Vec1(1000), Vec2(1000) AS DOUBLE CLS INPUT "INGRESE UN NUMERO MAYOR A 10 Y MENOR A 50: ", Numero IF Numero >= 10 AND Numero <= 50 THEN j = 1 a = 1 DO a = Numero * j PRINT a j = j + 1 LOOP WHILE a < 1000 FOR i = 1 TO Numero 'para hallar los divisores IF Numero MOD i = 0 THEN PRINT "Divisores: ", i END IF NEXT END IF 26. Escribir un programa que ordene ascendentemente 10 nmeros ingresados por el teclado. DIM Vec1(10) AS DOUBLE CLS

78

mailxmail - Cursos para compartir lo que sabes


TAM = 10 FOR I = 1 TO 10 INPUT "Ingrese Nmero: ", Num Vec1(I) = Num NEXT FOR I = 1 TO TAM - 1 FOR j = 1 TO TAM - 1 IF Vec1(j) > Vec1(j + 1) THEN temp = Vec1(j) Vec1(j) = Vec1(j + 1) Vec1(j + 1) = temp END IF NEXT NEXT FOR I = 1 TO 10 PRINT "Nmero: ", I, Vec1(I) NEXT 27. Escribir un programa que ordene descendentemente 10 nmeros ingresados por el teclado. DIM Vec2(10) AS DOUBLE CLS Tam = 10 FOR i = 1 TO 10 INPUT "Ingrese un Nmero: ", Num Vec2(i) = Num NEXT FOR i = 1 TO Tam - 1 FOR j = 1 TO Tam - 1 IF Vec2(j) < Vec2(j + 1) THEN temp = Vec2(j) Vec2(j) = Vec2(j + 1)

79

mailxmail - Cursos para compartir lo que sabes


Vec2(j + 1) = temp END IF NEXT NEXT PRINT "==ORDENACIN DESCENDENTE==" FOR i = 1 TO 10 PRINT "Numero", Vec2(i) NEXT 28. Escribir un programa que permita pasar un nmero natural cualquiera a binario. DIM Num, Cuo, Res AS INTEGER DIM NN AS STRING CLS INPUT "INGRESE UN NUMERO NATURAL: ", Num DO Res = Num MOD 2 Cuo = Num \ 2 Num = Cuo NN$ = NN$ + STR$(Res) LOOP WHILE Num > 0 FOR i = LEN(NN$) TO 1 STEP -1 a$ = a$ + MID$(NN$, i, 1) NEXT PRINT "Numero", a$ 29. Escribir un programa que permita pasar un nmero binario cualquiera a un nmero natural. DIM NB AS STRING CLS INPUT "DAME UN NMERO BINARIO; ", NB$ T = LEN(NB$) NUMERO = 0 FOR i = 1 TO T

80

mailxmail - Cursos para compartir lo que sabes


NUMERO = NUMERO + VAL(MID$(NB$, i, 1)) * 2 ^ (T - i) NEXT PRINT NUMERO

81

mailxmail - Cursos para compartir lo que sabes

18. 39 ejercicios resueltos (4/4)


30. Hacer un programa que invierta un texto ingresado por el teclado. DIM NB, TextoI AS STRING CLS INPUT "ESCRIBA UN TEXTO; ", NB$ LT = LEN(NB$) FOR i = LT TO 1 STEP -1 TextoI$ = TextoI$ + MID$(NB$, i, 1) NEXT PRINT TextoI$ 31. Hacer un programa que muestre los mltiplos de 5 comprendidos entre 200 y 300. Iniciar el contador en 200. CLS x = 200 DO WHILE x <= 300 PRINT x x = x + 5 LOOP 32. Calcular el acumulado de las edades de un grupo de N personas siempre y cuando dichas edades sean mayores a 18 y no pasen de 45. CLS INPUT "cantidad de personas: ", n x = 1 DO WHILE x < n INPUT "EDAD; ", E IF E > 18 AND E <= 45 THEN SUMA = SUMA + E END IF x = x + 1 LOOP PRINT "ACUMULADO ES: ", SUMA

82

mailxmail - Cursos para compartir lo que sabes


33. Programa que calcula el promedio de las edades menores a 20 y mayores a 55 de un grupo de N personas. CLS INPUT "cantidad de personas: ", N x = 0 DO WHILE x < N INPUT "EDAD; ", E IF E < 20 OR E > 55 THEN SUMA = SUMA + E END IF x = x + 1 LOOP PRINT "PROMEDIO ES: "; SUMA / N 34. Hacer en programa que muestre los nmeros pares entre 1000 y 0. No se escribir los nmeros que se encuentren en el rango de 200 A 50. CLS X = 1000 DO WHILE X > 0 X=X-2 IF X > 50 AND X > 200 THEN PRINT X END IF LOOP 35. Hacer un programa que en cada vuelta vaya mostrando los acumulados de los nmeros pares ente 1000 y 0 pero no escribir los nmeros cuando el contador se encuentra entre el rango de 200 a 50. CLS X = 1000 DO WHILE X > 0 X=X-2 IF X > 50 AND X > 200 THEN SUMA = SUMA + X PRINT X, SUMA

83

mailxmail - Cursos para compartir lo que sabes


END IF LOOP 36. Dados n nmeros, hacer un programa que determine la suma de los que sean mayores a cero, el producto de los menores que cero y se cuenten cuantos nmeros son iguales a cero. CLS INPUT "CANTIDAD DE NMEROS: ", C X = 0 P = 1 S=0 DO WHILE X < C X=X+1 INPUT "NUMERO: ", N IF N = 0 THEN CE = CE + 1 ELSE IF N > 0 THEN S=S+N ELSE P=P*N END IF END IF LOOP PRINT CE, S, P 37. Si ingresamos los valores de los lados (a, b, c) de 35 tringulos. Calcular cuntas reas son pares, cuntas impares, cuntas no se pudieron calcular por no existir el Tringulo. CLS X = 0 P = 1 S=0 DO WHILE X <= 35 X = X + 1

84

mailxmail - Cursos para compartir lo que sabes


INPUT "LADO A: ", A INPUT "LADO B: ", B INPUT "LADO C: ", C IF A + B > C AND B + C > A AND A + C > B THEN S = (A + B + C) / 2 AREA = S * SQR((S - A) * (S - B) * (S - C)) IF AREA MOD 2 = 0 THEN SAP = SAP + 1 ELSE SAI = SAI + 1 END IF ELSE ANC = ANC + 1 END IF LOOP PRINT "AREAS PARES", SAP PRINT "AREAS IMPARES", SAI PRINT "AREAS NO SE PUEDEN CALCULAR", ANC 38. En el ejercicio anterior se desea conocer cual fue el tringulo de mayor rea. CLS X = 0 P = 1 S=0 MAYOR = 50000 DO WHILE X <= 35 X = X + 1 PRINT "OTRA AREA" PRINT "================================================" INPUT "LADO A: ", A INPUT "LADO B: ", B

85

mailxmail - Cursos para compartir lo que sabes


INPUT "LADO C: ", C IF A + B > C AND B + C > A AND A + C > B THEN S = (A + B + C) / 2 AREA = S * SQR((S - A) * (S - B) * (S - C)) IF AREA MOD 2 = 0 THEN SAP = SAP + 1 ELSE SAI = SAI + 1 END IF IF MAYOR > AREA THEN MAYOR = AREA END IF ELSE ANC = ANC + 1 END IF LOOP PRINT "REAS PARES ", SAP PRINT "REAS IMPARES ", SAI PRINT "REAS NO SE PUEDEN CALCULAR ", ANC PRINT "REA MAYOR ", MAYOR 39. En el ejercicio anterior se desea conocer cual es el tringulo de menor rea. CLS X = 0 P = 1 S=0 MENOR = 0 DO WHILE X <= 35 X = X + 1 PRINT "OTRA AREA" PRINT "================================================" INPUT "LADO A: ", A

86

mailxmail - Cursos para compartir lo que sabes


INPUT "LADO B: ", B INPUT "LADO C: ", C IF A + B > C AND B + C > A AND A + C > B THEN S = (A + B + C) / 2 AREA = S * SQR((S - A) * (S - B) * (S - C)) IF AREA MOD 2 = 0 THEN SAP = SAP + 1 ELSE SAI = SAI + 1 END IF IF MENOR < AREA THEN MENOR = AREA END IF ELSE ANC = ANC + 1 END IF LOOP PRINT "REAS PARES ", SAP PRINT "REAS IMPARES ", SAI PRINT "REAS NO SE PUEDEN CALCULAR ", ANC PRINT "REA MENOR", MENOR

87

mailxmail - Cursos para compartir lo que sabes

19. Bibliografa y anexo. cdigos de carcteres ASCII


1. 2. http://www.mailxmail.com/curso-algoritmos-lenguaje-c JUAN M. GONZLEZ. http://jm00092.freehostia.com/cqb/cqb107.htm

3. ALEX SNCHEZ. http://usuarios.lycos.es/sanplaale/programacio/index.html 4. Universidad de Oviedo. Manual de Quick Basic. http://www.etsimo.uniovi.es/qbasic/ ANEXO 1: CDIGOS DE CARACTERES ASCII Mapa de caracteres bsicos

88