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