Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Fundamentos de Informtica
Tema 6:
ETSI Industrial
1 Universidad de Mlaga
ETSI Industrial
2 Universidad de Mlaga
Tema 6:
Fundamentos de Informtica
ETSI Industrial
3 Universidad de Mlaga
Enteros
Naturales
Carcter
Simples
Reales
Arrays
Cadenas de caracteres
Registros
Estticos
Estructurados
Dinmicos
Ficheros
Listas, pilas, colas, rboles
Otros TAD
Fundamentos de Informtica
ETSI Industrial
4 Universidad de Mlaga
Tema 6:
Fundamentos de Informtica
ETSI Industrial
5 Universidad de Mlaga
EL TIPO ARRAY
Supongamos que un fabricante de mquinas de caf est
interesado en conocer la popularidad de las diferentes
combinaciones de caf que dispensan sus mquinas.
Las mquinas en cuestin disponen de cuatro botones
etiquetados como 1, 2, 3 y 4 junto con una nota que
explica la funcin de cada uno de ellos:
1.
2.
3.
4.
Fundamentos de Informtica
ETSI Industrial
6 Universidad de Mlaga
EL TIPO ARRAY
Fundamentos de Informtica
ETSI Industrial
7 Universidad de Mlaga
EL TIPO ARRAY
#include <iostream>
using namespace std;
int main()
{
int soloSin, soloCon, lecheSin,
lecheCon, seleccion;
soloSin = 0;
soloCon = 0;
lecheSin = 0;
lecheCon = 0;
cout << Seleccione bebida: ;
cin >> seleccion;
while(seleccion != 0)
{
switch(seleccin)
{
case 1: soloSin += 1; break;
case 2: soloCon += 1; break;
case 3: lecheSin += 1; break;
case 4: lecheCon += 1; break;
}
cout << Seleccione bebida: );
cin >> seleccion;
}
cout
cout
cout
cout
<<
<<
<<
<<
return 0;
}
Fundamentos de Informtica
ETSI Industrial
8 Universidad de Mlaga
EL TIPO ARRAY
Qu ocurre si la mquina se moderniza y se aaden ms
productos ?
1. Solo sin azcar
2. Solo con azcar
3. Solo 1 cucharadita azcar
4. Solo 2 cucharaditas azcar
5. Solo 3 cucharaditas azcar
6. Con leche sin azcar
7. Con leche 1 cucharadita azcar
8. Con leche 2 cucharaditas azcar
9. Con leche 3 cucharaditas azcar
10.T solo sin azcar
11.T solo 1 cucharadita azcar
12.... ETSI Industrial 9 Universidad de Mlaga
Fundamentos de Informtica
Jos Antonio Gmez Ruiz
EL TIPO ARRAY
#include <iostream>
using namespace std;
int main()
{
int soloSin, soloCon, lecheSin,
lecheCon, ... , seleccion;
soloSin = 0;
soloCon = 0;
lecheSin = 0;
lecheCon = 0;
...
cout << Seleccione bebida: ;
cin >> seleccion;
ETSI Industrial
while(seleccion != 0)
{
switch(seleccin)
{
case 1: soloSin += 1; break;
case 2: soloCon += 1; break;
case 3: conLeche += 1; break;
case 4: sinLeche += 1; break;
...
}
cout << Seleccione bebida: ;
cin >> seleccion;
}
cout
cout
cout
cout
<<
<<
<<
<<
...
return 0;
}
10 Universidad de Mlaga
ARRAYS UNIDIMENSIONALES
Un array es una coleccin finita de elementos del mismo tipo
(homogneos) ordenados por un ndice
El tamao de un array (nmero mximo de elementos) debe
especificarse en tiempo de compilacin:
usando una constante simblica o literal
el tamao mximo no cambia durante la ejecucin del programa
(estructura esttica)
Declaracin de un array unidimensional:
tipo_elemento
Fundamentos de Informtica
nombre_array[nmero_elementos];
ETSI Industrial
11 Universidad de Mlaga
ARRAYS UNIDIMENSIONALES
En C++, el primer elemento del array est indexado por la posicin 0
Los ndices son consecutivos hasta el tamao total menos uno
Se accede a cada elemento con el nombre del array seguido de su
ndice entre corchetes
Ejemplos:
valores[1]
int valores[8];
char palabra[5];
palabra[1]
Fundamentos de Informtica
ETSI Industrial
valores[5]
palabra[3]
12 Universidad de Mlaga
ARRAYS UNIDIMENSIONALES
Inicializacin y asignacin:
Inicializacin en la declaracin
Completa
vector
int vector[3]={5,0,4};
Incompleta
medias
int medias[5]={8,5};
Tamao automtico
int medias[]={2,3,-7,1};
medias
Asignacin en ejecucin:
-7
A un elemento
valores[3]=7;
valores
for(i=0;i<=7;i++) valores
valores[i]=i;
Fundamentos de Informtica
ETSI Industrial
13 Universidad de Mlaga
ARRAYS UNIDIMENSIONALES
No se permite la asignacin ni comparacin completas entre arrays:
int v1[3], v2[3];
...
v1 = v2;
for(i=0;i<=2;i++)
v1[i]=v2[i];
Imprevisible donde se
almacena el valor
ETSI Industrial
14 Universidad de Mlaga
ARRAYS UNIDIMENSIONALES
Solucin al problema de la mquina de caf
28
14
41
10 11 12 13
ETSI Industrial
T solo sin
T solo 1 azcar
T solo 2 azcar
T solo 3 azcar
15 Universidad de Mlaga
ARRAYS UNIDIMENSIONALES
#include <iostream>
#define N 11 // Para aadir bebidas slo cambio la constante
using namespace std;
int main()
{
int frecuencia[N],seleccion, bebida;
for(bebida=0; bebida<N; bebida++)
// inicializo las frecuencias
frecuencia[bebida]=0;
cout << Seleccione bebida: ;
cin >> seleccion;
while(seleccion != 0)
{ if (seleccion>=1 && seleccion<N) // Para evitar salirme
frecuencia[seleccion]++;
// del rango
cout << Seleccione bebida: ;
cin >> seleccion;
}
for(bebida=0; bebida<N; bebida++)
cout << \nBebida << bebida << = << frecuencia[bebida];
return 0;
}
Fundamentos de Informtica
ETSI Industrial
16 Universidad de Mlaga
ARRAYS UNIDIMENSIONALES
En memoria principal, en C++ los elementos de un array se
almacenan de forma contigua por filas
char palabra[5];
ndice
Direccin
int vector[5];
4
int a[5];
ETSI Industrial
17 Universidad de Mlaga
DEFINICIN DE TIPOS
Para mayor simplicidad y claridad en los programas, se pueden
crear sinnimos de tipos de datos.
Para ello se utiliza la palabra reservada typedef:
typedef
tipo_dato_definido
nuevo_nombre;
ETSI Industrial
18 Universidad de Mlaga
DEFINICIN DE TIPOS
Ejemplos de definicin de tipos de datos y posterior definicin
de variables:
typedef int TEntero;
TEntero numero, valor; /* numero y valor son dos variables
de tipo entero */
typedef bool TLogico;
TLogico es_positivo;
Fundamentos de Informtica
19 Universidad de Mlaga
ETSI Industrial
20 Universidad de Mlaga
Fundamentos de Informtica
ETSI Industrial
21 Universidad de Mlaga
En C/C++, un array
no se puede devolver
como retorno de una
funcin pero con el
paso por referencia
queda modificado
ETSI Industrial
22 Universidad de Mlaga
v2;
int
int
int
ETSI Industrial
23 Universidad de Mlaga
ARRAYS MULTIDIMENSIONALES
Un array multidimensional es un array que tiene ms de una
dimensin
Declaracin de un array multidimensional:
tipo_elemento
nombre_array[dim1][dim2]...[dimn];
Ejemplos
int m[5][4];
/* Array bidimensional de 5x4 (matriz)*/
float p[3][3][3]; /* Array tridimensional de 3x3x3 (cubo)*/
ETSI Industrial
24 Universidad de Mlaga
ARRAYS MULTIDIMENSIONALES
Para identificar un elemento de un array multidimensional, se debe
dar un ndice para cada dimensin, en el mismo orden que en la
declaracin. Los ndices van desde cero hasta la dimensin menos 1
Cada ndice se encierra en sus propios corchetes
matriz[1][5]
int matriz[3][10];
matriz
matriz[0][8]
10 11
12
Jos Antonio Gmez Ruiz
ARRAYS MULTIDIMENSIONALES
Inicializacin: existen dos formas de poner la lista de inicializacin
Todos los valores seguidos encerrados en un par de llaves
int matriz[2][3]={0,1,2,10,11,12};
Por partes
int matriz[2][3]={
{ 0, 1, 2 },
{ 10, 11, 12 }
};
ETSI Industrial
26 Universidad de Mlaga
ARRAYS MULTIDIMENSIONALES
/* Ejemplo de acceso a los elementos de un array multidimensional */
#include <iostream>
#define M 2
#define N 3
matriz[0][0] = 1
using namespace std;
matriz[0][1] = 2
matriz[0][2] = 3
int main()
matriz[1][0] = 4
{
matriz[1][1] = 5
int matriz[M][N]={{1,2,3} ,{4,5,6}};
matriz[1][2] = 6
int i,j;
for(i=0; i<M; i++)
for(j=0; j<N; j++)
cout << [ << i << ][ << j << ]= << matriz[i][j] << endl;
return 0;
}
Fundamentos de Informtica
ETSI Industrial
27 Universidad de Mlaga
ARRAYS MULTIDIMENSIONALES
Arrays multidimensionales como argumento en funciones
Las mismas consideraciones que para los arrays unidimensionales
(vase transparencia 20)
#include <iostream>
#define M 4
#define N 4
using namespace std;
typedef float TMatriz [M][N];
int main()
{
TMatriz m1,m2,m3;
...
prod_matrices(m1,m2,m3,M,N);
...
}
Fundamentos de Informtica
ETSI Industrial
28 Universidad de Mlaga
ARRAYS MULTIDIMENSIONALES
/* funcin que calcula el producto de dos matrices cuadradas N x N */
void prod_matrices(TMatriz a, TMatriz b, TMatriz &m ,int tam1,int tam2)
{
int i, j, k;
un array no se puede
for(i=0; i<tam1; i++)
devolver como retorno
for(j=0; j<tam2; j++)
de una funcin pero al
{
pasarse por referencia
queda modificado
m[i][j]=0.0;
for(k=0; k<tam; k++)
m[i][j] += a[i][k] * b[k][j];
}
}
Desarrollar como ejemplo un
j=1
b
*
m
=
i=2
Fundamentos de Informtica
Tema 6:
ETSI Industrial
29 Universidad de Mlaga
Fundamentos de Informtica
ETSI Industrial
30 Universidad de Mlaga
CADENAS DE CARACTERES
Una cadena de caracteres es una secuencia de cero (cadena vaca) o
ms caracteres de un cdigo de entrada/salida (ASCII)
La longitud de una cadena es el nmero de caracteres que contiene
Las cadenas de caracteres literales se escriben entre comillas dobles
Hola, qu tal?
12 DE OCTUBRE DE 1942
janto@lcc.uma.es
ETSI Industrial
31 Universidad de Mlaga
CADENAS DE CARACTERES
El tipo string
Declaracin de variables:
string cadena;
string palabra,frase;
ETSI Industrial
32 Universidad de Mlaga
CADENAS DE CARACTERES
Lectura por teclado:
cin: lee hasta el primer separador (espacio, tabulador, intro)
string palabra, frase;
string s=Hasta luego;
...
cin >> palabra;
cout << s;
Fundamentos de Informtica
ETSI Industrial
33 Universidad de Mlaga
CADENAS DE CARACTERES
Consideraciones sobre la lectura de cadena de caracteres:
cin deja en el buffer el separador (espacio, tabulador o retorno)
getline() no deja el terminador tras la lectura
Por tanto si tras un sentencia con cin inmediatamente hay otra
con getline() esta ltima puede no leer lo deseado pues
getline() lee el separador que cin ha dejado en el buffer
string nombre, apellidos;
...
cin >> nombre;
getline(cin,apellidos);
ETSI Industrial
34 Universidad de Mlaga
CADENAS DE CARACTERES
/* Ejemplo de declaracin, inicializacin, lectura
y escritura de cadenas de caracteres */
#include <iostream>
using namespace std;
Nombre?: Luis
Apellidos?: Luque Daz
int main()
Nombre y apellidos:
{
Luis Luque Daz
string nombre, apellidos;
Direccin:
string direccion = Avda. Amrica, 35;
Avda. Amrica, 35
cout << Nombre?: ;
cin >> nombre; // lee una sola palabra
cin.ignore(); // quita el separador del buffer
cout << Apellidos?: ;
getline(cin,apellidos);
cout << \nNombre y apellidos: ;
cout << endl << nombre << << apellidos;
cout << \nDireccin: << endl << direccion;
return 0;
}
Fundamentos de Informtica
ETSI Industrial
35 Universidad de Mlaga
CADENAS DE CARACTERES
Es posible acceder a los elementos de una variable de tipo string
como si se tratase de un array de caracteres, comenzando el primero
de ellos en la posicin 0:
string palabra=Buenos das;
cout << palabra << endl;
palabra[7]=D;
cout << palabra << endl;
Buenos das
Buenos Das
ETSI Industrial
36 Universidad de Mlaga
CADENAS DE CARACTERES
/*Muestra las veces que aparece un determinado carcter en un texto*/
#include <iostream>
using namespace std;
int main()
{
string texto; char ch;
int i=0, veces=0;
cout << Escribe una frase:\n;
getline(cin,texto);
cout << \nCarcter a buscar: ;
Escribe una frase:
cin >> ch;
En un lugar de la mancha
while(texto[i]!='\0')
{
Carcter a buscar: n
if (texto[i] == ch)
El carcter n aparece 3 veces
veces++;
i++;
}
cout << \nEl carcter << ch << aparece << veces << veces;
return 0;
}
Fundamentos de Informtica
ETSI Industrial
37 Universidad de Mlaga
CADENAS DE CARACTERES
Algunas operaciones y mtodos relacionados:
variable_cadena.clear() borra el contenido de la
variable_cadena dejndola con cero caracteres
string frase = buenos das;
frase.clear();
cout << frase; //No muestra nada por pantalla
ETSI Industrial
38 Universidad de Mlaga
CADENAS DE CARACTERES
Concatenacin de cadenas: usando el operador +
string frase = Hola;
frase = frase + , buenos da + s;
cout << frase; /* muestra por pantalla
Hola, buenos das */
Fundamentos de Informtica
ETSI Industrial
39 Universidad de Mlaga
CADENAS DE CARACTERES
Cadenas de Caracteres como argumentos y retorno en funciones
ETSI Industrial
40 Universidad de Mlaga
CADENAS DE CARACTERES
/* Ejemplo: funcin equivalente a getline(cin,cadena) */
void leer_frase(string &cadena)
{
char letra;
cadena.clear();
// se vaca el contenido de la cadena
cin >> noskipws; // para que no se salte los espacios en blanco
cin >> letra;
while(letra!='\n')
{
cadena+=letra;
cin >> letra;
}
}
/* Ejemplo: funcin equivalente a cout << cadena */
void imprimir_frase(string cadena)
{
unsigned i;
while(cadena[i]!='\0')
{
cout << cadena[i];
i++;
}
}
Fundamentos de Informtica
ETSI Industrial
41 Universidad de Mlaga
CADENAS DE CARACTERES
Desarrolla un programa que lea por teclado una
cadena de caracteres y un nmero natural m. Se
sustituirn todas las palabras de longitud m por
asteriscos y se imprimir la frase resultante.
Para ello, implementa y usa una funcin llamada
cambia_a_asteriscos()
que
tenga
como
parmetros una cadena de caracteres y un nmero
natural. La funcin har la sustitucin descrita
devolviendo la cadena modificada
Versin 1: la funcin hace la modificacin directamente
sobre la misma cadena de entrada
Versin 2: la funcin retorna la cadena modificada
Fundamentos de Informtica
ETSI Industrial
42 Universidad de Mlaga
Tema 6:
Fundamentos de Informtica
ETSI Industrial
43 Universidad de Mlaga
EL TIPO REGISTRO
Cuando se quiere procesar un conjunto de datos de distinto
tipo, se pueden crean interfaces engorrosas de manejar:
comparar_fechas(dia1,mes1,ao1,dia2,mes2,ao2);
sumar_fracciones(num1,den1, num2,den2);
leer_datos_persona(dni,nombre,dir,dia_nacim,
mes_nacim,ao_nacim,lugar_nacim, nacionalidad);
ETSI Industrial
44 Universidad de Mlaga
EL TIPO REGISTRO
Un registro (o estructura) es una coleccin finita y
heterognea (de distinto tipo) de uno o ms elementos
Cada uno de esos elementos tiene asociado su propio nombre,
que se denomina campo
Cada campo puede ser de cualquier tipo definido previamente
Ejemplo:
Campos
nmeros
cadenas
persona
dni
nombre
domicilio
d_nac
m_nac
a_nac
lugar_nac
nacionalidad
Fundamentos de Informtica
ETSI Industrial
45 Universidad de Mlaga
EL TIPO REGISTRO
Declaracin de un tipo registro (no es necesario usar typedef) :
Tipos ya
definidos:
cualesquiera
Tipo nuevo
struct nombre_registro{
Tipo1 campo1;
Tipo2 campo2;
...
};
Los nombres deben
ser distintos
Ejemplo de declaracin:
struct TPersona{
long dni;
string nombre, domicilio;
unsigned d_nac,m_nac,a_nac;
string lugar_nac, nacionalidad;
};
Fundamentos de Informtica
ETSI Industrial
46 Universidad de Mlaga
EL TIPO REGISTRO
Declaracin de una variable de tipo registro:
nombre_registro nombre_variable;
El tipo del registro tiene que haber
sido declarado antes
ETSI Industrial
47 Universidad de Mlaga
EL TIPO REGISTRO
Acceso a los campos: se utiliza el operador punto (.)
pepito.dni
pepito
193412
Pepito Ortega
C/ Rue del Percebe, 3
25
10
1970
Madrid
pepito.a_nac
espaola
pepito.d_nac
Fundamentos de Informtica
pepito.domicilio[12]
ETSI Industrial
48 Universidad de Mlaga
EL TIPO REGISTRO
/* ejemplo de declaracin de registros y acceso a los campos */
#include <iostream>
using namespace std; Declaracin de un tipo registro
struct TComponente{
int codigo;
string nombre;
float coste;
};
int main()
{
TComponente resistencia;
TComponente condensador={25,condensador,0.25};
resistencia.codigo=10;
Acceso a campos de una
resistencia.nombre=resistencia;
variable registro
resistencia.coste =0.06;
cout << Nombre << resistencia.nombre << , cdigo ;
cout << resistencia.codigo << , coste << resistencia.coste;
return 0;
}
Fundamentos de Informtica
ETSI Industrial
49 Universidad de Mlaga
EL TIPO REGISTRO
Las variables de un mismo tipo registro se pueden asignar
struct TFecha{
unsigned dia,mes,anio;
};
TFecha f1, f2={12,10,1492};
f1=f2; /* con arrays no es posible */
/* equivale a
f1.dia=f2.dia;
f1.mes=f2.mes;
f1.anio=f2.anio; */
ETSI Industrial
50 Universidad de Mlaga
EL TIPO REGISTRO
Registros como argumentos y retorno en funciones
Los registros se pueden pasar como argumento a una funcin
Por defecto, el registro se pasa por valor
Por tanto, cualquier modificacin que se haga un parmetro
formal del tipo registro dentro del cuerpo de una funcin, no
afecta al parmetro real de la llamada a la misma
Al igual que los tipos simples, una funcin puede devolver
una variable del tipo registro como retorno de una funcin
Para pasar un registro por referencia a una funcin se hace de
la misma forma que los tipos simples, se utiliza el operador de
direccin (&) slo en la cabecera de la funcin, precediendo al
parmetro formal que queremos que se pase por referencia,
pero no en la llamada a la funcin ni en el cuerpo de la misma
Fundamentos de Informtica
ETSI Industrial
51 Universidad de Mlaga
EL TIPO REGISTRO
#include <iostream>
using namespace std;
struct TPersona{
string nombre;
long telefono;
};
void mostrar_persona(TPersona p);
TPersona leer_persona();
int main()
{
TPersona p1;
Registro como
p1 = leer_persona();
paso por valor
mostrar_persona( p1 );
return 0;
}
void mostrar_persona(TPersona p )
{
cout << \nNombre: << p.nombre;
cout << \nTelfono: << p.telefono;
}
Fundamentos de Informtica
ETSI Industrial
TPersona leer_persona()
{
TPersona temp;
cout << Nombre? ;
getline(cin,temp.nombre);
cout << Telefono? ;
cin >> temp.telefono;
return temp;
}
52 Universidad de Mlaga
EL TIPO REGISTRO
#include <iostream>
using namespace std;
struct TPersona{
string nombre;
long telefono;
};
void mostrar_persona(TPersona p )
{
cout << \nNombre: << p.nombre;
cout << \nTelfono: << p.telefono;
}
Fundamentos de Informtica
ETSI Industrial
53 Universidad de Mlaga
EL TIPO REGISTRO
Fundamentos de Informtica
ETSI Industrial
54 Universidad de Mlaga
Tema 6:
Fundamentos de Informtica
ETSI Industrial
55 Universidad de Mlaga
ANIDAMIENTOS DE ESTRUCTURAS DE
DATOS ESTTICAS
Las estructuras de datos estticas se pueden anidar:
Se pueden utilizar enumerados como ndices en arrays
Un registro puede tener campos de cualquier tipo que haya
sigo definido:
Arrays (uni y multidimensionales)
Registros
Cualquier otro tipo definido
Los arrays pueden a su vez tener como tipo base a un tipo
registro o cualquier tipo definido
Pondremos ejemplos de las construcciones ms tpicas.
Fundamentos de Informtica
ETSI Industrial
56 Universidad de Mlaga
ANIDAMIENTOS DE ESTRUCTURAS DE
DATOS ESTTICAS
Registros con campos de tipo registro:
Para usar un campo de tipo registro tiene que estar previamente
declarado
struct TFecha{
unsigned dia;
unsigned mes;
unsigned anio;
};
struct TPersona{
long dni;
string nombre, domicilio;
TFecha f_nac ;
string lugar_nac, nacionalidad;
};
TPersona pepito={193412,Pepito Ortega,
C/ Rue del Percebe,3,{25, 10, 1970}, Mlaga,Espaola
};
Fundamentos de Informtica
ETSI Industrial
57 Universidad de Mlaga
ANIDAMIENTOS DE ESTRUCTURAS DE
DATOS ESTTICAS
pepito.dni
pepito
193412
Pepito Ortega
C/ Rue del Percebe, 3
10
25
1970
pepito.f_nac.anio
Madrid
espaola
pepito.f_nac.dia
Fundamentos de Informtica
pepito.domicilio[12]
ETSI Industrial
58 Universidad de Mlaga
ANIDAMIENTOS DE ESTRUCTURAS DE
DATOS ESTTICAS
Arrays de registros y registros con tipos simples o
estructurados:
#define N_EMPLEADOS 10
struct TFecha{
unsigned dia;
unsigned mes;
unsigned anio;
};
struct TPersona{
long dni;
string nombre, domicilio;
TFecha f_nac;
string lugar_nac, nacionalidad;
};
typedef TPersona TBanco[N_EMPLEADOS];
Fundamentos de Informtica
ETSI Industrial
59 Universidad de Mlaga
ANIDAMIENTOS DE ESTRUCTURAS DE
DATOS ESTTICAS
TBanco banco;
banco[2].dni
237879
Pepe Prez
81941225
153317
C/ Su Casa,
394412
Luis
02 Ortiz
13
1981
193412
Carmen
Luque
Avda. Velazquez,
12
Malaga
Jaimito
Barrientos
Plaza Constitucin, 25
1963
banco[9] espaola21 C/ 09
Rue
del
Percebe,
3
05
02
1975
Barcelona
10
1970
25
vila
espaola
banco[2]
Madrid
banco[1] espaola
banco[0] espaola
banco[1].domicilio[0]
Fundamentos de Informtica
ETSI Industrial
banco[0].f_nac.mes
60 Universidad de Mlaga
Tema 6:
Fundamentos de Informtica
ETSI Industrial
61 Universidad de Mlaga
Bsqueda Secuencial
Algoritmos de
Bsqueda
Bsqueda Binaria
Insercin
Algoritmos de
Ordenacin
Seleccin
Intercambio (Burbuja)
Fundamentos de Informtica
ETSI Industrial
62 Universidad de Mlaga
ALGORITMOS DE BSQUEDA
Consiste en buscar (indicando su posicin) un elemento en
una estructura de datos
Es una operacin muy frecuente en programacin, por lo que
existen diversidad de algoritmos
Con diferencias de eficiencia entre ellos
La estructura de datos puede considerarse una lista de datos
Cada dato de la lista se denomina componente o elemento
Una lista puede implementarse mediante un array
En los ejemplos utilizaremos un array de nmeros enteros
Fundamentos de Informtica
ETSI Industrial
63 Universidad de Mlaga
BSQUEDA SECUENCIAL
Aplicabilidad:
Desconocimiento acerca
de la organizacin de los
datos
Estructura slo accedida
secuencialmente
Idea clave:
Visitar todas las posiciones
del array, hasta que se
encuentre el elemento o se
llegue al final del array (el
elemento no est).
Fundamentos de Informtica
ETSI Industrial
64 Universidad de Mlaga
BSQUEDA SECUENCIAL
En el bucle: la evaluacin en cortocircuito de la condicin
evita errores de rango en el array
Eficiencia segn el nmero de operaciones de comparacin
(v[ind]!= x) para un array de tamao N:
Mejor Caso
Peor Caso
Caso Promedio
1 comparacin
N comparaciones
N/2 comparaciones
ETSI Industrial
65 Universidad de Mlaga
BSQUEDA BINARIA
/* Algoritmo de bsqueda binaria. Devuelve el ndice del
elemento en el array. Si no se encuentra devuelve -1 */
int bus_binaria(TVector v, int x, int tam)
{
int izq, der, m, posicion = -1; /*supongo no encontrado*/
izq = 0; /*izq comienza con el 1er elemento del
der = tam - 1; /*der comienza con el ltimo elem
while((izq <= der) && (posicin == -1))
{
m = /* cualquier valor entre izq y der */
if (v[m] == x )
posicion = m;
else if (v[m] < x) /*si x es mayor busco por
izq = m + 1;
/*si x es menor busco por
else
der = m - 1;
}
return posicion;
array */
array */
la dcha*/
la izda*/
}
Fundamentos de Informtica
ETSI Industrial
66 Universidad de Mlaga
BSQUEDA BINARIA
Sobre la eleccin de m:
No afecta a la correccin del algoritmo
Objetivo: descartar el mayor nmero de elementos en
cada iteracin
Eleccin ptima:
m =(izq + der)/2
trunc(log2 N) + 1
...
while( izq <= der && (posicion == -1))
{
m = (izq + der)/2;
if (v[m] == x )
posicion = m;
else if (v[m] < x)
izq = m + 1;
else
der = m - 1;
}
...
Fundamentos de Informtica
ETSI Industrial
67 Universidad de Mlaga
BSQUEDA BINARIA
izq = 0
der = 9
m = 4;
x 12
v
7 11 18 21 23 37 45 61
4
m
izq
ETSI Industrial
68 Universidad de Mlaga
izq + der
2
Fundamentos de Informtica
i=
9
der
BSQUEDA BINARIA
m = 4
v[4] > x
der = 4-1
x 12
v
i=
5
izq + der
2
7 11 18 21 23 37 45 61
4
m
0
izq
Fundamentos de Informtica
ETSI Industrial
der
69 Universidad de Mlaga
BSQUEDA BINARIA
m = (1+3)/2
i=
x 12
v
7 11 18 21 23 37 45 61
0
izq
Fundamentos de Informtica
izq + der
2
9
1
m
der
ETSI Industrial
70 Universidad de Mlaga
BSQUEDA BINARIA
m = 1
v[1] < x
izq = 1+1
x 12
v
7 11 18 21 23 37 45 61
izq
izq + der
2
i=
1
m
Fundamentos de Informtica
der
ETSI Industrial
71 Universidad de Mlaga
BSQUEDA BINARIA
m = (2+3)/2
i=
x 12
v
7 11 18 21 23 37 45 61
2
izq
Fundamentos de Informtica
2
m
ETSI Industrial
izq + der
2
der
72 Universidad de Mlaga
BSQUEDA BINARIA
m = 2
v[2] < x
izq = 2+1
x 12
v
izq + der
2
7 11 18 21 23 37 45 61
i=
2
m
izq
Fundamentos de Informtica
der
ETSI Industrial
73 Universidad de Mlaga
BSQUEDA BINARIA
m = (3+3)/2
i=
x 12
v
7 11 18 21 23 37 45 61
3
izq
Fundamentos de Informtica
3
m
ETSI Industrial
izq + der
2
der
74 Universidad de Mlaga
BSQUEDA BINARIA
m = 3
v[3] < x
izq = 3+1
x 12
v
izq + der
2
7 11 18 21 23 37 45 61
i=
3
m
izq
Fundamentos de Informtica
ETSI Industrial
der
75 Universidad de Mlaga
BSQUEDA BINARIA
x 12
v
i=
6
7 11 18 21 23 37 45 61
der
izq
Fundamentos de Informtica
izq + der
2
ETSI Industrial
76 Universidad de Mlaga
ALGORITMOS DE ORDENACIN
La ordenacin de datos es una tarea relevante en
programacin
Es un problema clsico ampliamente estudiado, por lo que
existen diversidad de algoritmos
Los algoritmos difieren en su eficiencia:
Economa en el uso de memoria
Economa en el nmero de operaciones:
Algoritmos directos: Insercin, Seleccin e Intercambio
(o Burbuja) (complejidad N2 )
Algoritmo ms eficiente: Quicksort (complejidad
Nlog2 N), basado en la tcnica de la recursividad
Fundamentos de Informtica
ETSI Industrial
77 Universidad de Mlaga
ALGORITMOS DE ORDENACIN
La estructura de datos a considerar es la misma que para los
algoritmos de bsqueda, consideraremos la lista como un
array de nmeros enteros
Sobre el array debe haber definida una relacin de orden
(como es el caso de los nmeros enteros)
El problema de la ordenacin (ascendente) de un vector v, de
tamao MAX, consiste en encontrar una permutacin s de los
elementos del vector, tal que se cumpla:
V[si] <= V[si+1], i / 0 i MAX-1
ETSI Industrial
78 Universidad de Mlaga
Fundamentos de Informtica
ETSI Industrial
79 Universidad de Mlaga
35
98
983 345
25
98
983 345
25
i=2 12
25
89
234 345
35
98
i=3 12
25
35
234 345
89
98
i=4 12
25
35
89
345 234
98
Fundamentos de Informtica
12
ETSI Industrial
345
80 Universidad de Mlaga
i=5 12
25
35
89
98
i=6 12
25
35
89
98
i=7 12
25
35
89
98
i=8 12
25
35
89
98
12
25
35
89
98
Fundamentos de Informtica
ETSI Industrial
81 Universidad de Mlaga
ETSI Industrial
82 Universidad de Mlaga
i-simo */
j-simo */
*/
pequeo */
Jos Antonio Gmez Ruiz
Tema 6:
Fundamentos de Informtica
ETSI Industrial
83 Universidad de Mlaga