Advertisement
gbox12

3

Jan 7th, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 28.69 KB | None | 0 0
  1. //
  2. //  main.c
  3. //  ex6
  4. //
  5. //  Created by Harel Shattenstein on 27/12/2018
  6. //  Copyright © 2018 Harel Shattenstein. All rights reserved
  7. //
  8.  
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <stdlib.h>
  12.  
  13. #define MAX_USERNAME 10
  14. #define MAX_PASSWORD 15
  15. #define MIN_USERNAME 3
  16. #define MIN_PASSWORD 3
  17. #define MIN_AGE 18
  18. #define MAX_AGE 100
  19. #define MIN_LOGIN_INFO 3
  20. #define MAX_INFO 211
  21. #define MAX_HOBBIES 8
  22. #define MAX 10
  23. #define ID_LENGTH 10
  24. #define NAME_LENGTH 15
  25. #define NAME_LENGTH 15
  26. #define DESCRIPTION 211
  27. #define MAX_LINE_LEN 1000
  28. int const TRUE = 1;
  29. int const FALSE = 0;
  30.  
  31. typedef struct {
  32.     char *id;
  33.     char *name;
  34.     char *surname;
  35.     int age;
  36.     char gender;
  37.     char *username;
  38.     char *password;
  39.     char *description;
  40.     char *hobbies;
  41. }User;
  42.  
  43. typedef struct Women {
  44.     User *userWoman;
  45.     struct Women *next;
  46. }Women;
  47.  
  48.  
  49. enum hobbies { Baseball = 1, Basketball, Bicycle, Books, Drawing, Gym, Movies, Poetry };
  50.  
  51. User** readInput(User** headMen,int* numberOfMen,Women** head);
  52. void freeWomen(Women** head);
  53. void freeMen(User** headMen, int* numberOfMen);
  54. void searchId(Women** head, User** headMen, int* numberOfMen, char* enteredId);
  55. void freeUser(User* userTofree);
  56. void printListMen(User **head, int* size);
  57. User** removeMan(User** headMen, int* numberOfMen, char* existUser);
  58. void manu2(User* logedMan, User* logedWoman, Women** head, User** headMen, int* numberOfMen);
  59. void printUser(User* user);
  60. void reinitialize(int* vaildHobbies);
  61. void findMatchman(int minAge, int maxAge, User* logedWoman, User** headMen, int* numberOfMen);
  62. void findMatchWoman(int minAge, int maxAge, User* logedMan, Women** head);
  63. void printHobbies(User* user);
  64. int sumOfHobbies(int* vaildHobbies, int* vaildHobbies2, char* hobbies, char* hobbies2, int* matchHobbies);
  65. const char* getHobbyName(enum hobbies hobbey);
  66. void getVaildHobbies(int* vaildHobbies, char* hobbies);
  67. User* getWomanUser(char* existUser, Women** head);
  68. User* getManUser(char* existUser, User** head, int* numberOfMen);
  69. void manu(Women **head, User** headMen, int* numberOfMen);
  70. void push(Women **head, User *woman);
  71. void printList(Women **head);
  72. int searchWomanUser(char* existUser, Women** head);
  73. int searchWomanPass(char* existPassword, Women** head, char* existUser);
  74. int searchManUser(char* existUser, User** head, int* numberOfMen);
  75. int searchManPass(char* existPassword, User** head, int* numberOfMen, char* username);
  76. int search(Women** head, User** headMen, int* size, char* existUser, char* existPassword);
  77. Women** removeWoman(Women** head, char* existUser);
  78. void newMan(User **headMan, int *size, char *id, char *name, char *surname,
  79.             int age, char gender, char *username,
  80.             char *password, char *description, char *hobbies);
  81. User* newUser(char *id, char *name, char *surname,
  82.               int age,
  83.               char gender,
  84.               char *username,
  85.               char *password,
  86.               char *description,
  87.               char *hobbies);
  88. User** realocateHeadMen(User** headMen, int* size, char *id, char *name, char *surname,
  89.                         int age, char gender, char *username,
  90.                         char *password, char *description, char *hobbies);
  91.  
  92.  
  93.  
  94.  
  95. int main() {
  96.     fflush(stdin);
  97.     Women **head = NULL;
  98.     Women *headWoman = NULL;
  99.     User **headMen = NULL;
  100.     int *numberOfMen, mens = 0;
  101.    
  102.     numberOfMen = &mens;
  103.     head = &headWoman;
  104.     headMen = readInput(headMen, numberOfMen, head);
  105.    
  106.     /*
  107.      headMen = realocateHeadMen(headMen, numberOfMen, "012345678", "danny", "cohen", 22, 'M', "danny1993", "123", "Nice person", "1,2,4,8");
  108.      headMen = realocateHeadMen(headMen, numberOfMen, "223325222", "or", "dan", 25, 'M', "ordan10", "1234", "Singer and dancer", "3,5,6,7");
  109.      headMen = realocateHeadMen(headMen, numberOfMen, "349950234", "nadav", "levi", 50, 'M', "nd50", "nadav", "Engineer very smart", "3,6,7,8");
  110.      
  111.      
  112.      
  113.      push(head, newUser("203484758", "shani", "israel", 25, 'F', "shaninush", "12345", "Happy and cool girl", "4,5,6,7"));
  114.      push(head, newUser("345656974", "oshrit", "hasson", 30, 'F', "osh321", "111", "Layer and a painter", "3,4,5,7"));
  115.      */
  116.    
  117.    
  118.    manu(head, headMen, numberOfMen);
  119.    
  120.  //   printList(head);
  121.  //   printListMen(headMen, numberOfMen);
  122.     //PRINT TO FILE!!!!!!!!!!!
  123.     freeMen(headMen, numberOfMen);
  124.     freeWomen(head);
  125.    
  126.    
  127.    
  128. }
  129.  
  130. void manu(Women **head, User** headMen, int* numberOfMen) {
  131.     fflush(stdin);
  132.     char existUser[MAX_USERNAME];
  133.     char existPassword[MAX_PASSWORD];
  134.     int choice, age, womanCorrectPass, manCorrectPass, womanUserExists, manUserExists;
  135.     char id[ID_LENGTH];
  136.     char name[MAX_PASSWORD], surname[MAX_PASSWORD], username[MAX_USERNAME],
  137.     password[MAX_PASSWORD], description[MAX_INFO], hobbies[MAX_HOBBIES], gender;
  138.     User *user = NULL;
  139.     User* logedMan = NULL;
  140.     User* logedWoman = NULL;
  141.    
  142.     printf("Welcome! please choose an option\n");
  143.     printf("1 - Log in\n");
  144.     printf("2 - New member\n");
  145.     printf("3 - Exit\n");
  146.     scanf("%d", &choice);
  147.     switch (choice) {
  148.         case 1:
  149.             printf("Please enter your username:\n");
  150.             scanf("%s", existUser);
  151.             manUserExists = searchManUser(existUser, headMen, numberOfMen);
  152.             womanUserExists = searchWomanUser(existUser, head);
  153.             if (manUserExists == FALSE && womanUserExists == FALSE) {
  154.                 printf("User do not exist in the system, please try again\n");
  155.                 printf("Please enter your username:\n");
  156.                 scanf("%s", existUser);
  157.                 manUserExists = searchManUser(existUser, headMen, numberOfMen);
  158.                 womanUserExists = searchWomanUser(existUser, head);
  159.                 if (manUserExists == FALSE && womanUserExists == FALSE) {
  160.                     manu(head, headMen, numberOfMen);
  161.                 }
  162.             }
  163.             printf("Please enter your password:\n");
  164.             scanf("%s", existPassword);
  165.             manCorrectPass = searchManPass(existPassword, headMen, numberOfMen, existUser);
  166.             womanCorrectPass = searchWomanPass(existPassword, head, existUser);
  167.             if ((manUserExists && manCorrectPass) || (womanUserExists && womanCorrectPass)) {
  168.                 if (manUserExists) {
  169.                     logedMan = getManUser(existUser, headMen, numberOfMen);
  170.                     printf("Hello %s!\n", logedMan->name);
  171.                 }
  172.                 if (womanUserExists) {
  173.                     logedWoman = getWomanUser(existUser, head);
  174.                     printf("Hello %s!\n", logedWoman->name);
  175.                 }
  176.             }
  177.             else {
  178.                 printf("Wrong password\n");
  179.                 manu(head, headMen, numberOfMen);
  180.             }
  181.             manu2(logedMan, logedWoman, head, headMen, numberOfMen);
  182.             break;
  183.         case 2:
  184.             printf("Please enter your ID:\n");
  185.             scanf("%s", id);
  186.             searchId(head, headMen, numberOfMen, id);
  187.             printf("Please enter your first name:\n");
  188.             scanf("%s", name);
  189.             printf("Please enter your last name:\n");
  190.             scanf("%s", surname);
  191.             printf("Please enter your age (18 to 100):\n");
  192.             scanf("%d", &age);
  193.             if (age < MIN_AGE || age > MAX_AGE) {
  194.                 manu(head, headMen, numberOfMen);
  195.             }
  196.             printf("Please enter your gender (F-female, M-male):\n");
  197.             scanf(" %c", &gender);
  198.             printf("Choose a username (3-10 characters):\n");
  199.             scanf("%s", username);
  200.             if ((username[0]<'A' || (username[0] > 'Z' && username[0] < 'a') || username[0]>'z') || strlen(username) < MIN_USERNAME) {
  201.                 manu(head, headMen, numberOfMen);
  202.             }
  203.             printf("please choose 4 hobbies: Baseball=1, Basketball=2, Bicycle=3, Books=4, Drawing=5, Gym=6, Movies=7, Poetry=8\n");
  204.             scanf(" %[^\n]%*c", hobbies);
  205.             printf("Choose a password (attention-minimum 3 characters):\n");
  206.             scanf("%s", password);
  207.             if (strlen(password) < MIN_PASSWORD) {
  208.                 manu(head, headMen, numberOfMen);
  209.             }
  210.             printf("Some words about yourself:\n");
  211.             scanf(" %[^\n]%*c", description);
  212.            
  213.             if (gender == 'F') {
  214.                 user = newUser(id, name, surname, age, gender, username, password, description, hobbies);
  215.                 push(head, user);
  216.             }
  217.             else {
  218.                 headMen = realocateHeadMen(headMen, numberOfMen, id, name, surname, age, gender,
  219.                                            username, password, description, hobbies);
  220.             }
  221.             printf("Hi %s, lets find love!\n", name);
  222.             logedMan = getManUser(username, headMen, numberOfMen);
  223.             logedWoman = getWomanUser(username, head);
  224.             manu2(logedMan, logedWoman, head, headMen, numberOfMen);
  225.             break;
  226.         case 3:
  227.             freeMen(headMen, numberOfMen);
  228.             freeWomen(head);
  229.            
  230.             exit(1);
  231.             break;
  232.         default: {
  233.             printf("Bad choice, please try again\n");
  234.             manu(head, headMen, numberOfMen);
  235.         }
  236.     }
  237. }
  238. User* newUser(char *id, char *name, char *surname,
  239.               int age,
  240.               char gender,
  241.               char *username,
  242.               char *password,
  243.               char *description,
  244.               char *hobbies) {
  245.     User *newUser = NULL;
  246.    
  247.     newUser = (User*)malloc(sizeof(User));
  248.     if (newUser == NULL) {
  249.         printf("Allocation of newUser failed\n");
  250.         exit(1);
  251.     }
  252.     newUser->id = (char*)malloc(ID_LENGTH * sizeof(char));
  253.     if (newUser->id == NULL) {
  254.         printf("Allocation of newUser -> id failed\n");
  255.         exit(1);
  256.     }
  257.     strcpy(newUser->id, id);
  258.     newUser->name = (char*)malloc(NAME_LENGTH * sizeof(char));
  259.     if (newUser->name == NULL) {
  260.         printf("Allocation of newUser -> name failed\n");
  261.         exit(1);
  262.     }
  263.     strcpy(newUser->name, name);
  264.     newUser->surname = (char*)malloc(NAME_LENGTH * sizeof(char));
  265.     if (newUser->surname == NULL) {
  266.         printf("Allocation of newUser -> surname failed\n");
  267.         exit(1);
  268.     }
  269.     strcpy(newUser->surname, surname);
  270.     newUser->age = age;
  271.     newUser->gender = gender;
  272.    
  273.     newUser->username = (char*)malloc(MAX * sizeof(char));
  274.     if (newUser->username == NULL) {
  275.         printf("Allocation of newUser -> username failed\n");
  276.         exit(1);
  277.     }
  278.     strcpy(newUser->username, username);
  279.    
  280.     newUser->password = (char*)malloc(NAME_LENGTH * sizeof(char));
  281.     if (newUser->password == NULL) {
  282.         printf("Allocation of newUser -> password failed\n");
  283.         exit(1);
  284.     }
  285.     strcpy(newUser->password, password);
  286.    
  287.     newUser->description = (char*)malloc(DESCRIPTION * sizeof(char));
  288.     if (newUser->description == NULL) {
  289.         printf("Allocation of newUser -> description failed\n");
  290.         exit(1);
  291.     }
  292.     strcpy(newUser->description, description);
  293.    
  294.     newUser->hobbies = (char*)malloc(NAME_LENGTH * sizeof(char));
  295.     if (newUser->hobbies == NULL) {
  296.         printf("Allocation of newUser -> hobbies  failed\n");
  297.         exit(1);
  298.     }
  299.     strcpy(newUser->hobbies, hobbies);
  300.    
  301.     return newUser;
  302.    
  303. }
  304.  
  305. void push(Women **head, User *woman) {
  306.     Women *nextWomen = NULL, *temp = NULL, *newWoman = NULL, *addWoman = NULL;
  307.     nextWomen = *head;
  308.    
  309.     if (*head == NULL) {
  310.         *head = (Women*)malloc(sizeof(Women));
  311.         if (*head == NULL) {
  312.             printf("Allocation of headWoman failed\n");
  313.             exit(1);
  314.         }
  315.         (*head)->userWoman = woman;
  316.         (*head)->next = NULL;
  317.     }
  318.     else {
  319.        
  320.         if (strcmp((*head)->userWoman->surname, woman->surname) > 0) {
  321.             temp = *head;
  322.             newWoman = (Women*)malloc(sizeof(Women));
  323.             if (newWoman == NULL) {
  324.                 printf("Allocation of newWoman failed\n");
  325.                 exit(1);
  326.             }
  327.             newWoman->userWoman = woman;
  328.             newWoman->next = (temp);
  329.             *head = newWoman;
  330.             return;
  331.         }
  332.         while (nextWomen->next != NULL && (strcmp(nextWomen->next->userWoman->surname, woman->surname) <= 0)) {
  333.             nextWomen = nextWomen->next;
  334.         }
  335.         if (nextWomen->next == NULL) {
  336.             nextWomen->next = (Women*)malloc(sizeof(Women));
  337.             if (nextWomen->next == NULL) {
  338.                 printf("Allocation of nextWomen failed\n");
  339.                 exit(1);
  340.             }
  341.            
  342.             nextWomen->next->userWoman = woman;
  343.             nextWomen->next->next = NULL;
  344.         }
  345.         else {
  346.            
  347.             addWoman = (Women*)malloc(sizeof(Women));
  348.             if (addWoman == NULL) {
  349.                 printf("Allocation of addWoman failed\n");
  350.                 exit(1);
  351.             }
  352.             addWoman->userWoman = woman;
  353.             addWoman->next = nextWomen->next;
  354.             nextWomen->next = addWoman;
  355.            
  356.         }
  357.     }
  358. }
  359.  
  360.  
  361.  
  362. void printList(Women **head) {
  363.     Women *user = (*head);
  364.     while (user != NULL) {
  365.         printf("%s\n", user->userWoman->id);
  366.         printf("%s\n", user->userWoman->name);
  367.         printf("%s\n", user->userWoman->surname);
  368.         printf("%d\n", user->userWoman->age);
  369.         printf("%c\n", user->userWoman->gender);
  370.         printf("%s\n", user->userWoman->username);
  371.         printf("%s\n", user->userWoman->password);
  372.         printf("%s\n", user->userWoman->description);
  373.         printf("%s\n", user->userWoman->hobbies);
  374.         user = user->next;
  375.     }
  376. }
  377.  
  378.  
  379.  
  380. int searchWomanUser(char* existUser, Women** head) {
  381.     Women *user = NULL;
  382.     user = (*head);
  383.     while (user != NULL) {
  384.         if (strcmp(user->userWoman->username, existUser) == 0)
  385.             return TRUE;
  386.         user = user->next;
  387.     }
  388.     return FALSE;
  389. }
  390.  
  391. int searchWomanPass(char* existPassword, Women** head, char* existUser) {
  392.     Women *user = NULL;
  393.     user = (*head);
  394.     while (user != NULL) {
  395.         if ((strcmp(user->userWoman->password, existPassword) == 0) && (strcmp(user->userWoman->username, existUser) == 0)) {
  396.             return TRUE;
  397.         }
  398.         user = user->next;
  399.     }
  400.     return FALSE;
  401. }
  402.  
  403. void searchId(Women** head, User** headMen, int* numberOfMen, char* enteredId) {
  404.     int womanIdFound = FALSE, manIdFound = FALSE, i;
  405.     Women *user = NULL;
  406.    
  407.     user = (*head);
  408.     while (user != NULL) {
  409.         if ((strcmp(user->userWoman->id, enteredId) == 0)) {
  410.             womanIdFound = TRUE;
  411.         }
  412.         user = user->next;
  413.     }
  414.     for (i = 0; i < *numberOfMen; i++) {
  415.         if (strcmp(headMen[i]->id, enteredId) == 0) {
  416.             manIdFound = TRUE;
  417.         }
  418.     }
  419.     if (manIdFound == TRUE || womanIdFound == TRUE) {
  420.         printf("Error: User already exists\n");
  421.         manu(head, headMen, numberOfMen);
  422.     }
  423.    
  424. }
  425.  
  426.  
  427. Women** removeWoman(Women** head, char* existUser) {
  428.     Women *user = NULL, *prevoiusWoman = NULL, *nextWoman = NULL, *remove = NULL;
  429.    
  430.     user = (*head);
  431.    
  432.    
  433.     if (strcmp(user->userWoman->username, existUser) == 0) {
  434.         remove = user;
  435.         nextWoman = user->next;
  436.         if (*head == user) {
  437.             *head = nextWoman;
  438.             freeUser(remove->userWoman);
  439.             free(remove->userWoman);
  440.             free(remove);
  441.             return head;
  442.         }
  443.     }
  444.     else {
  445.         while (strcmp(user->userWoman->username, existUser) != 0) {
  446.             prevoiusWoman = user;
  447.             user = user->next;
  448.         }
  449.         //Last node in the linked list
  450.         if (user->next == NULL) {
  451.             freeUser(user->userWoman);
  452.             free(user->userWoman);
  453.             free(user);
  454.             prevoiusWoman->next = NULL;
  455.         }
  456.         else {
  457.             nextWoman = user->next;
  458.             prevoiusWoman->next = nextWoman;
  459.             freeUser(user->userWoman);
  460.             free(user->userWoman);
  461.             free(user);
  462.         }
  463.     }
  464.     return head;
  465. }
  466.  
  467.  
  468.  
  469. User** realocateHeadMen(User** headMen, int* size, char *id, char *name, char *surname,
  470.                         int age, char gender, char *username,
  471.                         char *password, char *description, char *hobbies) {
  472.     int newSize = 0;
  473.    
  474.     if (*size == 0) {
  475.         headMen = (User**)malloc(sizeof(User*));
  476.     }
  477.     else {
  478.         newSize = (*size) + 1;
  479.         headMen = (User**)realloc(headMen, newSize * sizeof(User*));
  480.         if (headMen == NULL) {
  481.             printf("Reallocation of headMen failed\n");
  482.             exit(1);
  483.         }
  484.     }
  485.     if (headMen == NULL) {
  486.         exit(1);
  487.     }
  488.     headMen[*size] = newUser(id, name, surname,
  489.                              age, gender, username,
  490.                              password, description, hobbies);
  491.     *size += 1;
  492.     return headMen;
  493. }
  494.  
  495.  
  496. int searchManUser(char* existUser, User** head, int* numberOfMen) {
  497.     int i;
  498.    
  499.     for (i = 0; i < (*numberOfMen); i++) {
  500.         if (strcmp(head[i]->username, existUser) == 0) {
  501.             return TRUE;
  502.         }
  503.     }
  504.     return FALSE;
  505. }
  506.  
  507. int searchManPass(char* existPassword, User** head, int* numberOfMen, char* username) {
  508.     int i;
  509.    
  510.     for (i = 0; i < (*numberOfMen); i++) {
  511.         if ((strcmp(head[i]->password, existPassword) == 0) && (strcmp(head[i]->username, username) == 0)) {
  512.             return TRUE;
  513.         }
  514.     }
  515.     return FALSE;
  516. }
  517.  
  518.  
  519. User* getManUser(char* existUser, User** head, int* numberOfMen) {
  520.     int i;
  521.     for (i = 0; i < (*numberOfMen); i++) {
  522.         if (strcmp(head[i]->username, existUser) == 0) {
  523.             return head[i];
  524.         }
  525.     }
  526.     return NULL;
  527. }
  528.  
  529. User* getWomanUser(char* existUser, Women** head) {
  530.     Women *user = NULL;
  531.     user = (*head);
  532.     while (user != NULL) {
  533.         if (strcmp(user->userWoman->username, existUser) == 0)
  534.             return (user->userWoman);
  535.         user = user->next;
  536.     }
  537.     return NULL;
  538. }
  539.  
  540. void findMatchWoman(int minAge, int maxAge, User* logedMan, Women** head) {
  541.     int vaildHobbies[9] = { 0 }, vaildHobbies2[9] = { 0 }, matchHobbies[9] = { 0 };
  542.     Women *user = NULL;
  543.    
  544.     user = (*head);
  545.     while (user != NULL) {
  546.         if (minAge <= (user->userWoman->age) && (user->userWoman->age) <= maxAge) {
  547.             if (sumOfHobbies(vaildHobbies, vaildHobbies2, logedMan->hobbies, user->userWoman->hobbies, matchHobbies) >= 2) {
  548.                 printUser(user->userWoman);
  549.             }
  550.         }
  551.         reinitialize(vaildHobbies);
  552.         reinitialize(vaildHobbies2);
  553.         reinitialize(matchHobbies);
  554.         user = user->next;
  555.     }
  556. }
  557.  
  558.  
  559.  
  560. void getVaildHobbies(int* vaildHobbies, char* hobbies) {
  561.     int i, j = 0;
  562.     for (i = 0; i < strlen(hobbies); i++) {
  563.         if (('0' < hobbies[i]) && (hobbies[i] < '9')) {
  564.             int temp = atoi(&hobbies[i]);
  565.             vaildHobbies[temp] = 1;
  566.             j++;
  567.         }
  568.     }
  569. }
  570.  
  571. const char* getHobbyName(enum hobbies hobbey) {
  572.     switch (hobbey) {
  573.         case Baseball: return "Baseball";
  574.         case Basketball: return "Basketball";
  575.         case Bicycle: return "Bicycle";
  576.         case Books: return "Books";
  577.         case Drawing: return "Drawing";
  578.         case Gym: return "Gym";
  579.         case Movies: return "Movies";
  580.         case Poetry: return "Poetry";
  581.     }
  582. }
  583.  
  584. int sumOfHobbies(int* vaildHobbies, int* vaildHobbies2, char* hobbies, char* hobbies2, int* matchHobbies) {
  585.     int i, sum = 0;
  586.    
  587.     getVaildHobbies(vaildHobbies, hobbies);
  588.     getVaildHobbies(vaildHobbies2, hobbies2);
  589.    
  590.     for (i = 0; i < 9; i++) {
  591.         if ((vaildHobbies[i] & vaildHobbies2[i]) == 1) {
  592.             matchHobbies[i] = i;
  593.             sum++;
  594.         }
  595.     }
  596.     return sum;
  597. }
  598.  
  599. void printHobbies(User* user) {
  600.     int i, times = 0;
  601.     char hobby;
  602.    
  603.     for (i = 0; i < 7; i++) {
  604.         hobby = user->hobbies[i];
  605.         if (('0' < hobby) && (hobby < '9')) {
  606.             times++;
  607.             if (times != 4) {
  608.                 printf("%s, ", getHobbyName(hobby - '0'));
  609.             }
  610.             else {
  611.                 printf("%s ", getHobbyName(hobby - '0'));
  612.             }
  613.         }
  614.     }
  615. }
  616.  
  617.  
  618. void reinitialize(int* vaildHobbies) {
  619.     int i;
  620.     for (i = 0; i < 9; i++) {
  621.         vaildHobbies[i] = 0;
  622.     }
  623. }
  624.  
  625.  
  626. void printUser(User* user) {
  627.    
  628.     printf("Name: %s %s Age: %d Hobbies: ", user->name, user->surname, user->age);
  629.     printHobbies(user);
  630.     printf("Description: %s\n\n", user->description);
  631. }
  632.  
  633.  
  634.  
  635. void manu2(User* logedMan, User* logedWoman, Women** head, User** headMen, int* numberOfMen) {
  636.     int choice2, minAge, maxAge;
  637.     fflush(stdin);
  638.    
  639.     printf("Please choose an option:\n");
  640.     printf("1. Find a match\n");
  641.     printf("2. I found love, DELETE me\n");
  642.     printf("3. Log out\n");
  643.     scanf("%d", &choice2);
  644.     switch (choice2) {
  645.         case 1:
  646.             printf("Please choose ages range:\n");
  647.             scanf("%d %d", &minAge, &maxAge);
  648.             if (logedMan != NULL) {
  649.                 findMatchWoman(minAge, maxAge, logedMan, head);
  650.                 manu2(logedMan, logedWoman, head, headMen, numberOfMen);
  651.             }
  652.             else {
  653.                 findMatchman(minAge, maxAge, logedWoman, headMen, numberOfMen);
  654.                 manu2(logedMan, logedWoman, head, headMen, numberOfMen);
  655.             }
  656.             break;
  657.         case 2:
  658.             if (logedMan != NULL) {
  659.                 headMen = removeMan(headMen, numberOfMen, logedMan->username);
  660.                 manu(head, headMen, numberOfMen);
  661.             }
  662.             else {
  663.                 head = removeWoman(head, logedWoman->username);
  664.                 manu(head, headMen, numberOfMen);
  665.             }
  666.             break;
  667.         case 3:
  668.             manu(head, headMen, numberOfMen);
  669.             break;
  670.         default: {
  671.             printf("Bad choice, please try again\n");
  672.             manu(head, headMen, numberOfMen);
  673.         }
  674.     }
  675. }
  676.  
  677. void findMatchman(int minAge, int maxAge, User* logedWoman, User** headMen, int* numberOfMen) {
  678.     int vaildHobbies[9] = { 0 }, vaildHobbies2[9] = { 0 }, matchHobbies[9] = { 0 }, i;
  679.    
  680.     for (i = 0; i < (*numberOfMen); i++) {
  681.         if (minAge <= (headMen[i]->age) && (headMen[i]->age) <= maxAge) {
  682.             if (sumOfHobbies(vaildHobbies, vaildHobbies2, logedWoman->hobbies, headMen[i]->hobbies, matchHobbies) >= 2) {
  683.                 printUser(headMen[i]);
  684.             }
  685.         }
  686.         reinitialize(vaildHobbies);
  687.         reinitialize(vaildHobbies2);
  688.         reinitialize(matchHobbies);
  689.     }
  690. }
  691.  
  692. User** removeMan(User** headMen, int* numberOfMen, char* existUser) {
  693.     int i, j, newSize = 0;
  694.     User *toRemove, *lastUser;
  695.    
  696.     for (i = 0; i < *numberOfMen; i++) {
  697.         if ((strcmp(headMen[i]->username, existUser) == 0)) {
  698.             j = i;
  699.             toRemove = headMen[i];
  700.             while (j != *numberOfMen - 1) {
  701.                 headMen[j] = headMen[j + 1];
  702.                 j++;
  703.             }
  704.            
  705.             if (j != 1) {
  706.                 freeUser(toRemove);
  707.                 free(toRemove);
  708.                 newSize = (*numberOfMen) - 1;
  709.                 headMen = (User**)realloc(headMen, newSize * sizeof(User));
  710.                 if (headMen == NULL) {
  711.                     printf("Reallocation of headMen failed\n");
  712.                     exit(1);
  713.                 }
  714.             }
  715.             else {
  716.                 newSize = (*numberOfMen) - 1;
  717.                 headMen = (User**)realloc(headMen, newSize * sizeof(User));
  718.                 if (headMen == NULL) {
  719.                     printf("Reallocation of headMen failed\n");
  720.                     exit(1);
  721.                 }
  722.                 lastUser = *headMen;
  723.                 freeUser(toRemove);
  724.                 free(toRemove);
  725.                 headMen = &lastUser;
  726.             }
  727.         }
  728.     }
  729.     (*numberOfMen)--;
  730.     return headMen;
  731. }
  732.  
  733. void printListMen(User **head, int* size) {
  734.     int i;
  735.     for (i = 0; i < (*size); i++) {
  736.         printf("%s ", head[i]->id);
  737.         printf("%s ", head[i]->name);
  738.         printf("%s ", head[i]->surname);
  739.         printf("%d ", head[i]->age);
  740.         printf("%c ", head[i]->gender);
  741.         printf("%s ", head[i]->username);
  742.         printf("%s ", head[i]->password);
  743.         printf("%s ", head[i]->description);
  744.         printf("%s \n", head[i]->hobbies);
  745.     }
  746. }
  747.  
  748. void freeUser(User* userTofree) {
  749.     if (userTofree != NULL) {
  750.         free(userTofree->description);
  751.         free(userTofree->hobbies);
  752.         free(userTofree->id);
  753.         free(userTofree->name);
  754.         free(userTofree->password);
  755.         free(userTofree->surname);
  756.         free(userTofree->username);
  757.        
  758.         /// free(userTofree); MAYBE
  759.     }
  760. }
  761.  
  762. void freeMen(User** headMen, int* numberOfMen) {
  763.    
  764.     while ((*numberOfMen) != 0) {
  765.         freeUser(headMen[(*numberOfMen) - 1]);
  766.         free(headMen[(*numberOfMen) - 1]);
  767.         (*numberOfMen)--;
  768.     }
  769.     free(headMen);
  770.     //freeUser(*headMen);
  771. }
  772.  
  773.  
  774. void freeWomen(Women** head) {
  775.    
  776.     while (*head) {
  777.         // remove *head
  778.         Women *toRemove = *head;
  779.         *head = (*head)->next;
  780.        
  781.         // remove toRemove
  782.         freeUser(toRemove->userWoman);
  783.         free(toRemove->userWoman);
  784.         free(toRemove);
  785.     }
  786. }
  787.  
  788. User** readInput(User** headMen, int* numberOfMen, Women** head) {
  789.     char id[ID_LENGTH];
  790.     char name[MAX_PASSWORD], surname[MAX_PASSWORD], username[MAX_USERNAME],
  791.     password[MAX_PASSWORD], description[MAX_INFO], hobbies[MAX_HOBBIES], gender[MIN_LOGIN_INFO], age[MIN_LOGIN_INFO];
  792.     FILE *input = NULL;
  793.     char cChar = 'a', *dummy;
  794.     int r;
  795.     char current[MAX_LINE_LEN];
  796.     char line[MAX_LINE_LEN];
  797.     char genderChar;
  798.     int ageInt;
  799.     char currentChar = 'a';
  800.     int currentIdx = 0, index = 0;
  801.     int i, count = 0, flag = 0, flag1 = 0;
  802.    
  803.    
  804.    
  805.     input = fopen("input.txt", "r");
  806.     if (input == NULL) {
  807.         exit(1);
  808.     }
  809.    
  810.     while (currentChar != -1) {
  811.         while (currentChar != '\n') {
  812.             currentChar = fgetc(input);
  813.             index++;
  814.             if (currentChar == EOF) {
  815.                 return headMen;
  816.             }
  817.         }
  818.         r = fseek(input, -(index), SEEK_CUR);
  819.         fgets(line, (index), input);
  820.        
  821.         index = 0;
  822.         int n = strlen(line);
  823.         for (i = 0; i <= n; ++i) {
  824.             if (i < n && line[i] != ';' && line[i] != '\n' && line[i] != '\r') {
  825.                 current[currentIdx++] = line[i];
  826.             }
  827.             else {
  828.                 current[currentIdx++] = '\0';
  829.                 switch (count) {
  830.                     case 0:
  831.                         strcpy(id, current);
  832.                         break;
  833.                     case 1:
  834.                         strcpy(name, current);
  835.                         break;
  836.                     case 2:
  837.                         strcpy(surname, current);
  838.                         break;
  839.                     case 3:
  840.                         strcpy(age, current);
  841.                         break;
  842.                     case 4:
  843.                         strcpy(gender, current);
  844.                         break;
  845.                     case 5:
  846.                         strcpy(username, current);
  847.                         break;
  848.                     case 6:
  849.                         strcpy(password, current);
  850.                         break;
  851.                     case 7:
  852.                         strcpy(hobbies, current);
  853.                         break;
  854.                     case 8:
  855.                         strcpy(description, current);
  856.                         break;
  857.                 }
  858.                 ++count;
  859.                 currentIdx = 0;
  860.             }
  861.            
  862.         }
  863.         flag1 = 1;
  864.         flag=2;
  865.         count = 0;
  866.         genderChar = gender[0];
  867.         ageInt = strtol(age, &dummy, 10);
  868.         if (genderChar == 'M') {
  869.             //    printf("%s %s %s %d %c %s %s %s %s\n", id, name, surname, ageInt, genderChar, username, password, description, hobbies);
  870.             headMen = realocateHeadMen(headMen, numberOfMen, id, name, surname, ageInt, genderChar, username, password, description, hobbies);
  871.         }
  872.         else {
  873.             //    printf("%s %s %s %d %c %s %s %s %s\n", id, name, surname, ageInt, genderChar, username, password, description, hobbies);
  874.             push(head, newUser(id,name,surname,ageInt, genderChar,username,password,description,hobbies));
  875.         }
  876.         currentChar = fgetc(input);
  877.         //r = fseek(input, -1, SEEK_CUR);
  878.         if (currentChar == '\n'){
  879.             currentChar='a';
  880.             //r = fseek(input, 1, SEEK_CUR);
  881.         }
  882.         if (currentChar == '\r'){
  883.             r = fseek(input, 2, SEEK_CUR);
  884.         }
  885.        
  886.     }
  887.     fclose(input);
  888.     return headMen;
  889. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement