INFORMÁTICA Curso 2.011 / 2.012 Bilbao, 27 de Junio de 2012 Tiempo: 2 h Los divisores propios de un entero N son los divisores positivos menores que N. Un entero positivo se dice que es un número Deficiente, Perfecto o Abundante si la suma de estos divisores propios es menor que, igual a, o mayor que el número, respectivamente. Así: 8 es Deficiente porque sus divisores 1, 2, 4 verifican 1+ 2 + 4 < 8 6 es Perfecto porque sus divisores 1, 2, 3 verifican 1 + 2 + 3 = 6 12 es Abundante porque sus divisores 1, 2, 3, 4, 6 verifican 1 + 2 + 3 + 4 + 6 > 12 Se dispondrá de ficheros ya existentes, como por ejemplo el fichero NUMEROS.DAT, cuyos elementos contienen la siguiente información: Integer ARRAY [1..50] OF Integer Integer STRING [15] Numero Divisores NumDivisores Clase donde el campo NumDivisores está inicializado a cero y el campo Clase está inicializado a la Cadena Vacía. Ejemplo: NUMEROS.DAT 18 8 … 0 6 … 0 12 … 0 … 0 PROGRAMA El programa, en primer lugar, pedirá el nombre del fichero y, si no existe, tras mostrar un mensaje de error finalizará su ejecución. Si el fichero existe, continuará la ejecución del programa realizando las tareas que se describen a continuación en el orden propuesto: Muestre el contenido del fichero *(ver nota final) Modifique correctamente el fichero El programa deberá cambiar el contenido del fichero, modificando para ello los campos Divisores, NumDivisores y Clase respectivamente según la definición de divisor propio de un entero. Informática 1/3 Ejemplo: NUMEROS.DAT 18 1 2 3 6 9 … 5 8 1 2 4 3 Abundante Deficiente … 6 1 2 3 3 … Perfecto 12 1 2 3 4 6 … 5 Abundante Vuelva a mostrar el contenido del fichero *(ver nota final) Organice la información del fichero Deberá organizar la información para que aparezcan en el fichero primeramente los números Deficientes a continuación los Perfectos y por último los Abundantes. Dentro de cada clase, los elementos no tienen que guardar orden alguno. Ejemplo: NUMEROS.DAT 8 1 2 4 3 6 1 2 3 3 … Deficiente … Perfecto 18 1 2 3 6 9 … 5 12 1 2 3 4 6 … 5 Abundante Abundante Vuelva a mostrar el contenido del fichero *(ver nota final) Encuentre el menor número par Abundante Si existe se visualizará en pantalla el menor número par y Abundante almacenado en el fichero. En caso contrario, se visualizará el mensaje de error No hay ningún numero par Abundante. En el ejemplo, mostraría el número 12. Se exige: Estructurar correctamente el programa según las normas de programación estructurada. Para ello, además de un subprograma por cada tarea descrita, utilizar como mínimo los siguientes subprogramas: CalcularDivisores: Recibe un número y devuelve la lista de sus Divisores. ModificarElemento: Recibe un registro y retorna el registro modificado Ejemplo: recibe y retorna 18 … 0 18 1 2 3 6 9 … 5 Abundante * NOTA: Mostrar el contenido del fichero Mostrará todos los números (Numero) contenidos en el fichero, junto su Clase (sólo si se ha calculado) y con la lista de sus Divisores (sólo si se han calculado). Informática 2/3 Procedimientos y funciones utilizados a lo largo del curso (además de ReadLn y WriteLn): FUNCTION FUNCTION FUNCTION FUNCTION FUNCTION FUNCTION FUNCTION FUNCTION FUNCTION FUNCTION FUNCTION FUNCTION FUNCTION FUNCTION FUNCTION FUNCTION FUNCTION ABS ( SQR ( SQRT ( SQRT ( EXP ( LN ( SIN ( COS ( ARCTAN ROUND TRUNC FRAC ( INT ( CHR ( ORD ( PRED ( SUCC ( PROCEDURE DEC PROCEDURE FUNCTION FUNCTION FUNCTION PROCEDURE FUNCTION FUNCTION PROCEDURE FUNCTION FUNCTION FUNCTION FUNCTION FUNCTION PROCEDURE PROCEDURE PROCEDURE PROCEDURE FUNCTION PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE PROCEDURE FUNCTION FUNCTION FUNCTION PROCEDURE PROCEDURE PROCEDURE PROCEDURE Numero : Integer | Real ) : Integer Numero : Integer | Real ) : Integer Numero : Integer | Real ) : Real ; Numero : Integer | Real ) : Real ; Numero : Real ) : Real ; Numero : Real ) : Real ; Angulo : Real ) : Real ; Angulo : Real ) : Real ; ( Tangente : Real ) : Real ; ( Numero : Real ) : Integer ; ( Numero : Real ) : Integer ; Numero : Real ) : Real ; Numero : Real ) : Real ; Numero : Integer ) : Char ; Variable_Ordinal : Tipo_Ordinal ) : Variable_Ordinal : Tipo_Ordinal ) : Variable_Ordinal : Tipo_Ordinal ) : | Real ; | Real ; Integer ; Tipo_Ordinal ; Tipo_Ordinal ; (VAR Variable_Ordinal : Tipo_Ordinal [ , Numero : Integer ) ; INC (VAR Variable_Ordinal : Tipo_Ordinal [ , Numero : Integer ) ; UPCASE ( Variable : Char | STRING ) : Char | STRING ; LOWERCASE ( Variable : Char | STRING ) : Char | STRING ; READKEY : Char ; RANDOMIZE ; RANDOM ( Numero : Integer ) : Integer ; RANDOM : Real ; CLRSCR ; SIZEOF ( Tipo_Variable | Identificador_Variable ) : Integer ; LENGTH ( Cadena : STRING ) : Byte ; COPY ( Cadena: STRING ; PosicionInicial, Cantidad : Byte ) : STRING ; CONCAT ( Cadena : STRING [ ; Cadena : STRING ] ) : STRING ; POS ( CadenaABuscar, CadenaDondeBuscar : STRING ) : Byte ; DELETE ( VAR Cadena : STRING; PosicionInicial, Cantidad : Byte ) ; INSERT ( Cadena: STRING ; VAR Cadena: STRING; Posicion : Byte ) ; STR ( Numero : Integer | Real [ : Formato ]; VAR Cadena : STRING ) ; VAL ( Cadena : STRING ; VAR Numero : Integer | Real ; VAR Error: Byte ) ; FILEEXISTS ( Nombre: STRING ) : Boolean ; ASSIGN ( VAR Fichero_Logico : TipoFichero ; Nombre: STRING ) ; RESET ( VAR Fichero_Logico : TipoFichero ) ; REWRITE ( VAR Fichero_Logico : TipoFichero ) ; CLOSE ( VAR Fichero_Logico : TipoFichero ) ; WRITE ( [ VAR Fichero_Logico : TipoFichero ] [; VAR Variable : TipoBaseFich ] …[ ; VAR Variable : TipoBaseFich ] ); READ ( [ VAR Fichero_Logico : TipoFichero ] [; VAR Variable : TipoBaseFich ] …[ ; VAR Variable : TipoBaseFich ] ); EOF ( VAR Fichero_Logico : TipoFichero ) : Boolean ; FILESIZE ( VAR Fichero_Logico : TipoFichero ) : Integer ; FILEPOS ( VAR Fichero_Logico : TipoFichero ) : Integer ; SEEK ( VAR Fichero_Logico : TipoFichero ; Posicion : Integer ) ; ERASE ( VAR Fichero_Logico : TipoFichero ) ; TRUNCATE ( VAR Fichero_Logico : TipoFichero ) ; RENAME ( VAR Fichero_Logico : TipoFichero ; NuevoNombre : STRING ) ; Informática 3/3