E.U.I.TI. EXAMEN 12 de Junio 2003 FUNDAMENTOS DE INFORMATICA - Iº PARTE (4 puntos) Nombre: .................................................................................... Especialidad:.............................................................................. NOTA: Para realizar esta parte del examen tenéis 70 minutos. Estas preguntas se darán por buenas o malas. 1. (0,25 puntos) Enlaza las siguientes sentencias a. La memoria RAM... 1. es un programa en lenguaje máquina b. Un compilador... 2. es la memoria de lectura y escritura c. Un programa ejecutable... 3. es un programa que traduce un programa d. La memoria ROM... fuente en un programa ejecutable 4. es la memoria de sólo lectura 2. (0,3 puntos) Indica cuántos bits hacen falta para codificar: a. el número 260 b. el carácter ‘:’ c. el carácter ‘G’ Explica cómo has llegado a las distintas soluciones. Para codificar el número 260 hacen falta 9 bits, ya que con 8 sólo podemos codificar hasta el 256 (28). Los caracteres ‘:’ y ‘G’ se encuentran en la tabla ASCII, en la cual hay 256 caracteres. Por lo tanto, para codificar cualquier carácter ASCII hacen falta 8 bits (28 = 256) 3. (0,2 puntos) Agrupar los siguientes elementos entre componentes físicos y componentes no físicos del ordenador: • MODEM Componente Físico • Turbo Pascal Componente NO Físico • Editor de texto Componente NO Físico • Ratón Componente Físico • Altavoces Componente Físico • Windows Componente NO Físico • Ficheros Componente NO Físico • CD Componente Físico 4. (0,25 puntos) Explica brevemente qué hacen los siguientes comandos de MS-DOS o DEL El comando DEL permite borrar ficheros. o MOVE Sirve para mover ficheros de un directorio a otro. o TYPE Muestra el contenido del fichero por pantalla. 5. (0,75 puntos) Hacer el diagrama de flujo y codificar un programa que realice lo siguiente: El usuario introduce dos números inferiores a 50 por teclado. El más pequeño aumentarlo de 5 en 5 y al mayor disminuirlo de 2 en 2. Ir imprimiendo los diferentes valores de ambos números, hasta que el menor supere al mayor. INICIO program Segidak; uses WinCrt; A,B var A,B,Peq, Gran:Integer; false true B<A Gran← B Peq ← A Gran← A Peq ← B true Peq ≤ Gran begin write('Introduce 2 números menores de 50: '); read(A,B); if A>B then Begin Gran:=A; Peq:=B; end else Begin Gran:=B; Peq:=A; end; while Peq<Gran do begin writeln( Peq, ' ',Gran); Peq:=Peq+5; Gran:=Gran-2; end; end. false Peq,Gran Peq ← Peq+5 Gran←Gran -2 FIN 6. (0,75 puntos) Di si las siguientes afirmaciones son Verdaderas o Falsas. En caso de que sean falsas pon un ejemplo que lo demuestre. a) b) c) d) Todo lo que se puede hacer con un while, se puede hacer con un for Todo lo que se puede hacer con un for, se puede hacer con un while Todo lo que se puede hacer con un if, se puede hacer con un case Todo lo que se puede hacer con un case, se puede hacer con uno o con varios if a) Falso. Read(numero); While numero<>5 do Begin Write(‘No has adivinado. Intentalo otra vez!: ‘); Read(numero); End; b) Verdadero c) Falso. If numero=3,14 then write(‘El número es PI’); d) Verdadero. 7. (0,5 puntos) Qué es lo que saca por pantalla este programa? program mostrar; uses wincrt; var I,K:Integer; begin for I:= 1 to 5 do begin for K:= 1 to I do write ('*'); writeln; end; for I:= 4 downto 1 do begin for K:= 1 to I do write ('*'); writeln; end; end. * ** *** **** ***** **** *** ** * 8. (1 punto) Se ha intentado realizar un programa que nos diga cuantas veces aparece la subsecuencia ‘ta’ en una secuencia de caracteres terminada en punto que introduce el usuario. Sin embargo, nos da varios errores y no hace lo que nosotros queremos. Sabemos que hay 5 errores, localizalos y corrigélos sobre el mismo programa. Ejemplo: (* En negrita los datos introducidos por el usuario *) Escribe una frase (el punto para terminar): abbattkktajjtaiitaktaoi. La subsecuencia –ta– aparece 4 veces. program examen; uses wincrt; var Actual,Anterior: Char; Anterior, ContTa:Integer; begin ContTa:=0; write (‘Escribe una frase (punto para terminar): '); Anterior:='b'; read(Actual); while Actual <> '.' do begin if (Actual='a') or and(Anterior='t') do then ContTa:= ContTa+1; Anterior:= Actual; read(Actual); end; write(' La subsecuencia -ta- aparece ', 'ContTa',' veces'); end. E.U.I.TI. EXAMEN 12 de Junio 2003 FUNDAMENTOS DE INFORMATICA – II PARTE (6 puntos) Desde el ayuntamiento nos han pedido que hagamos un programa que les ayude a gestionar las farolas de cierta zona de la ciudad. Esta zona de la ciudad tiene 5 calles, y en cada una de ellas hay15 farolas numeradas del 1 al 15. Con el fin de ahorrar, el ayuntamiento ha decidido que no se van a encender todas las farolas de cada calle, sino que en cada calle habrá un número máximo de farolas que pueden estar encendidas simultáneamente. (Nosotros almacenaremos estos máximos en un array llamado MaximoCalle) El programa que nos piden debe realizar las siguientes tareas: 1. Leer el nº máximo de farolas que pueden estar encendidas simultáneamente en cada calle. (0,25 puntos) Ejemplo: Introduzca el máximo posible de farolas encendidas de la calle 1: 2 Introduzca el máximo posible de farolas encendidas de la calle 2: 3 ... Introduzca el máximo posible de farolas encendidas de la calle 5: 15 2. Encender farolas. Avisar en caso de que se intente exceder el máximo permitido para esa calle. (2 puntos) Ejemplo: Introduzca calle y farola (0 0 para terminar): 1 4 Introduzca calle y farola (0 0 para terminar): 1 3 Introduzca calle y farola (0 0 para terminar): 1 14 ¡¡Error!! En la calle 1 no puede haber más de 2 farolas encendidas Introduzca calle y farola (0 0 para terminar): 3 4 Introduzca calle y farola (0 0 para terminar): 5 11 Introduzca calle y farola (0 0 para terminar): 0 0 3. Obtener el nº de farolas encendidas en cada calle y el máximo para esa calle (1 punto) Ejemplo: En la calle 1 hay 2 farolas encendidas de un máximo de 2. En la calle 2 hay 0 farolas encendidas de un máximo de 3. En la calle 3 hay 1 farolas encendidas de un máximo de 2. En la calle 4 hay 0 farolas encendidas de un máximo de 6. En la calle 5 hay 1 farolas encendidas de un máximo de 15. 4. Para cada calle indica si es más seguro ir por el lado de la derecha o el de la izquierda. Para ello, consideraremos más seguro aquel lado que tenga más farolas encendidas. En caso de que el número de farolas encendidas en cada lado coincida, o estén todas apagadas, diremos que los dos lados son igual de seguros. Supón que las farolas con número par están en el lado derecho y las de número impar en el izquierdo. (0,75 puntos) Ejemplo: En la calle 1 da igual ir por la derecha o por la izquierda. En la calle 2 da igual ir por la derecha o por la izquierda. En la calle 3 es más seguro ir por la derecha. En la calle 4 da igual ir por la derecha o por la izquierda. En la calle 5 es más seguro ir por la izquierda. 5. Obtener el número de calles que tienen todas las farolas apagadas. (0,5 puntos) Ejemplo: El número de calles con todas las farolas apagadas es 2. 6. Clasificar las calles según los siguientes criterios: (1 punto) • Todas las farolas apagadas: 'A oscuras' • Si hay encendidas tantas como indica su máximo de calle y hay más encendidas que apagadas: 'Muy Luminosa' • Si hay encendidas tantas como indica su máximo de calle, pero hay más apagadas que encendidas: 'Luminosa' • En cualquier otro caso: 'Tenebrosa' Ejemplo: La calle 1 es luminosa. La calle 2 está a oscuras. La calle 3 es tenebrosa. La calle 4 está a oscuras. La calle 5 es tenebrosa. 7. Apagar todas las farolas (0,5 puntos) program Farolas; uses wincrt; const NumCalles=5;NumFarolas=15; var FarolasCalle: array [1..NumCalles,1..NumFarolas] of Integer; Encendidas,MaximoCalle: array [1..NumCalles] of Integer; F,K,ContIzq,ContDcha,Apagadas: Integer; begin {Al principio todas las farolas están apagadas} {En la tabla Encendidas almacenaremos cuantas farolas hay encendidas en cada calle} {también hay que inicializarlo } for K:=1 to NumCalles do begin Encendidas[K]:=0; for F:=1 to NumFarolas do FarolasCalle[K,F]:=0; end; {1-Leer el nº máximo de farolas que pueden estar encendidas simultáneamente en cada calle. } for K:=1 to NumCalles do begin write('Introduzca el máximo posible de farolas encendidas de la calle ',K); read (MaximoCalle[K]); end; {2- Encender Farolas} write('Introduzca calle y farola (0 0 para terminar):'); read (K,F); while (K<>0) and (F<>0) do begin if Encendidas[k]<MaximoCalle[K] then begin FarolasCalle[K,F]:=1; Encendidas[K]:= Encendidas[K]+1; end else begin writeln(' ¡¡Error!! En la calle',K,'no puede de',MaximoCalle[K],'farolas encendidas'); end; write('Introduzca calle y farola (0 0 para terminar):'); read (K,F); end; haber más {3- Nº de farolas encendidas en cada calle} for K:=1 to NumCalles do begin write(' En la calle ',K, 'hay ', Encendidas[k], ' farolas encendidas de '); writeln('un máximo de ',MaximoCalle[K]); end; {4- Decir por dónde es más seguro andar} for K:=1 to NumCalles do begin ContIzq:=0; ContDcha:=0; for F:=1 to NumFarolas do if (F mod 2=1) and (FarolasCalle[K,F]=1) then ContIzq:=ContIzq+1 else if (F mod 2=0) and (FarolasCalle[K,F]=1) then ContDcha:=ContDcha+1; if ContIzq=ContDcha then writeln(' En la calle',K,' da igual ir por la derecha o por la izquierda.') else if ContIzq>ContDcha then writeln(' En la calle',K,' es más seguro ir por la izquierda.') else writeln('En la calle',K,' es más seguro ir por la derecha.'); end; {5- Nº de calles con todas las farolas apagadas} Apagadas:=0; for K:=1 to NumCalles do if Encendidas[k]=0 then Apagadas:=Apagadas+1; writeln('El número de calles con todas las farolas apagadas es',Apagadas); {6- Clasificar las calles} for K:=1 to NumCalles do if (Encendidas[K]=MaximoCalle[K]) and (Encendidas[k]>NumFarolasEncendidas[k]) then writeln('La calle',K,'es muy luminosa') else if (Encendidas[K]=MaximoCalle[K]) and (Encendidas[k]<NumFarolasEncendidas[k]) then writeln('La calle',K, ' es luminosa') else if Encendidas[K]=0 then writeln('La calle',K,'está a oscuras') else writeln('La calle',K, 'es tenebrosa'); {7- Apagar las farolas} for K:=1 to NumCalles do begin Encendidas[K]:=0; for F:=1 to NumFarolas do FarolasCalle[K,F]:=0; end; end.