收藏 分享(赏)

第六章 程序设计基础.ppt

上传人:dzzj200808 文档编号:3224435 上传时间:2018-10-07 格式:PPT 页数:84 大小:839.50KB
下载 相关 举报
第六章 程序设计基础.ppt_第1页
第1页 / 共84页
第六章 程序设计基础.ppt_第2页
第2页 / 共84页
第六章 程序设计基础.ppt_第3页
第3页 / 共84页
第六章 程序设计基础.ppt_第4页
第4页 / 共84页
第六章 程序设计基础.ppt_第5页
第5页 / 共84页
点击查看更多>>
资源描述

1、第6章 VFP程序设计基础,2007年4,教学 内 容 程序文件的建立与运行 程序的控制结构 模块化程序设计 教学重点与难点 模块化程序设计 教学方法 教师教授结合学生上机实验,程序设计概述,程序和程序设计的概念 程序就是计算机能够分析执行的命令序列的集合 程序设计就是计算机用户将解决某一实际问题所用的命令按一定的逻辑顺序编制成程序,并以文件的形式存放于磁盘的过程,6.1 创建、修改和运行应用程序,一、创建应用程序 菜单: “文件”“新建”“程序” 项目管理器:“代码”“程序” 命令: MODIFY COMMAND 文件名默认扩展名为PRG或MODIFY FILE 程序文件名.PRG扩展名不可

2、省略 二、修改程序 MODIFY COMMAND 文件名 三、运行程序 DO 文件名 程序文件的扩展名:.prg,程序编辑窗口,“打开”对话框,6.2 VFP基本语法结构,VFP的程序控制有三类结构:顺序结构、分支结构、循环结构一、顺序结构顺序结构由语句行组成,程序执行时,按程序中的语句顺序执行。,顺序结构程序. Clear Use 教师 Accept “请输入待查人编号:” to bh Loca for 编号=bh Disp Use retu,三条输入命令的异同,ACCEPT命令只能接受字符型数据,不需定界符,输入完毕按回车键结束;,WAIT命令只能输入单个字符,且不需定界符,输入完毕不需按

3、回车键;,INPUT命令可接受数值型、字符型、逻辑型、日期型和日期时间型数据,数据形式可以是常量、变量、函数和表达式,如果是字符串,需用定界符,输入完毕按回车键结束。,例: clear use rsk accept “输入姓名:“ to xm &输入姓名时,不要加界限符 input “输入姓名:“ to xm &输入姓名时,必须加界限符 locate for 姓名=xm disp例:CLEAR USE RSK INPUT “输入基本工资:“ TO GZ LOCATE FOR 基本工资=GZ DISP例: CLEAR USE RSK INPUT “输入工作日期:“ TO RQ &例:输入1972

4、/04/30或ctod(“04/30/72“) LOCATE FOR 工作日期=RQ DISP USE,例: clear use rsk input “婚否:“ to hf list for 婚否 =hf use例7:暂停程序的运行,便于阅读显示。 clear use rsk list for 基本工资120 wait list for 性别=“男“ wait window at 10,10 list for 工作日期1970/01/01 use例8: 输入信息,控制程序的执行方向。 clear wait “请输入班级号:“ to x list use,1、基本的输出命令 ? 或 ? ? 和

5、?命令都是输出指定的数据。?是接着上一行数据输出。 行,列 SAY 数据 例: 10,10 SAY “在主窗口第10行第10列显示数据” CLEAR 在命令窗口中执行该命令,将清除主窗口。,格式化输入输出命令 格式: SAY GET DEFAULT RANGE , VALID 功能:在屏幕上指定行、列位置输出指定表达式的值,并且(或者)获得所指定变量的值。,例定位输出命令编程举例。将人事数据表打开,新增加一条记录部分字段内容,增加完成后在浏览窗口显示数据表记录内容,关闭浏览窗口,屏幕出现等待信息窗口,5秒后,等待信息窗口关闭,清屏并关闭数据表,程序结束。该程序如下: CLEAR USE rsb

