实验二 货物进销管理系统

news/2025/1/15 22:55:15/

1.掌握Java中文件的读写操作。

    2.学会使用Java提供的实用类(Vector, ArrayList)来完成特定的功能。

    3.掌握字符串类(String, StringBuffer)的使用。

    4.掌握用面向对象的方法分析和解决复杂问题。

二、实验内容

    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

Transactions.txt

三、实验原理

原理分析:该题目要求处理出发货数据,这就要求实现对文件的读取与写入,先新建一个list进行临时存储并协助处理进出货数据。

四、使用硬件、软件环境

配置:

设备名称  LAPTOP-S0UG8V0Q

处理器 AMD Ryzen 7 5800H with Radeon Graphics            3.20 GHz

机带 RAM  16.0 GB (13.9 GB 可用)

设备 ID   7BD24A51-A496-4C29-8EBB-C469B6687980

产品 ID   00342-36248-37328-AAOEM

系统类型  64 位操作系统, 基于 x64 的处理器

内存为16G,硬盘为1429.6G,安装WIN10操作系统。另外,使用IDEA,JDK 8等软件

  • 实验过程、步骤及原始记录(算法、原程序、测试结果,分析等)

分析:主类中创建出货型号inemNumber,货物质量quantity,供应商编号supplier,货物描述description,然后将inventory.txt文件写入到list中,进行操作,对数据处理完毕后,在写入到shopping.txt和newInventory.txt中

在实验二中,根据题目意思的话,就是对Inventory.txt文件与Transactions.txt文件进行读写操作,对读取出的数据进行分析,比较两组数据得出出货数据,写入shipping.txt中,得出错误数据,写入Errors.txt中,最后刷新Invention.txt数据写入到NewInventory.txt中。在该实验中,多次用到文件的读取与写入,对读取的数据进行操作。

ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。

Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。

vector是线程(Thread)同步(Synchronized)的,所以它也是线程安全的,而Arraylist是线程异步(ASynchronized)的,是不安全的。

 

//作者:代波
//时间:2022/4/30 19:09
import javafx.util.Pair;//多返回值导包import java.io.*;//导入包含了流式I/O所需要的所有类
import java.util.*;public class Inventory {//创建Inventory类对象public String itemNumber;//货物型号public int quantity;//货物数量public String supplier;//供应商编号public String description;//货物描述public static void main(String[] args) throws IOException {//抛出读写异常String s = null;List<Inventory> inventoryList = new ArrayList<>();//创建list容器Map<String, Integer> itemToIndex = new HashMap<>();//创建map集合BufferedReader inventoryReader = new BufferedReader(new FileReader("src/Inventory.txt"));//从文件src/Inventory.txt中读取数据while((s = inventoryReader.readLine()) != null){String[] split =  s.split("\t");inventoryList.add(new Inventory(split[0], Integer.parseInt(split[1]), split[2], split[3]));//将从文件src/Inventory.txt中数据写入到容器inventorylist容器itemToIndex.put(split[0], inventoryList.size() - 1);}inventoryReader.close();//关闭文件System.out.println("Inventory.txt文件读取完成");List<List<String>> transactionsList = new ArrayList<>();for(int i = 0; i < 4; i++){transactionsList.add(new ArrayList<>());}BufferedReader transactionsReader = new BufferedReader(new FileReader("src/Transactions.txt"));//从文件src/Transactions.txt中读取数据while((s = transactionsReader.readLine()) != null){switch(s.charAt(0)){case 'O':transactionsList.get(0).add(s);break;case 'R':transactionsList.get(1).add(s);break;case 'A':transactionsList.get(2).add(s);break;case 'D':transactionsList.get(3).add(s);break;default:break;}}transactionsReader.close();System.out.println("Transaction文件读取完成");for(String temp : transactionsList.get(2)){String[] split = temp.split("\t");inventoryList.add(new Inventory(split[1], 0, split[2], split[3]));itemToIndex.put(split[1], inventoryList.size() - 1);}for(String temp : transactionsList.get(1)){String[] split = temp.split("\t");inventoryList.get(itemToIndex.get(split[1])).quantity += Integer.parseInt(split[2]);}Collections.sort(transactionsList.get(0), new SortByString());Map<String, Pair<String, Integer>> shippingList = new HashMap<>();BufferedWriter errorWriter = new BufferedWriter(new FileWriter("src/Errors.txt"));for(String temp : transactionsList.get(0)){String[] split = temp.split("\t");if(Integer.parseInt(split[2]) <= inventoryList.get(itemToIndex.get(split[1])).quantity){inventoryList.get(itemToIndex.get(split[1])).quantity -= Integer.parseInt(split[2]);if(shippingList.containsKey(split[3]) && shippingList.get(split[3]).getKey() == split[1]){shippingList.put(split[3], new Pair<String, Integer>(split[1],Integer.parseInt(split[2]) + shippingList.get(split[3]).getValue()));}else{shippingList.put(split[3], new Pair<String, Integer>(split[1], Integer.parseInt(split[2])));}}else{errorWriter.write(split[3] + "\t" + split[1] + "\t" + split[2]);errorWriter.newLine();}}for(String temp : transactionsList.get(3)){String[] split = temp.split("\t");if(inventoryList.get(itemToIndex.get(split[1])).quantity > 0){errorWriter.write("0" + "\t" + itemToIndex.get(split[1]) + "\t"+ inventoryList.get(itemToIndex.get(split[1])).quantity);errorWriter.newLine();}inventoryList.remove((int)itemToIndex.get(split[1]));}errorWriter.close();System.out.println("Errors文件写入完成");BufferedWriter shippingWriter = new BufferedWriter(new FileWriter("src/Shipping.txt"));for (Map.Entry<String, Pair<String, Integer>> entry : shippingList.entrySet()) {shippingWriter.write(entry.getKey() + "\t"+ entry.getValue().getKey() + "\t" + entry.getValue().getValue());shippingWriter.newLine();}shippingWriter.close();System.out.println("shipping文件写入完成");//将新仓库内的物品写入BufferedWriter newInventoryWriter = new BufferedWriter(new FileWriter("src/NewInventory.txt"));for(Inventory inventory : inventoryList){newInventoryWriter.write(inventory.itemNumber + "\t" + inventory.quantity+ "\t" + inventory.supplier + "\t" + inventory.description);newInventoryWriter.newLine();}newInventoryWriter.close();System.out.println("newInventory文件写入完成");System.out.println("请查看相应文件,了解进出货情况");}public Inventory(String itemNumber, int quantity, String supplier, String description) {//赋值函数,分别将itemNumber,quantity,supplier,description赋值this.itemNumber = itemNumber;this.quantity = quantity;this.supplier = supplier;this.description = description;}
}class SortByString implements Comparator {//比较函数类,并返回1或-1public int compare(Object o1, Object o2) {String[] s1 = ((String)o1).split("\t");String[] s2 = ((String)o2).split("\t");return Integer.parseInt(s1[2]) > Integer.parseInt(s2[2]) ? 1 : -1;}
}


http://www.ppmy.cn/news/774549.html

相关文章

Django用admin开发的产康中心进销存系统-7

1.服务记录(service)模块 1.1.models.py 设定 1.1.1.论次服务记录 当订单售出论次服务类商品&#xff0c;或是售出包含论次服务类商品的套盒类商品时&#xff0c;系统会自动抛一笔论次服务记录&#xff0c;当顾客来享受服务时&#xff0c;再用更新的方式完成该笔论次服务记录…

JSP药品进销存管理系统JSP药品管理系统JSP药品进销存系统)JSP医药进销存系统JSP药品药店管理

JSP药品进销存管理系统JSP药品管理系统JSP药品进销存系统&#xff09;JSP医药进销存系统JSP药品药店管理 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {JSONObject jsonObject new JSONObject();String username req.getPar…

医疗器械唯一标识UDI问题解答-医疗器械进销存软件管理系统

医疗器械唯一标识&#xff08;UDI&#xff09;是医疗器械的“身份证”&#xff0c;是准确采集医疗器械全生命周期数据的基础&#xff0c;主要由医疗器械唯一标识、数据载体和数据库三部分组成。UDI标签是否合规&#xff0c;直接影响到医疗器械产品信息传输与共享的准确性和效率…

打单软件显示服务器错误是怎么回事,网络版仓库进销存,出入库存管理软件,送货单打印等连接不上解决【新版】...

发布时间&#xff1a;2020/11/2 12:03:02 文章作者&#xff1a;方可软件 文章来源&#xff1a;方可软件官网 网络版仓库进销存,出入库存,送货单打印管理软件等由于是通过网络联机的&#xff0c;不是在单机上使用的&#xff0c;所以会有一些网络参数的设置与网络权限方面的原因造…

java进销存--销售出库

销售订单完成后&#xff0c;进行发货出库处理 发货处理会扣除库存&#xff0c;同样入库会增加库存 RequestMapping("/outBound")ResponseBodypublic ResponseData outBound( RequestParam("orderNo") String orderNo) {SaleOrderResult saleOrderResultsa…

用超市进销存管理系统解释:构造方法,封装,this关键字和子类父类

用超市进销存管理系统解释&#xff1a;构造方法&#xff0c;封装&#xff0c;this关键字和子类父类 文章目录 用超市进销存管理系统解释&#xff1a;构造方法&#xff0c;封装&#xff0c;this关键字和子类父类5.3.4——用构造方法初始化成员变量5.3.5——构造方法重载5.5——封…

一秒钟看懂SaaS、CRM、OA、ERP、HR、进销存

自2014年以来&#xff0c;SaaS、CRM、OA、ERP、HR、APM、进销存、财务系统等&#xff0c;这些名词大量出现在微信朋友圈、电视楼宇广告和千百万融资资讯中。它们到底是什么意思&#xff1f;相互之间又有什么区别&#xff1f;在这个飞速发展的互联网时代&#xff0c;再不知道这些…

第4集丨JavaScript 使用原型(prototype)实现继承——最佳实战2

目录 一、临时构造器方式1.1 代码实现1.2 代码分析 二. 增加uber属性&#xff0c;用于子对象访问父对象2.1 实现分析2.2 代码实现 三. 将继承封装成extend()函数3.1 代码实现3.1.1 临时构造器实现extend()3.1.2 原型复制实现extend2() 3.2 代码测试3.2.1 测试extend()函数3.2.1…