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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.036 c
9-1088730453
Xerx
2004-07-02 05:07
2004.12.05
Источники света


14-1100374186
Dima1
2004-11-13 22:29
2004.12.05
пиктограмки у Microsoft Office 2003


8-1094490378
Klopan
2004-09-06 21:06
2004.12.05
mp3 player в DOS


1-1100862998
Dolphin001
2004-11-19 14:16
2004.12.05
msEquation


1-1100842682
vovchik
2004-11-19 08:38
2004.12.05
Передача параметров





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский