c - 如何从另一个函数返回值
问题描述
我正在尝试创建一个 ATM 银行系统,该系统具有存款、取款、检查余额等选项。起初我保持了一个固定的余额值。然后使该余额通过提款,存款功能。但是当我检查我的余额时,它最初显示的是相同的固定值,它没有更新。当我尝试退出该函数时,我首先使用 mainmenu(),但如果我用返回余额替换它。我的代码无法正常工作。我的错误在哪里,我能做些什么来解决它。这是我的代码:
void mainmenu()
{
int option, choose, balance = 10000;
printf("PRESS < 1 > CHECK BALANCE\n");
printf("PRESS < 2 > DEPOSIT\n");
printf("PRESS < 3 > WITHDRAW\n");
printf("PRESS < 4 > SEMESTER FEE\n");
printf("CHOOSE AN OPTION: ");
scanf("%d", &option);
switch (option)
{
case 1:
checkBalance(balance);
break;
case 2:
moneyDeposit(balance);
break;
case 3:
moneyWithdraw(balance);
break;
default:
printf("WRONG INPUT. PLEASE PRESS ANY KEY AND ENTER TO TRY AGAIN....");
char option[10];
scanf("%s", &option);
mainmenu();
}
void checkBalance(float balance)
{
printf("YOU CHOOSE TO SEE YOUR BALANCE\n");
printf("****YOUR AVAILABLE BALANCE IS: $%.2f\n", balance);
}
float moneyDeposit(float balance)
{
system("cls");
float deposit;
gotoxy(28, 2);
printf("YOU CHOOSE TO DEPOSIT MONEY\n");
gotoxy(22, 4);
printf("$$$$YOUR BALANCE IS: $%.2f\n\n", balance);
gotoxy(22, 7);
printf("****ENTER YOUR AMOUNT TO DEPOSIT: ");
scanf("%f", &deposit);
balance += deposit;
printf("****YOUR NEW BALANCE IS: $%.2f\n\n", balance);
printf("WOULD YOU LIKE TO DO ANOTHER TRANSACTION:\n");
gotoxy(17, 14);
printf("< 1 > YES\n");
gotoxy(17, 16);
printf("< 2 > NO\n");
int option;
do
{
gotoxy(10, 18);
printf("PLEASE CHOOSE YOUR OPTIONS...");
scanf("%d", &option);
if (option == 1)
{
mainmenu;
}
else if(option == 2)
{
menuExit();
}
else
{
printf("INVALID INPUT. PLEASE PRESS ANY KEY AND ENTER TO TRY AGAIN");
char choose[10];
scanf("%s", &choose);
}
} while (option > 2);
}
loat moneyWithdraw(float balance)
{
float withdraw;
gotoxy(28, 2);
printf("YOU CHOOSE TO WITHDRAW MONEY\n");
gotoxy(22, 4);
printf("$$$$YOUR BALANCE IS: $%.2f\n\n", balance);
gotoxy(22, 6);
printf("ENTER YOUR AMOUNT TO WITHDRAW:");
scanf("%f", &withdraw);
if (withdraw <= balance)
{
balance -= withdraw;
gotoxy(28, 9);
printf("$$$$YOUR WITHDRAWING MONEY IS: $%.2f\n", withdraw);
gotoxy(28, 11);
printf("****YOUR NEW BALANCE IS: $%.2f\n\n", balance);
}
else
{
gotoxy(28, 9);
printf("+++YOU DON'T HAVE ENOUGH MONEY+++\n");
gotoxy(28, 11);
printf("****YOUR CURRENT BALANCE IS: $%.2f\n\n", balance);
gotoxy(28, 13);
printf("PLEASE DEPOSIT MONEY\n");
}
gotoxy(17, 16);
printf("WOULD YOU LIKE TO DO ANOTHER TRANSACTION:\n");
gotoxy(17, 18);
printf("< 1 > YES\n");
gotoxy(17, 20);
printf("< 2 > NO\n");
int option;
do
{
gotoxy(10, 22);
printf("PLEASE CHOOSE YOUR OPTIONS...");
scanf("%d", &option);
if (option == 1)
{
mainmenu();
}
else if(option == 2)
{
menuExit();
}
else
{
printf("INVALID INPUT. PLEASE PRESS ANY KEY AND ENTER TO TRY AGAIN");
char choose[10];
scanf("%s", &choose);
}
} while (option > 2);
}
解决方案
当您将变量作为参数传递给函数时,该变量被复制,因此您对变量的副本进行操作,当balance
您从函数返回时,该副本被释放。
要解决这个问题,您需要将指针传递给变量:
void moneyDeposit(float *balance){ // `*` indicates it is a pointer to a float
...
*balance += deposit; // with `*` you refer to a value under the pointer rather than to the pointer itself (equivalent of `balance[0]`)
}
moneyDeposit(&balance); // `&` gets an address of the variable
...或返回更改后的值并将其分配回变量:
float moneyDeposit(float balance){
...
return balance + deposit;
}
balance = moneyDeposit(balance);
推荐阅读
- php - PHP - 缩短运行来自不同服务器的表的查询的时间
- python - Python np.arange 奇怪的行为
- java - 泛型的番石榴缓存错误
- cmake - 如何用cmake进行条件变量赋值?
- python - 连接后熊猫排序和重新索引
- eclipse-rcptt - 在 rcptt 中右键单击无法重播
- c# - 使用 RouteDataRequestCultureProvider 处理 ASP.NET Core 错误
- javascript - jQuery | 从多个具有特定文本的跨度中选择类
- java - 为什么使用 Mockito 进行 JUnit 测试而不定义“何时”方法?
- c# - C#应用程序和USB设备之间的USB速度测试