Introducción a la Programación

Anuncio
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
Documentos relacionados
Descargar