Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 27.10.2015
Сообщений: 30
1

Из вектора двоичных разрядов получить десятичное число

31.10.2015, 14:28. Показов 1847. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Из вектора двоичных разрядов получить десятичное число
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.10.2015, 14:28
Ответы с готовыми решениями:

Десятичное число, представленное списком десятичных цифр, представить списком двоичных разрядов
Всем доброго времени суток, необходимо в Visual Prolog представить десятичное число в виде списка...

Число двоичных разрядов
Допустим есть число -5,перевести в 8ссч,вывод на экран 377777773,тк 32 двоичных разрядов,можно ли...

Получить третье число путем логического сложения четных разрядов первого числа и нечетных разрядов второго
Нужна твоя помощь в TASM: нужно написать программу,а я не понимаю: Даны 2 числа в двоичном коде....

Функция преобразующая строку двоичных цифр в целое десятичное число
Написать функцию преобразования строки двоичных цифр в целое десятичное число.В основной прогамме...

15
Эксперт Pascal/Delphi
6811 / 4568 / 4819
Регистрация: 05.06.2014
Сообщений: 22,438
31.10.2015, 14:30 2
Вот такое нужно?
Преобразовать набор нулей и единиц (двоичное число) в десятичное
0
0 / 0 / 0
Регистрация: 27.10.2015
Сообщений: 30
31.10.2015, 15:24  [ТС] 3
Да, но надо связать это с одномерным типом-массивом(вектором)
0
Модератор
10049 / 5393 / 3351
Регистрация: 17.08.2012
Сообщений: 16,494
03.11.2015, 10:08 4
Цитата Сообщение от dimitruf Посмотреть сообщение
надо связать это с одномерным типом-массивом
Идиотское требование. Достаточно было бы и строки символов, но... Если прям таки чтобы был тип одномерный массив... Тогда как-то так, с проверкой ввода, диапазон чисел - longint:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
type digits = array [0..sizeof(longint) * 8 - 1] of byte;
var d: digits;
    i, n: longint;
    s: string;
    error: boolean;
begin
  error := false;
  for i := 0 to 31 do d[i] := 0;
  writeln('Введите двоичное представление числа, не более 32 разрядов: ');
  repeat
    readln(s);
    error := length(s) > 32;
    if not error
      then
        for i := length(s) downto 1 do
          if s[i] in ['0', '1']
            then d[length(s) - i] := byte(s[i]) and 1
            else begin
              writeln('Ошибка: число содержит неверную двоичную цифру: ', s[i], ', повторите ввод.');
              error := true;
              break
            end
      else writeln('Ошибка: в числе более 32 разрядов, повторите ввод.')
  until not error;
  n := 0;
  for i := 31 downto 0 do n := n shl 1 or d[i];
  write('Десятичное представление числа: ', n);
  readln
end.
0
0 / 0 / 0
Регистрация: 27.10.2015
Сообщений: 30
04.11.2015, 14:47  [ТС] 5
Спасибо большое за программу. Не могли бы вы пояснить 1 и 17 строки своей программы?
0
Модератор
10049 / 5393 / 3351
Регистрация: 17.08.2012
Сообщений: 16,494
08.11.2015, 11:44 6
1 - описание типа для одномерного массива из байтов длиной, равной количеству бит в типе longint, индексация массива начинается с 0. Примечание: sizeof(что-то там) возвращает размер в байтах этого чего-то там. Для получения размера в битах умножаем на 8, для получения нужного диапазона индексов 0..31 (а не 0..32) вычитаем 1.

17 - преобразуем символ номер i из строки s в байт. Известно, что младший ниббл двоичных кодов цифровых символов соответствует количеству, который этот цифровой символ обозначает. В данном случае, все четыре младших бита кода символа не представляют интереса, достаточно знать значение только самого младшего бита. С помощью операции <что-то там> and 1 происходит установка в 0 всех разрядов чего-то там, за исключением младшего (нулевого), поскольку число 1 содержит нули во всех разрядах, кроме нулевого. Таким образом получаем значение (именно значение, то есть, число, соответствующее количеству, а не обозначение, то есть символ, соответствующий количеству) символа номер i из строки s, и помещаем это число в элемент массива d с соответствующим индексом. length(s) - i есть пересчёт номера символа в строке (нумерация символов в строке идёт слева направо, и начинается с единицы) в индекс массива, соответствующий номеру разряда в двоичном представлении числа. Нулевому разряду числа (и, в данном случае, нулевому индексу элемента массива d) соответствует самый последний (правый) символ строки, то есть, символ с номером length(s), первому разряду - символ с номером length(s) - 1, и так далее.
0
0 / 0 / 0
Регистрация: 27.10.2015
Сообщений: 30
09.11.2015, 18:29  [ТС] 7
Большое Вам спасибо за объяснение
0
0 / 0 / 0
Регистрация: 27.10.2015
Сообщений: 30
12.11.2015, 15:57  [ТС] 8
Вышла проблема...преподавателю не понравилось, что программа написана с использованием string. Не подскажите, как обойтись без этого типа?
0
Модератор
10049 / 5393 / 3351
Регистрация: 17.08.2012
Сообщений: 16,494
15.11.2015, 10:24 9
Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

Идиотизм. Ну да ладно. Можно по одной цифре вводить, проще всего начиная с младших разрядов. Но - это как-то не по людски. Ладно, бог с нею, по одной цифре в строке, но, всё же, начиная со старших разрядов, и с проверкой ввода. Вводить будем в тот же массив, начиная с индекса 0, а затем поменяем последовательность цифр на обратную.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
type digits = array [0..sizeof(longint) * 8 - 1] of byte;
var d: digits;
    i, n, k: longint;
    t: byte;
begin
  for i := 0 to 31 do d[i] := 0;
  writeln('Введите двоичное представление числа, по одной цифре в строке,');
  writeln('начиная со старших цифр, если цифр менее 32, то окончание ввода - число 2:');
  n := 31; {пока считаем, что число максимальной длины}
  for i := 0 to 31 do {ввод по одной цифре, начиная со старших разрядов}
    begin
      repeat
        write(': ');
        readln(k);
        if (k < 0) or (k > 2) then writeln('Ошибка: неверная цифра, повторите.')
      until (k >= 0) and (k <= 2);
      if k = 2
        then begin
          n := i - 1; {если введено менее 32 разрядов, запоминаем}
          break
        end
        else d[i] := k
    end;
  for i := 0 to n div 2 do {"переворачиваем" число, чтобы младший разряд был нулевым}
    begin
      t := d[i];
      d[i] := d[n - i];
      d[n - i] := t
    end;
  n := 0;
  write('Двоичное представление числа: ');
  for i := 31 downto 0 do
    begin
      write(d[i]:1);
      n := n shl 1 or d[i]
    end;
  writeln;
  write('Десятичное представление числа: ', n);
  readln
end.
Буферная переменная k не проверяется на значения, меньшие нуля, по той причине, что, если будет введено число меньше нуля, и без этого возникнет ошибка, ввиду того, что интервал значений типа byte есть [0..255].

Можно было бы вводить число из одной строки, посимвольно, но, полагаю, не прокатит: придётся читать именно по символу, а это - тип char, который, скорее всего, тоже табу.
0
0 / 0 / 0
Регистрация: 27.10.2015
Сообщений: 30
15.11.2015, 15:06  [ТС] 10
А как сделать так, чтобы, если вводим менее 32 разрядов, при выводе двоичного представления числа не было лишних разрядов с нулями?
0
Модератор
10049 / 5393 / 3351
Регистрация: 17.08.2012
Сообщений: 16,494
15.11.2015, 16:01 11
Ох, программа из поста #9... Я выложил по ошибке промежуточный вариант программы, а не окончательный. Он рабочий, но мои пояснения для k теряют смысл.

Без ведущих нулей можно. Однако, вывод перестанет быть информативным. Дело в том, что 31 (старший) разряд - это разряд знака числа. Если он равен 1, то число отрицательное. Поэтому, чтобы не возникало разночтений, я и вывожу все разряды, с 31 по 0. Без вывода незначащих разрядов, и, так как массив d инициализирован нулями, получается даже проще:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
type digits = array [0..sizeof(longint) * 8 - 1] of byte;
var d: digits;
    n: longint;
    i, t, k: byte;
begin
  for i := 0 to 31 do d[i] := 0;
  writeln('Введите двоичное представление числа, по одной цифре в строке,');
  writeln('начиная со старших цифр, если цифр менее 32, то окончание ввода - число 2:');
  k := 31; {пока считаем, что число максимальной длины}
  for i := 0 to 31 do {ввод по одной цифре, начиная со старших разрядов}
    begin
      repeat
        write(': ');
        readln(t);
        if t > 2 then writeln('Ошибка: неверная цифра, повторите.')
      until t <= 2;
      if t = 2
        then begin
          k := i - 1; {если введено менее 32 разрядов, запоминаем}
          break
        end
        else d[i] := t
    end;
  for i := 0 to k div 2 do {"переворачиваем" число, чтобы младший разряд был нулевым}
    begin
      t := d[i];
      d[i] := d[k - i];
      d[k - i] := t
    end;
  n := 0;
  write('Двоичное представление числа: ');
  for i := k downto 0 do
    begin
      write(d[i]:1);
      n := n shl 1 or d[i]
    end;
  writeln;
  write('Десятичное представление числа: ', n);
  readln
