|
|
|
|
|
для: Unkind
(23.05.2007 в 15:42)
| | в алголе относились к этому проще. Авторы какие хотели знаки такие и вводили .
begin - это тоже один отдельный знак . И if и procedure и прочие. А не как в C
В конце концов, множество знаков как-то отображалось на имеющийся набор символов.
На машине, на которой мне довелось работать, код { k = 1e6; } выглядел примерно так:
'BEGIN' 'REAL' K; K := 1Ю6; 'END'
Сравнения выглядели почти как в фортране 'IF' K 'NE' 1.57Ю3 'THEN' .... | |
|
|
|
|
|
|
|
для: Trianon
(23.05.2007 в 15:13)
| | Логично.
Кстати, а оператор "не равно" в Алголе правда как в математике, то есть зачеркнутый знак "равно"? Вроде он есть только в Unicode. | |
|
|
|
|
|
|
|
для: Unkind
(23.05.2007 в 15:08)
| | а после break - что пиши else - что не пиши - всё едино.
Соответственно, else - становится сорным оператором, никогда не получающим управления. вроде continue, который я случайно забыл в конце тела цикла. | |
|
|
|
|
|
|
|
для: Trianon
(23.05.2007 в 15:01)
| | Если я правильно Вас понял, то тогда надо было писать не
/// if(2 >= $n)
/// {
/// $q = 1;
/// $prim115 = true;
/// break;
/// }
/// --$n;
|
, а
/// if(2 >= $n)
/// {
/// $q = 1;
/// $prim115 = true;
/// break;
/// } else --$n;
|
| |
|
|
|
|
|
|
|
для: Unkind
(23.05.2007 в 14:59)
| | если n <= 2 то оба эти оператора выполняются. Что я и написал в подстрочнике..как раз строками
/// if(2 >= n)
/// {
/// $q = 1;
/// $prim115 = true;
/// break;
/// }
$prim115 = true; - тоже выполняется не всякий раз. Внимательнее читайте код. | |
|
|
|
|
|
|
|
для: Trianon
(23.05.2007 в 14:53)
| | OK, $q = 1; можно вообще удалить, $prim115 = false; вынести из цикла. | |
|
|
|
|
|
|
|
для: Unkind
(23.05.2007 в 13:35)
| | >В общем, у меня получилось с Вашей помощью перевести этот код на PHP. Огромное спасибо.
>выражение 2 >= n эквивалентно not (n>2)
>Конечно, но тут я не увидил ничего, указывающего отрицание: "if n>2 then".
>
плохо перевели.
Код на алголе
if n>2 then
begin n:=n-1; go to index end iter;
| означает на php
if($n>2) { --$n; далее продолжить выполнение кода с точки, помеченной меткой "index:" } //iter
|
а на С
if(n>2) { --n; goto index; } /* iter */
|
| |
|
|
|
|
|
|
|
для: Trianon
(23.05.2007 в 00:42)
| | выражение 2 >= n эквивалентно not (n>2)
Конечно, но тут я не увидил ничего, указывающего отрицание: "if n>2 then".
В общем, у меня получилось с Вашей помощью перевести этот код на PHP. Огромное спасибо.
<?php
set_time_limit(1);
header("Content-type: text/plain");
function factorial($a)
{
if((int) $a <> $a || $a <= 0) return false;
$factorial = 1;
for($i = 2; $i <= $a; $i++) $factorial = bcmul($factorial, $i);
return $factorial;
}
function permutation($n)
{
$k = $q = 0;
static $p, $d;
global $prim115, $x;
if($prim115)
{
$prim115 = false;
for($k = 2; $k <= $n; $k++)
{
$p[$k] = 0;
$d[$k] = 1;
}
}
$k = 0;
while(true)
{
$p[$n] = $q = $p[$n] + $d[$n];
if($q == $n)
{
$d[$n] = -1;
}
else
{
if($q != 0) break;
$d[$n] = 1;
$k++;
}
if($n > 2)
{
$n--;
$q = 1;
$prim115 = false;
}
}
$q += $k;
list($x[$q], $x[$q + 1]) = array($x[$q + 1], $x[$q]);
return $x;
}
$x = array(1 => "a", "b", "c", "d");
for($i = 1, $prim115 = true; $i <= factorial(count($x)); $i++)
{
echo($i . " " . implode(permutation(count($x))) . "\r\n");
}
?>
|
| |
|
|
|
|
|
|
|
для: Unkind
(22.05.2007 в 20:05)
| | begin означает открывающую фигурную скобку - начало составного оператора или блока.
end означает закрывающую фигурную скобку - конец составного оператора или блока.
Поскольку оператора goto в php нет, пришлось развернуть созданный им циклический код, и записать его в виде оператора цикла. Отсюда for, break, continue. Насколько аккуратно у меня это получилось - бог весть...
Еще одно важное замечание . Если я правильно помню, ключевое слово own означает примерно то же самое, что и static в С/PHP . Учтите пожалуйста. Массив там похоже статический. А сама процедура - с побочными эффектами.
выражение 2 >= n эквивалентно not (n>2)
continue - лишний.
А что Вы хотите - я операторы этого цикла раз двадцать тасовал, пока уложил. | |
|
|
|
|
|
|
|
для: Trianon
(22.05.2007 в 19:33)
| | А что значит "end" на конце "go to iter end;"?
Просто цикл теряет смысл...
if(2 >= n)
А почему "2 >= $n"? Вроде в коде "n>2".
continue;
Это еще тут зачем? :)) | |
|
|
|
|