实验二 货物进销管理系统

编写一个Inventory.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’开头(Order的首字母)的事务表示这是一个发货订单,即某一种货物应该发给特定的客户。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

Transactions.txt

package test;
public class Inventory{
 String Item;
 int Quantity;
 String Supplier;
 String Description;
 Inventory(String _Item,int _Quantity,String _Supplier,String _Description){
  Item=_Item;
  Quantity=_Quantity;
  Supplier=_Supplier;
  Description=_Description;
 }
}
package test;
public class transaction implements Comparable{
 String type;
 String Item;
 int num;
 String customer;
 transaction(String _type,String _Item,int _num,String _customer){
  type=_type;
  Item=_Item;
  num=_num;
  customer=_customer;
 }
 @Override
 public int compareTo(Object o) {
  transaction t=(transaction)o;
  return num-t.num;
 }
}
 
  
package test;
import java.io.*;
import java.util.Collections;
import java.util.Vector;
public class example {
 private static BufferedReader reader;
 private static BufferedReader reader2;
 public static void main(String[] args) throws Exception{
  Vector invVector=readInventory("d:/Inventory.txt");   //读入Inventory并存入Vector中,每个元素为一项库存
  Vector tVector=readTransaction("d:/transaction.txt");//读入transaction并存入Vector中,每个元素为一个事件
  Vector oVector=new Vector();
  for(int i=0;i=出货量,则执行O操作
     if(invVector.get(j).Quantity>=oVector.get(i).num) {
      invVector.get(j).Quantity-=oVector.get(i).num;
     }else {
      FileOutputStream fos=new FileOutputStream("d:/Errors.txt"); //若库存量<出货量,则说明该O操作违规,读入到d:/Errors.txt中
      OutputStreamWriter writer=new OutputStreamWriter(fos,"UTF-8");
      BufferedWriter bwriter=new BufferedWriter(writer);
      bwriter.write(oVector.get(i).type+"\t"+oVector.get(i).Item+"\t"+oVector.get(i).num+"\t"+oVector.get(i).customer);
      bwriter.newLine();
      bwriter.flush();
      bwriter.close();
     }
    }
   }
  }
  for(int i=0;i readInventory(String filename) throws Exception{ //读 Inventory   
  Vector invVector=new Vector();
  reader2 = new BufferedReader(new InputStreamReader(new FileInputStream(filename)));
  String line="";
  while((line=reader2.readLine())!=null) {   
   String[] temp=line.split("\t");    //通过String.split()函数把每条库存的每项数据通过"\t"分开,为读操作做准备
   if(temp.length==4) {
    invVector.add(new Inventory(temp[0],Integer.parseInt(temp[1]),temp[2],temp[3]));
   }
  }
  return invVector;
 }
 private static Vector readTransaction(String filename) throws Exception{
  Vector tVector=new Vector();
  reader = new BufferedReader(new InputStreamReader(new FileInputStream(filename)));
  String line="";
  while((line=reader.readLine())!=null) {
   String[] temp=line.split("\t");   //通过String.split()函数把事件包含的数据通过"\t"分开,为读操作做准备
   if(temp.length==3) {       //当temp.length==3,说明该事件为R
    tVector.add(new transaction(temp[0],temp[1],Integer.parseInt(temp[2]),""));
   }else if(temp.length==4){    //当temp.length==4,说明该事件为O或A
    tVector.add(new transaction(temp[0],temp[1],Integer.parseInt(temp[2]),temp[3]));
   }
   else if(temp.length==2){    当temp.length==2,说明该事件为D
    tVector.add(new transaction(temp[0],temp[1],0,""));
   }
  }
  return tVector;
 }
}

你可能感兴趣的:(字符串,java,python,数据结构,mooc)