Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.05;
Скачать: CL | DM;

Вниз

Pascal   Найти похожие ветки 

 
*******   (2004-11-12 20:48) [0]

В одной книге вопрос?
Записать группу команд

First:=First+1;
if First>max then
First:=1

одной командой на языке Pascal. Кто знает?


 
uny ©   (2004-11-12 20:52) [1]

first:=(inc first) and max; ?


 
heady   (2004-11-12 20:54) [2]

робко пробую: if inc(First)>max then First:=1;


 
*******   (2004-11-12 20:57) [3]

uny ©
попробовал не хочет работать.
Сам думал как, не получается.


 
*******   (2004-11-12 20:58) [4]

heady
подрозумевается что first постоянно изменяется.


 
uny ©   (2004-11-12 21:05) [5]

first:=(inc first) mod max;
в [1] не верно, от маx зависит, а так?


 
Verg ©   (2004-11-12 21:07) [6]

F := ( F + 1 ) mod max;


 
*******   (2004-11-12 21:10) [7]

uny ©

first должно быть равно потом 1, то я думаю
что сначала нужно mod, а потом как то изменить
значение first, в Delphi проверяю на (inc first)
выдает ошибку.


 
*******   (2004-11-12 21:14) [8]

Что приходит на ум только

first:=first mod max;
inc(first)

но это две команды.


 
GuAV ©   (2004-11-12 21:17) [9]

*******   (12.11.04 20:48)
одной командой

что есть одна комманда ?


 
uny ©   (2004-11-12 21:17) [10]

*******
[6] разве не верен? на дельфи и правда ошибка где Вы указываете, (я использую другую среду)


 
*******   (2004-11-12 21:20) [11]

Guav сам незнаю, такие вопросы вот в книгах без звездочки (*)


 
GuAV ©   (2004-11-12 21:23) [12]

if First > max + 1 then first:=1 else First := First + 1 ?


 
Тестировщица ©   (2004-11-12 21:26) [13]

Verg ©   (12.11.04 21:07) [6] Может, лучше  так:
First:=(First mod max)+1;


 
*******   (2004-11-12 21:27) [14]

GuAV © Возможно, скорее всего это и будет правильно.


 
*******   (2004-11-12 21:29) [15]

Тестировщица Очень благодарен, теперь буду знать!


 
GuAV ©   (2004-11-12 21:29) [16]

Тестировщица ©   (12.11.04 21:26) [13]
Гениально. Наверное это оно и есть.


 
Torin   (2004-11-12 21:30) [17]

if First > max + 1 then first:=1 else First := First + 1
Это не одна команда, а одна строчка в которой, по логике, 5 команд.


 
uny ©   (2004-11-12 21:34) [18]

условие не понел, отвечал ошибочно. извинения.


 
pasha_golub ©   (2004-11-15 18:03) [19]

Torin   (12.11.04 21:30) [17]
Под коммандой подразумевается оператор. А это и есть оператор ветвления. один-единственный


 
palva ©   (2004-11-15 18:11) [20]

first := first mod max + 1;


 
Gloomer ©   (2004-11-16 09:54) [21]

2 palva [20]
при first=max в результате выполнения получим first=2 :-(


 
REA   (2004-11-16 10:22) [22]

неа


 
begin...end ©   (2004-11-16 10:26) [23]


> [21] Gloomer ©   (16.11.04 09:54)

Очень сомневаюсь; результатом first mod max будет остаток от деления first на max; поскольку first = max, то остаток будет равен нулю, а 0 + 1 = 1.


 
SergP.   (2004-11-16 13:07) [24]


> begin...end ©   (16.11.04 10:26) [23]
>
> > [21] Gloomer ©   (16.11.04 09:54)
>
> Очень сомневаюсь; результатом first mod max будет остаток
> от деления first на max; поскольку first = max, то остаток
> будет равен нулю, а 0 + 1 = 1.


Ну тогда:

first := first mod (max+1) + 1


 
Abel   (2004-11-16 14:41) [25]

Только не спрашивайте, как ЭТО работает %))

program Project1;
{$APPTYPE CONSOLE}
uses
 SysUtils;
var
 r1, r2: Integer;
 f, max: Integer;
 i: Integer;
begin
 Randomize;
 for i := 1 to 1000000 do
 begin
   f := Random(1000);
   max := Random(1000);
   r1 := f;
   r1 := r1+1;
   if r1>max then
     r1 := 1;
   r2 := ((max div (f+1))*(f div (max+1))*max + (max div (f+1))*(f mod (max+1)))
         div
         ((max div (f+1)) + ((f+1) div (max+1))) + 1;
   if r1 <> r2 then
   begin
     Writeln("f=",f," max=",max);
     Writeln("r1=",r1," r2=",r2);
   end;
 end;
 Writeln("Ready!");
 Readln;
end.


 
palva ©   (2004-11-16 14:55) [26]

> Abel   (16.11.04 14:41) [25]
> Только не спрашивайте, как ЭТО работает %))

и что ОНО делает.


 
Pavia ©   (2004-11-16 19:33) [27]

if succ(First)>max then First:=1


 
Defunct ©   (2004-11-16 19:40) [28]

pasha_golub ©   (15.11.04 18:03) [19]
> А это и есть оператор ветвления. один-единственный

Вы не правы.

Опрератор ветвления:

If <условие> then <оператор> else <оператор>

итого 3 оператора.


 
Defunct ©   (2004-11-16 19:45) [29]

> palva ©   (16.11.04 14:55) [26]
> и что ОНО делает.


Какую-то не относящуюся к теме ерунду. Видимо автор поста увидел знакомое слово max ;>


 
Pat ©   (2004-11-16 21:14) [30]

А есть ли у кого еще такие же прикольные задания? Типа поменять местами два числа без использования дополниетельной переменной...и т.д.


 
SergP ©   (2004-11-16 22:21) [31]


>  [30] Pat ©   (16.11.04 21:14)
> А есть ли у кого еще такие же прикольные задания? Типа поменять
> местами два числа без использования дополниетельной переменной...и
> т.д.


:-)

Специально для тебя: как насчет поменять местами две строки не используя дополнительной переменной?


 
Pat ©   (2004-11-16 23:20) [32]

>SergP ©   (16.11.04 22:21) [31]
Строки одинаковой длины? :-)


 
Pat ©   (2004-11-16 23:43) [33]

Ладно, напишем для общего случая :-))

procedure ChangeStrings(var s1,s2:string);
 procedure LetsDoIt(var MinS,MaxS:string);
 var i,len1,len2:integer;
 begin
   len1:=length(MinS);
   len2:=length(MaxS);
   SetLength(MinS,length(MaxS));
   for i:=1 to len2 do
     begin
       MinS[i]:=chr(ord(MinS[i]) xor ord(MaxS[i]));
       MaxS[i]:=chr(ord(MinS[i]) xor ord(MaxS[i]));
       MinS[i]:=chr(ord(MinS[i]) xor ord(MaxS[i]));
     end;
   SetLength(MaxS,len1);
 end;

begin
if length(s1)<length(s2)
 then LetsDoIt(s1,s2)
 else LetsDoIt(s2,s1)
end;

procedure TForm1.Button1Click(Sender: TObject);
var s1,s2:string;
begin
s1:="Hello World!!!";
s2:="Hello MSWord";
showmessage(s1+#13#10+s2);
ChangeStrings(s1,s2);
showmessage(s1+#13#10+s2)
end;


 
Pat ©   (2004-11-16 23:45) [34]

Хотя, насчет дополнительных переменных я бы промолчал :-))) var i,len1,len2:integer
С другой стороны сравним размеры integer"а и string :-)


 
Pat ©   (2004-11-16 23:57) [35]

Начитался help"а на ночь:
SetLength procedure
Sets the length of a string or dynamic-array variable.
Existing characters in the string or elements in the array are preserved, but the content of newly allocated space is undefined
Всвязи с этим после строчки
SetLength(MinS,length(MaxS));
добавить
move(StringOfChar(#0,len2-len1)[1],MinS[len1+1],len2-len1);


 
Defunct ©   (2004-11-17 00:30) [36]

Pat ©   (16.11.04 21:14) [30]

Pat, я тут нашел интересную задачку для вас (думаю вы не справитесь с ней так быстро как с перестановкой строк).

Имеется 17 дорожных контрольных пунктов (КП) пронумерованных от 1 до 17, каждый КП располагается на перекрестке дорог. Найти такое расположение КП чтобы путь от любого i-го КП до любого другого j-го КП проходил максимум через один КП. Решением должен быть текстовый файл, в котором должно быть 17 строк, порядковый номер строки соответствует номеру КП, в каждой строке должны находиться 4 цифры - номера КП с которыми связан данный КП.


 
jack128 ©   (2004-11-17 01:53) [37]

Pat ©   (16.11.04 23:43) [33], [35]
все гораздо проще (и быстрее!!!) если использовать знание того, что строки - это ССЫЛОЧНЫЕ типы ;-)


 
Кто---то ©   (2004-11-17 04:05) [38]


> Pat ©   (16.11.04 21:14) [30]
> А есть ли у кого еще такие же прикольные задания?


Тоже самое, но чтобы
if First > max then First := 0


 
Defunct ©   (2004-11-17 04:16) [39]

> Тоже самое, но чтобы
> if First > max then First := 0

First := (First mod (max + 1)) * byte((First div (max + 1))=0 );


 
Defunct ©   (2004-11-17 04:22) [40]

> Тоже самое, но чтобы
> if First > max then First := 0

или еще тупее:
First := First * byte( First <= Max );


 
Defunct ©   (2004-11-17 04:33) [41]

> First:=First+1;
> if First>max then
> First:=1

 First := 1+(First * byte(First < Max));


 
Pat ©   (2004-11-18 12:06) [42]

Defunct ©   (17.11.04 0:30) [36]
Это уже олимпиадная задачка. Больше интересуют задачи на формат данных, хранение в памяти (например то, что в памяти вначале записываются младшие байты для word, integer) и т.д.
>jack128 ©   (17.11.04 1:53) [37]
Напиши как.. :)


 
_Lucky_   (2004-11-18 23:35) [43]

Pas
First := (byte (Not ((First + 1) > Max))) * (First + 1) + (byte (((First + 1) > Max)));
- хрен разберешь, предидущие решения куда приятнее :-)

C++
nFirst = (((nFirst+1) > nMax) ? (1) : (nFirst+1));


 
Defunct ©   (2004-11-19 01:16) [44]

_Lucky_  
А [40] видели.
First := First * byte( First <= Max );

Pas все таки лучше.


 
Кто---то ©   (2004-11-19 03:09) [45]


> Тестировщица ©   (12.11.04 21:26) [13]
> Verg ©   (12.11.04 21:07) [6] Может, лучше  так:
> First:=(First mod max)+1;

Между прочим на ассемблере это шесть команд, а вариант со сложением и условием только пять. Кроме того понятность и читаемость кода с условием и прибавлением единицы куда выше, чем этой формулы.


 
SergP ©   (2004-11-19 05:13) [46]


>  [32] Pat ©   (16.11.04 23:20)
> >SergP ©   (16.11.04 22:21) [31]
> Строки одинаковой длины? :-)


Допустим имеются две нуль-терминальных строки (pchar) одинаковой длины.

Дополнительных переменных не использовать совсем.


 
Pat ©   (2004-11-20 00:32) [47]

Извините за долгое отсутствие - жена, работа.. :)
>SergP ©   (19.11.04 5:13) [46]
var p1,p2:PChar;
begin
p1:="В лесу родилась елочка";
p2:="В лесу она росла";
showmessage(p1+#13+p2);
p1:=pointer(integer(p1) xor integer(p2));
p2:=pointer(integer(p1) xor integer(p2));
p1:=pointer(integer(p1) xor integer(p2));
showmessage(p1+#13+p2);
end;


 
default ©   (2004-11-20 00:50) [48]

First := Byte(First + 1 <= max) * First + 1


 
Defunct ©   (2004-11-20 01:28) [49]

default ©   (20.11.04 00:50) [48]

[41]
на одно сложение меньше


 
default ©   (2004-11-20 01:36) [50]

Defunct ©   (20.11.04 01:28) [49]
да, не принципиально
но вряд-ли в книге такой изврат имелся ввиду скорее просто if


 
Кто---то ©   (2004-11-21 02:39) [51]

А такое задание.
Можно ли одной формулой сделать следующее :

if      v >  77 then v :=  77
else if v < -77 then v := -77;


 
GuAV ©   (2004-11-21 02:44) [52]

Кто---то ©   (21.11.04 2:39) [51]
:)
v := v * ord(abs(V) < 77) + ord(abs(v) >= 77) * 77 * sign(v);


 
Кто---то ©   (2004-11-21 03:17) [53]


> GuAV ©   (21.11.04 02:44) [52]
> Кто---то ©   (21.11.04 2:39) [51]
> :)
> v := v * ord(abs(V) < 77) + ord(abs(v) >= 77) * 77 * sign(v);


С логическими операторами и дурак сделает.


 
KilkennyCat ©   (2004-11-21 03:26) [54]


> Кто---то ©   (21.11.04 03:17) [53]


> С логическими операторами и дурак сделает.


то есть, если я не смогу, я - вообще даун?
нафига спрашивали, если такой умный.


 
Кто---то ©   (2004-11-21 04:19) [55]

Ну, чего никто не может ?
А используя всякие and or xor и т п ?


 
jack128 ©   (2004-11-21 12:36) [56]

Pat ©   (18.11.04 12:06) [42]
вот примерно так:
Pat ©   (20.11.04 0:32) [47]

;-)



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

Текущий архив: 2004.12.05;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.036 c
3-1099901798
Victor!
2004-11-08 11:16
2004.12.05
Импорт Paradox в SQL Server


1-1100933147
Rocket
2004-11-20 09:45
2004.12.05
Проблема NUXI (преобразование endian)


4-1098449860
Shiza
2004-10-22 16:57
2004.12.05
Некоторые программы умеют форматировать дискеты под размер 1,72 М


1-1100767604
Floppy
2004-11-18 11:46
2004.12.05
Как программно открыть


14-1100460788
KOMATO3
2004-11-14 22:33
2004.12.05
Я б в программеры пошел, пусть меня научат!