Перевод в различные системы счисления - 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
и вывод результата в зависимости от выбранного пункта меню
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д