La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

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.

Presentaciones similares


Presentación del tema: "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."— Transcripción de la presentación:

1 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 Fundamentos de la programación 2011-2012

2 Luis Hernández Yáñez Página 1 Fundamentos de la programación: Tipos de datos estructurados Tipos estructurados2 Arrays5 Declaración8 Uso10 Ejemplos14 Capacidad y copia de arrays21 Arrays multidimensionales23 Inicialización de arrays34 Paso de arrays a funciones37 Cadenas de caracteres40 Cadenas de caracteres al estilo de C44 Cadenas de caracteres de tipo string 50 Estructuras58 Combinación de tipos estructurados63

3 Luis Hernández Yáñez Página 2 Fundamentos de la programación: Tipos de datos estructurados

4 Luis Hernández Yáñez Clasificación de tipos Simples Simples  Estándar: int, float, double, char, bool El conjunto de valores está predeterminado.  Definidos por el usuario: enumerados El conjunto de valores lo define el programador. Estructurados 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 3 Fundamentos de la programación: Tipos de datos estructurados

5 Luis Hernández Yáñez 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). Página 4 Fundamentos de la programación: Tipos de datos estructurados

6 Luis Hernández Yáñez Página 5 Fundamentos de la programación: Tipos de datos estructurados

7 Luis Hernández Yáñez 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... Página 6 Fundamentos de la programación: Tipos de datos estructurados 125.40125.40vLunvLun76.9576.95vMarvMar328.80328.80vMievMie254.62254.62vJuevJue435.00435.00vVievVie 164.29164.29vSabvSab 0.000.00vDomvDom... declaramos una tabla de N valores:ÍndicesÍndices

8 Luis Hernández Yáñez Estructura secuencial Cada elemento se encuentra en una posición (índice): Los índices son enteros positivos Los índices son enteros positivos El índice del primer elemento siempre es 0 El índice del primer elemento siempre es 0 Los índices se incrementan de uno en uno 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 7 Fundamentos de la programación: Tipos de datos estructurados Cada elemento es un dato del tipo base. Se usa como cualquier otra variable de ese tipo.

9 Luis Hernández Yáñez Declaración de tipos de arrays typedef 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 8 Fundamentos de la programación: Tipos de datos estructurados [[IdentificadorIdentificador ExpresiónExpresión]]TipoTipotypedeftypedef 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.

10 Luis Hernández Yáñez Declaración de variables arrays tipo nombre; Ejemplos: Página 9 Fundamentos de la programación: Tipos de datos estructurados NO se inicializan los elementos automáticamente. typedef double tTemp[7]; typedef short int tDiasMes[12]; typedef char tVocales[5]; typedef double tVentas[31]; tTemp tempMax; tDiasMes diasMes; tVocales vocales; tVentas ventasFeb;

11 Luis Hernández Yáñez Página 10 Fundamentos de la programación: Tipos de datos estructurados

12 Luis Hernández Yáñez 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')... Página 11 Fundamentos de la programación: Tipos de datos estructurados NO SE COMPRUEBA SI EL ÍNDICE ES VÁLIDO. ¡Es responsabilidad del programador! ¡¡¡ ¿¿¿ vocales[7] ??? !!! typedef char tVocales[5];

13 Luis Hernández Yáñez Procesamiento Recorridos. Recorridos. Búsquedas. Búsquedas. Ordenación. 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) tTemp tempMax; double mediaMax, total = 0;... for (int i = 0; i < 7; i++) total = total + tempMax[i]; total = total + tempMax[i]; mediaMax = total / 7; Página 12 Fundamentos de la programación: Tipos de datos estructurados

14 Luis Hernández Yáñez 12.40 1 23.36 2 31.79 3 43.44 4 84.62 7 tTemp tempMax; double mediaMax, total = 0;... for (int i = 0; i < 7; i++) total = total + tempMax[i]; total = total + tempMax[i]; Página 13 Fundamentos de la programación: Tipos de datos estructurados falsefalse i < 7 i = 0......

15 Luis Hernández Yáñez Página 14 Fundamentos de la programación: Tipos de datos estructurados

16 Luis Hernández Yáñez Días de cada mes const int Meses = 12; typedef short int tDiasMes[Meses]; tDiasMes diasMes; // 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 Página 15 Fundamentos de la programación: Tipos de datos estructurados Define el tamaño del array con una constante.

17 Luis Hernández Yáñez Días de cada mes Página 16 Fundamentos de la programación: Tipos de datos estructurados 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; // 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;

18 Luis Hernández Yáñez 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 temperaturas for (int dia = 0; dia < Dias; dia++) { cout << "Dia " << dia + 1 << ": " << endl; cout << "Dia " << dia + 1 << ": " << endl; cout << "Minima: "; cout << "Minima: "; cin >> tempMin[dia]; cin >> tempMin[dia]; cout << "Maxima: "; cout << "Maxima: "; cin >> tempMax[dia]; cin >> tempMax[dia];} 2 arrays paralelos que se manejan conjuntamente. Alternativas: array bidimensional o array de estructuras... Página 17 Fundamentos de la programación: Tipos de datos estructurados

