Advertisement
milanmetal

T34 Emisije [V2]

May 4th, 2016
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.18 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define MAX_NAZIV 20
  6. #define MAX_TIP 30
  7. #define MAX_SIZE 100
  8. // Iz zadate ulazne datoteke učitati niz struktura pri čemu se struktura emisija_st sastoji od sledećih
  9. // polja:
  10. // naziv emisije (jedna reč, do 20 karaktera)
  11. // frekvencija radio stanice na kojoj se emisija pušta (realan broj)
  12. // trajanje emisije u minutima (nenegativan ceo broj)
  13. // tip emisije (jedna reč, do 30 karaktera)
  14.  
  15. // Nakon toga:
  16. // a) U izlaznu datoteku ispisati podatke o svim emisijama tako da vreme trajanja emisije bude
  17. // izraženo u satima.
  18. // b) Na standardni izlaz ispisati podatke o najkraćoj emisiji koja se emituje na frekvenciji većoj od
  19. // zadate.
  20. // c) Za zadati tip emisije izračunati prosečnu dužinu trajanja emisija tog tipa i taj podatak
  21. // sačuvati u fajlu koji nosi naziv tog tipa emisije sa ekstenzijom .txt.
  22.  
  23. // PRIMER POZIVA : ./emisije emisije.txt izlaz.txt 100.2
  24. // Primer fajla : emisije.txt
  25.  
  26. // Uzbudilnik 103.2 240 zabavna
  27. // Antidepresiv 91.8 150 zabavna
  28. // KlasikuMolim 95.3 105 muzicka
  29. // MuzickaApoteka 107.0 90 muzicka
  30. // RadioDrama 97.6 60 kulturna
  31. // ZvezdaniCasovi 104.0 45 kulturna
  32. // VeseloVece 94.9 150 kulturna
  33.  
  34. typedef struct emisije_st {
  35.   char naziv[MAX_NAZIV];
  36.   float frekvencija;
  37.   unsigned int trajanje;
  38.   char tip[MAX_TIP];
  39. } emisije_st;
  40.  
  41. FILE *safeOpen(char *file, char *mode);
  42. void ucitajEmisije(FILE *emisije, emisije_st niz[], int *brEmisija);
  43. void ispisUsatima(FILE *izlaz, emisije_st emisije[], int brEmisija);
  44. void filterEmisija(emisije_st emisije[], int brEmisija, double zadataFrekvencija);
  45. void prosekTrajanja(emisije_st emisije[], int brEmisija );
  46.  
  47.  
  48. int main(int argc, char *argv[]) {
  49.  
  50. if (argc != 4) {
  51.   printf("Pogresno ste pokrenuli program. \n PRIMER POZIVA : ./emisije emisije.txt izlaz.txt 100.2 ");
  52.   exit(EXIT_FAILURE);
  53. }
  54.  
  55. FILE *ulaz, *izlaz;
  56. int brEmisija = 0;
  57. emisije_st niz[MAX_SIZE];
  58.  
  59. ulaz = safeOpen(argv[1], "r");
  60. ucitajEmisije(ulaz, niz, &brEmisija);
  61. fclose(ulaz);
  62.  
  63. // izlaz
  64. izlaz = safeOpen(argv[2], "w");
  65. ispisUsatima(izlaz, niz, brEmisija);
  66. fclose(izlaz);
  67.  
  68. // pod B
  69. filterEmisija(niz, brEmisija, atof(argv[3]));
  70.  
  71. // pod C
  72. prosekTrajanja(niz, brEmisija );
  73.  
  74.  
  75. }
  76.  
  77.  
  78. FILE *safeOpen(char *file, char *mode){
  79.   FILE *fp = fopen(file, mode);
  80.  
  81.   if(fp == NULL) {
  82.     printf("Greska pri ucitavanju fajla : %s\n", file);
  83.     exit(EXIT_FAILURE);
  84.   }
  85.  
  86.   return fp;
  87. }
  88.  
  89. void ucitajEmisije(FILE *emisije, emisije_st niz[], int *brEmisija) {
  90.   int i = 0;
  91.  
  92.   while(!feof(emisije)) {
  93.     fscanf(emisije, "%s %f %u %s",
  94.                                   niz[i].naziv,
  95.                                   &niz[i].frekvencija,
  96.                                   &niz[i].trajanje,
  97.                                   niz[i].tip);
  98.     i++;
  99.   }
  100.  
  101.   *brEmisija = i - 1;
  102. }
  103.  
  104. void ispisUsatima(FILE *izlaz, emisije_st emisije[], int brEmisija) {
  105.   int i = 0;
  106.  
  107.   for (i = 0; i < brEmisija; i++) {
  108.     fprintf(izlaz, "%s %.1f %g %s\n",
  109.                                   emisije[i].naziv,
  110.                                   emisije[i].frekvencija,
  111.                                   emisije[i].trajanje / 60.0,
  112.                                   emisije[i].tip);
  113.   }
  114. }
  115.  
  116. void filterEmisija(emisije_st emisije[], int brEmisija, double zadataFrekvencija) {
  117.   int i = 0;
  118.  
  119.   int minTrajanje = emisije[0].trajanje;
  120.   int indexMinLen = 0;
  121.  
  122.   for (i = 0; i < brEmisija; i++) {
  123.     if (emisije[i].trajanje < minTrajanje && emisije[i].frekvencija > zadataFrekvencija) {
  124.       minTrajanje = emisije[i].trajanje;
  125.       indexMinLen = i;
  126.     }
  127.   }
  128.  
  129.   printf("Najkraca emisija na frekvenciji vecoj od %.1lf je :\n%s %.1f %d %s\n\n",
  130.                                 zadataFrekvencija,
  131.                                 emisije[indexMinLen].naziv,
  132.                                 emisije[indexMinLen].frekvencija,
  133.                                 emisije[indexMinLen].trajanje,
  134.                                 emisije[indexMinLen].tip);
  135. }
  136.  
  137. void prosekTrajanja(emisije_st emisije[], int brEmisija ) {
  138.  
  139.   char tipEmisije[MAX_TIP] = {};
  140.   char filename[MAX_TIP+4];
  141.   float prosecnaDuzina = 0;
  142.   int i = 0;
  143.   int zadovoljavaju = 0; // broj emisija koje zaodovoljavaju kriterijum
  144.   int suma = 0.0; // ukupno trajanje svih emisija koje zadovoljavaju kriterijum
  145.  
  146.     do {
  147.       printf("\nUnesite zeljeni tip emisije (zabavna, kulturna, muzicka):");
  148.       __fpurge(stdin);
  149.       fscanf(stdin, "%s", tipEmisije);
  150.     } while (strcmp(tipEmisije, "zabavna") != 0
  151.     && strcmp(tipEmisije, "kulturna") != 0
  152.     && strcmp(tipEmisije, "muzicka") != 0);
  153.  
  154.     // strcat doda ".txt" na promenjivu i promenjiva nakon toga menja vrednost.
  155.     // strcpy(filename, strcat(tipEmisije, ".txt"));
  156.  
  157.     // printf("filename : %s\n", filename);
  158.     for (i = 0; i < brEmisija; i++) {
  159.       if(strcmp(tipEmisije, emisije[i].tip) == 0) {
  160.         zadovoljavaju++;
  161.         suma += emisije[i].trajanje;
  162.       }
  163.     }
  164.  
  165.     zadovoljavaju = zadovoljavaju > 0 ? zadovoljavaju : 1;
  166.  
  167.     prosecnaDuzina = suma / zadovoljavaju;
  168.     FILE *izlaz = safeOpen(strcat(tipEmisije, ".txt")/* filename*/, "w");
  169.     fprintf(izlaz, "Prosecna duzina emisija tipa %s je : %g\n", tipEmisije, prosecnaDuzina);
  170.     fclose(izlaz);
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement