質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

4608閲覧

java 「*」でひし形の外枠だけ表示したい

te623

総合スコア4

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2020/05/25 16:20

編集2020/05/25 16:31

コマンドライン引数で与えらた値のひし形の外枠だけを表示するプログラムが作りたいです。
出力結果は下のようにしたいです。

* * * * * * * * * * * * * * * *

まずひし形を表示するプログラムをつくりました。

java

1public class Study01_2{ 2 public static void main(String args[]){ 3 int a = Integer.parseInt(args[0]); 4 5 for(int i = 0; i < a; i++){ 6 for(int j = 0; j < a - (i + 1); j++){ 7 System.out.print(" "); 8 } 9 for(int k = 0; k < (i + 1) * 2 - 1; k++){ 10 System.out.print("*"); 11 } 12 System.out.println(); 13 } 14 15 for(int i = 0; i < a - 1; i++){ 16 for(int j = 0; j < i + 1; j++){ 17 System.out.print(" "); 18 } 19 for(int k = 0; k < (a - i - 1) * 2 - 1; k++){ 20 System.out.print("*"); 21 } 22 System.out.println(); 23 } 24 } 25}

2つのピラミッドを組み合わせてひし形をつくりました。
1つ目のfor文は上向きのピラミッドで2つ目のfor文は下向きのピラミッドになっています。
このプログラムでは外枠だけ表示できません。
どうすれば外枠だけ表示できるでしょうか?
アドバスをお願いします。

もしこのプログラムから外枠だけを表示するプログラムを作れない、もしくは他の方法があるなら教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

解決したようなので別解を。

Java

1class Main { 2 public static void main(String args[]) { 3 if (args.length != 1) return; 4 int n = Integer.valueOf(args[0]); 5 for (int i = 1 - n; i < n; i++) { 6 for (int j = 1 - n; j < n; j++) 7 System.out.print( 8 Math.abs(i+j)==n-1 || Math.abs(i-j)==n-1 ? '*' : ' '); 9 System.out.println(); 10 } 11 } 12}

printf を使うと、

Java

1class Main { 2 public static void main(String args[]) { 3 int n = Integer.valueOf(args[0]); 4 String fmt1 = String.format("%%%dc%%n", n); 5 if (n > 0) System.out.printf(fmt1, '*'); 6 for (int i = 2 - n; i < n - 1; i++) { 7 int m = Math.abs(i) + 1; 8 String fmt2 = String.format("%%%dc%%%dc%%n", m, (n - m) * 2); 9 System.out.printf(fmt2, '*', '*'); 10 } 11 if (n > 1) System.out.printf(fmt1, '*'); 12 } 13}

投稿2020/05/25 19:22

編集2020/05/26 01:54
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

katoy

2020/05/25 21:04

素晴らしい。でも質問者は理解できないとおもいます。 円の描画方法とか、距離の図り方のこととか いろいろ説明をしないと....
guest

0

ベストアンサー

外枠というのは、"*"を表示している最初(k=0)と最後の部分です。

java

1for(int k = 0; k < (i + 1) * 2 - 1; k++){ 2 System.out.print("*"); 3

なので、

for(int k = 0; k < (i + 1) * 2 - 1; k++){ String s = " "; if (k == 0 || false) { s = "*"; } System.out.print(s); }

のようにすれば良いです。
falseの部分は、お考えください。

投稿2020/05/25 16:58

momon-ga

総合スコア4826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

te623

2020/05/25 17:49

無事に解決できました! ありがとうございました!
guest

0

どんな複雑なパターンでも描画できる方法を示します。

java

1import java.util.ArrayList; 2import java.util.List; 3 4class Main { 5 public static void main(String args[]) { 6 if (args.length != 1) 7 return; 8 int n = Integer.valueOf(args[0]); 9 List<List<Character>> screen = make_screen(2 * n - 1); 10 draw(screen, n); 11 show_screen(screen); 12 } 13 static void draw(List<List<Character>> screen, int n) { 14 char mark = '*'; 15 for (int i = 0; i < n; i++) { 16 screen.get(i).set(n + i - 1, mark); 17 screen.get(i).set(n - i - 1, mark); 18 screen.get(n + i - 1).set(i, mark); 19 screen.get(n + i - 1).set(2 * n - 2 - i, mark); 20 } 21 } 22 23 static List<List<Character>> make_screen(int n) { 24 List<List<Character>> screen = new ArrayList<List<Character>>(); 25 for (int y = 0; y < n; y++) { 26 List<Character> line = new ArrayList<Character>(); 27 for (int x = 0; x < n; x++) { 28 line.add(' '); 29 } 30 screen.add(line); 31 } 32 return screen; 33 } 34 35 static void show_screen(List<List<Character>> screen) { 36 for (int y = 0; y < screen.size(); y++) { 37 List<Character> line = screen.get(y); 38 for (int x = 0; x < line.size(); x++) { 39 System.out.print(line.get(x)); 40 } 41 System.out.println(); 42 } 43 } 44}

実行例
イメージ説明

投稿2020/05/25 22:02

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問