Grade 10 · The struct typeCitește în română

Comparing calendar dates

Original: Compararea datelor calendaristice

O(n²)C++1767 lines1 example

The idea

A calendar date has three fields: day, month, year. Two dates are compared first by year, with equal years by month, and with equal months by day; the function maiDevreme(d1, d2) applies exactly this rule. Another idea is to turn the date into the number year * 10000 + month * 100 + day, which keeps the order. n dates are read and printed in chronological order.

Original description (Romanian)

O dată calendaristică are trei câmpuri: zi, luna, an. Două date se compară întâi după an, la ani egali după lună, iar la luni egale după zi; funcția maiDevreme(d1, d2) aplică exact această regulă. O altă idee este să transformăm data în numărul an * 10000 + luna * 100 + zi, care păstrează ordinea. Se citesc n date și se afișează în ordine cronologică.

Complexity
O(n * n) with selection sort
Grade
Grade 10 (Clasa a X-a)

Examples

Example 1

Input

4
15 3 2024
1 12 2023
15 1 2024
2 3 2024

Expected output

1 12 2023
15 1 2024
2 3 2024
15 3 2024

The code

Comments are in Romanian, as in the original collection. Edit freely: you can reset at any time.

date-calendaristice.cpp
/*
 * Titlu: Compararea datelor calendaristice
 * Clasa: 10
 * Capitol: Tipul struct
 * Descriere: O dată calendaristică are trei câmpuri: zi, luna, an. Două date se
 *            compară întâi după an, la ani egali după lună, iar la luni egale după
 *            zi; funcția maiDevreme(d1, d2) aplică exact această regulă. O altă
 *            idee este să transformăm data în numărul an * 10000 + luna * 100 + zi,
 *            care păstrează ordinea. Se citesc n date și se afișează în ordine
 *            cronologică.
 * Complexitate: O(n * n) cu sortarea prin selecție
 *
 * Exemplu
 * Intrare:
 * 4
 * 15 3 2024
 * 1 12 2023
 * 15 1 2024
 * 2 3 2024
 * Ieșire:
 * 1 12 2023
 * 15 1 2024
 * 2 3 2024
 * 15 3 2024
 */
#include <iostream>
using namespace std;

struct Data
{
    int zi, luna, an;
};

Data d[1000];

bool maiDevreme(Data a, Data b)
{
    if (a.an != b.an)
        return a.an < b.an;
    if (a.luna != b.luna)
        return a.luna < b.luna;
    return a.zi < b.zi;
}

int main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> d[i].zi >> d[i].luna >> d[i].an;

    for (int i = 0; i < n - 1; i++)
    {
        int pozMin = i;
        for (int j = i + 1; j < n; j++)
            if (maiDevreme(d[j], d[pozMin]))
                pozMin = j;
        Data aux = d[i];
        d[i] = d[pozMin];
        d[pozMin] = aux;
    }

    for (int i = 0; i < n; i++)
        cout << d[i].zi << ' ' << d[i].luna << ' ' << d[i].an << '\n';
    return 0;
}

Runs on a real g++ (C++17, -O2) through Compiler Explorer. Keep runs short; there's a time limit.