Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Pascal срочно, плзззз...


Страницы:   1 2 3 4

cok ©   (2002-03-30 14:55:00) 

Я сейчас пишу прогу на Паскале, вот. Проблева в следующем:
у меня есть число в 10-ной системе счисления, я перевожу его в 2-ую сист.сч., меняю местами некоторые 1 и 0, а потом перевожу это в 10-ую сист.сч, но число больше 6000, и поэтому, когда я его перевожу в 2-ую сист. по длине оно будет ого го, т.е длиннее чем LongInt! Я пытался использовать тип comp или extended, но тогда прога не правильно будет переводить число в 10-ую сист. сч. Че делать?


cok   (2002-04-09 18:09:00) [1]

Эта ветка побьет все рекорды :)


[MC]NuClon   (2002-04-08 21:20:00) [2]

Сравни с http://informatics.ru/roi/XIII/firstround.xml
А мы ведь это решали.


cok   (2002-04-08 21:06:00) [3]

2 [MC]NuClon (08.04.02 20:35)
Если бы оно было такое простое, то наверное все бы решили его верно с 1-го раза, но этого что-то не наблюдалось (за редким исключением)


Yaro   (2002-04-08 20:43:00) [4]

.


[MC]NuClon   (2002-04-08 20:35:00) [5]

Задание пусть и не для троешников, но оно простое...
Хотите лучше?
Вас ждут тут: informatics.ru


cok   (2002-04-08 20:01:00) [6]

2 KSergey © (08.04.02 10:27)
ЭТО ЗАДАНИЕ НЕ ДЛЯ ТРОЕШНИКОВ!!!!!!!!!! Поверьте мне (я просто не хочу говорить откуда оно, но не из школы и даже близко не от туда!)


Rooman   (2002-04-08 13:18:00) [7]

Вот. теперь точно все. Задача решена. Осталось оптимизировать с учетом закономерностей:)


Rooman   (2002-04-08 13:14:00) [8]

Блин, устал свои же ошибки править уже:)))
Если компилить АСМ-код в дельфи, то надо в начале функции поставить push ebx, а в конце - pop ebx. То есть:

function rotatemaxN(N:word):word;
asm
push ebx
and ax,ax
jz @5
mov cx,$8000
mov dx,ax
@1:
mov bx,cx
test ax,cx
jnz @2
shr cx,1
jmp @1
@2:
shr dx,1
jnc @3
or dx,cx
@3:
cmp ax,dx
jae @4
mov ax,dx
@4:
shr bx,1
jnz @2
@5:
pop ebx
end;


Rooman   (2002-04-08 13:12:00) [9]

Да и еще, если компилить АСМ-код в дельфи, то надо в начале функции поставить pusha, а в конце - popa. То есть:

function rotatemaxN(N:word):word;
asm
pusha
and ax,ax
jz @5
mov cx,$8000
mov dx,ax
@1:
mov bx,cx
test ax,cx
jnz @2
shr cx,1
jmp @1
@2:
shr dx,1
jnc @3
or dx,cx
@3:
cmp ax,dx
jae @4
mov ax,dx
@4:
shr bx,1
jnz @2
@5:
popa
end;


[MC]NuClon   (2002-04-08 13:04:00) [10]

хаха... Смотрю и удивляюсь... Из таких тривиальных тем получаются такие страсти... хыы. Конечно, кто-то прав, кто-то нет.
Кто-то сказал, мол, где это может применяться? А вы, уважаемый, когда-нибудь слышали про олимпиады??? И вообще задача на простой тривиальный перебор, но можно решить применив побольше мозгов, получив при этом более рациональный алгоритм.
Ходите к нам http://forum.isurgut.ru/cgi-bin/ultimatebb.cgi?ubb=forum&f=17
создайте нам атмосферу спора как тут.
http://nuclon.stsland.ru


Rooman   (2002-04-08 13:01:00) [11]


> Alx2 © (08.04.02 13:00)
> Издеваешься?
> rotatemaxN(11)=13. А надо 14 :P


см. последний ответ - он верный. (Rooman © (08.04.02 12:59))


Alx2   (2002-04-08 13:00:00) [12]

Издеваешься?
rotatemaxN(11)=13. А надо 14 :P


Rooman   (2002-04-08 12:59:00) [13]

Торможу и не бибикаю:))) Саму маску нельзя сдвигать:)

Вот так правильно (вроде окончательно):

function rotatemaxN(N:word):word;
asm
and ax,ax
jz @5
mov cx,$8000
mov dx,ax
@1:
mov bx,cx
test ax,cx
jnz @2
shr cx,1
jmp @1
@2:
shr dx,1
jnc @3
or dx,cx
@3:
cmp ax,dx
jae @4
mov ax,dx
@4:
shr bx,1
jnz @2
@5:
end;


и на Паскале:

function rotateN(N:word):word;
var mask,tmp:word;
begin
if N=0 then exit;
mask:=$8000;
while (mask and N)=0 do mask:=mask shr 1;
result:=N;
tmp:=mask;
while tmp>0 do
begin
asm
xor ax,ax
rcr N,1
jnc @1
mov ax,N
or ax,mask
mov N,ax
@1: shr tmp,1
end;
if N>result then result:=N;
end;
end;


Rooman   (2002-04-08 12:48:00) [14]

Блин, ошибку прозевал. Вот исправленый код:

function rotatemaxN(N:word):word;
asm
and ax,ax
jz @5
mov cx,$8000
mov dx,ax
@1:
test ax,cx
jnz @2
shr cx,1
jmp @1
@2:
shr dx,1
jnc @3
or dx,cx
@3:
cmp ax,dx
jae @4
mov ax,dx
@4:
shr cx,1
jnz @2
@5:
end;


Alx2   (2002-04-08 12:42:00) [15]

>Rooman © (08.04.02 12:23)
:))
Что, ж продолжим флейм.
rotateN(11)=13. А надо 14 :P


Rooman   (2002-04-08 12:40:00) [16]

А вот полностью на асме:

function rotatemaxN(N:word):word;
asm
and ax,ax
jz @4
mov cx,$8000
@1:
test ax,cx
jnz @2
shr cx,1
jmp @1
@2:
shr ax,1
jnc @3
or ax,cx
@3:
shr cx,1
jnz @2
@4:
end;

И не нужно логарифмов:)


Rooman   (2002-04-08 12:23:00) [17]

result:=N надо первой строчкой ф-ии поставить (а не четвертой)


Rooman   (2002-04-08 12:21:00) [18]

ага, погорячился с вышесказанным...
действительно, в задаче имеется ввиду вращение числа нефиксированой ширины... такое в практике нечасто встречается:)

ну хорошо, тогда так:

function rotateN(N:word):word;
var mask:word;
begin
if N=0 then exit;
mask:=$8000;
while (mask and N)=0 do mask:=mask shr 1;
result:=N;
while mask>0 do
begin
asm
xor ax,ax
rcr N,1
jnc @1
mov ax,N
or ax,mask
mov N,ax
@1: shr mask,1
end;
if N>result then result:=N;
end;
end;


Alx2   (2002-04-08 12:00:00) [19]

>Rooman © (08.04.02 11:36)
>утверждение о неработоспособности кода Анатолия?
"Вращать" число надо в пределах его битовой длины, а не регистра.
>Многие не знакомы с понятием "оптимизация кода процессора";
Нет достаточных оснований для такого высказывания. Хотя, если брать в соответствующих масштабах, то - пожалуй.
Но лабы оптимизировать под процессор обычно не требуется, если не оговорено другое.


Rooman   (2002-04-08 11:36:00) [20]

Выводов из всего этого четыре:

1. В уч.завед. у нас преподы не знакомы с Дельфи;
2. В наших уч.завед. учат тому, что было известно 20 лет назад, а сейчас нигде не нужно (не используется);
3. Многие не знакомы с понятием "оптимизация кода процессора";
4. Коммунизм жив!
:)))

П.С. А кстати, собственно, на чем основывается утверждение о неработоспособности кода Анатолия? У меня вот все верно работает:)


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо