puma7953

Untitled

Nov 30th, 2019
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.90 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. //Создание узла
  6. typedef struct Stud {
  7.     char *first_name, *last_name;
  8.     int day, month, year;
  9.     double av_grade;
  10.     struct Stud *next;
  11. } Stud;
  12.  
  13. //Добавление узла
  14. void push(Stud **head, char *first_name, char *last_name, int day, int month, int year, double av_grade) {
  15.     Stud *tmp = (Stud*) malloc(sizeof(Stud));
  16.     tmp -> first_name = (char*) malloc(strlen(first_name));
  17.     strcpy(tmp -> first_name, first_name);
  18.     tmp -> last_name = (char*) malloc(strlen(last_name));
  19.     strcpy(tmp -> last_name, last_name);
  20.     tmp -> day = day;
  21.     tmp -> month = month;
  22.     tmp -> year = year;
  23.     tmp -> av_grade = av_grade;
  24.     tmp -> next = *head;
  25.     *head = tmp;
  26. }
  27.  
  28. //УДаление узла head
  29. void pop(Stud **head) {
  30.     Stud* prev = NULL;
  31.     if (head == NULL){
  32.         printf("Node Error\n");
  33.         exit(1);
  34.     }
  35.     prev = *head;
  36.     *head = (*head) -> next;
  37.     free(prev);
  38. }
  39.  
  40. //Указатель на э-т списка
  41. Stud* getNth(Stud* head, int n) {
  42.     int counter = 0;
  43.     while (counter < n && head) {
  44.         head = head -> next;
  45.         counter++;
  46.     }
  47.     return head;
  48. }
  49.  
  50. //УДаление э-та
  51. void deleteNth(Stud **head, int n) {
  52.     if (n == 0)
  53.         return pop(head);
  54.     else {
  55.         Stud *prev = getNth(*head, n - 1);
  56.         Stud *elm = prev -> next;
  57.         prev -> next = elm -> next;
  58.         free(elm);
  59.     }
  60. }
  61.  
  62. //УДаление списка
  63. void deleteList(Stud **head) {
  64.     Stud* prev = NULL;
  65.     while ((*head)->next) {
  66.         prev = (*head);
  67.         (*head) = (*head)->next;
  68.         free(prev);
  69.     }
  70.     prev = (*head);
  71.     (*head) = (*head)->next;
  72.     free(prev);
  73. }
  74.  
  75. //Запись в файл
  76. void write_to_file(Stud *head, FILE *target) {
  77.     int flag = 0;
  78.     while (head != NULL) {
  79.         if (flag == 0) {
  80.             fprintf(target, "%s", head->first_name);
  81.             flag = 1;
  82.         }
  83.         else
  84.             fprintf(target, "\n%s", head -> first_name);
  85.         fprintf(target, "%s", head -> last_name);
  86.         fprintf(target, "%d\n", head -> day);
  87.         fprintf(target, "%d\n", head -> month);
  88.         fprintf(target, "%d\n", head -> year);
  89.         fprintf(target, "%lf", head -> av_grade);
  90.         head = head -> next;
  91.     }
  92. }
  93.  
  94. //Вывод списка
  95. void printList(Stud *head) {
  96.     while (head) {
  97.         printf("First name: %s", head -> first_name);
  98.         printf("Last name: %s", head -> last_name);
  99.         printf("Date of Birth: %d %d %d\n", head -> day, head -> month, head -> year);
  100.         printf("Av_grade: %lf\n\n", head -> av_grade);
  101.         head = head -> next;
  102.     }
  103.     printf("\n");
  104. }
  105.  
  106. int main() {
  107.  
  108.     Stud *head = NULL;
  109.     Stud *prev = NULL;
  110.     char  first_name[50], last_name[50], name_file[100], buf[10];
  111.     int year, month, day, flag = 0, flag_list = 0;
  112.     double av_grade;
  113.  
  114.     FILE *source;
  115.  
  116.     printf("Entering an action number:\n");
  117.     printf("1. Reading base from file;\n");
  118.     printf("2. Writing a database to a file;\n");
  119.     printf("3. Display base;\n");
  120.     printf("4. Add base from keyboard;\n");
  121.     printf("5. Add database from file;\n");
  122.     printf("6. Delete information by last name\n");
  123.     printf("7. Search for students in the database\n");
  124.     printf("8. Finish work\n\n");
  125.  
  126.     while(1) {
  127.         int act;
  128.  
  129.         scanf("%d", &act);
  130.  
  131.         switch (act) {
  132.             case 1: {
  133.                 if (flag_list == 1) {
  134.                     deleteList(&head);
  135.                 }
  136.                 else
  137.                     flag_list = 1;
  138.                 printf("Enter file name:\n");
  139.                 scanf("%s", name_file);
  140.  
  141.                 if ((source = fopen(name_file, "r")) == NULL)
  142.                     printf("File error!");
  143.  
  144.                 while (fgets(first_name, 64, source) != NULL) {
  145.                     fgets(last_name, 64, source);
  146.                     fgets(buf, 10, source);
  147.                     day = atoi(buf);
  148.                     fgets(buf, 10, source);
  149.                     month = atoi(buf);
  150.                     fgets(buf, 10, source);
  151.                     year = atoi(buf);
  152.                     fgets(buf, 10, source);
  153.                     av_grade = atof(buf);
  154.  
  155.                     push(&head, first_name, last_name, day, month, year, av_grade);
  156.  
  157.                 }
  158.                 fclose(source);
  159.                 break;
  160.             }
  161.             case 2: {
  162.                 printf("New file name:\n");
  163.                 scanf("%s", name_file);
  164.                 FILE *target;
  165.                 target = fopen(name_file, "w");
  166.                 write_to_file(head, target);
  167.                 fclose(target);
  168.                 break;
  169.             }
  170.  
  171.             case 3: {
  172.                 printList(head);
  173.                 break;
  174.             }
  175.             case 4: {
  176.                 printf("First name, surname:\n");
  177.                 scanf("%s %s", first_name, last_name);
  178.                 sprintf(first_name, "%s%s", first_name, "\n\0");
  179.                 sprintf(last_name, "%s%s", last_name, "\n\0");
  180.                 printf("Enter date of birth (DD MM YYYY):\n");
  181.                 scanf("%d %d %d", &day, &month, &year);
  182.                 printf("Grade point average:\n");
  183.                 scanf("%lf", &av_grade);
  184.  
  185.                 push(&head, first_name, last_name, year, month, day, av_grade);
  186.  
  187.                 break;
  188.             }
  189.             case 5: {
  190.                 printf("Base Plot File:\n");
  191.                 scanf("%s", name_file);
  192.                 source = fopen(name_file, "r");
  193.  
  194.                 while (fgets(first_name, 50, source) != NULL) {
  195.                     fgets(last_name, 50, source);
  196.                     fgets(buf, 10, source);
  197.                     year = atoi(buf);
  198.                     fgets(buf, 10, source);
  199.                     month = atoi(buf);
  200.                     fgets(buf, 10, source);
  201.                     day = atoi(buf);
  202.                     fgets(buf, 10, source);
  203.                     av_grade = atof(buf);
  204.  
  205.                     push(&head, first_name, last_name, year, month, day, av_grade);
  206.                 }
  207.                 fclose(source);
  208.                 break;
  209.             }
  210.  
  211.             case 6: {
  212.                 int n = 0;
  213.                 prev = head;
  214.                 printf("Enter last name:\n");
  215.                 scanf("%s", last_name);
  216.                 sprintf(last_name, "%s%s", last_name, "\n\0");
  217.                 while (prev != NULL) {
  218.                     if (!strcmp(last_name, prev -> last_name)) {
  219.                         deleteNth(&head, n);
  220.                         prev = head;
  221.                         n = 0;
  222.                         flag = 1;
  223.                     }
  224.                     if (flag == 0) {
  225.                         prev = prev -> next;
  226.                         n++;
  227.                     }
  228.                     else
  229.                         flag = 0;
  230.                 }
  231.                 break;
  232.             }
  233.  
  234.             case 7: {
  235.                 printf("First name:\n");
  236.                 scanf("%s", first_name);
  237.                 printf("Surname\n");
  238.                 scanf("%s", last_name);
  239.                 sprintf(first_name, "%s%s", first_name, "\n\0");
  240.                 sprintf(last_name, "%s%s", last_name, "\n\0");
  241.                 prev = head;
  242.                 while (prev != NULL) {
  243.                     if (!strcmp(first_name, prev -> first_name) && !strcmp(last_name, prev -> last_name)) {
  244.                         printf("Last name: %s", prev -> first_name);
  245.                         printf("First name: %s", prev -> last_name);
  246.                         printf("Date of Birth: %d %d %d\n", prev -> day, prev -> month, prev -> year);
  247.                         printf("Av_grade: %lf\n\n", prev -> av_grade);
  248.                     }
  249.                     prev = prev->next;
  250.                 }
  251.                 break;
  252.             }
  253.  
  254.             case 8:
  255.                 return 0;
  256.  
  257.         }
  258.     }
  259. }
Advertisement
Add Comment
Please, Sign In to add comment