Your SlideShare is downloading. ×
Arreglos
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Arreglos

2,151

Published on

Published in: Business, Travel
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
2,151
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
27
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Arreglos y Registros Sección 6.1 1
  • 2. Acceso de arreglos Un arreglo es una secuencia ordenada de objetos idénticos. El ordenamiento es determinado por un objeto de datos escalar (usualmente entero o dato enumerado). Este valor es llamado el subscripto o índice, y escrito como A[I] para el arreglo A y subscrito I. Arreglos multidimencionales tienen más de un subscrito. Un arreglo de 2 dimensiones puede ser modelado como cajas en una malla rectangular. El L-value para un elemento del arreglo A[I,J]esta dado por medio de una formula de acceso 2
  • 3. 3
  • 4. Acceso al arreglo (continuación) Rescribiendo la ecuación de acceso: L-value(A[I,J]) = - d1*L1 - d2*L2 +I*d1 + J*d2 Haga I = 0; J= 0; L-value(A[0,0]) = - d1*L1 - d2*L2 +0*d1 + 0*d2 L-value(A[0,0]) = - d1*L1 - d2*L2, que es una constante. Esta constante es denominada origen virtual (VO); representa la dirección del elemento 0 del arreglo. L-value(A[I,J]) = VO +I*d1 + J*d2 Para acceder un elemento del arreglo, use un dope vector: 4
  • 5. Sumario del acceso a arreglos Para crear arreglos: 1. Asigne un almacenamiento total empezando en : (U2-L2+1)*(U1-L1+1)*tamañoelmt 2. d2 = tamaño 3. d1 = (U2-L2+1)*d2 4. VO = - L1*d1 - L2*d2 5. Para acceder A[I,J]: Lvalue(A[I,J]) = VO + I*d1 + J*d2 Esto funciona para 1, 2 o más dimensiones. Puede no requerir dope vector en tiempo de corrida si todos los valores son conocidos en tiempo de compilación. (por Ej.. En Pascal, d1, d2, y VO pueden ser calculados por el compilador.) 5
  • 6. 6
  • 7. Ejemplo de arreglos Dado el siguiente arreglo: var A: array [7..12, 14..16] of real; Obtener el dope vector si el arreglo es almacenado empezando en posición 500. d2 = 4 (dato real) d1 = (16-14+1) * 4 = 3 * 4 = 12 VO = 500 - 7 * 12 - 14 * 4 = 500 - 84 - 56 = 360 L-value(A[I,J]) = 360 + 12* I + 4* J 1. VO puede ser un valor positivo o negativo, y puede tener Una dirección que es antes, en, o después del almacenamiento actual del arreglo: 2. En C, VO = debido a que el limite se inicia en 0. Ejemplo: char A[25] L-value(A[I]) = VO + (I-L1) * d1 = + I * 1 = + I 7
  • 8. Slices 8
  • 9. Arreglos tipo slices Dado el arreglo: A[L1:U1, L2:U2]: Obtener d1, d2, y VO para el vector: Dope vector A[I,*] = B[L2:U2] VO = L-value(A[I,L2]) - d2*L2 Crear nuevo dope M1 = tamañoelmt = d2 vector que accese el Dope vector A[*,J] = B[L1:U1] dato original VO = L-value(A[L1,J]) - d1*L1 M1 = tamañofila = d1 9
  • 10. Más sobre slices Slice diagonal: VO = L-value(A[L1,L2]) - d1*L1 - d2*L2 M1 = d1 + d2 Otras posibilidades: 10
  • 11. Arreglos asociativos Acceso a la información por nombre sin tener un orden o enumeración predefinido: Ejemplo: Nombres y calificaciones para los estudiantes de una clase: NOMBRE[I] = nombre del I estudiante CALIFICACION[I] = Calificación para el estudiante en posición I Arreglo asociativo: Usa Nombre como índice: CLASE[nombre] será la calificación. Problema: No se conoce la enumeración antes de obtener los datos por lo que el método del dope vector no funcionará. Implementado en Perl y en SNOBOL4 (como una tabla) 11
  • 12. Ejemplo en Perl %ClassList = (“Michelle”, `A', “Doris”, `B', “Michael”, `D'); # % operador hace un arreglo asociativo $ClassList{„Michelle‟} # tiene el valor „A‟ @y = %ClassList # Convierte ClassList a una enumeración # arreglo con índice 0..5 For ($i=0;$i<6;$i++){print “I=,$i,$y[$i]n;”}; $I= 0 $y[$I] = Doris I=,0,Doris $I= 1 $y[$I] = B I=, 1, B $I= 2 $y[$I] = Michael I=, 2, Michael $I= 3 $y[$I] = D I=,3, D $I= 4 $y[$I] = Michelle I=, 4, Michelle $I= 5 $y[$I] = A I=, 5, A 12
  • 13. Estructuras en C Representación: una secuencia de objetos: record { A: object; B: object; C: object } 13
  • 14. Tipos de unión typedef union { int X; float Y; char Z[4];} B; B P; Similar a registros, excepto que todos tienen sobrelapamiento (el mismo) L-value. Pero pueden ocurrir problemas. ¿Que sucede abajo? P.X = 142; printf(“%On”, P.Z[3]) Todos los 3 objetos de datos tienen el mismo L-value y ocupan el mismo almacenamiento. No se realiza un chequeo de tipo. Diseño de lenguaje pobre 14
  • 15. Registros variantes type TipoPago=(Mensual, Hora); var Empleado:record ID: integer; Dept: array[1..3] of char; Age: integer; case PayClass: TipoPago of Mensual:(MonthlyRate:real; StartDate:integer); Houra:(HourRate:real; Reg:integer; Overtime:integer) end 15

×