版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
------------------------------------------------------------------------IP地址合法性判断及子网检测_大学课程设计实验报告四川理工学院实验报告实验名称IP地址合法性判断及子网检验课程名称计算机科学与技术姓名成绩班级学号日期2013年1月地点计算机学院实验目的本设计要求编辑写程序,判断一个ip地址是否合法,并判断该地址是否属于一个给定子网,从而考察读者是否对ip地址概念及其子网划分有非常清楚的认识。1加深对IP地址及subnet的认识;2.了解IP地址的划分;3.了解subnet的作用和产生因素,subnet的划分;4.实际操作编写规则,匹配IP和subnet,加深理解设计要求在掌握ip地址表示方法及子网划分方法的基础上,按如下要求完成程序。1:命令格式:ip_testsubnet/maskip_addr 其中,ip_test为程序名;subnet为子网号,mask是一个数值,代表子网掩码连续1的个数,ip_addr是要测试的ip地址。2:判断subnet和ip_addr的合法性。 在判断ip地址合法性时要自行编代码,不要使用任何inet函数。判断时要考虑全面。3:判断掩码的合法性。4:在ip地址合法的前提下,判断ip_addr是否属于子网subnet。5:输出命令行中的ip是否合法,掩码是否合法,以及ip_addr是否属于子网subnet.实验环境(软件、硬件及条件)1.软件操作系统:Windowsxp(WindowsNT以上版本皆可)编程环境:MicrosoftVisualStudio2008(兼容MSVS2005,亦可使用VC6.0等)编程语言:C++测试环境:MS-DOS2.硬件现阶段常见PC实验方法Part1实验原理我们说过因特网是把全世界的无数个网络连接起来的一个庞大的网间网,每个网络中的计算机通过其自身的IP地址而被唯一标识的,据此我们也可以设想,在Internet上这个庞大的网间网中,每个网络也有自己的标识符。我们把计算机的IP地址也分成两部分,分别为网络标识和主机标识。同一个物理网络上的所有主机都用同一个网络标识,网络上的一个主机(包括网络上工作站、服务器和路由器等)都有一个主机标识与其对应IP地址的4个字节划分为2个部分,一部分用以标明具体的网络段,即网络标识;另一部分用以标明具体的节点,即主机标识,也就是说某个网络中的特定的计算机号码。另一方面,只有在一个网络号下的计算机之间才能"直接"互通,不同网络号的计算机要通过网关(Gateway)才能互通。但这样的划分在某些情况下显得并十分不灵活。为此IP网络还允许划分成更小的网络,称为子网(Subnet),这样就产生了子网掩码1.IP的寻址规则(1).ip分类规则a、网络地址必须唯一。b、网络标识不能以数字127开头。在A类地址的第一位为0,数字127保留给内部回送函数。B类地址的前两位为10;C类地址的前三位为110;D类地址的前四位为1110;E类地址的前五位为11110。c、网络标识的第一个字节不能为255。数字255作为广播地址。d、网络标识的第一个字节不能为“0”,“0”表示该地址是本地主机,不能传送。e、不合法的IP地址类型:123..2.1123.23$.2.1123.2345.2.1123.23.45.12.主机寻址规则a、主机标识在同一网络内必须是唯一的。b、主机标识的各个位不能都为“1”,如果所有位都为“1”,则该机地址是广播地址,而非主机的地址。c、主机标识的各个位不能都为“0”,如果各个位都为“0”,则表示“只有这个网络”,而这个网络上没有任何主机。3.确定子网掩码数用于子网掩码的位数决定于可能的子网数目和每个子网的主机数目。在定义子网掩码前,必须弄清楚本来使用的子网数和主机数目。定义子网掩码的步骤为:a、确定哪些组地址归我们使用。比如我们申请到的网络号为“128.73.a.b”,该网络地址为B类IP地址,网络标识为“128.73”b、根据我们现在所需的子网数以及将来可能扩充到的子网数,用宿主机的一些位来定义子网掩码。比如我们现在需要12个子网,将来可能需要16个。用第三个字节的前四位确定子网掩码。前四位都置为“1”,即第三个字节为“11110000”,这个数我们暂且称作新的二进制子网掩码。c、把对应初始网络的各个位都置为“1”,即前两个字节都置为“1”,第四个字节都置为“0”,则子网掩码的间断二进制形式为:“11111111.11111111.11110000.00000000”d、把这个数转化为间断十进制形式为:“255.255.240.0”这个数为该网络的子网掩码。4.IP掩码的标注A、无子网的标注法对无子网的IP地址,可写成主机号为0的掩码。如IP地址210.73.140.5,掩码为255.255.255.0,也可以缺省掩码,只写IP地址。B、有子网的标注法有子网时,一定要二者配对出现。以C类地址为例。IP地址中的前3个字节表示网络号,后一个字节既表明子网号,又说明主机号,还说明两个IP地址是否属于一个网段。如果属于同一网络区间,这两个地址间的信息交换就不通过路由器。如果不属同一网络区间,也就是子网号不同,两个地址的信息交换就要通过路由器进行。例如:假设maskwe为27,对于IP地址为210.73.140.5的主机来说,其主机标识为00000101,对于IP地址为210.73.140.16的主机来说它的主机标识为00010000,以上两个主机标识的前面三位全是000,说明这两个IP地址在同一个网络区域中,这两台主机在交换信息时不需要通过路由器进行;210.73.60.1的主机标识为00000001,210.73.60.252的主机标识为11111100,这两个主机标识的前面三位000与011不同,说明二者在不同的网络区域,要交换信息需要通过路由器。其子网上主机号各为1和252。Part2具体实现通过以上的原理,我们就知道了在检验IP地址和子网检验时应该明确的问题,关键的两点就是把输入的IP分解成各段,然后判断子网号,掩码和ip地址的基本格式是否合法,其次:如果三者的基本格式都合法,才调用断定,ip地址是否为子网成员,的函数。该函数同时判别子网号与掩码是否匹配,子网号为全0或全1,主机号为全0、全1。实现流程制定规则分别判断子网号,掩码,ip是否合法制定规则分别判断子网号,掩码,ip是否合法设计数据结构设计数据结构算法实现算法实现调试测试调试测试数据分析数据分析 编程本部分的编程的主要目的是算法的实现,主要的方法是C++中字符串处理。(1)类设计a.属性charip[15];//用于存放ip地址charip_Temp[15];//用于存放ip地址charsubnet_mask[18];//用于存放subnet_mask地址charsubnet[18];//用于存放subnet地址charsubnet_Temp[18];//用于存放subnet地址intmask;//用于存放mask(1的个数)boolmaskIsValid;//用于判断的个数是否合适,或是否与subnet匹配 b.方法构造函数,析构函数:ipTest(char*,char*);//自定义初始化类函数~ipTest();//析构函数主判断函数(即主要的方法):voidAllJudgment();//判断mask,subnet,ip的合法性问题boolipIsValid(char*);//判断ip是否合法BoolsubnetIsValid(char*); //判断子网号subnet是否合法boolNoIllegalChar(char*); //ip,subnet地址中非法字符的判断boolmaskIsMatSubnet(int,char*);//判断mask与subnet是否匹配工具函数:voidprint();//判断ip是否为子网成员,并输出判断结果voidsplit(char*,int*); //把单个字符地址转换为十进制数值型地址(含四段)InttoBinary(inta); //十进制int型数据转换为二进制int型数据char*toString(int*a); //把二进制int型数据转换为一个整体的二进制字符型数据(2)主函数intmain(intargc,char*argv[])函数1.获取参数2.简单判断参数格式(长度)3.若是正常参数,实例化ipTest类4.调用主判断函数voidAllJudgment()判断5.输出结果 (3)程序流程(4)头文件#include<iostream>#include<stdlib.h>#include<stdio.h>#include<string.h>#include<math.h>#include<ctype.h>usingnamespacestd;实验分析及测试本部分测试了正常输入和非法输入时,程序对输入的判断,编程的环境为VS2008,在解决方案文件夹下面的Debug文件夹里面生成可执行文件;运行MS-DOS,进入Debug文件夹进行测试。1.算法正确性检测(1)用正确格式和合法的数据的输入,测试Mask和IP的匹配测试数据:IP:128.196.33.12 Mask:15和16分析:IP:128.196.33.12属于B类IP地址,前16位位网络段,后16位为主机段,所以Mask至少为16结果截图:(2)用正确格式和合法的数据的输入,测试主网和子网的匹配测试数据:主网IP:128.196.33.12子网IP:128.196.127.17和128.196.63.17 Mask:18 分析:主网IP和子网IP都是属于B类IP地址,前8位为网络段,后8位为主机段,Mask至少为16由于Mask为18,可知道在主机段中前两位,也就是IP地址的第9,10位为子网号(18-16=2);而B类IP地址的子网掩码为255.255.0.0所以可知:IP:128.196.33.1210000000.11000100.00100001.000011002位相于,得:00Mask:255.255.0.011111111.11111111.00000000.00000000 2位相于,得:01IP:128.196.127.1710000000.10000100.01111111.00010001结果为不匹配。截图:IP:128.196.33.1210000000.11000100.00100001.000011002位相于,得:00Mask:255.255.0.011111111.11111111.00000000.00000000 2位相于,得:00IP:128.196.63.1710000000.10000100.00111111.00010001结果为匹配。截图:(3)补充说明:i)主网和子网匹配的时候,实际上的与运算的位数是Mask个数,即Mask有多少,就相与前多少个位。而以上例子中可知,B类IP地址的子网掩码为255.255.0.0,所以前8位全是1,所以无论IP是多少,相与结果都是1,即不用考虑网络段,直接相与主机段的前n段即可,n=(mask-所属网络分类的主机段位数)。本测试例子中位2。ii)考虑(2)中的两个3个IP地址可以发现当主网IP为128.196.33.12,mask为18时,IP和子网掩码相与,主机号前两位为00,所以可推出,子网IP的只需要主机段的前两位为00,则都可以匹配,即子网IP的第3节(第17位到第24位)为00XXXXXX,转化为十进制就是小于63的整数就可以匹配。 2.输入合法性测试本实验程序规定输入的标准参数输入格式为:X.X.X.X/MASKX.X.X.X,其中:X为0-255的十进制整数,mask为0-32的十进制整数,两个IP地址中间用空格分开,IP地址的为4段,每一段都用“.”分开,IP地址中允许出现空格或其他字符(1)输入的IP地址中含有非法字符测试数据:主网IP:128.196.33.a2 子网IP:12e.196.127.17 Mask:1h 结果截图:(2)输入的IP地址段数不正确测试数据:主网IP:128..33.12 子网IP:126.196. Mask:18 结果截图:(3)没有输入mask测试数据:主网IP:128.196.33.12 子网IP:128.196.33.11 结果截图:(4)输入mask超出合法范围 测试数据:主网IP:128.196.33.12 子网IP:128.196.33.11 Mask:35 结果截图: (5)输入IP超出合法范围 测试数据:主网IP:555.196.33.12 子网IP:128.999.33.11 Mask:25 结果截图:(6)特殊的IP地址 测试数据:主网IP:0.0.0.0 子网IP:127.1.1.1 Mask:0 结果截图: 测试数据:主网IP:0.0.0.0 子网IP:255.255.255.255 Mask:0 结果截图: 实验结论本实验根据现在通用的IP地址分配使用规则,设计实验算法,运用C++字符转函数处理,程序实现了基本要求的功能,考虑到了多方面的因素;另一方面,设计之初的思路把此程序定位在接口工具程序,所以省略掉UI的设计,考虑到了扩展性的方面需要,程序提供简单、方便的接口和较为简单参数,方便扩展使用。仍存在的问题:数据结构的设计不够清晰简练和方便使用,可读性不太好;主函数流程存在一定的问题,理路不是很清晰,主要是类的各个方法的设计没有总体考虑,设计之初没有考虑,在需要时才加,导致程序结构有点乱,不易阅读和检查。附录源代码说明:源文件语言:C++文件数:1源文件名:ipTest.cpp#include<iostream>#include<stdlib.h>#include<stdio.h>#include<string.h>#include<math.h>#include<ctype.h>usingnamespacestd;//ipTest类定义classipTest{ charip[15];//用于存放ip地址 charip_Temp[15];//用于存放ip地址 charsubnet_mask[18];//用于存放subnet_mask地址 charsubnet[18];//用于存放subnet地址charsubnet_Temp[18];//用于存放subnet地址 intmask;//用于存放mask(1的个数) boolmaskIsValid;//用于判断的个数是否合适,或是否与subnet匹配public: ipTest(char*,char*);//自定义初始化类函数 ~ipTest(){};//析构函数 boolipIsValid(char*);//判断ip是否合法 boolsubnetIsValid(char*);//判断子网号subnet是否合法 boolNoIllegalChar(char*);//ip,subnet地址中非法字符的判断 boolmaskIsMatSubnet(int,char*);//判断mask与subnet是否匹配 voidAllJudgment();//判断mask,subnet,ip的合法性问题voidprint();//判断ip是否为子网成员,并输出判断结果 voidsplit(char*,int*);//把单个字符地址转换为十进制数值型地址(含四段) inttoBinary(inta);//十进制int型数据转换为二进制int型数据 char*toString(int*a);//把二进制int型数据转换为一个整体的二进制字符型数据};//main主函数intmain(intargc,char*argv[])//自动读取数据{ //cout<<"目录地址:"<<argv[0]<<endl;//argv[0]表示ipTest.exe的保存目录地址 cout<<"subnet_mask:"<<argv[1]<<endl;//argv[1]表示第二个参数,即subnet/maskcout<<"ip地址:"<<argv[2]<<endl<<endl;//argv[2]表示第三个参数,即ip //判断段数是否输入合法 if(argc!=3)//argc表示输入的参数个数,无参数输入时,其值为,因为默认argv[0]总是有的 { cout<<"输入非法!"; return0; } else { //先简单判断subnet/mask的长度 if(strlen(argv[1])>18) { cout<<"subnet/mask输入非法!"; system("pause"); return0; } //先简单判断ip的长度 if(strlen(argv[2])>15) { cout<<"ip输入非法!"; system("pause"); return0; } } ipTesttest(argv[1],argv[2]);//实例化类,传入两个参数 test.AllJudgment();//调用函数,判断mask,subnet,ip的合法性问题 system("pause");//系统暂停 return0; }//构造函数ipTest::ipTest(char*subnet_mask,char*ip){ maskIsValid=true;//设置maskIsValid默认为合法 chartemp[2];//定义变量 inti,len; len=strlen(subnet_mask);/*******************从subnet/mask中分离出subnet地址***************/ for(i=0;i<len&&subnet_mask[i]!='/';i++) { this->subnet[i]=subnet_mask[i]; this->subnet_Temp[i]=subnet_mask[i]; } subnet_Temp[i]='\0';subnet[i]='\0';/**************************判断mask是否为数值************************/ if((len-(i+1)<3&&len-(i+1)>0))//判断mask是否为一/二位字节 { if(len-(i+1)==1)//表明mask是一位 { temp[0]=subnet_mask[i+1]; //判断字符是否为数值型字符 if(!isdigit(temp[0]))//isdigit()为库函数,可以调用 { cout<<"mask中含有非数字的非法字符,error!"<<endl; maskIsValid=false;//mask不是数值,则设置为false } } elseif((len-3)==i)//表明mask是二位 { temp[0]=subnet_mask[i+1]; temp[1]=subnet_mask[i+2]; if(!(isdigit(temp[0])&&isdigit(temp[1]))) { cout<<"mask中含有非数字的非法字符,error!"<<endl; maskIsValid=false; } } mask=atoi(temp);//自动把数字字符转换为对应的十进制数值的函数 if(mask<0||mask>32) maskIsValid=false; } else//表明mask为空或字节超出范围 { cout<<"mask为空或超出范围,error!"<<endl; maskIsValid=false;//若mask是三位数,则表明mask输入非法(其实为~32) }/********************************************************************/ strcpy(this->subnet_mask,subnet_mask);//给subnet_mask赋值 strcpy(this->ip,ip);//给ip赋值 strcpy(this->ip_Temp,ip);//给ip_temp赋值}//判断mask,subnet,ip的合法性问题voidipTest::AllJudgment(){ //设置标志subnet地址是否合法的bool型变量,并调用subnetIsValid函数判断 boolsubnetIsV=subnetIsValid(subnet_Temp); //设置标记ip地址是否合法的bool型变量,并调用ipIsValid函数判断 boolipIsV=ipIsValid(ip_Temp); //设置标记mask与subnet地址是否匹配的bool型变量,并调用maskIsMatSubnet函数判断 boolmaskIsMatSub=maskIsMatSubnet(mask,subnet_Temp); cout<<endl;/************************判断返回的值是否为真******************/ if(!maskIsValid)//表示返回的maskIsValid是false { cout<<"mask输入非法!(mask为整数并在-32范围内)"<<endl; } else { cout<<"mask合法!"<<endl; } if(!maskIsMatSub) { //表示返回的maskIsMatSub是false cout<<"mask与subnet不匹配,error!"<<endl; } else { cout<<"mask与subnet匹配!"<<endl; } if(!subnetIsV) { //表示返回的subnetIsV是false cout<<"subnet地址非法!"<<endl; } else { cout<<"subnet地址合法!"<<endl; } if(!ipIsV) { //表示返回的ipIsV是false cout<<"ip地址非法!"<<endl; } else { cout<<"ip地址合法!"<<endl; } //都合法 if(maskIsValid&&maskIsMatSub&&subnetIsV&&ipIsV) { print(); }}//判断mask与subnet是否匹配boolipTest::maskIsMatSubnet(intmask,char*subnet_Temp){ intnbsubnet[4];//用于放十进制的各段地址 //调用把单个字符地址转换为十进制数值型地址(含四段)的函数,实现转换 split(subnet_Temp,nbsubnet); //subnet是A类地址 if(nbsubnet[0]>0&&nbsubnet[0]<127&&mask<8) { //mask的值小于 cout<<"mask与subnet不匹配,error!"<<endl; returnfalse; } //subnet是B类地址 if(nbsubnet[0]>=128&&nbsubnet[0]<=191&&mask<16) { //mask的值小于 cout<<"mask与subnet不匹配,error!"<<endl; returnfalse; } //subnet是C类地址 if(nbsubnet[0]>=192&&nbsubnet[0]<=223&&mask<24) { //mask的值小于 cout<<"mask与subnet不匹配,error!"<<endl; returnfalse; } //mask与subnet地址匹配 returntrue;}//把单个字符地址转换为十进制数值型地址(含四段)voidipTest::split(char*chaddr,int*addr){ charch[]="."; char*token,*dot[4]; intiplen=0; token=strtok(chaddr,ch); while(token!=NULL) { dot[iplen]=token; addr[iplen]=atoi(dot[iplen]);//atoi()函数把字符数值转换为int型数值 iplen++; token=strtok(NULL,ch); } }//ip,subnet地址中非法字符的判断boolipTest::NoIllegalChar(char*ch){ inti,len=strlen(ch); for(i=0;i<len;i++) { if(ch[i]-'0'>9||ch[i]-'0'<0) { returnfalse; } } returntrue;}//判断ip是否合法boolipTest::ipIsValid(char*ip){ /******************把地址分为四段,保存在dot[]中************/ charch[]="."; charip_one[18]; strcpy(ip_one,ip); char*token,*dot[4]; intiplen=0; //库函数strtok(),以ch[]为界限来分段 token=strtok(ip_one,ch); while(token!=NULL) { dot[iplen]=token; iplen++; token=strtok(NULL,ch);//此时,第一个参数必须换为NULL }/*****************判断地址中的段数***************************/ if(iplen!=4) { cout<<"地址"<<ip<<"的段数不是,error!"<<endl; returnfalse; }/***************判断地址中的'.'是否正确**********************/ intj,t=0; for(j=0;j<=strlen(ip);j++) { if(ip[j]=='.') { t++; } } if(t!=3) { cout<<"地址"<<ip<<"中的'.'不是,error!"<<endl; returnfalse; }/************************判断地址是否含有非法字符,每段地址数值溢出**********************/ inti; for(i=0;i<iplen;i++) { if(!NoIllegalChar(dot[i])||atoi(dot[i])>255) { if(!NoIllegalChar(dot[i]))//判断含有非法字符 cout<<"地址"<<ip<<"中含有非数字的非法字符,error!"<<endl; if(atoi(dot[i])>255)//判断数值溢出 cout<<"地址"<<ip<<"中含有不在-255间的数字,error!"<<endl; returnfalse; } }/*****************判断全或全的情况**************************/ intflag=1;//首先设置为非法,即全 for(i=0;i<iplen;i++) { if(atoi(dot[i])!=0) { //含有非的字段 flag=0; } } if(flag==1) { cout<<"地址"<<ip<<"全为全,error!"<<endl; returnfalse; } flag=1;//首先设置为非法,即全 for(i=0;i<iplen;i++) { if(atoi(dot[i])!=255) { flag=0; } } if(flag==1) { cout<<"地址"<<ip<<"全为全,error!"<<endl; returnfalse; }/**************以下判断ip地址主机号**********************/intj1=0,j2; //if(ip==ip_Temp) { //首先判断ip是哪类地址 if(atoi(dot[0])>0&&atoi(dot[0])<127)//A类ip地址 { j1=1;//直接从开始 } if(atoi(dot[0])==127)//为的特殊号 { cout<<"ip地址"<<ip<<"网络号为!,error!"<<endl; returnfalse; } if(atoi(dot[0])>=128&&atoi(dot[0])<=191)//B类ip地址 { j1=2; } if(atoi(dot[0])>=192&&atoi(dot[0])<=223)//C类ip地址 { j1=3; } if(atoi(dot[0])>223&&atoi(dot[0])<255) { cout<<"请重新输入ip地址"<<ip<<",仅限于A,B和C类ip地址,error!"<<endl; returnfalse; } /* if(atoi(dot[0])==255) { cout<<"ip地址"<<ip<<"网络号全为,error!"<<endl; returnfalse; } */ j2=j1;//j1用于判断全情况,j1用于判断全情况的起始下标 intflag=1;//首先设置为非法,即主机号全 for(i=j1;i<iplen;i++) { if(atoi(dot[i])!=0) { flag=0; } } if(flag==1) { cout<<"ip地址"<<ip<<"的主机号全,error!"<<endl; returnfalse; } flag=1;//首先设置为非法,即全 for(i=j2;i<iplen;i++) { if(atoi(dot[i])!=255) { flag=0; } } if(flag==1) { cout<<"ip地址"<<ip<<"的主机号全,error!"<<endl; returnfalse; } } returntrue;}//判断子网号subnet是否合法boolipTest::subnetIsValid(char*subnet){ if(!ipIsValid(subnet))//调用判断Ip的函数ipIsValid()进行判断 { returnfalse; } returntrue;}//判断ip是否为子网成员,并输出判断结果voidipTest::print(){charsubnet_one[15],ip_one[15];intnbip[4],nbsubnet[4],i; strcpy(subnet_one,subnet);//把subnet地址复制给subnet_one strcpy(ip_one,ip);//把ipt地址复制给ip_one //split()函数把字符型的地址转换为四段int型的地址 split(subnet_one,nbsubnet);//用subnet_one而非subnet是为了保护subnet地址不被破坏 split(ip_one,nbip); for(i=0;i<4;i++) {
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年省级人力资源服务业发展扶持资金知识题库
- 2026年智能电网建设与管理技术题库
- 2026年乡镇干部防汛抗旱应急预案编制知识题库
- 2026年青年干部数据安全法知识竞赛题库
- 2026年基金会项目专员招聘面试题库
- 2026年中国电信云计算岗面试预测题及解析思路
- 泰康人寿杭州拱墅区2026校园招聘半结构化面试题及思路
- 2026年新增普惠性托育机构及托位建设标准与运营补贴政策知识问答
- 2026年质量状况分析报告年度专项编制问答
- 2026年工会干校干部培训岗面试模拟
- 医疗器械网络经营培训
- 足浴按摩店卫生管理制度
- 艾滋病知识防治培训课件
- 2026年《职业病防治法》宣传周知识竞赛考试题库附参考答案
- 《生活中的人工智能》课件
- 2025年五类人员考试真题及答案
- 断绝姐妹关系协议书
- 2026年物流配送数字化方案与企业配送效率提升指南
- 5年(2021-2025)山东高考生物真题分类汇编:专题13 种群和群落(解析版)
- 沪教版三年级下学期(新版)数学第4单元单元试卷(附答案)-02
- 电厂工程取水口施工方案
评论
0/150
提交评论