[C con Clase] Resumen de Cconclase, Vol 146, Envío 2

Salvador Pozo salvador en conclase.net
Mar Sep 3 20:40:03 CEST 2019


El pasado 2019-09-03 16:03:47, Emanuel escribió:
 
E> Hola estudie un poco mas y tome en cuenta los consejos y segui con el
E> programa que intentaba hacer.
E> ahora compila, pero cuando quiero que haga el descuento no lo aplica y la
E> verdad no tengo la menor idea de porque, si me ayudan a identificar la
E> causa me ayudarian mucho, ya que estoy con muchas ganas de aprender.
E> gracias por el curso y la ayuda que brindan

Hola:

De nuevo te respondo comentado sobre el código que has enviado:


#include <iostream>
#include <stdlib.h>

// Aunque en C++ se pueden usar ficheros de cabecera C, lo recomendable es 
// usar las versiones C++. En este caso, para stdlib.h, lo correcto sería usar 
// #include <cstlib>
// De todos modos, en este programa no usas ninguna función de stdlib, de modo
// que puedes prescindir de ese fichero de cabecera.


using namespace std;

void mensaje_precio();
bool consulta_descuento(int Descuento);
void valor_total(int Descuento,float precio_final);

 int Descuento;
 float precio_articulo_sin_descuento;
 float precio_final;

int main()
{
    mensaje_precio();
    consulta_descuento(Descuento);

// Has declarado "consulta_descuento" con un valor de retorno de tipo bool
// pero no usas ese valor de retorno para nada. Lo lógico sería asignar
// el valor de retorno a una variable o usarlo como parámetro en una función.
// Tal como lo usas, esta función no realiza ninguna tarea útil en este 
// programa.
 
    valor_total(Descuento,precio_final);

 return 0;
}

void mensaje_precio()
{
    cout<<"Ingrese el precio del producto: ";
    cin>>precio_articulo_sin_descuento;

}


bool consulta_descuento(int Descuento)

// Pasas como parámetro con el mismo nombre que una variable global.
// Dentro de la función, el parámetro Descuento enmascara a la variable
// global Descuento, de modo que dentro de ella siempre accedes al
// parámetro, y la variable local es inaccesible.
// En realidad puedes usar una variable local en su lugar, ya que
// no usas para nada el valor del parámetro, ni el cambio del valor
// se verá reflejado al retornar.
 
{
    cout<<"¿El producto tiene descuento?\npresiona 1 si tiene descuento o 0 si no tiene."<<endl;
    cin>>Descuento;
    if(Descuento==1)
    {
        return true; return false;

// Aquí hay un error. Después de ejecutar una sentencia "return", el programa
// no ejecutará ninguna otra sentencia de la función, por lo que la segunda
// sentencia return no puede ejecutarse nunca.
// De hecho, el compilador da un aviso (warning) indicando que hay situaciones
// para las que la función no devuelve ningún valor:
// warning: control reaches end of non-void function [-Wreturn-type]|
// Supongo que la idea era colocar el segundo return fuera del bloque "if".

    }
}

void valor_total(int Descuento,float precio_final)
{
    if(Descuento==true)

// Descuento es de tipo int. C++ convierte automáticamente cualquier valor
// de tipo int a bool si aparece en una expresión como la que has usado.
// Un valor 0 se convierte a false, y cualquier otro valor a true.
// Sin embargo sospecho que no era eso lo que querías hacer, dado que
// has creado una función que devuelve un bool, probablemente querías
// usar ese valor de retorno como parámetro para esta función.

// Además, usar la expresión "Descuento==true" es redundante en este
// caso, ya que la sentencia "if" espera un valor de tipo bool, podrías
// haber usado directamente la forma "if(Descuento)", que es equivalente.

    {
        precio_final=precio_articulo_sin_descuento*0.20;

// Como en el primer programa que enviaste, en este caso hay un error en
// la fórmula que calcula el precio final. Esto no es un error de programación,
// sino del algoritmo. La fórmula que has usado calcula el descuento, no el
// precio final.

        cout<<"El precio total es: "<<precio_final<<endl;

    }
    else
        {
            precio_final=precio_articulo_sin_descuento;
            precio_final=precio_articulo_sin_descuento;

// Has repetido la sentencia dos veces. Al compilador no le importa repetir
// los cálculos, ni se dará cuenta de que los está repitiendo, pero no
// hace falta hacerlo dos veces.

            cout<<"El precio total es: "<<precio_final<<endl;

        }
}

Como nota final, es una buena práctica evitar usar variables globales. En
este caso no son necesarias, se puede escribir el mismo programa usando sólo
variables locales. Es un tema de seguridad, en el sentido de que las variables
locales sólo pueden ser modificadas en la función en que son declaradas, y
cualquier intento de modificar el valor en otra función provocará un error.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net
Blog con Clase: http://blogconclase.wordpress.com
Con Clase: http://conclase.net


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