40248


初めまして。Java初心者です。  
下記のように四角形の中にダイヤを描写したいと思っています。

[code]

    □□□□■□□□□
    □□□■■■□□□
    □□■■■■■□□
    □■■■■■■■□
    ■■■■■■■■■
    □■■■■■■■□
    □□■■■■■□□
    □□□■■■□□□
    □□□□■□□□□
    
[/code]

■の出力の仕方まではなんとなく理解でき、for文のみを使用して下記までコーディングしてみました。

[code]

    public class Study {
        public static void main(String[] args) {
            for (int i = 1; i <= 10; i += 2) {
                for (int n = 0; n < i; n++) {
                    System.out.print("■");
                }
                System.out.println();
            }
            for (int i = 1; i <= 9; i += 2) {
                for (int n = 0; n < 8 - i; n++) {
                    System.out.print("■");
                }
                System.out.println();
            }
        }
    }
    
[/code]

あとはif文を使用して、□の部分をコーディングしていくと思うのですが、なかなかうまくいかず困っています。どなたかご教授いただけますと幸いです。

【追加分】  
とても長くなりましたが自分なりに地道にコーディングしてみました。  
\\\\\\\\\\\\\\\\\\\\\

[code]

    public class Study {
    
        public static void main(String[] args) {
            // 四角形の中にダイヤ
            for (int i = 1; i <= 9; i++) {
                for (int j = 1; j <= 9; j++) {
                    if (i == 1 && j == 5 || i == 2 && j == 4 ||
                            i == 2 && j == 5 || i == 2 && j == 6 ||
                            i == 3 && j == 3 || i == 3 && j == 4 ||
                            i == 3 && j == 5 || i == 3 && j == 6 ||
                            i == 3 && j == 7 || i == 4 && j == 2 ||
                            i == 4 && j == 3 || i == 4 && j == 4 ||
                            i == 4 && j == 5 || i == 4 && j == 6 ||
                            i == 4 && j == 6 || i == 4 && j == 7 ||
                            i == 4 && j == 8 || i == 5 && j == 1 ||
                            i == 5 && j == 2 || i == 5 && j == 3 ||
                            i == 5 && j == 4 || i == 5 && j == 5 ||
                            i == 5 && j == 6 || i == 5 && j == 5 || 
                            i == 5 && j == 7 || i == 5 && j == 5 ||
                            i == 5 && j == 8 || i == 5 && j == 9 ||
                            i == 6 && j == 2 || i == 6 && j == 3 || 
                            i == 6 && j == 4 || i == 6 && j == 5 ||
                            i == 6 && j == 6 || i == 6 && j == 7 ||
                            i == 6 && j == 8 || i == 7 && j == 3 ||
                            i == 7 && j == 4 || i == 7 && j == 5 || 
                            i == 7 && j == 6 || i == 7 && j == 7 ||
                            i == 8 && j == 4 || i == 8 && j == 5 ||
                            i == 8 && j == 6 || i == 9 && j == 5) {
                        System.out.print("■");
                    } else {
                        System.out.print("　");
                    }
                }
                System.out.println();
            }
        }
    }
    
[/code]

\\\\\\\\\\\\\\\\\\\\\  
もっと簡略的に書く方法や、アドバイスがございましたらご教授ください。


CC BY-SA 3.0
2017-12-13T07:00:34.300
40242
2017-12-14T10:16:31.663
2017-12-13T09:52:29.720
26629
26629
question
java eclipse
四角形の中にダイヤを描写したい


お望みの答えとは異なるかもしれませんが、四角形とダイヤのサイズが固定なのであれば、単にそのまま出力してしまうのが分かりやすいだろうと思います。

[code]

    class Study
    {
        public static void main(String[] args)
        {
            System.out.printf("□□□□■□□□□%n"
                            + "□□□■■■□□□%n"
                            + "□□■■■■■□□%n"
                            + "□■■■■■■■□%n"
                            + "■■■■■■■■■%n"
                            + "□■■■■■■■□%n"
                            + "□□■■■■■□□%n"
                            + "□□□■■■□□□%n"
                            + "□□□□■□□□□%n");
        }
    }
    
[/code]

* * *

さて、四角形とダイヤのサイズが固定でないときはどうすればよいのでしょうか。

そのような場合、上のプログラムのように文字列としてそのまま出力する訳にはいきません。また、質問文にあるようなプログラムでは、四角形の大きさごとに `if`
文の条件式を変えなくてはいけないので、やはり駄目です。

このようなときは、四角形の大きさが変わったとき、それぞれの行に □ が何個、■ が何個あるのかを数学的に考えると上手くプログラムを書くことができます。

[code]

    □■■□    □□■□□    □□■■□□    □□□■□□□    □□□■■□□□    □□□□■□□□□
    ■■■■    □■■■□    □■■■■□    □□■■■□□    □□■■■■□□    □□□■■■□□□
    ■■■■    ■■■■■    ■■■■■■    □■■■■■□    □■■■■■■□    □□■■■■■□□
    □■■□    □■■■□    ■■■■■■    ■■■■■■■    ■■■■■■■■    □■■■■■■■□
            □□■□□    □■■■■□    □■■■■■□    ■■■■■■■■    ■■■■■■■■■
                     □□■■□□    □□■■■□□    □■■■■■■□    □■■■■■■■□
                               □□□■□□□    □□■■■■□□    □□■■■■■□□
                                          □□□■■□□□    □□□■■■□□□
                                                      □□□□■□□□□
    
    n=4      n=5      n=6        n=7        n=8          n=9
    
[/code]

ここでは上の図のように、四角形が辺の長さ `n`
の正方形であり、ダイヤがその正方形の各辺の中点を結ぶようなものであるときを考えてみましょう。するとたとえば以下のようなプログラムで出力することができます。コメントで説明を書いてみたので、参考にしてください。

[code]

    class Study
    {
        // 図形の1行分を出力する関数
        // 引数の lineWidth が行の幅、blackWidth が ■ の幅です。
        private static void printLine(int lineWidth, int blackWidth) {
            // 最初の □ を出力
            for (int j = 0; j < (lineWidth - blackWidth) / 2; j++) {
                System.out.print("□");
            }
            // 真ん中の ■ を出力
            for (int j = 0; j < blackWidth; j++) {
                System.out.print("■");
            }
            // 最後の □ を出力
            for (int j = 0; j < (lineWidth - blackWidth) / 2; j++) {
                System.out.print("□");
            }
            System.out.println("");
        }
    
        public static void main(String[] args)
        {
            // サイズ (ここの数字を変えて遊んでみてください)
            int n = 9;
    
            // n が偶数か奇数かで処理を分けています。
            // この分岐をなくすこともできますが、今回は分かりやすさのために残しています。
            if (n % 2 == 0) {
                // 1行進むごとに段々 ■ が増えてくる部分
                for (int i = 1; i <= n / 2; i++) {
                    // i 行目には 2 * i 個の ■ がある。
                    printLine(n, 2 * i);
                }
                // 1行進むごとに段々 ■ が減ってくる部分
                for (int i = n / 2; i > 0; i--) {
                    printLine(n, 2 * i);
                }
            } else {
                for (int i = 0; i < n / 2; i++) {
                    printLine(n, 2 * i + 1);
                }
                for (int i = n / 2; i >= 0; i--) {
                    printLine(n, 2 * i + 1);
                }
            }
        }
    }
    
[/code]


CC BY-SA 3.0
2017-12-13T10:34:04.460
40248
2017-12-14T10:16:31.663
2017-12-14T10:16:31.663
19110
19110
40242
answer