elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  No me imprime una función en codeblock (será un bug)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: No me imprime una función en codeblock (será un bug)  (Leído 1,511 veces)
seinto

Desconectado Desconectado

Mensajes: 1


Ver Perfil
No me imprime una función en codeblock (será un bug)
« 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);
}



En línea

0xFer


Desconectado Desconectado

Mensajes: 400



Ver Perfil
Re: No me imprime una función en codeblock (será un bug)
« Respuesta #1 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
  1. for(e=0;e<LecturasPorDia;e++){
  2.           for(j=1;j<=LecturasPorDia;j++){
  3.              if (j>e){
  4.                 aux = e;
  5.                 e=j;
  6.                 j=e;
  7.             }
  8.  
  9.            }
  10.        }
  11.  

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
  1. for(e=0;e<LecturasPorDia;e++){
  2.    if(ArrayDeDatosta[e].temperatura < Las5MásBajasEncontradasAnteriormete ) {
  3.        //Guardar ArrayDeDatosta[e].temperatura en las 5 más bajas encontradas y eliminar la más alta de las 5 encontradas
  4.    }
  5. }


« Última modificación: 22 Noviembre 2015, 18:03 pm por 0xFer » En línea

Código
  1. int getRandomNumber(){
  2.    return 4; //chosen by fair dice roll
  3.              //guaranteed to be random
  4. }
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines