Stajalište za gradski autobus¶
Autor zadatka: Rade Radišić <radisic.rade@uns.ac.rs>
Napisati program koji nalazi sve željene autobuske linije koje staju na stajalištu nakon zadatog vremena. Podaci su zadati u ulaznoj datoteci u sledećem formatu:
- naziv_linije (jedna reč, do 50 karaktera) 
- broj_linije (celobrojna vrednost) 
- vreme_dolaska (jedna reč, do 4 karaktera) 
Učitati linije u statički niz, zatim u izlaznu datoteku ispisati samo one linije koje pripadaju zadatim linijama nakon određenog vremena. Ime ulazne i izlazne datoteke, kao i vreme se zadaju kao argument komandne linije, dok se željene linije zadaju putem standardnog ulaza. Korisnik programa unosi tražene linije dokle god ne unese vrednost -1, što označava kraj korisničkog unosa (pogledati primer rada programa). U izlaznu datoteku ispisati broj linije i vreme dolaska.
U slučaju uspešnog izvršavanja programa, izaći sa status kodom 0 (EXIT_SUCCESS).
Ukoliko program ne može da se izvrši do kraja usled sledećih nedostataka, izaći iz programa sa sledećim status kodovima:
- U slučaju nedovoljnog ili suvišnog broj argumenata komandne linije, izaći iz programa sa status kodom - 2
- Ako program ne može da otvori ulaznu datoteku, izaći sa status kodom - 3
- Ako program ne može da otvori izlaznu datoteku, izaći sa status kodom - 4
Napomene¶
- Zarad jednostavnosti, prilikom unosa, pretpostaviti da se jedna linija ne moze izabrati vise puta 
- Sprovesti odgovarajuću validaciju korisničkog unosa (dozvoljene vrednosti su od 1 do 15 i -1) 
Primer poziva programa:
./a.out linije.txt trazene-linije.txt 1800
./a.out 1800 < linije-stdinout.txt
Primer ulazne datoteke linije.txt:
KLISA-CENTAR-LIMAN_I 1 1804
LIMAN_IV-CENTAR-Z._STANICA 4 1810
PODBARA-CENTAR-ADICE 6 1802
NOVO_NASELJE-CENTAR-LIMAN_I 8 1803
PETROVARADIN-CENTAR-DETELINARA 3 1801
KLISA-CENTAR-LIMAN_I 1 1747
LIMAN_IV-CENTAR-Z._STANICA 4 1732
Primer rada programa:
Uneti brojeve od 1 do 15 ili -1 za izlazak:
Linija: 1
Linija: 4
Linija: 8
Linija: -45
Ne postoji zadata linija!
Linija: -1
Primer izlazne datoteke trazene-linije.txt:
1 1804
4 1810
8 1803
Primer ulazne datoteke linije-stdinout.txt
7
KLISA-CENTAR-LIMAN_I 1 1804
LIMAN_IV-CENTAR-Z._STANICA 4 1810
PODBARA-CENTAR-ADICE 6 1802
NOVO_NASELJE-CENTAR-LIMAN_I 8 1803
PETROVARADIN-CENTAR-DETELINARA 3 1801
KLISA-CENTAR-LIMAN_I 1 1747
LIMAN_IV-CENTAR-Z._STANICA 4 1732
1
4
8
-45
-1
Primer rada programa:
Uneti brojeve od 1 do 15 ili -1 za izlazak:
Linija: 1 1804
Linija: 4 1810
Linija: 8 1803
Linija: Ne postoji zadata linija!
Linija:
Primer rešenja¶
 1#include <stdio.h>
 2#include <string.h>
 3#include <stdlib.h>
 4
 5#define MAX_NAZIV_LINIJE 51
 6#define MAX_VREME_DOLASKA 5
 7
 8#define MAX_SIZE 30
 9
10typedef struct linija_st
11{
12    char naziv_linije[MAX_NAZIV_LINIJE];
13    int broj_linije;
14    char vreme_dolaska[MAX_VREME_DOLASKA];
15} LINIJA;
16
17FILE *safe_fopen(char *, char *, int);
18void ucitaj_linije(FILE *, LINIJA *, int *);
19void ispis_trazene_linije(FILE *, LINIJA *, int, char *, int);
20
21int main(int argc, char **argv)
22{
23    LINIJA linije[MAX_SIZE];
24    int n;
25
26    if(argc != 4)
27    {
28        printf("Primer poziva: %s linije.txt trazene-linije.txt 1800\n", argv[0]);
29        exit(2);
30    }
31
32    FILE *ulazna = safe_fopen(argv[1], "r", 3);
33    ucitaj_linije(ulazna, linije, &n);
34    fclose(ulazna);
35
36    int trazena_linija;
37    FILE *izlazna = safe_fopen(argv[2], "w", 4);
38
39    // Zarad jednostavnosti, prilikom unosa, pretpostaviti da se jedna linija ne moze izabrati vise puta
40    printf("Uneti brojeve od 1 do 15 ili -1 za izlazak:\n");
41    do
42    {
43        printf("Linija: ");
44        scanf("%d", &trazena_linija);
45        if(trazena_linija < -1 || trazena_linija == 0 || trazena_linija > 15)
46        {
47            printf("Ne postoji zadata linija!\n");
48        }
49        else if(trazena_linija != -1)
50        {
51            ispis_trazene_linije(izlazna, linije, n, argv[3], trazena_linija);
52        }
53    } while(trazena_linija != -1);
54
55    fclose(izlazna);
56
57    return 0;
58}
59
60FILE *safe_fopen(char *naziv, char *rezim, int kod_greske)
61{
62    FILE *fp = fopen(naziv, rezim);
63
64    if(fp == NULL)
65    {
66        printf("Datoteka %s nije uspesno otvorena!\n", naziv);
67        exit(kod_greske);
68    }
69
70    return fp;
71}
72
73void ucitaj_linije(FILE *ulazna, LINIJA *linije, int *pn)
74{
75    int i = 0;
76
77    while(fscanf(ulazna, "%s %d %s", 
78            linije[i].naziv_linije, &linije[i].broj_linije, linije[i].vreme_dolaska) != EOF)
79    {
80        i++;
81    }
82
83    *pn = i;
84}
85
86void ispis_trazene_linije(FILE *izlazna, LINIJA *linije, int n, char *vreme, int trazena_linija)
87{
88    int i, nadjena_linija;
89
90    for(i = 0;i < n;i++)
91    {
92        if(linije[i].broj_linije == trazena_linija && strcmp(vreme, linije[i].vreme_dolaska) < 0)
93        {
94            fprintf(izlazna, "%d %s\n", linije[i].broj_linije, linije[i].vreme_dolaska);
95        }
96    }
97}
 1#include <stdio.h>
 2#include <string.h>
 3#include <stdlib.h>
 4
 5#define MAX_NAZIV_LINIJE 51
 6#define MAX_VREME_DOLASKA 5
 7
 8#define MAX_SIZE 30
 9
10typedef struct linija_st
11{
12    char naziv_linije[MAX_NAZIV_LINIJE];
13    int broj_linije;
14    char vreme_dolaska[MAX_VREME_DOLASKA];
15} LINIJA;
16
17void ucitaj_linije(LINIJA *, int *);
18void ispis_trazene_linije(LINIJA *, int, char *, int);
19
20int main(int argc, char **argv)
21{
22    LINIJA linije[MAX_SIZE];
23    int n;
24
25    if(argc != 2)
26    {
27        printf("Primer poziva: %s 1800\n", argv[0]);
28        exit(2);
29    }
30
31    ucitaj_linije(linije, &n);
32
33    int trazena_linija;
34
35    // Zarad jednostavnosti, prilikom unosa, pretpostaviti da se jedna linija ne moze izabrati vise puta
36    printf("Uneti brojeve od 1 do 15 ili -1 za izlazak:\n");
37    do
38    {
39        printf("Linija: ");
40        scanf("%d", &trazena_linija);
41        if(trazena_linija < -1 || trazena_linija == 0 || trazena_linija > 15)
42        {
43            printf("Ne postoji zadata linija!\n");
44        }
45        else if(trazena_linija != -1)
46        {
47            ispis_trazene_linije(linije, n, argv[1], trazena_linija);
48        }
49    } while(trazena_linija != -1);
50
51    return 0;
52}
53
54void ucitaj_linije(LINIJA *linije, int *pn)
55{
56    int i;
57
58    do
59    {
60        scanf("%d", pn);
61    } while (*pn <= 0 || *pn > MAX_SIZE);
62
63    for (i = 0;i < *pn;i++)
64    {
65        scanf("%s %d %s", linije[i].naziv_linije, &linije[i].broj_linije, linije[i].vreme_dolaska);
66    }
67}
68
69void ispis_trazene_linije(LINIJA *linije, int n, char *vreme, int trazena_linija)
70{
71    int i, nadjena_linija;
72
73    for(i = 0;i < n;i++)
74    {
75        if(linije[i].broj_linije == trazena_linija && strcmp(vreme, linije[i].vreme_dolaska) < 0)
76        {
77            printf("%d %s\n", linije[i].broj_linije, linije[i].vreme_dolaska);
78        }
79    }
80}