Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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.
MNIMO Y MXIMO
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.
10
11
12
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
14
OPERADOR NOMBRE + Suma Resta * Multiplicacin / Divisin MOD Resto de divisin (Mdulo) ^ Potencias
15
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
TABLA DE LA VERDAD PARA AND VERDADERO AND VERDADERO = VERDADERO AND FALSO = FALSO AND VERDADERO = FALSO AND FALSO =
TABLA DE LA VERDAD PARA OR VERDADERO OR VERDADERO = VERDADERO VERDADERO OR FALSO = VERDADERO FALSO OR VERDADERO = VERDADERO 17
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
19
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
UCASE$(Cadena)
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
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
23
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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
47
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
49
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
51
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
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
54
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
56
57
7. A partir del programa anterior escribir uno que pase de soles a libras esterlinas, pidiendo primero cuantas soles es una libra.
58
(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
60
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
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
63
64
65
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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