Sunteți pe pagina 1din 48

Tema 5: Tipos de datos estructurados

Mara de la Paz Guerrero Lebrero


Curso 2015 / 2016
Grado en Matemticas
maria.guerrero@uca.es

Dr. Pedro Galindo Riao

Tema 5: Tipos de datos estructurados

Estructuras de datos
En anteriores lecciones, hemos visto cmo escribir instrucciones
complejas a partir de instrucciones simples
Hasta ahora hemos visto datos simples, que ocupan una posicin
de memoria

enteros
reales

caracteres
lgicos

De igual forma que podemos componer instrucciones, vamos a


poder componer datos complejos a partir de datos simples

Tema 5: Tipos de datos estructurados

Estructuras de datos
Las E.D. ms importantes son:
Estructuras Matriciales
Vectores (1xN)
Matrices (MxN)
Matrices multidimensionales (MxNxPxQx...)
Cadenas de caracteres

Registros (tema siguiente)


Ficheros (tema siguiente)

Tema 5: Tipos de datos estructurados

Estructuras de datos
Las E.D. ms importantes son:

Registros (tambin llamados estructuras)


Estructuras Matriciales
Vectores (1xN)
Matrices (MxN)
Matrices multidimensionales (MxNxPxQx...)
Cadenas de caracteres

Ficheros (tema siguiente)

Tema 5: Tipos de datos estructurados

Vectores
Es una E.D. constituida por varios datos del mismo tipo,
agrupados bajo un nombre comn
Lo declararemos de la siguiente forma:
<tipo> <nombre>[<numero de elementos>]

Ejemplos:
int A[10];
char dni[8];
char nombre[40];
complejo V[10];

Tema 5: Tipos de datos estructurados

Vectores : representacin
Sea la declaracin

int A[4]
A[0]

A[1]

A[2]

A[3]

En algunos lenguajes, el primer elementos es A[0], y el limo es


A[3]. (Esto ser lo que usaremos nosotros)
En otros lenguajes, el primer elementos es A[1], y el limo es A[4]
En algunos lenguajes es incluso posible indicar al declarar la
variable vector cul es el primer y ltimo ndice permitidos

Tema 5: Tipos de datos estructurados

Vectores: almacenamiento interno


Los elementos de un vector ocupan
p o s i c i o n e s c o n s e c u t iv a s d e
memoria
Indices negativos o mayores que 3
(en este caso) hacen que se
acceda a otras posiciones de
memoria

int A[4];
A[0]
A[1]
A[2]
A[3]

Tema 5: Tipos de datos estructurados

Vectores: acceso a un elemento


El acceso a un elemento de un vector se realiza por su posicin
relativa al comienzo del mismo
Para acceder a un elemento de un vector, tanto para leer su
contenido, como para asignarle un nuevo valor, se escribe el
nombre de la variable, y la posicin entre corchetes de la siguiente
forma:
<nombre de variable>[<posicion>]
Ejemplo:
int a[3],b[30];
a[0] = 3.5;
a[1] = a[0];
a[2] = a[0];
for (i=0;i<30;i++) B[i]=0;

Tema 5: Tipos de datos estructurados

Error habitual - fuera de rango


Consiste en acceder a posiciones del vector incorrectas,
debido a :
Indices menores que el menor ndice permitido (V[-3])
Indices mayores que el mayor ndice permitido (V[28])

Un acceso fuera de rango produce efectos inesperados, tales


como :

Cuelgue del ordenador


Bucles sin fin
Modificacin de los valores de otras variables
comportamientos extraos del programa

Tema 5: Tipos de datos estructurados

Operaciones con vectores


Las operaciones con vectores permitidas dependen del
lenguaje

Normalmente, no se permite ninguna operacin, y de existir


alguna, sta es la asignacin de un vector a otro del mismo
tipo

En C no se permite ninguna operacin sobre vectores


completos

Tema 5: Tipos de datos estructurados

Recorrido de un vector
Dado que el acceso a los elementos de un vector se hace elemento
a elemento, y que se conoce a priori su tamao, es muy frecuente
acceder a sus elementos con un bucle DESDE

Ejemplo : Asignar 0 a todos los elems. de un vector de tamao N

for (i=0;i<N;i++) A[i]=0;

Tema 5: Tipos de datos estructurados

Recorridos habituales de un vector


Asignar a un vector de tamao N los valores 1,2,...

for (i=0;i<N;i++)
A[i] = i+1;
Asignar valores aleatorios

for (i=0;i<N;i++)
A[i]=rand();
Rotar sus valores hacia la izquierda

