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:
- Pogrešan broj argumenata:
Error: Invalid number of arguments.nastderr. - Neuspešno otvaranje fajla:
Error: Could not open file <putanja>nastderr. - Ako nema podataka:
Error: No data.nastderr. - U slučaju greške, program treba da se završi sa statusom greške
1.
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);
}