结构,函数和数组

时间:2013-12-14 18:38:28

标签: c++ arrays function pointers structure

计划详情:程序将显示有4个选项的菜单

  1. 新入学的学生
  2. 编辑学生详细信息
  3. 更新详情
  4. 显示所有学生的列表
  5. 如果注册人数超过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;
    }
    
    1. 请告诉我如何使用具有多个数据功能的结构。
    2. 我刚刚编写了我的第一个选项注册的代码剩余,请回答我的上述问题提前致谢

3 个答案:

答案 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) { // ...