PDF de programación - 5. Tipos de datos estructurados

Imágen de pdf 5. Tipos de datos estructurados

5. Tipos de datos estructuradosgráfica de visualizaciones

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
  • Links de descarga
http://lwp-l.com/pdf16280

Comentarios de: 5. Tipos de datos estructurados (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad