Advertisement
GoldiGold

Untitled

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