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