Мне нужно создать пирамиду, используя звездочки. Я указываю значение, которое становится основой пирамиды. База содержит столько же звездочек, сколько указано, и пирамида должна пропустить свои строки на 1. Здесь я столкнулся с проблемой, когда я указываю четное число базы.
Пирамида должна выглядеть так, как показано ниже.
* *** ***** ******* ********* **********
я осознаю
####* ###*** ##***** ###***** ####***** **********
Я хочу заменить # на пустое место, и я получаю ошибку, что количество звездочек в 4-й строке уменьшилось. Как исправить эти две ошибки?
function create_pyramid($limit){ if ($limit > 0){ for ($row =0;$row<=$limit;$row++){ if (($row % 2 == 0) && ($row != $limit)){ continue;} $rows = ""; for ($col =0;$col<$row;$col++){ $rows= $rows.'*'; } $pattern = "%'#".((($limit - $row)/2)+$row)."s\n"; printf ($pattern,$rows); print '<br />'; } } else{ print "Invalid data"; } } create_pyramid(10);
Просто сделайте это проще:
function create_pyramid($limit) { for($row = 1; $row < $limit; $row ++) { $stars = str_repeat('*', ($row - 1) * 2 + 1); $space = str_repeat(' ', $limit - $row); echo $space . $stars . '<br/>'; } } echo "<pre>" ; create_pyramid(10);
Я предпочитаю мой:
echo '<pre>'; $n = 5; function print_tree($n, $str, $max) { for ($i = 0; ($i < (($max - $n) / 2)); $i++) { echo " "; } for ($i = 0; ($i < $n); $i++) { echo $str; } echo "<br/>"; } for ($flag = 0; ($flag < 2); $flag++) { for ($a = 1, $b = 1, $c = 1, $d = 4; (($d - 3) <= $n); $a += 2, $b++) { if ($flag == 1) { print_tree($a, "*", $max); } if ($b == $d) { if ($flag == 0) { $max = $a; } if (($d - 3) != $n) { $a -= ((2 * $c) + 2); } $b = 0; $d++; if (($d % 2) == 0) { $c++; } } } } if ((($foot = $n) % 2) == 0) { $foot++; } for ($i = 0; ($i < $foot); $i++) { print_tree($foot, "|", $max); }
выходы:
* *** ***** ******* ***** ******* ********* *********** ************* *********** ************* *************** ***************** ******************* ********************* ***************** ******************* ********************* *********************** ************************* *************************** ***************************** ************************* *************************** ***************************** ******************************* ********************************* *********************************** ************************************* ***************************************
||
||
||
||
||
Или даже этот:
<?php $n = 8; ob_start(); $stars = ($n - 1) * 2 + 1; $spaces = 0; for ($i = 0; ($i < $n); $i++) { echo str_repeat(' ', $spaces); echo str_repeat('*', $stars); echo ' '; echo str_repeat(' ', $spaces * 2); echo str_repeat('*', $stars); echo "\n"; $spaces += 1; $stars -= 2; } $stars = ($n - 1) * 2 + 1; $spaces = 0; $margin = $stars / 2 + 1; for ($i = 0; ($i < $n); $i++) { echo str_repeat(' ', $margin); echo str_repeat(' ', $spaces); echo str_repeat('*', $stars); echo "\n"; $spaces += 1; $stars -= 2; } echo trim(implode("\n", array_reverse(explode("\n", ob_get_clean()))), "\n"), "\n";
это дает:
* *** ***** ******* ********* *********** ************* *************** * * *** *** ***** ***** ******* ******* ********* ********* *********** *********** ************* ************* *************** ***************
смешные упражнения не так ли … 😎
Можешь попробовать
create_pyramid("*", 5); create_pyramid("@", 10); create_pyramid("^_^", 10); function create_pyramid($string, $level) { echo "<pre>"; $level = $level * 2; for($i = 1; $i <= $level; $i ++) { if (!($i % 2) && $i != 1) continue; print str_pad(str_repeat($string, $i),($level - 1) * strlen($string), " " , STR_PAD_BOTH); print PHP_EOL; } }
Выход A
* *** ***** ******* *********
Выход B
@ @@@ @@@@@ @@@@@@@ @@@@@@@@@ @@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@
Выход C
^_^^_^^_^ ^_^^_^^_^^_^^_^ ^_^^_^^_^^_^^_^^_^^_^ ^_^^_^^_^^_^^_^^_^^_^^_^^_^ ^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^ ^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^ ^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^ ^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^ ^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^^_^
<?php $n=9; for($i=0; $i<=$n; $i++) { for($j=1; $j<=$i; $j++) echo " "; for($k=1; $k<=$n-$i; $k++) echo $k; for($j=($k-2); $j>0; $j--) echo $j; for($k=1; $k<=$i; $k++) echo " "; echo "</br>"; } ?>
function create_row($num, $limit) { $append = ''; if($limit > $num && ($limit - $i) % 2 == 0) { $append .= '-'; } $stars = str_repeat('*', $num); $ap_len = floor(($limit - $num) / 2); $prepend = str_repeat('-', $ap_len); $append .= str_repeat('-', $ap_len); return $prepend . $stars . $append; } function create_pyramid($limit){ if ($limit > 0){ $no_last = false; for($i = 1; $i <= $limit; $i += 2) { print create_row($i, $limit) . PHP_EOL; if($i == $limit) { $no_last = true; } } if(!$no_last) { print create_row($limit, $limit) . PHP_EOL; } } } create_pyramid(10);
Из того, что я понимаю, то, что вы ищете, является нечетной пирамидой, то есть число * в каждой строке равно числу нечетных рядов чисел, например 1,3,5,7. Если вы хотите включить инструкции «if-else», вы можете перейти к указанным выше циклам, но если вы хотите использовать только циклы «для», вы можете использовать следующий код:
<?php $x=1; for($i=1;$i<7;$i++) { for($j=7;$j>$i;$j--) { echo ' '; } for($k=1;$k<=$x;$k++) { echo '*'; } $x=$x+2; echo "<br/>"; } ?>
Я думаю, что самым простым решением является создание 2 циклов с условием:
$n = 5; // specify how many rows you want to $stars = 0; for ($i = $n; $i > 0; $i--) { for ($j = 0; $j < $i + $stars; $j++) { if ($j < $i - 1) { echo " "; } else { echo "*"; } } $stars += 2; echo "\n"; }
Выход будет:
* *** ***** ******* *********
<?php $l=5; for ($i=1; $i <=5; $i++) { for ($k=1; $k < $l ; $k++) { echo ' '; } for ($j=0; $j<$i; $j++) { echo '*'; } $l--; echo "<br>"; } ?>
function create_piramide ($filas) { $n = $filas; echo '<pre>'; for ($i = $filas; $i >= 0; $i--) { echo str_repeat(' ', $i).str_repeat('o ', $n - $i)."\n"; } echo '</pre>'; } create_piramide (10);
Попробуй это.
$num = 5; for($row = 1; $row <= $num; $row++){ for($colspace = 1; $colspace <= $num-$row; $colspace++){ echo " "; } for($col = 1; $col <= $row; $col++){ echo "* "; } echo "<br />"; }
function pyramid($height) { for ($i = 1; $i <= $height; $i++) { echo str_repeat(" ", $height - $i); echo str_repeat('*', $i * 2 - 1) . '<br/>'; } } pyramid(5);
Форма алмаза
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * <?php $num=15; $num2=0; $half = $num; for($i=$num2; $i<=$num; $i++) { for($j=$half; $j>$i; $j--) { echo " "; } for($j=$num2; $j<=$i; $j++) { echo " * "; } echo "<br>"; } for($i=$num2; $i<=$num; $i++) { for($j=$num2; $j<=$i; $j++) { echo " "; } for($j=$half; $j>$i; $j--) { echo " * "; } echo "<br> "; } ?>
<?php ini_set('display_errors', 1); /** * Here is my solution for printing the pyramid using a class */ class pyramid { function __construct($rows) { for ($k=1; $k <= $rows ; $k++) { $this->space($rows,$k); $this->left($k); $this->right($k); echo "<br>"; } } public function left($k) { for ($i=1; $i < $k ; $i++) { echo $i; } } public function right($i) { for ($j=$i; $j >= 1 ; $j--) { echo $j; } } public function space($rows,$k) { for ($i=$rows-$k; $i > 0 ; $i--) { echo " "; } } } $pyramid = new pyramid(5); ?> <style type="text/css"> body{ font-family: monospace; font-size: 24px; } </style>