2012-11-20 82 views
2

我想顛倒這段代碼,以便我可以打印帶有邊框的菱形圖案。開始反轉嵌套循環/一系列循環的最佳方法是什麼?我試着對代碼進行修改,但是一切都混亂無序。有什麼建議?顛倒嵌套循環

另外,有沒有一種方法可以在頂部星星的每一邊製作偶數個。我已經能夠使它發揮作用的唯一途徑打印偶數每側由一個量...

這裏是應該打印到控制檯:http://i.imgur.com/h55r2.jpg

這裏是我的代碼:

public class SixTester { 

    public static void main(String[] args) 
    { 
      int i,j,k; 
      int numOfRows = 8; // Made this a variable, so that the program can make any size diamond (try playing around with different values eg. 2 or 16) 

      // Step 1. The first Dash 
      for(i=0;i<numOfRows*2 +2;i++) 
        System.out.print(" "); // Number of spaces is double the number of rows in your 'Half Pyramid' 
      System.out.println("-"); 

      // Step 2. The First half diamond 
      for (j=0; j<numOfRows ; j++) 
      { 
        for(k=numOfRows*2; k>1+j*2; k--) 
          System.out.print(" "); 

        System.out.print("_/"); 
        for (i=0; i< 2+j*4; i++) 
        { 
          // Prepare the Star rectangle, Note that it starts half the way (rows/2) 
          if(j >= numOfRows/2 && (i>j*2- numOfRows/2 && i<j*2+ numOfRows/2)) { 
            System.out.print("*");         
          } 
          else 
            System.out.print("."); 
        } 
        System.out.println("\\_"); 
      } 
      // Next Step - Make the bottom pyramid...but how to reverse? 
    } 
} 
+1

+1用於拍攝ascii藝術照片 – Adam

+0

我寧願爲每個*重*動作都採用一種方法。通過沉重的行動,我的意思是每個包含邏輯代碼的「for-loop」。一旦你設計了這些方法,就可以更容易地反轉當前的代碼。否則,您應該複製並修改當前代碼以具有反向打印行爲。 –

回答

2

這不是最優雅的方式,但它的工作原理。在您的代碼所在的位置插入這些行,「但如何反轉?」我已經打上了與評論

 // COUNT BACKWARDS NOW. YOU WANT LARGEST ROW FIRST, OTHERWISE IT'S OK EXCEPT... 
     for (j=numOfRows-1; j>=0 ; j--) 
     { 
       for(k=numOfRows*2; k>1+j*2; k--) 
         System.out.print(" "); 

       System.out.print("\\_"); // BORDERS ARE BACKWARDS. PUT BORDER ON OTHER SIDE 
       for (i=0; i< 2+j*4; i++) 
       { 
         if(j >= numOfRows/2 && (i>j*2- numOfRows/2 && i<j*2+ numOfRows/2)) { 
           System.out.print("*");         
         } 
         else 
           System.out.print("."); 
       } 
       System.out.println("_/"); // PUT BORDER ON OTHER SIDE 
     } 

     for(i=0;i<numOfRows*2 +2;i++) 
       System.out.print(" "); 
     System.out.println("-"); 
+0

我正在尋找一些關於自己做這些事的技巧,但我覺得它開始時相當含糊。感謝你的回答!我看到的唯一一個問題是:我希望中心的星形矩形爲8x8,我需要改變底部金字塔中的。的數量以匹配[this](http://i.imgur。)。 COM/h55r2.jpg)。非常感謝你,+1! – dustdustdust

+2

好吧,我很高興我的解決方案不是完美的,希望這給你一些正確的方向提示。記住編程是關於從小工作中構建大型工作,如果你正確地分析小工作,修復大錯誤應該容易得多。 – durron597

+0

+1看到我的解決方案超過工程:) – Adam

0

如果你寫了這樣一個建設者的變化對您的代碼......

public static interface Reflection { 
    String reflect(String str); 
} 

public static class Builder { 
    private List<String> lines = new ArrayList<String>(); 
    private StringBuilder builder = new StringBuilder(); 
    public void newLine() { 
     lines.add(builder.toString()); 
     builder = new StringBuilder(); 
    } 
    public void repeat(String section, int count) { 
     for (int i = 0; i < count; i++) { 
      builder.append(section); 
     } 
    } 
    public void padLeft(String section, int count) { 
     while (builder.length() < count) { 
      builder.append(section, 0, section.length()); 
     } 
    } 
    public void reflectX(Reflection reflection) { 
     List<String> reflected = new ArrayList<String>(); 
     for (String line : lines) { 
      StringBuilder tmp = new StringBuilder(); 
      tmp.append(reflection.reflect(line)); 
      tmp.reverse(); 
      tmp.append(line); 
      reflected.add(tmp.toString()); 
     } 
     lines = reflected; 
    } 
    public void reflectY(Reflection reflect) { 
     List<String> reflection = new ArrayList<String>(); 
     for (String line : lines) { 
      reflection.add(reflect.reflect(line)); 
     } 
     Collections.reverse(reflection); 
     lines.addAll(reflection); 
    } 
    public String build() { 
     StringBuilder tmp = new StringBuilder(); 
     for (String line : lines) { 
      tmp.append(line); 
      tmp.append('\n'); 
     } 
     return tmp.toString(); 
    } 
    public void write(String string) { 
     builder.append(string); 
    } 
} 

那麼你的代碼的代碼可以簡化爲這一點,但是這也只是在工程:

int nRows = 8; 
int pad = 20; 
Builder builder = new Builder(); 

builder.write("_"); 
builder.padLeft(" ", pad); 
builder.newLine(); 

for (int i = 0; i < nRows; i++) { 
    int dots = i * 2 + 1; 
    int stars = i >= 4 ? 4 : 0; 
    builder.repeat("*", stars); 
    builder.repeat(".", dots - stars); 
    builder.write("\\"); 
    if (i < nRows - 1) { 
     builder.write("_"); 
    } 
    builder.padLeft(" ", pad); 
    builder.newLine(); 
} 
builder.reflectX(new Reflection() { 
    @Override 
    public String reflect(String str) { 
     return str.replace('\\', '/'); 
    } 
}); 
builder.reflectY(new Reflection() { 
    @Override 
    public String reflect(String str) { 
     return str.replace("\\", "%x").replace("/", "\\").replace("%x", "/"). 
       replace("_\\", "%x").replace("/_", "_/").replace("%x", "\\_"); 
    } 
}); 
System.out.println(builder.build()); 

結果

   __     
      _/..\_     
      _/......\_    
     _/..........\_    
     _/..............\_   
    _/.....********.....\_   
    _/.......********.......\_  
_/.........********.........\_  
/...........********...........\  
\...........********.........../  
\_.........********........._/  
    \_.......********......._/  
    \_.....********....._/   
     \_.............._/   
     \_.........._/    
      \_......_/    
      \_.._/     
       __