Advertisement
Lauda

Untitled

Nov 5th, 2014
312
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 27.65 KB | None | 0 0
  1. #include "liste.h"
  2.  
  3. void dodajSlog(listaSlogova** glava, Slog* slog) {
  4.  
  5.     listaSlogova *prethodni, *trenutni;
  6.     listaSlogova *temp = (listaSlogova*) malloc(sizeof(listaSlogova));
  7.     memcpy(&temp->slog, slog, sizeof(Slog));
  8.  
  9.     if ((*glava) == NULL || (slog->ecidencioni_broj < (*glava)->slog.ecidencioni_broj)) {
  10.         temp->next = *glava;
  11.         *glava = temp;
  12.     }
  13.     else
  14.     {
  15.         prethodni = *glava;
  16.         trenutni = (*glava)->next;
  17.  
  18.         while (1) {
  19.             if ((trenutni == NULL) || (trenutni->slog.ecidencioni_broj > slog->ecidencioni_broj)) {
  20.                 prethodni->next = temp;
  21.                 temp->next = trenutni;
  22.                 break;
  23.             }
  24.             else {
  25.                 prethodni = trenutni;
  26.                 trenutni = trenutni->next;
  27.             }
  28.         }
  29.     }
  30. }
  31.  
  32. void obrisiListu(listaSlogova** glava) {
  33.  
  34.     listaSlogova* temp = *glava;
  35.     listaSlogova* prosli;
  36.  
  37.     while (temp) {
  38.         prosli = temp;
  39.         temp = temp->next;
  40.         free(prosli);
  41.     }
  42.  
  43.     *glava = NULL;
  44. }
  45.  
  46. void dodajList(listaListova** glava, Blok_u_zoni_indexa* slog) {
  47.  
  48.     listaListova *prethodni, *trenutni;
  49.     listaListova *temp = (listaListova*) malloc(sizeof(listaListova));
  50.     memcpy(&temp->blok, slog, sizeof(Blok_u_zoni_indexa));
  51.  
  52.     if ((*glava) == NULL) {
  53.         temp->next = *glava;
  54.         *glava = temp;
  55.     }
  56.     else
  57.     {
  58.         prethodni = *glava;
  59.         trenutni = (*glava)->next;
  60.  
  61.         while (1) {
  62.             if ((trenutni == NULL) ) {
  63.                 prethodni->next = temp;
  64.                 temp->next = trenutni;
  65.                 break;
  66.             }
  67.             else {
  68.                 prethodni = trenutni;
  69.                 trenutni = trenutni->next;
  70.             }
  71.         }
  72.     }
  73. }
  74.  
  75. void obrisiListuListova(listaListova** glava) {
  76.  
  77.     listaListova* temp = *glava;
  78.     listaListova* prosli;
  79.  
  80.     while (temp) {
  81.         prosli = temp;
  82.         temp = temp->next;
  83.         free(prosli);
  84.     }
  85.  
  86.     *glava = NULL;
  87. }
  88.  
  89. void dodajSlogPre(listaSlogovaPre** glava, Slog_prekoracilac* slog) {
  90.  
  91.     listaSlogovaPre *prethodni, *trenutni;
  92.     listaSlogovaPre *temp = (listaSlogovaPre*) malloc(sizeof(listaSlogovaPre));
  93.     memcpy(&temp->slog, slog, sizeof(Slog));
  94.  
  95.     if ((*glava) == NULL ) {
  96.         temp->next = *glava;
  97.         *glava = temp;
  98.     }
  99.     else
  100.     {
  101.         prethodni = *glava;
  102.         trenutni = (*glava)->next;
  103.  
  104.         while (1) {
  105.             if ((trenutni == NULL) ) {
  106.                 prethodni->next = temp;
  107.                 temp->next = trenutni;
  108.                 break;
  109.             }
  110.             else {
  111.                 prethodni = trenutni;
  112.                 trenutni = trenutni->next;
  113.             }
  114.         }
  115.     }
  116. }
  117.  
  118. void obrisiListuPre(listaSlogovaPre** glava) {
  119.  
  120.     listaSlogovaPre* temp = *glava;
  121.     listaSlogovaPre* prosli;
  122.  
  123.     while (temp) {
  124.         prosli = temp;
  125.         temp = temp->next;
  126.         free(prosli);
  127.     }
  128.  
  129.     *glava = NULL;
  130. }
  131.  
  132. void dodajBlok(ListoviStabla** glava, Blok_u_zoni_indexa* blok) {
  133.  
  134.     if((*glava) == NULL){
  135.         *glava = (ListoviStabla*) malloc(sizeof(ListoviStabla));
  136.         memcpy(&(*glava)->blokZI, blok, sizeof(Blok_u_zoni_indexa));
  137.         (*glava)->next = NULL;
  138.     }
  139.     else{
  140.         ListoviStabla *temp = (ListoviStabla*) malloc(sizeof(ListoviStabla));
  141.         memcpy(&temp->blokZI, blok, sizeof(Blok_u_zoni_indexa));
  142.         temp->next = NULL;
  143.         ListoviStabla *pom = *glava;
  144.         while(pom->next != NULL)
  145.             pom = pom->next;
  146.         pom->next = temp;
  147.     }
  148. }
  149.  
  150. void obrisiListuST(ListoviStabla** glava) {
  151.  
  152.     ListoviStabla* temp = *glava;
  153.     ListoviStabla* prosli;
  154.  
  155.     while (temp) {
  156.         prosli = temp;
  157.         temp = temp->next;
  158.         free(prosli);
  159.     }
  160.  
  161.     *glava = NULL;
  162. }
  163.  
  164. #include "zatvor.h"
  165. #include "liste.h"
  166.  
  167. void clb() {
  168.     fflush(stdin);
  169. }
  170.  
  171. void cls() {
  172.     system("cls");
  173. }
  174. /*
  175. //-------------------------------------------------------------------------------------------------
  176.  
  177. int bucketAddress(char *key) {
  178.     int m = BLOCK_FACTOR;
  179.     int p = MAX_LEN_ENTRY;    // broj karaktera evidencionog broja
  180.     int sum = 0, i = 0, addr = 0;
  181.  
  182.     for (i = 0; i < p; i++) {
  183.         // skuplja karatkere i od toga pravi sumu (tj broj koji je unijet)
  184.         sum += (key[i] - 48) * pow(10, (-i + p-1));
  185.     }
  186.     //  printf("\n\n%d\n\n", suma); // samo provjera unijete vrijednosti evidencionog broja
  187.  
  188.     addr = 1 + sum % m;
  189.  
  190.     return addr;
  191. }
  192.  
  193. //-------------------------------------------------------------------------------------------------
  194.  
  195. void open_active_file(active_file *dat, char *name) {
  196.     if ((dat->dat = fopen(name, "rb+")) == NULL) {
  197.         printf("Datoteka '%s' ne postoji.\n", name);
  198.         return;
  199.     }
  200.  
  201.     strcpy(dat->file_name, name);
  202.     printf("Datoteka '%s' je aktivna!\n", name);
  203. }
  204.  
  205. //-------------------------------------------------------------------------------------------------
  206.  
  207. void close_active_file(active_file *dat) {
  208.     if (dat->dat == NULL)
  209.     return;
  210.  
  211.     fclose(dat->dat);
  212.     printf("Aktivna datoteka %s je uspjesno zatvorena!\n", dat->dat);
  213. }
  214.  
  215. //-------------------------------------------------------------------------------------------------
  216.  
  217.  
  218. void show_active_fName(active_file *dat) {
  219.     if ((dat->dat) == NULL ) {
  220.             printf("\nNema aktivnih datoteka.\n");
  221.             return;
  222.     }
  223.  
  224.     printf("Aktivna je datoteka '%s'.\n", dat->file_name);
  225. }
  226.  
  227. //-------------------------------------------------------------------------------------------------
  228.  
  229. void mk_new_file(active_file *dat, char *name) {
  230.     if((dat->dat = fopen(name, "wb")) == NULL) {
  231.         fprintf(stderr, "\nDoslo je do greske prilikom otvaranja datoteke!\n");
  232.         return;
  233.     }
  234.     strcpy(dat->file_name, name);
  235.  
  236.     Zatvor z = {"", "", "", "", ""}; // Inicijalizacija za elemente
  237.     Bucket b;
  238.     // Faktor baketiranja pa idemo do 5 ???
  239.     b.bucket_count[0] = z;
  240.     b.bucket_count[1] = z;
  241.     b.bucket_count[2] = z;
  242.     b.bucket_count[3] = z;
  243.     b.bucket_count[4] = z;
  244.     b.overflow = false;
  245.  
  246.     if (fwrite(&b, sizeof(Bucket), 1, dat->dat) != 1) {
  247.         fprintf(stderr, "\nGreska prilikom zauzimanja memorije za datoteku!\n");
  248.         return;
  249.     }
  250.     printf("\nDatoteka %s uspjesno kreirana!\n", dat->dat);
  251.  
  252.     int bra = bucketAddress(z.k_duration);
  253.     printf("\nDEBUG ADDR_B: %d\n", bra);
  254.  
  255.     fclose(dat->dat);
  256.     open_active_file(dat, name);
  257.  
  258. }
  259.  
  260. //-------------------------------------------------------------------------------------------------
  261. */
  262.  
  263. // 1.
  264. void makeFile(active_file *dat, char *name) {
  265.     if((dat->dat = fopen(name, "wb")) == NULL) {
  266.         printf("\nDoslo je do greske prilikom kreiranja datoteke!\n");
  267.         return;
  268.     }
  269.     else {
  270.         printf("Datoteka %s je uspjesno kreirana!\n", name);
  271.     }
  272.  
  273.     fclose(dat->dat);
  274. }
  275.  
  276. // 2.
  277. void izborAktivne(active_file *dat, char *name) {
  278.     if ((dat->dat = fopen(name, "rb+")) == NULL) {
  279.         printf("Datoteka '%s' ne postoji.\n", name);
  280.         return;
  281.     }
  282.  
  283.     if (indSek != NULL)
  284.         fclose(indSek);
  285.     indSek = dat->dat;
  286.  
  287.     strcpy(dat->file_name, name);
  288.     printf("Datoteka '%s' je aktivna!\n", name);
  289. }
  290.  
  291. // 3.
  292. void prikazAktivne(active_file *dat) {
  293.     if ((dat->dat) == NULL ) {
  294.         printf("\nNema aktivnih datoteka.\n");
  295.         return;
  296.     }
  297.  
  298.     printf("Aktivna je datoteka '%s'.\n", dat->file_name);
  299. }
  300.  
  301. // 4.
  302. void formiranjeSerijske(active_file *dat, char *name) {
  303.     unsigned long kljuc;
  304.     Slog temp;
  305.     Slog novi;
  306.  
  307.     int i;
  308.     for (i = 0; i < BLOCK_FACTOR; i++) {
  309.         dat->dat = fopen("serijska","rb");
  310.         printf("\n %d. slog", i+1);
  311.  
  312.         do{
  313.             printf("\nEvidencioni broj (10000000-99999999): ");
  314.             fflush(stdin);
  315.             scanf("%ld", &kljuc);
  316.             while (fread(&temp, sizeof(Slog), 1, dat->dat)){
  317.                 if (temp.e_br == kljuc) {
  318.                     printf("\nEvidencioni broj postoji!\n");
  319.                     kljuc = 0;
  320.                     break;
  321.                 }
  322.             }
  323.         } while (kljuc < 10000000 || kljuc > 99999999);
  324.  
  325.         novi.e_br = kljuc;
  326.  
  327.         fclose(dat->dat);
  328.  
  329.         printf("\nUnesite sifru zatvorenika (max. 7 znakova!):\t");
  330.         fflush(stdin);
  331.         gets(novi.z_id);
  332.  
  333.         int d, m, g, s, minut; // Datum!
  334.         printf("\nUnos datuma i vremena:\n");
  335.         do {
  336.             printf("\nUnesite godinu:\t");
  337.             fflush(stdin);
  338.             scanf("%d", &g);
  339.         } while (g < 1900 || g > 2100);
  340.  
  341.         do{
  342.             printf("\nUnesite mjesec:\t");
  343.             fflush(stdin);
  344.             scanf("%d", &m);
  345.         } while (m<1 || m>12);
  346.  
  347.         // Kontrole:
  348.         switch (m) {
  349.             case 1:
  350.             case 3:
  351.             case 5:
  352.             case 7:
  353.             case 8:
  354.             case 10:
  355.             case 12:
  356.                 do {
  357.                     printf("\nUnesite dan:\t");
  358.                     fflush(stdin);
  359.                     scanf("%d", &d);
  360.                 } while (d < 1 || d > 31);
  361.                 break;
  362.             case 4:
  363.             case 6:
  364.             case 9:
  365.             case 11:
  366.                 do {
  367.                     printf("\nUnesi dan:\t");
  368.                     fflush(stdin);
  369.                     scanf("%d", &d);
  370.                 } while (d < 1 || d > 31);
  371.                 break;
  372.             case 2:
  373.                 if (g % 4 == 0) {
  374.                     do {
  375.                         printf("\nUnesite dan:\t");
  376.                         fflush(stdin);
  377.                         scanf("%d", &d);
  378.                     } while (d < 1 || d > 29);
  379.                 }
  380.                 else {
  381.                     do {
  382.                         printf("\nUnesite dan:\t");
  383.                         fflush(stdin);
  384.                         scanf("%d", &d);
  385.                     } while (d < 1 || d > 28);
  386.                 }
  387.                 break;
  388.  
  389.  
  390.         }
  391.         do {
  392.             printf("\nUnesite sat:\t");
  393.             fflush(stdin);
  394.             scanf("%d", &s);
  395.         } while (s < 0 || s > 23);
  396.  
  397.         do {
  398.             printf("\nUnesite minut:\t");
  399.             fflush(stdin);
  400.             scanf("%d", &minut);
  401.         } while (minut < 0 || minut > 59);
  402.  
  403.          sprintf(novi.dt_arrival, "%d.%d.%d. %d:%d", d, m, g, s, minut);
  404.  
  405.         do {
  406.             printf("\nUnesite oznaku celije zatvorenika (Tacno 5 karaktera):\t");
  407.             fflush(stdin);
  408.             gets(novi.id_cell);
  409.  
  410.         } while (strlen(novi.id_cell) != 5);
  411.  
  412.         do {
  413.             printf("\nUnesite duzinu kazne (max. 480 mjeseci!): ");
  414.             fflush(stdin);
  415.             scanf("%d", &novi.k_duration);
  416.         }while (novi.k_duration < 1 || novi.k_duration > 480);
  417.  
  418.         dat->dat = fopen("serijska", "ab+");
  419.         fwrite(&novi, sizeof(Slog), 1, dat->dat);
  420.         fclose(dat->dat);
  421.  
  422.     }
  423. }
  424.  
  425. void citajSerijsku() {
  426.     active_file *dat;
  427.  //   Blok blok;
  428.     Slog temp;
  429.     dat->dat = fopen("serijska", "rb");
  430.     while (fread(&temp, sizeof(Slog), 1, dat->dat)){
  431.         printf("\nE_BR: %ld\nS_Z: %s\nDat: %s\nC_ID: %s\nD_KZ: %d\n",temp.e_br,temp.z_id,temp.dt_arrival,temp.id_cell,temp.k_duration);
  432.     }
  433. }
  434.  
  435. void citajSekvencijalnu(){
  436.    active_file *dat;
  437.  //   Blok blok;
  438.     Slog temp;
  439.     dat->dat = fopen("sekvencijalna", "rb");
  440.     while (fread(&temp, sizeof(Slog), 1, dat->dat)){
  441.          printf("\nE_BR: %ld\nS_Z: %s\nDat: %s\nC_ID: %s\nD_KZ: %d\n",temp.e_br,temp.z_id,temp.dt_arrival,temp.id_cell,temp.k_duration);
  442.     }
  443. }
  444.  
  445. // 5.
  446. void formirajSekvencijalnu() {
  447.     FILE *ser;
  448.     FILE *sekv;
  449.     Slog temp;
  450.     Blok blok;
  451.     listaSlogova *glava = NULL;
  452.     listaSlogova *iteratorListe;
  453.     ser = fopen("serijska", "rb");
  454.  
  455.     int i = 0; //brojac broja slogova
  456.  
  457.     //citamo iz serijske i upisujemo na odg. mjesto u listu
  458.     while (fread(&temp, sizeof(Slog), 1, ser)) {
  459.         dodajSlog(&glava, &temp );
  460.     }
  461.     fclose(ser);
  462.  
  463.     //citamo iz liste i pisemo u sekvencijalnu
  464.     sekv = fopen("sekvencijalna", "wb");
  465.     iteratorListe = glava;
  466.  
  467.     while(iteratorListe != NULL) {
  468.         blok.slogovi[i] = iteratorListe->slog;
  469.         i++;
  470.         if (i == BLOCK_FACTOR) {
  471.             fwrite(&blok, sizeof(Blok), 1, sekv);
  472.             i = 0;
  473.         }
  474.         iteratorListe = iteratorListe->next;
  475.     }
  476.  
  477.   //  blok.slogovi[0].ecidencioni_broj = -1; //upisi preostale i oznaku kraja podataka
  478.  //   fwrite(&blok, sizeof(Blok), 1, sekv);
  479.  
  480.     //zatvori fajl i oslobodi liste
  481.     fclose(sekv);
  482.     free(iteratorListe);
  483.     obrisiListu(&glava);
  484. }
  485.  
  486. void formirajPrimarnuZonu(active_file *dat){
  487.   //  FILE *sekv;
  488.   //  FILE *indSek;
  489.     Slog temp;
  490.     Blok_primarne_zone blok;
  491.  
  492.     indSek = fopen(dat->dat, "ab");
  493.  
  494.     int i = 0;
  495.  
  496.     blok.glava = NULL;
  497.  
  498.     sekv = fopen("sekvencijalna", "rb");
  499.  
  500.     while (fread(&temp, sizeof(Slog), 1, sekv)){
  501.  
  502.            if (i==(BLOCK_FACTOR)) {
  503.                 fwrite(&blok, sizeof(Blok_primarne_zone), 1, indSek);
  504.                 i = 0;
  505.            }
  506.             blok.slogovi[i] = temp;
  507.             i++;
  508.     }
  509.     fwrite(&blok,sizeof(Blok_primarne_zone), 1, indSek);
  510.     fclose(sekv);
  511.     fclose(indSek);
  512. }
  513.  
  514. void formiranjeZoneIndeksa(active_file *dat){
  515.  
  516.    // FILE *sekv;
  517.     int brojBlokova = 0;
  518.     Blok temp;
  519.  
  520.     sekv = fopen("sekvencijalna", "rb");
  521.  
  522.     while (fread(&temp, sizeof(Blok), 1, sekv)){
  523.         brojBlokova++;
  524.     }
  525.     fclose(sekv);
  526.  
  527.     int visinaStabla = ceil(log2(brojBlokova)); // Po formuli
  528.  
  529.     int brojCvorova = 0;
  530.  
  531.     int i;
  532.  
  533.     for(i=0; i < visinaStabla; i++) {
  534.         brojCvorova += ceil((float)brojBlokova/pow(RST,(visinaStabla-i))); // Po formuli!
  535.     }
  536.  
  537.  
  538.     int brojListova = ceil((float)brojBlokova/(float)RST);
  539.  
  540.     printf("\nbroj blokova %d", brojBlokova);
  541.     printf("\nvisina stabla %d", visinaStabla);
  542.     printf("\nbroj cvorova %d", brojCvorova);
  543.     printf("\nbroj listova %d", brojListova);
  544.  
  545.     listaListova *glava = NULL;
  546.     listaListova *iteratorListe;
  547.  
  548.     sekv =fopen("sekvencijalna", "rb");
  549.     Blok bls;
  550.     Slog_u_zoni_indexa slog1,slog2;
  551.     Blok_u_zoni_indexa kBlo;
  552.     ElementNiza niz[brojCvorova];
  553.  
  554.     int brojacElemenata=0;
  555.     for(i=0; i<brojBlokova; i++) {
  556.             fread(&bls, sizeof(Blok), 1, sekv);
  557.             if (i % 2 == 0) {
  558.                 slog1 = *((Slog_u_zoni_indexa*) malloc( sizeof(Slog_u_zoni_indexa)));
  559.                 slog1.kljuc = bls.slogovi[BLOCK_FACTOR-1].e_br;
  560.                 slog1.adresa_bloka=i;
  561.             }
  562.             else{
  563.                 slog2 = *((Slog_u_zoni_indexa*) malloc( sizeof(Slog_u_zoni_indexa)));
  564.                 slog2.kljuc = bls.slogovi[BLOCK_FACTOR-1].e_br;
  565.                 slog2.adresa_bloka = i;
  566.             }
  567.  
  568.             if (i % 2 == 1) {
  569.                 kBlo.slogovi[0] = slog1;
  570.                 kBlo.slogovi[1] = slog2;
  571.                 dodajList(&glava, &kBlo);
  572.                 niz[brojacElemenata].blok = kBlo;
  573.                 niz[brojacElemenata].kljuc = brojacElemenata;
  574.                 brojacElemenata++;
  575.             }
  576.     }
  577.  
  578.     if (brojBlokova % 2 == 1) {
  579.         kBlo.slogovi[0] = slog1;
  580.         slog2 = *((Slog_u_zoni_indexa*) malloc( sizeof(Slog_u_zoni_indexa)));
  581.         slog2.adresa_bloka = -1;
  582.         slog2.kljuc = 0;
  583.         kBlo.slogovi[1] = slog2;
  584.         dodajList(&glava, &kBlo);
  585.         niz[brojacElemenata].blok = kBlo;
  586.         niz[brojacElemenata].kljuc = brojacElemenata;
  587.         brojacElemenata++;
  588.     }
  589.     fclose(sekv);
  590.  
  591.     indSek = fopen(dat->dat, "ab");
  592.  
  593.     iteratorListe=glava;
  594.     printf("\n*************NIVO %d******************", visinaStabla);
  595.     while (iteratorListe != NULL){
  596.         printf("\n*******************************");
  597.          printf("\n adresa %d \n kljuc %ld",iteratorListe->blok.slogovi[0].adresa_bloka, iteratorListe->blok.slogovi[0].kljuc);
  598.          printf("\n adresa %d \n kljuc %ld",iteratorListe->blok.slogovi[1].adresa_bloka, iteratorListe->blok.slogovi[1].kljuc);
  599.         printf("\n*******************************");
  600.         Blok_u_zoni_indexa blok = iteratorListe->blok;
  601.         fwrite(&blok, sizeof(Blok_u_zoni_indexa), 1, indSek);
  602.  
  603.          iteratorListe = iteratorListe->next;
  604.     }
  605.     fclose(indSek);
  606.  
  607.     int k;
  608.     for (k=0; k < visinaStabla-1; k++) {
  609.         listaListova *glava2 = NULL;
  610.    // listaListova *iteratorListe2;
  611.  
  612.         iteratorListe=glava;
  613.         Blok_u_zoni_indexa kBlo2;
  614.         int brB = 0;
  615.  
  616.         while (iteratorListe != NULL){
  617.             if (brB == 2){
  618.                 dodajList(&glava2, &kBlo2);
  619.                 niz[brojacElemenata].blok = kBlo;
  620.                 niz[brojacElemenata].kljuc = brojacElemenata;
  621.                 brojacElemenata++;
  622.                 brB = 0;
  623.                 //iteratorListe = iteratorListe->next;
  624.                 continue;
  625.             }
  626.  
  627.             if (iteratorListe->blok.slogovi[1].kljuc != 0)
  628.                 kBlo2.slogovi[brB]=iteratorListe->blok.slogovi[1];
  629.             else
  630.                 kBlo2.slogovi[brB]=iteratorListe->blok.slogovi[0];
  631.  
  632.  
  633.              iteratorListe = iteratorListe->next;
  634.              brB++;
  635.         }
  636.  
  637.         if (brB == 1) {
  638.             kBlo2.slogovi[1].adresa_bloka = -1;
  639.             kBlo2.slogovi[1].kljuc = 0;
  640.         }
  641.  
  642.          dodajList(&glava2,&kBlo2);
  643.          niz[brojacElemenata].blok=kBlo;
  644.          niz[brojacElemenata].kljuc=brojacElemenata;
  645.          brojacElemenata++;
  646.  
  647.  
  648.  
  649.          printf("\n************NIVO %d*******************", visinaStabla-k-1);
  650.         iteratorListe=glava2;
  651.         indSek=fopen(dat->dat, "ab");
  652.         while (iteratorListe != NULL){
  653.             printf("\n*******************************");
  654.              printf("\n adresa %d \n kljuc %ld",iteratorListe->blok.slogovi[0].adresa_bloka,iteratorListe->blok.slogovi[0].kljuc);
  655.              printf("\n adresa %d \n kljuc %ld",iteratorListe->blok.slogovi[1].adresa_bloka,iteratorListe->blok.slogovi[1].kljuc);
  656.             printf("\n*******************************");
  657.             Blok_u_zoni_indexa blok2=iteratorListe->blok;
  658.         fwrite(&blok2,sizeof(Blok_u_zoni_indexa),1,indSek);
  659.              iteratorListe = iteratorListe->next;
  660.         }
  661.         fclose(indSek);
  662.         brojCvorova = (brojCvorova % 2) + (brojCvorova / 2);
  663.         glava=glava2;
  664.         }
  665.  
  666.       //  printf("\nDEBUG\n");
  667.  
  668.        /* int nesto=0;
  669.         for(nesto;nesto<brojacElemenata;nesto++){
  670.             printf("\nkljuc %d",niz[nesto].kljuc);
  671.             printf("\nslog1 adresa %d  ev broj %ld",niz[nesto].blok.slogovi[0].adresa_bloka,niz[nesto].blok.slogovi[0].kljuc);
  672.             printf("\nslog2 adresa %d  ev broj %ld",niz[nesto].blok.slogovi[1].adresa_bloka,niz[nesto].blok.slogovi[1].kljuc);
  673.         }
  674. */
  675.    //     StabloTrazenja *stablo;
  676.     //    formirajStablo(niz,brojacElemenata,&stablo);
  677.  
  678.        // prikaziStablo(stablo);
  679. }
  680.  
  681. void formiranjeIndexSekvencijalne(active_file *dat, char *name) {
  682.     int brojBlokova = 0;
  683.     Blok temp;
  684.  
  685.     sekv = fopen("sekvencijalna","rb");
  686.  
  687.     while (fread(&temp, sizeof(Blok), 1, sekv)) {
  688.         brojBlokova++;
  689.     }
  690.     fclose(sekv);
  691.  
  692.     int visinaStabla = ceil(log2(brojBlokova));
  693.  
  694.     int brojCvorova=0;
  695.  
  696.     int i;
  697.  
  698.     for(i=0;i<visinaStabla;i++){
  699.         brojCvorova+=ceil((float)brojBlokova/pow(RST,(visinaStabla-i)));
  700.     }
  701.  
  702.     Zaglavlje blokZaglavlja;
  703.     blokZaglavlja.br_blokova_pz=brojBlokova;
  704.     blokZaglavlja.br_blokova_zi=brojCvorova;
  705.     blokZaglavlja.adresa_pocetka_zi=-1;
  706.  
  707.  
  708.  if ((dat->dat = fopen(name, "rb+")) == NULL) {
  709.         printf("Datoteka '%s' ne postoji.\n", name);
  710.         return;
  711.     }
  712.  
  713.     indSek = fopen(dat->dat, "wb");
  714.     fwrite(&blokZaglavlja, sizeof(Zaglavlje), 1, indSek);
  715.     fclose(indSek);
  716.  
  717.     formiranjePrimarneZone();
  718.     formiranjeZoneIndeksa();
  719.  
  720.     listaSlogovaPre *glava=NULL;
  721.     listaSlogovaPre *iteratorListe;
  722.  
  723.     Slog_prekoracilac slog;
  724.     slog.prekoracilac.ecidencioni_broj=0;
  725.  
  726.     int j;
  727.     for(j=0;j<MAX_PREKORACILACA;j++){
  728.         dodajSlogPre(&glava,&slog);
  729.     }
  730.     Slog_prekoracilac slog2;
  731.     iteratorListe=glava;
  732.     indSek=fopen(dat->dat,"ab");
  733.     while (iteratorListe != NULL){
  734.         slog2=iteratorListe->slog;
  735.         fwrite(&slog2,sizeof(Slog_prekoracilac),1,indSek);
  736.         iteratorListe = iteratorListe->next;
  737.     }
  738.     fclose(indSek);
  739.     indSek=fopen(dat->dat,"rb");
  740.     rewind(indSek);
  741.     fseek(indSek,sizeof(Zaglavlje),SEEK_SET);
  742.     fseek(indSek,brojBlokova*sizeof(Blok_primarne_zone),SEEK_CUR);
  743.     fseek(indSek,brojCvorova*sizeof(Blok_u_zoni_indexa),SEEK_CUR);
  744.     int pocetakZonePrekoracenja = ftell(indSek);
  745.     fclose(indSek);
  746.  
  747.     blokZaglavlja.adresa_pocetka_zi=pocetakZonePrekoracenja;
  748.  
  749.     indSek=fopen(dat->dat,"rb+");
  750.     rewind(indSek);
  751.     fwrite(&blokZaglavlja,sizeof(Zaglavlje),1,indSek);
  752.     fclose(indSek);
  753.  
  754.     indSek=fopen(dat->dar,"rb+");
  755.     fseek(indSek,pocetakZonePrekoracenja,SEEK_SET);
  756.     int korak=sizeof(Slog_prekoracilac);
  757.     Slog_prekoracilac sp;
  758.     for(i=0;i<MAX_PREKORACILACA;i++){
  759.         fread(&sp,sizeof(Slog_prekoracilac),1,indSek);
  760.         sp.sledeci=ftell(indSek)+korak;
  761.     }
  762.  
  763.     fclose(indSek);
  764. }
  765.  
  766. void ispisCeleDatoteke(active_file *dat, char *name){
  767.  
  768.  if ((dat->dat = fopen(name, "rb+")) == NULL) {
  769.         printf("Datoteka '%s' ne postoji.\n", name);
  770.         return;
  771.     }
  772.  
  773.     indSek = fopen(dat->dat,"rb");
  774.     Zaglavlje zag;
  775.  
  776.  
  777.     fread(&zag,sizeof(Zaglavlje),1,indSek);
  778.  
  779.  
  780.     printf("\n********PRIMARNA ZONA*******\n");
  781.     int i;
  782.     int j;
  783.     Blok_primarne_zone temp;
  784.     for(i=0;i<zag.br_blokova_pz;i++){
  785.         fread(&temp,sizeof(Blok_primarne_zone),1,indSek);
  786.         for(j=0;j<F_BL;j++){
  787.             Slog tempSlog;
  788.             tempSlog=temp.slogovi[j];
  789.             int adresaBloka = ftell(indSek);
  790.             int rbSloga=j;
  791.             printf("\nAdresa bloka: %d",adresaBloka);
  792.             printf("\nRedni broj sloga u bloku: %d",rbSloga);
  793.             printf("\n\tEvidencioni broj: %ld",tempSlog.e_br);
  794.             printf("\n\tRegistarska oznaka vozila: %s",tempSlog.z_id);
  795.             printf("\n\tDatum i vreme: %s",tempSlog.dt_arrival);
  796.             printf("\n\tKategorija vozila: %s",tempSlog.id_cell);
  797.             printf("\n\tBroj putnika: %d",tempSlog.k_duration);
  798.             printf("\n******************************************");
  799.         }
  800.     }
  801.  
  802.     rewind(indSek);
  803.     fseek(indSek,zag.adresa_pocetka_zi,SEEK_SET);
  804.     printf("\n\n********ZONA PREKORACENJA*******\n");
  805.     Slog_prekoracilac tempSlogPrekoracilac;
  806.     for(i=0;i<MAX_PREKORACILACA;i++){
  807.         fread(&tempSlogPrekoracilac,sizeof(Slog_prekoracilac),1,indSek);
  808.         if (tempSlogPrekoracilac.prekoracilac.e_br>0){
  809.             printf("\n\tEvidencioni broj: %ld",tempSlogPrekoracilac.prekoracilac.e_br);
  810.             printf("\n\tRegistarska oznaka vozila: %s",tempSlogPrekoracilac.prekoracilac.z_id);
  811.             printf("\n\tDatum i vreme: %s",tempSlogPrekoracilac.prekoracilac.dt_arrival);
  812.             printf("\n\tKategorija vozila: %s",tempSlogPrekoracilac.prekoracilac.id_cell);
  813.             printf("\n\tBroj putnika: %d",tempSlogPrekoracilac.prekoracilac.k_duration);
  814.             printf("\n******************************************");
  815.         }
  816.     }
  817.     fclose(indSek);
  818. }
  819.  
  820. void upisSloga(active_file *dat, char *name){
  821.  
  822.  if ((dat->dat = fopen(name, "rb+")) == NULL) {
  823.         printf("Datoteka '%s' ne postoji.\n", name);
  824.         return;
  825.     }
  826.  
  827.     indSek = fopen(dat->dat,"rb");
  828.  
  829.     Zaglavlje zag;
  830.  
  831.     fread(&zag,sizeof(Zaglavlje),1,indSek);
  832.  
  833.     int i;
  834.     int j;
  835.     int k=0;
  836.     int nkljucevi=zag.br_blokova_pz*BLOCK_FACTOR+MAX_PREKORACILACA;
  837.     unsigned long kljucevi[nkljucevi];
  838.  
  839.     Blok_primarne_zone tempBlok;
  840.     Slog tempSlog;
  841.  
  842.     for(i=0;i<zag.br_blokova_pz;i++){
  843.         fread(&tempBlok,sizeof(Blok_primarne_zone),1,indSek);
  844.         for(j=0;j<F_BL;j++){
  845.             tempSlog=tempBlok.slogovi[i];
  846.             kljucevi[k]=tempSlog.e_br;
  847.             k++;
  848.         }
  849.     }
  850.  
  851.     fseek(indSek,zag.adresa_pocetka_zi,SEEK_SET);
  852.  
  853.     Slog_prekoracilac tempSlogPre;
  854.  
  855.     for (i=0;i<MAX_PREKORACILACA;i++){
  856.         fread(&tempSlogPre,sizeof(Slog_prekoracilac),1,indSek);
  857.         kljucevi[k]=tempSlogPre.prekoracilac.e_br;
  858.         k++;
  859.     }
  860.  
  861.     fclose(indSek);
  862.  
  863.     unsigned long kljuc;
  864.     Slog novi;
  865.  
  866.     printf("\n\nUnos novog sloga: ");
  867.  
  868.     do{
  869.             printf("\nEvidencioni broj (10000000-99999999): ");
  870.             fflush(stdin);
  871.             scanf("%ld",&kljuc);
  872.             for (i=0;i<nkljucevi;i++){
  873.                 if (kljucevi[i]==kljuc){
  874.                     printf("\nEvidencioni broj postoji");
  875.                     kljuc=0;
  876.                     break;
  877.                 }
  878.             }
  879.         }while (kljuc<10000000 || kljuc>99999999);
  880.  
  881.         novi.e_br=kljuc;
  882.  
  883.        printf("\nUnesite sifru zatvorenika (max. 7 znakova!):\t");
  884.         fflush(stdin);
  885.         gets(novi.z_id);
  886.  
  887.         int d, m, g, s, minut; // Datum!
  888.         printf("\nUnos datuma i vremena:\n");
  889.         do {
  890.             printf("\nUnesite godinu:\t");
  891.             fflush(stdin);
  892.             scanf("%d", &g);
  893.         } while (g < 1900 || g > 2100);
  894.  
  895.         do{
  896.             printf("\nUnesite mjesec:\t");
  897.             fflush(stdin);
  898.             scanf("%d", &m);
  899.         } while (m<1 || m>12);
  900.  
  901.         // Kontrole:
  902.         switch (m) {
  903.             case 1:
  904.             case 3:
  905.             case 5:
  906.             case 7:
  907.             case 8:
  908.             case 10:
  909.             case 12:
  910.                 do {
  911.                     printf("\nUnesite dan:\t");
  912.                     fflush(stdin);
  913.                     scanf("%d", &d);
  914.                 } while (d < 1 || d > 31);
  915.                 break;
  916.             case 4:
  917.             case 6:
  918.             case 9:
  919.             case 11:
  920.                 do {
  921.                     printf("\nUnesi dan:\t");
  922.                     fflush(stdin);
  923.                     scanf("%d", &d);
  924.                 } while (d < 1 || d > 31);
  925.                 break;
  926.             case 2:
  927.                 if (g % 4 == 0) {
  928.                     do {
  929.                         printf("\nUnesite dan:\t");
  930.                         fflush(stdin);
  931.                         scanf("%d", &d);
  932.                     } while (d < 1 || d > 29);
  933.                 }
  934.                 else {
  935.                     do {
  936.                         printf("\nUnesite dan:\t");
  937.                         fflush(stdin);
  938.                         scanf("%d", &d);
  939.                     } while (d < 1 || d > 28);
  940.                 }
  941.                 break;
  942.  
  943.  
  944.         }
  945.         do {
  946.             printf("\nUnesite sat:\t");
  947.             fflush(stdin);
  948.             scanf("%d", &s);
  949.         } while (s < 0 || s > 23);
  950.  
  951.         do {
  952.             printf("\nUnesite minut:\t");
  953.             fflush(stdin);
  954.             scanf("%d", &minut);
  955.         } while (minut < 0 || minut > 59);
  956.  
  957.          sprintf(novi.dt_arrival, "%d.%d.%d. %d:%d", d, m, g, s, minut);
  958.  
  959.         do {
  960.             printf("\nUnesite oznaku celije zatvorenika (Tacno 5 karaktera):\t");
  961.             fflush(stdin);
  962.             gets(novi.id_cell);
  963.  
  964.         } while (strlen(novi.id_cell) != 5);
  965.  
  966.         do {
  967.             printf("\nUnesite duzinu kazne (max. 480 mjeseci!): ");
  968.             fflush(stdin);
  969.             scanf("%d", &novi.k_duration);
  970.         }while (novi.k_duration < 1 || novi.k_duration > 480);
  971.  
  972.         indSek=fopen(dat->dat,"rb+");
  973.         fseek(indSek,zag.adresa_pocetka_zi,SEEK_SET);
  974.  
  975.  
  976.         for (i=0;i<MAX_PREKORACILACA;i++){
  977.             fread(&tempSlogPre,sizeof(Slog_prekoracilac),1,indSek);
  978.             if(tempSlogPre.prekoracilac.e_br==0){
  979.                 fseek(indSek,zag.adresa_pocetka_zi+i*sizeof(Slog_prekoracilac),SEEK_SET);
  980.                 fwrite(&novi,sizeof(Slog),1,indSek);
  981.                 break;
  982.             }
  983.         }
  984.         fclose(indSek);
  985.  
  986. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement