[C con Clase] Número mayor y menor en bucle While

Oscar pelucheloko en hotmail.com
Dom Ene 13 00:41:59 CET 2013


Hola que tal 

Steven, este es el código que he empleado ahora, y parece funcionar correctamente por fin, que bien. ¿está bien hecho la definición de menor y el include a cfloat?
También he observado que el programa parecía hacer cosas diferentes al hacer if – else if que con if – if (que es ahora como lo he dejado), también he notado que al poner primero el if a menor y luego el de mayor todo ha funcionado a la perfección.

Muchas gracias Steven por la luz sobre este tema, saludos a todos.

#include "std_lib_facilities.h"
#include <cfloat>

int main()
{
    double uno, mayor, menor, suma, metros;
    string que;

    int cantidad;

    cantidad = 0;
    suma = 0;
    mayor = 0;
    menor = DBL_MAX;

    while(cin>>uno>>que)
        
    if(que == "cm")
    {
        metros = uno / 100;
        que = "m";
        cout << metros << que << endl;
        cantidad++;
        suma += metros;
                
        if(uno < menor)
        {
            menor = uno;
        }
        if(uno > mayor)
        {
            mayor = uno;
        }
    }    

    else if(que != "cm")
    {
        cout << "no se reconoce medida" << endl;
    }

        cout << "Mayor: " << mayor << "m" << endl;
        cout << "Menor: " << menor << "m" << endl;
        cout << "Cantidad: " << cantidad << endl;
        cout << "Suma: " << suma << "m" << endl;
    
    keep_window_open();
    keep_window_open();
    return 0;
}

PD: Omar, no sabía que se podía hacer la comparación como tu la haces.

Un saludo.

From: omar mendoza 
Sent: Saturday, January 12, 2013 2:48 PM
To: Lista de correo sobre C y C++ 
Subject: Re: [C con Clase]Número mayor y menor en bucle While

Hola, con respecto a la comparación de la string 

Qué es mejor?

if (que == "cm") 
    algo

o

if (que.compare("cm") == 0) 
     algo

Yo uso la segunda, de hecho no sabía que se podía hacer de la manera que lo hace Oscar
Saludos




El 11 de enero de 2013 20:12, Davidson, Steven <srd4121 en njit.edu> escribió:

  Hola Óscar, 

  2013/1/11 Oscar Aparicio Holgado <enigma-si en hotmail.com>

    Hola que tal.


  Veamos el código fuente.

    #include "std_lib_facilities.h"

    int main()
    {
        double uno, mayor, menor, suma, metros;
        string que;

        int cantidad;

        cantidad = 0;
        suma = 0;
        mayor = 0;
        menor = 0;


  El valor inicial de 'menor' puede traer problemas para el funcionamiento del algoritmo. Deberías elegir un valor inicial que obligue al algoritmo a asignar un valor válido para 'menor' en la primera iteración. Podrías elegir un número muy elevado, como por ejemplo,

  menor = DBL_MAX;

  esta constante se #define en <cfloat>.

        while(cin>>uno>>que)
            
        if(que == "cm")
        {
            metros = uno / 100;
            que = "m";
            cout << metros << que << endl;
            cantidad = cantidad + 1;
            suma = suma + metros;
                   

  Deberías acostumbrarte a usar los operadores de incremento y de incremento y asignación:


  cantidad++;
  suma += metros;

            //menor = uno

            if(uno > mayor)
            {
                mayor = uno;
            }
            else if(uno >= 0 || uno < menor)

  Esto no va a funcionar como esperas. Básicamente, cada vez que un número no sea el mayor, pero no sea negativo, se convierte en el menor. Esto no es lógico. Por ejemplo,

  1, 5, 10, 9

  Al procesar 10, tendremos:

  uno <-- 10
  mayor <-- 10
  menor <-- 0

  Cuando pasemos a recoger el valor de 9, obtendremos esto:


  uno <-- 9
  mayor <-- 10
  menor <-- 9

  Obviamente, 9 no es el menor de todos los números de la lista.


  Aparte de la solución dada previamente - usando 'DBL_MAX' - sugiero dar valores iniciales a 'mayor' y a 'menor' que sean válidos. Esto significa que estas variables deben guardar valores que pertenezcan a la lista introducida. Para ello, realiza una primera lectura específica para dar valores iniciales a 'mayor' y a 'menor', al igual que para 'suma'. Esto es,

  // Caso particular: iteración #1
  mayor = menor = suma = uno;

  // Caso general: iteración #2 al #n
  while( ... )
  {
    ...
  }

  De esta forma, no hay que dar valores iniciales que no sean válidos, y además no malgastamos la primera iteración sumando 0 (cero) a 'suma'.


  Espero que esto te ayude.

  Steven


  _______________________________________________
  Lista de correo Cconclase Cconclase en listas.conclase.net
  http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
  Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ





-- 

Omar Jonathan Mendoza Bernal
"Las cicatrices nos recuerdan que el pasado fue real" Dr. Lecter en Dragón Rojo 


--------------------------------------------------------------------------------
_______________________________________________
Lista de correo Cconclase Cconclase en listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130113/68bffe5b/attachment.html>
------------ próxima parte ------------
A non-text attachment was scrubbed...
Name: wlEmoticon-smile[1].png
Type: image/png
Size: 1046 bytes
Desc: no disponible
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130113/68bffe5b/attachment.png>


Más información sobre la lista de distribución Cconclase