2017-02-07 2 views
0

Ma mission est d'imprimer un mot sous la forme d'un diamant comme ceci:Impression d'un mot dans un format diamant

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

post-scriptum Les astérisques ne sont là que pour montrer l'espacement, prétendre qu'un astérisque représente un espace.

Jusqu'à présent, j'ai ceci:

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 
     } 
    } 

qui imprime la première moitié du diamant parfaitement:

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

La seule partie où je suis rester coincé est quand je dois imprimer la dernière moitié du diamant. Est-ce que quelqu'un peut-il me montrer la bonne direction? S'il vous plaît ne pas écrire le code pour moi, essayez simplement de me donner quelques pointeurs basés sur la logique que j'ai montrée. Je vous remercie.

+1

bien si vous avez trouvé la moitié supérieure, alors écrivez une autre pour la boucle mais inversez la logique –

+0

et chaque moitié devra écrire la ligne exactement de la même manière, de sorte que le code est un bon candidat à scinder en un méthode séparée qui peut être appelée dans la boucle supérieure et inférieure. – slipperyseal

+0

@ScaryWombat Le seul problème est que je n'arrive pas à comprendre comment inverser la logique. C'est frustrant moi – jpsizzls

Répondre

0

Essayez d'avoir une seule boucle. Un moyen très facile de gérer les "technicalités" du problème est de travailler avec un tableau de char pour la sortie. D'abord vous l'initialisez avec la bonne longueur, le remplissez avec des blancs (il y a une fonction de bibliothèque pour cela), remplissez les deux caractères, et seulement ensuite convertissez-le en String.

La seule question ouverte est où placer les caractères, et je ne veux pas (et ne devrais pas) pour gâcher cela.

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)); 
} 

De toute évidence, vous voulez calculer la position « du milieu » (nous avons donc quelque chose comme word.length() - 1 +- k), et pour la première moitié du mot, k est égal à i.

Votre tâche, si vous décidez de l'accepter, est de savoir comment "plier k retour" pour la deuxième moitié du mot.

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)); 
    } 
} 

J'ai terminé. Ceci est mon code final. Je comprends que ce n'est pas aussi efficace que possible, ou facile à suivre, mais il est flexible et non codé en dur, donc je suis content.