/* 6. Vjezba Ancvfngv cebtenz mn fvzhyvenawr chawrawn qngbgrxr hm hcbenoh enmyvpvgvu ievwrqabfgv iryvpvar cergvapn v iryvpvar cevzneabt cbqehpwn, xbevfgrpv enmyvpvgr cbfghcxr cergibeor xywhpn h nqerfh. Cebtenz xnb vfubq fvzhynpvwr qnwr thfgbph cnxvenawn v cbfgbgnx cerywrin. Ermhygngr geron cevxnmngv h boyvxh qvwntenzn bivfabfgv cbfgbgxn cerywrin b iryvpvav cergvapn, thfgbpv cnxvenawn v cbfghcxh cergibeor xywhpn h nqerfh. Mn hmbenx cbqngnxn xbevfgvgv cbqngxr vm qngbgrxr nqerfr.gkg. */ #include #include #include #include #include #define IDSize 8 #define FirstNameSize 20 #define LastNameSize 20 #define PostalIDSize 5 #define CitySize 20 // kreator '97 // nije da se hvalim ali: // citadel:/mnt/hard_dos/borlandc/source ROOT # id # 20:32 // uid=0(root) gid=0(root) groups=0(root),25(floppy),29(audio),24(cdrom) // 17:55 1997.12.13 struct record { char ID[IDSize+1], FirstName[FirstNameSize+1]; char LastName[LastNameSize+1], PostalID[PostalIDSize+1]; char City[CitySize+1]; }; #define ClusterSize 512L //assume we work with fat12 // ClusterSize/(3*20+5+8)=512/73=7 records + 1 byte empty... #define StudentsNo 100 //assume we have 100 students // No of records in one matrix (folder) #define RecordsNo ((int) (ClusterSize/sizeof(struct record))) // No of matrices/folders #define MatrixNo ((int) (StudentsNo/RecordsNo*1.3)) //130% of calculated value //changeable..... ! struct record entry, matrix[RecordsNo]; void fatal (const char *msg) { fputs(msg, stderr); exit(EXIT_FAILURE); } void empty_all(FILE *output) { int i; for(i=0; i0; --i) if (!(prim%i)) break; } while (i!=1); printf("primary # %d\n", prim); return prim; } //transformations of key in address.. //need only 3 digits coz' we've got 100 students.. //skip first 2 coz' they are allways same (fax) int folding(const char ID[]) { int i, a, b, adr; char tmp[3+1]; //tmp storing for 3 digits.. for adding tmp[4]=0; for(i=0; i<3; ++i) tmp[i]=ID[7-i]; a=atoi(tmp); for(i=0; i<3; ++i) tmp[i]=ID[2+i]; b=atoi(tmp); adr=(a+b)%StudentsNo; //little change.. return adr; } int dividing(const char ID[], const int prim) { int a, adr; a=atoi(ID); adr=a%prim; return adr; } int shifting(const char ID[]) { int a, b, i; int adr; char tmp[3+1]; //tmp storing for 3 digits.. for adding tmp[4]=0; for(i=0; i<3; ++i) tmp[i]=ID[5+i]; a=atoi(tmp); for(i=0; i<3; ++i) tmp[i]=ID[2+i]; b=atoi(tmp); adr=(a+b)%StudentsNo; return adr; } int folding_dividing(const char ID[], const int prim) { int i, a, b, adr; char tmp[3+1]; //tmp storing for 3 digits.. for adding tmp[4]=0; for(i=0; i<3; ++i) tmp[i]=ID[7-i]; a=atoi(tmp); for(i=0; i<3; ++i) tmp[i]=ID[2+i]; b=atoi(tmp); adr=(a+b)%prim; return adr; } int enter_data(struct record input, FILE *output, const int prim, int method) { int entered=0, i, j, start_i, full=0, skip=0; //get address of matrixx/folder switch(method) { case 1: i=dividing(entry.ID, prim); break; case 2: i=shifting(entry.ID); break; case 3: i=folding(entry.ID); break; case 4: i=folding_dividing(entry.ID, prim); break; default: fatal("Wrong hashing method\n"); } start_i=i; do { //read from folder all records fseek(output, i*ClusterSize, SEEK_SET); fread(matrix, sizeof(matrix), 1, output); for(j=0; j