-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.cpp
208 lines (161 loc) · 5.68 KB
/
main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
/*
* Programación de estructuras de datos y algoritmos fundamentales
* Actividad 1.3 - Actividad integral de conceptos básicos y algoritmos fundamentales
*
* Equipo 13
*
* Fernando Doddoli Lankenau - A00827038
* Mauricio Eugenio Zambrano Díaz - A00827055
* Cristóbal Alberto Escamilla Sada - A00827074
*
* 11 de septiembre del 2020
*/
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
#include "Registro.h"
// Cargar los registros de el archivo .txt a un vector de Registros con sus respectivos atributos
// Complejidad: O(n)
void cargaRegistros(vector<Registro*> &v){
string mes;
int dia;
string hora;
string direccionIP;
string razon;
ifstream archivo("bitacora.txt");
while(archivo >> mes >> dia >> hora >> direccionIP){
getline(archivo, razon);
v.push_back(new Registro(mes, dia, hora, direccionIP, razon));
}
archivo.close();
}
// Crea una clave para ponerle un valor numérico a la fecha para facilitar las comparaciones
// Complejidad: O(1)
int claveOrden(string mes, int dia){
if(mes == "Jun")
return 600 + dia;
if(mes == "Jul")
return 700 + dia;
if(mes == "Aug")
return 800 + dia;
if(mes == "Sep")
return 900 + dia;
if(mes == "Oct")
return 1000 + dia;
return -1;
}
// Ordena y une los datos proporcionados en un vector
// Llamada a través de la función ordenaMerge
// Complejidad: O(n)
void unir(vector<Registro*> &v, vector<Registro*> &paso, int ini, int fin){
int mit = (ini + fin) / 2;
int i = ini, j = mit+1, k = ini;
while(i <= mit && j <= fin)
if(*v[i] <= *v[j])
paso[k++] = v[i++];
else
paso[k++] = v[j++];
while(i <= mit)
paso[k++] = v[i++];
while(j <= fin)
paso[k++] = v[j++];
for(int z = ini; z <= fin; z++)
v[z] = paso[z];
}
// Ordena los datos proporcionados por el usuario a través del método merge
// Opera de manera recursiva
// Complejidad: O(nlog n)
void ordenaMerge(vector<Registro*> &v, vector<Registro*> &paso, int ini, int fin){
int mit;
if(ini < fin){
mit = (ini + fin) / 2;
ordenaMerge(v, paso, ini, mit);
ordenaMerge(v, paso, mit+1, fin);
unir(v, paso, ini, fin);
}
}
// Función que busca una fecha usando su clave
// Complejidad:(log n)
int busquedaBinaria(vector<Registro*> v, int dato, bool inicio){
int tam = v.size(), ini = 0, fin = tam - 1, mit;
while (ini <= fin){
mit = (ini + fin) / 2;
if (*v[mit] == dato){
if(inicio){
if(mit == 0 || *v[mit-1] != dato)
return mit;
fin = mit - 1;
} else{
if(mit == tam-1 || *v[mit+1] != dato)
return mit;
ini = mit + 1;
}
} else if(*v[mit] > dato)
fin = mit - 1;
else
ini = mit + 1;
}
return -1;
}
// Descripción: Función que busca las fechas en un rango correspondiente y despliegue los registros correspondientes a esas fechas
// Complejidad: O(n)
void busqueda(vector<Registro*> v, string mesI, string mesF, int diaI, int diaF){
int ini = claveOrden(mesI, diaI), posInicial;
int fin = claveOrden(mesF, diaF), posFinal;
posInicial = busquedaBinaria(v, ini, true);
posFinal = busquedaBinaria(v, fin, false);
cout << endl;
if(posInicial == -1)
cout << "La fecha " << mesI << ' ' << diaI << " no existe en el registro." << endl;
else if(posFinal == -1)
cout << "La fecha " << mesF << ' ' << diaF << " no existe en el registro." << endl;
else
for(int i = posInicial; i<=posFinal; i++)
cout << *v[i] << endl;
}
// Descripción: Función que guarda los registros ordenados en un archivo nuevo
// Complejidad: O(n)
void exportarRegistros(vector<Registro*> v, string nombreArchivo){
ofstream archivo(nombreArchivo);
int tam = v.size();
for(int i = 0; i < tam-1; i++)
archivo << *v[i] << endl;
archivo << *v[tam-1];
archivo.close();
}
int main(){
vector<Registro*> vecRegistros;
cargaRegistros(vecRegistros);
int tam = vecRegistros.size();
vector<Registro*> paso(tam);
// Ordena los datos antes de desplegar menú
ordenaMerge(vecRegistros, paso, 0, tam-1);
int diaI, diaF;
string mesI, mesF, nombreArchivo;
char opcion;
do{
cout << endl << "Bienvenid@ a la Bitacora de Errores! Seleccione la acción que desea ejectuar:" << endl;
cout << "1) Buscar un rango de datos basado en fechas" << endl;
cout << "2) Transpasar datos ordenados a nuevo archivo" << endl;
cout << "0) Salir" << endl;
cin >> opcion;
switch(opcion){
case '1': // Buscar un rango de datos basado en fechas
cout << endl << "Fecha inicial (ej. Aug 10, recuerde de teclear la primera letra del mes como mayúscula): ";
cin >> mesI >> diaI;
cout << "Fecha Final: ";
cin >> mesF >> diaF;
busqueda(vecRegistros, mesI, mesF, diaI, diaF);
break;
case '2': // Transpasar datos ordenados a nuevo archivo
cout << endl << "Tecléa el nombre del archivo en el que deseas almacenar los registros ordenados (Recuerde de agregar el sufijo \'.txt\'): ";
cin >> nombreArchivo;
exportarRegistros(vecRegistros, nombreArchivo);
break;
}
} while( opcion != '0');
cout << endl << "¡Hasta la próxima!" << endl << endl;
return 0;
}