#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
答案 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:”而不是实际排序。
此外,要排序的值按值传递给回调,因此您的修改将丢失。
(另外,初始化没有八进制前缀的日期,如在Orbit答案中的@Lightness Races)