请打印菱形
<?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);* * * * * * * * * * * * * * * *
代码解析:
先计算出一个菱形,然后通过遍历,把中间的*号去掉