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:

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