generated from aigora/starter-code
-
Notifications
You must be signed in to change notification settings - Fork 0
Home
ceciliabp edited this page May 26, 2023
·
42 revisions
- Nuestro trabajo consiste un programa informático programado en C que contiene diferentes funciones que permiten al usuario elegir las operaciones que quiere realizar a partir de los datos de un fichero en formato excel.
- Originalmente, el programa consistiría en mostrar por pantalla los datos del fichero según el año, el mes y el tipo de energía elegido y, a partir de estos, realizar operaciones matemáticos y estadísticos mediante funciones. Sin embargo, finalmente nos decantamos por simplemente mostrar las energías de forma anual y realizar operaciones más generales.
- Para facilitarnos el trabajo, decidimos crear cinco funciones que permitieran realizar operaciones en base a los datos del documento. Como resultado, obtuvimos cuatro funciones normales y una función general.
- Las funciones normales aparecen en pantalla después de haber mostrado los datos de un año y habiendo elegido la fuente de energía de la que se quiere realizar los cálculos.
- Estas funciones emplean tres números enteros:
-
numfuente
: valor que hace referencia a las líneas del fichero donde se encuentran los datos que necesitamos. El usuario debe escoger un número del 1 al 16 dependiendo del tipo de energía del que quiere ver las operaciones. -
energia vector_fuente[]
: vector donde se almacenan los datos del tipo de energía. -
x
: número del 0 al 2. Según el número introducido, se harán los cálculos de cierto año o de los dos años a la vez.
-
- Las funciones normales son:
-
Máximo: permite calcular el máximo de gigavatios por hora de una fuente de energía. Por ejemplo, si el usuario decide que quiere ver el máximo de 2021, primero debe teclear el número correspondiente a la fuente de la que quiere calcular el máximo. El bucle
for
recorre los datos referentes de la fuente seleccionada de ese mismo año y elif
determina el valor máximo de esa fuente. La función devuelve el valormax
, el cual es de tipofloat
.
-
Máximo: permite calcular el máximo de gigavatios por hora de una fuente de energía. Por ejemplo, si el usuario decide que quiere ver el máximo de 2021, primero debe teclear el número correspondiente a la fuente de la que quiere calcular el máximo. El bucle
float maximo(int numfuente, energia vector_fuente[], int x)
{
int i;
float max=0; //declara un valor como 0 para determinar el máximo
if(x==1) //Máximo para 2021
{
for(i=0; i<12; i++)
{
if(vector_fuente[numfuente].gwh[i] > max)
{
max = vector_fuente[numfuente].gwh[i];
//si max es menor que vector_fuente, max queda declarado como el valor de vector_fuente
}
//recorre los 12 meses buscando el valor máximo
}
}
return max; //devuelve el valor max
}
- **Mínimo**: calcula el mínimo de gigavatios por hora de un tipo de energía obtenido. Por ejemplo, si el usuario decide que quiere que se muestre por pantalla el mínimo de 2022, primero debe introducir el valor correspondiente al tipo de energía del que quiere calcular el mínimo. El bucle ``for`` recorre los datos mensuales de 2022, y el ``if`` determina el valor mínimo de esa fuente. Finalmente, la función devuelve el valor ``min``.
float minimo(int numfuente, energia vector_fuente[], int x)
{
int i;
float min=vector_fuente[numfuente].gwh[0]; //declara como mínimo el primer vector
if(x==2) //mínimo para 2022
{
for(i=12; i<24; i++)
{
//recorre 2022 para encontrar el vector más pequeño
if(vector_fuente[numfuente].gwh[i] < min)
{
min = vector_fuente[numfuente].gwh[i];
//si un vector_fuente es más pequeño que min, este vector queda declarado como min
}
}
}
return min; //devuelve el valor min
}
- **Media**: determina la media de gigavatios/hora.
- **Total**: calcula el total de gigavatios/hora producidos.
- Además, las funciones normales pueden convertirse en funciones globales si el usuario ha elegido mostrar los dos años (_se explicará más adelante_).
- La función global "**Total global**" aparece después de haberse mostrado los datos de los dos años. Esta función realiza la suma de todas las fuentes de energía de un determinado año.
El documento utilizado en el proyecto es un archivo .csv (Comma Separated Values) en el cual se recogen los datos de la producción de energía de España en gigavatios por hora entre los años 2021 y 2022. (imagen del fichero en excel)
- En primer lugar, como las primeras líneas no son importantes para el trabajo, implementamos un bucle
while
que cuente el número de líneas en el que hay que empezar a escanear:
char c; //declaramos una variable char para contar los saltos de línea
int nlineas = 0; //iniciamos el contador en 0
while(fscanf(plectura, "%c", &c) != EOF)
{
if(c == '\n')
{
nlineas++;
//cada vez que encuentra un \n suma 1 al número de líneas
}
if(nlineas==5)
{
break;
//para al final de la linea 5 para empezar a escanear en la 6
}
}
-Tras hallar la línea en la que se debe empezar a escanear, usamos un bucle for
donde usar fscanf
. Este bucle empieza en la sexta línea del fichero y recorre 17 filas del fichero, guardando los datos numéricos en vectores:
int i=0; //contador para el bucle for
int nfuentes = 16; //líneas con los datos con los que se va a trabajar
energia fuente[40]; //vector donde guardar los valores de las energías
for(i; i<=nfuentes; i++)
{
fscanf(plectura, "%[^,]s", fuente[i].nombre); //fscanf del tipo de energía
fscanf(plectura, "%c", &c); //fscanf para la coma que separa la fuente y los datos
fscanf(plectura, "%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f",
&fuente[i].gwh[0], &fuente[i].gwh[1], &fuente[i].gwh[2], &fuente[i].gwh[3], &fuente[i].gwh[4], &fuente[i].gwh[5], &fuente[i].gwh[6], &fuente[i].gwh[7], &fuente[i].gwh[8],
&fuente[i].gwh[9], &fuente[i].gwh[10], &fuente[i].gwh[11], &fuente[i].gwh[12], &fuente[i].gwh[13], &fuente[i].gwh[14], &fuente[i].gwh[15], &fuente[i].gwh[16], &fuente[i].gwh[17], &fuente[i].gwh[18],
&fuente[i].gwh[19], &fuente[i].gwh[20], &fuente[i].gwh[21], &fuente[i].gwh[22], &fuente[i].gwh[23]);
}