aux = A[0];
for (i=0;i<N-1;i++){
A[i]=A[i+1];
}
A[N-1]=aux;

Tema 5: Tipos de datos estructurados

Problemas propuestos
Criba de Eratstenes para el clculo de los nmeros primos
Convertir nmeros romanos a decimal
Bsqueda

Secuencial
Binaria

Ordenacin

seleccin
burbuja
insercion
qsort

Calcular la mediana de un vector de datos

Tema 5: Tipos de datos estructurados

Estructuras de datos
Las E.D. ms importantes son:
Estructuras Matriciales
Vectores (1xN)
Matrices (MxN)
Matrices multidimensionales (MxNxPxQx...)
Cadenas de caracteres

Registros (tema siguiente)


Ficheros (tema siguiente)

Tema 5: Tipos de datos estructurados

Matrices
Es una E.D. similar al vector, es decir, constituida por varios
datos del mismo tipo, agrupados bajo un nombre comn,
pero donde el acceso se realiza por 2 ndices
El acceso a cada uno de los elementos se realiza por varios
ndices , que indican su posicin relativa en la fila y en la
columna
Lo declararemos de la siguiente forma:
<tipo> <nombre>[<numfilas>][<numcols>];

Ejemplos:
int A[10][20];
complejo V[10][5];

Tema 5: Tipos de datos estructurados

Matrices: acceso a un elemento


El acceso a un elemento de un vector se realiza
por su posicion, indicndose la fila y la columna
donde se encuentra
Para acceder a un elemento de un vector, tanto
para leer su contenido, como para asignarle un
nuevo valor, se escribe el nombre de la variable,
la fila entre corchetes, y la columna entre
corchetes de la siguiente forma:
<nombre de variable>[<posicion>] [<posicion>]

Tema 5: Tipos de datos estructurados

Matrices : representacin
Sea la declaracin
int A[2][3];
A[0][0]A[0][1]A[0][2]

A[1][0]A[1][1]A[1][2]

La primera dimensin es la fila, y la segunda la columna


Al igual que en los vectores, los rangos permitidos
dependen del lenguaje. En C empezaremos en 0.

Tema 5: Tipos de datos estructurados

Matrices: almacenamiento interno (por filas)


int A[2][3];

A[0] [0]
A[0] [1]
A[0] [2]
A[1] [0]
A[1] [1]
A[1] [2]

Tema 5: Tipos de datos estructurados

Recorrido de una matriz


Dado que el acceso a los elementos de una matriz se hace elemento
a elemento, y que se conoce a priori su tamao, es muy frecuente
acceder a sus elementos con un doble bucle DESDE
Ejemplo : Asignar 0 a todos los elems. de una matriz de tamao MxN

for(i=0;i<M;i++)
for (j=0;j<N;j++)
A[i][j]=0;

Tema 5: Tipos de datos estructurados

Asignacin de valores a una matriz


Analizar cmo asignar los siguientes valores a una matriz:

0
1
2
3

1
2
3
4

2
3
4
5

3
4
5
6

4
5
6
7

0
1
2
3

1
0
1
2

2
1
0
1

3
2
1
0

4
3
2
1

0
1
2
3

1
1
2
3

2
2
2
3

3
3
3
3

4
4
4
4

6
4
1
0

6
4
1
1

6
4
4
4

6
6
6
6

8
8
8
8

Tema 5: Tipos de datos estructurados

Otros recorridos de una matriz


Asignar valores aleatorios

for(i=0;i<M;i++)
for (j=0;j<N;j++)
A[i][j]=random(100)+1;

Tema 5: Tipos de datos estructurados

Transponer una matriz


Solucin errnea

for (i=0;i<N;i++)
for (j=0;j<N;j++)
aux = A[i][j];
A[i][j] = A[j][i];
A[j][i] = aux;

Por qu ? Qu hace el cdigo anterior?

Tema 5: Tipos de datos estructurados

Multiplicar dos matrices


Sean las matrices AMxN y BNxP, calcular CMxP como el producto de la
matriz A por la matriz B
for (i=0;i<M;i++){
for (j=0;j<P;j++){
suma=0;
for(k=0;k<N;k++){
suma=suma+A[i][k]*B[k][j];
C[i][j]=suma;
}
}

Tema 5: Tipos de datos estructurados

Operaciones con matrices


Las operaciones con matrices permitidas dependen del
lenguaje

Normalmente, no se permite ninguna operacin , y de existir


alguna permitida, sta es la asignacin de una matriz a otra
del mismo tipo

En C no se permite ninguna operacin sobre matrices


completas

Tema 5: Tipos de datos estructurados

Problemas propuestos
Calcular la inversa de una matriz ANxN utilizando eliminacin gaussiana de forma
anloga al determinante
Resolucin de sistemas de ecuaciones lineales
Juego de la vida (John Conway). Cuatro reglas:

Un organismo nace en una celda vaca si est rodeada por 3 vecinos vivos
Un organismo sobrevive con 2 3 vecinos vivos
Un organismo con 4 ms vecinos vivos muere por superpoblacin.
Un organismo con 0 1 vecino vivo muere de soledad

Encontrar submatriz en una matriz


Encontrar nmero de submatrices simtricas en una matriz
Escribir un cuadrado mgico de orden N (N impar). Comenzar con 1 en el
cuadrado central superior. Moverse hacia arriba y a la derecha. Si la
casilla est ocupada, continuar en la que est debajo.

Tema 5: Tipos de datos estructurados

Estructuras de datos
Las E.D. ms importantes son:

Registros (tambin llamados estructuras)


Estructuras Matriciales
Vectores (1xN)
Matrices (MxN)
Matrices multidimensionales (MxNxPxQx...)
Cadenas de caracteres

Ficheros (tema siguiente)

Tema 5: Tipos de datos estructurados

Matrices multidimensionales
Es una E.D. similar a las matrices, pero con ms de 2
dimensiones
El acceso a cada uno de los elementos se realiza por
tantos ndices como dimensiones , que indican su
posicin relativa en cada dimensin
Lo declararemos de la siguiente forma:
<tipo> <nombre>[<numdim1>][<numdim2>]... >][<numdimn>]

Ejemplo:
int cubo_rubik[3][3][3]

Se suelen emplear tantos bucles como dimensiones


tenga la matriz multidimensional

Tema 5: Tipos de datos estructurados

Estructuras de datos
Las E.D. ms importantes son:

Registros (tambin llamados estructuras)


Estructuras Matriciales
Vectores (1xN)
Matrices (MxN)
Matrices multidimensionales (MxNxPxQx...)
Cadenas de caracteres

Ficheros (tema siguiente)

Tema 5: Tipos de datos estructurados

Cadenas de caracteres
No son ms que vectores de caracteres
Nos permitirn almacenar en un vector de N elementos, cadenas
de caracteres de longitud N-1
Los caracteres vlidos del vector son todos aquellos desde el
comienzo hasta que hay un elemento cuyo cdigo ASCII es el 0
Cadena vlida
Caracteres

Codio ASCII

76

97

32

112

101

122

97

114

Tema 5: Tipos de datos estructurados

Cadenas de caracteres
En C, una cadena de caracteres se declara como un
vector de chars
char cadena[80];
El carcter "fin de cadena" es aquel cuyo cdigo ascii
es 0
Las funciones de manejo de cadenas se encuentran
en la librera <string.h>

Tema 5: Tipos de datos estructurados

Cadenas de caracteres : operaciones


Las funciones ms usuales son:

Lectura desde el teclado

(gets)

Escritura en pantalla

(puts)

Copiar en una cadena un valor

(strcpy)

Extraer una subcadena

(strstr)

Concatenar dos cadenas en una tercera

(strcat)

Obtener la longitud de una cadena

(strlen)

Tema 5: Tipos de datos estructurados

Cadenas de caracteres : operaciones


La mayora de los lenguajes incorporan una librera de
funciones para el manejo de cadenas
Las funciones incluidas suelen ser :

Lectura desde el teclado


Escritura en pantalla
Copiar en una cadena un valor
Extraer una subcadena
Asignar a una subcadena un valor
Concatenar dos cadenas en una tercera
Obtener la longitud de una cadena
etc., etc.

Tema 5: Tipos de datos estructurados

Problemas propuestos
Reescribir todas las funciones de manejo de cadenas
vistas
Realizar la funcin
insertar(cadena,subcadena,posicion)
Realizar la funcin encontrar(cadena,subcadena):int
Invertir una cadena sin usar ninguna cadena auxiliar
Determinar si una cadena es palndroma

Tema 5: Tipos de datos estructurados

Paso de E.D. como parmetros


Datos simples y estructuras
Directamente, slo se pueden pasar por valor
Si se quiere pasar un dato simple o una estructura por
referencia es preciso la utilizacin de punteros

Vectores y matrices
Slo se pueden pasar por referencia
No es posible de ninguna forma, directa o indirecta, pasar un
vector o matriz por valor

Tema 5: Tipos de datos estructurados

Paso de vectores como parmetros


float A[10];
void inicializa1(float A[],int N){
int i;
for (i=0;i<N;i++) A[i]=0;
}
void inicializa2(float A[10],int N){
int i;
for (i=0;i<N;i++) A[i]=0;
}
...
float MiMatriz[10];
...
inicializa1(MiMatriz,10);
...

Opcin A

Opcin B

Tema 5: Tipos de datos estructurados

Paso de matrices como parmetros


float A[10][5];
Opcin A

void inicializa1(float A[][5],int M, int N);

Opcin B

void inicializa2(float A[10][5],int M, int N);

inicializa1(M,10,5);

Llamada

Tema 5: Tipos de datos estructurados

E.D. como parmetros de salida


C permite que una funcin devuelva datos simples y/o
estructuras
C no permite que una funcin devuelva vectores o matrices
Para devolver una matriz se puede utilizar el truco de
"encajar" la matriz en una estructura

Tema 5: Tipos de datos estructurados

Problemas propuestos
Reescribir todas las funciones de manejo de cadenas vistas
Realizar la funcin insertar(cadena,subcadena,posicion)
Realizar la funcin encontrar(cadena,subcadena):int
Invertir una cadena sin usar ninguna cadena auxiliar
Determinar si una cadena es palndroma
Leer una cadena, y escribir cuntas veces aparece cada una
de sus letras

Tema 5: Tipos de datos estructurados

Bsqueda y ordenacin

Tema 5: Tipos de datos estructurados

Mtodos de Bsqueda
Se trata de resolver el problema de encontrar un elemento
dado en una E.D.
Reduciremos el problema a buscar un elemento en un vector
Es fcil extender los principios explicados a otras E.D.
Los mtodos bsicos de bsqueda sobre vectores son:
Bsqueda lineal
Bsqueda binaria

Tema 5: Tipos de datos estructurados

Bsqueda lineal
Consiste en recorrer de forma secuencial todos los elementos del vector. El pseudocdigo es:

FUNC busqlineal(int x[], int N, int datobuscado):int{


int i, posicion
posicion -1
DESDE i 0 HASTA N-1 {
SI (x[i] = datobuscado) posicion i;
}
devolver(posicion);
}
NOTA : En los sucesivos programas supondremos que la funcin devuelve la posicin del dato buscado, o -1 si no est

Tema 5: Tipos de datos estructurados

Bsqueda lineal mejorada (I)


Deberamos interrumpir el bucle cuando hayamos encontrado el dato. El pseudocdigo es :

FUNC busqlineal(int x[], int N, int datobuscado):int{


int i
logico encontrado
i 0
encontrado FALSO
MIENTRAS (i < N) AND (NOT encontrado) {
SI (x[i] = datobuscado){
i posicion
}
devolver(posicion)
}

Tema 5: Tipos de datos estructurados

Bsqueda lineal mejorada (II)


Si sabemos que el vector est ordenado, deberamos interrumpir
el bucle cuando hayamos encontrado el dato o bien cuando el
dato actual sea menor que el buscado.

Se propone como ejercicio realiza el pseudocdigo


correspondiente

Tema 5: Tipos de datos estructurados

Bsqueda binaria
Slo es aplicable a vectores ordenados
Es preciso que:
Archivo ordenado por clave
Registros de longitud fija

Bsqueda, partir el archivo a la mitad y comparar la clave.


Si N es el n de registros, el nmero medio de bsquedas
ser del orden de log2(N)
Se mejora la bsqueda secuencial (orden N)

Tema 5: Tipos de datos estructurados

Pseudocodigo bsqueda binaria


inicio = 0;
final = n-1;

while(inicio <= final){

medio = round((inicio+final)/2);

if(datobuscado == v[medio])

return (medio);

else{

if (datobuscado > v[medio])

inicio = medio+1;
else

final = medio-1;

return -1;

Mtodos de ordenacin

Tema 5: Tipos de datos estructurados

Ordenacin por burbuja


for(j = 1; j < n ; j++){
for(i = 0; i < n - j; i++){
if(pvector[i] > pvector[i+1]){
aux = pvector[i]
pvector[i] = pvector[i+1];
pvector[i+1] = aux;
}
}
}

Tema 5: Tipos de datos estructurados

Ordenacin por seleccin

for(i=0; i<n-1; i++){


for(j=i+1, menor=i; j < n; j++)
if(v[j] < v[menor]) menor=j;
aux=v[i];
v[i]=v[menor];
v[menor]=aux;
}

S-ar putea să vă placă și