将YYMMDD转换为YYYYMMDD并对其进行排序

时间:2014-01-06 18:05:28

标签: c++ sorting date integer ofstream

#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,我想在YYYYMMDD中对它们进行转换并对它们进行排序,但我的算法中存在一个我无法找到的问题。

由于某种原因,文件中的排序输出如下所示:

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并对它们进行排序并以YYYYMMDD格式输出它们。但输出在某种程度上是错误的,并且由于某种原因将101转换为65.

正确的输出应该是:

19570509
19951230
20000101
20020324
20120915

2 个答案:

答案 0 :(得分: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时间戳)。

答案 1 :(得分:1)

排序时无法修改排序值。这是邪恶的。排序算法可以启动“格式C:”而不是实际排序。

此外,要排序的值按值传递给回调,因此您的修改将丢失。

  1. 处理您的调整日期列表
  2. 使用非修改回调排序
  3. (另外,初始化没有八进制前缀的日期,如在Orbit答案中的@Lightness Races)