Sei sulla pagina 1di 42

Tema 6:

Tipos de Datos Estructurados


Estructura y Contenidos

6.1. CLASIFICACIN DE LOS TIPOS DE DATOS: SIMPLES Y ESTRUCTURADOS.


6.2. EL TIPO ARRAY.
6.2.1. Arrays unidimensionales.
6.2.2. Arrays multidimensionales.
6.3. LAS CADENAS DE CARACTERES. El TIPO string.
6.3.1. Lectura y escritura de cadenas de caracteres.
6.3.2. Operadores y funciones relacionadas.
6.4. EL TIPO REGISTRO ( struct ).
6.5. ANIDAMIENTOS DE ESTRUCTURAS DE DATOS ESTTICAS.
6.6. ALGORITMOS BSICOS DE BSQUEDA Y ORDENACIN.

Fundamentos de Informtica

Tema 6:

ETSI Industrial

1 Universidad de Mlaga

Jos Antonio Gmez Ruiz

Tipos de Datos Estructurados


OBJETIVOS

Establecer las diferencias entre los distintos tipos de datos


Anlisis de diversos problemas para mostrar la necesidad del
uso de tipos de datos estructurados
Definicin de estructuras de datos complejas
Definicin de tipos de datos propios para una mayor
simplicidad y legibilidad en los programas
Estudio y aplicacin de los algoritmos de bsqueda y
ordenacin
Fundamentos de Informtica

ETSI Industrial

2 Universidad de Mlaga

Jos Antonio Gmez Ruiz

Tema 6:

Tipos de Datos Estructurados


Estructura y Contenidos

6.1. CLASIFICACIN DE LOS TIPOS DE DATOS: SIMPLES Y ESTRUCTURADOS.


6.2. El tipo array.
6.3.1. Arrays unidimensionales.
6.3.2. Arrays multidimensionales.
6.3. Las cadenas de caracteres. El tipo string.
6.4.1. Lectura y escritura de cadenas de caracteres.
6.4.2. Operadores y funciones relacionadas.
6.4. El tipo registro ( struct ).
6.5. Anidamientos de estructuras de datos estticas.
6.6. Algoritmos bsicos de bsqueda y ordenacin.

Fundamentos de Informtica

ETSI Industrial

3 Universidad de Mlaga

Jos Antonio Gmez Ruiz

CLASIFICACIN DE LOS TIPOS DE DATOS:


SIMPLES Y ESTRUCTURADOS
Predefinidos
Ordinales

Enteros
Naturales
Carcter

Definidos por el programador (enum)

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

Jos Antonio Gmez Ruiz

Tema 6:

Tipos de Datos Estructurados


Estructura y Contenidos

6.1. Clasificacin de los tipos de datos: simples y estructurados.


6.2. EL TIPO ARRAY.
6.2.1. Arrays unidimensionales.
6.2.2. Arrays multidimensionales.
6.3. Las cadenas de caracteres. El tipo string.
6.3.1. Lectura y escritura de cadenas de caracteres.
6.3.2. Operadores y funciones relacionadas.
6.4. El tipo registro ( struct ).
6.5. Anidamientos de estructuras de datos estticas.
6.6. Algoritmos bsicos de bsqueda y ordenacin.

Fundamentos de Informtica

ETSI Industrial

5 Universidad de Mlaga

Jos Antonio Gmez Ruiz

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.

Caf solo, sin azcar.


Caf solo, con azcar.
Caf con leche, sin azcar.
Caf con leche, con azcar.

Fundamentos de Informtica

ETSI Industrial

6 Universidad de Mlaga

Jos Antonio Gmez Ruiz

EL TIPO ARRAY

Fundamentos de Informtica

ETSI Industrial

7 Universidad de Mlaga

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;

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

<<
<<
<<
<<

\nSolo Sin Azcar << soloSin;


\nSolo con Azcar << soloCon;
\nLeche Sin Azcar << lecheSin;
\nLeche Con Azcar << lecheCon;

return 0;
}
Fundamentos de Informtica

ETSI Industrial

8 Universidad de Mlaga

Jos Antonio Gmez Ruiz

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;

Cdigo muy repetitivo


y tedioso de actualizar
Fundamentos de Informtica

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

<<
<<
<<
<<

\nSolo Sin Azcar << soloSin;


\nSolo con Azcar << soloCon;
\nLeche Sin Azcar << lecheSin;
\nLeche Con Azcar << lecheCon;

...
return 0;
}
10 Universidad de Mlaga

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

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

A todos los elementos

for(i=0;i<=7;i++) valores
valores[i]=i;
Fundamentos de Informtica

ETSI Industrial

13 Universidad de Mlaga

Jos Antonio Gmez Ruiz

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];

A todos los efectos, cualquier elemento de un array se puede


procesar como una variable del mismo tipo del elemento:
int vector[10],suma;
...
cin >> vector[3];
...
cout << vector[0];
...
suma+=vector[1];

A diferencia de otros lenguajes de programacin, C++ no chequea


que los ndices estn dentro del rango de los arrays:
int vector[5];
vector[10]=12;
Fundamentos de Informtica

Imprevisible donde se
almacena el valor
ETSI Industrial

14 Universidad de Mlaga

Jos Antonio Gmez Ruiz

ARRAYS UNIDIMENSIONALES
Solucin al problema de la mquina de caf

28

14

41

10 11 12 13

Caf solo sin


Caf solo 1 azcar
Caf solo 2 azcar
Caf solo 3 azcar
Caf leche sin
Caf leche 1 azcar
Caf leche 2 azcar
Caf leche 3 azcar
Fundamentos de Informtica

ETSI Industrial

T solo sin
T solo 1 azcar
T solo 2 azcar
T solo 3 azcar
15 Universidad de Mlaga

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

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

1000 1001 1002 1003 1004

1005 1007 1009 100B 100D

Suponiendo que se comienza en la posicin de memoria 1000, que un int ocupa 2


bytes y un char ocupa 1 byte

Suponiendo la siguiente declaracin:

int a[5];

a[1] es de tipo entero, de que tipo es a (sin ndices) ?

El nombre de un array es un puntero constante que tiene la


direccin del primer elemento del array
Por tanto, a es un puntero constante a enteros: a apunta al primer
elemento del array ( a &a[0] )
Hay una excepcin: sizeof(a) devuelve el tamao completo en
bytes del array y no de un puntero a enteros
Fundamentos de Informtica

ETSI Industrial

17 Universidad de Mlaga

Jos Antonio Gmez Ruiz

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;

tipo_dato_definido puede ser un tipo predefinido por el


lenguaje ( int, char, float, ...) o cualquier tipo de datos
estructurado definido por el programador
Como criterio de estilo, los tipos definidos con typedef
empezarn con letra T mayscula
Un tipo definido con typedef puede ser utilizado en cualquier
parte de un programa, siempre que su definicin sea previa a su uso
Fundamentos de Informtica

ETSI Industrial

18 Universidad de Mlaga

Jos Antonio Gmez Ruiz

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;

/* es_positivo es una variable de


de tipo booleano */

typedef char TCaracter;


TCaracter letra,inicial; /* letra e inicial son dos
variables de tipo carcter */
typedef int TVector[10];
TVector v1,v2;

Fundamentos de Informtica

/* v1 y v2 son arrays unidimensionales


de 10 elementos enteros */
ETSI Industrial

19 Universidad de Mlaga

Jos Antonio Gmez Ruiz

ARRAYS COMO ARGUMENTOS EN FUNCIONES


Por defecto, en C/C++ la mayora de los parmetros de una funcin
son de entrada y se pasan por valor
El paso de un array se implementa como paso por referencia por lo
que cualquier modificacin del array en el cuerpo de la funcin
afecta al array del parmetro real de la llamada
En C/C++ un array no se puede devolver como retorno de una
funcin
Como simplificacin para implementar el paso de arrays como
argumentos en funciones, se utilizarn definiciones de tipos para
definir los arrays
El paso de un array como parmetro de entrada (por valor) y como
parmetro de salida o E/S (por referencia) se implementar de la
misma forma que los tipos simples
Fundamentos de Informtica

ETSI Industrial

20 Universidad de Mlaga

Jos Antonio Gmez Ruiz

ARRAYS COMO ARGUMENTOS EN FUNCIONES


Ejemplo de arrays como parmetro de entrada a funciones:
typedef int TVector[50];
int main()
{
TVector v;
...
m = mayor_elemento(v,30 );
...
}

Le pasaremos tambin el tamao


real del array pues dependiendo
del problema podra no coincidir
con el tamao mximo definido

int mayor_elemento(TVector vector, int tam )


{ int max = vector[0] , i;
for(i=0; i < tam ;i++)
if(max < vector[i])
max = vector[i];
return max;
}

Fundamentos de Informtica

ETSI Industrial

21 Universidad de Mlaga

Jos Antonio Gmez Ruiz

ARRAYS COMO ARGUMENTOS EN FUNCIONES


Ejemplo de arrays como parmetro de salida en funciones:
/* producto escalar de dos vectores */
#include <iostream>
#define N 5 /* Tamao de los vectores */
using namespace std;
typedef int TVector[N];

En C/C++, un array
no se puede devolver
como retorno de una
funcin pero con el
paso por referencia
queda modificado

void leer_vector(TVector &v ,int tam);


int prod_esc(TVector v1, TVector v2,int tam);
int main()
{ int Tvector v1,v2, prod;
cout << \n1er vector :;
leer_vector(v1,N);
cout << \n2 vector :;
leer_vector(v2,N);
prod = prod_esc(v1,v2,N);
cout << \Prod. Escalar = << prod);
return 0;
}
Fundamentos de Informtica

ETSI Industrial

Desarrollar como ejemplo un


programa que contenga un men
donde se puedan realizar las
operaciones de suma, resta,
producto escalar y mdulo de dos
vectores de nmeros enteros que
se lean por teclado

22 Universidad de Mlaga

Jos Antonio Gmez Ruiz

ARRAYS COMO ARGUMENTOS EN FUNCIONES


Otra alternativa de paso de arrays como argumentos en funciones
de utilidad sobre todo si se desean procesar arrays de distintos tipos
con una misma funcin arrays abiertos
Misma forma para parmetros de entrada, salida y entrada / salida
Siempre se pasan por referencia (no se pone el &)
void Ordenar1( TVector1 &v);
void Ordenar2( TVector2 &v);
void Ordenar3( TVector3 &v);
int main()
{
TVector1 v1; TVector2
TVector3 v3;
...
Ordenar1(v1);
Ordenar2(v1);
Ordenar2(v2);
Ordenar3(v3); typedef
typedef
...
typedef
}
Fundamentos de Informtica

v2;

int
int
int

void Ordenar (int v[],int tam);


int main()
{
TVector1 v1;
TVector2 v2;
TVector3 v3;
...
Ordenar(v1,10);
Ordenar(v2,100);
Ordenar(v3,1000);
...
TVector1[10];
}
TVector2[100];
TVector3[1000];

ETSI Industrial

23 Universidad de Mlaga

Jos Antonio Gmez Ruiz

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)*/

Los elementos de arrays multimensionales se almacenan en


memoria contiguos por filas
int matriz[3][5];
matriz
Fundamentos de Informtica

ETSI Industrial

24 Universidad de Mlaga

Jos Antonio Gmez Ruiz

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]

Ejemplo: rellenar una matriz por filas con nmeros del 1 al 12


...
0
int matriz[3][4], i,j;
0 1
for(i=0; i<3; i++)
1 5
for(j=0; j<4; j++)
matriz[i][j]=(i*4)+j+1;
2 9
...
Fundamentos de Informtica
ETSI Industrial 25 Universidad de Mlaga

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 }
};

La segunda forma tiene algunas ventajas sobre la primera:


La organizacin: es ms fcil de leer
Son tiles para las inicializaciones incompletas
Fundamentos de Informtica

ETSI Industrial

26 Universidad de Mlaga

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

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

programa que contenga un


men donde se puedan
realizar las operaciones de
suma, resta y producto de dos
matrices cuadradas que se
lean por teclado

j=1

b
*

m
=

i=2

Fundamentos de Informtica

Tema 6:

ETSI Industrial

29 Universidad de Mlaga

Jos Antonio Gmez Ruiz

Tipos de Datos Estructurados


Estructura y Contenidos

6.1. Clasificacin de los tipos de datos: simples y estructurados.


6.2. El tipo array.
6.2.1. Arrays unidimensionales.
6.2.2. Arrays multidimensionales.
6.3. LAS CADENAS DE CARACTERES. EL TIPO string.
6.3.1. Lectura y escritura de cadenas de caracteres.
6.3.2. Operadores y funciones relacionadas.
6.4. El tipo registro ( struct ). Arrays de registros.
6.5. Anidamientos de estructuras de datos estticas.
6.6. Algoritmos bsicos de bsqueda y ordenacin.

Fundamentos de Informtica

ETSI Industrial

30 Universidad de Mlaga

Jos Antonio Gmez Ruiz

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

En C, las cadenas de caracteres se implementan mediante arrays


unidimensionales de caracteres, un carcter especial (el carcter
nulo \0) delimita el final de la cadena dentro del array
En C++, la definicin y manejo de cadenas de caracteres se realiza
mediante el tipo string
Fundamentos de Informtica

ETSI Industrial

31 Universidad de Mlaga

Jos Antonio Gmez Ruiz

CADENAS DE CARACTERES
El tipo string
Declaracin de variables:
string cadena;
string palabra,frase;

Las variables definidas no tienen un tamao prefijado de


antemano, se adapta segn las necesidades.
Se puede dar valor a la variable a la vez que se declara:
string texto = Esto es un ejemplo;

Como cualquier variable, se les puede asignar cualquier


expresin que sea del mismo tipo o una cadena de caracteres
entre comillas dobles:
string s1, s2;
s2 = Hola;
s1 = s2;
Fundamentos de Informtica

ETSI Industrial

32 Universidad de Mlaga

Jos Antonio Gmez Ruiz

CADENAS DE CARACTERES
Lectura por teclado:
cin: lee hasta el primer separador (espacio, tabulador, intro)
string palabra, frase;
string s=Hasta luego;
...
cin >> palabra;

si la entrada fuese buenos das se


almacenara en la variable palabra
slo la cadena buenos

getline(): lee hasta el primer retorno de carro


getline(cin,frase);

si la entrada fuese Hola, qu tal? se


almacenara todo el texto en la variable
frase

Escritura por pantalla:


cout: muestra en pantalla el valor de la cadena de caracteres
Hasta luego

cout << s;

Fundamentos de Informtica

ETSI Industrial

33 Universidad de Mlaga

Jos Antonio Gmez Ruiz

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);

cin.ignore() elimina el separador del buffer


cin.ignore(m,\n) elimina un mximo de m caracteres
del buffer si antes no encuentra el carcter \n
Fundamentos de Informtica

ETSI Industrial

34 Universidad de Mlaga

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

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

No se puede utilizar para aadir nuevos caracteres al final de la


cadena, slo se puede utilizar para consultar o modificar el valor de
un determinado carcter dentro de la cadena
Se puede procesar una variable de tipo string consultando los
caracteres que la componen hasta encontrar el carcter fin de
cadena \0 (vase el ejemplo de la siguiente transparencia)
Fundamentos de Informtica

ETSI Industrial

36 Universidad de Mlaga

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

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

variable_cadena.size() devuelve el tamao o longitud


de la variable_cadena
devuelve la
variable_cadena.substr(ini,tam)
subcadena de la variable_cadena que comienza en la
posicin ini y con tamao tam
string frase=buenos das;
cout << frase.substr(7,4); /* Imprime das
en pantalla */
Fundamentos de Informtica

ETSI Industrial

38 Universidad de Mlaga

Jos Antonio Gmez Ruiz

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 */

Comparacin entre cadenas: usando los operadores relacionales


(==, !=, <, >, <=, >=)
string frase1, frase2;
getline(cin,frase1);
getline(cin,frase2);
if(frase1 > frase2) //mayor lexicogrficamente
...

Fundamentos de Informtica

ETSI Industrial

39 Universidad de Mlaga

Jos Antonio Gmez Ruiz

CADENAS DE CARACTERES
Cadenas de Caracteres como argumentos y retorno en funciones

Las cadenas se pueden pasar como argumento a una funcin


Por defecto, las variables de tipo string se pasan por valor
Por tanto, cualquier modificacin que se haga un parmetro
formal de tipo string 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 de tipo string como retorno de una funcin
Para pasar una cadena 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

40 Universidad de Mlaga

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

Tema 6:

Tipos de Datos Estructurados


Estructura y Contenidos

6.1. Clasificacin de los tipos de datos: simples y estructurados.


6.2. El tipo array.
6.2.1. Arrays unidimensionales.
6.2.2. Arrays multidimensionales.
6.3. Las cadenas de caracteres. El tipo string.
6.3.1. Lectura y escritura de cadenas de caracteres.
6.3.2. Operadores y funciones relacionadas.
6.4. EL TIPO REGISTRO ( struct ).
6.5. Anidamientos de estructuras de datos estticas.
6.6. Algoritmos bsicos de bsqueda y ordenacin.

Fundamentos de Informtica

ETSI Industrial

43 Universidad de Mlaga

Jos Antonio Gmez Ruiz

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);

Si se agrupase la informacin, se obtendran interfaces ms


