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

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

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

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

4回答

1864閲覧

intの変数によって三角形の段数を決めて三角形を作るプログラムで、逆三角形を作るプログラムが実現できません…

nakagen

総合スコア24

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2021/08/01 17:31

前提・実現したいこと

実際に△の段数を入力して、その三角形を作っていくプログラムを作成したのですが逆三角形がどうしても上手く作ることができません。

詳細につきましては、以下の発生している「問題・エラーメッセージ」に記載します。

発生している問題・エラーメッセージ

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class noman { public static void main(String[] args) throws IOException { /* 三角形の縦の段数 */ int i,j; /* 段数の入力 */ System.out.println("三角形の段数を入力してください "); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = br.readLine(); int size = Integer.parseInt(str1); if ( size < 0 ){ for (i=1;i<=-size;i++) { for (j=1 ; j <= -size+i; j++) System.out.print(" "); for (j=1 ; j <= -size*2-i*2-1; j++) System.out.print("▽"); System.out.print("\n"); } // ここが写真1のようになってしまいます。五段あるはずなのに四段のみしか表現されていません。 // } else { /* 上向き三角形の描画 */ for(i=1;i<=size;i++) /* 段の数だけループ */ { for(j=1 ; j <= size-i; j++) /* 左側に空白を描いて三角形の形を調整する */ System.out.print(" "); /* 全角空白 */ for(j=1 ; j <= i*2-1; j++) /* 三角形を描画。下に行くほど△の数を増やす */ System.out.print("△"); System.out.print("\n"); /* 横一段分を描いたら改行 */ } } } }

###写真
写真1(現在のプログラムだとこうなります)
イメージ説明
写真2(こちらが理想の形です)
イメージ説明

補足情報(FW/ツールのバージョンなど)

jdk14

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

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

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

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

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

jimbe

2021/08/01 17:40

全角のスペースを表示している所を□にしてみたり、i のループ毎に -size*2-i*2-1 の値が幾つになるのかを見てみたりしては如何でしょうか。
guest

回答4

0

この手のは、実際にどんな値になるのかを当てはめてみるのが一番簡単です。
(もしくは、プログラム自身に申告させても良いです)

size-5だとして、
最初のforは、i=1~i=5までの5回実行される。それは予定通り。

内側のループ、
1つ目のforは、j<=-size+iなので、
i=1の時j=1j=-(-5)+(1)j=6なので、6個スペースを出す。
i=2の時j=1
j=-(-5)+(2)j=7なので、7個スペースを出す。
(略)
i=5の時j=1~j=-(-5)+(5)=j=10なので、10個スペースを出す。

2つ目のforは、j<=-size*2-i*2-1なので、
i=1の時j=1j=-(-5)*2-(1)*2-1j=7なので、7個▽を出す。
i=2の時j=1
j=-(-5)*2-(2)*2-1j=5なので、5個▽を出す。
i=3の時j=1j=-(-5)*2-(3)*2-1j=3なので、3個▽を出す。
i=4の時j=1
j=-(-5)*2-(4)*2-1j=1なので、1個▽を出す。
i=5の時j=1~j=-(-5)*2-(5)*2-1j=-1なので、0個▽を出す。

こういうループに現状なってます。
段数自体はきちんと5段出ているのだけど、横の数の計算がおかしいです。

一度、三角形の事は忘れて、5という数字から欲しい数列を作り出すことをイメージすると、
式が立てやすいかもしれません。
たとえば、5から外のループで作られる、1,2,3,4,5という数列をどう変形したら、
0,1,2,3,45,4,3,2,1に変換できるのか?
そこからさらに、5,4,3,2,19,7,5,3,1にするのは、どんな式を使えばよいか?とか。

投稿2021/08/01 22:01

編集2021/08/01 22:15
amiya

総合スコア1218

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

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

0

質問のコードの修正は他の回答が参考になるでしょう。

最近の Java は、Stringクラスに repeatメソッドが追加されたので、
繰り返しの文字列を作るのが簡単です。また、数値を読み込むのは、
BufferedReader よりも Scanner の方が簡単です。

Java

1class Main { 2 public static void main(String[] args) { 3 System.out.println("三角形の段数を入力してください "); 4 int size = new java.util.Scanner(System.in).nextInt(); 5 if (size < 0) 6 for (int i = -size; --i >= 0; ) 7 System.out.println(" ".repeat(-size - i) 8 + "▽".repeat(i * 2 + 1)); 9 else 10 for (int i = 0; i < size; i++) 11 System.out.println(" ".repeat(size - i) 12 + "△".repeat(i * 2 + 1)); 13 } 14}

追記
全角スペースの個数を i、三角形の個数を j としたほうが簡単かもしれません。
初期値は分かっているし、更新は、i は ±1、j は ±2 の増減だけ。

Java

1 if (size < 0) 2 for (int i = 0, j = -size * 2 - 1; j > 0; i++, j -= 2) 3 System.out.println(" ".repeat(i) + "▽".repeat(j)); 4 else 5 for (int i = size - 1, j = 1; i >= 0; i--, j += 2) 6 System.out.println(" ".repeat(i) + "△".repeat(j));

追記2
回答がいくつも出ているのに質問者からの応答がありません。どうしたんですか?

さて質問のコードを最小限修正するとすれば、次の 3個所です。

diff

1- for (j=1 ; j <= -size+i; j++) 2+ for (j=1 ; j <= i; j++) 3 4- for (j=1 ; j <= -size*2-i*2-1; j++) 5+ for (j=1 ; j <= -size*2-i*2+1; j++) 6 7-ここが写真1のようになってしまいます。五段あるはずなのに四段のみしか表現されていません。 8+//ここが写真1のようになってしまいます。五段あるはずなのに四段のみしか表現されていません。

投稿2021/08/02 05:14

編集2021/08/03 00:46
kazuma-s

総合スコア8224

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

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

0

スペースの数とマークの数

求めるのは、1行に表示する「スペースの数」と「マーク(△▽)の数」です。

  • 1行の構成は、スペースを繰り返したのち、マークを繰り返す
  • hを入力された値とする (たとえば-5、5)
  • i が、0 <= i < |h| まで順に変化するなら、各行の「スペースの数」と「マーク(△▽)の数」は、
hマークスペースの数xマークの数
h>0h-(i+1)i2x+1
h<0i-h-(i+1)2x+1
h=0----

1 <= i <= |h|なら、表内のiに(i-1)を代入すること。

対称性(補足)

h-(i+1)と-h-(i+1)はどちらも|h|-(i+1)と表すことができます。このほうが対称性がよくわかります。iを変化させて確かめてください。

hマークスペースの数xマークの数
h>0|h|-(i+1)i2x+1
h<0i|h|-(i+1)2x+1
h=0----

これ以外にもわかりやすい説明はありそうです。

投稿2021/08/02 08:53

編集2021/08/02 20:21
xebme

総合スコア1081

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

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

xebme

2021/08/02 09:50

-h+(i+1) を -h-(i+1)に訂正しました。
xebme

2021/08/02 20:23

マークダウンのテーブルセル内で「|」文字を表示する方法がわからないので、全角文字を使いました。
guest

0

たぶん三角を書くところはプラス数字でもマイナス数字でも似たような感じですよね?
ということで、これを組み込んで使いこなしてみて。

java

1 public static void sankaku(int size, int i, String mark) { 2 int j; 3 for (j=1 ; j <= size-i; j++) System.out.print(" "); 4 for (j=1 ; j <= i*2-1; j++) System.out.print(mark); 5 System.out.print("\n"); 6 }

投稿2021/08/01 22:12

takasima20

総合スコア7458

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問