Системы счисления. Перевод чисел из десятичной системы исчисления в заданную. Перевод чисел из системы с заданным основанием в десятичную

Страницы работы

Содержание работы

ЛАБОРАТОРНАЯ РАБОТА №7

Тема: Системы счисления.

Цель работы: Изучить методы перевода чисел из одних систем счисления в другие.

Постановка задачи: Написать программу, которая будет состоять из двух частей:

1) Перевод чисел из десятичной системы исчисления в заданную;

2) Перевод чисел из системы с заданным основанием в десятичную;

Псевдокод программы:

Program Perevod;

Const {Описание констант}

mas: array [0..15] of char = ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');

var {Описание переменных}

str: string;

m: real;

n: byte;

{Описание Процедур и функций}

function alert(n: byte): boolean; {Функция проверки основания системы}

begin

if (n<2) or (n>16) then

result:=true;

{Вывод сообщения}

end;

function trans(c: char): byte; {Функция перевода символа в число}

begin

{Перевод символа в верхний регистр}

Case c of

{Перевод соответствующего символа в число}

end;

end;

function AnyToInt(s: string; n: byte): longint; {Функция перевода E->10 цел}

begin

for i:=1 to length(s) do

      begin

{Перевод символа в число}

{Перевод в 10 систему}

end;

end;

function AnyToFrac(s: string; n: byte): real; {Функция перевода E->10 дроб}

begin

if s='' then exit; {Выход при отсутствии дробной части}

for i:=length(s) downto 1 do

      begin

{Перевод символа в число}

{Перевод в 10 систему}

end;

end;

function IntToAny(m: longint; n: byte): string; {Функция перевода 10->E цел}

begin

res:='';

while m>0 do

      begin

{определение остатка}

{конкотенация с предыдущим результатом}

{определение целой части от деления}

end;

end;

function FracToAny(r: real; n: byte): string; {Функция перевода 10->E дроб}

begin

i:=1;

st:='';

while r<>0 do

      begin

{умножение дробной части на основание системы}

{конкотенация с целой частью предыдущего выражения}

{выделение дробной части}

if i>15 then break; {выход из цикла если дробь периодическая}

end;

end;

procedure AnyToDec(s: string; n: byte); {Процедура перевода E->10}

var

str1, str2: string;

i,j: shortint;

flag: boolean;

begin

if alert(n) then exit; {Выход из процедуры при неправильном основании}

for i:=1 to length(s) do {Проверка допустимых символов}

      begin

        if s[i]='.' then continue;

if (s[i] in ['g'..'z','G'..'Z']) or (trans(s[i])>=n) then

{вывод уведомления и выход}

end;

flag:=false;

for i:=1 to length(s) do

{вычисление позиции точки}

{копирование первой подстроки}

if flag then {копирование второй подстроки}

{вызов функций перевода}

end;

procedure DecToAny(m: real; n: byte); {Процедура перевода 10->E}

var

l: longint;

r: real;

begin

    if alert(n) then exit;

l:=trunc(m);

r:=frac(m);

{вызов функций перевода}

end;

begin

  repeat

{Вывод описания доступных операция}

Readln(n);

Case n of

1: begin

{запрос числа}

Readln(m);

{запрос нового основания для перевода}

Readln(n);

DecToAny(m,n);

end;

2: begin

{запрос числа}

Readln(str);

{запрос основания числа}

Readln(n);

AnyToDec(str,n);

end;

3: exit;

end;

until false;

end.

Контрольный пример:

Проверим оба направления перевода. Для начала выберем перевод (10 => 2), и введём число 8.25, в ответ программа выдаёт результат 1000.01, что соответствует действительности.

Далее выберем направление (16 => 10), и введём число FF, в ответ программа выдаёт 255, что соответствует действительности.

Результат работы программы:

Рисунок 1 – Результат работы программы

Текст программы:

Program Perevod;

const

mas: array [0..15] of char = ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');

var

