收藏 分享(赏)

第1章c++基础知识.ppt

上传人:hyngb9260 文档编号:8159708 上传时间:2019-06-11 格式:PPT 页数:69 大小:1.72MB
下载 相关 举报
第1章c++基础知识.ppt_第1页
第1页 / 共69页
第1章c++基础知识.ppt_第2页
第2页 / 共69页
第1章c++基础知识.ppt_第3页
第3页 / 共69页
第1章c++基础知识.ppt_第4页
第4页 / 共69页
第1章c++基础知识.ppt_第5页
第5页 / 共69页
点击查看更多>>
资源描述

1、孙岱,C+程序设计,第1章 C+基础知识,程序设计语言是人类在计算机上解决实际问题的一种工具。当一个求解问题能够用数学模型表达时,人们会考虑用某种程序设计语言将该问题的数学模型表示成计算机可以接受的程序形式,再由计算机自动处理这个程序,生成人们所需要的结果。,1.1 程序设计语言的基本概念,1. 面向过程的结构化程序设计语言 2. 面向对象的程序设计语言,C+语言是面向对象的语言,同时也兼顾了面向过程的程序设计方法。,1.2 C+程序的基本结构,1.2.1 C+程序结构 一般来说,C+程序的结构包含声明区、函数区两个部分,在任何一个区内都可以随时插入程序的注释。,【例1.1】从键盘输入圆的半径

2、,求圆的面积。 程序代码如下: /*ex1_1.cpp* #include #define PI 3.14159 float sum(float x); void main() float r,s;coutr;s=sum(r);cout“r=“r“ “s=“ “sendl; float sum(float x) return PI*x*x; ,书写格式,词法规则,符号常量,语言模型,1声明区 (1)文件包含,如例1.1中的#include; (2)宏定义,如例1.1中的#define PI 3.14159; (3)函数声明,如例1.1中的float sum(float x); (4)条件编译;

3、 (5)全局变量声明; (6)结构体等的定义; (7)类的定义。,2函数区 一个程序由一个主函数main()和若干个其他函数组成。程序的执行从main()函数开始。 每个函数都是由函数声明部分(函数首部)与函数体部分组成。 函数声明部分包括函数返回值类型、函数名、函数的形式参数。 函数体部分是用一对花括号 括起来的完成该函数所表达的功能的语句的集合。,一般来说,程序设计语言可用下面的模型描述:,程序设计语言的模型与人类的自然语言模型类似。,例1_1,1.2.2 C+程序的书写格式 C+程序的书写格式比较灵活,书写程序时可以任意换行。为了提高程序的可读性,C+程序的书写格式有如下约定: (1)一

4、般每行书写一条语句,并以分号(;)结束。 语句较短时,可以多条语句可书写在一行内。语句较长时,一条语句可写在多行上。 (2)分号是语句的结束符,表示一条语句的结束,(但函数说明行和声明区的多数语句后不用分号)。 (3)各语句按逻辑层次进行缩进对齐。 (4)可使用注释以增强程序的可读性。注释以“/*”开始,以“*/”结束;若为单行注释还可以“/”开始,占据一行。,例1_1,1.3 一个应用程序的开发过程,1.3.1 Visual C+ 6.0开发环境 Visual C+ 6.0开发环境 是一个集编辑、编译、链接、调试、运行于一体的集成环境,即在一个程序的控制下可以分步或一次性地完成编辑、编译、链

5、接、调试运行工作。,1.3.2 一个应用程序的开发过程,1启动Visual C+ 6.0开发环境,2创建工程项目,3创建C+源程序文件并添加到项目文件中,4编译、链接与运行程序,产生的文件类型 .cpp 源程序文件(编程者输入的程序代码)* .obj目标文件(编译后生成的二进制代码) .exe可执行文件 .dsp项目参数配置文件(project)* .dsw 工作区文件(workspace) *,菜单: Compile、 Build 与Execute Program,例1.1程序所建立的项目的运行结果如下: Input r:10 r=10 s= 314.159,1.4 C+的词法规则,单词有:

