質問するログイン新規登録
Java

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

Q&A

解決済

2回答

1162閲覧

java ひし形のコードと三角形のコードを連続して出力する方法を教えてください

hiokusa

総合スコア2

Java

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

0グッド

0クリップ

投稿2024/03/23 11:17

0

0

実現したいこと

ひし形のコードと三角形のコードを連続して出力させる。

発生している問題・分からないこと

連続して出力する方法がわからない

該当のソースコード

java

1// 問題⑤ ひし形 2public class Main { 3 public static void main(String[] args) { 4 int max = 5; // ひし形の高さ 5 String star = "*"; // ひし形の記号 6 7 // 上半分のひし形を出力 8 for (int i = 0; i < max; i++) { 9 // 空白を出力 10 for (int j = 0; j < max - i; j++) { 11 System.out.print(" "); 12 } 13 // *を出力 14 for (int k = 0; k <= (i - 1) * 2; k++) { 15 System.out.print(star); 16 } 17 System.out.println(); // 改行 18 } 19 20 // 下半分の逆三角形を出力 21 if (max >= 4) { 22 for (int a = 0; a < max; a++) { 23 // 空白を出力 24 for (int b = 0; b < a; b++) { 25 System.out.print(" "); 26 } 27 // *を出力 28 for (int c = 0; c <= max * 2 - (a * 2) - 2; c++) { 29 System.out.print(star); 30 } 31 System.out.println(); // 改行 32 } 33 } 34 } 35} 36

Java

1public class Main { 2 public static void main(String[] args) { 3 int max = 5; // 三角形の高さ 4 String star = "*"; 5 6 for (int i = 0; i < max; i++) { 7 for (int j = 0; j < max - i; j++) { 8 System.out.print(" "); 9 } 10 for (int k = 0; k <= i * 2; k++) { 11 System.out.print(star); 12 } 13 System.out.println(); 14 } 15 } 16} 17

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

得られてはいないです。

補足

Eclipse

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

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

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

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

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

jimbe

2024/03/26 03:37

ただ教えてだけでは依頼です。具体的に、何が分からないのでしょうか。 つまり、どのように考えてどのようなコードを書き何が表示されて、それに対しどのように考えて…最終的にどのようなことで詰まったのでしょう。 削除依頼された方では『int が~』とありましたが状況が分かりませんでした。『こんなコードでこんな表示がされてしまう』といったモノを示して戴けると助かります。
guest

回答2

0

ベストアンサー

考え方によってコードの構造は変わります。
ひし形と三角形では無くひし形1つとひし形の上半分(中央含む)とし、コードとしては複数行で構成された図形では無く1行の重なりと考えることもできます。

行(c) を 0 始まりとして max=5 とする時、ひし形の上半分(=三角形) c=0~4 は
スペース max-1-c
アスタリスク c*2+1
を表示すれば書くことが出来ます。
ひし形の下半分(中央無し)は c=3~0 ならそのまま書けますが、それではループを別にしなければならないため、 c=5~8 を 3~0 に変換するようにします。

if(c >= max) { c = (max-1)*2 - c; }

これにより c=0~8 でひし形を1つ描け、また c=0~5 のループも並べれば三角形をもう1つ描けます。
しかしどうせ同じ処理をするのなら c=9 以上もひし形(の各行)を描けるようにすればループは1つで済みますので、全体のループカウンタを i とした時 c = i % ひし形の行数 で 9 以上を c=0~8 に変換するようにします。

max=5の時:

ic=i%9c>=max → c=(max-1)*2-c" "(max-1-c) + "*"(c*2+1))
000____*
111___***
222__*****
333_*******
444*********
553_*******
662__*****
771___***
880____*
900____*
1011___***
1122__*****
1233_*******
1344*********

java

1public class Main { 2 public static void main(String[] args) throws Exception { 3 int max = 5; //三角形の行数 4 int rhombus = max*2 - 1; //ひし形の行数 5 6 for(int i=0; i<rhombus+max; i++) { //ひし形+三角形 7 int c = i % rhombus; 8 if(c >= max) { 9 c = (max-1)*2 - c; 10 } 11 //1行描画 12 for(int j=0; j<max-1-c; j++) { 13 System.out.print(" "); 14 } 15 for(int j=0; j<c*2+1; j++) { 16 System.out.print("*"); 17 } 18 System.out.println(); 19 } 20 } 21}
* *** ***** ******* ********* ******* ***** *** * * *** ***** ******* *********

投稿2024/03/26 04:50

編集2024/03/26 07:35
jimbe

総合スコア13357

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

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

hiokusa

2024/03/30 04:28

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。
jimbe

2024/04/01 04:24

欲しい結果を得るのにどんなデータ(値)があればどう実現できるかを考えるのが本件の肝と思います。 回答コードでの c の値の求め方・使い方も他のやり方があるはずですので、考えてみることをお勧めします。
guest

0

ひとつはそれぞれをメソッドに分けることです。
そうすれば「intが2回使えない」ようなことにはなりません。

java

1public class Main { 2 public static void main(String[] args) { 3 diamond(); 4 triangle(); 5 } 6 7 // ひし形を出力するメソッド 8 static void diamond() { 9 int max = 5; // ひし形の高さ 10 String star = "*"; // ひし形の記号 11 12 // 以下省略 13 } 14 15 // 三角形を出力するメソッド 16 static void triangle() { 17 int max = 5; // 三角形の高さ 18 String star = "*"; 19 20 // 以下省略 21 } 22}

mainにすべて書きたいのなら、2回目のint max = 5;String star = "*";は不要です。

なお下記コードにはint iint jが複数ありますが、なぜエラーにならないかは「変数のスコープ」について調べてください。
「intが2回使えない」のも「変数のスコープ」の問題です。
java ローカル変数 スコープ - Google 検索

java

1public class Main { 2 public static void main(String[] args) { 3 int max = 5; 4 String star = "*"; 5 6 // ▲ 7 for (int i = 1; i <= max; i++) { 8 9 // Java11以降ならrepeatが使えるので、下記forの代わりにスッキリ書ける 10// System.out.print(" ".repeat(max - i)); 11// System.out.print(star.repeat(i * 2 - 1)); 12 13 for (int j = 0; j < max - i; j++) System.out.print(" "); 14 for (int j = 0; j < i * 2 - 1; j++) System.out.print(star); 15 System.out.println(); 16 } 17 18 // ▼ 19 for (int i = max - 1; 0 < i; i--) { 20 for (int j = 0; j < max - i; j++) System.out.print(" "); 21 for (int j = 0; j < i * 2 - 1; j++) System.out.print(star); 22 System.out.println(); 23 } 24 25 // 先頭の記述と同じなので再度定義する必要はない 26// int max = 5; 27// String star = "*"; 28 29 // もし段数や文字が変わるなら、「再定義」ではなく「再代入」する 30// max = 10; 31// star = "@"; 32 33 // ▲ 34 for (int i = 1; i <= max; i++) { 35 for (int j = 0; j < max - i; j++) System.out.print(" "); 36 for (int j = 0; j < i * 2 - 1; j++) System.out.print(star); 37 System.out.println(); 38 } 39 } 40}
* *** ***** ******* ********* ******* ***** *** * * *** ***** ******* *********

投稿2024/03/25 14:35

編集2024/03/25 20:48
TN8001

総合スコア10118

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

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

hiokusa

2024/03/30 04:28

回答ありがとうございます。 ベストアンサーは別の方を選ばせていただきましたが、こちらの回答も非常に参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問