前提・実現したいこと
Javaで図形の配列をスタックとキューの配列に格納して表示するプログラムをEclipseを用いて作成しています。メインクラスであるStackAndQueueクラスとは別にMyStackクラスとMyQueueクラスをそれぞれ作成し、そこで定義したメソッドを用いて配列の内容を表示したいです。前提条件として、格納される図形配列をfigure1(要素数;9)とし、その配列の要素数よりも要素数が小さいスタック(要素数;8)とキュー(要素数;7)の配列を定義します。
発生している問題・エラーメッセージ
これまでpushとgetを用いて表示させるやり方をずっと模索していたのですが、Queueの表示はうまくいったようです。しかし、Stackの表示が「私は面積が1600.0の正方形です。」で止まってしまい、その後ArrayIndexOutOfBoundsExceptionエラーが出てしまいました。最後のエラー箇所として、Stackでは図形を8つ表示させれば良いのですが、これはどのように修正すれば良いでしょうか。
該当のソースコード
Java
[コンソール出力結果]
<figures1の図形>
私は面積が200.0の四角形です。
私は面積が200.0の四角形です。
私は面積が600.0の四角形です。
私は面積が1256.6370614359173の円です。
私は面積が1256.6370614359173の円です。
私は面積が2827.4333882308138の円です。
私は面積が100.0の正方形です。
私は面積が1600.0の正方形です。
私は面積が2500.0の正方形です。
<Queueの図形>
私は面積が200.0の四角形です。
私は面積が200.0の四角形です。
私は面積が600.0の四角形です。
私は面積が1256.6370614359173の円です。
私は面積が1256.6370614359173の円です。
私は面積が2827.4333882308138の円です。
私は面積が100.0の正方形です。
<Stackの図形>
私は面積が2500.0の正方形です。
私は面積が1600.0の正方形です。
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 8
at objects.MyStack.pop(MyStack.java:35)
at objects.StackAndQueue.main(StackAndQueue.java:61)
[ソースコード]
{StackAndQueueクラス(メインクラス)}
package objects; public class StackAndQueue { public static void main(String[] args) { Figure[] figures1 = new Figure[9]; int i = 0; Rectangle r1 = new Rectangle(); Rectangle r2 = new Rectangle(10, 20); Rectangle r3 = new Rectangle(20, 30); figures1[i++] = r1; figures1[i++] = r2; figures1[i++] = r3; Circle c1 = new Circle(); Circle c2 = new Circle(20); Circle c3 = new Circle(30); figures1[i++] = c1; figures1[i++] = c2; figures1[i++] = c3; Square s1 = new Square(); Square s2 = new Square(40); Square s3 = new Square(50); figures1[i++] = s1; figures1[i++] = s2; figures1[i++] = s3; System.out.println("<figures1の図形>"); for(int j = 0; j<figures1.length; j++) { figures1[j].identify(); } System.out.println(); MyQueue queue = new MyQueue(7); int n = 0; try{ while(queue.isFull() == false) { queue.put(figures1[n]); n++; } } catch (ArrayIndexOutOfBoundsException e) { } System.out.println("<Queueの図形>"); for(int j = 0; j<7; j++) { queue.get().identify(); } System.out.println(); MyStack stack = new MyStack(8); try { while(stack.isFull() == false) { stack.push(figures1[n]); n++; } } catch (ArrayIndexOutOfBoundsException e) { } System.out.println("<Stackの図形>"); for(int j = 0; j<8; j++) { stack.pop().identify(); } } }
{MyQueueクラス(キュークラス)}
package objects; public final class MyQueue { private Figure[] Buff; private int start; private int end; private int count; Figure x; public MyQueue(int size) { Buff = new Figure[size]; start = 0; count = 0; } public boolean isEmpty() { if(count == 0) { return true; } else { return false; } } public boolean isFull() { if(count > Buff.length) { return true; } else { return false; } } public void put(Figure x) { end = start + count; Buff[end] = x; count++; } public Figure get() { x = Buff[start++]; count--; return(x); } }
{MyStackクラス(スタッククラス)}
package objects; public final class MyStack { private Figure[] Buff; private int sp; private int count; Figure x; public MyStack(int size) { Buff = new Figure[size]; sp = 0; count = 0; } public boolean isEmpty() { if (count == 0) { return true; } else { return false; } } public boolean isFull() { if (count >= Buff.length) { return true; } else { return false; } } public void push(Figure x) { Buff[sp] = x; sp++; count++; } public Figure pop() { sp--; x = Buff[sp]; count--; return(x); } }
以上のクラスとは別のRectangleクラスで定義したidentifyメソッドを以下のように定義しました。SquareクラスとCircleクラスも同様です。
package objects; public class Rectangle extends Figure { private double height = 0; private double width = 0; private double area; Rectangle() { this.width = 20; this.height = 10; area = this.width * this.height; } Rectangle(double w, double h) { this.width = w; this.height = h; area = this.width * this.height; } void setWidth(double w){ this.width = w; area = this.width * this.height; } void setHeight(double h) { this.height = h; area = this.width * this.height; } void setSize(double w, double h) { setWidth(w); setHeight(h); } double getWidth() { return this.width; } double getHeight() { return this.height; } @Override public double getArea() { return area; } @Override public void identify() { System.out.println("私は面積が" + getArea() + "の四角形です。" ); } }
package
1 2public class Square extends Rectangle { 3 private double area; 4 Square() { 5 super(); 6 super.setSize(10, 10); 7 computeArea(); 8 } 9 Square(double w) { 10 super(); 11 super.setSize(w, w); 12 computeArea(); 13 } 14 void computeArea() { 15 area = super.getWidth() * super.getHeight(); 16 } 17 @Override 18 public double getArea() { 19 return area; 20 } 21 22 @Override 23 public void identify() { 24 System.out.println("私は面積が" + getArea() + "の正方形です。" ); 25 } 26}
package objects; public class Circle extends Figure { private double radius = 0; private double area; Circle() { this.radius = 20; area = this.radius * this.radius * Math.PI; } public Circle(double r) { this.radius = r; area = this.radius * this.radius * Math.PI; } void setRadius(double r){ this.radius = r; area = this.radius * this.radius * Math.PI; } double getHeight() { return this.radius; } @Override public double getArea() { return area; } @Override public void identify() { System.out.println("私は面積が" + getArea() + "の円です。" ); } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/01 07:26
2020/12/01 09:24
2020/12/01 13:49
2020/12/01 14:01
2020/12/01 14:12
2020/12/01 14:59
2020/12/01 15:08
2020/12/01 15:40
2020/12/01 15:49
2020/12/01 16:07