6、标识符、运算符、注释符、分隔符 标识符包括常量名、变量名、关键字、函数名、类型名等,1.4.1 C+的字符集,C+的字符集包括如下字符: (1)26个小写字母:az。 (2)26个大写字母:AZ。 (3)10个数字:09。 (4)标点和特殊字符:+ - * / , : ; ? ” | ! # % & ( ) 空格。 (5)空字符:ASCII码为0的字符,用作字符串的结束符。,程序的构成:字符单词语句 程序 词法规则即各种“单词”的构词规则,例1_1,1.4.2 C+的单词及其构词规则,标识符 用于命名 一个标识符中,可以出现的字符有字母、下划线和数字,但第一个字符不能是数字。如: Aa、ABC

7、、A_Y、ycx11、_name是合法标识符。而5xyz、m.x、!abc、x-y是非法标识符 标识符中字母的大小写是不同的。如:ABC和AbC是不同的标识符 定义标识符时尽可能让标识符有意义,便于阅读,即做到“见名知义”。 标识符用来命名C+程序中的常量、变量、函数、语句标号及类型定义符等。 被系统定义了的,具有特定含义的标识符关键字(又称保留字,见p10 表1-1 C+中的关键字) 在程序中代表操作数据且其值不能改变的量常量 在程序中代表操作数据且其值能改变的量变量,1.5 C+基本数据类型,表1-2 C+基本数据类型,实际上,常用的类型有short、 int、float、double、c

8、har unsigned short、 unsigned int,小数形式,6位数字;指数形式6位小数,1.6 常量与变量,1.6.1 常量 C+程序中有4种常量:整型常量、浮点型常量、字符常量和字符串常量。,数值型常量,1整型常量 整型常量有三种形式:十进制、八进制和十六进制。 十进制常量,如12、345都是合法的十进制常量。 八进制常量在数值前要加上一个零(0),如011、077都是合法的八进制常量。 十六进制常量的写法是在数值前加上一个零(0)和一个字母X(大小写均可),如0X11、0xF都是合法的十六进制常量,分别等于十进制数17和15。,2浮点型常量 浮点型常量又称实数型常量。分为十

9、进制数形式和指数形式两种表示方法。 (1)十进制数形式的浮点型常量的书写格式: . 其中小数点不能省略。如1.2345、1.0、1.、.12345均是合法的浮点型常量。,(2)指数形式的浮点型常量的书写格式: .E 其中,指数形式表示符“E”大小写均可,必须是整数。 如12E-3、0.1E2、.12345E6、0E0等均是合法的。,【例1.2】浮点型常量的运用。 程序代码如下: /*ex1_2.cpp* #include #include void main() float a,b,c;a=12.34567;b=.11183155;c=12.e2;cout“a=“setprecision(7)

10、a;cout“ta=“setiosflags(ios:scientific)aendl;cout“b=“b;cout“tc=“cendl; ,程序的运行结果如下: a=12.3457 a=1.234567e+001 b=1.118316e-001 c=1.200000e+003,设置精度,I/O流控制,指数形式输出,水平制表符,Float只有6位(小数,6位数字;指数形式6位小数),【例1.3】字符常量的运用。 /*ex1_3.cpp* #include #include void main() char a,b,c,d;a=A;b=B;c=a+3;d=; /*单引号*/coutatbtcen

11、dl;couthexint(a)tint(b)tint(c)endl;coutdendl; ,程序的运行结果如下: A B D 41 42 44 ,3字符常量 字符常量是一个用单引号括起来的一个字符。 字符常量具有整数值,其值是该字符的ASCII码。,置基数为16,强制转换为int类型,4字符串常量 字符串常量是用双引号括起来的若干个字符组成的字符序列。如:“a student“ 注意如下几个字符串: “双引号字符串,“空字符串,“ “空格字符串。,字符常量与字符串常量是不同的,表现在: (1)表示形式不同。单引号,双引号。 (2)存放不同。前者存放在字符变量中,后者存放在字符数组或字符指针指

