Лаб.Pascal - Исследование соотношения количеств двоичных символов.

Ответить
Impulsive
Сообщения: 43
Зарегистрирован: 19 окт 2007, 20:53

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

Порядок выполнения работы

1. Изучить пример получения данных о появлении двоичных нулей и единиц, приведенный в таблице (ниже) для прямого двоичного кода с числом разрядов n=2.

Код: Выделить всё

Исходный алфавит   Коды знаков   Единицы / нули
1                      00                0/2
2                      01                1/3
3                      10                2/4
4                      11                4/4

2. Составить алгоритм и программу, обеспечивающие подсчет соотношения суммарных количеств единиц и нулей в наборе всех n-разрядных двоичных чисел, ограниченных числом N, включая само N. Отладить программу. Учесть при этом, что значение N исходно представлено в десятичной системе счисления, в то время, как исходное количественное соотношение следует определить применительно к элементам прямого двоичного кода.
Значения n и N задаются преподавателем.

3. Составленный алгоритм решения представить в виде:
а) совокупности элементарных блоков;
б) совокупности укрупненных блоков.

Наберите пожалуйста код в Pascal'e :confused: Или дайте ссылку на пример где уже разобрана такая програмка...
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

примеров программ перевода из двоичной системы в десятичную и наоборот в инете великое множество http://rain.ifmo.ru/cat/view.php/vis/co ... ghtforward

А вот решить эту задачу так, чтобы n могло бы быть не 8, 16, 32 а 256 (для турбопаскаля или еще больше для object-паскаля), вот это действительно достойно :)

(Как говорится сам себя не похвалишь, никто тебя не похвалит) ;)

Код: Выделить всё

var
  n:byte; m:string;
  c0,c1:longint;
  sb,sd:string;
  function nextbin(var s:string; i:byte):string;
  begin
    if s='' then begin
      s[0]:=char(i);
      fillchar(s[1],i,'0');
    end else begin
      if s[i]='0' then s[i]:='1' else begin
        s[i]:='0';
        if i>1 then s:=nextbin(s,i-1) else runerror(108);
      end;
    end;
    nextbin:=s;
  end;

  function nextdec(var s:string; i:byte):string;
  begin
    if length(s)=0 then s:='0' else begin
      if s[i]<'9' then inc(s[i]) else begin
        s[i]:='0';
        if i>1 then s:=nextdec(s,i-1) else s:='1'+s;
      end;
    end;
    nextdec:=s;
  end;
  procedure count01(var n0,n1:longint; s:string);
  var
    i:byte;
  begin
    for i:=1 to length(s) do case s[i] of
      '0': inc(n0);
      '1': inc(n1);
    end
  end;

begin
  sb:=''; sd:='';
  write('Input n:'); readln(n);

  write('Input N:'); readln(m);
  c0:=0; c1:=0;
  repeat
    nextbin(sb,n); count01(c0,c1,sb);
    writeln(nextdec(sd,length(sd)),'  ',sb,'  ',c0,'/',c1);
  until sd=m;


  readln;

end.
Здесь nextbin и nextdec - это функции прибавления единицы к двоичному и десятичному числу, хранящемуся в переменной string. Таким образом, программа не ограничена допустимыми значениями арифметических типов данных, а только длиной типа string!
Алгоритм очень и очень простой:
Параллельно, к двум числам прибавляется по единице, накопительно подсчитывается количество нулей и единиц и все выводится на экран до тех пор, пока десятичное число не сравняется с введенным заранее числом N. Ну, или пока не произойдет переполнение двоичного числа.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Impulsive писал(а):нарисовал блок схему, а препад спрашивает что каждая строчка делает. Не могли б вы прокомментировать каждую строчку.. воть :(


Ну уж прямо каждую? :)

функция nextbin - прибавляет 1 к двоичному числу в текстовом представлении.
Если строка пустая, то происходит инициализация числа - строка из i нулей.
Иначе проверяется символ в позиции i. Если это 0, то он просто меняется на 1, иначе 1 меняется на 0, но функция вызывает сама себя для позиции i-1.
Ну и проверка на переполнение там тоже есть.


функция nextdec делает то же самое, но там происзодит замена 0 на 1, 1 на 2, 2 на 3... путем INC(S), и лишь при замене 9 на 0 происходит рекурсивный вызов.

функция count01 накапливает количество нулей и единиц в счетчиках n0, n1

Ну а сама программа, как я уже говорил, проста.

sb и sd - двоичное и десятичное представление одного и того же числа
n - число битов
m- десятичное представление конечного числа.

В цикле repeat (
берется следующее двоисное число
подсчитывается кол-во 0 и 1
выводится результат:
* следующее десятичное,
* текущее двоичное,
* значения счетчиков
)
выход по условию sd=m
Impulsive
Сообщения: 43
Зарегистрирован: 19 окт 2007, 20:53

Цикл заканчивается когда sb=m..?
Ну все впринципе понятно, спасибо что не обошли мимо не пнули
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Impulsive писал(а):Цикл заканчивается когда sb=m..?
Ну все впринципе понятно, спасибо что не обошли мимо не пнули



нет. sd=m

например
m='5418'
а sd сначала '', потом '0', потом '1', '2'....'10','11' и т.д.
Крутится, пока не совпадет.

Параллельно sb равно '', потом '0...00' (n нулей), '0...01', '0...10', '0...11'...

Оба числа выводятся на экран на каждой итерации.
Ответить