Advertisement
stupid_pro

Prac1(6.11.2023)

Nov 6th, 2023
815
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 16.08 KB | None | 0 0
  1. program t1;
  2.  
  3. uses Math;
  4.  
  5. type vector = array[integer] of char;
  6. const N = 15;
  7. const MAXINT = 32767;
  8. var cntr_real_part: integer;
  9.     arr_add: char;
  10.     arr: vector;
  11.     flag_for_char: boolean; //flag для подсчёта char, образующих символ
  12.     trash: integer;
  13.     code, base, i, curr_base, curr_digit: integer; {input_base - сс числа, вводоимого пользователем}
  14.     sign, s: char;
  15.     flag_base: boolean; //flag для сс;
  16.     total_result, epsilon: double;
  17.     digit_cntr: integer;
  18.     num, num_part_real: double; //наше вещественное число
  19.     intenal_sign: char; //знак числа, которое вводится через коммандную строку      
  20.     digits_for_e: integer;
  21.     flag_for_finish: boolean = False; //флаг для проверки слова 'finish'
  22.     flag_for_total_result: boolean;  // флаг для того, чтоб понять какой знак у total total_result
  23.     flag_for_comments: boolean = False;
  24.     count_prog_iteration: integer;
  25.     flag_for_integer_part: boolean = False;
  26.     flag_for_float_part: boolean = False; //проверка на количество char-ов в digit-е
  27.  
  28. {процедуру, которую мы используем, если встречаем комментарии}
  29. procedure case_comment();
  30. var c: char;
  31. begin
  32.     repeat
  33.         read(c);
  34.     until (EOLn)
  35. end;
  36.  
  37. {перевод из 10-й в 16-юю сс}
  38. procedure from_any_to_hex(number: integer);
  39. type vector = array[integer] of char;
  40. var ch1, ch2: integer;
  41.         mas_of_dec_to_hex: vector;
  42.         piece: char;
  43.         i: integer;
  44.     char_ch1, char_ch2: char;
  45. begin
  46.     piece := '1';
  47.  
  48.     for i := 1 to 9 do begin
  49.         mas_of_dec_to_hex[i] := piece;
  50.         piece := succ(piece);
  51.         end;
  52.  
  53.     piece := 'a';
  54.  
  55.     for i := 10 to 15 do begin
  56.         mas_of_dec_to_hex[i] := piece;
  57.         piece := succ(piece);
  58.     end;
  59.  
  60.     if number = 0 then
  61.         write('00', ' ');
  62.     if (1 <= number) and (number <= 15) then
  63.         write('0', mas_of_dec_to_hex[number], ' ');
  64.     if number > 15 then begin
  65.         ch1 := number mod 16;
  66.         char_ch1 := mas_of_dec_to_hex[ch1];
  67.         if ch1 = 0 then char_ch1 := '0';
  68.         number := number div 16;
  69.         ch2 := number mod 16;
  70.         char_ch2 := mas_of_dec_to_hex[ch2];
  71.         if ch2 = 0 then char_ch2 := '0';
  72.         write(char_ch2, char_ch1, ' ');
  73.     end;
  74. end;
  75.  
  76. {подсчёт количество цифр при переводе(точность)}
  77. function e_count_digit(b: integer; eps: double): integer;
  78.     var r: double;
  79. begin
  80.     r := Ln(1 / eps) / Ln(b);
  81.     e_count_digit := trunc(r) + 1;
  82. end;
  83.  
  84. {ставит пробелы при выводе}
  85. procedure space_bar(s: integer);
  86.     var cntr, i: integer;
  87. begin
  88. cntr := 0;
  89.     repeat
  90.         s := s div 10;
  91.         cntr := cntr + 1;
  92.     until(s = 0);
  93.     for i := 1 to (6 - cntr) do
  94.         write(' ');
  95. end;
  96.  
  97.  
  98. function char_to_digit(a: vector; key: char; piece: integer): integer;
  99.     var i: integer;
  100. begin
  101.     if key = '0' then
  102.         char_to_digit := 0
  103.     else begin
  104.         for i := 1 to 15 do begin
  105.             if a[i] = key then begin
  106.                 char_to_digit := i
  107.             end;
  108.         end;
  109.     end;
  110. end;
  111.  
  112. {возведение в степень}
  113. function pow(n: integer; degree: integer): integer;
  114.     var i, ans: integer;
  115. begin
  116.     ans := 1;
  117.     for i := 1 to degree do
  118.         ans := ans * n;
  119.     pow := ans;
  120. end;
  121.  
  122. {процедура вывода, с переводом числа}
  123. procedure output_with_conversion(accuracy, b: integer; num: double); //accuracy - точность для вещ части, b - основание СС
  124.     var copy, n, del_cntr, i, digit: integer; // del_cntr - количество делений на СС
  125.         float_part, temporary_float_part: double;
  126.         temporary_int_part: integer;
  127.  
  128. begin  
  129.     del_cntr := 0;
  130.     n := trunc(num); // нашли целую часть нашего числа
  131.     float_part := frac(num); //дробная часть нашего числа
  132.     {подсчёт количества делений числа на СС}
  133.     copy := n;
  134.     repeat
  135.         copy := copy div b;
  136.         del_cntr := del_cntr + 1;
  137.     until(copy = 0);
  138.    
  139.     copy := n;
  140.     del_cntr := del_cntr - 1;
  141.  
  142.     repeat
  143.         digit := copy div (pow(b, del_cntr));
  144.         from_any_to_hex(digit);
  145.         copy := copy - digit * pow(b, del_cntr);
  146.         del_cntr := del_cntr - 1;
  147.     until(del_cntr = -1);  
  148.  
  149.     write('. ');
  150.    
  151.     for i := 1 to accuracy do begin
  152.         temporary_float_part := float_part * b;
  153.         temporary_int_part := trunc(temporary_float_part);
  154.         from_any_to_hex(temporary_int_part);
  155.         float_part := frac(temporary_float_part);
  156.     end;
  157.    
  158.    
  159. end;
  160.  
  161. {ТЕЛО ПРОГРАММЫ}
  162.  
  163. begin
  164.     intenal_sign := '+';
  165.     count_prog_iteration := 0;
  166.     flag_for_char := False;
  167.    
  168.     {заполнение массива arr, чтобы получить значение char в 10-й СС}
  169.     arr_add := '1';
  170.  
  171.     for i := 1 to 9 do begin
  172.         arr[i] := arr_add;
  173.         arr_add := succ(arr_add);
  174.         end;
  175.  
  176.     arr_add := 'a';
  177.  
  178.     for i := 10 to 15 do begin
  179.         arr[i] := arr_add;
  180.         arr_add := succ(arr_add);
  181.     end;
  182.  
  183.     flag_base := False;
  184.     curr_base := 0;
  185.     total_result := 0;
  186.     digit_cntr := 0;
  187.     cntr_real_part := 0;
  188.     num_part_real := 0;
  189.  
  190.     if ParamCount < 2 then begin
  191.         writeln('Неправильные параметры входной строки');
  192.         Halt();
  193.     end;
  194.  
  195.     val(ParamStr(1), epsilon, code); {преобразование эпсилон в real}
  196.  
  197.     if (epsilon > 1) or (epsilon < 0) then begin
  198.         writeln('Неправильные параметры входной строки');
  199.         Halt();
  200.     end;
  201.  
  202.     for i := 2 to ParamCount do begin  {проверка введённых СС}
  203.         val(ParamStr(i), base, code);
  204.          if (base >= 257) and (base <= 2) then begin
  205.            writeln('Ошибка');
  206.            Halt();
  207.          end;
  208.         end;
  209.  
  210.     while (not EOF) do begin
  211.  
  212.         {определяем, какой знак получаем на вход}
  213.         repeat
  214.             read(s);
  215.             if (s = ';') and (count_prog_iteration = 0) then begin
  216.                 flag_for_comments := True;
  217.                 writeln('Ошибка! Неверные входные данные');
  218.                 writeln(total_result);
  219.                 Halt();
  220.             end;
  221.  
  222.             if (s = ';') and (count_prog_iteration <> 0) then begin
  223.                 flag_for_comments := True;
  224.                 break;
  225.             end;
  226.  
  227.             if s = 'f' then begin
  228.                 flag_for_finish := True;
  229.                 break;
  230.             end;
  231.  
  232.         until ((s = '+') or (s = '-') or (s = '*') or (s = '/'));
  233.  
  234.         {если флаг остановки поднят, то выходим из цикла}
  235.         if (flag_for_finish) and (count_prog_iteration = 0) then begin
  236.             writeln('Программа не выполнена ни разу');
  237.             writeln(total_result);
  238.             Halt();
  239.         end;
  240.        
  241.         if (flag_for_finish = True) then break;
  242.  
  243.         if not flag_for_comments then sign := s;
  244.  
  245.         {считывание значения сс}
  246.         repeat
  247.  
  248.             if flag_for_comments then begin
  249.                 break;
  250.             end;
  251.  
  252.             read(s);
  253.  
  254.             if (s = ';') and (count_prog_iteration = 0)  then begin
  255.                 writeln('Программа не выполнена ни разу');
  256.                 flag_for_comments := True;
  257.                 Halt();  
  258.             end
  259.             else if (s = ';') and (count_prog_iteration <> 0) then begin
  260.                 flag_for_comments := True;
  261.                 break;
  262.             end;
  263.  
  264.             if s in ['0'..'9'] then begin
  265.                     val(s, curr_digit, code);
  266.                     if flag_base then
  267.                         curr_base := curr_base * 10 + curr_digit
  268.             else
  269.                 begin
  270.                     curr_base := curr_digit;
  271.                     flag_base := True;
  272.                 end;
  273.             end;
  274.         until(s = ':');
  275.  
  276.         {считываем число, а именно целую часть}
  277.         repeat
  278.             if flag_for_comments then begin
  279.                 break;
  280.             end;
  281.  
  282.             read(s);
  283.  
  284.             if (s = ';') and (count_prog_iteration = 0) and (flag_for_char) then begin
  285.                 writeln('Программа не выполнена ни разу');
  286.                 writeln(total_result);
  287.                 Halt();  
  288.             end;
  289.            
  290.             if (s = ';') and (count_prog_iteration = 0) and (not flag_for_char) then begin
  291.                 flag_for_comments := True;
  292.                 break;
  293.             end;
  294.  
  295.             if (s = ';') and (count_prog_iteration <> 0) and (not flag_for_char) then begin
  296.                 flag_for_comments := True;
  297.                 break;
  298.             end;
  299.  
  300.             if (s = ';') and (not flag_for_char) then begin
  301.                 flag_for_comments := True;
  302.                 writeln('Ошибка: неправильно введены цифры числа');
  303.                 flag_for_integer_part := True;
  304.                 break;
  305.             end;
  306.  
  307.             if s = '-' then
  308.                 intenal_sign := '-';
  309.                
  310.             if ((s in ['0'..'9']) or (s in ['a'..'f'])) and (flag_for_char = False) then begin
  311.                 curr_digit := char_to_digit(arr, s, trash);
  312.                 flag_for_char := True;
  313.                 digit_cntr := digit_cntr + 1;
  314.                 end
  315.             else begin
  316.                 if ((s in ['0'..'9']) or (s in ['a'..'f'])) and (flag_for_char = True) then begin
  317.                     curr_digit := curr_digit * 16 + char_to_digit(arr, s, trash);
  318.                     if curr_digit >= curr_base then begin
  319.                         writeln('Ошибка! Полученная цифра не удовлетворяет данной системе счисления');
  320.                         Halt();
  321.                     end;
  322.                     flag_for_char := False;
  323.                     num := num * curr_base + curr_digit;
  324.                     curr_digit := 0;
  325.                     end;
  326.                 end;
  327.         until(s = '.');
  328.  
  329.         {если у нас было введено более одного числа, и оно из-за комментраиев неверно,
  330.         то мы прерываем программу и выводим total_result, который удалось получить}
  331.         if flag_for_integer_part then break;
  332.  
  333.         {проверка на ошибки: нечётное количество char-ов
  334.         если у нас 0-я итерация, т.е первая строчка вводимых данных, то выводим ошибку, иначе завершаем программу}
  335.         if (flag_for_char = True) then begin
  336.             num := 0;
  337.             flag_for_char := False;
  338.             if (count_prog_iteration = 0) then begin
  339.                 writeln('Ошибка! Нечётное число char, нельзя получить отдельные digits');
  340.                 writeln(total_result);
  341.                 Halt();
  342.             end
  343.             else break;
  344.         end;
  345.  
  346.         {далее считываем число после точки}
  347.         repeat
  348.             if flag_for_comments then begin
  349.                 break;
  350.             end;
  351.  
  352.             read(s);
  353.  
  354.             if (s = ';') and (count_prog_iteration = 0) and (flag_for_char) then begin
  355.                 writeln('Программа не выполнена ни разу');
  356.                 writeln(total_result);
  357.                 Halt();  
  358.             end;
  359.            
  360.             if (s = ';') and (count_prog_iteration = 0) and (not flag_for_char) then begin
  361.                 flag_for_comments := True;
  362.                 break;
  363.             end;
  364.  
  365.             if (s = ';') and (count_prog_iteration <> 0) and (not flag_for_char) then begin
  366.                 flag_for_comments := True;
  367.                 break;
  368.             end;
  369.            
  370.             if (s = ';') and (not flag_for_char) then begin
  371.                 flag_for_comments := True;
  372.                 writeln('Ошибка: неправильно введены цифры числа');
  373.                 flag_for_float_part := True;
  374.                 break;
  375.             end;
  376.  
  377.             if ((s in ['0'..'9']) or (s in ['a'..'f'])) and (flag_for_char = False) then begin
  378.                 curr_digit := char_to_digit(arr, s, trash);
  379.                 flag_for_char := True;
  380.                 end
  381.             else begin
  382.                 if ((s in ['0'..'9']) or (s in ['a'..'f'])) and (flag_for_char = True) then begin
  383.                     curr_digit := curr_digit * 16 + char_to_digit(arr, s, trash);
  384.                     if curr_digit >= curr_base then begin
  385.                         writeln('Ошибка! Полученная цифра не удовлетворяет данной системе счисления');
  386.                         Halt();
  387.                     end;
  388.                     cntr_real_part := cntr_real_part + 1;
  389.                     flag_for_char := False;
  390.                      num_part_real := num_part_real + curr_digit / pow(curr_base, cntr_real_part);
  391.                     end;
  392.                 end;
  393.         until(EOLn);
  394.  
  395.         if flag_for_float_part then break;
  396.  
  397.         {проверка на ошибки: нечётное количество char-ов
  398.         если у нас 0-я итерация, т.е первая строчка вводимых данных, то выводим ошибку, иначе завершаем программу}
  399.         if (flag_for_char = True) then begin
  400.             num := 0;
  401.             flag_for_char := False;
  402.             if (count_prog_iteration = 0) then begin
  403.                 writeln('Ошибка! Нечётное число char, нельзя получить отдельные digits');
  404.                 writeln(total_result);
  405.                 Halt();
  406.             end
  407.             else break;
  408.         end;
  409.  
  410.         num := num + num_part_real;
  411.  
  412.         if intenal_sign = '-' then
  413.             num := num * (-1);
  414.  
  415.         if sign = '+' then
  416.         total_result := total_result + num
  417.         else
  418.             if sign = '-' then
  419.             total_result := total_result - num
  420.             else
  421.                 if sign = '*' then
  422.                 total_result := total_result * num
  423.                 else
  424.                   if sign = '/' then total_result := total_result / num;
  425. //        writeln(num, ' знак = ', sign, ' СС на вход = ', curr_base, 'вещественная часть = ', num_part_real, ' результат работы калькулятора = ', total_result); //тест
  426.  
  427.         sign := '0';
  428.         flag_base := False;
  429.         flag_for_char := False;
  430.         curr_base := 0;
  431.         curr_digit := 0;
  432.         num := 0;
  433.         num_part_real := 0;
  434.         cntr_real_part := 0;
  435.         intenal_sign := '+';
  436.         count_prog_iteration := count_prog_iteration + 1;
  437.         flag_for_comments := False;
  438.  
  439.     end;
  440.  
  441.     if total_result < 0 then begin
  442.         flag_for_total_result := False;
  443.         total_result := total_result * (-1);
  444.     end
  445.         else flag_for_total_result := True;
  446.  
  447.     writeln(total_result);
  448.  
  449.     {пошёл вывод}
  450.     for i := 2 to ParamCount do begin
  451.         val(ParamStr(i), base, code);
  452.         write(base);
  453.         space_bar(base); //добавляет пробелы в вывод
  454.         if flag_for_total_result = False then
  455.             write('-');
  456.         digits_for_e := e_count_digit(base, epsilon); //подсчёт количества цифр для нужной нам точности
  457.         output_with_conversion(digits_for_e, base, total_result);
  458.         writeln;
  459.         break;
  460.     end;
  461.  
  462. end.
  463.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement