Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <math.h>
- struct zapis{
- char ID[7+1];
- char prezime[20+1];
- char ime[20+1];
- double stanje;
- /* double stanje;*/
- };
- #define BLOK 512L // Blok na disku
- #define N 1000 // Ocekivani broj zapisa:
- #define C ((int) (BLOK / sizeof (struct zapis))) // Broj zapisa u pretincu
- #define M ((int) (N / C *1.2)) // Broj pretinaca, kapacitet 20% veci od minimalnog:
- int ponavljanja1;
- /*int maxZapisaAdresa;
- int maxZapisa[M];*/
- struct zapis ulaz, pretinac[C];
- //CITA PODATKE______________________________________________________________________________________
- void dajMiDio(char *dio, int x, int y, char *fullString){
- int i;
- for(i=x; i<y; i++){
- dio[i-x]=fullString[i];
- }
- dio[y-x]='\0';
- }
- void ucitajRed(FILE *fi){
- char line[500+1];
- char delimiterChar = ';';
- char temp[20+1];
- int kraj=5;
- int part[kraj+1];
- int partElem = 0;
- fgets(line, 500, fi);
- /*printf("\nFull line is: %s\n", line);*/
- int i, krajReached=1;
- for (i = 0; i<501; i++){
- if(line[i]=='\0') {
- part[kraj]=i-1;
- /*printf("kraj je na: %d\n\n",i-1);*/
- krajReached=0;
- break;
- }
- //pronadi sve delimitere
- if(line[i]== delimiterChar){
- /*printf("%d. delimiter na: %d\n",partElem, i);*/
- part[partElem]=i;
- partElem++;
- }
- }
- if(krajReached!=0){
- part[kraj]=i;
- }
- char dio1[7+1];
- dajMiDio(ulaz.ID,0,part[0],line);
- /*printf("Dio1: %s\n", dio1);*/
- char dio2[20+1];
- dajMiDio(ulaz.prezime, part[0]+1,part[1],line);
- /*printf("Dio2: %3s\n", dio2);*/
- char dio3[20+1];
- dajMiDio(ulaz.ime,part[1]+1,part[2],line);
- /*printf("Dio3: %s\n", dio3);*/
- char dio4[20+1];
- dajMiDio(temp,part[2]+1,part[kraj],line);
- /*printf("Dio4: %s\n", dio4);*/
- ulaz.stanje = atoi(temp);
- printf("%3s %20s %20s %.2f \n", ulaz.ID, ulaz.prezime, ulaz.ime, ulaz.stanje);
- }
- void Pogreska (char *poruka) {
- fputs (poruka, stderr); fputs ("\n", stderr);
- exit (1);
- }
- int OdrediPrim (int m) {
- printf ("Pozvan OdrediPrim\n");
- int i, prim, kraj;
- printf ("Trazenje najveceg prim broja <= %d\n", m);
- prim = m+1;
- do {
- prim--;
- kraj = (int) pow ((double) prim, (double) 0.5);
- for (i = kraj; i > 0; i--) {
- printf ("%d/%d ", prim, i);
- if (prim % i == 0) break;
- }
- } while (i != 1);
- return prim;
- }
- void Isprazni (FILE *fo) {
- printf ("Pozvan Isprazni\n");
- int i;
- for (i = 0; i < C; i++) pretinac [i].ID[0] = '\0';
- for (i = 0; i < M; i++) {
- fseek (fo, i*BLOK, SEEK_SET);
- fwrite (pretinac, sizeof (pretinac), 1, fo);
- }
- printf ("Tablica ispraznjena N=%d, C=%d, M=%d\n", N, C, M);
- printf ("Velicina pretinca = %lu\n", sizeof (pretinac));
- }
- int Upis (struct zapis ulaz, FILE *fo, int prim, int br) {
- printf ("Pozvan Upis\n");
- int i, j, poc;
- int preljevi1 = 0;
- if (br == 1) i = Adresa1 (ulaz.ID, prim), printf("Adresa1 "); /*ADRESA ovdje idu funkcije za ADRESU1, adresu2, adresu3*/
- if (br == 2) i = Adresa2 (ulaz.ID, prim), printf("Adresa2 ");; /*ADRESA ovdje idu funkcije za adresu2, ADRESU2, adresu3*/
- /*if (br == 3) i = Adresa3 (ulaz.ID, prim); /*ADRESA ovdje idu funkcije za adresu3, adresu2, ADRESU3*/
- // Upamti izraèunatu adresu kao poèetnu
- poc = i;
- do { // Ponavljaj dok ne upises ili ustanovis da je datoteka puna
- // Èitaj iz pretinca sve upisane zapise
- fseek (fo, i*BLOK, SEEK_SET);
- fread (pretinac, sizeof (pretinac), 1, fo);
- for (j = 0; j < C; j++) {
- if (pretinac[j].ID[0] != '\0') {
- // Ako zapis nije prazan
- //printf ("Vec upisani ID =");
- //printf ("%s\n", pretinac[j].ID);
- if (strncmp (pretinac[j].ID, ulaz.ID, 7+1) == 0) {
- // Ako je upisani ID identièan ulaznom
- //printf ("Vec postoji zapis s ID %s\n", ulaz.ID);
- return 1;
- }
- } else {
- // Upisi ulazni zapis na prazno mjesto
- pretinac[j] = ulaz;
- fseek (fo, i*BLOK, SEEK_SET);
- printf ("U pretinac %d upisujem %d. zapis\n", i, j);
- fwrite (pretinac, sizeof (pretinac), 1, fo);
- return 1;
- }
- }
- // U pretincu nema mjesta, prijedi ciklicki na sljedecega
- i = (i + 1) % M;
- if (preljevi1 == 0){
- printf ("Nema mjesta, slijedi pretinac = %d\n", i);
- ponavljanja1++;
- }
- preljevi1 = 1;
- } while (i != poc); // Dok se ne ne vratis na pocetni
- return 0; // Niti u jednom zapisu nema mjesta
- }
- int Adresa1 (char ID[], int prim) {
- //printf ("Pozvana adresa1\n");
- int i, a, b, c, d, adr;
- char pom [2+1];
- pom [3] = '\0';
- // Preklapanje
- for (i = 0; i < 2; i++) pom[i] = ID[i+2];
- a = atoi (pom);
- for (i = 0; i < 2; i++) pom[i] = ID[1-i];
- b = atoi (pom);
- for (i = 0; i < 2; i++) pom[i] = ID[6-i];
- c = atoi (pom);
- d = atoi (&ID[7]);
- // Dijeljenje
- adr = (a + b + c + d) % prim;
- /*printf ("Izracunata adresa (%d) = %d\n", (a + b + c), adr);
- */
- return adr;
- }
- int Adresa2 (char ID[], int prim) {
- printf ("Pozvana adresa2\n");
- int adr;
- adr = atoi(ID);
- adr = adr % prim;
- return adr;
- }
- int main(void){
- printf("\n");
- FILE *fi, *fo;
- int prim;
- //++++++++++++++++++++++++
- /*maxZapisaAdresa = M + 1;
- maxZapisa[maxZapisaAdresa] = 0;*/
- //++++++++++++++++++++++++
- prim = OdrediPrim(M);
- if ((fi = fopen ("podaci.dat", "r")) == NULL)
- Pogreska ("Ne mogu otvoriti datoteku \"ulaz\"");
- if ((fo = fopen ("izlaz.bin","wb+")) == NULL)
- Pogreska ("Ne mogu otvoriti datoteku \"tablica\"");
- Isprazni(fo);
- while (!feof(fi)){
- ucitajRed(fi);
- /*printf("Adresa1 je: %d\n", Adresa1 (ulaz.ID, prim));
- printf("Adresa2 je: %d\n", Adresa2 (ulaz.ID, prim)); */
- Upis(ulaz, fo, prim, 2);
- //Upis(ulaz, fo, prim, 2);
- /**/
- }
- printf ("Broj preljeva je: %d\n1", ponavljanja1);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement