Title: Tema 7 Inform
1Tema 7 Informática Topografía
- Estructuras de datos compuestas
- Objetivos
- Conocer el concepto de vector
- Conocer las operaciones que pueden realizarse con
ellos - Aplicar ambos conceptos a la resolución de
problemas - Conocer el concepto de matriz bidimensional y
multidimensional
2- Definición de vector
- Operaciones con vectores
- Búsqueda
- Ordenación
- Definición de vector de caracteres
- Operaciones carácter a carácter
- Funciones de cadenas de caracteres
3Tipos de datos
- simples
- char, int, long int, float, double
- compuestos
- vector
- los datos almacenados son todos del mismo tipo
- pueden numerarse
- permiten tratamiento homogéneo e implícito (uso
de bucles)
4Definición de vector
- Conjunto de datos homogéneos
- Tipificación
- Elemento Cada uno de las unidades que forman el
vector - Rango Cantidad de elementos que contiene
- Índice Número identificativo del elemento
- Rango 10
0 1 2 3 4 5 6 7 8 9
12 01 22 56 32 09 4 3
5Definición de vector
- Declaración
- tipo vectorRANGO
- Inicialización
- int datos3 1,4,8
- Acceso a los elementos
- datos0 a
- a datos2
- b a datosN-1 - 5
- Entrada
- scanf (d, datos0)
- Salida
- printf (d, datos0)
Índice
Elemento
6Programa que genera un vector para almacenar 10
números enteros leídos desde teclado y lo
visualiza una vez creado.
include ltstdio.hgt define RANGO 10 main ()
int numerosRANGO, i for (i0ilt RANGOi)
printf ("\n Introduce un numero ") scanf
("d",numerosi) for (i0iltRANGOi)
printf("\nEl valor del elemento d es d", i1,
numerosi)
7Búsqueda en vectores
- Consiste en determinar
- Qué elemento cumple una determinada condición
- Igual a un valor dado
- Si supera un umbral (positivo o negativo)
- Otras más sofisticadas
- Su posición. Recordar el elemento
- Métodos de búsqueda
- Secuencial. Se recorren todos los elementos desde
el primero hasta el último o hasta el localizado.
Cuesta N pasos - Binaria o dicotómica. Partiendo de un vector
ordenado mediante algún criterio, se localiza el
elemento en log2(N) pasos - N es el rango del vector
8Búsqueda en vectores
- Métodos de búsqueda secuencial
- Programa que sustituya los ceros por unos
- define RANGO 100
- ....
- main()
- int i, VRANGO
- ....
- for (i0iltRANGOi)
- if (Vi 0)
- Vi 1
- ....
9Métodos de búsqueda binaria
La búsqueda binaria requiere menos comparaciones
(iteraciones) que la secuencial pero para
realizar la búsqueda se requiere que el vector
este previamente ordenado.
10Búsqueda Binaria
- Programa que averigüe si existe una persona con
un DNI dado - define TOTAL_PERSONAS 100
- main()
- long i, DNI, PersonasTOTAL_PERSONAS
- printf(Indique por favor el DNI a liocalizar )
- scanf(d, DNI)
- /comienzo de bloque de búsqueda/
- i Salto TOTAL_PERSONAS / 2
- while (Salto ! 0)
-
- if (Vi lt DNI)
- i Salto /Hay que buscar valores mayores/
- else if (Vi gt DNI)
- i - Salto /Buscar valores menores/
- else break /se ha encontrado a la
persona/ - Salto Salto / 2
- /Del while/
11Ordenación de vectores
- Organizar los elementos de un vector de acuerdo
con un criterio de ponderación - Métodos
- inserción directa
- selección
- burbuja
12Método de inserción directa
- Similar a como ordena sus cartas un jugador
- Proceso
- dividir el vector en dos partes
- tomar el primer elemento de la secuencia origen e
insertarlo en el lugar adecuado de la secuencia
destino.
13Método de inserción directa
- include ltstdio.hgt
- define RANGO
- main()
- / declaracion de
- variables /
- / lectura
- del vector /
- / ordenacion
- del vector /
-
-
for (i1 iltRANGO i) x ai fin
FALSE j i-1 while (!fin jgt0)
fin (xgtaj) if (!fin)
aj1aj j--
aj1 x
14Vector de caracteres
- String o cadena de caracteres
- Declaración
- char nombre_vectorRANGO1
- Inicialización
- char ciudad9 Valencia
- char ciudad Valencia
- char ciudad30 Valencia
h o l a \0
V a l e n c i a \0
21 char
15Operaciones carácter a carácter
- Asignación
- char ciudad5
-
- ciudad0 L
- ciudad1 u
- ciudad2 g
- ciudad3 o
- ciudad4 \0
- Lectura/Escritura
- scanf (c, ciudad3)
- printf (c, ciudad2)
16Funciones de cadenas de caracteres
- Lectura/Escritura
- char ciudadRANGO
- /solo una palabra/
- scanf (s, ciudad)
- printf (s, ciudad)
- /una o varias palabras/
- gets (ciudad)
- puts (ciudad)
17Funciones de cadenas de caracteres (2)
- Biblioteca de cadenas
- include ltstring.hgt
- Asignación de cadenas
- char strcpy(destino, origen)
- Longitud de una cadena
- long int strlen(nombre)
- char nombre 20
- strcpy (nombre, Jorge Bueno)
- printf (La longitud del vector es ld\n,
strlen (nombre))
18Funciones de cadenas de caracteres (3)
- Comparación de cadenas
- int strcmp(cadena1,cadena2)
- / lt0 si c1ltc2, 0 si c1c2, gt0 si c1gtc2 /
- char nombre 20, nombre_aux20
- strcpy (nombre, ..... )
- strcpy (nombre_aux, ..... )
- rdostrcmp (nombre, nombre_aux)
- if (rdo 0) printf (Los nombres son iguales
\n) - else if (rdo lt 1)
- printf (El nombre s precede alfabeticamente a
s \n, nombre, nombre_aux) - else printf (El nombre s precede
alfabeticamente a s \n, nombre_aux, nombre)
19Funciones de cadenas de caracteres (4)
- Concatenación de cadenas
- char strcat(destino, origen)
- char nombre MAX, apellidoMAX
- strcpy (nombre, Jorge )
- strcpy (apellido, Bueno)
- strcat (nombre, apellido)
- printf (El nombre completo es s\n, nombre)
20Funciones de cadenas de caracteres (5)
- Búsqueda de caracteres
- char strchr(cadena,carácter)
- char nombre30, caracter
- strcpy (nombre, Jorge Bueno)
- printf (Introduce el caracter a buscar\n)
- caractergetchar()
- if (strchr (nombre, caracter)!NULL)
- printf (La cadena encontrada a partir del
caracter c es s\n, caracter, strchr (nombre,
caracter) - else printf (No se ha encontrado el caracter
c\n, caracter)
21Funciones de cadenas de caracteres (6)
- Búsqueda de cadenas
- char strstr(busqueda, buscada)
- char nombre 20
- strcpy (nombre, Jorge Bueno)
- printf (La cadena encontrada es s\n, strstr
(nombre, Bue)) - / La cadena encontrada es Bueno /
22Vectores bidimensionales
- Vector cuyos elementos son vectores
- Declaración
- tipo_dato nombre_vectorrango1rango2
- Inicialización por filas
- int X43 2, 4, 6,
- 8, 10, 12,
- 14, 16, 18,
- 20, 22, 24
23Vectores bidimensionales (2)
- Acceso matriz31
- Entrada scanf (f, matrizxy)
- Salida printf (f, matrizxy)
- Expresiones matrizxymatrizx1y2
24Vectores bidimensionales (2)
- Acceso matriz31
- Bucles anidados para tratar cada elemento
- Paso de matrices como argumentos de funciones
- El argumento formal debe incluir la
especificación de rango2. - tipo_dato nombre_funcion (tipo_dato
nombre_vectorrango2)
25Vectores bidimensionales (3)
- Se realiza un bucle de barrido por cada dimensión
de la matriz - Para cada posición en una dimensión, se recorren
todos los elementos del resto de dimensiones
(Bucles anidados)
X
....
....
X / Y
....
Y
....
26Vectores bidimensionales (4)
- Bucles anidados para tratar cada elemento
- include ltstdio.hgt
- define N 3
- void main()
- int i, j, matrizNN
- / Lectura de los elementos /
- for (i0iltNi)
- for (j0jltNj)
- printf(Elementodd,i,j)
- scanf (d, matrizij)
-
- / Impresión de los elementos /
- for (i0iltNi)
- for (j0jltNj)
- printf(Elementoddd,
- i,j,matrizij)
27Vectores bidimensionales Suma de matrices
include ltstdio.hgt define N 3 void main() int
m1NN, m2NN, m3NN int i,
j /Lectura de los elementos de
m1/ ... /Lectura de los elementos de
m2/ ... /Suma de matrices/ for
(i0iltNi) for (j0jltNj)
m3ij m1ij m2ij /Impresión de
los elem. de m3/ ...
28Vectores bidimensionales Traspuesta de una
matriz
include ltstdio.hgt define N 3 void main() int
mNN, mtNN int i, j /Lectura de los
elementos de m/ ... /Traspuesta de m/ for
(i0iltNi) for (j0jltNj)
mtji mij /Impresión de los elem. de
mt/ ...
29Vectores multidimensionales
- Vectores que contienen vectores, que a su vez
contienen vectores, etc. - Declaración
- tipo_dato nombre_vectorrg1rg2rgN
- Inicialización
- int 2341,2,3,4,
- 5,6,7,8,
- 9,0,1,2 ,
- 2,4,6,8,
- 1,3,5,7,
- 0,9,3,4
30- Estructuras de datos
- Definición y declaración de estructuras
- Estructuras anidadas
- Inicialización de estructuras
- Operaciones sobre estructuras
- Definición de tipos de usuario
- Paso de estructuras como argumentos de funciones
- Estructura union
31Definición
- almacena datos de tipos distintos
- declaración
- struct nombre_estructura
- tipo_dato miembro_1
- tipo_dato miembro_2
-
- tipo_dato miembro_n
-
32Declaración
Declaración implícita struct nombre_estructura
tipo_dato miembro_1 tipo_dato
miembro_n variable1, variable2 Declaración
explícita struct nombre_estructura tipo_dato
miembro_1 tipo_dato miembro_n struct
nombre_estructura variable1, variable2
33Ejemplos de declaraciones
struct tarjetas long int NumTarjetas char
TipoCuenta char Nombre80 float
Saldo struct tarjetas Cliente1,
Cliente2 sizeof(Cliente1) 89
Cliente1
NumTarjetas NumTarjetas NumTarjetas NumTarjetas TC Nombre Saldo Saldo Saldo Saldo
Resto de memoria
Resto de memoria
4 bytes
80 bytes
4 bytes
34Ejemplos de declaraciones
/Declaración de un struct dentro de otro
struct/ struct Cliente long int
num_tarjetas char tipo_cuenta char
nombre80 float saldo cliente1,
cliente2 struct int cod_ciudad char
nom_ciudad80 int habitantes char
provincia80 poblacion
35Estructuras anidadas
struct fecha int mes int dia int
anyo struct tarjetas long int
num_tarjeta char tipo_cuenta char
nombre80 float saldo struct fecha
validez cliente1, cliente2
36Inicialización
- struct tarjetas cliente 25634, A, Pedro
Garcia, - 120000, 1-1-2000
- struct tarjetas clientes20
- 27645, B, Maria Perez, 20000, 10-30-1999,
- 45785, A, Juan Martinez, 13090, 4-25-2003
-
-
37Operaciones sobre estructuras (1)
- Acceso variable.miembro
- Ejemplos
- cliente1.saldo cliente1.validez.anyo
- clientes3.nombre clientes.nombre0
-
- Asignación
- clientes0.saldo 0.0
- clientes10.saldo clientes10.saldo
100000 - clientes4.validez.anyo 1999
38Operaciones sobre estructuras (2)
- Lectura y escritura
- gets (clientes5.nombre)
- scanf (d, clientes7.validez.dia)
- printf (c, clientes8.tipo_cuenta
- Copia de los valores de estructuras
- clientes4 clientes8
39Definición de tipos de datos de usuario
- typedef tipo_dato nombre_tipo
- typedef char caracter
- caracter A, B, C
- typedef struct
- long int num_tarjeta
- char tipo_cuenta
- char nombre80
- float saldo
- tarjetas
- tarjetas clientes20
-
40Paso de estructuras como argumentos de funciones
- Paso por valor
- Se puede pasar uno o más miembros de la
estructura o la estructura completa - include ltstdio.hgt typedef struct
- define N 100 long int num_tarjeta
- char tipo_cuenta
- typedef struct char nombre80
- int mes float saldo
- int dia fecha validez
- int anyo tarjetas
- fecha
41Paso de estructuras como argumentos de funciones
(2)
- tarjetas modificar_tarjeta (tarjetas cli)
- printf (\nNumero de tarjeta ld,
cli.num_tarjeta) - printf (\nTitular s, cli.nombre)
- printf (\nTipo de cuenta actual c,
cli.tipo_cuenta) - printf (\nTipo de cuenta nuevo )
- scanf (c, cli.tipo_cuenta)
- printf (\nSaldo actual f, cli.saldo)
- printf (\nSaldo actualizado )
- scanf (f, cli.saldo)
- return (cli)
- void main()
- int i
- tarjetas clienteN /inicialización del
vector/ - for (i0 iltN i) clienteimodificar_tarjeta(
clientei)
42Estructura union
- Declaración
- union nombre_union
- tipo_dato miembro_1
-
- tipo_dato miembro_n
-
- union
- int NumEntero
- float NumReal
- numero
- sizeof(numero) 4
Numentero ?? ??
NumReal NumReal NumReal