我做的while循环没有正确循环

时间:2017-05-22 03:41:15

标签: c do-while

我可能会提供足够的但很长的故事,我正在研究ATM机程序,我正在尝试将#34;切换"在循环中的main函数中的语句,这样用户可以获得更多的事务。

我遇到一个问题,我会存入100但是当我检查余额时它仍然是0.我知道其他一切正常但是这个循环正在杀了我,我将不胜感激任何帮助! 不要介意它所在的所有额外的东西,以便了解我正在做的工作

int main ()
{
    char option;
    float balance ; 
    int count = 1;
    option = displayMenu();
    do
    {
        switch (option)
        {
            case 'D':
                getDeposit(balance);
                main();
                count++;
            break;
            case 'W':
                getWithdrawal(balance);
                main();
                count++;
            break;
            case 'B':
                displayBalance(balance);
                main();
                count++;
            break;
            case 'Q':
                printf("Thank you!");
            break;
                main();
        }
    } while ( count <= 5);
    return 0;
}

char displayMenu()
{
    char option;
    printf("\n  Welcome to HFC Federal Credit Union \n");
    printf("\n      Please select from the following menu: \n ");
    printf("\n  D:     Make a deposit \n ");
    printf("\n  W:  Make a withdrawal  \n ");
    printf("\n  B:  Check your account balance \n ");
    printf("\n  Q:  To quit \n ");
    scanf("\n%c" , &option);
    return option;
}

float getDeposit(float balance)
{
    float deposit;
    printf("\n Please enter the amount you want to deposit!  ");
    scanf("%f" , &deposit);
    balance += deposit;
    return balance;
}

float getWithdrawal(float balance)
{
    float withdrawal;
    printf("\n Please enter the amount you want to withdraw!  ");
    scanf("%f" , &withdrawal);
    balance -= withdrawal;
    return balance;
}

void displayBalance(float balance)
{
    printf("\n Your current balance is %f " , balance);
}

4 个答案:

答案 0 :(得分:4)

你在循环的每次迭代中递归调用main()。只需删除此电话,您就应该好了。

您还需要将函数的返回值分配给balance,否则它们将无法影响其值。

答案 1 :(得分:3)

这段代码有很多问题......这是我的主要指针(但不是全部,我只是回答这个问题):

  1. 你一遍又一遍地调用main,为简单起见,你可以将其视为每次重启应用程序(除了堆栈问题,我忽略了其他令人讨厌的副作用)。

  2. 您没有初始化balance(和朋友)变量。它们可能包含“垃圾”数据。

  3. 您忽略了您使用的函数的返回值。如果您没有使用指针,则应使用赋值。

  4. 您的菜单打印功能已经失控...我怀疑这是否是您想要的。

  5. 这是一个快速的脏修复(未经测试):

    int main() {
      char option;
      float balance = 0;
      int count = 1;
      do {
        option = displayMenu(); // moved into the loop.
        switch (option) {
        case 'D':
          balance = getDeposit(balance);
          count++;
          break;
        case 'W':
          balance = getWithdrawal(balance);
          count++;
          break;
        case 'B':
          balance = displayBalance(balance);
          count++;
          break;
        case 'Q':
          printf("Thank you!");
          break;
        }
      } while (count <= 5);
      return 0;
    }
    
    char displayMenu(void) {
      char option;
      printf("\n  Welcome to HFC Federal Credit Union \n");
      printf("\n      Please select from the following menu: \n ");
      printf("\n  D:     Make a deposit \n ");
      printf("\n  W:  Make a withdrawal  \n ");
      printf("\n  B:  Check your account balance \n ");
      printf("\n  Q:  To quit \n ");
      scanf("\n%c", &option);
      return option;
    }
    
    float getDeposit(float balance) {
      float deposit;
      printf("\n Please enter the amount you want to deposit!  ");
      scanf("%f", &deposit);
      balance += deposit;
      return balance;
    }
    
    float getWithdrawal(float balance) {
      float withdrawal;
      printf("\n Please enter the amount you want to withdraw!  ");
      scanf("%f", &withdrawal);
      balance -= withdrawal;
      return balance;
    }
    
    void displayBalance(float balance) {
      printf("\n Your current balance is %f ", balance);
    }
    

    祝你好运!

答案 2 :(得分:0)

你没有改变main()中的变量。 你可以改变循环:

do
{
    switch (option)
    {
    case 'D':
        balance = getDeposit(balance);
        count++;
        break;
    case 'W':
        balance = getWithdrawal(balance);
        count++;
        break;
    case 'B':
        displayBalance(balance);
        count++;
        break;
    case 'Q':
        printf("Thank you!");
        break;
    }
} while (count <= 5);

答案 3 :(得分:0)

我认为主要问题是在循环外更新开关控制变量 回应&#34; Q&#34;结束有点必要......然后只允许5变得不必要 我也修了几件其他东西;并提供了对它们的评论 并且我稍微改进了可测试性(5-> 6)。我保持计数,只是扩展到6,以便进行完整的测试&#34; D 100,B,W 50,B,Q&#34;。
顺便说一句漂​​亮的设计,从函数返回平衡,而不是使用指针或全局变量。但是你需要使用返回值而不是忽略它。

/* include necessary headers, do not skip this when making your MCVE */
#include <stdio.h>

/* prototypes of your functions,
   necessary to avoid the "immplicitly declared" warnigns
   when compiling "gcc -Wall -Wextra"; which you should
 */
char  displayMenu(void);
float getDeposit(float balance);
float getWithdrawal(float balance);
void  displayBalance(float balance);

/* slightly better header of main, with "void" */
int main (void)
{
    char option;
    float balance=0.0; /* initialise your main variable */
    int count = 1;
    /* your very important update of the switch control variable has been moved ... */
    do
    {
        option = displayMenu(); /* ...here */
        /* If you do not update your switch variable inside the loop,
           then it will forever think about the very first command,
           this explains most of your problem.
         */
        switch (option)
        {
            case 'D':
                balance=getDeposit(balance); /* update balance */
                /* removed the recursive call to main(),
                   it is not needed as a solution to the problem that the program
                   always uses the first command (when updating inside the loop)
                   and otherwise just makes everything much more complicated and
                   risky.
                 */
                count++;
                break;
            case 'W':
                balance=getWithdrawal(balance); /* update balance */
                count++;
                break;
            case 'B':
                displayBalance(balance);
                count++;
                break;
            case 'Q':
                printf("Thank you!");
                /* adding a way to get out of the loop,
                   using a magic value for the count,
                   this is a mehtod frowned upon by most,
                   but it minimises the changes needed to your
                   own coding attempt.
                 */
                count=0;
                break;
        }
    } while ( (count <= 6)&&(count>0) ); /* additionally check for the  magic "Q" value
        check against count<=6, to allow testing D,B,W,B,Q  */
    return 0;
}

/* use explicitly empty parameter list for functions */
char displayMenu(void)
{
    char option;
    printf("\n  Welcome to HFC Federal Credit Union \n");
    printf("\n      Please select from the following menu: \n ");
    printf("\n  D:     Make a deposit \n ");
    printf("\n  W:  Make a withdrawal  \n ");
    printf("\n  B:  Check your account balance \n ");
    printf("\n  Q:  To quit \n ");
    scanf("\n%c" , &option);
    return option;
}

float getDeposit(float balance)
{
     float deposit;
     printf("\n Please enter the amount you want to deposit!  ");
     scanf("%f" , &deposit);
     balance += deposit;
     return balance;
}

float getWithdrawal(float balance)
{
    float withdrawal;
    printf("\n Please enter the amount you want to withdraw!  ");
    scanf("%f" , &withdrawal);
    balance -= withdrawal;
    return balance;
}

void displayBalance(float balance)
{
    printf("\n Your current balance is %f " , balance);
}
相关问题