Практика программирования (Бейсик, Си, Паскаль)


Задачи,советы и ответы - часть 24


Совет 2 (QBasic)

Так как входной язык не предлагает операцию сдвига кодов, то для сдвига вправо можно воспользоваться умножением на 2.

Совет 3 (Си)

Для большей наглядности тестирующей программы можно воспользоваться библиотечной функцией itoa и вывести двоичное представление числа п. Проверку битов целесообразно начать с самого старшего знакового разряда и в цикле сдвигать тестируемый код на 1 разряд влево. Если начать проверку с младшего разряда и сдвигать проверяемое число на 1 разряд вправо, то при отрицательном аргументе возникает бесконечный цикл из-за размножения знакового разряда. Условие окончания цикла (N не равно 0) при этом никогда не выполнится. Конечно, эту неприятность можно обойти, организовав фиксированное количество повторений цикла (точно 32 раза). Однако в этом случае зачастую совершается лишняя работа — единиц уже нет, а цикл еще не закончился. Можно предложить и такой вариант, когда вместо сдвига аргумента сдвигается тестирующая шкала.

Программа 2_14.bas

RЕМ Определение максимальной группы единиц в двоичном числе

DECLARE FUNCTION MaxBitS!(N&,s$)

CLS

INPUT "Введите целое число : ",М&

k%=MaxBits(M&,a$)

PRINT "Двоичное представление этого числа :"

PRINT a$

PRINT "Максимальное число подряд стоящих единиц = "; k%

END

FUNCTION MaxBits(NS,s$)

REM Перевод числа N в двоичное символьное представление

REM Поиск самой длинной группы единиц (MaxBits = длина)

IF N&=0 THEN MaxBits=0: s$="0": EXIT FUNCTION

FOR j=0 TO 31 : ' Формирование двоичного числа в строке s$

IF N& AND &H1 THEN

kBits=kBits+l : ' Подсчет подряд идущих единиц

IF kBits>max THEN max=kBits : ' Запомнили максимум

s$="l"+s$ : ' Приписали очередную единицу ELSE

kBits=0 : ' Сброс счетчика при встрече нуля

s$="0"+s$ : ' Приписали очередной ноль END IF

N&=(N&-k)/2 : ' Сдвиг на один разряд вправо

NEXT j

MaxBits=max

END FUNCTION

Программа 2_14.с

/* Определение максимальной группы единиц в двоичном числе */




- Начало -  - Назад -  - Вперед -