6、 APPEND BLANK 3,8 SAY “请输入新职工信息:“ 4,8 SAY “姓名:“ GET 姓名 5,8 SAY “性别:“ GET 性别 VALID 性别=“男“ .or. 性别=“女“ 6,8 SAY “基本工资:“ GET 基本工资 RANGE 500,2500 READ BROWSE WAIT “程序将在8秒后关闭。“ WINDOWS AT 18,8 TIMEOUT 5 USE CLEAR RETURN,2、程序交互命令 WAIT WINDOW 提示信息 TO 内存变量 例: WAIT WINDOW “Input A:” TO n INPUT 提示信息 TO 内存变量 例:

7、 INPUT “Input A:” TO n 注:若输入字符型数据,则应在输入时加上引号。 ACCEPT 提示信息 TO 内存变量 注:只能接受字符型数据。输入时不加引号。,3、程序举例 例1:显示学生表中任一学生的姓名。 程序: clear use xs input “输入记录号: ” to n go n ? xm use,【例】 编写程序文件myprog2.prg,显示数据表XSDA.DBF指定日期后出生的学生学号、姓名、出生日期。 open database school use xsda in 0 clear input “请输入日期:“ to cxrq select 学号,姓名,出生

8、日期 from xsda where 出生日期cxrq nowait close database return,例2:交换两个变量a和b的值。 程序: input “请输入a: “ to a input “请输入b: “ to b c=a a=b b=c ? “交换后的a和b的值为: ” ,a,b,【例】从键盘输入两个任意正数,编程求以两数为边长的长方形面积。SET TALK OFF CLEAR INPUT “长方形一边的长为:” TO A INPUT “长方形另一边的长为:” TO B S=A*B ? “长方形的面积为:” , SSET TALK ONRETURN,例3:输出学生表的记录总

9、数,并将姓名为“高山”的学号改为“990102”。 程序: use xs ? reccount() 或 count to x? x locate for xm= “高山“ replace xh with “990102“ display use,例3:编写在学生成绩表中查找某学生指定课程成绩的程序 程序: CLEAR SET TALK OFF USE xscj INPUT “请输入该学生的学号” TO xh INPUT “请输入该学生的课程号” TO kch LOCATE FOR 学号=xh.AND.课程号=kch DISP 考试成绩,学号,课程号,学期,补考成绩 USE SET TALK O

10、N CANCEL,例如:鸡兔同笼,已知鸡兔的总头数h,总脚数为f,求鸡兔各有多少只? 鸡兔同笼问题的算法为: 鸡的头数为x=(4*h-f)/2 兔的总头数y=(f-2*h)/2 编程如下: CLEAR h=16 f=40 X=(4*h-f)/2 Y=(f-2*h)/2 ?”共有鸡”,x ?”共有兔”,y CANCEL,二、分支结构条件分支根据条件的测试结果执行不同的操作。VFP中有两条实现条件分支的命令: IFELSEENDIF DO CASEENDCASE,1. IFELSEENDIF 语句格式:IF 条件表达式命令组1 ELSE命令组2 ENDIF说明: 当条件表达式结果为.T.时,执行命

11、令组1;否则,执行命令组2。 通常用于只有两个分支的情况。,设计一个查询程序,希望当待查人不存在时有信息显示. Clear Use 教师 Accept “请输入待查人姓名:” to xm Loca for 编号=xm If .not.eof() Disp Else ?”查无此人” Endif Use retu,例:根据变量x的奇偶性决定变量y的值。x为奇数,y为1;x为偶数,y为2。 程序片段:if x%2=1y=1elsey=2endif,例:铁路托运行李,按规定每张客票托运行李不超过50公斤时,每公斤收费0.25元;如果超过50公斤,超过部分每公斤收费0.45元。 *计算铁路托运行李费程序

12、 W为行李重量 P为运费 input “请输入行李重量:“ to w if w=50p=0.25*w elsep=50*0.25+(w-50)*0.45 endif ?“行李重量为:“,w ?“应付运费为:“,p,2. DO CASEENDCASE 语句语句格式:DO CASECASE 条件表达式1命令组1CASE 条件表达式2命令组2 OTHERWISE其他命令组 ENDCASE,通常,用于多个分支的情况。,例1.求一元二次方程ax2+bx+c=0的根。(设a不等于0) input “INPUT A: “ to a input “INPUT B: “ to b input “INPUT C:

13、 “ to c d = b*b- 4*a*c do casecase d0wait windows “方程有两个不等的实数根:“case d=0wait windows “方程有两个相等的实数根:“case d0wait windows “方程有两个复数根:“ endcase,例2. 根据学生成绩评出“优秀”、“良好”、“中”、“及格”和“不及格”。 程序片段: DO CASECASE CJ=90? ”优秀”CASE CJ=80? ”良好”CASE CJ=70? ”中等”CASE CJ=60? ”及格”OTHERWISE? ”不及格” ENDCASE,考试成绩=90,N,成绩=80.AND.9

14、0,成绩=70,优秀,良好,中等,Y,Y,N,Y,OTHERWISE,不及格,ENDCASE后面的语句,例3 输入一个数字(06),用中英文显示星期几.,CLEAR INPUT “输入数字(06):” TO N DO CASE CASE N=0 M=“星期日(Sunday)” CASE N=1 M=“星期一(Monday)” CASE N=2 M=“星期二(Tuesday)” CASE N=3 M=“星期三(Wednesday)” CASE N=4 M=“星期四(Thursday)” CASE N=5 M=“星期五(Friday)” CASE N=6 M=“星期六(Saturday)” END

15、CASE 16,26 SAY M,设计一个程序,使用do case语句在教师文件中按姓名或编号查询,Clea Use Wait “请选择按姓名或按编号查询(x/b)” to xz Do case Case xz$”Xx” Accept “请输入待查人姓名:” to xm Locate for 姓名=xm Case xz$”bB” Accept “”请输入待查人编号: to bh Locate for 编号=bh Otherwise Wait “查询选择回答错!按任意键退出” wind Retu Endcase Display Use retu,三、循环结构循环能使得一组语句组重复执行若干次,其

16、中被重复执行的一组语句称为循环体。在VFP中,为了便于进行数据处理,设置了多种形式的循环控制语句,主要有三种循环结构: FORENDFOR DO WHILEENDDO SCANENDSCAN,1. FORENDFOR 语句格式: FOR 循环变量=初值 TO 终值 STEP 步长值循环体 ENDFOR 或 NEXT 执行过程: 将初值赋给循环变量; 判断循环变量的值是否超出终值; 若超出终值,结束循环,执行NEXT后命令; 若未超出终值,执行循环体; 循环变量=循环变量+步长值; 转到,重复上述步骤。,当步长为正时,即为大于 当步长为负时,即为小于,例1 计算1100之间所有的奇数和。程序:C

17、LEAR S=0FOR I=1 TO 100 STEP 2S=S+IENDFOR? S,例2 计算10!。程序1: CLEAR P=1 FOR I=1 TO 10 P=P*I ENDFOR ?P,例:求1!+2!+3!+ +20!的值。s=0t=1for n=1 to 20t=t*ns=s+tendfor ?“s=“,s cancel,程序2:CLEARP=1FOR I=10 TO 1 STEP -1P=P*IENDFOR?P,例3 统计教师表中的男、女教师人数。 程序:USE JSSTORE 0 TO M,WFOR I=1 TO RECCOUNT()IF XB=“男”M=M+1 ELSEW=

18、W+1ENDIFSKIP ENDFOR ?M,W USE,用双重循环打印九九乘法表,即: 11=1,12=2,19=9 21=2,22=4,29=1891=9,92=18,99=81 问题分析:这是一个有9个行、9个列数据项的矩阵,可以用双重循环解决。外循环用于控制各个行,内循环用于控制每一行的各个列项,一行输出完毕以后,换行输出下一行各个列的数据项。程序如下:,*打印乘法九九表。 CLEAR FOR a=1 TO 9FOR b=1 TO 9p=a*b?STR(a,1)+“+STR(b,1)+“=“+STR(p,2)+“ “ENDFOR ? ENDFOR RETURN,说明: FOR语句主要用

19、于给定次数的循环。 循环开始语句为FOR,结束语句为ENDFOR。 通常,在循环体中不要改变循环变量的值,它将改变循环次数。 例: FOR I=1 TO 10? II=I+1 ENDFOR,10) 运行XY.PRG程序后,将在屏幕上显示如下乘法表: 1) 1 2) 2 4 3) 3 6 9 4) 4 8 12 16 5) 5 10 15 20 25 6) 6 12 18 24 30 36 7) 7 14 21 28 35 42 49 8) 8 16 24 32 40 48 56 64 9) 9 18 27 36 45 54 63 72 81,SET TALK OFF CLEAR FOR J=1

20、 TO 9 ?STR(J,2)+) FOR 14 ? 15 ENDFOR ? ENDFOR RETURN,14 、FOR K=1 TO J 15、STR(J*k,6),2. DO WHILEENDDO 语句格式:DO WHILE 条件表达式循环体ENDDO说明: 当循环次数未知,需根据某一条件决定是否循环时使用。 循环体中一般须存在能改变循环条件的语句,用于正常退出循环。,DO WHILE,方法一: SET TALK OFF S=0 N=1 DO WHILE N=100S=S+NN=N+1 ENDDO ?S,方法二: Set talk off S=0 FOR N=1 TO 100S=S+N E

21、NDFOR ?S,例1:求1至100之间的整数和,例:求1至100之间的偶数和 方法一: 方法二: SET TALK OFF SET TALK OFF S=0 S=0 N=1 DO WHILE N=100 FOR N=0 TO 100 STEP 2IF MOD(N,2)=0 S=S+NS=S+N ENDFORENDIFN=N+1 ?S ENDDO ?S,例:用循环语句打印5个“Visual FoxPro“字符串。 clear X=1 Do while x=5?“Visual FoxPro“x=x+1 ENDDO CANCEL,例 计算10!。 程序: N=1 P=1 DO WHILE N=10

22、P=P*NN=N+1 ENDDO ?P,例如: Store “abcdef” to c P=space(0) Do while len(c)0P=left(c,1)+Pc=substr(c,2) Enddo ?p,说明: 对于任意给定的字符串反序显示 如:“abcdef”变成“fedcba”,循环结构举例: 计算1+2+3+100的和,CLEAR sum=0 i=1 DO WHILE i=100 sum=sum+I i=i+1 ENDDO ?”sum=“,sum CANCEL,sum=sum+I i=i+1,给出计算结果,程序结束,开始,sum=0,i=1,i=100,例6-14:有一张厚0.

23、5毫米,面积足够大的纸,将它不断地对折。问对折多少次后,其厚度可达珠穆朗玛峰的高度(8848米)。,程序清单: n=0 h=0.5 do while h8848000n=n+1h=2*h enddo ?“对折的次数:“,n ?“此时的H为:“,h cancel,问题分析: 0.5,1,2,4,8,16,32,64,128,256,512,h=0.5 h=2*h=1 h=2*h=2 h=2*h=4n=0 n=n+1=1 n=n+1=2 n=n+1=3,例:对RSK.DBF增加工资,要求:已婚者基本工资增加20元,未婚者不变。 clear use rsk do while .not. eof()i

24、f 婚否 replace 基本工资 with 基本工资+20endifskip enddo use,例:对RSK.DBF增加工资,要求:1970年以前(含70年)出生的人增资50元,1970年以后出生的人增资30元。 clear use rsk do while .not. eof()if 工作日期=1970/12/31replace 基本工资 with 基本工资+50elsereplace 基本工资 with 基本工资+30endifskip enddo list use,例:对RSK.DBF增加工资,要求:高级职称每人增加50元;中级职称每人增加30元,初级职称每人增加20元。 clear

25、 use rsk do while .not. eof()if 职称=“教授“.OR.职称=“副教授“replace 基本工资 with 基本工资+50elseif 职称=“讲师“replace 基本工资 with 基本工资+30elsereplace 基本工资 with 基本工资+20endif endifskip enddo use,1、完善程序:下列程序用来求0100偶数之和,请将它写完整 STORE 0 TO N,S DO WHILE .T.IF N100_ ELSES=S+NENDIFN=N+2 ENDDO,2、运行下列程序以后,显示运行的前二次结果: SET TALK OFF S“

26、ABCDEF” N=LEN(S) K=1 DO WHILE K=N?SUBS(S,K,N-K)K=K+1 ENDDO 结果:、,3、下列程序的功能是求100以内的偶数之和及奇数之和,根据要求完善程序。,P=0 Q=0 FOR N=1 TO 100IF_P=P+NELSE_ENDIF _ ?“偶数和为”,P ?“奇数和为”,Q,4、完善下列程序:以实现通过字符串变量操作竖向显示“天长地久”、横向显示“地久天长”的功能。程序清单如下:SET TALK OFFSTORE “天长地久” TO chCLEARN=1DO WHILE N8?_N=N+2ENDDO?_?SUBSTR(ch,1,4),3. S