12、定的位置。如,char c=A, s5=“ABCD“; (3)存放字符串常量时系统会自动加一个结束符。如A与“A”不同。 A占1个字节;“A”占2个字节,因为自动加一个结束符0。 (4)对它们进行的运算也不同。字符与字符、字符与整数间可作加减运算;而字符串只能作连接运算。,【例1.4】字符串常量的运用。 程序代码如下: /*ex1_4.cpp* #include void main() char s110,s210;couts1s2;couts1ts2endl; ,程序的运行结果如下: Input 2 Words,Please:Beijing Changsha Beijing Changsha

13、,5符号常量 符号常量是一种用来替代常量(前面讨论的4种常量)的标识符。 使用符号常量的意义: (1)增强程序的可读性。标识符可以定义得能“见名思义”,如可用PI表示圆周率,可用MAX_ID表示最大编号。 (2)书写时不易出错。有的常量直接书写很长,容易出错,如圆周率3.141 592 6用PI代之,既简单又不容易出错。 (3)修改程序方便。 定义符号常量:#define ,例1_1,1.6.2 变量 变量是在程序中可以改变值的量,变量有名字、类型和值三个要素。 1变量的定义 变量在使用前必须定义。格式如下: ;,例如:int a,b,c; a、b、c为整型变量; 2变量的数据类型 变量的基本

14、数据类型有:整型、浮点型和字符型。 变量的构造数据类型如数组、结构体、共用体、类。 3变量的存储类(四种:auto、register、static、extern )(改在第三章后学习),变量的值,3变量的存储类 变量的存储类定义变量的有效性范围,即作用域。C+中有4类:自动存储类(auto)、寄存器存储类(register)、静态存储类(static)和外部存储类(extern)。 static double x,y10; x、y是静态双精度变量,y是数组,(1)自动存储类 某一变量定义成自动存储类后,其作用域在定义它的函数体或分程序内,自动存储类变量只能定义在函数体或分程序内。变量的生存期在

15、作用域内,即执行完定义它的函数后,该变量即被释放。这类变量的安全性最好,在不同的函数中可以定义相同名字的变量,互不影响。在函数体内定义自动存储类变量时可以省去说明符auto。前面程序中定义的变量都省去了存储类说明符auto,它们都是自动存储类变量。,(2)寄存器存储类 寄存器存储类的变量与自动存储类的变量有相同的作用域和生存期。定义这类变量必须加存储类说明符register,并且只能定义在函数体或分程序内。这类变量有可能被存放在CPU的空闲通用寄存器中,当CPU中没有空闲通用寄存器时,当作自动存储类变量。一旦变量存入CPU的寄存器中,则变量的访问效率将大大提高,这是因为访问内存比访问CPU寄存

16、器花的时间长得多。,(3)静态存储类 静态存储类分为内部静态存储类和外部静态存储类。内部静态存储类变量定义在函数体或分程序内,其作用域在定义它(们)的函数体或分程序内。而外部静态存储类变量定义在函数体或分程序外,其作用域在定义它(们)的文件内,可见两者的作用域是不同的。 内部静态存储类和外部静态存储类变量有相同的生存期,都被存放在内存的静态区域,静态变量在程序结束时才释放内存。 要定义静态存储类变量,必须加存储类说明符static。,(4)外部存储类 外部存储类变量的作用域是整个程序,包含该程序的各个文件。生存期是整个程序,在程序结束时才释放内存。,表1-3 各种存储类特性的比较,存 储 类

17、别,自动类,寄存器类,内部静态类,外部静态类,静态类,外部类,或分程序内,在定义它的文件内,程序的各个文件,程序结束,前有效,离开定义体,即消失,存取速度快,安全性好,在定义它的函数体,安全性差,同自动类,作 用 域,生 存 期,其 他,外部存储类变量可以定义在函数体内、外,定义在函数体外时可以不加存储类说明符,但在说明一个外部存储类变量时,必须加存储类说明符extern。有如下两种情况要在引用外部存储类变量前,对其进行说明。 在一个文件中,在定义前引用外部存储类变量必须说明。 在多个文件的程序中,在一个文件中定义,在另一个文件中引用,引用前要说明。,【例1.5】定义在前、引用在后的外部存储类

18、变量(输出结果与例1.4类似)。 程序代码如下: /*ex1_5.cpp* #include char s110,s210; void main() couts1s2;couts1ts2endl; ,【例1.6】定义在后、引用在前的外部存储类变量(输出结果与例1.4类似)。 程序代码如下: /*ex1_6.cpp* #include void main() extern char s110,s210;/说明外部存储类变量couts1s2;couts1ts2endl; char s110,s210;,4变量的值 变量的值可来自于: 程序中使用赋值语句赋值;如:x=5;y=x; 输入值;如: ci

19、nx; 变量初始化在定义变量时对变量赋初值: =,=,;,下面都是一些合法的定义: int a=1,b=2,c=3; static char xyz=A,buffer10=“Hello“; double a5=1.12345, 2.23456, 3.34567, 4.45678, 5.56789 float s=1+2+3;,1.7 运算符与表达式,C+的表达式包括算术表达式、关系表达式、逻辑表达式、赋值表达式、条件表达式和逗号表达式。 1.7.1 算术运算符与算术表达式 1算术运算符 算术运算符有: (1)单目运算符:-(取负)、+(增1)、-(减1)。 (2)双目运算符:+(加)、-(减)

20、、*(乘)、/(除)、%(取余)。 优先级: 单目高于双目; * 、/ 、 %高于+ 、- 前缀运算(+和 - )与后缀运算(+和 - ):单独使用,效果一样;与其他运算混合使用,产生的结果不一样。,【例1.7】前缀运算表达式的运用。 程序代码如下: /*ex1_7.cpp* #include void main() int i=0;int a;a=+i;cout“a=“a“ i=“iendl; 程序的运行结果如下:a=1 i=1,【例1.8】后缀运算表达式的运用。 程序代码如下: /*ex1_8.cpp* #include void main() int i=0;int b;b=i+;cou

21、t“b=“b“ i=“iendl; 程序的运行结果如下:b=0 i=1,取余运算是求两个整型数相除的余数,只能用于两个整型数的运算。用下面的公式:余数=被除数-商除数 例如: 5%3的值是2 注意:5%-3的值是2,-5%3的值是-2。 【例1.9】取余运算。 /*ex1_9.cpp* #include void main() int a,b;a=5%-3;b=-5%3;cout“a=“a“tb=“bendl; ,程序的运行结果如下:a=2 b=-2,2算术表达式 算术表达式是把常量、变量、函数等用算术运算符连接起来的有意义的式子。 算术表达式有整型和浮点型两类,由表达式中的参与运算的常量、变

22、量、函数共同确定。 当表达式中参与运算的对象的类型不一致时:编译系统会自动进行类型转换;程序中可使用强制类型转换。,1.7.2 关系运算符与关系表达式 1关系运算符 (大于)=(大于等于)0 关系表达式的运算结果:成立或不成立,分别用整型1和0表示。 它在C+程序中通常用作为判断条件。 如:if (x+y0) then ,【例1.10】关系表达式的运用。 程序代码如下: /*ex1_10.cpp* #include #define EPS 1.0E-16 void main() double a,b; int c;a=5.0;b=EPS;c=a+ba;cout“a=“a“tb=“b“tc=“c

23、endl; 程序的运行结果如下: a=5 b=1e-016 c=0 试将EPS 改成1.0E-15,c的值会是多少?,double仅15位有效数字,1.7.3 逻辑运算符与逻辑表达式 1逻辑运算符 ! 逻辑求反(又称逻辑非,单目运算符) & 逻辑与(双目运算符) | 逻辑或(双目运算符) 运算规则 逻辑运算符的优先级从高到低依次是: !、&、|。,2逻辑表达式 逻辑表达式是由逻辑运算符与操作数组成的式子,其运算结果为1(表示真,成立)或0(表示假,不成立)。 参与逻辑运算的操作数一般是关系表达式,如:x0 & y0 也可以是逻辑表达式、算术表达式,见下例。,【例1.11】逻辑表达式的运用。 /

24、*ex1_11.cpp* #include void main() int a,b,c,d,e;a=5;b=0;c=!b;d=a 程序的运行结果如下: a=5 b=0 c=1 d=0 e=1,C+规定:逻辑表达式中非0的操作数为真,0操作数为假。,逻辑与前为假则不算后面,结果为0;逻辑或前为真则不算后面,结果为1;,1.7.4 位运算符与位运算表达式 位运算是二进制运算。C+有两类位运算符:逻辑位运算符和移位运算符。由位运算符与操作数组成的表达式称为位运算表达式。位运算表达式的值是整型。1逻辑位运算符 逻辑位运算符有: :按位求反(单目运算符) &:按位与(双目运算符) :按位异或(双目运算符

25、) |:按位或(双目运算符),赋值运算,逻辑位运算符的优先级从高到低依次是:、&、| 按位求反是指将操作数变成二进制数(操作数所占二进制位数与操作数的类型有关),将该二进制数的每位由1变0,由0变1。如对于下面的32位二进制数整数:0000 0000 0000 0000 0000 0000 0000 1010 1111 1111 1111 1111 1111 1111 1111 0101,按位与是指将两个操作数均化为二进制数,从低位开始,对应位相与。只有4种情况:1与1取1,1与0取0,0与1取0,0与0取0。例如:0000 0000 0000 0000 0000 0000 0000 1010

26、 &0000 0000 0000 0000 0000 0000 1111 11010000 0000 0000 0000 0000 0000 0000 1000,按位异或是指将两个操作数均化为二进制数,从低位开始,对应位相异或。只有4种情况:1异或1取0,1异或0取1,0异或1取1,0异或0取0。即不考虑进位的加法(对应位相同取0,对应位不同取1)。例如:0000 0000 0000 0000 0000 0000 0000 1010 0000 0000 0000 0000 0000 0000 1111 11010000 0000 0000 0000 0000 0000 1111 0111,按位

27、或是指将两个操作数均化为二进制数,从低位开始,对应位相或。只有4种情况:1或1取1,1或0取1,0或1取1,0或0取0。例如:0000 0000 0000 0000 0000 0000 0000 1010 | 0000 0000 0000 0000 0000 0000 1111 11010000 0000 0000 0000 0000 0000 1111 1111,2移位运算符 移位运算符有: :右移位运算符 或:,右移位操作是将操作数化成二进制数,将操作数右移指定位数,移出的二进制位丢弃,左边补0或符号位(根据编译器决定)。 左移位操作是将操作数化成二进制数,将操作数左移指定位数,移出的二进

28、制位丢弃,右边补0。,int x; x=-1; x=x1; coutxendl; 结果为-1,int x; x=1; x=x1; coutxendl; 结果为0,【例1.12】逻辑位运算和移位运算。 程序代码如下: #include void main() int a,b;a=7;b=2;cout2=“2)2=“2)endl; ,程序的运行结果: a=7 a=-8 a&b=2 ab=5 a|b=7 a2=1 a2=3,1.7.5 赋值运算符与赋值表达式 1赋值运算符 (1)=:基本赋值运算符 (2)+=:加赋值运算符 如:a+=b等价于a=a+b (3)-=:减赋值运算符 如:a-=b等价于a

29、=a-b (4)*=:乘赋值运算符 如:a*=b等价于a=a*b (5)/=:除赋值运算符 如:a/=b等价于a=a/b (6)%=:取余赋值运算符 如:a%=b等价于a=a%b 2赋值表达式 = 先计算右边表达式的值,后赋给左边变量。 =;形成赋值表达式语句3注意 先右后左结合,如a=b=c=1;使得c赋值为1,b赋值为1,a赋值为1。 赋值时类型自动转换,可能会丢失精度。如int x; x=1.6;x值为1,【例1.13】赋值表达式。 #include void main() int a=1;cout“a=“aendl;cout“(a=2)=“(a=2)endl;cout“a=“aendl

30、; 程序的运行结果如下: a=1 (a=2)=2 a=2,1.7.6 三目运算符与三目条件表达式 在C+中只有一个三目运算符?:,使用该组运算符组成条件表达式,格式如下: ?: 先计算,当非0时,条件表达式取的值,否则取的值。 条件表达式的功能可以解释成一个简单的条件语句(参见第2章)。 三目运算符 ?: 的结合性是从右至左。,【例1.14】三目条件表达式的运用。程序代码如下: /*ex1_14.cpp* #include void main() int a=1,b=2,c=3;coutb?b-:+a=“b?b-:+a)b?+a:+b=“b?+a:+b)b?a:bc?b:c=“b?a:bc?b

31、:c)endl; ,运行结果: ab?b-:+a = 2c+=ab?+a:+b = 6ab?a:bc?b:c = 6,1.7.7 逗号运算符与逗号表达式 逗号运算符为双目运算符,它的优先级最低,结合性是从左至右。逗号运算符用来连接两个或两个以上的表达式,形成逗号表达式。 计算逗号表达式时,从左至右依次计算各个表达式,逗号表达式的值取最后一个表达式的值。多用在for循环语句的for关键字后的圆括号内,圆括号内由分号分隔的表达式可以是逗号表达式。,【例1.15】逗号表达式的运用。 #include void main() int a=1, b=2, c=3;cout“a=“a“tb=“b“tc=“

32、cendl;c=(a=10, b=a*2, b*2);cout“a=“a“tb=“b“tc=“cendl;cout“a,b,c,c*3= “(a,b,c,c*3)endl; 程序的运行结果如下: a=1 b=2 c=3 a=10 b=20 c=40 a,b,c,c*3 = 120,1.7.8 指针运算 指针运算实际上是地址运算。指针运算有两个运算符: &:取地址运算 *:取内容运算 都是单目运算符,作用于操作数的左边,结合性是从右至左。 运算符 & 后跟变量名或数组元素,后面不能跟常量、表达式或数组名。功能是取变量的地址。&a、&b分别表示取变量a、b的地址值。 运算符 * 后跟一个地址值(包

33、括地址表达式值),表示取一个地址中存放的数据。指针运算将在后续章节中详细介绍。,1.7.9 运算符的优先级和结合性 运算符的优先级和结合性是确定表达式计算顺序的重要依据。 最常用的几类运算符的优先级(由高到底): 算术运算符关系运算符逻辑运算符赋值运算符 单目运算符双目运算符三目运算符赋值运算符 详细情况见P26表1-4,给出了C+中常用运算符的功能、优先级和结合性。,P28【例1.16】运算符的优先级和结合性。 #include void main() int x,y,z;x=!-5+312;y=x-(-1);cout“x=“x“ty=“yendl;z=xy?x-y?x:y:x*y;cout

34、“sizeof(int)=“sizeof(int)“tsizeof(z)=“sizeof(z)endl;cout“x=“x“ty=“y“tz=“zendl; ,程序的运行结果如下: x=6 y=8 sizeof(int)=4 sizeof(z)=4 x=6 y=7 z=6,1.7.10 类型转换 自动(隐含)转换和强制转换。 1、自动转换 如:int ival=0;ival=3.541+3; 则计算过程为:3.541+3.0(两者都是double型)6.541 (double型) 6( int型) ival获得值6 (1)不同类型数据运算,之前会进行下面的自动转换: char型和short型自

35、动转换为int型;unsigned char型和unsigned short型自动转换为unsigned int型;float型自动转换为double型。 例:char x=1;short y=2;coutsizeof(x+y); 得到结果为4,(2)在各类数据进行混合运算时,从低(“短”)向高(“长”)转换系统自动将参与运算的各数据转换为同一种,即它们之间数据类型最高(“长”)的那种。 在C+中,数据类型从低到高的类型顺序为: int (short,char)unsigned(unsigned short,unsigned char)longdouble(float) (3)在赋值表达式中,

36、系统自动将赋值运算符右边的表达式的数据类型转换为左边变量的类型。在这种转换中,从低类型向高类型的转换是保值的,从高类型向低类型的转换是不保值的(即转换有数据精度损失)。,2、强制转换格式是: () 使表达式的类型强制转换成说明的数据类型。强制转换可能是不保值的。强制转换是一次性的,例如: int x=1,y=2,z=3; coutsizeof(double)(x*y*z); 第二行语句中,表达式强制为double型,下次再出现表达式x*y*z时,又是整型。,【例1.17】类型转换。 #include void main() int x=1,y=2,z=3;double x1=1.234567;

37、double y1;cout“混合表达式占用字节数:“sizeof(x+y+z+x1)endl;cout“赋值表达式占用字节数:“sizeof(y1=x+y+z+A)endl;cout“强制成int型占用字节数:“sizeof(int)(x1*2)endl;cout“x1*2= “x1*2endl;cout“sizeof(x1*2)=“sizeof(x1*2)endl;cout“强制成int型后,x1*2=“(int)(x1*2)endl; ,程序的运行结果如下: 混合表达式占用字节数:8 赋值表达式占用字节数:8 强制成int型占用字节数:4 x1*2=2.46913 sizeof(x1*2)=8 强制成int型后,x1*2=2,本章作业,习题一 实践教程P139P144 (都做在书上),

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报