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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2015, 17:39   #1
Asya7
Пользователь
 
Аватар для Asya7
 
Регистрация: 30.11.2014
Сообщений: 65
По умолчанию Задача с двоичной системой счисления

Задача с двоичной системой счисления. Я решила её, но сказали, что переводить в десятичную нельзя. Помогите, пожалуйста, если можете и лучше с подробным объяснением. Нужно под буквой с.
Изображения
Тип файла: jpg pKBAi9BZm18.jpg (58.0 Кб, 124 просмотров)
Asya7 вне форума Ответить с цитированием
Старый 15.01.2015, 17:49   #2
Asya7
Пользователь
 
Аватар для Asya7
 
Регистрация: 30.11.2014
Сообщений: 65
По умолчанию

Вот в таком виде я её сдала. Как без перевода сделать не знаю.

Код:
program nomer_589;
var
  b:array [1..1000] of integer;
  k,a,i,n:integer;
  p:real;
begin
  write('Введите двоичное число (цифры через пробел): ');
  p:=0;
  k:=0;
  while not eoln do
    begin
      read(b[1]);
      k:=k+1;
    end;
  n:=k;
  for i:=n-1 downto 0 do
    begin
      p:=1+power(2,0)*b[1];
    end;
  {writeln('Полученное десятичное число: ',p:8:0);
  p:=p+1;
  a:=round(p);}
  writeln('Полученное двоичное число: ',a); 
  i:=0;
  while a>=1 do
    begin
      i:=i+1;
      b[i]:=a mod 2;
      a:=a div 2;
    end;
  n:=i;
  writeln;
  for i:=n downto 1 do
    write(b[i]);
  readln;
  end.
Asya7 вне форума Ответить с цитированием
Старый 15.01.2015, 17:50   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Вспомнить десятичную арифметику в столбик и приспособить её для двоичной
Код:
  1000101110      1000101111      1000101110      1000101111
+          1    +          1    -          1    -          1
-------------   -------------   -------------   -------------
  1000101111      1000110000      1000101101      1000101110
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 15.01.2015, 18:05   #4
NetSpace
Участник клуба
 
Аватар для NetSpace
 
Регистрация: 03.06.2009
Сообщений: 1,814
По умолчанию

прибавляем к числу 1
Код:
p:=1;
for i:=n downto 1 do
begin
   b[i]:=b[i]+p;
   ii(b[i]=1)then p:=0;//был 0 - стал 1, то прибавлять старшим разрядам уже ничего не надо
   if(b[i]=2)then
   begin
      b[i]:=0;//а если был 1 то стал обратно 0 и +1 к старшему разряду; 
      p:=1;
   end;
end;
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.

Последний раз редактировалось NetSpace; 15.01.2015 в 18:09.
NetSpace вне форума Ответить с цитированием
Старый 15.01.2015, 18:13   #5
Asya7
Пользователь
 
Аватар для Asya7
 
Регистрация: 30.11.2014
Сообщений: 65
По умолчанию

Аватар, а то есть нужно ещё будет прописать перед тем как складывать все условия, о сложении, что 1+1=10 и остальные, да?
Asya7 вне форума Ответить с цитированием
Старый 15.01.2015, 21:24   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Asya7, посмотрите код из пост #4
он довольно понятно иллюстрирует цикл по сложению "в столбик"

хочу обратить ваше внимание, что в исходном условии задачи есть одно очень необычное условие: заданы числа a0 a1 .. an
казалось бы, что в этом необычного?
а необычно то, что в записи числа мы слева направа сначала указываем СТАРШИЕ разряды числа, потом меньшие.
таким образом, например, десятичное число 50 в десятичном виде (привычно нам, будет записано как 110010b )
Но, если проставить номера (степени == вес разряда), то это будет выглядеть так:
Код:
    1    1    0   0    1   0
   a5   a4   a3  a2   a1  a0
но в задаче идёт речь про последовательность a0.. an - т.е. это цифры числа В ОБРАТНОМ ПОРЯДКЕ.

Зачем создатели задачи так извратились, я, честно говоря, не понимаю!...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.01.2015, 00:25   #7
Asya7
Пользователь
 
Аватар для Asya7
 
Регистрация: 30.11.2014
Сообщений: 65
По умолчанию

NetSpace, вот пытаюсь решить задачу свою. А вот как представить число p не знаю ... подскажите, если можете. Вот, что у меня получилось:
Код:
program nomer_589(c);

function um(const s: string): longint;
var
  i: integer;
  r: longint;
begin
  r := 0;
  for i := 1 to length(s) do 
  begin
    if (s[i] = '1') or (s[i] = '0') then
      r := r * 2 + (ord(s[i]) - ord('0'))
    else begin
      um := -i;
      exit;
    end;
  end;
  um := r
end;

function umnogenie(dec: longint): string;
begin
  if dec = 0 then umnogenie := ''
      else
  if odd(dec) then
    umnogenie := umnogenie( dec div 2) + '1'
  else
    umnogenie := umnogenie(dec div 2) + '0';
end;

const
  t = 3;

var
  s: string;
  d1: longint;

begin
  
  Write('введите первое двоичное число: '); ReadLn(s);
  d1 := um(s);
  WriteLn('Произведение равно ', umnogenie( d1 * t ));
  Readln
end.
Asya7 вне форума Ответить с цитированием
Старый 18.01.2015, 14:29   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Asya7
NetSpace, вот пытаюсь решить задачу свою.
Asya7, ну и зачем Вам чужой код с процедурой УМНОЖЕНИЯ?!!
тем более, что Вам дали практически готовый код (см. пост #4 (c) NetSpace)

Цитата:
А вот как представить число p не знаю ...
кроме того, число p Вам уже ДАНО. Представляйте его в виде массива.

если Вас не смущает путаница в каком порядке исходно вводятся двоичные цифры числа p, тогда будет рассматривать, что эти цифры вводятся в нормальном порядке: от старших цифр (старшая цифра An) .. к младшим (цифра A0), тогда...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.01.2015, 14:53   #9
Asya7
Пользователь
 
Аватар для Asya7
 
Регистрация: 30.11.2014
Сообщений: 65
По умолчанию

Понимаете, мне сказали чтобы сделать задачу с помощью умножения и чтобы вводить число двоичное можно было неограниченно большое и переводит 3 не нужно в двоичную. ... Число p не нужно получается вообще. Я думала, что дана последовательность и с помощью неё в программе мы должны получить число p. Получается не нужно ничего прописывать??
Asya7 вне форума Ответить с цитированием
Старый 18.01.2015, 15:05   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ладно. вот мой код для решения вашей задачи.
разбирайтесь:
Код:
const MaxNumberBit = 100;
var p, pPlus1, pMinus1 : array[0..MaxNumberBit] of byte;
 s : string;
 i, n, start, sum, perenos, zaem : integer;
begin
  p[0] := 0; {число p будем заполнять начиная с 1-го элемента массива, нулевой оставляем для возможного переноса}
  repeat
    Write('Введите двоичное число p :'); ReadLn(s);
    
    {заполняем начиная с 1-го элемента массива,нулевой оставляем для возможного переноса}
    n := Length(s);
    for i:=1 to Length(s) do
      if s[i] in ['0','1'] then
          p[i] := ord(s[i]) - ord('0')
      else {ошибочный символ}
        n := -1; {признак ошибочного ввода}

    if n<1 then WriteLn('Вы ввели ошибочно не двоичное число. Попробуйте ещё раз!')
    else begin
      sum := 0; {проверим,что не ввели нулевое двоичное число}
      for i:=1 to n do sum := sum + p[i];
      if (sum=0) then begin
         WriteLn('Вы ввели ошибочно нулевое число. Это запрещено условиями задачи. '+
                 'Попробуйте ещё раз!');
         n := -1; {признак ошибочного ввода}
      end;
    end;
  until n>0;
  
  WriteLn;
  Write('ОК. Вы ввели двоичное число p: ');
  for i:=1 to n do Write(p[i]);
  WriteLn;
  
  {получение числа P+1}
  perenos := 1;
  for i:=n downto 0 do
  begin
    pPlus1[i]:=p[i]+perenos;
    perenos := pPlus1[i] div 2;
    pPlus1[i] := pPlus1[i] mod 2;
  end;
  
  start := 0;
  while (pPlus1[start]=0) and (Start<n) do Inc(Start);
  
  WriteLn;
  Write('двоичное число p+1: ');
  for i:=start to n do Write(pPlus1[i]);
  WriteLn;
  
  {получение числа P-1}
  zaem := 1;
  for i:=n downto 0 do
  begin
    if p[i]>=zaem then begin
       pMinus1[i] := p[i]-zaem;
       zaem := 0
    end
    else begin
       pMinus1[i] := p[i]+2-zaem;
       zaem := 1
    end;
  end;

  WriteLn;
  Write('двоичное число p-1: ');
  for i:=1 to n do Write(pMinus1[i]);
  WriteLn;


end.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перевод чисел между десятичной и фибоначчиваемой системой счисления genofond Паскаль, Turbo Pascal, PascalABC.NET 14 15.12.2012 21:43
модуль с двоичной системой счисления MishanyaZWER Паскаль, Turbo Pascal, PascalABC.NET 4 19.04.2010 18:49
Сложение, вычитание в двоичной системе счисления Vemor Паскаль, Turbo Pascal, PascalABC.NET 5 16.06.2009 14:02
Сложение в двоичной системе счисления Volchara Общие вопросы C/C++ 2 23.04.2009 19:54
Деление чисел в двоичной системе счисления Mss_Smith Помощь студентам 9 04.05.2007 17:02