Download Explicacion ArreglosI
Document related concepts
no text concepts found
Transcript
Programación I - 2011 Arreglos Arreglo (Array) Es una colección ordenada e indexada de elementos. Ejemplo A Indices 34 123 1 2 99 3 454 222 98 34 12 1 66 4 5 6 7 8 9 10 Los elementos de un arreglo son todos del mismo tipo de dato (todos integer o real o char o registros o aún arreglos) por lo tanto se denomina estructura de datos “homogénea”. Declaración type vector = array [Rango] of tipo_de_dato; Integer Char enumerativo Integer Real Char Boolean String Registro Array var v: vector A los elementos se los accede directamente, indicando simplemente su posición, por eso es una “estructura de datos indexada” y de “acceso directo”. Asignación de valores v [1] := 5; v [1] := 5; Read( v[1] ); En la posición 1 del arreglo v se almacena el número 5. V 5 1 2 3 4 5 6 7 8 9 10 Read( v[1] ); Se lee un dato desde teclado y se almacena en la posición 1. La memoria ocupada durante la ejecución del programa es fija, por eso se dice que es una “estructura de datos estática”. Un arreglo con un sólo índice se denomina “vector”. Con dos índices, se lo denomina “matriz”. Dimensión Física y Lógica V V 5 ? ? ? ? ? ? ? ? ? 1 2 3 4 5 6 7 8 9 10 5 34 80 ? ? ? ? ? 1 2 3 4 5 6 7 8 Dimensión física: 10 Dimensión lógica: 1 Dimensión física: 8 Dimensión lógica: 3 Declaración type vector = array [1..5] of integer; Dimensión Física 5 var v: vector ; dimLog: integer ; Dimensión Lógica begin DimLog:= 0; … end. Inicialización de la Dimensión Lógica en 0, pues aún no posee elementos. Enunciado de ejemplo Realizar un programa que lea números hasta que llegue el número 0 (como máximo 100). Una vez realizada la carga: • Informar las posiciones en que se encuentran los números múltiplos de 3. • Informar la cantidad de números pares. Solución propuesta program Arreglos; type vectorNumeros = array [1..100] of integer; var Si no sabemos la cantidad de v : vectorNumeros; elementos que contendrá un dimLog: integer; arreglo siempre trabajaremos con su dimensión lógica begin {PROGRAMA PRINCIPAL} llenarVector (v , dimLog); realizarInforme(v, dimLog); end. procedure llenarVector (var v: vectorNumeros; var dimLog: integer); var num: integer; begin dimLog := 0; write(‘Ingrese un Número: '); readln(num); while (num <> 0) and (dimLog < 100) do begin dimLog := dimLog + 1; Es responsabilidad del v[dimLog]:= num; programador mantener write(‘Ingrese un número: '); actualizado el valor de la dimensión lógica readln(num); end; end; function esPar (a: integer ): Boolean; begin esPar := (a mod 2 = 0); end; procedure realizarInforme (v: vectorNumeros; dimLog: integer); var Usamos la dimensión i, cantPar: integer; lógica para recorrer el begin vector solo hasta la cantPar:= 0; posición que contiene for i:= 1 to dimlog do begin elementos if (v[i] mod 3 = 0 ) then writeln('En la posición ', i, ' hay un numero múltiplo de 3'); if (esPar(v[i])) then cantPar:= cantPar + 1; end; writeln ('La cantidad de números pares es: ', cantPar); end; Enunciado de ejemplo Se lee la información del personal administrativo de la Facultad de Informática y se sabe que son exactamente 50 personas. De cada persona se lee la siguiente información: Apellido, Nombre, DNI y Fecha de Nacimiento. Una vez cargado todo el personal informar: • Cantidad de personas que posean DNI con mayor cantidad de dígitos pares que impares. • Apellido de aquellas personas que cumplen años en el mes de enero. Solución propuesta program ejercicio2; El uso de la constante const nos ayuda en el dim = 50; mantenimiento type fecha = record La fecha de nacimiento dia : 1..31; debe ser un registro mes : 1..12; pues el enunciado nos anio: 1900..2005; pide informar datos referentes solo al mes end; persona = record apellido : string[20]; nombre : string[20]; DNI : integer; fecha_nac: fecha; end; personas = array [1..dim] of persona; Var vp: personas; begin {PROGRAMA PRINCIPAL} llenarVector (vp); realizarInforme(vp); end. procedure llenarVector (var vp: personas); var p: persona; i: integer; begin for i := 1 to dim do begin writeln('----Ingrese los datos de una persona----'); leerPersona(p); Recordar: Siempre que cargamos los datos de un registro usamos un módulo para vp[i] := p; hacerlo. end; end; procedure leerPersona (var p: persona); begin write(‘Ingrese Apellido: '); readln(p.apellido); write(‘Ingrese Nombre: '); readln(p.nombre); write(‘Ingrese D.N.I.: '); readln(p.DNI); writeln(‘Ingrese fecha de nacimiento'); leerFecha(p.fecha_nac); end; procedure leerFecha (var f:fecha); begin write(‘Ingrese el día: '); readln(f.dia); write(‘Ingrese el mes: '); readln(f.mes); write(‘Ingrese el año: '); readln(f.anio); end; Usamos un proceso aparte para cargar los datos que componen una fecha para que sea mas claro. procedure realizarInforme (vp: personas); var i, cant_par, cant_impar, cantPersonas: integer; begin Accedemos a los datos de una persona campo a campo usando el cantPersonas:= 0; operador ¨.¨ for i:= 1 to dim do begin desglosarNumero (vp[i].DNI, cant_par, cant_impar); if (cant_par > cant_impar) then cantPersonas := cantPersonas + 1; if (vp[i].fecha_nac.mes = 1 ) then writeln('La persona ', vp[i].apellido, ' cumple años en enero'); end; writeln ('La cantidad de personas es: ', cantPersonas); end; function esPar (a: integer ): Boolean; begin esPar := (a mod 2 = 0); end; procedure desglosarNumero (n: integer; var cp: integer; var ci: integer); var dig: integer; begin cp := 0; ci := 0; while (n <> 0) do begin dig := n mod 10; if (esPar(dig)) then cp := cp + 1 else ci := ci + 1; n := n div 10; end; end; ¿Preguntas?