Título: No me imprime una función en codeblock (será un bug) Publicado por: seinto en 22 Noviembre 2015, 16:35 pm 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 año; 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].año, &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].año, 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].año, 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].año, 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].año, 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].año, 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].año, 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].año, 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].año, 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); } Título: Re: No me imprime una función en codeblock (será un bug) Publicado por: 0xFer en 22 Noviembre 2015, 17:57 pm Las funciones tempe_al y tempe_ba sólo imprimen las primeras 5 temperaturas almacenadas en ArrayDeDatosMain
Tienes esto en esas funciones: Código
pero no hace nada( observa que a e le cambias el valor pero después lo igualas a 0 antes de utilizar su valor anterior, la variable j núnca la utilizas en esa función). tienes que ir probando todas las temperaturas del arreglo; Código
|