La función que no me imprime es las cinco temperaturas más bajas
El programa es este:
/*
En una fábrica de piezas fundidas en bronce, el metal líquido debe
mantenerse siempre entre 950ºC y 1000ºC. Para lograr esto se toma
la temperatura cada 10 minutos y como resultado de la lectura se
encienden quemadores cuando la temperatura baja de 960ºC y se apagan
al alcanzar los 990ºC.
Los datos de temperatura quedan almacenados en un archivo cuyo nombre
es la fecha con el formato "yyyymmdd.txt", (hay un ejemplo subido a
Pizarrón) conteniendo la totalidad de los datos tomados cada día (6
muestras por hora x 24 horas = 144 registros de temperatura). Cada
registro de temperatura tiene la el año, mes, día, hora y minuto de
la toma de muestra, el valor de la temperatura medida con una precisión
de un decimal, el resultado de la medición ("ok" -"no ok") y finalmente
el estado del quemador ("encendido" o "apagado"). Todos los datos están
separados por comas. Ejemplos de registros:
2015,10,1,0,10,960.1,ok,apagado
2015,10,1,0,20,959.7,no ok,encendido
Se solicita que mediante un menú que llame a funciones diferentes, se pueda calcular:
a. Temperatura promedio
b. Cuantas veces se encendió el quemador
c. Cuantas veces la temperatura excedió los 1000°C
d. Cuantas veces la temperatura cayó por debajo de los 950°C
e. Guardar los datos calculados en un archivo llamado "resumen yyyymmdd.txt"
Condiciones:
o Generar una estructura capaz de almacenar todos los datos de cada registro
o Cargar todos los datos del archivo en un array.
o La variable de tipo array no puede ser global, es decir que debe pasarse
como parámetro a todas las funciones que la necesiten.
*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define LecturasPorDia 144 // pongo 144 por ser 6 lecturas por hora durante 24 horas
struct sDatos {
int anio;
int mes;
int dia;
int hora;
int minuto;
float temperatura;
char resultado[3];
char estado[6];
} ;
// la siguiente función permite leer los datos de un archivo
void leearchivo ( char NombreArchivo[], sDatos ArrayDeDatos[] ) {
FILE *arch;
int e;
if ((arch = fopen( NombreArchivo, "r" ))==NULL) {
printf("Error al abrir archivo\n");
getch();
exit(1);
}
for (e=0; e<LecturasPorDia; e++){
// en la siguiente lectura, ver el uso de "&" en algunas
// variables y no en otras ("int" y "float" versus "arrays")
fscanf( arch, "%i,%i,%i,%i,%i,%f,%2s,%s",
&ArrayDeDatos[e].anio,
&ArrayDeDatos[e].mes,
&ArrayDeDatos[e].dia,
&ArrayDeDatos[e].hora,
&ArrayDeDatos[e].minuto,
&ArrayDeDatos[e].temperatura,
ArrayDeDatos[e].resultado,
ArrayDeDatos[e].estado
);
/*
// esta rutina sive para verificar que los datos
// de la lectura se haya hecho correctamente
printf( "%3i - %02i/%i/%i-%02i:%02i (%6.1f) %s %s\n",
e,
ArrayDeDatos[e].dia,
ArrayDeDatos[e].mes,
ArrayDeDatos[e].anio,
ArrayDeDatos[e].hora,
ArrayDeDatos[e].minuto,
ArrayDeDatos[e].temperatura,
ArrayDeDatos[e].resultado,
ArrayDeDatos[e].estado
);
getch();
*/
}
if ( fclose(arch) != 0 ) {
printf("Error al cerrar el archivo\n");
getch();
exit(1);
}
}
// la siguiente función permite clacular el valor promedio de las temperaturas por día
float promedio ( sDatos ArrayDeDatosProm[] ) {
int e;
float Prom=0;
for (e=0; e<LecturasPorDia; e++){
Prom += ArrayDeDatosProm[e].temperatura;
}
Prom /= LecturasPorDia;
return Prom;
}
// la siguiente función permite clacular la cantidad de encendidos del quemador por día
int encendidos ( sDatos ArrayDeDatosEnc[] ) {
int e, Enc=0;
for (e=0; e<LecturasPorDia; e++){
if (strcmp(ArrayDeDatosEnc[e].estado , "encend.") == 0) {
Enc++;
}
}
return Enc;
}
// la siguiente función permite clacular la cantidad de picos de temperatura altos por día
int picoalto ( sDatos ArrayDeDatosPA[] ) {
int e, PA=0;
for (e=0; e<LecturasPorDia; e++){
if (ArrayDeDatosPA[e].temperatura > 1000) {
PA++;
}
}
return PA;
}
// la siguiente función permite clacular la cantidad de picos de temperatura bajos por día
int picobajo ( sDatos ArrayDeDatosPB[] ) {
int e, PB=0;
for (e=0; e<LecturasPorDia; e++){
if (ArrayDeDatosPB[e].temperatura < 950) {
PB++;
}
}
return PB;
}
float tempe_al (sDatos ArrayDeDatosta[]){
int e,j;
float aux;
for(e=0;e<LecturasPorDia;e++){
for(j=1;j<=LecturasPorDia;j++){
if (j>e){
aux = e;
e=j;
j=e;
}
}
}
printf("Las cinco temperaturas m\240s altas son: \n\n" );
for (e=0;e<5;e++)
printf("%f\n", ArrayDeDatosta[e].temperatura);
getch();
}
float tempe_ba (sDatos ArrayDeDatostb[]){
int e,j;
float aux;
for(e=0;e<LecturasPorDia;e++){
for(j=1;j<=LecturasPorDia;j++){
if (j<e){
aux = e;
e=j;
j=e;
}
}
}
for (e=0;e<5;e++){
printf("Las cinco temperaturas más bajas son %f:", ArrayDeDatostb[e].temperatura);
getch();
}
}
// la siguiente función permite guardar el resumen de los
// datos en un archivo diferente al de los datos originales
int guardarresumen (float pr, float ta, float tb, int en, int pa, int pb) {
FILE *arch2;
int e;
if ((arch2 = fopen( "resumen 20151001.txt", "a" ))==NULL) {
printf("Error al abrir archivo\n");
getch();
exit(1);
}
fprintf( arch2, "La temeratura promedio es: %6.1f C\n", pr);
fprintf( arch2, "La cantidad de encendidos es: %6i\n", en);
fprintf( arch2, "La cantidad de picos altos es: %6i\n", pa);
fprintf( arch2, "La cantidad de picos bajos es: %6i\n", pb);
fprintf( arch2, "La cinco temperaturas más altas son: %f\n", ta);
fprintf( arch2, "Las cinco temperaturas más bajas son: %f\n", tb);
if ( fclose( arch2 ) != 0 ) {
printf("Error al cerrar el archivo\n");
getch();
exit(1);
}
}
int menu(void) {
int opcion1;
do {
system("cls");
printf("Las opciones son:\n\n");
printf(" 1. Calcular la temperatura promedio\n");
printf(" 2. Determinar cuantas veces se encendi""\xA2"" el quemador\n");
printf(" 3. Determinar cuantas veces la temperatura excedi""\xA2"" los 1000""\xA7""C\n");
printf(" 4. Determinar cuantas veces la temperatura cay""\xA2"" por debajo de los 950""\xA7""C\n");
printf(" 5. Mostrar las cinco temperaturas m\240s altas\n");
printf(" 6. Mostrar las cinco temperaturas m\240s bajas\n\n");
printf(" 7. Guardar los datos calculados en un archivo\n\n");
printf(" 0. Para salir del programa\n\n");
printf("Ingrese su opci""\xA2""n:\n");
scanf("%i",&opcion1);
} while ( (opcion1 < 0) || (opcion1 > 7) );
return opcion1;
}
int main() {
int opcion, e, ence, picoal, picoba;
float prome, tempeal, tempeba;
sDatos ArrayDeDatosMain[LecturasPorDia];
/*
// la siguiente llamada se puede optimizar
// pidiendo al usuario "¿que día necesita procesar?"
char fecha[8];
printf("ingrese d""\xA1""a mes y a""\xA4""o a procesar (formato aaaammdd, por ejemplo 20151001)");
scanf("%s",fecha);
strcat(fecha,".txt");
leearchivo (fecha, ArrayDeDatosMain);
*/
leearchivo ("20151001.txt", ArrayDeDatosMain);
/*
// esta rutina sive para verificar que los datos de la
// función de lectura hayan sido devueltos correctamente
for (e=0; e<LecturasPorDia; e++){
printf( "%3i - %02i/%i/%i-%02i:%02i (%6.1f) %s %s\n",
e,
ArrayDeDatosMain[e].dia,
ArrayDeDatosMain[e].mes,
ArrayDeDatosMain[e].anio,
ArrayDeDatosMain[e].hora,
ArrayDeDatosMain[e].minuto,
ArrayDeDatosMain[e].temperatura,
ArrayDeDatosMain[e].resultado,
ArrayDeDatosMain[e].estado
);
}
getch();
*/
do {
opcion = menu();
system ("cls");
switch (opcion) {
case 0:
return 0;
case 1:
// Calcular la temperatura promedio
prome = promedio (ArrayDeDatosMain);
printf ("\n\n **** Promedio de temperaturas para el d""\xA1""a %02i/%02i/%4i: %6.1f ****\n\n",
ArrayDeDatosMain[1].dia,
ArrayDeDatosMain[1].mes,
ArrayDeDatosMain[1].anio,
prome
);
break;
case 2:
// Determinar cuantas veces se encendió el quemador
ence = encendidos (ArrayDeDatosMain);
printf ("\n\n **** Cantidad de encendidos del d""\xA1""a %02i/%02i/%4i: %i ****\n\n",
ArrayDeDatosMain[1].dia,
ArrayDeDatosMain[1].mes,
ArrayDeDatosMain[1].anio,
ence
);
break;
case 3:
// Determinar cuantas veces la temperatura excedió los 1000C
picoal = picoalto (ArrayDeDatosMain);
printf ("\n\n **** Cantidad de picos altos del d""\xA1""a %02i/%02i/%4i: %i ****\n\n",
ArrayDeDatosMain[1].dia,
ArrayDeDatosMain[1].mes,
ArrayDeDatosMain[1].anio,
picoal
);
break;
case 4:
// Determinar cuantas veces la temperatura cayó por debajo de los 950C
picoba = picobajo (ArrayDeDatosMain);
printf ("\n\n **** Cantidad de picos altos del d""\xA1""a %02i/%02i/%4i: %i ****\n\n",
ArrayDeDatosMain[1].dia,
ArrayDeDatosMain[1].mes,
ArrayDeDatosMain[1].anio,
picoba
);
break;
case 5:
//mostrar las cinco temperaturas más altas
tempe_al (ArrayDeDatosMain);
printf ("\n\n **** Las cinco temperaturas m\240s altas del d""\xA1""a %02i/%02i/%4i: %6.1f ****\n\n",
ArrayDeDatosMain[1].dia,
ArrayDeDatosMain[1].mes,
ArrayDeDatosMain[1].anio,
tempeal
);
break;
//mostrar las cinco temperaturas más bajas
case 6:
tempe_ba (ArrayDeDatosMain);
printf ("\n\n **** Las cinco temperaturas m\240s bajas del d""\xA1""a %02i/%02i/%4i: %6.1f ****\n\n",
ArrayDeDatosMain[1].dia,
ArrayDeDatosMain[1].mes,
ArrayDeDatosMain[1].anio,
tempeba
);
break;
case 7:
// Guardar los datos calculados en un archivo
guardarresumen (prome, ence, picoal, picoba, tempeal, tempeba);
break;
} // fin del switch
printf ("\n\n <<< Pulse una tecla para continuar >>>\n\n");
getch();
system ("cls");
} while (opcion != 0);
}