Конвертировать YYMMDD в YYYYMMDD и отсортировать их

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, и я хочу конвертировать их в 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
    Если вы перечитаете ответы на свой предыдущий вопрос, вы увидите, что 000101 является восьмеричным числом. Это так же, как 65 в десятичном виде. Кажется, это одна из проблем с вашим кодом.
  • 0
    @juanchopanza Но когда вы конвертируете 000101 в ГГГГММДД, оно становится 20000101, что по-прежнему является восьмеричным числом?
Показать ещё 11 комментариев
Теги:
sorting
date
integer
ofstream

2 ответа

1
Лучший ответ

Целочисленный литерал 000101 интерпретируется как восьмеричное представление десятичного числа 65 из-за нулевого лидера.

Литерал - это номер, записанный в вашем исходном коде. Это не включает символы в файл или символы, введенные пользователем в поток ввода-вывода.

Любое целое числовое начало 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)?
  • 0
    @ user2943407: Неважно, что вводит пользователь. Пользовательский ввод не является литералом. Литералы - это числа, которые вы пишете в исходном коде. Потоки ввода / вывода не имеют этого правила; то есть: stringstream ss("0101"); int x; ss >> x; cout << x; результаты в 101 .
Показать ещё 4 комментария
1

Вы не можете изменять отсортированные значения при сортировке. Это зло. Алгоритм сортировки может запускать "формат C:" вместо фактической сортировки.

Кроме того, значения для сортировки передаются по значению для обратного вызова, поэтому ваши изменения теряются.

  1. Обработайте свой список дат для корректировок
  2. Сортировка с изменением обратного вызова

(также, инициализируйте свои даты без восьмеричного префикса, как в @Lightness Races in Orbit)

  • 0
    Он не изменяет их. Потому что, как вы говорите, он принимает по стоимости. Для меня это выглядит преднамеренно - псевдолексическое преобразование, которое он выполняет, только для целей заказа. Это , как говорится, и я не заметил этого раньше, он будет нуждаться в новой логике повторно применить , что преобразование для вывода.
  • 0
    Он хочет «правильного вывода» с «19570509», поэтому он считает, что модификации останутся. Во всяком случае, мне действительно не нравится идея изменения значений при сортировке. Делай это определенным образом, и это УБ, ИМХО.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню