版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、文档编号: 2版 本 号: 1.00文档名称 :具体设计报告项目名称: minisql数据库系统设计开发时间 :2001 年 10 月-12 月开发人员:组长:周森 3991102440 运算机99f组员:郭振宇 3991102462王淮3991102449韩璟璐 3991102438何遥3991102461指导老师 :孙建伶1. 引言1.1 项目名称minisql数据库系统设计与实现;1.2 项目背景和内容概要数据库系统设计与实现试验;主要目的:通过试验加深对 dbms 及其内部实现技术的懂得;实践系统软件开发的工程化方法;1.3 相关资料、缩略语、定义minisql: mini struc
2、tural query language engine api: application programming interface.2. 系统结构2.1 系统结构图control interfacecmd interpreterminisql用户部分apiliberror libb+record managercatalog managerbuffer managerminisql内核部分figure 1figure 1 : minisql数据库系统 系统结构图图中各标号简明说明:判定并接受用户字符输入,使做为说明器的输入;说明器对用户输入进行翻译,产生操作数(所需api 编码以及参数数组)
3、 ;执行选定的api ,返回用户所需的输出;bplus、record 、catalog 类方法注册至 api lib, 并整合生成适合于用户调用的api ;bplus、 record、catalog 类调用 buffer 类的方法实现自己各自的方法;buffer 类方法对数据库文件进行直接操作;2.2 系统目录结构minisql根目录minisqlbinincludedocsdata可执行程序可用于二次开发的头文件系统运行相关文档 ,用户手册数据存放目录db1db2dbndatafile1datafilen数据库名称做为该数据库数据存放的根目录figure 2figure2:minisql数据
4、库系统的文件结构 其中 bin 目录下存放 minisql可执行文件;include 目录下存放 minisql.h文件和相关的 lib 文件, 可以应客户的需求进行应用级开发;docs 目录下存放一些系统开发文档,系统安装文档,系统保护文档以及版权信息文档等等; 同时也供应系统对比已经商业化的dbms ,尚未开发的功能的相关文档;data 目录下存放数据文件, 其下一级目录为各个数据库的名称,再下一级为各个数据库的具体数据文件;数据文件类型: 对应于每一个 table 建立两个文件, dbf 文件为具体数据存放文件, 同时关于该 table 的目录信息亦存放于dbf 文件的头信息处, idx
5、 文件为为 primary key 建立的索引文件;用户接口系统内核系统集成2.3 程序文件清单说明器interpreter.hwindows/linuxc/c+说明器模块头文件interpreter.cppwindows/linuxc/c+说明器模块实现文件api集成ctrl_center.hwindows/linuxc/c+api lib头文件反常处理ctrl_center.cpperror.hwindows/linuxwindows/linuxc/c+c/c+api lib实现文件error lib头文件error.cppwindows/linuxc/c+error lib实现文件b+树
6、zbtree.hwindows/linuxc/c+b+ 树模块头文件zbtree.cppwindows/linuxc/c+b+ 树模块实现文件recordrecord.hwindows/linuxc/c+record 模块头文件record.cppwindows/linuxc/c+record 模块实现文件catalogcatalog.hwindows/linuxc/c+catalog 模块头文件catalog.cppwindows/linuxc/c+catalog 模块实现文件bufferbuffer.hwindows/linuxc/c+buffer 模块头文件buffer.cppwindo
7、ws/linuxc/c+buffer 模块实现文件mainminisql.hwindows/linuxc/c+系统主程序头文件minisql.cppwindows/linuxc/c+系统主程序实现文件gvariableglob_var.hwindows/linuxc/c+系统全局变量头文件glob_var.cppwindows/linuxc/c+系统全局变量实现文件2.4 基本设计概念1) 系统目标设计并实现一个精简洁用户sql engine ,并在其中实现表定义、索引、标记录操作功能;其中:(1)表定义中列(属性)的类型至少支持三种integer、char、float; 2 每个表上要求至少
8、建一个主键上的b+树,支持多属性主键;(3) 记录的插入、删除、修改等,即时更新相应的索引;(4) 记录的搜寻至少实现按主键查找,只是主键上的范畴查找,包含遍历;2) 结构清楚(1) 用户模块和内核模块完全分开;(2) 内核部分 b+ 、record、catalog 三个模块之间坚决不能相互调用方法和函数;(3) 内核部分 b+、record、catalog 三个模块不能拜访物理文件,而由buffer 模块实现物理文件操作的全部细节;4 )apilib 依据 b+ 、record、catalog 三个模块的方法整合生成适合用户模块调用的 api ;5内核各个模块只向上负责,简化了各个模块之间的
9、调用关系;2.5 程序模块说明2.5.1 gvariable 模块(系统集成子系统)1) 目标:定义系统各种全局变量2) 程序文件: glob_var.h, glob_var.cpp 3主要数据结构:由 buffer 模块供应 class public:unsigned long ; / 页编号unsigned intoffset; / 页内偏移void initialize;/初始化为 0,0void* memaddr; /转化为当前内存地址,由buffer 负责转换void shiftoffsetint offset; /相对当前地址滑动offset;其他全局的主要数据结构见api集成模块
10、;4) 调用的其他模块:buffer 模块5) 算法:无6) 规律流程图:无7) 测试要点:变量声明和定义,测试略;2.5.2 main 模块(系统集成子系统)1) 目标:和谐各其他各模块之间的关系,最终负责系统运行2程序文件: minisql.h, minisql.cpp3) 主要数据结构:msg 定义的是 get_command 返回的消息 ,用于消息循环enum msg create, select, insert, update, delete, drop, quit msg;4) 调用的其他模块:api集成模块 , gvariable 模块5) 算法:参考 windows 消息机制;
11、6) 规律流程图:(1) 主程序流程: int maininit_minisql;/初始化一些基本配置run_minisql;/交互操作,是本程序的主体exit_minisql;/先善后操作,再退出(2) run_minisql程序流程函数采纳的是类似mfc 的消息循环机制,从get_command 得到 msg 消息, 在调用相应的处理函数来自 api lib ;void run_minisql;msg = select;/ 使得 msg 不等于 quit, 进入循环while msg .= quit /消息循环trymsg = get_command.;/ 依据消息调用各处理switchm
12、sgcasecreate:create.;break;创建记录caseselect:select.;break;挑选记录caseinsert:insert.;break;插入记录caseupda te:update.;break;更新记录casedelete:delete.;break;删除记录casedrop:drop .;break;删除表casequit:return;catch int error_code/ 依据 error_code ,打印错误信息7) 测试要点:变量声明和定义,测试略;2.5.3 反常处理模块(用户接口子系统)1) 目标:反常处理模块,定义系统全部可能的反常情形,
13、并安排反常代号;2程序文件: error.h,error.cpp3) 主要数据结构:#define errornameerrorcode;/反常宏定义char* errormessage;/相关反常信息4) 调用的其他模块:无5) 算法:无6) 规律流程图:无7) 测试要点:模拟 errorcode , 调用 dispatcherrorint errorcode 函数处理反常;2.5.4 api集成模块 用户接口子系统 1) 目标:依据 b+ 、record、catalog、interpreter 四个模块所供应的方法整合生成适合于用户调用的api ;此模块同时要求最终实现include 目录
14、下用于应用级开发所需的头文件;2) 程序文件: ctrl_center.h 、 ctrl_center.cpp 3主要数据结构:见规律流程图4) 调用的其他模块: gvariable 模块、 b+ 模块、 record 模块、 catalog 模块、 interpreter模块、 gvariable 模块;5) 算法:在流程图里6) 规律流程图:其中各主要操作流程(为直观计,相关的全局主要数据结构即列在一边)create:函数:interpretercatalog.createzbtree.create翻译命令成参数有效性检查及新表的创建btree 的初始化catalog.createtb_c
15、reate_info&,char* tb_create_info 参数来自 interpreterzbtree.createchar*参数表示 b+tree的key有属性组成信息/interpreter对命令说明得到的 create的各种信息/使用者 :catalogtypedef struct create_column *pcreate_column; typedef struct create_columncharcolumnname32;/ 字段名(规定最长为 32位) column_typecoltype;/ 字段类型,如 int, float, char intlength;/字段
16、类型长度,如 char8 column_valuemin;/ 下限,如例中的 00000000 column_valuemax;/ 上限,如例中的 12345678 operator_typeopertype;/ 关系运算符类型,如 =, = 等等boolisnull;/isnull 1,就此字段有 is null 的限制boolisprimary;/isprimary=1,就此字段是 primary key pcreate_columnnext;class tb_create_infotb_create_info; tb_create_info;inttotalcolumn;/字段总数pcr
17、eate_columnhead;/字段链表头chartablename32;/表名(规定最长为 32位);/catalog分析建表的信息后按 index 的要求给出的组成主键的信息/ 使用者: indexchar* keyinfo/ 例如 “ c12fiic34f”figure 3select:函数体interpretercatalog.selectzbtree.selectrecord.select翻译命令成参数正确性检查及约束检查查找满意 条件的记录catalog.selecttb_select_info,condition_info,select_rec_info zbtree.sele
18、ctcondition_info,key_location,key_location record.print getcurreckey_location,select_rec_info ; whilemove next record.printgetcurreckey_location,select_rec_info;对命令说明后得到的 select的各种信息/ 使用者: catalogtypedef select_column*pselect_column; typedef select_condition *pselect_condition;typedef struct select_
19、column/ 挑选的字段charcolumnname32 ;/ 字段名(限定最长 32位) pselect_columnnext;/ 下一个字段;typedef struct select_condition/ 挑选条件( where )charprimarykey32;/ 主键名column_valuemax;/ 上限column_valuemin;/ 下限column_typecoltype;operator_typeopertype;/ 关系运算符pselect_condition next;/ 下一个挑选条件record.printnn=0y;class tb_select_info
20、pselect_columncolumnhead;/ 挑选的字段链表pselect_conditionconditionhead;/ 挑选的条件链表intcolumnnum;/ 所要挑选的字段个数intconditionnum;/ 条件链表的长度chartablename32;/ 表名;/得出的查找的范畴信息/使用者: btreetypedef struct condition_info;/查找的范畴信息operator_type oper_type;/关系运算符pkey_attrmin;/依据次序链接的属性的范畴下限pkey_attrmax;/依据次序链接的属性的范畴上限/catalog得出
21、的关于挑选需要的字段信息/使用者: recordtypedef struct selete_cell *pselete_cell; typedef structcharcolumnname32;/ ;/index 查找之后得到的结果/b+tree中满意条件的一串索引头指针和尾指针)/使用者: control center typedef struct node_keyzbtreenode *pnode;/满意条件的节点头指针intoffset;/节点内偏移 ;class select_rec_info字段名便利打印column_typecoltype;/字段类型便利打印intpriorleng
22、th;/记录头到此字段之间的长度intcollength;/字段类型的长度pselect_cellnext;/pselect_cellhead;intcolumnnum;select_rec_info;select_cell;下一个字段信息select_rec_info;figure 4insert:函数体interpretercatalog. insert_checkindex.insert_checkrecord.insert翻译命令成参数正确性检查及约束检查检查记录是否已 存在(依据主键)记录插入catalog.inserttb_insert_info,condition_info,re
23、c_info zbtree.selectcondition_info,key_location,key_location record.insertrec_info,fileptr; zbtree.insertpkey_attr,fileptr*typedef struct cell_info *pcell_info;typedef struct cell_info/ 记录单个属性上的信息column_typecoltype;/ 属性类型column_valuevalue;intpriorlength; / 记录头到当前字段之间的长度intcollength;/ 当前字段的长度pcell_in
24、fonext;class rec_infoindex.insert索引插入pcell_infohead;intcolnum;rec_info;rec_info;typedef union column_valueintintvalue;/ 整形值char*pcharvalue;/ 字符串指针floatfloatvalue;/ 浮点型值;typedef insert_column*pinsert_column; typedef struct insert_column/ 插入的记录的其中一个字段信息charcolumnname32;/ 字段名column_type col_type;/ 此字段的
25、类型column_value value;pinsert_columnnext;/ 下一个字段信息;class tb_insert_info/ 插入的记录tb_insert_info;chartablename32;/ 所要插入的表名pinsert_columnhead;/ 全部字段信息链表intcolumnnum;/ 链表长度tb_insert_info;/catalog 给出的指向待插入记录主键的指针/使用者: indexpkey_attrpprimarykey;figure 5update:函数体interpretercatalog.updateindex.select翻译命令成参数正确
26、性检查及约束检查查找满意条件记录catalog.updatetb_update_info,condition_info,rec_info zbtree.selectcondition_info,key_location,key_location record.updategetcurreckey_location,rec_info; whilemove next record.updategetcurreckey_location,rec_info;/catalog 得出的查找的范畴信息/ 使用者: indextypedef struct condition_info;/ 查找的范畴信息ope
27、rator_typeopertype; / 关系运算符pkey_attrmin;/ 依据次序链接的属性的范畴下限pkey_attrmax;/ 依据次序链接的属性的范畴上限 ;/catalog 给出的修改的字段的信息/ 使用者: recordtypedef struct cell_info *pcell_info;typedef struct cell_info/记录单个属性上的信息适用于多个记录的删除n=0record.update修改纪录(一次一条)column_typecoltype; /属性类型column_valuevalue;intpriorlength;/记录头到当前字段之间的长度
28、intcollength;/当前字段的长度pcell_infonext;class rec_infopcell_infohead;intcolnum;rec_info;rec_info;typedefupdate_column*pupdate_column; typedefupdate_condition*pupdate_condition; struct update_column/ 修改的记录的其中一个字段信息char columnname32;/字段名column_type coltype;/此字段的类型column_value value;update_column next;/下一个
29、字段信息;struct update_condition/修改的范畴的条件(where )charprimary_key32;/ 主键名column_valuemax;/ 上限column_valuemin;/ 下限operator_typeopertype; / 关系运算符update_conditionnext;/ 下一个条件;class tb_update_info/ 修改信息tb_update_info;pupdate_columncolumnhead;/所要修改的字段及其值的链表pupdate_conditionconditionhead;/修改的范畴的查询条件链表 intcolum
30、nnum;/字段数intconditionnum;/条件数chartablename32;/要执行修改的表名 tb_update_info; ;figure 6delete:函数体interpretercatalog.dele te翻译命令成参数正确性检查及约束检查catalog.deletetb_delete_info,condition_info zbtree.selectcondition_info,key_location,key_location record.delete getcurreckey_location ; zbtree.delete pkey_attr,fileptr
31、*;whilemove nextrecord.delete getcurreckey_location ; zbtree.delete pkey_attr,fileptr*;zbtree.select查找满意条件记录typedefdelete_condition*pdelete_condition; struct delete_condition/删除范畴的条件n=0charprimarykey32;/主键名column_valuemax;/上限column_valuemin;/下限operator_typeopertype;/关系运算符pdelete_conditionnext;/下一个条件
32、;class tb_delete_info/删除信息适用于多个记录的删除record.delete删除纪录(一次一条)chartablename32;/要进行删除的表名pdelete_conditionhead;/条件链表intconditionnum;/条件链表长度tb_delete_info; tb_delete_info;zbtree.delet e删除相应索引/catalog得出的查找的范畴信息/使用者: indextypedef struct condition_info;/ 查找的范畴信息operator_typeopertype;/ 关系运算符pkey_attrmin;/ 依据次
33、序链接的属性的范畴下限pkey_attrmax;/ 依据次序链接的属性的范畴上限 ;/index查找之后得到的结果/b+tree中满意条件的一串索引头指针和尾指针)/使用者: control center typedef struct node_keyzbtreenode *pnode;/满意条件的节点头指针intoffset;/节点内偏移 ;7) 测试要点:2.5.5 说明器模块(用户接口子系统)1) 目标: 命令说明器的基本功能就是将用户的输入命令进行语法分析和语义解析并得到需要的命令参数,最终将该命令参数封装成对应命令的参数类对象,传回到apilib模块2) 程序文件: interpre
34、ter.h、interpreter.cpp3) 主要数据结构:1 有意字串 :所谓有意字串即指一个以回车或空格或标志符来分割的有独立含义的字符串 不包括空格 ,回车 ,但标志符入 ”, “,”; “视作有意字串 ,如一条命令create table tablenamevariblename1 type1, variblename2 type2;就 create ,”table”,”tablename”,”“,”variblename1”,”type1”等都是一个有意字串2vstr_blk_ptr定义一个数据结构typedef struct*vstr_blk_ptr; typedef struc
35、t vstr_blkstring strvalstr;/ 有意字串vstr_blk_ptrp_vbpnext;/ 指向下一个有意字串的vstr_blk指针; 该数据结构用于记录输入的有意字串,一个该变量表示一个有意字串.3. 支持多类型enum column_type i, c, f; /i-int c-char f-float4 支持 = = = .= between and 等关系运算符 ; enum operator_type b, be, l, le, e, ne,between;1) 调用的其他模块:反常处理模块本模块较为关键的几个处理:string instring负责从用户的输入
36、中读取一个有意字串,以构成 vstringblk的链表 .2) 算法:step1.void getcommandmakevstrblk;/ 利用一个读取函数将用户的全部输入整合成一个vstringblk链表 .依据 vstr_blk链表中的第一个有意字串来调用相应的函数 ,封装回传的参数类 ;return;用户输入命令之后 ,给出提示要求用户键入命令,利用一个读取函数将用户的全部 输入 以该行最终一个字符是否”; ”为标记 中的有意字串读入,拂过全部的空格和回车 .所以在处理过程中只需一个全局变量vstr_blk_ptrp_vbpcmdpos 表示对当前的命令的处理处于何位置,这样很简洁得知掌
37、握的流程.此时处于 start state,对所输入的信息进行处理,依据命令的第一个有意字串进行分 处理 ,如用户键入的第一个命令是”create table tablename cr ”cr 代表回车 ,就最终将会进入 create function.规律流程图figure 8所以该部分需要的函数列表如下typedef char *string;基本函数 :1) string instring负责从用户的输入中读取一个有意字串, 2makevstrblklist负责将有意字串链成链表.boolean strcomparestring s1,string s2,boolean case依据 c
38、ase 值( 0忽视大小写, 1大小写敏锐)来比较string s1 和 string s2,返回比较结果return value:0-string 1 string s23) tb_create_info& createprocess进入 create function, 最终返回一个有关表的类tb_create_info 详见数据结构 4) tb_insert_info& insertprocess进入 insert function, 最终返回一个有关表的类tb_create_info 详见数据结构 5) tb_select_info& selectprocess进入 select fu
39、nction, 最终返回一个有关表的类tb_select_info 详见数据结构 6) tb_delete_info& deleteprocess进入 delete function, 最终返回一个有关表的类tb_delete_info 详见数据结构 7) tb_update_info& updateprocess进入 update function, 最终返回一个有关表的类tb_update_info 详见数据结构 step2在进入具体的供应的5 个具体功能的处理后 ,模块作的就是对用户的整个命令进行解析 ,最终给出一个封装了全部该种处理所需参数的类.如create function,tb_
40、create_info& createprocess检验每次输入是否符合要求直到whilenot “; ”make a create_column;state1.3;/得到一个有关列全部信息的类对象将所得到的 create_column 对象和前面得到的的链起来;将全部的列对象封装成一个表对象信息tb_create_info. return;如下图 ,途中各条线代表 instring 得到的输入 ,下面对几个要点说明一下:figure 9a.任何状态下得到的输入和标示的不符,就记录该出错的行数, 给用户一个提示, , 并throw errorcode, 然后返回 api 掌握中心 ;b.处理过
41、程中 , ”, “代表的含义是换行,所以有关行数的变量会加1,这个行数信息用于给出出错地点信息;stept2.1 规律流程stept2.1.0state1.1-state1.3 均是一些常用状态,用于过渡 ;stept2.1.1state1.3 得到一个 variablename 时得到一个列名信息 ,此时需要对列名进行合法性检验, boolean checkcolnamestring strcolnamestept2.1.2state1.4得到一个 type 时得到一个类型信息 ,需要对该类型信息进行检验 ,此类型信息可能含有长度信息 ,如 char8, 所以仍要对类型信息进行处理 ,利用一
42、个函数boolean gettypeinfocolumn_type ctcoltype, int icollengthstept2.1.3由于一个列信息可能有可能仍含有约束条件 如在列类型信息后不是紧跟 ”,”就之间必只是约束条件 ,但为了处理便利 ,将实际上并没有约束条件的情形视作有约束条件但该条件为空 ,所以在 state1.5 仍必需要对列类型后的有意字串进行解析 ,需要考虑的约束条件只有typedef struct constraintcondintmin;/ 下限,如例中的00000000intmax;/上限,如例中的12345678operator_typeoper_type;/关
43、系运算符类型,如 =, = 等等boolnotnull;/isnull 1,就此字段有 is null 的限制boolisprimary;所以仍需要一个约束条件检验函数, constraintcond& getstraintinfo stept2.1.4state1.6 要对每一行进行处理 ,这些每一行都代表一条列信息 ,所以在 state1.6 中需要对该行读到的列名 ,列类型 ,约束信息进行封装处理成一个 create_column 类将它连接到上一个 create_column 类对象上state1.6 可能直接遇到 ; 意即连续的两个有意字串是 ” “和 “; “,就可直接跳入该过程的
44、最终状态 state1.7,在该状态中将全部的已连好的 create_column 类对象封装成一个 tb_create_info 对象,传出去至此 ,该 createprocess过程终止 .而对于其他几个 function 如 tb_insert_info& insertprocess tb_insert_info& selectprocesstb_delete_info& deleteprocess tb_update_info& updateprocess其基本过程一样 ,下面给出状态图 ,其流程不再详述 .figure 10figure 11figure 12figure 136测试
45、要点:1) 留意程序的健壮性,对用户的各种输入错误都要有很好的检测,并检验 errorcode 有无失误 ;2) 本程序对空格和回车挑选了视而不见的处理方式将其略去不管 ,所以测试要证明这种做法不会对程序的正确性和健壮性产生影响;3.1.2 b+ 树模块(系统内核子系统)1) 目标:供应数据库快速检索功能,并实现b 树自身调整;2程序文件: zbtree.h 、zbtree.cpp3) 主要数据结构: 索引文件头信息typedef structfirstemptyblock; / the address of the first empty block lastemptyblock; / th
46、e address of the last empty block firstnewblock; / the address of the first new block root;/ the address of the rootstart;/ the address of the most left nodeintkeyattrnum;/ the number of fieldsattributes in primarykeyintkeysize;/ sizeofkey_attr * keyattrnumintmaxitemnum;/ the max number of keys in a
47、 nodeindex_head;zbtree_index 是一个治理索引文件的类,定义如下 : class zbtree_indexpublic:zbtree_index;zbtree_index;voidcreate_headchar* keystr;/ produce the information in the idxheadvoidwriteheadtofile;/ write the information to the head of the filevoidreadheadfromfile;/ read the information form the head of the f
48、ilevoidsetkeyinfochar* key_info; / calculate the keysize and keyattrnumgetroot;/ getof the rootgetstartnode;/ getof the leftmost nodeintgetkeysize;/ get the size of a keyintgetkeyattrnum;/ get the key attribute number in a keyintgetmaxitemnum;/ get the max number of items in a keychar*getkeyinfo;/ get the key informationprivate:index_head idxhead;/ the head of the indexb+ treechar*keyinfo;/ a string record the information of th
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 外研八下英语Unit 3 Presenting ideas-Reflection《单元知识梳理》课件
- 人教 八年级 语文 下册 第2单元《8.时间的脚印 第2课时》课件
- 2026年水泥材料销售合同(1篇)
- 2025 高中信息技术数据结构在生物信息学中的运用课件
- 2026年委托购房合同规范合同(1篇)
- 心理环境对幼儿发展的意义
- 2026届浙江宁波十校高三下学期二模化学试题+答案
- 四川省宜宾市普通高中2023级第二次诊断性测试数学+答案
- 2026年及未来5年市场数据中国镍矿产业园区行业发展潜力预测及投资战略、数据研究报告
- 春季工厂防火安全培训
- 2026年陕西工商职业学院单招职业倾向性测试必刷测试卷必考题
- 拜仁慕尼黑足球俱乐部介绍
- 废弃矿山修复项目的风险评估与管控方案
- 三级安全教育试卷及答案2025年
- 【物理(含答案)】江西省南昌市2025届高三信息卷(南昌三模)
- 2025至2030特种运输行业项目调研及市场前景预测评估报告
- 耐火材料施工安全培训课件
- 学堂在线医学英语词汇进阶(首医)作业单元测验答案
- 2025年度零售药店医保考核自查报告范文
- 电信基站电费管理办法
- 体检三基考试题目及答案
评论
0/150
提交评论