06 RecorridoYBusqueda
06 RecorridoYBusqueda
06 RecorridoYBusqueda
de la programación
6
Grado en Ingeniería Informática
Grado en Ingeniería del Software
Grado en Ingeniería de Computadores
Recorrido de arrays 590
Arrays completos 593
Arrays no completos con centinela 594
Arrays no completos con contador 595
Ejemplos 597
Generación de números aleatorios 601
Búsquedas en arrays 604
Arrays completos 606
Arrays no completos con centinela 607
Arrays no completos con contador 608
Ejemplo 610
Recorridos y búsquedas en cadenas 614
Más ejemplos de manejo de arrays 617
Arrays multidimensionales 630
Inicialización de arrays multidimensionales 638
Luis Hernández Yáñez
Recorrido de un array bidimensional 641
Recorrido de un array N‐dimensional 644
Búsqueda en un array multidimensional 647
Fundamentos de la programación: Recorrido y búsqueda en arrays
Luis Hernández Yáñez
Esquema de recorrido
Inicialización Inicialización
Procesar elemento
Luis Hernández Yáñez
Finalización
double elemento;
for (int i = 0; i < N; i++) {
elemento = ventas[i];
Luis Hernández Yáñez
// Procesar el elemento ...
}
int i = 0;
int i = 0; double elemento;
double elemento = datos[i]; do {
while (elemento != ‐1) { elemento = datos[i];
Luis Hernández Yáñez
// Procesar el elemento ... if (elemento != ‐1) {
// Procesar el elemento...
i++; i++;
elemento = datos[i]; }
} } while (elemento != ‐1);
contador 7
0 1 2 3 4 5 6 7 99
numDig 0 0 0 0 0 0
0 1 2 3 4 5
...
numeros[0] = rand(); // Entre 0 y 32766
int main() {
const int NUM = 100;
typedef int tNum[NUM]; // Exactamente 100 números
const int DIG = 5;
typedef int tDig[DIG];
tNum numeros;
tDig numDig = { 0 }; // Inicializa todo el array a 0
Luis Hernández Yáñez
srand(time(NULL)); // Inicia la secuencia aleatoria
...
Esquema de búsqueda
Inicialización / encontrado = false;
Inicialización
Mientras no se encuentre el elemento
true
y no se esté al final de la secuencia: ¿Al final o
encontrado?
Obtener el siguiente elemento false
Comprobar si el elemento
Obtener elemento
satisface la condición
Finalización ¿Encontrado?
(tratar el elemento encontrado
o indicar que no se ha encontrado)
Luis Hernández Yáñez
Finalización
}
if (encontrado) // ...
Con centinela
const int N = 10;
typedef int tArray[N];
int buscado; tArray array;
cout << "Valor a buscar: "; const int centinela = ‐1;
cin >> buscado;
int pos = 0;
bool encontrado = false;
while ((array[pos] != centinela) && !encontrado) {
if (array[pos] == buscado) {
encontrado = true;
}
else {
pos++;
}
}
Luis Hernández Yáñez
if (encontrado) // ...
}
}
if (encontrado) // ...
anual[2].ventas[3][0]
#include <iostream> umbral.cpp
using namespace std;
#include <fstream>
const int N = 100;
typedef double tArray[N];
typedef struct {
tArray elementos;
int contador;
} tLista;
int main() {
tLista lista;
bool ok;
Luis Hernández Yáñez
cargar(lista, ok);
if (!ok) {
cout << "Error: no hay archivo o demasiados datos"
<< endl;
}
Fundamentos de la programación: Recorrido y búsqueda en arrays Página 611
else {
double umbral;
cout << "Valor umbral: "; cin >> umbral;
bool encontrado = false;
int pos = 0;
while ((pos < lista.contador) && !encontrado) {
if (lista.elementos[pos] > umbral) {
encontrado = true;
}
else {
pos++;
}
}
if (encontrado) {
cout << "Valor en pos. " << pos + 1 << " ("
<< lista.elementos[pos] << ")" << endl;
}
else {
Luis Hernández Yáñez
cout << "¡No encontrado!" << endl;
}
}
return 0;
}
Fundamentos de la programación: Recorrido y búsqueda en arrays Página 612
}
archivo.close();
}
ok = abierto && !overflow;
}
Fundamentos de la programación: Recorrido y búsqueda en arrays Página 613
Luis Hernández Yáñez
inversa.cpp
inversa = car + inversa; // Inserta car al principio
pos++;
} // ...
pos++;
}
}
if (encontrado) // ...
vectores.cpp
return suma;
}
i++;
}
return !encontrado;
}
Fundamentos de la programación: Recorrido y búsqueda en arrays Página 620
}
return i ‐ 1;
}
while ((i < N) && !encontrado) {
j = i + 1;
while ((j < N) && !encontrado) {
encontrado = (v[i] == v[j]);
j++;
}
i++;
}
return encontrado;
}
Luis Hernández Yáñez
#include <iostream>
using namespace std;
int main() {
tVector1 v1 = { 'a', 'b', 'c' };
tVector2 v2 = { 'a', 'r', 'e', 't', 'z', 's', 'a', 'h', 'b', 'x' };
bool ok = vectorIncluido(v1, v2);
if (ok) {
cout << "OK: v1 esta incluido en v2" << endl;
}
Luis Hernández Yáñez
else {
cout << "NO: v1 no esta incluido en v2" << endl;
}
return 0;
}
return encontrado;
}
while (encontrado && (i < N ‐ 1)) {
i++;
Luis Hernández Yáñez
encontrado = esta(v1[i], v2);
}
return encontrado;
}
anagramas.cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string cad1, cad2;
bool sonAnagramas = true;
int numCar, posEnCad2;
cout << "Introduce la primera cadena: ";
getline(cin, cad1);
cout << "Introduce la segunda cadena: ";
getline(cin, cad2);
if (cad1.length() != cad2.length()) { // No son anagramas
sonAnagramas = false;
}
Luis Hernández Yáñez
else {
numCar = 0; // Contador de caracteres de la primera cadena
while (sonAnagramas && (numCar < cad1.length())) {
posEnCad2 = buscaCaracter(cad2, cad1.at(numCar));
if (sonAnagramas) {
cout << "Las palabras introducidas son anagramas" << endl;
}
else {
cout << "Las palabras introducidas NO son anagramas" << endl;
}
Luis Hernández Yáñez
return 0;
}
while ((pos < lon) && !encontrado) {
if (cad.at(pos) == c) {
encontrado = true;
}
else {
pos++;
}
}
if (!encontrado) {
pos = ‐1;
}
return pos;
Luis Hernández Yáñez
0 1 2 3 ... 98 99
0 ...
1 ...
2 ...
... ... ... ... ... ... ... ...
Luis Hernández Yáñez
48 ...
49 ...
temp.cpp
int main() {
const int MaxDias = 31;
const int MED = 2; // Nº de medidas
typedef double tTemp[MaxDias][MED]; // Día x mín./máx.
tTemp temp;
double tMaxMedia = 0, tMinMedia = 0,
tMaxAbs = ‐100, tMinAbs = 100;
int dia = 0;
double max, min;
ifstream archivo;
archivo.open("temp.txt");
if (!archivo.is_open()) {
cout << "No se ha podido abrir el archivo!" << endl;
}
Luis Hernández Yáñez
else {
archivo >> min >> max;
// El archivo termina con ‐99 ‐99
...
tMaxAbs = temp[i][1];
}
}
...
return 0;
}
Luis Hernández Yáñez
Para cada valor del primer índice: todos los valores del segundo
Luis Hernández Yáñez
cuads[0][0] 1 0 1 1
1 2 4
cuads[0][1] 1
2 3 9
cuads[1][0] 2
3 4 16
cuads[1][1] 4
4 5 25
cuads[2][0] 3
cuads[2][1] 9 Si hay menos valores que elementos,
cuads[3][0] 4 el resto se inicializan a cero
cuads[3][1] 16 Inicialización a cero de todo el array:
Luis Hernández Yáñez
matriz[0][1][1][1] 11
matriz[0][1][1][2] 12
matriz[0][2][0][0] 0
... 0
const int FILAS = 10;
const int COLUMNAS = 5;
typedef double tMatriz[FILAS][COLUMNAS];
tMatriz matriz;
for (int mes = 0; mes < Meses; mes++) {
for (int dia = 0; dia < diasMes[mes]; dia++) {
cout << "Ventas del día " << dia + 1
Luis Hernández Yáñez
<< " del mes " << mes + 1 << ": ";
cin >> ventas[mes][dia];
}
}
Fundamentos de la programación: Recorrido y búsqueda en arrays Página 642
0 1 2 3 4 ... 28 29 30
0 201 125 234 112 156 ... 234 543 667
1 323 231 675 325 111 ...
2 523 417 327 333 324 ... 444 367 437
3 145 845 654 212 562 ... 354 548
4 327 652 555 222 777 ... 428 999 666
Celdas no
5 854 438 824 547 175 ... 321 356
Meses utilizadas
6 654 543 353 777 437 ... 765 678 555
7 327 541 164 563 327 ... 538 159 235
8 333 327 432 249 777 ... 528 529
Luis Hernández Yáñez
typedef double tMatriz[DIM1][DIM2][DIM3][DIM4];
tMatriz matriz;
Bucles anidados, desde la primera dimensión hasta la última:
for (int n1 = 0; n1 < DIM1; n1++) {
for (int n2 = 0; n2 < DIM2; n2++) {
for (int n3 = 0; n3 < DIM3; n3++) {
for (int n4 = 0; n4 < DIM4; n4++) {
// Procesar matriz[n1][n2][n3][n4]
}
Luis Hernández Yáñez
}
}
}
anual[i].ventas[j][k] double
const int MESES = 12;
typedef tMes tVentaAnual[MESES];
tVentaAnual anual;
double total = 0;
for (int mes = 0; mes < MESES; mes++) {
for (int dia = 0; dia < anual[mes].dias; dia++) {
for (int suc = 0; suc < SUCURSALES; suc++) {
total = total + anual[mes].ventas[dia][suc];
Luis Hernández Yáñez
}
}
}
if (!encontrado) {
mes++;
}
}
if (encontrado) { ...
Fundamentos de la programación: Recorrido y búsqueda en arrays Página 647
Licencia CC (Creative Commons)
Este tipo de licencias ofrecen algunos derechos a terceras personas
bajo ciertas condiciones.
Este documento tiene establecidas las siguientes:
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.
Luis Hernández Yáñez
3. Escribe un programa que lea del teclado una frase y a continuación visualice las
palabras de la frase en columna, seguida cada una del número de letras que la
componen.
Fundamentos de la programación Ejercicios del Tema 6 — Pág. 1
4. Implementa un programa que permita realizar operaciones sobre matrices de
NN. El programa debe permitir al usuario la selección de alguna de las
siguientes operaciones:
a) Sumar 2 matrices.
b) Restar 2 matrices.
c) Multiplicar 2 matrices.
d) Trasponer una matriz.
e) Mostrar una matriz señalando cuáles son los puntos de silla (los puntos de
silla de una matriz son aquellos elementos de la misma que cumplen ser el
mínimo de su fila y el máximo de su columna).
Habrá también dos subprogramas para leer del teclado o mostrar en la pantalla
una matriz.
6. Una pantalla de texto del PC tiene 25 filas, de 80 columnas cada una de ellas. En
cada posición de pantalla se guarda el carácter representado en dicha posición,
el color con que se escribe el carácter, el color de fondo donde se visualiza el
carácter y si el carácter parpadea o no. Diseña las estructuras de datos
necesarias considerando que los colores posibles son: negro, azul, verde,
amarillo y rojo.
Construye un subprograma que, dada una fila, devuelva el color de fondo más
utilizado en esa fila. Y otro que determine en qué fila y columna se encuentra el
primer carácter parpadeante.
Fundamentos de la programación Ejercicios del Tema 6 — Pág. 2
7. Como parte de un programa de gestión contable, se necesita una estructura de
datos capaz de almacenar los gastos en distintos conceptos producidos cada mes
por cada uno de los departamentos. Define tal estructura de datos teniendo en
cuenta que los departamentos y los tipos de gastos contemplados son los
siguientes:
Departamentos: Marketing, Contabilidad, Recursos_Humanos, Distribución,
Ingeniería, Investigación.
Conceptos: Salarios, Suministros, Mobiliario, Equipamiento, Otros.
Define subprogramas que, partiendo de una matriz de gastos completa, realicen
las siguientes tareas:
a) Escribir en la pantalla la suma de gastos de cada uno de los departamentos.
b) Escribir en la pantalla la suma de gastos por cada concepto.
c) Calcular y devolver el total de gastos de un año.
d) Construir y devolver un array con los gastos generados cada mes.
e) Encontrar el valor más alto de la tabla de gastos y devolver el departamento
responsable, el tipo de gasto y el mes en que se produjo.
Fundamentos de la programación Ejercicios del Tema 6 — Pág. 3
9. Se quiere desarrollar un subprograma que dadas dos matrices cuadradas de
enteros, M de 10 x 10 y P de 3 x 3, compruebe si entre todas las submatrices de 3
x 3 que se pueden formar en la matriz M, desplazándose por filas o columnas,
existe al menos una que coincida con la matriz P. En ese caso, se indicarán la fila
y la columna de la matriz M en la que empieza la submatriz que coincide. Si hay
varias, bastará con indicar la primera.
10. El pirata Pata de Palo desea conseguir el Gran Tesoro sin morir ahogado. La Isla,
que consiste en un tablero cuadrado de N x N, rodeado de agua y con dos
puentes en dos esquinas, se puede representar así:
13. El juego de las 4 en línea consta de un tablero formado por siete columnas y seis
filas. En una partida participan dos jugadores, uno con fichas blancas y otro
rojas. Inicialmente todas las posiciones del tablero están libres. Cada jugador
coloca alternativamente una ficha en una columna. La ficha colocada cae por su
propio peso hasta el fondo de la columna correspondiente (primera fila de la
columna libre); por ejemplo, en la figura si el jugador Rojo coloca una ficha en la
columna 2, la ficha se coloca en la fila 3. La partida la gana el jugador que
coloque en primer lugar cuatro de sus fichas en línea horizontal, vertical o en
diagonal. La partida queda en tablas si ninguno de los jugadores es capaz de
alinear cuatro fichas después de llenar el tablero.
6 L L L L L L L
5 L L L L L L L
4 L L L L L L
3 L L L L
2 L L
1 L
1 2 3 4 5 6 7
Fundamentos de la programación Ejercicios del Tema 6 — Pág. 5