Advertisement
Discriminant

Untitled

Mar 29th, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.52 KB | None | 0 0
  1. #include "Functions.h"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <locale.h>
  5. #include <string.h>
  6. #include <Windows.h>
  7. #include <ctype.h>
  8. #include <time.h>
  9.  
  10. //------------------------------------------------------------------------------
  11. //Додавання студента в кінець списку, виділення динамічної пам'яті
  12. void AppendStudentToList(Clist* pHead, Cstudent sStud)
  13. {
  14.     Clist pInsert = (Clist)malloc(sizeof(Cnode));
  15.     if (pInsert == NULL) {
  16.         exit(0);
  17.     }
  18.     pInsert->m_pNext = NULL;
  19.     pInsert->m_Cinfo = sStud;
  20.     if (!*pHead)
  21.         *pHead = pInsert;
  22.     else
  23.     {
  24.         Clist p = *pHead;
  25.         while (p->m_pNext)
  26.             p = p->m_pNext;
  27.         p->m_pNext = pInsert;
  28.     }
  29. }
  30. //------------------------------------------------------------------------------
  31. //Зчитування файлу і заповення списку
  32. void GetStudentsFromFile(Clist* pHead)
  33. {
  34.     setlocale(LC_ALL, "Ukrainian");
  35.     SetConsoleCP(1251);
  36.     SetConsoleOutputCP(1251);
  37.     char szFileName[FILENAME_MAX];
  38.     FILE *pFile;
  39.     Cstudent sTemp = { 0 };
  40.     int checker, iter = 0;;
  41.     char* cmpstr = "qwertyuiopasdfghjklzxcvbnmйцукенгшщзхїфівапролджєячсмитьбюыёэ'ЙЦУКЕНГШЩЗХЇФІВАПРОЛДЖЄЯЧСМИТЬБЮQWERTYUIOPASDFGHJKLZXCVBNMЫЁЭ";
  42.     int isFileEmpty = 1;
  43.     char buffer[1000] = {'\0'};
  44.  
  45.     const time_t CurrentTime = time(NULL);
  46.     const time_t *pCurrentTime = &CurrentTime;
  47.     struct tm CurrentSTime;
  48.     struct tm *const pCurrentSTime = &CurrentSTime;
  49.     localtime_s(pCurrentSTime, pCurrentTime);
  50.     unsigned int CurrentYear = (unsigned int)(pCurrentSTime->tm_year + 1900);
  51.  
  52.     puts("Введіть шлях до файлу:");
  53.     //scanf_s("%s", szFileName, MAX_LENGTH_OF_FILENAME);
  54.     strcpy_s(szFileName, 10, "Group.txt");
  55.  
  56.     if (fopen_s(&pFile, szFileName, "rb"))
  57.     {
  58.         printf("EROR: Не вдалося вiдкрити файл %s\n", szFileName);
  59.         system("pause");
  60.         exit(0);
  61.     }
  62.     printf("Завантаження %s...\n", szFileName);
  63.  
  64.     while (!feof(pFile))
  65.     {
  66.         ++iter;
  67.         fgets(buffer, 100, pFile);
  68.  
  69.         checker = sscanf_s(buffer, "%s%s%d.%d.%d%d%d%d%d%d",
  70.             sTemp.m_szSurname, MAX_LENGTH_OF_SNAME,
  71.             sTemp.m_szName, MAX_LENGTH_OF_SNAME,
  72.             &sTemp.m_Cbirthday.m_unDay,
  73.             &sTemp.m_Cbirthday.m_unMonth,
  74.             &sTemp.m_Cbirthday.m_unYear,
  75.             &sTemp.m_punMarks[0],
  76.             &sTemp.m_punMarks[1],
  77.             &sTemp.m_punMarks[2],
  78.             &sTemp.m_punMarks[3],
  79.             &sTemp.m_punMarks[4]);
  80.  
  81.         if (checker == -1 && isFileEmpty == 1)
  82.         {
  83.             break;
  84.         }
  85.         if (checker == -1) continue;
  86.         isFileEmpty = 0;
  87.         for (unsigned int i = 0; i < strlen(sTemp.m_szSurname); ++i)
  88.         {
  89.             if (!strchr(cmpstr, sTemp.m_szSurname[i]))
  90.             {
  91.                 printf("EROR: У рядку №%d є неприпустимі значення у прізвищі: %s\n", iter, sTemp.m_szSurname);
  92.                 system("pause");
  93.                 exit(0);
  94.             }
  95.         }
  96.  
  97.         for (unsigned int i = 0; i < strlen(sTemp.m_szName); ++i)
  98.         {
  99.             if (!strchr(cmpstr, sTemp.m_szName[i]))
  100.             {
  101.                 printf("EROR: У рядку №%d є неприпустимі значення у імені: %s\n", iter, sTemp.m_szName);
  102.                 system("pause");
  103.                 exit(0);
  104.             }
  105.         }
  106.  
  107.         if (sTemp.m_Cbirthday.m_unDay > 31 || sTemp.m_Cbirthday.m_unDay < 1)
  108.         {
  109.             printf("EROR: У рядку №%d є неприпустимі значення у дні народження: %d\n", iter, sTemp.m_Cbirthday.m_unDay);
  110.             system("pause");
  111.             exit(0);
  112.         }
  113.  
  114.         if (sTemp.m_Cbirthday.m_unMonth > 12 || sTemp.m_Cbirthday.m_unMonth < 1)
  115.         {
  116.             printf("EROR: У рядку №%d є неприпустимі значення у місяці народження: %d\n", iter, sTemp.m_Cbirthday.m_unMonth);
  117.             system("pause");
  118.             exit(0);
  119.         }
  120.  
  121.         if (sTemp.m_Cbirthday.m_unYear > CurrentYear || sTemp.m_Cbirthday.m_unYear < 1)
  122.         {
  123.             printf("EROR: У рядку №%d є неприпустимі значення у році народження: %d\n", iter, sTemp.m_Cbirthday.m_unYear);
  124.             system("pause");
  125.             exit(0);
  126.         }
  127.  
  128.         for (int i = 0; i < NUMBER_OF_SMARKS; ++i)
  129.         {
  130.             if (sTemp.m_punMarks[i] < 1 || sTemp.m_punMarks[i] > 5)
  131.             {
  132.                 printf("EROR: У рядку №%d є неприпустимі значення оцінок (Оцінки мають бути в діапазоні[1,5])\n", iter);
  133.                 system("pause");
  134.                 exit(0);
  135.             }
  136.         }
  137.  
  138.         if (checker != 10)
  139.         {
  140.             printf("EROR: У рядку №%i дані введені не повністю або не коректно\n", iter);
  141.             system("pause");
  142.             exit(0);
  143.         }
  144.        
  145.         sTemp.m_fAverageMark = GetAvarageMark(sTemp.m_punMarks);
  146.         AppendStudentToList(pHead, sTemp);
  147.     }
  148.     if (isFileEmpty)
  149.     {
  150.         printf("EROR: Файл %s пустий\n", szFileName);
  151.         system("pause");
  152.         exit(0);
  153.     }
  154.     fclose(pFile);
  155. }
  156. //------------------------------------------------------------------------------
  157. //Обрахунок середнього балу студента
  158. float GetAvarageMark(const unsigned int pMarks[NUMBER_OF_SMARKS])
  159. {
  160.     float nSum = 0;
  161.     for (int i = 0; i < NUMBER_OF_SMARKS; ++i)
  162.         nSum += pMarks[i];
  163.     return nSum / NUMBER_OF_SMARKS;
  164. }
  165. //------------------------------------------------------------------------------
  166. //Видалення Списку, звільнення динамічної пам'яті
  167. void DeleteList(Clist pHead)
  168. {
  169.     if (!pHead)
  170.         return;
  171.     while (pHead->m_pNext)
  172.     {
  173.         Clist pTemp = pHead;
  174.         pHead = pHead->m_pNext;
  175.         free(pTemp);
  176.     }
  177.     free(pHead);
  178. }
  179. //------------------------------------------------------------------------------
  180. //Вивід списку на екран у вигляді таблиці
  181. void DisplayListOfStudents(const Clist pHead)
  182. {
  183.     if (!pHead)
  184.     {
  185.         printf("EROR: Список пустий\n");
  186.         system("pause");
  187.         exit(0);
  188.     }
  189.     Clist p = pHead;
  190.     printf("|%*s|%*s|%-10s|%*s|%s|\n",
  191.         -MAX_LENGTH_OF_SNAME, "SURNAME",
  192.         -MAX_LENGTH_OF_SNAME, "NAME",
  193.         "BIRTH",
  194.         -(NUMBER_OF_SMARKS * 3), "MARKS",
  195.         "AVARAGE");
  196.     for (int i = 0; i < 98; ++i) {
  197.         putchar('+');
  198.     }
  199.     putchar('\n');
  200.     while (p)
  201.     {
  202.         printf("|%-*s|%-*s|%02d.%02d.%02d|",
  203.             MAX_LENGTH_OF_SNAME,
  204.             p->m_Cinfo.m_szSurname,
  205.             MAX_LENGTH_OF_SNAME,
  206.             p->m_Cinfo.m_szName,
  207.             p->m_Cinfo.m_Cbirthday.m_unDay,
  208.             p->m_Cinfo.m_Cbirthday.m_unMonth,
  209.             p->m_Cinfo.m_Cbirthday.m_unYear);
  210.         for (int j = 0; j < NUMBER_OF_SMARKS; ++j)
  211.             printf(" %d ", p->m_Cinfo.m_punMarks[j]);
  212.         printf("| %0.2f  |", p->m_Cinfo.m_fAverageMark);
  213.         putchar('\n');
  214.         p = p->m_pNext;
  215.     }
  216.     putchar('\n');
  217. }
  218. //------------------------------------------------------------------------------
  219. //Видалення студента, звільнення динамічної пам'яті
  220. void DeleteStudentFromList(Clist* pHead, Clist pDel)
  221. {
  222.     if (pDel == *pHead)
  223.         *pHead = (*pHead)->m_pNext;
  224.     else
  225.     {
  226.         Clist p = *pHead;
  227.         while (p->m_pNext != pDel)
  228.             p = p->m_pNext;
  229.         p->m_pNext = pDel->m_pNext;
  230.     }
  231.     free(pDel);
  232. }
  233. //------------------------------------------------------------------------------
  234. //Видалення студентів зі списку, у яких середній бал нижчче заданого
  235. //(Задається аргументом fAvarage)
  236. void DeleteStudentsWithLowerAverage(Clist* pHead, float fAvarage)
  237. {
  238.     Clist p = *pHead, pTemp;
  239.     while (p)
  240.     {
  241.         pTemp = p;
  242.         p = p->m_pNext;
  243.         if (pTemp->m_Cinfo.m_fAverageMark < fAvarage)
  244.             DeleteStudentFromList(pHead, pTemp);
  245.     }
  246. }
  247. //------------------------------------------------------------------------------
  248. //Міняє місцями положення двох студентів
  249. void SwapStudents(Clist* pHead, Clist pVal1, Clist pVal2)
  250. {
  251.     Clist p = NULL;
  252.     Clist temp[4] = { NULL };
  253.  
  254.     if (pVal1 == pVal2)
  255.         return;
  256.     else if (pVal1->m_pNext == pVal2)
  257.     {
  258.         temp[0] = pVal1;
  259.         temp[1] = pVal2;
  260.         temp[2] = pVal2->m_pNext;
  261.  
  262.         p = *pHead;
  263.         if (pVal1 == *pHead)
  264.         {
  265.             p = p->m_pNext;
  266.             p->m_pNext = temp[0];
  267.             p = p->m_pNext;
  268.             p->m_pNext = temp[2];
  269.             *pHead = pVal2;
  270.         }
  271.         else
  272.         {
  273.             while (p->m_pNext != pVal1)
  274.                 p = p->m_pNext;
  275.             p->m_pNext = temp[1];
  276.             p = p->m_pNext;
  277.             p->m_pNext = temp[0];
  278.             p = p->m_pNext;
  279.             p->m_pNext = temp[2];
  280.         }
  281.     }
  282. }
  283. //------------------------------------------------------------------------------
  284. //Повертає кількість студентів у списку
  285. int GetNumberOfElements(const Clist pHead)
  286. {
  287.     int count = 0;
  288.     Clist temp = pHead;
  289.     while (temp)
  290.     {
  291.         temp = temp->m_pNext;
  292.         ++count;
  293.     }
  294.     return count;
  295. }
  296. //------------------------------------------------------------------------------
  297. //Сортування списку студентів за їх віком
  298. void SortStudentsByAge(Clist *pHead)
  299. {
  300.     int iNumberOfStudents = GetNumberOfElements(*pHead);
  301.     int *pIntDate = (int*)malloc(iNumberOfStudents * sizeof(int));
  302.     if (pIntDate == NULL) {
  303.         exit(0);
  304.     }
  305.     int iTemp;
  306.    
  307.     for (int i = 0; i < iNumberOfStudents; ++i)
  308.     {
  309.         pIntDate[i] = GetStudentPointer(*pHead, i)->m_Cinfo.m_Cbirthday.m_unDay +
  310.             GetStudentPointer(*pHead, i)->m_Cinfo.m_Cbirthday.m_unMonth * 100 +
  311.             GetStudentPointer(*pHead, i)->m_Cinfo.m_Cbirthday.m_unYear * 10000;
  312.     }
  313.     for (int i = 0; i < iNumberOfStudents; ++i)
  314.     {
  315.         for (int j = 0; j < iNumberOfStudents - 1 - i; ++j)
  316.         {
  317.             if (pIntDate[j] < pIntDate[j + 1])
  318.             {
  319.                 iTemp = pIntDate[j];
  320.                 pIntDate[j] = pIntDate[j + 1];
  321.                 pIntDate[j + 1] = iTemp;
  322.                 SwapStudents(pHead, GetStudentPointer(*pHead, j), GetStudentPointer(*pHead, j + 1));
  323.             }
  324.         }
  325.     }
  326.     free(pIntDate);
  327. }
  328.  
  329. Clist GetStudentPointer(const Clist list, int iNum)
  330. {
  331.     Clist pRez = list;
  332.     for (int i = 0; i < iNum; ++i)
  333.     {
  334.         pRez = pRez->m_pNext;
  335.     }
  336.     return pRez;
  337. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement