2017-02-07 3 views
0

Моя задача состоит в печати слово в форме алмаза, как так:Печать слова в формате алмазным

*****s 
****p*p 
***i***i 
**d*****d 
*e*******e  
r*********r 
*e*******e 
**d*****d 
***i***i 
****p*p 
*****s 

P.S. Звездочки только там, чтобы показать интервал, притворяются, что одна звездочка представляет одно пространство.

До сих пор у меня есть это:

public class DiamondWords 
{ 
    public static void main(String[] args) 
    { 
     Scanner kbReader = new Scanner(System.in); 
     System.out.print("Enter a word to be printed in diamond format: "); 
     String word = kbReader.nextLine(); 
     int wordLength = word.length(); 
     for(int i = 0; i<wordLength-1; i++) 
     { 
      System.out.print(" "); 
     } 
     wordLength = wordLength - 1; 
     System.out.print(word.charAt(0)); 
     System.out.println(); 
     int x =1; 
     int d =1; 

      for(int j =wordLength; j>0; j--) 
      { 
       wordLength = j; 
       for(int a =1; a<wordLength; a++) 
       { 
        System.out.print(" "); 
       } 
       System.out.print(word.charAt(x)); 
       for(int q =0; q<d; q++) 
       { 
        System.out.print(" "); 
       } 
       d+=2; 
       System.out.print(word.charAt(x)); 
       x++; 
       System.out.println(); 
      } 
      //r*********r 
      //*e*******e 
      //**d*****d 
      //***i***i 
      //****p*p 
      //*****s 
     } 
    } 

который печатает первую половину алмаза отлично:

*****s 
    ****p*p 
    ***i***i 
    **d*****d 
    *e*******e  
    r*********r 

Единственная часть, где я застрял, когда я должен напечатать последняя половина алмаза. Может кто-то указать мне верное направление? Пожалуйста, не пишите код для меня, просто попробуйте дать мне несколько указателей, основанных на логике, которую я показал. Спасибо.

+1

Хорошо, если вы выяснили верхнюю половину, затем напишите другую для цикла, но измените логику –

+0

, и каждая половина должна будет написать строку точно так же, чтобы код был хорошим кандидатом для разделения на отдельный метод, который можно вызвать в верхнем и нижнем циклах. – slipperyseal

+0

@ScaryWombat Единственная проблема в том, что я не могу понять, как изменить логику. Меня это расстраивает – jpsizzls

ответ

0

Попробуйте иметь только одну петлю. Очень простой способ справиться с «техническими проблемами» проблемы - работать с массивом char для вывода. Сначала вы инициализируете его с надлежащей длиной, заполняете его пробелами (для него есть функция библиотеки), заполняйте два символа и только затем преобразуйте их в строку.

Единственный открытый вопрос - куда положить персонажей, и я не хочу (и должен) испортить это.

int fullLength = 2 * word.length() - 1; 
for(int i = 0; i < fullLength; i++) { 
    char[] line = new char[fullLength]; 
    Arrays.fill(line, ' '); 
    int k = ???; 
    char c = s.charAt(k); 
    line[word.length() - 1 - k] = c; 
    line[word.length() - 1 + k] = c; 
    System.out.println(new String(line)); 
} 

Очевидно, что вы хотите, чтобы вычислить положение «с середины» (так у нас есть что-то вроде word.length() - 1 +- k), а за первую половину слова, k равно i.

Ваша задача, если вы решите принять ее, заключается в том, чтобы узнать, как «согнуть k назад» для второй половины слова.

0
import java.util.Scanner; 
public class DiamondWords 
{ 
    public static void main(String[] args) 
    { 
     Scanner kbReader = new Scanner(System.in); 
     System.out.print("Enter a word to be printed in diamond format: "); 
     String word = kbReader.nextLine(); 
     int wordLength = word.length(); 
     int wordLength2 = word.length(); 
     int wordSize = word.length(); 
     int wordLengthReverse = word.length(); 

     for(int i = 0; i<wordLength-1; i++) 
     { 
      System.out.print(" "); 
     } 

     wordLength = wordLength - 1; 
     System.out.print(word.charAt(0)); 
     System.out.println(); 
     int x =1; 
     int d =1; 

     for(int j =wordLength; j>0; j--) 
     { 
      wordLength = j; 
      for(int a =1; a<wordLength; a++) 
      { 
       System.out.print(" "); 
      } 
      System.out.print(word.charAt(x)); 
      for(int q =0; q<d; q++) 
      { 
       System.out.print(" "); 
      } 
      d+=2; 
      System.out.print(word.charAt(x)); 
      x++; 
      System.out.println(); 
     } 

     System.out.print(" " + word.charAt(wordLength2-2)); 
     int spaceLength =((wordLength2*2)-1) -4; 
     int u =spaceLength -2; 
     for(int i =0; i < spaceLength; i++) 
     { 
      System.out.print(" "); 
     } 
     System.out.print(word.charAt(wordLength2-2)); 
     System.out.println(); 

     int m=3; 
     for(int num =2; num<wordSize-1; num++) 
     { 
      wordLength2 = num; 
      for(int i =0; i<num; i++) 
      { 
       System.out.print(" "); 
      } 
      System.out.print(word.charAt(wordSize-m)); 
      for(int b = 0; b<u; b++) 
      { 
       System.out.print(" "); 
      } 

      System.out.print(word.charAt(wordSize-m)); 
      System.out.println(); 
      m++; 
      u = u-2; 
     } 
     for(int r =0; r<word.length()-1; r++) 
     { 
      System.out.print(" "); 
     } 
     System.out.print(word.charAt(0)); 
    } 
} 

Я закончил. Это мой последний код. Я понимаю, что он не настолько эффективен, насколько это возможно, или легко следовать, но он гибкий и не жестко закодированный, поэтому я доволен.

Смежные вопросы