Answer Key for Exam A 1. Si la entrada al siguiente programa es -23, ¿cuál es la salida? PROGRAM Absoluto; VAR Digito: INTEGER; FUNCTION Dificil(Numero:INTEGER):INTEGER; begin Numero := SQR(Numero); Dificil:= TRUNC(SQRT(Numero)); end; PROCEDURE Facil(var Numero:INTEGER); BEGIN Numero := ABS(Numero) END; BEGIN READLN(Digito); WRITELN(Dificil(Digito)); Facil(Digito); WRITELN(0-Digito) END. (a) (b) (c) 2. 23 -23 23 23 El programa tiene errores de sintaxis y no compila El fichero que almacenaba el programa “Barcos” (ver pregunta 15) ha perdido información, y en lugar de los caracteres originales aparecen tres signos de interrogación seguidos de un número. Sabiendo que el programa compilaba y ejecutaba sin error, ¿qué habı́a en lugar de “???2” ? (a) 10 (b) ’b’ (c) rangoColumnas 1 3. ¿Qué hace el programa Manipula? PROGRAM Manipula; CONST MAX = 10; TYPE Datos = array[1..MAX] of INTEGER; VAR Guarda : Datos; i,j : INTEGER; PROCEDURE Cambia(VAR Elemento1, Elemento2 : INTEGER); VAR Temp : INTEGER; BEGIN Temp:= Elemento1; Elemento1:= Elemento2; Elemento2:= Temp END; { Cambia } BEGIN for i:= 1 to MAX do READ (Guarda[i]); READLN; FOR i :=1 to (MAX div 2) do BEGIN j:=2*i; Cambia(Guarda[j], Guarda[MAX - j +1]) END; FOR i :=1 to MAX do WRITE (Guarda[i], ’ ’); WRITELN END. 4. (a) Imprime los números pares que se han introducido (b) Imprime invertida la secuencia de los números introducidos (c) Añade un valor fijo a los numeros introducidos y los imprime El fichero que almacenaba el programa “Barcos” (ver pregunta 15) ha perdido información, y en lugar de los caracteres originales aparecen tres signos de interrogación seguidos de un número. Sabiendo que el programa compilaba y ejecutaba sin error, ¿qué habı́a en lugar de “???3” ? (a) estado (b) hundido (c) estadoCasilla 2 5. Si la salida del siguiente programa es 15 12 20 10 64 36 18 24 21. ¿Cuál es el contenido del fichero datosb? PROGRAM REPETICION; VAR fichero : FILE OF INTEGER; VAR i,N,M : INTEGER; BEGIN ASSIGN(fichero,’datosb’); RESET(fichero); FOR i:=1 TO 5 DO BEGIN READ(fichero,N,M); IF N=1 THEN WRITE (2*M, ’ ’) ELSE IF N=2 THEN WRITE (M*M, ’ ’) ELSE IF N=3 THEN WRITE (M+3, ’ ’); IF ODD(N) THEN WRITE (M, ’ ’); END; CLOSE(fichero); END. 6. (a) 3 12 1 10 2 8 1 18 3 21 (b) 3 12 1 10 2 8 1 19 3 21 (c) 15 20 64 36 24 21 ¿Cuál de las siguientes afirmaciones es falsa? (a) El programa Redefino de la pregunta 13 se puede implementar en el lenguaje C. (b) Podemos implementar en C sólo aquellos programas escritos en Pascal que no involucren gestión dinámica de memoria. El programa Manipula de la pregunta 3 se puede implementar en el lenguaje C. (c) 7. 8. ¿Cuál de las siguientes afirmaciones es incorrecta? (a) Un compilador es capaz de traducir el código de un lenguaje de alto nivel al lenguaje máquina. (b) El montador-linkador interpreta en tiempo real el código fuente. (c) El compilador verifica la sintaxis del código. ¿Cuál de las afirmaciones sobre el siguiente programa es falsa? PROGRAM MTPI; TYPE frase = String[30]; VAR a: frase; BEGIN {MTPI} a:= ’Esto no es una frase’; WriteLn(Ord(a[0])) END. (a) la variable a ocupa en memoria 31 Bytes. (b) La instrucción WriteLn(Ord(a[0])) imprime “30” por pantalla. (c) La longitud máxima de a es de 30 caracteres. 3 9. ¿Cuál es la salida del siguiente programa? PROGRAM musica; VAR Radio, CD, Cinta, MP3: boolean; BEGIN Radio := true; CD := Not Radio; Cinta := CD or Radio; MP3 := Not Cinta; If Radio and Not MP3 then If MP3 and Cinta then writeln (’Suena bien’) else writeln (’Suena muy bien’) else writeln(’Suena genial’) end. 10. (a) Suena bien (b) Suena muy bien (c) Suena genial La última salida del programa Program BB; Var a, b , z : Integer; Function Calculo (a:Integer; Var c,d : Integer): Integer; Var z : Integer; Begin z:= 1; c:= c - 1; Calculo := a + b + c - z - d; WriteLn(’Calc : ’,a:4,b:4,c:4,d:4) End; Begin a:= 12; b := 3; z := 6; WriteLn; Repeat z := Calculo(a,b,z); b := b - 2; WriteLn(’Principal: ’, z:6); Until ( z < 9) End. es (a) Principal: 9 (b) Calc: 12 2 2 6 (c) Principal: 0 4 11. Dado el siguiente fragmento de código: float a=0.001; float *b=NULL; float *c=NULL; b=&a; c=b; a=*c+*b; ¿ Cuál de las afirmaciones es cierta ? 12. (a) Las variables a y c se almacenan en la misma dirección de memoria (b) La sentencia *c=4 modifica el contenido de la variable a (c) c almacena la dirección de la variable b Si la entrada del siguiente programa es 10000 <enter> 0.06. ¿Cuál es la salida? PROGRAM Compra; VAR Oportunidad, Extra : real; PROCEDURE Costeactual(VAR Coste : real; Estima: integer); BEGIN Estima:=Estima+trunc(Coste/100); Coste:=(Estima div 10)*(10*Coste) end; { Costeactual } PROCEDURE Tasacoste(var Tasa : real; Dinero:real); var Porcentaje : real; BEGIN READLN(Porcentaje); Tasa:=Porcentaje*Dinero END; { Tasacoste } BEGIN readln(Oportunidad); Costeactual(Oportunidad,1); Tasacoste(Extra, Oportunidad); writeln(Extra:6:2, ’ ’,Oportunidad:6:2) END. (a) 0.06 10000.00 (b) 6.00 2.00 (c) 60000.00 1000000.00 5 13. ¿Cuál es la salida del programa Redefino? PROGRAM Redefino; VAR B : INTEGER; PROCEDURE A(Var C: INTEGER); FUNCTION B(A : INTEGER):INTEGER; BEGIN IF A > 8 Then B:=A ELSE B:=B(A+1) END; { B } BEGIN C:=B(C); END; BEGIN B:=2; A(B); Writeln(B); END. 14. (a) 2 (b) 8 (c) 9 A que equivale la expresión vector[i] (a) *(vector+i) (b) *vector + i (c) &(vector +i) 6 15. El fichero que almacenaba el código del programa “Barcos” ha perdido información, y en lugar de los caracteres originales aparecen tres signos de interrogación seguidos de un número. Sabiendo que el programa compilaba y ejecutaba sin error, ¿qué habı́a en lugar de “???1” ? Program Barcos; Const MAX_TIRADAS = 100; MAX_JUEGOS = 20; Type rangoFilas = ’a’..’j’; rangoColumnas = 1..10; estado = (noAtacada,agua,tocado,hundido); Casilla = Record ocupadaPorBarco : Boolean; estadoCasilla : estado; End; Tablero = Array [rangoFilas] Of Array [rangoColumnas] Of Casilla; Coordenadas = Record fila : rangoFilas; columna : rangoColumnas; End; JuegoBarcos = Record ID1: Integer; ID2: Integer; partida: Tablero; tirada : Array[1..MAX_TIRADAS] Of Coordenadas; Finalizada:Boolean; End; CampeonatoBarcos = Array [1..MAX_JUEGOS] Of JuegoBarcos; Var C1 : CampeonatoBarcos; f : File Of CampeonatoBarcos; Begin C1[MAX_JUEGOS-1].tirada[1].fila := ???1 ; C1[MAX_JUEGOS-1].tirada[1].columna := ???2 ; C1[MAX_JUEGOS-1].partida[C1[MAX_JUEGOS-1].tirada[1].fila,3].estadoCasilla := ???3 ; Assign(f,’BARCOS.OUT’); ReWrite(f); Write(f,C1); Close(f); End. (a) ’b’ (b) fila (c) rangoFilas 7 16. 17. ¿ Cual es el tamaño de un puntero a un long y a un double ? (a) El tamaño de un puntero a long es la mitad que el tamaño de un puntero a un double (b) Los 2 punteros tienen el mismo tamaño (c) El tamaño de un puntero a un long es el doble que el tamaño de un puntero a un double Se nos pide diseñar una función que realice una estimación numérica del valor de la serie ∞ X 1 4 n n=1 con un error menor que una tolerancia especificada (por ejemplo con una precisión de milésimas, es decir, con un error menor que 0.001). La estructura de programación más apropiada para esta tarea es 18. (a) Una estructura de iteración que utilice la instrucción for (b) Una estructura de iteración que utilice la instrucción while (c) Una estructura de control de flujo con un if Dado el siguiente fragmento de programa int v[10]={1,2,3,4,5,6,7,8,9,10}; int i,*a=NULL; for (i=0;i<10;i++) { a=&v[i]; *a=v[0]+i; } ¿ Cuál de las siguientes afirmaciones es cierta ? 19. 20. (a) v[5]=5 (b) v[3]=4 (c) La asignación a=&v[i] es incorrecta ¿De qué tamaño es el fichero BARCOS.OUT después de ejecutar el programa “Barcos” (ver pregunta 15) ? (a) 8100 Bytes (b) No es posible saberlo porque puede haber sido creado por otro programa. (c) 405 Bytes Dadas las siguientes definiciones y declaraciones: type enlacepunt = ^enlace; enlace = record dato : integer; sig : enlacepunt end; var ptr: enlacepunt; nodo: enlace; ¿Cuál de los siguientes usos de new o del manejo de punteros es incorrecto? (a) new(ptr); (b) ptrˆ:=nodo; (c) nodoˆ.sig:=NIL; 8 21. ¿Qué hace el programa Textos suponiendo que tipoconjunto se ha definido como set of char? PROCEDURE Textos(conjunto: tipoconjunto); VAR Temp, Sal: char; BEGIN Sal:= ’ ’; FOR Temp:= ’Z’ DOWNTO ’A’ DO IF Temp IN conjunto THEN Sal:=Temp; WRITELN(Sal) END; 22. 23. (a) Encuentra los caracteres blancos en conjunto (b) Encuentra la letra mayúscula menor en orden alfabético que haya en conjunto (c) Encuentra todas las letras mayúsculas que haya en conjunto ¿ Cuál de las siguientes expresiones permite reservar memoria para un vector que contenga números de tipo float ? (a) (float*) malloc(10*sizeof(float *)) (b) (float*) malloc(10) (c) (float*) malloc(10*sizeof(float)) ¿ Cuantas veces se ejecuta la función printf en el siguiente fragmento de programa ? a=9; for (i=0;i<100;i++) if ((0==a%4) || (i%2)==0) printf("%d %d\n",a,i); 24. 25. 26. (a) 100 (b) 50 (c) 0 Dada la sentencia char cadena[]=”maria”;. ¿Cual es el tamaño reservado por el compilador para la variable cadena ? (a) 5 bytes (b) 6 bytes (c) La sentecia es incorrecta Sabiendo que los tipos enumerados y Booleanos ocupan 1 Byte ¿Qué tamaño ocupa en la memoria la variable C1, utilizada en el programa “Barcos” (ver pregunta 15) ? (a) 8100 Bytes (b) 405 Bytes (c) 210 Bytes ¿Cuál de las siguientes acciones puede conducir a un error de programación de difı́cil detección? (a) Se asigna un puntero a una dirección de memoria de una variable no inicializada. (b) Se asigna un puntero al valor de otro puntero ya inicializado. (c) Un puntero se inicializa con un valor numérico entero arbitrario. 9 27. ¿Qué instrucción del programa genera un error? Program AAA; Var a: Integer; d,f: ^Integer; Begin {1} a:=201; {2} New(d); {3} d^ := a; {4} f := d; {5} d := @a; {6} dispose(f); {7} dispose(d) End. 28. (a) La instrucción { 7 }. (b) La instrucción { 6 }. (c) La instrucción { 3 }. ¿Cuáles de los siguientes trozos de código son equivalentes? {A} while not eoln do begin read(c); if not eoln then read(c); write(c) end; {B} while not eoln do begin if not eoln then read(c); read (c); write(c) end; {C} while not eoln do begin read(c); read(c); write(c) end; (a) AyB (b) ByC (c) A, B y C son equivalentes 10 29. Dada una matriz de 4 × 4 cuyos elementos están todos inicializados con un valor igual a 2. ¿ Cuál será el valor final de la variable tot después de ejecutar el siguiente fragmento ? for (i=tot=0;i<4;i++) for (j=0;j<i;j++) tot+=matriz[i][j]; 30. (a) 12 (b) 20 (c) 16 Dado el siguiente fragmento de programa float media(int a,float *x); int n; float v[25]; float m; ¿ Cuál de las siguientes llamadas a la función media es correcta ? (a) m=media(n,v[25]) (b) m=media(n,*v) (c) m=media(n,v) 11