Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <malloc.h>
- #include <iostream>
- #include <windows.h>
- #define L 81
- struct Student{
- struct{
- char name[L];
- char surname[L];
- char patronymic[L];
- } fullName;
- char group[L];
- struct{
- int b[5];
- double average;
- } marks;
- Student *prev;
- Student *next;
- };
- float calculateAverage(int marks[]){
- int sum = 0;
- for (int i = 0; i < 5; i++){
- sum += marks[i];
- }
- return float(sum) / 5;
- }
- bool checkIsNotDigit(char s[]){
- char *p;
- for (p = s; *p && !(*p >= '0' &&*p <= '9'); p++);
- if (*p)
- return false;
- return true;
- }
- //здесь надо дописать isdigit и запустить проект в КуТи, иначе можно словить вылет и сдохнуть
- bool checkMark(int m){
- return (m >= 0 && m <= 10);
- }
- void inputInfo(Student *uk, FILE *f){
- int a = 0;
- bool check;
- if (!fscanf(f, "%s", uk->fullName.surname) || !checkIsNotDigit(uk->fullName.surname)
- || !fscanf(f, "%s", uk->fullName.name) || !checkIsNotDigit(uk->fullName.name)
- || !fscanf(f, "%s", uk->fullName.patronymic) || !checkIsNotDigit(uk->fullName.patronymic)
- ) {
- printf("Error in input.\n");
- exit(1);
- }
- if (!fscanf(f, "%s", uk->group)){
- printf("Error in input.\n");
- exit(1);
- }
- for (int i = 0; i < 5; i++)
- if (!fscanf(f, "%d", &uk->marks.b[i]) || !checkMark(uk->marks.b[i])){
- printf("Error in input.\n");
- exit(1);
- };
- uk->marks.average = calculateAverage(uk->marks.b);
- }
- Student *input(char filename[])
- {
- FILE *f; char *n;
- Student *uk, *first = NULL, *add, *last = NULL;
- bool check;
- if (!(f = fopen(filename, "r")))
- {
- printf("No such file.\n");
- exit(1);
- }
- while (!(feof(f)))
- {
- if (!first){
- first = new Student;
- inputInfo(first, f);
- last = first;
- }
- add = new Student; //память для добавляемой записи
- inputInfo(add, f);
- last->next = add; //присоединим эту запись к списку
- add->prev = last; // сделаем в обратную сторону
- last = add; //сделаем эту запись последней
- }
- last->next = first; //зацикливаем
- first->prev = last;
- return(first); //вернем адрес начала списка
- }
- void output(Student *catalog){
- int j = 0;
- Student *head = catalog;
- if (!catalog) puts("The list is empty\n");
- else
- do
- {
- printf("\nStudent %d:\n", j);
- printf("%s\n", catalog->fullName.surname);
- printf("%s\n", catalog->fullName.name);
- printf("%s\n", catalog->fullName.patronymic);
- printf("%s\n", catalog->group);
- for (int i = 0; i < 5; i++)
- printf("%3d", catalog->marks.b[i]);
- printf("\n Average mark: %.2f", catalog->marks.average);
- printf("\n\n");
- j++;
- catalog = catalog->next;
- } while (catalog != head);
- }
- Student *filtrate(Student *catalog, char name[L], bool *flag){
- Student *old,*uk, *stack = NULL;
- old = catalog;
- do
- {
- if (strcmp(old->fullName.name, name) != 0){
- uk = new Student;
- uk->next = stack;
- stack = uk;
- strcpy(uk->fullName.name, old->fullName.name);
- strcpy(uk->fullName.surname, old->fullName.surname);
- strcpy(uk->fullName.patronymic, old->fullName.patronymic);
- strcpy(uk->group, old->group);
- for (int i = 0; i < 5; i++)
- uk->marks.b[i] = old->marks.b[i];
- uk->marks.average = old->marks.average;
- uk->prev = NULL;
- *flag = true;
- }
- old = old->next;
- } while (old && old != catalog);
- return (stack);
- }
- Student *filtrateByMarks(Student *catalog, bool *flag){
- Student *old, *uk, *stack = NULL;
- old = catalog;
- return (catalog);
- }
- void to_file(Student *catalog, char *filename2)
- {
- FILE *f;
- int i;
- f = fopen(filename2, "w");
- while (catalog)
- {
- fprintf(f, "%s\n", catalog->fullName.name);
- fprintf(f, "%s\n", catalog->fullName.surname);
- fprintf(f, "%s\n", catalog->fullName.patronymic);
- fprintf(f, "%s\n", catalog->group);
- for (i = 0; i < 5; i++)
- fprintf(f, "%3d", catalog->marks.b[i]);
- fprintf(f, "\nAverage mark: %.3f\n\n", catalog->marks.average);
- catalog = catalog->next;
- }
- fclose(f);
- }
- void freemem(Student *catalog)
- {
- Student *next = catalog;
- do
- {
- next = catalog->next;
- delete (catalog); // Освобождение памяти
- catalog = next;
- } while (next && next != catalog);
- }
- int main()
- {
- SetConsoleOutputCP(1251);
- SetConsoleCP(1251);
- char filename[L], filename2[L], name[L];
- bool flag = false;
- Student *catalog, *head;
- printf("Enter filename: \n");
- gets(filename);
- printf("\n");
- catalog = input(filename);
- output(catalog);
- printf("Enter name: \n");
- gets(name);
- head = filtrate(catalog, name, &flag);
- if (!head) puts("\nNone of the students have other name\n");
- else if (!flag) puts("\nNo filtration is needed\n");
- else
- {
- printf("Enter filename of other file\n");
- gets(filename2);
- to_file(head, filename2);
- printf("\nSuccessful sorting\n");
- }
- freemem(catalog);
- if (head)freemem(head);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement