Title: Tipos Estructurados
1Tipos Estructurados
Departamento de Sistemas Informáticos
yProgramación
- Facultad de CC. Físicas. CURSO 04/05Fundamentos
de Programación TEMA 5
Facultad de CC. FísicasFundamentos de
Programación curso 05/06 TEMA 5
2Tipos Estructurados
- Una estructura de datos es
- una colección de valores a los que se hace
referencia a través de un único nombre, - organizada de tal manera que se puede acceder a
cada uno de los valores de forma individual - Se puede operar sobre la estructura completa o
sobre cada valor individual
3 Arrays unidimensionales.
- Motivación
- Especificación. Se desarrolla un programa para
- Leer una lista de calificaciones de examen
- Encontrar su media
- Escribir la lista con las calificaciones
superiores a la media - Ordenar la lista de calificaciones en orden
ascendente - Solición 1. Utilizar una variable para cada
calificación. Si hay 100 alumnos, 100 variables
4Arrays unidimensionales.
- Utilidad procesamiento de listas i.e.
colecciones ordenadas de valores a los que se
puede acceder individualmente a través de un
índice. - Sintaxis
- ltTipogt NombreArray ltTamañogt
5Arrays unidimensionales.
- Es una estructura que se utiliza para almacenar
valores del mismo tipo. - Se pueden identificar como listas o vectores
- los valores se almacenan uno junto a otro,
- cada dato de la colección se puede referenciar
por su posición en la lista - Un array se caracteriza por
- Un nombre (Identificador)
- Un tamaño (nº de elementos que contiene)
- El tipo de elementos que contiene
6Arrays unidimensionales.
Ejemplo
-
- int VectorGrande100, VectorPeque8,7,6,5
- double a3
- char calif10, una_calif
- cin gtgt VectorGrande99 gtgt VectorGrande0
- VectorGrande13 VectorGrande99
VectorGrande0 - cout ltlt VectorGrande13
- int indice
- indice 0
- cout ltlt VectorGrandeindice
Declaración
Utilización de los elementos
7Arrays unidimensionales.
Ejemplo
-
- Especificación. En una lista de 5 puntuaciones
en los exámenes dadas por el usuario mediante
teclado, presentar la mayor y la diferencia de
cada uno con el mayor. - Algoritmo.
- 1. Introducir valores para los elementos del
array por cin. - 2. Recorrer la lista buscando el mayor.
- 3. Mostrar para cada elemento la diferencia con
el mayor. -
Procesamientode listas de valores
8Arrays unidimensionales.
Ejemplo
- int main()
-
- float NotaAlum5
- int i0, maximo
- for (int i0 i lt 5 i)
-
- cout ltlt "Intro valor de nota n " ltlt i ltlt
endl - cin gtgt NotaAlumi
-
- maximo NotaAlum0
- for (i1 i lt 5 i)
- if (NotaAlumi gt maximo) maximo NotaAlumi
- for (i 0 ilt5 i)
- cout ltlt NotaAlumi ltlt " tiene una diferencia
de " - ltlt maximo - NotaAlumi
- ltlt " con respecto al maximo" ltlt endl
- getchar()
- return 0
Procesamientode listas de valores
9Arrays unidimensionales.
- Qué sucede en memoria?
- int a6
- Se reservan posiciones adyacentes para 6
elementos de tipo int. - Se recuerda únicamente la dirección del primer
elemento. - Para obtener cualquier elemento de la estructura
se cuenta a partir del primero.
10Arrays unidimensionales.
- Peligro!!!
- int a6
- a7 238
- El ordenador ejecuta la instrucción como si
existiera el elemento. - Es necesario llevar un registro del número de
elementos que contiene el array y tenerlo en
cuenta al procesar.
11Arrays unidimensionales.
Ejemplo
-
- Especificación. Inicializar una lista con un
máximo de 100 valores enteros dados por el
usuario desde teclado. La introducción se da por
finalizada al introducir un número positivo. El
usuario nos debe dar valores ordenados de menor a
mayor.
Registro del númerode elementos
12Arrays unidimensionales.
- int const max_ind 100
- int amax_ind
- int indice
- do
- int numero
- cin ltlt numero
- if (numerogt0)
- for (indice 0 indice lt max_ind
indice) - if (indice 0)
- aindice numero
- else
- while (numero lt aindice-1)
- cout ltlt solo numeros ordenados de menor
a mayor - cin gtgt numero
- //Fin while
- aindice numero
- //Fin else
- //fin for
Ejemplo
Registro del númerode elementos
13Arrays unidimensionales.
Utilización de Arrays como parámetros de
Subprogramas lttipogt NomFun (lttipoelemgt
NomArr) Son un tipo especial, en la práctica
funcionan de la misma forma que los parámetros
por referencia. Son de entrada/salida.
14Arrays unidimensionales.
- include ltvcl.hgt
- pragma hdrstop
- include ltiostream.hgt
- pragma argsused
- void IniNotas (float Notas, int const maxElem)
-
- for (int i0 i lt maxElem i)
-
- cout ltlt "Intro valor de nota n " ltlt i ltlt
endl - cin gtgt Notasi
-
-
- int main(int argc, char argv)
-
- float NotaAlum5
- int i0, maximo
- IniNotas(NotaAlum)
- maximo NotaAlum0
Ejemplo
Arrays como parámetros de funciones
15Arrays unidimensionales.
Argumento
- Función que devuelve el valor máximo almacenado
en un array de enteros. - Algoritmo
- Asumir
- Se ha declarado un array de enteros que ya se han
leido por teclado. - Argumentos de entrada
- La función necesita el array y el tamaño del
array. - Devuelve
- Valor entero máximo contenido en el array.
- Procesamiento
- Maximo 0.
- Recorrer todo el array comprobando que el entero
de la posición i es mayor que maximo si es
mayor, asignar dicho entero a maximo.
16Arrays unidimensionales.
Argumento
- Función que devuelve el valor máximo almacenado
en un array de enteros.
int maximo (int fvector, int tamano) float
maximo fvector0 int i for (i 0 i lt
tamano i) if (maximo lt fvectori) maximo
fvectori return maximo void main ()
int const limiteSup 50 int
vectorlimiteSup, i ...
17Arrays unidimensionales.
Argumento
include ltiostream.hgt int maximo (int fvector,
int tamano) float maximo fvector0 int
i for (i 0 i lttamano i) if (maximo lt
fvectori) maximo fvectori return
maximo void main () int const limiteSup
5 int vectorlimiteSup, i //Leer los datos
por teclado. for (i 0 ilt limiteSup dato
gt 0 i) cout ltlt "Introduce el dato
(valor negativo para finalizar)"ltlt i ltlt " "
cin gtgt dato if (datogt0)
vectoridato i
//Devuelve el valor maximo del
array. coutltlt"El valor maximo del array es "ltlt
maximo (vector, limiteSup) //Fin main
18Arrays unidimensionales.
ERROR COMÚN En arrays parcialmente llenos,
pasar como parámetros elementos que no se han
iniciado. Para evitarlo, hay que llevar un
registro de los límites en que el array tiene
valores. El subprograma necesita conocer cuál es
el último elemento que tiene valor.
19Arrays unidimensionales.
- Escribir un programa que lea 20 enteros, los
guarde en un array y calcule y muestre por
pantalla la suma de los valores que haya en
posiciones pares del array (0, 2, ) y la suma de
los valores que haya en posiciones impares del
array (1, 3, ). - Algoritmo
- 1. Leer los 20 números enteros y almacenarlos en
un array. - 2. Recorrer el array sumando los valores de
- - Posiciones pares.
- - Posiciones impares.
- 3. Visualizar resultados.
20Arrays unidimensionales.
include ltiostream.hgt define MAXIMO 20 void
CargarArray (int fvector) int i0 char
fin do cout ltlt Desea introducir otro
dato? cin gtgt fin if (UpCase(fin) ! S i
lt MAXIMO) cout ltlt "Introduce el dato " ltlt i
ltlt " " cin gtgt fvectori i
while (UpCase(fin)!SiltMAXIMO) void main
() int MatrizMAXIMO int TotalPar 0,
TotalImpar 0, i //Cargar array cout ltlt
"Introduce los componentes del array " ltlt endl
CargarArray (Matriz) ...
21Arrays unidimensionales
- Implementación
- 2. Recorrer el array sumando los valores de
- - Posiciones pares.
- - Posiciones impares.
//Sumatorios posiciones pares e impares. for
(i 0 i lt MAXIMO i) if (i 2 0)
TotalPar Matrizi else TotalImpar
Matrizi
22Arrays unidimensionales.
ATENCIÓN. El valor devuelto por una función no
puede ser un tipo estructurado.
23Arrays unidimensionales.
- Algunas Limitaciones
- Los arrays son muy útiles para el procesamiento
de listas. Pero la implementación de listas con
arrays tiene limitaciones - Un array tiene que tener un número fijo de
elementos y una lista no. Se suele estimar el
tamaño máximo que puede llegar a tener la lista y
se declara el array para que tenga ese número de
componentes. - Siempre se corre el riesgo de dejar elementos
fuera del procesamiento un array demasiado
grande ocupa mucha memoria.
24Arrays unidimensionales.
- Algunas Limitaciones
- Algoritmos de inserción y eliminación son poco
eficientes. - Por ejemplo, para insertar un nuevo elemento en
la siguiente lista (en la posición 6) hay que
desplazar cada elemento de las posciones 7 a la
10 una posición a la derecha - 23,24,25,27,28,29,98,87,65,32
-
7
23,24,25,27,28,7,29,98,87,65,32
25Arrays unidimensionales.
Algunas Limitaciones En eliminación sucede lo
mismo, hay que desplazar los elementos que están
a derecha del eliminado una posición hacia la
izquierda para cerrar el hueco
23,24,25,27,28,29,98,87,65,32
23,24,25,27,29,98,87,65,32
26Arrays unidimensionales.
- Algunas Limitaciones
- Si inserción y eliminación se limitan al final
del array, no existe ineficiencia. - Una pila es una lista cuyos elementos pueden
insertarse (apilarse) y borrarse (desapilar) sólo
al final de la lista (cima de la pila). - Si los elementos se pueden insertar sólo por un
extremo (el final) y borrar los del otro (la
cabeza) se le llama cola. -
27Arrays unidimensionales.
- Resumiendo
- Los arrays agrupan elementos del mismo tipo.
- Funcionan muy bien para listas estáticas.
- Funcionan razonablemente bien para listas cuyo
tamaño se puede estimar y las que las operaciones
de inserción y eliminación no son frecuentes o
están restringidas al final. - No es lo más adecuado para listas dinámicas cuyos
tamaños pueden variar mucho y con muchas
operaciones de inserción/eliminación.
28Arrays bi y multi dimensionales.
- Utilidad procesamiento de estructuras tipo
matriz. El acceso a cada elemento se hace a
través de 2 índices. - Sintaxis
- ltTipogtNombreArrayltDimensión1gt ltDimensión2gt
- Cada celda de almacenamiento es del tipo ltTipogt
29Arrays bi y multi dimensionales.
Definición
- Ejemplos
- int m6 10 ? Array bidimensional de 6x10
enteros (matriz) - float k3 2 5 ? Array tridimensional de
3x2x5 reales (cubo)
cubo de 3x2x5
matriz de 6x10
30Arrays bi y multi dimensionales.
Acceso
- Para identificar un elemento de un array
multidimensional se debe dar un índice para cada
dimensión, en el mismo orden que en la
declaración. - Cada índice se encierra en sus propios corchetes.
Declaración ? int matriz 6 10
matriz 0 8
matriz
matriz 2 5
31Arrays bidimensionales.
- En C un array bidimensional es un array de
arrays - int MatrizEnteros 53
- Es en realidad un array unidimensional de 5
elementos, cuyo tipo base es a su vez un array de
3 elementos. - void NombreProc (ltTipoElementogt
NombreArrayltDimension2gt, int const
Dimension1)
32Arrays bidimensionales.
Ejemplo
- Especificación. . Queremos un programa por el que
podamos gestionar la ocupación de los asientos en
un cine. En el cine hay 12 filas (numeradas del 0
al 11) y en cada fila hay 8 asientos (numerados
del 0 al 7). El programa permitirá al usuario
visualizar un mapa de la sala con el estado
actual de ocupación de los asientos (O para libre
y X para ocupado) y comprar la entrada
correspondiente a un asiento libre.
Uso de arrays bidimensionales
33Arrays bidimensionales.
Ejemplo
- Especificación. . Escribir un programa que sume
dos matrices. El valor de cada una lo introducirá
el usuario por teclado.
Uso de arrays bidimensionales
34Arrays bidimensionales.
Ejemplo
- Especificación. Sumar los componentes de dos
matrices bidimensionales de la misma dimensión.
El usuario introducirá los componentes de cada
matriz por teclado. El programa deberá guardar
los resultados en una tercera matriz.Las
dimensiones de las matrices se definen por
programa.
Uso de arrays bidimensionales
35Arrays bidimensionales.
Ejercicio - Suma
- 1. Cargar la matriz1.
- 2. Cargar la matriz2.
- 3. Sumar, componente a componente, las dos
matrices y guardar el resultado en matriz3. - 4. Visualizar resultado (matriz3).
36Arrays bidimensionales.
Ejercicio - Suma
include ltiostream.hgt define FILAS 4 define
COLUMNAS 3 void CargarArray (int
fvectorFILASCOLUMNAS) int i, j for (i
0 i lt FILAS i) for (j 0 j lt
COLUMNAS j) cout ltlt "Introduce
el dato " ltlt i ltlt "" ltlt j ltlt " " cin
gtgt fvectorij cout ltlt endl
... void main () int matriz1FILASCOLUMN
AS int matriz2FILASCOLUMNAS int
matrizSumaFILASCOLUMNAS CargarArray
(matriz1) CargarArray (matriz2)
37Arrays bidimensionales.
Ejercicio - Suma
void SumarArrays (int fvector1FILASCOLUMNAS,
int fvector2FILASCOLUMNAS, int
fvectorSFILASCOLUMNAS) int i, j for
(i 0 i lt FILAS i) for (j 0 j lt
COLUMNAS j) fvectorSij
fvector1ij fvector2ij ... void main
() ... SumarArrays (matriz1, matriz2,
matrizSuma)
38Arrays bidimensionales.
Ejercicio - Suma
void VisualizarArray (int fvectorFILASCOLUMNAS
) int i, j for (i 0 i lt FILAS i)
for (j 0 j lt COLUMNAS j) cout ltlt
fvectorij ltlt " " cout ltlt endl
... void main () ... cout ltlt "La suma de
los dos arrays es " ltlt endl VisualizarArray
(matrizSuma)
39Arrays bidimensionales.
Ejercicio - Suma
void main() int matriz1FILASCOLUMNAS
int matriz2FILASCOLUMNAS int
matrizSumaFILASCOLUMNAS //Cargar primer
array cout ltlt "Introduce los componentes del
primer array " ltlt endl CargarArray (matriz1)
//Visualizar array1 cout ltlt "El primer array
introducido es " ltlt endl VisualizarArray
(matriz1) //Cargar segundo array cout ltlt
"Introduce los componentes del segundo array " ltlt
endl CargarArray (matriz2) //Visualizar
array2 cout ltlt "El segundo array introducido
es " ltlt endl VisualizarArray (matriz2)
//Sumar los arrays SumarArrays (matriz1,
matriz2, matrizSuma) //Visualizar array Suma
cout ltlt "La suma de los dos arrays es " ltlt
endl VisualizarArray (matrizSuma)
40La clase string.
- Utilidad tratamiento de cadenas de caracteres.
- en c las cadenas de caracteres se tratan como
arrays de char. - en c existe además la clase string para tratar
cadenas.
41La clase string.
- Cómo se usa
- los string son arrays de caracteres que incluyen
una serie de operaciones predefinidas. - los caracteres de string se numeran
consecutivamente desde 0. - la clase string es programación orientada a
objetos y tiene un tratamiento y unas normas
sintácticas diferentes a lo que hemos visto hasta
ahora.
42La clase string.
- Cómo se usa
- está en la biblioteca ltstring.hgt.
- se crea un objeto de la clase string la sintaxis
es idéntica a la de creación de una variable. - string cadena
- para incializar el objeto
- cadena Hola bicho bola
- cin gtgt cadena
- getline (cin, cadena,0)
- para mostrar su valor
- cout ltlt cadena
getline toma el flujo de caracteres de cin hasta
encontrar el primer espacio blanco y lo asigna a
cadena
43La clase string.
- En POO hay una nomenclatura especial
- a los tipos se les llama clases
- objetos a los valores
- funciones miembro a las funciones
- acciones miembro a las acciones
- métodos a los subprogramas
- los métodos se utilizan de forma distinta a los
subprogramas. - El cambio sintáctico de la utilización es el
resultado de un cambio de responsabilidades, ya
no estamos ejecutando una función sino que
estamos pidiendo a un objeto que ejecute un
método con ciertos argumentos.
44La clase string.
45La clase string.
46La clase string.
- Sintaxis para la utilización de los métodos
- La idea es que pedimos a un objeto que ejecute
una operación - Se crea el objeto
- ltN_clasegt N_objeto
- string cadena
- Invocar a un método
- N_objeto.N_metodo(arg1,arg2)
- cadena.erase(pos,n) //elimina n caracteres
//desde pos en cadena
47La clase string.
- include ltiostream.hgt
- include ltstringgt
- void main()
- string a (Hola ), b(a ), c(los lectores.
),d - d a b c
- coutltltdltltendl
- if (bltc)
- coutltltla cadena b es menor que la cltltendl
- string s1,s2,x,re
- int pos,n
- coutltltIntroduce una frase palabra a
palabraltltendlltlt0 para finalizar - do
- cingtgtx
- if(x!0)
- if(!s1.empty())
- s1.append( )
- s1.append(x)
-
- while (x!0)
48La clase string.
-
- coutltltIntroduce la palabra a buscar en la
frase - cingtgts2
- pos0n0
- coutltltla palabra aparece en la frase en la
posición/es - do
- //comprueba si s2 esta en s1. pos es el índice
de la //primera posición de s1 en la que aparece
la cadena //s2.Devuelve 1 cuando no se
encuentra el elemento. - if (pos!-1)
- if(n!0) coutltlt,
- coutltltpos
- posn
-
- while(pos!-1)
-
49La clase string.
-
- coutltltIntroduce la palabra a buscar
- cingtgts2
- coutltltIntroduce la palabra a reemplazar
- cingtgtre
- pos0
- do
- poss1.find(s2,pos)
- if (pos!-1)
- s1.replace(pos,s2.length(),re)
- pos
-
- while(pos!-1)
- coutltltla cadena resultante esltltendlltlts1
-
50Registros. Tipos struct.
- Utilidad agrupar información de carácter
heterogéneo en una estructura. - A cada una de las unidades de información que
constituyen un registro se le llama CAMPO. - Sintaxis
- struct
- ltTipo campo1gt Nombre1
- ltTipo campo2gt Nombre2
- ltTipo campo3gt Nombre3
- NombreRegistro
51Registros. Tipos struct.
- struct
- double ParteReal
- double ParteImaginaria
- complejo
- struct
- char nombre100
- int edad
- char nif14
- persona
52Registros. Tipos struct.
- No se suelen utilizar registros para definir
variables directamente, porque generalmente se
suele necesitar más de una y repetir la
definición es muy costoso. Lo normal es definir
un tipo con typedef. - Sintaxis
- typedef struct
- ltTipo campo1gt Nombre1
- ltTipo campo2gt Nombre2
- ltTipo campo3gt Nombre3
- NombreTipoRegistro
53Registros. Tipos struct.
- No se suelen utilizar registros para definir
variables directamente, porque generalmente se
suele necesitar más de una y repetir la
definición es muy costoso. Lo normal es definir
un tipo con typedef. - Sintaxis
- typedef struct
- ltTipo campo1gt Nombre1
- ltTipo campo2gt Nombre2
- ltTipo campo3gt Nombre3
- NombreTipoRegistro
En algunos entornos se exige repetir el nombre
del tipo después de struct
54Registros. Tipos struct.
- Para utilizar registros
- Sintaxis
- Complejo c
- c.parteReal1
- c.parteImaginaria2
- coutltltla parte real vale ltlt c.parteRealltlt
- ltlt la parte imaginaria vale
ltltc.parteImaginaria - Complejo c_i0.0,1.0
55Registros. Tipos struct.
- Los registros no tienen ninguno de los
comportamientos extraños de los arrays cuando se
emplean en subprogramas. Esto es así incluso
cuando un registro contiene un array. De hecho
una manera de hacer que los arrays se comporten
como el resto de tipos es encerrarlos en
registros.
56Registros. Tipos struct.
- int const N3
- typedef struct vector
- double datosN
- vector
- typedef struct matriz
- vector datosN
- matriz
57Registros. Tipos struct.
- Las operaciones ahora se pueden implementar como
- Sintaxis
- Complejo c
- c.parteReal1
- c.parteImaginaria2
- coutltltla parte real vale ltlt c.parteRealltlt
- ltlt la parte imaginaria vale
ltltc.parteImaginaria - Complejo c_i0.0,1.0