LUCES DE SEPTIEMBRE

Por el cambio de aires

Problemas en este programa

Posted by Fran en julio 3, 2008

Hola chicos, tengo el examen de programación el lunes, y estoy repasando los ejercicios de las prácticas que teníamos que entregar, los estoy haciendo todos uno por uno, el problema es que no tengo las prácticas, porque como algunos de vosotros sabréis, se me jodió el disco duro del MacBook, y con él, todo lo que tenía dentro. Y he llegado a un ejercicio chorra, el programa funciona, pero no hace algo que debe de hacer, seguramente es una tontería, pero me tiene en vilo, lo dejo aquí por si alguien tiene el gusto de echarme una mano, aunque sea al cuello jajajaj.

El programa tiene que pedirme números enteros positivos, hasta que le meta un negativo, cuando escriba un negativo, tiene que decirme cuál es el mayor que he introducido y el menor (sin contar el negativo). Pues a mí me escribe el negativo y no se por qué. Os dejo el programa aquí para ver si me podéis dar una solución. Gracias de antemano.

#include <iostream>

using namespace std;

int main()

{

    int num = 0;

    int nummayor = 0;

    int nummenor = 0;

    while(num >= 0)

    {

        cin >> num;

        if(num > nummayor)

        {

            nummayor = num;

        }

        if(nummayor >= 0 && num < nummayor)

        {

            nummenor = num;

        }

    }

    cout << “El numero mayor es: “ << nummayor << endl;

    cout << “El numero menor es: “ << nummenor << endl;

}

Anuncios

7 comentarios to “Problemas en este programa”

  1. cjenkins said

    Primero un bug de lógica menor, del por qué te sale el negativo:


    if(nummayor >= 0 && num < nummayor) {
    nummenor = num;
    }

    Es:


    if(num >= 0 && num < nummayor) {
    nummenor = num;
    }

    Sin embargo, el problema es más complejo. El algoritmo que escribes no puede distinguir cual es el número menor pues la comparación la haces con el número mayor. Ahora si haces esto:
    10, 1, 8 , 2, -1
    La salida es esta:
    El número mayor es: 10
    El número menor es: 2
    Lo que es obviamente incorrecto. Pues claro! Tu algoritmo pregunta (num >= 0 && num = 0 && num < nummenor). El problema es que inicias nummenor con 0, por lo tanto nunca se cumpliría pues el programa termina al insertar un número negativo. Así pues, cual es la solución? Podrías programar feo y poner el valor inicial de nummenor muy muy alto, tal vez el valor máximo que le cabe a un entero, la variable INT_MAX. Entonces en este primer acercamiento tendríamos:

    #include

    using namespace std;

    int main(int argc, char** argv) {

    int num = 0;
    int nummayor = 0;
    int nummenor = INT_MAX;

    while(num >= 0) {

    cin >> num;

    if(num > nummayor) {
    nummayor = num;
    }

    if(num >= 0 && num < nummenor) {
    nummenor = num;
    }
    }

    cout << "El numero mayor es: " << nummayor << endl;
    cout << "El numero menor es: " << nummenor << endl;

    return 0;
    }

    Lo que es correcto y no te lo podrían poner mal. La salida es correcta para la misma secuencia 10, 1, 8 , 2, -1:
    La salida es esta:
    El número mayor es: 10
    El número menor es: 1
    Ahora bien, esto es programar feo. Yo, por mi parte, preferiría inicializar las variables con el primer dígito que introduzcan. Ya que si introduzco 10, -1. La salida correcta debería ser
    El número mayor es: 10
    El número menor es: 10
    Por lo que el valor inicial puede ser tomado para inicializar las dos variables y de ahí tomarlas como valor de referencia.
    Aquí este segundo acercamiento, en mi opinión mucho más elegante:

    #include

    using namespace std;

    int main(int argc, char** argv) {

    int num;
    int nummayor;
    int nummenor;

    cin >> num;
    nummayor = num;
    nummenor = num;

    while(num >= 0) {

    cin >> num;

    if(num > nummayor) {
    nummayor = num;
    }

    if(num >= 0 && num < nummenor) {
    nummenor = num;
    }
    }

    cout << "El numero mayor es: " << nummayor << endl;
    cout << "El numero menor es: " << nummenor << endl;

    return 0;
    }

    Por último, pero ya esto es lujo, que pasa si lo primero que introduzco es un número negativo?
    Para el primer acercamiento este sería el resultado:

    -1
    Número mayor es: 0
    Número menor es: 2147483647

    Lo cual estaría completamente mal. Para el segundo acercamiento este sería el resultado:

    -1
    Número mayor es: -1
    Número menor es: -1

    Lo cual es mejor, pero sigue estando mal, pues se supone que sólo aceptaría enteros positivos. Bien entonces ponemos una cláusula para evitar este problema así:

    #include

    using namespace std;

    int main(int argc, char** argv) {

    int num;
    int nummayor;
    int nummenor;

    cin >> num;
    nummayor = num;
    nummenor = num;

    while(num >= 0) {

    cin >> num;

    if(num > nummayor) {
    nummayor = num;
    }

    if(num >= 0 && num 0) {
    cout << "El numero mayor es: " << nummayor << endl;
    cout << "El numero menor es: " << nummenor << endl;
    } else {
    cout << "No introdujo ningun entero positivo. " << endl;
    }

    return 0;
    }

    Saludos!

  2. cjenkins said

    Por alguna razón se borró donde dice:
    Lo que es obviamente incorrecto. Pues claro! Tu algoritmo pregunta (num >= 0 && num = 0 && num = 0 && num = 0 && num < nummenor). El problema es que inicias nummenor con 0, por lo tanto nunca se cumpliría pues el programa termina al insertar un número negativo. Así pues, cual es la solución? Podrías programar feo y poner el valor inicial de nummenor muy muy alto, tal vez el valor máximo que le cabe a un entero, la variable INT_MAX. Entonces en este primer acercamiento tendríamos:

  3. cjenkins said

    Puta! Que le pasa a WordPress!!!!
    Tercera vez que escribo espero esta vez no lo borre:
    Por alguna razón se borró donde dice:
    Lo que es obviamente incorrecto. Pues claro! Tu algoritmo pregunta (num >= 0 && num = 0 && num < nummenor). El problema es que inicias nummenor con 0, por lo tanto nunca se cumpliría pues el programa termina al insertar un número negativo. Así pues, cual es la solución? Podrías programar feo y poner el valor inicial de nummenor muy muy alto, tal vez el valor máximo que le cabe a un entero, la variable INT_MAX. Entonces en este primer acercamiento tendríamos:

    Debería decir:
    Lo que es obviamente incorrecto. Pues claro! Tu algoritmo pregunta (num >= 0 && num < nummayor). Debería comparar con el número menor (num >= 0 && num < nummenor). El problema es que inicias nummenor con 0, por lo tanto nunca se cumpliría pues el programa termina al insertar un número negativo. Así pues, cual es la solución? Podrías programar feo y poner el valor inicial de nummenor muy muy alto, tal vez el valor máximo que le cabe a un entero, la variable INT_MAX. Entonces en este primer acercamiento tendríamos:

    Espero que esta vez no me corte y enrede el texto.

  4. Fran said

    Nunca nadie me ha respondido de esa forma, te agradezco de verdad que hayas perdido tanto tiempo con mi problema. Ahora ya me funciona bien, además no sabía lo de INT_MAX. Gracias de verdad, aquí tienes un amigo

  5. rehtse said

    vaya, llego tarde y ya está solucionado… cachis… bueno, suerte con el exámen 🙂

  6. //Lokillo said

    Lo mismo digo 😉

    Suerte!!!

  7. Fran said

    Voy a necesitar bastante, porque este finde……. no es que haya estudiado mucho

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: