Advertisement
Lauda

Untitled

Mar 2nd, 2014
281
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 23.11 KB | None | 0 0
  1. #include "liste.h"
  2. #include "base.h"
  3. #include <math.h>
  4.  
  5.  
  6. bool isEmpty(FILE *file)
  7. {
  8.     long savedOffset = ftell(file);
  9.     fseek(file, 0, SEEK_END);
  10.  
  11.     if (ftell(file) == 0)
  12.     {
  13.         return true;
  14.     }
  15.  
  16.     fseek(file, savedOffset, SEEK_SET);
  17.     return false;
  18. }
  19.  
  20. /*******************************************************************************************************************/
  21. // 1.
  22. void formiranjePrazne(){
  23.  
  24.     FILE* datoteka;
  25.     char naziv[MAX_CHAR];
  26.     printf("\nUnesite naziv datoteke: \n");
  27.     fflush(stdin);
  28.     gets(naziv);
  29.  
  30.     datoteka = fopen(naziv,"wb");
  31.  
  32.     if (datoteka==NULL){
  33.         printf("Datoteka <%s> nije uspesno otvorena\n",naziv);
  34.         return;
  35.     } else {
  36.         printf("Datoteka <%s> je uspesno otvorena\n",naziv);
  37.     }
  38.     fclose(datoteka);
  39. }
  40.  
  41. /*******************************************************************************************************************/
  42.  
  43. // 2.
  44. void izborAktivne() {
  45.  
  46.     FILE* datoteka;
  47.     char naziv[MAX_CHAR];
  48.  
  49.     printf("\nUnesite naziv datoteke koju zelite da proglasite aktivnom: \n");
  50.     fflush(stdin);
  51.     gets(naziv);
  52.     strcpy(aktivna,naziv);
  53.  
  54.     datoteka = fopen(naziv,"rb+");
  55.  
  56.     if (datoteka==NULL){
  57.         printf("\nDatoteka <%s> nije uspesno otvorena\n", naziv);
  58.         return;
  59.     }
  60.  
  61.     if (indSek != NULL)
  62.         fclose(indSek);
  63.  
  64.  
  65.     indSek = datoteka;
  66.     strcpy(aktivna, naziv);
  67.     printf("Datoteka '%s' je aktivna!\n", naziv);
  68.  
  69.     fclose(datoteka);
  70.  
  71.  
  72. }
  73.  
  74. /*******************************************************************************************************************/
  75.  
  76. // 3.
  77. void prikazAktivne(){
  78.     if (strcmp(aktivna,"")==0){
  79.         printf("\nNijedna datoteka nije aktivna!\n");
  80.     }else
  81.         printf("\nAktivna datoteka: <%s>\n", aktivna);
  82. }
  83.  
  84. /*******************************************************************************************************************/
  85.  
  86. // 4.
  87. void formiranjeSerijske() {
  88.     FILE *fajl;
  89.     unsigned long kljuc;
  90.     Slog temp;
  91.     Slog novi;
  92.  
  93.     int i;
  94.     for (i=0; i<F_BL; i++) {
  95.         fajl = fopen("serijska","rb");
  96.         printf("\n %d. slog", i+1);
  97.  
  98.   //  char odg = -1;
  99.    // do
  100.    // {
  101.         do{
  102.             printf("\nEvidencioni broj (10000000-99999999): ");
  103.             fflush(stdin);
  104.             scanf("%ld", &kljuc);
  105.             while (fread(&temp, sizeof(Slog), 1, fajl)){
  106.                 if (temp.e_br == kljuc){
  107.                     printf("\nEvidencioni broj postoji");
  108.                     kljuc=0;
  109.                     break;
  110.                 }
  111.             }
  112.         }while (kljuc<10000000 || kljuc>99999999);
  113.  
  114.         novi.e_br = kljuc;
  115.         fclose(fajl);
  116.  
  117.  
  118.         printf("\nUnesite sifru zatvorenika (max. 7 znakova!):\t");
  119.         fflush(stdin);
  120.         gets(novi.sifra_zat);
  121.  
  122.         int d, m, g, s, minut; // Datum!
  123.         printf("\nUnos datuma i vremena:\n");
  124.         do {
  125.             printf("\nUnesite godinu:\t");
  126.             fflush(stdin);
  127.             scanf("%d", &g);
  128.         } while (g < 1900 || g > 2100);
  129.  
  130.         do{
  131.             printf("\nUnesite mjesec:\t");
  132.             fflush(stdin);
  133.             scanf("%d", &m);
  134.         } while (m<1 || m>12);
  135.  
  136.         // Kontrole:
  137.         switch (m) {
  138.             case 1:
  139.             case 3:
  140.             case 5:
  141.             case 7:
  142.             case 8:
  143.             case 10:
  144.             case 12:
  145.                 do {
  146.                     printf("\nUnesite dan:\t");
  147.                     fflush(stdin);
  148.                     scanf("%d", &d);
  149.                 } while (d < 1 || d > 31);
  150.                 break;
  151.             case 4:
  152.             case 6:
  153.             case 9:
  154.             case 11:
  155.                 do {
  156.                     printf("\nUnesi dan:\t");
  157.                     fflush(stdin);
  158.                     scanf("%d", &d);
  159.                 } while (d < 1 || d > 31);
  160.                 break;
  161.             case 2:
  162.                 if (g % 4 == 0) {
  163.                     do {
  164.                         printf("\nUnesite dan:\t");
  165.                         fflush(stdin);
  166.                         scanf("%d", &d);
  167.                     } while (d < 1 || d > 29);
  168.                 }
  169.                 else {
  170.                     do {
  171.                         printf("\nUnesite dan:\t");
  172.                         fflush(stdin);
  173.                         scanf("%d", &d);
  174.                     } while (d < 1 || d > 28);
  175.                 }
  176.                 break;
  177.         }
  178.         do {
  179.             printf("\nUnesite sat:\t");
  180.             fflush(stdin);
  181.             scanf("%d", &s);
  182.         } while (s < 0 || s > 23);
  183.  
  184.         do {
  185.             printf("\nUnesite minut:\t");
  186.             fflush(stdin);
  187.             scanf("%d", &minut);
  188.         } while (minut < 0 || minut > 59);
  189.  
  190.          sprintf(novi.datum, "%d.%d.%d. %d:%d", d, m, g, s, minut);
  191.  
  192.         do {
  193.             printf("\nUnesite oznaku celije zatvorenika (Tacno 5 karaktera):\t");
  194.             fflush(stdin);
  195.             gets(novi.oznaka_celije);
  196.  
  197.         } while (strlen(novi.oznaka_celije) != 5);
  198.  
  199.         do {
  200.             printf("\nUnesite duzinu kazne (max. 480 mjeseci!): ");
  201.             fflush(stdin);
  202.             scanf("%d", &novi.duzina_kazne);
  203.         } while (novi.duzina_kazne < 1 || novi.duzina_kazne > 480);
  204.  
  205.    // } while (odg != 'n' || odg != 'N');
  206.  
  207.         fajl = fopen("serijska","ab+");
  208.         fwrite(&novi, sizeof(Slog), 1, fajl);
  209.         fclose(fajl);
  210.  
  211.     }
  212. }
  213.  
  214. /*******************************************************************************************************************/
  215.  
  216. void citajSerijsku() {
  217.     FILE *serijska;
  218.     Slog temp;
  219.     serijska = fopen("serijska", "rb");
  220.     while (fread(&temp, sizeof(Slog), 1, serijska)){
  221.         printf("\nE_BR: %ld\nSIFRA_ZAT: %s\nDATUM: %s\nOZNAKA_CELIJE: %s\nDUZINA_KAZNE: %d\n",temp.e_br, temp.sifra_zat, temp.datum, temp.oznaka_celije, temp.duzina_kazne);
  222.     }
  223. }
  224.  
  225. /*******************************************************************************************************************/
  226.  
  227. void citajSekvencijalnu(){
  228.     FILE *sekv;
  229.     Slog temp;
  230.     sekv = fopen("sekvencijalna","rb");
  231.     while (fread(&temp, sizeof(Slog), 1, sekv)){
  232.         printf("\nE_BR: %ld\nSIFRA_ZAT: %s\nDATUM: %s\nOZNAKA_CELIJE: %s\nDUZINA_KAZNE: %d\n",temp.e_br, temp.sifra_zat, temp.datum, temp.oznaka_celije, temp.duzina_kazne);
  233.     }
  234. }
  235.  
  236. /*******************************************************************************************************************/
  237.  
  238. // 5.
  239. void formiranjeSekvencijalne() {
  240.     FILE *ser;
  241.     FILE *sekv;
  242.     Slog temp;
  243.     Blok blok;
  244.     listaSlogova *glava = NULL;
  245.     listaSlogova *iteratorListe;
  246.     ser = fopen("serijska", "rb");
  247.  
  248.     int i = 0; //brojac broja slogova
  249.  
  250.     // Ovde citamo iz serijske i upisujemo na odgovarajuce mjesto u listi
  251.     while (fread(&temp, sizeof(Slog), 1, ser)) {
  252.         dodajSlog(&glava, &temp );
  253.     }
  254.     fclose(ser);
  255.  
  256.     // Citamo iz liste i upisujemo u sekvencijalnu
  257.     sekv = fopen("sekvencijalna", "wb");
  258.     iteratorListe = glava;
  259.  
  260.     while(iteratorListe != NULL) {
  261.         blok.slogovi[i] = iteratorListe->slog;
  262.         i++;
  263.         if(i == F_BL) {
  264.             fwrite(&blok, sizeof(Blok), 1, sekv);
  265.             i = 0;
  266.         }
  267.         iteratorListe = iteratorListe->next;
  268.     }
  269.  
  270.     blok.slogovi[0].e_br = -1; // Upisi preostale i oznaku kraja podataka
  271.     fwrite(&blok, sizeof(Blok), 1, sekv);
  272.  
  273.     // Cleanup
  274.     fclose(sekv);
  275.     free(iteratorListe);
  276.     obrisiListu(&glava);
  277.     printf("\nFormiranje proslo uspjesno!\n");
  278. }
  279.  
  280. /*******************************************************************************************************************/
  281.  
  282. void formiranjePrimarneZone(){
  283.     Slog temp;
  284.     Blok_primarne_zone blok;
  285.  
  286.     indSek = fopen(aktivna, "ab");
  287.  
  288.         if (isEmpty(indSek)) {
  289.         printf("Datoteka je prazna!\n");
  290.         return;
  291.     }
  292.  
  293.     int i=0;
  294.  
  295.     blok.glava=NULL;
  296.  
  297.     sekv = fopen("sekvencijalna","rb");
  298.  
  299.     while (fread(&temp, sizeof(Slog), 1, sekv)) {
  300.            if (i == F_BL) {
  301.                 fwrite(&blok, sizeof(Blok_primarne_zone), 1, indSek);
  302.                 i = 0;
  303.            }
  304.             blok.slogovi[i] = temp;
  305.             i++;
  306.     }
  307.  
  308.     fwrite(&blok, sizeof(Blok_primarne_zone), 1, indSek);
  309.  
  310.     fclose(sekv);
  311.     fclose(indSek);
  312. }
  313.  
  314. /*******************************************************************************************************************/
  315.  
  316. void formiranjeZoneIndeksa(){
  317.     int brojBlokova = 0;
  318.     Blok temp;
  319.  
  320.     sekv = fopen("sekvencijalna","rb");
  321.  
  322.     while (fread(&temp, sizeof(Blok),1, sekv)) {
  323.         brojBlokova++;
  324.     }
  325.     fclose(sekv);
  326.  
  327.     int visinaStabla = ceil(log2(brojBlokova)); // formula
  328.  
  329.     int brojCvorova = 0;
  330.  
  331.     int i;
  332.  
  333.     for (i=0; i < visinaStabla; i++) {
  334.         brojCvorova += ceil((float)brojBlokova/pow(RST, (visinaStabla - i))); // formula..
  335.     }
  336.  
  337.     int brojListova = ceil((float)brojBlokova/(float)RST);
  338.  
  339.     printf("\nBroj blokova: %d", brojBlokova);
  340.     printf("\nVisina stabla: %d", visinaStabla);
  341.     printf("\nBroj cvorova: %d", brojCvorova);
  342.     printf("\nBroj listova: %d", brojListova);
  343.  
  344.  
  345.     listaListova *glava = NULL;
  346.     listaListova *iteratorListe;
  347.  
  348.     sekv = fopen("sekvencijalna","rb");
  349.     Blok bls;
  350.     Slog_u_zoni_indexa slog1,slog2;
  351.     Blok_u_zoni_indexa kBlo;
  352.     ElementNiza niz[brojCvorova];
  353.  
  354. // Ovo nemam pojma, pomago mi drug...
  355.     int brojacElemenata = 0;
  356.     for(i=0; i< brojBlokova; i++) {
  357.             fread(&bls,sizeof(Blok),1,sekv);
  358.             if (i%2 == 0){
  359.                 slog1 = *((Slog_u_zoni_indexa*) malloc(sizeof(Slog_u_zoni_indexa)));
  360.                 slog1.kljuc = bls.slogovi[F_BL-1].e_br;
  361.                 slog1.adresa_bloka = i;
  362.             }
  363.             else {
  364.                 slog2 = *((Slog_u_zoni_indexa*) malloc( sizeof(Slog_u_zoni_indexa)));
  365.                 slog2.kljuc = bls.slogovi[F_BL-1].e_br;
  366.                 slog2.adresa_bloka = i;
  367.             }
  368.  
  369.             if (i%2 == 1) {
  370.                 kBlo.slogovi[0] = slog1;
  371.                 kBlo.slogovi[1] = slog2;
  372.                 dodajList(&glava, &kBlo);
  373.                 niz[brojacElemenata].blok = kBlo;
  374.                 niz[brojacElemenata].kljuc = brojacElemenata;
  375.                 brojacElemenata++;
  376.             }
  377.     }
  378.  
  379.     if (brojBlokova%2 == 1) {
  380.         kBlo.slogovi[0]=slog1;
  381.         slog2 = *((Slog_u_zoni_indexa*) malloc( sizeof(Slog_u_zoni_indexa)));
  382.         slog2.adresa_bloka = -1;
  383.         slog2.kljuc = 0;
  384.         kBlo.slogovi[1] = slog2;
  385.         dodajList(&glava, &kBlo);
  386.         niz[brojacElemenata].blok = kBlo;
  387.         niz[brojacElemenata].kljuc = brojacElemenata;
  388.         brojacElemenata++;
  389.     }
  390.     fclose(sekv);
  391.  
  392.     indSek = fopen(aktivna, "ab");
  393.  
  394.     iteratorListe = glava;
  395.     printf("\n*************NIVO%d******************", visinaStabla);
  396.     while (iteratorListe != NULL){
  397.         printf("\n*******************************");
  398.          printf("\n Adresa %d\nKljuc %ld", iteratorListe->blok.slogovi[0].adresa_bloka, iteratorListe->blok.slogovi[0].kljuc);
  399.          printf("\n Adresa %d\nKljuc %ld", iteratorListe->blok.slogovi[1].adresa_bloka, iteratorListe->blok.slogovi[1].kljuc);
  400.         printf("\n**********************************\\/n");
  401.         Blok_u_zoni_indexa blok = iteratorListe->blok;
  402.         fwrite(&blok, sizeof(Blok_u_zoni_indexa), 1, indSek);
  403.  
  404.          iteratorListe = iteratorListe->next;
  405.     }
  406.     fclose(indSek);
  407.  
  408.     int k;
  409.     for (k=0; k < visinaStabla-1; k++){
  410.         listaListova *glava2 = NULL;
  411.  
  412.         iteratorListe = glava;
  413.         Blok_u_zoni_indexa kBlo2;
  414.         int brB = 0;
  415.  
  416.         while (iteratorListe != NULL){
  417.             if (brB == 2) {
  418.                 dodajList(&glava2, &kBlo2);
  419.                 niz[brojacElemenata].blok = kBlo;
  420.                 niz[brojacElemenata].kljuc = brojacElemenata;
  421.                 brojacElemenata++;
  422.                 brB = 0;
  423.                 continue;
  424.             }
  425.  
  426.             if (iteratorListe->blok.slogovi[1].kljuc != 0)
  427.                 kBlo2.slogovi[brB] = iteratorListe->blok.slogovi[1];
  428.             else
  429.                 kBlo2.slogovi[brB] = iteratorListe->blok.slogovi[0];
  430.  
  431.  
  432.              iteratorListe = iteratorListe->next;
  433.              brB++;
  434.         }
  435.  
  436.         if (brB == 1) {
  437.             kBlo2.slogovi[1].adresa_bloka = -1;
  438.             kBlo2.slogovi[1].kljuc = 0;
  439.         }
  440.  
  441.          dodajList(&glava2, &kBlo2);
  442.          niz[brojacElemenata].blok = kBlo;
  443.          niz[brojacElemenata].kljuc = brojacElemenata;
  444.          brojacElemenata++;
  445.  
  446.          printf("\n************NIVO%d*******************", visinaStabla-k-1);
  447.         iteratorListe = glava2;
  448.  
  449.         indSek = fopen(aktivna, "ab");
  450.  
  451.         while (iteratorListe != NULL) {
  452.             printf("\n*******************************");
  453.              printf("\n Adresa %d\nKljuc %ld", iteratorListe->blok.slogovi[0].adresa_bloka, iteratorListe->blok.slogovi[0].kljuc);
  454.              printf("\n Adresa %d\nKljuc %ld", iteratorListe->blok.slogovi[1].adresa_bloka, iteratorListe->blok.slogovi[1].kljuc);
  455.             printf("\n*******************************");
  456.             Blok_u_zoni_indexa blok2 = iteratorListe->blok;
  457.  
  458.         fwrite(&blok2,sizeof(Blok_u_zoni_indexa), 1, indSek);
  459.              iteratorListe = iteratorListe->next;
  460.         }
  461.         fclose(indSek);
  462.         brojCvorova = (brojCvorova % 2) + (brojCvorova / 2);
  463.         glava = glava2;
  464.         }
  465.  
  466.       //  printf("\nDEBUG\n");
  467.  
  468.        /* int nesto=0;
  469.         for(nesto;nesto<brojacElemenata;nesto++){
  470.             printf("\nkljuc %d",niz[nesto].kljuc);
  471.             printf("\nslog1 adresa %d  ev broj %ld",niz[nesto].blok.slogovi[0].adresa_bloka,niz[nesto].blok.slogovi[0].kljuc);
  472.             printf("\nslog2 adresa %d  ev broj %ld",niz[nesto].blok.slogovi[1].adresa_bloka,niz[nesto].blok.slogovi[1].kljuc);
  473.         }
  474.         */
  475. }
  476.  
  477. /*******************************************************************************************************************/
  478.  
  479. // 6.
  480. void formiranjeIndexSekvencijalne() {
  481.  
  482.     sekv = fopen("sekvencijalna","rb");
  483.  
  484.     int brojBlokova = 0;
  485.     Blok temp;
  486.  
  487.     sekv=fopen("sekvencijalna","rb");
  488.  
  489.     while (fread(&temp,sizeof(Blok), 1, sekv)){
  490.         brojBlokova++;
  491.     }
  492.     fclose(sekv);
  493.  
  494.     int visinaStabla = ceil(log2(brojBlokova));
  495.  
  496.     int brojCvorova = 0;
  497.  
  498.     int i;
  499.     for(i=0; i<visinaStabla; i++){
  500.         brojCvorova += ceil((float)brojBlokova/pow(RST,(visinaStabla - i)));
  501.     }
  502.  
  503.     Zaglavlje blokZaglavlja;
  504.     blokZaglavlja.br_blokova_pz=brojBlokova;
  505.     blokZaglavlja.br_blokova_zi=brojCvorova;
  506.     blokZaglavlja.adresa_pocetka_zi=-1;
  507.  
  508.  
  509.     if (strcmp(aktivna,"") == 0){
  510.         printf("\nNijedna datoteka nije aktivna!\n");
  511.         return;
  512.     }
  513.  
  514.     indSek = fopen(aktivna,"wb");
  515.     fwrite(&blokZaglavlja, sizeof(Zaglavlje), 1, indSek);
  516.     fclose(indSek);
  517.  
  518.     formiranjePrimarneZone();
  519.     formiranjeZoneIndeksa();
  520.  
  521.     listaSlogovaPre *glava = NULL;
  522.     listaSlogovaPre *iteratorListe;
  523.  
  524.     Slog_prekoracilac slog;
  525.     slog.prekoracilac.e_br = 0;
  526.  
  527.     int j;
  528.     for(j=0; j < MAX_PREKORACILACA; j++){
  529.         dodajSlogPre(&glava, &slog);
  530.     }
  531.     Slog_prekoracilac slog2;
  532.     iteratorListe=glava;
  533.  
  534.     indSek = fopen(aktivna, "ab");
  535.  
  536.     while (iteratorListe != NULL) {
  537.         slog2=iteratorListe->slog;
  538.         fwrite(&slog2,sizeof(Slog_prekoracilac), 1, indSek);
  539.         iteratorListe = iteratorListe->next;
  540.     }
  541.  
  542.     fclose(indSek);
  543.     indSek = fopen(aktivna, "rb");
  544.     rewind(indSek);
  545.     fseek(indSek,sizeof(Zaglavlje),SEEK_SET);
  546.     fseek(indSek,brojBlokova*sizeof(Blok_primarne_zone), SEEK_CUR);
  547.     fseek(indSek,brojCvorova*sizeof(Blok_u_zoni_indexa), SEEK_CUR);
  548.     int pocetakZonePrekoracenja = ftell(indSek);
  549.     fclose(indSek);
  550.  
  551.     blokZaglavlja.adresa_pocetka_zi = pocetakZonePrekoracenja;
  552.  
  553.     indSek = fopen(aktivna, "rb+");
  554.     rewind(indSek);
  555.     fwrite(&blokZaglavlja,sizeof(Zaglavlje), 1, indSek);
  556.     fclose(indSek);
  557.  
  558.     indSek = fopen(aktivna, "rb+");
  559.     fseek(indSek, pocetakZonePrekoracenja, SEEK_SET);
  560.     int korak = sizeof(Slog_prekoracilac);
  561.     Slog_prekoracilac sp;
  562.     for(i=0; i < MAX_PREKORACILACA; i++){
  563.         fread(&sp, sizeof(Slog_prekoracilac), 1, indSek);
  564.         sp.sledeci = ftell(indSek) + korak;
  565.     }
  566.     fclose(indSek);
  567. }
  568.  
  569. /*******************************************************************************************************************/
  570.  
  571. // 10.
  572. void ispisCeleDatoteke(){
  573.     if (strcmp(aktivna,"")==0){
  574.         printf("\nNijedna datoteka nije aktivna!\n");
  575.         return;
  576.     }
  577.  
  578.     indSek = fopen(aktivna,"rb");
  579.  
  580.     if (isEmpty(indSek)) {
  581.         printf("Datoteka je prazna!\n");
  582.         return;
  583.     }
  584.  
  585.     Zaglavlje zag;
  586.  
  587.     fread(&zag,sizeof(Zaglavlje),1,indSek);
  588.  
  589.     printf("\n********PRIMARNA ZONA*******\n");
  590.     int i, j;
  591.     Blok_primarne_zone temp;
  592.     for(i=0; i < zag.br_blokova_pz; i++) {
  593.         fread(&temp, sizeof(Blok_primarne_zone), 1, indSek);
  594.         for(j=0; j < F_BL; j++) {
  595.             Slog tempSlog;
  596.             tempSlog = temp.slogovi[j];
  597.             int adresaBloka = ftell(indSek);
  598.             int rbSloga = j;
  599.             printf("\nAdresa bloka: %d", adresaBloka);
  600.             printf("\nRedni broj sloga u bloku: %d", rbSloga);
  601.             printf("\nEvidencioni broj: %ld", tempSlog.e_br);
  602.             printf("\nSifra zatvorenika: %s", tempSlog.sifra_zat);
  603.             printf("\nDatum i vrijeme: %s", tempSlog.datum);
  604.             printf("\nOznaka celije: %s", tempSlog.oznaka_celije);
  605.             printf("\nDuzina kazne: %d", tempSlog.duzina_kazne);
  606.             printf("\n******************************************\n");
  607.         }
  608.     }
  609.  
  610.     rewind(indSek);
  611.     fseek(indSek, zag.adresa_pocetka_zi, SEEK_SET);
  612.  
  613.     printf("\n\n********ZONA PREKORACENJA*******\n");
  614.     Slog_prekoracilac tempSlogPrekoracilac;
  615.     for(i=0; i < MAX_PREKORACILACA; i++) {
  616.         fread(&tempSlogPrekoracilac, sizeof(Slog_prekoracilac), 1, indSek);
  617.  
  618.         if (tempSlogPrekoracilac.prekoracilac.e_br > 0){
  619.             printf("\nEvidencioni broj: %ld", tempSlogPrekoracilac.prekoracilac.e_br);
  620.             printf("\nSifra zatvorenika: %s", tempSlogPrekoracilac.prekoracilac.sifra_zat);
  621.             printf("\nDatum i vrijeme: %s", tempSlogPrekoracilac.prekoracilac.datum);
  622.             printf("\nOznaka celije: %s", tempSlogPrekoracilac.prekoracilac.oznaka_celije);
  623.             printf("\nDuzina kazne: %d", tempSlogPrekoracilac.prekoracilac.duzina_kazne);
  624.             printf("\n******************************************\n");
  625.         }
  626.     }
  627.     fclose(indSek);
  628. }
  629.  
  630. /*******************************************************************************************************************/
  631.  
  632. // 7.
  633. void upisSloga() {
  634.  
  635.     if (strcmp(aktivna, "") == 0){
  636.         printf("\nNijedna datoteka nije aktivna");
  637.         return;
  638.     }
  639.  
  640.     indSek = fopen(aktivna,"rb");
  641.  
  642.     Zaglavlje zag;
  643.  
  644.     fread(&zag, sizeof(Zaglavlje), 1, indSek);
  645.  
  646.     int i, j, k = 0;
  647.     int nkljucevi = zag.br_blokova_pz * F_BL + MAX_PREKORACILACA;
  648.     unsigned long kljucevi[nkljucevi];
  649.  
  650.     Blok_primarne_zone tempBlok;
  651.     Slog tempSlog;
  652.  
  653.     for(i=0; i < zag.br_blokova_pz; i++) {
  654.         fread(&tempBlok, sizeof(Blok_primarne_zone), 1, indSek);
  655.         for(j=0; j < F_BL; j++) {
  656.             tempSlog = tempBlok.slogovi[i];
  657.             kljucevi[k] = tempSlog.e_br;
  658.             k++;
  659.         }
  660.     }
  661.     fseek(indSek, zag.adresa_pocetka_zi, SEEK_SET);
  662.  
  663.     Slog_prekoracilac tempSlogPre;
  664.  
  665.     for (i=0; i < MAX_PREKORACILACA; i++) {
  666.         fread(&tempSlogPre, sizeof(Slog_prekoracilac), 1, indSek);
  667.         kljucevi[k] = tempSlogPre.prekoracilac.e_br;
  668.         k++;
  669.     }
  670.     fclose(indSek);
  671.  
  672.     unsigned long kljuc;
  673.     Slog novi;
  674.  
  675.     printf("\n\n** Unos novog sloga **");
  676.  
  677.     do {
  678.         printf("\nEvidencioni broj (10000000-99999999): ");
  679.         fflush(stdin);
  680.         scanf("%ld", &kljuc);
  681.         for (i=0; i < nkljucevi; i++) {
  682.             if (kljucevi[i] == kljuc){
  683.                 printf("\nEvidencioni broj vec postoji!\n");
  684.                 kljuc = 0;
  685.                 break;
  686.             }
  687.         }
  688.     }while (kljuc < 10000000 || kljuc > 99999999);
  689.  
  690.         novi.e_br = kljuc;
  691.  
  692.         printf("\nUnesite sifru zatvorenika (max. 7 znakova!):\t");
  693.         fflush(stdin);
  694.         gets(novi.sifra_zat);
  695.  
  696.         int d, m, g, s, minut; // Datum!
  697.         printf("\nUnos datuma i vremena:\n");
  698.         do {
  699.             printf("\nUnesite godinu:\t");
  700.             fflush(stdin);
  701.             scanf("%d", &g);
  702.         } while (g < 1900 || g > 2100);
  703.  
  704.         do{
  705.             printf("\nUnesite mjesec:\t");
  706.             fflush(stdin);
  707.             scanf("%d", &m);
  708.         } while (m<1 || m>12);
  709.  
  710.         // Kontrole:
  711.         switch (m) {
  712.             case 1:
  713.             case 3:
  714.             case 5:
  715.             case 7:
  716.             case 8:
  717.             case 10:
  718.             case 12:
  719.                 do {
  720.                     printf("\nUnesite dan:\t");
  721.                     fflush(stdin);
  722.                     scanf("%d", &d);
  723.                 } while (d < 1 || d > 31);
  724.                 break;
  725.             case 4:
  726.             case 6:
  727.             case 9:
  728.             case 11:
  729.                 do {
  730.                     printf("\nUnesi dan:\t");
  731.                     fflush(stdin);
  732.                     scanf("%d", &d);
  733.                 } while (d < 1 || d > 31);
  734.                 break;
  735.             case 2:
  736.                 if (g % 4 == 0) {
  737.                     do {
  738.                         printf("\nUnesite dan:\t");
  739.                         fflush(stdin);
  740.                         scanf("%d", &d);
  741.                     } while (d < 1 || d > 29);
  742.                 }
  743.                 else {
  744.                     do {
  745.                         printf("\nUnesite dan:\t");
  746.                         fflush(stdin);
  747.                         scanf("%d", &d);
  748.                     } while (d < 1 || d > 28);
  749.                 }
  750.                 break;
  751.         }
  752.         do {
  753.             printf("\nUnesite sat:\t");
  754.             fflush(stdin);
  755.             scanf("%d", &s);
  756.         } while (s < 0 || s > 23);
  757.  
  758.         do {
  759.             printf("\nUnesite minut:\t");
  760.             fflush(stdin);
  761.             scanf("%d", &minut);
  762.         } while (minut < 0 || minut > 59);
  763.  
  764.          sprintf(novi.datum, "%d.%d.%d. %d:%d", d, m, g, s, minut);
  765.  
  766.         do {
  767.             printf("\nUnesite oznaku celije zatvorenika (Tacno 5 karaktera):\t");
  768.             fflush(stdin);
  769.             gets(novi.oznaka_celije);
  770.  
  771.         } while (strlen(novi.oznaka_celije) != 5);
  772.  
  773.         do {
  774.             printf("\nUnesite duzinu kazne (max. 480 mjeseci!): ");
  775.             fflush(stdin);
  776.             scanf("%d", &novi.duzina_kazne);
  777.         }while (novi.duzina_kazne < 1 || novi.duzina_kazne > 480);
  778.  
  779.         indSek = fopen(aktivna,"rb+");
  780.         fseek(indSek,zag.adresa_pocetka_zi,SEEK_SET);
  781.  
  782.  
  783.         for (i=0; i < MAX_PREKORACILACA; i++) {
  784.             fread(&tempSlogPre, sizeof(Slog_prekoracilac), 1, indSek);
  785.             if(tempSlogPre.prekoracilac.e_br == 0) {
  786.                 fseek(indSek, zag.adresa_pocetka_zi + i * sizeof(Slog_prekoracilac), SEEK_SET);
  787.                 fwrite(&novi, sizeof(Slog), 1, indSek);
  788.                 break;
  789.             }
  790.         }
  791.         fclose(indSek);
  792. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement