该计划的目的是一个银行帐户界面,用户可以在其中创建4个帐户,并可以在它们之间转移资金。我选择了一系列结构来处理“银行账户”信息,以及一个处理用户选项的开关。
问题:
帐户创建功能(在“a”中调用)似乎可以按预期创建帐户,并正确显示它们。但是,其他情况下的结果并不如设计的那样。
案例'b'将显示输入的数组信息,仅如果没有调用任何内容(包括显示数组信息的函数),否则当调用display()时它会打印零(什么)它在帐户创建之前被初始化。)
如果没有调用任何内容,情况'c'将显示输入的数组信息,以及仅调用显示日期/时间的函数。否则它会打印零。
问题:
为什么在调用显示函数时结构数组显示为零,但是在没有调用时会显示用户输入,只要没有其他内容(除了'c'中的时间函数除外),以及什么可以我想解决它吗?
注意:
我转换了帐户创建函数,以返回指向希望可能有所帮助的结构的指针,它似乎没有改变任何东西。我将switch语句转换为一系列if,以查看是否会改变任何东西,它没有(反转回切换)。案例'd'和案例默认按预期工作。该程序未完成(我的转移()未写入)。我知道“使用namespace std;”是一个nono。
感谢您的时间和任何建议。
#include <iostream>
#include <ctime>
const int SIZE = 4;
using namespace std;
struct bank //Bank Account Structure to hold account numbers and balances
{
int num; // number of account
int checkdigit; // ending account number checkdigit appended to account number
float bal; // balance of account
};
void menu(); //MenuPrompt
bank* input(bank[]); // Struct Account Input
void display(bank[]); // Struct Account Display
void initialize(bank[]); // Struct Account Initialization
char transferprompt(bank s[]); // Transfer Menu
int createaccounts(); //Create Account Numbers and Balances
void time(); //Displays the Current date, month, year, and time.
void clearscreen(); //Prints 40lines to clear the screen
int main()
{
bank accounts[SIZE]; // Array of bank-account structs
initialize(accounts); // Removes garbage values
char select; //User input variable
bank *ptr;
ptr = &accounts[0];
menu(); //Runs MenuPrompt
cin >> select; //Grabs user input
select = static_cast<char>( tolower( select ) ); //Ensures user input is lowercase (for switch statement)
clearscreen();
switch ( select )
{
case 'a': //Creates Accounts
input(accounts);
clearscreen();
main();
display(accounts);
break;
case 'b': //Transfers between accounts
//display(accounts);
transferprompt(accounts);
//main();
break;
case 'c': //Displays day, month, year, time, + Account Information.
time();
break;
case 'd': //Exits Program
break;
default: //Invalid Input failsafe; Restarts menu prompt.
cout<<"Invalid selection. Restarting...\n";
main();
break;
}
}
char transferprompt(bank s[])
{
}
bank* input(bank s[]) // Creates Bank Accounts
{
bank accounts[SIZE]; // Array of bank-account structs
bank *ptr; // Pointer to struct
ptr = &accounts[0]; // Points pointer to array of bank-account structs
cout << "Account Creation Selected; Create " << SIZE << " accounts..." << endl;
for (int i = 0; i < SIZE ; i++)
{
cout << "Enter Account Number: ";
cin >> s[i].num;
s[i].checkdigit = s[i].num % 5;
cout << "Enter Account Balance: ";
cin >> s[i].bal;
}
return ptr;
}
void display(bank s[]) //Displays Bank Accounts
{
for (int i = 0; i < 4; i++)
{
cout << "Account: " << s[i].num << s[i].checkdigit;
cout << " has balance: $" << s[i].bal << endl;
}
}
void initialize(bank s[]) // Removes Garbage values
{
for (int i = 0; i < 4; i++)
{
s[i].num = 0;
s[i].checkdigit = 0;
s[i].bal = 0;
}
}
void clearscreen() // Clears screen
{
cout << string(40, '\n');
}
void time() // Display Time function
{
time_t t = time(NULL);
tm* ptr = localtime(&t); // ptr = Pointer to compute time
cout << endl;
cout << endl;
cout << "Date: " << (ptr->tm_mon)+1 <<"/"<< (ptr->tm_mday)<< "/" << (ptr->tm_year)+1900 << endl;
cout << "Time: " << (ptr->tm_hour) <<":"<< (ptr->tm_min)<< ":" << (ptr->tm_sec) << endl;
}
void menu() // Menu Prompt
{
cout << "Parkville Bank Client Program; Edit your accounts:\n";
cout << "a. Create " <<SIZE<<" accounts\n";
cout << "b. Transfer money from 1 account to another\n";
cout << "c. Display account balances\n";
cout << "d. Quit the program\n\n";
}
答案 0 :(得分:1)
此功能不正确:
bank* input(bank s[]) // Creates Bank Accounts
{
bank accounts[SIZE]; // Array of bank-account structs
bank *ptr; // Pointer to struct
ptr = &accounts[0]; // Points pointer to array of bank-account structs
// ... lines removed ...
return ptr; // <-- Undefined behavior
}
您正在返回指向局部变量/数组的指针。返回指针或对局部变量的引用是未定义的行为。原因在于,由于数组是本地的,一旦函数返回,它就不再存在逻辑上。所以你最终指向一个不存在的实体。
你可能想要做的是这样的事情:
bank* input(bank* s) // Creates Bank Accounts
{
cout << "Account Creation Selected; Create " << SIZE << " accounts..." << endl;
for (int i = 0; i < SIZE ; i++)
{
cout << "Enter Account Number: ";
cin >> s[i].num;
s[i].checkdigit = s[i].num % 5;
cout << "Enter Account Balance: ";
cin >> s[i].bal;
}
return &s[0];
}
自传入s
以来,您可能想要传递此实体的第一个元素的地址。另请注意:
bank* input(bank s[]) // Creates Bank Accounts
与此无异:
bank* input(bank* s) // Creates Bank Accounts
当数组衰减为指针。
我真的建议您使用std::vector
等容器而不是原始数组和全局常量来跟踪实体数量(例如SIZE
)。然后
您的程序的另一个问题是您递归调用main
。不要这样做,因为它不是合法的C ++。相反,请使用正确的循环结构,例如while()
和do-while()
。