Grade 10 · The struct typeCitește în română
Comparing calendar dates
Original: Compararea datelor calendaristice
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)
- Chapter
- The struct type
Examples
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.
/*
* 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.