str: string;

m: real;

n: byte;

function alert(n: byte): boolean;

begin

result:=false;

if (n<2) or (n>16) then

      begin

writeln('Вы ввели неправильную систему счисления, попробуйте снова.');

result:=true;

end;

{end if}

end;

function trans(c: char): byte;

var

tmp: byte;

begin

c:=UpCase(c);

Case c of

'A': tmp:=10;

'B': tmp:=11;

'C': tmp:=12;

'D': tmp:=13;

'E': tmp:=14;

'F': tmp:=15

else tmp:=StrToInt(c);

end;

result:=tmp;

end;

function AnyToInt(s: string; n: byte): longint;

var

res: longint;

i, tmp: byte;

begin

res:=0;

for i:=1 to length(s) do

      begin

tmp:=trans(s[i]);

res:=res*n+tmp;

end;

{end for}

result:=res;

end;

function AnyToFrac(s: string; n: byte): real;

var

res: real;

i, tmp: byte;

begin

    if s='' then exit;

res:=0;

for i:=length(s) downto 1 do

      begin

tmp:=trans(s[i]);

res:=(res+tmp)/n;

end;

{end for}

result:=res;

end;

function IntToAny(m: longint; n: byte): string;

var

tmp, res: string;

begin

res:='';

while m>0 do

      begin

tmp:=mas[m mod n];

res:=tmp+res;

m:=m div n;

end;

{end while}

result:=res;

end;

function FracToAny(r: real; n: byte): string;

var

i: byte;

st: string;

d: integer;

begin

i:=1;

st:='';

while r<>0 do

      begin

r:=r*n;

st:=st+mas[trunc(r)];

r:=frac(r);

inc(i);

if i>15 then break;

end;

{end while}

result:=st;

end;

procedure AnyToDec(s: string; n: byte);

var

str1, str2: string;

i,j: shortint;

flag: boolean;

begin

    if alert(n) then exit;

for i:=1 to length(s) do

      begin

        if s[i]='.' then continue;

if (s[i] in ['g'..'z','G'..'Z']) or (trans(s[i])>=n) then

          begin

Writeln('Вы ввели неправильное число для заданной системы счисления!');

exit;

end;

{end if}

end;

{end for}

flag:=false;

for i:=1 to length(s) do

      if s[i]='.' then

        begin

flag:=true;

j:=i-1;

break;

end

      else

j:=i;

{end if}

{end for}

str1:=copy(s,1,j);

if flag then

str2:=copy(s,i+1,length(s)-i)

else

str2:='';

{end if}

if str2='' then

Writeln(s,'(',n,') = ',AnyToInt(str1,n),'(10)')

else

Writeln(s,'(',n,') = ',AnyToInt(str1,n)+AnyToFrac(str2,n),'(10)');

{end if}

end;

procedure DecToAny(m: real; n: byte);

var

l: longint;

r: real;

begin

    if alert(n) then exit;

l:=trunc(m);

r:=frac(m);

if r=0 then

Writeln(m,'(10) = ',IntToAny(l,n),'(',n,')')

else

Writeln(m,'(10) = ',IntToAny(l,n)+'.'+FracToAny(r,n),'(',n,')');

{end if}

end;

begin

  repeat

Writeln('- Перевести десятичное число в заданную систему(1)');

Writeln('- Перевести число из заданной системы в десятичную(2)');

Writeln('- Выход(3)');

Write('Ваш выбор[1-3]: ');

Readln(n);

Writeln;

Case n of

1: begin

Write('Введите число: ');

Readln(m);

Write('Введите основание системы счисления для перевода[2-16]: ');

Readln(n);

DecToAny(m,n);

Readln;

end;

2: begin

Write('Введите число: ');

Readln(str);

Write('Введите основание системы счисления[2-16]: ');

Readln(n);

AnyToDec(str,n);

Readln;

end;

3: exit;

end;

until false;

end.

Похожие материалы

Информация о работе