Advertisement
LittleMax

Untitled

Jun 9th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.32 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <sstream>
  4. #include <string>
  5. #include <vector>
  6. #include <algorithm>
  7.  
  8. using namespace std;
  9. //Структура для даты
  10. struct date {
  11.     int day;
  12.     int month;
  13.     int year;
  14.  
  15.     date() {}
  16.     date(int d, int m, int year)
  17.     {
  18.         this->day = d;
  19.         this->month = m;
  20.         this->year = year;
  21.     }
  22. };
  23.  
  24. //Структура для машины
  25. struct Car {
  26.     string brand;
  27.     string surname;
  28.     string name;
  29.     date dt;
  30.     int power;
  31.     int mileage;
  32.  
  33.     Car(string brand, string surname, string name, int pow, int mil, date d)
  34.     {
  35.         this->brand = brand;
  36.         this->surname = surname;
  37.         this->name = name;
  38.         this->power = pow;
  39.         this->mileage = mil;
  40.         this->dt = d;
  41.     }
  42. };
  43.  
  44. //Структура для Linked list
  45. struct Link {
  46.     Link* prev;
  47.     Link* next;
  48.     Car* car;
  49.  
  50.     Link(Car* car, Link* prev = NULL, Link* next = NULL)
  51.     {
  52.         this->prev = prev;
  53.         this->next = next;
  54.         this->car = car;
  55.     }
  56. };
  57.  
  58. //Функция для нахождения названий машин у которых пробег больше указанного
  59. void findMileage(Link* curr, int mil)
  60. {
  61.     while (curr->prev != NULL)
  62.     {
  63.         curr = curr->prev;
  64.     }
  65.  
  66.     vector<string> name;
  67.  
  68.     while (curr != NULL)
  69.     {
  70.         if (curr->car->mileage > mil)
  71.         {
  72.             name.push_back(curr->car->surname);
  73.         }
  74.         curr = curr->next;
  75.     }
  76.  
  77.     sort(name.begin(), name.end());
  78.  
  79.     for (auto i : name)
  80.         cout << i << "\t";
  81.     cout << endl;
  82. }
  83.  
  84. //Функция для нахождения по бренду машины
  85. void findBrand(Link* curr, string brand)
  86. {
  87.     while (curr->prev != NULL)
  88.     {
  89.         if (curr->car->brand == brand)
  90.         {
  91.             cout << curr->car->name << "   " << curr->car->surname << endl;
  92.         }
  93.  
  94.         curr = curr->prev;
  95.     }
  96. }
  97.  
  98. //Функция для нахождения машин с истекшим ТО
  99. void findOldCars(Link* c, int day, int month, int year)
  100. {
  101.     while (c->prev != NULL)
  102.     {
  103.         c = c->prev;
  104.     }
  105.  
  106.     vector<string> owners;
  107.     while (c != NULL)
  108.     {
  109.         if ((abs(c->car->dt.year - year) >= 1 && abs(c->car->dt.month - month) >= 6) || abs(c->car->dt.year - year) >= 2)
  110.         {
  111.             owners.push_back(c->car->surname);
  112.         }
  113.         c = c->next;
  114.     }
  115.  
  116.     for (string i : owners)
  117.         cout << i << endl;
  118. }
  119.  
  120. //Функция для добавления машин в список с клавиатур
  121. Link* add(Link* current)
  122. {
  123.     date dt;
  124.     string brand;
  125.     string surname;
  126.     string name;
  127.     int power = 0;
  128.     int mileage = 0;
  129.  
  130.     cout << "Enter a brand, owner's surname, owner's name, car's powers, mileage and last date of maintenance(day month year)" << endl;
  131.     cin >> brand >> surname >> name >> power >> mileage >> dt.day >> dt.month >> dt.year;
  132.  
  133.  
  134.     Link* n = new Link(new Car(brand, surname, name, power, mileage, dt), current);
  135.     current->next = n;
  136.  
  137.     return n;
  138. }
  139.  
  140. //Функция для добавления машин из файла
  141. Link* addFromFile(Link* current)
  142. {
  143.     string brand;
  144.     string surname;
  145.     string name;
  146.     int power = 0;
  147.     int mileage = 0;
  148.     date dt;
  149.  
  150.     ifstream is("data.txt");
  151.     ofstream os("temp.txt");
  152.  
  153.     is >> brand >> surname >> name >> power >> mileage >> dt.day >> dt.month >> dt.year;
  154.     is.ignore();
  155.     string line;
  156.     while (getline(is, line))
  157.     {
  158.         os << line << endl;
  159.     }
  160.  
  161.     is.close();
  162.     os.close();
  163.     remove("data.txt");
  164.     rename("temp.txt", "data.txt");
  165.  
  166.     Link* n = new Link(new Car(brand, surname, name, power, mileage, dt), current);
  167.     current->next = n;
  168.  
  169.     return n;
  170. }
  171.  
  172. //Функция для сохранения машин в файл
  173. void save_all(Link* c)
  174. {
  175.     while (c->prev != NULL)
  176.     {
  177.         c = c->prev;
  178.     }
  179.  
  180.     ofstream of("data.txt");
  181.  
  182.     while (c != NULL)
  183.     {
  184.         of << c->car->brand << " " << c->car->surname << " " << c->car->name << " " << c->car->power << " " << c->car->mileage << " " << c->car->dt.day
  185.             << " " << c->car->dt.month << " " << c->car->dt.year << endl;
  186.         c = c->next;
  187.     }
  188.     of.close();
  189. }
  190.  
  191. //Функция для отрисовки
  192. void show(Link* c)
  193. {
  194.     while (c->prev != NULL)
  195.     {
  196.         c = c->prev;
  197.     }
  198.  
  199.     cout << endl << endl;
  200.     while (c != NULL)
  201.     {
  202.         cout << "___________________________________" << endl;
  203.         cout << "Name: " << c->car->name << " " << c->car->surname << endl;
  204.         cout << "Brand: " << c->car->brand << " Mileage: " << c->car->mileage << " Power: " << c->car->power << endl;
  205.         cout << "The date of the last maintenance: " << c->car->dt.day << " " << c->car->dt.month << " " << c->car->dt.year << endl;
  206.         cout << "___________________________________" << endl;
  207.  
  208.         c = c->next;
  209.     }
  210. }
  211.  
  212. //Алгоритм сортировки пузырьком
  213. void bubbleSort(Link *start)
  214. {
  215.     int swapped, i;
  216.     Link *ptr1;
  217.     Link *lptr = NULL;
  218.  
  219.     while (start->prev != NULL)
  220.     {
  221.         start = start->prev;
  222.     }
  223.  
  224.     do
  225.     {
  226.         swapped = 0;
  227.         ptr1 = start;
  228.  
  229.         while (ptr1->next != lptr)
  230.         {
  231.             if (ptr1->car->mileage > ptr1->next->car->mileage)
  232.             {
  233.                 swap(ptr1, ptr1);
  234.                 swapped = 1;
  235.             }
  236.             ptr1 = ptr1->next;
  237.         }
  238.         lptr = ptr1;
  239.     } while (swapped);
  240. }
  241.  
  242. //Функция для удаления элемента из массива
  243. Link* erase(Link* p)
  244. {
  245.     if (p == nullptr) return nullptr;
  246.     if (p->next != NULL)
  247.     {
  248.         p->next->prev = p->prev;
  249.  
  250.     }
  251.     else
  252.     {
  253.         p->prev->next = NULL;
  254.     }
  255.     if (p->prev != NULL)
  256.     {
  257.         p->prev->next = p->next;
  258.         p->next->prev = p->prev;
  259.     }
  260.     else
  261.     {
  262.         p->next->prev = NULL;
  263.     }
  264.     return p->next;
  265. }
  266.  
  267. //Функция для удаления машин у которых мощностью меньше указанной
  268. void deleteByPower(Link* c, int power)
  269. {
  270.     while (c->prev != NULL)
  271.         c = c->prev;
  272.  
  273.     while (c->next != NULL)
  274.     {
  275.         if (c->car->power < power)
  276.         {
  277.             c = erase(c);
  278.         }
  279.         else
  280.         {
  281.             c = c->next;
  282.         }
  283.     }
  284. }
  285.  
  286. int main()
  287. {
  288.     date c;
  289.     c.day = 20;
  290.     c.month = 3;
  291.     c.year = 2019;
  292.     int i = 0;
  293.     Link* cars = new Link(new Car("BMW", "Kravchuk", "Oleg", 100, 4, c));
  294.     cout << "How many people do you want to add from file?" << endl;//Выбираем сколько студентов будет в списке
  295.     cin >> i;
  296.     for (int j = 0; j < i; j++)
  297.     {
  298.         cars = addFromFile(cars);//Впервый раз вводим с клавы(add(cars)). Если есть на файле грузим оттуда(addFromFile(cars))
  299.     }
  300.  
  301.     //cout << "Old cars "<< endl;
  302.     findOldCars(cars, 20, 1, 2018);
  303.     //bubbleSort(cars);//Сортировка по заданию
  304.     //deleteByPower(cars, 311);
  305.     show(cars);
  306.  
  307.     save_all(cars);
  308.  
  309.     return 0;
  310. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement