Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Structuri de date
Fisiere de legaturi
(fisiere de indexare)
1 Stabilirea Cerintelor
Programul trebuie sa implementeze un sistem prin care sa se poata regasi repede informatii legate de conturi bancare.
Cerinte:
1 Se vor folosi clase pentru a gestiona informatiile
2 Datele se vor salva in fisiere
3 Un utilizator trebuie sa poata adauga, salva, modifica si sterge datele necesare
4 Regasirea informatiilor trebuie sa se desfasoare intr-un timp mai scurt decat cel necesar cautarii liniare intr-un fisier
5 Programul trebuie sa impementeze un meniu prin care utilizatorul sa poata interactiona cu datele
2 Estimarea duratei de realizare
Estimarea se va face pentru fiecare din
cerintele de baza ale softului. Astefel:
1 timp de lucru: 1 ora
2 timp de lucru ½ ore
3 adaugare - ½ ore
salvare - ½ ore
modificare - ½ ore
stergere - 1/6 ore
4 algoritm de cautare: ½ ore
5 timp de lucur - ½ ore
Pentru realizarea programului se vor mai aloca 1,5 ore pentru integrarea tuturor componentelor si 2 ore pentru testarea riguroasa a componentelor. In afara implementarii propriuzise, pentru realizarea programului a mai fost necesara 1 ora pentru elaborarea cerintelor (a specificatiilor) si 2 ore (timp acumulat din mai multe zile) pentru a strange informatiile necesare de la "client" (cerintele enuntate de profesor la cursul de Structuri de date precum si idei, sfaturi date de acesta in vederea efectuarii unei munci eficiente).
O data cu terminarea etapei de implementare s-a mai alocat inca o ora pentru a elabora documentatia specifica programului.
Timp total de lucru estimat: 11 ore!
Factori ce au influentat durata de realizare a programului
1 Limbajul de programare ales: c++. Folosind acest limbaj, timpul de lucru este mai mare deoarece se acorda o mai mare atentie zonelor de memorie alocate, eliberarea acestora precum si in cadrum manevrarii pointerilor folositi in cadrul aplicatiei
2 Experienta programatorului: 2 ani ca profesionist. Experienta acumulata in ultimii doi ani mi-a fost de mare ajutor avand in vedere complexitatea redusa a programului ce trebuie implementat.
3 Cerinte noi, revizuire
Pentru a avea date de lucru necesare testarii functionalitatii componentelor, mai este necesara adaugarea unei functii pentru salvarea datelor "hardcoded" la care utilizatorul nu are acces. Acest lucru este necesar pentru a creea o baza de la care sa se poata porni in cadrul procesului de creare a componentelor programului.
Necesitatea acestei functii a parut dupa analizarea erintelor de baza ale proiectului, odata cu inceperea lucrului.
La timpul total necesar implementarii programului s-au mai adaugat astfel ½ ore necesare implementarii acestei functii precum si a testarii acesteia.
Timp total de lucru estimat: 11,5 ore!
4 Concluzii
Implementarea programului a decurs fara probleme, in timpul estimat.
Motivele pentru care nu s-au inregistrat intarzieri:
Claritatea cerintelor
Complexitatea foarte redusa a programului
Experienta programatorului
Utilizarea unui mediu de programare (Microsoft Visual Studio 2008) ce permite implementarea si testarea codului intr-o maniera asistata vizual
5 Anexa: Cod sursa
#include 'stdio.h'
#include 'stdlib.h'
#include 'conio.h'
#include 'math.h'
#include 'ATLComTime.h'
#include 'iostream'
#include <process.h>
using namespace std;
enum TIP_CONT ;
enum TIP_DOBANDA ;
bool OpenFiles(FILE*& fData, FILE*& fLegaturi, bool ToRead = true)
fLegaturi = fopen('legaturi.txt', ToRead == false? 'w' : 'r');
if(fLegaturi == NULL)
return true;
class Cont
void Cont::SetSuma(unsigned int Suma)
void Cont::SetCNP(unsigned long int CNP)
void Cont::SetDobanda(unsigned int Dobanda)
void Cont::SetTipCont(TIP_CONT TipCont)
void Cont::SetTipDobanda(TIP_DOBANDA TipDobanda)
int Cont::GetSuma()
unsigned int Cont::GetDobada()
unsigned long int Cont::GetCNP()
TIP_CONT Cont::GetTipCont()
TIP_DOBANDA Cont::GetTipDobanda()
COleDateTime Cont::GetDataStart()
void Cont::AplicaDobanda()
this->iSuma += (this->Dobanda/100) * this->iSuma;
void Cont::AdaugaInCont(int Suma)
bool Cont::RetrageDinCont(unsigned int Suma)
this->iSuma -= Suma;
return true;
Cont::Cont()
Cont::Cont(TIP_CONT TipCont, int SumaStart, TIP_DOBANDA TipDobanda, unsigned int Dobanda, unsigned long int CNP)
class Conturi
int NrConturi;
ContNod* start;
ContNod* end;
void Conturi::StergeConturileDinMmorie()
this->start = NULL;
this->end = NULL;
Conturi::Conturi()
Conturi::~Conturi()
this->start = NULL;
this->end = NULL;
int GetLungimeNumar(int Numar)
return lg;
bool Conturi::IncarcaConturi()
fLegaturi = fopen('legaturi.txt', 'r');
if(fLegaturi == NULL)
Cont* pCont = new Cont();
while(fread((void*)pCont, sizeof(Cont), 1, fData) > 0)
}
catch()
bool Conturi::SalveazaConturi()
int pos = 1;
ContNod* s = NULL;
s = this->start;
while(s)
char* Legatura = NULL;
int LungimeLegatura = 0;
int LungimePOS = 0;
LungimeLegatura = GetLungimeNumar(s->pCont->GetCNP());
LungimeLegatura++;//adugam un spatiu alb intre CNP si pozitie
LungimePOS = GetLungimeNumar(pos);
LungimeLegatura += LungimePOS;
if(LungimeLegatura == 0)
LungimeLegatura++; //adaugam spatiu pentru NULL
LungimeLegatura++; //adaugam spatiu pentru new line
Legatura = new char[LungimeLegatura];
if(Legatura == NULL)
itoa(s->pCont->GetCNP(), Legatura, 10);
char *Temp = NULL;
Temp = new char[++LungimePOS];
if(Temp == NULL)
itoa(pos, Temp, 10);
strcat(Legatura, ' ');
strcat(Legatura, Temp);
strcat(Legatura, 'n');
delete[] Temp;
fwrite((void*)Legatura, --LungimeLegatura, 1, fLegaturi);
pos++;
s =s->next;
}
fclose(fData);
fclose(fLegaturi);
}
catch()
return true;
void Conturi::AplicaDobanzi()
Cont* Conturi::GetCont(int index)
else
}
return NULL;
Cont* Conturi::GetCont(unsigned long int CNP)
ContNod* s = this->start;
while(s)
{
if(s->pCont->GetCNP() == CNP)
s=s->next;
}
return NULL;
void Conturi::AdaugaCont(Cont* cont)
if(this->start == NULL)
else
}
void CreeazaContNou(Conturi*& conturi)
while(op != '1' && op != '2');
switch(op)
case '2':
};
op = 0;
do
while(op != '1' && op != '2' && op != '3' && op != '4');
switch(op)
case '2':
case '3':
case '4':
};
op = 0;
char Temp[10];
unsigned long int iTemp = 0;
do
while(iTemp<0);
pcont->SetSuma(iTemp);
iTemp = 0;
cin.get();
do
while(iTemp<0);
pcont->SetDobanda(iTemp);
iTemp = 0;
cin.get();
do
while(iTemp<0);
pcont->SetCNP(iTemp);
conturi->AdaugaCont(pcont);
cout<<endl<<'Contul a fost creeat!';
getch();
cin.get();
void StergeToateConturile(Conturi*& conturi)
fclose(fData);
fclose(fLegaturi);
cout<<'Toate conturile au fost sterse!';
getch();
Cont* GetCont(int CNP, Conturi*& conturi, int& FoundPos)
char line [ 128 ];
char Splitter[] = ' ';
char *pTemp = NULL;
int pos = 0;
unsigned long int fCNP = 0;
while ( fgets ( line, sizeof line, fLegaturi ) != NULL )
}
Temp = new Cont();
if(fread((void*)Temp, sizeof(Cont), 1, fData) == 1)
}
}
}
}
fclose(fData);
fclose(fLegaturi);
return NULL;
void AfiseazaInformatiiCont(Cont* pCont)
cout<<endl;
if(pCont->GetTipCont() == CURENT)
if(pCont->GetTipCont() == ECONOMII)
cout<<'CNP Titualr: '<<pCont->GetCNP()<<endl;
if(pCont->GetTipDobanda() == O_LUNA)
if(pCont->GetTipDobanda() == TREI_LUNI)
if(pCont->GetTipDobanda() == SASE_LUNI)
if(pCont->GetTipDobanda() == UN_AN)
cout<<'Dobanda: '<<pCont->GetDobada()<<endl;
cout<<'Suma: '<<pCont->GetSuma()<<endl;
void AfiseazaCont(Conturi*& conturi)
void SalveazaCont(Cont* pcont,int DataFilePos = 0)
if(fseek(fData, sizeof(Cont) * (DataFilePos -1), SEEK_SET) == 0)
}
fclose(fData);
}
else
fLegaturi = fopen('legaturi.txt', 'r+');
if(fLegaturi == NULL)
}
char line [ 128 ];
char Splitter[] = ' ';
char *pTemp = NULL;
int pos = 0;
unsigned long int fCNP = 0;
while ( fgets ( line, sizeof line, fLegaturi ) != NULL )
if( (pTemp = strstr(line, Splitter)) != NULL)
pos++;
char* Legatura = NULL;
int LungimeLegatura = 0;
int LungimePOS = 0;
LungimeLegatura = GetLungimeNumar(pcont->GetCNP());
LungimeLegatura++;//adugam un spatiu alb intre CNP si pozitie
LungimePOS = GetLungimeNumar(pos);
LungimeLegatura += LungimePOS;
LungimeLegatura++; //adaugam spatiu pentru NULL
LungimeLegatura++; //adaugam spatiu pentru new line
Legatura = new char[LungimeLegatura];
itoa(pcont->GetCNP(), Legatura, 10);
char *Temp = NULL;
Temp = new char[++LungimePOS];
itoa(pos, Temp, 10);
strcat(Legatura, ' ');
strcat(Legatura, Temp);
strcat(Legatura, 'n');
delete[] Temp;
fwrite((void*)Legatura, --LungimeLegatura, 1, fLegaturi);
//fseek(fData, sizeof(Cont) * pos, SEEK_SET);
fwrite((void*)pcont, sizeof(Cont), 1, fData);
fclose(fData);
fclose(fLegaturi);
}
void ModificaCont(Conturi*& conturi)
system('cls');
cout<<'Introduceti CNP-ul titularului de cont'<<endl;
char Temp[20];
cin.get(Temp, 20);
int CNP = atoi(Temp);
cin.get();
Cont* pcont = NULL;
int DataFilePos;
pcont = GetCont(CNP,conturi, DataFilePos);
AfiseazaInformatiiCont(pcont);
cout<<endl<<endl;
char op = 0;
do
while(op != '1' && op != '2');
switch(op)
case '2':
};
op = 0;
do
while(op != '1' && op != '2' && op != '3' && op != '4');
switch(op)
case '2':
case '3':
case '4':
};
op = 0;
unsigned long int iTemp = 0;
do
while(iTemp<0);
pcont->SetSuma(iTemp);
iTemp = 0;
cin.get();
do
while(iTemp<0);
pcont->SetDobanda(iTemp);
iTemp = 0;
cin.get();
SalveazaCont(pcont, DataFilePos);
void Conturi::SalveazaConturileIntroduse()
system('cls');
cout<<'Conturile au fost salvate';
_getch();
this->StergeConturileDinMmorie();
void AfiseazaMeniuPrincipal(void)
case '2':
case '3':
case '4':
case '5':
case '6':
};
goto START;
void main(void)
Copyright © 2024 - Toate drepturile rezervate