end.
Немного изменил типы переменных и их назначение. Теперь i - счётчик (как и было), k - номер разряда, на котором был прерван ввод, t - буферная переменная, n - десятичное представление числа.
1
0 / 0 / 0
Регистрация: 27.10.2015
Сообщений: 30
15.11.2015, 16:08  [ТС] 12
Спасибо большое за то, что помогли с программой. Хотелось бы уточнить, в 30 строке вашей программы так и должно быть n:=0, а не k:=0? И не могли бы вы пояснить роль t в 26 строке?
0
Модератор
10049 / 5393 / 3351
Регистрация: 17.08.2012
Сообщений: 16,494
15.11.2015, 17:01 13
Цитата Сообщение от dimitruf Посмотреть сообщение
так и должно быть n:=0, а не k:=0?
Да, теперь так и должно быть. В целях упрощения, я закрепил за каждой переменной определённое её назначение, как описано постом выше.
Цитата Сообщение от dimitruf Посмотреть сообщение
пояснить роль t в 26 строке
Согласно указанному, t - это буферная переменная. На самом деле, в цикле (строки 24 - 29) происходит обмен между элементами массива d[i] и d[k - i]. Ну и, всё просто... d[i] запоминаем в t, затем переписываем из d[k - i] в d[i], и вот он, момент истины... Если бы не было запомнено старое значение d[i], оно было бы потеряно. Далее в d[k - i] пишем t, которое есть ни что иное, как старое значение d[i]. Всё, d[i] и d[k - i] местами поменяны. Для чего нужно что-то там менять местами? Это всё оттого, что я сделал ввод цифр числа по-человечески: от старшего разряда к младшему. Длина числа заранее неизвестна, поэтому сначала оно вводится "зеркально": на месте младшего разряда запоминается самый старший разряд, и так далее. После того, как число введено, количество разрядов становится известным, и этот обмен нужен только для того, чтобы разместить разряды числа в элементы массива с соответствующими номерами: младший разряд - в нулевой элемент, и так далее. Можно и не менять, однако, тогда придётся сразу запоминать двоичную цифру в соответствующем элементе массива d. Так как заранее количество разрядов неизвестно, на деле это обозначает ввод числа, начиная с самого младшего разряда. То есть, к примеру, число 1310 = 11012 придётся вводить как 1011, а не 1101. Такой ввод не является общепринятым. На всякий случай, вариант с таким вот "не таким" вводом, естественно, уже без цикла обмена:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
type digits = array [0..sizeof(longint) * 8 - 1] of byte;
var d: digits;
    n: longint;
    i, t, k: byte;
begin
  for i := 0 to 31 do d[i] := 0;
  writeln('Введите двоичное представление числа, по одной цифре в строке,');
  writeln('начиная с МЛАДШИХ цифр, если цифр менее 32, то окончание ввода - число 2:');
  k := 31; {пока считаем, что число максимальной длины}
  for i := 0 to 31 do {ввод по одной цифре, начиная с младших разрядов}
    begin
      repeat
        write(': ');
        readln(t);
        if t > 2 then writeln('Ошибка: неверная цифра, повторите.')
      until t <= 2;
      if t = 2
        then begin
          k := i - 1; {если введено менее 32 разрядов, запоминаем}
          break
        end
        else d[i] := t
    end;
  n := 0;
  write('Двоичное представление числа: ');
  for i := k downto 0 do
    begin
      write(d[i]:1);
      n := n shl 1 or d[i]
    end;
  writeln;
  write('Десятичное представление числа: ', n);
  readln
end.
Надеюсь, понятно пояснил... Что-то сегодня у меня с выражением своих мыслей не очень...
1
0 / 0 / 0
Регистрация: 27.10.2015
Сообщений: 30
16.11.2015, 14:29  [ТС] 14
Большое спасибо, что помогли разобраться, вы меня спасли.
0
Cyborg Drone
16.11.2015, 15:28
  #15

Не по теме:

Нет, не совсем так. Может быть, конечно, я Вас и спас, однако, если мерять уж совсем грубо, все вопросы на форуме делятся на две разновидности: "помогите" и "помогите (в смысле: Вы чо, не пояли? Сделайте за меня, разбираться с этой пфнёй у меня нет ни малейшего желания)". Профит Вам, что Вы не относитесь к категории ленивых неучей, так что помогать Вам было просто и легко. И получается, что Вы помогли себе сами: Вы решали проблему, нашли способ её решения и решили её. Не получили готовое решение, а именно решили. Да, я, конечно, помогал Вам, по мере возможности, что, зачем, куды и как. Однако, в отличие от второй описанной мной категории, Вы Ваши знания преумножили (блин, слово какое пафосное, аж зубы ломит), и, полагаю, уже можете повторить подвиг (ну вот, опять...) выполнения подобного задания. Прошу прощения за несколько сумбурное повествование, но, надеюсь, Вы меня поняли.

0
0 / 0 / 0
Регистрация: 27.10.2015
Сообщений: 30
18.11.2015, 17:44  [ТС] 16
Да, я понял вас.
0
18.11.2015, 17:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.11.2015, 17:44
Помогаю со студенческими работами здесь

Преобразование строки двоичных цифр в эквивалентное ей целое десятичное число
2. Написать и протестировать функцию, которая преобразует строку двоичных цифр в эквивалентное ей...

Циклический сдвиг вправо массива байт на заданное число двоичных разрядов
Добре время суток, помогите в решение задачи, заранее спасибо: Разработать процедуру BigRorCount...

Пользователь вводит вещественное число вывести его в 2-ой СС с точностью до 10 двоичных разрядов
8) Пользователь вводит вещественное число. вывести его в 2-ой СС с точностью до 10 двоичных...

Написать процедуру и функцию преобразования строки двоичных цифр в целое десятичное число
Помогите пожалуйста. Нужно написать процедуру и функцию преобразования строки двоичных цифр в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru