【发布时间】:2013-12-14 13:43:27
【问题描述】:
我正在努力编写大学计划。该计划的目标是为医院制定护士时间表。但是,我真的被困在此刻。下面可以找到程序的一个功能。
该函数的输入是一个名册,其中包含每个护士每天必须执行的轮班。在这个例子中,我们有 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_shive_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[][] 向量在我第二次运行该函数时没有被覆盖,我不知道如何解决这个问题......任何帮助将不胜感激。
【问题讨论】:
-
次要注意:在 void calculate_nbr_nurses_per_shift(vector
> roster1) 中,您应该将 roster1 作为 const& 传递,而不是按值传递。 -
您的代码中似乎使用了很多全局变量。我的假设是,在使用该向量调用函数之前,您需要
clear一个或多个向量(例如,nurses_per_shift.clear()在calculate_nbr_nurses_per_shift之前) -
您是在两次通话之间清除calculate_nbr_nurses_per_shift,还是应该在calculate_nbr_nurses_per_shift 中清除它?你说它没有被覆盖,函数原样将所有数据推到一个稳定增长的向量的末端。
-
正如@RichardPlunkett 所说,您将新数据添加到向量的end,并且您只从开始 读取数据,所以你只需要看看是第一个花名册。
-
@user1781290 更好的是实际从函数返回向量,而不是为此依赖全局变量。很明显,thr OP 错过了编写返回值的函数的课程(对于新手来说这很常见)。
标签: c++ vector scheduling overwrite