2013-11-28 4 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

Minor Примечание: В ничтожной calculate_nbr_nurses_per_shift (вектор > roster1), вы должны пройти roster1 как сопзЬ и, вместо того, чтобы передать его по значению. – RichardPlunkett

+2

Вы, кажется, используете в своем коде множество глобальных переменных. Мое предположение заключается в том, что вам нужно будет «очистить» один или несколько ваших векторов перед вызовом функции с помощью этого вектора (например, 'nurses_per_shift.clear()' before' calculate_nbr_nurses_per_shift') – user1781290

+1

Вы очищаете calculate_nbr_nurses_per_shift между вызовами, или вы должны очистить его в calculate_nbr_nurses_per_shift? Вы говорите, что он не переписывается, функция как есть, толкает все данные на конец постоянно растущего вектора. – RichardPlunkett

ответ

1

Позвольте мне попытаться суммировать комментарии:

При использовании глобальных переменных для возврата значений из ваших функций, весьма вероятно, что вы забыли удалить старые результаты из одного или нескольких из ваших глобальных переменных перед повторным вызовом функции ,

Чтобы обойти это, верните полученные результаты из функции.

Ex:

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() 'может возвращать числа, которые больше или меньше фактического размера вашего вектора. Чтобы обойти это, используйте либо метод size()vector, либо вместо него используйте итераторы.

Ваша первая функция будет выглядеть следующим образом:

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

Смежные вопросы