NickAndNick

Задание на массив структур. Выборка с сортировкой

Jan 7th, 2013
1,515
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2. #include <string>
  3. #include <iomanip>
  4. #include <ctime>
  5.  
  6. using namespace std;
  7.  
  8. struct date {
  9.     int day;
  10.     int month;
  11.     int year;
  12. };
  13.  
  14. struct goods {
  15.     wstring name;
  16.     unsigned quantity;
  17.     float price;
  18.     date dt;
  19. };
  20. typedef goods * PGOODS;
  21.  
  22. void ru();
  23. PGOODS create_list(PGOODS, const size_t);
  24. void show_list(PGOODS, const size_t);
  25. void print_record(PGOODS);
  26. void select_list(PGOODS, const size_t, const int _month = 1, const float _price = 100000.0f);
  27. void sort_list(PGOODS, const size_t, const size_t);
  28. void uswap(goods &, goods &);
  29.  
  30. int main() {
  31.     ru();
  32.     wcout << L" Введите размер списка: ";
  33.     size_t size;
  34.     cin >> size;
  35.    
  36.     PGOODS ptr = NULL;
  37.     if ((ptr = create_list(ptr, size)) != NULL) {
  38.         system("cls");
  39.  
  40.         show_list(ptr, size);
  41.         select_list(ptr, size);
  42.  
  43.         delete[] ptr;
  44.         ptr = NULL;
  45.     }
  46.  
  47.     cin.get(); cin.get();
  48.     return 0;
  49. }
  50.  
  51. PGOODS create_list(PGOODS _goods, const size_t _size) {
  52.     _goods = new goods [_size];
  53.     if (_goods) {
  54.         for (size_t n = 0; n < _size; n++) {
  55.             fflush(stdin);
  56.             wcout << L"\n Введите наименование товара: ";
  57.             getline(wcin, _goods[n].name);
  58.             wcout << L" Введите количество товара: ";
  59.             cin >> _goods[n].quantity;
  60.             wcout << L" Введите цену товара: ";
  61.             cin >> _goods[n].price;
  62.             wcout << L" Введите число поступления товара: ";
  63.             cin >> _goods[n].dt.day;
  64.             wcout << L" Введите месяц поступления товара: ";
  65.             cin >> _goods[n].dt.month;
  66.             wcout << L" Введите год поступления товара: ";
  67.             cin >> _goods[n].dt.year;
  68.         }
  69.     } else wcout << L" Не удалось создать список!\n";
  70.     return _goods;
  71. }
  72.  
  73. void show_list(PGOODS _goods, const size_t _size) {
  74.     if (_goods) {
  75.         PGOODS next = _goods;
  76.         for (size_t n = 0; n < _size; n++) print_record(next++);
  77.     } else wcout << L" Список не существует!\n";
  78.     cout << endl;
  79. }
  80.  
  81. void print_record(PGOODS _goods) {
  82.     streamsize sign = 2, name = 36, quantity = 12, price = 14, date = 4;
  83.     wcout << setw(name) << left << _goods->name;
  84.     cout  << setw(quantity) << right << _goods->quantity
  85.           << setw(price) << fixed << setprecision(sign) << _goods->price;
  86.     cout  << setw(date);
  87.     if (_goods->dt.day < 10) cout << '0';
  88.     cout  << _goods->dt.day << '.';
  89.     if (_goods->dt.month < 10) cout << '0';
  90.     cout  << _goods->dt.month << '.'
  91.           << _goods->dt.year << endl;
  92. }
  93.  
  94. void sort_list(PGOODS _goods, const size_t _beg, const size_t _end) {
  95.     int n = (int)_beg, m = (int)_end;
  96.     goods mid;
  97.     mid.name = _goods[(_beg + _end) >> 1].name;
  98.  
  99.     do {
  100.         while (_goods[n].name  < mid.name  && n < (int)_end) ++n;
  101.         while (_goods[m].name  > mid.name  && m > (int)_beg) --m;
  102.  
  103.         if (n <= m) {
  104.             if (n < m) uswap(_goods[n], _goods[m]);
  105.             ++n;
  106.             --m;
  107.         }
  108.     } while (n <= m);
  109.  
  110.     if ((int)_beg < m) sort_list(_goods, _beg, m);
  111.     if (n < (int)_end) sort_list(_goods, n, _end);
  112. }
  113.  
  114. void uswap(goods & _a, goods & _b) {
  115.     goods temp = _a;
  116.     _a = _b;
  117.     _b = temp;
  118. }
  119.  
  120. void select_list(PGOODS _goods, const size_t _size, const int _month, const float _price) {
  121.     wcout << L"\n\t\t\t\tОтсортированный запрос:\n\n";
  122.     bool empty = true;
  123.  
  124.     if (_goods && _size) {
  125.         const time_t term = _month * 31 * 24 * 60 * 60;
  126.         if (_size > 1) sort_list(_goods, 0, _size - 1);
  127.         time_t t;
  128.         tm * ctm;
  129.  
  130.         for (size_t n = 0; n < _size; n++) {
  131.             tm current = { 0, 0, 0, _goods[n].dt.day, _goods[n].dt.month - 1, _goods[n].dt.year - 1900 };
  132.             time_t beg = mktime(&current);
  133.             time(&t);
  134.             ctm = localtime(&t);
  135.             time_t end = mktime(ctm);
  136.  
  137.             if (end - beg > term && _price < _goods[n].price) {
  138.                 print_record(&_goods[n]);
  139.                 if (empty) empty = false;
  140.             }
  141.         }
  142.     }
  143.  
  144.     if (empty) wcout << L"\n\tДанные отсутствуют!\n";
  145. }
  146.  
  147. void ru() {
  148.     wcout.imbue(locale("rus_rus.866"));
  149.     wcin.imbue(locale("rus_rus.866"));
  150. }
RAW Paste Data