《计算机c语言》PPT课件.ppt

上传人:小飞机 文档编号:5604183 上传时间:2023-08-01 格式:PPT 页数:61 大小:272KB
返回 下载 相关 举报
《计算机c语言》PPT课件.ppt_第1页
第1页 / 共61页
《计算机c语言》PPT课件.ppt_第2页
第2页 / 共61页
《计算机c语言》PPT课件.ppt_第3页
第3页 / 共61页
《计算机c语言》PPT课件.ppt_第4页
第4页 / 共61页
《计算机c语言》PPT课件.ppt_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《《计算机c语言》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《计算机c语言》PPT课件.ppt(61页珍藏版)》请在三一办公上搜索。

1、第三章 C语言程序的基本控制结构,本章目录,4.1 程序的三种基本控制结构,4.2 顺序结构,4.3 选择结构,4.4 循环结构,4.1 程序的三种基本控制结构,程序的三种基本结构是:顺序结构、选择(分支)结构、循环结构。任何一个结构化程序都可以由三种基本控制结构来表示,下面是这三种结构的流程图,见图4.1到4.3。,入口,出口,入口,出口,真,假,图4.1 顺序结构,图4.2 选择(分支)结构,入口,出口,图4.3 循环结构,上述三种基本控制结构的共同特定是具有单入口和单出口。还有一种goto语句,又叫转向语句,在本章的小节中将会讲解到。我们在编写程序时,力求使用前三种基本结构语句。,4.2

2、 顺序结构,顺序结构是最简单的一种程序结构,它通常由说明语句、表达式语句、函数调用语句和输入输出语句组成,是一种按程序的书写顺序依次执行的结构。一般也出现在选择结构或循环结构的语句体内,总之整个程序都存在顺序结构。1.表达式语句空和语句 任何一个表达式,后面加一个分号就够成表达式语句,是C语言程序中最常用的语句。例如:x=a+b;(赋值表达式语句)+i;(算术表达式语句)printf(“%d”,a);(函数调用语句)等等,都是表达式语句。特别是在表达式语句中,如果没有表达式只有分号,即;则是一个空语句。空语句在语法上是一个语句,但不执行任何操作。,4.2 顺序结构,2.复合语句 在顺序结构中,

3、语句常常以复合语句的形式出现在程序中。复合语句是指由两条或两条以上的语句用花括号括起来的语句序列。如果该语句序列中含有说明语句,这样的复合语句又称为分程序。复合语句在语法上作为一条语句,可以出现在任何单一语句可以出现的地方。复合语句的形式如下:说明语句部分 执行语句部分 其中,说明语句可以没有,如果有则放在执行语句的前面。例如,下面的复合语句实现交换两个变量的值:int temp;temp=a;a=b;b=temp;该语句中定义的变量temp,只在本复合语句内有效。,4.2 顺序结构,3.顺序结构程序设计,顺序结构程序通常是由说明语句、表达式语句、函数语句和输入输出语句组成的一种顺序执行的程序

4、结构。以前所举的程序例子都是顺序结构的程序。,例4.1从键盘输入一个字符,求它的前一字符和后一字符,并输出它们的ASCII码。分析 求输入字符的前导和后续字符,只需将输入字符的ASCII码值减1或加1,分别按照字符和整数格式输出即可。程序如下:#include main()int c1,c2;scanf(%c,4.2 顺序结构,运行结果:,4.3选择结构,选择结构又称为分支结构,它根据对给定条件的判断,来选择某一个分支执行。C语言提供了解决这类问题的两个基本语句:if语句(条件语句)和switch语句(开关语句)。因为在进入程序分支结构前需要进行条件判断,所以我们需要先学习关系运算和逻辑运算的

5、有关内容。,4.3选择结构,1.关系运算和关系表达式 1关系运算符 C语言提供了一组关系运算符,如表4.1所示。它们用来比较两个运算对象之间的大小关系。,关系运算符都是二元(双目)运算符,它们的优先级比算术运算符低,高于赋值运算符。在关系运算符中,、=同级,它们高于=和!=。关系运算符的结合规则都有是自左至右。,4.3选择结构,2关系表达式 用关系运算符将两个表达式连接起来就构成了关系表达式。如:ab,x=y,a+b=c+b 都是合法的关系表达式。关系表达式的值是一个逻辑值,即“真”或“假”。C语言没有专门的逻辑型数据,而是用1(或非0)表示真,用0表示假。因此表达式3b的值则取决于a,b的值

6、,但只可能是真或假(非0或0)两种情况之一。下面我们来看一个例子:(设a=3,b=5):c=5-3a+1=4=4,关系不成立,其值为0,即 c=0b a的ASCII码值为97,b为98,关系不成立,值为0。a50 关系不成立,值为0,4.3选择结构,2.逻辑运算和逻辑表达式,1逻辑运算符 逻辑运算符是用来对运算对象进行逻辑运算的。C语言提供了三种逻辑运算符,如表4.2所示。,表4.2 逻辑运算符,4.3选择结构,!逻辑非,单目运算符,自右至左结合。其运算规则是:当运算量为0,运算结果为1;反之,当运算量为,运算结果为。&逻辑与,双目运算符,自左至右结合。其运算规则是:只有当运算符两边的运算量都

7、是非0时,运算结果才为1,否则为。|逻辑或,双目运算符,自左至右结合。其运算规则是:只要运算符两边的运算量有一个为为非0,运算结果就为。只有两个运算量都为0,结果才是0。这三个运算符的优先级,逻辑非!最高,逻辑与&次之,逻辑或|最低。!(逻辑非)的优先级高于算术运算符和关系运算符,而&(逻辑与)和|(逻辑或)的优先级低于算术运算符和关系运算符。由 此可见:ab&cd 相当于(ab)&(cd)a=0|b=0 相当于(a=0)|(b=0)!a&b=c 相当于(!a)&(b=c),4.3选择结构,2逻辑表达式 用逻辑运算符将逻辑量(逻辑的常量、变量、函数、关系表达式等)连接起来的式子称为逻辑表达式。

8、逻辑表达式的值是一个逻辑值,用1表示真,用0表示假,而在判断一个量的真或假时,以非0表示真,以0表示假。例如a=3,b=2,,则:!a 相当于!3为假,值为0a&b 相当于3&2为真,值为1a&!b 相当于3&0,值为0!a|b 相当于0|2,值为1,注意:逻辑“与”和逻辑“或”运算分别具有如下性质:1)a&b,当a 为0时,不管b 为何值,结果为0。对b不作运算 2)a|b,当a为1时,不管b 为何值,结果为1。对b不作运算 利用上述性质,在计算连续的逻辑与运算时,只要有一个运算对象的值为0,则整个表达式的结果为0,不再计算后继的运算对象;在计算连续的逻辑或运算时,只要有一个运算对象为1,则

9、整个表达式的值为1,不再计算其它的运算对象。,4.3选择结构,例4.2 main()int a=1,b=1,x=1,y=0,z=3,p=4,c,d;c=(a=xy)运算结果:,程序中变量a的值经过运算后为0,对于&运算符来讲,有一个运算对象为0,就不计算另外的运算对象(b),所以b的值保持不变为1。请读者注意。关系运算和逻辑运算经常用于流程控制,如选择语句或循环语句的条件表达式中。,4.3选择结构,3.if语句 if语句是条件选择语句,它通过判断是否满足给定的条件来决定所要执行的操作。1 if语句的三种形式,1if(表达式)语句例如:if(x=y)printf(“ok”);这种if语句的的执行

10、过程见图4.4。,假(0),真(非0),图4.4,4.3选择结构,2.if(表达式),语句1else语句2 例如:if(x=y)printf(“ok”);else printf(“no”);见图4.5,图4.5,真,假,4.3选择结构,3 if(表达式1)语句1 else if(表达式2)语句2 else if(表达式3)语句3 else if(表达式m)语句m else 语句n 流程图见图4.6。,图4.6,4.3选择结构,例如:if(score=85)p=A;else if(score=70)p=B;else if(score=60)p=C;else p=D;,说明:1)三种形式的if 语

11、句中在if 后面都有“表达式”,一般为逻辑表达式或关系表达式。也可以是其它类型的表达式,只要能够判断最后确定的值为真或假就行了。2)else子句不能作为语句单独使用,它必须是if 语句的一部分,与if 配对使用。else语句只能和它最近的上面的if进行配对结合。3)在if和else后面可以只含一个内嵌的操作语句,这时可以不用花括号“”括起来,也可以有多个操作语句,此时必须用花括号“”将几个语句括起来成为一个复合语句。,4.3选择结构,例4.3 幼儿园里三个小朋友站队要求小个站在前面,高个站在后面。分析:我们可以把个子最小的小朋友放在a位置上,较高的小朋友放在b位置上,个子最高的小朋友放在c位置

12、上。输入三个数,a,b,c,要求按由小到大的顺序输出。先比较a和b,若a大于b,则a与b对换,再比较a和c,若a大于c,则a与c对换,这时a的值是最小的,最后比较b和c,若b大于c,则b与c对换。这样操作之后就使abc的关系成立。然后顺序输出a,b,c既可。,4.3选择结构,程序如下:main()float a,b,c,t;scanf(%f,%f,%f,运行结果:,4.3选择结构,2 if语句的嵌套,在if语句中又可包含一个或多个if 语句,这种形式称为if语句的嵌套。一般形式如下:if()if()语句1else 语句2 else if()语句1else 语句2,应当注意if 与else的配对

13、关系。else总是与它上面的最近的if配对。如果if与else的数目不一样,为实现程序设计者的企图,可以加花括弧来确定配对关系。例如:if()if()语句1 else 语句2 这时花括号“”限定了内嵌if 语句的范围,因此else与第一个if配对。,4.3选择结构,例4.4 有一函数-1(x60)编写程序,输入一个x值,输出y值。程序如下:,#include main()int x,y;printf(Please input a mumber:n);scanf(%d,4.3选择结构,运行结果:,本题还有其它方法,请读者试着编一下。,4.3选择结构,4.switch语句,上节介绍的if语句,一般

14、适用于有两个的选择的情况,尽管也可以通过if嵌套形式实现多多个的选择。但这种方式由于嵌套层次过多,影响了程序的可读性。C语言提供了一种更方便于多分支选择的switch语句,称开关语句。它的一般形式如下:,switch(表达式)case 常量表达式1:语句1 break;case 常量表达式2:语句2 break;case 常量表达式n:语句n break;default:语句n+1,其中,switch、case、default和break均为C语言的保留字,内的break可以不写。switch 后面的表达式通常为整型、字符型或枚举型。常量表达式又称开关常数或分支标号,必须是与表达式类型对应一致

15、的整数、字符或枚举常数。语句1n+1,可以是单个语句,也可以是多个语句,如果是多个语句也不必用括起来。default 和语句组n+部分可以省略。,4.3选择结构,switch语句的执行过程是:1首先计算switch后面圆括号内表达式的值,然后依次与各个case后面的常量表达式的值相比较,若一致就执行该case后面的语句,直到遇到break语句,此时switch语句执行结束,就转出switch语句,执行后面的语句;2当表达式的值与case后面的常量表达式的值都不一致,则执行default后面的语句,switch语句执行结束,转出switch语句,执行后面的语句;如果没有default部分,则不执

16、行switch语句中的任何语句,而直接转出switch语句,执行后面的语句。每个case代表一个分支,所包含的语句代表该分支所要执行的功能。但是,如果语句组中没有break语句,程序就一直执行,从而进入下一个分支,这在C语言中是允许的,但一个好的习惯是在每个语句组中以break结束,从而保持各分支的独立性。,4.3选择结构,例如:以下程序段。char gard=B;switch(grade)case A:printf(90100);break;case B:printf(8089);break;case C:printf(7079);break;case D:printf(6069);brea

17、k;default:printf(不及格);break;,在使用switch语句时,应注意以下几点:1)switch后面括号内的“表达式”,ANSI标准允许它为任何类型。2)每一个以case的常量表达式的值必须互不相同,否则就会出现互相矛盾的现象。3)各个case和default的出现次序不影响执行结果。,4.3选择结构,4)多个case可以共用一组执行语句,相当于部分case没有break语句。如:switch(num)case 5:case 4:case 3:printf(“%d=3n”,num);break;case 2:case 1:printf(“%d=1n”,num);break;

18、default:printf(“error”);,程序中当num等于5,4,3的时候,3条case语句共用了一组执行语句,当num等于2,1的时候,2条case语句共用了一组执行语句。,4.3选择结构,4.switch语句,例4.5 利用switch语句对五分制和百分制的关系编写编程 main()char grade;scanf(%c,运行结果:,4.3选择结构,当然if语句和switch语句都能实现多分支选择结构的编程,可以根据编程者的想法进行编写C程序语句。,例4.6长途电话计费方式为,3分钟收费0.6元(不足3分钟,按3分钟计费),以后超过1分钟增收0.3元(不足1分钟,按1分钟计费)。

19、若通话时间在24点至晨8点之前,则按半价收费。分析:定义变量ts表示打电话的起始时间,如果ts在248点之间,rate表示半价。tm表示打电话的总时间,要取时间的整数,不足1分钟的要加上1分钟,本例中用到了强制类型转换运算符(),对时间tm进行tm+1的操作。cost表示电话费。,4.3选择结构,#include main()int ts;float tm,rate,cost;scanf(%d,%f,4.3选择结构,运行结果:,4.4 循环结构,许多实际问题中都需经有规律地重复某些操作,因此程序中就需要将某些语句重执行,这就是循环。语言循环的实现使计算机真正充当了代替人类工作的角色。循环语句可

20、以将计算机定义成无休止的工作状态。无论哪种循环的定义都包括四个部分:,1)循环初始状态;2)能够决定是否中止循环的条件判断;3)对上一循环状态的值进行修正;4)循环体,即重复执行的语句序列。C语言提供了三种用来实现循环的语句,即while语句,do_while语句和for语句。另外,还可以由goto语句和if 语句构成循环。,4.4 循环结构,1 while循环语句(“当型”循环),while循环语句的一般形式如下:while(表达式)语句(即循环体)其中,while是关键字,语句部分可以是一条语句,也可以是复合语句,还可以是空语句,这一部分称为循环体。该语句的执行过程是:先判断while后面

21、圆括号中表达式的值,如果式的值为非(真),则执行后面的语句部分,即循环体,然后次计算表达式,并重复上述过程,直到表达式的值为(假)为时,退出循环。该语句的特点是先判断表达式的真和假,后执行循环体。,4.4 循环结构,#include main()int i=1,sum=0;while(i=100)/*循环条件*/sum+=i;/i+;/*循环变量增值*/printf(1+2+.+100=%dn,sum);运行结果:,例4.7 求1100自然数之和。,4.4 循环结构,i是循环变量,i+能够使i的值增到100后,循环结束。sum的初值一定要为0,否则运算结果不可知。循环体中有两个语句必须用大括号

22、括起来,否则循环只对第一个语句起作用。使用while语句时应注意以下几点:1由于while语句先判断表达式,后执行循环体。如果表达式的值一开始就为假,则循环一次也下执行。所以是属于“当型”循环。2while语句的表达式要用圆括号括起来,当循环体有多个语句时,要用花括号括起来。以形成复合语句。3在循环体中应该有使表达式的值有所变化的语句,以使循环能趋于终止,否则会形成死循环。,4.4 循环结构,2do-while循环语句(”直到”型循环),do-while循环语句一般形式如下:do 语句(即循环体)while(表达式);其中,do、while是关键字,语句可以是一条语句,也可以是由多条语句组成的

23、复合语句。while后面的“;”一定要有。该语句的执行过程是:先执行循环体,再计算while后面圆括号内表达式的值,如果其值为真,则再次执行循环体,如此重复,直到表达式的值为假时结束循环。该循环结构的特点是先执行循环体。后判断表达式的值,所以循环体至少将被执行一次。,4.4 循环结构,例4.8 用do-while语句计算1100自然数之和。#include main()int i=1,sum=0;dosum+=i;i+;while(i=100);printf(1+2+.+100=%dn,sum);运行结果:,4.4 循环结构,使用do-while语句时应注意:1do-while循环是先执行循环

24、体,而后判断表达式的值,所以循环体至少被行一次。所以属于”直到”型循环。2其它同while循环比较来看,在循环条件不成立的条件下,dowhile语句会无条件的执行一次,3 for循环语句,for循环语句的一般形式如下:for(表达式;表达式;表达式)语句(即循环体)其中,for为关键字。三个表达式可以为任何类型。一般情况下,表达式1是给循环变量赋初值部分。表达式2是循环控制条件。表达式是循环变量的修改部分,用来表达循环变量的增量,常用自加、自减运算。语句部分为循环体,可以是一条语句,也可以是复合语句和空语句。该语句的执行过程:先求解表达式1。求解表达式2,若为真,执行循环体,然后转到第3步执行

25、;若为假,转到第4步。求解表达式3,转到第2步进行判断。退出循环,执行后面的语句。,4.4 循环结构,例4.9 计算1100自然数之和#include main()int i,sum=0;for(i=1;i=100;i+)sum+=i;printf(1+2+.+100=%dn,sum);运行结果:,4.4 循环结构,使用for语句时应注意以下几点:1)for语句的一般形式中的“表达式1”可以省略,此时应在for语句之前给出循环变量的初值。注意省略表达式1时,其后的分号不能省略。如例4.9的程序段中 int i=1,sum=0;for(;i=100;i+)sum+=i;2)如果表达式2省略,即不

26、判断循环条件,认为表达式2的值绐终为真,循环无终止地进行下去,成为死循环。为了避免死循环的出现可以在循体的内部加入条件判断,并用break退出循环。如例4.9的程序段中:int i,sum=0;for(i=1;i+)if(i=100)sum+=i;else break;,4.4 循环结构,3)表达式3也可以省略,但为了保证循环能正常结束,必须在循环体内加入对循环变量的修正语句。如例4.9的程序段中:for(i=1;i=100;)sum+=i;i+;4)可以省略表达式1和表达式3,只有表达式2。为了程序的正常运行,如例4.9的程序段中 int i=1,sum=0;for(;i=100;)sum+

27、=i;i+;,4.4 循环结构,5)三个表达式都可省略。如 for(;)语句 即不设初值,不判断条件(表达式2为永真),循环变量不增值,程序将无终止所执行下去,造成死循环。为了使程序正常运行,读者自己上机调试。6)三个表达式可以是逗号表达式。for前面sum=0也可放在表达式1的位置,循环体中的语句也可放到表达式3的位置,这时循环体为一个空语句。如例4.9的程序段中:int i,sum;for(sum=0,i=1;i=100;sum+=i,i+);,4.4 循环结构,4 循环的嵌套,一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就构成了多层循环。不过嵌套

28、的层数不要过多,这样会使程序变的不易读。三种循环是可以相互嵌套的。和嵌套的if语句类似。如下面几种形式:,1)while中嵌whilewhile()while(),2)do-while中嵌do-whiledodowhile();while();,3)for中嵌forfor(;)for(;),等等。,4.4 循环结构,例4.10编程实现M行,N列的平行四边形,如M=4,N=5。,*,程序如下:#include main()int i,j,k,m,n;char a;printf(nnPlease input M:);scanf(%d,4.4 循环结构,运行结果:,5 循环的退出,1.break语句

29、 前面介绍过用break语句可以使流程跳出switch结构,继续执行switch语句后面的语句。实际上,break语句还可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句。一般形式:break;,4.4 循环结构,例4.11 break语句的使用#include main()int i;for(i=0;i=7;i+)if(i=4)break;printf(%dn,i);,运行结果:,4.4 循环结构,当程序执行到i=4时,执行break语句,提前结束循环。break语句的一般形式为:break;bread语句不能用于循环语句和switch语句之外的任何其他语句中。,4.4 循

30、环结构,2continue语句 一般形式为:continue;其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判断。如:例4.12 contiune语句的使用#include main()int i;for(i=0;i=5;i+)if(i=4)continue;printf(%dn,i);,4.4 循环结构,运行结果:,程序执行到i=4时,不执行下面的语句直接进行下一次判断,因此4没有输出来。请读者比较例4.11和例4.12来体会break和continue的区别。continue语句和break语句的区别是:continue语句只结束本次循环,而不是终止整

31、个循环的执行。而break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。,4.4 循环结构,3.goto语句 goto语句是无条件转向语句。它的一般形式如下:goto 语句标号;其中,goto为关键字。语句标号用标识符表示,它的命名规则与变量名相同。用来标识一条语句,它出现在语句的前面,用冒号与语句隔开。如:语句标号:语句 goto语句的执行过程是:将执行转移到标号所标识的语句去执行。goto语句只能在所在函数体内转移,即goto与标号在同一函数内。,4.4 循环结构,注意:结构化程序设计的方法中主张限制使用goto语句,因为滥用goto语句将使程序流程无规律、可读性差。但也不是绝

32、对禁止使用goto语句。一般来说,可以有两种用途:(1)与if语句一起构成循环结构;(2)用来退出多重循环,而前面介绍的break语句只能退出一层循环。但要注意。使用goto语句只能从循环内部跳转到循环外部,而不能由循环外部向循环内部跳转。但是这种用法不符合结构化原则,一般不采用,只有在不得已时才使用。,4.4 循环结构,例4.13 用if语句goto语句相结合构成循环来求1100自然数之和。main()int i,sum=0;i=1;Loop:if(i=100)sum+=i;i+;goto Loop;printf(1+2+.+100=%d,sum);运行结果如下:,4.5 应用举例,例4.1

33、4 输出九九乘法表。分析:分行于列考虑,共9行9列,i控制行,j控制列,再分别利用i和j来作为两个乘数输出。#include main()int i,j,result;printf(n);for(i=1;i10;i+)for(j=1;j=i;j+)result=i*j;printf(%d*%d=%-3d,j,i,result);printf(n);/*换行*/,4.5 应用举例,运行结果:,4.5 应用举例,例4.14 输入一字符串,分别统计其中字母,数字和其它字符的个数。分析:我们先定义三个变量用来存放字母,数字和其它字符的个 数,利用循环来逐个判断这一字符串,分别对每一个字符进行ASCII

34、码范围的比较,并分别对相应的变量作加一操作。,#include main()char c;int letter=0,digit=0,other=0;while(c=getchar()!=n)if(c=a,4.5 应用举例,运行结果:,例4.15 写程序,实现将100元人民币换成1元、5元、10元、50元的零钱兑换方法,要求在每种兑换方法中,每种面值的零钱至少有一张。,分析:将每种面值的人民币的张数的取值范围确定下来,如:a、b、c、d分别表示50元、10元、5元、1元的张数,50元的至少有一张至多也有一张,即a=1,10元的至少有一张至多有4张,即1b4,5元的至少有1张至多有7张,即1c7,

35、1元的至少有1张至多有35张,即1d35。只要是a*50+b*10+c*5+d*1=100,则a张50元、b张10元、c张5元、d张1元就是一种方案。,4.5 应用举例,#include main()int a,b,c,d,sum=0;printf(NO.t50t10t5t1n);printf(-n);for(a=1;a=1;a+)for(b=1;b=4;b+)for(c=1;c=7;c+)for(d=1;d=35;d+)if(a*50+b*10+c*5+d*1=100)sum+;printf(%d.t%dt%dt%dt%dn,sum,a,b,c,d);,4.5 应用举例,运行结果如下图所示共

36、有16种方法:,本章小结,本章主要介绍语言程序的三大控制结构:顺序结构、选择结构、循环结构。在顺序结构部分讲解了一些基本语句、表达式和运算符,如。空语句、表达式语句、复合语句等。了解顺序结构就是按照程序从开始到结束即从上到下的执行顺序,任何程序都包含的结构。关系运算和逻辑运算是用于选择结构和循环结构中的条件判断。要注意在C语言中逻辑与、逻辑或的运算规则。掌握if语句的使用,循环语句的使用。,本章小结,在选择结构中讲解了关系运算符、逻辑运算符。在选择结构中通过运算表达式的逻辑值是0或1,来看是否执行相应选择分支语句。选择结构主要是用if结构和switch结构来实现。掌握if结构的各种形式,其中if后面的表达式可以为任何合法的类型,一般是逻辑表达式和关系表达式。在循环结构中讲解了C语言提供的while,do-while,for的三种循环结构,还有if和goto语句构成的循环结构。在使用中体会各种循环结构的不同。介绍了两种语句break语句和continue语句,这两种语句可以和循环语句配合使用。break语句作用是中止当层循环结构,continue语句作用是提前结束本次循环,进入下一次循环判断。,Thank You!,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号