DELTA – MASTER FORMACIÓN UNIVERSITARIA C/ Gral. Ampudia, 16 Teléf.: 91 533 38 42 - 91 535 19 32 28003 MADRID Introducción a la Programación Ingenieria en Informática Junio 2008 Ejercicio 1 [2 puntos] Escribe un programa que reciba el fichero “binario.dat”, fichero binario de enteros positivos y devuelva un fichero “ordenado.txt”, fichero de texto organizado por líneas en el que se almacenen en el binario Ejemplo: Binario.dat Ordenado.txt 25 38 4 23 34 89 99 12 45 6 67 78 15 14 2 12 16 25 38 78 4 23 34 89 99 12 45 6 67 78 15 14 2 12 16 78 Program Solucion; uses crt; type Tfichbin = FILE of Integer; var anterior,actual:integer; fent:Tfichbin; fsal:TEXT; begin anterior:=0; Assign(fent,'c:\binario.dat'); Assign(fsal,'c:\ordenado.txt'); reset(fent); rewrite(fsal); while not eof(fent) do begin read(fent,actual); if actual<anterior then writeln(fsal); write(fsal,' '); write(fsal,actual); anterior:=actual; end; close(fsal); close(fent); end. 1 DELTA – MASTER FORMACIÓN UNIVERSITARIA C/ Gral. Ampudia, 16 Teléf.: 91 533 38 42 - 91 535 19 32 28003 MADRID Ejercicio 2 [3.5 puntos] Dado el tipo de datos tString: tString = RECORD datos: array [1..100] of char; long: integer; END; a. [2 puntos] Diseña un subprograma, spos, que dadas dos cadenas calcule la promera posición de la primera ocurrencia de la primera cadena en la segunda function sonIguales(s1,s2:TString;desp:Integer):integer; var cont:integer; diferentes:boolean; begin cont:=1; diferentes:=false; while (not(diferentes)) AND (cont<=s1.long) AND (cont<=(s2.long+desp)) DO begin if not(s1.datos[cont]=s2.datos[cont+desp-1]) then diferentes:=true else cont:=cont+1; end; if cont=s1.long+1 then sonIguales:=1 else sonIguales:=0; end; function spos(s1,s2:TString):integer; var cont,aux:integer; encontrado:boolean; begin cont:=1; aux:=0; while (aux=0) and (cont<=s2.long) do begin if s1.datos[1]=s2.datos[cont] then aux:=sonIguales(s1,s2,cont); cont:=cont+1; end; if aux=1 then cont:=cont-1 else cont:=0; spos:=cont; end; 2 DELTA – MASTER FORMACIÓN UNIVERSITARIA C/ Gral. Ampudia, 16 Teléf.: 91 533 38 42 - 91 535 19 32 28003 MADRID b. [1.5 puntos] Definimos como número de dígitos incrementales a todo matural n= dmdm-1...d 1d 0 tal que dm<=di-1 para todo i. Diseña y escribe una función recursiva en Pascal que, dado un número natural n, decida si es o no de dígitos incrementales. procedure esIncremental(a:longInt; var anterior:longInt; var menor:boolean); var divi,modulo,resto:integer; temp:boolean; begin if (a<=10) then begin menor:=true; anterior := a; end else begin resto:= a mod 10; divi:= a div 10; esIncremental(divi,modulo,temp); if temp AND (resto>modulo) then begin anterior:= resto; menor:=true end else menor:=false; end; end; function DigIncrementales(val:longint):boolean; var res:boolean; anterior:longInt; begin anterior:=0; esIncremental(val,anterior,res); DigIncrementales:= res; end; 3 DELTA – MASTER FORMACIÓN UNIVERSITARIA C/ Gral. Ampudia, 16 Teléf.: 91 533 38 42 - 91 535 19 32 28003 MADRID Ejercicio 3 [2.5 puntos] El Ministerio de Hacienda nos ha pedido que le hagamos un programa para llevar la gestión de los contribuyentes, a los que divide en 3 grupos, trabajadores con nómina, autónomos y empresarios. Para los primeros, la información que se necesita es lo que cobran al cabo de un año, para los segundos y los terceros, interesa saber cuales son sus beneficios anuales desglosados por meses. Ademas de esta información tambien se guardará el NIF de los contribuyentes. Suponiendo que el número de contribuyentes máximo es de MAX_CONT, hacer lo que se pide a continuación: a. [1 puntos] Define los tipos de datos necesarios para representar la información anterior, de modo que al final tengas un único tipo con todos los datos de los contribuyentes. Type tPalabra = record datos: array [0..256] of char; long: integer; end; TContrib=(nomina,autonomo,empresario); TDesglosado=Array [1..12] of real; TPersona= record nif:TPalabra; tipoContrib: TContrib; CASE tipoContrib OF nomina: anual:Real; autonomo,empresario: desglosado:TDesglosado; END; end; tListaPersonas= record datos: array [1..MAX_CONT] of TPersona; long: integer; end; 4 DELTA – MASTER FORMACIÓN UNIVERSITARIA C/ Gral. Ampudia, 16 Teléf.: 91 533 38 42 - 91 535 19 32 28003 MADRID b. [1.5 puntos] Haz un subprograma para calcular los beneficios de todos los empresarios hasta un mes dado del año function Beneficios(lista:tListaPersonas;mes:integer):real; var cont,cont2:integer; sal:real; begin sal:=0; for cont:=1 to lista.long do if lista.datos[cont].tipoContrib=empresario then for cont2:=1 to mes do sal:=sal+ lista.datos[cont].desglosado[cont2]; Beneficios:=sal; end; 5 DELTA – MASTER FORMACIÓN UNIVERSITARIA C/ Gral. Ampudia, 16 Teléf.: 91 533 38 42 - 91 535 19 32 28003 MADRID Ejercicio 4 [2.5 puntos] los enteros en cualquier lenguaje de programación están limitados en su tamaño. En este ejercicio se deberá definir un nuevo tipo de enter que no tenga dicha limitación (MEMORIA DINAMICA). Para ello se deberá elegir una base suficientemente grande, y se representarán los numeros como losta de cifras en esa base. Se pide: a. [0.5 puntos] Definir adecuadamente el tipo de datos. b. [1.5 puntos] Diseñar un sudprograma para calcular la división entre 2 de un entero de dicho tipo. Si el dígito mas a la derecha se queda nulo, se deberá eliminar. c. [0.5 puntos] Teniendo en cuenta el tamaño que se desperdicia depende de la base y que con las operaciones de multiplicación por 2 y división entre 2 podemos realizar las operaciones de multiplicación y división. ¿Cuál consideras que sería la mejor base para desperdiciar menos memoria y poder operar con normalidad sobre dichos enteros? Type Tlista=^TNodo; TNodo= record ristra:Integer; sig:^Tnodo; end; procedure dividir(a:Tlista,var: resto:integer); begin if l=NIL then resto:=0 else begin if (a^sig=NIL) then a^ristra=a^ristra div 2; resto=a^ristra mod 2; if a^ristra =0 then delete (a) end else begin dividir(a^sig,resto); a^ristra:= a^ristra+ (resto*base)div 2 end; end; end; La solución más optima seria base dos y la repesentación binaria de los elementos. Por ejemplo si integer son 16 bits tendriamos ristras de 16 dígitos. En base decimal la mejor base sería sin pasarse el límite de enteros representables – la base. 6