Advertisement
S1L1R

record

Feb 4th, 2021 (edited)
1,195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 3.09 KB | None | 0 0
  1. uses o_data;
  2.  
  3. /// Date to string
  4. function s_date(a, b, c: integer): string := a.tostring + '.' + b.tostring + '.' + c.tostring;
  5.  
  6. /// Drawing table
  7. procedure draw_default_table(n: integer; var input: o_data.vec; title: string; sort: boolean := false);
  8.   const msg: array of string = (
  9.           '+----------------------------------+-------------------+--------+', { 34, 19, 8}
  10.           '|               ФИО                | Дата производства | кол-во |',
  11.           '|'
  12.         );  
  13. begin
  14.   ///Sorting
  15.   if sort then
  16.     for var i := n-1 downto 1 do
  17.       for var j := 1 to i do
  18.         if input[j].Date.month > input[j+1].Date.month then
  19.            (input[j], input[j+1]) := (input[j+1], input[j]);    
  20.  
  21.   /// Title
  22.   writeln(' '*(msg[0].length div 2 - title.length div 2) + title);
  23.  
  24.   /// Head
  25.   println($'{msg[0]}{#13}{msg[1]}{#13}{msg[0]}');
  26.  
  27.   /// Body
  28.   for var i := 0 to n-1 do
  29.   begin
  30.     writeln(msg[2], (i+1).ToString:3, msg[2], ' ' + input[i+1].name + ' ' * (29 - input[i+1].name.length), msg[2], s_date(input[i+1].date.day, input[i+1].date.month, input[i+1].date.year):19, msg[2],input[i+1].amount:8, msg[2]);
  31.     writeln(msg[0]);
  32.   end;
  33. end;
  34.  
  35. /// Drawing table
  36. procedure draw_main_table(n: integer; input: o_data.vec; title: string);
  37.   const msg: array of string = (
  38.           '+---------+--------------------+--------------+', { 9, 20, 14}
  39.           '| Квартал | Количество деталей | Удельный вес |',
  40.           '|',
  41.           '1', '2', '3', '4', 'Итог:'
  42.         );
  43. begin
  44.   /// Arrays
  45.   var (_weight, d_count) := (new real[6], new integer[6]);
  46.  
  47.   /// Sorting method
  48.   var idx := 0;
  49.   for var i := 1 to n do
  50.   begin
  51.     idx := input[i].date.month in 1..3 ? 1 : input[i].date.month in 4..6 ? 2 : input[i].date.month in 7..9 ? 3 : input[i].date.month in 10..12 ? 4 : 0;
  52.    
  53.     d_count[idx] += input[i].amount;
  54.     _weight[idx] += 1;
  55.   end;
  56.  
  57.   /// Final results
  58.   for var i := 1 to 4 do
  59.   begin
  60.     d_count[5] += d_count[i];
  61.     _weight[5] += _weight[i];
  62.   end;
  63.  
  64.   /// Title
  65.   writeln(' '*(msg[0].length div 2 - title.length div 2) + title);
  66.  
  67.   /// Head
  68.   println($'{msg[0]}{#13}{msg[1]}{#13}{msg[0]}');
  69.  
  70.   /// Body
  71.   for var i := 1 to 5 do
  72.   begin
  73.     writeln(msg[2], msg[i+2] + ' ' * (9 - msg[i+2].ToString.length), msg[2], d_count[i]:20, msg[2], _weight[i]:14, msg[2]);
  74.     writeln(msg[0]);
  75.   end;
  76. end;
  77.  
  78. begin
  79.   var list_size := readinteger('list_size:');
  80.   var input := fill_data;
  81.    
  82.   if (list_size >= 10) and (list_size <= o_data.o_n) then
  83.   begin
  84.     /// rendering table w/o changes
  85.     draw_default_table(list_size, input, 'Unsorted table');
  86.    
  87.     /// rendering sorted table
  88.     draw_default_table(list_size, input, 'Sorted table', true);
  89.    
  90.     /// rendering main table
  91.     draw_main_table(list_size, input, 'Main table');
  92.   end
  93.   else
  94.     if list_size < 10 then
  95.        print('Error: list_size меньше 10.')
  96.     else
  97.       if list_size > o_data.o_n then
  98.         print('Error: list_size больше, чем размер базы данных.');
  99. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement