




已阅读5页,还剩42页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章 最简单的C程序设计,在上一章介绍了程序中用到的一些基本要素(常量、变量、运算符、表达式等),它们是构成程序的基本成份。在第一章中已经介绍了几个简单的C程序。本章将介绍为编写简单的程序所必须的一些内容。 31 C语句概述 和其它高级语言一样,C语言的语句用来向计算系统发出操作指令。一个语句经编译后产生若干条件机器指令。在C语言中只有“可执行语句”,没有“非执行语句”(BASIC有可执行语句和非执行语句之分)。一个为实现特定目的的程序应当包含若干语句。从第一章已知,一个函数包含数据定义部分,执行部分即由语句组成。C程序可以用图3。1表示。即一个C程序可以由若干个源程序文件(分别编译的文件模块)组成,一个源文件可以由若干个函数和预编译命令组成(关于“预编译命令”见第七章),一个函数由数据定义部分和执行语句组成。 在第二章中已经说明:程序应该包括数据描述(由数据定义部分来实现)和数据操作(由语句来实现)。数据描述主要定义数据结构(用数据类型型表示)和数据初值。数据操作的任务是对已提供的数据进行加工。,C 程序结构,C语句可以分为以下五类: 1控制语句,完成一定的控制功能,C只有9种控制语句,它们是: if( )else (条件语句) for ( ) (转向语句) while( ) (循环语句) dowhile ( ) (循环语句) continue (结束本次循环语句) break (中止执行switch或循环语句) switch (多分支选择语句) goto (转向语句) return (从函数返回语句) 上面9种语句中的括号()表示其中是一个条件,表示内嵌的语句。例如:“if( )else”的具体语句可以写成: “if(xy)z=x;else z=y;”,2函数调用语句。由一次函数调用加一个分号构成一个语句,例如: printf (”this is a C statement”); c=max(a,b); 3表达式语句。 由一个表达式构成一个语句。最典型的是:由赋值表达式构成一个赋值语句。 a=3 是一个赋值表达式,而 a=3; 是一个赋值语句。可以看到一个表达式的最后加一个分号就成了一个语句。一个语句必须在最后出现分号,分号是语句中不可缺少的一部分(而不像PASCAL语言那样:分号只是语句间的分隔符号)。例如: i=i十1 (是表达式,不是语句) iil; (是语句),任何表达式都可以加上分号而成为语句,例如 i+; 是一语句,作用是使i值加1。又如 x+y; 也是一个语句,作用是完成xy的操作,它是合法的,但是并不把调xy的和赋给另一变量,所以它并无实际意义。 表达式能构成语句是C语言的一个特色。其实“函数调用语句”也是属于表达式语句,因为函数调用也属于表达式的一种,只是为了便于理解和使用,我们把“函数调用语句”和“表达式语句”分开来说明。由于C程序中大多数语句是表达式语句(包括函数调用语句),所以有人把C语言称作“表达式语言”。 4空语句。下面是一个空语句: ; 即只有一个分号的语句,它什么也不做。有时用来作被转向点,或循环语句中的循环体(循环体是空语句,表示循环体什么也不做)。,5可以用 把一些语句括起来成为复合语句,如下面是一个复合语句。 z=x+y; tZ100; printf(”%f”,t); 注意:复合语句中最后一个语句中最后的分号不能忽略不写(这是和PASCAL不同的)。 C语言允许一行写几个语句,也允许一个语句拆开写在几行上,书写格式无固定要求 (FORTRAN、COBOL有严格要求)。,32程序的三种基本结构,近年来广泛采用结构化程序设计方法,使程序结构清晰、易读性强,以提高程序设计的质量和效率。结构化程序由若干个基本结构组成。每一个基本结构可以包含一个或若干个语句。有三种基本结构: 1顺序结构,见图32。先执行A操作,再执行B操作,两者是顺序执行的关系。图中(b)是N-S结构化流程图(下同)。,2。选择结构,见图,p代表一个条件,当p条件成立(或称为“真”)时执行A,否则执行B。注意,只能执行A或B之一。两条路径汇合在一起然后出口。,2。选择结构,见图,p代表一个条件,当p条件成立(或称为“真”)时执行A,否则执行B。注意,只能执行A或B之一。两条路径汇合在一起然后出口。,3循环结构,有两种循环结构: (1)当型循环结构,见图34。当p条件成立(“真”)时,反复执行A操作。直到p为“假”时才停止循环。 (2)直到型循环结构,见图35。先执行A操作,再判断p是否为“假”,若p为“假”,再执A行、如此反复,直到p为“真”为止。,由选择结构可以派生出另一种基本结构:多分支选择结构,见图36。根据k的值(k1,k2,,kn不同而决定执行A1,A2,,An之一。,已经证明,由以上基本结构组成的程序能处理任何复杂的问题。图32图3.7中方框中的A,B,A1,An,等可以是一个简单的语句,也可以又是一个基本结构。例如,图37是一个顺序结构,它由两个操作顺序组成。虚线框内是一个当型循环结构,可以用“B表示,因此图37就可以理解力图32(a)所示的顺序结构,在此不再重复。只是应当强调说明,在今后的程序设计中应当采用结构化程序设计方法。 在本章中,我们介绍了几种最基本的语句,以及用它们构成顺序结构的程序。在第四、第五章介绍选择结构和循环结构的程序设计。 33赋值语句 前已说到,赋值语句是由赋值表达式加上一个分号构成。由于赋值语句应用十分普遍,所以专门再讨论一下。,C语言的赋值语句具有其它高级语言中赋值语句的一切特点和功能。但也应当注意到它们的不同: C语言中的赋值号“=”作为赋值运算符;关于赋值表达式与赋值语句的概念,其它多数高级语言没有“赋值表达式”这一概念。作为赋值表达式可以被包括在其它表达式之中,例如 if (ab)0) ta; 按语法规定if后面的()内是一个条件,例如可以是:“if(x0)”。现在在x的位置上换上一个赋值表达式“a=b”,其作用是:先进行赋值运算(将b的值赋给a),然后判断a是否大于,如大于是,执行t=a。在if语句中的“a=b”不是赋值语句而是赋值表达式,这样写是合法的。如果写成 if(ab;)0) ta; 就错了,在if的条件中不能包含赋值语句。由此可以看到:C把赋值语句和赋值表达式区别开来,增加了表达式的种类,使表达式的应用几乎“无孔不入”,能实现其它语言中难以实现的功能。,34数据输出 首先说明,C语言本身不提供输入输出语句,输入和输出操作是由函数来实现的。在C的标准函数库中(stdio.h)提供了一些输入输出函数,例如,printf函数和scanf函数。在使用它们时,千万不要简单地认为它们是c语言的“输入输出语句”。printf和scanf不是C语言的关键字。完全可以不用printf和scanf这两个名字,而另外编两个函数,另用其它函数名。C提供的函数以库的形式存放在系统中,它们不是C语言文本中的组成部分。因此各函数的功能和名字,在各种不同的计算机系统中有所不同。不过,有些通用的函数(如printf和scanf等),各种计算机系统都提供,成为各种计算机系统的标准函数(标准输入输出库stdio.h的一部分)。在程序编译连接时,用户程序与标准文件相连,所以在程序中可以直接使用printf和scanf函数。 在本节中先介绍两个最基本的输出函数,它们都以终端(即系统隐含指定的输出设备)为对象.它们是字符输出函数和格式输出函数。,341 putchar函数(字符输出函数) putchar函数的作用是向终端输出一个字符:例如 putchar(c); 输出字符变量c的值。c可以是字符型变量或整型变量。在使用标准IO库函数时,要用预编译命令“include”将“stdio.h文件包括到用户源文件中。即 include “stdio.h” stdio.h是standard input b=O;c=Y; putchar(a); putchar(b); putchar(c); ,运行结果: BOY 也可以输出控制字符,如putchar(n)输出一个换行符,如果将例31程序最后一行改为 putchar(a); putchar(n); putchar(b); putchar(c); putchar(n )。则输出结果为: B O Y 也可以输出其它转义字符,如: putchar(101) (输出字符A) putchar() (输出单引号字符) putchar(015) (使输出回车,不换行),342 printf函数(格式输出函数) 在前面各章节中已用到printf函数,它的作用是向终端(或系统隐含指定的输出设备)输出若干个任意类型的数据(putchar只能输出字符,而且只能是一个字符,而printf可以输出多个数据,且为任意类型)。 一、 printf函数的一般格式为 printf(格式控制,输出表列) “格式控制”是用双引号括起来的字符串,也称“转换控制字符串”,它包括两种信息: 1格式说明,由“”,和格式字符组成,如d,f等。它的作用是将输出的数据转换为指定的格式输出。格式说明总是由“”字符开始的。,2普通字符,即需要原样输出的字符。 “输出表列”是需要输出的一些数据,可以是表达式。例如: printf (”a=d b=d”,a,b); printf (” a+b=d ,a-b=”,a+b,a-b); 格式说明 输出表列 在上面双引号中的字符除了“d”以外,还有非格式说明的普通字符,它们按原样输出。如果a、b值分别为3、4,则输出为 a=3 b=4 其中有下划线的字符是printf函数中的“格式控制”字符串中的普通字符原样输出的结果。3和4是a和b的值(注意3和4无前导空格和尾随空格),其数字位数由a,b值而定。假如a=12,b=123,则输出结果为 a12 b=123 由于printf是函数,因此,“格式控制”字符串和“输出表列”实际上都是函数的参数。可以表示为 printf(参数1,参数2,参数3,参数n) printf函数的功能是将参数2参数n。按参数1给定的格式输出。,二、格式字符 对不同类型的数据用不同的格式字符。有以下几种格式字符: 1d格式符。用来输出十进制整数。有以下几种用法: (1)d,按整型数据的实际长度输出(见上面)。 (2)md,m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出,如 printf (“4d,4d”,a,b) 若a123,d=12345,则输出结果为: 123,12345 (3)ld,输出长整型数据。如 1ong a=135790; printf(”ld,a); 如果用d输出,就会发生错误,对1ong型数据应当用ld格式输出。对长整型数据也可以指定字段宽度,如将上面printf函数中的“ld”改为“81d”则输出为 135790 8列 一个int型数据可以用d或ld格式输出。(举例),2. O格式符,以8进制数形式输出整数。由于是将内存单元中的各位的值(0或1)按八进制形式输出,因此输出的数值下带符号,即将符号位也一起作为八进制数的一部分输出。例如,-在内存单元中(以补码形式存放)如下: a=-1 11 11 11 11 11 11 11 11 int a-1 printf(”d,o”,a,a); 输出为 1,177777 不会输出带负号的八进制整数。对长整数(1ong型)可以用“1o。”格式输出。同样可以指定字段宽度,如printf(”8o”,a)输出数据为 177777。,3x格式符,以16进制数形式输出整数,同样不会出现负的十六进制数。例如: int a一1; printf(”x,0,d”,a,a,a); 输出结果为 ffff,177777,-1 同样可以用“lx”输出长整型数,也可以指定输出字段的宽度,如“12x” 4u格式符,用来输出unsigned型数据,即无符号数,以十进制形式输出。 一个有符号整数(int型)也可以用u格式输出;反之,一个unsigned型数据也可以用d格式输出。按相互赋值的规则处理(见第二章2.9)。unsigned型数据也可用o或x格式输出。,【例32 unsigned int a=65535; int b=-2; printf(”a=%d,%o,%x,%un”,a,a,a,a); printf(”a=%d,%o,%x,%un”,b,b,b,b); 运行结果为: a一1,177777,ffff65535 11 11 11 11 11 11 11 11 a=65535 b一2177776,fffe,65534 11 11 11 11 11 11 11 10 b=-2 请读者自己分析。,5c格式符,用来输出一个字符。如: char ca; prinft(”c”,c); 输出字符a,请注意:“c”中的c是格式符,逗号右边的c是变量名,不要搞混。 一个整数,只要它的值在0255范围内,也可以用字符形式输出,在输出前,将该整数转换成相应的ASCII字符;反之,一个字符数据也可以用整数形式输出。 例33】 main ( ) char c=a; int i=97; printf(”c,dn”,c,c); printf(”c,dn”,i,i); 运行结果为: a,97 a, 97 也可以指定输出字数宽度,如果有 printf (”3c”,c) 则输出:” a”,即c变量输出占3列,前2列补空格。,6s格式符,用来输出一个字符串。有几种用法: (1)s, 例如 printf(”%s”,”CHINA”) 输出“CHINA”字符串(不包括双引号)。 (2)ms,输出的字符串占m列,如字符串本身长度大于m,则突破m的限制,将字符串全部输出。若串长小于m,则左补空格。 (3)-ms,如果串长小于m,则在m列范围内,字符串向左靠,右补空格。 (4)m.ns,输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。 (5)-m.ns,其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果nm,则m自动取n值即保证n个字符正常输出。 例34 main ( ) printf(”%3s,%7.2s,%.4s,%-5.3sn”,” CHINA”,”CHINA”,”CHINA”,”CHINA”); 输出如下:CHINA, CH,CHIN,CHI 其中第三个输出项,格式说明为“.4s”,即只指定了n,没指定m,自动使mn=4,故占4列。,7f格式符,用来输出实数(包括单、双精度),以小数形式输出,有以下几种用法: (1)f,不指定字段宽度,由系统自动指定,使整数部分全部如数输出,并输出6位小数。应当注意,并非全部数字都是有效数字.单精度实数的有效位数一般为7位。 【例3.5】 main( ) float x,y; x111111111; y222222222; printf(”f,x十y); 运行结果为 333333328125 显然,只有前7位数字是有效数字。千万不要以为凡是打印出来的数字都是准确的。 双精度数也可用f格式输出,它的有效位数一般为16位,给出小数6位。,例36 main() double x,y; x=11111111111111111111; y2222222222222.22222222; printf(”f”,x十y); 输出结果为 3333333333333.328125 显然,双精度数也可用f格式输出,它的有效位数一般为16位,给出小数位。 可以看到最后3位小数(超过16位)是无意义的。,(2)m.nf指定输出的数据共占m列,其中有n位小数。如果数值长度小于m,则左端补空格。 (3)一m.nf基本相同,只是使输出的数值向左端靠,右端补空格。 【例37 main ( ) floatf f=123456; printf(”%f,%10f,%10.2f,%.2f,%-10.2fn”,f,f,f,f,f); 输出结果如下: 123.455994, 123.455994, 123.46, 123. 46,123.46 ,f的值应为123456,但输出为123455994,这是由于实数在内存中的存储误差引起的,8.e格式符,以指数形式输出实数。可用以下形式: (1)e不指定输出数据所占的宽度和数字部分小数位数,由系统自动指定给出6(5)位小数,指数部分占5(4)位(如e+002,e+02),其中“e”占一位,指数符号占一位,指数占3(2)位。数值按标准化指数形式输出(即小数点前必须有而且只有一位非零数字)。例如 printf(”%e”,123.456); 输出:1.234560e002,(1.23456e+02)。也就是说用e格式输出的实数共占13(11)列宽度。,(2)m.ne和-m.ne m,n和“-”字符含义与前相同。此处n指数据的数字部分(与书上讲的不同)。若f123.456,则 printf(”%e,%10e,%10.3e,%.3e,%-10.3e,”,f,f,f,f,f); 输出如下: 1.23456e+02,1.23456e+02, 1.23e02,1.23e02,1.23e十02 第二个输出项按10e输出,即只指定了m=10,未指定n,凡未指定n,自动使n=6,整个数据长11列,超过给定的10列,乃突破10列的限制,按实际长度输出。第三个数据共占10列,小数部分占2列。第四个数据按字“.2e”格式输出,只指定n2,未指定m,自动使m等于数据应占的长度,今为8列。第五个数据应占10列,数值只有8列,由于是“-10.2e”,数值向左靠,右补二个空格。,9g格式符,用来输出实数,它根据数值的大小,自动选f格式或e格式(选择输出时占宽度较小的一种),且不输出无意义的零。例如,若:f=123.456,则 printf(”%f,%e,%g”,f,f,f); 输出如下: 123.456001,1.23456e+02,123.456 用f格式输出占10列,用e格式输出占11列,用g格式时,自动从上面两种格式中选择短者(今为f格式为短),故占7列,且按%f格式用小数形式输出,最后三个小数位“0”为无意义的0,不输出,g格式用得较少。,以上介绍了9种格式符,归纳如表 表3.1 printt格式字符 格式字符 说 明 d 以带符号的十进制形式输出整数(正数不输出符号)。 o 以8进制无符号形式输出整数(不输出前导符0)。 x 以16进制无符号形式输出整数(不输出前导符0x)。 u 以无符号10进制形式输出整数 c 以字符形式输出,只输出一个字符。 s 输出字符串。 f 以小数形式输出单、双精度数,隐含输出6位小数。 e 以标准指数形式输出单、双精度数,数字部分小数位数为6位。 g 选用f或e格式中输出宽度较短的一种格式,不输出无意义的0。,在格式说明中,在和上述格式字符间可以插入以下几种附加符号。 表82附加格式说明字符 字符 说 明 l用于长整型整型,可加在格式符d o x.u前面。 m(代表一个正整数)数据最小宽度。 .n(代表一个正整数)对实数,表示输出n位小数;对字符串,表示截取的字符个数。 - 输出的数字或字符在域内向左靠。,用printf函数输出时,应注意数据类型应与上述格式说明匹配,否则将会出现错误。 在使用printf函数时,还有几点要说明: 1有些系统要求格式字符要用小写字母,如d不能写成D。 2. 可以在printf函数中的“格式控制”字符串内包含第二章中的“转义字符”,如“n”、“t”、“b”、“r”、“f”、“377”等。 3上面介绍的d,o,x,c,s,f,e,g等字符,如用在“”后面就作为格式符号。一个格式说明以“”开头,以上述9个格式字符之一为结束,中间可以插入附加格式字符(也称修饰符)。例如: printf(“c=%cf=%fs=%s”,c,f,s); 第一个格式说明为”c”而不包括其后的f,第二个格式说明为“f,不包括其后的s,第三个格式说明为s。其它的字符为原样输出的普通字符。,4如果想输出字符“”,则应该在“格式控制”字符串中用连续两个表示,如 printf(”f”,103); 输出0.333333 5不同的系统在实现格式输出时,输出结果可能会有一些小的差别,例如用e格式符输出实数时,有些系统输出的指数部分为4位(如e十02)而不是5位(e002),前面的数字部分为5位小数而不是6位等等。,35数据输入 本节介绍两个输入函数,是以终端(或系统隐含指定的输入设备)为输入设备的。 3.5.1 gefchar函数(字符输入函数) 此函数的作用是从终端(或系统隐含指定的输入设备)输入一个字符, getchar函数没有参数,其一般形式为: getchar( ) 函数的值就是从输入设备得到的字符。例如: 例38 include “stdio.h” main ( ) char c: cgetchar(); putchar(c); 在运行时,如果从键盘输入字符a; a (输入a后,按“回车”键,字符才送到内存) a (输出变量c的值a),请注意,getchar( )只能接收一个字符。 getchar函数得到的字符可以赋给一个字符变量或整型变量,也可以下赋给任何变量,作为表达式的一部分。例如,例38第4、5行可以用下面一行代替。 putchar (getchat(); 因为getchar()的值为a,因此输出a,也可以甩printf函数: printf (”c”,getchar(); 在一个函数中要用getchar函数,应该在函数的前面(或本文件开头)用 jnclude “stdio.h” 因为在使用标准i/o库中的函数时需要用到”stdio.h”文件中包含的一些信息。,3.5.2 scanf函数(格式输入函数) getchar函数只能用来输入一个字符,用scanf函数可以用来输入任何类型的多个数据。 在第一章中已初步接触到了scanf函数,在本节中再作详细介绍。 一一般形式 scanf(格式控制,地址表列) “格式控制”的含义同printf函数,“地址表列”是由若干个地址组成的表列,可以是变量的地址,或字符串的首地址。 【例39 main( ) int a,b,c; scanf(”%d%d%d”,&a,&b,&c);/*按照a,b,c在内存的地址将a,b,c的值存进去 */ prinrf(“%d,%d,%dn”,a,b,c); ,运行时按以下方式输入a,b,c的值: 3 4 5 (输入a,b,c的值) 3,4,5 (输出a,b,c的值) &a,&b,&c中的“&”是地址运算符,&a指a在内存中的地址. 用“%d%d%d”格式输入时,不能用逗号(可用空格)作两个数据间的分隔符,如下面输入下合法: 3,4,5,二、格式说明 和printf函数中的格式说明相似,以开始,以一个格式字符结束,中间可以插入附加的字符。表33列出scanf用到的格式字符。表34列出scanf可以用的附加说明字符(修饰符)。 scanf格式字符 d 用来输入十进制整数。 o 用来输入八进制整数。 x 用来输入十六进制整数。 c 用来输入单个字符。 s 用来输入字符串,将字符串送到一个字符数组中,在输入时以非空白字符开始,以第一个空白字符结束。字符串以串结束标志“0”作为其最后一个字符。 f 用来输入实数,可以用小数形式或指数形式输入。 e 与f作用相同,e与f可以互相替换。,附加的格式说明字符 l 用于输入长整型数据(可用ld,lo,lr),以及double型数据(用lf或1e)。 h 用于输入短整型数据(可用hd,hO,hx)。 m 域宽(为一正整数)指定输入数据所占宽度(列数)。 * 表示本输入项在读人后不赋给相应的变量。 说明: 1标准C在scanf中不使用u说明符,对unsigned型数据,以d或o、x互格式输入。 2可以指定输入数据所占列数,系统自动按它截取所需数据。如 scanf(”3d3d”, 输入3个字符,把第一个字符赋给ch,例如输入abc,ch得到字符a。,3后的“*”附加说明符,用来表示跳过它相应的数据。例如 scanf(”2d*3d2dn”, 如果输入如下信息: 12 345 67 将12赋给a,67赋给b.第二个数据“345”被跳过不赋给任何变量。在利用现成的一批数据时,有时不需要其中某些数据,可用此法“跳过”它们。 4。输入数据时不能规定精度,例如 scanf(”%7.2f”,&a); 是不合法的,不能企图输入1234567而使a的值为12345.67。 三、scanf函数的执行中应注意的问题 1scanf函数中的“格式控制”后面应当是变量地址,而不应是变量名。例如,如果a,b为整型变量,则 scanf(”d,d”,a,b); 是不对的,应为&a,&b。这是C语言与其它高级语言不同的。,2如果在“格式控制”字符串中除
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2022酒店主管半年度工作总结简短
- 景观照明提升工程可行性研究报告
- 家居科技产业园项目实施方案(范文参考)
- 环保型植保产品建设项目初步设计(范文)
- 管理学组织设计的原则
- 数控装调与维修实训安全教育
- 心理护理伦理课件
- 河南省开封市五县联考2023-2024学年高二上学期期中考数学含解析
- 2025年开展安全生产月活动实施方案
- 德宏师范高等专科学校《现当代文学作品》2023-2024学年第二学期期末试卷
- 2024年山西杏花村汾酒集团有限责任公司招聘笔试真题
- 天津师范大学与韩国世翰大学入学综合素质题目
- MOOC 学术英语写作-东南大学 中国大学慕课答案
- MOOC 家具·设计·生活-北京林业大学 中国大学慕课答案
- 愚公移山英文 -中国故事英文版课件
- 《老北京四合院》
- 筋膜间室综合征
- 基于UC3842的反激式开关电源的设计
- 生态防护林建设项目建议书范文
- 大学生对美团满意调查问卷
- 原辅材料留样观察记录
评论
0/150
提交评论