Clase 12
COMPUTACION2009
Tipos de Datos PASCAL Tipos de Datos PASCAL EstructuradosEstructurados
SimplesSimples
PrimitivosPrimitivos
No primitivosNo primitivos
EstáticosEstáticos
IntegerIntegerRealReal CharCharBooleanBooleanStringString
ArchivosArchivos
RegistrosRegistrosArreglosArreglos
VectoresVectores
MatricesMatrices
N-dimensionalesN-dimensionales
04/21/23Computación - Fac. Ingeniería
- UNMDP 3
Apellido Ruiz Martinez
Nombre Pablo Mariana
Tipo de Doc. DNI DNI
Número de Doc. 22456987 23456789
Sexo Masculino Femenino
Fecha de nacimiento 22/10/99 15/09/74....................... ........... ..............
Apellido Ruiz Martinez
Nombre Pablo Mariana
Tipo de Doc. DNI DNI
Número de Doc. 22456987 23456789
Sexo Masculino Femenino
Fecha de nacimiento 22/10/99 15/09/74....................... ........... ..............
Información sobre personas:
04/21/23Computación - Fac. Ingeniería
- UNMDP 4
Apellido Ruiz Martinez
Nombre Pablo Mariana
Tipo de Doc. DNI DNI
Número de Doc. 22456987 23456789
Sexo Masculino Femenino
Fecha de nacimiento 22/10/99 15/09/74....................... ........... ..............
La tabla vista por filas nos presenta información del mismo tipo (= vectores paralelos)La tabla vista por filas nos presenta información del mismo tipo (= vectores paralelos)
04/21/23Computación - Fac. Ingeniería
- UNMDP 5
Apellido Ruiz Martinez
Nombre Pablo Mariana
Tipo de Doc. DNI DNI
Número de Doc. 22456987 23456789
Sexo Masculino Femenino
Fecha de nacimiento 22/10/99 15/09/74....................... ........... ..............
La tabla vista por columnas relaciona información de distinto tipodistinto tipo (= registros)
La tabla vista por columnas relaciona información de distinto tipodistinto tipo (= registros)
04/21/23Computación - Fac. Ingeniería
- UNMDP 6
Si agrupamos información de distinto tipo (como el que figura en las columnas vistas) construimos un REGISTRO o “RECORD”.
Un REGISTRO es una estructura de datos que consiste de un número fijo de componentes, llamados CAMPOS.
A diferencia del arreglo, no se exige que sean del mismo tipo, y no pueden ser accedidos mediante un índice.
Estructura de datos: registrosEstructura de datos: registros
04/21/23Computación - Fac. Ingeniería
- UNMDP 7
Type Identifica_Reg = RECORD
S1: T1; S2: T2; ........ ...... Sn : Tn;
END;
Sintaxis de la declaraciónSintaxis de la declaraciónPrimer Campo
Identificador de campo Identificador de tipo
Siendo: Siendo: SSii: identificadores de campos : identificadores de campos
y y TTii: los tipos correspondientes: los tipos correspondientes
Identificador del tipo registro
04/21/23Computación - Fac. Ingeniería
- UNMDP 8
Cada campo(o componente) de un registro tiene:
1) Un identificador que lo denota, es decir, el identificador de campo.
2) Una definición de tipo que especifica el tipo del campo
Campos de un registroCampos de un registro
04/21/23Computación - Fac. Ingeniería
- UNMDP 9
Type Vect= array[1..10] of string [10]; persona = Record
Nomb, apell: string[20];
Sexo: char; anionac: integer; hijos: vect;
end;Var p:persona;Begin p.nomb:=‘Juan’;
EjemploEjemplo
Acceso a un campo
Declaración de registro
Identificador de campo
Tipo del campo
Identificador de tipo registro
04/21/23Computación - Fac. Ingeniería
- UNMDP 10
Acceso a los campos de un registroAcceso a los campos de un registro
Las variables del tipo record son declaradas de la manera usual.
Un campo de un registro es seleccionado usando tanto el nombre de la variable de tipo record como el nombre de la componente, separados por un punto:
Selectores de registroVar
p: persona;Begin p.nomb:=‘Juan’;
El acceso a los campos se hace a traves de los selectores de registro
Type TFecha = record Dia:1..31; Mes:1..12; Anio:1900..2100; End; Persona = RECORD
Nombres:string[25]; TipoDoc:string[3]; NroDoc:integer; Sexo:(femenino,masculino); FechaNac:TFecha; EstadoCiv: (soltero,casado,divorciado,viudo, separado); Domicilio:string[30]; Telefono:string[30]; END;Var XX:persona;Begin XX.FechaNac.dia:=4;....................................
Registros anidados
Acceso a campos de registros anidados
04/21/23Computación - Fac. Ingeniería
- UNMDP 12
TypeFamilia=(madre,padre,hijo1,hijo2,hijo3,hijo4);Registro_vacuna=array[familia] of TFecha;Var hepa:registro_vacuna; XX:persona;BEGIN
hepa[hijo1].dia:=5;hepa[hijo1].mes:=5;hepa[hijo1].anio:=2003;.......
Ejemplo: arreglo de registros Ejemplo: arreglo de registros
04/21/23Computación - Fac. Ingeniería
- UNMDP 13
Type MReal= array[1..30,1..30]of real; MatrizReal=Record CantFilasMR: byte; CantColsMR: byte; MatR:MReal; End;VAR A:MatrizReal; X:real; Fil:byte;BEGIN
Fil:=A.CantFilMR; X:=A.MatR[2,3];
Ejemplo: registros con arreglos Ejemplo: registros con arreglos
Acceso a un campo que es una matriz
04/21/23Computación - Fac. Ingeniería
- UNMDP 14
Tipos que faltan en el apunte (pag. 143)
TYPECadena = string[30];VReal= array[1..maxi] of real;VCadena=array[1..maxi] of Cadena;
VectorReal = record N:byte; V:VReal; End;
VectorCadena = record N:byte; V:Vcadena; End;
04/21/23Computación - Fac. Ingeniería
- UNMDP 15
El siguiente programa permite ingresar los datos de una persona y verifica si puede ser donantes de sangre (condición para el donante: ser del grupo A+ y pesar más de 50 Kg.)
El programa posee tres procedimientos: uno para ingreso de datos, otro para decidir si una persona específica puede donar sangre y el último para escribir los datos.
EjemploEjemplo
04/21/23Computación - Fac. Ingeniería
- UNMDP 16
program regist4;type vector=array[1..10] of string; cadena=string[10]; persona=record nombre:string[20]; anion:integer; gruposan:cadena; peso:real; nomhijos:vector; end;var a1:persona; n1:integer;
Este Campo es un Este Campo es un arregloarreglo
procedure lectura(var a:persona;var n: integer); var i:integer; begin writeln('Ingrese los datos de una persona'); writeln('Ingrese el nombre'); readln (a.nombre); writeln('Ingrese el año de nacimiento'); readln(a.anion); writeln('ingrese su grupo sanguineo'); readln(a.gruposan); writeln('ingrese su peso'); readln(a.peso); writeln('Ingrese la cantidad de hijos:'); readln(n); for i:=1 to n do begin write('Ingrese el nombre de los hijos'); readln(a.nomhijos[i]); end; {Fin del procedure lectura} end;
Parámetro con estructura de registro
procedure calculo(x:cadena;y:real); begin if (x='A+') and (y>50.00) then writeln('Usted puede donar sangre') else writeln('Usted no puede donar sangre'); end;
procedure escritura(a:persona;n:integer); var i:integer; begin writeln(' Los datos que Ud. ingreso son:' ); writeln (a.nombre,' '); writeln(a.anion,' '); writeln(a.gruposan,' '); writeln(a.peso:4:3,' '); for i:=1 to n do write(a.nomhijos[i],' '); end; {fin del procedimiento}
{Programa principal} begin lectura(a1,n1); calculo(a1.gruposan,a1.peso); escritura(a1,n1); end.
El programa principal recibe los datos de una persona a través de un registro
El proc. cálculo recibe grupo sanguineo y peso de una persona para decidir si puede donar sangre
04/21/23Computación - Fac. Ingeniería
- UNMDP 19
Sentencia WITHSentencia WITH
A menudo es necesario entrar a la misma componente de un registro, o a campos diferentes del mismo registro, varias veces en una pequeña sección del programa.
La sentencia with nos ahorra esfuerzo porque los campos de un registro pueden ser referenciados por el nombre del campo solamente. El compilador provee el nombre del registro.
Además de ahorrar alguna escritura de código, with puede ser útil al compilador porque el registro necesita ser localizado solamente una vez, en vez de varias ocasiones.
04/21/23Computación - Fac. Ingeniería
- UNMDP 20
WITH variable de tipo registro DO Sentencia;
Sintaxis de WITH - DOSintaxis de WITH - DO
En la sentencia WITH los campos se referencian mencionando solo su nombre
En la sentencia WITH los campos se referencian mencionando solo su nombre
04/21/23Computación - Fac. Ingeniería
- UNMDP 21
Ejemplo WITH - DOEjemplo WITH - DO
Type
TFecha = record Dia:1..31; Mes:1..12; Anio:1900..2100; End;Var f:Tfecha;
With f do {lectura de una fecha}
begin
readln(dia);
readln(mes);
readln(anio)
end;
With f do {lectura de una fecha}
begin
readln(dia);
readln(mes);
readln(anio)
end;
04/21/23Computación - Fac. Ingeniería
- UNMDP 22
Veamos el mismo problema ya presentado.
El programa es el mismo ya visto.
La modificación es solo el uso de sentencias with.
EjemploEjemplo
program regist5;type vector=array[1..10] of string; cadena=string[10]; persona=record nombre:string[20]; anion:integer; gruposan:cadena; peso:real; nomhijos:vector; end;var a1:persona; n1:integer;
Es la misma definición de
registro
procedure lectura( var a:persona;var n:integer); var i:integer; begin with a do begin {Begin del with} writeln('Ingrese los datos de una persona'); writeln('Ingrese el nombre'); readln (nombre); writeln('Ingrese el año de nacimiento'); ................ for i:=1 to n do begin writeln('Ingrese el nombre del hijo Nº',i); readln(nomhijos[i]); end; end;{Fin del with} end;{Fin del procedure}
Uso de with
procedure calculo(x:cadena;y:real); begin if (x='A+') and (y>50.00) then writeln('Usted puede donar sangre') else writeln('Usted no puede donar sangre'); end;procedure escritura(a:persona;n:integer); var i:integer; begin with a do begin writeln(' Los datos que Ud. ingreso son:' ); writeln (nombre,' '); writeln(anion,' '); writeln(gruposan,' '); writeln(peso:4:3,' '); for i:=1 to n do write(nomhijos[i],' '); end; end; {fin del procedimiento}
{Programa principal}begin lectura(a1,n1); calculo(a1.gruposan,a1.peso); escritura(a1,n1); end.
Uso de with
04/21/23Computación - Fac. Ingeniería
- UNMDP 26
1. Leer un grupo de complejos. Luego calcular e imprimir el módulo para cada uno de ellos. La estructura de datos a usar es un arreglo de registros.
2. Se tiene una lista de personas con los siguientes datos:Número de documento, fecha de nacimiento (día, mes y año), género (f, m)
Se quiere buscar la pareja (de distinto género) cuyas edades sean las más cercanas. Considerar posible repetición, así como la posibilidad de que no haya parejas posibles.
Ejemplos
program ejempl;uses crt; type Complex=record Re:real; Im:real; end; numer=array [1..20] of complex; var com:numer; n:complex; cant,i:integer;procedure lect(var cant:integer; var A:numer);var i:integer;begin writeln(‘Ingrese cantidad de complejos); Readln(cant); for i:=1 to cant do with A[i] do begin writeln('Ingrese part. real:');readln(Re); writeln('Ingrese part. imaginaria:');readln(Im); end; end;
El procedimiento El procedimiento devuelve al p.p. la devuelve al p.p. la lista de complejos y lista de complejos y su cantidadsu cantidad.
Arreglo de Arreglo de registrosregistros
Function Modulo(c:complex):real; begin with c do modulo:=sqrt(sqr(Re)+sqr(Im)) end; begin {p.p.} clrscr; Lect(cant,com); writeln(‘******** Modulo de los complejos ingresados *******’); for i:=1 to cant do with com[i] do writeln(‘Complejo:’,real,’ i ‘,imag, ‘ Modulo:’,Modulo(com[i]))end.
Funciones de la unidad dateutils
Ingreso de una fecha:
function EncodeDateTime(const AYear: Word;const AMonth: Word;const ADay: Word;const AHour: Word; const AMinute: Word;const ASecond: Word; const AMilliSecond: Word) : TDateTime;
Cantidad de días entre dos fechas
function DaysBetween(const ANow: TDateTime;const AThen: TDateTime): Integer;
04/21/23Computación - Fac. Ingeniería
- UNMDP 29
04/21/23Computación - Fac. Ingeniería
- UNMDP 30
program ejemreg1;
Uses SysUtils, DateUtils,crt ;
type
persona= record nrodoc:longint; fechanac:TDateTime;{Tipo propio de la unidad DateUtils} genero:1..2; end;
pareja=record m:persona; h:persona; difEdadDias:integer; end;
listapersonas=array[1..30] of persona;
listaparejas=array[1..30] of pareja;
Definición de tipos
04/21/23Computación - Fac. Ingeniería
- UNMDP 31
Const
Fmt = ' dddd dd mmmm yyyy ' ;
var
AYear:word; AMonth:word; Aday:word; AHour: Word; AMinute: Word; ASecond: Word; AMilliSecond: Word; todas:listapersonas; cantpers,cantduos:integer; duos:listaparejas; estaes:pareja;
Declaración de constantes y variables
04/21/23Computación - Fac. Ingeniería
- UNMDP 32
procedure ingreso(var todas:listapersonas;var cantpers:integer); var sigue:char; i:integer; total:integer;
begin i:=1; repeat with todas[i] do begin write('Ingrese numero de documento de la persona ',i,' : '); readln(nrodoc); writeln('Ingrese fecha de nacimiento de la persona ', i,': ======'); write('Ingrese el anio : '); readln(AYear); write('Ingrese el mes :'); readln(AMonth); write('Ingrese el dia : '); readln(ADay); write('Ingrese la hora : '); readln(AHour); write('Ingrese los minutos : '); readln(Aminute);
Procedimiento de entrada de datos (1)
04/21/23Computación - Fac. Ingeniería
- UNMDP 33
write('Ingrese los segundos : '); readln(Asecond); write('Ingrese los milisegundos : '); readln(AMilliSecond); fechanac:=EncodeDateTime(AYear, AMonth, ADay, AHour, AMinute, ASecond, AMilliSecond); writeln('Ingrese el genero de la persona ',i, ' : '); writeln(' 1: femenino; 2:masculino : '); readln(genero); writeln('Sigue ingresando datos? s/n '); readln(sigue); end; if sigue='s' then i:=i+1; until sigue<>'s'; cantpers:=i; end;
Procedimiento de entrada de datos (2)
Se construyeuna fecha en base al aniomes,dia,hora,minuto,segundos y milisegundos ingresados por el usurio
04/21/23Computación - Fac. Ingeniería
- UNMDP 34
{====================================================}
procedure mostrarpersona(p:persona);
begin writeln('Nro. de documento : ',p.nrodoc); write('Su fecha de nacimiento es : '); Writeln( FormatDateTime (Fmt ,p.fechanac) ) ; IF p.genero=1 then writeln('Es una mujer') else writeln('Es un hombre')end;
Escribe el registro de una persona
04/21/23Computación - Fac. Ingeniería
- UNMDP 35
procedure parejas(todas:listapersonas; cantpers:integer; var duos:listaparejas; var cantduos:integer);var i,k,j:integer;
Begin j:=0; for i:=1 to cantpers-1 do for k:=i+1 to cantpers do begin if ((todas[i].genero=1) and (todas[k].genero=2)) or ((todas[k].genero=2) and (todas[i].genero=1)) then begin j:=j+1; with duos[j] do begin m:=todas[i]; h:=todas[k]; difEdadDias:=DaysBetween(m.fechanac,h.fechanac); end; end; end; cantduos:=j; End;
Parejas que se forman
04/21/23Computación - Fac. Ingeniería
- UNMDP 36
Procedure encontrarparej(duos:listaparejas; cantduos:integer; var estaes:pareja);
var
i:integer; menor:integer;
begin
menor:=duos[1].difEdadDias; estaes:=duos[1]; for i:=2 to cantduos do if duos[i].difEdadDias < menor then begin menor:=duos[i].difEdadDias; estaes:=duos[i]; end
end;
Buscar la pareja con edades mas cercanas
04/21/23Computación - Fac. Ingeniería
- UNMDP 37
{===================================================}
procedure mostrarpareja(estaes:pareja);
begin writeln('===== Esta es la pareja elegida ================'); mostrarpersona(estaes.m); mostrarpersona(estaes.h);
end;
{====================================================}
BEGIN clrscr; ingreso(todas,cantpers); parejas(todas,cantpers,duos,cantduos); encontrarparej(duos,cantduos,estaes); mostrarpareja(estaes); readln END.
Muestra una pareja
Programa principal