Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema al usar una función

Iniciado por player, 04 de Julio de 2009, 03:55:33 PM

« anterior - próximo »

player

Hola de nuevo. Estoy intentado hacer un programa en el que hay que meter el número de cuenta, el saldo inicial de la cuenta, el total de cargos hechos en la cuenta, el total de los créditos aplicados a la cuenta y el límite de la cuenta.

Luego debe mostrar en pantalla el número de cuenta, el límite de la cuenta y el balance total. Si el balance es mayor que el límite de la cuenta, debe aparecer un mensaje diciendo que el limite del crédito ha sido excedido.

La fórmula para el balance que dan es esta: (saldoInicial + totalCargos - totalCreditosMes)

En el ejercicio no piden nada de usar funciones, pero ya que me he leído el tema he intentado hacer una función que calcule el balance y a la que luego llamo para que me de el resultado del balance y para que me haga la comparación de después. El problema es que no me da el resultado de balance cuando llamo a la función y la comparación no sé si la hace o siempre da el mensaje de que el límite de crédito ha sido excedido. Está bien declarada y creada la función? Llamo a la función de manera correcta? Debo tener algún o algunos fallos que no consigo ver. Gracias.



#include <stdio.h>
#include <stdlib.h>

float balance (float);

main()
{
     
      float numeroCuenta, saldoInicial, totalCargos, totalCreditosMes, limiteCuenta, contador, balanceX;
     
      contador = 0;
     
      printf("Introduce tu numero de cuenta (-1 para terminar):\n");
      scanf("%f", &numeroCuenta);
     
      while (numeroCuenta != -1){
     
      printf("Introduce el saldo inicial de tu cuenta:\n");
      scanf("%f", &saldoInicial);
     
      printf("Introduce los cargos totales:\n");
      scanf("%f", &totalCargos);
     
      printf("Introduce los creditos aplicados en este mes:\n");
      scanf("%f", &totalCreditosMes);
     
      printf("Introduce el limite de credito de tu cuenta:\n");
      scanf("%f", &limiteCuenta);
     
      printf("Cuenta numero: %.2f\n", numeroCuenta);
      printf("Limite de la cuenta: %.2f\n", limiteCuenta);
      printf("Balance: %.2f\n\n", balance (balanceX));
     
      if (balance(balanceX) > limiteCuenta){
                   printf("Limite de credito excedido\n");
      }

      contador++;
     
      printf("Introduce tu numero de cuenta (-1 para terminar):\n");
      scanf("%f", &numeroCuenta);
}

}

/*funcion balance*/
float balance (float balanceX)
{
      float totalCargos, saldoInicial, totalCreditosMes;
      balanceX = saldoInicial + totalCargos - totalCreditosMes;
      }


Warchief

No estás devolviendo el valor de la función. Vuelve a leer el tema del "return" en las funciones.

player

#2
Me lo acabo de volver a leer y me he liado aún más. A ver, según el libro si la función devuelve un resultado debo poner:

return; expresión; y si no regresa ningún resultado basta con poner return;

lo que pasa que no viene ni un solo ejemplo de return con punto y coma y seguidamente la expresión con punto y coma. Además el compilador me lo marca como error si lo pongo así (en expresión pongo saldoInicial + totalCargos - totalCreditosMes;)

Como yo lo entiendo, si la función es:

float balance (float balanceX)
{
      float totalCargos, saldoInicial, totalCreditosMes;
      balanceX = saldoInicial + totalCargos - totalCreditosMes;
      }

debería añadir al final un return balaceX; para que devuelva el resultado de balanceX a la función y después cuando yo llamo a la
función balance (balanceX) en

printf("Balance: %.2f\n\n", balance (balanceX));

y luego en

if (balance(balanceX) > limiteCuenta)

debería primero mostrarme su valor y luego comparármelo, pero al hacer eso no me devuelve el resultado bien (me devuelve -1.#R) y al no tener resultado no hace la comparación, por lo que seguro que hay algo que no estoy entendiendo y no consigo verlo. Estoy hecho un gran lío, alguien es tan amable de poder explicarlo como si se lo explicara a un burro? (ya no pienso que lo soy, está demostrado que lo soy... :grrr:)

HarvesterOfAcorns

Lo estás haciendo al revés, según lo tienes ahora, tú función espera que le pases como argumento un float llamado balanceX y luego no devuelve nada. Cuando la llamas en main le pasas un valor no inicializado que luego no usas en la función, tal y como está el compilador debe arrojarte más de un error. Creo que deberías pasarle las variables saldoinicial, totalcargos y totalCreditosMes y luego retornar el resultado de la fórmula desde la función.

Por otro lado no es correcto hacer:   

return; expresion;   

lo correcto sería:     

return expresion;

con punto y coma al final solamente.

player

#4
Cita de: HarvesterOfAcorns
Lo estás haciendo al revés, según lo tienes ahora, tú función espera que le pases como argumento un float llamado balanceX y luego no devuelve nada. Cuando la llamas en main le pasas un valor no inicializado que luego no usas en la función, tal y como está el compilador debe arrojarte más de un error. Creo que deberías pasarle las variables saldoinicial, totalcargos y totalCreditosMes y luego retornar el resultado de la fórmula desde la función.
El compilador no me da ningún error teniéndolo así. Lo que propones, te refieres a algo así?

/*funcion balance*/
float balance (float saldoInicial, float totalCargos, float totalCreditosMes) /*Con pasar las variables te refieres a esto??*/
{
      float balanceX;
      balanceX = saldoInicial + totalCargos - totalCreditosMes; /*fórmula*/
     
      return balanceX; /*así retorno el resultado de la formula correctamente??*/
            }

Lo que pasa es que me da un error al compilar, y según lo que dice el libro, el prototipo de función al principio del todo debería
ser float balance (float, float, float); y el error que me da es " too few arguments to function `float balance(float, float, float)' ", qué significa eso?

Cita de: HarvesterOfAcorns
Por otro lado no es correcto hacer:   

return; expresion;   

lo correcto sería:    

return expresion;

con punto y coma al final solamente.
Gracias, ya decía yo, el libro tiene una errata explicando eso. Cualquier comentario o explicación más se agradecerá, por mucho que leo una y otra vez el capítulo este de funciones me quedo igual de perdido.

HarvesterOfAcorns

Eso es, lo del error de too few arguments... puede deberse a que no has cambiado la llamada a la función en main y le estás pasando menos argumentos de los que declaras en el prototipo, ese error suele deberse a que se pasa un número erróneo de argumentos en la llamada a una función.

player

#6

#include <stdio.h>
#include <stdlib.h>

float balance (float, float, float);

main()
{
     
      float numeroCuenta, saldoInicial, totalCargos, totalCreditosMes, limiteCuenta, contador, balanceX;
     
      contador = 0;
     
      printf("Introduce tu numero de cuenta (-1 para terminar):\n");
      scanf("%f", &numeroCuenta);
     
      while (numeroCuenta != -1){
      printf("Introduce el saldo inicial de tu cuenta:\n");
      scanf("%f", &saldoInicial);
      printf("Introduce los cargos totales:\n");
      scanf("%f", &totalCargos);
      printf("Introduce los creditos aplicados en este mes:\n");
      scanf("%f", &totalCreditosMes);
      printf("Introduce el limite de credito de tu cuenta:\n");
      scanf("%f", &limiteCuenta);
     
      printf("Cuenta numero: %.2f\n", numeroCuenta);
      printf("Limite de la cuenta: %.2f\n", limiteCuenta);
      printf("Balance: %.2f\n\n", balanceX);                          <----------------------
     
      if (balanceX > limiteCuenta){                                    <----------------------
                   printf("Limite de credito excedido\n");
      }

      contador++;
     
      printf("Introduce tu numero de cuenta (-1 para terminar):\n");
      scanf("%f", &numeroCuenta);
}

}

/*funcion balance*/
float balance (float saldoInicial, float totalCargos, float totalCreditosMes)
{
      float balanceX;
      balanceX = saldoInicial + totalCargos - totalCreditosMes;
     
      return balanceX;
            }


Así está el código de momento, ahora ya no me da el error de too few arguments porque he cambiado lo que está marcado con flechas quitando balance (balanceX) y dejando únicamente balanceX, lo que pasa que así estoy 99.99% seguro de que no hago nada porque no estoy llamando correctamente a la función. Me parece que debería llamarla de la siguiente manera:

printf("Balance: %.2f\n\n", balance(saldoInicial, totalCargos, totalCreditosMes));

pero me dice que balance cannot be used as a function. Por qué?

HarvesterOfAcorns

Como tienes declarada balance(...) con tres argumentos de tipo float, al invocarla desde main has de pasarle exactamente tres float para que no te de ese error

balanceX = balance(saldoInicial,totalCargos,totalCreditosMes);

en lugar de

balance(balanceX)

player

#8
Gracias!!! Muchas gracias!!!! Ya funciona!!!! me faltaba igualar balanceX a balance(saldoInicial, totalCargos, totalCreditosMes)); como me has indicado. Así que la explicación sería que para invocar a una función hay que igualar la variable que hayamos declarado en main a esa función para que tome su valor. Es correcto así? En este caso yo he hecho que balanceX coincidiera en nombre al ser declarada tanto dentro de la función balance como en main, pero podría haberles dado nombres totalmente distintos en un sitio y en otro porque luego al igualar la variable en main a la función, ésta tomará el valor de la función.

Bueno... un problema tan fácil se me ha hecho un mundo así que no quiero ni imaginarme lo que me espera más adelante... en fin muchas gracias por la ayuda prestada.

Dejo el código completo:


#include <stdio.h>

float balance (float, float, float);

main()
{
     
      float numeroCuenta, saldoInicial, totalCargos, totalCreditosMes, limiteCuenta, contador, balanceX;
     
      contador = 0;
     
      printf("Introduce tu numero de cuenta (-1 para terminar):\n");
      scanf("%f", &numeroCuenta);
     
      while (numeroCuenta != -1){
     
      printf("Introduce el saldo inicial de tu cuenta:\n");
      scanf("%f", &saldoInicial);
     
      printf("Introduce los cargos totales:\n");
      scanf("%f", &totalCargos);
     
      printf("Introduce los creditos aplicados en este mes:\n");
      scanf("%f", &totalCreditosMes);
     
      printf("Introduce el limite de credito de tu cuenta:\n");
      scanf("%f", &limiteCuenta);
     
      printf("Cuenta numero: %.2f\n", numeroCuenta);
      printf("Limite de la cuenta: %.2f\n", limiteCuenta);
      printf("Balance: %.2f\n\n", balanceX = balance(saldoInicial, totalCargos, totalCreditosMes));
     
      if (balanceX = balance (saldoInicial, totalCargos, totalCreditosMes) > limiteCuenta){
                   printf("Limite de credito excedido\n");
      }

      contador++;
     
      printf("Introduce tu numero de cuenta (-1 para terminar):\n");
      scanf("%f", &numeroCuenta);
}

}

/*funcion balance*/
float balance (float saldoInicial, float totalCargos, float totalCreditosMes)
{
      float balanceX;
      balanceX = saldoInicial + totalCargos - totalCreditosMes;
     
      return balanceX;
            }


Por cierto, ahora revisando el código, me he dado cuenta de que el contador = 0 y el contador ++ no sirven de nada, porque el programa hace lo mismo eliminándolo. Esto se debe a que no estoy acumulando ningún valor en un total que necesite de contador ni haciendo un while con un número determinado de repeticiones para que se salga del mismo. Es correcto?

Dejo el código de nuevo con la modificación quitando el contador y cambiando el nombre de la variable balanceX del main por resultadoBalance e igualándola a la función:


#include <stdio.h>

float balance (float, float, float);

main()
{
     
      float numeroCuenta, saldoInicial, totalCargos, totalCreditosMes, limiteCuenta, resultadoBalance;
     
           
      printf("Introduce tu numero de cuenta (-1 para terminar):\n");
      scanf("%f", &numeroCuenta);
     
      while (numeroCuenta != -1){
     
      printf("Introduce el saldo inicial de tu cuenta:\n");
      scanf("%f", &saldoInicial);
     
      printf("Introduce los cargos totales:\n");
      scanf("%f", &totalCargos);
     
      printf("Introduce los creditos aplicados en este mes:\n");
      scanf("%f", &totalCreditosMes);
     
      printf("Introduce el limite de credito de tu cuenta:\n");
      scanf("%f", &limiteCuenta);
     
      printf("Cuenta numero: %.2f\n", numeroCuenta);
      printf("Limite de la cuenta: %.2f\n", limiteCuenta);
     
      resultadoBalance = balance(saldoInicial, totalCargos, totalCreditosMes);
      printf("Balance: %.2f\n\n", resultadoBalance);
     
      if (resultadoBalance > limiteCuenta){
                   printf("Limite de credito excedido\n\n");
      }

         
      printf("Introduce tu numero de cuenta (-1 para terminar):\n");
      scanf("%f", &numeroCuenta);
}

}

/*funcion balance*/
float balance (float saldoInicial, float totalCargos, float totalCreditosMes)
{
      float balanceX;
      balanceX = saldoInicial + totalCargos - totalCreditosMes;
     
      return balanceX;
            }

player

#9
Añado para comentar una cosa extrañísima  ??? He hecho el mismo programa pero sin función



#include <stdio.h>


main()
{
     
      float numeroCuenta, saldoInicial, totalCargos, totalCreditosMes, limiteCuenta, balance;
     
     
     balance = 0;
     
     
      printf("Introduce tu numero de cuenta (-1 para terminar):\n");
      scanf("%f", &numeroCuenta);
     
      while (numeroCuenta != -1){
     
      printf("Introduce el saldo inicial de tu cuenta:\n");
      scanf("%f", &saldoInicial);
     
      printf("Introduce los cargos totales:\n");
      scanf("%f", &totalCargos);
     
      printf("Introduce los creditos aplicados en este mes:\n");
      scanf("%f", &totalCreditosMes);
     
      printf("Introduce el limite de credito de tu cuenta:\n");
      scanf("%f", &limiteCuenta);
     
     
     
      printf("Cuenta numero: %.2f\n", numeroCuenta);
      printf("Limite de la cuenta: %.2f\n", limiteCuenta);
     
      balance = (saldoInicial + totalCargos - totalCreditosMes);
     
      printf("Balance: %.2f\n", balance);
     
   
      if (balance > limiteCuenta){
                   printf("Limite de credito excedido\n");
      }

     
     
      printf("Introduce tu numero de cuenta (-1 para terminar):\n");
      scanf("%f", &numeroCuenta);


}

}


Cuando le doy a compilar y luego ejecuto, meto todos los datos y el resultado de balance me lo vuelve a dar mal como antes, me sale -1.#R como resultado. Pero si cierro el compilador y abro el programa directamente desde el ejecutable, meto todos los datos y el resultado de balance me lo da bien. Como se entiende esto??? 8o






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.