FUNDAMENTOS DE INFORMÁTICA 22-enero-2002

Anuncio
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
Descargar