请打印菱形
<?php $max=5; for($i=1;$i<=$max;$i++){ printf(str_repeat(' ',$max-$i).str_repeat('*',$i).PHP_EOL); if($i==5){ for($j=$i-1;$j>=1;$j--){ printf(str_repeat(' ',$max-$j).str_repeat('*',$j).PHP_EOL); } } } echo PHP_EOL; $n=3; // 共有 2*$n + 1 层 for($i=1;$i<=2*$n+1;$i++){ //循环所有层 for($j=1;$j<=2*$n+1;$j++){ //循环所有列,把菱形想成正方形 if($j == $n-$i+2 || $j == $n+$i || $j == $i-$n || $j == 3*$n-$i+2){ echo "*"; }else{ echo "-"; } } echo PHP_EOL; } echo PHP_EOL; for($i=1;$i<=5;$i++){ //打印空格 for($j=1;$j<=5-$i;$j++){ echo " "; } //打印*号 for($k=1;$k<=2*$i-1;$k++){ echo "*"; } echo PHP_EOL; } echo PHP_EOL; function jinzita($n){ for($i=1;$i<=$n;$i++){ //打印前边空格 echo str_repeat(' ',$n-$i); //前边空格等于 $n-$i echo str_repeat('*',2*$i-1); //星星号等于 2*$n-1 echo PHP_EOL; } } jinzita(5); echo PHP_EOL; function lingxing($n){ for($i=1;$i<=$n;$i++){ //打印前边空格 echo str_repeat(' ',$n-$i); //前边空格等于 $n-$i echo str_repeat('*',2*$i-1); //星星号等于 2*$n-1 echo PHP_EOL; if($i==$n){ for($j=$n-1;$j>=1;$j--){ echo str_repeat(' ',$n-$j); //前边空格等于 $n-$i echo str_repeat('*',2*$j-1); //星星号等于 2*$n-1 echo PHP_EOL; } } } } lingxing(5); echo PHP_EOL; echo '================================'; echo PHP_EOL; //$n=5; for($i=1;$i<=5;$i++){ //打印空格 for($j=1;$j<=5-$i;$j++){ echo " "; } //打印*号 for($k=1;$k<=2*$i-1;$k++){ //打印第一行后最后一行都打*连接 if($i==1 || $i==5){ echo "*"; }else{ //怎么打空格和*号的问题 if($k==1 || $k==2*$i-1){ echo "*"; }else{ echo " "; } } } echo PHP_EOL; }
下面我把打印菱形封装成一个方法:
function lingxing($num,$space=' '){ for($i=1;$i<=$num;$i++){ printf(str_repeat($space,$num-$i).str_repeat('*',2*$i-1).PHP_EOL); if($i==5){ for($j=$num-1;$j>=1;$j--){ printf(str_repeat($space,$num-$j).str_repeat('*',2*$j-1).PHP_EOL); } } } }
这是打印菱形的方法调用
原理解析:
for从1开始循环 到$num 退出
首先记录打印空格 $num-$i 这是空格
然后计算打印 * 每一行都打印几个 *? 这是公式: 2*$i-1
当 $i 到了最大的时候,倒着打印 $j=$num-1; $j>=1;$j--
依然计算空格打印数量、*号打印数量
printf(str_repeat(' ',$num-$j));
printf(str_repeat('*',2*$j-1));
这样一个菱形就出来了。
深入剖析:
空心菱形如何打印
function kongxin($num,$printStr='*',$space=' '){ $data=[]; for($i=1;$i<=$num;$i++){ $data[]=sprintf(str_repeat($space,$num-$i).str_repeat($printStr,2*$i-1)); if($i==5){ for($j=$num-1;$j>=1;$j--){ $data[]=sprintf(str_repeat($space,$num-$j).str_repeat($printStr,2*$j-1)); } } } $len=count($data); for($i=0;$i<$len;$i++){ $str=$data[$i]; if($i==0 || $i==$len-1){ echo $str.PHP_EOL; continue; } $spaceNum= strpos($str,$printStr); echo str_repeat($space,$spaceNum).$printStr.str_repeat($space,strlen(trim($str))-2).$printStr.PHP_EOL; } } kongxin(5);
* * * * * * * * * * * * * * * *
代码解析:
先计算出一个菱形,然后通过遍历,把中间的*号去掉