第2章结构化程序设计_第1页
第2章结构化程序设计_第2页
第2章结构化程序设计_第3页
第2章结构化程序设计_第4页
第2章结构化程序设计_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第 2 章章 结构化程序设计 第一讲 重点:重点: 命令文件的建立与执行命令;常用的输入、输出命令 难点:难点: 带参数的命令文件的执行 教学目的:教学目的: 掌握命令文件的建立与执行命令;常用的输入、输出命令 教学方法和手段:教学方法和手段: 理论讲授、多媒体演示和实际操作相结合。 理论讲解主要以讲授为主,辅以设问、引导、启发、提问等教学方法。 演示主要以案例驱动教学方法为主,辅以设问、引导、启发、提问等教学方法。 学生上机操作以任务驱动教学方法为主。 教学过程:教学过程: 一、首先复习上次课的主要内容。 复习主要以提问、设问等方式进行。提问时使用具体的例子。 二、通过引论,导入新课。 2

2、.1.1 命令文件的建立与执行 1. 命令文件概念 程序是为了完成一定任务,由若干条可执行的命令或语句组成的序列。而用于存储这些由命令组成 的文件,即为命令文件,又称为程序文件。命令文件的扩展名为 prg。 2. 命令文件的建立 建立程序文件可以用任何一种字处理的文本编辑器进行(如 Windows 自带的记事本) 。 下面我们将介绍如何调用 VFP 内嵌的编辑器建立程序文件。 格式:Modify command |? Modify file |? 功能:进入程序编辑器,创建程序文件。 说明: 可选项|?用于设置要编辑的文件名。 在文件名前可指明路径,若未指明则默认路径为当前驱动器的当前目录。如

3、执行命令 Modify command c:shuexam1,程序文件 exam1.prg 储存在 c 盘的子目录 shu 下,而执行 Modify file exam2.prg 后,程序文件 exam2.prg 将储存在当前驱动器的当前目录中。 例 1 编写程序 exam1.prg,计算表达式 a*b,ab 的值,并在屏幕上显示出结果,其中 a 的值为 3,b 的值为 5。 程序内容如下: set talk off a=3 b=5 ? a*b ? ab set talk on 在命令窗口中输入 modify command exam1 或输入 modify file exam1.prg 即可

4、进入到程序编辑窗口, 输入程序内容后,按下 Ctrl+w 组合键保存,就将 exam1.prg 程序存入到磁盘。我们就在计算机上建立了 一个 exam1.prg 程序文件。 3. 程序文件的执行 当一个程序文件建立后就可以运行了。运行 VFP 程序的命令格式如下: 格式:Do with 功能:执行指定的程序。 说明: 若是省略程序文件的扩展名,则系统默认其扩展名为 prg。 命令中的可选项with用于执行带参数的程序。 在某一个程序文件中调用其他命令文件作为子程序也使用 Do 语句。 创建程序命令:modify command exam2 程序内容如下: clear set talk off

5、use student list for 总分320 fields 学号,姓名,总分 off use set talk on 建立该程序后,执行命令为:do exam2 则屏幕上将会显示出: 学号 姓名 总分 韩伟娟 339.0 例 3 编写程序 exam3 求三角形的面积。 创建程序命令:modify command exam3 程序内容如下: parameters a,b &定义了形式参数 a,b area=(a*b)/2 ? 三角形面积为:,area 建好 exam3.prg 文件后,执行下述命令便可求出一个三角形面积。 r=3 do exam3 with r,2*r 程序运行结果如下:

6、 三角形面积为:9 在 exam3 程序中,parameters 语句后跟参数表,这些参数称为形式参数。 执行命令中列在 with 后的参数称为实在参数。实在参数和形式参数的个数、类型与排列次序必须完 全相匹配。 2.1.2 常用命令 关于表操作的基本命令,在前面我们已经做过一些详细的介绍,本小节将从程序设计的角度出发, 对一些在程序中常用的基本命令作具体的说明。 1. 非格式化输入语句 (1)字符串输入命令 Accept 格式:Accept to 功能:在屏幕上显示提示信息,等待用户键入一串字符,并把输入的字符串赋值给指定的内存变量。 说明: 是一个字符型的表达式,若省略则不显示任何提示信息

