版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、软件技术基础实验指导书目录软件技术基础上机实验的目的和要求3实验一、单链表的插入和删除4实验二、二叉树操作8实验三、图的遍历操作12实验四、排序19实验五、查找25软件技术基础上机实验的目的和要求通过上机实验加深对课程内容的理解,增加感性认识,提高软件设计、编写及调试程序的能力。要求所编的程序能正确运行,并提交实验报告。实验报告的基本要求为:1、 需求分析:陈述程序设计的任务,强调程序要做什么,明确规定:(1) 输入的形式和输出值的范围;(2) 输出的形式;(3) 程序所能达到的功能;(4) 测试数据:包括正确的输入输出结果和错误的输入及输出结果。2、 概要设计:说明用到的软件技术基础定义、主
2、程序的流程及各程序模块之间的调用关系。3、 详细设计:提交带注释的源程序或者用伪代码写出每个操作所涉及的算法。4、 调试分析:(1) 调试过程中所遇到的问题及解决方法;(2) 算法的时空分析;(3) 经验与体会。5、 用户使用说明:说明如何使用你的程序,详细列出每一步操作步骤。6、 测试结果:列出对于给定的输入所产生的输出结果。若有可能,测试随输入规模的增长所用算法的实际运行时间的变化。实验一、单链表的插入和删除一、目的:了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。二、要求:建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符
3、串,先找到相应的结点,后删除之。三、示例程序:#includestdio.h#includestring.h#includestdlib.h#includectype.htypedef struct node /定义结点 char data10; /结点的数据域为字符串struct node *next; /结点的指针域 ListNode;typedef ListNode * LinkList; / 自定义LinkList单链表类型LinkList CreatListR1(); /函数,用尾插入法建立带头结点的单链表ListNode *LocateNode(); /函数,按值查找结点void
4、DeleteList(); /函数,删除指定值的结点void printlist(); /函数,打印链表中的所有值void DeleteAll(); /函数,删除所有结点,释放内存/=主函数=void main() char *ch;char num4;char b8;ch=&b0; LinkList head; head=CreatListR1(); /用尾插入法建立单链表,返回头指针 printlist(head); /遍历链表输出其值 printf( Delete node (y/n):); /输入“y”或“n”去选择是否删除结点 scanf(%s,num); if(strcmp(num
5、,y)=0 | strcmp(num,Y)=0) printf(Please input Delete_data:); scanf(%s,ch); /输入要删除的字符串 DeleteList(head,ch); printlist(head); DeleteAll(head); /删除所有结点,释放内存/=用尾插入法建立带头结点的单链表= LinkList CreatListR1(void) char *ch;char a8;ch=&a0; LinkList head=(LinkList)malloc(sizeof(ListNode); /生成头结点 ListNode *s,*r,*pp; r
6、=head; r-next=NULL; printf(Input # to end ); /输入“#”代表输入结束 printf(Please input Node_data:); scanf(%s,ch); /输入各结点的字符串 while(strcmp(ch,#)!=0) pp=LocateNode(head,ch); /按值查找结点,返回结点指针 if(pp=NULL) /没有重复的字符串,插入到链表中 s=(ListNode *)malloc(sizeof(ListNode); strcpy(s-data,ch); r-next=s; r=s; r-next=NULL; printf(
7、Input # to end ); printf(Please input Node_data:); scanf(%s,ch); return head; /返回头指针/=按值查找结点,找到则返回该结点的位置,否则返回NULL=ListNode *LocateNode(LinkList head, char *key) ListNode *p=head-next; /从开始结点比较 while(p & strcmp(p-data,key)!=0) /直到p为NULL或p-data为key止p=p-next; /扫描下一个结点 return p; /若p=NULL则查找失败,否则p指向找到的值为
8、key的结点/=删除带头结点的单链表中的指定结点=void DeleteList(LinkList head,char *key) ListNode *p,*r,*q=head; p=LocateNode(head,key); /按key值查找结点的 if(p=NULL ) /若没有找到结点,退出printf(position error);exit(0); while(q-next!=p) /p为要删除的结点,q为p的前结点q=q-next; r=q-next; q-next=r-next; free(r); /释放结点/=打印链表=void printlist(LinkList head)
9、 ListNode *p=head-next; /从开始结点打印 while(p)printf(%s, ,p-data);p=p-next; printf(n);/=删除所有结点,释放空间=void DeleteAll(LinkList head) ListNode *p=head,*r; while(p-next)r=p-next;free(p);p=r; free(p);四、实验内容1、 分析、理解程序。2、 调试程序,并设计输入数据(如:bat,cat,eat,fat,hat,jat,lat,mat,#),测试程序的如下功能:不允许重复字符串的插入;根据输入的字符串,找到相应的结点并删除
10、。3、 修改程序:(1) 增加插入结点的功能。(2) 将建立链表的方法改为头插入法。五、实验报告要求1、 基本要求见第一页内容。2、 写出实验结果,并画出所建链表的示意图。实验二、二叉树操作一、 目的掌握二叉树的定义、性质及存储方式,各种遍历算法。二、 要求采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作,求所有叶子及结点总数的操作。三、 示例程序#includestdio.h#includestring.h#define Max 20 /结点的最大个数typedef struct node char data; struct node *lchild,*rc
11、hild;BinTNode; /自定义二叉树的结点类型typedef BinTNode *BinTree; /定义二叉树的指针int NodeNum,leaf; /NodeNum为结点数,leaf为叶子数/=基于先序遍历算法创建二叉树=/=要求输入先序序列,其中加入虚结点“#”以示空指针的位置=BinTree CreatBinTree(void) BinTree T; char ch; if(ch=getchar()=#)return(NULL); /读入#,返回空指针 else T=(BinTNode *)malloc(sizeof(BinTNode); 生成结点T-data=ch;T-lc
12、hild=CreatBinTree(); /构造左子树T-rchild=CreatBinTree(); /构造右子树return(T); /=NLR 先序遍历=void Preorder(BinTree T) if(T) printf(%c,T-data); /访问结点Preorder(T-lchild); /先序遍历左子树Preorder(T-rchild); /先序遍历右子树 /=LNR 中序遍历= void Inorder(BinTree T) if(T) Inorder(T-lchild); /中序遍历左子树printf(%c,T-data); /访问结点Inorder(T-rchil
13、d); /中序遍历右子树 /=LRN 后序遍历=void Postorder(BinTree T) if(T) Postorder(T-lchild); /后序遍历左子树Postorder(T-rchild); /后序遍历右子树printf(%c,T-data); /访问结点 /=采用后序遍历求二叉树的深度、结点数及叶子数的递归算法=int TreeDepth(BinTree T) int hl,hr,max; if(T)hl=TreeDepth(T-lchild); /求左深度hr=TreeDepth(T-rchild); /求右深度max=hlhr? hl:hr; /取左右深度的最大值No
14、deNum=NodeNum+1; /求结点数if(hl=0&hr=0) leaf=leaf+1; /若左右深度为0,即为叶子。return(max+1); else return(0);/=利用“先进先出”(FIFO)队列,按层次遍历二叉树=void Levelorder(BinTree T) int front=0,rear=1; BinTNode *cqMax,*p; /定义结点的指针数组cq cq1=T; /根入队 while(front!=rear) front=(front+1)%NodeNum;p=cqfront; /出队printf(%c,p-data); /出队,输出结点的值
15、if(p-lchild!=NULL) rear=(rear+1)%NodeNum; cqrear=p-lchild; /左子树入队if(p-rchild!=NULL) rear=(rear+1)%NodeNum; cqrear=p-rchild; /右子树入队 /=主函数=void main() BinTree root; int i,depth; printf(n);printf(Creat Bin_Tree; Input preorder:); /输入完全二叉树的先序序列, / 用#代表虚结点,如ABD#CE#F# root=CreatBinTree(); /创建二叉树,返回根结点 do
16、/从菜单中选择遍历方式,输入序号。printf(t* select *n);printf(t1: Preorder Traversaln); printf(t2: Iorder Traversaln);printf(t3: Postorder traversaln);printf(t4: PostTreeDepth,Node number,Leaf numbern);printf(t5: Level Depthn); /按层次遍历之前,先选择4,求出该树的结点数。printf(t0: Exitn);printf(t*n);scanf(%d,&i); /输入菜单序号(0-5)switch (i)
17、case 1: printf(Print Bin_tree Preorder: );Preorder(root); /先序遍历break;case 2: printf(Print Bin_Tree Inorder: );Inorder(root); /中序遍历break;case 3: printf(Print Bin_Tree Postorder: );Postorder(root); /后序遍历break;case 4: depth=TreeDepth(root); /求树的深度及叶子数printf(BinTree Depth=%d BinTree Node number=%d,depth
18、,NodeNum);printf( BinTree Leaf number=%d,leaf);break;case 5: printf(LevePrint Bin_Tree: );Levelorder(root); /按层次遍历break;default: exit(1);printf(n); while(i!=0); 四、 实验内容1、 分析、理解程序。2、 调试程序,设计一棵二叉树,输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD#CE#F#,建立二叉树,求出先序、中序和后序以及按层次遍历序列,求所有叶子及结点总数。五、 实验报告要求1、 基本要求见第一页。2、 画出所设计的二
19、叉树,以后序遍历算法为例,画出执行踪迹示意图。3、 给出实验结果。实验三、图的遍历操作一、 目的掌握有向图和无向图的概念;掌握邻接矩阵和邻接链表建立图的存储结构;掌握DFS及BFS对图的遍历操作;了解图结构在人工智能、工程等领域的广泛应用。二、 要求采用邻接矩阵和邻接链表作为图的存储结构,完成有向图和无向图的DFS和BFS操作。三、 DFS和BFS 的基本思想深度优先搜索法DFS的基本思想:从图G中某个顶点Vo出发,首先访问Vo,然后选择一个与Vo相邻且没被访问过的顶点Vi访问,再从Vi出发选择一个与Vi相邻且没被访问过的顶点Vj访问,依次继续。如果当前被访问过的顶点的所有邻接顶点都已被访问,
20、则回退到已被访问的顶点序列中最后一个拥有未被访问的相邻顶点的顶点W,从W出发按同样方法向前遍历。直到图中所有的顶点都被访问。广度优先算法BFS的基本思想:从图G中某个顶点Vo出发,首先访问Vo,然后访问与Vo相邻的所有未被访问过的顶点V1,V2,Vt;再依次访问与V1,V2,Vt相邻的起且未被访问过的的所有顶点。如此继续,直到访问完图中的所有顶点。四、 示例程序1 邻接矩阵作为存储结构的程序示例#includestdio.h#includestdlib.h#define MaxVertexNum 100 /定义最大顶点数typedef struct char vexsMaxVertexNum;
21、 /顶点表 int edgesMaxVertexNumMaxVertexNum; /邻接矩阵,可看作边表 int n,e; /图中的顶点数n和边数eMGraph; /用邻接矩阵表示的图的类型/=建立邻接矩阵=void CreatMGraph(MGraph *G) int i,j,k; char a; printf(Input VertexNum(n) and EdgesNum(e): ); scanf(%d,%d,&G-n,&G-e); /输入顶点数和边数 scanf(%c,&a); printf(Input Vertex string:); for(i=0;in;i+) scanf(%c,&
22、a); G-vexsi=a; /读入顶点信息,建立顶点表 for(i=0;in;i+)for(j=0;jn;j+) G-edgesij=0; /初始化邻接矩阵 printf(Input edges,Creat Adjacency Matrixn); for(k=0;ke;k+) /读入e条边,建立邻接矩阵 scanf(%d%d,&i,&j); /输入边(Vi,Vj)的顶点序号 G-edgesij=1; G-edgesji=1; /若为无向图,矩阵为对称矩阵;若建立有向图,去掉该条语句 /=定义标志向量,为全局变量=typedef enumFALSE,TRUE Boolean;Boolean v
23、isitedMaxVertexNum;/=DFS:深度优先遍历的递归算法=void DFSM(MGraph *G,int i) /以Vi为出发点对邻接矩阵表示的图G进行DFS搜索,邻接矩阵是0,1矩阵 int j; printf(%c,G-vexsi); /访问顶点Vi visitedi=TRUE; /置已访问标志 for(j=0;jn;j+) /依次搜索Vi的邻接点if(G-edgesij=1 & ! visitedj) DFSM(G,j); /(Vi,Vj)E,且Vj未访问过,故Vj为新出发点void DFS(MGraph *G) int i; for(i=0;in;i+)visitedi
24、=FALSE; /标志向量初始化 for(i=0;in;i+)if(!visitedi) /Vi未访问过 DFSM(G,i); /以Vi为源点开始DFS搜索/=BFS:广度优先遍历=void BFS(MGraph *G,int k) /以Vk为源点对用邻接矩阵表示的图G进行广度优先搜索 int i,j,f=0,r=0; int cqMaxVertexNum; /定义队列 for(i=0;in;i+)visitedi=FALSE; /标志向量初始化 for(i=0;in;i+)cqi=-1; /队列初始化 printf(%c,G-vexsk); /访问源点Vk visitedk=TRUE; cq
25、r=k; /Vk已访问,将其入队。注意,实际上是将其序号入队 while(cqf!=-1) /队非空则执行 i=cqf; f=f+1; /Vf出队 for(j=0;jn;j+) /依次Vi的邻接点Vj if(G-edgesij=1 & !visitedj) /Vj未访问 printf(%c,G-vexsj); /访问Vj visitedj=TRUE; r=r+1; cqr=j; /访问过Vj入队 /=main=void main() int i; MGraph *G; G=(MGraph *)malloc(sizeof(MGraph); /为图G申请内存空间 CreatMGraph(G); /
26、建立邻接矩阵 printf(Print Graph DFS: ); DFS(G); /深度优先遍历 printf(n); printf(Print Graph BFS: ); BFS(G,3); /以序号为3的顶点开始广度优先遍历 printf(n);执行顺序:V6V4V5V7V2V3V1V0Vo图G的示例Input VertexNum(n) and EdgesNum(e): 8,9Input Vertex string: Input edges,Creat Adjacency Matrix0 10 21 31 42 52 63 74 75 6Print Graph DFS: Print Gr
27、aph BFS: 2 邻接链表作为存储结构程序示例#includestdio.h#includestdlib.h#define MaxVertexNum 50 /定义最大顶点数typedef struct node /边表结点 int adjvex; /邻接点域 struct node *next; /链域EdgeNode;typedef struct vnode /顶点表结点 char vertex; /顶点域 EdgeNode *firstedge; /边表头指针VertexNode;typedef VertexNode AdjListMaxVertexNum; /AdjList是邻接表类
28、型typedef struct AdjList adjlist; /邻接表 int n,e; /图中当前顶点数和边数 ALGraph; /图类型/=建立图的邻接表=void CreatALGraph(ALGraph *G) int i,j,k; char a; EdgeNode *s; /定义边表结点 printf(Input VertexNum(n) and EdgesNum(e): ); scanf(%d,%d,&G-n,&G-e); /读入顶点数和边数 scanf(%c,&a); printf(Input Vertex string:); for(i=0;in;i+) /建立边表 sca
29、nf(%c,&a);G-adjlisti.vertex=a; /读入顶点信息G-adjlisti.firstedge=NULL; /边表置为空表 printf(Input edges,Creat Adjacency Listn); for(k=0;ke;k+) /建立边表 scanf(%d%d,&i,&j); /读入边(Vi,Vj)的顶点对序号s=(EdgeNode *)malloc(sizeof(EdgeNode); /生成边表结点s-adjvex=j; /邻接点序号为js-next=G-adjlisti.firstedge;G-adjlisti.firstedge=s; /将新结点*S插入
30、顶点Vi的边表头部s=(EdgeNode *)malloc(sizeof(EdgeNode); s-adjvex=i; /邻接点序号为is-next=G-adjlistj.firstedge; G-adjlistj.firstedge=s; /将新结点*S插入顶点Vj的边表头部 /=定义标志向量,为全局变量=typedef enumFALSE,TRUE Boolean;Boolean visitedMaxVertexNum;/=DFS:深度优先遍历的递归算法=void DFSM(ALGraph *G,int i) /以Vi为出发点对邻接链表表示的图G进行DFS搜索 EdgeNode *p; p
31、rintf(%c,G-adjlisti.vertex); /访问顶点Vi visitedi=TRUE; /标记Vi已访问 p=G-adjlisti.firstedge; /取Vi边表的头指针 while(p) /依次搜索Vi的邻接点Vj,这里j=p-adjvexif(! visitedp-adjvex) /若Vj尚未被访问 DFSM(G,p-adjvex); /则以Vj为出发点向纵深搜索p=p-next; /找Vi的下一个邻接点 void DFS(ALGraph *G) int i; for(i=0;in;i+)visitedi=FALSE; /标志向量初始化 for(i=0;in;i+)if
32、(!visitedi) /Vi未访问过 DFSM(G,i); /以Vi为源点开始DFS搜索/=BFS:广度优先遍历=void BFS(ALGraph *G,int k) /以Vk为源点对用邻接链表表示的图G进行广度优先搜索 int i,f=0,r=0; EdgeNode *p; int cqMaxVertexNum; /定义FIFO队列 for(i=0;in;i+)visitedi=FALSE; /标志向量初始化 for(i=0;in;i+)cqi=-1; /初始化标志向量 printf(%c,G-adjlistk.vertex); /访问源点Vk visitedk=TRUE; cqr=k;
33、/Vk已访问,将其入队。注意,实际上是将其序号入队 while(cqf!=-1) 队列非空则执行i=cqf; f=f+1; /Vi出队p=G-adjlisti.firstedge; /取Vi的边表头指针while(p) /依次搜索Vi的邻接点Vj(令p-adjvex=j) if(!visitedp-adjvex) /若Vj未访问过printf(%c,G-adjlistp-adjvex.vertex); /访问Vjvisitedp-adjvex=TRUE;r=r+1; cqr=p-adjvex; /访问过的Vj入队 p=p-next; /找Vi的下一个邻接点 /endwhile/=主函数=voi
34、d main() int i; ALGraph *G; G=(ALGraph *)malloc(sizeof(ALGraph); CreatALGraph(G); printf(Print Graph DFS: ); DFS(G); printf(n); printf(Print Graph BFS: ); BFS(G,3); printf(n);执行顺序:Input VertexNum(n) and EdgesNum(e): 8,9Input Vertex string: V6V4V5V7V2V3V1V0Vo图G的示例Input edges,Creat Adjacency List0 10
35、21 31 42 52 63 74 75 6Print Graph DFS: Print Graph BFS: 五、 实验内容1、 分析、理解程序。2、 调试程序。设计一个有向图和一个无向图,任选一种存储结构,完成有向图和无向图的DFS(深度优先遍历)和BFS(广度优先遍历)的操作。六、实验报告要求1、基本要求见第一页。2、画出DFS方法和BFS方法遍历图G的示意图。3、画出你所设计的图,写出两种方法的遍历序列。实验四、排序一、 目的掌握各种排序方法的基本思想、排序过程、算法实现,能进行时间和空间性能的分析,根据实际问题的特点和要求选择合适的排序方法。二、 要求实现直接排序、冒泡、直接选择、快
36、速、堆、归并排序算法。比较各种算法的运行速度。三、 程序示例#includestdio.h#includestdlib.h#define Max 100 /假设文件长度typedef struct /定义记录类型 int key; /关键字项RecType;typedef RecType SeqListMax+1; /SeqList为顺序表,表中第0个元素作为哨兵int n; /顺序表实际的长度1、 直接插入排序的基本思想:每次将一个待排序的记录,按其关键字大小插入到前面已排序好的子文件中的适当位置,直到全部记录插入完成为止。/=直接插入排序法=void InsertSort(SeqList
37、R) /对顺序表R中的记录R1n按递增序进行插入排序 int i,j; for(i=2;i=n;i+) /依次插入R2,Rn if(Ri.keyRi-1.key) /若Ri.key大于等于有序区中所有的keys,则Ri留在原位 R0=Ri;j=i-1; /R0是Ri的副本 do /从右向左在有序区R1i-1中查找Ri的位置Rj+1=Rj; /将关键字大于Ri.key的记录后移j-; while(R0.keyRj.key); /当Ri.keyRj.key 是终止 Rj+1=R0; /Ri插入到正确的位置上/endif2、 冒泡排序的基本思想:设想被排序的记录数组R1n垂直排序。根据轻气泡不能在重
38、气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上“漂浮”(交换),如此反复进行,直到最后任意两个气泡都是轻者在上,重者在下为止。/=冒泡排序=typedef enumFALSE,TRUE Boolean; /FALSE为0,TRUE为1void BubbleSort(SeqList R) /自下向上扫描对R做冒泡排序 int i,j; Boolean exchange; /交换标志 for(i=1;i=i;j-) /对当前无序区Rin 自下向上扫描 if(Rj+1.keyRj.key) /两两比较,满足条件交换记录R0=Rj+1; /R0不是哨兵,仅做暂存单元Rj+1
39、=Rj;Rj=R0;exchange=TRUE; /发生了交换,故将交换标志置为真 if(! exchange) /本趟排序未发生交换,提前终止算法 return; /endfor(为循环)3、 快速排序的基本思想:在待排序的n个记录中任取一个记录(通常取第一个记录),把该记录作为支点(又称基准记录)(pivot),将所有关键字比它小的记录放置在它的位置之前,将所有关键字比它大的记录放置在它的位置之后(称之为一次划分过程)。之后对所分的两部分分别重复上述过程,直到每部分只有一个记录为止。/1.=一次划分函数=int Partition(SeqList R,int i,int j) / 对Rij
40、做一次划分,并返回基准记录的位置 RecType pivot=Ri; /用第一个记录作为基准 while(ij) /从区间两端交替向中间扫描,直到i=j while(i=pivot.key) /基准记录pivot相当与在位置i上 j-; /从右向左扫描,查找第一个关键字小于pivot.key的记录Rjif(ij) /若找到的Rj.key pivot.key,则 Ri+=Rj; /交换Ri和Rj,交换后i指针加1while(ij &Ri.key=pivot.key) /基准记录pivot相当与在位置j上 i+; /从左向右扫描,查找第一个关键字小于pivot.key的记录Riif(i pivot
41、.key,则 Rj-=Ri; /交换Ri和Rj,交换后j指针减1 Ri=pivot; /此时,i=j,基准记录已被最后定位 return i; /返回基准记录的位置/2.=快速排序=void QuickSort(SeqList R,int low,int high) /Rlow.high快速排序 int pivotpos; /划分后基准记录的位置 if(lowhigh) /仅当区间长度大于1时才排序pivotpos=Partition(R,low,high); /对Rlow.high做一次划分,得到基准记录的位置QuickSort(R,low,pivotpos-1); /对左区间递归排序QuickSort(R,pivotpos+1,high); /对右区间递归排序 4、 直接选择排序的基本思想:第i趟排序开始时,当前有序区和无序区分别为R1i-1和Rin(1in-1),该趟排序则是从当前无序区中选择出关键字最小的记录Rk,将它与
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度版权作品代理出版包销合同
- 水平测量仪测量用市场发展预测和趋势分析
- 胆固醇检测仪市场需求与消费特点分析
- 2024年度文化创意产业投资基金合同
- 2024年度版权许可使用合同许可使用范围和许可期限
- 金属加工用液压式冲床项目评价分析报告
- 2024年度健身服务合同服务内容描述及服务费用计算
- 2024年度地铁车厢窗帘采购与安装合同
- 2024年度版权购买合同:某影视公司购买电影版权
- 2024年度版权转让合同:电影作品所有权转让
- 统编版九年级语文下册第六单元大单元教学设计
- 帆船知识课件
- 企业宣传片项目进度计划
- 2023-2024学年统部编版九年级道德与法治下册全册知识点总结讲义
- 奇瑞QQ冰淇淋说明书
- 糖尿病性舞蹈病
- EPC项目承包人施工方投资估算与设计方案匹配分析
- 听数学故事探秘负数起源
- 《第八课 我的身体》参考课件
- 空乘大学生职业生涯规划
- T-NAHIEM 96-2023 静脉用药调配中心建设与配置标准
评论
0/150
提交评论