Actualizados comentarios.

This commit is contained in:
Fernando Méndez 2023-12-12 14:47:50 +01:00
parent b26a0fecfd
commit a9a178c7b3

292
main.cpp
View File

@ -1,146 +1,146 @@
#include <iostream> #include <iostream>
#include <string> #include <string>
#include <fstream> #include <fstream>
#include <cmath> #include <cmath>
#include <iomanip> #include <iomanip>
using namespace std; using namespace std;
/* /*
AR - Ejercicio de análisis RTO AR - Ejercicio de análisis RTO
Fernando Méndez Torrubiano (https://fernmend.ddns.net) Fernando Méndez Torrubiano (https://fermdez.net)
*/ */
//Constantes: //Constantes:
const int nDatos = 200; const int nDatos = 200;
const int nSeries = 5; const int nSeries = 5;
//Tipos: //Tipos:
typedef struct { typedef struct {
double double
M, //Muestra. M, //Muestra.
RTTs, //RTTs. RTTs, //RTTs.
D, //Desviación. D, //Desviación.
RTO_Jacobson, //RTO de Jacobson. RTO_Jacobson, //RTO de Jacobson.
RTO_Jacobson_Karels; //RTO de Jacobson/Karels. RTO_Jacobson_Karels; //RTO de Jacobson/Karels.
} tDatos; } tDatos;
typedef tDatos tListaDatos[nDatos]; typedef tDatos tListaDatos[nDatos];
struct Comma final : std::numpunct<char>{ //Cambia los '.' de los double por ','. struct Comma final : std::numpunct<char>{ //Cambia los '.' de los double por ','.
char do_decimal_point() const override { return ','; } char do_decimal_point() const override { return ','; }
}; };
//Funciones: //Funciones:
void inicializa(tListaDatos&); //Inicializa el array de datos. void inicializa(tListaDatos&); //Inicializa el array de datos.
bool cargar(tListaDatos&, string&); //Carga los archivos de las series. bool cargar(tListaDatos&, string&); //Carga los archivos de las series.
void calcular(tListaDatos&, string&); //Calcula los resultados de los algoritmos de Jacobson y Jacobson/Karels. void calcular(tListaDatos&, string&); //Calcula los resultados de los algoritmos de Jacobson y Jacobson/Karels.
void guardar(tListaDatos&, string&); //Guarda los resultados de los algoritmos de Jacobson y Jacobson/Karels. void guardar(tListaDatos&, string&); //Guarda los resultados de los algoritmos de Jacobson y Jacobson/Karels.
int main() { int main() {
system("chcp 1252"); //Castellano. system("chcp 1252"); //Castellano.
system("cls"); system("cls");
tListaDatos _datos; tListaDatos _datos;
string serie = "../Series/serie", salida = "../Resultados/output"; //Nombres de los archivos. string serie = "../Series/serie", salida = "../Resultados/output"; //Nombres de los archivos.
for (int i = 1; i <= nSeries+1; i++){ for (int i = 1; i <= nSeries+1; i++){
serie += to_string(i) + ".dat"; serie += to_string(i) + ".dat";
if (cargar(_datos, serie)) { if (cargar(_datos, serie)) {
salida += to_string(i) + ".dat"; salida += to_string(i) + ".dat";
calcular(_datos, salida); calcular(_datos, salida);
cout << "Serie " << i << " calculada correctamente." << endl; cout << "Serie " << i << " calculada correctamente." << endl;
} }
else { else {
cout << "Error al cargar uno o m<>s archivos de datos." << endl; cout << "Error al cargar uno o m<>s archivos de datos." << endl;
} }
serie = "../Series/serie"; serie = "../Series/serie";
salida = "../Resultados/output"; salida = "../Resultados/output";
} }
//system("PAUSE"); //system("PAUSE");
return 0; return 0;
} }
void inicializa(tListaDatos& _datos) { void inicializa(tListaDatos& _datos) {
for (int i = 0; i < nDatos; i++){ for (int i = 0; i < nDatos; i++){
_datos[i].M = 0; _datos[i].M = 0;
_datos[i].D = 0; _datos[i].D = 0;
_datos[i].RTTs = 0; _datos[i].RTTs = 0;
_datos[i].RTO_Jacobson = 0; _datos[i].RTO_Jacobson = 0;
_datos[i].RTO_Jacobson_Karels = 0; _datos[i].RTO_Jacobson_Karels = 0;
} }
} }
bool cargar(tListaDatos& _datos, string& serie) { bool cargar(tListaDatos& _datos, string& serie) {
bool carga = false; bool carga = false;
ifstream archivo; ifstream archivo;
inicializa(_datos); inicializa(_datos);
archivo.open(serie); archivo.open(serie);
if (!archivo.is_open()) { if (!archivo.is_open()) {
cout << "Error al cargar el archivo: " << serie << endl; cout << "Error al cargar el archivo: " << serie << endl;
carga = false; carga = false;
} }
else { else {
int i = 0; int i = 0;
while (!archivo.eof() && i < nDatos) { while (!archivo.eof() && i < nDatos) {
archivo >> _datos[i].M; archivo >> _datos[i].M;
i++; i++;
} }
carga = true; carga = true;
} }
archivo.close(); archivo.close();
return carga; return carga;
} }
void calcular(tListaDatos& _datos, string& fichero) { void calcular(tListaDatos& _datos, string& fichero) {
double alpha = 0.125; // 1/8 double alpha = 0.125; // 1/8
double beta = 0.25; // 1/4 double beta = 0.25; // 1/4
double gamma = 2; double gamma = 2;
// Caso Base: // Caso Base:
_datos[0].RTTs = _datos[0].M; //Calculamos RTTs de 0. _datos[0].RTTs = _datos[0].M; //Calculamos RTTs de 0.
_datos[0].D = _datos[0].M / 2; //Calculamos la desviación de 0. _datos[0].D = _datos[0].M / 2; //Calculamos la desviación de 0.
_datos[0].RTO_Jacobson = gamma * _datos[0].RTTs; //Calculamos RTO de Jacobson de 0. _datos[0].RTO_Jacobson = gamma * _datos[0].RTTs; //Calculamos RTO de Jacobson de 0.
_datos[0].RTO_Jacobson_Karels = _datos[0].RTTs + (4 * _datos[0].D); //Calculamos RTO de Jacobson/Karels de 0. _datos[0].RTO_Jacobson_Karels = _datos[0].RTTs + (4 * _datos[0].D); //Calculamos RTO de Jacobson/Karels de 0.
// Resto de casos: // Resto de casos:
for (int i = 1; i < nDatos; i++) { for (int i = 1; i < nDatos; i++) {
_datos[i].RTTs = (((1 - alpha) * _datos[i - 1].RTTs) + (alpha * _datos[i].M)); //Calculamos RTTs de i. _datos[i].RTTs = (((1 - alpha) * _datos[i - 1].RTTs) + (alpha * _datos[i].M)); //Calculamos RTTs de i.
_datos[i].RTO_Jacobson = gamma * _datos[i].RTTs; //Calculamos RTO de Jacobson de i. _datos[i].RTO_Jacobson = gamma * _datos[i].RTTs; //Calculamos RTO de Jacobson de i.
_datos[i].D = (((1 - beta) * _datos[i - 1].D) + (beta * abs(_datos[i - 1].RTTs - _datos[i].M))); //Calculamos la Desviación de i. _datos[i].D = (((1 - beta) * _datos[i - 1].D) + (beta * abs(_datos[i - 1].RTTs - _datos[i].M))); //Calculamos la Desviación de i.
_datos[i].RTO_Jacobson_Karels = (_datos[i].RTTs + (4 * _datos[i].D)); //Calculamos RTO de Jacobson/Karels de i. _datos[i].RTO_Jacobson_Karels = (_datos[i].RTTs + (4 * _datos[i].D)); //Calculamos RTO de Jacobson/Karels de i.
} }
guardar(_datos, fichero); guardar(_datos, fichero);
} }
void guardar(tListaDatos& _datos, string& fichero) { void guardar(tListaDatos& _datos, string& fichero) {
ofstream archivo; ofstream archivo;
archivo.open(fichero); archivo.open(fichero);
if (!archivo.is_open()) { if (!archivo.is_open()) {
cout << "Error al guardar el fichero." << fichero << endl; cout << "Error al guardar el fichero." << fichero << endl;
} }
else { else {
archivo.imbue(std::locale(std::locale::classic(), new Comma)); archivo.imbue(std::locale(std::locale::classic(), new Comma));
archivo << left archivo << left
<< setw(20) << "RTO(Jacobson)" << setw(20) << "RTO(Jacobson)"
<< setw(25) << "RTO(Jacobson/Karels)" << setw(25) << "RTO(Jacobson/Karels)"
<< setw(15) << "RTTs" << setw(15) << "RTTs"
<< setw(15) << "Desviación" << setw(15) << "Desviación"
<< setw(0) << " M" << endl; << setw(0) << " M" << endl;
for (int i = 0; i < nDatos; i++) { for (int i = 0; i < nDatos; i++) {
archivo << left << setprecision(5) archivo << left << setprecision(5)
<< setw(20) << _datos[i].RTO_Jacobson << setw(20) << _datos[i].RTO_Jacobson
<< setw(25) << _datos[i].RTO_Jacobson_Karels << setw(25) << _datos[i].RTO_Jacobson_Karels
<< setw(15) << _datos[i].RTTs << setw(15) << _datos[i].RTTs
<< setw(15) << _datos[i].D << setw(15) << _datos[i].D
<< setw(0) << _datos[i].M << endl; << setw(0) << _datos[i].M << endl;
} }
} }
archivo.close(); archivo.close();
} }