Advertisement
Alx09

Untitled

May 7th, 2024
593
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.16 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. typedef enum { RON, EUR, GBP } Currency;
  6. typedef enum { user, admin } UserType;
  7.  
  8.  
  9. typedef struct account { // definire sublista
  10.     struct account* urm; //  inlantuire
  11.     Currency currency;
  12.     float sold;
  13.     char iban[20];// elemente lista
  14. }account;
  15.  
  16. typedef struct User { // definire lista
  17.     struct User* urm; // prima inlantuire
  18.     struct account* headAccount; // radacina pentru conturi
  19.     struct account* tailAccount; // ultima adresa a sublistei conturi
  20.     char username[20], cnp[13], pass[20];// elemente lista
  21.     UserType userType;
  22. }User;
  23.  
  24. struct User* UserLogged = NULL;
  25.  
  26. const char* TypeUserToString(UserType userType) {
  27.     switch (userType)
  28.     {
  29.     case user: return "user"; break;
  30.     case admin: return "admin"; break;
  31.     default: return "nedefinit";
  32.     break;
  33.     }
  34. }
  35. enum UserType stringToUserType(const char* userType) {
  36.     if (strcmp("user", userType) == 0) return user;
  37.     if (strcmp("admin", userType) == 0) return admin;
  38.     return user;
  39. }
  40.  
  41. const char* currencyToString(Currency currency) {
  42.     switch (currency)
  43.     {
  44.     case RON: return "RON"; break;
  45.     case EUR: return "EUR"; break;
  46.     case GBP: return "GBP"; break;
  47.     default: return "nedefinit";
  48.         break;
  49.     }
  50. }
  51. enum Currency stringToCurrency(const char* currency) {
  52.     if (strcmp("RON", currency) == 0) return RON;
  53.     if (strcmp("EUR", currency) == 0) return EUR;
  54.     if (strcmp("GBP", currency) == 0) return GBP;
  55.     return RON;
  56. }
  57.  
  58. struct account* SearchAccount(struct account* head, const char *iban) {
  59.     struct account* q = head;
  60.     while (q) {
  61.         if (strcmp(q->iban, iban) == 0) return q;
  62.         q = q->urm;
  63.     }
  64.     return NULL;
  65. }
  66. struct User* AddToEndAccount(struct User* user, struct account* p) {
  67.     if (user->headAccount == NULL) {
  68.         user->headAccount = p;
  69.         user->tailAccount = p;
  70.     }
  71.     else {
  72.         user->tailAccount->urm = p;
  73.         user->tailAccount = p;
  74.     }
  75.     return user;
  76. }
  77. void RemoveAllAccounts(struct account* head) {
  78.     struct account* aux;
  79.     while (head) {
  80.         aux = head;
  81.         head = head->urm;
  82.         free(aux);
  83.     }
  84.  
  85. }
  86. void ShowAccounts(struct account* headAccount) {
  87.     struct account* q = headAccount;
  88.     printf("--------------------------------------\n");
  89.     while (q) {
  90.         printf("Iban = %s moneda =  %s\n", q->iban, currencyToString(q->currency));
  91.         q = q->urm;
  92.     }
  93.     printf("--------------------------------------\n");
  94. }
  95.  
  96. struct User* SearchUserByUsername(struct User* head, const char* username) {
  97.     struct User* q = head;
  98.     while (q) {
  99.         if (strcmp(q->username, username) == 0) return q;
  100.         q = q->urm;
  101.     }
  102.     return NULL;
  103. }
  104.  
  105. struct User* SearchUserByCNP(struct User* head, const char* cnp) {
  106.     struct User* q = head;
  107.     while (q) {
  108.         if (strcmp(q->cnp, cnp) == 0) return q;
  109.         q = q->urm;
  110.     }
  111.     return NULL;
  112. }
  113. struct User* AddSortedUser(struct User* head, struct User* p) {// functia de adaugare sortata
  114.     struct User* q = head;// User folosit pentru parcurgea listei
  115.     if (head == NULL) // (!head) verificam daca sunt elemente in lista
  116.     {
  117.         head = p;// daca nu sunt capul listel devine noul element
  118.     }
  119.     else if (strcmp(head->username, p->username) > 0) { // verificam daca elementul adaugat trebuie adaugat in capul listei
  120.         p->urm = head; //elementul aduaugat va avea in pareta dreapta lista existenta
  121.         head = p; // noul element va devieni capatul(radidacian listi)
  122.         return head;
  123.     }
  124.     else {
  125.         while (q->urm != NULL && strcmp(q->urm->username, p->username) < 0) { // parcurgem lista ca sa gasim pozitia de inserare
  126.             q = q->urm;// parcurgere lista
  127.         }
  128.         p->urm = q->urm;// elementu nou va avea in dreapta ce avea poztia la care s-a gasit inserarea
  129.         q->urm = p;
  130.     }
  131.     return head;
  132. }
  133. struct User* RemoveUser(struct User* head, char username[]) { //sterge User
  134.     struct User* aux = NULL, * q = NULL;// Userul aux este pentreu retinire tempara User sters, q este folosit pentru parcurgere
  135.     if (head == NULL) {// verificam daca capul este null altfel return null ca si adresa
  136.         return NULL;
  137.     }
  138.     else if (strcmp(head->username, username) == 0) {// verificam daca este capul listei Userul sters
  139.         aux = head;// salvam temporar Userul
  140.         head = head->urm;// capul devine umaatorul element
  141.         RemoveAllAccounts(aux->headAccount);
  142.         free(aux);// returnam adresa Userul pe care vrem sa-l stergem in caz ce se vrea prelucat ceva dupa
  143.         return head;
  144.     }
  145.     else {
  146.         q = head;// daca nu e la inceput parcurgem lista
  147.         while (q->urm != NULL && strcmp(q->urm->username, username) != 0) {// ca la adaugarea sorata cautam pozita anterioara Userul pe care vrem sa-l stergem
  148.             q = q->urm;// parcurgem lista
  149.         }
  150.         if (q->urm == NULL) {// daca s-a ajuns la sfarsitul listei si nu s-a gasit
  151.             return;// returnam null deoarece Userul nu se afla in lista
  152.         }
  153.         else {
  154.             aux = q->urm;// altfel salvam Userul urmator(Userul ce trebuie stres)
  155.             q->urm = q->urm->urm;// Userul anterior va pointa catre Userul din dtreapa celui sters
  156.             RemoveAllAccounts(aux->headAccount);
  157.             free(aux);// returnam Userul pe care vrem sa-l stergem
  158.         }
  159.         return head;
  160.     }
  161. }
  162. void ShowUsers(struct User* head) {// toat functiile le am implementat sa primeasca head deaorece e mai ok asa
  163.     struct User* p = head;// ne punem pe capul listei
  164.  
  165.     while (p != NULL) {// cat timp nu s-a ajuns la sfarsitul fiserului
  166.         printf("username = %s\nCNP = %s\n", p->username, p->cnp);// afisam datele despre utilziator
  167.         ShowAccounts(p->headAccount);
  168.         p = p->urm;// parcurgem lista
  169.     }
  170. }
  171. void LoginUser(struct User* head) {
  172.     char username[20], pass[20];
  173.     struct User* user;
  174.     printf("\nusername: "); scanf_s("%s", username, sizeof(username));
  175.     printf("\npassword: "); scanf_s("%s", pass,sizeof(pass));
  176.     user = SearchUserByUsername(head, username);
  177.     if (user) {
  178.         if (strcmp(user->pass, pass) == 0) {
  179.             UserLogged = user;
  180.         }
  181.         else {
  182.             printf("\nParola este gresita");
  183.         }
  184.     }
  185.     else
  186.     {
  187.         printf("\nUtilizatorul nu a fost gasit");
  188.     }
  189. }
  190.  
  191. void MeniuUser(struct User* head) {
  192.     int opt;
  193.     do {
  194.         printf("\n0. Dezautentificare");
  195.         printf("\nOptiunea aleasa: "); scanf_s("%d", &opt);
  196.         switch (opt)
  197.         {
  198.         case 0:
  199.             UserLogged = NULL;
  200.         default:
  201.             break;
  202.         }
  203.     } while (opt);
  204. }
  205.  
  206. void MeniuAdmin(struct User* head) {
  207.     int opt;
  208.     do {
  209.         printf("\n0. Dezautentificare");
  210.         printf("\nOptiunea aleasa: "); scanf_s("%d", &opt);
  211.         switch (opt)
  212.         {
  213.         case 0:
  214.             UserLogged = NULL;
  215.         default:
  216.             break;
  217.         }
  218.     } while (opt);
  219. }
  220.  
  221. struct User* ReadUsersFromFile(const char* filePath) {
  222.     struct User* p, * q = NULL;// Userul nou adaugat
  223.     struct User* head = NULL;// capul listei de utilizatori
  224.     FILE* f = NULL;
  225.     char userTpe[20];
  226.     fopen_s(&f, filePath, "r");
  227.     if (f == NULL) {
  228.         printf("Fiserul de utilizatori nu a putut fi deschis");
  229.         return NULL;
  230.     }
  231.     while (!feof(f))
  232.     {
  233.         p = (struct User*)malloc(sizeof(struct User));
  234.         fscanf_s(f, "%s", p->username, sizeof(p->username)); // fscanf_s pentru siruri si caractere necesita si numarul de elemente maxim citit
  235.         fscanf_s(f, "%s", p->pass, sizeof(p->pass)); // fscanf_s pentru siruri si caractere necesita si numarul de elemente maxim citit
  236.         fscanf_s(f, "%s", userTpe, sizeof(userTpe)); // fscanf_s pentru siruri si caractere necesita si numarul de elemente maxim citit
  237.         p->userType = stringToUserType(userTpe);
  238.         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
  239.         p->urm = NULL;
  240.         p->headAccount = NULL;
  241.         p->tailAccount = NULL;
  242.         q = SearchUserByCNP(head, p->cnp);
  243.         if (q || feof(f) || SearchUserByUsername(head, p->username)) {
  244.             free(p);
  245.         }
  246.         else {
  247.             head = AddSortedUser(head, p);
  248.         }
  249.     }
  250.     fclose(f);
  251.     return head;
  252. }
  253. void ReadAccountsFromFile(struct User* head, const char* filePath) {
  254.     struct User* q = NULL;
  255.    
  256.     struct account* aux = NULL, * temp = NULL;
  257.     char cnp[13], currency[13];
  258.     FILE* f = NULL;
  259.    
  260.  
  261.     fopen_s(&f, filePath, "r");
  262.  
  263.     while (!feof(f))
  264.     {
  265.         aux = (struct account*)malloc(sizeof(struct account));
  266.         fscanf_s(f, "%s", cnp, sizeof(cnp));// fscanf_s pentru siruri si caractere necesita si numarul de elemente maxim citit
  267.         fscanf_s(f, "%s", aux->iban, sizeof(aux->iban));// fscanf_s pentru siruri si caractere necesita si numarul de elemente maxim citit
  268.         fscanf_s(f, "%s", currency, sizeof(currency));// fscanf_s pentru siruri si caractere necesita si numarul de elemente maxim citit
  269.         fscanf_s(f, "%g%*c", &aux->sold);// %*c se foloseste pentru a citi \n de la sfarsit de rand si face discard
  270.         aux->currency = stringToCurrency(currency);
  271.         aux->urm = NULL;
  272.         q = SearchUserByCNP(head, cnp);
  273.         if (!q) {
  274.             free(aux);
  275.             printf("Nu s-a gasit utilizatorul cu cnp %s\n", cnp);
  276.             continue;
  277.         }
  278.         else {
  279.             temp = SearchAccount(q->headAccount, aux->iban);
  280.             if (temp) {
  281.                 printf("Contul cu IBAN %s exista deja\n", aux->iban);
  282.                 free(aux);
  283.             }
  284.             else {
  285.                 AddToEndAccount(q, aux);
  286.             }
  287.         }
  288.     }
  289.  
  290. }
  291.  
  292. int main()
  293. {
  294.     struct User* head = NULL;// capul listei de utilizatori
  295.     head = ReadUsersFromFile("users.txt");
  296.     ReadAccountsFromFile(head, "accounts.txt");
  297.     int opt;
  298.     do {
  299.         printf("\n0. Iesire");
  300.         printf("\n1. Autenitifcare");
  301.         printf("\nOptiunea aleasa: "); scanf_s("%d", &opt);
  302.         if (opt == 1) {
  303.             LoginUser(head);
  304.             if (UserLogged) {
  305.                 if (UserLogged->userType == user) MeniuUser(head);
  306.                 else MeniuAdmin(head);
  307.             }
  308.         }
  309.  
  310.  
  311.     } while (opt);
  312.     ShowUsers(head);
  313.  
  314. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement