c语言总结
C语言实训总结
一.实训的前期准备
(一)本次实训的主要目的与计划目标
本次实训周活动的对象是机械设计制造及其自动化四年制本科081016班的学生,他们本学期学习了C语言的课程,因此组织开展本次实训活动的主要目的一方面锻炼并考查学生的学习情况,另一方面培养学生对计算机编程语言编程及上机操作、调试的能力。
通过本次实训,进一步对所有学生的情况进行了解,有助于更好的帮助学生对C语言有更加深刻的认识。(二)本次实训周活动的计划方案说明
在制作实训周计划时主要以学生C语言课程为导向,考察学生对编程软件的认识、操作能力,以及对所学课程内容的掌握情况、编程能力、上机调试的能力。
(三)准备工作
1.教师准备(1)确定实训方案
通过与授课教师进行沟通,分析实训内容,实训时间,并最后提出实训方案。该方案要求学生完成一个学生成绩统计的程序。
(2)机器、程序等软硬件设施准备
在设备的准备上,首先与图书馆机房进行沟通,提前做好了实训周的活动安排,包括涉及到实训的班级、教师的课程调整、实训周前期的设备维修、一些常用软件的安装、实训周的机房安排等。
2.学生准备
在12周时就对学生进行了实训要求的讲解,并要求学生完成了实训周工作计划。通过计划,学生了解了实训的训练内容,并利用课余时间制定了大致的实训周时间安排。
二.实训周活动的实施过程
(一)学生实训流程
根据实训方案,学生要在周一到周三的3天的时间内按照给定的任务编写C语言的程序,其中具体的时间安排,由学生自己在制作实训计划时大致给出。在实际的编程过程中,我们发现多数同学大概用了二天半的时间来完成C语言编程,剩下的时间用来检查程序中的问题,总的来说时间分配还算比较合理。在实训过程中,我们也发现有部分学生对时间的安排上也较差,没有对题目有一个清晰的认识,思维比较混乱。还有学生在编程过程中遇到了困难后,并不是去想办法解决困难,而是采用通过省略掉困难的方法来编写程序,造成程序功能与题目要求存在了一定的出入。这些都说明了我们的学生还缺乏在在编程过程中对时间的掌控能力,还缺乏最基本的耐力和毅力,还缺乏不达目的决不罢休的一种精神。(二)教师指导
在实训过程中,采取巡视的方法、个别指导的方式对学生进行指导。在此期间,发现教师的指导作用对学生的程序的成功与否也起了比较大的作用。在指导过程中,往往教师的一个建议,就能让学生收益良多。
三.实训周活动的成果
从本次实训周活动要求学生要完成任务书中的编程题目,从的最后的情况来看,许多同学能够通过参照书中的一些例子,主动独立的完成程序的编写,而且在编写过程中,很多语句简洁,可以看出对C语言掌握的非常好,也非常感兴趣。
当然通过本次的实训活动,我们也发现了学生的一些不足之处,比如有些学生在编程过程中代码语法存在很多错误,对于某些语句的意义理解得不好。
扩展阅读:C语言知识点总结
C语言知识点总结
C语言知识点总结...........................................................................................................................1一、常量.....................................................................................................................................2二、标识符.................................................................................................................................2三、变量.....................................................................................................................................2四、表达式.................................................................................................................................3五、输入输出函数.....................................................................................................................4六、C语言的语句......................................................................................................................5七、C程序的基本结构..............................................................................................................5八、选择结构语句.....................................................................................................................5
if(表达式)语句1else语句2........................................................................................5条件运算符表达式1?表达式2:表达式3...............................................................6switch语句.......................................................................................................................6九、循环结构.............................................................................................................................6
for循环语句....................................................................................................................6while循环语句dowhile循环语句...............................................................................6十、数组.....................................................................................................................................7十一、字符串函数.........................................................................................................................7十二、函数.....................................................................................................................................8十三、指针.....................................................................................................................................9十四、宏定义...............................................................................................................................10十五、结构体,共用体,枚举类型...........................................................................................10十六、TurboC的使用................................................................................错误!未定义书签。一、常量
数字常量
i.普通数字:1,35,2.7
ii.指数形式:2.45e-2等价于2.45*10-2注意e大小写皆可,e前面的数字不能省,就算是1也不能省,后面的数字一定要是整数
iii.长整型,单精度浮点型:3235L,32.5F分别表示3235是长整型数据,
32.5是单精度浮点型左,若不写上L,F则表示3235是整型,32.5是双精度浮点型,L,F大小写皆可
字符常量
i.普通字符常量:用单引号把一个字符括起来,如A,@
ii.转义字符常量:一对单引号括起来并以“\\”开头的字符序列,如\\n(回
车)、\\123(8进制123对应的字符),\\x23(16进制23对应的字符)
字符串常量
用一对双引号把一个字符序列括起来,如“ABCef”,系统存放字符串常量,每个字符分配一个字节,各字符所占字节紧邻,并且字符串末尾会给再开一个字节里面放一个’\\0’做为结束标志。
符号常量
定义格式#define符号常量名符号常量值,如#defineN20则定义了符号常量N,其值为20,注意符号常量名和符号常量值之间是用空格隔开,而不是写上=号,#define和符号常量名之间也有空格的。
二、标识符
命名规则
以数字,字母,下划线这三类字符组成,但只能以字母或下划线开头,而不能也数字开头,另外不能将关键字做为标识符。32个关键字表在P365附录B
变量名,函数名,符号常量名全都是标识符
三、变量
变量的定义格式
类型名变量名;
如inta;定义了一个整型常量a。变量名是由人类随便定义的,符合命名规则的前提下,爱写啥就写啥。所以什么flag,cc,y1或者函数名fun,find等全部是自定的用来做为名字而已,没有更特别的意义。
类型名
int整型,long长整型:用于存放整数,只是数值范围不同
float单精度浮点型double双精度浮点型:用于存放实数,数值范围,精度不同
char字符型:用于存放字符
变量赋值,初始化
inta=3;定义的同时初始化a=6*9;定义后在程序中进行赋值
变量的值只有在赋值操作时才会被改变,即将其放在等号左边时才会改变它的值,或自增自减操作:a=5,a++,a--,像a+3并未改变a的值,只是使用了a
的值而已.
自增自减运算
变量++,++变量,变量--,--变量使变量的值自增1或自减1等价于变量=变量+1变量=变量-1++,--放于变量前后效果的区别:
当自增自减运算做为表达式的一部分时,++,--放在变量前面是先自增自减再使用变量的值,放在变量后面则是先使用变量的值,再自增自减。如x=3;printf(“%d”,++x);则相当于执行了++x;printf(“%d”,x);这样的操作所以打印出4
再如x=3;printf(“%d”,x++);则相当于执行了printf(“%d”,x);x++;这样的操作,则打印出3,当然最后x的值还是4。
四、表达式
运算符和运算对象
一个运算符都有若干个运算对象,如+必然要跟两个运算对象才能进行加法运算:3+5。C语言里称需要跟n个运算对象的运算符为n元运算符。一元运算符有:!,(类型名)二元运算符有:+,-,*,/,%(求余),=,+=,-=,*=,/=,%=,<,>,=,==(等于),!=(不等于),&&(且),||(或)多元运算符有:,
运算符的优先级和结合性
i.优先级:同一个运算对象左右两边若同时有两个运算符,则这两个运算
符优先级高的先进行运算。
ii.结合性:若同一个运算对象左右两边的两个运算符优先级相同,则根据
结合性判断先进行哪个运算,自左自右结合性的先算左边的运算符,自右自左的先算右边的运算符。
iii.各运算符的优先级和结合性见P365附录C强制类型转换
格式:(类型名)表达式。将后跟的表达式的值的数据类型转换为与圆括号内的类型名一致的类型。注意类型名一定要用()括起来。
算术表达式
i.算术运算符:+,-,*,/,%(求余)
ii.由算术运算符加上运算对象构成算术表达式,如3+3*6-9/2iii.值:跟我们小学时学的一样,就是表达式的计算结果iv.整数除以整数结果取整数部分,故1/3得到的值是0v.5%3结果为2,想想小学除法,求余得到的是余数不是商。赋值表达式
i.赋值运算符:=,+=,-=,*=,/=,%=
ii.赋值表达式:变量=表达式,如x=3+6,x+=6-9,x+=x*=3+4注意等号左边只能是变量
iii.复合赋值运算符的运算:以/=为例:x/=表达式等价于x=x/(表达式)iv.值:=号左边的变量最终的值关系表达式
i.关系运算符:<,>,=,==(等于),!=(不等于)
ii.由关系运算符加上运算对象构成关系表达式,如3>=4,2==aiii.值:满足相应运算符所指定的关系的值为1,否则为0逻辑表达式
i.逻辑运算符:&&(且),||(或),!(非)
ii.由逻辑运算符加上运算对象构成逻辑表达式,如3&&4,x||!yiii.值:满足相应运算符所指定的关系的值为1,否则为0
iv.进行||或运算时,若||左边的表达式值为1,则不再对右边的表达式v.
进行运算。进行&&且运算时,若&&左边的表达式值为0,则不再对右边的表达式进行运算。逗号表达式
i.逗号运算符:,
ii.用逗号将各种表达式连续起来构成逗号表达式,如3+4,a=9,8*a
iii.值:组成逗号表达式的各个表达式中的最后一个的值,如上例为8*a题目:P711~17P818~33
五、输入输出函数
scanf(“格式控制串”,变量地址表列);
如scanf(“%d%c%d”,&a,&ch,&b);scanf(“%4f”,&x);注意:
i.格式控制串可控制截取用户输入的前几个字符给变量,但不能控制输入
几位小数给变量,如不能写成scanf(“%4.2f”,&x);
ii.第二个参数给的是地址,即要么是&+变量名或数组元素名的形式,要
么就是一个数组名或指针变量名,如int*p,a;p=&a;scanf(“%d”,p);iii.考试时注意看题目给你写好的scanf的格式1.若其格式控制串内各格式符用“,”隔开如
scanf(“%d,%c,%d”,&a,&ch,&b);那输入时也要用逗号隔开,如此例输入时应:3,+,5
2.若是这种格式scanf(“%d%d”,&a,&b);则输入时应:35;
3.若是这种格式scanf(“%d%c%d”,&a,&ch,&b);则输入时应3+5,若写成3
+5则a=3,ch=‘’(空格),b=任意值(自己上机运行看看结果)
printf(“格式控制串”,输出项表列);
如floatx=7.5;printf(“%8.2f”,x);此处的意思是将x打印出来,且占8列,保留两位小数。自己上机运行看看效果。
常用格式符汇总:
i.%d:输入输出整型数据,%ld:输入输出长整型数据ii.%c:输入输出字符型数据
iii.%f:输出单(双)精度浮点型数据,输入单精度型数
据。%lf:输入双精度型数据
iv.%s:输入输出一个字符串,用printf输出字符串时,输出项书写时可
为字符串常量,或字符数组名。如printf(“%s”,”hello”);或charstr[10]=”hello”;printf(“%s”,str);%u:输入输出无符号整型,%o:输入输出八进制数,%x:输入输出十六进制数
getchar();
函数调用后返回用户输入的一个字符,故需再定义一个变量来存放这个字符,即使用时应charc;c=getchar();意思就是接收用户输入的一个字符,并将其赋值给变量c。
putchar(字符常量或字符变量名);
如charc=A;putchar(c);或putchar(A);都会向屏幕输出字符A。
v.六、C语言的语句
表达式语句:由表达式末尾加上分号构成。
函数调用语句:由函数调用表达式加上分号构成。空语句:;
选择结构语句:if语句switch语句
循环语句:for语句while语句dowhile语句
复合语句:用花括号{}将以上任意语句括起来构成一条复合语句。
七、C程序的基本结构
voidmain()
{声明部分:用来定义变量和声明自定义函数的原型,需以“;”结尾,如intx;执行语句部分:第六点里介绍的各种语句,如x=3;printf(“%d”,x);}
main函数外可写自定义函数。如intmax(){
return0;}
八、选择结构语句
if(表达式)语句1else语句2
如果if语句的圆括号内的表达式值为非0,则执行语句1,值为0则执行语句2。
i.表达式可为任意表达式,if语句执行的实质是判断表达式的值是否为0
来决定执行语句1还是语句2。另外请在此处表达严重关切,不管是高ii.
手还是菜鸟经常会把判断两个数相等的符号“==”写成了一个等号“=”成为了赋值运算,这样的写法不会引发编译错误,但结果会与原意大大不同,所以考试前请再三提醒自己。
语句1和语句2都只能是一个语句,若要跟多条语句,切记用一对{}括起来,构成复合语句;也不要随便在圆括号后加“;”,因“;”构成一条空语句,这会使后面跟的语句1不再属于if语句的组成部分。if语句的三种结构
单边:if(表达式)语句
双边:if(表达式)语句1else语句2多层(重点掌握):
iii.1.2.3.if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3…
else语句n
条件运算符表达式1?表达式2:表达式3
若表达式1的值非0,则取表达式2的值做为整个表达式的值,否则取表达式3的值为整个表达式的值。如3>4?1:2该表达式的值为2switch语句
switch(表达式){case表达式1:语句case表达式2:语句…
case表达式n:语句default:语句}
语句执行过程:先计算表达式的值,然后判断该值与表达式1到表达式n中的哪个相等,若与表达式i的值相等,则执行表达式i后的所有语句,当遇到break;语句时结束整个switch语句的执行。表达式1到表达式n的值都不相等的情况下执行default后跟的语句。每个case后可跟多条语句。
九、循环结构
for循环语句
for(表达式1;表达式2;表达式3)循环体语句语句执行过程:1.计算表达式1
2.判断表达式2的值是否为0,若为0,语句执行结束,若不为0,进入
步骤3
3.执行循环体语句(需注意的是循环体语句只能有一个语句,若要包含多个语句要用一对{}括起来,构成一条复合语句,此处也不要随便加上“;”,因一个“;”可构成一条空语句,这会使得后面真正的循环体语句不属于for循环语句的部分)。进入步骤4
4.计算表达式3,然后重新进入步骤2
while循环语句dowhile循环语句
i.while(表达式)循环体语句执行过程:
1.判断表达式的值是否为非0,若是进入步骤2,否则结束语句执行。2.执行循环体语句,重新回到步骤1。ii.do循环体语句while(表达式);执行过程:
1.执行循环体语句,进入步骤2
2.判断表达式的值是否为非0,若是重新回到步骤1,否则结束语句执行。这里要注意的地方跟for语句一样,即循环体语句只能有一个语句,若要包含多个语句要用一对{}括起来,构成一条复合语句,此处也不要随便加上“;”,因一个“;”可构成一条空语句,这会使得后面真正的循环体语句不属于while循环语句的部分,另外dowhile循环的while(表达式)后是要加“;”的。break语句:放在循环体内实现的功能是结束其所在的那层循环的执行。十、数组
定义格式:数据类型数组名[整型常量];如inta[10];定义了一个整型数
组,数组名为a,这个数组含有10个元素。
引用数组元素:格式:数组名[下标]切记下标值从0开始。下标可为常
量,表达式,变量等,如inti=3;a[0]=5;a[3*2]=9;a[i]=7;
初始化:数据类型数组名[整型常量]={数据表列};将数据表列的各个值
依次赋值给数组的各个元素。如inta[5]={0,1,2,3,4};则数组a各元素a[0]到a[4]的值分别为0,1,2,3,4遍历数组元素
数组定义后,我们不能对数组进行整体的操作,如inta[10];不能用a=3这样的操作将数组的各元素都赋值为3;而只能一个一个元素的进行赋值,如a[0]=3;a[1]=3;a[2]=3…a[9]=3;当然此时我们就可以借助于一个for循环来控制下标的变化从而对数组的各个元素进行赋值for(i=0;istrcat(str1,str2);
则程序运行的结果是str1内存放的字符串变为ABCxyz,当然str2存放的字符串还是xyz。
strcmp(字符串1的地址,字符串2的地址);
比较串1和串2哪个比较大。比较大小的依据是,两个字符串从左往右相应位置上第一个不相等的字符ASCII码值之差。charstr1[20]=”ABCE”,str2[20]=”ABDE”;inti;
i=strcmp(str1,str2);
第一个不相等的字符为str1的‘C’和str2的‘D’,而二者相差-1,故-1做为strcmp函数执行的结果返回到被调用的位置,该位置位于赋值表达式内,故将其值赋值给i,即此时i的值就是-1.
strcpy(字符串1的地址,字符串2的地址);
将字符串2的内容复制到字符串1内。charstr1[20]=”ABC”,str2[20]=”xyz”;
strcpy(str1,str2);此时str1的内容为”xyz”,当然str2的内容没变strcpy(str1,”uvw”);此时str1的内容又变成了“uvw“。
十二、函数
函数定义
函数类型函数名(形式参数列表){
内部变量定义和声明部分执行语句}如:
intmax(intx,inty){intz;
z=x>y?x:y;return(z);}
注意点:
1.函数类型是指返回值的类型,即要与return语句后跟的表达式的值的类型一致。若函数类型为void则说明该函数无返回值,即函数体里不能出现return语句。2.形式参数列表里定义的变量要记得给它们指定类型,而且如果同时要定义多个,应在每个前面都分别指定类型名,而不能写成intx,y;
3.函数体里能写的语句跟main函数一样,在开头可定义所需要的变量,后面跟上一堆执行语句。函数调用流程
以上面的函数为例,在main函数进行调用:voidmain(){inta,b,c;
scanf(“%d%d”,&a,&b);
printf(“%d”,max(a,b));或c=max(a,b);printf(“%d”,c)以上两种方法都会在屏幕中打印出a,b间的较大值。
调用函数的格式函数名(实际参数列表);调用的时候像什么函数类型,形式参数的类型就不要加上去了。max(a,b)中max就是函数名,写上变量名a,b是实际参数列表,执行这个调用语句时,会先把a,b的值给相应位置的形式参数即执行了x=a,y=b这样的操作,然后开始执行max函数的函数体的语句。当max函数体里执行到一个return语句时,则max函数结束执行,将return后的表达式的值返回给main函数调用max函数的那个位置,即若上面a=3,b=5则max(a,b)return后的表达式的值应该是5也就是说执行完max后把5返回到调用max的位置可看成printf(“%d”,5);或另一种解法的c=5。}
十三、指针
指针变量的声明:类型名*指针变量名;通过指针变量访问它所指向的普通变量的值
先将普通变量的地址赋值给指针变量,再通过指针运算符*得到普通变量的值。int*p,x,y;x=3;p=&x;
则printf(“%d”,*p);会打印出3即x的值y=*p;则y的值变为3*p=5;则x的值变为5
指针变量加上(减去)一个位移的效果
若指针变量存入的是数组元素的地址,则其加一减一得到的是那个数组元素下一个或前一个元素的地址。inta[10];p=&a[3];
*p得到的是a[3]的值。
若p++;此时p存放的是a[4]的地址&a[4];*p得到的就是a[4]的值。或p--;此时p存放的是a[2]的地址&a[2],*p得到的就是a[2]的值。
行指针
i.主要是对于二维数组来说的,二维数组每行都有自己的地址,第0行地
址用数组名表示,第i行地址为数组名+i;而想要得到二维数组里一个元素的地址,必需先得到其所在行的地址,然后再由那个地址得到元素的地址,比如说inta[3][4];定义了一个二维数组,该二维数组第0行的地址为a,第1行的地址为a+1,第2行的地址为a+2,想从行的地址得到元素的地址,需在行地址前加上指针运算符“*”,即*a就是第0行首个元素的地址即a[0][0]的地址,而a[0][2]的地址就是在a[0][0]的地址基础上加上位移量2,即*a+2,然后想得到a[0][2]这个元素的值呢就再加上一个指针运算符“*”,即*(*a+2),类似地,想得到a[2][2]这个元素的值呢就是*(*(a+2)+2)
ii.定义行指针变量:类型名(*变量名)[数组长度];
如int(*p)[4],a[3][4];p=a;此时就可把p当成a来用,用法同上所述。
判断是否合法访问数组元素:若是指针法访问,判断指针后跟的是否地址;
若是下标法访问,判断下标有无越界。函数指针:函数名即为函数的地址(指针)
i.函数指针变量的定义:类型名(*变量名)(形参列表);如int(*p)();ii.赋值:指针变量=函数名;设有个函数其函数名为max,则要将该函数的
地址给p的话只要执行如下语句即可p=max;
指针数组:指针数组的数组元素都是指针变量,是用来存放变量的地址的,
定义格式为类型名*变量名[数组长度];如int*p[10];指向指针的指针:指针变量也是一种变量,故在内存中也有对应的一个地址,
而要存放指针变量的地址,就要求助于用来存放指针变量的地址的指针变量,定义格式类型名**变量名;如int*p1;int**p2;inta=3;可进行赋值p1=&a;p2=&p1;则a、*p1和**p2的值都是3.
十四、宏定义
无参宏定义#define标识符值定义后,出现所定义的标识符的地方都
将以定义时指定的值来代替。
#defineM2+3main(){intx;
x=M*M;则x的值为2+3*2+3=11若想得到的结果是(2+3)*(2+3)则定义时也写成这样#defineM(2+3)}
注意#define、标识符、值之间都要用空格隔开,且宏定义结尾不需加分号。带参宏定义#define标识符(参数表)值
#defineS(x,y)x*ymain()
{inta=3,b=4,c=5,d=6;
printf("a*b=%d\\n",S(a,b));此时会打印出a*b=12
printf("a+b*c+d=%d\\n",S(a+b,c+d));此时会打印出a+b*c+d=29,带参宏定义执行时是将a+b这样一个表达式代替x,c+d这样一个表达式代替y,所以S(a+b,c+d)进行的是a+b*c+d的运算,而不是将a+b的值给x,c+d的值给y然后再做x*y,这点跟函数调用传递参数是不一样的。}
自定义类型名typedef:对已存在的类型名取一个外号。
i.基本格式:typedef原类型名新类型名;
ii.typedefintINTEGER;则inta,b;等价于INTEGERa,b;
iii.typedefintNUM[10];则inta[10];等价于NUMa;a即为一个有10
个元素的数组的数组名。
iv.typedefint*INTEGER;则int*a,*b;等价于INTEGERa,b;
十五、结构体,共用体,枚举类型
结构体
i.结构体类型的定义及变量的定义
struct结构体名{类型成员1;类型成员2;……
类型成员n;}变量名;如
structstudent{longnum;charname[10];intscore[4];
}st1;定义类型时同时定义变量
structstudentst2;定义类型后,用类型名定义变量还有一种struct
{longnum;
charname[10];intscore[4];
}st3;不给类型名,直接定义变量
ii.结构体变量所占字节数:各成员各占字节数之和,如以上st1,st2,st3的
字节数皆为10+20+2*4=38
iii.结构体变量初始化:structstudenta={201*0001,"张三",70,75,80,85};iv.结构体数组定义及初始化:
structstudenta[3]={{201*0001,"zhang",89,90,91,92},{201*0002,"liu",68,69,70,71},{201*0003,"li",57,58,59,60}};v.结构体变量成员的访问
1.结构体变量名.成员名如st1.num2.使用结构体类型的指针:
(*结构体指针名).成员或结构体指针名>成员名structstudent*st;st=&st1;st->num或(*st).num共用体
i.共用体类型的定义及变量的定义
union共用体名{类型成员名1;
…类型成员名n;
};
变量的定义与结构体类似,也有三种方法。uniondata{
inti;charch;floatf;
}d1;定义类型时同时定义变量
uniondatad2;定义类型后,用类型名定义变量union{
inti;charch;floatf;
}d3;不给类型名,直接定义变量
ii.共用体变量所占字节数:各成员所占字节数的最大值,如上d1,d2,d3所
占字节数皆为4.(单精度浮点型变量所占字节数最多为4).iii.共用体变量成员的访问
1.共用体变量名.成员名如d1.i2.使用共用体类型的指针:
(*共用体指针名).成员或共用体指针名>成员名uniondata*dd;dd=&d1;dd->i或(*dd).i
iv.共用体成员的值:由于共用体各成员共用同一段内存区,故同一时刻
只有一个成员的值是正确的。如d1.i=5;d1.ch=’a’;则此时d1.i的值就不是5了,而是其他值了,d1.ch的值是’a’
枚举类型
i.枚举类型的定义:
enum枚举名{枚举元素名1,枚举元素名2,…,枚举元素名n};ii.枚举元素的值:
默认值分别为0、1、…、n-1。枚举元素的值也可在定义时重指定,对于没有指定值的元素,按顺序加1
如enumweekday{sun=7,mon=1,tue,wend,thur,fri,sat};则sun值为7,mon值为1,tue值为2,wend值为3,thur值为4,fri值为5,sat值为6
友情提示:本文中关于《c语言总结》给出的范例仅供您参考拓展思维使用,c语言总结:该篇文章建议您自主创作。
来源:网络整理 免责声明:本文仅限学习分享,如产生版权问题,请联系我们及时删除。