欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    《函数和预处》PPT课件.ppt

    • 资源ID:5469840       资源大小:959KB        全文页数:82页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    《函数和预处》PPT课件.ppt

    第4章 函数与预处理,4.1 概述4.2 定义函数的一般形式4.3 函数参数和函数的值4.4 函数的调用4.5 内置函数4.6 函数的重载4.7 函数模板4.8 有默认参数的函数,4.9 函数的嵌套调用4.10 函数的递归调用4.11 局部变量和全局变量4.12 变量的存储类别4.13 变量属性小结4.14 关于变量的声明和定义4.15 内部函数和外部函数4.16 预处理命令,4.1 概述模块化程序设计基本思想:将一个大的程序按功能分割成一些小模块特点:各模块相对独立、功能单一、结构清晰、接口简单 控制了程序设计的复杂性 提高元件的可靠性 缩短开发周期 避免程序开发的重复劳动 易于维护和功能扩充开发方法:自上向下,逐步分解,分而治之,一个程序中函数调用的示意图。,例4.1 在主函数中调用其他函数。#include using namespace std;void printstar(void)cout*endl;void print_message(void)cout Welcome to C+!endl;int main(void)printstar();/调用printstar 函数 print_message();/调用print_message函数printstar();/调用printstar 函数return 0;,运行情况如下:*Welcome to C+!*,C+是模块化程序设计语言,C+是函数式语言必须有且只能有一个名为main的主函数C+程序的执行总是从main函数开始,在main中结束函数不能嵌套定义,可以嵌套调用主函数以外的函数大多是被封装在类中的,函数分类从用户角度标准函数(库函数):由系统提供用户自定义函数从函数形式无参函数有参函数,使用库函数应注意:1、函数功能2、函数参数的数目和顺序,及各参数意义和类型3、函数返回值意义和类型4、需要使用的包含文件,4.2定义函数的一般形式一般格式,合法标识符,函数返回值类型缺省int型无返回值void,函数体,函数类型 函数名(形参类型说明表)说明部分语句部分,例 有参函数 int max(int x,int y)int z;z=xy?x:y;return(z);,例 无参函数 void printstar(void)cout*endl;void print_message(void)cout Welcome to C+!endl;,说明:实参必须有确定的值形参必须指定类型形参与实参类型一致,个数相同若形参与实参类型不一致,自动按形参类型转换函数调用转换形参在函数被调用前不占内存;函数调用时为形参分配内存;调用结束,内存释放,4.3 函数参数和函数的值形参与实参形式参数:定义函数时函数名后面括号中的变量名实际参数:调用函数时函数名后面括号中的表达式,例:计算x的立方,#include using namespace stdfloat cube(float x)return(x*x*x);int main()float a,product;couta;product=cube(a);cout Cube of a is productendl;return 0;,x,1.2,1.728,例4.2 调用函数时的数据传递。#include using namespace std;int max(int x,int y)int z;z=xy?x:y;return(z);int main()int a,b,c;coutab;c=max(a,b);coutmax=cendl;return 0;,例 比较两个数并输出大者,#include using namespace std;int main()int a,b,c;int max(int x,int y);cinab;c=max(a,b);couty?x:y;return(z);,运行情况如下:please enter two integer numbers:2 3max=3,参数传递方式值传递方式方式:函数调用时,为形参分配单元,并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值特点:形参与实参占用不同的内存单元单向传递,例 交换两个数,#include using namespace std;int main()int x=7,y=11;void swap(int a,int b);/cinxy;coutswapped:n“endl;swap(x,y);coutxyendl;void swap(int a,int b)int temp;temp=a;a=b;b=temp;,函数的返回值返回语句形式:return(表达式);或 return 表达式;或 return;功能:使程序控制从被调用函数返回到调用函数中,同时把返回值带给调用函数说明:函数中可有多个return语句若无return语句,遇时,自动返回主调用函数若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换-函数调用转换void型函数,例 无返回值函数 void swap(int x,int y)int temp;temp=x;x=y;y=temp;,例:函数返回值类型转换,#include using namespace std;int max(float x,float y)float z;z=xy?x:y;return(z);int main()float a,b;int c;cinab;c=max(a,b);coutMax is cendl;return 0;,运行结果:2.6,8.9 Max is 8,4.4 函数的调用函数调用一般形式 函数名(实参表列);说明:实参与形参个数相等,类型一致,按顺序一一对应实参表求值顺序,因系统而定(Turbo C 自右向左),函数调用方式函数语句:例 printstar();函数表达式:例 m=max(a,b)*2;函数参数:例 m=max(a,max(b,c);,函数说明对被调用函数要求:必须是已存在的函数库函数:#include 用户自定义函数:函数类型说明函数说明一般形式:函数类型 函数名(形参类型 形参名,.);或 函数类型 函数名();作用:告诉编译系统函数类型、参数个数及类型,以便检验函数定义与函数说明不同函数说明位置:程序的数据说明部分(函数内或外)下列情况下,可不作函数说明若函数返回值是char或int型,系统自动按int型处理被调用函数定义出现在主调函数之前,例 函数说明举例,调用函数时需要一定的时间和空间的开销。下图表示函数调用的过程:,4.5 内置函数,内置函数(内联函数)在编译时将所调用函数的代码直接嵌入到主调函数中,而不是将流程转出去。指定内置函数,只需在函数首行的左端加一个关键字inline。例4.4 函数指定为内置函数。#include using namespace std;,inline int max(int,int,int);/函数声明,注意左端有inlineint main()int i=10,j=20,k=30,m;m=max(i,j,k);couta)a=b;/求a,b,c中的最大者 if(ca)a=c;return a;,实参代替形参,被置换成if(ji)i=j;if(ki)i=k;m=i;,注意:inline可以写在声明函数或定义函数时优点:内置函数节省运行时间缺点:增加了目标程序的长度。对内置函数的要求:规模很小,一般为5个语句以下使用频繁的函数不包括复杂的控制语句,如循环语句和switch语句,函数的重载:一组概念相同,处理对象(参数)不同的过程,出于方便编程的目的,用同一个函数名字来命名的技术称为函数重载重载是不同的函数,以参数的类型,个数和顺序来分辨函数体可以相同也可以不同,4.6 函数的重载,例:void print(double);void print(int);void func()print(1);/void print(int);print(1.0);/void print(double);print(a);/void print(int);print(3.1415f);/void pirnt(double);,例4.5 求3个数中最大的数(分别考虑整数、双精度数、长整数的情况)。#include using namespace std;int main()int max(int a,int b,int c);/函数声明double max(double a,double b,double c);/函数声明long max(long a,long b,long c);/函数声明 int i1,i2,i3,i;cini1i2i3;/输入3个整数 i=max(i1,i2,i3);/求3个整数中的最大者 couti_max=iendl;,double d1,d2,d3,d;cind1d2d3;d=max(d1,d2,d3);coutg1g2g3;g=max(g1,g2,g3);couta)a=b;if(ca)a=c;return a;,double max(double a,double b,double c)if(ba)a=b;if(ca)a=c;return a;long max(long a,long b,long c)if(ba)a=b;if(ca)a=c;return a;,运行情况如下:185-76 567 i_max=567 56.87 90.23-3214.78d_max=90.2367854-912456 673456 g_max=673456,例4.6参数个数不同。#include using namespace std;int main()int max(int a,int b,int c);/函数声明 int max(int a,int b);/函数声明 int a=8,b=-12,c=27;cout“max(a,b,c)=“max(a,b,c)endl;cout“max(a,b)=“max(a,b)endl;return 0;,int max(int a,int b,int c)if(ba)a=b;if(ca)a=c;return a;int max(int a,int b)if(ab)return a;else return b;运行情况如下:max(a,b,c)=27max(a,b)=8两次调用max函数的参数个数不同,系统就根据参数的个数找到与之匹配的函数并调用它。,定义函数模板的形式:template 或 template 通用函数定义 通用函数定义在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现了不同函数的功能。类型参数可以不只一个,可以根据需要确定个数。如:template 注意:它只适用于函数的参数个数相同而类型不同,且函数体相同的情况,如果参数的个数不同,则不能用函数模板。,4.7 函数模板,例4.7 将例4.6程序改为通过函数模板来实现。#include using namespace std;template/模板声明,其中T为类型参数T max(T a,T b,T c)if(ba)a=b;if(ca)a=c;return a;,int main()int i1=185,i2=-76,i3=567,i;double d1=56.87,d2=90.23,d3=-3214.78,d;long g1=67854,g2=-912456,g3=673456,g;i=max(i1,i2,i3);d=max(d1,d2,d3);g=max(g1,g2,g3);couti_max=iendl;coutf_max=fendl;coutg_max=gendl;return 0;,int max(int a,int b,int c)if(ba)a=b;if(ca)a=c;return a;,函数在声明时可以预先给出默认的形参值,调用时如给出实参,则采用实参值,否则采用预先给出的默认形参值。例如:,4.8 有默认参数的函数,int add(int x=5,int y=6)return x+y;,void main(void)add(10,20);/10+20 add(10);/10+6 add();/5+6,默认形参值必须从右向左顺序声明,并且在默认形参值的右面不能有非默认形参值的参数。因为调用时实参取代形参是从左向右的顺序。例:,int add(int x,int y=5,int z=6);/正确int add(int x=1,int y=5,int z);/错误int add(int x=1,int y,int z=6);/错误,调用出现在函数体定义之前时,默认形参值必须在函数原型中给出;而当调用出现在函数体定义之后时,默认形参值需在函数定义时给出。例:,int add(int x=5,int y=6);void main(void)add();/调用在定义前int add(int x,int y)return x+y;,int add(int x=5,int y=6)return x+y;void main(void)add();/调用在定义后,例4.8 求2个或3个正整数中的最大数,用带有默认参数的函数实现。#include using namespace std;int main()int max(int a,int b,int c=0);int a,b,c;cinabc;coutmax(a,b,c)=max(a,b,c)endl;coutmax(a,b)=max(a,b)endl;/c取默认值return 0;,int max(int a,int b,int c)if(ba)a=b;if(ca)a=c;return a;,运行情况如下:14-56 135max(a,b,c)=135max(a,b)=14,在相同的作用域内,默认形参值的说明应保持唯一,但如果在不同的作用域内,允许说明不同的默认形参。例:int add(int x=1,int y=2);void main(void)int add(int x=3,int y=4);add();/使用局部默认形参值(实现3+4)void fun(void).add();/使用全局默认形参值(实现1+2),4.9函数的嵌套调用嵌套调用C规定:函数定义不可嵌套,但可以嵌套调用函数,例如:求三个数中最大数和最小数的差值,#include using namespace std;int dif(int x,int y,int z);int max(int x,int y,int z);int min(int x,int y,int z);int main()int a,b,c,d;cinabc;d=dif(a,b,c);coutMax-Min“dendl;return 0;,int dif(int x,int y,int z)return max(x,y,z)-min(x,y,z);int max(int x,int y,int z)int r;r=xy?x:y;return(rz?r:z);int min(int x,int y,int z)int r;r=xy?x:y;return(rz?r:z);,例 求三个数中最大数和最小数的差值,递归调用定义:函数直接或间接的调用自身叫函数的递归调用,说明C+编译系统对递归函数的自调用次数没有限制每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,所以递归次数过多,可能引起堆栈溢出,int f(int x)int y,z;z=f(y);.return(2*z);,例:求n的阶乘,#include using namespace std;int fac(int n)int f;if(nn;y=fac(n);coutn!=“yendl;return 0;,例 有以下程序#include using namespace std;int f(int n)if(n=1)return 1;else return f(n-1)+1;int main()int i,j=0;for(i=1;i3;i+)j+=f(i);coutjendl;return 0;程序运行后的输出结果是:a)4 b)3 c)2 d)1,i f(i)j 1 1 1 2 f(2-1)+1 1+2,例:#include using namespace std;long fun(int n)long s;if(n=1|n=2)s=2;else s=n-fun(n-1);return s;int main()coutfun(3)endl;return 0;,运行结果:ns 33-fun(3-1)3-2=1,例4.10 有5个人坐在一起,问第5个人多少岁?他说比第4个人大两岁。问第4个人岁数,他说比第3个人大两岁。问第3个人,又说比第2个人大两岁。问第2个人,说比第1个人大两岁。最后问第1个人,他说是10岁。请问第5个人多大?,可以用式子表述如下:age(n)=10(n=1)age(n)=age(n-1)+2(n1),运行结果如下:18函数调用过程如图所示,#include using namespace std;int age(int n)int c;if(n=1)c=10;else c=age(n-1)+2;return(c);int main()cout1),在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。同样,在复合语句中定义的变量只在本复合语句范围内有效。这称为局部变量(local variable)。如,4.11 局部变量和全局变量 4.11.1 局部变量,float f1(int a)/函数f1int b,c;b、c有效a有效char f2(int x,int y)/函数f2 int i,j;i、j有效x、y有效int main()/主函数int m,n;int p,q;p、q在复合语句中有效 m、n有效,说明:(1)主函数main中定义的变量也只在主函数中有效(2)不同函数中可以使用同名的变量,它们代表不同的对象,互不干扰。(3)可以在复合语句中定义变量,这些变量仅在本复合语句中有效。(4)形式参数也是局部变量。其他函数不能调用。(5)在函数声明中出现的参数名,其作用范围只在本行的括号内。,例如int max(int a,int b);/函数声明中出现a、b int max(int x,int y)/函数定义,形参是x、y coutxyendl;/合法,x、y在函数体中有效coutabendl;/非法,a、b在函数体中无效编译时认为max函数体中的a和b未经定义。,在函数内定义的变量是局部变量,而在函数之外定义的变量是外部变量,称为全局变量(全程变量)。全局变量的有效范围为从定义变量的位置开始到本源文件结束。如,4.11.2 全局变量,int p=1,q=5;/全局变量全局变量p、q的作用范围 float f1(int a)/定义函数f1 int b,c;char c1,c2;/全局变量全局变量c1、c2 的作用范围char f2(int x,int y)/定义函数f2int i,j;main()/主函数int m,n;,几点说明:,4.12 变量的存储类别概述变量是对程序中数据的存储空间的抽象,编译或函数调用时为其分配内存单元,10,程序中使用变量名对内存操作,变量的属性数据类型:变量所持有的数据的性质(操作属性)存储属性存储类型:寄存器、静态存储区、动态存储区生存期:变量在某一时刻存在-静态变量与动态变量作用域:变量在某区域内有效-局部变量与全局变量变量的存储类型auto-自动型register-寄存器型static-静态型extern-外部型变量定义格式:存储类型 数据类型 变量表;,4.12 变量的存储类别概述变量是对程序中数据的存储空间的抽象,如:int sum;auto int a,b,c;register int i;static float x,y;,局部变量与全局变量局部变量-内部变量定义:在函数内定义,只在本函数内有效说明:main中定义的变量只在main中有效不同函数中同名变量,占不同内存单元形参属于局部变量可定义在复合语句中有效的变量局部变量可用存储类型:auto register static(默认为auto),运行结果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4,全局变量-外部变量定义:在函数外定义,可为本文件所有函数共用有效范围:从定义变量的位置开始到本源文件结束,及有extern说明的其它源文件,应尽量少使用全局变量,因为:全局变量在程序全部执行过程中占用存储单元降低了函数的通用性、可靠性,可移植性降低程序清晰性,容易出错,定义 说明次数:只能1次 可说明多次位置:所有函数之外 函数内或函数外分配内存:分配内存,可初始化 不分配内存,不可初始化,外部变量说明:extern 数据类型 变量表;,外部变量定义与外部变量说明不同,若外部变量与局部变量同名,则外部变量被屏蔽,外部变量可用存储类型:缺省 或 static,float max,min;float average(float array,int n)int i;float sum=array0;max=min=array0;for(i=1;imax)max=arrayi;else if(arrayimin)min=arrayi;sum+=arrayi;return(sum/n);main()int i;float ave,score10;/*Input*/ave=average(score,10);coutmax=maxmin=“minaverage=“aveendl;,extern char c1,c2;,extern char c1,c2;,运行结果:max=13,#includeusing namespace std;extern int a,b;int max()int z;z=ab?a:b;return(z);int main()coutmax=“max()endl;return 0;int a=13,b=-8;,运行结果:max=8,int i;#includeusing namespace std;int main()void prt();for(i=0;i5;i+)prt();void prt()for(i=0;i5;i+)cout“*”;coutendl;,例 外部变量副作用,运行结果:*,动态变量与静态变量存储方式静态存储:程序运行期间分配固定存储空间动态存储:程序运行期间根据需要动态分配存储空间内存用户区,生存期静态变量:从程序开始执行到程序结束动态变量:从包含该变量定义的函数开始执行至函数执行结束,变量存储类型,局部变量默认为auto型register型变量个数受限,且不能为long,double,float型局部static变量具有全局寿命和局部可见性局部static变量具有可继承性extern不是变量定义,可扩展外部变量作用域,例 文件file1.cint a;main().f2;.f1;.f1()auto int b;f2;.f2()static int c;,例 auto 变量的作用域,#includeusing namespace std;int main()int x=1;void prt(void);int x=3;prt();cout“2nd x=”xendl;cout“1st x=”xendl;return 0;void prt()int x=5;cout“3th x=”xendl;,运行结果:3th x=52nd x=31st x=1,#includeusing namespace std;int main()void increment(void);increment();increment();increment();return 0;void increment(void)int x=0;x+;coutxendl;,例 局部静态变量值具有可继承性,运行结果:1 1 1,#includeusing namespace std;int main()void increment(void);increment();increment();increment();return 0;void increment(void)static int x=0;x+;coutxendl;,运行结果:1 2 3,例 变量的寿命与可见性,#include int i=1;main()static int a;register int b=-10;int c=0;cout-MAIN-n“endl;couti:i a:a“b:b c:c c=c+8;other();cout-MAIN-n“endl;couti:i a:a“b:b c:c i=i+10;other();,other()static int a=2;static int b;int c=10;a=a+2;i=i+32;c=c+5;cout-OTHER-“endl;printf(i:%d a:%d b:%d c:%dn,i,a,b,c);b=a;,-Main-i:1 a:0 b:-10 c:0,-Other-i:33 a:4 b:0 c:15,-Main-i:33 a:0 b:-10 c:8,-Other-i:75 a:6 b:4 c:15,8,4,33,15,4,43,6,75,15,6,#includeusing namespace std;int main()void gx(),gy();extern int x,y;cout“1:x=”x“ty=“yendl;y=246;gx();gy();void gx()extern int x,y;x=135;cout“2:x=”x“ty=“yendl;int x,y;void gy()cout“3:x=”x“ty=“yendl;,例 用extern扩展外部变量作用域,运行结果:1:x=0 y=02:x=135 y=2463:x=135 y=246,例 引用其它文件中的外部变量,例 引用其它文件中的变量,输出ab和a的m次方,Ch7.cpp,Ch8.cpp,运行结果:Enter the number a and its power:2,32*3=62*3=8,一个变量除了数据类型以外,还有3种属性:存储类别 C+允许使用auto,static,register和extern 4种存储类别。作用域 指程序中可以引用该变量的区域。存储期 指变量在内存的存储期限。以上3种属性是有联系的,程序设计者只能声明变量的存储类别,通过存储类别可以确定变量的作用域和存储期。,4.13 变量属性小结,4.14 关于变量的声明和定义,把建立存储空间的声明称为定义而把不需要建立存储空间的声明称为声明例如,int main()extern int a;/声明a是一个已定义的外部变量int a;/是定义,定义a为整型外部变量,用static来声明一个变量对局部变量用static声明,使该变量在本函数调用结束后不释放,整个程序执行期间始终存在,使其存储期为程序的全过程。全局变量用static声明,则该变量的作用域只限于本文件模块(即被声明的文件中)。用auto,register,static声明变量时,是在定义变量的基础上加上这些关键字,而不能单独使用。例如:static a;是不合法的,应写成static int a;,内部函数 函数只能被本文件中其他函数所调用 内部函数定义:,static 类型标识符 函数名(形参表),外部函数 函数能被其他文件调用 外部函数定义:在函数首部的最左端冠以关键字extern如果在定义函数时省略extern,则默认为外部函数,如:extern int fun(int a,int b),extern 类型标识符 函数名(形参表),4.15 内部函数和外部函数,例4.15 输入两个整数,要求输出其中的大者。file1.cpp(文件)#include using namespace std;int main()extern int max(int,int);int a,b;cinab;coutmax(a,b)endl;return 0;,file2.cpp(文件2)int max(int x,int y)int z;z=xy?x:y;return z;,运行情况如下:7-347,在计算机上运行一个含多文件的程序时,需要建立一个项目文件(project file),在该项目文件中包含程序的各个文件。,作用:对源程序编译之前做一些处理,生成扩展C源程序种类宏定义#define文件包含#include条件编译#if-#else-#endif等格式:“#”开头占单独书写行语句尾不加分号,4.16 预处理命令,#include 包含指令将一个源文件嵌入到当前源文件中该点处。#include 按标准方式搜索,文件位于C+系统目录的include子目录下#include文件名首先在当前目录中搜索,若没有,再按标准方式搜索。#define 宏定义指令定义符号常量,很多情况下已被const定义语句取代。定义带参数宏,已被内联函数取代。#undef删除由#define定义的宏,使之不再起作用。,条件编译指令#if 和#endif,#if 常量表达式/当“常量表达式”非零时编译 程序正文#endif.,条件编译指令#else,#if 常量表达式/当“常量表达式”非零时编译 程序正文1#else/当“常量表达式”为零时编译 程序正文2#endif,条件编译指令#elif,#if 常量表达式1 程序正文1/当“常量表达式1”非零时编译#elif 常量表达式2 程序正文2/当“常量表达式2”非零时编译#else 程序正文3/其它情况下编译#endif,#ifdef 标识符 程序段1#else 程序段2#endif如果“标识符”经#defined定义过,且未经undef删除,则编译程序段1,否则编译程序段2。,#ifndef 标识符 程序段1#else 程序段2#endif如果“标识符”未被定义过,则编译程序段1,否则编译程序段2。,例:输入一行字母字符,根据需要设置条件编译,使之能将字母全改为大写输出,或全改为小写字母输出。#define LETTER 1 main()char str20C language,c;int i=0;while(cstri)!=0)i+;#if LETTER/*LETTER为1*/if(c=a,运行结果为:C LANGUAGE,本章作业:1。见网络学堂“第四章作业”2。第三次实验报告见网络学堂,请详细阅读实验说明。,

    注意事项

    本文(《函数和预处》PPT课件.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开