我是一名学生,正在学习 C++。去年我为我的 skul 做了一个简单的项目,现在我意识到为了让它对用户友好,我从一个函数到另一个函数进行了多次调用,而不考虑堆栈和它会导致的内存泄漏。基本上,它是一个学生数据库管理系统,我做了一个功能对应一个屏幕,即一个菜单功能,一个添加数据,修改数据等。代码很大,所以我粘贴了一小部分。只需观察我如何首先从 menu() 调用 add1(),然后再从 add1() 调用 menu() ...
`//***************************STUDENT DATABASE***********************************
void add1(){
system("CLS");
char ch;
int i=no;
do{
i++;
cout<<"\nName : ";
cin.ignore ( std::numeric_limits<std::streamsize>::max(), '\n' );
getline (cin,s[i].name);
cout<<"\nClass : ";
cin>>s[i].cl;
cout<<"\nRollno : ";
cin>>s[i].rollno;
cout<<"\nMarks in";
s[i].m.avg=0;
for(int j=0;j<maxsb;j++)
{
cout<<"\n"<<subject[j]<<": ";
cin>>s[i].m.s[j];
s[i].m.avg+=(s[i].m.s[j]/maxsb);
}
no=i;
cout<<"\nPress 'n' for next and 'b' to exit : ";
cin>>ch;
cout<<"\n***********************************************************************";
}while(ch=='n');
menu(); //calling menu() again from this function...
}
//*************
void menu(){
system("CLS");
int n,flag=0;
do
{
cout<<"1.ADD DATA\n2.VIEW REPORT\n3.MODIFY DATA\n4.DELETE DATA\n5.SORT DATA\n6.GO BACK TO PREVIOUS MENU\n";
cout<<"PLEASE ENTER YOUR CHOICE(enter corresponding integer): ";
cin>>n;
switch(n)
{ case 2: report();break;
case 1: add1();break;
case 3: modify();break;
case 4: del();break;
case 5: sort();break;
case 6: first();
default:cout<<"PLEASE ENTER A VALID CHOICE";system("CLS");flag=1;
}
}
while(flag==1);
}
//**************
void first()
{
system("CLS");
int n,flag=0;
cout<<"\t\t\tSoftware for Teachers";
cout<<"\n\n1.Student Database\n\n2.Play Game\n\n3.Calculator";
cout<<"\n\nEnter your choice: ";
do{
flag=0;
cin>>n;
switch(n)
{
case 1:{ if(flag2==0)
{ setting();
flag2=1;
}
menu(); }
break;
case 2: game();
break;
// case 3: calculator();
// break;
default: cout<<"\nPlz enter a valid choice \n\n Enter your choice again: ";flag=1;
}
}
while(flag);
}
//******************************************************************************
int main()
{
int temp;
first();
cin>>temp;
}
`
这种从一个函数跳转到另一个函数然后再不返回的情况在我的代码中已经完成了好几次,我现在意识到,这会杀死堆栈。我用谷歌搜索了很多,我知道首先它不可能以一种方式随机跳转一个函数到另一个函数并将所有内容组合在一个函数中并使用 goto 从一个块跳转到另一个块不是一个好主意(实际上更糟!)。所以,我的问题是,有没有更好的方法可以完成这项任务?(这意味着我在上面的代码中试图做的事情,即这个程序的用户友好性)
谢谢