Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.32 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include<string.h>
  4.  
  5. typedef struct dadoteka_st{
  6.     char naziv[50];
  7.     int brojBlokova;
  8. }dadoteka;
  9. typedef struct nastavaUSkoli_st{
  10.     char evidencioniBroj[7];
  11.     char naslovNastavneJedinice[51];
  12.     char date[20];
  13.     int brojPrisutnihucenika;
  14. }nastavaUSkoli;
  15. typedef struct promena_st{
  16.     nastavaUSkoli data;
  17.     int akcija; //0 brisanje 1 dodavanje 2 izmena
  18. }promena;
  19. typedef struct blok_st{
  20.     int popunjenost; //kada se doda novi clan popunjenost se povecava
  21.     promena nizPromena[5]; //faktor blokiranje je pet
  22. }blok;
  23. typedef struct node_st{
  24.     promena data;
  25.     struct promena_st * next;
  26. }node;
  27. void insert(node ** lista, promena pr){
  28.     node * tmp = (node*)malloc(sizeof(node));
  29.     tmp->data.akcija = pr.akcija;
  30.     tmp->data.data.brojPrisutnihucenika = pr.data.brojPrisutnihucenika;
  31.     strcpy(tmp->data.data.date,pr.data.date);
  32.     strcpy(tmp->data.data.evidencioniBroj,pr.data.evidencioniBroj);
  33.     strcpy(tmp->data.data.naslovNastavneJedinice,pr.data.naslovNastavneJedinice);
  34.     tmp->next = NULL;
  35.     if(*lista == NULL){
  36.         *lista = tmp;
  37.         return;
  38.     }
  39.     node * it = *lista;
  40.     while(it->next != NULL){
  41.         it = it->next;
  42.     }
  43.     it->next = tmp;
  44. }
  45. void printPromena(promena pr){
  46.     printf("%d %s %s %s %d\n",pr.akcija,pr.data.evidencioniBroj,pr.data.naslovNastavneJedinice,pr.data.date,pr.data.brojPrisutnihucenika);
  47. }
  48. void printList(node * tmp){
  49.     if(tmp == NULL){
  50.         printf("Lista je prazna\n");
  51.         return;
  52.     }
  53.     while(tmp != NULL){
  54.         printPromena(tmp->data);
  55.         tmp = tmp->next;
  56.     }
  57. }
  58. static const promena praznaPromena;
  59. void initBlok(blok * mojBlok){
  60.     mojBlok->popunjenost = 0;
  61.     for(int i=0;i<5;i++){
  62.         mojBlok->nizPromena[i] = praznaPromena;
  63.     }
  64.  
  65. }
  66. void swap(promena * p1, promena * p2){
  67.     promena tmp;
  68.     tmp = *p1;
  69.     *p1 = *p2;
  70.     *p2 = tmp;
  71. }
  72. void sortList(node * tmp){
  73.     node * itI = tmp;
  74.     node * itJ = tmp;
  75.     while(itI != NULL){
  76.         itJ = itI;
  77.         while(itJ != NULL){
  78.             if(strcmp(itI->data.data.evidencioniBroj,itJ->data.data.evidencioniBroj) >= 0){
  79.                 swap(&itI->data,&itJ->data);
  80.             }
  81.             itJ = itJ->next;
  82.         }
  83.         itI = itI->next;
  84.     }
  85. }
  86. void populateSecvential(node ** head){
  87.     FILE * dummyUlaz = fopen("C:\\Users\\mihajlo\\praviProjekat\\cmake-build-debug\\CMakeFiles\\praviProjekat.dir\\ulaz.in","r");
  88.     if(dummyUlaz == NULL){
  89.         printf("greska pri otvaranju ulaznog fajla");
  90.         return;
  91.     }
  92.     * head = NULL;
  93.     promena promena1;
  94.     while(fscanf(dummyUlaz,"%d %s %s %s %d",&promena1.akcija,promena1.data.evidencioniBroj,promena1.data.naslovNastavneJedinice,promena1.data.date,&promena1.data.brojPrisutnihucenika) != EOF){
  95.         insert(head,promena1);
  96.     }
  97.     fclose(dummyUlaz);
  98. }
  99. void dodajListuSerijska(node * head){
  100.     FILE * serijskiFajl = fopen("ulaz.bin","wb+");
  101.     if(head == NULL){
  102.         printf("Lista je prazna, nema sta da se doda u serijsku");
  103.         return;
  104.     }
  105.     int i=0;
  106.     blok blok1;
  107.     initBlok(&blok1);
  108.     while(head != NULL){
  109.         blok1.nizPromena[i] = head->data;
  110.         blok1.popunjenost++;
  111.         if(i==4){
  112.             fwrite(&blok1, sizeof(blok), 1, serijskiFajl);
  113.             initBlok(&blok1);
  114.             i=0;
  115.             head = head->next;
  116.             continue;
  117.         }
  118.         i++;
  119.         head = head->next;
  120.     }
  121.     if(blok1.popunjenost != 0){
  122.         fwrite(&blok1, sizeof(blok), 1, serijskiFajl);
  123.     }
  124.     fclose(serijskiFajl);
  125. }
  126. void printBlok(blok blok1){
  127.     printf("Popunjenost bloka: %d\n", blok1.popunjenost);
  128.     for(int i=0;i<blok1.popunjenost;i++){
  129.         printPromena(blok1.nizPromena[i]);//baca segmentation
  130.     }
  131. }
  132. void printBinarnaDadoteka(dadoteka ulaznaDadoteka){
  133.     printf("Naziv dadoteke: %s\n",ulaznaDadoteka.naziv);
  134.     printf("Broj blokova: %d\n",ulaznaDadoteka.brojBlokova);
  135.     FILE * serijskiFajl = fopen(ulaznaDadoteka.naziv,"rb");
  136.     if(serijskiFajl == NULL){
  137.         printf("Neuspesno otvaranje aktivne dadoteke za ispis");
  138.         return;
  139.     }
  140.     blok pr;
  141.     for(int i=0;i<ulaznaDadoteka.brojBlokova;i++){
  142.         fread(&pr, sizeof(blok),1, serijskiFajl);
  143.         printBlok(pr);
  144.     }
  145.     fclose(serijskiFajl);
  146. }
  147. void delete(){
  148.     FILE * serijskiFajl = fopen("ulaz.bin","wb");
  149.     fclose(serijskiFajl);
  150. }
  151. void insertDataIzlazna(dadoteka * ulazna,dadoteka * izlazna){
  152.     FILE * ulaznaDadoteka = fopen(ulazna->naziv,"rb+");
  153.     FILE * izlaznaSekv = fopen(izlazna->naziv,"wb");
  154.     if(izlaznaSekv == NULL){
  155.         printf("Neuspesno otvaranje izlazne sekv dadoteke");
  156.     }
  157.     izlazna->brojBlokova = ulazna->brojBlokova;
  158.     blok p;
  159.     for(int i=0;i<=ulazna->brojBlokova;i++){
  160.         fread(&p, sizeof(blok),1,ulaznaDadoteka);
  161.         fwrite(&p, sizeof(blok),1,izlaznaSekv);
  162.     }
  163.     fclose(ulaznaDadoteka);
  164.     fclose(izlaznaSekv);
  165. }
  166. int prvoCitanje=0;
  167. int izvisiIzmenuDodavanja(dadoteka * ulaznaDadoteka,dadoteka * izlaznaDadoteka, promena p){
  168.     FILE * serijskiFajl = fopen(ulaznaDadoteka->naziv,"rb");
  169.     FILE * izlazniFajl = fopen(izlaznaDadoteka->naziv,"wb+");
  170.     if(serijskiFajl == NULL){
  171.         printf("Neuspesno otvaranje aktivne dadoteke za ispis u dodavanju");
  172.         return -1;
  173.     }
  174.     izlaznaDadoteka->brojBlokova = 0;
  175.     blok pr;
  176.     initBlok(&pr);
  177.     int i;
  178.     for(i=0;i<ulaznaDadoteka->brojBlokova;i++){
  179.         fread(&pr, sizeof(blok),1, serijskiFajl);
  180.         for(int j=0;j<pr.popunjenost;j++){
  181.             if(strcmp(pr.nizPromena[j].data.evidencioniBroj,p.data.evidencioniBroj) == 0){
  182.                 printf("\n***ERROR: Greska, slog sa istim indetifikacionm kljucem vec postoji***\n");
  183.                 return -1;
  184.             }//treba dodati da se prekida pretraga kada se predje velicina tog indetifikacionog kljuca
  185.             pr.nizPromena[j].akcija = 1;
  186.         }
  187.         fwrite(&pr, sizeof(blok),1,izlazniFajl);
  188.         izlaznaDadoteka->brojBlokova++;
  189.     }
  190.     if(prvoCitanje == 1){
  191.         fread(&pr, sizeof(blok),1, serijskiFajl);
  192.     }
  193.     prvoCitanje = 1;
  194.     if(pr.popunjenost == 5){
  195.         for(int j=0;j<pr.popunjenost;j++){
  196.             if(strcmp(pr.nizPromena[j].data.evidencioniBroj,p.data.evidencioniBroj) == 0){
  197.                 printf("\n***ERROR: Greska, slog sa istim indetifikacionm kljucem vec postoji***\n");
  198.                 return -1;
  199.             }//treba dodati da se prekida pretraga kada se predje velicina tog indetifikacionog kljuca
  200.             pr.nizPromena[j].akcija = 1;
  201.         }
  202.         fwrite(&pr, sizeof(blok),1,izlazniFajl);
  203.         izlaznaDadoteka->brojBlokova++;
  204.         initBlok(&pr);
  205.         pr.nizPromena[0] = p;
  206.         pr.popunjenost++;
  207.         pr.nizPromena[0].akcija = 1;
  208.         fwrite(&pr, sizeof(blok),1,izlazniFajl);
  209.     }else{
  210.         for(int j=0;j<pr.popunjenost;j++){
  211.             if(strcmp(pr.nizPromena[j].data.evidencioniBroj,p.data.evidencioniBroj) == 0){
  212.                 printf("\n***ERROR: Greska, slog sa istim indetifikacionm kljucem vec postoji***\n");
  213.                 return -1;
  214.             }//treba dodati da se prekida pretraga kada se predje velicina tog indetifikacionog kljuca
  215.             pr.nizPromena[j].akcija = 1;
  216.         }
  217.         pr.nizPromena[pr.popunjenost] = p;
  218.         pr.nizPromena[0].akcija = 1;
  219.         pr.popunjenost++;
  220.         fseek(izlazniFajl, sizeof(blok) * izlaznaDadoteka->brojBlokova,SEEK_SET);
  221.         fwrite(&pr, sizeof(blok),1,izlazniFajl);
  222.     }
  223.     fclose(izlazniFajl);
  224.     fclose(serijskiFajl);
  225.     return 1;
  226. }
  227. int izvrsiIzmenuLogickoBrisanje(dadoteka * ulaznaDadoteka, promena p){
  228.     int lokacijaBlok;
  229.     if(traziBlok(*ulaznaDadoteka,p) == -1){
  230.         printf("\n** ERROR: Neuspesno trazenje sloga pri logickom birsanju: ");
  231.         printPromena(p);
  232.         printf("Podaci: \n");
  233.         printBinarnaDadoteka(*ulaznaDadoteka);
  234.         return -1;
  235.     }
  236.     printf("\n*****************************\n");
  237.     printf("Uspesno obrisan slog: ");
  238.     printPromena(p);
  239.     printf("Fajl pre brisanja:\n");
  240.     printBinarnaDadoteka(*ulaznaDadoteka);
  241.     FILE * ulazniFajl = fopen(ulaznaDadoteka->naziv,"rb+");
  242.     fseek(ulazniFajl, sizeof(lokacijaBlok) * lokacijaBlok, SEEK_SET);
  243.     blok b;
  244.     fread(&b, sizeof(blok),1,ulazniFajl);//blok u kojem se nalazi trazeni podatak je ucitan
  245.     for(int i=0;i<b.popunjenost;i++){
  246.         if(strcmp(b.nizPromena[i].data.evidencioniBroj,p.data.evidencioniBroj) == 0){
  247.             b.nizPromena[i].akcija = 0;//ovo znaci da je izbrisan
  248.         }
  249.     }
  250.  
  251.     fseek(ulazniFajl, sizeof(blok) * lokacijaBlok, SEEK_SET);
  252.     fwrite(&b, sizeof(blok),1,ulazniFajl);
  253.     if(ulazniFajl == NULL){
  254.         printf("Neuspesno otvaranje aktivne dadoteke za ispis u dodavanju");
  255.         return -1;
  256.     }
  257.     fclose(ulazniFajl);
  258.     printf("Fajl posle brisanja:\n");
  259.     printBinarnaDadoteka(*ulaznaDadoteka);
  260.     printf("\n*******************************\n");
  261.     return 1;
  262. }
  263. void formirajSekvencijalnu(dadoteka * dadotekaIzmena,dadoteka * izlaznaSekvencijalnaDadoteka){
  264.     FILE * fileDadotekaIzmena = fopen(dadotekaIzmena->naziv,"rb");
  265.     dadoteka pomocna;
  266.     initDadoteka("pomocna.bin", &pomocna);
  267.     if(fileDadotekaIzmena == NULL){
  268.         printf("Neuspesno otvaranje aktivne dadoteke za ispis");
  269.         return;
  270.     }
  271.     blok pr;
  272.     for(int i=0;i<dadotekaIzmena->brojBlokova;i++){
  273.         fread(&pr, sizeof(blok),1, fileDadotekaIzmena);
  274.         for(int j=0;j<pr.popunjenost;j++){
  275.             if(pr.nizPromena[j].akcija == 1){
  276.                 if(izvisiIzmenuDodavanja(izlaznaSekvencijalnaDadoteka,&pomocna, pr.nizPromena[j]) == -1) continue;
  277.                 insertDataIzlazna(&pomocna,izlaznaSekvencijalnaDadoteka);
  278.             }
  279.             if(pr.nizPromena[j].akcija == 0){
  280.                 izvrsiIzmenuLogickoBrisanje(izlaznaSekvencijalnaDadoteka,pr.nizPromena[j]);
  281.             }
  282.         }
  283.     }
  284.     izlaznaSekvencijalnaDadoteka->brojBlokova++;
  285.     fclose(fileDadotekaIzmena);
  286. }
  287. int traziBlok(dadoteka ulazna,promena p){
  288.     blok pr;
  289.     FILE * ulaznaDadoteka = fopen(ulazna.naziv,"rb");
  290.     for(int i=0;i<ulazna.brojBlokova;i++){
  291.         fread(&pr, sizeof(blok),1, ulaznaDadoteka);
  292.         for(int j=0;j<pr.popunjenost;j++){
  293.             if(strcmp(pr.nizPromena[j].data.evidencioniBroj,p.data.evidencioniBroj) == 0){
  294.                 return i;
  295.             }
  296.         }
  297.     }
  298.     return -1;
  299. }
  300. void updateDadoteka(dadoteka * ulaznaDadoteka){
  301.     FILE * serijskiFajl = fopen(ulaznaDadoteka->naziv,"rb");
  302.     if(serijskiFajl == NULL){
  303.         printf("Neuspesno otvaranje aktivne dadoteke za ispis");
  304.         return;
  305.     }
  306.     blok pr;
  307.     while(fread(&pr, sizeof(blok),1, serijskiFajl) != NULL){
  308.         ulaznaDadoteka->brojBlokova++;
  309.     }
  310.     fclose(serijskiFajl);
  311. }
  312. void initDadoteka(char ulaznaDadotekaNaziv[], dadoteka * ulaznaDadoteka){
  313.     strcpy(ulaznaDadoteka->naziv,ulaznaDadotekaNaziv);
  314.     ulaznaDadoteka->brojBlokova = 0;
  315. }
  316. int main() {
  317.     node * head;
  318.     dadoteka dadoteka1;
  319.     dadoteka dadotekaIzlazna;
  320.     initDadoteka("ulaz.bin", &dadoteka1);
  321.     initDadoteka("mizlazna.bin", &dadotekaIzlazna);
  322.     delete();
  323.     populateSecvential(&head);
  324.     sortList(head);
  325.     dodajListuSerijska(head);
  326.     updateDadoteka(&dadoteka1);
  327.     formirajSekvencijalnu(&dadoteka1, &dadotekaIzlazna);
  328.     printBinarnaDadoteka(dadoteka1);
  329.     printBinarnaDadoteka(dadotekaIzlazna);
  330.     return 0;
  331. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement