Tipos de datos estructurados
description
Transcript of Tipos de datos estructurados
5Grado en Ingeniería Informática
Grado en Ingeniería del Software Grado en Ingeniería de Computadores
Luis Hernández Yáñez
Facultad de InformáticaUniversidad Complutense
Fundamentos de la programación 2011-2012
Tipos de datos estructurados
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Índice
Página 2
Tipos estructurados 2Arrays 5
Declaración 8Uso 10Ejemplos 14Capacidad y copia de arrays 21Arrays multidimensionales 23Inicialización de arrays 34Paso de arrays a funciones 37
Cadenas de caracteres 40Cadenas de caracteres al estilo de C44Cadenas de caracteres de tipo
string 50Estructuras 58
Combinación de tipos estructurados63
Luis
Her
nánd
ez Y
áñez
Fundamentos de la programación
Página 3Fundamentos de la programación: Tipos de datos estructurados
Tipos estructurados
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Tipos de datos
Clasificación de tipos Simples
Estándar: int, float, double, char, boolEl conjunto de valores está predeterminado.
Definidos por el usuario: enumeradosEl conjunto de valores lo define el programador.
Estructurados Colecciones homogéneas: arrays
Todos los elementos de la colección son del mismo tipo. Colecciones heterogéneas: estructuras
Los elementos de la colección pueden ser de tipos distintos.
Página 4
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Tipos estructurados
Colecciones o tipos aglomeradosAgrupación de datos (elementos): Todos del mismo tipo: array o tabla. De tipos distintos: estructura o tupla.
Arrays (tablas) Elementos organizados por posición: 0, 1, 2, 3, ... Acceso por índice (posición): 0, 1, 2, 3, ... Una o varias dimensiones.
Estructuras(tuplas, registros) Elementos sin orden establecido. Acceso por nombre (campos).
Página 5
Luis
Her
nánd
ez Y
áñez
Fundamentos de la programación
Página 6Fundamentos de la programación: Tipos de datos estructurados
Arrays
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays
Colecciones homogéneasUn mismo tipo de dato para varios elementos: Notas de los estudiantes de una clase Ventas de cada día de la semana Temperaturas de cada día del mes
...
En lugar de declarar N variables...
Página 7
125.40vLun
76.95vMar
328.80vMie
254.62vJue
435.00vVie
164.29vSab
0.00vDom
ventas
125.40
76.95 328.80
254.62
435.00
164.29
0.00
0 1 2 3 4 5 6
... declaramos una tabla de N valores:
Índices
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays
Estructura secuencialCada elemento se encuentra en una posición (índice): Los índices son enteros positivos El índice del primer elemento siempre es 0 Los índices se incrementan de uno en uno
Acceso directo
A cada elemento se accede directamente a través de su índice:
ventas[4] accede al 5º elemento del array (contiene el valor 435.00).cout << ventas[4];
ventas[4] = 442.75;
Página 8
ventas
125.40
76.95 328.80
254.62
435.00
164.29
0.00
0 1 2 3 4 5 6
Cada elemento es un dato del tipo base.Se usa como cualquier otra variable de ese tipo.
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Tipos arrays
Declaración de tipos de arraystypedef tipo_base nombre[tamaño];
Ejemplos:typedef double tTemp[7];typedef short int tDiasMes[12];typedef char tVocales[5];typedef double tVentas[31];typedef tMoneda tCalderilla[15]; // Enumerado tMoneda
Página 9
[Identificador Expresión ]Tipotypedef
Recuerda: Adoptamos el convenio de comenzar los nombres de tipo con una t minúscula, seguida de una o varias palabras, cada una con su inicial en mayúscula.
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Variables arrays
Declaración de variables arraystipo nombre;
Ejemplos:
Página 10
NO se inicializan los elementos automáticamente.
tempMax ? ? ? ? ? ? ?
0 1 2 3 4 5 6
typedef double tTemp[7];typedef short int tDiasMes[12];typedef char tVocales[5];typedef double tVentas[31];
ventasFeb ? ? ? ? ? ? ? ? ? ? ? ? ? ... ?
0 1 2 3 4 5 6 7 8 9 10 11 12 30
vocales ? ? ? ? ?
0 1 2 3 4
diasMes ? ? ? ? ? ? ? ? ? ? ? ?
0 1 2 3 4 5 6 7 8 9 10 11
tTemp tempMax;
tDiasMes diasMes;
tVocales vocales;
tVentas ventasFeb;
Luis
Her
nánd
ez Y
áñez
Fundamentos de la programación
Página 11Fundamentos de la programación: Tipos de datos estructurados
Uso de arrays
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Uso de arrays
Acceso a los elementos de un arraynombre[índice]
A cada elemento se accede directamente a través de su índice (posición).
tVocales vocales;
5 elementos, índices de 0 a 4:vocales[0] vocales[1] vocales[2] vocales[3] vocales[4]
Procesamiento de cada elemento:
El mismo que cualquier variable del tipo base.cout << vocales[4];
vocales[3] = 'o';
if (vocales[i] == 'e') ...
Página 12
vocales 'a' 'e' 'i' 'o' 'u'
0 1 2 3 4
NO SE COMPRUEBA SI EL ÍNDICE ES VÁLIDO.¡Es responsabilidad del programador!¡¡¡ ¿¿¿ vocales[7] ??? !!!
typedef char tVocales[5];
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays
Procesamiento Recorridos. Búsquedas. Ordenación.
. . .
Se verán con detenimiento en los próximos temas.
Arrays y bucles forArrays: tamaño fijo Bucle de recorrido fijo (for)tTemp tempMax;double mediaMax, total = 0; ...for (int i = 0; i < 7; i++) total = total + tempMax[i];mediaMax = total / 7;
Página 13
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Memoria
tempMax[0] 12.40
tempMax[1] 10.96
tempMax[2] 8.43
tempMax[3] 11.65
tempMax[4] 13.70
tempMax[5] 13.41
tempMax[6] 14.07
mediaMax ?
total 0.00
i 0
12.40
1
23.36
2
31.79
3
43.44
4
84.62
7
Arrays
tTemp tempMax;double mediaMax, total = 0; ...for (int i = 0; i < 7; i++) total = total + tempMax[i];
Página 14
12.40 10.96 8.43 11.65 13.70 13.41 14.07
0 1 2 3 4 5 6
falsetrue
total+=tempMax[i];
i++
i < 7
i = 0
...
Luis
Her
nánd
ez Y
áñez
Fundamentos de la programación
Página 15Fundamentos de la programación: Tipos de datos estructurados
Ejemplos
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays
Días de cada mes
const int Meses = 12;typedef short int tDiasMes[Meses];tDiasMes diasMes; // Días de cada mes del añodiasMes[0] = 31; // EnerodiasMes[1] = 29; // Febrero (¡bisiesto!)diasMes[2] = 31; // MarzodiasMes[3] = 30; // AbrildiasMes[4] = 31; // MayodiasMes[5] = 30; // JuniodiasMes[6] = 31; // JuliodiasMes[7] = 31; // AgostodiasMes[8] = 30; // SeptiembrediasMes[9] = 31; // OctubrediasMes[10] = 30; // NoviembrediasMes[11] = 31; // Diciembre
Página 16
Define el tamaño del array con una constante.
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays
Días de cada mes
Página 17
Los usuarios usan de 1 a 12 para numerar los meses.La interfaz debe aproximarse a los usuarios,
aunque internamente se usen los índices de 0 a 11.
// Calculamos la media de díasdouble total = 0, media;for (int mes = 0; mes < Meses; mes++) total = total + diasMes[mes];media = total / Meses;
// Mostramos los días de cada mes del añofor (int mes = 0; mes < Meses; mes++) cout << "Mes " << mes + 1 << ": " << diasMes[mes] << "dias" << endl;
diasMes 31 29 31 30 31 30 31 31 30 31 30 31
0 1 2 3 4 5 6 7 8 9 10 11
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays
Temperaturas máximas y mínimas de la semana
const int Dias = 7;typedef double tTemp[Dias];tTemp tempMin, tempMax; // Mínimas y máximas – 2 arrays
// Pedimos al usuario las temperaturasfor (int dia = 0; dia < Dias; dia++) { cout << "Dia " << dia + 1 << ": " << endl; cout << "Minima: "; cin >> tempMin[dia]; cout << "Maxima: "; cin >> tempMax[dia];}
2 arrays paralelos que se manejan conjuntamente.Alternativas: array bidimensional o array de estructuras...
Página 18
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays
Total de ventas de cada día del mesconst int MaxDias = 31;typedef double tVentas[MaxDias];tVentas ventasFeb; // Ventas de cada día de febrero
¿Cuántos días tiene ese mes (febrero)?const int Meses = 12;typedef short int tDiasMes[Meses];tDiasMes diasMes;inicializa(diasMes); // Asigna a cada mes su nº de días
// Pedimos al usuario las ventas de ese mes...for (int dia = 0; dia < diasMes[1]; dia++) { // ¡Ojo! Febrero tiene índice 1 (Enero el 0) cout << "Ventas del dia " << dia + 1 << ": "; cin >> ventasFeb[dia];}
Página 19
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays
Inicialización del array de díasvoid inicializa(tDiasMes dias) { dias[0] = 31; // Enero dias[1] = 29; // Febrero (¡bisiesto!) dias[2] = 31; // Marzo dias[3] = 30; // Abril dias[4] = 31; // Mayo dias[5] = 30; // Junio dias[6] = 31; // Julio dias[7] = 31; // Agosto dias[8] = 30; // Septiembre dias[9] = 31; // Octubre dias[10] = 30; // Noviembre dias[11] = 31; // Diciembre}
Página 20
Los arrays se pasansiempre por referencia,sin tener que usar &.
¡dias vuelve modificado!
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays
Array de valores de enumeradostring aCadena(tMoneda moneda); // Prototipo de funciónconst int MaxMonedas = 15;typedef enum { centimo, dos_centimos, cinco_centimos, diez_centimos, veinte_centimos, medio_euro, euro } tMoneda;
typedef tMoneda tCalderilla[MaxMonedas];
tCalderilla bolsillo; // Hasta MaxMonedas monedas que llevobolsillo[0] = euro;bolsillo[1] = cinco_centimos;bolsillo[2] = medio_euro;bolsillo[3] = euro;bolsillo[4] = centimo;...for (int moneda = 0; moneda < MaxMonedas; moneda++) cout << aCadena(bolsillo[moneda]) << endl;
Página 21
Luis
Her
nánd
ez Y
áñez
Fundamentos de la programación
Página 22Fundamentos de la programación: Tipos de datos estructurados
Capacidad y copia de arrays
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays
Capacidad de los arraysLa capacidad de un array se define en la declaración y no puede ser cambiada en tiempo de ejecución.
El tamaño de un array es una decisión del diseño. En ocasiones será fácil (días de los 12 meses del año). Cuando pueda variar (lista de clientes) ha de estimarse un tamaño
que no se quede corto ni desperdicie mucha memoria (posiciones sin usar).
La STL (Standard Template Library) de C++ proporciona coleccionesmás eficientes cuyo tamaño puede variar dinámicamente.
Copia de arraysNo se pueden copiar dos arrays (del mismo tipo) con la asignación:
array2 = array1; // ¡¡¡ NO COPIA LOS ELEMENTOS !!!
Han de copiarse los elementos uno a uno:
for (int i = 0; i < N; i++) array2[i] = array1[i];
Página 23
Luis
Her
nánd
ez Y
áñez
Fundamentos de la programación
Página 24Fundamentos de la programación: Tipos de datos estructurados
Arrays multidimensionales
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays multidimensionales
Arrays de varias dimensionesPodemos indicar varios tamaños en la declaración de un array.
Cada uno en su par de corchetes.
typedef tipo_base nombre[tamaño1][tamaño2]...[tamañoN];
El array tendrá varias dimensiones, tantas como tamaños se indiquen.typedef double tMatriz[50][100];
tMatriz matriz;
matriz es una tabla bidimensional de 50 filas por 100 columnas:
Página 25
0 1 2 3 ... 98 99
0 ...
1 ...
2 ...
... ... ... ... ... ... ... ...
48 ...
49 ...
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays multidimensionales
Arrays de varias dimensionestypedef double tMatriz[50][100];
tMatriz matriz;
Ahora cada elemento del array se localiza con dos índices, uno por cada dimensión.cout << matriz[2][98];
Página 26
0 1 2 3 ... 98 99
0 ...
1 ...
2 ...
... ... ... ... ... ... ... ...
48 ...
49 ...
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays multidimensionales
Arrays de varias dimensionesPodemos definir tantas dimensiones como necesitemos.typedef double tMatriz[5][10][20][10];
tMatriz matriz;
Necesitamos tantos índices como dimensiones:cout << matriz[2][9][15][6];
Página 27
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays
Ejemplo de arrays multidimensionalesTemperaturas mínimas y máximas.
Matriz bidimensional de días y mínima/máxima:const int MaxDias = 31;
typedef double tTemp[MaxDias][2]; // Día x mínima / máxima
tTemp temp;
double tempMaxMedia, tempMinMedia, tempMaxAbs, tempMinAbs;
int dias = 0;
Ahora: temp[i][0] es la temperatura mínima del día i+1. temp[i][1] es la temperatura máxima del día i+1.
Página 28
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays...
int main() { const int MaxDias = 31; typedef double tTemp[MaxDias][2]; // Día x mínima / máxima tTemp temp; double tempMaxMedia = 0, tempMinMedia = 0, tempMaxAbs = -100, tempMinAbs = 100; int dias = 0; double max, min; ifstream archivo; archivo.open("temp.txt"); if (!archivo.is_open()) cout << "No se ha podido abrir el archivo." << endl; else { archivo >> min >> max; // El archivo termina con -99 -99 while (!((min == -99) && (max == -99)) && (dias < MaxDias)) { temp[dias][0] = min; temp[dias][1] = max; dias++; archivo >> min >> max; } ...
Página 29
temp.cpp
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays... for (int i = 0; i < dias; i++) { tempMinMedia = tempMinMedia + temp[i][0]; if (temp[i][0] < tempMinAbs) tempMinAbs = temp[i][0]; tempMaxMedia = tempMaxMedia + temp[i][1]; if (temp[i][1] > tempMaxAbs) tempMaxAbs = temp[i][1]; } tempMinMedia = tempMinMedia / dias; tempMaxMedia = tempMaxMedia / dias; cout << "Temperaturas minimas.-" << endl; cout << " Media = " << fixed << setprecision(1) << tempMinMedia << " C Minima absoluta = " << setprecision(1) << tempMinAbs << " C" << endl; cout << "Temperaturas maximas.-" << endl; cout << " Media = " << fixed << setprecision(1) << tempMaxMedia << " C Maxima absoluta = " << setprecision(1) << tempMaxAbs << " C" << endl; archivo.close(); }
return 0;}
Página 30
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays
Enumerados como índicestypedef enum { minima, maxima } tTipoTemp;
const int MaxDias = 31;
typedef double tTemp[MaxDias][2]; // Día x { mínima, máxima }
tTemp temp;int dias = 0;double max, min;ifstream archivo;...
Página 31
Recuerda que internamentese asignan enteros a partir de 0
a los distintos símbolos del enumerado.minima 0 maxima 1
archivo >> min >> max; while (!((min == -99) && (max == -99)) && (dias < MaxDias)) { temp[dias][minima] = min; temp[dias][maxima] = max; dias++; archivo >> min >> max; }
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays
Ventas de todos los meses de un año (bisiesto)
Página 32
Array bidimensional de meses y días:const int Meses = 12;const int MaxDias = 31;typedef double tVentas[Meses][MaxDias];tVentas ventas; // Ventas de todo el añotypedef short int tDiasMes[Meses];tDiasMes diasMes;inicializa(diasMes); // Asigna a cada mes su nº de días// Pedimos al usuario las ventas de cada día del año...for (int mes = 0; mes < Meses; mes++) for (int dia = 0; dia < diasMes[mes]; dia++) { cout << "Ventas del dia " << dia + 1 << " del mes " << mes + 1 << ": "; cin >> ventas[mes][dia]; }
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays
Ventas de todos los meses de un año (bisiesto)
Página 33
0 1 2 3 4 ... 29 30 31
0 201 125 234 112 156 ... 234 543 667
1 323 231 675 325 111 ... 342
2 523 417 327 333 324 ... 444 367 437
3 145 845 654 212 562 ... 354 548
4 327 652 555 222 777 ... 428 999 666
5 854 438 824 547 175 ... 321 356
6 654 543 353 777 437 ... 765 678 555
7 327 541 164 563 327 ... 538 159 235
8 333 327 432 249 777 ... 528 529
9 524 583 333 100 334 ... 743 468 531
10 217 427 585 218 843 ... 777 555
11 222 666 512 400 259 ... 438 637 879
Días
MesesCeldas no utilizadas
Luis
Her
nánd
ez Y
áñez
Fundamentos de la programación
Página 34Fundamentos de la programación: Tipos de datos estructurados
Más sobre arrays
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays
Inicialización de arraysPodemos dar valores a los elementos de los arrays durante la declaración.
Asignamos una lista de valores al array:int i[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int cuads[5][2] = {1,1, 2,4, 3,9, 4,16, 5,25};
Se van asignando los valores iniciales en el orden en el que los elementos están mantenidos en memoria.
La memoria es de una dimensión: secuencia de celdas.
Los elementos de un array multidimensional se colocan en la memoria haciendo variar siempre más rápidamente los índices de la derecha.cuads[0][0] cuads[0][1] cuads[1][0] cuads[1][1] cuads[2][0]...
Para cada valor del primer índice se recorren todos los valores del segundo.
Página 35
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays
Inicialización de arraysint cuads[5][2] = {1,1, 2,4, 3,9, 4,16, 5,25};
Página 36
Memoria
cuads[0][0] 1
cuads[0][1] 1
cuads[1][0] 2
cuads[1][1] 4
cuads[2][0] 3
cuads[2][1] 9
cuads[3][0] 4
cuads[3][1] 16
cuads[4][0] 5
cuads[4][1] 25
Si hay menos valores que elementos,el resto se inicializan a cero.
Inicialización a cero de todo un array:
int cuads[5][2] = { 0 };
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays
Inicialización de arraystypedef double tMatriz[3][4][2][3];
tMatriz matriz = {1, 2, 3, 4, 5, 6,
7, 8, 9, 10, 11, 12};
Página 37
Memoria
matriz[0][0][0][0] 1
matriz[0][0][0][1] 2
matriz[0][0][0][2] 3
matriz[0][0][1][0] 4
matriz[0][0][1][1] 5
matriz[0][0][1][2] 6
matriz[0][1][0][0] 7
matriz[0][1][0][1] 8
matriz[0][1][0][2] 9
matriz[0][1][1][0] 10
matriz[0][1][1][1] 11
matriz[0][1][1][2] 12
matriz[0][2][0][0] 0
... 0
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays
Paso de arrays a procedimientos y funcionesSimulación de paso de parámetro por referencia.
Sin poner & en la declaración del parámetro.
Los subprogramas no reciben una copia del array, sino su dirección en memoria.const int Max = 10;
typedef int tTabla[Max];
void inicializa(tTabla tabla);
Cualquier modificación de elementos del array quedará reflejada en el argumento tras la llamada al subprograma:inicializa(array);
Si el procedimiento inicializa() modifica algún elemento de su parámetro tabla, automáticamente quedan modificadoslos del argumento array.
Página 38
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays
Paso de arrays a funciones
Página 39
0 1 2 3 4 5 6 7 8 9
const int Max = 10;typedef int tTabla[Max];void inicializa(tTabla tabla);
void inicializa(tTabla tabla) { for (int i = 0; i < Max; i++) tabla[i] = i;}
int main() { tTabla array; inicializa(array); // array queda modificado for (int i = 0; i < Max; i++) cout << array[i] << " "; ...
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Arrays
Paso de arrays a funcionesSi se quiere evitar que se modifique el array en el subprograma, se puede usar const.
const tTabla tabla es un array de constantes.
void muestra(const tTabla tabla);
El argumento que se pase se trata como un array de constantes.
Si en el procedimiento se encuentra alguna instrucción que intente modificar un elemento del array, se mostrará un error de compilación.
void muestra(const tTabla tabla) {
for (int i = 0; i < Max; i++) cout << array[i] << " "; // Se accede, pero no se modifica}
Página 40
Luis
Her
nánd
ez Y
áñez
Fundamentos de la programación
Página 41Fundamentos de la programación: Tipos de datos estructurados
Cadenas de caracteres
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Cadenas de caracteres
Arrays de caracteresCadenas: secuencias de caracteres de longitud variable.
Las variables de cadenas pueden cambiar de secuencias, pasando a tener más o menos caracteres:"Hola" "Adiós" "Supercalifragílistico"
Se guardan en arrays de caracteres: tamaño máximo.
No todas las posiciones del array son relevantes: Longitud de la cadena: número de posiciones (caracteres),
desde la primera, que realmente constituyen la cadena.
Longitud actual: 4
Página 42
H o l a0 1 2 3 4 5 6 7 8 9 1
011
12
13
14
15
16
17
18
19
20
21
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Cadenas de caracteres
Longitud de la cadena
Longitud: 5
Longitud: 21
Necesidad de saber dónde terminan los caracteres relevantes: Mantener la longitud de la cadena como dato asociado. Colocar un carácter de terminación al final (centinela).
Página 43
A d i ó s0 1 2 3 4 5 6 7 8 9 1
011
12
13
14
15
16
17
18
19
20
21
S u p e r c a l i f r a g i l í s t i c o0 1 2 3 4 5 6 7 8 9 1
011
12
13
14
15
16
17
18
19
20
21
A d i ó s \00 1 2 3 4 5 6 7 8 9 10
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Cadenas de caracteres
Cadenas de caracteres en C++Dos alternativas para el manejo de cadenas: Cadenas al estilo de C (terminadas en nulo). Tipo string.
Cadenas al estilo de C Arrays de tipo char con una longitud máxima. Un último carácter especial al final: '\0'
Tipo string Cadenas más sofisticadas. No hay necesidad de establecer una longitud máxima:
Gestión automática de la memoria. Multitud de funciones de utilidad.
Página 44
Luis
Her
nánd
ez Y
áñez
Fundamentos de la programación
Página 45Fundamentos de la programación: Tipos de datos estructurados
Cadenas de caracteresal estilo de C
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Cadenas de caracteres
Cadenas de caracteres al estilo de CArrays de caracteres:
typedef char tCadena[15];
tCadena cadena = "Adiós"; // Se pueden inicializar al declarar
Cuando se inicializa o se lee un array de caracteres se coloca al final un carácter especial: carácter nulo, el que tiene el código ASCII 0 ('\0').Indica que en esa posición termina la cadena.
En el array de caracteres caben tamaño-1 caracteres significativos.
La longitud máxima de la variable cadena es 14.
Pero no se pueden asignar cadenas literales: cadena = "Hola";(Ni copiar cadenas directamente: cad2 = cad1;)
Página 46
cadena A d i ó s \0
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Cadenas de caracteres
Cadenas de caracteres al estilo de CSe pueden leer de cin y escribir en cout:tCadena cadena;
cin >> cadena; // Se añade automáticamente el nulo finalcout << cadena << endl; // Se muestra sólo hasta el nulo (sin él)
Cuando se lee de cin con el extractor se termina la lectura en el primer carácter de espacio en blanco.
Y no se comprueba si se leen más caracteres de los que caben en la cadena: ¡riesgo de sobrescribir otras zonas de memoria!
El manipulador setw() permite establecer el máximo de caracteres a colocar en la cadena (incluyendo el nulo):cin >> setw(15) >> cadena;
Se puede usar la función getline(cadena, máx), que incluye los caracteres de espacio en blanco que se lean y el nulo final:cin.getline(cadena, 15); // Hasta 14 caracteres relevantes
Página 47
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Cadenas de caracteres
Funciones para cadenas de caracteres al estilo de C (cstring) strlen(cadena): devuelve la longitud actual de la cadena.
cout << "Longitud: " << strlen(cadena);
strcpy(destino, origen): copia la cadena origen en la cadena destino.strcpy(cad2, cad1);strcpy(cad, "Me gusta C++");
strcat(destino, origen): añade (concatena) una copia de origen al final de la cadena destino.typedef char tCad[80];tCad cad1 = "Hola", cad2 = "Adiós";strcat(cad1, cad2); // Ahora cad1 contiene "HolaAdiós"
strcmp(cad1, cad2): compara las cadenas y devuelve 0 si son iguales, un positivo si cad1 es mayor que cad2 o un negativo si cad2 es mayor que cad1.Se entiende mayor lexicográficamente (alfabéticamente) hablando.tCad cad1 = "Hola", cad2 = "Adiós";strcmp(cad1, cad2); // Devuelve un positivo ("Hola" > "Adiós")
http://www.cplusplus.com/reference/clibrary/cstring/
Página 48
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Cadenas de caracteres#include <iostream>using namespace std;#include <cstring>int main() { const int MAX = 20; typedef char tCad[MAX]; tCad cadena = "Me gusta C++"; cout << cadena << endl; cout << "Cadena: "; cin >> cadena; // Pon espacios (se lee hasta el primer espacio) cout << cadena << endl; cin.sync(); // Sincronizar la entrada cout << "Cadena: "; cin.getline(cadena, MAX); cout << cadena << endl; cout << "Longitud: " << strlen(cadena) << endl; strcpy(cadena, "Hola"); ...
Página 49
cadenas.cpp
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Cadenas de caracteres
tCad cadena2 = " amigo"; strcat(cadena, cadena2); cout << cadena << endl; if (strcmp(cadena, cadena2) == 0) cout << "Iguales"; else if (strcmp(cadena, cadena2) > 0) cout << cadena << " es mayor que " << cadena2; else cout << cadena2 << " es mayor que " << cadena; cout << endl;
return 0;}
Página 50
Luis
Her
nánd
ez Y
áñez
Fundamentos de la programación
Página 51Fundamentos de la programación: Tipos de datos estructurados
Cadenas de caracteresde tipo string
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Cadenas de caracteres
Cadenas de caracteres de tipo string El tipo asume la responsabilidad de la gestión de memoria. Tiene definidos operadores sobrecargados
(por ejemplo, + para concatenar). Cadenas más eficientes y seguras de usar.
Biblioteca string (requiere establecer el espacio de nombres a std). Se pueden inicializar en la declaración. Se pueden copiar con el operador de asignación. Se pueden concatenar con el operador +. Multitud de funciones de utilidad.
Página 52
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Cadenas de caracteres#include <iostream>#include <string>using namespace std;
int main() { string cad1("Hola"); // inicialización string cad2 = "amigo"; // inicialización string cad3; cad3 = cad1; // copia cout << "cad3 = " << cad3 << endl; cad3 = cad1 + " "; // concatenación cad3 += cad2; // concatenación cout << "cad3 = " << cad3 << endl; cad1.swap(cad2); // intercambio cout << "cad1 = " << cad1 << endl; cout << "cad2 = " << cad2 << endl;
return 0;}
Página 53
string.cpp
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Cadenas de caracteres
E/S con cadenas de tipo string Se pueden mostrar en la pantalla directamente con cout <<. La lectura con cin >> termina en el primer espacio en blanco.
El resto de los caracteres introducidos quedan en el buffer esperando a la siguiente lectura. Para descartarlos usaremos cin.sync(): cin.sync();
Para leer incluyendo espacios en blanco se usa la función getline():getline(cin, cadena) guarda en la cadena los caracteres leídos hasta el fin de línea (Intro).
Página 54
Observa que las funciones getline() son distintas para cadenas al estilo de C (cin.getline(...))y para cadenas de tipo string (getline(cin, ...)).
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Cadenas de caracteres
E/S con cadenas de tipo string
Página 55
string2.cpp
#include <iostream>#include <string>using namespace std;
int main() { string nombre, apellidos; cout << "Introduzca un nombre: "; cin >> nombre; cin.sync(); cout << "Introduzca los apellidos: "; getline(cin, apellidos); cout << "Nombre completo: " << nombre << " " << apellidos << endl;
return 0;}
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Cadenas de caracteres
Funciones para cadenas de tipo string substr(posición, longitud): devuelve una subcadena de la cadena
sobre la que se ejecuta la función: longitud caracteres desde la posición.
string cad = "abcdefg";cout << cad.substr(2, 3); // Muestra cde
compare(cadena2): devuelve 0 si las cadenas son iguales, un positivo si cadena2 es mayor que la cadena sobre la que se ejecuta la función y un negativo en caso contrario.
string cad1 = "Hola", cad2 = "Adiós";cout << cad1.compare(cad2);
find(subcadena): devuelve la posición en la que empieza la primera ocurrencia de la subcadena en la cadena sobre la que se ejecuta la función.
string cad = "Hola";cout << cad.find("la"); // Muestra 2
(Recuerda que los arrays de caracteres comienzan con el índice 0.)
Página 56
Notación punto (.)
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Cadenas de caracteres
Funciones para cadenas de tipo string rfind(subcadena): devuelve la posición en la que empieza la última
ocurrencia de la subcadena en la cadena sobre la que se ejecuta la función.
string cad = "Olala";cout << cad.rfind("la"); // Muestra 3
find_first_of(cadena2): devuelve la posición en la que aparece por primera vez cualquier carácter de cadena2 en la cadena sobre la que se ejecuta la función.
string cad = "Olala";cout << cad.find_first_of("aeiou"); // Muestra 2. . .
http://www.cplusplus.com/reference/string/string/
Página 57
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Cadenas de caracteres
Más sobre cadenas de tipo string Longitud de una cadena: cadena.length() o cadena.size() Están definidos los operadores relacionales:
if (cad1 <= cad2) ...
Modificación de cadenas:cadena.erase(0, 7); // Elimina 7 caracteres desde el 1ºcadena.replace(9, 5, cad2); // Reemplaza 5 caracteres a partir
// de la posición 9 por cad2cadena.insert(0, cad3); // Inserta en la posición 0 cad3cadena.append(3, '!'); // Añade por el final 3 caracteres
// de signo de exclamación (!)
Acceso a los caracteres de una cadena Como array de caracteres que es: cadena[i], sin control de posibles accesos
a posiciones inexistentes de la cadena (array). Con la función at(índice): cadena.at(i), provoca un error
de ejecución si se intenta acceder a una posición inexistente.
Página 58
Luis
Her
nánd
ez Y
áñez
Fundamentos de la programación
Página 59Fundamentos de la programación: Tipos de datos estructurados
Estructuras
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Estructuras
Colecciones heterogéneas (tuplas, registros)Varios elementos de (posiblemente) distintos tipos: campos.
Campos identificados por su nombre.
Información relacionada que se puede manejar como una unidad.
Acceso a cada elemento de información por su nombre de campo,con el operador punto (.).struct nombre { // nombre de tipo tipo1 nombre_de_campo1; tipo2 nombre_de_campo2;
...} lista_de_variables; // Puede no haber lista de variables
Página 60
{Identificadorstruct Campo
Variables
}
IdentificadorTipo ;Campo
;
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Estructuras
Tipos estructurasDeclaramos un tipo con typedef (ahora el nombre de tipo va al final)y luego usaremos el tipo para declarar variables:typedef struct { string nombre; string apellidos; int edad; string nif;} tPersona;
Las variables de tipo tPersona contienen cuatro datos:nombre, apellidos, edad y nif.tPersona persona;
Acceso a los elementos (campos) con el operador punto (.):persona.nombre // una cadena (string)persona.edad // un entero (int)
Página 61
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Estructuras
Agrupación de datos heterogéneostypedef struct { string nombre; string apellidos; int edad; string nif;} tPersona;tPersona persona;
Página 62
Luis Antonionombre
Hernández Yáñezapellidos
22edad
00223344Fnif
Memoria
persona.nombreLuis
Antonio
persona.apellidos
Hernández Yáñez
persona.edad 22
persona.nif00223344
F
persona
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Estructuras
Elementos sin orden establecidotypedef struct { string nombre; string apellidos; int edad; string nif;} tPersona;tPersona persona;
Los campos no siguen ningún orden establecido.
Acceso directo por nombre de campo (operador .).
Con cada campo se puede hacer lo que permita su tipo.
Estructuras dentro de estructuras:typedef struct { typedef struct { string dni; ... char letra; tNif nif;} tNif; } tPersona;
Página 63
Las estructuras se pueden pasar por valor o por referencia a los subprogramas.
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
1
Combinación de tipos estructuradosconst int Max = 100;typedef struct { string dni; char letra;} tNif;typedef struct { string nombre; string apellidos; int edad; tNif nif;} tPersona;typedef tPersona tLista[Max];typedef double tNotas[Max];typedef struct { tLista lista; tNotas notas; int cont;} tClase;
Página 64
nombre
apellidos
edad
nifdni
letra
tPersona
tNif
nombre
apellidos
edad
nifdni
letra
nombre
apellidos
edad
nifdni
letra
nombre
apellidos
edad
nifdni
letra
nombre
apellidos
edad
nifdni
letra
nombre
apellidos
edad
nifdni
letra
tLista
...
0
2
3
Max-1
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Combinación de tipos estructuradosconst int Max = 100;
typedef struct { string dni; char letra;} tNif;
typedef struct { string nombre; string apellidos; int edad; tNif nif;} tPersona;
typedef tPersona tLista[Max];typedef double tNotas[Max];
typedef struct { tLista lista; tNotas notas; int cont;} tClase;
Página 65
cont
lista
tClase
...
...
notas
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Combinación de tipos estructurados#include <iostream>#include <string>using namespace std;#include <iomanip>
const int Max = 100;
typedef struct { string dni; char letra;} tNif;
typedef struct { string nombre; string apellidos; int edad; tNif nif;} tPersona;
typedef tPersona tLista[Max];typedef double tNotas[Max];
typedef struct { tLista lista; tNotas notas; int cont;} tClase;
Página 66
(continúa...)
bd.cpp
Declaraciones de tiposal principio del programa.
Alcance global(Si algún tipo sólo se usaen un subprograma, se declararádentro de ese subprograma.)
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Combinación de tipos estructuradosint menu(); // Menú de opciones del programa - devuelve la opción elegida
void inicializa(tClase &clase); // Lista vacía: contador a cero
bool dniOK(string dni); // ¿8 dígitos?
void leeNif(tNif &nif);
string dameNif(tPersona persona); // NIF en forma de cadena
string nombreCompleto(tPersona persona); // Nombre + espacio + apellidos
void leePersona(tPersona &persona);
double leeNota(tPersona persona); // Lee y devuelve la nota de la persona
// Inserta en la lista de la clase la persona y su nota:
bool insertaPersona(tClase &clase, tPersona persona, double nota);
// Muestra los datos de la persona en una línea (sin salto de línea):
void escribePersona(tPersona persona);
double mediaClase(tClase clase); // Nota media de la clase
int mayorNota(tClase clase); // Índice del estudiante con la mayor nota
void listado(tClase clase, int mayor); // Lista de la clase
// mayor es el índice del estudiante con mejor nota
Página 67
(continúa...)Los prototipos, después de los tipos globales
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Combinación de tipos estructurados
Página 68
(continúa...)
Recorrido de un string
int menu() { int op; do { cout << "1 - Nuevo estudiante" << endl; cout << "2 - Listado de notas" << endl; cout << "0 - Salir" << endl; cout << "Elige: "; cin >> op; } while ((op < 0) || (op > 2)); return op;}
void inicializa(tClase &clase) { clase.cont = 0; // Basta poner a 0 el contador. No accedemos nunca más allá.}bool dniOK(string dni) { bool ok = true; if (dni.size() != 8) ok = false; else for (int i = 0; i < dni.size(); i++) if ((dni.at(i) < '0') || (dni.at(i) > '9')) ok = false; return ok;}
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Combinación de tipos estructuradosvoid leeNif(tNif &nif) { do { cout << "D.N.I. (8 digitos): "; cin.sync(); cin >> nif.dni; } while (!dniOK(nif.dni)); do { cout << "Letra: "; cin.sync(); cin >> nif.letra; nif.letra = toupper(nif.letra); } while ((nif.letra < 'A') || (nif.letra > 'Z'));}
Página 69
(continúa...)
string dameNif(tPersona persona) { return persona.nif.dni + "-" + persona.nif.letra; // Concat. de cadenas}string nombreCompleto(tPersona persona) { return persona.nombre + " " + persona.apellidos; // Concat. de cadenas}
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Combinación de tipos estructuradosvoid leePersona(tPersona &persona) { cout << "Nombre (solo uno): "; // Sólo se admiten nombres de una palabra cin.sync(); cin >> persona.nombre; cout << "Apellidos: "; cin.sync(); getline(cin, persona.apellidos); cout << "Edad: "; cin >> persona.edad; leeNif(persona.nif);}
Página 70
(continúa...)
double leeNota(tPersona persona) { cout << "Nota de " << nombreCompleto(persona) << ": "; double nota; cin.sync(); cin >> nota; return nota;}
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Combinación de tipos estructuradosbool insertaPersona(tClase &clase, tPersona persona, double nota) { bool ok = true; if (clase.cont == Max) ok = false; else { clase.lista[clase.cont] = persona; clase.notas[clase.cont] = nota; clase.cont++; } return ok;}
Página 71
(continúa...)
void escribePersona(tPersona persona) { cout << setw(25) << persona.nombre + " " + persona.apellidos << " (" << dameNif(persona) << ", " << persona.edad << " años)";}
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Combinación de tipos estructuradosdouble mediaClase(tClase clase) { double total = 0.0; for (int i = 0; i < clase.cont; i++) total = total + clase.notas[i]; return total / clase.cont;}
Página 72
(continúa...)
int mayorNota(tClase clase) { double max = 0; int pos = 0; for (int i = 0; i < clase.cont; i++) if (clase.notas[i] > max) { max = clase.notas[i]; pos = i; } return pos;}
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Combinación de tipos estructuradosvoid listado(tClase clase, int mayor) { for (int i = 0; i < clase.cont; i++) { escribePersona(clase.lista[i]); cout << " - Nota: " << setw(4) << fixed << setprecision(1) << clase.notas[i]; if (i == mayor) cout << " <<< Mayor nota!"; cout << endl; } cout << endl;}
Página 73
(continúa...)
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Combinación de tipos estructuradosint main() { tClase clase; inicializa(clase); int op; do { op = menu(); if (op == 1) { tPersona persona; leePersona(persona); double nota = leeNota(persona); if (!insertaPersona(clase, persona, nota)) cout << "Lista llena: imposible insertar" << endl; } else if (op == 2) { int posMayorNota = mayorNota(clase); listado(clase, posMayorNota); } } while (op != 0); return 0;}
Página 74
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Combinación de tipos estructurados
Página 75
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Combinación de tipos estructuradosint main() { tClase clase; inicializa(clase); int op; do { op = menu(); if (op == 1) { tPersona persona; leePersona(persona); double nota = leeNota(persona); if (!insertaPersona(clase, persona, nota)) cout << "Lista llena: imposible insertar" << endl; } else if (op == 2) { int posMayorNota = mayorNota(clase); listado(clase, posMayorNota); } } while (op != 0); return 0;}
Página 76
contlista
clase
...
...
notas
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Combinación de tipos estructuradosint main() { tClase clase; inicializa(clase); int op; do { op = menu(); if (op == 1) { tPersona persona; leePersona(persona); double nota = leeNota(persona); if (!insertaPersona(clase, persona, nota)) cout << "Lista llena: imposible insertar" << endl; } else if (op == 2) { int posMayorNota = mayorNota(clase); listado(clase, posMayorNota); } } while (op != 0); return 0;}
Página 77
0contlista
clase
...
...
notas
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Combinación de tipos estructuradosint main() { tClase clase; inicializa(clase); int op; do { op = menu(); if (op == 1) { tPersona persona; leePersona(persona); double nota = leeNota(persona); if (!insertaPersona(clase, persona, nota)) cout << "Lista llena: imposible insertar" << endl; } else if (op == 2) { int posMayorNota = mayorNota(clase); listado(clase, posMayorNota); } } while (op != 0); return 0;}
Página 78
0contlista
clase
...
...
notas
nombre
apellidos
edad
nif dni
letra
persona
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Combinación de tipos estructuradosint main() { tClase clase; inicializa(clase); int op; do { op = menu(); if (op == 1) { tPersona persona; leePersona(persona); double nota = leeNota(persona); if (!insertaPersona(clase, persona, nota)) cout << "Lista llena: imposible insertar" << endl; } else if (op == 2) { int posMayorNota = mayorNota(clase); listado(clase, posMayorNota); } } while (op != 0); return 0;}
Página 79
0contlista
clase
...
...
notas
Luisnombre
Hernándezapellidos
22
edad
nif00112233
dni
Fletra
persona
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Combinación de tipos estructuradosint main() { tClase clase; inicializa(clase); int op; do { op = menu(); if (op == 1) { tPersona persona; leePersona(persona); double nota = leeNota(persona); if (!insertaPersona(clase, persona, nota)) cout << "Lista llena: imposible insertar" << endl; } else if (op == 2) { int posMayorNota = mayorNota(clase); listado(clase, posMayorNota); } } while (op != 0); return 0;}
Página 80
0contlista
clase
...
...
notas
Luisnombre
Hernándezapellidos
22
edad
nif00112233
dni
Fletra
persona
9.7nota
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Combinación de tipos estructuradosint main() { tClase clase; inicializa(clase); int op; do { op = menu(); if (op == 1) { tPersona persona; leePersona(persona); double nota = leeNota(persona); if (!insertaPersona(clase, persona, nota)) cout << "Lista llena: imposible insertar" << endl; } else if (op == 2) { int posMayorNota = mayorNota(clase); listado(clase, posMayorNota); } } while (op != 0); return 0;}
Página 81
0contlista
clase
...
...
notas
Luisnombre
Hernándezapellidos
22
edad
nif00112233
dni
Fletra
persona
nota 9.7
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Combinación de tipos estructuradosint main() { tClase clase; inicializa(clase); int op; do { op = menu(); if (op == 1) { tPersona persona; leePersona(persona); double nota = leeNota(persona); if (!insertaPersona(clase, persona, nota)) cout << "Lista llena: imposible insertar" << endl; } else if (op == 2) { int posMayorNota = mayorNota(clase); listado(clase, posMayorNota); } } while (op != 0); return 0;}
Página 82
1contlista
clase
...
9.7
...
notas
Luisnombre
Hernándezapellidos
22
edad
nif00112233
dni
Fletra
persona
9.7nota
Luisnombre
Hernández
apellidos
22edad
nif00112233dni
Fletra
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Referencias bibliográficas
Programming. Principles and Practice Using C++B. Stroustrup. Pearson Education, 2009
Programación en C++ para ingenierosF. Xhafa et al. Thomson, 2006
C++: An Introduction to Computing (2ª edición)J. Adams, S. Leestma, L. Nyhoff. Prentice Hall, 1998
El lenguaje de programación C++ (Edición especial)B. Stroustrup. Addison-Wesley, 2002
Página 83
Fundamentos de la programación: Tipos de datos estructurados
Luis
Her
nánd
ez Y
áñez
Acerca de Creative Commons
Licencia CC (Creative Commons)Este tipo de licencias ofrecen algunos derechos a terceras personas bajo ciertas condiciones.
Este documento tiene establecidas las siguientes:
Pulsa en la imagen de arriba a la derecha para saber más.
Página 84
Reconocimiento (Attribution): En cualquier explotación de la obra autorizada por la licenciahará falta reconocer la autoría.
No comercial (Non commercial): La explotación de la obra queda limitada a usos no comerciales.
Compartir igual (Share alike):La explotación autorizada incluye la creación de obras derivadas siempre que mantengan la misma licencia al ser divulgadas.