Перевод в различные системы счисления - Pascal (80743)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, возникла проблема, не могу разобраться с преобразованием числа в обратный и дополнительный код. Если с переводом из одной сс в другую все более-менее ясно, то здесь я явно что-то напортачила Заранее благодарю за отзывы и помощь Задание: Исходный файл содержит числа в шестнадцатеричной системе счисления, отделенные друг от друга запятыми. Составить программу, которая для каждого такого числа из заданного диапазона после знака равенства указывает его значение в семеричной системе, в виде дополнительного кода или в виде обратного кода по выбору пользователя. Исходный код:
Листинг программы
  1. PROGRAM maxkur;
  2. Const
  3. a:string[36]='0123456789ABCDEFGHIJKLMNJPQRSTUVWXYZ';
  4. Function StrToInt(const s:String): Integer;
  5. var
  6. Result, code:integer;
  7. begin
  8. val(s,Result,code);
  9. if (code<>0)
  10. then
  11. Result:=0;
  12. StrToInt:=Result;
  13. end;
  14. function ToDec(var Result:string;cc:byte):integer;
  15. var
  16. i,n,sum:integer;
  17. begin
  18. sum:=0;
  19. n:=length(Result);
  20. for i:=1 to n do
  21. begin
  22. dec(n);
  23. sum:=sum+round((pos(Result[i],a)-1)*exp(ln(cc)*n));
  24. end;
  25. ToDec:=sum;
  26. end;
  27. function Convert(numb:integer; const c: byte):string;
  28. var
  29. Result:string;
  30. begin
  31. Result:='';
  32. repeat
  33. Result:=a[numb mod c +1]+Result;
  34. numb:=numb div c;
  35. until (numb=0);
  36. Convert:=Result;
  37. end;
  38. function ShowMenu():Byte;
  39. var
  40. Result:byte;
  41. begin
  42. repeat
  43. writeln('В какую систему счисления переводить? ');
  44. readln(Result);
  45. until (Result in [2..16]);
  46. ShowMenu:=Result;
  47. end;
  48. var
  49. f:File of Char;
  50. s:string;
  51. temp:byte;
  52. c:char;
  53. begin
  54. assign(f,'f.txt');
  55. reset(f);
  56. s:='';
  57. while not (eof(f)) do
  58. begin
  59. read(f,c);
  60. if (c in ['0'..'Z'])
  61. then
  62. temp:=ToDec;
  63. s:=s+c
  64. else
  65. if (c=',')
  66. then
  67. begin
  68. temp:=ShowMenu();
  69. writeln(s,'=',Convert(StrToInt(s), temp));
  70. s:='';
  71. case temp of
  72. 7:writeln('Перевод в троичную систему счисления');
  73. 0:writeln('Перевод с обратным кодом');
  74. 1:writeln('Первод с дополнительным кодом');
  75. end;
  76. if (temp<>7)and(temp<>1)and(temp<>0) then
  77. begin
  78. Writeln('Операция не осуществлена');
  79. halt;
  80. end;
  81. end
  82. end;
  83. temp:=ShowMenu();
  84. writeln(s,'=',Convert(StrToInt(s),temp));
  85. close(f);
  86. end.

Решение задачи: «Перевод в различные системы счисления»

textual
Листинг программы
  1. const
  2.     a: string[17] = '0123456789ABCDEF-';
  3. function StrToInt(const s: String): LongInt;
  4. var
  5.     Result: LongInt;
  6.     code: Integer;
  7. begin
  8.     Val(s, Result, code);
  9.     if (code <> 0)
  10.     then
  11.         Result := 0;
  12.     StrToInt := Result;
  13. end;
  14. function IntToStr(const i: LongInt): String;
  15. var
  16.     Result: String;
  17. begin
  18.     Str(i, Result);
  19.     IntToStr := Result;
  20. end;
  21. function AnyToDec(s: String; const base: Byte): LongInt;
  22. var
  23.     Result: LongInt;
  24.     i, n: Byte;
  25.     flag: Boolean;
  26. begin
  27.     flag := (s[1] = '-');
  28.     if (flag)
  29.     then
  30.         Delete(s, 1, 1);
  31.     Result := 0;
  32.     n := Length(s);
  33.     for i := 1 to n do
  34.     begin
  35.         Dec(n);
  36.         Inc(Result, Round((Pos(s[i], a) - 1) * Exp(Ln(base) * n)));
  37.     end;
  38.     if (flag)
  39.     then
  40.         Result := -Result;
  41.     AnyToDec := Result;
  42. end;
  43. function DecToAny(numb: LongInt; const base: Byte): String;
  44. var
  45.     Result: String;
  46.     flag: Boolean;
  47. begin
  48.     flag := (numb < 0);
  49.     if (flag)
  50.     then
  51.         numb := Abs(numb);
  52.     Result := '';
  53.     repeat
  54.         Result := a[numb mod base + 1] + Result;
  55.         numb := numb div base;
  56.     until (numb = 0);
  57.     if (flag)
  58.     then
  59.         Result := '-' + Result;
  60.     DecToAny := Result;
  61. end;
  62. procedure FullLength(var s: String);
  63. begin
  64.     while (Length(s) < 7) do
  65.         s := '0' + s;
  66. end;
  67. function Direct(const s: String): String;
  68. var
  69.     Result: String;
  70. begin
  71.     Result := s;
  72.     if (s[1] = '-')
  73.     then
  74.         Delete(Result, 1, 1);
  75.     FullLength(Result);
  76.     if (s[1] = '-')
  77.     then
  78.         Result := '1' + Result
  79.     else
  80.         Result := '0' + Result;
  81.     Direct := Result;
  82. end;
  83. function Reverse(const s: String; const base: Byte): String;
  84. var
  85.     Result: String;
  86.     i: Byte;
  87. begin
  88.     Result := s;
  89.     if (s[1] = '-')
  90.     then
  91.         Delete(Result, 1, 1);
  92.     FullLength(Result); Result := '0' + Result;
  93.     if (s[1] = '-')
  94.     then
  95.         for i := 1 to Length(Result) do
  96.             Result[i] := IntToStr(base - 1 - StrToInt(Result[i]))[1];
  97.     Reverse := Result;
  98. end;
  99. function Additional(const s: String; const base: Byte): String;
  100. var
  101.     Result: String;
  102. begin
  103.     Result := Reverse(s, base);
  104.     if (s[1] = '-')
  105.     then
  106.         Result := DecToAny(1 + AnyToDec(Result, base), base);
  107.     Additional := Result;
  108. end;
  109.  
  110. function ShowMenu(): Byte;
  111. var
  112.     Result: Byte;
  113. begin
  114.     repeat
  115.         WriteLn('1. Прямое представление.');
  116.         WriteLn('2. Обратное представление.');
  117.         WriteLn('3. Дополнительное представление');
  118.         ReadLn(Result);
  119.     until (Result in [1..3]);
  120.     ShowMenu := Result;
  121. end;
  122. var
  123.     f: File Of Char;
  124.     s, ans: String;
  125.     c: Char;
  126. begin
  127.     Assign(f, 'f.txt'); ReSet(f);
  128.     s := '';
  129.     while Not (EoF(f)) do
  130.     begin
  131.         Read(f, c);
  132.         if (Pos(c, a) > 0)
  133.         then
  134.         begin
  135.             if ((c = '-') And (Length(s) = 0)) Or (c <> '-')
  136.             then
  137.                 s := s + c;
  138.         end
  139.         else
  140.             if (c = ',')
  141.             then
  142.             begin
  143.                 ans := DecToAny(AnyToDec(s, 16), 7);
  144.                 if (s[1] <> '-')
  145.                 then
  146.                     WriteLn(s, '=', Direct(ans))
  147.                 else
  148.                 begin
  149.                     case ShowMenu() of
  150.                         1: WriteLn(s, '=', Direct(ans));
  151.                         2: WriteLn(s, '=', Reverse(ans, 7));
  152.                         3: WriteLn(s, '=', Additional(ans, 7));
  153.                     end;
  154.                 end;
  155.                 s := '';
  156.             end
  157.     end;
  158.     Close(f);
  159.     ans := DecToAny(AnyToDec(s, 16), 7);
  160.     if (s[1] <> '-')
  161.     then
  162.         WriteLn(s, '=', Direct(ans))
  163.     else
  164.     begin
  165.         case ShowMenu() of
  166.             1: WriteLn(s, '=', Direct(ans));
  167.             2: WriteLn(s, '=', Reverse(ans, 7));
  168.             3: WriteLn(s, '=', Additional(ans, 7));
  169.         end;
  170.     end;
  171. end.

Объяснение кода листинга программы

  1. Объявление переменных:
    • a: string[17] = '0123456789ABCDEF-'
  2. Функция StrToInt для конвертации строки в целое число:
    • Параметры: const s: String
    • Переменные: Result: LongInt, code: Integer
    • Действия: Преобразование строки с помощью функции Val, проверка результата и возврат значения целого числа
  3. Функция IntToStr для конвертации целого числа в строку:
    • Параметры: const i: LongInt
    • Переменные: Result: String
    • Действия: Преобразование целого числа в строку с помощью функции Str
  4. Функция AnyToDec для конвертации числа из произвольной системы счисления в десятичную:
    • Параметры: s: String, const base: Byte
    • Переменные: Result: LongInt, i, n: Byte, flag: Boolean
    • Действия: Перевод числа из заданной системы счисления в десятичную
  5. Функция DecToAny для конвертации числа из десятичной системы счисления в любую другую:
    • Параметры: numb: LongInt, const base: Byte
    • Переменные: Result: String, flag: Boolean
    • Действия: Перевод числа из десятичной системы счисления в любую другую
  6. Процедура FullLength для добавления ведущих нулей в строку до заданной длины:
    • Параметры: var s: String
  7. Функция Direct для представления числа в прямом виде:
    • Параметры: const s: String
    • Переменные: Result: String
    • Действия: Добавление ведущих нулей и бита знака в двоичное представление числа
  8. Функция Reverse для представления числа в обратном виде:
    • Параметры: const s: String, const base: Byte
    • Переменные: Result: String, i: Byte
    • Действия: Добавление ведущих нулей, инвертирование битов и добавление бита знака в обратное двоичное представление числа
  9. Функция Additional для представления числа в дополнительном коде:
    • Параметры: const s: String, const base: Byte
    • Переменные: Result: String
    • Действия: Получение обратного представления и добавление 1, затем перевод в десятичную систему
  10. Функция ShowMenu для отображения меню и выбора действия:
    • Возвращает выбранный пункт меню
  11. Основной блок:
    • Объявление переменных: f: File Of Char, s, ans: String, c: Char
  12. Открытие файла и чтение данных:
    • Открытие файла f.txt и считывание данных в переменную s
  13. Обработка данных:
    • Если символ входит в определённые допустимые символы, добавляется к строке s
    • При нахождении запятой выполняется обработка текущей строки s и вывод результата в зависимости от выбранного пункта меню
  14. Закрытие файла и обработка последней строки:
    • Закрытие файла
    • Обработка последней строки s и вывод результата в зависимости от выбранного пункта меню

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы