Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.07.2019, 22:50   #1
annie7
 
Регистрация: 11.06.2018
Сообщений: 4
По умолчанию Перевод числа из восьмеричной системы счисления в десятичную

Исходный файл содержит числа в восьмеричной системе счисления, отделенные друг от друга запятыми. Составить программу, которая для каждого такого числа из заданного диапазона после знака равенства указывает его значение в десятичной системе счисление, дополнительном коде или его инверсию по выбору пользователя, например: 00101111 = 33353, 0111 = 73, и т.д.

Помогите пожалуйста переделать код программы.

Есть примерный код программы, но перевод из шестнадцатеричной системы счисления в семеричную.

Программа для Free Pascal.

Код:
program kur;
 
const
  a: string[17] = '0123456789ABCDEF-';
 
function StrToInt(const d: String): longint;
var
  x: longint;
  e: integer;
begin
  val(d, x, e);
  if (e <> 0)
    then
    x := 0;
  StrToInt := x;
end;
 
function IntToStr(const i: longint): String;
var
  x: string;
begin
  Str(i, x);
  IntToStr := x;
end;
 
function AnyToDec(d: string; const base: byte): longint;
var
  x: longint;
  i, n: byte;
  flag: boolean;
begin
  flag := (d[1] = '-');
  if (flag)
    then
    delete(d, 1, 1);
  x := 0;
  n := length(d);
  for i := 1 to n do
  begin
    dec(n);
    inc(x, Round((Pos(d[i], a) - 1) * exp(ln(base) * n)));
  end;
  if(flag)
    then
    x := -x;
  AnyToDec := x;
end;
 
function DecToAny(nomer: longint; const base: byte): string;
var
  x: string;
  flag: boolean;
begin
  flag := (nomer < 0);
  if(flag)
    then
    nomer := abs(nomer);
  x := '';
  repeat
    x := a[nomer mod base + 1] + x;
    nomer := nomer div base;
  until(nomer = 0);
  if(flag)
    then
    x := '-' + x;
  DecToAny := x;
end;
 
procedure FullLength(var d: string);
begin
  while(length(d) < 7) do
    d := '0' + d;
end;
 
function Direct(const d: string): string;
var
  x: string;
begin
  x := d;
  if(d[1] = '-')
    then
    delete(x, 1, 1);
  FullLength(x);
  if(d[1] = '-')
    then
    x := '1' + x
  else
    x := '0' + x;
  Direct := x;
end;
 
function Reverse(const d: string; const base: byte): string;
var
  x: string;
  i: byte;
begin
  x := d;
  if(d[1] = '-')
    then
    delete(x, 1, 1);
  FullLength(x);
  x := '0' + x;
  if(d[1] = '-')
    then
    for i := 1 to length(x) do
      x[i] := IntToStr(base - 1 - StrToInt(x[i]))[1];
  Reverse := x;
end;
 
function Additional(const d: String; const base: byte): string;
var
  x: string;
begin
  x := Reverse(d, base);
  if(d[1] = '-')
    then
    x := DecToAny(1 + AnyToDec(x, base), base);
  Additional := x;
end;
 
var
  f: file of char;
  b: text;
  d, ans, nas, z: string;
  m, p, numb: integer;
  c: char;
  x: byte;
 
begin
  write('Нижняя грань диапазона m=');
  readln(m);
  repeat
    write('Верхняя грань диапазона p(>=', m, ')=');
    readln(p);
  until(p >= m);
  begin
    repeat
      writeln('В каком виде необходимо записать результат?');
      writeln('1.Прямое представление в семеричной системе счисления');
      writeln('2.Обратное представление.');
      writeln('3.Дополнительное представление.');
      writeln('4.Выход из программы');
      readln(x);
    until(x in [1..4]);
    if x = 4 
    then
    begin
      writeln('Программа завершена ');
      halt;
    end;
    ans := DecToAny(AnyToDec(d, 16), 7);
    nas := DecToAny(AnyToDec(d, 16), 2);
    case x of
      1: z := direct(ans);
      2:
        begin
          z := Reverse(nas, 2);
          if d[1] <> '-' then
            z := d;
        end;
      3:
        begin
          z := Additional(nas, 2);
          if d[1] <> '-' then
            z := d;
        end;
    end;
    assign(f, 'f.txt');
    assign(b, 'b.txt');
    ReSet(f);
    rewrite(b);
    d := '';
    while not (eof(f)) do
    begin
      read(f, c);
      if(Pos(c, a) > 0)
      then
      begin
        if((c = '-') and (length(d) = 0)) or (c <> '-')
          then
          d := d + c;
      end
      else
      if(c = '.')
      then
      begin
        WRITELN('Ошибка! Некорректный символ');
        close(f);
        halt;
      end
      ELSE
      if(c = ',')
      then
      begin
        numb := anytodec(d, 16);
        if (numb >= m) and (numb <= p) 
        then
        begin
          writeln(d, '=', z);
          write(b, d);
          write(b, '=');
          write(b, z);
          write(b, ' ');
        end;
        d := '';
      end;
      ans := DecToAny(AnyToDec(d, 16), 7);
      nas := DecToAny(AnyToDec(d, 16), 2);
      case x of
        1: z := direct(ans);
        2:
          begin
            z := Reverse(nas, 2);
            if d[1] <> '-' 
              then
              z := d;
          end;
        3:
          begin
            z := Additional(nas, 2);
            if d[1] <> '-' 
              then
              z := d;
          end;
      end;
    end;
    close(f);
    close(b);
    ans := DecToAny(AnyToDec(d, 16), 7);
    nas := DecToAny(AnyToDec(d, 16), 2);
    case x of
      1: z := direct(ans);
      2:
        begin
          z := Reverse(nas, 2);
          if d[1] <> '-' 
            then
            z := d;
        end;
      3:
        begin
          z := Additional(nas, 2);
          if d[1] <> '-' 
            then
            z := d;
        end;
    end;
  end;
  readln;
end.
Заранее огромное спасибо.

Последний раз редактировалось annie7; 04.07.2019 в 22:55.
annie7 вне форума Ответить с цитированием
Старый 05.07.2019, 00:38   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Вы не можете найти, где в этом коде написано 16 и 7?

Цитата:
Сообщение от annie7 Посмотреть сообщение
Код:
inc(x, Round((Pos(d[i], a) - 1) * exp(ln(base) * n)));
Ужас!
Black Fregat вне форума Ответить с цитированием
Старый 05.07.2019, 05:04   #3
annie7
 
Регистрация: 11.06.2018
Сообщений: 4
По умолчанию

Спасибо конечно, но я то вижу. И суть была не в этом немного.
annie7 вне форума Ответить с цитированием
Старый 05.07.2019, 08:04   #4
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

Код:
inc(x, Round((Pos(d[i], a) - 1) * exp(ln(base) * n)));
Да, для целых чисел - ну оно прямо самое то. Это надо в галерею шедевров.
И само задание - ХЗ . Десятичный дополнительный код ?!
digitalis вне форума Ответить с цитированием
Старый 05.07.2019, 09:48   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от annie7 Посмотреть сообщение
И суть была не в этом немного.
а в чём суть?

и что означает

Цитата:
Сообщение от annie7 Посмотреть сообщение
его значение в десятичной системе счисление, дополнительном коде или его инверсию по выбору пользователя
например, число
00101111
в десятичной системе счисления = 33353
а в дополнительном код или его инверсия - это что?
приведите пример, что должна вывести программа.

p.s. если не не изменяет память, то дополнительный и обратный код это только для представления отрицательных чисел.
я ошибаюсь?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.07.2019, 10:41   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
я ошибаюсь?
Угу.

https://en.wikipedia.org/wiki/Two%27s_complement
https://en.wikipedia.org/wiki/Ones%27_complement
p51x на форуме Ответить с цитированием
Старый 05.07.2019, 11:32   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Коллега, простите, а разве
Цитата:
The ones' complement of a binary number
Цитата:
Two's complement is a mathematical operation on binary numbers,
binary numbers не переводится как "двоичные числа"?

можно на примере.
вот есть восьмеричное число 0111
в десятичном виде это число 73

можно увидеть, как это число будет выглядеть в
"дополнительном коде или его инверсию" ?

и попутно вопрос - а какой битности нужно брать двоичное число при переводе в дополнительный код/его инверсию?

Последний раз редактировалось Serge_Bliznykov; 05.07.2019 в 11:36.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.07.2019, 11:47   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
binary numbers не переводится как "двоичные числа"?
угу

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
можно увидеть, как это число будет выглядеть в
"дополнительном коде или его инверсию" ?
А в чем проблема? Переводим восьмеричное в двоичное, делаем доп. код и возвращаем взад восмеричное, если надо.

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
и попутно вопрос - а какой битности нужно брать двоичное число при переводе в дополнительный код/его инверсию?
Либо "один из стандартный" размеров, достаточный для вмещения числа - байт, слово... Либо, т.к. каждая восьмиричная цифра кодируется 3 битами, то кол-во цифр * 3
p51x на форуме Ответить с цитированием
Старый 05.07.2019, 12:07   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
А в чем проблема? Переводим восьмеричное в двоичное, делаем доп. код и возвращаем взад восмеричное, если надо.
Понятно.

так в результате, после знака равенства должно быть десятичное значение числа в дополнительном коде или восьмеричное?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.07.2019, 12:26   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Написано ж: один из трех вариантов по выбору пользователя - десятичное, доп.код, инверсия.
p51x на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод числа из четверичной системы счисления в десятичную. Асичка Помощь студентам 2 30.01.2013 11:23
Перевод числа из восьмеричной системы счисления в десятичную.С++ Алексей008 Помощь студентам 0 13.12.2012 15:13
Перевод из римской системы счисления в десятичную и наоборот Александр77777 Помощь студентам 3 19.01.2012 15:42
перевод числа из шестнадцатеричной системы счисления в десятичную Едік Паскаль, Turbo Pascal, PascalABC.NET 10 27.12.2011 16:21