Životinjsko carstvo

Autor zadatka: Aleksandar Vasiljević <alexva02@uns.ac.rs>

Iz zadate ulazne datoteke zivotinje.txt učitati podatke u jednostruko spregnutu listu, gde struktura zivotinja_st sadrži sledeća polja:

  • naziv (jedna reč, maksimalno 8 karaktera),

  • prosecna_starost (pozitivan ceo broj),

  • broj_jedinki (realan broj) i

  • zasticena (jedna reč, maksimalno 11 karaktera).

Struktura zivotinja_st, takođe sadrži i polja potrebna za pravilno formiranje jednostruko spregnute liste. Jednostruko spregnutu listu formirati dodavanjem novih elemenata na kraj. Voditi računa o tome da je prilikom kreiranja jednostruko spregnute liste potrebno popuniti polje zasticena vrednošću “zasticena” ako je broj jedinki manji od 300, odnosno “nezasticena” ako je broj jedinki veći ili jednak 300.

Pronaći i ispisati sve informacije o trenutno najugroženijoj životinjskoj vrsti (najugroženijom smatra se životinja sa najmanjim brojem jedinki).

Primer poziva programa:

./a.out zivotinje.txt

sa zadatim ulazom u datoteci zivotinje.txt:

50.5 Kornjaca 214
70 krokodil 324
10 Zmija 126
70 orao 548
12 Pas 358
15 macka 578
12 zaba 412
21.5 Kengur 345
15 koala 125
112 Meduza 245
21.5 panda 68
45 Oktopod 269

i očekivanim ispisom na standardnom izlazu:

Kornjaca 50.5 214 zasticena
krokodil 70.0 324 nezasticena
Zmija 10.0 126 zasticena
orao 70.0 548 nezasticena
Pas 12.0 358 nezasticena
macka 15.0 578 nezasticena
zaba 12.0 412 nezasticena
Kengur 21.5 345 nezasticena
koala 15.0 125 zasticena
Meduza 112.0 245 zasticena
panda 21.5 68 zasticena
Oktopod 45.0 269 zasticena

Trenutno najugrozenija zivotinja je:
panda 21.5 68 zasticena

Primer rešenja

  1#include <stdio.h>
  2#include <stdlib.h>
  3#include <string.h>
  4
  5#define MAX_NAZIV 8+1
  6#define MAX_ZASTICENA 11+1
  7
  8typedef struct zivotinja_st {
  9    char naziv[MAX_NAZIV];
 10    double prosecna_starost;
 11    int broj_jedinki;
 12    char zasticena[MAX_ZASTICENA];
 13    struct zivotinja_st *sledeci;
 14}ZIVOTINJA;
 15
 16void init_list(ZIVOTINJA **head) {
 17    *head = NULL;
 18}
 19
 20void add_to_list(ZIVOTINJA *new, ZIVOTINJA **head) {    
 21    if(*head == NULL) { 
 22        *head = new;
 23        return;
 24    }
 25    add_to_list(new,&((*head)->sledeci));
 26}
 27
 28ZIVOTINJA *create_new_item(char naziv[], double ps, int broj_jed) {
 29    ZIVOTINJA *new = (ZIVOTINJA *)malloc(sizeof(ZIVOTINJA));
 30    if (new == NULL) {
 31        printf("Not enough RAM!\n");
 32        exit(21);
 33    }
 34
 35    strcpy(new->naziv, naziv);
 36    new->prosecna_starost = ps;
 37    new->broj_jedinki = broj_jed;
 38
 39    if(broj_jed < 300) {
 40        strcpy(new->zasticena,"zasticena");
 41    } else {
 42        strcpy(new->zasticena,"nezasticena");
 43    }
 44    new->sledeci = NULL;
 45
 46    return new;
 47}
 48
 49void read_list_from(FILE *in, ZIVOTINJA **head) {
 50    char tmp_naziv[MAX_NAZIV];
 51    double tmp_ps;
 52    int tmp_broj_jed;
 53
 54    while(fscanf(in,"%lf %s %d",&tmp_ps,tmp_naziv,&tmp_broj_jed) != EOF) {
 55        ZIVOTINJA *new = create_new_item(tmp_naziv, tmp_ps, tmp_broj_jed);
 56        add_to_list(new, head);
 57    }
 58}
 59
 60void save_item_to(ZIVOTINJA *x) {
 61    printf("\t%s %.1lf %d %s\n", 
 62        x->naziv, x->prosecna_starost,
 63        x->broj_jedinki, x->zasticena);
 64}
 65
 66void save_list_to(ZIVOTINJA *head) {
 67    if(head != NULL) {
 68        save_item_to(head);
 69        save_list_to(head->sledeci);
 70    }
 71}
 72
 73void destroy_list(ZIVOTINJA **head) {
 74    if(*head != NULL) {
 75        destroy_list(&((*head)->sledeci));
 76        free(*head);
 77        *head = NULL;
 78    }
 79}
 80
 81FILE *safe_fopen(char *filename, char *mode, int error_code) {
 82    FILE *fp = fopen(filename, mode);
 83    if (fp == NULL) {
 84        printf("Can't open '%s'!\n", filename);
 85        exit(error_code);
 86    }
 87    return fp;
 88}
 89
 90void najugrozenija(ZIVOTINJA *head) {
 91
 92        if(head==NULL) {
 93            return;
 94        }
 95
 96        ZIVOTINJA *ugrozena=head;
 97
 98        while(head!=NULL) {
 99
100            if(head->broj_jedinki < ugrozena->broj_jedinki) {
101                ugrozena=head;
102            }
103            head = head->sledeci;
104        }
105
106        printf("\n\tTrenutno najugrozenija zivotinja je:\n");
107        save_item_to(ugrozena);
108}
109
110//primer poziva ./a.out zivotinje.txt
111int main(int arg_num, char *args[]) {
112    if (arg_num != 2) {
113        printf("Pogresan unos argumenata\n");
114        exit(11);
115    }
116
117    FILE *in  = safe_fopen(args[1],"r", 1);
118
119    ZIVOTINJA *head;
120    init_list(&head);
121
122    read_list_from(in, &head);
123    save_list_to(head);
124
125    najugrozenija(head);
126
127    destroy_list(&head);
128
129    fclose(in);
130
131    return 0;
132}