Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.04.22;
Скачать: [xml.tar.bz2];

Вниз

Pascal срочно, плзззз...   Найти похожие ветки 

 
Alx2   (2002-04-01 14:57) [40]

Вот вариант на "чистом" ObjectPascal:

Function rormax(Val: Word): Word;
Var
K, HigherBitPos, LowBit: Integer;
Begin
Result := Val;
If Val = 0 Then exit;
HigherBitPos := trunc(ln(Val) / ln(2));
For K := 0 To HigherBitPos Do
Begin
LowBit := Val And 1;
Val := (Val Shr 1) Or (LowBit Shl HigherBitPos);
If Val > Result Then Result := Val;
End;
End;



 
cok   (2002-04-01 20:07) [41]

2 Alx2 © (01.04.02 14:57)
Большое вам спасибо! Ваш код работает верно.


 
KSergey   (2002-04-08 10:27) [42]

А вообще это классно получается: дают человеку задачку (в некоем учебном заведении), он бросает ее в форум, на ответ говорит "а он неверен, сделайте чтоб работало!" после чего дожидается правильного решения, сдает его - ну и молодец короче. И это еще учитывая то, что задачи во всех учебных заведениях даются с расчетом на уровень троечника.
Далеко пойдешь, cok!
Хочется матом, да воспитание не позволяет.

PS: хотя обсуждение получилось весьма интересным, надо заметить.


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

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

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

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


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

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


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

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

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

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;


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

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


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

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

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;

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


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

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


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

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

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;


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

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

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

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;


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

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


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


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


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


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

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


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

Да и еще, если компилить АСМ-код в дельфи, то надо в начале функции поставить 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;


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

Блин, устал свои же ошибки править уже:)))
Если компилить АСМ-код в дельфи, то надо в начале функции поставить 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:18) [56]

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


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

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


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

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


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

.


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

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


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

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


 
cok   (2002-04-09 18:09) [62]

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



Страницы: 1 2 вся ветка

Форум: "Основная";
Текущий архив: 2002.04.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.009 c
7-70052
НЕО
2002-01-26 10:58
2002.04.22
LOGIN пользователя, работающего на машине в сети...


1-69932
inko
2002-04-09 15:46
2002.04.22
Значок программы в диалоге.


3-69725
User_OKA
2002-04-01 09:48
2002.04.22
ADO


1-69928
Dimaiv
2002-04-09 20:39
2002.04.22
Что делает процедура ProcessFile


14-69985
Fellomena
2002-03-14 13:04
2002.04.22
VFortran & MultiThreads Applications





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский