Помощь - Поиск - Пользователи - Календарь
Полная версия: 2 переменные по байту
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Ipkis
Вводятся 4 числа:
1-е от 0 до 3
2-е от 4 до 10
3-е от 11 до 21
4-е от 0 до 255

используя только 2 переменных по байту
Вывести их в обратном порядке...
Altair
Схема.
1 переменная (байт) - 4-ое число (от 0 до 255).
2 переменная:

xxxxxxxx (1 байт, 8 бит, где x - i-тый бит).
первые 2 бита (0,1) юзаешь под 1 число
биты 2-4 под 2 число
и 4- 7 под 3 число. (нумерация битов уц меня с 0).
Altair
Вот программа:
uses wincrt;
var
a,c:byte;
begin
c:=0; a:=0;
writeln('enter 1 chislo');
readln©; a:=c shl 6; {1 add}
writeln('enter 2 chislo');
readln©; a:=a or (c shl 3); {2 add}
writeln('enter 3 chislo');
readln©; a:=a or (c-11);
writeln('enter 4 chislo');
readln©;
writeln('-------------------');
writeln(a,' ',c);
writeln('-------------------');
writeln©;
c:=0 or (a shl 5);
c:=c shr 5;
writeln(c+11);
c:=0 or (a shl 2);
c:=0 or (c shr 5);
writeln©;
c:=0 or (a shr 6);
writeln©;
readln;
end.


p.s. спасибо за задачу, давно не работал с битовыми операциями, интересно... good.gif
Ipkis
Цитата(Altair @ 22.11.2005 3:25)
Схема.
1 переменная (байт) - 4-ое число (от 0 до 255).
2 переменная:

xxxxxxxx (1 байт, 8 бит, где x - i-тый бит).
первые 2 бита (0,1) юзаешь под 1 число
биты 2-4 под 2 число
и 4- 7 под 3 число. (нумерация битов уц меня с 0).


Спасиба за ответ...

Но вот почему 4й бит у тебя и во 2м числе и в 3м??????
Atos
To: Altair
A действительно, странно: диапазон первого числа ровно 2 бита, второго числа - ровно три бита, третьего числа - больше трёх бит! Как же ты умудряешься засовывать их все в 8 бит? blink.gif {опять компилятора под рукой нет, но такое ощущение, что при некоторых значениях декодирование будет неправильным}
hiv
Да - тут лажа!
0..3 - 4 числа
4..10 - 7 чисел
11..21 - 11 чисел
тогда имеем 4*7*11-1=307 вариантов, что больше 255! wacko.gif
virt
вот именно что там надо 9 бит уместить в 8.
Altair
Вч читать умеете ?
Цитата
третьего числа - больше трёх бит!

А вы видите -11 в программе ????
Вообще прогу-то запускали ? работатет ?
Тогда ПЕРЕД ТЕМ КАК ОРАТЬ, надо глаза открыть и почитать ПРОГРАММУ!!!!!!
Цитата
опять компилятора под рукой нет, но такое ощущение, что при некоторых значениях декодирование будет неправильным}

Всегда правильно! Ты что думаешь я не тестирую программы перед выкладыванием и нарушаю правила ?

Цитата
Да - тут лажа!

лажа у вас в посте , уважаемый ;)
что бы уместить 3 число, нужно диапазон на 11 сократить... тогда в 3 бита уместитмся.
Ipkis
Цитата(Altair @ 23.11.2005 23:07)
Вч читать умеете ?

А вы видите -11 в программе ????
Вообще прогу-то запускали ? работатет ?
Тогда ПЕРЕД ТЕМ КАК ОРАТЬ, надо глаза открыть и почитать ПРОГРАММУ!!!!!!

Всегда правильно! Ты что думаешь я не тестирую программы перед выкладыванием и нарушаю правила ?
лажа у вас в посте , уважаемый ;)
что бы уместить 3 число, нужно диапазон на 11 сократить... тогда в 2 бита уместитмся.


По повду строчки readln©; a:=a or (c-11);
Максимальное значение 3го числа - 21
Если сокращаем на 11 полуаем максимальное значение 10
10 в двоичной 1010 т.е 4 бита....
Ipkis
Еще не большое дополнение....
по поводу строчки
writeln('enter 2 chislo');
readln©; a:=a or (c shl 3); {2 add}\\

максимум 2го чмсла это 10 т.е 4 бита...
наверное нужно сократить на 3...
тогда получим максимум 7 а это уже 3 бита...
Altair
да чуть алгоритм я напутал но все равно несложно апрогу модифицируешь
так.


1 число 0-3 (2 бита)
2 число 4-10 -> 0-6 (3 бита)

3 число 11-21 -> 0-10

а что если записать в оставлиеся 3 бита ОСТАТОК от деления 3 числа (интервал от 0 до 10) НА 3 ? smile.gif
Остаток по любому будет НЕ больше 2...
? или я опять что то просмотрел ?

тогда выходит что у нас вообще 1 бит лишний при такой архивации, и обратно все востановимо
Altair
нет не то smile.gif
virt
Цитата
enter 1 chislo
3
enter 2 chislo
10
enter 3 chislo
21
enter 4 chislo
255
-------------------
218 255
-------------------
255
13
3
3

самый простой тест.
Altair
Вирт читаем книгу по тестированию и понимаем что это не самый простой тест.. тиесты такого типа называютсчя тестами на граничные условия.. ты меня все равно не переспоришь ;)

кстати к чему пост ?
уже выше разобрались что допущенна ошибка...
virt
я книжек по тестированию не писал ,я просто 3 года в школе на олимпиадах составлял полные системы тестов для проверки своего решения. Простой тест это тот который пришел в голову с первого взгляда на решение. Само собой это граничный тест. Простые тесты в твоей терминологии на этой проге бы прошли.

я когда открыл тему твоего последнего еще не было. unsure.gif
Ipkis
Всем спасибо... Особенная благодарность wink.gif
2altair
2hiv

Я уже сам решил эту интересную задачку...
Вот код...

uses crt;
var
a,c:byte;

Procedure Main;
begin
writeln('enter 2');
readln©; a:=a or (c shl 4);

writeln('enter 3');
readln©; a:=a or (c-11);

writeln('enter 4');
readln©;
{-----------------------------------------------}
writeln('-----------------');
writeln©; {-4}
c:=0;

c:=0 or (a shl 4);
c:=c shr 4; {-3}
writeln(c+11);

c:=0 or (a shr 4); {-2}
writeln©;
end; {main}


{==================================================}
begin
ClrScr;
c:=0; a:=0;
writeln('enter 1');
readln©;

case c of
0:begin
main;
writeln('0');
end;
1: begin
main;
writeln('1');
end;
2: begin
main;
writeln('2');
end;
3: begin
main;
writeln('3');
end;
end;{case}

Readln;
end.
Altair
ха-ха-ха smile.gif) круто smile.gif
Вот что значит олимипиадная... глдавное результат и условия..
а я все мучался над тем как в 8 бит впизнуть 9... а это вовсе и не надо! lol.gif
Ipkis, молодец! good.gif
virt
все гениальное просто..
Ipkis
УГУ... Все генитальное просто.... yes2.gif

А вообще была еще другая идея,
но не совсем честная...

Использовать служебные переменные...
Ведь
- я их не объявляю!!!
-память для них уже выделена
-они существуют независимо от того использую я их или нет...

В начале думал использовать SetBkColor (из Graph)
а потом вернуть значение через GetBkColor...
но не подходит(появляются траблы)...
но все-равно можно найти другую служебную переменную...

Счас нет времени на поиски...
но если есть идеи,то это только приветствуется.. cool.gif .
klem4
Цитата(Ipkis @ 24.11.2005 23:23)
служебные переменные...


Цитата(Ipkis)
В начале думал использовать SetBkColor (из Graph)


Ну во первых SetBkColor - это всетаки процедура ... а во вторых идея конечно интересная, но имхо это может привести к дичайшим ошибкам и неразберихе ...
Altair
Этот вариант мог бы не прокатить, чаще всего стандартные модули просят отключать в таких задачах...
virt
всегда просят ,к тому же системная переменная тоже переменная.
Ipkis
Мне эта задачка понравилась... хотелось бы просто ради интереса еще
один способ придумать...

вот идейка... может как-то считывать с экрана данные...

по началу хотел использовать AssignCRT но для этого нужна
перемення типа Text... неподходит...

Но ведь можно, как-то Считывать с экрана значения в переменные типа char
передвигать курсор и тут же выводить....

У кого есть идеи???
Ipkis
Ну что ни у кого нет ни каких идей????
Altair
А что, вариант который ты привел не устраивает ? я думал это единственное решение...
Ipkis
Устраивает... то была моя лаба... и я ее уже сдал...
но зацепила меня эта задачка чем-то...
я на нее потратил больше времени чем на все остальные вместе...

Потому и хочеться еще какой нить способ...

Есть идеи???
Altair
ну я думал над задачей...
Запихнуть все что по условию вводит юзер (3 числа) в 1 байт просто невозможно никаким методами...
если хочешь можно конечно попробовать вывести доказательство этого (строго математически)..
в задаче предполагалась именна та хитрость на которую ты пошел... ИМХО
xds
Сегодня наконец заглянул в этот пост... в итоге, когда написал решение, оказалось, что оно совпадает с предложенным Ipkis. Могу только простонать про совместимость со стандартным вводом-выводом (у меня мания совершать бесполезные действия).

program Perversion;

var
a, b: Byte;

procedure ReadAndWrit;
begin
Write('n2>');
Readln(a);
b := (a - 4) shl 4;
Write('n3>');
Readln(a);
b := b or (a - 11);
Write('n4>');
Readln(a);
Write(a, ' ', b and $F + 11, ' ', b shr 4 + 4, ' ');
end;

begin
Write('n1>');
Readln(a);
case a of
0:
begin
ReadAndWrit;
Writeln('0');
end;
1:
begin
ReadAndWrit;
Writeln('1');
end;
2:
begin
ReadAndWrit;
Writeln('2');
end;
3:
begin
ReadAndWrit;
Writeln('3');
end;
end;
end.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.