dポイントプレゼントキャンペーン実施中!

成績表を作りたい。Studentのクラスを要素とするクラスStackを完成させてプログラムが動作するようにせよという問題なのですがprivateの物をどうやって要素にすればよいのでしょうか?
class Student
{
private int id;
private String name;
private int eng;
private int math;
private int kokugo;
Student(int i,String nm,int e,int m,int k)
{
id=i;name=nm;eng=e;math=m;kokugo=k;
}
void show(){
System.out.println("("+id+","+name+","+ eng+","+ math+","+ kokugo+")");
}
}

class Stack
{

}

class Sample
{
public static void main(String[] args)
{
Stack ss=new Stack(3);
ss.push(new Student(1,"A",10,10,10));
ss.push(new Student(2,"B",20,10,10));
ss.push(new Student(3,"C",30,10,10));
ss.push(new Student(4,"D",40,10,10));
ss.pop();
ss.pop();
ss.pop();
ss.pop();
}
}

A 回答 (8件)

>System.out.println(student);



このようにすると、オブジェクトのtoString()メソッドが暗黙に呼び出されます。

ご指摘の表示はObject#toString()の動作によるものです。

別の表示をしたければtoString()をオーバーライドするか、別のメソッドを定義する必要があります。


例えばStudentクラスにshow()などというメソッドを定義し、その中で表示の処理をすれば、

student.show();


として表示することができます。

この回答への補足

pushの場合はStudentクラスにshowを作成して以下のようにしたらできました。
class Student
{
private int id;
private String name;
private int eng;
private int math;
private int kokugo;
Student(int i,String nm,int e,int m,int k)
{
id=i;name=nm;eng=e;math=m;kokugo=k;

}

void show()
{
System.out.println("("+id+","+name+","+ eng+","+ math+","+ kokugo+")");
}

}

public void push(Student student)
{
if(sp!=students.length)
{
student.show();
System.out.println("をpush");
students[sp++]=student;

}
else
{
System.out.println("Stack is full");
}
}

class Sample
{
public static void main(String[] args)
{
Stack ss=new Stack(3);
ss.push(new Student(1,"黒川富夫",10,10,10));
ss.push(new Student(2,"川本隆文",20,10,10));
ss.push(new Student(3,"山下健史",30,10,10));
ss.push(new Student(4,"丹原元治",40,10,10));
ss.pop();
ss.pop();
ss.pop();
ss.pop();
}
}

popの場合の出力はどうしたらいいのでしょうか?

補足日時:2011/06/07 12:46
    • good
    • 0
この回答へのお礼

いろいろと自分で考えたらできました!
長々と本当にありがとうございました。

お礼日時:2011/06/07 15:50

そのとおりです。


そこまでわかっていて、何故できないかわかりませんが、
あまり長くなってもいけないので。


おっしゃる通りpushメソッドはStudentクラスのインスタンスを引数とします。

つまり、メソッドの宣言は
push(Student student)

となります。


また、受け取ったStudentオブジェクトは記憶しておかないといけません。

つまり、

Studentの配列に格納することになります。


Student[] students=new
Student[10];

となります。

わかりましたでしょうか?

この回答への補足

解説の通り進めていったらエラーは全て無くなったと思います。
しかし出力をすると
Student@1a758cb
をpush

という風になってしまいます。
代入した内容を出力するにはどうしたらいいのでしょうか?
pushの内容は以下の通りです
public void push(Student student)
{
if(sp!=students.length)
{
System.out.println(student);
System.out.println("をpush");
students[sp++]=student;

}
else
{
System.out.println("Stack is full");
}
}

本当に長くなってしまって申し訳ありません。

補足日時:2011/06/07 02:29
    • good
    • 0

Sampleクラスで行っている次の処理は意味がわかりますか?




ss.push(new Student(1,"A",10,10,10));

この回答への補足

()内の値でStudentオブジェクトを作成してそれをpushをしようとしているんでしょうか?

補足日時:2011/06/06 22:29
    • good
    • 0

間違いに気が付いたなら、それを直せば完了でしょう?



構造に関しては、おっしゃる通りです。
「先入れ後出し」とも言います。


このような話は情報処理では基本的なことですので、しっかりと勉強しておいたほうがいいでしょう。

この回答への補足

おっしゃる通りなんですがその部分をどうやって直したらいいのかが
いくら考えても分からなくて…

補足日時:2011/06/06 14:48
    • good
    • 0

> Sample.java:59: push(int) (Stack 内) を (Student) に適用できません



Studentクラスとint型には、型変換できるような互換性も親子関係も無いですから、push(int型)をpush(Studentクラス)と使おうとしても、Studentをintにできません、ってことです。
「foo(A,B,...)を(a,b,..)に適用できません」のエラーは、このような、定義されているものと使おうとしているもので、型が合わないときに出るものです。

そもそも、Studentクラスを扱うスタックを作るのに、なんでintなんですか?


> スタック自体は仕切りの付いた箱のような物でしょうか?

違います。
「データ構造 スタック」で検索するか、「データ構造」について書かれた本をよく読んでください。

この回答への補足

>そもそも、Studentクラスを扱うスタックを作るのに、なんでintなんですか?
後々見直したらその部分がおかしいと気付きました。
pushの引数はStudentクラスで設定したものを入れればいいのでしょうか?

スタックは下から順に積み上げて上から取り出すという構造だということでしょうか?

補足日時:2011/06/05 09:48
    • good
    • 0

「スタック」というのがどんなものかわかっていないのでは?


まず、「スタック」とは何かを調べてみましょう。

それと、SampleクラスでStackクラスを使っているのだから、それと整合性がとれるように
実装していけばいい。

この回答への補足

スタック自体は仕切りの付いた箱のような物でしょうか?
自分なりに作っていったのですが、
Sample.java:59: push(int) (Stack 内) を (Student) に適用できません
ss.push(new Student(1,"a",2,3,4));
^
Sample.java:60: push(int) (Stack 内) を (Student) に適用できません
ss.push(new Student(2,"b",2,3,4));
^
Sample.java:61: push(int) (Stack 内) を (Student) に適用できません
ss.push(new Student(3,"c",2,3,4));
^
Sample.java:62: push(int) (Stack 内) を (Student) に適用できません
ss.push(new Student(4,"d",2,3,4));

というエラーが出てしまいます。どういう意味のエラーなんでしょうか?
Stackクラスは以下です。
class Stack
{
private int stack[];
private int sp=0;

public Stack(int i)
{
stack = new int[i];
System.out.println("大きさ"+i+"のスタックを作りました");
}

public void push(int item)
{
if(sp!=stack.length)
{
System.out.println(item+"をpush");
stack[sp++] = item;
}
else
{
System.out.println("Stack is full");
}
}

public int pop()
{
if(sp>0){
System.out.println(stack[--sp]+"をpop");
return stack[sp];
}
else
System.out.println("Stack is empty");
return -1;
}

}

補足日時:2011/06/05 03:28
    • good
    • 0

「自分で作る」などという愚かなことはやめて, 標準にある Stack を使えばよかろう.

この回答への補足

既存のプログラムを完成させる問題なんで…

補足日時:2011/06/05 02:38
    • good
    • 0

> privateの物をどうやって要素にすれば



ん?
「Studentのクラス(のインスタンス)を要素とするスタック」でしょ。
「『Studentのクラスの要素(属性?)(はprivateしかない)』を要素とするスタック」じゃなくて。
Studentクラスのインスタンスそのものは別にprivateじゃないですよ。



まあ、普通はこんなのスタックで作らないと思うけど。

この回答への補足

つまりStudentを配列のハコとするということなんでしょうか?
これは課題なので致し方ないです…

補足日時:2011/06/05 01:46
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!