maximo y minimo

Iniciado por m@o_614, 2 Marzo 2013, 20:15 PM

0 Miembros y 1 Visitante están viendo este tema.

m@o_614

saludos tengo un programa que me tiene que calcular el promedio, el mayor y el menor, etc. de un vector de temperaturas, el problema es que no me calcula bien la menor temperatura y no sé por qué si las variables están bien inicializadas

#include <stdio.h>
#include <stdlib.h>
#define SEMANA 7

int main()
{
    int i,dia_mayor,dia_menor;
    float temperatura[SEMANA],v[SEMANA],suma=0,promedio,mayor,menor;
    mayor = temperatura[0];
    menor = temperatura[0];
    for(i=0;i<SEMANA;i++)
    {
        printf("Dame la temperatura del dia \n");
        scanf("%f",&temperatura[i]);
        suma+=temperatura[i];
        if(temperatura[i]>mayor)
        {
            mayor = temperatura[i];
            dia_mayor = i;
        }
        else if(temperatura[i]<menor)
        {
            menor = temperatura[i];
            dia_menor = i;
        }
    }
    promedio = suma/SEMANA;
    printf("a) La temperatura promedio es %.2f\n",promedio);
    printf("c) La mayor temperatura es %.2f y ocurrio el dia %d\n",mayor,dia_mayor);
    printf("d) La menor temperatura es %.2f y ocurrio el dia %d\n",menor,dia_menor);
    printf("b) Un vector de las diferencias de cada temperatura con respecto al promedio\n");
    for(i=0;i<SEMANA;i++)
    {
        v[i] = temperatura[i]-promedio;
        printf("v[%d] = %.2f\n",i,v[i]);
    }

    return 0;
}


gracias ;D

naderST

El valor de temperatura[0] puede ser cualquiera, ya que en ese momento no has leído las temperaturas. Entonces digamos que menor toma el valor 1 y en el vector de temperaturas el menor valor que introduce el usuario es 20, ningún valor será menor que 1, por lo tanto vas a tener resultados no deseados.

leosansan

Cita de: m@o_614 en  2 Marzo 2013, 20:15 PM
......................................
.y no sé por qué si las variables están bien inicializadas

Código (cpp) [Seleccionar]

  ...................................
mayor = temperatura[0];
menor = temperatura[0];
  ............................



Como te indica naderST, las variables mayor y menor están inicializadas con valores "basura" o impredecibles ya que no se han asignado hasta ese momento.

Por ejemplo, sería más correcto:


Código (cpp) [Seleccionar]

  ...................................
mayor =-200;
menor =200;
  ............................


Saluditos!. ....

rir3760

Siguiendo la linea de leosansan se puede asignar a la variable "menor" el valor máximo posible para el tipo float y a la variable "mayor" el mínimo. Mas o menos así:
#include <float.h> /* FLT_MAX y FLT_MIN */

/* ... */

float menor = FLT_MAX;
float mayor = FLT_MIN;


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

naderST

Cita de: rir3760 en  3 Marzo 2013, 17:24 PM
Siguiendo la linea de leosansan se puede asignar a la variable "menor" el valor máximo posible para el tipo float y a la variable "mayor" el mínimo. Mas o menos así:
#include <float.h> /* FLT_MAX y FLT_MIN */

/* ... */

float menor = FLT_MAX;
float mayor = FLT_MIN;


Un saludo

Creo que aquí tendríamos un problema ya que mayor tomaría el valor de 0, pero podría pasar que todas las temperaturas sean negativas y no te daría la mayor. En este caso yo prefiero leer la primera temperatura y asignar ese valor a mayor y menor y luego leer las demás temperaturas e ir comprobando.

leosansan

Cita de: naderST en  3 Marzo 2013, 18:22 PM

Creo que aquí tendríamos un problema ya que mayor tomaría el valor de 0, pero podría pasar que todas las temperaturas sean negativas y no te daría la mayor....................


Para empezar no veo necesario el uso de librerías porque sí, ya que en este caso se están tomando temperaturas del medio ambiente, creo que los valores que propuse son más que suficientes.

Y naderST observa que al definir como mayor=-200, la primera temperatura que tome pasará a ser mayor y a la vez menor y ya luego se irán comparando con éstas, que en el fondo es lo que tú propones.

Saluditos!. ...

m@o_614

muchas gracias a todos por sus respuestas

creí que estaba inicializando las variables correctamente porque en otro programa muy parecido que también tenía que calcularme el mayor y el menor elemento lo hice así y esta vez si me funcionó, y no se porqué en uno si y en el otro no

int main()
{
    int i,hora_a,hora_b;
    float temperatura[DIA],media=0,m,mayor=0,menor=temperatura[0];

    for(i=0;i<DIA;i++)
    {
        printf("Dame la temperatura de la hora %d\n",i);
        scanf("%f",&temperatura[i]);
        media += temperatura[i];
        if(temperatura[i]>mayor)
        {
             mayor = temperatura[i];
             hora_a = i;
        }
        else if(temperatura[i]<menor)
        {
            menor = temperatura[i];
            hora_b = i;
        }

    }
    m = media/DIA;
    printf("La Temperatura media fue %.2f,la mas alta %.2f a las %d hrs y la mas baja %.2f.",m,mayor,hora_a,menor);
    return 0;
}


este es el código que es parecido y que si calcula los valores correctamente, sin importar que menor este inicializado con un valor basura


leosansan

Con esos valores que inicializas puede ocurrirte que si estas tomando las temperaturas estos dias en diversos lugares de Huesca te salga la mayor como cero, cuando en realidad podría ser menos cinco "la mayor", fíjate que hace mucho frío. Y si estas tomando para calcular la menor en diversos puntos de Canarias estos dias te saldría cero, cuando en realidad sería de quince.

De ahí que por seguridad inicializo don -200 y 200, que es pasarse ya que con -50 y 50 va bien.

Léelo bien y corrige ese fallo.

Saluditos!. ....

rir3760

Cita de: naderST en  3 Marzo 2013, 18:22 PMCreo que aquí tendríamos un problema ya que mayor tomaría el valor de 0, pero podría pasar que todas las temperaturas sean negativas y no te daría la mayor.
Tienes razón. Pensaba en utilizar esas macros de forma similar a INT_MIN e INT_MAX (pero no, en este caso no sirve, Ouch!).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

XXTOxic_LUISxX

Lograste resolver ese problema bro??