Sortiranje datuma
U datoteci se nalaze datumi oblika DD.MM.YYYY. Učitati sve datume u niz struktura, sortirati ih rastuće, i ispisati sortiranu listu datuma u istom formatu.
Ulaz
Program se pokreće komandnom linijom:
./sortdates <putanja>
Ulazni fajl sadrži nepoznat broj datuma razdvojenih belinama.
Izlaz
Na standardni izlaz ispisati sve datume sortirane rastuce u formatu DD.MM.YYYY (po dve cifre za dan/mesec, i četiri cifre za godinu).
Greške:
- Pogrešan broj argumenata:
Error: Invalid number of arguments.nastderr. - Neuspeh otvaranja fajla:
Error: Could not open file <putanja>nastderr. - Ako nema datuma:
Error: No data.nastderr. - U slučaju greške, program treba da se završi sa statusom greške
1.
Primer
datumi.txt
01.01.2020 31.12.2019 15.07.2020
command line
./sortdates datumi.txt
stdout
31.12.2019
01.01.2020
15.07.2020
Primer
command line
./sortdates
stderr
Error: Invalid number of arguments.
Primer
datumi.txt
command line
./sortdates datumi.txt
stderr
Error: No data.
Primer
command line
./sortdates nepostojeci.txt
stderr
Error: Could not open file nepostojeci.txt.
Rešenje
main.c
#include <stdio.h>
#include <stdlib.h>
#define INITIAL_CAPACITY 16
typedef struct {
int day;
int month;
int year;
} Date;
static int cmp_date(const void *a, const void *b)
{
const Date *date_a = a;
const Date *date_b = b;
if (date_a->year != date_b->year) {
return date_a->year - date_b->year;
}
if (date_a->month != date_b->month) {
return date_a->month - date_b->month;
}
return date_a->day - date_b->day;
}
int main(int argc, char *argv[])
{
if (argc != 2) {
fprintf(stderr, "Error: Invalid number of arguments.\n");
exit(EXIT_FAILURE);
}
FILE *file = fopen(argv[1], "r");
if (!file) {
fprintf(stderr, "Error: Could not open file %s\n", argv[1]);
exit(EXIT_FAILURE);
}
size_t cap = INITIAL_CAPACITY, n = 0;
Date *arr = malloc(cap * sizeof (Date));
if (!arr) {
fclose(file);
exit(EXIT_FAILURE);
}
Date date;
while (fscanf(file, "%2d.%2d.%4d", &date.day, &date.month, &date.year) == 3) {
if (n == cap) {
cap *= 2;
Date *new_arr = realloc(arr, cap * sizeof(Date));
if (new_arr == NULL) {
free(arr);
fclose(file);
exit(EXIT_FAILURE);
}
arr = new_arr;
}
arr[n++] = date;
}
fclose(file);
if (n == 0) {
fprintf(stderr, "Error: No data.\n");
free(arr);
exit(EXIT_FAILURE);
}
qsort(arr, n, sizeof (Date), cmp_date);
for (size_t i = 0; i < n; i++) {
printf("%02d.%02d.%04d\n", arr[i].day, arr[i].month, arr[i].year);
}
free(arr);
exit(EXIT_SUCCESS);
}