1
TEMA 6: Datos Estructurados
Fundamentos de Informática(Grados en Ingenierías Industriales)
2
1. Arrays.1.1 Arrays Unidimensionales.
1.1.1. Declaración y acceso. 1.1.3. Inicialización de arrays.
1.1.2. Nombres de arrays. 1.1.4. Arrays como argumentos.
1.2. Arrays Multidimensionales.1.2.1. Concepto. Declaración. 1.2.3. Inicialización de arrays.
1.2.2. Acceso a los elementos. 1.2.4. Arrays como argumentos.
1.3. Cadenas de Caracteres.
2. Estructuras.2.1. Declaración y acceso. 2.3. Estructuras como argumentos.
2.2. Inicialización. 2.4. Arrays de estructuras.
3. Búsqueda y Ordenación.
Índice
2
3
• Un array es una colección finita ( num_elementos ) de elementos del mismo tipo de datos ( tipo_elemento ).
• tipo_elemento :- Simple (int, bool, char, float,…)
- Estructurado (array, estructura)
• Declaración de un tipo array
Arrays Unidimensionales: Declaración y Acceso
#include <iostream>
#include <array>
using namespace std;
//--constantes-------------------------------
const unsigned NELMS = 5;
//--tipos de datos nuevos-----------------
typedef array<int, NELMS> Vector;
//--subalgoritmos-------------
typedef array<tipo_elemento,num_elementos> nombre_ti po;typedef array<tipo_elemento,num_elementos> nombre_ti po;
El número de elementos
debe ser una constante
conocida en tiempo de
compilación (cuando se
programa)
Configurar el compilador
para poder utilizar la
biblioteca estándar de C++
4
• Declaración de una cte/vble de un tipo array
Arrays Unidimensionales: Declaración y Acceso
…
//--constantes-------------------------------
const Vector PRIMOS = {2, 3, 5, 7, 11};
//--principal---------------------------------
int main()
{
Vector v;
…
}
2 3 5 7 11PRIMOS
? ? ? ? ?V
3
5
• Inicialización de un array => { .. , .. , .. }─ const Vector PRIMOS = {2,3,5,7} INCOMPLETA
─ const Vector PRIMOS = {2,3,5,7,11,13} ERROR!!
• Acceso a cada elemento => [índice]
- Los índices van de 0 hasta el tamaño del array menos uno
Arrays Unidimensionales: Declaración y Acceso
PRIMOS[0] PRIMOS[3]
2 3 5 7 11PRIMOS
PRIMOS[1] PRIMOS[2] PRIMOS[4]
#include <array>#include <array>
. . .
//--constantes-------------------------------
const unsigned NELMS = 5;
//--tipos de datos nuevos-----------------
typedef array<int,NELMS> Vector;
0…………………………………..NELMS -1 = 4
PRIMOS[5]
¡¡¡Error!!!Acceso fuera de rango
6
Arrays Unidimensionales: Declaración y Acceso
• VENTAJAS de su uso frente a variables aisladas:- Podemos referirnos a todos los elementos a la vez (al declararlos,
al pasarlos a una función, etc.).- Permite resolver problemas de forma sencilla y compacta.
• ¿Cómo se ALMACENAN los arrays en MEMORIA?- Los elementos se almacenan CONTIGUOS en memoria .
typedef array <char,5> c; typedef array <int,5> a;
Elemento 0 1 2 3 4 0 1 2 3 4Dirección 1000 1001 1002 1003 1004 1000 1002 1004 1006 1008
Suponemos :- que ambos arrays comienzan en la posición 1000- que un entero ocupa 2 bytes- que un char ocupa 1 byte (cada número de posición indica 1 byte).
4
7
Arrays Unidimensionales: Operadores Predefinidos
• Asignación (=)─ De valores de un tipo array a una variable del mismo
tipo array.
• Comparación de igualdad (==)─ Devuelve TRUE o FALSE
─ Compara elementos en la misma posición
• Comparación de desigualdad (!=)─ Devuelve TRUE si algún elemento del
primer array no coincide con el que ocupa la misma
posición en el segundo
• Paso de array como parámetro a subprograma─ Por referencia => parámetros de S, o E/S
void leerVector (Vector &v);
─ Por valor => parámetros de E
void escribirVector (Vector v);
─ Por referencia constante => parámetros de E (más eficiente)void escribirVector (const Vector &v):
int main()
{
Vector v1, v2;
v1 = v2;
if (v1==v2)
...
}
8
Arrays Unidimensionales: Argumentos en Funciones
• Operaciones de lectura/escritura de un array─ No se disponen de operaciones predefinidas en C++ para
efectuar la entrada/salida de datos de un tipo array.
─ El usuario debe programar la lectura y/o escritura de cada componente según el tipo de que se trate.
void leerVector (Vector &v)
{
for (unsigned i=0;i<NELMS;i++)
{
cout << "Introd. valor =";
cin >> v[i];
}
}
int mayorElemento (Vector v)
{
int mayor = v[0];
for (unsigned i=1; i<NELMS; i++)
if (mayor<v[i])
mayor = v[i];
return mayor;
}
int sumaElementos (Vector v)
{
int suma=0;
for (unsigned i=0; i<NELMS; i++)
suma+=v[i];
return suma;
}
int main ()
{
Vector v1,v2;
leerVector (v1);
leerVector (v2);
cout << "El mayor elemento es = "
<< mayorElemento (v1)<< endl;
if ( sumaElementos (v1)== sumaElementos (v2))
cout << "Los dos vectores suman igual";
return 0;
}
5
9
Arrays Unidimensionales: Argumentos en Funciones
• Ejemplo_1: Agentes de ventas─ Lee las ventas de cada “agente” e imprime su sueldo.
─ Sueldo = Cantidad fija (1000 euros) + incentivo.
─ Incentivo = 10% de las ventas que ha realizado.
─ Incentivo es sólo aplicable a agentes cuyas ventas superen los 2/3 de la media de ventas del total de los agentes.
VentasAgentes
ventas[i]= Ventas del agente i
//--constantes---------------------------
const unsigned NAGENTES = 20;
const double SUELDO_FIJO = 1000.0;
const double INCENTIVO = 10.0;
const double PROMEDIO = 2.0/3.0;
//--tipos-------------------------------
typedef array<double, NAGENTES> VentasAgentes;
10
Arrays Unidimensionales: Argumentos en Funciones
//--subalgoritmos-----------------------
// Devuelve el p% de valor
double porcentaje (double p, double valor)
{
return (p*valor)/100.0;
}
// Devuelve la media de las ventas total
double calMedias (const VentasAgentes &v)
{
double suma = 0.0;
for (unsigned i=0;i<NAGENTES;i++){
suma+=v[i];
}
return suma/double(NAGENTES);
}
// Lee las ventas de cada agente
void leerVentas (VentasAgentes &v)
{
for (unsigned i=0;i<NAGENTES;i++){
cout << "Int. Ventas agente "<<i<<" = ";
cin >> v[i];
}
}
// Imprimir sueldos de los agentes
void imprimirSueldos (const VentasAgentes &v)
{
double umbral = PROMEDIO*calMedias(v);
double sueldo;
for (unsigned i=0;i<NAGENTES;i++)
{
sueldo=SUELDO_FIJO;
if (v[i]>=umbral){
sueldo+=porcentaje(INCENTIVO,v[i]);
}
cout << "El sueldo del agente " << i
<< " es = "<< sueldo << endl;
}
}
//--programa principal-----------------------
int main ()
{
VentasAgentes ventas;
leerVentas(ventas);
imprimirSueldos(ventas);
}
6
11
Arrays Unidimensionales: Argumentos en Funciones
• Arrays incompletos─ Situaciones en las que NO se conoce num. elementos que
se desea almacenar.
─ En tiempo de compilación se define el array con un tamaño mayor que el núm. elementos contendrá en tiempo de ejecución. Opciones:
� Gestionar el array con huecos (usando una marca).
� Mantener los elementos actuales válidos consecutivos al comienzo del array:
─ Marcar separación elementos válidos de elementos vacíos.
─ Definir una variable que contenga el número de elementos válidos consecutivos.
─ Si se necesita el tamaño del array en una función, éstedebe pasarse como un argumento explícito.
12
Arrays Unidimensionales: Argumentos en Funciones
// Devuelve la media de los num elementos de v
double calMedias (const VentasAgentes &v,
int num)
{ double suma = 0.0;
for (unsigned i=0;i<num;i++){
suma+=v[i];
}
return suma/double(num);
}
// Lee las ventas y las devuelve
// Devuelve también el número de agentes
void leerVentas (VentasAgentes &v, int &n)
{ char respuesta;
bool parar=false;
n = 0;
do
{
cout << "Desea intr. ventas del agente "
<< n << " ? (S/N)";
cin >> respuesta;
if (toupper(respuesta) =='S'){
cout << "Introduce sus ventas: ";
cin >> v[n];
n++;
}
else parar=true;
}while ((!parar) && (n<NAGENTES));
}
// Devuelve el p% de valor
double porcentaje (double p, double valor)
{ return (p*valor)/100.0;
}
// Imprimir sueldos de los agentes
void imprimirSueldos (const VentasAgentes &v,
int num)
{
double umbral = PROMEDIO*calMedias(v,num);
for (unsigned i=0;i<num;i++)
{
double sueldo=SUELDO_FIJO;
if (v[i]>=umbral){
sueldo+=porcentaje(INCENTIVO,v[i]);
}
cout << "El sueldo del agente " << i
<< " es = "<< sueldo << endl;
}
}
//--programa principal-----------------------
int main ()
{
int numele;
VentasAgentes ventas;
leerVentas(ventas, numele);
imprimirSueldos(ventas, numele);
}
7
13
Arrays Multidimensionales: Concepto y Declaración
• Un array es MULTIDIMENSIONAL si tiene más de una dimensión.
• Una matriz es un array de 2 dimensiones, es decir un arrayunidimensional donde cada elemento es, a su vez, un arrayunidimensional.
• Declaración de un tipo Matriz
• Declaración de una cte/vble de un tipo array
typedef array<tipo_elemento,NCOLUMNAS> Fila;
typedef array<Fila,NFILAS> Matriz;
typedef array<tipo_elemento,NCOLUMNAS> Fila;
typedef array<Fila,NFILAS> Matriz;
const Matriz m = {……};
int main()
{ …
Matriz Temperaturas;
const Matriz m = {……};
int main()
{ …
Matriz Temperaturas;
14
Arrays Multidimensionales: Inicialización/Acceso
• Inicialización de una matriz => { .. , .. , .. }─ Todos los valores seguidos (matriz de 2x3)
Matriz m = { 1,1,1,2,2,2 } ;
─ Por partes
Matriz m = { {1,1,1} , {2,2,2} } ;
1. La organización: es más fácil de leer.
2. Son útiles para las inicializaciones incompletas.
• Acceso a fila,columna,elemento => [índice]
- 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.
8
15
Arrays Multidimensionales: Inicialización/Acceso
• Acceso a fila,columna,elemento => [índice]
- 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.
Matriz m;
typedef array<int,10> Fila;
typedef array<Fila,3> Matriz;m[1][5]
m[0][8]
m[0][1]
m[1][1]
m[2][1]
Columna m[2] Fila
16
Son 15 enteros
le1
mt1
Arrays Multidimensionales: Inicialización/Acceso
• ¿Cómo se ALMACENAN los elementos en MEMORIA ?- Los elementos se almacenan CONTIGUOS en memoria.
//--constantes---------------------------
const unsigned NELEMENTOS = 3;
const unsigned NFILAS = 3;
const unsigned NCOLUMNAS = 5;
//--tipos-------------------------------
typedef array<int,NELEMENTOS> ListaEnteros;
typedef array<int,NCOLUMNAS > Fila;
typedef array<Fila,NFILAS> Matriz;
//-------------------------
int main()
{
ListaEnteros le1;
Matriz mt1;
…
}
9
17
#include <array>const unsigned NFILAS = 3;const unsigned NCOLUMNAS = 4;typedef array<int,NCOLUMNAS> Fila;typedef array<Fila,NFILAS> Matriz;int main(){
Matriz m;for(unsigned f=0;f<NFILAS;f++)
for(unsigned c=0;c<NCOLUMNAS;c++)m[f][c]=(f*4)+c+1;
. . .return 0;
}
0 1 2 3
0 1 2 3 4
1 5 6 7 8
2 9 10 11 12
Arrays Multidimensionales: Acceso a los Elementos (por Índices)
• Ejemplo_1: Cargar un array bidimensional con los números del 1 al 12
18
#include <array>const unsigned NFILAS = 2;const unsigned NCOLUMNAS = 3;typedef array<int,NCOLUMNAS> Fila;typedef array<Fila,NFILAS> Matriz;int main(){
Matriz m = {{1,2,3},{4,5,6}};for(unsigned f=0;f<NFILAS;f++)
for(unsigned c=0;c<NCOLUMNAS;c++)cout << " Valor de [" << f << "]"
<< "[" << c << "] es " << m[f][c] << "\n";
return 0; }
Arrays Multidimensionales: Acceso a los Elementos (por Índices)
• Ejemplo_2: Programa que muestra los valores almacenados en un array bidimensional 2 por 3 SALIDA EN PANTALLA
El valor de [0][0] es 1
El valor de [0][1] es 2
El valor de [0][2] es 3
El valor de [1][0] es 4
El valor de [1][1] es 5
El valor de [1][2] es 6
10
19
Arrays Multidimensionales: Argumentos en Funciones
• Paso de array multidimensional comoparámetro a subprograma─ Por referencia => parámetros de S o E/S
void leerMatriz (Matiz &m);
─ Por referencia constante => parámetros de E
void escribirMatrizPantalla (const Matriz &m):
• Ejemplo_3:─ a => elementos de la matriz leída desde el teclado.
─ b => resultado de sumar todos los elementos de la fila.
─ C => resultado de sumar todos los elementos de la colum.
c c c c
b a a a a
b a a a a
b a a a a
20
Arrays Multidimensionales: Argumentos en Funciones. Ejemplo
//--subalgoritmos-----------------------
int sumarFila (const Fila &f)
{
int suma = 0;
for (unsigned c=0;c<NCOLUMNAS;c++){
suma+=f[c];
}
return suma;
}
int sumarColumna (const Matriz &m,unsigned c)
{
int suma = 0;
for (unsigned f=0;f<NFILAS;f++){
suma+=m[f][c];
}
return suma;
}
void escribirFila (const Fila &fil)
{
for (unsigned c=0;c<NCOLUMNAS;c++){
cout << fil[c] << " ";
}
}
void escribirMatrizFormato (const Matriz &m)
{
for (unsigned f=0;f<NFILAS;f++){
escribirFila(m[f]);
cout << "- " << sumarFila (m[f]);
cout << endl;
}
cout << "-------------" << endl;
for (unsigned c=0;c<NCOLUMNAS;c++){
cout << sumarColumna(m,c)<<" ";
}
cout << endl;
}
void leerMatriz (Matriz &m)
{
cout << "Escribe fila a fila "<<endl;
for (unsigned f=0;f<NFILAS;f++)
for (unsigned c=0;c<NCOLUMNAS;c++)
cin >> m[f][c];
}
//--programa principal-----------------------
int main ()
{
Matriz m;
leerMatriz(m);
escribirMatrizFormato(m);
}
11
21
• Una cadena de caracteres se almacena en el tipo de dato string , que es similar a un array unidimensional de char .
• La librería string contiene funciones para realizar la mayor parte de las operaciones básicas sobre cadenas.
• Entrada/salida de cadenas (tipo string ):• Salida :
• Se realiza de la misma forma que si fuera un tipo predefinido, es decir, usando cout << cadena;
• Entrada : tenemos varias opciones• Usar cin tiene el inconveniente de que se usa el espacio,
tabulador, y Enter como separadores de las cadenas, por lo que si introducimos una frase, sólo leeríamos la primera palabra: cin >> cadena;
• Para leer frases (con espacios) usar la función getline , que nos permite leer una cadena de caracteres hasta un separador que nosotros indiquemos:
Cadenas de Caracteres: Entrada/Salida
string frase;
getline(cin, frase, '\n');
22
Cadenas de Caracteres: Entrada/Salida
int main()
{
string cadena1, cadena2;
cout << "Introduzca la Cadena: Hola Pepe" << endl;
cin >> cadena1; // Sólo lee una palabra: Hola (Pepe queda sin leer)
cin.ignore(100,'\n') ; // Por si queda algo en el buffer
cout << "Introduzca de nuevo la Cadena: Hola Pepe" << endl;
getline(cin, cadena2, '\n'); // Ahora lee las dos palabras
cout << "\n- La cadena leida con cin >> : " << caden a1 << endl;
cout << "\n- La cadena leida con getline: " << caden a2 << endl;
return 0;
} NOTA: cin.ignore(n, delim)
Elimina caracteres del canal (o buffer) de entrada.
La extracción acaba cuando se han eliminado ya ncaracteres, o bien nos encontramos con el caracter delim
(que también es eliminado), lo que ocurra primero.
12
23
Cadenas de Caracteres: Entrada/Salida
/* Calcula las veces que aparece el carácter ch en una cadena str */
int main()
{ string str;
char ch;
int veces = 0, i = 0, longitud;
cout << "Escribe el carácter para buscar: ";
cin >> ch; // No lee espacio en blanco -> Para ello ejecutar antes: cin >> noskipws;
cin.ignore(100,'\n'); // Quita el Intro introducido tras el carácter anterior
cout << "Escribe un texto: ";
getline(cin, str, '\n');
longitud = str.length(); // Número de caracteres de str
for(i=0; i<longitud; i++)
if(str[i] == ch) // Compara ch con el carácter en la posición i de str
veces++;
cout << "El número de veces que aparece es: " << ve ces;
return 0;
}
24
� ¿Qué hace el siguiente programa?
Cadenas de Caracteres
int main(){
string nm = "pepe luis";if (nm <= "lucas"){
nm += " lopez";}cout << "Imprimo en pantalla_1: "<< nm << endl;nm = nm.substr(5,4) + "miguel";cout << "Imprimo en pantalla_2: "<< nm << endl;for (unsigned i=0; i<nm.size(); ++i){
nm[i]=char (nm[i]+1);}cout << "Imprimo en pantalla_3: "<< nm << endl;cin >> nm;getline (cin, nm);cout << "Imprimo en pantalla_4: " <<nm << endl;return 0;
}
13
25
� ¿Qué hace el siguiente programa?
Cadenas de Caracteres
cin >> nm; // Lee hasta el primer separador ("juanita")
getline (cin, nm); // Lee hasta el primer retorno carro
cout <<"Imprimo en pantalla_4: " <<nm << endl; (" banana")
26
• Tener en cuenta• cin deja en el buffer el terminador o separador.• getline no deja el terminador• Si tras cin se usa getline , puede perderse la entrada
• ignore• Elimina el separador => cin.ignore();• Se le puede indicar un número máximo de caracteres a eliminar,
si antes no encuentra el terminador => cin.ignore(256, '\n');
Cadenas de Caracteres
14
27
� Mostrar cada carácter de una palabra
Cadenas de Caracteres: Ejemplo
void escribir (string palabra){
unsigned longitud, i;longitud = palabra.size();for (i=0; i<longitud; i++){
cout << palabra[i] << ", ";}
}int main(){
string palabra;cin >> palabra;escribir (palabra);return 0;
}
28
� Leer una línea:
Cadenas de Caracteres: Ejemplo
// Lee una línea, carácter a caráctervoid leerLinea (string &lin){
char caracter;lin.clear(); // Borra el contenido de la cadena dejándola en 0 caracteres
cin >> noskipws >> caracter; // Evita que salte los espacios y el terminador
while (caracter != '\n') // Sin noskipws este bucle sería infinito
{lin += caracter;cin >> caracter;
}}int main(){
string linea;leerLinea(linea);cout << linea;return 0;
}
15
29
� Convierte a mayúsculas los caracteres de una palabra
Cadenas de Caracteres: Ejemplo
void mayuscula (char &letra){
if((letra>='a') && (letra<='z')){letra = char (unsigned(letra)-unsigned('a')+unsigned ('A'));
}}void mayusculas (string &palabra){
for (unsigned i=0; i<palabra.size(); i++){mayuscula(palabra[i]);
}}int main(){
string palabra;cin >> palabra;mayusculas (palabra);cout << palabra << endl;return 0;
}
30
� Una estructura es un grupo de información relacionada que se usa para almacenar datos acerca de un tema o actividad.
- Las estructuras están divididas en CAMPOS.
- Un campo es una variable de un tipo determinado.
Estructuras: Definición
typedef struct {
tipo1 campo1;
tipo2 campo2; ...
tipoN campoN;} nombre_tipo ;
nombre_tipo variable1, variable2;
Declaración de variables del
nuevo tipo estructura definido
antes: nombre_tipo
Definición de un nuevo tipo
estructura nombre_tipo
16
31
• Para acceder a cada campo se utiliza el operador punto (.)• Se pone el nombre de una variable de tipo estructura seguida de un punto y
luego el nombre del campo .
typedef struct {
string titulo ; /* título del libro */
string autor ; /* autor del libro */
int num; /* número del libro */
} Tlibro;
Tlibro lib ; /* variable de tipo struct libro */
lib .titulo /* accede al título */
lib . autor /* accede al autor */
lib . num /* accede al número del libro */
lib .titulo[i] /* i-ésimo carácter del título */
Estructuras: Acceso a los Campos
32
typedef struct {
float coste;
int codigo;
string nombre;
} Tcomponente ;
int main() {
Tcomponente c;
c.coste = 1.5;
c.codigo = 32201;
c.nombre = "resistencia";
. . . .
cout << "Nombre " << c.nombre
<< ", código " << c.codigo
<< ", coste " << c.coste;
return 0;
}
Estructuras: Ejemplo
17
33
• Los campos de una estructura se pueden inicializar a la vez que se declara la variable (igual que los arrays):
Tlibro l ={"Rebeca", "D. du Maurier", 124};
• Se puede asignar una estructura a otra utilizando el operador de asignación =
typedef struct {string nombre ;string direc ;int edad ;float altura , peso ;
} Tpersona ;
Tpersona p1, p2 ;//. . .
p1 = p2;
• La operación de comparación == no está permitida.
Estructuras: Inicialización y Asignación
34
typedef array<int, 20> Telementos ;typedef struct {
int n; Telementos a;
} Tlista ;
int main() { // Inicio mainint i, num=0; float valor;Tlista lista ;cout << " ¿Cuántos elementos
tiene la lista? "; cin >> lista .n;for (i=0;i<lista .n;i++) {
cout << "Valor " << i+1 << " : "; cin >> lista. a[i];
}
Estructuras: Ejemplo
cout << "Valor mínimo para filtrar la lista: ";cin >> valor;
for (i=0;i<lista .n;i++) {
if (lista. a[i] >= valor) num++;
}cout << "Hay " << num;cout << " números mayores que " << valor;return 0;
} // Fin main
Escribe cuántos números son mayores que un valor
18
35
• Funciona como el paso por valor de cualquier otra variable:• A la función se le pasa una COPIA de la estructura.• La función sólo puede modificar la copia y no la variable estructura original.• Cuando acaba la función los cambios NO se reflejan en la estructura
original.
// Escribir los datos de una persona xvoid VisualizarDatos( Tpersona x) {
cout << "- Nombre: " << x. nombre << endl ;cout << "- Dirección : " << x. direc << endl ;cout << "- La edad es: " << x. edad << endl ;cout << "- La altura es: " << x. altura << endl ;cout << "- El peso es: " << x. peso << endl ;
}int main() {
Tpersona p1;...VisualizarDatos( p1); // se pasa una copia de p1
}
Estructuras en Funciones: Paso de Estructuras por Valor
36
// Leer los datos de una persona y devolverlos
Tpersona LeerPersona() {
Tpersona temp ; // estructura local
cout << "Nombre? ";
getline(cin, temp . nombre ,'\n');
cout << "Direccion? ";
getline(cin, temp . direc ,'\n');
cout << "Edad? ";
cin >> temp . edad ;
cout << "Altura? ";
cin >> temp . altura ;
cout << "Peso? ";
cin >> temp . peso ;
// Devuelve una copia de temp
return temp ;
}
Funciones que Devuelven Estructuras
int main() {
Tpersona p1;
// Guarda la estructura
// devuelta por la función:
p1=LeerPersona();
// Visualiza el contenido
// de la estructura p1:
VisualizarDatos( p1);
}
19
37
• Se pone un ‘&’ detrás del nombre del tipo de la estructura en la definición de la función.
• Si varía el valor de la variable en la función, también cambia la variable que corresponda en la llamada.
// Leer los datos de una persona y devolverlos en pvoid LeerPersona2( Tpersona & p) {
cout << "Datos? "; // Hay un paso de parámetrosgetline(cin, p. nombre ,'\n'); // por referenciagetline(cin, p. direc ,'\n');cin >> p. edad ; cin >> p. altura ; cin >> p. peso ;
}void main() {
Tpersona p1;LeerPersona2( p1); // La variable p1 CAMBIAVisualizarDatos( p1);
}
Estructuras en Funciones: Paso de Estructuras por Referencia (en C++)
38
• Se pueden construir arrays en los que cada elemento sea una estructura.
typedef struct {
double real, imag;
} Tcomplex;
typedef array<TComplex,10> TListaComplejos;
TListaComplejos x; /* Array unidimensional de 10 elementos, cada uno de ellos es una estructura complex */
� Acceso a cada campo:x[0].real = 2.5
x[5].imag = 3.2;
0 1 2 3 4 5 6 7 8 9
x 2.5
3.2
Arrays de Estructuras
20
39
typedef struct {char nombre[30];float notaT,notaP;
} TAlumno ;
typedef array< TAlumno ,50> TListaAlumnos ;int main() { // Listado de aprobados y suspensos
TListaAlumnos A; // Array de alumnosint i, N;cout<< "Cuántos alumnos? "; cin >> N;.......... // Dar valores al arrayfor (i=0; i<N; i++){
cout << A[i].nombre << "\t";if ((0.6*A[i].notaT+0.4*A[i].notaP)<5.0)
cout << "Suspenso.\n";else
cout << "Aprobado.\n";}
}
Arrays de Estructuras: Ejemplo
40
Algoritmos Básicos de BÚSQUEDA
• Objetivo : Buscar un elemento determinado en una lista de objetos.
• Características : Para cualquier tipo de datos.– Para cada tipo de datos deberá usarse un comparador
adecuado.
• Supondremos :– Número de Elementos: N
– Tipo de los Elementos: cualquiera– Array (vector) con los N Elementos: V
Desde el Elemento V[0] hasta el V[N-1]
– Elemento a buscar: x
21
41
Búsqueda Secuencial o Lineal
• Se usa cuando no existe información adicional sobre los datos.
• Se hace un recorrido secuencial a través del array hasta que se encuentra el elemento, o bien hasta que se llega al final (si el elemento no se ha encontrado):ind=0;
while(ind<N && V[ind]!=x) {
ind++;
}
if (ind>=N)
puts("No encontrado.");
else
cout << "Encontrado en la posición: "
<< ind << endl;
42
Algoritmos Simples de ORDENACIÓN
• Objetivo : Ordenar una lista de objetos de acuerdo a un criterio �Debe existir una Relación de Orden “<” entre los objetos.
• Características : Para cualquier tipo de datos y tanto para ordenación ascendente como descendente .
• Supondremos :
– Número de Elementos: N
– Tipo de los Elementos: int
– Array (vector) con los N Elementos: VDesde el Elemento V[0] hasta el V[N-1]
– Función para Intercambiar Elementos: Swap()
void Swap (int& x, int& y){int temp=x;x=y;y=temp;
}
22
43
Ordenación por “Selección”
• En la iteración de la posición i se supone que están ordenados las posiciones hasta i—1.
• Para cada posición i : Seleccionar el elemento más pequeño (en la posición PosMin ) entre las posiciones i y N—1, y se intercambia con el elemento que está en la posición i .
0 i PosMin N-1... ... ...
44
Ordenación por “Selección”
/* N-1 iteraciones: Desde i=0 hasta i=N-2 */for (i=0; i<N-1; i++){
PosMin = i; /* Posición del elemento mínimo */
/* Buscar posición del elemento mínimo entrelas posiciones i+1 y N-1: PosMin */
for (j=i+1; j<N; j++)if (V[j] < V[PosMin])
PosMin = j;
/* Intercambiar el elemento mínimo con elsituado en la posición i (puedencoincidir) */
Swap(V[PosMin], V[i]);}
Top Related