Najduža rastuća serija merenja

Data je datoteka sa dnevnim merenjima temperatura (merenja nisu sortirana po datumima). Potrebno je pronaći najdužu uzastopnu rastuću seriju (svako sledeće merenje strogo veće od prethodnog) u sortiranom redosledu datuma i ispisati njenu dužinu.

Koristiti strukturu za čuvanje jednog merenja i dinamicki niz kako broj merenja nije poznat.

Ulaz

Program se pokreće komandnom linijom:

./meteo <putanja_do_fajla>

Ulazni fajl sadrži linije oblika:

<dan>/<mesec>/<godina> <temperatura>

Broj linija nije poznat unapred i datumi nisu nužno u rastućem redosledu, ali nakon sortiranja po datumima, svi datumi su uzastopni (nema izostavljenih datuma).

Izlaz

Ispisati samo dužinu najduže rastuće serije kao ceo broj.

Greške:

Primer

meteo.txt

4/1/2020 5.5
2/1/2020 6.0
5/1/2020 7.0
1/1/2020 5.0
3/1/2020 4.5
6/1/2020 8.0

command line

./meteo meteo.txt

stdout

4

Primer

command line

./meteo

stderr

Error: Invalid number of arguments.

Primer

meteo.txt

command line

./meteo meteo.txt

stderr

Error: No data.

Primer

command line

./meteo nonexistent.txt

stderr

Error: Could not open file nonexistent.txt

Rešenje

main.c

#include <stdio.h>
#include <stdlib.h>

#define INITIAL_CAPACITY 16

typedef struct {
	int day;
	int month;
	int year;
	double temperature;
} Reading;

int cmp_reading(const void *a, const void *b)
{
	const Reading *r1 = a;
	const Reading *r2 = b;

	if (r1->year != r2->year) {
		return r1->year - r2->year;
	}

	if (r1->month != r2->month) {
		return r1->month - r2->month;
	}

	return r1->day - r2->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 == NULL) {
		fprintf(stderr, "Error: Could not open file %s\n", argv[1]);
		exit(EXIT_FAILURE);
	}

	size_t cap = INITIAL_CAPACITY, n = 0;
	Reading *arr = malloc(cap * sizeof (Reading));
	if (arr == NULL) {
		fclose(file);
		exit(EXIT_FAILURE);
	}

	Reading reading;
	while (fscanf(file, "%d/%d/%d %lf", 
				  &reading.day, &reading.month, 
				  &reading.year, &reading.temperature) == 4) {
		if (n == cap) {
			cap *= 2;
			Reading *new_arr = realloc(arr, cap * sizeof (Reading));
			if (new_arr == NULL) {
				free(arr);
				fclose(file);
				exit(EXIT_FAILURE);
			}
			arr = new_arr;
		}
		arr[n++] = reading;
	}

	fclose(file);

	if (n == 0) {
		fprintf(stderr, "Error: No data.\n");
		free(arr);
		exit(EXIT_FAILURE);
	}

	qsort(arr, n, sizeof (Reading), cmp_reading);

	int best = 1;
	int curr = 1;
	for (size_t i = 1; i < n; i++) {
		if (arr[i].temperature > arr[i - 1].temperature) {
			curr++;
		} else {
			if (curr > best) {
				best = curr;
			}
			curr = 1;
		}
	}
	if (curr > best) {
		best = curr;
	}

	printf("%d\n", best);

	free(arr);

	exit(EXIT_SUCCESS);
}