java 簡要講解 貨物進銷管理系統
實驗描述:
編寫一個Inventory.java完成以下功能(沒有學過Java檔案處理之前,各位同學可以使用硬編碼將資料放進兩個Vector變數裡。等學過Java檔案處理之後,再補充資料檔案讀取部分):
1.程式首先開啟並讀取Inventory.txt中記錄的所有庫存記錄,然後讀取Transactions.txt,處理這個檔案中包含的事務,記錄發貨記錄到Shipping.txt,並記錄錯誤資訊到Errors.txt中。最後,根據事務更新庫存到另外一個檔案NewInventory.txt中。
2.檔案Inventory.txt和NewInventory.txt的每行包含一個存貨記錄,每條記錄包含下面一些欄位息,這些欄位之間用一個tab分開(見後面的檔案格式):
欄位 |
格式和含義 |
Item number |
字串型,貨物編號 |
Quantity |
整型,貨物數量 |
Supplier |
字串型,供應商編號 |
Description |
字串型,貨物描述 |
3.欄位Items按照從小到大的順序寫入檔案的。注意Item號不必連續,如Item號為752的後面可能是800。
4.檔案Transactions.txt包含幾個不同的處理記錄(每行一條記錄)。每條記錄前面以一個大寫字母開頭,表示這條記錄是什麼型別的事務。在不同的大寫字母后面是不同的資訊格式。所有的欄位也是以tab鍵分開的(見Transactions.txt檔案格式)。
5.以'O'開頭的事務表示這是一個發貨訂單,即某一種貨物應該發給特定的客戶。Item number和Quantity的格式如上面表格定義。Custom編號和上面的Supplier編號一致。處理一條定單記錄(以'O'開頭的事務)意味著減少庫存記錄中相應貨物的數量(減少的數量=發貨單中的數量),記錄發貨資訊到Shipping.txt中。注意:Inventory.txt中的quantity不應該小於0,如果對於某一種貨物,庫存的數量小於發貨單的數量的話,系統應該停止處理髮貨單,並記錄出錯資訊到Errors.txt。如果對於某一種貨物有多個發貨單,而且庫存總量小於這些發貨單的總和的話,系統應該按照發貨單中的數量從小到大的有限原則滿足客戶。也就是說,對於某一種貨物如果一個數量Quantity少的發貨單沒有處理之前,數量Quantity多的發貨單永遠不會被處理。(這種處理原則不受發貨單記錄在Transactions.txt的先後順序影響)
6.以'R'開頭的事務表示這是一個到貨單記錄,在'R'後面是Item number和它的數量Quanlity。處理一條到貨單意味著增加庫存中相應貨物的數量(增加的數量=到貨單中的數量)。注意:如果在Transactions.txt檔案中,到貨單出現在發貨單之後,到貨單中的貨物數量可以用來填補發貨單中的數量(可以理解成在Transactions.txt中,優先處理到貨單)。
7.以'A'開頭的事務表示向庫存中增加一種新的貨物(即這種貨物以前庫存中沒有),在'A'後面是Item number,供應商supplier以及貨物的描述description。處理一個新增貨物記錄意味著向庫存中增加一個數量Quantity為0的新的Item。你可以假設在一個Transactions.txt中,新增貨物記錄總是出現在第一個到貨單之前。
8.以'D'開頭的事務表示從庫存中刪除一種貨物,在'D'後面是Item號。刪除操作總是在所有的事物處理之後才被處理,以保證對於可能出現的同一種貨物的發貨單的操作能在刪除之前被正確處理。如果要刪除的某種貨物的庫存量Quantity不為0的話,系統應該向Errors.txt記錄出錯資訊。
9.檔案Shipping.txt中的每一行代表給某一客戶的發貨資訊。Shipping.txt中的每一行分別是客戶編號、Item號、貨物數量,它們之間用tab鍵分隔。如果發貨單中有兩條客戶編號和Item編號一樣的記錄,在Shipping.txt中應該將這兩條發貨資訊合併(即將它們的數量相加)。
10.Errors.txt檔案包含未傳送的發貨記錄和庫存量大於0的刪除記錄。Errors.txt每一行包含Custom編號、Item編號以及發貨單上的數量Quantity。對於刪除操作,Custom編號為0,數量Quntity為庫存中的Quantity.
11.實驗測試資料:
Inventory.txt
17 42 6 widget,blue
1234 0 4 whatsit
123123 999999 98 Doohicky
Transactions.txt
O 123123 1000 9
O 17 36 8
O 17 12 4
R 123123 1
D 1234
A 5 4 Thingy
程式碼是參考一個學長的,自己只是添了一點註解而已qaq。。。。。。希望看了的同學能夠掌握這個系統的運作過程,進一步瞭解java。。。
package std;
import java.io.*;
import java.util.*;
//貨物
class Inv{
int Index; //編號
int qua; //數量
int mer; //供應商編號
String Message; //資訊
Inv(int i,int q,int s,String d){
Index = i;
qua = q;
mer = s;
Message = d;
}
Inv(Add Name){
Index = Name.Index;
qua = 0;
mer = Name.mer;
Message = Name.Message;
}
public void plus(int q){
qua += q;
}
public void cut(int q){
qua -= q;
}
}
//收貨記錄
class Receive{
int Index;
int qua;
Receive(int i, int q){
Index = i;
qua = q;
}
}
//發貨記錄
class Offer{
int Index;
int qua;
int mer;
Offer(int i, int q, int c){
Index = i;
qua = q;
mer = c;
}
}
//添貨記錄
class Add{
int Index;
int mer;
String Message;
Add(int i, int s, String d){
Index = i;
mer = s;
Message = d;
}
}
//刪貨記錄
class Delete{
int Index;
Delete(int i){
Index = i;
}
}
//錯誤記錄
class Err{
int mer;
int Index;
int qua;
Err(int c, int i, int q){
mer = c;
Index = i;
qua = q;
}
Err(Offer o){
mer = o.mer;
Index = o.Index;
qua = o.qua;
}
}
public class Inventory{
Vector inv = new Vector(); //讀入資訊
Vector receive = new Vector(); //收貨
Vector offer = new Vector(); //發貨
Vector AddNam = new Vector(); //添貨
Vector DeleteNum = new Vector(); //刪貨
Vector shipping_v = new Vector(); //發貨記錄
Vector Err_v = new Vector(); //錯誤記錄
//原始貨物資訊的讀入
public void readInv(String filename) throws Exception{
BufferedReader br = new BufferedReader(new FileReader(filename));
String s = null;
while((s=br.readLine()) != null){
String Name[] = s.split("\t");
inv.add(new Inv(Integer.parseInt(Name[0]),Integer.parseInt(Name[1]),Integer.parseInt(Name[2]),Name[3]));
//根據Tab切割資訊,組合成一個類加到inv中
}
br.close();
}
//貨物處理資訊的讀入
public void readTra(String filename) throws Exception{
BufferedReader br = new BufferedReader(new FileReader(filename));
String s = null;
while((s=br.readLine()) != null){
String Name[] = s.split("\t");
char method = Name[0].charAt(0); //s.charAr(0)返回s的第一個字元,就是操作名稱
if(method=='O')
offer.add(new Offer(Integer.parseInt(Name[1]), Integer.parseInt(Name[2]), Integer.parseInt(Name[3])));
else if(method=='R')
receive.add(new Receive(Integer.parseInt(Name[1]), Integer.parseInt(Name[2])));
else if(method=='A')
AddNam.add(new Add(Integer.parseInt(Name[1]), Integer.parseInt(Name[2]), Name[3]));
else if(method=='D')
DeleteNum.add(new Delete(Integer.parseInt(Name[1])));
}
br.close();
}
//添貨
public void dealAdd(){
for(int i=0; i<AddNam.size(); i++){
Inv New = new Inv((Add)AddNam.get(i));
inv.add(New);
}
}
//收貨處理
public void dealReceive(){
for(int i=0; i<receive.size(); i++){
for(int j=0; j<inv.size(); j++){ //逐次查詢索引相同的商品
if( ((Receive)receive.get(i)).Index == ((Inv)inv.get(j)).Index )
((Inv)inv.get(j)).plus(((Receive)receive.get(i)).qua);
}
}
}
//對同種商品,將發貨量小的換到前面,優先處理髮貨量小的。
public void arrOffer(){
for(int i=0; i<offer.size(); i++)
for(int j=i+1; j<offer.size(); j++){
if( ((Offer)offer.get(i)).Index == ((Offer)offer.get(j)).Index ){
if( ((Offer)offer.get(i)).qua > ((Offer)offer.get(j)).qua ){
Offer Name = (Offer)offer.get(i);
offer.set(i,(Offer)offer.get(j)); //set操作:如v.set(i,p),將索引為i的元素置為p。
offer.set(j,Name);
}
}
}
}
//發貨處理
public void dealOffer(){
for(int i=0; i<offer.size(); i++)
for(int j=0; j<inv.size(); j++){
if( ((Offer)offer.get(i)).Index == ((Inv)inv.get(j)).Index ){
if( ((Inv)inv.get(j)).qua >= ((Offer)offer.get(i)).qua ){
((Inv)inv.get(j)).cut( ((Offer)offer.get(i)).qua );
shipping_v.add( (Offer)offer.get(i) );
}
else{
Err Name = new Err( (Offer)offer.get(i) );
Err_v.add(Name);
}
}
}
}
//刪貨處理
public void dealDelete(){
for(int i=0; i<DeleteNum.size(); i++){
for(int j=0; j<inv.size(); j++){
if( ((Delete)DeleteNum.get(i)).Index == ((Inv)inv.get(j)).Index ){
if(((Inv)inv.get(j)).qua == 0){
inv.remove(j);
break;
}
else{
Err_v.add(new Err(0, ((Inv)inv.get(j)).Index, ((Inv)inv.get(j)).qua ));
break;
}
}
}
}
}
//對同種商品,合併供貨商相同的
public void arrshipping(){
for(int i=0; i<shipping_v.size(); i++)
for(int j=i+1; j<shipping_v.size(); j++){
if( ((Offer)shipping_v.get(i)).mer == ((Offer)shipping_v.get(j)).mer && ((Offer)shipping_v.get(i)).Index == ((Offer)shipping_v.get(j)).Index ){
Offer New = new Offer( ((Offer)shipping_v.get(i)).Index, ((Offer)shipping_v.get(i)).qua+((Offer)shipping_v.get(j)).qua, ((Offer)shipping_v.get(i)).mer );
shipping_v.set(i,New);
shipping_v.remove(j);
j--;
}
}
}
//按索引從小到大對貨單排序
public void arrInv(){
for(int i=0; i<inv.size(); i++)
for(int j=i+1; j<inv.size(); j++){
if( ((Inv)inv.get(i)).Index > ((Inv)inv.get(j)).Index ){
Inv Name = (Inv)inv.get(i);
inv.set(i,(Inv)inv.get(j));
inv.set(j,Name);
}
}
}
//將資訊儲存在相應的文字中。
public void write(String filenames) throws Exception{
String[] filename = filenames.split(" ");
BufferedWriter ibw = new BufferedWriter(new FileWriter(filename[0]));
BufferedWriter sbw = new BufferedWriter(new FileWriter(filename[1]));
BufferedWriter ebw = new BufferedWriter(new FileWriter(filename[2]));
for(int i=0; i<inv.size(); i++){
Inv Name = (Inv)inv.get(i);
String s = Name.Index +"\t"+ Name.qua +"\t"+ Name.mer +"\t"+ Name.Message;
ibw.write(s);
ibw.newLine(); //換下一行
}
for(int i=0; i<shipping_v.size(); i++){
Offer Name = (Offer)shipping_v.get(i);
String s = Name.mer +"\t"+ Name.Index +"\t"+ Name.qua;
sbw.write(s); sbw.newLine();
}
for(int i=0; i<Err_v.size(); i++){
Err Name = (Err)Err_v.get(i);
String s = Name.mer +"\t"+ Name.Index +"\t"+ Name.qua;
ebw.write(s); ebw.newLine();
}
ibw.close();
sbw.close();
ebw.close();
}
public static void main(String[] arg){
Inventory inventory = new Inventory();
//讀入兩個檔案的資訊。
inventory.readInv("Inventory.txt");
inventory.readTra("Transactions.txt");
//根據讀入的資訊分別進行新增接受刪除操作。
inventory.dealAdd();
inventory.dealReceive();
inventory.arrOffer();
inventory.dealOffer();
inventory.dealDelete();
inventory.arrshipping();
inventory.arrInv();
//將資訊儲存在相應的文字中。
inventory.write("NewInventory.txt shipping.txt Errors.txt");
}
}