C Program for Cinema Hash File Management with Overflow Handling

Posted by Anonymous and classified in Computers

Written on in English with a size of 6.67 KB

C Program for Hash-Based Cinema File Management

The following C program implements a hash file with buckets and an overflow area for managing cinema screening records.

Source Code

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define B 7
#define B_SIZE 5
#define F_NAME "bioskop.dat"
#define O_NAME "prekoracenje.dat"

typedef struct{int idp;char naz[65],ozs[4],dvp[20];int brk,tra;char akt;}Slog;
typedef struct{Slog slogovi[B_SIZE];}Baket;

int hash(int idp){return idp%B;}

File Initialization

void inicijalizuj(){
FILE *f=fopen(F_NAME,"wb"); Baket prazan; memset(&prazan,0,sizeof(Baket));
for(int i=0;i<B;i++) fwrite(&prazan,sizeof(Baket),1,f);
fclose(f); f=fopen(O_NAME,"wb"); if(f) fclose(f);
}

Forming the File from Input

void formiraj(){
FILE *ulaz=fopen("ulaz.txt","r"); if(!ulaz){printf("Greska: Napravi ulaz.txt!\n");return;}
inicijalizuj(); Slog s;
while(fscanf(ulaz,"%d %64s %3s %19s %d %d",&s.idp,s.naz,s.ozs,s.dvp,&s.brk,&s.tra)!=EOF){
s.akt='A'; int adr=hash(s.idp);
FILE *f=fopen(F_NAME,"rb+"); if(!f){fclose(ulaz);return;}
Baket bak; fseek(f,adr*sizeof(Baket),SEEK_SET); fread(&bak,sizeof(Baket),1,f);
int upisano=0;
for(int i=0;i<B_SIZE;i++) if(bak.slogovi[i].idp==0){
bak.slogovi[i]=s; fseek(f,adr*sizeof(Baket),SEEK_SET); fwrite(&bak,sizeof(Baket),1,f); upisano=1; break;
}
fclose(f);
if(!upisano){FILE *fo=fopen(O_NAME,"ab"); if(fo){fwrite(&s,sizeof(Slog),1,fo); fclose(fo);}}
}
fclose(ulaz); printf("Datoteka uspesno formirana.\n");
}

Inserting a Record

void unesi(){
Slog s; printf("IDP: ");scanf("%d",&s.idp); printf("Naziv: ");scanf("%64s",s.naz);
printf("Sala: ");scanf("%3s",s.ozs); printf("DVP: ");scanf("%19s",s.dvp);
printf("Karte: ");scanf("%d",&s.brk); printf("Trajanje: ");scanf("%d",&s.tra); s.akt='A';
int adr=hash(s.idp); FILE *f=fopen(F_NAME,"rb+"); if(!f) return;
Baket bak; fseek(f,adr*sizeof(Baket),SEEK_SET); fread(&bak,sizeof(Baket),1,f);
for(int i=0;i<B_SIZE;i++) if(bak.slogovi[i].idp==0||bak.slogovi[i].akt=='O'){
bak.slogovi[i]=s; fseek(f,adr*sizeof(Baket),SEEK_SET); fwrite(&bak,sizeof(Baket),1,f); fclose(f); return;
}
fclose(f); FILE *fo=fopen(O_NAME,"ab"); if(fo){fwrite(&s,sizeof(Slog),1,fo); fclose(fo);}
}

Modifying a Record

void modifikuj(int idp){
int adr=hash(idp); FILE *f=fopen(F_NAME,"rb+"); if(!f) return;
Baket bak; fseek(f,adr*sizeof(Baket),SEEK_SET); fread(&bak,sizeof(Baket),1,f);
for(int i=0;i<B_SIZE;i++) if(bak.slogovi[i].idp==idp&&bak.slogovi[i].akt=='A'){
printf("Novi broj karata: "); scanf("%d",&bak.slogovi[i].brk);
fseek(f,adr*sizeof(Baket),SEEK_SET); fwrite(&bak,sizeof(Baket),1,f); fclose(f); printf("Modifikovano u matici.\n"); return;
}
fclose(f);
FILE *fo=fopen(O_NAME,"rb+"); if(!fo) return; Slog s;
while(fread(&s,sizeof(Slog),1,fo)) if(s.idp==idp&&s.akt=='A'){
printf("Novi broj karata: "); scanf("%d",&s.brk);
fseek(fo,-(long)sizeof(Slog),SEEK_CUR); fwrite(&s,sizeof(Slog),1,fo); fclose(fo); printf("Modifikovano u prekoracenju.\n"); return;
}
fclose(fo); printf("Slog nije pronadjen.\n");
}

Logical Deletion

void obrisi(int idp){
int adr=hash(idp); FILE *f=fopen(F_NAME,"rb+"); if(!f) return;
Baket bak; fseek(f,adr*sizeof(Baket),SEEK_SET); fread(&bak,sizeof(Baket),1,f);
for(int i=0;i<B_SIZE;i++) if(bak.slogovi[i].idp==idp&&bak.slogovi[i].akt=='A'){
bak.slogovi[i].akt='O'; fseek(f,adr*sizeof(Baket),SEEK_SET); fwrite(&bak,sizeof(Baket),1,f); fclose(f); printf("Obrisan iz matice.\n"); return;
}
fclose(f);
FILE *fo=fopen(O_NAME,"rb+"); if(!fo) return; Slog s;
while(fread(&s,sizeof(Slog),1,fo)) if(s.idp==idp&&s.akt=='A'){
s.akt='O'; fseek(fo,-(long)sizeof(Slog),SEEK_CUR); fwrite(&s,sizeof(Slog),1,fo); fclose(fo); printf("Obrisan iz prekoracenja.\n"); return;
}
fclose(fo); printf("Slog nije pronadjen.\n");
}

Searching by Hall

void traziSalu(char *sala){
FILE *f=fopen(F_NAME,"rb"); if(!f) return; Baket bak;
while(fread(&bak,sizeof(Baket),1,f)) for(int i=0;i<B_SIZE;i++)
if(bak.slogovi[i].akt=='A'&&strcmp(bak.slogovi[i].ozs,sala)==0)
printf("IDP: %d | Film: %s\n",bak.slogovi[i].idp,bak.slogovi[i].naz);
fclose(f);
FILE *fo=fopen(O_NAME,"rb"); if(!fo) return; Slog s;
while(fread(&s,sizeof(Slog),1,fo)) if(s.akt=='A'&&strcmp(s.ozs,sala)==0)
printf("IDP: %d | Film: %s (prekoracenje)\n",s.idp,s.naz);
fclose(fo);
}

Displaying All Records

void ispisSvi(){
FILE *f=fopen(F_NAME,"rb"); if(!f) return; Baket bak;
printf("\n--- MATICNA DATOTEKA ---\n");
for(int i=0;i<B;i++){
fread(&bak,sizeof(Baket),1,f); printf("Baket %d: ",i);
for(int j=0;j<B_SIZE;j++) if(bak.slogovi[j].idp!=0) printf("[%d:%c] ",bak.slogovi[j].idp,bak.slogovi[j].akt);
else printf("[PR] ");
printf("\n");
}
fclose(f);
printf("--- ZONA PREKORACENJA ---\n");
FILE *fo=fopen(O_NAME,"rb"); if(!fo){printf("(nema)\n");return;} Slog s;
while(fread(&s,sizeof(Slog),1,fo)) printf("[%d:%c] ",s.idp,s.akt);
printf("\n"); fclose(fo);
}

Main Menu

int main(){
int opt,id; char s[10];
while(1){
printf("\n1.Form 2.Unos 3.Mod 4.Bris 6.Sala 7.Ispis 0.Exit\n>> ");
if(scanf("%d",&opt)!=1) break; if(opt==0) break;
switch(opt){
case 1: formiraj(); break;
case 2: unesi(); break;
case 3: printf("IDP: "); scanf("%d",&id); modifikuj(id); break;
case 4: printf("IDP: "); scanf("%d",&id); obrisi(id); break;
case 6: printf("Sala: "); scanf("%9s",s); traziSalu(s); break;
case 7: ispisSvi(); break;
}
}
return 0;
}

Related entries: