Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <locale.h>
- #include <string.h>
- #include <stdbool.h>
- #define SIZE 128
- #define WAIT getchar();
- #define BUF_CLEAR while (getchar() != '\n');
- /*--------------------------------------------------------------------------------------*/
- //задание
- /*Реалізувати динамічну структуру, що містить інформацію:
- – прізвище, ім’я, по-батькові;
- – рік народження;
- – назва навчального закладу;
- – спеціальність.
- – середній бал навчання;
- Програма повинна забезпечувати:
- − додавання елементу;
- − виведення інформації у вигляді таблиці;
- − сортування за середнім балом та спеціальністю; +
- − пошук середнього віку людини; +
- − додавання і видалення заданих елементів;
- − обчислення найбільшого та найменшого значень середнього балу серед студентів +
- заданого навчального закладу;
- виведення всіх елементів з однаковою спеціальністю. +*/
- /*--------------------------------------------------------------------------------------*/
- // структура
- typedef struct anket {
- int ID; //для исправления ошибки с именем
- char full_name[SIZE];
- char data_of_born[SIZE];
- char place_of_study[SIZE];
- char specialty[SIZE];
- float average_score;
- struct anket *next;
- struct anket *prev;
- } data;
- char tmp; // для пузырька
- int get_average_score();
- int get_num();
- _Noreturn void ext(data *);
- /*--------------------------------------------------------------------------------------*/
- void add_student(data *);
- void print_student(data *);
- void table(data *);
- void sort(data *);
- void middle_age(data *);
- data *del_add(data *);
- void high_score(data *);
- void small_score(data *);
- void search_by_id(data *);
- int main()
- {
- setlocale(LC_ALL,"rus");
- int k;
- data *head = malloc(sizeof(data));
- head->next = NULL; //При помощи этой стрелки осуществляется доступ к методам
- //(в C -функциям) класса. Например Form1 -> Close()
- //. Здесь Form1 - переменная класса, а Close() - метод класса.
- head->prev = NULL;
- char file_name[SIZE];
- FILE *data_file = NULL;
- printf("Считать данные из файла? (y/n)\n");
- char c;
- do
- {
- c = getchar();
- } while (c != 'y' && c != 'n' && c != 'Y' && c != 'N');
- if (c == 'y' || c == 'Y')
- {
- printf("Введите имя файла:\n");
- scanf("%s", file_name);
- data_file = fopen(file_name, "r+");
- if (data_file == NULL)
- {
- printf("Не удалось открыть файл :(\n");
- ext(head);
- }
- int students;
- fscanf(data_file, "%d", &students);
- data *anket = head;
- for(int i = 0; i < students; i++)
- {
- fscanf(data_file, "%d", &anket->ID);
- fscanf(data_file, "%s", anket->full_name);
- fscanf(data_file, "%s", anket->data_of_born);
- fscanf(data_file, "%s", anket->place_of_study);
- fscanf(data_file, "%s", anket->specialty);
- fscanf(data_file, "%f", &anket->average_score);
- if (i+1 < students)
- {
- anket->next = malloc(sizeof(data));
- anket->next->prev = anket;
- anket->next->next = NULL;
- anket = anket->next;
- }
- }
- fclose(data_file);
- BUF_CLEAR
- WAIT
- }
- else
- {
- printf("Введите номер студента в списке: ");
- head->ID = get_num();
- BUF_CLEAR
- printf("Введите полное имя:\n");
- scanf("%[^\n]%*c", head->full_name);
- printf("Введите дату рождения студента:\n");
- scanf("%[^\n]%*c", head->data_of_born);
- printf("Введите учебное заведение студента:\n");
- scanf("%[^\n]%*c", head->place_of_study);
- printf("Введите специальность студента:\n");
- scanf("%[^\n]%*c", head->specialty);
- printf("Введите средний балл студента:\n");
- head->average_score = get_average_score();
- printf("\n");
- }
- while(true)
- {
- puts("1-Добавить студента");
- puts("2-Вывести информацию в виде таблицы");
- puts("3-Сортировать по среднему балу и специальности");
- puts("4-Поиск среднего возраста человека");
- puts("5-Добавление и удаление заданных элементов");
- puts("6-Вычисление наибольшего среднего бала среди студентов");
- puts("7-Вычисление наименьшего среднего бала среди студентов");
- puts("8-Поиск студентов по их номеру");
- puts("0-Выход из меню \n");
- scanf("%d",&k);
- switch (k)
- {
- case 1: add_student(head); break;
- case 2: table(head); break;
- case 3: break;
- case 4: break;
- case 5: head = del_add(head); break;
- case 6: break;
- case 7: break;
- case 8: search_by_id(head); break;
- case 0: exit(0); break;
- }
- }
- return 0;
- }
- void add_student (data *anket)
- {
- int num;
- int i = 1;
- printf("Введите номер студента в списке: \n");
- scanf("%d", &num);
- while ((anket->next != NULL) && (i < num))
- {
- anket = anket->next;
- i++;
- }
- printf("Добавление %d-го студента \n", i+1);
- if (anket->next == NULL)
- {
- anket->next = malloc(sizeof(data));
- anket->next->prev = anket;
- anket->next->next = NULL;
- printf("Повторите номер студента, мы не записали: \n");
- anket->next->ID = get_num();
- BUF_CLEAR
- printf("Введите полное имя: \n");
- scanf("%[^\n]%*c", anket->next->full_name);
- printf("Введите год рождения студента: \n");
- scanf("%[^\n]%*c", anket->next->data_of_born);
- printf("Введите название учебного заведения: \n");
- scanf("%[^\n]%*c", anket->next->place_of_study);
- printf("Введите специальность студента: \n");
- scanf("%[^\n]%*c", anket->next->specialty);
- printf("Введите средний балл студента: \n");
- anket->next->average_score = get_average_score();
- }
- else
- {
- data *next = anket->next;
- data *new_student = malloc(sizeof(data));
- new_student->prev = anket;
- new_student->next = next;
- anket->next = new_student;
- next->prev = new_student;
- printf("Повторите номер студента, мы не записали: \n");
- new_student->next->ID = get_num();
- BUF_CLEAR
- printf("Введите полное имя: \n");
- scanf("%[^\n]%*c", new_student->next->full_name);
- printf("Введите год рождения студента: \n");
- scanf("%[^\n]%*c", new_student->next->data_of_born);
- printf("Введите название учебного заведения: \n");
- scanf("%[^\n]%*c", new_student->next->place_of_study);
- printf("Введите специальность студента: \n");
- scanf("%[^\n]%*c", new_student->next->specialty);
- printf("Введите средний балл студента: \n");
- new_student->next->average_score = get_average_score();
- }
- BUF_CLEAR
- WAIT
- }
- void print_student(data *anket)
- {
- if (anket == NULL)
- return;
- printf("|---------------------------------------------------|\n");
- printf("| Номер в списке: %d\n", anket->ID);
- printf("| Полное имя: %s\n", anket->full_name);
- printf("| Дата рождения: %s\n", anket->data_of_born);
- printf("| Место обучения: %s\n", anket->place_of_study);
- printf("| Специальность: %s\n", anket->specialty);
- printf("| Средний балл: %1.2f\n", anket->average_score);
- printf("|---------------------------------------------------|\n");
- }
- void table(data *head) //для следующего эллемента
- {
- while(true)
- {
- print_student(head);
- printf("\n");
- if (head->next == NULL)
- break;
- else
- head = head->next;
- }
- }
- data *del_add(data *head)
- {
- if (head->next == NULL)
- {
- printf("Нельзя удалить единственный элемент списка\n");
- BUF_CLEAR
- WAIT
- }
- BUF_CLEAR
- printf("Введите номер студента, данные которого вы хотите удалить или добавить: \n");
- int id_to_del = get_num();
- data *anket = head;
- while(true)
- {
- if (anket->ID == id_to_del)
- {
- if (anket == head)
- {
- data *new_head = anket->next;
- new_head->prev = NULL;
- free(head);
- printf("Удалено!\n");
- BUF_CLEAR
- WAIT
- return new_head;
- }
- else if (anket->next == NULL)
- {
- anket->prev->next = NULL;
- free(anket);
- printf("Удалено!\n");
- BUF_CLEAR
- WAIT
- return head;
- }
- else
- {
- anket->prev->next = anket->next;
- anket->next->prev = anket->prev;
- free(anket);
- printf("Удалено!\n");
- BUF_CLEAR
- WAIT
- return head;
- }
- printf("Удалено!\n");
- BUF_CLEAR
- WAIT
- return head;
- }
- if (anket->next == NULL)
- break;
- else
- anket = anket->next;
- }
- printf("Студент с таким номером не найден!\n");
- BUF_CLEAR
- WAIT
- return head;
- }
- void search_by_id(data *head)
- {
- printf("Введите номер студента для поиска\n");
- int ID = get_num();
- while( true )
- {
- if (head->ID == ID)
- {
- print_student(head);
- BUF_CLEAR
- WAIT
- return;
- }
- if (head->next == NULL)
- break;
- else
- head = head->next;
- }
- printf("Студент не найден\n");
- BUF_CLEAR
- WAIT
- }
- _Noreturn void ext(data *head)
- {
- if (head->next != NULL)
- {
- data *anket = head;
- {
- data *anket = head;
- while(anket != NULL)
- anket = anket->next;
- free(anket);
- } while(anket != head);
- }
- free(head);
- exit(0);
- }
- int get_average_score()
- {
- float tmp = 0;
- while(true)
- {
- tmp = get_num();
- if ((tmp >= 5.1) || (tmp < 0))
- printf("Введён неверный средний балл!\n");
- else
- break;
- }
- return tmp;
- }
- int get_num()
- {
- char buf[SIZE];
- do
- {
- scanf("%s", buf);
- } while(!atoi(buf) && (buf[strlen(buf)-1] != '0'));
- return atoi(buf);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement