Advertisement
puma7953

Untitled

Nov 24th, 2019
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.05 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 year, month, day;
  9.     double av_grade;
  10.     struct Stud *next;
  11. } Stud;
  12.  
  13. //Добавление узла
  14. void push(Stud **head, char *first_name, char *last_name, int year, int month, int day, 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 -> year = year;
  21.     tmp -> month = month;
  22.     tmp -> day = day;
  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 write_to_file(Stud *head, FILE *target){
  64.     while (head != NULL) {
  65.         fprintf(target, "%s\r\n", head -> first_name);
  66.         fprintf(target, "%s\r\n", head -> last_name);
  67.         fprintf(target, "%d ", head -> year);
  68.         fprintf(target, "%d ", head -> month);
  69.         fprintf(target, "%d\r\n", head -> day);
  70.         fprintf(target, "%lf\r\n", head -> av_grade);
  71.         head = head -> next;
  72.     }
  73. }
  74.  
  75. //Вывод списка
  76. void printList(Stud *head) {
  77.     while (head) {
  78.         printf("First name: %s", head -> first_name);
  79.         printf("Last name: %s", head -> last_name);
  80.         printf("Date of Birth: %d %d %d\n", head-> day, head -> month, head -> year);
  81.         printf("Av_grade: %lf\n\n", head -> av_grade);
  82.         head = head -> next;
  83.     }
  84.     printf("\n");
  85. }
  86.  
  87. int main() {
  88.  
  89.     Stud *head = NULL;
  90.     Stud *prev = NULL;
  91.     char  first_name[50], last_name[50], name_file[100], buf[10];
  92.     int year, month, day;
  93.     double av_grade;
  94.  
  95.     FILE *source;
  96.  
  97.     printf("Entering an action number:\n");
  98.     printf("1. Reading base from file;\n");
  99.     printf("2. Writing a database to a file;\n");
  100.     printf("3. Display base;\n");
  101.     printf("4. Add base from keyboard;\n");
  102.     printf("5. Add database from file;\n");
  103.     printf("6. Delete information by last name\n");
  104.     printf("7. Search for students in the database\n");
  105.     printf("8. Finish work\n\n");
  106.  
  107.     while(1) {
  108.         int act;
  109.  
  110.         scanf("%d", &act);
  111.  
  112.         switch (act) {
  113.             case 1: {
  114.                 printf("Enter file name:\n");
  115.                 scanf("%s", name_file);
  116.  
  117.                 if ((source = fopen(name_file, "rw")) == NULL)
  118.                     printf("File error!");
  119.  
  120.                 while (fgets(first_name, 64, source) != NULL) {
  121.                     fgets(last_name, 64, source);
  122.                     fgets(buf, 10, source);
  123.                     year = atoi(buf);
  124.                     fgets(buf, 10, source);
  125.                     month = atoi(buf);
  126.                     fgets(buf, 10, source);
  127.                     day = atoi(buf);
  128.                     fgets(buf, 10, source);
  129.                     av_grade = atof(buf);
  130.  
  131.                     push(&head, first_name, last_name, year, month, day, av_grade);
  132.  
  133.                 }
  134.                 fclose(source);
  135.                 break;
  136.             }
  137.             case 2: {
  138.                 printf("New file name:\n");
  139.                 scanf("%s", name_file);
  140.                 FILE *target;
  141.                 target = fopen(name_file, "wb");
  142.                 write_to_file(head, target);
  143.                 fclose(target);
  144.                 break;
  145.             }
  146.  
  147.             case 3: {
  148.                 printList(head);
  149.                 break;
  150.             }
  151.             case 4: {
  152.                 printf("First name, surname:\n");
  153.                 scanf("%s %s", first_name, last_name);
  154.                 sprintf(first_name, "%s%s", first_name, "\n\0");
  155.                 sprintf(last_name, "%s%s", last_name, "\n\0");
  156.                 printf("Enter date of birth (DD MM YYYY):\n");
  157.                 scanf("%d %d %d", &day, &month, &year);
  158.                 printf("Grade point average:\n");
  159.                 scanf("%lf", &av_grade);
  160.  
  161.                 push(&head, first_name, last_name, year, month, day, av_grade);
  162.  
  163.                 break;
  164.             }
  165.             case 5: {
  166.                 printf("Base Plot File:\n");
  167.                 scanf("%s", name_file);
  168.                 source = fopen(name_file, "r");
  169.  
  170.                 while (fgets(first_name, 50, source) != NULL) {
  171.                     fgets(last_name, 50, source);
  172.                     fgets(buf, 10, source);
  173.                     year = atoi(buf);
  174.                     fgets(buf, 10, source);
  175.                     month = atoi(buf);
  176.                     fgets(buf, 10, source);
  177.                     day = atoi(buf);
  178.                     fgets(buf, 10, source);
  179.                     av_grade = atof(buf);
  180.  
  181.                     push(&head, first_name, last_name, year, month, day, av_grade);
  182.                 }
  183.                 fclose(source);
  184.                 break;
  185.             }
  186.  
  187.             case 6: {
  188.                 int n = 0;
  189.                 prev = head;
  190.                 printf("Enter last name:\n");
  191.                 scanf("%s", last_name);
  192.                 sprintf(last_name, "%s%s", last_name, "\n\0");
  193.                 while (prev != NULL) {
  194.                     if (!strcmp(last_name, prev->last_name)) {
  195.                         deleteNth(&head, n);
  196.                         break;
  197.                     }
  198.                     prev = prev->next;
  199.                     n++;
  200.                 }
  201.                 break;
  202.             }
  203.  
  204.             case 7: {
  205.                 printf("First name, surname:\n");
  206.                 scanf("%s %s", first_name, last_name);
  207.                 sprintf(first_name, "%s%s", first_name, "\n\0");
  208.                 sprintf(last_name, "%s%s", last_name, "\n\0");
  209.                 prev = head;
  210.                 while (prev != NULL) {
  211.                     if (!strcmp(first_name, prev->first_name) && !strcmp(last_name, prev->last_name)) {
  212.                         printf("Last name: %s", prev->first_name);
  213.                         printf("First name: %s", prev->last_name);
  214.                         printf("Date of Birth: %d %d %d\n", prev->day, prev->month, prev->year);
  215.                         printf("Av_grade: %lf\n\n", prev->av_grade);
  216.                     }
  217.                     prev = prev->next;
  218.                 }
  219.                 break;
  220.             }
  221.  
  222.             case 8:
  223.                 return 0;
  224.  
  225.         }
  226.     }
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement