 |
Programación I, Enero 2003:
- Si p, q y r son variables booleanas que toman los valores p= TRUE, q = FALSE y r =
TRUE ¿cuál de las siguientes expresiones devuelve un valor FALSE?
- a) p OR q OR NOT (r=q) OR NOT (NOT r=q)
TRUE OR FALSE OR NOT (TRUE=FALSE) OR NOT (NOT TRUE=FALSE)
TRUE OR FALSE OR NOT FALSE OR NOT (FALSE=FALSE)
TRUE OR FALSE OR TRUE OR NOT TRUE
TRUE OR FALSE OR TRUE OR FALSE
TRUE
- b) NOT (p AND q AND NOT (r=q) AND NOT (NOT r=q))
NOT (TRUE AND FALSE AND NOT (TRUE=FALSE) AND NOT (NOT TRUE=FALSE))
NOT (TRUE AND FALSE AND NOT FALSE AND NOT (FALSE=FALSE))
NOT (TRUE AND FALSE AND TRUE AND NOT TRUE)
NOT (TRUE AND FALSE AND TRUE AND FALSE)
NOT FALSE
TRUE
- c) (p OR q AND NOT (r>q)) AND NOT (NOT r<q)
(TRUE OR FALSE AND NOT (TRUE>FALSE)) AND NOT (NOT TRUE<FALSE)
(TRUE OR FALSE AND NOT (TRUE)) AND NOT (FALSE<FALSE)
(TRUE OR FALSE AND FALSE) AND NOT (FALSE)
(TRUE OR FALSE AND FALSE) AND TRUE
(TRUE OR FALSE) AND TRUE
TRUE AND TRUE
TRUE
***
d) (p OR q AND NOT (r=q)) AND NOT (NOT r=q)
(TRUE OR FALSE AND NOT (TRUE=FALSE)) AND NOT (NOT TRUE=FALSE)
(TRUE OR FALSE AND NOT (FALSE)) AND NOT (FALSE=FALSE)
(TRUE OR FALSE AND TRUE) AND NOT (TRUE)
(TRUE OR FALSE AND TRUE) AND FALSE
(TRUE OR FALSE) AND FALSE
TRUE AND FALSE
FALSE
- El esquema básico de selección se corresponde con el esquema de datos:
- a) Formación
***
b) Unión
- c) Registro
- d) Tupla
- En un registro con variantes el tipo del discriminante siempre tiene que ser:
- a) Real
***
b) Ordinal
Las reglas BNF para la definición de tipos registros son las siguientes:
Tipo_Registro ::= RECORD Secuencia_de_Listas_de_Campos END
Secuencia_de_Listas_de_Campo ::= Lista_de_Campos { ; Lista_de_Campos }
Lista_de_Campos ::= Parte_Fija | Parte_Variante
Parte_Fija ::= Lista_de_Identificadores : Tipo
Parte_Variante ::= CASE Identificador : Identificador_de_Tipo_Ordinal OF
Variante { | Variante }
[ ELSE Secuencia_de _Listas_de_Campos ]
END
Variante ::= Lista_de_Valores :[ Secuencia_de_Listas_de_Campos ]
Lista_de_Valores ::= Valores { , Valores }
Valores ::= Expresión_Constante [ .. Expresión_Constante ]
Identificador_de_Tipo_Ordinal::= Identificador
- c) Cardinal
- d) Entero
- Dado el tipo de dato:
TYPE Cero = ARRAY Uno OF ARRAY Dos OF Tres;
- a) Sólo Tres puede ser CHAR o BOOLEAN
- b) Sólo Uno y Tres pueden ser CHAR o BOOLEAN
***
c) Uno, Dos y Tres pueden ser CHAR o BOOLEAN
- d) Sólo Uno y Dos pueden ser CHAR o BOOLEAN
La sintaxis BNF para la declaración de un tipo array y el acceso a componentes es:
Tipo_Array ::= ARRAY Lista_Tipos_Ordinales OF Tipo
Lista_Tipos_Ordinales ::= Tipo_Ordinal { , Tipo_Ordinal }
Tipo_Ordinal ::= Identificador_Tipo_Ordinal | Tipo_Enumerado | Tipo_Subrango
Identificador_Tipo_Ordinal ::= Identificador
Variable_array ::= Identificador_de_Variable { [ Lista_de_Expresiones ] }
Por lo tanto la respuesta válida es la c) porque cualquiera de ellos puede valer
CHAR o BOOLEAN. Al menos de acuerdo con la sintaxis anterior. Sin embargo, si utilizamos
Uno y Dos como CHAR en el compilador FST que facilita la UNED, el rango de los índices
supera el límite y el compilador lo rechaza.
- En la declaración:
TYPE TipoMatriz = ARRAY [1..3], [1..3] OF INTEGER;
VAR matrizUno : TipoMatriz;
Nos podemos referir a un elemento de la matriz como : matrizUno[3]
- a) No, tendríamos que referenciarlo como matrizUno[1][2].
***
b) Sí, porque hace referencia a todo un vector.
- c) Sí, porque los tipos índices son iguales.
- d) No, tendríamos que referenciarlo como matrizUno[1,2].
- La declaración: VAR miVector: ARRAY [0..N] OF INTEGER;
- a) Es incorrecta
- b) Es un vector abierto
***
c) Es un tipo anónimo
Las variables anónimas son aquellas que son de un tipo no simple, ARRAY,
RECORD,... pero que se declaran indicando el tipo en el mismo momento de
la declaración, y no declarando un tipo y después declarando la variable
de ese tipo.
- d) Es una ristra
- En el procedimiento:
PROCEDURE Ejl(VAR R, S : INTEGER; T: CHAR);
los argumentos
- a) S es por referencia y R y T por valor
***
b) R y S son por referencia y T por valor
- c) R y S son por valor y T por referencia
- d) R es por referencia y S y T por valor
- En Modula-2 y respecto a RETURN se puede decir que:
- a) Es el identificador predefinido de un procedimiento
- b) Es el identificador predefinido de una función
***
c) Es la palabra clave de una sentencia
- d) Es la palabra clave de una expresión
- ¿Cuál de las siguientes afirmaciones es correcta en Modula-2?
- a) No tiene sentencias para manejo de excepciones ni se pueden programar
- b) Tiene sentencias para manejo de excepciones que emplean el RETURN
***
c) No tiene sentencias para manejo de excepciones pero se pueden programar
- d) Tiene sentencias especiales para manejo de excepciones
- ¿Cuál de las siguientes afirmaciones es correcta?
- a) El tipo INTEGER es exacto y sin límites
***
b) El tipo INTEGER es exacto pero con límites
- c) El tipo REAL es exacto y sin límites
- d) El tipo REAL es exacto pero con límites
|
|
Programación I, Enero 2003:
Ejercicio Práctico
Realizar un tipo abstracto de datos para el juego de las TRES EN RAYA.
El tablero es de 3 x 3 y cualquier cuadrícula podrá estar vacía u ocupada
sólo por una ficha blanca o negra. Las operaciones son:
- Poner ficha en 1 cuadrícula comprobando que no está ocupada (sólo para plan viejo)
- Quitar una ficha de una cuadrícula
- Comprobar si se produce 3 en raya e indicar si es de blancas o negras.
================================================================================
DEFINITION MODULE Juego;
CONST Lado = 3;
TYPE RangoLado = [1..Lado];
TipoFicha = (Vacia, Blanca, Negra);
TipoTablero = ARRAY RangoLado,RangoLado OF TipoFicha;
PROCEDURE Poner(VAR Tablero:TipoTablero; Color:TipoFicha; Columna, Fila:RangoLado);
PROCEDURE Quitar(VAR Tablero:TipoTablero; Columna, Fila:RangoLado);
PROCEDURE Comprobar(Tablero:TipoTablero; VAR Quien:TipoFicha):BOOLEAN;
PROCEDURE Iniciar(VAR Tablero:TipoTablero);
END Juego.
================================================================================
IMPLEMENTATION MODULE Juego;
FROM InOut IMPORT WriteString,WriteLn;
PROCEDURE Quitar(VAR Tablero:TipoTablero; Columna,Fila:RangoLado);
BEGIN
IF (Fila < 1) OR (Fila > Lado) OR (Columna < 1) OR (Columna > Lado) THEN
WriteString("ERROR: Casilla fuera de rango"); WriteLn;
ELSE
IF (Tablero[Fila,Columna] <> Vacia) THEN
Tablero[Fila,Columna] := Vacia;
ELSE
WriteString("ERROR: Casilla NO ocupada");WriteLn;
END;
END;
END Quitar;
PROCEDURE Comprobar(Tablero:TipoTablero; VAR Quien:TipoFicha):BOOLEAN;
PROCEDURE Raya(c1,f1,c2,f2,c3,f3: RangoLado): BOOLEAN;
BEGIN
IF ((Tablero[c1,f1] <> Vacia) AND (Tablero[c1,f1]=Tablero[c2,f2]) AND
(Tablero[c1,f1]=Tablero[c3,f3])) THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END;
END Raya;
BEGIN
IF (Raya(1,1, 1,2, 1,3) OR Raya(1,1, 2,1, 3,1)) THEN
Quien := Tablero[1,1];
END;
IF (Raya(2,1, 2,2, 2,3) OR Raya(1,2, 2,2, 3,2) OR
Raya(1,1, 2,2, 3,3) OR Raya(3,1, 2,2, 1,3)) THEN
Quien := Tablero[2,2];
END;
IF (Raya(3,1, 3,2, 3,3) OR Raya(1,3, 2,3, 3,3)) THEN
Quien := Tablero[3,3];
END;
IF (Quien <> Vacia) THEN
IF (Quien = Blanca) THEN
WriteString("Ganan BLANCAS");WriteLn;
ELSE
WriteString("Ganan NEGRAS");WriteLn;
END;
RETURN TRUE;
ELSE
RETURN FALSE;
END;
END Comprobar;
PROCEDURE Poner(VAR Tablero:TipoTablero; Color:TipoFicha; Columna, Fila:RangoLado);
BEGIN
IF (Fila < 1) OR (Fila > Lado) OR (Columna < 1) OR (Columna > Lado) THEN
WriteString("ERROR: Casilla fuera de rango"); WriteLn;
ELSE
IF (Tablero[Fila,Columna] = Vacia) THEN
Tablero[Fila,Columna] := Color;
ELSE
WriteString("ERROR: Casilla ocupada");WriteLn;
END;
END;
END Poner;
PROCEDURE Iniciar(VAR Tablero:TipoTablero);
VAR
i,j :RangoLado;
BEGIN
FOR i:=1 TO Lado DO
FOR j:=1 TO Lado DO
Tablero[i,j]:=Vacia;
END;
END;
END Iniciar;
END Juego.
Este ejercio está basado en la solución propuesta por José
Antonio Vaqué, al que desde aquí quiero agraceder su constante colaboración en los foros
de las tutorías virtuales y en los grupos de discusión de la UNED
|