27、CANENDSCAN 语句格式:SCAN NOOPTIMIZE 范围 FOR 条件 WHILE 条件循环体ENDSCAN说明: 该语句主要使用于对表中记录进行处理 SCAN命令自动将记录指针移到下一条满足条件的记录,并执行循环体,例:给教师表中工龄20年以上的教师基本工资加100元,其余加50元。 程序: USE JS SCAN IF GL=20 REPLACE JBGZ WITH JBGZ+100 ELSE REPLACE JBGZ WITH JBGZ+50 ENDIF ENDSCAN USE,例:统计教师表中的男、女教师的人数。 程序: USE JS STORE 0 TO M,W SCAN

28、 FOR XB=“男” M=M+1 ENDSCAN W=RECCOUNT()-M ?M, W USE,4. EXIT命令与LOOP命令EXIT语句是退出语句。在循环体内,执行到它时,将退出循环,程序转到出口语句后执行。LOOP语句称为短路语句。在循环体内,执行到它时, 将跳过它与循环出口语句之间的所有命令,进入下一次循环。,例:求1100之间的非3的倍数的所有奇数和。 程序: S=0 FOR I=1 TO 100 STEP 2IF MOD(I,3)=0 LOOPENDIF S=S+I ENDFOR ?S,例:求10!。 程序: STORE 1 TO N,P DO WHILE .T. P=P*N

29、 N=N+1 IF N10 EXIT ENDIF ENDDO ?P,编程。打印如右图形。,程序1: clear for i= 1 to 5for j=1 to 7?”*”endfor? endfor,* * * * *,clear for i= 1 to 5for k=1 to 5-i?” ”endforfor j=1 to 7?”*”endfor? endfor,举例 例. 有一道趣味数学题:有30个人在一家小饭店用餐,其中有男人、女人和小孩。每个男人花了3先令,每个女人花了2先令,每个小孩花了1先令,一共花去50先令。问男人、女人和小孩各有几人? 分析:设有男人、女人、小孩各x,y,z个。

30、 则 x+y+z=30 3x+2y+z=50 它是不定方程。应采用“穷举法”去试根。,CLEAR FOR X=1 TO 16 FOR Y=1 TO 24 Z=30-X-Y IF 3*X+2*Y+Z=50 ?X,Y,Z ENDIF ENDFOR ENDFOR,6.3 数 组(Array) 1. 将数据从表传送至数组 SCATTER COPY TO ARRAY SELECT-SQL 2. 将数据从数组传送至表 GATHER APPEND FROM ARRAY INSERT-SQL,数组实际上就是一组变量,它们有同样的名称,但有不同的下标,也可以叫编号,比如:a(1)、a(2)、a(3),这些变量叫

31、做数组的元素。 这些变量可以同一般变量一样使用,比如: a(1)=庄稼 replace 姓名 with a(1) 那么用数组有什么好处呢?当我们要对一组变量进行处理时,就会体现出它的好处了,比如我们想将某个数据表中连续的若干记录中某个字段的内容放入变量,如果不用数组程序就会是这样,显然这是很麻烦的,尤其需要的变量很多时,而最主要的是,如果变量的个数是不定的,那就几乎难以实现。,而用数组就可以解决问题,假设需要100个变量,程序就可以是这样:,而代表数组个数的100也可以用变量,即:,这样只要在每次定义数组个数前给 ac 不同的值就可以实现数组个数是可变的了。,二维数组 我们上面讲到的是一维数组

32、,即一个元素由一个下标来确定,那么二维数组就是由两个下标来确定一个元素,比如:a(1,1)、a(1,2)、a(1,2)、a(2,1)、a(2,2)。 二维数组有什么好处呢?比如还是上面的例子,但我们需要把“姓名”和“电话”都放到变量中,我们就可以这样来做:,如果不用二维数组而用一维数组,那做起来会很麻烦,不信您自己试试看,另外后面使用起来也很不方便。 实际上上面这个二维数组就相当于一个具有2列、100行的表,a(1,1) 是第一个人的姓名、a(1,2) 是第一个人的电话、a(2,1) 是第二个人的姓名、,使用起来非常直观。,程序设计中,一个应用程序常有若干功能,编制程序时,需要将其模块化。每个

33、模块完成不同功能。 一个模块常常是一个子程序。子程序是结构化程序设计的主要特点。子程序可以是一个个独立的程序、过程或用户自定义函数,最后把它们组装到主程序中。,6.4 过程和用户自定义函数(UDF),过程和函数可以将常用代码集中在一起,供应用程序在需要时调用。这样做提高了程序代码的可读性和可维护性,使您可以不必对程序进行多次修改,只变动一个地方就足够了。习惯上,过程是为完成某个操作而编写的代码,函数用来计算并返回一个值。但在VFP中,这二者区别并不大。VFP中定义过程和函数的语法如下所示:,附注 程序行开始的星号*说明该行是注释,另一个符号&可以使注释跟在程序编码行的后面。程序执行时,VFP

34、将忽略这些注释。可以将过程和函数保存在单独的程序文件中,也可放在一般程序的结尾。若将过程或函数放在单独的程序文件中,可以在应用程序中使用SET PROCEDURE TO命令访问它们。,在程序中可以使用DO命令调用过程,例如:DO myproc。在函数名后加上一对小括号可以调用函数,例如:myfunc( )。若要向过程或函数传递值,可以使用参数。我们可以向过程或函数传递多个参数,参数之间用逗号分开。例如,下面的过程有三个参数:日期、字符串和数字。 PROCEDURE myproc( dDate, cString, nTimesToPrint )FOR nCnt = 1 to nTimesToPr

35、int? DTOC(dDate) + “ “ + cString ;+ “ “ + STR(nCnt)ENDFOR ENDPROC 附注 cString后的分号 (;) 表示下一行是本行命令的继续行。 下面的代码将调用这个过程:DO myproc WITH DATE(), “Hello World“, 10函数默认的返回值是“真”(.T.),但可以使用 RETURN 命令返回任意值。例如,下面的函数返回比参数值晚两周的日期。 FUNCTION plus2weeks PARAMETERS dDate &定义函数的参数RETURN dDate + 14 ENDFUNC,一、用户自定义函数创建和调用

36、 用户自定义函数的创建 在项目管理器中创建 命令创建:MODIFY COMMAND 文件名 用户自定义函数的存储 存储于独立的程序中或一般程序的底部 存储于过程文件中 存储于数据库的存储过程中, 用户自定义函数的格式FUNCTION 函数名 PARAMETERS 形式参数 语句序列 RETURN 返回值 用户自定义函数的调用=函数名(实在参数值)或 ?函数名(实在参数值),例:定义一个函数NC(),当传递给一个06之间的数时,返回对应的星期几。,FUNCTION NCPARAMETER NCLEARDO CASECASE N=0M=“星期日(Sunday) “CASE N=1M=“星期一(Mo

37、nday) “CASE N=2M=“星期二(Tuesday) “CASE N=3M=“星期三( Wednesday) ”,CASE N=4M=“星期四(Thursday) “ CASE N=5M=“星期五(Friday) “ CASE N=6M=“星期六(Saturday) “ ENDCASE RETURN M,二. 过程的创建与调用 过程的创建、存储同用户自定义函数操作。 过程的格式PROCEDURE 过程名 PARAMETERS 形式参数 语句序列 RETURN 返回值 ENDPROC 过程的执行DO 过程名 WITH 实在参数 ,例:编制一个过程,实现加1功能。,程序: PROCEDUR

38、E PLUSPARAMETER XX=X+1?X ENDPROC,调用:DO PLUS WITH 4 或PLUS(4),说明:1、用户自定义函数与过程在本质上是相同的,使用时主要看方便性。2、系统默认过程调用按引用传递参数, 函数调用按值传递参数。 例:在上例中,如果 N=4,则 执行: DO PLUS WITH N 与 PLUS(N) 以后,N的结果不同。,三、子程序子程序的调用命令为:DO 子程序名 WITH 参数 子程序还可以调用子程序,VFP中子程序的嵌套最多128层。,例:x=3y=5s=0do area with x,y,s?s,procedure areaparameter m,n,s1s1=m*nreturn endpro,

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

当前位置:首页 > 高等教育 > 大学课件

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


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

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

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