Пример решения. 9. Вывести на экран массив случайных чисел "ёлочкой"
Primary tabs
Задача из этого списка
<?php
/*Задайте случайным образом массив из N элементов.
* Выведите его на экран "ёлочкой" */
function create_array ($n) // Создание массива случайных чисел
{
for ($i = 0; $i < $n; $i++) {
$arr[$i] = rand();
}
return $arr;
}
function printer_tree ($tree) // Вывод "ёлочкой"
{
$level_1 = array ($tree[0]); // Массив первой строки
echo $level_1[0], "<br>"; // печатается
$tree = array_slice ($tree, 1); // и сокращает $tree на самого себя
for ($j = 0; $j <= count($tree); $j++){
for ($i = 0; $i <= count($level_1); $i++) { // Массив второй строки, равный длине первого массива +1
$level_2[$i] = $tree[$i];
echo $level_2[$i], " "; // печатается
}
$level_1 = $level_2;
$tree = array_slice ($tree, count($level_2)); // и сокращает $tree на самого себя
echo "<br>";
}
}
$result = create_array(36);
foreach ($result as $k => $v) {
echo $v, " ";
}
echo "<p>";
printer_tree($result);Вроде заморочено, но получилось так.
- Log in to post comments
- 20050 reads
melisa
Mon, 04/24/2017 - 11:05
Permalink
альтернативный вариант
с помощью переменной $n, считающей количество элементов новой строки
<?php function create_array($m) // Создание массива случайных чисел { for ($i = 0; $i < $m; $i++) { $arr[$i] = rand(); } return $arr; } function printer_tree($tree) // Вывод массива "ёлочкой" { $n = 0; for ($i = 0; $i <= count($tree); $i++) { for ($j = 0; $j <= $n; $j++) { echo $tree[$j], " "; } $tree = array_slice($tree, $j); $n++; echo "<br>"; } } $result = create_array(36); foreach ($result as $k => $v) { echo $v, " "; } echo "<p>"; printer_tree($result);vedro-compota
Mon, 04/24/2017 - 13:44
Permalink
Пример решений
Рекомендую рассмотреть два, пожалуй, наиболее простых решения этой задачи (синтаксис Паскаль) и реализовать оба на php (вникнув в смысл).
_____________
матфак вгу и остальная классика =)
melisa
Tue, 04/25/2017 - 09:14
Permalink
альтернативное решение с помощью доп. переменных
альтернативное решение с помощью доп. переменных, считающих длину строки
<?php /*Задайте случайным образом массив из N элементов. * Выведите его на экран "ёлочкой" */ function create_array($m) // Создание массива случайных чисел { for ($i = 0; $i < $m; $i++) { $arr[$i] = rand(); } return $arr; } function printer_tree($tree) // Вывод массива "ёлочкой" { $n = 1; // Длина очередной строки $k = 0; // Длина печатаемой строки $i = 0; // while ($i < count($tree)) { while ($k < $n) { echo $tree[$i], " "; $k++; $i++; } echo "<br>"; $n++; $k = 0; } } $result = create_array(38); foreach ($result as $v) { echo $v, " "; } echo "<p>"; printer_tree($result);vedro-compota
Tue, 04/25/2017 - 10:40
Permalink
замечания
хорошо, но:
-- скорее это всё же, "длина очередной строки" (неточный комментарий)
while ($k < $n) { echo $tree[$i], " "; $k++; $i++; }-- всё же забыть про изменение счетчика в for сложнее. (это, опять же, концептуальная рекомендация, ну и for использует меньше строк кода).
_____________
матфак вгу и остальная классика =)
melisa
Tue, 04/25/2017 - 11:53
Permalink
Спасибо за уточение
В данном случае использован цикл while с ручным счётом в связи с тем, что при каждом следующем обращении к вложенному циклу \$i должно иметь присвоенное ранее значение. Цикл for каждый раз обнуляет значение счётчика, а значит, в каждой новой строке будет печататься \$tree заново, с элемента [0].
vedro-compota
Tue, 04/25/2017 - 11:57
Permalink
счетчик тут k
у вас счетчиком является k и вы его тоже обнуляете до начала вложенного цикла:
-- т.е. вы вполне можете сделать цикл for с этим счетчиком.
_____________
матфак вгу и остальная классика =)
melisa
Tue, 04/25/2017 - 12:13
Permalink
получилось так
for ($k = 0; $k < $n; $k++) { if ($i < count($tree)) { echo $tree[$i], " "; $i++; } else { break; } }vedro-compota
Tue, 04/25/2017 - 12:48
Permalink
то есть вы добавили проверку:
то есть вы добавили проверку:
if ($i < count($tree)) {чтобы вовремя оборвать очередную выводимую строку ёлочки -- значит она была нужна и в цикле while.
Кстати, там выводится предупреждение о выходе за диапазон (именно по этой причине):
_____________
матфак вгу и остальная классика =)
math2
Mon, 04/24/2017 - 13:22
Permalink
Подправил немного первый
Подправил немного первый вариант
<?php /*Задайте случайным образом массив из N элементов. * Выведите его на экран "ёлочкой" */ function create_array ($n) // Создание массива случайных чисел { for ($i = 0; $i < $n; $i++) { $arr[$i] = rand(1, 9) ; } return $arr ; } function printer_tree ($tree) // Вывод "ёлочкой" { $level=[]; // Массив "нулевой" строки for ($j = 0; $j <= count($tree); $j++) { $level = array_slice($tree, 0, count($level)+1); // Массив второй строки, равный длине первого массива +1 foreach ($level as $number) { // печатается "вторая" строка echo $number, " "; } $tree = array_slice($tree, count($level)); // и сокращает $tree на длину выведенной строки echo "<br>"; } } $result = create_array(38); foreach ($result as $k => $v) { echo $v, " "; } echo "<p>"; printer_tree($result);math2
Mon, 04/24/2017 - 13:29
Permalink
В обоих скриптах присутствует
В обоих скриптах присутствует неточность. Если мы будем выводить массив из 38 элементов,
то последние два элемента этого массива не будут выведены.
melisa
Mon, 04/24/2017 - 14:36
Permalink
действительно, не выводятся
действительно, не выводятся первые два элемента каждой строки (начиная с 3-й), если за ними не следует вывод последующих элементов.
math2
Mon, 04/24/2017 - 16:03
Permalink
Достаточно изменить условие в
Достаточно изменить условие в одном цикле. Итерация будет выполнена, если в массиве есть числа для вывода.
<?php /*Задайте случайным образом массив из N элементов. * Выведите его на экран "ёлочкой" */ function create_array ($n) // Создание массива случайных чисел { for ($i = 0; $i < $n; $i++) { $arr[$i] = rand(1, 9) ; } return $arr ; } function printer_tree ($tree) // Вывод "ёлочкой" { $level=[]; // Массив "нулевой" строки for ($j = 0; 0 < count($tree); $j++) { $level = array_slice($tree, 0, count($level)+1); // Массив второй строки, равный длине первого массива +1 foreach ($level as $number) { // печатается "вторая" строка echo $number, " "; } $tree = array_slice($tree, count($level)); // и сокращает $tree на длину выведенной строки echo "<br>"; } } $result = create_array(38); foreach ($result as $k => $v) { echo $v, " "; } echo "<p>"; printer_tree($result);melisa
Mon, 04/24/2017 - 16:19
Permalink
Спасибо!
Спасибо!