5

「X」をxで出力するプログラムを取得しようとしています。すなわち:

xxx      xxx
 xxx    xxx
  xxx  xxx
   xxxxxx
  xxx  xxx
 xxx    xxx
xxx      xxx

これは私がこれまでに行ったことです:

import java.util.Scanner;
public class CustomXfactor {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        boolean quit = false;
        int i=0, a=0, c=0;

        System.out.printf("length must be between 16 and 120\n");

        //Ask for desired length
        System.out.printf("Please enter the length (0  to exit):\n");
        int length = in.nextInt();
        int spaces = (length-length+1), //Calculate spaces before the first leg
                innerSpaces = (length-6); //Calculate the inner spaces -6
                                         //because there is 6 Xs which are 
                                         //the form the legs

        while(!quit){
            //Print first half of the X
            for (i=0;i<(length/2);i++){

                //First XXX leg
                System.out.printf("XXX");

                //Space between the legs
                for (a=length-6;a<innerSpaces;a++){
                    System.out.printf(" ");
                }
                //Second XXX leg
                System.out.printf("XXX\n");

                //SPACES 
                for (c=0;c<(spaces);c++){
                System.out.printf(" ");
                }
                spaces++;
                innerSpaces--;
            }
            quit = true; //Change boolean to break while loop
        }//END of while loop
    }//END of method main
}//END end of class CustomXfactor

私の数学の問題は26行目にあります。Xの脚の間に正しいスペースを印刷するためのループを取得しておらず、ループするときに1つを取り除いています。

ご覧のとおり、これはXの半分にすぎませんが、こちら側を取得したら、それを逆にして残りを生成できます。

そこでの私の数学の助けをいただければ幸いです。

4

2 に答える 2

4

分割統治法により、作業が理解やすくなり、解決しやすくなります。 各行の末尾のスペース、および「XXX」ユニットの文字列間のスペースの印刷の問題を処理する方法を考えてください。私はあなたの問題を完全に解決したくありませんでしたが、あなたが欠けているものを理解するためにこのコードを見る必要があると思います。このコードを使用すると、文字列配列で目的の出力の半分を取得できます。そして、それを順番に、次に逆の順序でトラバースすると、正しい出力が得られます。

public static void main(String[] args) {
    String unit = "XXX"; // Unit String.
    int width = 21; // You can get this input from user.
    int betweenSpaces = width - 2 * unit.length(), trailingSpaces = 0;

    String[] lines = new String[(width - 2 * unit.length()) / 2 + 1];

    for (int i = 0; i < lines.length; i++) {
        lines[i] = "";
        lines[i] = helper(trailingSpaces, lines[i], unit)
                 + helper(betweenSpaces, lines[i], unit);

        betweenSpaces -= 2; // Decrement space count by 2.
        trailingSpaces += 1; // Increment trailing space count by 1.
    }

    // Printing lines array.
    for (String str : lines)
        System.out.println(str);
    for (int i = lines.length - 2; i >= 0; i--)
        System.out.println(lines[i]);
}

public static String helper(int count, String ref, String unit) {
    for (int j = 0; j < count; j++)
        ref += " ";
    return ref += unit; // 2nd unit string appended.
}

出力:

XXX               XXX
 XXX             XXX
  XXX           XXX
   XXX         XXX
    XXX       XXX
     XXX     XXX
      XXX   XXX
       XXX XXX
      XXX   XXX
     XXX     XXX
    XXX       XXX
   XXX         XXX
  XXX           XXX
 XXX             XXX
XXX               XXX
于 2012-11-11T14:31:13.387 に答える
1

これを交換しました

//Space between the legs
for (a=length-6;a<innerSpaces;a++){
     System.out.printf(" ");
}

//Space between the legs
for (a=length-6;a<innerSpaces;a++){
     System.out.printf("o");
}

o印刷されたものはありませんでした...

初期化int innerSpaces = (length-6);するので、内部空間は(length-6);初期化するループ内にあります。a=length-6これは、とまったく同じですが、。innerSpacesの場合にのみループに入りますa < innerSpaces。そのため、このループは実行できません。

于 2012-11-11T13:54:37.173 に答える