Advertisement
Guest User

projektC

a guest
Apr 27th, 2015
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.98 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <math.h>
  5.  
  6. struct zapis{
  7. char ID[7+1];
  8. char prezime[20+1];
  9. char ime[20+1];
  10. double stanje;
  11. /* double stanje;*/
  12. };
  13.  
  14. #define BLOK 512L // Blok na disku
  15. #define N 1000 // Ocekivani broj zapisa:
  16. #define C ((int) (BLOK / sizeof (struct zapis))) // Broj zapisa u pretincu
  17. #define M ((int) (N / C *1.2)) // Broj pretinaca, kapacitet 20% veci od minimalnog:
  18.  
  19.  
  20. int ponavljanja1;
  21. /*int maxZapisaAdresa;
  22. int maxZapisa[M];*/
  23.  
  24.  
  25. struct zapis ulaz, pretinac[C];
  26.  
  27.  
  28.  
  29. //CITA PODATKE______________________________________________________________________________________
  30.  
  31. void dajMiDio(char *dio, int x, int y, char *fullString){
  32. int i;
  33. for(i=x; i<y; i++){
  34. dio[i-x]=fullString[i];
  35. }
  36. dio[y-x]='\0';
  37. }
  38.  
  39. void ucitajRed(FILE *fi){
  40. char line[500+1];
  41. char delimiterChar = ';';
  42. char temp[20+1];
  43. int kraj=5;
  44. int part[kraj+1];
  45. int partElem = 0;
  46.  
  47.  
  48. fgets(line, 500, fi);
  49. /*printf("\nFull line is: %s\n", line);*/
  50. int i, krajReached=1;
  51.  
  52. for (i = 0; i<501; i++){
  53. if(line[i]=='\0') {
  54. part[kraj]=i-1;
  55. /*printf("kraj je na: %d\n\n",i-1);*/
  56. krajReached=0;
  57. break;
  58. }
  59. //pronadi sve delimitere
  60. if(line[i]== delimiterChar){
  61. /*printf("%d. delimiter na: %d\n",partElem, i);*/
  62. part[partElem]=i;
  63. partElem++;
  64. }
  65. }
  66. if(krajReached!=0){
  67. part[kraj]=i;
  68. }
  69.  
  70.  
  71. char dio1[7+1];
  72. dajMiDio(ulaz.ID,0,part[0],line);
  73. /*printf("Dio1: %s\n", dio1);*/
  74.  
  75. char dio2[20+1];
  76. dajMiDio(ulaz.prezime, part[0]+1,part[1],line);
  77. /*printf("Dio2: %3s\n", dio2);*/
  78.  
  79. char dio3[20+1];
  80. dajMiDio(ulaz.ime,part[1]+1,part[2],line);
  81. /*printf("Dio3: %s\n", dio3);*/
  82.  
  83. char dio4[20+1];
  84. dajMiDio(temp,part[2]+1,part[kraj],line);
  85. /*printf("Dio4: %s\n", dio4);*/
  86. ulaz.stanje = atoi(temp);
  87.  
  88. printf("%3s %20s %20s %.2f \n", ulaz.ID, ulaz.prezime, ulaz.ime, ulaz.stanje);
  89.  
  90. }
  91.  
  92.  
  93.  
  94. void Pogreska (char *poruka) {
  95. fputs (poruka, stderr); fputs ("\n", stderr);
  96. exit (1);
  97. }
  98.  
  99. int OdrediPrim (int m) {
  100. printf ("Pozvan OdrediPrim\n");
  101. int i, prim, kraj;
  102. printf ("Trazenje najveceg prim broja <= %d\n", m);
  103. prim = m+1;
  104. do {
  105. prim--;
  106. kraj = (int) pow ((double) prim, (double) 0.5);
  107. for (i = kraj; i > 0; i--) {
  108. printf ("%d/%d ", prim, i);
  109. if (prim % i == 0) break;
  110. }
  111. } while (i != 1);
  112. return prim;
  113. }
  114.  
  115. void Isprazni (FILE *fo) {
  116. printf ("Pozvan Isprazni\n");
  117. int i;
  118. for (i = 0; i < C; i++) pretinac [i].ID[0] = '\0';
  119. for (i = 0; i < M; i++) {
  120. fseek (fo, i*BLOK, SEEK_SET);
  121. fwrite (pretinac, sizeof (pretinac), 1, fo);
  122. }
  123. printf ("Tablica ispraznjena N=%d, C=%d, M=%d\n", N, C, M);
  124. printf ("Velicina pretinca = %lu\n", sizeof (pretinac));
  125. }
  126.  
  127.  
  128.  
  129. int Upis (struct zapis ulaz, FILE *fo, int prim, int br) {
  130. printf ("Pozvan Upis\n");
  131. int i, j, poc;
  132. int preljevi1 = 0;
  133.  
  134. if (br == 1) i = Adresa1 (ulaz.ID, prim), printf("Adresa1 "); /*ADRESA ovdje idu funkcije za ADRESU1, adresu2, adresu3*/
  135. if (br == 2) i = Adresa2 (ulaz.ID, prim), printf("Adresa2 ");; /*ADRESA ovdje idu funkcije za adresu2, ADRESU2, adresu3*/
  136. /*if (br == 3) i = Adresa3 (ulaz.ID, prim); /*ADRESA ovdje idu funkcije za adresu3, adresu2, ADRESU3*/
  137.  
  138.  
  139. // Upamti izraèunatu adresu kao poèetnu
  140. poc = i;
  141. do { // Ponavljaj dok ne upises ili ustanovis da je datoteka puna
  142. // Èitaj iz pretinca sve upisane zapise
  143. fseek (fo, i*BLOK, SEEK_SET);
  144. fread (pretinac, sizeof (pretinac), 1, fo);
  145. for (j = 0; j < C; j++) {
  146. if (pretinac[j].ID[0] != '\0') {
  147.  
  148. // Ako zapis nije prazan
  149. //printf ("Vec upisani ID =");
  150. //printf ("%s\n", pretinac[j].ID);
  151. if (strncmp (pretinac[j].ID, ulaz.ID, 7+1) == 0) {
  152. // Ako je upisani ID identièan ulaznom
  153. //printf ("Vec postoji zapis s ID %s\n", ulaz.ID);
  154. return 1;
  155. }
  156. } else {
  157. // Upisi ulazni zapis na prazno mjesto
  158. pretinac[j] = ulaz;
  159. fseek (fo, i*BLOK, SEEK_SET);
  160. printf ("U pretinac %d upisujem %d. zapis\n", i, j);
  161. fwrite (pretinac, sizeof (pretinac), 1, fo);
  162. return 1;
  163. }
  164. }
  165. // U pretincu nema mjesta, prijedi ciklicki na sljedecega
  166. i = (i + 1) % M;
  167.  
  168. if (preljevi1 == 0){
  169. printf ("Nema mjesta, slijedi pretinac = %d\n", i);
  170. ponavljanja1++;
  171. }
  172. preljevi1 = 1;
  173. } while (i != poc); // Dok se ne ne vratis na pocetni
  174. return 0; // Niti u jednom zapisu nema mjesta
  175. }
  176.  
  177.  
  178.  
  179.  
  180. int Adresa1 (char ID[], int prim) {
  181. //printf ("Pozvana adresa1\n");
  182. int i, a, b, c, d, adr;
  183. char pom [2+1];
  184. pom [3] = '\0';
  185. // Preklapanje
  186. for (i = 0; i < 2; i++) pom[i] = ID[i+2];
  187. a = atoi (pom);
  188. for (i = 0; i < 2; i++) pom[i] = ID[1-i];
  189. b = atoi (pom);
  190. for (i = 0; i < 2; i++) pom[i] = ID[6-i];
  191. c = atoi (pom);
  192. d = atoi (&ID[7]);
  193. // Dijeljenje
  194. adr = (a + b + c + d) % prim;
  195. /*printf ("Izracunata adresa (%d) = %d\n", (a + b + c), adr);
  196. */
  197. return adr;
  198. }
  199.  
  200. int Adresa2 (char ID[], int prim) {
  201. printf ("Pozvana adresa2\n");
  202. int adr;
  203. adr = atoi(ID);
  204. adr = adr % prim;
  205. return adr;
  206. }
  207.  
  208.  
  209.  
  210.  
  211.  
  212.  
  213. int main(void){
  214. printf("\n");
  215. FILE *fi, *fo;
  216. int prim;
  217. //++++++++++++++++++++++++
  218. /*maxZapisaAdresa = M + 1;
  219. maxZapisa[maxZapisaAdresa] = 0;*/
  220. //++++++++++++++++++++++++
  221.  
  222. prim = OdrediPrim(M);
  223. if ((fi = fopen ("podaci.dat", "r")) == NULL)
  224. Pogreska ("Ne mogu otvoriti datoteku \"ulaz\"");
  225. if ((fo = fopen ("izlaz.bin","wb+")) == NULL)
  226. Pogreska ("Ne mogu otvoriti datoteku \"tablica\"");
  227. Isprazni(fo);
  228. while (!feof(fi)){
  229. ucitajRed(fi);
  230. /*printf("Adresa1 je: %d\n", Adresa1 (ulaz.ID, prim));
  231. printf("Adresa2 je: %d\n", Adresa2 (ulaz.ID, prim)); */
  232. Upis(ulaz, fo, prim, 2);
  233. //Upis(ulaz, fo, prim, 2);
  234. /**/
  235. }
  236.  
  237.  
  238.  
  239.  
  240.  
  241. printf ("Broj preljeva je: %d\n1", ponavljanja1);
  242. return 0;
  243. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement