【Java作业】实验二 货物进销管理系统(运行成功完整代码
實驗?zāi)康?br /> 1.掌握Java中文件的讀寫操作。
2.學會使用Java提供的實用類(Vector, ArrayList)來完成特定的功能。
3.掌握字符串類(String, StringBuffer)的使用。
4.掌握用面向?qū)ο蟮姆椒ǚ治龊徒鉀Q復(fù)雜問題。
二.實驗內(nèi)容
編寫一個Inventory.java完成以下功能:
1.程序首先打開并讀取Inventory.txt中記錄的所有庫存記錄,然后讀取Transactions.txt,處理這個文件中包含的事務(wù),記錄發(fā)貨記錄到Shipping.txt,并記錄錯誤信息到Errors.txt中。最后更新庫存到另外一個文件NewInventory.txt中。
2.文件Inventory.txt和NewInventory.txt的每行包含一個存貨記錄,沒條記錄包含下面一些字段息,這些字段之間用一個tab分開(見后面的文件格式):
字段 格式和含義
Item number 字符串型,貨物編號
Quantity 整型,貨物數(shù)量
Supplier 字符串型,供應(yīng)商編號
Description 字符串型,貨物描述
3.字段Items按照從小到大的順序?qū)懭胛募摹W⒁釯tem號不必連續(xù),如Item號為752的后面可能是800。
4.文件Transactions.txt包含幾個不同的處理記錄(每行一條記錄)。每條記錄前面以一個大寫字母開頭,表示這條記錄是什么類型的事務(wù)。在不同的大寫字母后面是不同的信息格式。所有的字段也是以tab鍵分開的(見Transactions.txt文件格式)。
5.以’O’開頭(Order的首字母)的事務(wù)表示這是一個發(fā)貨訂單,即某一種貨物應(yīng)該發(fā)給特定的客戶。Item number和Quantity的格式如上面表格定義。Custom編號和上面的Supplier編號一致。處理一條定單記錄(以’O’開頭的事務(wù))意味著從減少庫存記錄中相應(yīng)貨物的數(shù)量(減少的數(shù)量=發(fā)貨單中的數(shù)量),記錄發(fā)貨信息到Shipping.txt中。注意:Inventory.txt中的quantity不應(yīng)該小于0,如果對于某一種貨物,庫存的數(shù)量小于發(fā)貨單的數(shù)量的話,系統(tǒng)應(yīng)該停止處理發(fā)貨單,并記錄出錯信息到Errors.txt。如果對于某一種貨物有多個發(fā)貨單,而且?guī)齑婵偭啃∮谶@些發(fā)貨單的總和的話,系統(tǒng)應(yīng)該按照發(fā)貨單中的數(shù)量從小到大的有限原則滿足客戶。也就是說,對于某一種貨物如果一個數(shù)量Quantity少的發(fā)貨單沒有處理之前,數(shù)量Quantity多的發(fā)貨單永遠不會被處理。(這種處理原則不受發(fā)貨單記錄在Transactions.txt的先后順序影響)
6.以’R’開頭的事務(wù)表示這是一個到貨單記錄,在’R’后面是Item number和它的數(shù)量Quanlity。處理一條到貨單意味著增加庫存中相應(yīng)貨物的數(shù)量(增加的數(shù)量=到貨單中的數(shù)量)。注意:如果在Transactions.txt文件中,到貨單出現(xiàn)在發(fā)貨單之后,到貨單中的貨物數(shù)量可以用來填補發(fā)貨單中的數(shù)量(可以理解成在Transactions.txt中,優(yōu)先處理到貨單)。
7.以’A’開頭的事務(wù)表示向庫存中增加一種新的貨物(即這種貨物以前庫存中沒有),在’A’后面是Item number,供應(yīng)商supplier以及貨物的描述description。處理一個新增貨物記錄意味著向庫存中增加一個數(shù)量Quantity為0的新的Item。你可以假設(shè)在一個Transactions.txt中,新增貨物記錄總是出現(xiàn)在第一個到貨單之前。
8.以’D’開頭的事務(wù)表示從庫存中刪除一種貨物,在’D’后面是Item號。刪除操作總是在所有的事物處理之后才被處理,以保證對于可能出現(xiàn)的同一種貨物的發(fā)貨單的操作能在刪除之前被正確處理。如果要刪除的某種貨物的庫存量Quantity不為0的話,系統(tǒng)應(yīng)該向Errors.txt記錄出錯信息。
9.文件Shipping.txt中的每一行代表給某一客戶的發(fā)貨信息。Shipping.txt中的每一行分別是客戶編號、Item號、貨物數(shù)量,它們之間用tab鍵分隔。如果發(fā)貨單中有兩條客戶編號和Item編號一樣的記錄,在Shipping.txt中應(yīng)該將這兩條發(fā)貨信息合并(即將它們的數(shù)量相加)。
10.Errors.txt文件包含未發(fā)送的發(fā)貨記錄和庫存量大于0的刪除記錄。Errors.txt每一行包含Custom編號、Item編號以及發(fā)貨單上的數(shù)量Quantity。對于刪除操作,Custom編號為0,數(shù)量Quntity為庫存中的Quantity.
11.實驗測試數(shù)據(jù):
Inventory.txt
17 42 6 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
代碼:(目前還不完整,含有讀取transanctions.txt和寫入到shipping.txt中的)
先附資料:
vector:
public static void main(String args[])throws IOException{Vector hs = new Vector();Integer integer1 = new Integer(1);hs.addElement(integer1);Integer integer2 = new Integer(111);hs.addElement(integer2);Iterator iterator = hs.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}ArrayList是最常用的List實現(xiàn)類,內(nèi)部是通過數(shù)組實現(xiàn)的,它允許對元素進行快速隨機訪問。數(shù)組的缺點是每個元素之間不能有間隔,當數(shù)組大小不滿足時需要增加存儲能力,就要講已經(jīng)有數(shù)組的數(shù)據(jù)復(fù)制到新的存儲空間中。當從ArrayList的中間位置插入或者刪除元素時,需要對數(shù)組進行復(fù)制、移動、代價比較高。因此,它適合隨機查找和遍歷,不適合插入和刪除。
Vector與ArrayList一樣,也是通過數(shù)組實現(xiàn)的,不同的是它支持線程的同步,即某一時刻只有一個線程能夠?qū)慥ector,避免多線程同時寫而引起的不一致性,但實現(xiàn)同步需要很高的花費,因此,訪問它比訪問ArrayList慢。
vector是線程(Thread)同步(Synchronized)的,所以它也是線程安全的,而Arraylist是線程異步(ASynchronized)的,是不安全的
用vector思路的版本:
class goods{private String Itemnumber;private int Quatity;private String Supplier;private String Description;public String getItemnumber() {return Itemnumber;} public void update(int num) {this.Quatity = this.Quatity+num;//修改總庫存的函數(shù) }public void setItemnumber(String itemnumber) {Itemnumber = itemnumber;}public int getQuatity() {return Quatity;}public void setQuatity(int quatity) {Quatity = quatity;}public String getSupplier() {return Supplier;}public void setSupplier(String supplier) {Supplier = supplier;}public String getDescription() {return Description;}public void setDescription(String description) {Description = description;} public void less(int num) {//發(fā)貨時數(shù)量減少的函數(shù)this.Quatity = this.Quatity-num; }public goods(String itemnumber, int quatity, String supplier, String description) {Itemnumber = itemnumber;Quatity = quatity;Supplier = supplier;Description = description;} } class Fagood{private String operaion;private String Item;private int total;private String receiver;public String getOperaion() {return operaion;}public void setOperaion(String operaion) {this.operaion = operaion;}public String getItem() {return Item;}public void setItem(String item) {Item = item;}public int getTotal() {return total;}public void setTotal(int total) {this.total = total;}public String getReceiver() {return receiver;}public void setReceiver(String receiver) {this.receiver = receiver;}public Fagood(String operaion, String item, int total, String receiver) {this.operaion = operaion;Item = item;this.total = total;this.receiver = receiver;}public Fagood(String operaion, String item) {this.operaion = operaion;Item = item;}public Fagood(String operaion, String item, int total) {this.operaion = operaion;Item = item;this.total = total;} } public class Student {public static void main(String[] args) throws IOException {String datas[][] = new String[10][10];String data2[][] = new String[10][10];Vector<goods> Good = new Vector<goods>(0);// int Quantity[] = new int[1000000];//庫存數(shù)量Vector<Fagood> FaGood = new Vector<Fagood>(0);PrintWriter out1 = new PrintWriter("D:\\Error.txt","UTF-8");FileReader mfr = new FileReader("D:\\Transactions.txt");BufferedReader mbffr = new BufferedReader(mfr);FileReader fr = new FileReader("D:\\Inventory.txt");PrintWriter out = new PrintWriter(new FileWriter("D:\\Shipping.txt",true));out.println("客戶編號 "+" "+"Item號 "+"貨物數(shù)量");BufferedReader bffr = new BufferedReader(fr);try {String s = null;int i = 0;while ((s = bffr.readLine()) != null) {datas[i] = s.split("\t");System.out.println("第" + i + "行" + s);goods agood = new goods(datas[i][0], Integer.parseInt(datas[i][1]), datas[i][2], datas[i][3]);// System.out.println(agood.getDescription());Good.addElement(agood);//把一個商品加入到vector數(shù)組中i++;}bffr.close();fr.close();} catch (Exception e1) {e1.printStackTrace();}System.out.println(Good.capacity()); //處理D:\Transactions.txttry {String s = null;int i = 0;while ((s = mbffr.readLine()) != null){data2[i] = s.split("\t");// System.out.println("第"+(i+1)+"行"+s); // System.out.println(Integer.parseInt(data2[i][2]));Iterator iterator = Good.iterator();if (data2[i][0].matches("O")){Fagood fagood = new Fagood(data2[i][0], data2[i][1], Integer.parseInt(data2[i][2]), data2[i][3]);FaGood.add(fagood);for (int j = 0; j < Good.capacity()-1; j++){//System.out.println(good.getQuatity());if (Integer.parseInt(Good.get(j).getItemnumber()) == Integer.parseInt(fagood.getItem())){int num = Good.get(j).getQuatity();System.out.println(num);num = num - fagood.getTotal();System.out.println("減去后"+num);if (num < 0) {//驗錯,如果發(fā)貨的總量超過了庫存則寫入error.txttry{File file2 = new File("D:\\Error.txt");FileWriter in = new FileWriter(file2, true);out1.println(String.valueOf(fagood.getItem()) + "發(fā)貨庫存量不足\n");}catch (Exception ee) {ee.printStackTrace();}}else {Good.get(j).less(fagood.getTotal());try {File ship = new File("D:\\Shipping.txt");System.out.println("發(fā)貨一次");FileWriter fw = new FileWriter(ship, true);out.println( fagood.getReceiver()+"\t"+fagood.getTotal()+"\t"+fagood.getItem()+"\n");} catch (Exception e) {e.printStackTrace();}}}}// System.out.println(Good.capacity());}if (data2[i][0].matches("D"))//刪除一種商品{for (goods good : Good) {if (Integer.parseInt(good.getItemnumber()) == Integer.parseInt(data2[i][1])) {Good.remove(good);//刪除該種商品}}}if (data2[i][0].matches("R")) {//到貨單記錄,在'R'后面是Item number和它的數(shù)量Quanlity。for (goods good : Good) {if (Integer.parseInt(good.getItemnumber()) == Integer.parseInt(data2[i][1])) {System.out.println("是R");good.update(Integer.parseInt(data2[i][2]));//增加庫存}}}i++;}out.flush();out.close();out1.close();} catch (Exception e) {e.printStackTrace();} finally {}for (goods good : Good){ System.out.println(good.getItemnumber()+" "+good.getQuatity()+" "+good.getDescription());}}}為了同學們自己看,于是刪掉了代碼注釋,有問題的私我吧~
附上結(jié)果圖:
總結(jié)
以上是生活随笔為你收集整理的【Java作业】实验二 货物进销管理系统(运行成功完整代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【java学习笔记-io流 文件读写和键
- 下一篇: 【学习笔记】mongoDB初步(一)Mo