Cvetići

Autor zadatka: Sanja Špica <sanjaspica@uns.ac.rs>

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

  • naziv cvećare (jedna reč, do 20 karaktera)

  • vrste cveća (jedna reč, do 20 karaktera)

  • cena cveća (pozitivan realan broj)

Naravno, struktura cvecara_st sadrži i polja potrebna za pravilno formiranje jednostruko spregnute liste.

Na osnovu zadate vrste cveća vrsta_cveca iz formirane liste ispisati podatke na standardni izlaz (terminal), u sledećem rasporedu polja strukture cvecara_st:

  • cena (zaokružena na 2 decimale, koristiti "%6.2f" format specifikator)

  • naziv vrste cveća

  • naziv cvećare

i potom na standardni izlaz (terminal) ispisati informaciju u kojoj cvećari je zadati cvet najpovoljniji i koja je njegova cena(zaokružena na 2 decimale).

Primer poziva programa:

./cvece Orhideja cvecare.txt

sa vrsta_cveca=Orhideja i zadatim ulazom u datoteci cvecare.txt:

Cvecara_Flowers Ruza     150.00
Cvecara_Flowers Orhideja 800.00
Cvecara_Flowers Ljiljan  720.00
Cvecara_Sun     Ruza     200.00
Cvecara_Sun     Orhideja 890.00
Cvecara_Sun     Ljiljan  740.00
Cvecara_Green   Ruza     260.00
Cvecara_Green   Orhideja 650.00
Cvecara_Green   Ljiljan  720.00

i očekivanim izlazom

150.00 Ruza Cvecara_Flowers
800.00 Orhideja Cvecara_Flowers
720.00 Ljiljan Cvecara_Flowers
200.00 Ruza Cvecara_Sun
890.00 Orhideja Cvecara_Sun
740.00 Ljiljan Cvecara_Sun
260.00 Ruza Cvecara_Green
650.00 Orhideja Cvecara_Green
720.00 Ljiljan Cvecara_Green

Cvecara sa najpovoljnijim cvetom Orhideja je Cvecara_Green, njena cena je 650.00

sa vrsta_cveca=Kala:

U trenutno raspolozivim cvecarama ne postoji cvet Kala!

