Clase10-Vectores_2011

71
ARREGLOS Teoría – Alejandro Héctor González

Transcript of Clase10-Vectores_2011

Page 1: Clase10-Vectores_2011

ARREGLOSTeoría – Alejandro Héctor González

Page 2: Clase10-Vectores_2011

Temas

Estructura de datos arreglo

Definición

Operaciones

Ejemplos

Page 3: Clase10-Vectores_2011

Arreglos - Características

Posición basePosición base

AA

BB

CC

11 22 33 5544INDICE

Page 4: Clase10-Vectores_2011

Estructura de datos-ARREGLO-Concepto

Suponga que se requiere procesar la información referida a ventas de diferentes sucursales (en total 4) de un supermercado. Para ello, se leen de teclado las cantidades PARCIALES vendidas por las diferentes sucursales. No hay garantía de que la información venga ordenada por sucursal. Se debe obtener como resultado, aquellas sucursales que superan el promedio vendido.

Page 5: Clase10-Vectores_2011

Estructura de datos-ARREGLO-Concepto

Por ejemplo:

SUC 3 12.000

SUC 1 5.500

SUC 4 15.500

SUC 1 7.500

Promedio: 56.000/4 = 14000

Las sucursales 3 y 4 superan el promedioSUC 2 7.500

SUC 3 8000

SUC 1 13.000

SUC 2 7.500

SUC 3 20.000

SUC 4 15.500

Page 6: Clase10-Vectores_2011

Estructura de datos-ARREGLO-Concepto

Podríamos leer desde teclado y tener cuatro variables, una para cada sucursal y de acuerdo, a la sucursal leída sumar con el totalizador correspondiente. Luego, se tiene que calcular el promedio y analizar para cada variable totalizador si lo supera o no

Page 7: Clase10-Vectores_2011

Estructura de datos-ARREGLO-Concepto

Para resolver estos problemas podemos usar una estructura de datos tipo arreglo.

Un arreglo (ARRAY) es una estructura de datos que permite acceder a cada componente a través de una variable índice, que da la posición de la componente dentro de la estructura de datos.

Un tipo de dato Arreglo es una colección indexada de elementos.

Page 8: Clase10-Vectores_2011

Estructura homogénea: los datos que almacena son del mismo tipo.

Estructura estática: su tamaño no varía al agregar o sacar elementos de la misma.

Estructura indizada: permite recuperar cualquier elemento del arreglo indicando su posición (índice).

Estructura de datos-ARREGLO-Concepto

Page 9: Clase10-Vectores_2011

¿Qué es el índice de un arreglo?

Estructura de datos-ARREGLO-Concepto

Es una variable de tipo ordinal.Permite acceder a cualquier elemento de manera directa.

Representa un desplazamiento desde la posición inicial del arreglo

Page 10: Clase10-Vectores_2011

Arreglos - Conceptos Un tipo de dato Arreglo es una colección indexada

de elementos.

HomogéneaHomogénea Acceso directoAcceso directoindexadoindexado

EstáticaEstática

LinealLineal

Uso de la memoria

Organización de los datos

Forma de accesoDatos que puede almacenar

Page 11: Clase10-Vectores_2011

Estructura de datos Arreglo

12001200 300300 50005000 250250

Índice: I

12001200

300300

50005000

250250

Memoria RAM

A012

A013

A014

A015

Vector: Sucursales

Dimensión física: 4 elementos en total

Los representamos habitualmente

en forma horizontal

Page 12: Clase10-Vectores_2011

Estructura de datos Arreglo

12001200 300300 50005000 250250

Índice: I es un subrango 1..4

Vector: Sucursales

¿Qué valor hay en Sucursales [3]?

Los corchetes se utilizan para mencionar la posición del

vector que va a ser

accedida

Page 13: Clase10-Vectores_2011

Estructura de datos-ARREGLO-Concepto

En el ejemplo de las sucursales….12.000 5.500 15.500 7.500 12.500 4.000 3.700

Arreglo de Ventas (VS)

VS[3] Índice del

arreglo

1 2 3 500….

Page 14: Clase10-Vectores_2011

Estructura de datos-ARREGLO-Concepto

Del ejemplo anterior … El nombre de la variable tipo arreglo lleva asociado un área de memoria fija consecutiva ( del tamaño especificado en la declaración ), que es el lugar donde se almacenarán los valores.

La variable índice, sirve para ubicar ó direccionar rápidamente las componentes del arreglo.

Page 15: Clase10-Vectores_2011

Estructura de datos-ARREGLO-ConceptoCuando trabajamos con arreglos se debe tener en cuenta…Declaración del tipo arreglo.

La utilización del índice del arreglo.

El acceso al contenido del arreglo.

Dimensión física y lógica del arreglo.

Operaciones permitidas con los arreglos.

Page 16: Clase10-Vectores_2011

Program uno; type sucursales= array[rango] of tipo;

integercharbooleanenumerativo

Estructura de datos-ARREGLO-Declaración

integercharbooleanenumerativorealregistros

Subrangos de tipos ordinales

Page 17: Clase10-Vectores_2011

Estructura de datos-ARREGLO-Declaración

EJEMPLO

Program uno; type sucursales= array [1..7] of integer;

Page 18: Clase10-Vectores_2011

Estructura de datos-ARREGLO-Declaración

EJEMPLO

Según la dimensión del arreglo se los denomina de diferentes maneras:1 Dimensión: VECTORES2 Dimensiones: MATRICES3 Dimensiones: TENSORESN Dimensiones: ARREGLO N-DIMENSIONAL;

Page 19: Clase10-Vectores_2011

OPERACIONES CON VECTORES

Page 20: Clase10-Vectores_2011

•Asignar elementos.•Lectura/escritura.•Recorridos.•Agregar elementos.•Insertar elementos.•Borrar elementos.•Búsqueda de un elemento.•Ordenación de un arreglo.

Estructura de datos-ARREGLO-Operaciones

Page 21: Clase10-Vectores_2011

Estructura de datos-ARREGLO- Asignar elementos

Program uno; type sucursales= array [1..7] of integer; var VS: sucursales; begin VS[6]:= 7.200;

? ? ? ? ? ? ?

? ? 15.200 ? ? ? ?

VS[3]:= 15.200;? ? 15.200 ? ? 7.200 ?

Page 22: Clase10-Vectores_2011

Estructura de datos-ARREGLO- Asignar elementos

Program uno; type sucursales= array [1..7] of integer; var VS: sucursales; x,i:integer; begin

? ? ? ? ? ? ?

100 2.500 15.200 7563 4570 23.564 0

for i:= 1 to 7 do

read (x); VS[i]:= x;

Page 23: Clase10-Vectores_2011

Estructura de datos-ARREGLO- Asignar elementos

Program uno; type sucursales= array [1..7] of integer; var VS: sucursales; x,i:integer; begin

? ? ? ? ? ? ?

for i:= 1 to 7 do

read (x); VS[i]:= x;

for i:= 1 to 7 do

read (vs[i]);

Page 24: Clase10-Vectores_2011

Estructura de datos-ARREGLO-Ejercicio

Suponga que se leen las lluvias de cada día del mes de enero, y se quiere obtener aquellos días en que las lluvias superan el promedio del mes.

Page 25: Clase10-Vectores_2011

Estructura de datos-ARREGLO-Ejercicio

Program Ejemplo1; type lluvias= array [1..31] of real; var enero: lluvias; i:1..31;begin CargarLluvias (enero); prom: = promedio(enero); For i:= 1 to 31 do If (enero [i] > prom) then writeln (‘El día ’, i, ‘supera el promedio del mes’); end.

Page 26: Clase10-Vectores_2011

Estructura de datos-ARREGLO-Ejercicio

Procedure CargarLluvias (var enero:lluvias); For i:= 1 to 31 do readln(enero[i]); end.

? ? ? ? ? ? ?

1 2 3 4 ….. 30 31

Page 27: Clase10-Vectores_2011

Estructura de datos-ARREGLO-Ejercicio

Suponga que se requiere procesar la información referida a ventas de diferentes sucursales (CAMBIAMOS EL PROBLEMA ORIGINAL – AHORA 7 SUCURSALES) de un supermercado. Para ello, se leen de teclado las cantidades PARCIALES vendidas por las diferentes sucursales. No hay garantía de que la información venga ordenada por sucursal. Se debe obtener como resultado, aquellas sucursales que superan el promedio vendido.

Page 28: Clase10-Vectores_2011

Estructura de datos-ARREGLO-EjercicioProgram uno; type codigosuc= 0..7; ventas= record suc: codigosuc; cantvendida: integer; end; sucursales= array [1..7] of integer; var VS: sucursales;i: 1..7;Begin InicializarSucursales(VS); {Es un módulo que pone cada posición del vector en cero} CargarVentas (VS); prom: = promedio(VS); For i:= 1 to 7 do If (VS [i] > prom) then writeln (‘La sucursal ’, i, ‘supera el promedio’); end.

Page 29: Clase10-Vectores_2011

Estructura de datos-ARREGLO- Ejercicio

Queda para el alumno la implementación de los proceso leer e InicializarSucursales de este EjercicioProcedure CargarVentas (var suc:sucursales); var i:integer; v: ventas; begin leer (v); {Es un módulo que hace un read de cada campo del registro v} While (v.suc <>0) do {consideramos que seguro en v.suc viene cargado un número entre 0 y 7} Begin suc[v.suc]:=suc[v.suc]+ v.cantvendida; leer (v); End; end;

Page 30: Clase10-Vectores_2011

Estructura de datos-ARREGLO- Recorridos

Recorrido completo.

Recorrido condicional.

Page 31: Clase10-Vectores_2011

Arreglos: Recorridos Esta operación consiste en recorrer el vector

total o parcialmente.

Por ejemplo si nos piden saber la cantidad de veces que figura el valor 23 en un vector de 100 componentes, habrá que recorrerlo completo, contando las apariciones del 23:

Page 32: Clase10-Vectores_2011

Arreglos: Recorrido Total Program REC-TO23;

Const DIMF= 100; Type rango= 1..DIMF; vector = array [ 1..DIMF ] of integer ; Var a: vector; J : rango; Can23 : integer ; Begin Can23 := 0; For J := 1 to DIMF do {cargando datos en cada componentes del vector} Read ( A [ J ] ) ;  For J := 1 to DIMF do { recorrido total del vector} If ( A [ J ] = 23 ) then Can23 := Can23 + 1; Writeln ( ´Veces que aparece 23´, Can23 ); end.

Page 33: Clase10-Vectores_2011

Arreglos: Recorrido Condicional

Ejemplo: Encontrar la posición del primer cero en un vector de 1000 componentes, sabiendo que por lo menos existe un cero.

 

Es claro que en este caso no conviene hacer un recorrido total del vector, pues nos piden la posición del primer cero sabiendo que existe al menos uno.

 

Page 34: Clase10-Vectores_2011

Arreglos: Recorrido Condicional

Program POSCE;Const DIMF=1000;Type rango= 1..DIMF; vector = Array [ 1..DIMF] of real; Var A: vector; J : rango; Begin CargarVector(A); J := 1; { Recorre el vector hasta encontrar el cero} While ( A [ J ] <> 0 )do J := J + 1; Writeln ( ´La posición es : ´, J ) ; End.

Esto debiera modificarse en caso que no me aseguren que el cero está seguro

Esto debiera modificarse en caso que no me aseguren que el cero está seguro

Page 35: Clase10-Vectores_2011

Arreglos: Recorrido Condicional

Program POSCE;Const DIMF=1000;Type rango= 1..DIMF+1; vector = Array [ 1..DIMF] of real; Var A: vector; J : rango; encontre:boolean; Begin CargarVector(A); { Se considera que el vector se carga en todas las posiciones} encontre:=false; J := 1; { Recorre el vector hasta encontrar el cero o hasta que se acabe el vector} While ( not encontre) and (J<=DIMF )do If (A [J] = 0) then encontre:= true else J := J + 1; If encontre then Writeln ( ´La posición es : ´, J ) ; End.

Page 36: Clase10-Vectores_2011

Arreglos: dimensiones...

Cuando se trabaja con arreglos se deben hacer consideraciones importantes acerca de algunos aspectos:

Dimensión Física del arregloDimensión Lógica del arregloArreglos como parámetros

Page 37: Clase10-Vectores_2011

DIMENSIÓN FÍSICA Y LÓGICA DEL VECTOR

Page 38: Clase10-Vectores_2011

Supongamos que se quiere cargar una estructura que permita almacenar números enteros hasta leer el número 99. Al finalizar la carga se pide calcular el mínimo numero leído. Se sabe que a lo sumo son 10000 números.

Estructura de datos-ARREGLO - Ejercicio

Dimensión física

Dimensión lógica

Page 39: Clase10-Vectores_2011

Estructura de datos-ARREGLO – Dim Física

Program tres; Const Dim= 10000 type numeros = array [1..Dim] of integer; var nume: numeros;

Dimensión física Dimensión

lógica

¿Hasta cuando cargo el vector?

Page 40: Clase10-Vectores_2011

Estructura de datos-ARREGLO – Dim Física-Lógica

Program cuatro;Const DIMF=10000 Type rango=0..DIMF; numeros = array [1..DIMF] of integer; Var nume: numeros; dimL: rango; Begin cargarNumeros(nume,dimL); write(“el menor numero leido es”, minimo(nume,dimL)); End.

Page 41: Clase10-Vectores_2011

Estructura de datos-ARREGLO – Dim Física-Lógica

Procedure cargarNumeros (var n:numeros; var tam:rango); var num:integer; begin tam:=0; read(num); while (num <> 99) do begin n[tam+1]:= num; tam:= tam + 1; read(num); end; end;

Qué pasa si el número 99 se lee

después de los 10000 números?

La solución no es correcta, pues podríamos estar accediendo a posiciones no válidas

Page 42: Clase10-Vectores_2011

Estructura de datos-ARREGLO – Dim Física-Lógica

Procedure cargarNumeros (var n:numeros; var tam:rango); var num:integer; begin tam:=0; read(num); while (num <> 99) and (tam < DIMF) do begin n[tam+1]:= num; tam:= tam + 1; read(num); end; end;

SIEMPRE SE DEBE CONTROLAR NO

INGRESAR MAS NUMEROS QUE LA DIM. FISICA

DECLARADA

Page 43: Clase10-Vectores_2011

Estructura de datos-ARREGLO – Dim Física-Lógica

function minimo (n:numeros, DimL:rango):integer; var i: rango; min:integer; Begin min:=9999; for i:= 1 to DimL do if (n[i]< min) then min:= n[i]; minimo:= min;end;

Page 44: Clase10-Vectores_2011

OPERACIONES: Agregar Un Elemento Nuevo En El

Vector

Page 45: Clase10-Vectores_2011

Arreglos: Agregar al final (append)

Aspectos a considerar:

• dimF : dimensión del vector (tamaño especificado en la declaración del vector)

• dimL : cantidad de elementos en el vector. Luego de la operación la cantidad de elementos es dimL+1, siempre que haya espacio ( dimL< dim).

• espacio suficiente: debe verificarse que dimL < dim.

Page 46: Clase10-Vectores_2011

Arreglos: Agregar al final

{Este programa agrega varios elementos invocando al procedure Agregar}

Program AgregarElementos;const dimF = 10;Type rango= 0..dimF; vector = array [1..dimF] of integer;Var v : vector; elem: integer; sepuede: boolean; dimL, i: rango;

Page 47: Clase10-Vectores_2011

Arreglos: Agregar al final Begin {prog. ppal}

read (elem); sepuede:=true; dimL:=0; while (elem <> 0) and ( sepuede) do begin AGREGAR ( v, dimL, elem, sepuede); if sepuede then read (elem); end; write ('El vector resultante es: '); readln; For i := 1 to dimL do write (v[i], ' ');End.

Podemos hacer un módulo para más legibilidad

Podemos hacer un módulo para más legibilidad

Page 48: Clase10-Vectores_2011

Arreglos: Agregar al final

Procedure AGREGAR (var v: vector; var dimL:rango; elemento: integer; var exito : boolean);Begin {verificar espacio suficiente} If (dimL < DimF) then begin v[dimL + 1]:= elemento; dimL := dimL + 1; {actualizar cantidad de elementos} end else exito := false; End;

Page 49: Clase10-Vectores_2011

OPERACIONES: INSERTAR Un Elemento Nuevo En El

Vector

Page 50: Clase10-Vectores_2011

Arreglos: Insertar

11 22 33 1010..............

2 5 3

6

Dim Logica

44

5

6

32

Supongamos que deseamos insertar el

VALOR 6 en la POSICIÓN 1 del

vector

Supongamos que deseamos insertar el

VALOR 6 en la POSICIÓN 1 del

vector

La posición donde debo insertar debe ser VÁLIDA

La posición donde debo insertar debe ser VÁLIDA

Page 51: Clase10-Vectores_2011

Arreglos: Insertar Program

insertarelementos; Const dimF = 1000 Type rango= 0..dimF;vector = array [1..dimF] of integer;var v: vector; elem : integer; pos , DimL: rango; sepuede : boolean;

begin cargar-vector (v, DimL); sepuede := true; readln (elem); readln(pos); Validar(pos, sepuede); while (elem < > 0) and (sepuede) do begin INSERTAR ( v, DimL, elem, pos, sepuede); if (sepuede) then begin read (elem); readln(pos); Validar (pos,sepuede); end; end.

Page 52: Clase10-Vectores_2011

Arreglos: Insertar Procedure cargar-vector ( var num: vector; var DimL: integer );

var elem : integer; Begin DimL := 0; read (elem); while (elem < > 9999) and (DimL< dimF ) do begin DimL := DimL + 1; num [ DimL ] := elem; read (elem) end; End.

Page 53: Clase10-Vectores_2011

Arreglos: Insertar Procedure INSERTAR (var num:vector; var dimL:rango; elem:integer;

pos:rango; var exito:boolean );var i : rango;Begin if (dimL < DimF ) then begin exito := true; i := DimL; While ( i >= pos ) do begin num [ i + 1 ] := num [ i ] ; i := i - 1 ; end; num [pos] := elemento; DimL := DimL + 1; {Incremento dim logica} end else exito := false; end;

Page 54: Clase10-Vectores_2011

OPERACIONES: BORRAR Un Elemento Existente En

El Vector

Page 55: Clase10-Vectores_2011

Arreglos: Borrar Aspectos a considerar:

 

DimL : cantidad de elementos en el vector. Luego de la operación la cantidad de elementos disminuye en 1.

Pos : posición del elemento del vector que se quiere borrar. Debe verificarse que pos<= DimL

 {Consideremos un programa que borra varios elementos en posiciones

que se ingresan como dato, invocando al procedure Borrar}

Page 56: Clase10-Vectores_2011

Arreglos: Borrar

program borrarelementos;const dimF = 1000; type rango= 0..dimF; vector = array [1..dimF] of integer;var v: vector; elem : integer; pos , DimL: rango; sepuede : boolean;

begin cargarvector (v, DimL); sepuede := true; read (pos); while ( pos< > 0) do begin BORRAR ( v, DimL, elem, pos, sepuede); if sepuede then writeln (“El elemento borrado es: ”, elem); read (p); end; End.

Page 57: Clase10-Vectores_2011

Arreglos: Borrar Procedure BORRAR (var num: arreglo; var DimL: integer; var

elemento: integer; pos: rango; var exito: boolean );Var j: rango; Begin  if (pos <= DimL) and (pos >=1) then begin {verifica valor de pos, valida ese valor} elemento := num [pos] ; {Guarda el valor del elemento que se borra } for j:= pos to DimL-1 do num [ j ] := num [ j + 1 ] ; DimL := DimL - 1 ; end else exito := false; End;

Page 58: Clase10-Vectores_2011

Estructura de datos EJERCICIOS

1. Se lee una secuencia de números comprendidos en el rango de 5 a 60. La secuencia termina cuando se lee el número 24. Informar cuantas veces apareció cada número.

2. Se lee una secuencia de letras minúsculas que termina en punto. Informar la cantidad de veces que aparece cada letra.

3. Se lee una sucesión de datos de a lo sumo 100 alumnos. De cada alumno se conoce nombre y nota de alumnos. Informar los nombres de aquellos alumnos que superen el promedio del grupo. La lectura termina con el alumno de nombre ZZZ.

Page 59: Clase10-Vectores_2011

Estructura de datos EJERCICIO 1

Program uno;

type rango = 5..60; cantidades = array [rango] of integer;

var num: cantidades;

Page 60: Clase10-Vectores_2011

Estructura de datos-ARREGLO –

EJERCICIO 1

Begin inicializar (num); contabilizar (num); informar (num);

End.

Page 61: Clase10-Vectores_2011

Estructura de datos-ARREGLO –

EJERCICIO 1

Procedure inicializar (var a: cantidades);Begin for i:= 5 to 60 do a[i]:= 0;End;

Page 62: Clase10-Vectores_2011

Estructura de datos-ARREGLO –

EJERCICIO 1

Procedure contabilizar (var a: cantidades);Var valor:rango;Begin read (valor); while (valor<>24) do begin a[valor]:= a[valor] + 1; read (valor); end;End;

Page 63: Clase10-Vectores_2011

1. Se lee una secuencia de números comprendidos en el rango de 5 a 60. La secuencia termina cuando se lee el número 24. Informar cuantas veces apareció cada número.

2. Se lee una secuencia de letras minúsculas que termina en /. Informar la cantidad de veces que aparece cada letra.

Estructura de datos-ARREGLO –

EJERCICIO 2

3. Se lee una sucesión de datos de a lo sumo 100 alumnos. De cada alumno se conoce nombre y nota de alumnos. Informar los nombres de aquellos alumnos que superen el promedio del grupo. La lectura termina con el alumno de nombre ZZZ.

Page 64: Clase10-Vectores_2011

Program dos;

type cantidades = array [‘a’..’z’] of integer;var num: cantidades;Begin inicializar(num); cargar (num); informar(num); End.End.

Estructura de datos-ARREGLO –

EJERCICIO 2

Page 65: Clase10-Vectores_2011

Procedure inicializar (var a: cantidades);Vari:char;Begin for i:= ‘a’ to ‘z’ do a[i]:= 0;End;

Estructura de datos-ARREGLO –

EJERCICIO 2

Page 66: Clase10-Vectores_2011

Estructura de datos-ARREGLO –

EJERCICIO 2

Procedure contabilizar (var a: cantidades);Var valor: char; Begin read (valor); while (valor <> ‘/’) do begin a[valor]:= a[valor] + 1; read (valor); end;End;

Page 67: Clase10-Vectores_2011

Estructura de datos-ARREGLO –

EJERCICIO 2

Procedure informar (a: cantidades);Var i:char;

Begin for i:= ‘a’ to ‘z’ do write (a[i]);End;

Page 68: Clase10-Vectores_2011

1. Se lee una secuencia de números comprendidos en el rango de 5 a 60. La secuencia termina cuando se lee el número 24. Informar cuantas veces apareció cada número.

3. Se lee una sucesión de datos de a lo sumo 100 alumnos. De cada alumno se conoce nombre y nota. Informar los nombres de aquellos alumnos que superen el promedio del grupo. La lectura termina con el alumno de nombre ZZZ.

2. Se lee una secuencia de letras minúsculas que termina en punto. Informar la cantidad de veces que aparece cada letra.

Estructura de datos-ARREGLO –

EJERCICIO 3

Page 69: Clase10-Vectores_2011

Estructura de datos-ARREGLO –

EJERCICIO 3

Program Ej3;Const numdatos = 100;type rango=0..numdatos; str20 = string [20]; alumno = record nombre : str20; nota : real; end; ListaAlum = array [1.. numdatos] of alumnos;var datos: ListaAlum; dimL: rango; suma,promedio : Real;

Page 70: Clase10-Vectores_2011

Estructura de datos-ARREGLO –

EJERCICIO 3

begin {Principal} Leo_y_Sumo_Datos (datos , suma, dimL);

promedio := suma / dimL;

for i := 1 to dimL do if (datos[i].nota > promedio) then WriteLn (datos[i].nombre, ´ ´, datos[i].nota )end;

Page 71: Clase10-Vectores_2011

Estructura de datos-ARREGLO –

EJERCICIO 3

procedure Leo_y_Sumo_Datos (var dat: ListaAlum;var sum:Real;var DimL: rango);Var alu: alumno;begin sum := 0; dimL:= 0; leerAlumno (alu); while (alu.nombre <> ‘zzz’) and (dimL < numdatos)do begin dat[dimL+1]:= alu; sum := sum + dat[dimL+1].nota; dimL:= dimL +1; leerAlumno (alu); endend;