2014-01-06 23 views
0
#include <iostream>  // std::cout 
#include <cstdlib> 
#include <climits> 
#include <algorithm> 
#include <cmath> 
#include <fstream> 

using namespace std; 

struct student{ 
    int ID;   // ID 
    string firstname; // first name 
    string lastname; // last name 
    int date;   // YYMMDD 

    static bool sort_date(student a, student b){ 
     if(a.date < 150000){ 
      a.date += 20000000; 
     } 
     else{ 
      a.date += 19000000; 
     } 
     if(b.date < 150000){ 
      b.date += 20000000; 
     } 
     else{ 
      b.date += 19000000; 
     } 
     return data1 < data2; 
    } 

}; 

int main(){ 

    student students[5]; 

    students[0].date = 000101; 
    students[1].date = 951230; 
    students[2].date = 570509; 
    students[3].date = 120915; 
    students[4].date = 020324; 

    stable_sort(students, students + 5, student::sort_date); 

    ofstream file; 
    file.open("sort_date.txt"); 
    for(int i = 0; i < 5; i++){ 
     file << students[i].date << endl; 
    } 

    return 0; 
} 

這是我的計劃,我有格式YYMMDD日期,我想將它們轉換成年月日和排序,但在我的算法有問題,我無法找到。轉換YYMMDD到年月日和排序他們

出於某種原因,在文件中的有序輸出看起來是這樣的:

570509 
951230 
65 
8404 
120915 

我想我的程序,首先,採取日期:

students[0].date = 000101; 
students[1].date = 951230; 
students[2].date = 570509; 
students[3].date = 120915; 
students[4].date = 020324; 

然後將它們轉換爲年月日和排序他們並以YYYYMMDD格式輸出它們。但輸出不知何故,出於某種原因將101轉換爲65。

正確的輸出應爲:

19570509 
19951230 
20000101 
20020324 
20120915 
+2

如果您重新閱讀上一個問題的答案,您會看到'000101'是一個八進制數。這與十進制的「65」相同。這似乎是您的代碼的問題之一。 – juanchopanza

+0

@juanchopanza但是,當您將000101轉換爲YYYYMMDD時,它變成了20000101,它仍然是八進制數? – user2943407

+0

但是你不會像那樣轉換它。你把它轉換成'20000065'。而且您不會更改數組中的數據,因此您將以舊格式打印日期。 – juanchopanza

回答

1

字面000101整數被解釋爲十進制65的八進制表示,因爲前導零的。

文字是在您的源代碼中寫出的數字。這不包括文件中的字符或用戶輸入到I/O流中的字符。

任何整數文字開始0是一個八進制整數文字。

要堅持十進制文字,不要使用前導零

students[0].date = 101; 
students[1].date = 951230; 
students[2].date = 570509; 
students[3].date = 120915; 
students[4].date = 20324; 

如上所述,這是一種奇怪的方式做人類可讀的日期(通常你會使用這個字符串,並保留整數存儲一些內部表示,如UNIX時間戳) 。

+0

如果用戶輸入的年份是2000-2009(從0開始),那麼如何避免使用前導零? – user2943407

+0

@ user2943407:用戶輸入的內容無關緊要用戶輸入不是字面意思。文字是你在源代碼中編寫的數字,I/O流沒有這個規則,即:'stringstream ss(「0101」); int x; ss >> x; c out << x;'產生'101'。 –

+0

我明白了。如果我要使用一個字符串,你能否給我一個例子,它會如何工作?提前致謝。 – user2943407

1

排序時不能修改排序值。這是邪惡的。排序算法可能會啓動「格式C:」,而不是實際排序。

除此之外,排序的值通過值傳遞給回調函數,因此您的修改將丟失。

  1. 處理您的調整日期列表
  2. 排序與非修飾回調

(也,初始化日期,而不八進制前綴,如@Lightness種族在軌道的答案)

+0

他沒有修改它們。正如你所說,因爲他以價值取勝。它看起來是故意給我的 - 他正在執行的僞詞彙轉換僅用於訂購目的。話雖如此,之前我還沒有發現,他還是需要新的邏輯來重新應用這種轉換。 –

+0

他想要一個「正確的輸出」與「19570509」,所以他認爲修改將留下。無論如何,我真的不喜歡在排序時改變值的想法。做一定的方式,它是UB,恕我直言。 – manuell

+0

當然!標準命令「Compare」不會修改其參數。在排序過程中修改是錯誤的。 –