Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

c++ projekat - rasuta staticka organizacija

[es] :: C/C++ programiranje :: c++ projekat - rasuta staticka organizacija

[ Pregleda: 1751 | Odgovora: 0 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

suzy995

Član broj: 332108
Poruke: 2
*.adsl-a-1.sezampro.rs.



Profil

icon c++ projekat - rasuta staticka organizacija30.01.2016. u 13:23 - pre 48 meseci
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]
 
Odgovor na temu

[es] :: C/C++ programiranje :: c++ projekat - rasuta staticka organizacija

[ Pregleda: 1751 | Odgovora: 0 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.