PHPで対称菱形を出力する簡単な方法

2292 ワード

例えば単純な菱形や星塔と呼ばれるものを出力し、まず最外層制御行番号、それから内層の循環であり、内層の循環には2つの第1の循環制御があり、それから第2の循環によって星の数を制御します.スペースを制御するのは、現在の行数for($space=1;$space<=$lines-$line;+$space)を差し引いた合計行数です.次に、星のループがfor($star=1;$star<=2*$line-1;+$star)です.
次のコードは最も簡単な出力菱形の一部です.
//$line     
//$space = $lines-$line;//       
//$star = 2*$line - 1;//m       

//        
for($line=1; $line<=$lines; ++$line) {
	//       ,       
	for($space=1; $space<=$lines-$line; ++$space) {
		echo '+';
	}
	//     ,       
	for($star=1; $star<=2*$line-1; ++$star) {
		echo '*';
	}
	//    
	echo "
"; }

対称にかかわる図形の多くは、入読で示す零細+をスペースで置き換えるなど、数軸にかかわる.
まず一般的な方法は、まず++のループ出力を上半層にし、次に--のループ出力下半層にすることです.
例えば
$lines=12;
for ($line=1; $line <=$lines ; $line++) { 
	for ($j=1; $j <= $lines - $line ; $j++) { 
		echo "+";
	}
	for ($i=0; $i < 2*$line-1; $i++) { 
		if ($i == 0 || $i == 2*$line-2) {
			echo "*";
		}else{
			echo "+";
		};
	}
	echo "";
}
$lines=12;
for ($line=$lines-1; $line >=1 ; $line--) { 
	for ($j=1; $j <= $lines - $line ; $j++) { 
		echo "+";
	}
	for ($i=0; $i < 2*$line-1; $i++) { 
		if ($i == 0 || $i == 2*$line-2 || $line == $lines) {
			echo "*";
		}else{
			echo "+";
		};
	}
	echo "";
}
そして数軸を巧みに利用する方法もあります
//12 3 4 54 3 2 1/-4-3-2-01 2 3 4(数軸)/4 3 21 0 1 2 34(絶対値)
1 2 3 4 5 4 3 2 1の効果を達成することを思い付きます
まず-4-3-2-1 01 2 3 4を絶対値関数で変換します
そして4 3 2 1 01 2 3 4
対応する最初の加算はすべて同じ本に等しい例えばこれはすべて5に等しい
対応する擬似コード
for($i=-4; $i<=4; ++$i) {
	echo $i, '+';
	echo abs($i), '+';
	echo 5-abs($i);

	echo '
'; }

この考え方によれば、まず最外層のサイクル制御は数軸、すなわち負数から正数までの歩き方for($i=-($lines-1);i<=$lines-1;++$i)
そして、中の合計行数から上の数軸の絶対値$line=$lines-abs($i)を減算します.
そして次の額コードは変わらなければいいのです
for($i=-($lines-1); $i<=$lines-1; ++$i) {
	//  $line
	$line = $lines - abs($i);
	//       ,       
	for($space=1; $space<=$lines-$line; ++$space) {
		echo '+';
	}
	//     ,       
	for($star=1; $star<=2*$line-1; ++$star) {
		//            
		if($star==1 || $star==2*$line-1) {
			echo '*';
		} else {
			echo '+';
		}
	}
	//    
	echo "
"; }