La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

6 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: "6 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 6 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: Algoritmos de recorrido y búsqueda para arrays Recorrido de arrays2 Recorrido de arrays completos5 Recorrido de arrays no completos Con centinela6 Con contador7 Ejemplos9 Listas de longitud variable16 Arrays y archivos26 De archivo a array27 De array a archivo28 Arrays multidimensionales34 Búsquedas en arrays39 Búsqueda de arrays completos41 Búsqueda de arrays no completos Con centinela42 Con contador43 Ejemplos45 Recorridos y búsquedas en cadenas50

3 Luis Hernández Yáñez Página 2 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

4 Luis Hernández Yáñez Esquema de recorrido Inicialización Mientras no se llegue al final de la secuencia: Obtener el siguiente elemento Procesar el elemento Finalización Página 3 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays falsefalse truetrue InicializaciónInicialización Procesar elemento ¿Al final? Obtener elemento FinalizaciónFinalización Secuencias en arrays: Todas las posiciones ocupadas: Tamaño del array = longitud de la secuencia Todas las posiciones ocupadas: Tamaño del array = longitud de la secuencia Posiciones libres al final del array: Tamaño del array > longitud de la secuencia Posiciones libres al final del array: Tamaño del array > longitud de la secuencia Con centinela. Con centinela. Con contador de elementos. Con contador de elementos.

5 Luis Hernández Yáñez Recorrido de secuencias en arrays Todas las posiciones ocupadas: Todas las posiciones ocupadas: N elementos en un array de N posiciones: Recorrer todo el array desde la primera posición hasta la última. Posiciones libres al final del array: Posiciones libres al final del array: Con centinela: Con centinela: Recorrer el array hasta encontrar el valor centinela. Con contador de elementos: Con contador de elementos: Recorrer las posiciones del array desde la primera hasta contador-1. Página 4 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

6 Luis Hernández Yáñez Recorrido de arrays completos Todas las posiciones del array ocupadas. const int N = 10; typedef int tVentas[N]; tVentas ventas; double elemento; for (int i = 0; i < N; i++) { elemento = ventas[i]; elemento = ventas[i]; // Procesar el elemento... // Procesar el elemento...} Página 5 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

7 Luis Hernández Yáñez Recorrido de arrays no completos – con centinela No todas las posiciones del array están ocupadas. const int N = 10; typedef int tArray[N]; tArray array; // Datos positivos: centinela = negativo int i = 0; bool final = false; double elemento; while (!final) { elemento = array[i]; elemento = array[i]; if (elemento < 0) final = true; if (elemento < 0) final = true; else { else { // Procesar el elemento... // Procesar el elemento... i++; i++; }} Página 6 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays int i = 0; double elemento; do { elemento = array[i]; if (elemento >= 0) { // Procesar el dato... i++; } } while (elemento >= 0);

8 Luis Hernández Yáñez 77 contadorcontador Recorrido de arrays no completos – con contador No todas las posiciones del array ocupadas. Contador de elementos. Como el array y el contador están íntimamente relacionados, usamos una estructura para encapsularlos: const int N = 10; typedef double tArray[N]; typedef struct { tArray elementos; tArray elementos; int contador; int contador; } tLista; Página 7 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays Nº de elementos (primer índice sin elemento) Lista de elementos de longitud variable

9 Luis Hernández Yáñez Recorrido de arrays no completos – con contador const int N = 10; typedef double tArray[N]; typedef struct { tArray elementos; tArray elementos; int contador; int contador; } tLista; tLista miLista;... double elemento; for (int i = 0; i < miLista.contador; i++) { elemento = miLista.elementos[i]; elemento = miLista.elementos[i]; // Procesar el dato... // Procesar el dato...} Página 8 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

10 Luis Hernández Yáñez Página 9 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

11 Luis Hernández Yáñez Media de una lista de N números enteros en array const int N = 100; typedef int tArray[N]; tArray nums; // Exactamente 100 enteros // Por ejemplo, los 100 primeros cuadrados: for (int i = 0; i < N; i++) nums[i] = i * i; nums[i] = i * i; double total = 0, media; for (int i = 0; i < N; i++) total = total + nums[i]; total = total + nums[i]; media = total / N; cout << "Media de la lista de enteros: " << media << endl; Página 10 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays media.cppmedia.cpp

12 Luis Hernández Yáñez Array con los N primeros números de Fibonacci const int N = 50; typedef long long int tFibonacci[N]; // Exactamente 50 números tFibonacci fib; fib[0] = 1; fib[1] = 1; for (int i = 2; i < N; i++) fib[i] = fib[i - 1] + fib[i - 2]; fib[i] = fib[i - 1] + fib[i - 2]; for (int i = 0; i < N; i++) cout << fib[i] << " "; cout << fib[i] << " "; Página 11 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays fibonacci.cppfibonacci.cpp

13 Luis Hernández Yáñez Cuenta de valores con k dígitos Recorrer una lista de N números enteros contabilizando cuántos son de 1 dígito, cuántos de 2 dígitos, etcétera (hasta 6 dígitos). 2 arrays: array con valores y array de cuentas const int N = 100; typedef int tNum[N]; // Exactamente 100 números tNum num; const int D = 6; typedef int tDig[D]; tDig dig = { 0 }; // Posición i --> cantidad de números de i + 1 dígitos Página 12 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

14 Luis Hernández Yáñez Cuenta de valores con k dígitos Función que devuelve el número de dígitos de un valor entero: int digitos(int dato) { int n_digitos = 1; // Al menos tiene un dígito int n_digitos = 1; // Al menos tiene un dígito while (dato >= 10) { while (dato >= 10) { dato = dato / 10; dato = dato / 10; n_digitos++; n_digitos++; } return n_digitos; return n_digitos;} Página 13 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

15 Luis Hernández Yáñez Cuenta de valores con k dígitos #include #include using namespace std; #include // Necesaria para usar rand() int digitos(int); int main() { const int N = 100; const int N = 100; typedef int tNum[N]; // Exactamente 100 números typedef int tNum[N]; // Exactamente 100 números tNum num; tNum num; const int D = 6; const int D = 6; typedef int tDig[D]; typedef int tDig[D]; tDig dig = { 0 }; tDig dig = { 0 }; for (int i = 0; i < N; i++) for (int i = 0; i < N; i++) num[i] = rand(); num[i] = rand();... Página 14 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays digitos.cppdigitos.cpp

16 Luis Hernández Yáñez... int dato, numDig; int dato, numDig; for (int i = 0; i < N; i++) { for (int i = 0; i < N; i++) { dato = num[i]; dato = num[i]; numDig = digitos(dato); numDig = digitos(dato); if (numDig <= D) if (numDig <= D) dig[numDig - 1]++; dig[numDig - 1]++; } for (int i = 0; i < D; i++) for (int i = 0; i < D; i++) cout << "De " << i + 1 << " dig. = " << dig[i] << endl; cout << "De " << i + 1 << " dig. = " << dig[i] << endl; return 0; return 0;} int digitos(int dato) { int n_digitos = 1; int n_digitos = 1; while (dato >= 10) { while (dato >= 10) { dato = dato / 10; dato = dato / 10; n_digitos++; n_digitos++; } return n_digitos; return n_digitos;} Página 15 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

17 Luis Hernández Yáñez Página 16 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

18 Luis Hernández Yáñez Implementación estática de listas de tamaño variable Empleamos una estructura que agrupa el array y el contador. Definimos operaciones primitivas para insertar, buscar y eliminar elementos. const int N = 10; typedef double tArray[N]; typedef struct { tArray elementos; tArray elementos; int contador; int contador; } tLista; 66 contadorcontador Página 17 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays Nº de elementos (o primer índice sin elemento) Elementos sin usar (datos basura)

19 Luis Hernández Yáñez Insertar un elemento en la primera posición Queremos insertar un nuevo elemento al principio del array: Operación en 3 pasos: 1.- Abrir hueco para el nuevo elemento (desplazar a la derecha). 2.- Colocar el elemento nuevo en la primera posición. 3.- Incrementar el contador. 66 42.042.0 nuevonuevo Página 18 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

20 Luis Hernández Yáñez Insertar un elemento en la primera posición 1.- Abrir hueco (desplazamiento a la derecha). El desplazamiento se hace de derecha a izquierda. Al final, el primer elemento queda duplicado. for (int i = miLista.contador; i > 0; i--) miLista.elementos[i] = miLista.elementos[i - 1]; miLista.elementos[i] = miLista.elementos[i - 1]; 66 42.042.0 nuevonuevo Página 19 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

21 Luis Hernández Yáñez Insertar un elemento en la primera posición 2.- Insertar el nuevo elemento. miLista.elementos[0] = nuevoElemento; 3.- Incrementar el contador. miLista.contador++; 77 42.042.0 nuevonuevo Página 20 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays Antes de insertar, deberíamos asegurarnos de que todavía quede hueco suficiente en el array.

22 Luis Hernández Yáñez Eliminar el elemento de la primera posición Recorremos el array, desde la segunda posición, desplazando hacia la izquierda; finalmente decrementamos el contador: for (int i = 1; i < miLista.contador; i++) miLista.elementos[i - 1] = miLista.elementos[i]; miLista.elementos[i - 1] = miLista.elementos[i];miLista.contador--; 66 Página 21 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays 55

23 Luis Hernández Yáñez Insertar un elemento (versión general) Insertamos un nuevo número en una posición concreta (de 0 a N-1). Hay que asegurarse de que haya sitio (contador menor que el máximo). Operación en 3 pasos: 1.- Abrir hueco para el nuevo elemento (desde la posición indicada) 2.- Colocar el elemento nuevo en la posición 3.- Incrementar el contador 66 42.042.0 nuevonuevo Página 22 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays 33 pospos

24 Luis Hernández Yáñez Insertar un elemento (versión general) if (miLista.contador < N) { // Abrir hueco for (int i = miLista.contador; i > pos; i--) // Abrir hueco for (int i = miLista.contador; i > pos; i--) miLista.elementos[i] = miLista.elementos[i - 1]; miLista.elementos[i] = miLista.elementos[i - 1]; // Insertar e incrementar contador miLista.elementos[pos] = nuevoElemento; miLista.contador++; // Insertar e incrementar contador miLista.elementos[pos] = nuevoElemento; miLista.contador++;} Página 23 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays 77 42.042.0 nuevonuevo 33 pospos

25 Luis Hernández Yáñez Eliminar un elemento (versión general) Eliminamos un número de una posición concreta (de 0 a N-1). Recorremos el array desplazando hacia la izquierda y decrementamos el contador: for (int i = pos; i < miLista.contador -1 ; i++) miLista.elementos[i] = miLista.elementos[i + 1]; miLista.elementos[i] = miLista.elementos[i + 1];miLista.contador--; 66 Página 24 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays 33 pospos

26 Luis Hernández Yáñez 55 33 pospos Eliminar un elemento (versión general) for (int i = pos; i < miLista.contador -1 ; i++) miLista.elementos[i] = miLista.elementos[i + 1]; miLista.elementos[i] = miLista.elementos[i + 1];miLista.contador--; 66 Página 25 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays 33 pospos

27 Luis Hernández Yáñez Página 26 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

28 Luis Hernández Yáñez Carga de los datos de un array desde un archivo En ocasiones puede resultar conveniente cargar en un array los datos de una secuencia que se encuentre en un archivo. Por ejemplo, si hay que realizar varios recorridos.... tLista miLista; ifstream archivo; double dato; miLista.contador = 0; archivo.open("datos.txt"); // Centinela al final: -1 archivo >> dato; while (dato >= 0) { // Recorrido del archivo if (miLista.contador == N)... // ERROR: Más datos de los que caben if (miLista.contador == N)... // ERROR: Más datos de los que caben else { else { miLista.elementos[miLista.contador] = dato; miLista.elementos[miLista.contador] = dato; miLista.contador++; miLista.contador++; archivo >> dato; archivo >> dato; }} Página 27 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays Hay que crear un array suficientemente grande y asegurarse de que no haya más datos que posiciones en el array.

29 Luis Hernández Yáñez #include #include using namespace std; #include #include int main() { const int N = 100; const int N = 100; typedef double tArray[N]; typedef double tArray[N]; typedef struct { typedef struct { tArray elementos; tArray elementos; int contador; int contador; } tLista; } tLista; tLista miLista; tLista miLista; ifstream archivo; ifstream archivo; double dato; double dato; miLista.contador = 0; miLista.contador = 0; archivo.open("datos.txt"); // Centinela al final: -1 archivo.open("datos.txt"); // Centinela al final: -1 if (!archivo.is_open()) if (!archivo.is_open()) cout << "ERROR: No existe el archivo!" << endl; cout << "ERROR: No existe el archivo!" << endl; else { else { bool overflow = false;... bool overflow = false;... Página 28 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays carga.cppcarga.cpp

30 Luis Hernández Yáñez archivo >> dato; archivo >> dato; while ((dato >= 0) && !overflow) { while ((dato >= 0) && !overflow) { if (miLista.contador == N) if (miLista.contador == N) overflow = true; // Demasiados! overflow = true; // Demasiados! else { else { miLista.elementos[miLista.contador] = dato; miLista.elementos[miLista.contador] = dato; miLista.contador++; miLista.contador++; archivo >> dato; archivo >> dato; } } if (overflow) if (overflow) cout << "Había datos de los que caben!" << endl; cout << "Había datos de los que caben!" << endl; // En cualquier caso, los mostramos... // En cualquier caso, los mostramos... for (int i = 0; i < miLista.contador; i++) { for (int i = 0; i < miLista.contador; i++) { dato = miLista.elementos[i]; dato = miLista.elementos[i]; cout << dato << " "; cout << dato << " "; } cout << endl; cout << endl; archivo.close(); archivo.close(); } return 0; return 0;} Página 29 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

31 Luis Hernández Yáñez 1919 contadorcontador elementoselementos Página 30 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays 0 123.45 1 43.8 2 1986.0 3 325.98 4 1.156 5 49.5 6 543.21 7 666.0 8 9763.25 9 21.69 10 8.897 11 83927.0 12 29.564 13 45.21 14 112.12 15 999.0 16 6333.33 17 6.0 18 732.6 19 ?... 00 contadorcontador 0 ? 1 ? 2 ? 3 ? 4 ? 5 ? 6 ? 7 ? 8 ? 9 ? 10 ? 11 ? 12 ? 13 ? 14 ? 15 ? 16 ? 17 ? 18 ? 19 ?... elementoselementos

32 Luis Hernández Yáñez Copia de los datos de un array a un archivo A menudo querremos guardar en disco (memoria permanente) los datos de un array, para recuperarlos más adelante. En principio, el array puede ser todo lo grande que haga falta. const int N = 100; typedef double tArray[N]; typedef struct { tArray elementos; tArray elementos; int contador; int contador; } tLista; tLista miLista; ofstream archivo; double dato;... archivo.open("backup.txt"); for (int i = 0; i < miLista.contador; i++) // Recorremos el array archivo << miLista.elementos[i] << endl; archivo << miLista.elementos[i] << endl;archivo.close(); Página 31 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

33 Luis Hernández Yáñez #include #include using namespace std; #include #include int main() { const int N = 100; const int N = 100; typedef struct { typedef struct { double elementos[N]; double elementos[N]; int contador; int contador; } tLista; } tLista; tLista miLista; tLista miLista; ofstream archivo; ofstream archivo; double dato; double dato; for (int i = 0; i < N; i++) for (int i = 0; i < N; i++) miLista.elementos[i] = i; miLista.elementos[i] = i; miLista.contador = N; miLista.contador = N; archivo.open("backup.txt");... archivo.open("backup.txt");... Página 32 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays backup.cppbackup.cpp

34 Luis Hernández Yáñez...... if (!archivo.is_open()) if (!archivo.is_open()) cout << "ERROR: No se ha podido crear el archivo!" << endl; cout << "ERROR: No se ha podido crear el archivo!" << endl; else { else { // Ahora creamos la copia de seguridad... // Ahora creamos la copia de seguridad... for (int i = 0; i < miLista.contador; i++) for (int i = 0; i < miLista.contador; i++) archivo << miLista.elementos[i] << endl; archivo << miLista.elementos[i] << endl; archivo << -1 << endl; // Centinela final archivo << -1 << endl; // Centinela final archivo.close(); archivo.close(); } return 0; return 0;} Página 33 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

35 Luis Hernández Yáñez Página 34 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

36 Luis Hernández Yáñez Recorrido de un array bidimensional const int FILAS = 10; const int COLUMNAS = 5; typedef double tMatriz[FILAS][COLUMNAS]; tMatriz matriz; Para cada fila (de 0 a FILAS – 1): Para cada columna (de 0 a COLUMNAS – 1): Procesar el elemento en [fila][columna] for (int fila = 0; fila < FILAS; fila++) for (int columna = 0; columna < COLUMNAS; columna++) for (int columna = 0; columna < COLUMNAS; columna++) // Procesar matriz[fila][columna]; // Procesar matriz[fila][columna]; Página 35 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

37 Luis Hernández Yáñez Recorrido de arrays N-dimensionales const int DIM1 = 10; const int DIM2 = 5; const int DIM3 = 25; const int DIM4 = 50; typedef double tMatriz[DIM1][DIM2][DIM3][DIM4]; tMatriz matriz; Anidamiento de bucles desde la primera dimensión hasta la última: for (int n1 = 0; n1 < DIM1; n1++) for (int n2 = 0; n2 < DIM2; n2++) for (int n2 = 0; n2 < DIM2; n2++) for (int n3 = 0; n3 < DIM3; n3++) for (int n3 = 0; n3 < DIM3; n3++) for (int n4 = 0; n4 < DIM4; n4++) for (int n4 = 0; n4 < DIM4; n4++) // Procesar matriz[n1][n2][n3][n4]; // Procesar matriz[n1][n2][n3][n4]; Página 36 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

38 Luis Hernández Yáñez Ventas diarias de cuatro sucursales Para cada mes del año: ingresos de cada sucursal cada día del mes. Meses con distinto nº de días junto con la matriz de ventas mensual guardamos el nº de días del mes concreto estructura. const int MESES = 12; const int DIAS = 31; const int SUCURSALES = 4; typedef double tVentaMes[DIAS][SUCURSALES]; typedef struct { tVentaMes ventas; tVentaMes ventas; int dias; int dias; } tMes; typedef tMes tVentaAnual[MESES]; tVentaAnual anual; Página 37 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays anual tVentaAnual anual[i] tMes anual[i].dias int anual[i].ventas tVentaMes anual[i].ventas[j][k] double anual tVentaAnual anual[i] tMes anual[i].dias int anual[i].ventas tVentaMes anual[i].ventas[j][k] double

39 Luis Hernández Yáñez Ventas diarias de cuatro sucursales... typedef double tVentaMes[DIAS][SUCURSALES]; typedef struct { tVentaMes ventas; tVentaMes ventas; int dias; int dias; } tMes; typedef tMes tVentaAnual[MESES]; tVentaAnual anual; Cálculo del total de las ventas del año: double total = 0; for (int mes = 0; mes < MESES; mes++) for (int dia = 0; dia < anual[mes].dias; dia++) for (int dia = 0; dia < anual[mes].dias; dia++) for (int suc = 0; suc < SUCURSALES; suc++) for (int suc = 0; suc < SUCURSALES; suc++) total = total + anual[mes].ventas[dia][suc]; total = total + anual[mes].ventas[dia][suc]; Página 38 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

40 Luis Hernández Yáñez Página 39 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

41 Luis Hernández Yáñez Esquema de búsqueda Inicialización Mientras no se encuentre el elemento y no se esté al final de la secuencia: Obtener el siguiente elemento Comprobar si el elemento satisface la condición Finalización (tratar el elemento encontrado o indicar que no se ha encontrado) Página 40 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays falsefalse truetrue Inicialización / encontrado = false; ¿Encontrado?¿Encontrado? ¿Al final o encontrado ? Obtener elemento FinalizaciónFinalización

42 Luis Hernández Yáñez Búsquedas en arrays completos Todas las posiciones del array ocupadas: const int N = 100; typedef int tArray[N]; tArray array; int buscado; //... cout << "Introduce el valor a buscar (entero): "; cin >> buscado; int pos = 0; bool encontrado = false; while ((pos < N) && !encontrado) // Mientras no se llegue al final del array y no encontrado if (array[pos] == buscado) encontrado = true; if (array[pos] == buscado) encontrado = true; else pos++; else pos++; if (encontrado) //... Página 41 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

43 Luis Hernández Yáñez Búsquedas en arrays no completos – con centinela No todas las posiciones del array ocupadas. Array de valores enteros positivos: centinela = -1 const int N = 10; typedef int tArray[N]; tArray array; int centinela = -1, buscado; //... cout << "Introduce el valor a buscar (entero): "; cin >> buscado; int pos = 0; bool final = false, encontrado = false; while (!final && !encontrado) // Mientras no se llegue al centinela y no encontrado if (array[pos] == centinela) final = true; if (array[pos] == centinela) final = true; else if (array[pos] == buscado) encontrado = true; else if (array[pos] == buscado) encontrado = true; else pos++; else pos++; if (encontrado) //... Página 42 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

44 Luis Hernández Yáñez Búsquedas en arrays no completos – con contador No todas las posiciones del array ocupadas. Contador de elementos. const int N = 10; typedef double tArray[N]; typedef struct { tArray elementos; tArray elementos; int contador; int contador; } tLista; tLista miLista; int buscado; //... cout << "Introduce el valor a buscar (entero): "; cin >> buscado; int pos = 0; bool encontrado = false; while ((pos < miLista.contador) && !encontrado) // Mientras no se llegue al final de la lista y no encontrado if (miLista.elementos[pos] == buscado) encontrado = true; if (miLista.elementos[pos] == buscado) encontrado = true; else pos++; else pos++; if (encontrado) //... Página 43 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

45 Luis Hernández Yáñez Búsquedas por posición Acceso directo: array[posición] Si se puede calcular la posición del elemento, su acceso será directo. typedef double tVentaMes[DIAS][SUCURSALES]; typedef struct { tVentaMes ventas; tVentaMes ventas; int dias; int dias; } tMes; typedef tMes tVentaAnual[MESES]; tVentaAnual anual; Localizar las ventas del cuarto día del tercer mes en la primera sucursal: anual[2].ventas[3][0] Página 44 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

46 Luis Hernández Yáñez Página 45 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

47 Luis Hernández Yáñez Primer valor por encima de un umbral #include #include using namespace std; #include #include const int N = 100; typedef double tArray[N]; typedef struct { tArray elementos; tArray elementos; int contador; int contador; } tLista; bool cargar(tLista &lista); int main() { tLista lista; tLista lista; if (!cargar(lista)) if (!cargar(lista)) cout << "Error de archivo: inexistente o con demasiados datos" cout << "Error de archivo: inexistente o con demasiados datos" << endl; << endl;... Página 46 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays umbral.cppumbral.cpp

48 Luis Hernández Yáñez else { else { double umbral; double umbral; cout > umbral; cout > umbral; bool encontrado = false; bool encontrado = false; int pos = 0; int pos = 0; while ((pos < lista.contador) && !encontrado) while ((pos < lista.contador) && !encontrado) if (lista.elementos[pos] > umbral) if (lista.elementos[pos] > umbral) encontrado = true; encontrado = true; else else pos++; pos++; if (encontrado) if (encontrado) cout << "Valor en pos. " << pos + 1 << " (" cout << "Valor en pos. " << pos + 1 << " (" << lista.elementos[pos] << ")" << endl; << lista.elementos[pos] << ")" << endl; else cout << "No encontrado!" << endl; else cout << "No encontrado!" << endl; } return 0; return 0; }... Página 47 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

49 Luis Hernández Yáñez bool cargar(tLista &lista) { ifstream archivo; ifstream archivo; double dato; double dato; bool abierto = true; bool abierto = true; bool overflow = false; bool overflow = false; lista.contador = 0; lista.contador = 0; archivo.open("datos.txt"); archivo.open("datos.txt"); if (!archivo.is_open()) if (!archivo.is_open()) abierto = false; abierto = false; else { else { archivo >> dato; archivo >> dato; while ((dato >= 0) && !overflow) { while ((dato >= 0) && !overflow) { if (lista.contador == N) overflow = true; // Demasiados! if (lista.contador == N) overflow = true; // Demasiados! else { else { lista.elementos[lista.contador] = dato; lista.elementos[lista.contador] = dato; lista.contador++; lista.contador++; archivo >> dato; archivo >> dato; } } } return (abierto && !overflow); return (abierto && !overflow);} Página 48 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

50 Luis Hernández Yáñez Arrays multidimensionales Primer valor por encima de un umbral double umbral; cout << "Valor umbral: "; cin >> umbral; bool encontrado = false; int mes = 0, dia, suc; while ((mes < MESES) && !encontrado) { dia = 0; dia = 0; while ((dia < anual[mes].dias) && !encontrado) { while ((dia < anual[mes].dias) && !encontrado) { suc = 0; suc = 0; while ((suc < SUCURSALES) && !encontrado) while ((suc < SUCURSALES) && !encontrado) if (anual[mes].ventas[dia][suc] > umbral) encontrado = true; if (anual[mes].ventas[dia][suc] > umbral) encontrado = true; else suc++; else suc++; if (!encontrado) dia++; if (!encontrado) dia++; } if (!encontrado) mes++; if (!encontrado) mes++;} if (encontrado)... Página 49 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays typedef double tVentaMes[DIAS][SUCURSALES]; typedef struct { tVentaMes ventas; int dias; } tMes; typedef tMes tVentaAnual[MESES]; tVentaAnual anual; typedef double tVentaMes[DIAS][SUCURSALES]; typedef struct { tVentaMes ventas; int dias; } tMes; typedef tMes tVentaAnual[MESES]; tVentaAnual anual;

51 Luis Hernández Yáñez Página 50 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays

52 Luis Hernández Yáñez Recorridos y búsquedas en cadenas de caracteres Longitud de la cadena: función size() o length() Caso similar a los arrays con contador de elementos. Recorrido de una cadena generando otra con los caracteres al revés: string cadena, inversa; //... int pos = 0; while (pos < cadena.size()) { // Mientras no se llegue al final de la cadena char car = cadena.at(pos); char car = cadena.at(pos); inversa = car + inversa; inversa = car + inversa; // Se puede concatenar un carácter a una cadena // Se puede concatenar un carácter a una cadena pos++; pos++;} //... Página 51 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays inversa.cppinversa.cpp

53 Luis Hernández Yáñez Recorridos y búsquedas en cadenas de caracteres Búsqueda de un carácter en una cadena: string cadena; char buscado; //... cout << "Introduce el carácter a buscar: "; cin >> buscado; int pos = 0; bool encontrado = false; while ((pos < cadena.size()) && !encontrado) { // Mientras no se llegue al final de la cadena y no encontrado if (cadena.at(pos) == buscado) if (cadena.at(pos) == buscado) encontrado = true; encontrado = true; else else pos++; pos++;} if (encontrado) //... Página 52 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays busca.cppbusca.cpp

54 Luis Hernández Yáñez Programación en C++ para ingenieros F. Xhafa et al. Thomson, 2006 Programación en C++ para ingenieros F. Xhafa et al. Thomson, 2006 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 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 Fundamentos de la programación: Algoritmos de recorrido y búsqueda para arrays Página 53

55 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: Algoritmos de recorrido y búsqueda para arrays Página 54 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 "6 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