simples y legibles:
comparar_fechas(fecha1, fecha2);
sumar_fracciones(fraccion1, fraccion2);
leer_datos_persona(empleado);
Fundamentos de Informtica

ETSI Industrial

44 Universidad de Mlaga

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

EL TIPO REGISTRO
Declaracin de una variable de tipo registro:
nombre_registro nombre_variable;
El tipo del registro tiene que haber
sido declarado antes

Se puede inicializar la variable en el momento de su


declaracin. Se asigna la informacin en el mismo orden en el
que se declararon los campos:
TPersona pepito={
193412,
Pepito Ortega,
C/ Rue del Percebe,3,
25, 10, 1970,
Mlaga,
Espaola
};
Fundamentos de Informtica

ETSI Industrial

47 Universidad de Mlaga

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

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;
};

Declaracin de una variable registro


Declaracin e inicializacin de
una variable registro

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

Jos Antonio Gmez Ruiz

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; */

Las variables de un mismo tipo registro no se pueden


comparar directamente (no se pueden utilizar los operadores
relacionales)
if (f1 > f2)
...
Fundamentos de Informtica

ETSI Industrial

50 Universidad de Mlaga

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

EL TIPO REGISTRO
#include <iostream>
using namespace std;

Para que un tipo registro pueda ser utilizado


en varias funciones, debe declararse antes
del prototipo de las mismas

struct TPersona{
string nombre;
long telefono;
};
void mostrar_persona(TPersona p);
TPersona leer_persona();

Registro como valor de


retorno en una funcin

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

Jos Antonio Gmez Ruiz

EL TIPO REGISTRO
#include <iostream>
using namespace std;
struct TPersona{
string nombre;
long telefono;
};

Registro como paso


por referencia

void mostrar_persona(TPersona p);


void leer_persona(TPersona &p );
int main()
{
TPersona p1;
leer_persona( p1 );
mostrar_persona( p1 );
return 0;
}

void leer_persona(TPersona &p )


{
cout << Nombre? ;
getline(cin, p.nombre );
cout << Telefono? ;
cin >> p.telefono;
}

void mostrar_persona(TPersona p )
{
cout << \nNombre: << p.nombre;
cout << \nTelfono: << p.telefono;
}
Fundamentos de Informtica

ETSI Industrial

Ni en la llamada a la funcin ni dentro


del cuerpo de la misma, se precede el
parmetro por &

53 Universidad de Mlaga

Jos Antonio Gmez Ruiz

EL TIPO REGISTRO

Desarrolla como ejemplo un programa que


procese fracciones que tengan numerador y
denominador naturales. El programa contendr un
men donde se puedan realizar las operaciones
de suma, producto y divisin de dos fracciones
que se lean por teclado.
Implementar una funcin que permita simplificar
las fracciones, mediante paso por referencia,
antes de mostrarlas (usa el MCD).

Fundamentos de Informtica

ETSI Industrial

54 Universidad de Mlaga

Jos Antonio Gmez Ruiz

Tema 6:

Tipos de Datos Estructurados


Estructura y Contenidos

6.1. Clasificacin de los tipos de datos: simples y estructurados.


6.2. El tipo array.
6.2.1. Arrays unidimensionales.
6.2.3. Arrays multidimensionales.
6.3. Las cadenas de caracteres. El tipo string.
6.3.1. Lectura y escritura de cadenas de caracteres.
6.3.2. Operadores y funciones relacionadas.
6.5. El tipo registro ( struct ).
6.6. ANIDAMIENTOS DE ESTRUCTURAS DE DATOS ESTTICAS.
6.7. Algoritmos bsicos de bsqueda y ordenacin.

Fundamentos de Informtica

ETSI Industrial

55 Universidad de Mlaga

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

Tema 6:

Tipos de Datos Estructurados


Estructura y Contenidos

6.1. Clasificacin de los tipos de datos: simples y estructurados.


6.2. El tipo array.
6.2.1. Arrays unidimensionales.
6.2.2. Manipulacin de arrays con punteros.
6.2.3. Arrays multidimensionales.
6.3. Las cadenas de caracteres. El tipo string.
6.3.1. Lectura y escritura de cadenas de caracteres.
6.3.2. Operadores y funciones relacionadas.
6.5. El tipo registro ( struct ).
6.6. Anidamientos de estructuras de datos estticas.
6.7. ALGORITMOS BSICOS DE BSQUEDA Y ORDENACIN.

Fundamentos de Informtica

ETSI Industrial

61 Universidad de Mlaga

Jos Antonio Gmez Ruiz

ALGORITMOS DE BSQUEDA Y ORDENACIN

Bsqueda Secuencial

Algoritmos de
Bsqueda

Bsqueda Binaria

Insercin

Algoritmos de
Ordenacin

Seleccin
Intercambio (Burbuja)

Fundamentos de Informtica

ETSI Industrial

62 Universidad de Mlaga

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

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).

/* Algoritmo de bsqueda secuencial.


Devuelve el ndice del elemento en
el array. -1 Si no se encuentra */
int bus_sec(TVector v, int x, int tam)
{
int ind;
int pos = -1; /* supongo no
encontrado*/
ind = 0; //primera posicin array
while ( ind<tam && v[ind]!= x )
ind++;
if (ind < tam) //si no he llegado
pos = ind; //al final del array
return pos;
}

Fundamentos de Informtica

ETSI Industrial

64 Universidad de Mlaga

Jos Antonio Gmez Ruiz

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

Condiciones para el fin de la bsqueda:


Elemento hallado:
v[ind] == x
Elemento no hallado: ind == tam
Fundamentos de Informtica

ETSI Industrial

65 Universidad de Mlaga

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

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

Eficiencia (peor caso):

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

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

BSQUEDA BINARIA

izq > der


NO encontrado
4 iteraciones

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

Jos Antonio Gmez Ruiz

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

Jos Antonio Gmez Ruiz

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

El orden deseado ser: V[s0], V[s1], ..., V[sMAX-1]


Fundamentos de Informtica

ETSI Industrial

78 Universidad de Mlaga

Jos Antonio Gmez Ruiz

ORDENACIN POR SELECCIN


Idea clave:
Determinar la posicin del menor elemento del array
Intercambiar dicho elemento por el elemento que hay en la
primera posicin V0. Ahora el elemento ms pequeo est
en la primera posicin del array
Repetir esta operacin con los MAX-2 elementos restantes
V2 , ... , VMAX-1
Ejemplo. Ordenar la siguiente secuencia en orden ascendente:
234, 132, 89, 12, 345, 35, 98, 983, 345, 25

Fundamentos de Informtica

ETSI Industrial

79 Universidad de Mlaga

Jos Antonio Gmez Ruiz

ORDENACIN POR SELECCIN


En cada pasada del algoritmo, se selecciona el menor para la
posicin i-sima:
i=0 234 132 89

35

98

983 345

25

i=1 12 132 89 234 345 35

98

983 345

25

i=2 12

25

89

234 345

35

98

983 345 132

i=3 12

25

35

234 345

89

98

983 345 132

i=4 12

25

35

89

345 234

98

983 345 132

Fundamentos de Informtica

12

ETSI Industrial

345

80 Universidad de Mlaga

Jos Antonio Gmez Ruiz

ORDENACIN POR SELECCIN

i=5 12

25

35

89

98

234 345 983 345 132

i=6 12

25

35

89

98

132 345 983 345 234

i=7 12

25

35

89

98

132 234 983 345 345

i=8 12

25

35

89

98

132 234 345 983 345

12

25

35

89

98

132 234 345 345 983

Fundamentos de Informtica

ETSI Industrial

81 Universidad de Mlaga

Jos Antonio Gmez Ruiz

ORDENACIN POR SELECCIN


/* Algoritmo para intercambiar dos valores */
void intercambia(int &x, int &y)
{
int aux;
aux = x;
x = y;
y = aux;
}
/* Algoritmo de ordenacin por Seleccin */
void ord_seleccion(TVector &v,int tam)
{
int i, j, posmin;
for(i=0; i<tam-1; i++)
{
posmin = i;
/* supongo que el menor es el
for(j=i+1; j<tam ;j++)
/*compruebo si el
if(v[j] < v[posmin])
posmin = j;
/* es ms pequeo
intercambia(v[i] , v[posmin]);
}
/* intercambio el i-simo con el ms
}
Fundamentos de Informtica

ETSI Industrial

82 Universidad de Mlaga

i-simo */
j-simo */
*/
pequeo */
Jos Antonio Gmez Ruiz

Tema 6:

Tipos de Datos Estructurados

FIN DEL TEMA

Fundamentos de Informtica

ETSI Industrial

83 Universidad de Mlaga

Jos Antonio Gmez Ruiz

Potrebbero piacerti anche