Advertisement
Guest User

Untitled

a guest
May 8th, 2017
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 20.64 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. #include <locale.h>
  5.  
  6. struct BusPark
  7. {
  8.     int ID;
  9.     char Model[10];
  10.     char FirstName[20];
  11.     char LastName[20];
  12.     char Patronymic[20];
  13.     float CarryingAmount;
  14.     int DayLastTO;
  15.     int MonthLastTO;
  16.     int YearLastTO;
  17.     int RouteNumber;
  18.     struct BusPark *Next;
  19.     struct BusPark *Previous;
  20. };
  21.  
  22. struct Pointers{
  23.     struct BusPark *Head;
  24.     struct BusPark *Tail;
  25. };
  26. struct Pointers List={.Head=NULL};
  27.  
  28. void DataInput();
  29. void DataOutput();
  30. void UploadInFile();
  31. void DownloadFromFile(struct BusPark *Address);
  32. void AddElement();
  33. void DeleteElement();
  34. void CorrectElement();
  35. int SortElements();
  36. void ListWithTOEarlierThen();
  37. void DataOutputOneElement(struct BusPark *Address);
  38. void DriverWithMinimalCarryingAmount();
  39. void ListBusBeginsWithLetter();
  40. void TransferPtr(struct BusPark *LeftElement,struct BusPark *RightElement);
  41.  
  42. int NumberOfBuses=0;
  43.  
  44. int main() {
  45.     SetConsoleCP(1251);
  46.     SetConsoleOutputCP(1251);
  47.     setlocale(LC_ALL,"russian");
  48.     int Interface=0;
  49.     int Continue=1;
  50.     while(Continue==1) {
  51.         printf("Выберете нужное действие: \n1.Ввод данных\n2.Добавление элемента\n3.Удаление элемента\n4.Корректировка данных\n5.Вывод всех данных\n6.Формирование списка автобусов прошедших тех. обслуживание ранее заданной даты\n7.Вывод данных о водителе с наименьшей балансовой стоимостью автобуса\n8.Сортировка данных по номерам маршрута\n9.Вывод всех моделей автобусов, начинающихся на заданную букву\n10.Загрузка данных из файла\n11.Выгрузка данных в файл");
  52.         printf("\nВыбранное действие: ");
  53.         scanf("%d", &Interface);
  54.         switch (Interface) {
  55.             case 1:
  56.                 DataInput();
  57.                 break;
  58.             case 2:
  59.                 if(NumberOfBuses)
  60.                     AddElement();
  61.                 else
  62.                     DataInput();
  63.                 break;
  64.             case 3:
  65.                 if(NumberOfBuses) {
  66.                     DeleteElement();
  67.                     printf("\nУспешно выполнено!");
  68.                 }
  69.                 else
  70.                     printf("\nВы пока не ввели данные!");
  71.                 break;
  72.             case 4:
  73.                 if(NumberOfBuses) {
  74.                     CorrectElement();
  75.                     printf("\nУспешно выполнено!");
  76.                 }
  77.                 else
  78.                     printf("\nВы пока не ввели данные!");
  79.                 break;
  80.             case 5:
  81.                 if(NumberOfBuses) {
  82.                     DataOutput();
  83.                 }
  84.                 else {
  85.                     printf("\nВы пока не ввели данные!");
  86.                 }
  87.                 break;
  88.             case 6:
  89.                 if(NumberOfBuses) {
  90.                     ListWithTOEarlierThen();
  91.                 }
  92.                 else {
  93.                     printf("\nВы пока не ввели данные!");
  94.                 }
  95.                 break;
  96.             case 7:
  97.                 if(NumberOfBuses) {
  98.                     DriverWithMinimalCarryingAmount();
  99.                 }
  100.                 else {
  101.                     printf("\nВы пока не ввели данные!");
  102.                 }
  103.                 break;
  104.             case 8:
  105.                 if(NumberOfBuses) {
  106.                     SortElements();
  107.                 }
  108.                 else {
  109.                     printf("\nВы пока не ввели данные!");
  110.                 }
  111.                 break;
  112.             case 9:
  113.                 if(NumberOfBuses) {
  114.                     ListBusBeginsWithLetter();
  115.                 }
  116.                 else {
  117.                     printf("\nВы пока не ввели данные!");
  118.                 }
  119.                 break;
  120.             case 10:
  121.                 if(NumberOfBuses)
  122.                     DownloadFromFile(List.Tail);
  123.                 else
  124.                     DownloadFromFile(List.Head);
  125.                 printf("\nУспешно выполнено!");
  126.                 break;
  127.             case 11:
  128.                 if(NumberOfBuses) {
  129.                     UploadInFile();
  130.                     printf("\nУспешно выполнено!");
  131.                 }
  132.                 else {
  133.                     printf("\nВы пока не ввели данные!");
  134.                 }
  135.                 break;
  136.             default:
  137.                 printf("\nВы выбрали несуществующий пункт!");
  138.                 break;
  139.         }
  140.         printf("\nХотите продолжить работу с меню? (1-Да, 0-Нет): ");
  141.         scanf("%d",&Continue);
  142.         system("cls");
  143.     }
  144.     getchar();
  145.     getchar();
  146.     return 0;
  147. }
  148.  
  149. void DataInput()
  150. {
  151.     int count=1, Continue=1, bad=1;
  152.     struct BusPark *Address = NULL;
  153.     struct BusPark *BeginPtr = NULL;
  154.     struct BusPark *Temporary = NULL;
  155.     printf("\nВведите данные: ");
  156.     while(Continue==1)
  157.     {
  158.         if(BeginPtr==NULL)
  159.         {
  160.             BeginPtr= (struct BusPark *)malloc(sizeof(struct BusPark));
  161.             if(BeginPtr==NULL)
  162.             {
  163.                 printf("\nПамять не была выделена!");
  164.                 exit(1);
  165.             }
  166.             List.Head = BeginPtr;
  167.             List.Tail = List.Head;
  168.             Address = BeginPtr;
  169.             Address->Previous = NULL;
  170.             Address->Next=NULL;
  171.         }
  172.         else {
  173.             Temporary=(struct BusPark *)malloc(sizeof(struct BusPark));
  174.             if(Temporary==NULL)
  175.             {
  176.                 printf("\nПамять не была выделена!");
  177.                 exit(1);
  178.             }
  179.             Address->Next=Temporary;
  180.             Address->Next->Previous=Address;
  181.             Address=Address->Next;
  182.             List.Tail=Address;
  183.             Address->Next=NULL;
  184.         }
  185.         printf("\nАвтобус №%d",count);
  186.         printf("\nВведите модель автобуса: ");
  187.         scanf("%s",Address->Model);
  188.         printf("Введите ФИО водителя: ");
  189.         scanf("%s %s %s",Address->FirstName,Address->LastName,Address->Patronymic);
  190.         printf("Введите балансовую стоимость: ");
  191.         scanf("%f",&Address->CarryingAmount);
  192.         while(bad==1) {
  193.             bad=0;
  194.             printf("Введите дату последнего технического обслуживания (В формате ДД.ММ.ГГГГ): ");
  195.             scanf("%d.%d.%d",&Address->DayLastTO,&Address->MonthLastTO,&Address->YearLastTO);
  196.             if ((Address->DayLastTO > 31) || (Address->DayLastTO < 1)) {
  197.                 printf("Некорректный день запроса! Попробуйте еще раз!\n");
  198.                 bad=1;
  199.             }
  200.             if ((Address->MonthLastTO > 12) || (Address->MonthLastTO < 1))
  201.             {
  202.                 printf("\nНекорректный месяц запроса! Попробуйте еще раз!\n");
  203.                 bad=1;
  204.             }
  205.             if (Address->YearLastTO < 0)
  206.             {
  207.                 printf("\nНекорректный год запроса! Попробуйте еще раз!\n");
  208.                 bad=1;
  209.             }
  210.         }
  211.         printf("Введите номер маршрута: ");
  212.         scanf("%d",&Address->RouteNumber);
  213.         Address->ID=count;
  214.         count++;
  215.         NumberOfBuses++;
  216.         printf("\nХотите продолжить ввод? (1-Да, 0-Нет): ");
  217.         scanf("%d",&Continue);
  218.     }
  219. }
  220.  
  221. void DataOutput() {
  222.     int i;
  223.     struct BusPark *Address = List.Head;
  224.     printf("\nВведённые данные: ");
  225.     for (i = 0; i < NumberOfBuses; i++) {
  226.         printf("\nАвтобус №%d", Address->ID);
  227.         printf("\nМодель автобуса: %s", Address->Model);
  228.         printf("\nФИО водителя: %s %s %s", Address->FirstName, Address->LastName,Address->Patronymic);
  229.         printf("\nБалансовая стоимость: %5.2f", Address->CarryingAmount);
  230.         printf("\nДата последнего технического обслуживания (В формате ДД.ММ.ГГГГ): %d.%d.%d", Address->DayLastTO,Address->MonthLastTO,Address->YearLastTO);
  231.         printf("\nНомер маршрута: %d", Address->RouteNumber);
  232.         Address = Address->Next;
  233.     }
  234. }
  235.  
  236. void UploadInFile()
  237. {
  238.     FILE *UploadPtr;
  239.     struct BusPark *Address=List.Head;
  240.     int i=0;
  241.     if((UploadPtr=fopen("data.txt","w+b"))==NULL)
  242.     {
  243.         printf("\nНевозможно открыть файл data.txt!");
  244.         exit(2);
  245.     }
  246.     for(i=0;i<NumberOfBuses;i++) {
  247.         fwrite(Address, sizeof(struct BusPark), 1, UploadPtr);
  248.         Address=Address->Next;
  249.     }
  250.     fclose(UploadPtr);
  251. }
  252.  
  253. void DownloadFromFile(struct BusPark *Address){
  254.     FILE *DownloadPtr;
  255.     struct BusPark *Temporary=NULL;
  256.     if((DownloadPtr=fopen("data.txt","r+b"))==NULL)
  257.     {
  258.         printf("\nНевозможно открыть файл data.txt!");
  259.         exit(2);
  260.     }
  261.     do {
  262.         if (Address == NULL) {
  263.             Address = (struct BusPark *) malloc(sizeof(struct BusPark));
  264.             if (Address == NULL) {
  265.                 printf("\nПамять не была выделена!");
  266.                 exit(1);
  267.             }
  268.             List.Head = Address;
  269.             fread(Address, sizeof(struct BusPark), 1, DownloadPtr);
  270.             Address->Previous = NULL;
  271.             Address->Next = NULL;
  272.         } else {
  273.             List.Tail=Address;
  274.             Address->Next=NULL;
  275.             Temporary=(struct BusPark *)malloc(sizeof(struct BusPark));
  276.             if(Temporary==NULL)
  277.             {
  278.                 printf("\nПамять не была выделена!");
  279.                 exit(1);
  280.             }
  281.             fread(Temporary, sizeof(struct BusPark), 1, DownloadPtr);
  282.             Address->Next=Temporary;
  283.             Address->Next->Previous=Address;
  284.             Address=Address->Next;
  285.         }
  286.         NumberOfBuses++;
  287.     }while(!feof(DownloadPtr));
  288.     NumberOfBuses--;
  289.     fclose(DownloadPtr);
  290. }
  291.  
  292. void AddElement()
  293. {
  294.     int Place,i;
  295.     struct BusPark *Address;
  296.     struct BusPark *Current;
  297.     struct BusPark *LeftElement;
  298.     struct BusPark *RightElement;
  299.     printf("\nВыберете на какое место вы хотети поместить добавленный элемент: ");
  300.     scanf("%d",&Place);
  301.     Address=(struct BusPark *)malloc(sizeof(struct BusPark));
  302.     if(Place==1)
  303.     {
  304.         Address->Next=List.Head;
  305.         Address->Previous=List.Head->Previous;
  306.         List.Head->Previous=Address;
  307.         List.Head=Address;
  308.     }
  309.     else
  310.     {
  311.         if((Place>NumberOfBuses+1)||(Place<1))
  312.         {
  313.             printf("\nНедопустимое место! (Возможно перед местом, куда вы хотите вставить новый элемент, нет предыдущего элемента)");
  314.             free(Address);
  315.             exit(3);
  316.         }
  317.         else if(Place==NumberOfBuses+1)
  318.         {
  319.             Address->Next=List.Tail->Next;
  320.             Address->Previous=List.Tail;
  321.             List.Tail->Next=Address;
  322.             List.Tail=Address;
  323.         }
  324.         else
  325.         {
  326.             Current=List.Head;
  327.             for(i=0;i<Place-1;i++)
  328.             {
  329.                 Current=Current->Next;
  330.             }
  331.             RightElement=Current;
  332.             LeftElement=Current->Previous;
  333.             LeftElement->Next=Address;
  334.             RightElement->Previous=Address;
  335.             Address->Next=RightElement;
  336.             Address->Previous=LeftElement;
  337.         }
  338.     }
  339.     printf("\nАвтобус №%d",NumberOfBuses+1);
  340.     printf("\nВведите модель автобуса: ");
  341.     scanf("%s",Address->Model);
  342.     printf("Введите ФИО водителя: ");
  343.     scanf("%s %s %s",Address->FirstName,Address->LastName,Address->Patronymic);
  344.     printf("Введите балансовую стоимость: ");
  345.     scanf("%f",&Address->CarryingAmount);
  346.     printf("Введите дату последнего технического обслуживания (В формате ДД.ММ.ГГГГ): ");
  347.     scanf("%d.%d.%d",&Address->DayLastTO,&Address->MonthLastTO,&Address->YearLastTO);
  348.     printf("Введите номер маршрута: ");
  349.     scanf("%d",&Address->RouteNumber);
  350.     Address->ID=NumberOfBuses+1;
  351.     NumberOfBuses++;
  352. }
  353.  
  354. void DeleteElement()
  355. {
  356.     int Place,i;
  357.     struct BusPark *Current;
  358.     struct BusPark *Temporary;
  359.     struct BusPark *RightElement;
  360.     struct BusPark *LeftElement;
  361.     printf("\nВведите элемент списка, который Вы хотите удалить: ");
  362.     scanf("%d",&Place);
  363.     if(Place==1)
  364.     {
  365.         Temporary=List.Head->Next;
  366.         Temporary->Previous=NULL;
  367.         free(List.Head);
  368.         List.Head=Temporary;
  369.         NumberOfBuses--;
  370.     }
  371.     else if(Place==NumberOfBuses)
  372.     {
  373.         Temporary=List.Tail->Previous;
  374.         Temporary->Next=NULL;
  375.         free(List.Tail);
  376.         List.Tail=Temporary;
  377.         NumberOfBuses--;
  378.     }
  379.     else if((Place>NumberOfBuses)||(Place<1))
  380.     {
  381.         printf("\nВы ввели не существующий элемент списка!");
  382.         exit(3);
  383.     }
  384.     else
  385.     {
  386.         Current=List.Head;
  387.         for(i=0;i<Place-1;i++)
  388.         {
  389.             Current=Current->Next;
  390.         }
  391.         RightElement=Current->Next;
  392.         LeftElement=Current->Previous;
  393.         LeftElement->Next=RightElement;
  394.         RightElement->Previous=LeftElement;
  395.         free(Current);
  396.         NumberOfBuses--;
  397.     }
  398. }
  399.  
  400. void CorrectElement()
  401. {
  402.     int Place,i;
  403.     struct BusPark *Current;
  404.     printf("\nВведите элемент списка, который Вы хотите изменить: ");
  405.     scanf("%d",&Place);
  406.     if((Place>NumberOfBuses)||(Place<1))
  407.     {
  408.         printf("\nВы ввели не существующий элемент списка!");
  409.         exit(3);
  410.     }
  411.     Current=List.Head;
  412.     for(i=0;i<Place-1;i++)
  413.     {
  414.         Current=Current->Next;
  415.     }
  416.     printf("\nВведите номер автобуса: ");
  417.     scanf("%d",&Current->ID);
  418.     printf("Введите модель автобуса: ");
  419.     scanf("%s",Current->Model);
  420.     printf("Введите ФИО водителя: ");
  421.     scanf("%s %s %s",Current->FirstName,Current->LastName,Current->Patronymic);
  422.     printf("Введите балансовую стоимость: ");
  423.     scanf("%f",&Current->CarryingAmount);
  424.     printf("Введите дату последнего технического обслуживания (В формате ДД.ММ.ГГГГ): ");
  425.     scanf("%d.%d.%d",&Current->DayLastTO,&Current->MonthLastTO,&Current->YearLastTO);
  426.     printf("Введите номер маршрута: ");
  427.     scanf("%d",&Current->RouteNumber);
  428. }
  429.  
  430. int SortElements()
  431. {
  432.     int i,j=1;
  433.     struct BusPark *StartPtr;
  434.     if(NumberOfBuses==1)
  435.     {
  436.         printf("\nВ списке всего один элемент!");
  437.         return 1;
  438.     }
  439.     else
  440.     {
  441.         while(j!=0)
  442.         {
  443.             j=0;
  444.             StartPtr = List.Head;
  445.             for(i=0;i<NumberOfBuses;i++)
  446.             {
  447.                 if(StartPtr==List.Tail)
  448.                 {
  449.                     continue;
  450.                 }
  451.                 if(StartPtr->RouteNumber > StartPtr->Next->RouteNumber)
  452.                 {
  453.                     j++;
  454.                     TransferPtr(StartPtr,StartPtr->Next);
  455.                 }
  456.                 StartPtr = StartPtr->Next;
  457.             }
  458.         }
  459.     }
  460.     return 0;
  461. }
  462.  
  463. void ListWithTOEarlierThen()
  464. {
  465.     int i,EarlierYear=0,EarlierMonth=0,EarlierDay=0,bad=1;
  466.     struct BusPark *Address;
  467.     Address=List.Head;
  468.     while(bad==1) {
  469.         bad=0;
  470.         printf("\nВведите дату информацию о автобусах раньше которой Вы хотите узнать (В формате ДД.ММ.ГГГГ): ");
  471.         scanf("%d.%d.%d", &EarlierDay, &EarlierMonth, &EarlierYear);
  472.         if ((EarlierDay > 31) || (EarlierDay < 1)) {
  473.             printf("Некорректный день запроса! Попробуйте еще раз!");
  474.             bad=1;
  475.         }
  476.         if ((EarlierMonth > 12) || (EarlierMonth < 1))
  477.         {
  478.             printf("\nНекорректный месяц запроса! Попробуйте еще раз!");
  479.             bad=1;
  480.         }
  481.         if (EarlierYear < 0)
  482.         {
  483.             printf("\nНекорректный год запроса! Попробуйте еще раз!");
  484.             bad=1;
  485.         }
  486.     }
  487.     for(i=0;i<NumberOfBuses;i++)
  488.     {
  489.         if(Address->YearLastTO<EarlierYear)
  490.         {
  491.             DataOutputOneElement(Address);
  492.             Address=Address->Next;
  493.             continue;
  494.         }
  495.         else if(Address->YearLastTO>EarlierYear) {
  496.             Address=Address->Next;
  497.             continue;
  498.         }
  499.         if(Address->MonthLastTO<EarlierMonth)
  500.         {
  501.             DataOutputOneElement(Address);
  502.             Address=Address->Next;
  503.             continue;
  504.         }
  505.         else if(Address->MonthLastTO>EarlierMonth) {
  506.             Address=Address->Next;
  507.             continue;
  508.         }
  509.         if(Address->DayLastTO<=EarlierDay)
  510.         {
  511.             DataOutputOneElement(Address);
  512.             Address=Address->Next;
  513.         }
  514.         else
  515.         {
  516.             Address = Address->Next;
  517.         }
  518.     }
  519. }
  520.  
  521. void DataOutputOneElement(struct BusPark *Address) {
  522.     printf("\nАвтобус №%d", Address->ID);
  523.     printf("\nМодель автобуса: %s", Address->Model);
  524.     printf("\nФИО водителя: %s %s %s", Address->FirstName, Address->LastName,Address->Patronymic);
  525.     printf("\nБалансовая стоимость: %5.2f", Address->CarryingAmount);
  526.     printf("\nДата последнего технического обслуживания (В формате ДД.ММ.ГГГГ): %d.%d.%d", Address->DayLastTO,Address->MonthLastTO,Address->YearLastTO);
  527.     printf("\nНомер маршрута: %d", Address->RouteNumber);
  528. }
  529.  
  530. void DriverWithMinimalCarryingAmount(){
  531.     int i;
  532.     struct BusPark *Address;
  533.     float MinimalCarryingAmount;
  534.     Address=List.Head;
  535.     MinimalCarryingAmount=Address->CarryingAmount;
  536.     for(i=0;i<NumberOfBuses;i++)
  537.     {
  538.         if(Address->CarryingAmount<MinimalCarryingAmount)
  539.             MinimalCarryingAmount=Address->CarryingAmount;
  540.         Address=Address->Next;
  541.     }
  542.     Address=List.Head;
  543.     for(i=0;i<NumberOfBuses;i++)
  544.     {
  545.         if(Address->CarryingAmount==MinimalCarryingAmount)
  546.         {
  547.             printf("Водитель с наименьшей балансовой стоимостью: %s %s %s\n",Address->FirstName, Address->LastName,Address->Patronymic);
  548.         }
  549.         Address=Address->Next;
  550.     }
  551. }
  552.  
  553. void ListBusBeginsWithLetter()
  554. {
  555.     int i;
  556.     char BeginLetter;
  557.     struct BusPark *Address;
  558.     Address=List.Head;
  559.     printf("\nВведите букву для поиска: ");
  560.     scanf(" %c",&BeginLetter);
  561.     printf("Модели автобусов начинающихся на данную букву: ");
  562.     for(i=0;i<NumberOfBuses;i++)
  563.     {
  564.         if((Address->Model[0]==BeginLetter)||(Address->Model[0]==BeginLetter-32))
  565.         {
  566.             printf("\n%s",Address->Model);
  567.         }
  568.         Address=Address->Next;
  569.     }
  570. }
  571.  
  572. void TransferPtr(struct BusPark *LeftElement,struct BusPark *RightElement)
  573. {
  574.     if(LeftElement==List.Head)
  575.     {
  576.         List.Head=RightElement;
  577.         LeftElement->Next=RightElement->Next;
  578.         RightElement->Previous=LeftElement->Previous;
  579.         RightElement->Next=LeftElement;
  580.         LeftElement->Previous=RightElement;
  581.     }
  582.     else if(RightElement==List.Tail)
  583.     {
  584.         List.Tail=LeftElement;
  585.         LeftElement->Next=RightElement->Next;
  586.         RightElement->Previous=LeftElement->Previous;
  587.         RightElement->Next=LeftElement;
  588.         LeftElement->Previous=RightElement;
  589.     }
  590.     else
  591.     {
  592.         LeftElement->Next=RightElement->Next;
  593.         RightElement->Previous=LeftElement->Previous;
  594.         RightElement->Next=LeftElement;
  595.         LeftElement->Previous=RightElement;
  596.     }
  597. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement