[ suzy995 @ 30.01.2016. 13:23 ] @
Dobar dan. Imam projekat u školi da uradim i svaka pomoć, objašnjenje ili upućivanje na sajtove bi mi bilo veoma k+od koristi. Našla sam već 1 ovakav sličan projekat, ali nažalost, ništa korisno jer nema koda koji bih mogla uklopiti. Projekat glasi: Napisati C program koji će omogućiti rad sa podacima o evidentiranim prolascima kroz naplatnu rampu kod mesta Grad. Za svaki prolazak se beleži evidencioni broj (8 cifara), registarska oznaka vozila (najviše 10 karaktera), datum i vreme prolaska, oznaka naplatne rampe (tačno 4 karaktera) i plaćeni iznos (do 100 000). Svi podaci moraju biti smešteni u binarnu datoteku sa statičkom rasutom organizacijom i serijskom zonom prekoračenja. Program treba da ponudi sledeće funkcionalnosti kroz formu tekstualnog korisničkog menija: o formiranje prazne datoteke (sa B baketa i b faktorom baketiranja) pri čemu korisnik zadaje naziv nove datoteke (2,5*) o izbor aktivne datoteke zadavanjem njenog naziva (1,5*) o prikaz naziva aktivne datoteke (1,5*) o upis novog sloga u aktivnu datoteku, uz proveru postojanja vrednosti identifikatora u datoteci, direktnim unosom podataka u realnom vremenu (3,5*) o traženje sloga u aktivnoj datoteci i njegov prikaz zajedno sa adresom baketa (ili oznakom zone) i rednim brojem sloga u baketu (3,5**) o prikaz svih slogova aktivne datoteke zajedno sa adresom baketa (ili oznakom zone) i rednim brojem sloga u baketu (2,5**) o logičko brisanje aktuelnog sloga iz aktivne datoteke (2***) o promenu vrednosti obeležja plaćeni iznos u zadatom slogu iz aktivne datoteke (3***) Pripremiti posebnu test datoteku sa podacima koja će sadržati bar 10 aktuelnih slogova i primer bar dva sloga prekoračioca. (3***) Poštovati sledeća ograničenja: o vrednost faktora baketiranja b je 3 o broj baketa B je 7 o za probabilističku transformaciju identifikatora sloga u adresu baketa koristiti metodu centralnih cifara kvadrata ključa (2*) o prilikom rada nad datotekom, dozvoliti preuzimanje i upis isključivo čitavih baketa o prisustvo statusnog polja u slogu o upotrebu isključivo ASCII karaktera za tekstualni sadržaj Evo i pokušaja mog koda, koji doduše i ne radi, pokušala sam da uklapam kodove sa vežbi, ali neuspešno: Code: //Rampa.h /*#ifndef RAMPA_H_INCLUDED #define RAMPA_H_INCLUDED #include <stdio.h> #include <stdlib.h> #include <string.h> #define BLOCK_FACTOR 3 typedef struct rampa { long int evidencioniBr[8]; char registarskaOznaka[10]; char oznakaNP[4]; int iznos; /*int vreme; int datum;*/ //nisam sigurna /*} NRampa; typedef struct block { //blokiranje datoteke vrsi se putem niza sa zadatim faktorom blokiranja NRampa rampa[BLOCK_FACTOR]; } Block; typedef struct position { //struktura koja prikazuje poziciju sloga u datoteci (poziciju bloka + poziciju sloga unutar tog bloka) int positionBlock; int positionRecord; bool flag; //indikator da li je posmatrana pozicija kraj datoteke (za potrebe upisa novog sloga) } TPosition; void createNewHeap(); void chooseActiveFile(); void showActiveFile(); void addRecord(); void showAllRecords(); void showRecord(long int regBr); void deleteRecord(long int regBr); TPosition findRecord(long int regBr); NRampa populateRecord(); long int brojUnos(); void printRecord(NRampa rampa); #endif // RAMPA_H_INCLUDED*/ //Rampa.cpp #include "Rampa.h" char activeFile[30] = ""; //promenljova koja sadrzi naziv aktivne datoteke void createNewHeap() { //funkcija zaduzena za kreiranje nove datoteke koja sadrzi slog za kraj datoteke NRampa finalRecord; finalRecord.statusRecord = '*'; //inicijalni slog koji sadrzi znak za kraj datoteke Block block; block.rampa[0] = finalRecord; char fileName[30] = ""; printf("\nIme datoteke: "); scanf(" %s", fileName); FILE* file = NULL; if( (file = fopen(fileName,"wb")) == NULL ) { //kreira novu datoteku ili brise sadrzaj vec postojece datoteke printf("\nKreiranje datoteke %s neuspesno!\n", fileName); fclose(file); return; } if(((fwrite(&block, sizeof(Block), 1, file)) != 1)) { //upis bloka, a sad jedino ima slog za kraj datoteke printf("\nGreska prilikom upisa inicijalnog bloka!"); } fclose(file); printf("\nKreiranje datoteke %s je uspesno!\n", fileName); } void chooseActiveFile() { //biranje aktivne, vec kreirane datoteke char fileName[30] = ""; printf("\nIme datoteke: "); scanf(" %s", fileName); FILE* file = NULL; if( (file = fopen(fileName,"rb")) == NULL ) { printf("\nDatoteka %s ne postoji!\n", fileName); fclose(file); return; } fclose(file); printf("\nDatoteka %s uspesno otvorena!\n", fileName); strcpy(activeFile, fileName); //neophodno je postaviti vrednost aktivne datoteke u activeFile promenljivu } void showActiveFile() { //prikaz aktivne datoteke if(!*activeFile) { printf("\nNe postoji aktivna datoteka!\n"); } else { printf("\nAktivna datoteka : %s", activeFile); } } void addRecord() { //dodavanje novog sloga u datoteci if (!*activeFile) { // pre svake operacije nad aktivnom datotekom, vrsi se provera da li je ona prethodno odabrana printf("\nNeophodno je izabrati aktivnu datoteku pre koriscenja ove operacije!"); return; } NRampa rampa = populateRecord(); //kreiranje novog sloga sloga Block block; TPosition pos = findRecord(rampa.registarskaOznaka); if(pos.positionBlock == -1) { printf("\nGreska prilikom citanja bloka!"); return; }else if(!pos.flag) { //ukoliko je vracena vrednost znaka za kraj datoteke, vrsi se upis sloga na tu poziciju. U suprotnom, slog sa datom vrednoscu kljuca vec postoji i vraca se poruka gresci printf("\nVozilo sa registarkom oznakom %ld vec postoji!", rampa.regBr); return; } populateOtherFields(&rampa); //nakon provere, vrsi se popunjavanje ostalih polja sloga FILE* file = fopen(activeFile,"rb"); fseek(file,sizeof(Block)*pos.positionBlock,SEEK_SET); if( (fread(&block,sizeof(Block),1,file)) != 1) { printf("\nGreska prilikom citanja bloka!"); } fclose(file); file = fopen(activeFile,"rb+"); //otvaranje datoteke za citanje ili pisanje, a da se pri tome ne uklone stare vrednosti datoteke fseek(file,sizeof(Block)*pos.positionBlock,SEEK_SET); NRampa finalRecord = block.rampa[pos.positionRecord]; //slog kraja datoteke smesta se u pomocnu promenjivu jer se na njegovo mesto unosi nov slog block.rampa[pos.positionRecord] = rampa; if( pos.positionRecord < BLOCK_FACTOR-1) { block.rampa[pos.positionRecord+1] = finalRecord; //ukoliko nismo dosli do kraja bloka, slog za kraj datoteke se unosi na narednu poziciju bloka if(((fwrite(&block, sizeof(Block), 1,file)) != 1) ) { printf("\nGreska prilikom upisa bloka!"); } } else { if((fwrite(&block, sizeof(Block), 1, file) != 1)) { printf("\nGreska prilikom upisa bloka!"); } Block blockNew; //u slucaju da smo dosli do kraja datoteke, kreira se novi blok i u njega se unosi slog za kraj datoteke blockNew.rampa[0] = finalRecord; fseek(file,sizeof(Block)*(pos.positionBlock+1),SEEK_SET); if((fwrite(&blockNew, sizeof(Block), 1, file)) != 1){ //provera za kraj printf("\nGreska prilikom upisa bloka u datoteku!"); } } printf("\nVozilo sa registarkim brojem %ld je uspesno upisan u blok broj %d poziciju %d" , rampa.registarskaOznaka, pos.positionBlock, pos.positionRecord); fclose(file); } TPosition findRecord(long int regBr) { //vraca poziciju trazenog sloga ili poziciju kraja datoteke int i; Block block; TPosition pos; int blockNum = 0; FILE* file = fopen(activeFile,"rb"); while(1) { //dokle god se ne dodje do kraja datoteke ili trazenog sloga, vrsi se ucitavanje novog bloka pos.positionBlock = blockNum; fseek(file,sizeof(Block)*blockNum,SEEK_SET); if( (fread(&block,sizeof(Block),1,file)) != 1) { //ukoliko je citanje bloka neuspesno, pozicija bloka se postavlja na -1 pos.positionBlock = -1; printf("\nGreska prilikom citanja bloka!"); fclose(file); return pos; } for(i = 0; i < BLOCK_FACTOR; i++) { if((block.rampa[i].statusRecord == 'a' && block.rampa[i].regBr == regBr) || block.rampa[i].statusRecord == '*') { //ukoliko je ostvaren jedan od dva uslova, vraca se rezultat pos.positionRecord = i; pos.flag = block.rampa[i].statusRecord == '*'; //indikator da li se doslo do kraja datoteke ili se slog pronasao fclose(file); return pos; } } blockNum++; } } void deleteRecord(long int regBr) { if (!*activeFile) { printf("\nNeophodno je izabrati aktivnu datoteku pre koriscenja ove operacije!"); return; } TPosition pos = findRecord(regBr); Block block; if(pos.flag) { //vrsi se provera da li je pronadjen slog ili je pretraga vratila slog kraja datoteke printf("Vozilo sa datim registarskim brojem nije pronadjeno!"); return; } FILE* file = fopen(activeFile,"rb"); fseek(file,sizeof(Block)*pos.positionBlock,SEEK_SET); if( (fread(&block,sizeof(Block),1,file)) != 1) { printf("\nGreska prilikom ucitavanja bloka!"); } fclose(file); block.rampa[pos.positionRecord].statusRecord = 'n'; //vrsi se logicko brisanje file = fopen(activeFile,"rb+"); //otvaranje datoteke za citanje ili pisanje, a da se pri tome ne uklone stare vrednosti datoteke fseek(file,sizeof(Block)*pos.positionBlock,SEEK_SET); if((fwrite(&block, sizeof(Block), 1, file)) != 1){ //prepise se student sa modifikovanim vrednostima printf("\nGreska prilikom upisa bloka!"); } fclose(file); printf("\nVozilo sa registarskim brojem %ld je uspesno obrisan!", block.rampa[pos.positionRecord].registarskaOznaka); } void showAllRecords() { //prikaz svih slogova datoteke if (!*activeFile) { printf("\nNeophodno je izabrati aktivnu datoteku pre koriscenja ove operacije!"); return; } Block block; int blockNum = 0; FILE* file = fopen(activeFile,"rb"); bool isEmpty = true; //indikator da li je pronadjen makar jedan aktivan slog while(1) { fseek(file,sizeof(Block)*blockNum,SEEK_SET); if( (fread(&block,sizeof(Block),1,file)) != 1) { //ukoliko je citanje bloka neuspesno printf("\nGreska prilikom citanja bloka!"); fclose(file); return; } for(int i = 0; i < BLOCK_FACTOR; i++) { if(block.rampa[i].statusRecord == 'a') { printf("\nBlok: %d Slog: %d", blockNum, i); printRecord(block.rampa[i]); if(isEmpty) isEmpty = false; } else if (block.rampa[i].statusRecord == '*') { if (isEmpty) printf("\nDatoteka je prazna!"); fclose(file); return; } } blockNum++; } } void showRecord(long int regBr) { //prikaz studenta sa zadatim brojem indeksa if (!*activeFile) { printf("\nNeophodno je izabrati aktivnu datoteku pre koriscenja ove operacije!"); return; } TPosition pos = findRecord(regBr); Block block; if(pos.flag) { //vrsi se provera da li je pronadjen slog ili je pretraga vratila slog kraja datoteke printf("Vozilo sa zadatim registarskim brojem nije pronadjen!"); return; } FILE* file = fopen(activeFile,"rb"); fseek(file,sizeof(Block)*pos.positionBlock,SEEK_SET); if( (fread(&block,sizeof(Block),1,file)) != 1) { printf("\nGreska prilikom ucitavanja bloka!"); } fclose(file); printRecord(block.rampa[pos.positionRecord]); } void printRecord(NRampa rampa) { printf("\n\tRegistarska oznaka: %ld", rampa.regBr); /*printf("\n\time: %s", student.ime); printf("\n\tprezime: %s", student.prezime); printf("\n\tgodina upisa: %d", student.godinaUpisa);*/ /*} NRampa populateRecord() { //pomocna funkcija za kreiranje novog sloga NRampa rampa; printf("\nRegistarski broj: "); rampa.regBr = brojUnos(); return rampa; } long int brojUnos() { char s[10] = ""; char *errstr; long val; while (1) { scanf (" %s", s); val = strtol(s, &errstr, 10); if (!*errstr) return val; else printf("Tip vrednosti nije odgovarajuci. Unesite ponovo -> "); } } //main.cpp #include <iostream> //#include "Rampa.h" using namespace std; int main() { //int x; printf("\nIzaberite opciju: "); printf("\n1. Kreiranje datoteke;"); printf("\n2. Izbor aktivne datoteke;"); printf("\n3. Prikaz naziva aktivne datoteke;"); printf("\n4. Dodavanje vozila;"); printf("\n5. Pretraga vozila;"); printf("\n6. Prikaz svih vozila;"); printf("\n7. Brisanje registarske oznake vozila;"); printf("\n8. Kraj\n"); /*do { printf("\nVas izbor: "); x = (int)brojUnos(); } while(x < 1 || x > 8); return x;*/ } /*nt main() { int odg; long int regBr; do { switch(odg) { case 1: createNewHeap(); break; case 2: chooseActiveFile(); break; case 3: showActiveFile(); break; case 4: addRecord(); break; case 5: printf("\n Unesite registarski broj: "); regBr = brojUnos(); showRecord(regBr); break; case 6: showAllRecords(); break; case 7: printf("\n Unesite registarski broj: "); regBr = brojUnos(); deleteRecord(regBr); break; } } while(odg != 10); return 0; } Unapred hvala. Ako je neko nekada imao nešto slično, volela bih da mi se javi i pomogne mi. [Ovu poruku je menjao X Files dana 30.01.2016. u 15:03 GMT+1] |