Я пытаюсь написать программу для университета. Цель программы - составить график медсестер для больницы. Тем не менее, я действительно застрял на данный момент. Ниже вы можете найти одну функцию программы.Невозможно перезаписать вектор
Вход для функции - это список, состоящий из сдвига, который каждая медсестра должна выполнять в каждый день. В этом примере у нас есть 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 [] [] не перезаписывается во второй раз, когда я запускаю функцию, и я не знаю, как это исправить ... Любая помощь будет принята с благодарностью.
Minor Примечание: В ничтожной calculate_nbr_nurses_per_shift (вектор> roster1), вы должны пройти roster1 как сопзЬ и, вместо того, чтобы передать его по значению. –
RichardPlunkett
Вы, кажется, используете в своем коде множество глобальных переменных. Мое предположение заключается в том, что вам нужно будет «очистить» один или несколько ваших векторов перед вызовом функции с помощью этого вектора (например, 'nurses_per_shift.clear()' before' calculate_nbr_nurses_per_shift') – user1781290
Вы очищаете calculate_nbr_nurses_per_shift между вызовами, или вы должны очистить его в calculate_nbr_nurses_per_shift? Вы говорите, что он не переписывается, функция как есть, толкает все данные на конец постоянно растущего вектора. – RichardPlunkett