2013-11-28 93 views
0

我在为大学写一个程序。该计划的目标是为医院制定护士时间表。不过,我现在很困难。您可以在下面找到该程序的一个功能。矢量不能被覆盖

该函数的输入是一个名册,它由每位护士每天必须执行的班次组成。在这个例子中,我们有32行(32护士)和28列(代表28天)。每个单元格包含一个从0到6的数字,表示一天休息(0)或某个班次(1到6)。

该函数应计算每一天,有多少护士安排了某个班次。例如,第一天有8名护士进行班次2,6班次3等等。该函数的输出是双向量。

我认为这个函数大部分是正确的,但是当我将它称为不同的花名册时,程序总是给出第一个花名册。

void calculate_nbr_nurses_per_shift(vector<vector<int>> roster1) 
{ 
    for (int i = 0; i < get_nbr_days(); i++) 
    { 
     vector<int> nurses_per_shift; 
     int nbr_nurses_free = 0; 
     int nbr_nurses_shift1 = 0; 
     int nbr_nurses_shift2 = 0; 
     int nbr_nurses_shift3 = 0; 
     int nbr_nurses_shift4 = 0; 
     int nbr_nurses_shift5 = 0; 
     int nbr_nurses_shift6 = 0; 

     for (int j = 0; j < get_nbr_nurses(); j++) 
     { 
      if (roster1[j][i] == 0) 
       nbr_nurses_free += 1; 
      if (roster1[j][i] == 1) 
       nbr_nurses_shift1 += 1; 
      if (roster1[j][i] == 2) 
       nbr_nurses_shift2 += 1; 
      if (roster1[j][i] == 3) 
       nbr_nurses_shift3 += 1; 
      if (roster1[j][i] == 4) 
       nbr_nurses_shift4 += 1; 
      if (roster1[j][i] == 5) 
       nbr_nurses_shift5 += 1; 
      if (roster1[j][i] == 6) 
       nbr_nurses_shift6 += 1; 
     } 

     nurses_per_shift.push_back(nbr_nurses_shift1); 
     nurses_per_shift.push_back(nbr_nurses_shift2); 
     nurses_per_shift.push_back(nbr_nurses_shift3); 
     nurses_per_shift.push_back(nbr_nurses_shift4); 
     nurses_per_shift.push_back(nbr_nurses_shift5); 
     nurses_per_shift.push_back(nbr_nurses_shift6); 
     nurses_per_shift.push_back(nbr_nurses_free); 
     nbr_nurses_per_shift_per_day.push_back(nurses_per_shift); 
    } 
} 

在这里你可以看到程序: Get_shift_assignment()和schedule_LD是其他名单。你需要充分了解这个问题

void test_schedule_function() 
{ 
    calculate_nbr_nurses_per_shift(schedule_LD); 
    calculate_nbr_nurses_per_shift(get_shift_assignment()); 
    calculate_coverage_deficit(); 
} 

还有一个功能是这一个:

void calculate_coverage_deficit() 
{ 
    int deficit = 0; 

    for (int i = 0; i < get_nbr_days(); i++) 
    { 
     vector<int> deficit_day; 

     for (int j = 0; j < get_nbr_shifts(); j++) 
     { 
      deficit = get_staffing_requirements()[j] - nbr_nurses_per_shift_per_day[i][j]; 
      deficit_day.push_back(deficit); 
     } 

     nurses_deficit.push_back(deficit_day); 
    } 

    cout << "Day 1, shift 1: there is a deficit of " << nurses_deficit[0][0] << " nurses." << endl; 
    cout << "Day 1, shift 2: there is a deficit of " << nurses_deficit[0][1] << " nurses." << endl; 
    cout << "Day 1, shift 3: there is a deficit of " << nurses_deficit[0][2] << " nurses." << endl; 
    cout << "Day 1, shift 4: there is a deficit of " << nurses_deficit[0][3] << " nurses." << endl; 
} 

所以问题是,每个我运行这个程序的时候它总是给我的第一名单中的赤字。在这种情况下,这是Schedule_LD。当我第一次运行带有输入名字get_shift_assignment()的函数时,他给我的名单上的赤字。 第二次运行函数时,nbr_nurses_per_shift_per_day [] []向量不会被覆盖,我不知道如何解决这个问题......任何帮助将不胜感激。

+0

小记:在无效calculate_nbr_nurses_per_shift(矢量> roster1),你应该通过roster1作为一个const&,而不是按值传递。 – RichardPlunkett

+2

您似乎在代码中使用了很多全局变量。我的假设是,你需要使用矢量 调用函数之前需要'clear'一个或一个以上的载体(例如:'nurses_per_shift.clear()''前calculate_nbr_nurses_per_shift') – user1781290

+1

你通话之间结算calculate_nbr_nurses_per_shift,或者你应该在calculate_nbr_nurses_per_shift中清除它? 你说,它没有收到过书面的功能就是推动所有的数据到一个稳步增长的矢量结束。 – RichardPlunkett

回答

1

让我试着总结意见:

通过使用全局变量再次调用函数之前返回从函数的值是非常有可能的,你忘了从一个或多个全局变量的删除旧结果。

为了解决这个问题,请从函数返回结果。

例:

vector<vector<int>> calculate_nbr_nurses_per_shift(vector<vector<int>> roster1) 
{ 
    vector<int> nbr_nurses_per_shift_per_day; // Create the result vector 

    ... // Do your calculations 

    return nbr_nurses_per_shift_per_day; 
} 

,或者如果你不想返回一个向量:

void calculate_nbr_nurses_per_shift(vector<vector<int>> roster1, vector<vector<int>> nbr_nurses_per_shift_per_day) 
{ 

    ... // Do your calculations 

} 

但显然,第一种变体少了很多容易出错(在第二个例子中,你可以忘记再次清除nbr_of_nurses),大多数编译器会优化return nbr_nurses_per_shift_per_day,所以整个向量不会被复制。

第二个可能的问题是'get_nbr_days()'可能会返回大于或小于矢量实际大小的数字。要解决此问题,请使用vectorsize()方法或使用迭代器代替。然后

你的第一个功能是这样的:

vector<vector<int>> calculate_nbr_nurses_per_shift(vector<vector<int>> roster1) 
{ 
    vector<vector<int>> nbr_nurses_per_shift_per_day; 
    for (vector<vector<int>>::iterator shiftsOnDay = roster1.begin(); shiftsOnDay != roster1.end(); ++shiftsOnDay) 
    { 
    vector<int> nurses_per_shift(6, 0); // Create vector with 6 elements initialized to 0 
    for (vector<int>::iterator shift = shiftsOnDay->begin(); shift != shiftsOnDay->end(); ++shift) 
    { 
     if (*shift == 0) 
     nurses_per_shift[5]++; 
     else 
     nurses_per_shift[*shift - 1]++; // This code relies on shift only containing meaningful values 
    } 
    nbr_nurses_per_shift_per_day.push_back(nurses_per_shift); 
    } 
    return nbr_nurses_per_shift_per_day; 
} 
+0

哇,我在这么短的时间内从未想到会有如此多的回答:)非常感谢大家。感谢你,我知道我做错了什么,现在问题已解决。 这并不是说我不知道​​如何编写返回值的函数,但我确实是新来的C++。我们没有任何关于如何开始编程和C++的教训,我们应该自己学习。这就是为什么像这样的网站和像你这样的人都很赞赏。再次感谢你的大力帮助:) – user3045981