Nombre y Apellidos: Especialidad y Grupo: FUNDAMENTOS DE INFORMÁTICA 22-enero-2002 CUESTIÓN de Estructuras repetitivas y alternativas (1.5 puntos) 1. Suponiendo que el usuario teclea los datos 1, 2, 3, indicar y explicar los valores o los errores que se van a visualizar en cada línea de la pantalla tras la ejecución del programa XYZ.bas. Tener en cuenta que las variables en este programa no han sido declaradas con la sentencia DIM. ‘Programa XYZ.bas INPUT "Teclea valores numéricos para x, y, z: ", x, y, z i=0 DO i=i+1 PRINT x + y, x + y$, x$ + y$ PRINT “z + i”, z + i, z$ + “1” LOOP WHILE i < 3 Para i = 1 col 1 2 1 5 9 ----------------------------------------------3 Type mismatch cadena vacía z + i 4 1 fila 1 fila 2 Como 1 < 3, se repite el bucle DO ... LOOP ... Para i = 2 col 1 2 1 5 9 ----------------------------------------------3 Type mismatch cadena vacía z + i 5 1 fila 3 fila 4 Para i = 3 Se acaba la ejecución del bucle, pues la condición 3 < 3 es falsa. En i = 1 e i = 2 se produce el error Type mismatch, puesto que se está intentando realizar la operación “+” entre dos operandos de diferente tipo: x es numérico e y$ es alfanúmerico. Por lo tanto, “+” no es la suma entre dos operandos numéricos ni la concatenación entre dos operandos alfanuméricos. 1 PROGRAMA de Estructuras alternativas y repetitivas (2.5 puntos) 2. Una vez simulada la ejecución del programa ALFABETO.bas, anotar cuál es la salida en pantalla. A continuación, codificar otro programa en QB que obtenga los mismos resultados, pero con las siguientes condiciones: • No utilizar las funciones MID$, RIGHT$, LEFT$. • En su lugar usar las funciones relacionadas con los caracteres y códigos ASCII. • La tabla ASCII correspondiente a las letras mayúsculas A, ..., Z y Ñ es: A B C D 65 66 67 68 E F G H 69 70 71 72 I J K L 73 74 75 76 M N O P 77 78 79 80 Q R S T ‘Programa ALFABETO.bas DIM a AS INTEGER, b AS INTEGER DIM cadena AS STRING * 27 cadena = "ZYXWVUTSRQPOÑNMLKJIHGFEDCBA" FOR a = 1 TO 27 FOR b = 1 + a TO 27 PRINT MID$(cadena, b, 1); NEXT b PRINT NEXT a 'Programa ALFABETO.bas DIM a AS INTEGER, b AS INTEGER FOR a = 1 TO 27 FOR b = 90 - a TO 65 STEP -1 PRINT CHR$(b); IF b = 79 THEN PRINT CHR$(165); END IF NEXT b PRINT NEXT a 2 81 82 83 84 U V W X 85 86 87 88 Y Z 89 90 Ñ 165 PROGRAMA de Arrays y Registros (3.5 puntos) 3. Escribir un programa en QB para controlar el público asistente a la proyección de una película en una sala de cine cualquiera de Vitoria. Para este programa se dispone de los siguientes arrays: • Tabla dinámica, llamada ocupaCine, de m x n elementos de tipo numérico. Cada elemento contiene un 1 o un 0, según si el asiento está o no ocupado. • Lista dinámica, llamada ocupaFilasCine, de m elementos de tipo numérico. Cada elemento contiene la suma de los asientos ocupados en cada fila de la tabla anterior. • Lista dinámica, llamada ocupaColumnasCine, de n elementos de tipo numérico. Cada elemento contiene la suma de los asientos ocupados en cada columna de la tabla anterior. ocupaCine 3 filas x 8 columnas 0 1 1 1 1 1 1 0 1 1 1 1 0 1 1 0 1 1 1 1 0 1 2 3 3 3 2 2 ocupaColumnasCine 8 columnas 0 0 1 ocupaFilasCine 3 filas 6 5 6 1 17 Para su confección se deben seguir estos pasos: • Teclear el nombre de la película y del cine (por ejemplo, Juana La Loca y Cines Florida). • Teclear las dimensiones m y n. Suponer que estos datos van a ser correctos. • Declarar ahora la tabla y las dos listas dinámicas. • Cargar la tabla ocupaCine, utilizando el formato de pantalla de carga por filas. Controlar que el dato introducido sea 0 ó 1. En caso de error, emitir un mensaje y repetir la entrada. • Calcular los elementos de la lista ocupaFilasCine. • Calcular los elementos de la lista ocupaColumnasCine. • Hallar la suma de los elementos de cada lista, comprobando que el resultado final es el mismo para visualizarlo de la siguiente forma: A la primera sesión de la película xxxxxxxxxxxxxxxxxxxx en el cine xxxxxxxxxxxxxxxxxxxx ha asistido un total de ### espectadores. REM Cálculo del público asistente a la proyección REM de una película en una sala de cine DIM DIM DIM DIM DIM nombrePeli AS STRING * 20 nombreCine AS STRING * 20 m AS INTEGER, i AS INTEGER n AS INTEGER, j AS INTEGER sumaFilas AS INTEGER, sumaColumnas AS INTEGER CLS 3 INPUT "Teclear el nombre de la película: ", nombrePeli INPUT "Teclear el nombre del cine: ", nombreCine INPUT "Teclear la dimensión de INPUT "Teclear la dimensión de DIM ocupaCine(1 TO m, 1 TO n) DIM ocupaFilasCine(1 TO m) AS DIM ocupaColumnasCine(1 TO n) las filas: ", m las columnas: ", n AS INTEGER INTEGER AS INTEGER 'Carga del array ocupaCine y ocupaFilasCine y 'cálculo de la suma de los elementos de ocupaFilasCine FOR i = 1 TO m FOR j = 1 TO n DO PRINT "Elemento ("; i; ","; j; ")"; INPUT ": ", ocupaCine(i, j) LOOP UNTIL ocupaCine(i, j) = 0 OR ocupaCine(i, j) = 1 ocupaFilasCine(i) = ocupaFilasCine(i) + ocupaCine(i, j) NEXT j sumaFilas = sumaFilas + ocupaFilasCine(i) NEXT i 'Carga del array ocupaColumnasCine y 'cálculo de la suma de los elementos de ocupaColumnasCine FOR j = 1 TO n FOR i = 1 TO m ocupaColumnasCine(j) = ocupaColumnasCine(j) + ocupaCine(i, j) NEXT i sumaColumnas = sumaColumnas + ocupaColumnasCine(j) NEXT j 'Visualización del resultado IF sumaFilas = sumaColumnas THEN PRINT PRINT "A la primera sesión" PRINT "de la película "; nombrePeli PRINT "en el cine "; nombreCine PRINT "ha asistido un total de "; PRINT USING "###"; sumaFilas; PRINT " espectadores." END IF 4 PROGRAMA de Funciones y Procedimientos (2.5 puntos) 4. La empresa “RAPPEL.COM” se dedica a echar las cartas del tarot, pero previamente calcula el número del tarot. Para facilitar este trabajo vamos a codificar un programa en QB que obtenga dicho número en base a la fecha de nacimiento. • Programa Principal • Este programa se va a repetir hasta que no haya más clientes en la consulta de “RAPPEL.COM”. • Teclear la fecha de nacimiento de la siguiente forma: • Visualizar Año: _ Controlar que el año sea positivo. Si es incorrecto, mensaje de error y repetir la entrada del año. • Visualizar Mes: _ Controlar que el mes sea un número comprendido entre 1 y 12. Si es incorrecto, mensaje de error y repetir la entrada del mes. • Visualizar Día: _ Controlar que el día sea un número correcto según el mes y el año introducidos. En caso de error, repetir la entrada del día. • Una vez que la fecha introducida es correcta, sumar el año, el mes y el día; y convertir dicha suma en una cadena alfanumérica llamada sumaCad. • Llamar a la función calculoNumTarot%, cuyo argumento de entrada es sumaCad. • Visualizar en la línea 10 el número de tarot obtenido. • Llamar a la función hayMasClientes$, sin argumentos. • Si la respuesta es “SI”, repetir la entrada de la fecha de nacimiento. • Función calculoNumTarot% • El parámetro formal de entrada es una cadena, que representa la suma de los números que incorpora la fecha de nacimiento. Devuelve el número del tarot. • Calcular el número de la suerte o del tarot, sumando cada dígito de esa cadena hasta obtener un solo dígito (0-9). • Por ejemplo, a todos los/as niños/as que nazcan en este día les va a corresponder el siguiente número de la suerte: Año: 2002 Mes: 1 Día: 22 Número del tarot = 9 • Función hayMasClientes$ • No tiene parámetros formales de entrada. Devuelve “SI” o “NO”. • Visualizar en la línea 20 el siguiente mensaje: ¿Quedan más clientes (SI/NO)? __ • Convertir la respuesta a mayúsculas y controlar que sea SI o NO. Se pide: a. Completar el programa principal y la función hayMasClientes$, allí donde haya puntos suspensivos, de acuerdo con el enunciado anterior. b. Transformar la función calculoNumTarot% en un procedimiento con el mismo nombre, y modificar también aquellas partes necesarias en el módulo principal. 5 REM Programa para calcular el número de tarot REM correspondiente a la fecha de nacimiento. REM DECLARE FUNCTION calculoNumTarot% (cadena AS STRING) DECLARE FUNCTION hayMasClientes$ () DIM DIM DIM DIM DIM DIM DIM DIM anno AS INTEGER mes AS INTEGER dia AS INTEGER bisiesto AS INTEGER fallo AS STRING * 2 sumaNum AS INTEGER sumaCad AS STRING respu AS STRING DO CLS PRINT PRINT "Teclea tu fecha de nacimiento" PRINT STRING$(29, "-") ...................................................................Parte 1 DO INPUT " Día: ", dia fallo = "NO" bisiesto = (anno MOD 4) OR (anno MOD 4 = 0 AND anno MOD 100 <> 0) SELECT CASE mes CASE IS = 1, 3, 5, 7, 8, 10, 12 IF dia < 1 OR dia > 31 THEN PRINT "El mes "; mes; "tiene [1,31] días." fallo = "SI" END IF CASE IS = 2 IF NOT bisiesto AND (dia < 1 OR dia > 28) THEN PRINT "Este mes de febrero tiene [1,28] días." fallo = "SI" END IF IF bisiesto AND (dia < 1 OR dia > 29) THEN PRINT "Este mes de febrero tiene [1,29] días." fallo = "SI" END IF CASE IS = 4, 6, 9, 11 IF dia < 1 OR dia > 30 THEN PRINT "El mes "; mes; "tiene [1,30] días." fallo = "SI" END IF END SELECT LOOP UNTIL fallo = "NO" sumaNum = anno + mes + dia sumaCad = LTRIM$(STR$(sumaNum)) numero = calculoNumTarot%(sumaCad) COLOR 12 LOCATE 10, 11: PRINT "Tu número de Tarot es "; numero ...................................................................Parte 2 LOOP UNTIL respu = "NO" FUNCTION calculoNumTarot% (cadena AS STRING) DIM i AS INTEGER DIM suma AS INTEGER FOR i = 1 TO LEN(cadena) suma = suma + VAL(MID$(cadena, i, 1)) IF suma > 9 THEN suma = suma - 9 END IF NEXT i calculoNumTarot% = suma END FUNCTION FUNCTION hayMasClientes$ DIM resp AS STRING * 2 ...................................................................Parte 3 hayMasClientes$ = resp 6 END FUNCTION ...............................................................Parte 1 DECLARE SUB calculoNumTarot (cadena AS STRING, numTarot AS INTEGER) DIM numero AS INTEGER (Estas dos principal) declaraciones también se deben incluir en el programa DO INPUT " Año: ", anno IF anno <= 0 THEN PRINT "El año debe ser un número positivo." END IF LOOP UNTIL anno > 0 DO INPUT " Mes: ", mes IF mes < 1 OR mes > 12 THEN PRINT "El mes debe estar comprendido 1 y 12." END IF LOOP UNTIL mes >= 1 AND mes <= 12 ...............................................................Parte 2 CALL calculoNumTarot(sumaCad, numero) COLOR 12 LOCATE 10, 11: PRINT "Tu número de Tarot es "; numero respu = hayMasClientes$ ...............................................................Parte 3 DO COLOR 7 LOCATE 20 PRINT "¿Quedan más clientes (SI/NO)"; INPUT resp resp = UCASE$(resp) LOOP UNTIL resp = "SI" OR resp = "NO" ...................................................................SUB SUB calculoNumTarot (cadena AS STRING, numTarot AS INTEGER) numTarot = suma END SUB 7