#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
Целочисленный литерал 000101
интерпретируется как восьмеричное представление десятичного числа 65
из-за нулевого лидера.
Литерал - это номер, записанный в вашем исходном коде. Это не включает символы в файл или символы, введенные пользователем в поток ввода-вывода.
Любое целое числовое начало 0
- это восьмеричный целочисленный литерал.
Чтобы придерживаться десятичных литералов, не используйте начальные нули.
students[0].date = 101;
students[1].date = 951230;
students[2].date = 570509;
students[3].date = 120915;
students[4].date = 20324;
Как обсуждалось выше, это довольно странный способ делать человекочитаемые даты (как правило, для этого вы должны использовать строку и оставить целочисленное хранилище для некоторого внутреннего представления, такого как временная метка UNIX).
stringstream ss("0101"); int x; ss >> x; cout << x;
результаты в 101
.
Вы не можете изменять отсортированные значения при сортировке. Это зло. Алгоритм сортировки может запускать "формат C:" вместо фактической сортировки.
Кроме того, значения для сортировки передаются по значению для обратного вызова, поэтому ваши изменения теряются.
(также, инициализируйте свои даты без восьмеричного префикса, как в @Lightness Races in Orbit)
000101
является восьмеричным числом. Это так же, как65
в десятичном виде. Кажется, это одна из проблем с вашим кодом.