Primer rešenja

  1#include <stdio.h>
  2#include <string.h>
  3#include <stdlib.h>
  4
  5#define MAX_CVECE 11
  6#define MAX_CVECARA 21
  7
  8typedef struct cvece_st
  9{
 10  char cvecara[MAX_CVECARA];
 11  char vrsta_cveca[MAX_CVECE];
 12  double cena;
 13  struct cvece_st *sledeci;
 14} CVECE;
 15
 16FILE *safe_fopen(char *filename, char *mode);
 17void ucitaj(FILE *in, CVECE **glava);
 18void inicijalizacija(CVECE **glava);
 19CVECE *napravi_cvor(char *cvecara, char *vrsta_cveca, double *cena);
 20void dodaj_cvor(CVECE **glava, CVECE *novi);
 21CVECE *najpovoljniji_cvet(CVECE *glava, char cvecara[], char vrsta_cveca[]);
 22void ispis(CVECE *glava);
 23void obrisi_listu(CVECE **glava);
 24
 25int main(int BrArg, char **argv)
 26{
 27  if (BrArg != 3)
 28  {
 29    printf("Greska prilikom poziva programa\n");
 30    exit(EXIT_FAILURE);
 31  }
 32
 33  char cvecara[MAX_CVECARA];
 34  char *vrsta_cveca = argv[1];
 35  FILE *in = safe_fopen(argv[2], "r");
 36
 37  CVECE *glava;
 38  inicijalizacija(&glava);
 39
 40  ucitaj(in, &glava);
 41  ispis(glava);
 42
 43  CVECE *najpovoljniji = najpovoljniji_cvet(glava, cvecara, vrsta_cveca);
 44  if (najpovoljniji == NULL)
 45  {
 46    printf(
 47        "\nU trenutno raspolozivim cvecarama ne postoji cvet %s!\n",
 48        vrsta_cveca);
 49  }
 50  else
 51  {
 52    printf(
 53        "\nCvecara sa najpovoljnijim cvetom %s je %s, njena cena je %.2lf\n",
 54        vrsta_cveca,
 55        najpovoljniji->cvecara,
 56        najpovoljniji->cena);
 57  }
 58  obrisi_listu(&glava);
 59
 60  fclose(in);
 61
 62  return 0;
 63}
 64FILE *safe_fopen(char *filename, char *mode)
 65{
 66  FILE *fp = fopen(filename, mode);
 67
 68  if (fp == NULL)
 69  {
 70    printf("Nije moguce otvoriti datoteku %s!\n", filename);
 71    exit(EXIT_FAILURE);
 72  }
 73
 74  return fp;
 75}
 76
 77void ucitaj(FILE *in, CVECE **glava)
 78{
 79  char cvecara[MAX_CVECARA];
 80  char vrsta_cveca[MAX_CVECE];
 81  double cena;
 82
 83  while (fscanf(in, "%s %s %lf", cvecara, vrsta_cveca, &cena) != EOF)
 84  {
 85    dodaj_cvor(glava, napravi_cvor(cvecara, vrsta_cveca, &cena));
 86  }
 87}
 88void inicijalizacija(CVECE **glava)
 89{
 90  *glava = NULL;
 91}
 92CVECE *napravi_cvor(char *cvecara, char *vrsta_cveca, double *cena)
 93{
 94  CVECE *novi = (CVECE *)malloc(sizeof(CVECE));
 95
 96  if (novi == NULL)
 97  {
 98    printf("Greska prilikom zauzimanja memorije!\n");
 99    exit(EXIT_FAILURE);
100  }
101  strcpy(novi->cvecara, cvecara);
102  strcpy(novi->vrsta_cveca, vrsta_cveca);
103  novi->cena = *cena;
104
105  novi->sledeci = NULL;
106
107  return novi;
108}
109void dodaj_cvor(CVECE **glava, CVECE *novi)
110{
111  if (*glava == NULL)
112  {
113    *glava = novi;
114  }
115  else
116  {
117    CVECE *tekuci = *glava;
118
119    while (tekuci->sledeci != NULL)
120    {
121      tekuci = tekuci->sledeci;
122    }
123
124    tekuci->sledeci = novi;
125  }
126}
127CVECE *najpovoljniji_cvet(CVECE *glava, char cvecara[], char vrsta_cveca[])
128{
129  if (glava == NULL)
130  {
131    return NULL;
132  }
133  CVECE *najpovoljniji = NULL;
134  while (glava != NULL)
135  {
136    if (strcmp(glava->vrsta_cveca, vrsta_cveca) == 0)
137    {
138      if (najpovoljniji == NULL)
139      {
140        najpovoljniji = glava;
141      }
142      else if (glava->cena < najpovoljniji->cena)
143      {
144        najpovoljniji = glava;
145      }
146    }
147    glava = glava->sledeci;
148  }
149
150  return najpovoljniji;
151}
152void ispis(CVECE *glava)
153{
154  CVECE *tekuci = glava;
155
156  while (tekuci != NULL)
157  {
158    printf(
159        "%6.2lf %s %s\n",
160        tekuci->cena,
161        tekuci->vrsta_cveca,
162        tekuci->cvecara);
163    tekuci = tekuci->sledeci;
164  }
165}
166void obrisi_listu(CVECE **glava)
167{
168  CVECE *tekuci;
169
170  while (*glava != NULL)
171  {
172    tekuci = *glava;
173    *glava = (*glava)->sledeci;
174    tekuci->sledeci = NULL;
175    free(tekuci);
176  }
177}