19 Luis Hernández Yáñez Total de ventas de cada día del mes const 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) // ¡Ojo! Febrero tiene índice 1 (Enero el 0) cout << "Ventas del dia " << dia + 1 << ": "; cout << "Ventas del dia " << dia + 1 << ": "; cin >> ventasFeb[dia]; cin >> ventasFeb[dia];} Página 18 Fundamentos de la programación: Tipos de datos estructurados

20 Luis Hernández Yáñez Inicialización del array de días void inicializa(tDiasMes dias) { dias[0] = 31; // Enero dias[0] = 31; // Enero dias[1] = 29; // Febrero (¡bisiesto!) dias[1] = 29; // Febrero (¡bisiesto!) dias[2] = 31; // Marzo dias[2] = 31; // Marzo dias[3] = 30; // Abril dias[3] = 30; // Abril dias[4] = 31; // Mayo dias[4] = 31; // Mayo dias[5] = 30; // Junio dias[5] = 30; // Junio dias[6] = 31; // Julio dias[6] = 31; // Julio dias[7] = 31; // Agosto dias[7] = 31; // Agosto dias[8] = 30; // Septiembre dias[8] = 30; // Septiembre dias[9] = 31; // Octubre dias[9] = 31; // Octubre dias[10] = 30; // Noviembre dias[10] = 30; // Noviembre dias[11] = 31; // Diciembre dias[11] = 31; // Diciembre} Página 19 Fundamentos de la programación: Tipos de datos estructurados Los arrays se pasan siempre por referencia, sin tener que usar &. ¡ dias vuelve modificado! Los arrays se pasan siempre por referencia, sin tener que usar &. ¡ dias vuelve modificado!

21 Luis Hernández Yáñez Array de valores de enumerado string aCadena(tMoneda moneda); // Prototipo de función const 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 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; cout << aCadena(bolsillo[moneda]) << endl; Página 20 Fundamentos de la programación: Tipos de datos estructurados

22 Luis Hernández Yáñez Página 21 Fundamentos de la programación: Tipos de datos estructurados

23 Luis Hernández Yáñez 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). 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). 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 colecciones má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]; Página 22 Fundamentos de la programación: Tipos de datos estructurados

24 Luis Hernández Yáñez Página 23 Fundamentos de la programación: Tipos de datos estructurados

25 Luis Hernández Yáñez Arrays de varias dimensiones Podemos 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 24 Fundamentos de la programación: Tipos de datos estructurados 0123...98990... 1... 2........................... 48... 49...

26 Luis Hernández Yáñez Arrays de varias dimensiones typedef 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 25 Fundamentos de la programación: Tipos de datos estructurados 0123...98990... 1... 2........................... 48... 49...

27 Luis Hernández Yáñez Arrays de varias dimensiones Podemos 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 26 Fundamentos de la programación: Tipos de datos estructurados

28 Luis Hernández Yáñez Ejemplo de arrays multidimensionales Temperaturas 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][0] es la temperatura mínima del día i+1. temp[i][1] es la temperatura máxima del día i+1. temp[i][1] es la temperatura máxima del día i+1. Página 27 Fundamentos de la programación: Tipos de datos estructurados

29 Luis Hernández Yáñez... int main() { const int MaxDias = 31; const int MaxDias = 31; typedef double tTemp[MaxDias][2]; // Día x mínima / máxima typedef double tTemp[MaxDias][2]; // Día x mínima / máxima tTemp temp; tTemp temp; double tempMaxMedia = 0, tempMinMedia = 0, double tempMaxMedia = 0, tempMinMedia = 0, tempMaxAbs = -100, tempMinAbs = 100; tempMaxAbs = -100, tempMinAbs = 100; int dias = 0; int dias = 0; double max, min; double max, min; ifstream archivo; ifstream archivo; archivo.open("temp.txt"); archivo.open("temp.txt"); if (!archivo.is_open()) if (!archivo.is_open()) cout << "No se ha podido abrir el archivo." << endl; cout << "No se ha podido abrir el archivo." << endl; else { else { archivo >> min >> max; archivo >> min >> max; // El archivo termina con -99 -99 // El archivo termina con -99 -99 while (!((min == -99) && (max == -99)) && (dias < MaxDias)) { while (!((min == -99) && (max == -99)) && (dias < MaxDias)) { temp[dias][0] = min; temp[dias][0] = min; temp[dias][1] = max; temp[dias][1] = max; dias++; dias++; archivo >> min >> max; archivo >> min >> max; }... }... Página 28 Fundamentos de la programación: Tipos de datos estructurados temp.cpptemp.cpp

30 Luis Hernández Yáñez... for (int i = 0; i < dias; i++) { for (int i = 0; i < dias; i++) { tempMinMedia = tempMinMedia + temp[i][0]; tempMinMedia = tempMinMedia + temp[i][0]; if (temp[i][0] < tempMinAbs) tempMinAbs = temp[i][0]; if (temp[i][0] < tempMinAbs) tempMinAbs = temp[i][0]; tempMaxMedia = tempMaxMedia + temp[i][1]; tempMaxMedia = tempMaxMedia + temp[i][1]; if (temp[i][1] > tempMaxAbs) tempMaxAbs = temp[i][1]; if (temp[i][1] > tempMaxAbs) tempMaxAbs = temp[i][1]; } tempMinMedia = tempMinMedia / dias; tempMinMedia = tempMinMedia / dias; tempMaxMedia = tempMaxMedia / dias; tempMaxMedia = tempMaxMedia / dias; cout << "Temperaturas minimas.-" << endl; cout << "Temperaturas minimas.-" << endl; cout << " Media = " << fixed << setprecision(1) cout << " Media = " << fixed << setprecision(1) << tempMinMedia << " C Minima absoluta = " << tempMinMedia << " C Minima absoluta = " << setprecision(1) << tempMinAbs << " C" << endl; << setprecision(1) << tempMinAbs << " C" << endl; cout << "Temperaturas maximas.-" << endl; cout << "Temperaturas maximas.-" << endl; cout << " Media = " << fixed << setprecision(1) cout << " Media = " << fixed << setprecision(1) << tempMaxMedia << " C Maxima absoluta = " << tempMaxMedia << " C Maxima absoluta = " << setprecision(1) << tempMaxAbs << " C" << endl; << setprecision(1) << tempMaxAbs << " C" << endl; archivo.close(); archivo.close(); } return 0; return 0;} Página 29 Fundamentos de la programación: Tipos de datos estructurados

31 Luis Hernández Yáñez Enumerados como índices typedef 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 30 Fundamentos de la programación: Tipos de datos estructurados Recuerda que internamente se asignan enteros a partir de 0 a los distintos símbolos del enumerado. minima  0maxima  1 archivo >> min >> max; while (!((min == -99) && (max == -99)) && (dias < MaxDias)) { temp[dias][minima] = min; temp[dias][maxima] = max; dias++; archivo >> min >> max; }

32 Luis Hernández Yáñez Ventas de todos los meses de un año (bisiesto) Página 31 Fundamentos de la programación: Tipos de datos estructurados 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ño typedef 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]; }

33 Luis Hernández Yáñez Ventas de todos los meses de un año (bisiesto) Página 32 Fundamentos de la programación: Tipos de datos estructurados 01234...2930310201125234112156...234543667 1323231675325111...342 2523417327333324...444367437 3145845654212562...354548 4327652555222777...428999666 5854438824547175...321356 6654543353777437...765678555 7327541164563327...538159235 8333327432249777...528529 9524583333100334...743468531 10217427585218843...777555 11222666512400259...438637879 DíasDías MesesMeses Celdas no utilizadas

34 Luis Hernández Yáñez Página 33 Fundamentos de la programación: Tipos de datos estructurados

35 Luis Hernández Yáñez 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}; 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 34 Fundamentos de la programación: Tipos de datos estructurados

36 Luis Hernández Yáñez Inicialización de arrays int cuads[5][2] = {1,1, 2,4, 3,9, 4,16, 5,25}; Página 35 Fundamentos de la programación: Tipos de datos estructurados 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 }; 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 };

37 Luis Hernández Yáñez Inicialización de arrays typedef double tMatriz[3][4][2][3]; tMatriz matriz = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; Página 36 Fundamentos de la programación: Tipos de datos estructurados

38 Luis Hernández Yáñez 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 modificados los del argumento array. Página 37 Fundamentos de la programación: Tipos de datos estructurados

39 Luis Hernández Yáñez Paso de arrays a funciones Página 38 Fundamentos de la programación: Tipos de datos estructurados 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] << " ";...

40 Luis Hernández Yáñez 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++) for (int i = 0; i < Max; i++) cout << array[i] << " "; cout << array[i] << " "; // Se accede, pero no se modifica // Se accede, pero no se modifica} Página 39 Fundamentos de la programación: Tipos de datos estructurados

41 Luis Hernández Yáñez Página 40 Fundamentos de la programación: Tipos de datos estructurados

42 Luis Hernández Yáñez 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 Página 41 Fundamentos de la programación: Tipos de datos estructurados

43 Luis Hernández Yáñez 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. Mantener la longitud de la cadena como dato asociado. Colocar un carácter de terminación al final (centinela). Colocar un carácter de terminación al final (centinela). Página 42 Fundamentos de la programación: Tipos de datos estructurados

44 Luis Hernández Yáñez 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 43 Fundamentos de la programación: Tipos de datos estructurados

45 Luis Hernández Yáñez Página 44 Fundamentos de la programación: Tipos de datos estructurados

46 Luis Hernández Yáñez Cadenas de caracteres al estilo de C Arrays 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 45 Fundamentos de la programación: Tipos de datos estructurados

47 Luis Hernández Yáñez 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 Página 46 Fundamentos de la programación: Tipos de datos estructurados

48 Luis Hernández Yáñez Funciones para cadenas de caracteres al estilo de C ( cstring ) strlen(cadena) : devuelve la longitud actual de la cadena. 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(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. 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. 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 47 Fundamentos de la programación: Tipos de datos estructurados

49 Luis Hernández Yáñez #include #include using namespace std; #include #include int main() { const int MAX = 20; const int MAX = 20; typedef char tCad[MAX]; typedef char tCad[MAX]; tCad cadena = "Me gusta C++"; tCad cadena = "Me gusta C++"; cout << cadena << endl; cout << cadena << endl; cout << "Cadena: "; cout << "Cadena: "; cin >> cadena; // Pon espacios (se lee hasta el primer espacio) cin >> cadena; // Pon espacios (se lee hasta el primer espacio) cout << cadena << endl; cout << cadena << endl; cin.sync(); // Sincronizar la entrada cin.sync(); // Sincronizar la entrada cout << "Cadena: "; cout << "Cadena: "; cin.getline(cadena, MAX); cin.getline(cadena, MAX); cout << cadena << endl; cout << cadena << endl; cout << "Longitud: " << strlen(cadena) << endl; cout << "Longitud: " << strlen(cadena) << endl; strcpy(cadena, "Hola"); strcpy(cadena, "Hola");...... Página 48 Fundamentos de la programación: Tipos de datos estructurados cadenas.cppcadenas.cpp

50 Luis Hernández Yáñez tCad cadena2 = " amigo"; tCad cadena2 = " amigo"; strcat(cadena, cadena2); strcat(cadena, cadena2); cout << cadena << endl; cout << cadena << endl; if (strcmp(cadena, cadena2) == 0) if (strcmp(cadena, cadena2) == 0) cout << "Iguales"; cout << "Iguales"; else if (strcmp(cadena, cadena2) > 0) else if (strcmp(cadena, cadena2) > 0) cout << cadena cout << cadena << " es mayor que " << cadena2; << " es mayor que " << cadena2; else else cout << cadena2 cout << cadena2 << " es mayor que " << cadena; << " es mayor que " << cadena; cout << endl; cout << endl; return 0; return 0;} Página 49 Fundamentos de la programación: Tipos de datos estructurados

51 Luis Hernández Yáñez Página 50 Fundamentos de la programación: Tipos de datos estructurados

52 Luis Hernández Yáñez Cadenas de caracteres de tipo string El tipo asume la responsabilidad de la gestión de memoria. El tipo asume la responsabilidad de la gestión de memoria. Tiene definidos operadores sobrecargados (por ejemplo, + para concatenar). Tiene definidos operadores sobrecargados (por ejemplo, + para concatenar). Cadenas más eficientes y seguras de usar. 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 inicializar en la declaración. Se pueden copiar con el operador de asignación. Se pueden copiar con el operador de asignación. Se pueden concatenar con el operador +. Se pueden concatenar con el operador +. Multitud de funciones de utilidad. Multitud de funciones de utilidad. Página 51 Fundamentos de la programación: Tipos de datos estructurados

53 Luis Hernández Yáñez #include #include using namespace std; int main() { string cad1("Hola"); // inicialización string cad1("Hola"); // inicialización string cad2 = "amigo"; // inicialización string cad2 = "amigo"; // inicialización string cad3; string cad3; cad3 = cad1; // copia cad3 = cad1; // copia cout << "cad3 = " << cad3 << endl; cout << "cad3 = " << cad3 << endl; cad3 = cad1 + " "; // concatenación cad3 = cad1 + " "; // concatenación cad3 += cad2; // concatenación cad3 += cad2; // concatenación cout << "cad3 = " << cad3 << endl; cout << "cad3 = " << cad3 << endl; cad1.swap(cad2); // intercambio cad1.swap(cad2); // intercambio cout << "cad1 = " << cad1 << endl; cout << "cad1 = " << cad1 << endl; cout << "cad2 = " << cad2 << endl; cout << "cad2 = " << cad2 << endl; return 0; return 0;} Página 52 Fundamentos de la programación: Tipos de datos estructurados string.cppstring.cpp

54 Luis Hernández Yáñez E/S con cadenas de tipo string Se pueden mostrar en la pantalla directamente con cout <<. Se pueden mostrar en la pantalla directamente con cout <<. La lectura con cin >> termina en el primer espacio en blanco. 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 ). 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 53 Fundamentos de la programación: Tipos de datos estructurados Observa que las funciones getline() son distintas para cadenas al estilo de C ( cin.getline(...) ) y para cadenas de tipo string ( getline(cin,...) ).

