2012-07-02 53 views
2

我在做這個家庭作業時遇到了麻煩,希望得到一些幫助。我不想要解決方案,因爲我想向他們學習。根據用戶輸入生成字母金字塔

我們正在使用循環做一個字母金字塔。我似乎無法弄清楚如何將這些FOR循環放在一起,按照指示完成這項工作。

用戶應該輸入一個字母(或其他出錯的字符),然後程序會將該字母轉換爲大寫(如果還沒有的話)。在轉換爲大寫字母后,循環用於從字符'A'到用戶輸入的任何字符,然後再返回到'A'。下面是一個例子。

我附上我的代碼,我已經提出了,但程序的輸出應該如下,但行應該是空格。我只是說他們的間距:

輸入一個字母(輸入字母,顯示金字塔):電子

____A 
___ABA 
__ABCBA 
_ABCDCBA 
ABCDEDCBA 

我的輸出很簡單:

Please enter a single letter: 
f 
        ABCDEFEDCBA 

下面是代碼:

import java.util.*; // For using Scanner class for input 

public class LetterPyramid { 
    public static void main(String[] args) { 
     Scanner key = new Scanner(System.in); 
     System.out.println("Please enter a single letter:"); 
     char input = key.next().charAt(0); 
     input = Character.toUpperCase(input); 
     if (!(Character.isLetter(input))) { 
      System.out.println("Error: Invalid letter: " + input); 
     } else { 
      for (int i = input; i < 'Z'; i++) { 
       System.out.print(" "); 
      } 
     } 
     for (char y = 'A'; y < input; y++) { 
      System.out.print(y); 
      if (y == input) { 
       System.out.println(y); 
      } 
     } 
     for (char x = input; x >= 'A'; x--) { 
      System.out.print(x); 
     } 
     System.out.println(); 
    } 
} 
+2

請格式化你的代碼正常,所以很難作爲被讀... – Nim

+0

謝謝你的幫助。我道歉。這是我的第一篇文章。我會好起來的。 :P – Clayton

回答

1

我將你的程序分解爲工作中的核心算法:打印樹。

所以,這裏是我想出的,以及demo,所以你可以看到它的工作。

但首先,一個解釋:

此使用名爲middle跟蹤當前中間人物是什麼,我們將要打印char變量。這很有用,因爲我們可以創建while循環,它指出我們應該繼續打印樹,而當前的middle字符小於或等於input字符。

我還計算了第一行左邊需要的空格數spaces。這是一個有點一招,所以讓我們來看看這條線:

int spaces = input - (int) 'A'; // Might be a better way to do w/o cast 

我們正常化的空間使其數量範圍從0到X,而不是65℃到(X + 65)。因此,對於輸入A,spaces將是0,這是有道理的,因爲如果輸入只是A,我們不想打印任何空格。如果inputB,spaces將是1,因爲我們會在第一行打印一個空格。

然後,它只是一個建立循環的事:

  1. 打印左側的空間,其範圍從0到spaces
  2. 打印樹的左側,包括中間,範圍從Amiddle
  3. 打印樹的右手側,從middle - 1A
  4. 打印與在第一相同的環的右側空間(這是unnecessa ry,因爲它在控制檯中不可見)

最後,我們打印一個換行符,然後需要調整我們的標誌。所以我們遞減spaces,因爲我們只是打印一行輸出,並且遞增middle,因爲我們希望下一行的middle字符是打印後的下一個字符。

這裏是評論的代碼,我從看得更清楚,所以希望我已經解釋得很好。如果您有問題,請隨時提問。

char middle = 'A'; int spaces = input - (int) 'A'; 
    while(middle <= input) { 

     // Print the left side spaces 
     for(int i = 0; i < spaces; i++) 
      System.out.print(" "); 

     // Print the left side of the tree (including the middle) 
     for(char y = 'A'; y <= middle; y++) 
      System.out.print(y); 

     // Print the right side of the tree 
     for(char y = Character.toChars(middle - 1)[0]; y >= 'A'; y--) 
      System.out.print(y); 

     // Print the right side spaces 
     for (int i = 0; i < spaces; i++) 
      System.out.print(" "); 

     // Print a new line 
     System.out.println(); 

     // Subtract 1 from the number of spaces we need 
     spaces--; 

     // Increment the middle character 
     middle++; 
    } 

隨着F的輸入,這將產生:

 A  
    ABA  
    ABCBA 
    ABCDCBA 
ABCDEDCBA 
ABCDEFEDCBA 
+0

非常好的解釋!我改變了while循環以將輸入字母包含在最後一行打印字符中。 while(middle <= input)另外我不確定如何在評論回覆框中設置格式。我在學。非常感謝你! – Clayton

+0

@ClaytonVantol - 不客氣!很高興我能幫上忙。另外,要在評論框中格式化東西,你可以用反引號(')括起文本。 – nickb

+0

你能解釋一下這段代碼的工作原理嗎?我不完全理解它。主要是'toChars'部分:'for(char y = Character.toChars(middle - 1)[0]; y> ='A'; y - )' – Clayton

1

因爲你說過你想學會......這裏只是一個例子

對於每個字母,我們必須添加:我們打印該單詞,然後在該單詞的中間添加新的字母。是的,我們必須在中間複製這封信。在我的例子中,通過保存半字而不是保存整個單詞來避免這種情況。

string word = "A"; 

for (int i = 'B'; i < input; i++) { 
    print word 
    print i 
    print inverse word 
    print newline 

    word = word + i 
} 

或許這就是你想要的東西......

編輯:我frogot補充說,這是一個金字塔的空間:只是那些打印之前(input - i)空間添加打印。

0

你真的接近你想要的東西。你需要使用一個循環來調整你的起點和從A輸出,然後B,C,D,E,F等。

if (! (Character.isAlphabetic(input))) { 
     System.out.println("Error: Invalid letter: " + input); 
    } else { 
     for (char n = 'A'; n <= input; n++) { 
     pyramid(n); 
     } 
    } 

我試過這個,它爲我工作。我沒有改變你的循環中的任何代碼,只是提取它的方法。

0

那麼,你已經設法建立金字塔的底部,所以這是一個好的開始。下一步需要做的是把你的3個for循環在一個更大的for循環,在那裏你從'A'去你輸入的字符,並在較小圈以此作爲結束條件:

for(...) { 
    for (int i = input; i < 'Z'; i++) { 
     System.out.print(" "); 
    } 
    for (char y = 'A'; y < input; y++) { 
     System.out.print(y); 
     if (y == input) { 
     System.out.println(y); 
     } 
    } 
    for (char x = input; x >= 'A'; x--) { 
     System.out.print(x); 
    } 
    } 

此外, for負責空間的循環可能需要一些額外的工作,目前效果不佳。