十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
本文通過一道習(xí)題,講解做二重循環(huán)習(xí)題的思路:
題目:使用二重循環(huán)打印如下圖形:
分析:首先要明確我們需要打印的種類有:字符串”*”,字符串” ”(空格)。比如第一行,先打印了4個(gè)空格” ”,然后打印了一個(gè)”*” 。
我們分析一下每行的具體打印情況:
第0行:先打印4個(gè)空格,然后打印1個(gè)”*”
第1行:先打印3個(gè)空格,然后打印3個(gè)”*”
第2行:先打印2個(gè)空格,然后打印5個(gè)”*”
第3行:先打印1個(gè)空格,然后打印7個(gè)”*”
第4行:先打印0個(gè)空格,然后打印9個(gè)”*”
通過上面分析,我們不難發(fā)現(xiàn),”第0行”, ”第1行”… ”第4行”這些行數(shù)在重復(fù),所以我們可以用外層循環(huán)控制行數(shù)(即打印第幾行)。在每行的內(nèi)部,”打印n個(gè)空格”又是一個(gè)重復(fù)的過程,所以可以用內(nèi)層循環(huán)來控制打印空格的個(gè)數(shù)。同理,在每行的內(nèi)部,”打印n個(gè)*”也是一個(gè)重復(fù)的過程,所以可以用內(nèi)層循環(huán)來控制打印”*”的個(gè)數(shù)。即:用外層循環(huán)控制打印的行數(shù),用兩個(gè)內(nèi)層循環(huán)分別控制打印空格的個(gè)數(shù)和打印”*”的個(gè)數(shù)。還要注意,在把每行的空格和”*”打印完后,還需要換行。
即可得偽代碼:
public static void main(String[] args) {
int rows = 5;
for (int i = 0; i < 行數(shù); i++) {
for (int j = 0; j < 空格的個(gè)數(shù); j++) {
System.out.print(" ");
}
for (int j = 0; j < "*"的個(gè)數(shù); j++) {
System.out.print("*");
}
System.out.println();//每行的空格和”*”打印完后,需要換行
}
}
我們在用i表示行數(shù)(第幾行),用j表示打印空格的個(gè)數(shù),用k表示打印”*”的個(gè)數(shù),可得下表:
分析外層循環(huán)和內(nèi)層循環(huán)的數(shù)學(xué)關(guān)系,可得:
i+j=4 即j=4-i=(rows-1)-i, 即空格的個(gè)數(shù)等于:(當(dāng)前行數(shù)-1)-i
k=2*i+1 ,即”*”的個(gè)數(shù)等于: 2*當(dāng)前行數(shù)+1
現(xiàn)在,用計(jì)算后的關(guān)系式將偽代碼中的漢字替換,即可實(shí)現(xiàn)等腰三角形的打印:
public static void main(String[] args) throws Exception {
int rows = 5;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < rows - i - 1; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i + 1; j++) {
System.out.print("*");
}
System.out.println();//每行的空格和”*”打印完后,需要換行
}
}
運(yùn)行結(jié)果:
思考:現(xiàn)將題目變?yōu)椋捍蛴〉沟妊切危鐖D:
該如何實(shí)現(xiàn)呢?
分析:對比“正等腰三角形”和“倒等腰三角形”,如下
不難發(fā)現(xiàn),“倒等腰三角形”的第0行,就是“正等腰三角形”的最后一行;“倒等腰三角形”的第1行,就是“正等腰三角形”的倒數(shù)第二一行;…;“倒等腰三角形”的最后一行,就是“正等腰三角形”的第一行。即:把“正等腰三角形”的行數(shù)逆序輸出,就變成了“倒等腰三角形”。控制“正等腰三角形”行數(shù)的是外層循環(huán)for (int i = 0; i < rows; i++),將它逆序輸出,即改為for (int i = rows-1; i>=0; i--),就實(shí)現(xiàn)了“倒等腰三角形”的打印,如下:
public static void main(String[] args) throws Exception {
int rows = 5;
// for (int i = 0; i < rows; i++)正等腰三角形
for (int i = rows - 1; i >= 0; i--) {// 將“正等腰三角形”等行數(shù)逆序輸出
for (int j = 0; j < rows - i - 1; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i + 1; j++) {
System.out.print("*");
}
System.out.println();// 每行的空格和”*”打印完后,需要換行
}
}
運(yùn)行結(jié)果:
思考:現(xiàn)將題目變?yōu)椋捍蛴×庑?,如圖:
該如何實(shí)現(xiàn)呢?
分析:
將菱形上下拆開、一分為二,即可分為“正等腰三角形”和“到等腰三角形”,如圖:
因此,只需要先打印“正等腰三角形”,然后再打印“到等腰三角形”即可。需要注意,菱形的中間那一行,既是“正等腰三角形”的最后一行,同時(shí)也是“倒等腰三角形”的第一行。因此,在打印“正等腰三角形”時(shí),不需要打印最后一行,如下:
public static void main(String[] args) throws Exception {
int rows = 5;
// 正等腰三角形
//for (int i = 0; i < rows; i++) {
for (int i = 0; i < rows-1; i++) {//將for的第二個(gè)參數(shù)從row變?yōu)閞ow-1,即無需打印"正等腰三角形"的最后一行
for (int j = 0; j < rows - i - 1; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i + 1; j++) {
System.out.print("*");
}
System.out.println();// 每行的空格和”*”打印完后,需要換行
}
// 倒等腰三角形
for (int i = rows - 1; i >= 0; i--) {// 將“正等腰三角形”等行數(shù)逆序輸出
for (int j = 0; j < rows - i - 1; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i + 1; j++) {
System.out.print("*");
}
System.out.println();// 每行的空格和”*”打印完后,需要換行
}
}
運(yùn)行結(jié)果:
思考:
現(xiàn)將題目變?yōu)椋捍蛴】招牧庑?,如圖:
該如何實(shí)現(xiàn)呢?
分析:
實(shí)心菱形與空心菱形的區(qū)別是:空心菱形就是實(shí)心菱形的邊界,如下圖:
即在打印“實(shí)心菱形”的“*”時(shí),只需要把每一行“*”的開頭第一個(gè)“*”和結(jié)尾最后一個(gè)“*”打印出來,每行中間部分的“*”用空格替代即可。即對System.out.print("*");進(jìn)行判斷,偽代碼如下:
if (開頭第一個(gè)“*” 或 結(jié)尾最后一個(gè)“*”) {
System.out.print("*");
} else {//即中間部分打印空格
System.out.print(" ");
}
完整代碼如下:
public static void main(String[] args) throws Exception {
int rows = 5;
// 正等腰三角形
for (int i = 0; i < rows; i++) {
for (int j = 0; j < rows - i - 1; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i + 1; j++) {
if (j == 0 || j == 2 * i) {//開頭第一個(gè)“*” 或 結(jié)尾最后一個(gè)“*”
System.out.print("*");
} else {//即中間部分打印空格
System.out.print(" ");
}
}
System.out.println();// 每行的空格和”*”打印完后,需要換行
}
// 倒等腰三角形
// for (int i = rows - 1; i >= 0; i--) {
for (int i = rows - 2; i >= 0; i--) {// “倒等腰三角形”的第0行(即rows-1)不用打,直接從第1行(rows-2)開始打印
for (int j = 0; j < rows - i - 1; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * i + 1; j++) {
if (j == 0 || j == 2 * i) {//開頭第一個(gè)“*” 或 結(jié)尾最后一個(gè)“*”
System.out.print("*");
} else {//即中間部分打印空格
System.out.print(" ");
}
}
System.out.println();// 每行的空格和”*”打印完后,需要換行
}
}
運(yùn)行結(jié)果:
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。