55 Luis Hernández Yáñez E/S con cadenas de tipo string Página 54 Fundamentos de la programación: Tipos de datos estructurados string2.cppstring2.cpp #include 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; }

56 Luis Hernández Yáñez 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. 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. 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. 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 55 Fundamentos de la programación: Tipos de datos estructurados Notación punto (.)

57 Luis Hernández Yáñez 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. 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. 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 56 Fundamentos de la programación: Tipos de datos estructurados

58 Luis Hernández Yáñez Más sobre cadenas de tipo string Longitud de una cadena: cadena.length() o cadena.size() Longitud de una cadena: cadena.length() o cadena.size() Están definidos los operadores relacionales: if (cad1 <= cad2)... 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 cad2 cadena.insert(0, cad3); // Inserta en la posición 0 cad3 cadena.append(3, '!'); // Añade por el final 3 caracteres // de signo de exclamación (!) 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 cad2 cadena.insert(0, cad3); // Inserta en la posición 0 cad3 cadena.append(3, '!'); // Añade por el final 3 caracteres // de signo de exclamación (!) Acceso a los caracteres de una cadena 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 57 Fundamentos de la programación: Tipos de datos estructurados

59 Luis Hernández Yáñez Página 58 Fundamentos de la programación: Tipos de datos estructurados

60 Luis Hernández Yáñez 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; tipo1 nombre_de_campo1; tipo2 nombre_de_campo2; tipo2 nombre_de_campo2;... } lista_de_variables; // Puede no haber lista de variables Página 59 Fundamentos de la programación: Tipos de datos estructurados {{ IdentificadorIdentificador structstruct CampoCampo VariablesVariables }} IdentificadorIdentificador TipoTipo ;; CampoCampo ;;

61 Luis Hernández Yáñez Tipos estructuras Declaramos 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 nombre; string apellidos; string apellidos; int edad; int edad; string nif; 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 60 Fundamentos de la programación: Tipos de datos estructurados

62 Luis Hernández Yáñez Agrupación de datos heterogéneos typedef struct { string nombre; string nombre; string apellidos; string apellidos; int edad; int edad; string nif; string nif; } tPersona; tPersona persona; Página 61 Fundamentos de la programación: Tipos de datos estructurados Luis Antonio nombrenombre Hernández Yáñez apellidosapellidos 2222edadedad 00223344F00223344Fnifnifpersonapersona

63 Luis Hernández Yáñez Elementos sin orden establecido typedef struct { string nombre; string nombre; string apellidos; string apellidos; int edad; int edad; string nif; 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 62 Fundamentos de la programación: Tipos de datos estructurados Las estructuras se pueden pasar por valor o por referencia a los subprogramas.

64 Luis Hernández Yáñez 11 const int Max = 100; typedef struct { string dni; string dni; char letra; char letra; } tNif; typedef struct { string nombre; string nombre; string apellidos; string apellidos; int edad; int edad; tNif nif; tNif nif; } tPersona; typedef tPersona tLista[Max]; typedef double tNotas[Max]; typedef struct { tLista lista; tLista lista; tNotas notas; tNotas notas; int cont; int cont; } tClase; Página 63 Fundamentos de la programación: Tipos de datos estructurados nombrenombre apellidosapellidos edadedad nifnif dnidni letraletra tPersonatPersona tNiftNif nombrenombre apellidosapellidos edadedad nifnif dnidni letraletra nombrenombre apellidosapellidos edadedad nifnif dnidni letraletra nombrenombre apellidosapellidos edadedad nifnif dnidni letraletra nombrenombre apellidosapellidos edadedad nifnif dnidni letraletra nombrenombre apellidosapellidos edadedad nifnif dnidni letraletra tListatLista...... 00 22 33 Max-1Max-1

65 Luis Hernández Yáñez const int Max = 100; typedef struct { string dni; string dni; char letra; char letra; } tNif; typedef struct { string nombre; string nombre; string apellidos; string apellidos; int edad; int edad; tNif nif; tNif nif; } tPersona; typedef tPersona tLista[Max]; typedef double tNotas[Max]; typedef struct { tLista lista; tLista lista; tNotas notas; tNotas notas; int cont; int cont; } tClase; Página 64 Fundamentos de la programación: Tipos de datos estructurados contcont listalista tClasetClase............ notasnotas

66 Luis Hernández Yáñez #include #include using namespace std; #include #include const int Max = 100; typedef struct { string dni; string dni; char letra; char letra; } tNif; typedef struct { string nombre; string nombre; string apellidos; string apellidos; int edad; int edad; tNif nif; tNif nif; } tPersona; typedef tPersona tLista[Max]; typedef double tNotas[Max]; typedef struct { tLista lista; tLista lista; tNotas notas; tNotas notas; int cont; int cont; } tClase; Página 65 Fundamentos de la programación: Tipos de datos estructurados (continúa...) bd.cppbd.cpp Declaraciones de tipos al principio del programa. Alcance global (Si algún tipo sólo se usa en un subprograma, se declarará dentro de ese subprograma.) Declaraciones de tipos al principio del programa. Alcance global (Si algún tipo sólo se usa en un subprograma, se declarará dentro de ese subprograma.)

67 Luis Hernández Yáñez int 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 66 Fundamentos de la programación: Tipos de datos estructurados (continúa...) Los prototipos, después de los tipos globales

68 Luis Hernández Yáñez Página 67 Fundamentos de la programación: Tipos de datos estructurados (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 > op; } while ((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) '9')) ok = false; return ok; }

69 Luis Hernández Yáñez void leeNif(tNif &nif) { do { do { cout << "D.N.I. (8 digitos): "; cout << "D.N.I. (8 digitos): "; cin.sync(); cin.sync(); cin >> nif.dni; cin >> nif.dni; } while (!dniOK(nif.dni)); } while (!dniOK(nif.dni)); do { do { cout << "Letra: "; cout << "Letra: "; cin.sync(); cin.sync(); cin >> nif.letra; cin >> nif.letra; nif.letra = toupper(nif.letra); nif.letra = toupper(nif.letra); } while ((nif.letra 'Z')); } while ((nif.letra 'Z'));} Página 68 Fundamentos de la programación: Tipos de datos estructurados (continúa...) string dameNif(tPersona persona) { return persona.nif.dni + "-" + persona.nif.letra; // Concat. de cadenas return persona.nif.dni + "-" + persona.nif.letra; // Concat. de cadenas} string nombreCompleto(tPersona persona) { return persona.nombre + " " + persona.apellidos; // Concat. de cadenas return persona.nombre + " " + persona.apellidos; // Concat. de cadenas}

70 Luis Hernández Yáñez void leePersona(tPersona &persona) { cout << "Nombre (solo uno): "; // Sólo se admiten nombres de una palabra cout << "Nombre (solo uno): "; // Sólo se admiten nombres de una palabra cin.sync(); cin.sync(); cin >> persona.nombre; cin >> persona.nombre; cout << "Apellidos: "; cout << "Apellidos: "; cin.sync(); cin.sync(); getline(cin, persona.apellidos); getline(cin, persona.apellidos); cout << "Edad: "; cout << "Edad: "; cin >> persona.edad; cin >> persona.edad; leeNif(persona.nif); leeNif(persona.nif);} Página 69 Fundamentos de la programación: Tipos de datos estructurados (continúa...) double leeNota(tPersona persona) { cout << "Nota de " << nombreCompleto(persona) << ": "; cout << "Nota de " << nombreCompleto(persona) << ": "; double nota; double nota; cin.sync(); cin.sync(); cin >> nota; cin >> nota; return nota; return nota;}

71 Luis Hernández Yáñez bool insertaPersona(tClase &clase, tPersona persona, double nota) { bool ok = true; bool ok = true; if (clase.cont == Max) if (clase.cont == Max) ok = false; ok = false; else { else { clase.lista[clase.cont] = persona; clase.lista[clase.cont] = persona; clase.notas[clase.cont] = nota; clase.notas[clase.cont] = nota; clase.cont++; clase.cont++; } return ok; return ok;} Página 70 Fundamentos de la programación: Tipos de datos estructurados (continúa...) void escribePersona(tPersona persona) { cout << setw(25) << persona.nombre + " " + persona.apellidos cout << setw(25) << persona.nombre + " " + persona.apellidos << " (" << dameNif(persona) << ", " << persona.edad << " (" << dameNif(persona) << ", " << persona.edad << " años)"; << " años)";}

72 Luis Hernández Yáñez double mediaClase(tClase clase) { double total = 0.0; double total = 0.0; for (int i = 0; i < clase.cont; i++) for (int i = 0; i < clase.cont; i++) total = total + clase.notas[i]; total = total + clase.notas[i]; return total / clase.cont; return total / clase.cont;} Página 71 Fundamentos de la programación: Tipos de datos estructurados (continúa...) int mayorNota(tClase clase) { double max = 0; double max = 0; int pos = 0; int pos = 0; for (int i = 0; i < clase.cont; i++) for (int i = 0; i < clase.cont; i++) if (clase.notas[i] > max) { if (clase.notas[i] > max) { max = clase.notas[i]; max = clase.notas[i]; pos = i; pos = i; } return pos; return pos;}

73 Luis Hernández Yáñez void listado(tClase clase, int mayor) { for (int i = 0; i < clase.cont; i++) { for (int i = 0; i < clase.cont; i++) { escribePersona(clase.lista[i]); escribePersona(clase.lista[i]); cout << " - Nota: " << setw(4) << fixed cout << " - Nota: " << setw(4) << fixed << setprecision(1) << clase.notas[i]; << setprecision(1) << clase.notas[i]; if (i == mayor) if (i == mayor) cout << " <<< Mayor nota!"; cout << " <<< Mayor nota!"; cout << endl; cout << endl; } } Página 72 Fundamentos de la programación: Tipos de datos estructurados (continúa...)

74 Luis Hernández Yáñez int main() { tClase clase; tClase clase; inicializa(clase); inicializa(clase); int op; int op; do { do { op = menu(); op = menu(); if (op == 1) { if (op == 1) { tPersona persona; tPersona persona; leePersona(persona); leePersona(persona); double nota = leeNota(persona); double nota = leeNota(persona); if (!insertaPersona(clase, persona, nota)) if (!insertaPersona(clase, persona, nota)) cout << "Lista llena: imposible insertar" << endl; cout << "Lista llena: imposible insertar" << endl; } else if (op == 2) { else if (op == 2) { int posMayorNota = mayorNota(clase); int posMayorNota = mayorNota(clase); listado(clase, posMayorNota); listado(clase, posMayorNota); } } while (op != 0); } while (op != 0); return 0; return 0;} Página 73 Fundamentos de la programación: Tipos de datos estructurados

75 Luis Hernández Yáñez Página 74 Fundamentos de la programación: Tipos de datos estructurados

76 Luis Hernández Yáñez int main() { tClase clase; tClase clase; inicializa(clase); inicializa(clase); int op; int op; do { do { op = menu(); op = menu(); if (op == 1) { if (op == 1) { tPersona persona; tPersona persona; leePersona(persona); leePersona(persona); double nota = leeNota(persona); double nota = leeNota(persona); if (!insertaPersona(clase, persona, nota)) if (!insertaPersona(clase, persona, nota)) cout << "Lista llena: imposible insertar" cout << "Lista llena: imposible insertar" << endl; << endl; } else if (op == 2) { else if (op == 2) { int posMayorNota = mayorNota(clase); int posMayorNota = mayorNota(clase); listado(clase, posMayorNota); listado(clase, posMayorNota); } } while (op != 0); } while (op != 0); return 0; return 0;} Página 75 Fundamentos de la programación: Tipos de datos estructurados contcont listalista claseclase............ notasnotas

77 Luis Hernández Yáñez int main() { tClase clase; tClase clase; inicializa(clase); inicializa(clase); int op; int op; do { do { op = menu(); op = menu(); if (op == 1) { if (op == 1) { tPersona persona; tPersona persona; leePersona(persona); leePersona(persona); double nota = leeNota(persona); double nota = leeNota(persona); if (!insertaPersona(clase, persona, nota)) if (!insertaPersona(clase, persona, nota)) cout << "Lista llena: imposible insertar" cout << "Lista llena: imposible insertar" << endl; << endl; } else if (op == 2) { else if (op == 2) { int posMayorNota = mayorNota(clase); int posMayorNota = mayorNota(clase); listado(clase, posMayorNota); listado(clase, posMayorNota); } } while (op != 0); } while (op != 0); return 0; return 0;} Página 76 Fundamentos de la programación: Tipos de datos estructurados 00 contcont listalista claseclase............ notasnotas

78 Luis Hernández Yáñez int main() { tClase clase; tClase clase; inicializa(clase); inicializa(clase); int op; int op; do { do { op = menu(); op = menu(); if (op == 1) { if (op == 1) { tPersona persona; tPersona persona; leePersona(persona); leePersona(persona); double nota = leeNota(persona); double nota = leeNota(persona); if (!insertaPersona(clase, persona, nota)) if (!insertaPersona(clase, persona, nota)) cout << "Lista llena: imposible insertar" cout << "Lista llena: imposible insertar" << endl; << endl; } else if (op == 2) { else if (op == 2) { int posMayorNota = mayorNota(clase); int posMayorNota = mayorNota(clase); listado(clase, posMayorNota); listado(clase, posMayorNota); } } while (op != 0); } while (op != 0); return 0; return 0;} Página 77 Fundamentos de la programación: Tipos de datos estructurados 00 contcont listalista claseclase............ notasnotas nombrenombre apellidosapellidos edadedad nifnif dnidni letraletra personapersona

79 Luis Hernández Yáñez int main() { tClase clase; tClase clase; inicializa(clase); inicializa(clase); int op; int op; do { do { op = menu(); op = menu(); if (op == 1) { if (op == 1) { tPersona persona; tPersona persona; leePersona(persona); leePersona(persona); double nota = leeNota(persona); double nota = leeNota(persona); if (!insertaPersona(clase, persona, nota)) if (!insertaPersona(clase, persona, nota)) cout << "Lista llena: imposible insertar" cout << "Lista llena: imposible insertar" << endl; << endl; } else if (op == 2) { else if (op == 2) { int posMayorNota = mayorNota(clase); int posMayorNota = mayorNota(clase); listado(clase, posMayorNota); listado(clase, posMayorNota); } } while (op != 0); } while (op != 0); return 0; return 0;} Página 78 Fundamentos de la programación: Tipos de datos estructurados 00 contcont listalista claseclase............ notasnotas LuisLuis nombrenombre HernándezHernández apellidosapellidos 2222 edadedad nifnif 0011223300112233 dnidni FF letraletra personapersona

80 Luis Hernández Yáñez int main() { tClase clase; tClase clase; inicializa(clase); inicializa(clase); int op; int op; do { do { op = menu(); op = menu(); if (op == 1) { if (op == 1) { tPersona persona; tPersona persona; leePersona(persona); leePersona(persona); double nota = leeNota(persona); double nota = leeNota(persona); if (!insertaPersona(clase, persona, nota)) if (!insertaPersona(clase, persona, nota)) cout << "Lista llena: imposible insertar" cout << "Lista llena: imposible insertar" << endl; << endl; } else if (op == 2) { else if (op == 2) { int posMayorNota = mayorNota(clase); int posMayorNota = mayorNota(clase); listado(clase, posMayorNota); listado(clase, posMayorNota); } } while (op != 0); } while (op != 0); return 0; return 0;} Página 79 Fundamentos de la programación: Tipos de datos estructurados 00 contcont listalista claseclase............ notasnotas LuisLuis nombrenombre HernándezHernández apellidosapellidos 2222 edadedad nifnif 0011223300112233 dnidni FF letraletra personapersona 9.79.7 notanota

81 Luis Hernández Yáñez int main() { tClase clase; tClase clase; inicializa(clase); inicializa(clase); int op; int op; do { do { op = menu(); op = menu(); if (op == 1) { if (op == 1) { tPersona persona; tPersona persona; leePersona(persona); leePersona(persona); double nota = leeNota(persona); double nota = leeNota(persona); if (!insertaPersona(clase, persona, nota)) if (!insertaPersona(clase, persona, nota)) cout << "Lista llena: imposible insertar" cout << "Lista llena: imposible insertar" << endl; << endl; } else if (op == 2) { else if (op == 2) { int posMayorNota = mayorNota(clase); int posMayorNota = mayorNota(clase); listado(clase, posMayorNota); listado(clase, posMayorNota); } } while (op != 0); } while (op != 0); return 0; return 0;} Página 80 Fundamentos de la programación: Tipos de datos estructurados 00 contcont listalista claseclase............ notasnotas LuisLuis nombrenombre HernándezHernández apellidosapellidos 2222 edadedad nifnif 0011223300112233 dnidni FF letraletra personapersona notanota 9.79.7

82 Luis Hernández Yáñez int main() { tClase clase; tClase clase; inicializa(clase); inicializa(clase); int op; int op; do { do { op = menu(); op = menu(); if (op == 1) { if (op == 1) { tPersona persona; tPersona persona; leePersona(persona); leePersona(persona); double nota = leeNota(persona); double nota = leeNota(persona); if (!insertaPersona(clase, persona, nota)) if (!insertaPersona(clase, persona, nota)) cout << "Lista llena: imposible insertar" cout << "Lista llena: imposible insertar" << endl; << endl; } else if (op == 2) { else if (op == 2) { int posMayorNota = mayorNota(clase); int posMayorNota = mayorNota(clase); listado(clase, posMayorNota); listado(clase, posMayorNota); } } while (op != 0); } while (op != 0); return 0; return 0;} Página 81 Fundamentos de la programación: Tipos de datos estructurados 11 contcont listalista claseclase...... 9.79.7...... notasnotas LuisLuis nombrenombre HernándezHernández apellidosapellidos 2222 edadedad nifnif 0011223300112233 dnidni FF letraletra personapersona 9.79.7 notanota LuisLuis nombrenombre HernándezHernández apellidosapellidos 2222 edadedad nifnif 0011223300112233 dnidni FF letraletra

83 Luis Hernández Yáñez Programming. Principles and Practice Using C++ B. Stroustrup. Pearson Education, 2009 Programming. Principles and Practice Using C++ B. Stroustrup. Pearson Education, 2009 Programación en C++ para ingenieros F. Xhafa et al. Thomson, 2006 Programación en C++ para ingenieros F. Xhafa et al. Thomson, 2006 C++: An Introduction to Computing (2ª edición) J. Adams, S. Leestma, L. Nyhoff. Prentice Hall, 1998 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 El lenguaje de programación C++ (Edición especial) B. Stroustrup. Addison-Wesley, 2002 Fundamentos de la programación: Tipos de datos estructurados Página 82

84 Luis Hernández Yáñez Licencia CC (Creative Commons) Creative CommonsCreative 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. Fundamentos de la programación: Tipos de datos estructurados Página 83 Reconocimiento (Attribution): En cualquier explotación de la obra autorizada por la licencia hará 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.


Descargar ppt "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."

Presentaciones similares


Anuncios Google