Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- typedef enum { RON, EUR, GBP } Currency;
- typedef enum { user, admin } UserType;
- typedef struct account { // definire sublista
- struct account* urm; // inlantuire
- Currency currency;
- float sold;
- char iban[20];// elemente lista
- }account;
- typedef struct User { // definire lista
- struct User* urm; // prima inlantuire
- struct account* headAccount; // radacina pentru conturi
- struct account* tailAccount; // ultima adresa a sublistei conturi
- char username[20], cnp[13], pass[20];// elemente lista
- UserType userType;
- }User;
- struct User* UserLogged = NULL;
- const char* TypeUserToString(UserType userType) {
- switch (userType)
- {
- case user: return "user"; break;
- case admin: return "admin"; break;
- default: return "nedefinit";
- break;
- }
- }
- enum UserType stringToUserType(const char* userType) {
- if (strcmp("user", userType) == 0) return user;
- if (strcmp("admin", userType) == 0) return admin;
- return user;
- }
- const char* currencyToString(Currency currency) {
- switch (currency)
- {
- case RON: return "RON"; break;
- case EUR: return "EUR"; break;
- case GBP: return "GBP"; break;
- default: return "nedefinit";
- break;
- }
- }
- enum Currency stringToCurrency(const char* currency) {
- if (strcmp("RON", currency) == 0) return RON;
- if (strcmp("EUR", currency) == 0) return EUR;
- if (strcmp("GBP", currency) == 0) return GBP;
- return RON;
- }
- struct account* SearchAccount(struct account* head, const char *iban) {
- struct account* q = head;
- while (q) {
- if (strcmp(q->iban, iban) == 0) return q;
- q = q->urm;
- }
- return NULL;
- }
- struct User* AddToEndAccount(struct User* user, struct account* p) {
- if (user->headAccount == NULL) {
- user->headAccount = p;
- user->tailAccount = p;
- }
- else {
- user->tailAccount->urm = p;
- user->tailAccount = p;
- }
- return user;
- }
- void RemoveAllAccounts(struct account* head) {
- struct account* aux;
- while (head) {
- aux = head;
- head = head->urm;
- free(aux);
- }
- }
- void ShowAccounts(struct account* headAccount) {
- struct account* q = headAccount;
- printf("--------------------------------------\n");
- while (q) {
- printf("Iban = %s moneda = %s\n", q->iban, currencyToString(q->currency));
- q = q->urm;
- }
- printf("--------------------------------------\n");
- }
- struct User* SearchUserByUsername(struct User* head, const char* username) {
- struct User* q = head;
- while (q) {
- if (strcmp(q->username, username) == 0) return q;
- q = q->urm;
- }
- return NULL;
- }
- struct User* SearchUserByCNP(struct User* head, const char* cnp) {
- struct User* q = head;
- while (q) {
- if (strcmp(q->cnp, cnp) == 0) return q;
- q = q->urm;
- }
- return NULL;
- }
- struct User* AddSortedUser(struct User* head, struct User* p) {// functia de adaugare sortata
- struct User* q = head;// User folosit pentru parcurgea listei
- if (head == NULL) // (!head) verificam daca sunt elemente in lista
- {
- head = p;// daca nu sunt capul listel devine noul element
- }
- else if (strcmp(head->username, p->username) > 0) { // verificam daca elementul adaugat trebuie adaugat in capul listei
- p->urm = head; //elementul aduaugat va avea in pareta dreapta lista existenta
- head = p; // noul element va devieni capatul(radidacian listi)
- return head;
- }
- else {
- while (q->urm != NULL && strcmp(q->urm->username, p->username) < 0) { // parcurgem lista ca sa gasim pozitia de inserare
- q = q->urm;// parcurgere lista
- }
- p->urm = q->urm;// elementu nou va avea in dreapta ce avea poztia la care s-a gasit inserarea
- q->urm = p;
- }
- return head;
- }
- struct User* RemoveUser(struct User* head, char username[]) { //sterge User
- struct User* aux = NULL, * q = NULL;// Userul aux este pentreu retinire tempara User sters, q este folosit pentru parcurgere
- if (head == NULL) {// verificam daca capul este null altfel return null ca si adresa
- return NULL;
- }
- else if (strcmp(head->username, username) == 0) {// verificam daca este capul listei Userul sters
- aux = head;// salvam temporar Userul
- head = head->urm;// capul devine umaatorul element
- RemoveAllAccounts(aux->headAccount);
- free(aux);// returnam adresa Userul pe care vrem sa-l stergem in caz ce se vrea prelucat ceva dupa
- return head;
- }
- else {
- q = head;// daca nu e la inceput parcurgem lista
- while (q->urm != NULL && strcmp(q->urm->username, username) != 0) {// ca la adaugarea sorata cautam pozita anterioara Userul pe care vrem sa-l stergem
- q = q->urm;// parcurgem lista
- }
- if (q->urm == NULL) {// daca s-a ajuns la sfarsitul listei si nu s-a gasit
- return;// returnam null deoarece Userul nu se afla in lista
- }
- else {
- aux = q->urm;// altfel salvam Userul urmator(Userul ce trebuie stres)
- q->urm = q->urm->urm;// Userul anterior va pointa catre Userul din dtreapa celui sters
- RemoveAllAccounts(aux->headAccount);
- free(aux);// returnam Userul pe care vrem sa-l stergem
- }
- return head;
- }
- }
- void ShowUsers(struct User* head) {// toat functiile le am implementat sa primeasca head deaorece e mai ok asa
- struct User* p = head;// ne punem pe capul listei
- while (p != NULL) {// cat timp nu s-a ajuns la sfarsitul fiserului
- printf("username = %s\nCNP = %s\n", p->username, p->cnp);// afisam datele despre utilziator
- ShowAccounts(p->headAccount);
- p = p->urm;// parcurgem lista
- }
- }
- void LoginUser(struct User* head) {
- char username[20], pass[20];
- struct User* user;
- printf("\nusername: "); scanf_s("%s", username, sizeof(username));
- printf("\npassword: "); scanf_s("%s", pass,sizeof(pass));
- user = SearchUserByUsername(head, username);
- if (user) {
- if (strcmp(user->pass, pass) == 0) {
- UserLogged = user;
- }
- else {
- printf("\nParola este gresita");
- }
- }
- else
- {
- printf("\nUtilizatorul nu a fost gasit");
- }
- }
- void MeniuUser(struct User* head) {
- int opt;
- do {
- printf("\n0. Dezautentificare");
- printf("\nOptiunea aleasa: "); scanf_s("%d", &opt);
- switch (opt)
- {
- case 0:
- UserLogged = NULL;
- default:
- break;
- }
- } while (opt);
- }
- void MeniuAdmin(struct User* head) {
- int opt;
- do {
- printf("\n0. Dezautentificare");
- printf("\nOptiunea aleasa: "); scanf_s("%d", &opt);
- switch (opt)
- {
- case 0:
- UserLogged = NULL;
- default:
- break;
- }
- } while (opt);
- }
- struct User* ReadUsersFromFile(const char* filePath) {
- struct User* p, * q = NULL;// Userul nou adaugat
- struct User* head = NULL;// capul listei de utilizatori
- FILE* f = NULL;
- char userTpe[20];
- fopen_s(&f, filePath, "r");
- if (f == NULL) {
- printf("Fiserul de utilizatori nu a putut fi deschis");
- return NULL;
- }
- while (!feof(f))
- {
- p = (struct User*)malloc(sizeof(struct User));
- fscanf_s(f, "%s", p->username, sizeof(p->username)); // fscanf_s pentru siruri si caractere necesita si numarul de elemente maxim citit
- fscanf_s(f, "%s", p->pass, sizeof(p->pass)); // fscanf_s pentru siruri si caractere necesita si numarul de elemente maxim citit
- fscanf_s(f, "%s", userTpe, sizeof(userTpe)); // fscanf_s pentru siruri si caractere necesita si numarul de elemente maxim citit
- p->userType = stringToUserType(userTpe);
- fscanf_s(f, "%s%*c", p->cnp, sizeof(p->cnp)); // %*c se foloseste pentru a citi \n de la sfarst de rand si face discard
- p->urm = NULL;
- p->headAccount = NULL;
- p->tailAccount = NULL;
- q = SearchUserByCNP(head, p->cnp);
- if (q || feof(f) || SearchUserByUsername(head, p->username)) {
- free(p);
- }
- else {
- head = AddSortedUser(head, p);
- }
- }
- fclose(f);
- return head;
- }
- void ReadAccountsFromFile(struct User* head, const char* filePath) {
- struct User* q = NULL;
- struct account* aux = NULL, * temp = NULL;
- char cnp[13], currency[13];
- FILE* f = NULL;
- fopen_s(&f, filePath, "r");
- while (!feof(f))
- {
- aux = (struct account*)malloc(sizeof(struct account));
- fscanf_s(f, "%s", cnp, sizeof(cnp));// fscanf_s pentru siruri si caractere necesita si numarul de elemente maxim citit
- fscanf_s(f, "%s", aux->iban, sizeof(aux->iban));// fscanf_s pentru siruri si caractere necesita si numarul de elemente maxim citit
- fscanf_s(f, "%s", currency, sizeof(currency));// fscanf_s pentru siruri si caractere necesita si numarul de elemente maxim citit
- fscanf_s(f, "%g%*c", &aux->sold);// %*c se foloseste pentru a citi \n de la sfarsit de rand si face discard
- aux->currency = stringToCurrency(currency);
- aux->urm = NULL;
- q = SearchUserByCNP(head, cnp);
- if (!q) {
- free(aux);
- printf("Nu s-a gasit utilizatorul cu cnp %s\n", cnp);
- continue;
- }
- else {
- temp = SearchAccount(q->headAccount, aux->iban);
- if (temp) {
- printf("Contul cu IBAN %s exista deja\n", aux->iban);
- free(aux);
- }
- else {
- AddToEndAccount(q, aux);
- }
- }
- }
- }
- int main()
- {
- struct User* head = NULL;// capul listei de utilizatori
- head = ReadUsersFromFile("users.txt");
- ReadAccountsFromFile(head, "accounts.txt");
- int opt;
- do {
- printf("\n0. Iesire");
- printf("\n1. Autenitifcare");
- printf("\nOptiunea aleasa: "); scanf_s("%d", &opt);
- if (opt == 1) {
- LoginUser(head);
- if (UserLogged) {
- if (UserLogged->userType == user) MeniuUser(head);
- else MeniuAdmin(head);
- }
- }
- } while (opt);
- ShowUsers(head);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement