Publicado el 13 de Julio del 2019
544 visualizaciones desde el 13 de Julio del 2019
635,3 KB
28 paginas
Creado hace 8a (27/01/2016)
5. Tipos de datos estructurados
1/55
Agrupando datos
Los tipos que conocemos (enteros, reales, bool, char, string)
son tipos simples: una variable de ese tipo almacena un único
valor de ese tipo.
Pero en muchos problemas es adecuado agrupar varios valores
en una misma estructura (referenciada por una variable), i.e.,
una misma variable almacena varios valores!
La información a agrupar puede ser:
mínimas alcanzadas en una población a lo largo de una semana
Arrays (vectores o matrices)
Homogénea (del mismo tipo). Por ejemplo: temperaturas
agrupamiento de valores de tipo double’s
Heterogénea (de distinto tipo). Por ejemplo: datos de una
persona (nombre, teléfono, sexo, dirección, edad, . . . )
agrupamiento de valores de tipo string’s, char’s, int’s, . . .
Structs (estructuras o registros)
2/55
Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM Arrays
3/55
Arrays: un primer ejemplo
Ejemplo: temperaturas mínimas alcanzadas en una población a
lo largo de una semana.
Para leer esas temperaturas podríamos utilizar 7 variables:
double temp1, temp2, temp3, temp4, temp5, temp6, temp7;
temp1 = pideDato("Temperatura: ", −20, 50); // método del cap. anterior
temp2 = pideDato("Temperatura: ", −20, 50);
... // temp3, temp4, temp5, temp6
temp7 = pideDato("Temperatura: ", −20, 50);
Con un array podemos hacer:
double [ ] temp;
temp = new double[7]; // con 7 elementos
for (int i=0; i<7; i++) // el elemento i−esimo se referencia como temp[i]
// array de eltos de tipo double
temp[i] = pideDato("Temperatura: ", −20, 50);
Se compacta y clarifica el código. Esencialmente es como un
vector de 7 elementos (temp0, . . . , temp6) (ojo, empieza en 0!)
4/55
Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM Un array es una estructura de almacenamiento de valores del
mismo tipo.
Con una sola variable podemos:
• referenciar todo el conjunto de valores
(temp representa el conjunto de temperaturas de la semana)
• y también referenciar elementos individuales
(temp[0]: temperatura del día 1,
temp[1] temperatura del día 2,
. . . ,
temp[6] temperatura del día 7)
5/55
Arrays: declaración, creación, inicialización
Tres pasos:
Declaración: double [ ] temp;
Los corchetes [ ] indican que temp es una variable de tipo
array de. . . en este caso de elementos de tipo double
Creación: temp = new double[7];
Se crea (se solicita hueco en memoria) para albergar 7
elementos de tipo double en la variable temp.
Inicialización:
temp[i]=«expresión de tipo double»
para cada índice i del conjunto 0,. . . ,6
A cada una de las componentes del vector (o elementos del
vector) se le asigna un valor.
Cada componente temp[0],...,temp[6] se comporta a todos
los efectos como una variable de tipo double.
6/55
Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM
Arrays: declaración+creación+inicialización
Es posible compactar la declaración y la creación en una sola
línea:
double[] temp = new double[7];
Declarara un array temp de (elementos de) tipo double y lo crea
con 7 "huecos".
Es posible incluso declararlo e inicializarlo a la vez (la creación
queda implícita):
double[] temp = {2.5, 3.8, 4, 5, 9, 4, 2.3}; // new double[7] queda implícito
En este caso el tamaño (7) queda determinado por el
número de elementos con que se inicializa.
Esto es similar a la declaración+inicialización de una
variable convencional.
7/55
Arrays: declaración y creación
En general, la declaración de un array se hace como:
«tipo definido» [ ] «identificador»;
donde «tipo definido» puede ser cualquier tipo válido (int,
long, double, float, string, char, bool,....
Es decir, podemos declarar:
arrays de cualquier cosa,
pero con todos los elementos del mismo tipo (definido)
La creación se hará de la forma:
«identificador» = new «tipo»[«entero»];
Crea un array de tamaño «entero» (reserva hueco para
«entero» valores de tipo «tipo»).
8/55
Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM Componentes de un vector
Si definimos:
«tipo» [ ] a;
cada componente a[i] se comporta a todos los efectos como
una variable de tipo «tipo», i.e., admite todas las operaciones
de dicho tipo.
Por ejemplo, si hacemos;
int [] vec = new int[10];
vec[6] corresponde al elemento 7 del array y se comporta a todos los
efectos como una variable de tipo int: se le puede asignar un valor
entero, comparar con otro entero, escribir en pantalla, incrementar,
leer su valor de teclado, etc. (Se puede incluso, pasar como parámetro
a un método que espere un int. . . volveremos sobre ello).
9/55
10/55
Teniendo:
int [] vec = new int[10];
Qué pasa si hacemos:
programa compila!!
vec[-1], vec[11], vec[10] no tienen sentido . . . pero el
No da ningún error en tiempo de compilación
Pero da un error en tiempo de ejecución:
Unhandled Exception:
System.IndexOutOfRangeException: Index was outside the
bounds of the array. at arrays.MainClass.Main () ...
...
vec[3.2] = 4;? error de tipo en tiempo de compilación
vec[(6+8) % 3] = 8; qué error da? ninguno!
vec[(6+8) % 7] = 3.2; qué error da? error de tipo en
tiempo de compilación
y vec[ vec[1] ]? depende. Ninguno en tiempo de
compilación. En ejecución, depende de si el valor de v[1]
está en el rango 0..9
Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM Usando arrays
Recogida de temperaturas de una semana y cálculo de la media:
double[] temp = new double[7];
double suma;
// pide temperatura de cada día (indicando el día ):
for (int i=0; i<7; i++)
temp[i] = pideDato("Temperatura del día "+ (i+1), −20, 50);
suma = 0; // acumular de suma
for (int i=0; i<7; i++)
suma += temp [i];
Console.Write ("Media: " + suma/7);
por qué esta mal? está bien!
Temperatura del día 1 [-20,50]: 21,5
Temperatura del día 2 [-20,50]: 22,4
...
Temperatura del día 7 [-20,50]: 20,3
Media: 21,0428571428571
11/55
}
Temperatura máxima y mínima
Para la máxima:
double max = −100; // inicializamos con valor fuera del rango
for (int i = 0; i < 7; i++)
if (temp [i] > max) max = temp [i];
else max = max;
Es correcto? Sí. . . pero, cuántas malas ideas hay aquí?
la asignación max = max; denota un pésimo estilo de
programación
ahora, para calcular la mínima hacemos otro bucle
semejante? mejor aprovechar el mismo recorrido
también puede ser buena idea inicializar max = temp[0] y
luego arrancar el bucle desde i=1
double max = min = temp [0];
for (int i = 1; i < 7; i++) {
if (temp [i] > max) max = temp [i];
if (temp [i] < min) min = temp [i];
12/55
Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM Arrays de strings
Podemos mejorar la interfaz de usuario del programa anterior
fácilmente con un array de strings:
double[] temp = new double[7];
string[] diaSemana = {"lunes", "martes", "miércoles", "jueves", "viernes",
"sábado", "domingo"};
for (int i=0; i<7; i++)
temp[i] = pideDato("Temperatura del "+ diaSemana[i], −20, 50);
Temperatura del lunes [-20,50]: 12
Temperatura del martes [-20,50]: 15
Temperatura del miércoles [-20,50]: 16
Temperatura del jueves [-20,50]: 1
Temperatura del viernes [-20,50]: 8
Temperatura del sábado [-20,50]: 17
Temperatura del domingo [-20,50]: 21
Este vector con los nombre de los días de la semana se puede
reutilizar cada vez que queramos escribir un día de la semana.
13/55
Ejemplos
En los siguientes ejemplos consideramos el vector v declarado como:
int [] v = new int[10];
Inicializar v con los valores 0,1,. . . ,9:
for (int i=0; i<10; i++)
v[ i ] = i;
Inicializarlo con los valores en orden inverso 9,8,. . . ,0:
for (int i=9; i>0; i−−)
v[ i ] = i;
Por qué está mal? . . . porque sigue inicializando en orden
ascendente y además no alcanza la componente 0 la condición
de parada debería ser i>=0. Corregimos:
for (int i=0; i<10; i++)
// 9-i
v[i] = 10-i-1;
Está bien ahora? sí
14/55
Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM
Contar el número de positivos, negativos y de ceros de v:
int pos, neg, ceros ;
pos = neg = ceros = 0;
Para el mismo vector, determinar si todos sus elementos son positivos:
for (int i=0; i<10; i++)
if (v[ i]<0) neg++;
else if if (v[ i]>0) pos++;
else ceros++;
bool todosPos = true;
for (int i=0; i<10; i++)
if (v[ i]>0) todosPos = true;
else todosPos = false;
Incorrecto! Si v[9]>0, quedará todosPos = true aunque todos
los demás sean negativos!
Corregimos. . .
for (int i=0; i<10; i++)
if (v[ i]<=0) todosPos = false
bool todosPos = true;
15/55
[-1,...]? mejoramos al algoritmo con un while:
Correcto? Sí . . . eficiente? mejorable?
Qué pasa si el vector tiene 106 componentes y es de la forma
bool todosPos;
int i = 0;
// OJO: orden de las condiciones para no salirnos del rango del vector
while (i<10 && v[i]>0) i++;
// si sale con i=10 -> todos positivos; si no (i<10) no todos positivos
if (i<10) todosPos = false;
else todosPos = true;
Este patrón de búsqueda es muy utilizado (aprender bien!!)
Es crítico el orden de las condiciones en el while (evaluación de
circuito corto o perezosa): primero la comprobación de rango
i<10 (después resto de condiciones)
16/55
Jaime Sánchez. Sistemas Informáticos y Computación, UCMJaime Sánchez. Sistemas Informáticos y Computación, UCM Determinar si el vector v está ordenado en orden creciente?
bucle for o w
Comentarios de: 5. Tipos de datos estructurados (0)
No hay comentarios