




免费预览已结束,剩余74页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
高级语言程序设计(一) (c programming),第二讲:c程序设计基础(二),本章目标,掌握函数的定义及调用方式 掌握函数参数传递方式 掌握switch多路选择 掌握一维数组的定义和使用; 掌握简单的文件输入/输出,模块化程序设计,将复杂问题分解为简单问题的程序设计方法称为结构化程序设计,其特点为: 自顶向下(top-down design); 逐步细化(stepwise refinement); 模块化(modular programming); 模块化的好处: 功能分解的需要; 代码重用;,#include main() double radius, area, perimeter; scanf(“%lf”, ,c程序设计基础,4,常量定义,所有常量可以用#define来定义,即可以给一个常量命名。如: #define pi 3.1415926 使用常量定义的好处: 可提高程序的可读性 程序的可移植性更好,可维护性更好,#include #define pi 3.1415926 main() double radius, area, perimeter; scanf(“%lf”, ,实验,c程序设计基础,5,常量定义(续),在ansi c中,类型修饰符:const - 其变量值在程序执行中不可以通过赋值等方法对它进行修改(是定义常量的另一种方法,用#define定义的常量无类型,而用const定义的常量有类型)。如: const float pi = 3.14159;,#include const float pi = 3.14159; main() double radius, area, perimeter; scanf(“%lf”, ,# include main( ) int a, b, sum; scanf( “%d+%d”, ,标准输入/输出库函数,标准(库)函数,标准i/o库函数 #include ( scanf,printf, getchar, putchar) 标准数学函数 #include (sin, cos, sqrt) ,问题2.1,问题: 已知一组三角形的三边(如(2.0, 2.0, 2.0)、(3.0,4.0,5.0)、(2.5, 3.1, 3.8)),计算其面积。计算三角形面积的公式为:,#include #include main () double s; s = (2.0 + 2.0 + 2.0) / 2; printf(“%fn”, sqrt(s*(s-2.0)*(s-2.0)*(s-2.0); s = (3.0 + 4.0 + 5.0) / 2; printf(“%fn”, sqrt(s*(s-3.0)*(s-4.0)*(s-5.0); s = (2.5 + 3.1 + 3.8) / 2; printf(“%fn”, sqrt(s*(s-2.5)*(s-3.1)*(s-3.8); ,对于这样的有规律的重复计算,可以用更好的方法:函数 来解决,double sqrt(double x) 为标准数学库中函数,使用前应加上 #include ,定义求三角形面积函数,tri_area( ),double a,double b,double c,double, ,函数名,需要传递给函数的数据(参数):数据类型、数据名称,函数计算结果(返回)类型 double,函数是如何对数据进行计算 (函数体),double a, double b, double c,tri_area,计算 语句,tri_area函数定义,double tri_area(double a, double b, double c) double s,area; s = (a + b + c) / 2.0; area = sqrt(s*(s-a)*(s-b)*(s-c); return area; ,函数定义头部,其中 double 为函数类型 tri_area为函数名 a,b,c为函数参数,函数体,局部变量,函数返回(return)语句,返回计算结果,函数定义,在ansi c标准中,函数定义形式为: 类型 函数名(参数说明) 局部变量定义或说明 语句 ,0个、一个或多个参数,多个参数以逗号 , 分隔,称为 形参,格式: 数据类型 参数名,函数定义(续),函数名一般是标识符,一个程序只有一个main函数,其它函数名可随意取,当然最好是有助于记忆的名字。 局部变量定义或说明可有可无,在ansi c标准中, 局部变量定义或说明应放在函数体的最前面。 在ansi c标准中,函数(返回值)类型不允许省略,即使是返回整型值(int),当函数无返回值时,应其类型说明为void类型。,若需要返回值: return 表达式;,若不需要返回值: return; 或者没有return语句,函数定义(续)*,在c语言中,函数不能嵌套定义。 如,下面定义在c语言中是不充许的: f( ) g( ) ,问题2.1:代码实现,#include #include double tri_area(double a, double b, double c) double s,area; s = (a + b + c) / 2.0; area = sqrt(s*(s-a)*(s-b)*(s-c); return (area); int main( ) double area; area = tri_area(2.0,2.0,2.0); printf(“%fn”, area); area = tri_area(3.0,4.0,5.0); printf(“%fn”, area); area = tri_area(2.5,3.1,3.8); printf(“%fn”, area); return 0; ,函数调用,实验,或者: int main( ) printf(“%fn”, tri_area(2.0,2.0,2.0); printf(“%fn”, tri_area(3.0,4.0,5.0); printf(“%fn”, tri_area(2.5,3.1,3.8); return 0; ,函数调用,函数调用形式:函数名( 实参表 ) 其中实参个数、类型、排列次序应和形参定义时一致。 函数通过return语句将值返回给调用函数。它有两种使用形式: 1)return expr; 2)return; 注意:使用return语句只能返回一个值。,函数调用可以作为单独语句,也可以出现在表达式中,函数定义与调用(续)*,注意:当一个函数带有返回值时,应保证函数每个可能执行路径上应有返回值。如下面将大写字母转换为小写字母函数: char tolower(char c) if( c = a ,问题2.1:代码实现,#include #include int main( ) printf(“%fn”, tri_area(2.0,2.0,2.0); printf(“%fn”, tri_area(3.0,4.0,5.0); printf(“%fn”, tri_area(2.5,3.1,3.8); return 0; double tri_area(double a, double b, double c) double s,area; s = (a + b + c) / 2.0; area = sqrt(s*(s-a)*(s-b)*(s-c); return (area); ,double tri_area(double a, double b, double c);,函数原型,实验,函数原型说明(prototype):,在ansi c标准中,所有函数调用之前必须要有函数定义或原型说明,函数原型用以说明函数的返回值类型、函数参数类型、个数及次序。函数原型说明有两种形式: 直接使用函数的头部(函数头部后加分号)。如, double tri_area(double a, double b, double c); 在原型说明中仅给出类型、个数及次序,无形参变量名。如, double tri_area(double , double , double ); 注意:函数原型说明的类型、参数类型、个数及次序必须与函数定义时一致,否则会产生错误。,函数参数,void swap ( int x, int y) int temp; temp = x; x = y; y = temp; int main( ) int a = 2, b = 3; swap(a, b); return 0; ,请问a和b是否交换?,不能!,如何通过函数调用改变参数的值将在后续章节中介绍。,拷贝,:传值调用,实验,函数参数(续),注意:c函数的参数传递全部采用传值。传值调用实际上重新拷贝了一个副本给形参。,传值的好处是传值调用不会改变调用函数实参变量的内容,因此,可避免不必要的副作用。,问题2.2:求素数,读入一个整数,求该整数范围内的所有素数。 解题步骤: 读入一个整数到n; for(m=2; m=n; i+) if(m是素数) 输出m;,可定义一个函数 int isprime(int n) 来判断一个整数是否为素数,若是返回1,否则返回0。,问题2.2:代码实现,int isprime(int n) int m; if(n=1) return 0; for( m=2; m*m = n; m+) if(n%m = 0) /*存在因子,不是素数*/ return 0; return 1; ,主函数 #include int isprime(int n); int main() int n,m; scanf(“%d”, ,实验,局部变量,局部变量(local variable),又称自动变量:在函数(或块结构)中定义的变量。 使用范围:只在定义它的函数或块结构内有效。 定义时可加auto关键字,也可省略: auto int index; 等同于: int index; 编译程序不对局部(自动)变量给予隐含的初值,故其初值不确定。因此,每次使用前,必须明确地置初值。 局部(自动)变量随函数的调用而存在,函数返回后将消失,由一次调用到下一次调用之间不保持值,每次调用函数时都重新初始化。 形参是自动变量,使用范围仅限于相应函数内。,计算x的幂: #include double power(double x, int n); int main( ) int n, m, i; double f; scanf(“%d”, ,double power(double x, int n) double f; f = 1; while(n0) f = f*x; n-; return (f); ,double f;,double f;,f = 1;,实验,如何划分函数,程序中可能有重复出现的相同或相似的计算片段,可以考虑从中抽取出共同的东西,定义为函数。这样可以缩短程序代码,提高程序的可读性和易修改性。 程序中具有逻辑独立的片段定义为函数。这样做主要用于分解程序的复杂性。,#include double power(double x, int n) int i; double p; p = 1; for(i=1; i=n; +i) p = p*x; return (p); int main( ) float x; scanf(“%f”, ,#include void printpower(double x, int n) int i; double p; p = 1; for(i=1; i=n; +i) p = p*x; printf(“ x power %d = %fn”, n, p); int main( ) float x; scanf(“%f”, ,实验,27,问题2.3:简易计算器,【问题描述】 编程实现简单的交互式计算器,能进行整数的 + - * / 运算。 【输入形式】 从键盘读入如下形式的输入行,数据与运算符之间可以用一个空格分隔: 120 350 + 5 2 / 【输出形式】若是/运算, 小数点后保留两位有效数字 470 2.50,28,问题2.3:问题分析,如何读入数据及运算符? int data1,data2; char op; scanf ( “%d%d %c”, ,29,问题2.3:算法设计,int data1,data2, result1; float result2; char op; 从标准输入中读入整数data1,整数data2及运算符op 判断op: 若为+,则result1 = data1 + data2; 若为-,则result1 = data1 - data2; 若为*,则result1 = data1 * data2; 若为/,则result2 = data1 / data2; 若op为+,-或*,输出结果result1; 若op为/,输出结果result2;,注意:由于data1和data2为整数,结果仍为整数。要用强制类型转换才能得到小数位。 result2 = (float)data1/data2;,多路选择,可使用if-else if语句实现。在此,更适合switch语句。,第三讲:程序设计方法-问题分析,30,多路选择:switch语句,基本形式: switch(表达式) case常量表达式1:语句1或空; case常量表达式2:语句2或空; case常量表达式n:语句n或空; default:语句n+1或空; 语义动作为: 先计算表达式的值; 该值与每一个case后的常量进行比较; 若匹配,则控制就转向该常量后的语句; 若不匹配,若有default,则转向default后的语句,否则什么也不做;,因此,switch语句特别适合于依据一组常量值来进行判断的多路选择。,第三讲:程序设计方法-问题分析,31,多路选择:switch语句(续),注意: 常量表达式必须是整型(if_else if可能根据任意条件来进行多路选择); 在同一个switch中不应出现两个具有同样的常量; default语句如果有,只允许出现一次,default可出现在switch中的任何位置,通常放在最后; case和default本身不改变控制流(这与pascal中的case语句不同),中断离开switch要用break; case后的语句可以是单个语句,也可以是复合语句(但不带开头和结尾的花括号),32,#include int main() int data1,data2, result1; float result2; char op; scanf(“%d%d %c”, ,测试数据: 120 350 + 12 12 - 35 2 * 3 2 /,break;,break;,break;,break;,break;,33,问题2.3:常见问题,在switch中遗漏break,#include int main() int data1,data2, result1; float result2; char op; scanf(“%d %c %d”, ,测试数据为: 120 + 350 结果为: 120+350=-230,why?,问题2.4,问题: “在一行上输入10个整数,在下一行上反序输出”。 输入样例: 2332 455 5 67 78 9 10 467 3 23 输出样例: 23 3 467 10 9 78 67 5 455 2332,问题2.4:问题分析,首先遇到的问题是如何保存输入的数据? 以目前所学的知识,我们可以设置10个变量来存储输入如: int data1, data2, , data10; 这样做的缺点: 程序处理数据非常烦琐,如我们必须依次读入每个数据(不能用循环); 程序不具扩展性,如果我们要处理100个、1000个甚至更多的数据,怎么办? 如何 存储类型相同并且紧密相关的一组数据?,使用数组,数组的定义与初始化,数组是变量的有序集合,数组的所有成员(数组元素)都具有相同的数据类型。 数组定义一般采用如下格式: 类型 数组名长度; 长度为常量表达式,数组的定义与初始化(续),例如: int a50; a0 a49,数组元素的下标是从0开始,即数组中第一个元素的下标为0,数组的定义与初始化(续),注意:c语言不支持动态数组,即数组的长度必须在编译时确定下来,而不是在运行中根据需要临时决定。但c语言提供了动态分配存贮函数,利用它可实现动态申请空间。,int length; scanf(“%d”,长度必须是常量表达式,实验,数组的定义与初始化(续),数组初始化:可以在定义时初始化一个数组。下面是一些数组初始化实例: double sales5 = 12.25, 32.50, 16.90, 23, 45.68; double sales = 12.25, 32.50, 16.90, 23, 45.68; int list5 = 6, 5, 12 ; 相当于: int list5 = 6,5,12,0,0,以实际元素的个数决定数组的大小,实验,char string10 = h, e, l, l, o, 0 char string10 = “hello”; char string = “hello”; 注意:用字符串常量初始化一个字符数组时,其长度应至少比字符个数多1。,数组的定义与初始化(续),实验,数组元素的访问,初始化数组 int array10, i; for(i=0; i10; i+) arrayi = 1; 读入数组元素 int array10, i; for(i=0; i10; i+) scanf(“%d”, ,注意:不要将循环条件写为i=10。这是初学者常犯的错误。如果一个数组的长度为n,则遍历数组的循环常写为: for(i=0; in; i+) 或 for(i=0; i=n-1; i+),编译器不提供数组下标越界检查,下标越界时可以通过编译,但运行时会出错,格式:数组名下标,实验,数组元素的访问(续),求数组中最大元素 maxindex = 0; /*maxindex记录最大元素的下标*/ for(i=0; in; i+) if(arraymaxindex arrayi) maxindex = i; maxelement = arraymaxindex;,实验,或者: maxelement = array0; for(i=1; in; i+) if(maxelement arrayi) maxelement = arrayi;,数组处理的限制,在c中不允许对数组进行整体操作。下面用法是错误的: int x10, y10; scanf(“%d”, x); y = x; if( x = y ) y= 1,2,3,4,5;,比较数组,正确做法是: for(i=0; i10; i+) if(xi != yi) ,正确做法是: for(i=0; i10; i+) scanf(“%d”,正确做法是: for(i=0; i10; i+) yi = xi;,复制数组,只能在定义数组时整体初始化,不能整体赋值。,实验,问题2.4,问题: “在一行上输入10个整数,在下一行上反序输出”。 输入样例: 2332 455 5 67 78 9 10 467 3 23 输出样例: 23 3 467 10 9 78 67 5 455 2332,问题2.4:解题步骤,1、定义保存数据的数组data10和下标变量index; 2、index设为数组第一个元素的下标; 3、while index小于10 3.1、读入数据并保存到下标为index的数组元素中; 3.2、index增1; 4、index设为最后一个元素的下标; 5、while index大于等于0 5.1、打印下标为index的数组元素; 5.2、index减1;,问题2.4程序实现:,# include int main( ) int data10; int index; for(index =0; index =0; index- -) printf(“%d “, dataindex ); return 0; ,实验,问题2.5,问题:统计输入中每个数字字符的出现次数 分析: 方法一:显然可以使用10个int型变量来分别存储每个数字字符的出现次数。然后在程序中,使用if_else if来分别统计每个数字字符的出现次数。(该方法太笨拙),问题2.5 :分析(续),方法二 可以使用数组来存储每个数字字符的出现次数。如: int digit10; 如何将输入的数字字符与相应数组下标对应? 表达式: c 0 可将数字字符c转换为相应整数。因此,下面语句可统计每个数字字符的出现次数: digitc- 0+;,问题2.5 :代码实现,#include int main() int i, c, digit10 = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; while(c = getchar() ) != eof) if(c = 0 ,如何将打印整数数组 封装成一个函数?,实验,例:打印整数数组函数,void print(int a10) int i; for(i=0; i10; i+) printf(“ %dn”, ai); ,void print( int a , int length) int i; for(i=0; ilength; i+) printf(“ %dn”, ai); ,数组长度一般作为单独参数传递给函数,注意:1、数组长度一般不写在 一维数组形参内,因为编译器 不作检查。 2、该函数不能打印任意长度的 整数数组。,int main() int i, c, digit10 = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; while(c = getchar() ) != eof) if(c = 0 ,数组作为实参,只写数组名,千万不要写成digit10,#include void print( int a , int length) int i; for(i=0; ilength; i+) printf(“ %dn”, ai); ,能否将统计功能也 封装成函数呢?,实验,void count( int a ) int c; while(c = getchar() ) != eof) if(c = 0 ,例:统计数字出现次数函数,数组中的值能 传递回来吗?,实验,数组作为函数参数,数组可以作为参数传递给函数。实际上传递的是数组的首地址(即数组第一个元素的地址,将在指针部分说明),我们可以这样理解数组作为参数传递:形参数组与实参数组是一对共享同一数据区的数组,即它们是同一个数组,而不是对实参数组的拷贝。 数组作为参数时,函数的定义形式: void fun( int array , int size) 数组作为参数时,函数的调用形式: main() int a10; . fun(a, 10); . ,注意:定义数组形参时,数组长度可省略,同时,还应在形参中指定数组元素个数。,注意:函数调用时,用数组名作实参。,字符数组,数组元素的类型是char。 char mes = “c language”; char line100 = “programming”; 字符数组有如下特点: 数组元素跟一般变量一样可赋值、比较、计算等。 数组下标也是从0 n-1(n为数组长度)。 字符数组长度可以显式给出,也可以隐式得到。 由双引号括起来的的字符串常量具有静态字符串数组类型。 对数组初始化时,编译程序以0作为结束符添加到字符串最后。因此,数组长度要比字符串长度多1。,问题2.6:将数字字符串转换成整数,n =0 while si为数字字符 n = 10*n + si 0;,“123”,1-0= 1,1*10 + 2-0 = 12,12*10 + 3-0 = 123,方法分析,问题2.6:代码实现,int atoi(char s ) int i, n, sign; for(i=0; si = = | si = = n | si = = t; i+) ; /* skip white space */ sign = 1; if(si = = + | si = = -) sign = (si+ = = +)?1:-1; for(n=0; si = 0 ,字符数组。,空语句,条件运算符: ? : 先计算表达式1,若其值为非零,则整个表达式结果为表达式2的值,否则就为表达式3的值。,#include int atoi(char s ); main() char s20; scanf(“%s”, s); printf(“%dn”, atoi(s); ,实验,问题2.7:将字符串颠倒,“”,方法分析,交换,问题2.7:代码实现,void reverse(char s ) int c, i, j; for(i=0, j=str_len(s)-1; i j ; i+,j-) c = si; si = sj; sj = c; ,int str_len(char s ) int i=0; while(si != 0) +i; return (i); ,#include int reverse(char s ); int str_len(char s ); main() char s20; scanf(“%s”, s); reverse(s); printf(“%sn”,s); ,字符数组作为函数参数传递时,不需要同时传递数组长度。因为字符数组中字符串是以0结束的。,实验,问题2.8:将文件in.txt拷贝至新文件out.txt中。,问题分析: 如何读取、保存文件内容?,将标准输入拷贝到标准输出非常简单: #include int main() int c; while(c=getchar() != eof) putchar(c); return 0; ,文件,文件操作,文件操作基本过程,打开文件,首先在程序文件的头部应有如下语句: #include ,stream (流,读写通道),程序结束前应该关闭文件,!,程序,文件,文件,打开文件,file * fp; fp = fopen( 文件名,文件使用方式);,file 是文件中定义的结构数据类型,包含文件有关信息: 读或写工作方式;当前读/写位置等等。一般用户不必关心。,若成功打开指定文件,则fopen返回指向该文件的file类型指针; 若打开文件失败,则返回 null。,文件指针:与打开的文件绑定在一起,以后将使用该指针实现对文件的所有操作,文件,打开文件(续),fp = fopen( 文件名,文件使用方式);,文件名: 字符串,可以只写文件名,也可以包含路径。 只写文件名时,表示文件在当前目录下,当前目录是指: 从vc运行时,工程文件和源程序所在目录。 双击*.exe程序运行时,该*.exe程序所在目录。,包含路径实例: “c:temptext.txt”,“c:temptext.txt”,文件,打开文件(续),fp = fopen(文件名,文件使用方式); 使用方式也是字符串,表示打开文件的方式,字符流方式包括: “r”: 表示读; “w”: 表示写; “a”: 表示添加; “r+”: 表示读写已有文件; “w+”: 表示读写新文件; “a+” : 表示读及添加;,文件,打开文件(续),用“w”或“a”方式调用fopen打开一个不存在的文件,系统会首先自动创建该文件。然后再把它打开。 用“w”方式打一个已存在的文件,则该文件原有内容全部消失。 用“a”方式打开一个已存在的文件,则原文件内容保留不变,新添加的内容将加到它的后面去。 用 “r”方式打开一个已存在的文件是正常的使用文件,若用“r”方式而打开一个尚未存在的文件,则会出错,此时返回null。因此,一个好的程序设计风格,应判断打开文件的返回值,并进行处理。,一个打开文件的典型用法: if ( ( fp = fopen(filename, “r”) ) = null ) printf(“cant open file %s!n”,filename); return -1; ,文件,“r+”是对一个已存在的文件进行读和写操作。 “w+”同样对一个已存在的文件打开时,原数据消失,因此,修改一个已有文件的内容时,必须以“r+”方式打开。 “a+”写入的数据均在文件最后,而数据却可由文件任何位置上读取。,打开文件(续),注意:文件必须打开后,才可进行读写。,文件,打开文件(续),例如:以只读方式打开一个文件“hello.c”。 fp = fopen(“hello.c”, “r”); 例如:以写方式打开一个文件“output.dat”,该将文件位于c:盘根目录下。 fp = fopen(“c:output.dat”, “w”);,文件,读写文件,字符输入函数: int fgetc (file * fp ); 从fp所指向的文件中读取一个字符并返回。若文件结束或调用失败,返回eof 字符输出函数: int fputc ( int ch, file * fp ); 将字符ch写入fp所指向的文件。若成功,则返回写入的字符;若失败,返回eof,文件,关闭文件,关闭文件函数: int fclose (file* fp ); 关闭fp文件指针所指向的文件,并释放fp文件指针。若成功关闭,返回0,否则返回eof,注意: fp必须是fopen返回的指针,并且调用关闭函数后,fp被释放掉,不能再利用fp进行读写文件操作。 若文件不再使用,应及时关闭文件。在程序结束前,应该关闭所有打开的文件(否则有可能丢失数据)。,问题2.8:将文件in.txt拷贝至新文件out.txt中。,算法分析: 打开文件in.txt。 打开文件out.txt。 从文件in.txt读取一个字符保存到ch中。 是否到达文件尾部? 4.1 将ch保存到out.txt中。 4.2 再从in.txt读取一个字符保存到ch中。 关闭文件。,文件,#include int main() char ch; file * in, * out; if(in=fopen(“in.txt“,“r“)=null) printf(“cant open in.txt!“); return -1; if(out=fopen(“out.txt“,“w“)=null) printf(“cant open out.txt!“); return -1; while( (ch = fgetc(in) !=eof ) fputc(ch,out); fclose(in); fclose(out); return 0; ,问题2.8:测试,首先在该程序工程文件(即.dsp文件)目录下准备一个包含一定内容的inp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 职业道德与要求试题及答案
- 基于强化学习的复杂系统建模与仿真实验-洞察及研究
- 康复训练技术创新应用-洞察及研究
- 社保缴费基数监管-洞察及研究
- 2025个体工商户经营资金短缺借款合同
- 物业冲突法律解决策略-洞察及研究
- 2025年学校食堂餐饮服务承包合同协议
- 冲床安全生产教育培训课件
- 冲压模具车间安全培训课件
- 2025合同违约是否需要承担责任
- GB/T 19839-2005工业燃油燃气燃烧器通用技术条件
- GB/T 19478-2018畜禽屠宰操作规程鸡
- (完整版)人工智能介绍课件
- 陶瓷材料的制备课件
- 中职统计基础知识课件
- 预防校园欺凌-共创和谐校园-模拟法庭剧本
- 《人间词话》十则公开课
- 质量管理学课件第1章
- 磁刺激仪技术参数
- 通用机场建设审批程序
- 城市雕塑工程工程量清单计价定额
评论
0/150
提交评论