Advertisement
Guest User

Untitled

a guest
Jan 17th, 2019
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 31.50 KB | None | 0 0
  1. //
  2. // main.c
  3. // HW6
  4. //
  5. // Created by חן גולדשטיין on 31/12/2018.
  6. // Copyright © 2018 חן גולדשfטיין. All rights reserved.
  7. //
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12.  
  13. #define LINE_MAX 300 //supposed to be 295: 294 letters and one \0
  14. #define ID_LENGTH 10
  15. #define NAME_MAX 15
  16. #define LASTNAME_MAX 15
  17. #define AGE_MIN 18
  18. #define AGE_MAX 100
  19. #define MALE_GENDER 'M'
  20. #define FEMALE_GENDER 'F'
  21. #define USERNAME_MIN 3
  22. #define USERNAME_MAX 10
  23. #define PASSWORD_MIN 3
  24. #define PASSWORD_MAX 15
  25. #define DESCRIPTION_MAX 221
  26. #define HOBBIES_WITH_COMMAS 8
  27.  
  28. /*********************************************/
  29. typedef struct
  30. {
  31. char id [ID_LENGTH];
  32. char* name;
  33. char* lastName;
  34. char* username;
  35. char* password;
  36. char* description;
  37. int age;
  38. char gender;
  39. unsigned char hobbies;
  40.  
  41. }user;
  42.  
  43.  
  44. typedef struct femaleNode femaleNode;
  45.  
  46. struct femaleNode
  47. {
  48. user* femaleData;
  49. femaleNode* nextFemale;
  50. };
  51.  
  52.  
  53. typedef struct{
  54. femaleNode *head, *last;
  55. } femaleList;
  56. /*****************************************/
  57.  
  58. user* createUserFromDataBase(char *line);
  59. void freeUser(user* userPointer);
  60. void freeFemaleNode(struct femaleNode* femalePointer);
  61. femaleList* addFemale(femaleList* list, femaleNode* femaleAdd);
  62. femaleNode* newFemale(user* dataUser, femaleNode* next);
  63. user** addMale(user* dataUser, user** dataBaseMales, int* size);
  64. void createDataBase(FILE *src, femaleList* dataBaseList, user*** dataBaseMalesPointer, int* sizePointer);
  65. user** deleteMale(user** dataBaseMales, user* currentUser, int* sizeArrPointer);
  66. femaleList* deleteFemale(femaleList* dataBaseList, user* currentUser);
  67. user* loginToSystem(user* currentUser, user **dataBaseMales, femaleList *dataBaseFemales, int sizeArr);
  68. user* findUserName(char* username, user **dataBaseMales, femaleList* dataBaseFemales, int sizeArr);
  69. void mainMenu(user* currentUser, user ***dataBaseMales, femaleList *dataBaseFemales, int* sizeArrPointer);
  70. void enteringMenu(user* currentUser, user ***dataBaseMales, femaleList *dataBaseFemales, int *sizePointer);
  71. int checkIfValidUser(user* currnetUser);
  72. void outputFile(user** dataBaseMales, femaleList* dataBaseList, int* sizePointer);
  73. void freeFemaleList(femaleList* dataBaseList);
  74. void freeMaleArr(user** dataBaseMales, int size);
  75. void toString(user* user);
  76.  
  77.  
  78. unsigned char getHobbies(char* fourDigitsHobbis);
  79. int countOnes(unsigned char hob);
  80. int checkHobbies (unsigned char maleHobibbies,unsigned char femaleHobbies);
  81. int isMatchHobbies (unsigned char maleHobibbies,unsigned char femaleHobbies);
  82. void convertCharToNumbers(unsigned char hobbies, char* hobbiesPrint);
  83.  
  84. void addUserFromInput(user* newUser, user*** dataBaseMales, femaleList* dataBaseFemales, int *sizeArr);
  85. int isIdExist(char id[], user** dataBaseMales, femaleList* dataBaseFemales, int sizeArr);
  86. void printHobbies(unsigned char hobbies);
  87.  
  88.  
  89. enum hobbies{BASEBALL=1, BASKETBALL, BICYCLE, BOOKS, DRAWING, GYM, MOVIES, POETRY};
  90.  
  91. int main(int argc, const char * argv[]) {
  92.  
  93. FILE *src = fopen("/Users/chengoldi/Downloads/ex6-2/input.txt", "r");
  94. if (src == NULL)
  95. {
  96. printf("we failed to create FILE\n");
  97. exit(1);
  98. }
  99.  
  100. int size = 0;
  101. int* sizePointer = &size;
  102. //the user we use in the code
  103. user* newUser = NULL;
  104. //the list of females
  105. femaleList* dataBaseList = (femaleList*)malloc(sizeof(femaleList));
  106. if(dataBaseList == NULL)
  107. {
  108. printf("we failed to create DATA_BASE_LIST\n");
  109. exit(1);
  110. }
  111. //the array of males
  112. user** dataBaseMales = (user**)malloc(sizeof(user*));
  113. //the pointer to the array of males
  114. user*** malesPointer = &dataBaseMales;
  115. if(dataBaseMales == NULL)
  116. {
  117. printf("we failed to create DATA_BASE_MALE\n");
  118. exit(1);
  119. }
  120.  
  121. /* end of initialization */
  122.  
  123. // creating the list and the array
  124. createDataBase(src,dataBaseList, malesPointer, sizePointer);
  125. fclose(src);
  126.  
  127. //running the entering menu and the entire code
  128. enteringMenu(newUser, malesPointer, dataBaseList, sizePointer);
  129.  
  130. //finishing the program and exporting to output.txt
  131. outputFile(dataBaseMales, dataBaseList, sizePointer);
  132. freeFemaleList(dataBaseList);
  133. freeMaleArr(*malesPointer, size);
  134.  
  135. return 0;
  136. }
  137.  
  138.  
  139.  
  140. /*****************************************/
  141. user* createUserFromDataBase(char *line)
  142. {
  143. user *userDataPointer = (user*)malloc(sizeof(user));
  144. const char *delimiter = ";";
  145. char *tempBuffer;
  146. char hobbiesSaver[8];
  147. tempBuffer = strtok(line, delimiter);
  148.  
  149. //getting the id
  150. strcpy(userDataPointer->id, tempBuffer);
  151. tempBuffer = strtok(NULL, delimiter);
  152. //getting the name
  153. userDataPointer->name = (char*)malloc((strlen(tempBuffer)+1)*sizeof(char));
  154. if(userDataPointer->name == NULL)
  155. {
  156. printf("we failed to create NAME\n");
  157. exit(1);
  158. }
  159. strcpy(userDataPointer->name, tempBuffer);
  160. tempBuffer = strtok(NULL, delimiter);
  161. //getting the last name
  162. userDataPointer->lastName = (char*)malloc((strlen(tempBuffer)+1)*sizeof(char));
  163. if(userDataPointer->lastName == NULL)
  164. {
  165. printf("we failed to create LAST_NAME\n");
  166. exit(1);
  167. }
  168. strcpy(userDataPointer->lastName, tempBuffer);
  169. tempBuffer = strtok(NULL, delimiter);
  170. //getting the age
  171. userDataPointer->age = atoi(tempBuffer);
  172. tempBuffer = strtok(NULL, delimiter);
  173. //getting the gender
  174. userDataPointer->gender = *tempBuffer;
  175. tempBuffer = strtok(NULL, delimiter);
  176. //getting the username
  177. userDataPointer->username = (char*)malloc((strlen(tempBuffer)+1)*sizeof(char));
  178. if(userDataPointer->username == NULL)
  179. {
  180. printf("we failed to create USERNAME\n");
  181. exit(1);
  182. }
  183. strcpy(userDataPointer->username, tempBuffer);
  184. tempBuffer = strtok(NULL, delimiter);
  185. //getting the password
  186. userDataPointer->password = (char*)malloc((strlen(tempBuffer)+1)*sizeof(char));
  187. if(userDataPointer->password == NULL)
  188. {
  189. printf("we failed to create PASSWORD\n");
  190. exit(1);
  191. }
  192. strcpy(userDataPointer->password, tempBuffer);
  193. tempBuffer = strtok(NULL, delimiter);
  194. //getting the hobbies
  195. strcpy(hobbiesSaver, tempBuffer);
  196. tempBuffer = strtok(NULL, delimiter);
  197. //getting the hobbies char
  198. userDataPointer->hobbies = getHobbies(hobbiesSaver);
  199.  
  200. //getting the description
  201. userDataPointer->description = (char*)malloc((strlen(tempBuffer)+1)*sizeof(char));
  202. if(userDataPointer->description == NULL)
  203. {
  204. printf("we failed to create DESCRIPTION\n");
  205. exit(1);
  206. }
  207. strcpy(userDataPointer->description, tempBuffer);
  208. tempBuffer = strtok(NULL, delimiter);
  209.  
  210.  
  211. return userDataPointer;
  212.  
  213. }
  214.  
  215. /*****************************************/
  216.  
  217. void createDataBase(FILE *src, femaleList* databaseList, user*** dataBaseMalesPointer, int* sizePointer)
  218. {
  219. char linesBuffer[LINE_MAX];
  220. user* newUserPointer;
  221. femaleNode* creatingFemale; // we (dynamicly) created it inside the while
  222.  
  223. if(src == NULL)
  224. {
  225. printf("failed to open file\n");
  226. exit(1);
  227. }
  228. //we check if we reached the end of the file
  229. //and then we put a line in the linesBuffer
  230. while (!feof(src) && (fgets(linesBuffer, LINE_MAX, src) != NULL))
  231. {
  232. newUserPointer = createUserFromDataBase(linesBuffer);
  233. if(newUserPointer->gender == FEMALE_GENDER)
  234. {
  235. creatingFemale = newFemale(newUserPointer, NULL);
  236. databaseList = addFemale(databaseList, creatingFemale);
  237. }
  238. else
  239. {
  240. *dataBaseMalesPointer = addMale(newUserPointer, *dataBaseMalesPointer, sizePointer);
  241. }
  242. }
  243.  
  244. }
  245.  
  246. /*****************************************/
  247.  
  248. void freeUser(user* userPointer)
  249. {
  250. if(userPointer != NULL)
  251. {
  252. if (userPointer->name != NULL)
  253. {
  254. free(userPointer->name);
  255. }
  256. if (userPointer->lastName != NULL)
  257. {
  258. free(userPointer->lastName);
  259. }
  260. if (userPointer->username != NULL)
  261. {
  262. free(userPointer->username);
  263. }
  264. if (userPointer->password != NULL)
  265. {
  266. free(userPointer->password);
  267. }
  268. if (userPointer->description != NULL)
  269. {
  270. free(userPointer->description);
  271. }
  272. free(userPointer);
  273. }
  274. }
  275.  
  276. /*****************************************/
  277.  
  278. void freeFemaleNode(femaleNode* femalePointer)
  279. {
  280. if (femalePointer != NULL)
  281. {
  282. if(femalePointer->femaleData != NULL) // for debugging
  283. {
  284. freeUser(femalePointer->femaleData);
  285. }
  286. freeFemaleNode(femalePointer->nextFemale);
  287. free(femalePointer);
  288. }
  289. }
  290.  
  291. void freeFemaleList(femaleList* dataBaseList)
  292. {
  293. freeFemaleNode(dataBaseList->head);
  294. free(dataBaseList);
  295. }
  296.  
  297. void freeMaleArr(user** dataBaseMales, int size)
  298. {
  299. int i;
  300. if (dataBaseMales != NULL)
  301. {
  302. for(i = 0; i < size; i++)
  303. {
  304. freeUser(dataBaseMales[i]);
  305. }
  306. free(dataBaseMales);
  307. }
  308. }
  309. /*****************************************/
  310.  
  311. femaleNode* newFemale(user* dataUser, femaleNode* next)
  312. {
  313. femaleNode* tempFemale = (femaleNode*)malloc(sizeof(femaleNode));
  314. if(tempFemale == NULL)
  315. {
  316. printf("we failed to create TEMP_FEMALE_NODE\n");
  317. exit(1);
  318. }
  319. tempFemale->femaleData = dataUser;
  320. tempFemale->nextFemale = next;
  321. return tempFemale;
  322. }
  323.  
  324. /*****************************************/
  325.  
  326. femaleList* addFemale(femaleList* list, femaleNode* femaleAdd) // adding female according to the ABC
  327. {
  328. femaleNode* current = list->head;
  329. femaleNode* prev = NULL;
  330.  
  331. while(current != NULL)
  332. {
  333. //check if to put it in the head
  334. if(strcmp(femaleAdd->femaleData->lastName, current->femaleData->lastName) < 0)
  335. {
  336. //we are adding to the first spot
  337. if(prev == NULL)
  338. {
  339. femaleAdd->nextFemale = current;
  340. list->head = femaleAdd;
  341. return list;
  342. }
  343. // just a normal adding in between
  344. femaleAdd->nextFemale = current;
  345. prev->nextFemale = femaleAdd;
  346. return list;
  347. }
  348. //moving the pointers one spot further
  349. prev = current;
  350. current = current->nextFemale;
  351. }
  352. //the list is empty
  353. if(prev == NULL)
  354. {
  355. list->head = femaleAdd;
  356. list->last = femaleAdd;
  357. return list;
  358. }
  359. //currnet reached null so previous is in last and we add the new female to the last spot
  360. prev->nextFemale = femaleAdd;
  361. return list;
  362. }
  363. /*****************************************/
  364.  
  365. user** addMale(user* dataUser, user** dataBaseMales, int* size)
  366. {
  367. dataBaseMales = (user**)realloc(dataBaseMales, (*size + 1)*sizeof(user*));
  368. if(dataBaseMales == NULL)
  369. {
  370. printf("we failed to create ADD_MALE_DATA_BASE\n");
  371. exit(1);
  372. }
  373. dataBaseMales[*size] = dataUser;
  374. *size = *size + 1;
  375. return dataBaseMales;
  376. }
  377.  
  378. /*****************************************/
  379.  
  380.  
  381. /*after login functions*/
  382.  
  383. void findMatch (user** dataBaseMales, user* user, femaleList* dataBaseFemales, int sizeArr)
  384. {
  385. int minAge, maxAge, i, countMatch = 0;
  386. femaleNode *iterator = dataBaseFemales->head;
  387. printf("Please choose ages range:\n");
  388. scanf("%d %d", &minAge, &maxAge);
  389. switch (user->gender) {
  390. case MALE_GENDER:
  391. {
  392. //finding females
  393. while (iterator != NULL)
  394. {
  395.  
  396. if (iterator->femaleData->age >= minAge && iterator->femaleData->age <= maxAge)
  397. {
  398. if(isMatchHobbies(user->hobbies, iterator->femaleData->hobbies) == 1)
  399. {
  400. printf("Name: %s %s Age: %d Hobbies: ", iterator->femaleData->name, iterator->femaleData->lastName, iterator->femaleData->age);
  401. printHobbies(iterator->femaleData->hobbies);
  402. printf("Description: %s\n", iterator->femaleData->description);
  403. countMatch++;
  404. }
  405. }
  406. iterator = iterator->nextFemale;
  407. }
  408. break;
  409. }
  410. case FEMALE_GENDER:
  411. {
  412. //finding males
  413. for(i = 0; i < sizeArr; i++)
  414. {
  415. if (dataBaseMales[i]->age >= minAge && dataBaseMales[i]->age <= maxAge)
  416. {
  417. if(isMatchHobbies(dataBaseMales[i]->hobbies, user->hobbies) == 1)
  418. {
  419. printf("Name: %s %s Age: %d Hobbies: ", dataBaseMales[i]->name, dataBaseMales[i]->lastName, dataBaseMales[i]->age);
  420. printHobbies(dataBaseMales[i]->hobbies);
  421. printf("Description: %s\n", dataBaseMales[i]->description);
  422. countMatch++;
  423. }
  424. }
  425. }
  426. break;
  427. }
  428. default:
  429. break;
  430. }
  431.  
  432. }
  433. /** finding if there is a match **/
  434.  
  435. unsigned char getHobbies(char* fourDigitsHobbis)
  436. {
  437. const char *delimeter = ",";
  438. char* tempCutChar;
  439. unsigned char tempChar = 0;
  440. int tempHob;
  441. tempCutChar = strtok(fourDigitsHobbis, delimeter);
  442. while (tempCutChar != NULL)
  443. {
  444. tempHob = atoi(tempCutChar);
  445. tempChar = (tempChar^(1<<(tempHob - 1)));
  446. tempCutChar = strtok(NULL, delimeter);
  447. }
  448. return tempChar;
  449. }
  450.  
  451. int countOnes(unsigned char hob)
  452. {
  453. int i, counter = 0;;
  454. for(i = 0; i < 8; i++)
  455. {
  456. if((hob & 1) == 1 /*|| hob % 2 == -1, because we make it unsigned then it is not negative*/)
  457. counter++;
  458. hob >>= 1;
  459. }
  460. return counter;
  461. }
  462.  
  463. int isMatchHobbies (unsigned char maleHobibbies,unsigned char femaleHobbies)
  464. {
  465. int matchCounter = 0;
  466. unsigned char temp = maleHobibbies&femaleHobbies;
  467. matchCounter = countOnes(temp);
  468.  
  469. if (matchCounter >= 2)
  470. {
  471. return 1;
  472. }
  473.  
  474. return 0;
  475. }
  476.  
  477. unsigned char getHobbiesFromNewUser(char* fourDigitsHobbis)
  478. {
  479. int i;
  480. // const char *delimeter = " ";
  481. char* tempCutChar;
  482. unsigned char tempChar = 0;
  483. int tempHob;
  484. // tempCutChar = strtok(fourDigitsHobbis, delimeter);
  485. // while (tempCutChar != NULL)
  486. for (i = 0; i < 8; i+=2)
  487. {
  488. tempCutChar = &fourDigitsHobbis[i];
  489. tempHob = atoi(tempCutChar);
  490. tempChar = (tempChar^(1<<(tempHob - 1)));
  491. // tempCutChar = strtok(NULL, delimeter);
  492. }
  493. return tempChar;
  494. }
  495.  
  496. /*****************************/
  497.  
  498. void addUserFromInput(user* newUser, user*** dataBaseMales, femaleList* dataBaseFemales, int* sizePointer)
  499. {
  500. // int i;
  501. char hobbiesSaver[8];
  502. char spaceDummy;
  503. char tempBuffer[DESCRIPTION_MAX];
  504. printf("Please enter your ID:\n");
  505. scanf("%s", tempBuffer);
  506. scanf("%c", &spaceDummy);
  507. if (isIdExist(tempBuffer, *dataBaseMales, dataBaseFemales, *sizePointer) == 1)
  508. {
  509. printf("Error: User already exists\n");
  510. return;
  511. }
  512. strcpy(newUser->id, tempBuffer);
  513. printf("Please enter your first name:\n");
  514. scanf("%s", tempBuffer);
  515. scanf("%c", &spaceDummy);
  516. newUser->name = (char*)malloc((strlen(tempBuffer)+1)*sizeof(char));
  517. if(newUser->name == NULL)
  518. {
  519. printf("we failed to create");
  520. exit(1);
  521. }
  522. strcpy(newUser->name, tempBuffer);
  523.  
  524. printf("Please enter your last name:\n");
  525. scanf("%s", tempBuffer);
  526. scanf("%c", &spaceDummy);
  527. newUser->lastName = (char*)malloc((strlen(tempBuffer)+1)*sizeof(char));
  528. if(newUser->lastName == NULL)
  529. {
  530. printf("we failed to create\n");
  531. exit(1);
  532. }
  533. strcpy(newUser->lastName, tempBuffer);
  534.  
  535. printf("Please enter your age (18 to 100):\n");
  536. scanf("%d", &(newUser->age));
  537. scanf("%c", &spaceDummy);
  538. if(newUser->age < AGE_MIN || newUser->age > AGE_MAX)
  539. {
  540. return;
  541. }
  542. printf("Please enter your gender (F-female, M-male):\n");
  543. scanf("%c", &(newUser->gender));
  544. scanf("%c", &spaceDummy);
  545. printf("Choose a username (3-10 characters):\n");
  546. scanf("%s", tempBuffer);
  547. scanf("%c", &spaceDummy);
  548. newUser->username = (char*)malloc((strlen(tempBuffer)+1)*sizeof(char));
  549. if(newUser->username == NULL)
  550. {
  551. printf("we failed to create\n");
  552. exit(1);
  553. }
  554. strcpy(newUser->username, tempBuffer);
  555. if(tempBuffer[0] < 'A' || (tempBuffer[0] > 'Z' && tempBuffer[0] < 'a') || tempBuffer[0] > 'z' || strlen(newUser->username) < USERNAME_MIN)
  556. {
  557. return;
  558. }
  559. printf("please choose 4 hobbies: Baseball=1, Basketball=2, Bicycle=3, Books=4, Drawing=5, Gym=6, Movies=7, Poetry=8\n");
  560. gets(hobbiesSaver);
  561.  
  562.  
  563. newUser->hobbies = getHobbiesFromNewUser(hobbiesSaver);
  564. printf("Choose a password (attention-minimum 3 characters):\n");
  565. scanf("%s", tempBuffer);
  566. scanf("%c", &spaceDummy);
  567. newUser->password = (char*)malloc((strlen(tempBuffer)+1)*sizeof(char));
  568. if(newUser->password == NULL)
  569. {
  570. printf("we failed to create\n");
  571. exit(1);
  572. }
  573. strcpy(newUser->password, tempBuffer);
  574. if(strlen(newUser->password) < PASSWORD_MIN)
  575. {
  576. return;
  577. }
  578. printf("Some words about yourself:\n");
  579. gets(tempBuffer);
  580. newUser->description = (char*)malloc((strlen(tempBuffer)+1)*sizeof(char));
  581. if(newUser->description == NULL)
  582. {
  583. printf("we failed to create\n");
  584. exit(1);
  585. }
  586. strcpy(newUser->description, tempBuffer);
  587. if (newUser->gender == MALE_GENDER)
  588. {
  589. *dataBaseMales = addMale(newUser, *dataBaseMales, sizePointer);
  590. }
  591. else
  592. {
  593. femaleNode* newFemale = (femaleNode*)malloc(sizeof(femaleNode));
  594. newFemale->femaleData = newUser;
  595. newFemale->nextFemale = NULL;
  596. addFemale(dataBaseFemales, newFemale);
  597. }
  598. printf("Hi %s, lets find love!\n", newUser->name);
  599.  
  600. }
  601.  
  602. int isIdExist(char id[], user** dataBaseMales, femaleList* dataBaseFemales, int sizeArr)
  603. {
  604. femaleNode* iterator = dataBaseFemales->head;
  605. int i;
  606. while (iterator != NULL)
  607. {
  608. if(strcmp(id, iterator->femaleData->id) == 0)
  609. {
  610. return 1;
  611. }
  612. iterator = iterator->nextFemale;
  613. }
  614.  
  615. for(i = 0; i < sizeArr; i++)
  616. {
  617. if(strcmp(id, dataBaseMales[i]->id) == 0)
  618. {
  619. return 1;
  620. }
  621. }
  622. return 0;
  623. }
  624.  
  625.  
  626. void printHobbies(unsigned char hobbies)
  627. {
  628. const char* hobbiesNames[] = {"Baseball", "Basketball", "Bicycle", "Books", "Drawing", "Gym", "Movies", "Poetry"};
  629. int i, countAmount = 0;
  630. for (i = 0; i < 8; i++)
  631. {
  632. if((hobbies & 1) == 1)
  633. {
  634. if(countAmount < 3)
  635. printf("%s, ", hobbiesNames[i]);
  636. else
  637. printf("%s ", hobbiesNames[i]);
  638. countAmount++;
  639. }
  640.  
  641. hobbies >>= 1;
  642. }
  643. }
  644.  
  645.  
  646. void mainMenu(user* currentUser, user*** dataBaseMales, femaleList *dataBaseFemales, int* sizeArrPointer)
  647. {
  648. int choice;
  649. do
  650. {
  651. printf("Please choose an option:\n");
  652. printf("1. Find a match\n");
  653. printf("2. I found love, DELETE me\n");
  654. printf("3. Log out\n");
  655. scanf("%d", &choice);
  656. switch (choice)
  657. {
  658. case 1:
  659. findMatch(*dataBaseMales, currentUser, dataBaseFemales, *sizeArrPointer);
  660. break;
  661. case 2:
  662. if (currentUser->gender == MALE_GENDER)
  663. {
  664. *dataBaseMales = deleteMale(*dataBaseMales, currentUser, sizeArrPointer);
  665. }
  666. else
  667. {
  668. dataBaseFemales = deleteFemale(dataBaseFemales, currentUser);
  669. }
  670. return;
  671. case 3:
  672. return;
  673. break;
  674. default:
  675. printf("Bad choice, please try again\n");
  676. return;
  677. break;
  678. }
  679. }while(choice != 3);
  680. }
  681.  
  682. user** deleteMale(user** dataBaseMales, user* currentUser, int* sizeArrPointer)
  683. {
  684. int i, j;
  685. for (i = 0; i < *sizeArrPointer; i++)
  686. {
  687. if(strcmp(currentUser->id, dataBaseMales[i]->id) == 0)
  688. {
  689. for (j = i; j < *sizeArrPointer; j++)
  690. {
  691. dataBaseMales[j] = dataBaseMales[j+1];
  692. }
  693. freeUser(currentUser);
  694. //free(currentUser);
  695. dataBaseMales = (user**)realloc(dataBaseMales, (*sizeArrPointer - 1)*sizeof(user*));
  696. if (dataBaseMales == NULL)
  697. {
  698. printf("failed creating DATA_BASE_MALE");
  699. exit(1);
  700. }
  701. *sizeArrPointer = *sizeArrPointer - 1;
  702. }
  703. }
  704. return dataBaseMales;
  705. }
  706.  
  707. femaleList* deleteFemale(femaleList* dataBaseList, user* currentUser)
  708. //might be a memory leak because of the female pointer not getting deleting.
  709. {
  710. femaleNode* iterator = dataBaseList->head;
  711. femaleNode* previous = NULL;
  712. while(iterator != NULL &&(strcmp(currentUser->id, iterator->femaleData->id) != 0))
  713. {
  714. previous = iterator;
  715. iterator = iterator->nextFemale;
  716. }
  717. if(strcmp(currentUser->id, iterator->femaleData->id) == 0)
  718. {
  719. // deleting the first Node
  720. if (previous == NULL)
  721. {
  722. dataBaseList->head = iterator->nextFemale;
  723. }
  724. else
  725. {
  726. previous->nextFemale = iterator->nextFemale;
  727. }
  728. iterator->nextFemale = NULL;
  729. freeFemaleNode(previous);
  730.  
  731. //if we delete the last one
  732. if (iterator == dataBaseList->last)
  733. {
  734. dataBaseList->last = previous;
  735. }
  736. return dataBaseList;
  737. }
  738. return dataBaseList;
  739. }
  740.  
  741. //we get a null currentUser and if after the function it is still null then we run it again
  742. void enteringMenu(user* currentUser, user*** dataBaseMales, femaleList* dataBaseFemales, int *sizePointer)
  743. {
  744. int choice;
  745. do
  746. {
  747. printf("Welcome! please choose an option\n");
  748. printf("1 - Log in\n");
  749. printf("2 - New member\n");
  750. printf("3 - Exit\n");
  751. scanf("%d", &choice);
  752. switch (choice)
  753. {
  754. case 1:
  755. currentUser = loginToSystem(currentUser, *dataBaseMales, dataBaseFemales, *sizePointer);
  756. if (currentUser == NULL)
  757. {
  758. freeUser(currentUser);
  759. break;
  760. }
  761. mainMenu(currentUser, dataBaseMales, dataBaseFemales, sizePointer);
  762. break;
  763. case 2:
  764. if (currentUser == NULL)
  765. {
  766. currentUser = (user*)malloc(sizeof(user));
  767. }
  768. addUserFromInput(currentUser, dataBaseMales, dataBaseFemales, sizePointer);
  769. if (currentUser == NULL || checkIfValidUser(currentUser) == 0)
  770. {
  771. freeUser(currentUser);
  772. break;
  773. }
  774. mainMenu(currentUser, dataBaseMales, dataBaseFemales, sizePointer);
  775. break;
  776. case 3:
  777. return;
  778. break;
  779. default:
  780. printf("Bad choice, please try again\n");
  781. break;
  782. }
  783. }while (choice != 3);
  784. }
  785.  
  786. user* loginToSystem(user* currentUser, user **dataBaseMales, femaleList *dataBaseFemales, int sizeArr)
  787. {
  788. //user* loginUser;
  789. char username[USERNAME_MAX];
  790. char password[PASSWORD_MAX];
  791. printf("Please enter your username:\n");
  792. scanf("%s", username);
  793. currentUser = findUserName(username, dataBaseMales, dataBaseFemales, sizeArr);
  794. if (currentUser == NULL)
  795. {
  796. printf("User do not exist in the system, please try again\n");
  797. printf("Please enter your username:\n");
  798. scanf("%s", username);
  799. freeUser(currentUser);
  800. free(currentUser);
  801. currentUser = findUserName(username, dataBaseMales, dataBaseFemales, sizeArr);
  802. if (currentUser == NULL)
  803. {
  804. freeUser(currentUser);
  805. free(currentUser);
  806. return NULL;
  807. }
  808. else
  809. {
  810. printf("Please enter your password:\n");
  811. scanf("%s", password);
  812. if (strcmp(currentUser->password, password) != 0)
  813. {
  814. freeUser(currentUser);
  815. free(currentUser);
  816. printf("Wrong password\n");
  817. return NULL;
  818. }
  819. else
  820. {
  821. printf("Hello %s!\n", currentUser->name);
  822. return currentUser;
  823. }
  824. }
  825. }
  826. printf("Please enter your password:\n");
  827. scanf("%s", password);
  828. if (strcmp(currentUser->password, password) != 0)
  829. {
  830. printf("Wrong password\n");
  831. return NULL;
  832. }
  833. else
  834. {
  835. //toString(currentUser);
  836. printf("Hello %s!\n", currentUser->name);
  837. return currentUser;
  838. }
  839. }
  840.  
  841. user* findUserName(char* username, user** dataBaseMales, femaleList* dataBaseFemales, int sizeArr)
  842. {
  843. int i;
  844. for (i = 0; i < sizeArr; i++)
  845. {
  846. if(strcmp(username, dataBaseMales[i]->username) == 0)
  847. return dataBaseMales[i];
  848. }
  849. femaleNode* iterator = dataBaseFemales->head;
  850. while (iterator != NULL)
  851. {
  852. if (strcmp(username, iterator->femaleData->username) == 0)
  853. {
  854. return iterator->femaleData;
  855. }
  856. iterator = iterator->nextFemale;
  857. }
  858. //freeFemaleNode(iterator);
  859. //free(iterator);
  860. return NULL;
  861. }
  862.  
  863. int checkIfValidUser(user* currnetUser)
  864. {
  865. //we already check the id
  866. if (currnetUser->name == NULL)
  867. {
  868. return 0;
  869. }
  870. if (currnetUser->lastName == NULL)
  871. {
  872. return 0;
  873. }
  874. if (currnetUser->username == NULL)
  875. {
  876. return 0;
  877. }
  878. if (currnetUser->password == NULL)
  879. {
  880. return 0;
  881. }
  882. if (currnetUser->description == NULL)
  883. {
  884. return 0;
  885. }
  886. return 1;
  887. }
  888.  
  889.  
  890. void outputFile(user** dataBaseMales, femaleList* dataBaseList, int* sizePointer)
  891. {
  892. // variables settings
  893. FILE* file; // the file
  894. int i, counter=0;
  895. char* hobbiesPrint;
  896. char* hobbiesPrint2;
  897. char* infoPointer;
  898. femaleNode* iterator = dataBaseList->head;
  899. infoPointer = (char*)malloc(LINE_MAX * sizeof(char));
  900. // if malloc was not successful
  901. if (infoPointer == NULL)
  902. {
  903. printf("we failed to create INFO_POINTER\n");
  904. exit(1);
  905. }
  906. // open the file output to write
  907. file = fopen("/Users/chengoldi/Downloads/ex6-2/output.txt", "w");
  908. if (file == NULL)
  909. {
  910. printf("we failed to create OUTPUT_FILE_OPEN\n");
  911. exit(1);
  912. }
  913. // first puts the dataBaseMales[i]
  914. for (i = 0; i < *sizePointer; i++)
  915. {
  916. hobbiesPrint = (char*)malloc(HOBBIES_WITH_COMMAS*sizeof(char)+1);
  917. // adds id to infoPointer
  918. strcpy(infoPointer, dataBaseMales[i]->id);
  919. strcat(infoPointer, ";");
  920. // adds firstname to infoPointer
  921. strcat(infoPointer, dataBaseMales[i]->name);
  922. strcat(infoPointer, ";");
  923. // adds lastname to infoPointer
  924. strcat(infoPointer, dataBaseMales[i]->lastName);
  925. strcat(infoPointer, ";");
  926. fputs(infoPointer, file);
  927. // adds age
  928. fprintf(file, "%d;", dataBaseMales[i]->age);
  929. // adds gender
  930. fprintf(file, "%c", dataBaseMales[i]->gender);
  931. strcpy(infoPointer, ";");
  932. // adds username
  933. strcat(infoPointer, dataBaseMales[i]->username);
  934. strcat(infoPointer, ";");
  935. counter = 0;
  936. // puts password
  937. strcat(infoPointer, dataBaseMales[i]->password);
  938. strcat(infoPointer, ";");
  939.  
  940. // adds hobbies:
  941. convertCharToNumbers(dataBaseMales[i]->hobbies, hobbiesPrint);
  942.  
  943. // strcpy(hobbiesPrint, convertCharToNumbers(dataBaseMales[i]->hobbies, hobbiesPrint));
  944. strcat(infoPointer, hobbiesPrint);
  945.  
  946. // puts description
  947. strcat(infoPointer, dataBaseMales[i]->description);
  948. // hobbiesPrint = "";
  949. // go down line
  950. // strcat(infoPointer, "\r");
  951. // puts in file
  952. free(hobbiesPrint);
  953. fputs(infoPointer, file);
  954. } //end of for
  955.  
  956. iterator = dataBaseList->head;
  957. // goes for all women
  958. while (iterator != NULL)
  959. {
  960. hobbiesPrint2 = (char*)malloc(HOBBIES_WITH_COMMAS*sizeof(char)+1);
  961. // puts id
  962. // strcpy(infoPointer, iterator->femaleData->id);
  963. // strcat(infoPointer, ";");
  964. fprintf(file, "%s;", iterator->femaleData->id);
  965. // puts first name
  966. strcpy(infoPointer, iterator->femaleData->name);
  967. strcat(infoPointer, ";");
  968. //gets lastname
  969. strcat(infoPointer, iterator->femaleData->lastName);
  970. strcat(infoPointer, ";");
  971. fputs(infoPointer, file);
  972. // puts age
  973. fprintf(file, "%d;", iterator->femaleData->age);
  974. // puts gender
  975. fprintf(file, "%c", iterator->femaleData->gender);
  976. strcpy(infoPointer, ";");
  977. // puts username
  978. strcat(infoPointer, iterator->femaleData->username);
  979. strcat(infoPointer, ";");
  980. counter = 0;
  981. // hobbiesPrint = "";
  982. // puts password
  983. strcat(infoPointer, iterator->femaleData->password);
  984. strcat(infoPointer, ";");
  985. //get hobbies
  986. convertCharToNumbers(iterator->femaleData->hobbies, hobbiesPrint2);
  987. strcat(infoPointer, hobbiesPrint2);
  988. // puts description
  989. strcat(infoPointer, iterator->femaleData->description);
  990. // go down line
  991. // strcat(infoPointer, "\r");
  992. // puts in file
  993. free(hobbiesPrint2);
  994. fputs(infoPointer, file);
  995. // new woman
  996. iterator = iterator->nextFemale;
  997.  
  998. } // end of while
  999. // free the infoPointer
  1000. free(infoPointer);
  1001. // close the file
  1002. fclose(file);
  1003. }
  1004.  
  1005. void convertCharToNumbers(unsigned char hobbies, char* hobbiesPrint)
  1006. {
  1007. // const char* hobbiesNames[] = {"BASEBALL", "BASKETBALL", "BICYCLE", "BOOKS", "DRAWING", "GYM", "MOVIES", "POETRY"};
  1008. char* hobbiesArr[] = {"1", "2", "3", "4", "5", "6", "7", "8"};
  1009. //char hobbiesPrint[8];
  1010. //char* tempChar =
  1011. int i, countHob = 4;
  1012. for (i = 0; i < 8 && countHob > 0; i++)
  1013. {
  1014. if((hobbies & 1) == 1)
  1015. {
  1016. if(countHob == 4)
  1017. {
  1018. strcpy(hobbiesPrint, hobbiesArr[i]);
  1019. }
  1020. else
  1021. {
  1022. strcat(hobbiesPrint, hobbiesArr[i]);
  1023. }
  1024. countHob--;
  1025. if (countHob != 0)
  1026. {
  1027. strcat(hobbiesPrint, ",");
  1028. }
  1029. }
  1030. hobbies >>= 1;
  1031. }
  1032. strcat(hobbiesPrint, ";");
  1033. strcat(hobbiesPrint, "\0");
  1034. }
  1035.  
  1036. void toString(user* user)
  1037. {
  1038. if(user != NULL)
  1039. {
  1040. // printf("the user is not null and we are dumb as hell\n");
  1041. printf("%s, %s, %s, %d, %c, ", user->id, user->name, user->lastName, user->age, user->gender);
  1042. printf("%s, %s, %c, %s \n", user->username, user->password, user->hobbies, user->description);
  1043. }
  1044. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement