Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Functions.h"
- #include <stdio.h>
- #include <stdlib.h>
- #include <locale.h>
- #include <string.h>
- #include <Windows.h>
- #include <ctype.h>
- #include <time.h>
- //------------------------------------------------------------------------------
- //Додавання студента в кінець списку, виділення динамічної пам'яті
- void AppendStudentToList(Clist* pHead, Cstudent sStud)
- {
- Clist pInsert = (Clist)malloc(sizeof(Cnode));
- if (pInsert == NULL) {
- exit(0);
- }
- pInsert->m_pNext = NULL;
- pInsert->m_Cinfo = sStud;
- if (!*pHead)
- *pHead = pInsert;
- else
- {
- Clist p = *pHead;
- while (p->m_pNext)
- p = p->m_pNext;
- p->m_pNext = pInsert;
- }
- }
- //------------------------------------------------------------------------------
- //Зчитування файлу і заповення списку
- void GetStudentsFromFile(Clist* pHead)
- {
- setlocale(LC_ALL, "Ukrainian");
- SetConsoleCP(1251);
- SetConsoleOutputCP(1251);
- char szFileName[FILENAME_MAX];
- FILE *pFile;
- Cstudent sTemp = { 0 };
- int checker, iter = 0;;
- char* cmpstr = "qwertyuiopasdfghjklzxcvbnmйцукенгшщзхїфівапролджєячсмитьбюыёэ'ЙЦУКЕНГШЩЗХЇФІВАПРОЛДЖЄЯЧСМИТЬБЮQWERTYUIOPASDFGHJKLZXCVBNMЫЁЭ";
- int isFileEmpty = 1;
- char buffer[1000] = {'\0'};
- const time_t CurrentTime = time(NULL);
- const time_t *pCurrentTime = &CurrentTime;
- struct tm CurrentSTime;
- struct tm *const pCurrentSTime = &CurrentSTime;
- localtime_s(pCurrentSTime, pCurrentTime);
- unsigned int CurrentYear = (unsigned int)(pCurrentSTime->tm_year + 1900);
- puts("Введіть шлях до файлу:");
- //scanf_s("%s", szFileName, MAX_LENGTH_OF_FILENAME);
- strcpy_s(szFileName, 10, "Group.txt");
- if (fopen_s(&pFile, szFileName, "rb"))
- {
- printf("EROR: Не вдалося вiдкрити файл %s\n", szFileName);
- system("pause");
- exit(0);
- }
- printf("Завантаження %s...\n", szFileName);
- while (!feof(pFile))
- {
- ++iter;
- fgets(buffer, 100, pFile);
- checker = sscanf_s(buffer, "%s%s%d.%d.%d%d%d%d%d%d",
- sTemp.m_szSurname, MAX_LENGTH_OF_SNAME,
- sTemp.m_szName, MAX_LENGTH_OF_SNAME,
- &sTemp.m_Cbirthday.m_unDay,
- &sTemp.m_Cbirthday.m_unMonth,
- &sTemp.m_Cbirthday.m_unYear,
- &sTemp.m_punMarks[0],
- &sTemp.m_punMarks[1],
- &sTemp.m_punMarks[2],
- &sTemp.m_punMarks[3],
- &sTemp.m_punMarks[4]);
- if (checker == -1 && isFileEmpty == 1)
- {
- break;
- }
- if (checker == -1) continue;
- isFileEmpty = 0;
- for (unsigned int i = 0; i < strlen(sTemp.m_szSurname); ++i)
- {
- if (!strchr(cmpstr, sTemp.m_szSurname[i]))
- {
- printf("EROR: У рядку №%d є неприпустимі значення у прізвищі: %s\n", iter, sTemp.m_szSurname);
- system("pause");
- exit(0);
- }
- }
- for (unsigned int i = 0; i < strlen(sTemp.m_szName); ++i)
- {
- if (!strchr(cmpstr, sTemp.m_szName[i]))
- {
- printf("EROR: У рядку №%d є неприпустимі значення у імені: %s\n", iter, sTemp.m_szName);
- system("pause");
- exit(0);
- }
- }
- if (sTemp.m_Cbirthday.m_unDay > 31 || sTemp.m_Cbirthday.m_unDay < 1)
- {
- printf("EROR: У рядку №%d є неприпустимі значення у дні народження: %d\n", iter, sTemp.m_Cbirthday.m_unDay);
- system("pause");
- exit(0);
- }
- if (sTemp.m_Cbirthday.m_unMonth > 12 || sTemp.m_Cbirthday.m_unMonth < 1)
- {
- printf("EROR: У рядку №%d є неприпустимі значення у місяці народження: %d\n", iter, sTemp.m_Cbirthday.m_unMonth);
- system("pause");
- exit(0);
- }
- if (sTemp.m_Cbirthday.m_unYear > CurrentYear || sTemp.m_Cbirthday.m_unYear < 1)
- {
- printf("EROR: У рядку №%d є неприпустимі значення у році народження: %d\n", iter, sTemp.m_Cbirthday.m_unYear);
- system("pause");
- exit(0);
- }
- for (int i = 0; i < NUMBER_OF_SMARKS; ++i)
- {
- if (sTemp.m_punMarks[i] < 1 || sTemp.m_punMarks[i] > 5)
- {
- printf("EROR: У рядку №%d є неприпустимі значення оцінок (Оцінки мають бути в діапазоні[1,5])\n", iter);
- system("pause");
- exit(0);
- }
- }
- if (checker != 10)
- {
- printf("EROR: У рядку №%i дані введені не повністю або не коректно\n", iter);
- system("pause");
- exit(0);
- }
- sTemp.m_fAverageMark = GetAvarageMark(sTemp.m_punMarks);
- AppendStudentToList(pHead, sTemp);
- }
- if (isFileEmpty)
- {
- printf("EROR: Файл %s пустий\n", szFileName);
- system("pause");
- exit(0);
- }
- fclose(pFile);
- }
- //------------------------------------------------------------------------------
- //Обрахунок середнього балу студента
- float GetAvarageMark(const unsigned int pMarks[NUMBER_OF_SMARKS])
- {
- float nSum = 0;
- for (int i = 0; i < NUMBER_OF_SMARKS; ++i)
- nSum += pMarks[i];
- return nSum / NUMBER_OF_SMARKS;
- }
- //------------------------------------------------------------------------------
- //Видалення Списку, звільнення динамічної пам'яті
- void DeleteList(Clist pHead)
- {
- if (!pHead)
- return;
- while (pHead->m_pNext)
- {
- Clist pTemp = pHead;
- pHead = pHead->m_pNext;
- free(pTemp);
- }
- free(pHead);
- }
- //------------------------------------------------------------------------------
- //Вивід списку на екран у вигляді таблиці
- void DisplayListOfStudents(const Clist pHead)
- {
- if (!pHead)
- {
- printf("EROR: Список пустий\n");
- system("pause");
- exit(0);
- }
- Clist p = pHead;
- printf("|%*s|%*s|%-10s|%*s|%s|\n",
- -MAX_LENGTH_OF_SNAME, "SURNAME",
- -MAX_LENGTH_OF_SNAME, "NAME",
- "BIRTH",
- -(NUMBER_OF_SMARKS * 3), "MARKS",
- "AVARAGE");
- for (int i = 0; i < 98; ++i) {
- putchar('+');
- }
- putchar('\n');
- while (p)
- {
- printf("|%-*s|%-*s|%02d.%02d.%02d|",
- MAX_LENGTH_OF_SNAME,
- p->m_Cinfo.m_szSurname,
- MAX_LENGTH_OF_SNAME,
- p->m_Cinfo.m_szName,
- p->m_Cinfo.m_Cbirthday.m_unDay,
- p->m_Cinfo.m_Cbirthday.m_unMonth,
- p->m_Cinfo.m_Cbirthday.m_unYear);
- for (int j = 0; j < NUMBER_OF_SMARKS; ++j)
- printf(" %d ", p->m_Cinfo.m_punMarks[j]);
- printf("| %0.2f |", p->m_Cinfo.m_fAverageMark);
- putchar('\n');
- p = p->m_pNext;
- }
- putchar('\n');
- }
- //------------------------------------------------------------------------------
- //Видалення студента, звільнення динамічної пам'яті
- void DeleteStudentFromList(Clist* pHead, Clist pDel)
- {
- if (pDel == *pHead)
- *pHead = (*pHead)->m_pNext;
- else
- {
- Clist p = *pHead;
- while (p->m_pNext != pDel)
- p = p->m_pNext;
- p->m_pNext = pDel->m_pNext;
- }
- free(pDel);
- }
- //------------------------------------------------------------------------------
- //Видалення студентів зі списку, у яких середній бал нижчче заданого
- //(Задається аргументом fAvarage)
- void DeleteStudentsWithLowerAverage(Clist* pHead, float fAvarage)
- {
- Clist p = *pHead, pTemp;
- while (p)
- {
- pTemp = p;
- p = p->m_pNext;
- if (pTemp->m_Cinfo.m_fAverageMark < fAvarage)
- DeleteStudentFromList(pHead, pTemp);
- }
- }
- //------------------------------------------------------------------------------
- //Міняє місцями положення двох студентів
- void SwapStudents(Clist* pHead, Clist pVal1, Clist pVal2)
- {
- Clist p = NULL;
- Clist temp[4] = { NULL };
- if (pVal1 == pVal2)
- return;
- else if (pVal1->m_pNext == pVal2)
- {
- temp[0] = pVal1;
- temp[1] = pVal2;
- temp[2] = pVal2->m_pNext;
- p = *pHead;
- if (pVal1 == *pHead)
- {
- p = p->m_pNext;
- p->m_pNext = temp[0];
- p = p->m_pNext;
- p->m_pNext = temp[2];
- *pHead = pVal2;
- }
- else
- {
- while (p->m_pNext != pVal1)
- p = p->m_pNext;
- p->m_pNext = temp[1];
- p = p->m_pNext;
- p->m_pNext = temp[0];
- p = p->m_pNext;
- p->m_pNext = temp[2];
- }
- }
- }
- //------------------------------------------------------------------------------
- //Повертає кількість студентів у списку
- int GetNumberOfElements(const Clist pHead)
- {
- int count = 0;
- Clist temp = pHead;
- while (temp)
- {
- temp = temp->m_pNext;
- ++count;
- }
- return count;
- }
- //------------------------------------------------------------------------------
- //Сортування списку студентів за їх віком
- void SortStudentsByAge(Clist *pHead)
- {
- int iNumberOfStudents = GetNumberOfElements(*pHead);
- int *pIntDate = (int*)malloc(iNumberOfStudents * sizeof(int));
- if (pIntDate == NULL) {
- exit(0);
- }
- int iTemp;
- for (int i = 0; i < iNumberOfStudents; ++i)
- {
- pIntDate[i] = GetStudentPointer(*pHead, i)->m_Cinfo.m_Cbirthday.m_unDay +
- GetStudentPointer(*pHead, i)->m_Cinfo.m_Cbirthday.m_unMonth * 100 +
- GetStudentPointer(*pHead, i)->m_Cinfo.m_Cbirthday.m_unYear * 10000;
- }
- for (int i = 0; i < iNumberOfStudents; ++i)
- {
- for (int j = 0; j < iNumberOfStudents - 1 - i; ++j)
- {
- if (pIntDate[j] < pIntDate[j + 1])
- {
- iTemp = pIntDate[j];
- pIntDate[j] = pIntDate[j + 1];
- pIntDate[j + 1] = iTemp;
- SwapStudents(pHead, GetStudentPointer(*pHead, j), GetStudentPointer(*pHead, j + 1));
- }
- }
- }
- free(pIntDate);
- }
- Clist GetStudentPointer(const Clist list, int iNum)
- {
- Clist pRez = list;
- for (int i = 0; i < iNum; ++i)
- {
- pRez = pRez->m_pNext;
- }
- return pRez;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement