940 likes | 1.45k Views
Fundamentos de la programación 2011-2012. Tipos de datos estructurados. 5. Grado 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ática Universidad Complutense. Índice. Tipos estructurados 2 Arrays 5
E N D
Fundamentos de la programación 2011-2012 Tipos de datos estructurados 5 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de ComputadoresLuis Hernández YáñezFacultad de InformáticaUniversidad Complutense
Índice Tipos estructurados 2 Arrays 5 Declaración 8 Uso 10 Ejemplos 14 Capacidad y copia de arrays 21 Arrays multidimensionales 23 Inicialización de arrays 34 Paso de arrays a funciones 37 Cadenas de caracteres 40 Cadenas de caracteres al estilo de C 44 Cadenas de caracteres de tipo string 50 Estructuras 58 Combinación de tipos estructurados 63 Fundamentos de la programación: Tipos de datos estructurados
Fundamentos de la programación Tipos estructurados Fundamentos de la programación: Tipos de datos estructurados
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: arraysTodos los elementos de la colección son del mismo tipo. • Colecciones heterogéneas: estructurasLos elementos de la colección pueden ser de tipos distintos. Fundamentos de la programación: Tipos de datos estructurados
Tipos estructurados Colecciones o tipos aglomerados Agrupació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). Fundamentos de la programación: Tipos de datos estructurados
Fundamentos de la programación Arrays Fundamentos de la programación: Tipos de datos estructurados
Arrays Colecciones homogéneas Un 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... vSab vLun vMar vMie vJue vVie vDom 164.29 125.40 76.95 328.80 254.62 435.00 0.00 ... declaramos una tabla de N valores: Índices Fundamentos de la programación: Tipos de datos estructurados
Arrays Estructura secuencial Cada 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; 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
Tipos arrays Declaración de tipos de arrays typedeftipo_basenombre[tamaño]; Ejemplos: typedefdoubletTemp[7]; typedefshort inttDiasMes[12]; typedefchartVocales[5]; typedefdoubletVentas[31]; typedeftMonedatCalderilla[15]; // Enumerado tMoneda Identificador [ typedef Tipo Expresión ] 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
Variables arrays Declaración de variables arrays tiponombre; Ejemplos: typedefdoubletTemp[7]; typedefshort inttDiasMes[12]; typedefchartVocales[5]; typedefdoubletVentas[31]; tTemptempMax; tDiasMesdiasMes; tVocales vocales; tVentas ventasFeb; NO se inicializan los elementos automáticamente. Fundamentos de la programación: Tipos de datos estructurados
Fundamentos de la programación Uso de arrays Fundamentos de la programación: Tipos de datos estructurados
Uso de arrays Acceso a los elementos de un array nombre[í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') ... typedefchartVocales[5]; NO SE COMPRUEBA SI EL ÍNDICE ES VÁLIDO.¡Es responsabilidad del programador!¡¡¡ ¿¿¿ vocales[7] ??? !!! Fundamentos de la programación: Tipos de datos estructurados
Arrays Procesamiento • Recorridos. • Búsquedas. • Ordenación. . . . Se verán con detenimiento en los próximos temas. Arrays y bucles for Arrays: tamaño fijo Bucle de recorrido fijo (for) tTemptempMax; doublemediaMax, total = 0; ... for (int i = 0; i < 7; i++) total = total + tempMax[i]; mediaMax = total / 7; Fundamentos de la programación: Tipos de datos estructurados
Arrays tTemptempMax; doublemediaMax, total = 0; ... for (int i = 0; i < 7; i++) total = total + tempMax[i]; i = 0 true false i < 7 total+=tempMax[i]; ... i++ 43.44 84.62 23.36 31.79 12.40 3 2 7 4 1 Fundamentos de la programación: Tipos de datos estructurados
Fundamentos de la programación Ejemplos Fundamentos de la programación: Tipos de datos estructurados
Arrays Días de cada mes const int Meses = 12; typedefshort int tDiasMes[Meses]; tDiasMesdiasMes; // Días de cada mes del año diasMes[0] = 31; // Enero diasMes[1] = 29; // Febrero (¡bisiesto!) diasMes[2] = 31; // Marzo diasMes[3] = 30; // Abril diasMes[4] = 31; // Mayo diasMes[5] = 30; // Junio diasMes[6] = 31; // Julio diasMes[7] = 31; // Agosto diasMes[8] = 30; // Septiembre diasMes[9] = 31; // Octubre diasMes[10] = 30; // Noviembre diasMes[11] = 31; // Diciembre Define el tamaño del array con una constante. Fundamentos de la programación: Tipos de datos estructurados
Arrays Días de cada mes // Mostramos los días de cada mes del año for (int mes = 0; mes < Meses; mes++) cout << "Mes " << mes + 1 << ": " << diasMes[mes] << "dias" << endl; 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ías double total = 0, media; for (int mes = 0; mes < Meses; mes++) total = total + diasMes[mes]; media = total / Meses; Fundamentos de la programación: Tipos de datos estructurados
Arrays Temperaturas máximas y mínimas de la semana const intDias = 7; typedefdouble tTemp[Dias]; tTemptempMin, tempMax; // Mínimas y máximas – 2 arrays // Pedimos al usuario las temperaturas for (intdia = 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... Fundamentos de la programación: Tipos de datos estructurados
Arrays Total de ventas de cada día del mes const intMaxDias = 31; typedefdouble tVentas[MaxDias]; tVentasventasFeb; // Ventas de cada día de febrero ¿Cuántos días tiene ese mes (febrero)? const int Meses = 12; typedefshort int tDiasMes[Meses]; tDiasMesdiasMes; inicializa(diasMes); // Asigna a cada mes su nº de días // Pedimos al usuario las ventas de ese mes... for (intdia = 0; dia < diasMes[1]; dia++) { // ¡Ojo! Febrero tiene índice 1 (Enero el 0) cout << "Ventas del dia " << dia + 1 << ": "; cin >> ventasFeb[dia]; } Fundamentos de la programación: Tipos de datos estructurados
Arrays Inicialización del array de días void inicializa(tDiasMesdias) { 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 } Los arrays se pasansiempre por referencia,sin tener que usar &. ¡dias vuelve modificado! Fundamentos de la programación: Tipos de datos estructurados
Arrays Array de valores de enumerado stringaCadena(tMoneda moneda); // Prototipo de función const intMaxMonedas = 15; typedef enum { centimo, dos_centimos, cinco_centimos,diez_centimos, veinte_centimos, medio_euro, euro } tMoneda; typedeftMonedatCalderilla[MaxMonedas]; tCalderilla bolsillo; // Hasta MaxMonedas monedas que llevo bolsillo[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; Fundamentos de la programación: Tipos de datos estructurados
Fundamentos de la programación Capacidad y copia de arrays Fundamentos de la programación: Tipos de datos estructurados
Arrays Capacidad de los arrays La 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ñoque 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 arrays No 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]; Fundamentos de la programación: Tipos de datos estructurados
Fundamentos de la programación Arrays multidimensionales Fundamentos de la programación: Tipos de datos estructurados
Arrays multidimensionales Arrays de varias dimensiones Podemos indicar varios tamaños en la declaración de un array. Cada uno en su par de corchetes. typedeftipo_basenombre[tamaño1][tamaño2]...[tamañoN]; El array tendrá varias dimensiones, tantas como tamaños se indiquen. typedef doubletMatriz[50][100]; tMatriz matriz; matriz es una tabla bidimensional de 50 filas por 100 columnas: Fundamentos de la programación: Tipos de datos estructurados
Arrays multidimensionales Arrays de varias dimensiones typedef doubletMatriz[50][100]; tMatriz matriz; Ahora cada elemento del array se localiza con dos índices, uno por cada dimensión. cout << matriz[2][98]; Fundamentos de la programación: Tipos de datos estructurados
Arrays multidimensionales Arrays de varias dimensiones Podemos definir tantas dimensiones como necesitemos. typedef doubletMatriz[5][10][20][10]; tMatriz matriz; Necesitamos tantos índices como dimensiones: cout << matriz[2][9][15][6]; Fundamentos de la programación: Tipos de datos estructurados
Arrays Ejemplo de arrays multidimensionales Temperaturas mínimas y máximas. Matriz bidimensional de días y mínima/máxima: constintMaxDias = 31; typedef doubletTemp[MaxDias][2]; // Día x mínima / máxima tTemptemp; doubletempMaxMedia, tempMinMedia, tempMaxAbs, tempMinAbs; intdias = 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. Fundamentos de la programación: Tipos de datos estructurados
Arrays temp.cpp ... int main() { const intMaxDias = 31; typedef double tTemp[MaxDias][2]; // Día x mínima / máxima tTemptemp; doubletempMaxMedia = 0, tempMinMedia = 0, tempMaxAbs = -100, tempMinAbs = 100; intdias = 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; } ... Fundamentos de la programación: Tipos de datos estructurados
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(); } return0; } Fundamentos de la programación: Tipos de datos estructurados
Arrays Enumerados como índices typedef enum { minima, maxima }tTipoTemp; constintMaxDias = 31; typedef doubletTemp[MaxDias][2]; // Día x { mínima, máxima } tTemptemp; intdias = 0; doublemax, min; ifstream archivo; ... Recuerda que internamentese asignan enteros a partir de 0a 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
Arrays Ventas de todos los meses de un año (bisiesto) Array bidimensional de meses y días: const int Meses = 12; const intMaxDias = 31; typedefdouble tVentas[Meses][MaxDias]; tVentas ventas; // Ventas de todo el año typedefshort int tDiasMes[Meses]; tDiasMesdiasMes; 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 (intdia = 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
Arrays Ventas de todos los meses de un año (bisiesto) Días Celdas no utilizadas Meses Fundamentos de la programación: Tipos de datos estructurados
Fundamentos de la programación Más sobre arrays Fundamentos de la programación: Tipos de datos estructurados
Arrays Inicialización de arrays Podemos 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}; intcuads[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. Fundamentos de la programación: Tipos de datos estructurados
Arrays Inicialización de arrays intcuads[5][2] = {1,1, 2,4, 3,9, 4,16, 5,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
Arrays Inicialización de arrays typedef doubletMatriz[3][4][2][3]; tMatriz matriz = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; Fundamentos de la programación: Tipos de datos estructurados
Arrays Paso de arrays a procedimientos y funciones Simulació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. Fundamentos de la programación: Tipos de datos estructurados
Arrays Paso de arrays a funciones 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] << " "; ... 0 1 2 3 4 5 6 7 8 9 Fundamentos de la programación: Tipos de datos estructurados
Arrays Paso de arrays a funciones Si 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 } Fundamentos de la programación: Tipos de datos estructurados
Fundamentos de la programación Cadenas de caracteres Fundamentos de la programación: Tipos de datos estructurados
Cadenas de caracteres Arrays de caracteres Cadenas: 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 Fundamentos de la programación: Tipos de datos estructurados
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). Fundamentos de la programación: Tipos de datos estructurados
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. Fundamentos de la programación: Tipos de datos estructurados
Fundamentos de la programación Cadenas de caracteresal estilo de C Fundamentos de la programación: Tipos de datos estructurados
Cadenas de caracteres Cadenas de caracteres al estilo de C Arrays de caracteres: typedef chartCadena[15]; tCadenacadena = "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;) Fundamentos de la programación: Tipos de datos estructurados
Cadenas de caracteres Cadenas de caracteres al estilo de C Se pueden leer de cin y escribir en cout: tCadena cadena; cin >> cadena; // Se añade automáticamente el nulo final cout << 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 Fundamentos de la programación: Tipos de datos estructurados
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 origenal final de la cadena destino. typedefchar tCad[80]; tCadcad1 = "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/ Fundamentos de la programación: Tipos de datos estructurados
Cadenas de caracteres cadenas.cpp #include <iostream> using namespace std; #include <cstring> int main() { constint MAX = 20; typedefchar 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"); ... Fundamentos de la programación: Tipos de datos estructurados
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; return0; } Fundamentos de la programación: Tipos de datos estructurados