電子書籍の厳選無料作品が豊富!

ここの掲示板に初めて質問させていただきますm(_ _)m

今、大学でJavaの講義を受けてます。
文系なのに、取ったのが間違いかも、、、(T-T)
最初は「ジャンケン」とか「おみくじ」のプログラミングで、わかないながらも楽しかったのですが、徐々に手がつけれなくなって困ってます(汗

今回の御代は、
1月1日 仕入れた商品A、50個、100円
1月2日 仕入れた商品A、30個、200円
1月3日 仕入れた商品A、10個、300円
1月4日  売った商品A、50個
を簿記でいう「先入れ先出し方法」を使って算出
して、プログラミングを作らないといけません。

もう、1週間以上図書館や、参考書と睨めっこしても
全然解けません(+_+;
(だって似たような例だ、どこにも見当たらないんだもん、、、。)
簿記の算出方法は勉強して理解できるようになりましたが、Javaのプログラミングはどう打っていいか検討もつきません。どなた様か参考になるサイトか、こういう風に打てばいいんだよってイメージつく方いらっしゃったら、些細な事でもいいので伝授していただければ幸いですm(_ _)m
「誰も、解けないでしょうね~~」って、笑いながら言う教授にギャフンって言わせたいんです!
どうかよろしくお願いします。

A 回答 (10件)

 以下の例は、リングバッファを使った先入れ先出し機構(FIFO:First In First Out)です。


InPointは、次にデータを入れる場所を、OutPointは次にデータを取り出す場所を示しています。
OutPoint==InPointのときは、バッファが空であり、(InPoint+1)==OutPointのときは、バッファがいっぱいであると判断します。
よってこの方法では、1000個の領域に999個のデータまでしか保存できません。

class souko extends Object {

private int Tana[], InPoint, OutPoint;
private static final int SoukoCap = 1000;

public souko() { super();
Tana = new int[SoukoCap];
InPoint = 0;
OutPoint = 0;
};

public void kounyuu(int kosuu, int tanka) {
int i;
System.out.print("kounyuusuu(" + Integer.toString(kosuu) + ")");
for (i = 0; kosuu > 0; kosuu --, i ++) {
if (((InPoint + 1) >= SoukoCap ? 0 : InPoint + 1) == OutPoint) break;
else Tana[InPoint] = tanka;
if ((++ InPoint) >= SoukoCap) InPoint = 0;
};
System.out.println(Integer.toString(i) +
" tanka:" + Integer.toString(tanka) + " kingaku:" + Integer.toString(i * tanka));
};

public int hanbai(int kosuu) {
int i, j = 0;
System.out.print("hanbaisuu(" + Integer.toString(kosuu) + ")");
for (i = 0; kosuu > 0; kosuu --, i ++) {
if (OutPoint == InPoint) break;
else j += Tana[OutPoint];
if ((++ OutPoint) >= SoukoCap) OutPoint = 0;
};
System.out.println(Integer.toString(i) + " kingaku:" + Integer.toString(j));
return(j);
};

}

public class koubai {

public static void main(String args[]) {

souko Souko = new souko();

Souko.kounyuu(50, 100);
Souko.kounyuu(30, 200);
Souko.kounyuu(10, 300);

Souko.hanbai(50);

Souko.kounyuu(1000, 100);
Souko.hanbai(1000);

};

}
    • good
    • 0

#8> ただ,java.util.Vector 自体はFILOでもFIFOでもなく,インターフェイス(界面仕様)だけをとってみれば単なる可変長配列に過ぎないのではないでしょうか?



その通り。単なる可変長配列です。しかしそれは裏を返せば順序集合中の要素の位置によって挿入/削除にかかる時間計算量が変化することを意味しています。集合の先頭に要素を挿入/削除する際の時間計算量はΟ(N)であり、すなわちFILOとして使用するとLinkedListに比べて'遅い'ことになります。
    • good
    • 0

#6> 基本的にはjava.util.Vectorクラスを使うのが楽なんじゃないかと思います。



#7>VectorはStack(FirstIn-LastOut)なので
#7>LinkedListがいいのではないかと。

たしかに,java.util.LinkedListで実装する方が直観的ですね。

ただ,java.util.Vector 自体はFILOでもFIFOでもなく,インターフェイス(界面仕様)だけをとってみれば単なる可変長配列に過ぎないのではないでしょうか?

実際,java.util.Vector#add(Object) と java.util.Vector#remove(int) を使って,

格納:java.util.Vector#add(Object)
取出:java.util.Vector#remove(0)

とすればFIFOになりますし,

格納:java.util.Vector#add(Object)
取出:java.util.Vector#remove(java.util.Vector#size() - 1)

とすればLIFOになります。
    • good
    • 0

#6> 基本的にはjava.util.Vectorクラスを使うのが楽なんじゃないかと思います。



VectorはStack(FirstIn-LastOut)なので
LinkedListがいいのではないかと。
    • good
    • 0

#5のatonです。


勘違いしていて恥ずかしい。
「後入れ先出し」ではなく,「先入れ先出し」ですね。
下の回答は無視してください。

...

これだけではなんですので,ついでに「先入れ先出し」に再トライ。
基本的にはjava.util.Vectorクラスを使うのが楽なんじゃないかと思います。こんな感じ。

Vector vec = new Vector();
//仕入れ処理
for (int ii=0; ii<50; ii++)
{
vec.add(new Integer(100));
}
...(以下同様)
//販売処理
for (int ii=0; ii<50; ii++)
{
Integer val = (Integer) vec.remove(0); //先頭の要素を削除して戻り値として返します。
...(何か必要な処理)
}

処理速度には問題ありそうですが,やはり最も素直な実装かと。

参考URL:http://java.sun.com/j2se/1.4/ja/docs/ja/api/java …
    • good
    • 0

ちょっとだけアドバイスを。



「後入れ先出し」のプログラムを作るのであれば,Javaの標準ライブラリーに java.util.Stack というクラスがあるので,ArrayListや配列を使うよりこちらを使った方が楽だと思います。
pushメソッドで入れて,popメソッドで出します。

Stack stack = new Stack();
//仕入れ処理
for (int ii=0; ii<50; ii++)
{
stack.push(new Integer(100));
}
...(以下同様)
//販売処理
for (int ii=0; ii<50; ii++)
{
Integer val = (Integer) stack.pop();
...(何か必要な処理)
}

型変換とjava.lang.Integerクラスの扱いが多少面倒ですが,実装としては一番素直だと思います。

参考URL:http://java.sun.com/j2se/1.4/ja/docs/ja/api/java …
    • good
    • 0

先入れ先出しに関しては、他の方が書いているので、


データの格納方法について少し書きます。


ArrayList等で管理するものは、単価だけにすれば楽ですよ。

1.50円で2個仕入れた。

  ArrayListの中身
  50 追加
  50 追加

2.次に30円で3個仕入れた。

  ArrayListの中身
  50
  50
  30 追加
  30 追加
  30 追加

3.品物を3個売った
  ArrayListの中身
  50 → 削除
  50 → 削除
  30 → 削除
  30
  30


つまり、仕入れ時は個数分だけ単価の金額を追加し、
売上時は、個数分頭から削除していきます。
(在庫数を越さないためのエラーチェックを忘れずに)

このためのメソッドを、ArrayListを拡張(extends)したクラスに
追加しておくといいでしょう。

//入庫(仕入れ)用
public void nyuko(int suryou, int tanka);

//出庫(売上)用
public void shukko(int suryou);

繰り返しは、for文です。習いましたよね?



実際のシステムでは使えないですが、宿題程度なら
これでいいんじゃないですか?
(少なくても間違いではないし・・・)
    • good
    • 0

先入れ先出し法というのは、先に入れたものが取り出す時に先に出てくれば良いので、Vectorでaddメソッドを使って追加するのではなく、insertElementAtで常に先頭に追加して行き、取り出す時に最後尾から取り出していくという方法を使えば、簡単に作成できると思います。



追加していくときに、常に配列の先頭に挿入して行き、取り出す時は、最後尾から取り出して行けば、配列の最後尾を削除するという形です。

言葉で説明しても分かり辛いかと思いますので、例を書いて見ますね
以下のソースを実行すれば、FIFO(先入れ先出し)方式で動いている事が確認できると思います。

import java.util.Vector;
public class Sakiire {
Vector vec;
public Sakiire() { // コンストラクタ
vec = new Vector();
}
public void push( Object obj ) { // 追加処理
vec.insertElementAt(obj, 0);
}
public Object pop() { // 抽出処理
if( vec.isEmpty() ) return null;
Object obj = vec.lastElement();
vec.remove(vec.size()-1);
return obj;
}
public static void main(String[] args ) {
Sakiire a = new Sakiire();
a.push("a"); // aを追加
a.push("b"); // bを追加
a.push("c"); // cを追加
System.out.println(a.pop()); // 一つ抽出
System.out.println(a.pop()); // 一つ抽出
System.out.println(a.pop()); // 一つ抽出
}
}
    • good
    • 0

簿記の先入れ先出し法は知りませんが、おそらくキュー(待ち行列)を


使ってできると思います。ただ、JAVAの標準ライブラリにはキュー
そのものはなかったはずです。配列やArrayListを使って実装する
事になります。

ArrayListを使う場合はadd()、get()、remove()、size()、isEmpty()
などを使えばよいでしょう。

参考URL:http://java.sun.com/j2se/1.4/ja/docs/ja/api/java …
    • good
    • 0
この回答へのお礼

gimmick様、夜遅くにアドバイスいただき恐縮ですm(_ _)m見た事もないメソッドなのでビックリしましたけど、今一生懸命参考書&ネットで奮闘してます!おかげで、すごく勉強になります。本当にどうも、ありがとうございます。

お礼日時:2004/07/05 23:13

データ構造につい参考書に書いてないでしょうか。


ほんと、そのまま倉庫をイメージして素直にプログラムで再現できれば…というところです。

個人的には初めての方は専用のクラスを使うよりは配列を使って表現してみるのが直感的にわかりやすいと思ってます。

参考URL:http://www.mybrain.jp/java/DS/DS_queue.html
    • good
    • 0
この回答へのお礼

uninin様、さっそくお返事いただきありがとうございます(^-^*)参考URL非常に参考になりました。わからなくって(イメージできなくって)へこんでたので、アドバイスとても嬉しかったです!

お礼日時:2004/07/05 23:10

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