计划详情:程序将显示有4个选项的菜单
如果注册人数超过45,则应该给出一条消息。应该使用结构和功能。单独的注册,编辑和更新功能,所以继续。我对我写的代码有疑问。我对如何使用具有功能的结构感到困惑。我不知道我是对还是错。如何在这种情况下使用指针??
我的更新代码,但仍然提供奇怪的输出,如何在我们存储多个数据时使用带指针的函数,如此代码中的数据数据[45]。
#include <iostream>
#include <cctype>
#include <cstring>
using namespace std;
struct Date{
int day;
int month;
int year;
};
struct Data{
int id;
char firstName[20];
char lastName[20];
float PrimaryMarks;
float secondaryMarks;
Date date;
};
void enrollment(Data *dtai){
static int i=0;
if(i<45){
dtai->id=i+1;
cout<<"Enter the student's First Name"<<endl;
cin>>dtai->firstName;
cout<<"Enter the student's Last Name"<<endl;
cin>>dtai->lastName;
cout<<"Enter the student's Primary School Percentage"<<endl;
cin>>dtai->PrimaryMarks;
cout<<"Enter the student's Secondary School Percentage"<<endl;
cin>>dtai->secondaryMarks;
cout<<"Enter the day of enrollment"<<endl;
cin>>dtai->date.day;
cout<<"Enter the month of enrollment"<<endl;
cin>>dtai->date.month;
cout<<"Enter the year of enrollment"<<endl;
cin>>dtai->date.year;
}
i++;
}
int main(){
//taking students information menu display
Data data[45];
//int i=0;
int option;
char sentinal;
do{
int x=0;
//display menu
cout<<"Press 1 for New Enrollment"<<endl;
cout<<"Press 2 for editing student's detail"<<endl;
cout<<"Press 3 for updating student's detail"<<endl;
cout<<"Press 4 to see list of students"<<endl;
cin>>option;
switch(option){
case 1:
enrollment(&data[x]);
break;
case 2:
case 4:
}
cout<<"Press m to go to the menu again ";
cin>>sentinal;
}while(sentinal=='m');
return 0;
}
我刚刚编写了我的第一个选项注册的代码剩余,请回答我的上述问题提前致谢
答案 0 :(得分:2)
要使用具有函数的结构,请稍微更改该函数,以便它接收参数:
void enrollment(Data& data_to_fill)
{
...
cin>>data_to_fill.firstName;
...
}
然后,在调用函数时发送参数:
enrollment(data[i]);
或者,使用返回值而不是参数:
Data enrollment()
{
Data data_to_fill;
...
cin>>data_to_fill.firstName;
...
return data_to_fill;
}
...
data[i] = enrollment();
我不知道选择哪种方式,可能很难推荐其中一种方法。第一种方法使用你可能不熟悉的传递引用技术 - 所以你可能想要使用第二种方式。
但是,如果出现错误(超过45个注册),该函数可能应该返回错误代码。第一种方式可能更符合此要求。
回答你的其他问题:
我已全球宣布
这被认为是糟糕的风格。在main()
函数中将其声明为本地。
如何链接两个结构,日期和数据
就像您在代码中所做的那样:struct Data {Date date;}
是否会使用指针?
这里你不需要指针。
我是否正确使用了函数中的静态变量?
几乎正确 - 只需添加++i
即可计算注册人数。
答案 1 :(得分:1)
拥有全局声明的结构(data[45]
)是实现它的一种方式。修改全局变量的函数并不是一个好主意(在开发过程中,你最终可能会忘记在其他函数中发生的全局变量修改)。如果必须使用全局变量,请考虑通过命名约定使其明显为全局 - 例如gdata[45]
。
为了避免全局声明,请在main中声明它并将指针传递给注册函数。实际上,让学生计数器在main中递增,并将指针传递给数据结构数组的元素会不会更有意义?
void enrollment(Data *mydatai){
/* stuff */
cin>>mydatai->firstName;
/* more stuff */
}
int main(){
/* stuff */
Data data[45];
int i = 0;
do {
/* other stuff */
switch(option){
case 1:
enrollment(&data[i]);
/* other cases */
} // switch end
} while (some_condition);
}
Date
结构体在Data
结构体内的方式很好 - 但这并不意味着它必然是你想要的。
答案 2 :(得分:0)
要将单个数据结构传递到您的注册功能,您需要编写
void enrollment(Data& data) {
// ...
}
并将其命名为
enrollment(data[i]);
来自你的主循环。
要传递整个struct数组,您可以使用固定大小
void enrollment(Data data[45]) { // ...
或动态调整大小
void enrollment(Data* data, std::size_t maxRecords) { // ...