7、。 内存变量是一个已定义或未定义的字符型内存变量。 用户从键盘上输入字符串时,不必输入字符定界符,只要直接输入字符串中的字符即可。字符输 入完后,按回车键表示结束,回车键不作为字符串中的字符。若直接按回车键,则获得空字符串。 例 4 执行下述语句: accept 请输入性别: to sex 此语句的功能是在屏幕上显示“请输入性别:” ,并将用户输入的内容存放到内存变量 sex 中。若用 户性别是“男” , 则用户需键入男,再按一次回车键即可。 (2)数据输入命令 Input 格式:Input to 功能:在屏幕上显示提示信息,等待用户键入数据,将键入的值赋给指定的内存变量。 说明: 提示信息是

8、一个字符型的表达式,若省略 则不显示任何提示信息。 内存变量是一个已定义或未定义的变量。 用户输入数据时,应注意其类型。输入的数据可以是常数,也可以是表达式。输入不同类型的常 数有不同的要求。 字符型常数:必须用字符定界符(引号,方括号)括住,输入完后,按回车键表示结束。其中字符 定界符和回车键不作为字符串中的内容。 数值型常数:可直接输入整数或实数,输完后,按回车键表示结束。 货币型常数:应在数值前加$符号,例$123.12。 日期型常数:必须用日期定界符(大括号)括住,并且年月日的格式必须与当前系统要求的格式相 同,同时输入的日期必须为有效日期。输完后,按回车键表示结束。 逻辑型常数:必须

9、用小数点括住,数据输完后,按回车键表示结束。 例 5 执行下述语句: input 请输入性别: to sex 此语句的功能是在屏幕上显示“请输入性别:”并将用户输入的内容存放到内存变量 sex 中,若用 户性别是“男” , 则需键入男,再按回车键即可。 Input 请输入你的考试成绩: to cj 此语句的功能是在屏幕上显示“请输入你的考试成绩:”并将用户输入的数值存放到内存变量 cj 中。 若用户考试成绩为 83,则用户只需键入83,再按回车键即可。 input 请输入你的出生日期: to birthday 此语句的功能是在屏幕上显示“请输入你的出生日期:”并将用户输入的内容存放到 birt

10、hday 中。 若用户出生日期为 1978 年 7 月 3 日,则在严格日期格式下用户需键入1978/07/03,在通常日期格 式下用户需键入07/03/78,再按回车键即可。 (3)等待命令 Wait 格式:Wait to window nowait timeout 功能:暂停程序的执行,显示提示信息,并等待用户键入一个字符或单击鼠标。 说明: 用户可通过来指定显示的提示内容,否则将显示系统设定的提示信息: “按任意键继续” 可选项to,用于将输入的一个字符赋值给指定的内存变量。 可选项window nowait用于将提示信息以系统信息窗口的形式出现在屏幕画面的右上角。而带 有 nowait

11、 选项的 wait 语句,并不会暂停程序的执行,仅仅在屏幕右上角显示提示信息。此时只须移动一 下鼠标或按下任意键,这个系统信息窗口便会消除。需要注意的是 nowait 必须和 window 可选项合用才 会产生效果。 可选项timeout,是指定 Wait 语句最多暂停程序执行多少秒,若在指定的秒数时 间内,用户没有按任意键或单击鼠标,则到指定秒数后,wait 语句便会自动终止并返回空串,重新继续 执行程序。 例 6 执行下述语句: wait 看清后,按任意键,程序将继续运行 timeout 5 此语句的功能是在屏幕上显示“看清后,按任意键,程序将继续运行”的提示信息,在 5 秒内等待 用户按

12、键或单击鼠标终止 wait 语句的执行,继续执行程序;5 秒后 wait 语句自动终止,程序重新继续运 行。 wait 你要找的记录没有找到! window nowait 此语句的功能是在屏幕右上角显示系统信息窗口,窗口内容为“你要找的记录没有找到!”程序并 不终止运行。等用户按键或移动鼠标时,信息窗口自动消失。 wait 继续查找请按 Y 键,否则请按 N 键! to choose window 此语句的功能是在屏幕右上角显示系统提示信息窗口,窗口内容为“继续查找请按 Y 键,否则请按 N 键!” ,程序终止执行,等待用户按键,并将键入的一个字符赋值给内存变量 choose。 总结:Inpu

13、t 语句可以输入字符型、数值型、货币型、逻辑型和日期(时间)型的数据, Accept 和 Wait 语句则是专门输入字符型数据的。其中 Wait 语句,常用于要求用户快速响应的场合, 用户只需要按某个键就可继续程序的运行。 2. 非格式化输出语句 前面已经介绍过两种非格式化输出语句,即?和?,在这里就不再重复了。下面将介绍两个文本输出 命令。 格式 1: | 功能:将一行文本信息的内容按书写形式的原样显示出来。 说明: 与的差别在于前者输出的文本行前带有回车换行符,就是在下一行的第一列开始输出;而后者不 带,文本行在当前光标位置开始输出。 格式 2:Text Endtext 功能:可以进行多行

14、文本的输出。 说明: 它只能在程序中使用,并且必须成对使用。 例 7 下面有 3 个文本输出程序,它们运行的结果是相同的。 modify command exam7a 您好, 欢迎你光临! 今天天气真好! modify command exam7b 您好,欢迎你光临! 今天天气真好! modify command exam7c text 您好,欢迎你光临! 今天天气真好! endtext 分别运行这 3 个程序,都会在屏幕上显示出下列内容: 您好,欢迎你光临! 今天天气真好! 3. 格式化输出语句 格式: say picturefunction size, 功能:在屏幕指定位置按照指定格式输出

15、表达式。 说明: 例 8 执行下述语句: 11,12 say welcome home ! function! 11,12 say welcome home ! picture! 11,12 say welcome home ! picture! 11,12 say welcomehome! size 2,10 4. 格式化输入语句 格式: get picturefunction size, default range, valid when Read save cycle timeout 功能:在屏幕指定位置按照指定格式输入数据,它必须与 Read 语句配合使用,用 Read 命令激活当 前

16、所有的 Get 变量。 例 9 执行下述语句: 12,13 get age default 0 read 可在屏幕第 12 行第 13 列输入一个数值,并把这个数值赋给变量 age,因为 age 没有定义,所以在 get 语句中有一个 default 子句对 age 变量进行定义赋值。又因为赋给 age 的初值为数值 0,所以用户在输 入数据时,只能输入数值型的数据,而不能是其他的类型。 上面介绍的格式化输入输出语句,也可联合使用。 格式: say picturefunction get picturefunction default range, size, validwhen 功能:从屏幕

17、的指定位置开始显示表达式的值,空一格后反相显示变量的值。当执行 Read 语句时, 光标出现在变量对应的反相区并暂停程序的执行,等待用户输入一个值并把该值赋予 get 后的变量。 例 10 执行下述语句: xm= 11,12 say 请输入您的姓名: get xm read 则在屏幕第 11 行,第 12 列显示“请输入您的姓名:”并在其后等待用户输入字符串,并将输入内 容赋值给 xm。 5. 其他语句 (1)注释语句 为了方便用户对程序的阅读,VFP 提供了一种特殊的语句注释语句,对程序语句做出解释说明。 注释语句不参与程序的执行,只有说明解释功能。注释语句有两种,分别是: 格式 1:* 功

18、能:该行为注释行。 格式 2:& 功能:该注释符后的内容为注释内容。 说明: 这两个注释符均可对程序语句做出解释,但*注释符为行注释符,用在一行的行首,表示这一行为注 释行;而&用在命令行后,仅仅对该行语句做出解释。 6. 状态设置命令 (1)会话开关 格式:Set talk on|off 功能:设置命令执行的结果是否及时反馈显示出来。 (4)屏幕显示设置 格式:Set console on|off 功能:键盘输入的内容是否在屏幕上显示。 (5)系统保护状态设置 格式:Set safety on|off 功能:用于控制在文件或数据重写时或删除前是否发出警告。 (6)Escape 键终止程序运行

19、设置 格式:Set escape on|off 功能:用于设置 Esc 键能否中断程序运行。 (7)设置默认路径 格式:Set default to 功能:设置缺省路径时的默认值。 例 12 若当前盘当前路径为 c:VFP,则: modify command p1 &在 c:VFP 目录下创建 p1.prg 文件 set default to d:sj &设置缺省路径为 d:sj modify command p2 &在 d:sj 目录下创建 p2.prg 文件 三、作业要求 1. 仔细阅读本节内容。 2. 上机练习命令文件的建立和执行 3. 上机练习常用的输入、输出命令。 第二讲第二讲 顺序

20、结构和选择结构 重重 点:点:选择结构的三种语句格式理解和使用 难难 点:点:选择结构的使用 教学目的:教学目的:学会掌握和使用选择结构的三种语句格式 教学方法和手段:教学方法和手段: 理论讲授、多媒体演示和实际操作相结合。 理论讲解主要以讲授为主,辅以设问、引导、启发、提问等教学方法。 演示主要以案例驱动教学方法为主,辅以设问、引导、启发、提问等教学方法。 学生上机操作以任务驱动教学方法为主。 教学过程:教学过程: 一、首先复习上次课的主要内容。 复习主要以提问、设问等方式进行。提问时使用具体的例子。 二、通过引论,导入新课。 首先复习一下上次课的主要内容,复习主要以提问方式进行,然后导入新

21、课。 提问时使用具体的例子。 2.2.1 顺序结构 按顺序结构组织程序,只需先把处理过程的各个步骤详细列出,然后把有关命令按照处理的逻辑顺 序自上而下排列起来便可。上一节给出的例题就是按顺序结构组织程序的。 例 13 编程显示表 student.dbf 中姓王的学生记录。 modify command exam13 程序内容如下: clear use student list for 姓名=王 use 例 13 即为一个顺序结构的程序。 2.2.2 选择结构 选择结构能根据指定条件和当前值在两条或多条程序路径中选择一条执行,因此在一个程序中便能 处理多种情况的复杂问题。VFP 提供 3 种格式

22、的选择结构。1. 单一选择 格式:If Endif 功能:条件取值为“真” ,执行命令序列;条件取值为“假” ,命令序列就不执行。 说明:If 和 Endif 必须成对出现,相互匹配。 例 14 单一选择结构示例。 Modify command exam14 程序内容如下: clear wait 是否退出?(Y/N): to a &变量 a 识别用户是否退出 if upper(a)= Y &upper 函数把小写字母转换为大写字母 wait 您选择了退出,现在就要退出 Visual FoxPro! timeout 5 quit endif 2. 双重选择 格式:If Else Endif 功能

23、:根据条件的取值在与这两条路径中选择一条执行。 例 15 求圆的面积和周长。通过键盘输入半径的值,当半径大于等于 0,则输出圆的面积和周长,当 半径小于 0,则输出提示信息“输入值无效” 。 程序内容如下: set talk off input 请输入圆的半径值: to r if r=0 mj=3.14*r*r zc =2*3.14*r ?圆的面积为: ,mj ?圆的周长为: ,zc else ?输入值无效 endif set talk on 例 16 编写程序完成以下功能:根据从键盘输入的学号在 student 表中进行查找,找到则显示该学生 的学号,姓名,总分;找不到,则显示“无此学号”

24、。 程序内容如下: use student accept 请输入学号: to xh locate for 学号=xh if found( ) ?学号:+学号 ?姓名:+姓名 ?总分:,总分 else ?无此学号! endif use 3. 多重选择 格式:Do case case case . case otherwise Endcase 功能:自上而下依次判断命令中列出的条件,只要找到某一条件为“真” ,就执行与之相关的命令序 列,余下的条件便不再判断,有关的命令也不执行。在没有一个条件取值为“真”时,若有 otherwise 可 选项,就执行命令序列+1,否则什么也不做。可见在众多的命令序

25、列中,多重选择最多只选择执行其 中的一个命令序列,也可能一个也不执行。 说明: If 与 Endif、Do case 与 Endcase 标志选择结构的开始与结束,它们必须成对出现。 3 种选择结构不仅自身可以嵌套,而且还能相互嵌套。 例 编写程序求下列分段函数的值,x 的值通过键盘输入。 程序内容如下: set talk off y=0 input 请输入 x 的值: to x do case case x=0 .and. x=5 y=x+1 endcase ?y=, y set talk on 三、作业要求 1. 阅读本节内容,理解书上的例子。 2. 上机验证书上的例子。 第三讲第三讲 循

26、环结构 重重 点:点:循环结构的三种语句格式理解和使用 难难 点:点:循环结构的三种语句格式使用 教学目的:教学目的:掌握循环结构的三种语句格式使用 教学方法和手段:教学方法和手段: 理论讲授、多媒体演示和实际操作相结合。 理论讲解主要以讲授为主,辅以设问、引导、启发、提问等教学方法。 演示主要以案例驱动教学方法为主,辅以设问、引导、启发、提问等教学方法。 学生上机操作以任务驱动教学方法为主。 教学过程:教学过程: 一、首先复习上次课的主要内容。 复习主要以提问、设问等方式进行。提问时使用具体的例子。 二、通过引论,导入新课。 2.2.3 循环结构 按循环结构来组织程序,能够做到由指定条件的当

27、前值来控制程序中某一部分命令序列的重复执行。 VFP 提供了多种循环结构,它们是当循环、For-Next 循环、表文件扫描循环等等。 1. 当循环 格式:Do while Loop Exit Enddo 功能:判断条件的取值,若为“真”就执行 Do 与 Enddo 之间的命令序列(称为循环体) ,再判断条 件的取值,重复刚才的过程。一旦条件取值为“假” ,就跳出循环体转而执行 Enddo 下一条命令。只要条 件取值保持为“真” ,循环体就会不断地重复执行,流程图如图 15.4 所示。 例 20 编写程序逐条显示 student 表中的记录。 程序内容如下: use student do whi

28、le .not. eof( ) display wait windows timeout 2 skip enddo use 例 22 编程计算 1+2+100 的值。 分析:求和是采用累加的方式,从一个初始值出发,通过循环累加求出最后的结果。s 用来存放累 加的结果,初值为 0,n 既作为被累加的数据,也作为控制循环的条件是否成立的变量,初值为 1。 程序内容如下: set talk off s=0 n=1 do while n=100 s=s+n n=n+1 enddo ? 1+2+100=,s set talk on 2. ForNext 循环 格式:For = to step Exit

29、Loop Endfor | Next 功能:本命令中的内存变量(又称循环变量)类似于计数器,它的取值范围由(初值) 与(终值)确定,通过判断内存变量的取值是否在指定范围之中来确定循环体是否重复执行。 例 24 编程用 ForNext 循环计算 1+2+100 的值。 程序内容如下: set talk off s=0 for i=1 to 100 step 1 s=s+i endfor ? 1+2+100=,s set talk on 例 25 编程统计 100 以内能够被 3 或 5 整除的数的个数。 程序内容如下: set talk off num=0 for i=1 to 100 if m

30、od(i,3)=0 .or. mod(i,5)=0 num=mun+1 endif endfor ? 100 以内能够被 3 或 5 整除的数的个数为:,num set talk on 3. 表扫描循环 格式:Scan forwhile Exit Loop Endscan 功能:对当前表中满足条件的记录,依次重复执行循环体。 在数据库应用程序中,经常要对表中指定的记录逐个进行某种处理,此时可以使用 VFP 提供的表扫 描循环命令。 例 26 用 Scan 循环逐条显示 student.dbf 中男同学的记录。 程序内容如下: set talk off use student scan for

31、性别=男 display wait windows timeout 2 endscan use set talk on 以上我们介绍了三种结构,这三种结构在编程中通常是配合使用的。下面以它们混合使用为例进行 说明。 三、作业要求 1. 课后习题 2,3 2. 上机练习书上的例子和验证自己编写的题目。 第四讲第四讲 综合程序设计、过程和函数程序设计 重重 点:点:程序设计中三种结构的嵌套使用和过程和函数的定义和调用 难难 点:点:过程和函数程序设计 教学目的:教学目的:掌握程序设计中三种结构的嵌套使用,掌握过程和函数的定义和调用,会设计简单的综合 程序。 教学方法和手段:教学方法和手段: 理论讲

32、授、多媒体演示和实际操作相结合。 理论讲解主要以讲授为主,辅以设问、引导、启发、提问等教学方法。 演示主要以案例驱动教学方法为主,辅以设问、引导、启发、提问等教学方法。 学生上机操作以任务驱动教学方法为主。 教学过程:教学过程: 一、首先复习上次课的主要内容。 复习主要以提问、设问等方式进行。提问时使用具体的例子。 二、通过引论,导入新课。 程序应用举例 自定义函数 系统将一些经典的通用算法编成一个个程序提供给用户使用,这就是所谓系统函数。用户也可以根 据自己的需要编写相应的函数即自定义函数。下面我们将介绍如何自定义函数。 1. 自定义函数的定义 格式:Function parameters

33、return 功能:定义一个函数。 说明: Function 此项是定义函数名称,可选项parameters是函数中参数传递的语句, 每个参数之间用逗号隔开,它们又可称为形式参数。return是将处理后的值返回给调用程序使 用,一个函数必须在程序运行结束时返回一个函数值,这是函数的基本特点。若函数不提供返回值,则 VFP 使用.T.作为默认返回值。 例 31 建立自定义函数 sm(n),其功能是计算 1+2+3+n 累加和。 数值求和是计算机程序设计中的主要运算,求和是采用累加的方式,从一个初始值出发,通过循环 累加求出最后的结果。 function sm parameters n s=0 k

34、=1 do while k=n s=s+k k=k+1 enddo return s 2. 自定义函数的调用 上面两个例子就是两个自定义函数,对于自定义函数我们应该如何调用呢?自定义函数的调用和系 统函数的调用基本相同,下面举例说明。 例 32 利用自定义函数求矩形面积。 set talk off. ? c=3, k=4, area=, area(3,4) ? c=4, k=6, area=, area(4,6) set talk on function area parameters h,w s=h*w return s 在该程序中定义了一个函数 area( )。其中有两处调用到此函数 ar

35、ea(3,4)和 area(4,6)。在执行对函数的 调用时,实在参数将代替函数中的形式参数。需要注意的是形式参数必须是合法的内存变量名,实在参 数必须与形式参数的个数、类型、顺序完全一致。实在参数可以是常量,也可以是已赋值的合法内存变 量。这些变量名即使与形式参数的名字相同,也不影响程序的运行。 2.3.2 过程 1. 过程的定义 在一个复杂的管理系统中,有些工作往往要反复执行多次,如某种格式的报表多次打印、某个计算 过程多次使用等等。解决这个问题的方法可以采用循环语句来实现,但当这个需要重复计算加工的过程 每次重复加工的对象不同时,或在程序的不同地方重复时,有时用循环的方法就很难实现,因此

36、 VFP 提 供了一种比较有效的方法过程。过程和自定义函数类似,它和函数不同之处是:在过程结束后,不 必返回值。 格式:Procedure parameters return 功能:定义一个过程。 例 34 编一个过程 rq,该过程的功能为将一个XX/XX/XX形式的日期格式转换为 XXXX 年 XX 月 XX 日形式并显示出来。 procedure rq parameters r y=year(r) m=month(r) d=day(r) a=str(y,4)+ 年 + str(m,2) + 月+ str(d,2) + 日 ?a return 2. 过程的调用 过程调用可用下面的格式: 格式:Do with 功能:中断当前程序的执行,执行指定过程中的语句。 说明: 当程序执行到此语句时,便会停下来,转去执行中的语句,直至执行完毕,再重新返回到 主程序,去执行 Do 语句下面的语句。 若指定的过程中带有形式参数,则在调用该过程时,应加上with选项,其中 with 后跟的 参数为实在参数,它应与过

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论