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

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

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

Здравствуйте, возникла проблема, не могу разобраться с преобразованием числа в обратный и дополнительный код. Если с переводом из одной сс в другую все более-менее ясно, то здесь я явно что-то напортачила Заранее благодарю за отзывы и помощь Задание: Исходный файл содержит числа в шестнадцатеричной системе счисления, отделенные друг от друга запятыми. Составить программу, которая для каждого такого числа из заданного диапазона после знака равенства указывает его значение в семеричной системе, в виде дополнительного кода или в виде обратного кода по выбору пользователя. Исходный код:
PROGRAM maxkur;
Const
a:string[36]='0123456789ABCDEFGHIJKLMNJPQRSTUVWXYZ';
Function StrToInt(const s:String): Integer;
var
Result, code:integer;
begin
 val(s,Result,code);
 if (code<>0)
 then
  Result:=0;
 StrToInt:=Result;
end;
function ToDec(var Result:string;cc:byte):integer;
var
i,n,sum:integer;
begin
sum:=0;
n:=length(Result);
for i:=1 to n do
 begin
 dec(n);
 sum:=sum+round((pos(Result[i],a)-1)*exp(ln(cc)*n));
 end;
 ToDec:=sum;
 end;
function Convert(numb:integer; const c: byte):string;
var
Result:string;
begin
Result:='';
repeat
 Result:=a[numb mod c +1]+Result;
 numb:=numb div c;
until (numb=0);
Convert:=Result;
end;
function ShowMenu():Byte;
var
Result:byte;
begin
repeat
writeln('В какую систему счисления переводить? ');
readln(Result);
until (Result in [2..16]);
ShowMenu:=Result;
end;
var
f:File of Char;
s:string;
temp:byte;
c:char;
begin
assign(f,'f.txt');
reset(f);
s:='';
while not (eof(f)) do
begin
read(f,c);
if (c in ['0'..'Z'])
then
temp:=ToDec;
s:=s+c
else
if (c=',')
then
begin
temp:=ShowMenu();
writeln(s,'=',Convert(StrToInt(s), temp));
s:='';
case temp of
7:writeln('Перевод в троичную систему счисления');
0:writeln('Перевод с обратным кодом');
1:writeln('Первод с дополнительным кодом');
end;
if (temp<>7)and(temp<>1)and(temp<>0) then
begin
Writeln('Операция не осуществлена');
halt;
end;
end
end;
temp:=ShowMenu();
writeln(s,'=',Convert(StrToInt(s),temp));
close(f);
end.

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

textual
Листинг программы
const
    a: string[17] = '0123456789ABCDEF-';
function StrToInt(const s: String): LongInt;
var
    Result: LongInt;
    code: Integer;
begin
    Val(s, Result, code);
    if (code <> 0)
    then
        Result := 0;
    StrToInt := Result;
end;
function IntToStr(const i: LongInt): String;
var
    Result: String;
begin
    Str(i, Result);
    IntToStr := Result;
end;
function AnyToDec(s: String; const base: Byte): LongInt;
var
    Result: LongInt;
    i, n: Byte;
    flag: Boolean;
begin
    flag := (s[1] = '-');
    if (flag)
    then
        Delete(s, 1, 1);
    Result := 0;
    n := Length(s);
    for i := 1 to n do
    begin
        Dec(n);
        Inc(Result, Round((Pos(s[i], a) - 1) * Exp(Ln(base) * n)));
    end;
    if (flag)
    then
        Result := -Result;
    AnyToDec := Result;
end;
function DecToAny(numb: LongInt; const base: Byte): String;
var
    Result: String;
    flag: Boolean;
begin
    flag := (numb < 0);
    if (flag)
    then
        numb := Abs(numb);
    Result := '';
    repeat
        Result := a[numb mod base + 1] + Result;
        numb := numb div base;
    until (numb = 0);
    if (flag)
    then
        Result := '-' + Result;
    DecToAny := Result;
end;
procedure FullLength(var s: String);
begin
    while (Length(s) < 7) do
        s := '0' + s;
end;
function Direct(const s: String): String;
var
    Result: String;
begin
    Result := s;
    if (s[1] = '-')
    then
        Delete(Result, 1, 1);
    FullLength(Result);
    if (s[1] = '-')
    then
        Result := '1' + Result
    else
        Result := '0' + Result;
    Direct := Result;
end;
function Reverse(const s: String; const base: Byte): String;
var
    Result: String;
    i: Byte;
begin
    Result := s;
    if (s[1] = '-')
    then
        Delete(Result, 1, 1);
    FullLength(Result); Result := '0' + Result;
    if (s[1] = '-')
    then
        for i := 1 to Length(Result) do
            Result[i] := IntToStr(base - 1 - StrToInt(Result[i]))[1];
    Reverse := Result;
end;
function Additional(const s: String; const base: Byte): String;
var
    Result: String;
begin
    Result := Reverse(s, base);
    if (s[1] = '-')
    then
        Result := DecToAny(1 + AnyToDec(Result, base), base);
    Additional := Result;
end;
 
function ShowMenu(): Byte;
var
    Result: Byte;
begin
    repeat
        WriteLn('1. Прямое представление.');
        WriteLn('2. Обратное представление.');
        WriteLn('3. Дополнительное представление');
        ReadLn(Result);
    until (Result in [1..3]);
    ShowMenu := Result;
end;
var
    f: File Of Char;
    s, ans: String;
    c: Char;
begin
    Assign(f, 'f.txt'); ReSet(f);
    s := '';
    while Not (EoF(f)) do
    begin
        Read(f, c);
        if (Pos(c, a) > 0)
        then
        begin
            if ((c = '-') And (Length(s) = 0)) Or (c <> '-')
            then
                s := s + c;
        end
        else
            if (c = ',')
            then
            begin
                ans := DecToAny(AnyToDec(s, 16), 7);
                if (s[1] <> '-')
                then
                    WriteLn(s, '=', Direct(ans))
                else
                begin
                    case ShowMenu() of
                        1: WriteLn(s, '=', Direct(ans));
                        2: WriteLn(s, '=', Reverse(ans, 7));
                        3: WriteLn(s, '=', Additional(ans, 7));
                    end;
                end;
                s := '';
            end
    end;
    Close(f);
    ans := DecToAny(AnyToDec(s, 16), 7);
    if (s[1] <> '-')
    then
        WriteLn(s, '=', Direct(ans))
    else
    begin
        case ShowMenu() of
            1: WriteLn(s, '=', Direct(ans));
            2: WriteLn(s, '=', Reverse(ans, 7));
            3: WriteLn(s, '=', Additional(ans, 7));
        end;
    end;
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
Похожие ответы