Clasa a X-a · Tipul structRead in English

Compararea datelor calendaristice în C++

În engleză: Comparing calendar dates

O(n²)C++1767 de linii1 exemplu

Ideea

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ă.

Descrierea în engleză

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.

Complexitate
O(n * n) cu sortarea prin selecție
Clasa
Clasa a X-a (Grade 10)

Exemple

Exemplul 1

Intrare

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

Ieșire așteptată

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

Codul C++

Codul complet, cu comentarii în română. Îl poți modifica liber și îl poți reseta oricând.

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;
}

Rulează pe un g++ adevărat (C++17, -O2) prin Compiler Explorer. Programele trebuie să se termine repede: există o limită de timp.