在練習循環控制語句時,經常會遇到一類問題:使用循環控制打印星號(*)來形成各種各樣的圖案,並強調所有的星號(*)都要用單條的輸出語句cout<<"*";來打印。
例如打印
通常使用兩個嵌套的for循環可以有效的解決此類問題。
不過,我們一般每次只打印一個圖案,如何將不同圖案的代碼整合到一起,並排的打印多個圖案呢?
例如:如何並排打印以下4個圖案呢?
首先,我們知道外層循環規定了行數,內層循環規定了列數。從上圖中不難發現,整個圖案的行數相同,通過在每一列打印星號(*)/ 空格來形成不同的圖案,這就要求在操作每一行時,同時打印四個圖案,所以程序應該有一個統一的外循環,內部依次有四個不同的內循環。
而且,為了控制小圖案之前的距離,要把每一個小圖案想象成一個整體。
比如打印(a)圖案我們通常會使用如下方法
1 for (int i=0; i<10; i++) 2 { 3 for (int j=0; j<i; j++) 4 { 5 cout<<"*"; 6 } 7 cout<<endl; 8 }
這樣只打印星號(*),圖案實際上只是一個直角三角形,它每行與后面圖案的間隔都不相同,所以我們在空白處補充空格,把圖案變成一個10*10的矩形(空白的部分有空格占位),代碼如下:
1 for (int i=0; i<10; i++) 2 { 3 for (int j=0; j<10; j++) 4 { 5 if (i < j) 6 cout<<" "; 7 else 8 cout<<"*"; 9 } 10 cout<<endl; 11 }
循環的條件完全相同,通過條件語句來控制每行星號和空格的數量,而且可以用三目運算符簡化
i < j ? cout<<" " : cout<<"*";
整個程序代碼為:
1 #include <iostream> 2 3 using namespace std; 4 5 int main() 6 { 7 for (int i=0; i<10; i++) 8 { 9 for (int j=0; j<10; j++) 10 { 11 i < j ? cout<<" " : cout<<"*"; 12 } 13 cout<<"\t"; 14 15 for (int j=0; j<10; j++) 16 { 17 i + j > 9 ? cout<<" " : cout<<"*"; 18 } 19 cout<<"\t"; 20 21 for (int j=0; j<10; j++) 22 { 23 i > j ? cout<<" " : cout<<"*"; 24 } 25 cout<<"\t"; 26 27 for (int j=0; j<10; j++) 28 { 29 i + j < 9 ? cout<<" " : cout<<"*"; 30 } 31 cout<<endl; 32 } 33 return 0; 34 }
運行效果: