Advertisement
milanmetal

T34 Naucnici [FINAL]

May 4th, 2016
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.92 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define MAX_IME 20
  6. #define MAX_OBLAST 30
  7. #define MAX_DATA 100
  8.  
  9. //
  10. // Iz zadate ulazne datoteke učitati niz struktura pri čemu se struktura naucnik_st sastoji od sledećih
  11. // polja:
  12.  
  13. // ime (jedna reč, do 20 karaktera)
  14. // prezime (jedna reč, do 20 karaktera)
  15. // broj objavljenih radova (nenegativan ceo broj)
  16. // oblast u kojoj istražuje (jedna reč, do 30 karaktera)
  17.  
  18. // Nakon toga:
  19. // a) U izlaznu datoteku ispisati podatke o naučnicima koji imaju broj objavljenih radova veći od
  20. // zadatog.
  21. // b) Na standardni izlaz ispisati prosečnu dužinu prezima uzimajući u obzir samo osobe sa
  22. // različitim prezimenima.
  23. // c) Za zadatu naučnu oblast izračunati ukupan broj objavljenih radova i taj podatak sačuvati u
  24. // fajlu koji nosi naziv te oblasti sa ekstenzijom .txt
  25. // Nazivi ulazne i izlazne datoteke kao i broj objavljenih radova se zadaju kao argumenti poziva
  26. // programa dok naziv oblasti korisnik zadaje tokom izvršavanja programa kroz standardni ulaz.
  27.  
  28. // Emmy Noether 123 matematika
  29. // Andrey Kolmogorov 250 matematika
  30. // Stefan Noether 222 racunarstvo
  31. // Petar Lobachevsky 222 racunarstvo
  32. // Albert Einstein 156 fizika
  33. // Nicolai Lobachevsky 321 matematika
  34. // Mileva Einstein 157 fizika
  35.  
  36. typedef struct naucnici_st {
  37.   char ime[MAX_IME];
  38.   char prezime[MAX_IME];
  39.   unsigned int brRadova;
  40.   char oblast[MAX_OBLAST];
  41. } naucnici_st;
  42.  
  43. FILE *safeOpen(char *file, char *mode);
  44. void ucitajPodatke(FILE *ulaz, naucnici_st naucnici[], int *brNaucnika);
  45. void filterNaucnici(FILE* izlaz, naucnici_st naucnici[], int brNaucnika, int minRadovi);
  46. void filterPrezime(naucnici_st naucnici[], int brNaucnika);
  47. void filterOblast(naucnici_st naucnici[], int brNaucnika);
  48.  
  49. int main(int argc, char *argv[]) {
  50.  
  51.   if(argc != 4) {
  52.     printf("Pogresno ste pokrenulis program!");
  53.     printf("Primer poziva: ./zadatak naucnici.txt izlaz.txt 200");
  54.   }
  55.  
  56.   FILE *ulaz, *izlaz;
  57.   int brNaucnika = 0;
  58.   naucnici_st naucnici[MAX_DATA];
  59.   //
  60.   ulaz = safeOpen(argv[1], "r");
  61.   ucitajPodatke(ulaz, naucnici, &brNaucnika);
  62.   fclose(ulaz);
  63.   //
  64.   izlaz = safeOpen(argv[2], "w");
  65.   filterNaucnici(izlaz, naucnici, brNaucnika, atoi(argv[3]));
  66.   fclose(izlaz);
  67.  
  68.   // pod B
  69.   filterPrezime(naucnici, brNaucnika);
  70.  
  71.   // pod C
  72.   filterOblast(naucnici, brNaucnika);
  73.   // char oblast[MAX_OBLAST];
  74.   // printf("Unesite zeljenu oblast\n", );
  75.  
  76. }
  77.  
  78. FILE *safeOpen(char *file, char *mode) {
  79.   FILE *fp = fopen(file, mode);
  80.  
  81.   if (fp == NULL){
  82.     printf("Doslo je do greske pri otvaranju fajla : %s\n", file);
  83.     exit(EXIT_FAILURE);
  84.   }
  85.  
  86.   return fp;
  87. }
  88.  
  89. void ucitajPodatke(FILE *ulaz, naucnici_st naucnici[], int *brNaucnika){
  90.   int i = 0;
  91.   while(!feof(ulaz)){
  92.     fscanf(ulaz, "%s %s %u %s", naucnici[i].ime,
  93.                                 naucnici[i].prezime,
  94.                                 &naucnici[i].brRadova,
  95.                                 naucnici[i].oblast);
  96.     i++;
  97.   }
  98.   *brNaucnika = i - 1; // uvek na ovo obratiti paznju
  99. }
  100.  
  101. void filterOblast(naucnici_st naucnici[], int brNaucnika){
  102.  
  103.   //char filename[MAX_OBLAST+4];
  104.   char oblast[MAX_OBLAST];
  105.   int i = 0, brRadovaIzOblasti = 0;
  106.  
  107.   do {
  108.     fprintf(stdout, "Unesite zeljenu oblast (matematika, fizika, racunarstvo):\n");
  109.     scanf("%s", oblast);
  110.   } while (strcmp(oblast, "matematika") != 0
  111.   && strcmp(oblast, "racunarstvo") != 0
  112.   && strcmp(oblast, "fizika") != 0);
  113.  
  114.   for (i = 0; i < brNaucnika; i++) {
  115.     if (strcmp(naucnici[i].oblast, oblast) == 0) {
  116.       brRadovaIzOblasti += naucnici[i].brRadova;
  117.     }
  118.   }
  119.  
  120.   //char filename = strcat(oblast, ".txt");
  121.  
  122.   FILE *oblastf = safeOpen(strcat(oblast, ".txt"), "w");
  123.   fprintf(oblastf, "Broj radova za oblast %s je : %d\n", oblast, brRadovaIzOblasti );
  124.   fclose(oblastf);
  125. }
  126.  
  127. void filterPrezime(naucnici_st naucnici[], int brNaucnika) {
  128.   int i = 0, j = 0;
  129.   int brPonavljanja = 0;
  130.   int brUnikatnih = 0;
  131.   float ukupnaDuzina = 0.0;
  132.  
  133.   for (i = 0; i < brNaucnika; i++) {
  134.     brPonavljanja = 0;
  135.     for (j = 0; j < i; j++) {
  136.       if (strcmp(naucnici[i].prezime, naucnici[j].prezime) == 0) {
  137.         brPonavljanja++;
  138.       }
  139.     }
  140.     if(brPonavljanja == 0) {
  141.       brUnikatnih++;
  142.       ukupnaDuzina += strlen(naucnici[i].prezime);
  143.     }
  144.   }
  145.   float avgDuzina = ukupnaDuzina / brUnikatnih;
  146.   fprintf(stdout, "\nProsecna duzina prezimena je : %.2f\n", avgDuzina);
  147.   fprintf(stdout, "\nbrUnikatnih : %d, ukupnaDuzina = %f brNaucnika = %d\n", brUnikatnih, ukupnaDuzina, brNaucnika);
  148. }
  149.  
  150. void filterNaucnici(FILE* izlaz, naucnici_st naucnici[], int brNaucnika, int minRadovi) {
  151.   int i = 0;
  152.  
  153.   for (i = 0; i < brNaucnika; i++) {
  154.     if (naucnici[i].brRadova > minRadovi) {
  155.       fprintf(izlaz, "%s %s %u %s\n", naucnici[i].ime,
  156.                                       naucnici[i].prezime,
  157.                                       naucnici[i].brRadova,
  158.                                       naucnici[i].oblast);
  159.       i++;
  160.     }
  161.   }
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement