AR/main.cpp

147 lines
3.9 KiB
C++

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