Ž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}