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