[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