Advertisement
stupid_pro

Task1, final

Dec 12th, 2023 (edited)
1,428
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 26.63 KB | None | 0 0
  1. program t1;
  2.  
  3. uses Math;
  4.  
  5. type vector = array[integer] of char;
  6.  
  7. const N = 15;
  8. const MAXDOUBLE = 1.7e308;
  9. const MINDOUBLE = 5.0e-324;
  10.  
  11. var cntr_real_part: integer;
  12.     arr_chars_cant_be_first: vector;
  13.     arr_add: char;
  14.     arr: vector;
  15.  
  16.     {flag для подсчёта char, образующих символ}
  17.     flag_for_char: boolean;
  18.  
  19.     trash: integer;
  20.  
  21.     {input_base - сс числа, вводоимого пользователем}
  22.     code, base, i, curr_base, curr_digit: integer;
  23.  
  24.     sign, s: char;
  25.  
  26.     {flag для сс}
  27.     flag_base: boolean;
  28.  
  29.     total_result, epsilon: double;
  30.     digit_cntr: integer;
  31.  
  32.     {наше вещественное число}
  33.     num, num_part_real: double;
  34.  
  35.     {знак числа, которое вводится через коммандную строку}
  36.     intenal_sign: char;    
  37.  
  38.     digits_for_e: integer;
  39.  
  40.     {флаг для проверки слова 'finish'}
  41.     flag_for_finish: boolean = False;
  42.  
  43.     {флаг для того, чтоб понять какой знак у total total_result}
  44.     flag_for_total_result: boolean;
  45.  
  46.     flag_for_comments: boolean = False;
  47.  
  48.     {first_it - для того, чтобы проверить количество пробелов на первом цикле}
  49.     count_prog_iteration, first_it: integer;
  50.  
  51.     flag_for_integer_part: boolean = False;
  52.  
  53.     {проверка на количество char-ов в digit-е}
  54.     flag_for_float_part: boolean = False;
  55.  
  56.     {проверка деления на нуль}
  57.     flag_del_zero: boolean = False;
  58.  
  59.     {флаг для того, если первый символ строки не ялвяется знаком}
  60.     flag_for_inappopriate_digit_in_input: boolean = False;
  61.  
  62.     flag_for_oveflow: boolean = False;
  63.     flag_eoln: boolean = False;
  64.     flag_for_space: boolean = False;
  65.     flag_internal_tabs_for_ns: boolean = False;
  66.     flag_alot_null: boolean = True;
  67.  
  68. procedure Case_comment();
  69. var c: char;
  70. begin
  71.     repeat
  72.         read(c);
  73.     until (EOLn)
  74. end;
  75.  
  76. {
  77.     функция, которая будет контролировать самый(!!!) первый char в строке
  78.     на соответствие требованиям
  79. }
  80. function For_first_digit(first_char: char): boolean;
  81. var arr_chars_cant_be_first: vector;
  82.     arr_add: char;
  83.     i: integer;
  84.     flag: boolean;
  85. begin
  86.     arr_add := '0';
  87.     flag := False;
  88.  
  89.     for i := 1 to 10 do
  90.     begin
  91.         arr_chars_cant_be_first[i] := arr_add;
  92.         arr_add := succ(arr_add);
  93.     end;
  94.  
  95.     arr_add := 'a';
  96.  
  97.     for i := 11 to 36 do
  98.     begin  
  99.         if arr_add <> 'f' then
  100.             arr_chars_cant_be_first[i] := arr_add;
  101.         arr_add := succ(arr_add);
  102.     end;
  103.  
  104.     for i := 1 to 36 do
  105.     begin
  106.         if arr_chars_cant_be_first[i] = first_char then
  107.         begin
  108.             flag := True;
  109.             break;
  110.         end;
  111.     end;
  112.  
  113.     For_first_digit := flag;
  114. end;
  115.  
  116. function Double_to_int(number: double): integer;
  117. var i: integer;
  118. begin
  119.     if abs(number - 0) < 0.1 then
  120.         Double_to_int := 0
  121.     else
  122.     begin
  123.         for i := 1 to 256 do
  124.         begin
  125.             if abs(number - i) < 0.1 then
  126.             begin
  127.                 Double_to_int := i;
  128.                 break;
  129.             end;
  130.         end;
  131.     end;
  132. end;
  133.  
  134. {перевод из 10-й в 16-юю сс}
  135. procedure From_any_to_hex(number: integer);
  136. type vector = array[integer] of char;
  137. var ch1, ch2: integer;
  138.         mas_of_dec_to_hex: vector;
  139.         piece: char;
  140.         i: integer;
  141.     char_ch1, char_ch2: char;
  142. begin
  143.     piece := '1';
  144.  
  145.     for i := 1 to 9 do
  146.     begin
  147.         mas_of_dec_to_hex[i] := piece;
  148.         piece := succ(piece);
  149.     end;
  150.  
  151.     piece := 'a';
  152.  
  153.     for i := 10 to 15 do
  154.     begin
  155.         mas_of_dec_to_hex[i] := piece;
  156.         piece := succ(piece);
  157.     end;
  158.  
  159.     if number = 0 then
  160.         write('00', ' ');
  161.     if (1 <= number) and (number <= 15) then
  162.         write('0', mas_of_dec_to_hex[number], ' ');
  163.     if number > 15 then
  164.     begin
  165.         ch1 := number mod 16;
  166.         char_ch1 := mas_of_dec_to_hex[ch1];
  167.         if ch1 = 0 then
  168.             char_ch1 := '0';
  169.         number := number div 16;
  170.         ch2 := number mod 16;
  171.         char_ch2 := mas_of_dec_to_hex[ch2];
  172.         if ch2 = 0 then char_ch2 := '0';
  173.         write(char_ch2, char_ch1, ' ');
  174.     end;
  175. end;
  176.  
  177. {подсчёт количество цифр при переводе(точность)}
  178. function E_count_digit(b: integer; eps: double): integer;
  179.     var r: double;
  180. begin
  181.     r := Ln(1 / eps) / Ln(b);
  182.     E_count_digit := trunc(r) + 1;
  183. end;
  184.  
  185. {ставит пробелы при выводе}
  186. procedure Space_bar(s: integer);
  187.     var cntr, i: integer;
  188. begin
  189. cntr := 0;
  190.     repeat
  191.         s := s div 10;
  192.         cntr := cntr + 1;
  193.     until(s = 0);
  194.     for i := 1 to (6 - cntr) do
  195.         write(' ');
  196. end;
  197.  
  198.  
  199. function Char_to_digit(a: vector; key: char; piece: integer): integer;
  200.     var i: integer;
  201. begin
  202.     if key = '0' then
  203.         Char_to_digit := 0
  204.     else
  205.     begin
  206.         for i := 1 to 15 do
  207.         begin
  208.             if a[i] = key then
  209.             begin
  210.                 Char_to_digit := i
  211.             end;
  212.         end;
  213.     end;
  214. end;
  215.  
  216. {возведение в степень}
  217. function Pow(n: integer; degree: integer): double;
  218.     var i: integer;
  219.         ans: double;
  220. begin
  221.     ans := 1;
  222.     for i := 1 to degree do
  223.         ans := ans * n;
  224.     Pow := ans;
  225. end;
  226.  
  227.  {
  228.     процедура вывода, с переводом числа
  229.     accuracy - точность для вещ части, b - основание СС
  230. }
  231. procedure Output_with_conversion(accuracy, b: integer; num: double);
  232.     var del_cntr, i: integer;
  233.         float_part, temporary_float_part, digit: double;
  234.         temporary_int_part, n, copy: double;
  235.         int_digit, int_tmp_int_part: integer;
  236.  
  237. begin  
  238.     del_cntr := 0;
  239.  
  240. {нашли целую часть нашего числа}
  241.     n := int(num);
  242.  
  243. {дробная часть нашего числа}
  244.     float_part := num - n;
  245.  
  246. {подсчёт количества делений числа на СС}
  247.     copy := n;
  248.     repeat
  249.         copy := copy / b;
  250.         copy := int(copy);
  251.         del_cntr := del_cntr + 1;
  252.     until(copy - 0.001 <= 0);
  253.  
  254.     copy := n;
  255.  
  256.     del_cntr := del_cntr - 1;
  257.  
  258.     repeat
  259.         digit := copy / (Pow(b, del_cntr));
  260.         digit := int(digit);
  261.         int_digit := Double_to_int(digit);
  262.         From_any_to_hex(int_digit);
  263.         copy := copy - int_digit * Pow(b, del_cntr);
  264.         del_cntr := del_cntr - 1;
  265.     until(del_cntr = -1);  
  266.  
  267.     write('. ');
  268.    
  269.     for i := 1 to accuracy do
  270.     begin
  271.         temporary_float_part := float_part * b;
  272.         temporary_int_part := int(temporary_float_part);
  273.         int_tmp_int_part := Double_to_int(temporary_int_part);
  274.         From_any_to_hex(int_tmp_int_part);
  275.         float_part := frac(temporary_float_part);
  276.     end;
  277.    
  278. end;
  279.  
  280. function Finish_invoke(): boolean;
  281. var c: char;
  282.     i: integer;
  283.     flag: boolean = True;
  284. begin
  285.     for i := 1 to 6 do
  286.     begin
  287.         read(c);
  288.         if (i = 1) and (c <> 'i') then
  289.         begin
  290.             flag := False;
  291.             break;
  292.         end
  293.         else if (i = 2) and (c <> 'n') then
  294.         begin
  295.             flag := False;
  296.             break;
  297.         end
  298.         else if (i = 3) and (c <> 'i') then
  299.         begin
  300.             flag := False;
  301.             break;
  302.         end
  303.         else if (i = 4) and (c <> 's') then
  304.         begin
  305.             flag := False;
  306.             break;
  307.         end
  308.         else if (i = 5) and (c <> 'h') then
  309.         begin
  310.             flag := False;
  311.             break;
  312.         end
  313.     end;
  314.     finish_invoke := flag;
  315. end;
  316.  
  317. begin
  318.  
  319.     SetExceptionMask(GetExceptionMask + [exOverflow,exZeroDivide,exInvalidOp]);
  320.    
  321.     total_result := 0.0;
  322.     count_prog_iteration := 0;
  323.     flag_for_char := False;
  324.     flag_for_comments := False;
  325.     flag_base := False;
  326.     digit_cntr := 0;
  327.     cntr_real_part := 0;
  328.     num_part_real := 0;
  329.     flag_for_inappopriate_digit_in_input := False;
  330.  
  331.     first_it := 0;
  332.  
  333.     {заполнение массива arr, чтобы получить значение char в 10-й СС}
  334.     arr_add := '1';
  335.     for i := 1 to 9 do
  336.     begin
  337.         arr[i] := arr_add;
  338.         arr_add := succ(arr_add);
  339.     end;
  340.     arr_add := 'a';
  341.     for i := 10 to 15 do
  342.     begin
  343.         arr[i] := arr_add;
  344.         arr_add := succ(arr_add);
  345.     end;
  346.  
  347.     if ParamCount < 2 then
  348.     begin
  349.         writeln('Неправильные параметры входной строки');
  350.         Halt(0);
  351.     end;
  352.  
  353.     {преобразование эпсилон в real}
  354.     val(ParamStr(1), epsilon, code);
  355.  
  356.     if (epsilon > 1) or (epsilon <= 0) then
  357.     begin
  358.         writeln('Неправильные параметры входной строки');
  359.         Halt(0);
  360.     end;
  361.  
  362.     {проверка введённых СС}
  363.     for i := 2 to ParamCount do
  364.     begin
  365.         val(ParamStr(i), base, code);
  366.          if (base >= 257) or (base <= 1) then
  367.          begin
  368.            writeln('Ошибка');
  369.            Halt(0);
  370.          end;
  371.     end;
  372.  
  373.     while (not EOF) do
  374.     begin
  375.        
  376.         intenal_sign := '+';
  377.  
  378.         {определяем, какой знак получаем на вход}
  379.         repeat
  380.             if EOLn then
  381.             begin
  382.                 flag_eoln := True;
  383.                 break;
  384.             end;
  385.  
  386.             read(s);
  387.  
  388.             if s = 'f' then
  389.             begin
  390.                 if Finish_invoke() then flag_for_finish := True
  391.                 else flag_for_inappopriate_digit_in_input := True;
  392.                 break;
  393.             end;
  394.  
  395.             if (s <> 'f') and (s <> ';') and (s <> '+') and (s <> '-')
  396.                 and (s <> '*') and (s <> '/') and (s <> ' ') then
  397.             begin
  398.                 flag_for_inappopriate_digit_in_input := True;
  399.                 break;
  400.             end;
  401.            
  402.             if (s = ';') then
  403.             begin
  404.                 flag_for_comments := True;
  405.                 break;
  406.             end;
  407.  
  408.             if (For_first_digit(s)) and (s <> ';') then
  409.             begin
  410.                 flag_for_inappopriate_digit_in_input := True;
  411.                 break;
  412.             end;
  413.  
  414.         until ((s = '+') or (s = '-') or (s = '*') or (s = '/'));
  415.        
  416.         {если флаг остановки поднят, то выходим из цикла}
  417.         if (flag_for_finish) and (count_prog_iteration = 0) then
  418.         begin
  419.             writeln('Программа не выполнена ни разу: строка начинается со слова ''finish''');
  420.             break;
  421.         end;
  422.        
  423.         {если флаг неправильного первого знака поднят, ломаем программу}
  424.         if (flag_for_inappopriate_digit_in_input)
  425.                 and (count_prog_iteration = 0) then
  426.         begin
  427.             writeln('Программа не выполнена ни разу, так как строка начинается не с арифметического знака');
  428.             break;
  429.         end;
  430.  
  431.         if (flag_for_inappopriate_digit_in_input)
  432.                 and (count_prog_iteration <> 0) then
  433.         begin
  434.             writeln('Ошибка: строка начинается не с арифметического знака');
  435.             flag_for_inappopriate_digit_in_input := False;
  436.             break;
  437.         end;
  438.  
  439.         if (flag_for_comments and EOLn) then
  440.         begin
  441.             flag_eoln := True;
  442.             flag_for_comments := False;
  443.         end;
  444.        
  445.         if flag_for_finish then
  446.             break;
  447.  
  448.         if (not flag_for_comments) then
  449.             sign := s;
  450.  
  451.         {считывание значения сс}
  452.         repeat
  453.             if EOLn then
  454.             begin
  455.                 flag_eoln := True;
  456.                 break;
  457.             end;
  458.            
  459.             if flag_eoln then
  460.                 break;
  461.  
  462.             if flag_for_comments then
  463.             begin
  464.                 break;
  465.             end;
  466.  
  467.             read(s);
  468.            
  469.             first_it := first_it + 1;
  470.  
  471.             if flag_base and (s = #32) then
  472.                 flag_internal_tabs_for_ns := True; //проверка на пробелы после СС
  473.  
  474.             if flag_base and flag_internal_tabs_for_ns
  475.                 and (s <> #32) and (s <> ':') then
  476.             begin
  477.                 flag_for_inappopriate_digit_in_input := True;
  478.                 break;
  479.             end;
  480.  
  481.             if (s <> ';') and (not(s in ['0'..'9']))
  482.                  and (s <> #32) and (s <> ':') then
  483.             begin
  484.                 flag_for_inappopriate_digit_in_input := True;
  485.                 break;
  486.             end
  487.             else
  488.                 if (s <> #32) and (first_it = 1) then
  489.                 begin
  490.                     flag_for_space := True;
  491.                     break;
  492.                 end;
  493.  
  494.             if (s = ';') and (count_prog_iteration = 0)  then
  495.             begin
  496.                 writeln('Программа не выполнена ни разу');
  497.                 flag_for_comments := True;
  498.                 Halt(0);  
  499.             end
  500.             else if (s = ';') and (count_prog_iteration <> 0) then
  501.             begin
  502.                 writeln('Ошибка! Невозможно считать число по причине комментариев');
  503.                 flag_for_comments := True;
  504.                 break;
  505.             end;
  506.  
  507.             if s in ['0'..'9'] then
  508.             begin
  509.                     val(s, curr_digit, code);
  510.                     if flag_base then
  511.                         curr_base := curr_base * 10 + curr_digit
  512.             else
  513.                 begin
  514.                     curr_base := curr_digit;
  515.                     flag_base := True;
  516.                 end;
  517.             end;
  518.         until(s = ':');
  519.        
  520.         if (flag_for_comments and EOLn) then
  521.         begin
  522.             flag_eoln := True;
  523.             flag_for_comments := False;
  524.         end;
  525.        
  526.         if flag_for_space then
  527.         begin
  528.             writeln('Нет пробела между арифметическим знаком и системой счисления');
  529.             break;
  530.         end;
  531.  
  532.         if flag_for_inappopriate_digit_in_input
  533.                 and (count_prog_iteration = 0) then
  534.          begin
  535.             writeln('Ошибка! Программа не выполнена ни разу!');
  536.             break;
  537.         end;
  538.  
  539.         if flag_for_inappopriate_digit_in_input
  540.                 and (count_prog_iteration <> 0) then
  541.         begin
  542.             writeln('Ошибка!');
  543.             break;
  544.         end;
  545.  
  546.         if ((curr_base > 256) or (curr_base <= 1)) and
  547.             (not flag_eoln) and (not flag_for_comments) then
  548.         begin
  549.             writeln('Система счисления не удовлетворяет условиям задачи');
  550.             break;
  551.         end;
  552.  
  553.         {считываем число, а именно целую часть}
  554.         repeat
  555.             if EOLn then
  556.             begin
  557.                 flag_eoln := True;
  558.                 break;
  559.             end;
  560.            
  561.             if flag_eoln then
  562.                 break;
  563.  
  564.             if flag_for_comments then
  565.             begin
  566.                 break;
  567.             end;
  568.  
  569.             read(s);
  570.  
  571.             if (s <> '.') and (s <> #32) and (s <> ';') and (s <> '-') and
  572.                 (s <> '+') and (not((s in ['0'..'9']) or (s in ['a'..'f']))) then
  573.             begin
  574.                 flag_for_inappopriate_digit_in_input := True;
  575.                 break;
  576.             end;
  577.  
  578.             if (s = ';') and (count_prog_iteration = 0)
  579.                     and (flag_for_char) then
  580.             begin
  581.                 writeln('Программа не выполнена ни разу');
  582.                 Halt(0);  
  583.             end;
  584.            
  585.             if (s = ';') and (not flag_for_char) then
  586.             begin
  587.                 flag_for_comments := True;
  588.                 break;
  589.             end;
  590.  
  591.             if (s = ';') and (count_prog_iteration <> 0)
  592.                     and (flag_for_char) then
  593.             begin
  594.                 flag_for_comments := True;
  595.                 writeln('Ошибка: неправильно введены цифры числа#');
  596.                 break;
  597.             end;
  598.  
  599.             if s = '-' then
  600.                 intenal_sign := '-';
  601.            
  602.             if ((s in ['1'..'9']) or (s in ['a'..'f'])) then
  603.                 flag_alot_null := False;
  604.  
  605.             if ((s in ['0'..'9']) or (s in ['a'..'f']))
  606.                     and (flag_for_char = False) then
  607.             begin
  608.                 curr_digit := Char_to_digit(arr, s, trash);
  609.                 flag_for_char := True;
  610.                 digit_cntr := digit_cntr + 1;
  611.                 end
  612.             else
  613.             begin
  614.                 if ((s in ['0'..'9']) or (s in ['a'..'f']))
  615.                         and (flag_for_char = True) then
  616.                 begin
  617.                     curr_digit := curr_digit * 16 + Char_to_digit(arr, s, trash);
  618.                     if curr_digit >= curr_base then
  619.                     begin
  620.                         writeln('Ошибка! Полученная цифра не удовлетворяет данной системе счисления');
  621.                         Halt(0);
  622.                     end;
  623.                     {проверка num - числа на переполнение}
  624.                     if ((num * curr_base) + curr_digit) > MAXDOUBLE then
  625.                     begin
  626.                         writeln('Ошибка! Переполнение!');
  627.                         flag_for_oveflow := True;
  628.                         break;
  629.                     end;
  630.                     flag_for_char := False;
  631.                     num := num * curr_base + curr_digit;
  632.                     curr_digit := 0;
  633.                     end;
  634.                 end;
  635.         until(s = '.');
  636.  
  637.         if (flag_for_comments and EOLn) then
  638.         begin
  639.             flag_eoln := True;
  640.             flag_for_comments := False;
  641.         end;
  642.        
  643.         if flag_alot_null then
  644.             num := 0;
  645.  
  646.         if flag_for_oveflow then
  647.             break;
  648.  
  649.         if flag_for_char then
  650.         begin
  651.             if (count_prog_iteration = 0) then
  652.             begin
  653.                 writeln('Ошибка! Нечётное число char, нельзя получить отдельные digits');
  654.                 Halt(0);
  655.             end;
  656.         end;
  657.  
  658.         if flag_for_inappopriate_digit_in_input then
  659.         begin
  660.             writeln('Ошибка!');
  661.             break;
  662.         end;
  663.  
  664.         {далее считываем число после точки}
  665.         repeat
  666.             if EOLn then
  667.             begin
  668.                 flag_eoln := True;
  669.                 break;
  670.             end;
  671.            
  672.             if flag_eoln then
  673.                 break;
  674.  
  675.             if flag_for_comments then
  676.             begin
  677.                 break;
  678.             end;
  679.  
  680.             read(s);
  681.  
  682.             if ((s <> #32) and (s <> ';') and
  683.                 (not((s in ['0'..'9']) or (s in ['a'..'f'])))) then
  684.             begin
  685.                 flag_for_inappopriate_digit_in_input := True;
  686.                 break;
  687.             end;            
  688.  
  689.             if (s = ';') and (count_prog_iteration = 0)
  690.                     and (flag_for_char) then
  691.             begin
  692.                 writeln('Программа не выполнена ни разу');
  693.                 Halt(0);  
  694.             end;
  695.            
  696.             if (s = ';') and (count_prog_iteration = 0)
  697.                     and (not flag_for_char) then
  698.             begin
  699.                 flag_for_comments := True;
  700.                 break;
  701.             end;
  702.  
  703.             if (s = ';') and (count_prog_iteration <> 0)
  704.                     and (flag_for_char) then
  705.             begin
  706.                 flag_for_comments := True;
  707.                 writeln('Ошибка: неправильно введены цифры числа');
  708.                 flag_for_float_part := True;
  709.                 break;
  710.             end;
  711.  
  712.             if (s = ';') and (count_prog_iteration <> 0)
  713.                     and (not flag_for_char) then
  714.             begin
  715.                 flag_for_comments := True;
  716.                 break;
  717.             end;
  718.            
  719.             if ((s in ['1'..'9']) or (s in ['a'..'f'])) then
  720.                 flag_alot_null := False;
  721.  
  722.             if ((s in ['0'..'9']) or (s in ['a'..'f']))
  723.                     and (flag_for_char = False) then
  724.             begin
  725.                 curr_digit := Char_to_digit(arr, s, trash);
  726.                 flag_for_char := True;
  727.                 end
  728.             else begin
  729.                 if ((s in ['0'..'9']) or (s in ['a'..'f']))
  730.                         and (flag_for_char = True) then
  731.                 begin
  732.                     curr_digit := curr_digit * 16
  733.                                   + Char_to_digit(arr, s, trash);
  734.                     if curr_digit >= curr_base then
  735.                     begin
  736.                         writeln('Ошибка! Полученная цифра не удовлетворяет данной системе счисления');
  737.                         Halt(0);
  738.                     end;
  739.                     cntr_real_part := cntr_real_part + 1;
  740.                     flag_for_char := False;
  741.                    
  742.                     if (Pow(curr_base, cntr_real_part) > MAXDOUBLE)
  743.                             and (not flag_alot_null) then
  744.                     begin
  745.                         writeln('Ошибка! Переполнение!');
  746.                         flag_for_oveflow := True;
  747.                         break;
  748.                     end;
  749.                     if (num_part_real + curr_digit /
  750.                         Pow(curr_base, cntr_real_part) > MAXDOUBLE)
  751.                         and (not flag_alot_null) then
  752.                     begin
  753.                         flag_for_oveflow := True;
  754.                         writeln('Ошибка! Переполнение!');
  755.                         break;
  756.                     end;
  757.                     if flag_alot_null then
  758.                         num_part_real := 0
  759.                     else num_part_real := num_part_real +
  760.                         curr_digit / Pow(curr_base, cntr_real_part);
  761.                     end;
  762.                 end;
  763.         until(EOLn);
  764.  
  765.         if (flag_for_comments and EOLn) then
  766.         begin
  767.             flag_eoln := True;
  768.             flag_for_comments := False;
  769.         end;
  770.        
  771.         if flag_alot_null then
  772.             num_part_real := 0;
  773.  
  774.         if flag_for_float_part
  775.             then break;
  776.  
  777.         if flag_for_oveflow then
  778.             break;      
  779.  
  780.         if (flag_for_char = True) then
  781.         begin
  782.             flag_for_char := False;
  783.             if (count_prog_iteration = 0) then
  784.             begin
  785.                 writeln('Ошибка!');
  786.                 break;
  787.             end;
  788.         end;
  789.  
  790.         if flag_for_inappopriate_digit_in_input then
  791.          begin
  792.             writeln('Ошибка!##');
  793.             break;
  794.         end;
  795.        
  796.         if flag_for_comments then Case_comment();
  797.  
  798.         if num + num_part_real > MAXDOUBLE then
  799.         begin
  800.             writeln('Ошибка! Переполнение!');
  801.             break;
  802.         end
  803.         else num := num + num_part_real;
  804.  
  805.  
  806.         count_prog_iteration := count_prog_iteration + 1;
  807.  
  808.         if intenal_sign = '-' then
  809.             num := num * (-1);  
  810.  
  811.         if sign = '+' then
  812.         begin
  813.             if (total_result + num) > MAXDOUBLE then
  814.             begin
  815.                 flag_for_oveflow := True;
  816.                 writeln('Ошибка! Переполнение!');
  817.                 break;
  818.             end
  819.                 else total_result := total_result + num;
  820.         end;
  821.  
  822.  
  823.         if (sign = '-') then
  824.         begin
  825.             if (total_result - num) < MINDOUBLE then
  826.             begin
  827.                 flag_for_oveflow := True;
  828.                 writeln('Ошибка! Переполнение!');
  829.                 break;
  830.             end
  831.                 else total_result := total_result - num;
  832.         end;
  833.  
  834.         if (sign = '*') then
  835.         begin
  836.               if (total_result * num) > MAXDOUBLE then
  837.               begin
  838.                 flag_for_oveflow := True;
  839.                 writeln('Ошибка! Переполнение!');
  840.                 break;
  841.             end
  842.                 else total_result := total_result * num;
  843.         end;
  844.  
  845.         if (sign = '/') then
  846.         begin
  847.             if (total_result / num < MINDOUBLE)
  848.                     or (total_result / num > MAXDOUBLE)
  849.              or (IsNaN(total_result / num)) then
  850.             begin
  851.                 flag_for_oveflow := True;
  852.                 writeln('Ошибка!');
  853.                 break;
  854.             end
  855.             else if IsInfinite(total_result / num) then
  856.             begin
  857.                     flag_for_oveflow := True;
  858.                     writeln('Ошибка: Деление на ноль. Невозможно совершить операцию.');
  859.                     break;
  860.                 end
  861.             else total_result := total_result / num;
  862.         end;
  863.        
  864.         sign := ' ';
  865.         flag_base := False;
  866.         flag_for_char := False;
  867.         curr_base := 0;
  868.         curr_digit := 0;
  869.         num := 0;
  870.         num_part_real := 0;
  871.         cntr_real_part := 0;
  872.         flag_for_comments := False;
  873.         flag_for_oveflow := False;
  874.         flag_eoln := False;
  875.         flag_for_inappopriate_digit_in_input := False;
  876.         flag_for_space := False;
  877.         first_it := 0;
  878.         flag_internal_tabs_for_ns := False;
  879.         flag_alot_null := True;
  880.         readln();
  881.  
  882.     end;
  883.  
  884.     if total_result < 0 then
  885.     begin
  886.         flag_for_total_result := False;
  887.         total_result := total_result * (-1);
  888.     end
  889.         else flag_for_total_result := True;
  890.  
  891.     {пошёл вывод}
  892.     for i := 2 to ParamCount do
  893.     begin
  894.         val(ParamStr(i), base, code);
  895.         write(base);
  896.         Space_bar(base);
  897.         if flag_for_total_result = False then
  898.             write('-');
  899.         digits_for_e := E_count_digit(base, epsilon);
  900.         Output_with_conversion(digits_for_e, base, total_result);
  901.         writeln;
  902.     end;
  903.  
  904. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement