繁体   English   中英

我的do while循环未正确循环

[英]My do while loop is not looping correctly

我可能正在提供足够多的内容,但总而言之,我正在开发一个ATM机器程序,并且试图将“ switch”语句放入主函数的循环内,以便用户可以获得更多的交易。

我遇到了一个我要存入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);
}

您在循环的每次迭代上递归调用main() 只需删除此呼叫,您就可以继续进行。

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

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

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

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

  3. 您将忽略所使用函数的返回值。 如果不使用指针,则应使用赋值。

  4. 您的菜单打印功能已退出循环...我怀疑这是否是您想要的。

这是一个快速的肮脏修复程序(未经测试):

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);
}

祝好运!

您尚未在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);

我认为主要问题是循环外的开关控制变量的更新。
在结尾处对“ Q”做出反应是必要的……然后只允许不需要5。
我也修复了其他几件事; 并提供了评论。
而且我将可测试性提高了一点(5-> 6)。 我将计数一直扩展到6,以便进行完整的测试“ D 100,B,W 50,B,Q”。
顺便说一句,设计不错,可以从函数中返回余额,而不是使用指针或全局变量。 但是您需要使用返回值而不是忽略它。

/* 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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM