Clase 12 COMPUTACION 2009 Tipos de Datos PASCAL Estructurados Simples Primitivos No primitivos...

Preview:

Citation preview

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

Recommended