资源预览内容
第1页 / 共26页
第2页 / 共26页
第3页 / 共26页
第4页 / 共26页
第5页 / 共26页
第6页 / 共26页
第7页 / 共26页
第8页 / 共26页
第9页 / 共26页
第10页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
声明 使用本课件至少128M内存,并使用office 2000以上版本或使用自带播放工具pptview。 使用本课件请配合选用人民邮电出版社出版的c/c+程序设计教程。 如有任何意见和建议请发电子邮件件到 guoxiaogang5381sina.com或 fengwork.studentsina.comEvaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.1七、函数初步七、函数初步 八、八、C/C+程序上机步骤简介程序上机步骤简介 Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.2七、函数初步七、函数初步 C/C+程序通过函数运转,函数操作数据和变量。程序通过函数运转,函数操作数据和变量。 程序根据源代码出现的先后次序一个一个语句地顺序往程序根据源代码出现的先后次序一个一个语句地顺序往后执行,称为顺序流程结构。后执行,称为顺序流程结构。 遇到函数调用则流程转入被调用的函数体,然后从被调遇到函数调用则流程转入被调用的函数体,然后从被调函数返回,执行函数调用的下一条语句。函数返回,执行函数调用的下一条语句。 在编辑输入上面的代码时请注意在编辑输入上面的代码时请注意: 新的集成开发环境支新的集成开发环境支持汉字出现在字符串中,但汉字环境的标点符号与英文环境持汉字出现在字符串中,但汉字环境的标点符号与英文环境的标点符号其编码是不一样的,因此在字符串之外的标点符的标点符号其编码是不一样的,因此在字符串之外的标点符号一定要保证在英文环境中输入,否则导致源代码的语法错号一定要保证在英文环境中输入,否则导致源代码的语法错误。误。 Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.3例例 C流文件及函数调用实现顺序流程流文件及函数调用实现顺序流程 #include /void型函数型函数vf的定义,放置于主控函数前的定义,放置于主控函数前 void vf (int x, int y, int s) / void表示函数没有返回值,形参表示函数没有返回值,形参x,y,z是是int型的变量型的变量 printf (%d, %dn, x+y, s); /花括号包含的语句表示函数体花括号包含的语句表示函数体 int Add (int ,int ); /Add函数原型说明函数原型说明,表示入口形参为表示入口形参为2个个int型数据型数据,返回返回int型数据型数据 void Show()/圆括号中一无所有表示入口无参圆括号中一无所有表示入口无参,void Show()相当于相当于 void Show (void) printf (输入两个整数输入两个整数t); Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.4 int main (void) /圆括号中的圆括号中的void表示表示main函数此时没有入口参数,返回函数此时没有入口参数,返回int型数据型数据 int i, j, sum; /*变量定义语句变量定义语句*/ Show () ; /*提示输入两个整数提示输入两个整数*/ scanf (%d, %d, &i, &j); /*读入整数分别给变量读入整数分别给变量j,k*/ sum = Add (i, j); /*函数调用求和函数调用求和*/ printf (Sum is %dt, sum); /*屏幕上显示出和屏幕上显示出和*/ vf (i, j, Add (i, j); /vf(i,j,Add(i,j)等价于等价于vf (i, j, sum); return 1; /*返回信息给操作系统是好的编程风格返回信息给操作系统是好的编程风格*/Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.5 int Add (int l, int m) /*定义定义Add函数函数,函数的返回类型为整型函数的返回类型为整型*/ /*入口参数入口参数 l,m是整型是整型*/ return l+m ; /*直接返回直接返回l,m数的和数的和*/ / 函数调用函数调用Add(i,j)根据返回类型确定为根据返回类型确定为int型的表达式型的表达式执行程序得到:执行程序得到:输入两个整数输入两个整数 5,6Sum is 11 11,11 Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.6 在编辑输入上面的代码时请注意,新的集成开发环境支在编辑输入上面的代码时请注意,新的集成开发环境支持汉字出现在字符串中,但汉字环境的标点符号与英文环境持汉字出现在字符串中,但汉字环境的标点符号与英文环境的标点符号其编码是不一样的,因此的标点符号其编码是不一样的,因此在字符串之外的标点符在字符串之外的标点符号一定要保证在英文环境中输入,否则导致源代码的语法错号一定要保证在英文环境中输入,否则导致源代码的语法错误。误。 本程序包括用户定义的函数:主函数本程序包括用户定义的函数:主函数main()和普通的函和普通的函数数Add以及以及vf。另外借用了系统提供的库函数。另外借用了系统提供的库函数。 在在stdio.h给出了标准输入函数给出了标准输入函数scanf标准输出函数标准输出函数printf的原型说明。的原型说明。 Add函数的作用是求两个整型变量的和,函数的作用是求两个整型变量的和,return关键字关键字所引出的语句将整型变量所引出的语句将整型变量l和和m的和返回给主函数的和返回给主函数main,返,返回值是通过函数调用的方式进行的。回值是通过函数调用的方式进行的。Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.7程序主要包括如下程序主要包括如下6个步骤:个步骤: 1. 变量的定义变量的定义 2. 变量的初始化过程变量的初始化过程 3. 用户与计算机实时交互用户与计算机实时交互 4. 算法的模块化处理函数算法的模块化处理函数 5. 函数调用的虚实结合匹配函数调用的虚实结合匹配 6. 控制权的带信息返回控制权的带信息返回 Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.8 C/C+程序设计中变量必须明显地定义才能使用,这程序设计中变量必须明显地定义才能使用,这一点区别于一点区别于FORTRAN语言存在变量的隐含说明。语言存在变量的隐含说明。 语句语句int i, j, sum; 称为变量定义语句,称为变量定义语句,int是系统是系统保保留的关键字,留的关键字,i, j, sum则是用户引入的变量,变量定义语则是用户引入的变量,变量定义语句通知编译器为这些变量分配内存空间。句通知编译器为这些变量分配内存空间。 对引入的变量赋予初值,称为变量的初始化。变量初始对引入的变量赋予初值,称为变量的初始化。变量初始化的位置和时刻是灵活的,变量的初始值可以位于本程序段化的位置和时刻是灵活的,变量的初始值可以位于本程序段内、硬盘上或动态交互输入。内、硬盘上或动态交互输入。 函数调用的虚实结合匹配是指函数定义部分的形参与函函数调用的虚实结合匹配是指函数定义部分的形参与函数调用时的实参一对一的呼应和结合过程,这一过程涉及到数调用时的实参一对一的呼应和结合过程,这一过程涉及到语言隐含的函数调用机制。语言隐含的函数调用机制。Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.9 C语言中的函数调用机制为变量的数值传递,因此虚实语言中的函数调用机制为变量的数值传递,因此虚实结合匹配的时候采用了一个中转站这就是变量的地址。结合匹配的时候采用了一个中转站这就是变量的地址。 通过中转站间接的完成被调函数对变量的赋值或改变。通过中转站间接的完成被调函数对变量的赋值或改变。 输入语句输入语句scanf (%d, %d, &i, &j); 在屏幕上读变量在屏幕上读变量i和和j的值,变量的值,变量i和和j之前分别加上了取地址运算符之前分别加上了取地址运算符&。 而输出语句而输出语句printf (Sum is %dn, sum); 的变量的变量sum前则没有取地址运算符前则没有取地址运算符&。 %d, %d是输入输出的格式化字符串,用来指示输入是输入输出的格式化字符串,用来指示输入输出的数据类型和格式转换,输出的数据类型和格式转换,%d表示十进制整数类型,表示十进制整数类型, 有了这种格式化转换函数,系统就把内存中的二进制数有了这种格式化转换函数,系统就把内存中的二进制数据转换成用户可理解的数据类型。据转换成用户可理解的数据类型。 Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.10 函数是重要的编程手段,其中包括三个相关的函数是重要的编程手段,其中包括三个相关的步骤:步骤: 1. 函数具体定义函数具体定义 int Add (int l, int m) return l+m; /l, m是形参,是形参, 2. 函数原型说明函数原型说明 int Add (int l, int m); /形参的初始值在虚实结合时得到形参的初始值在虚实结合时得到 3. 函数调用虚实结合匹配函数调用虚实结合匹配 sum = Add (i, j); /i, j是匹配形参是匹配形参l, m的实参的实参Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.11 函数定义对应函数的某种执行动作,函数定义由标题头函数定义对应函数的某种执行动作,函数定义由标题头和函数体构成,标题头由返回类型、函数名和形参列表构和函数体构成,标题头由返回类型、函数名和形参列表构成。成。例如:例如: int Add (int l, int m)是标题头是标题头,return l+m; 是函数体是函数体 函数原型表明函数的接口要求,虚实结合匹配在函数调函数原型表明函数的接口要求,虚实结合匹配在函数调用点进行,函数调用时将实参用点进行,函数调用时将实参i, j 的值赋值给相应形参的值赋值给相应形参l, m;相当于相当于l=i, m=j。 函数的返回类型函数的返回类型int与与return中的表达式匹配。中的表达式匹配。 一般地,一般地,C/C+程序是通过变量和函数来组织的。变量程序是通过变量和函数来组织的。变量用于识别内存的数据,函数则对这些数据进行操作和转换处用于识别内存的数据,函数则对这些数据进行操作和转换处理。理。Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.12 文本编辑器文本编辑器 编译器编译器源文件源文件1.cpp头文件头文件2.h头文件头文件1.h源文件源文件2.cpp 连接器连接器 库文件库文件.lib其它目标文件其它目标文件.obj目标文件目标文件1.obj目标文件目标文件2.obj编译错编译错 执行程序执行程序.exe连接错连接错 预处理器预处理器运行错运行错 成功成功! 修改当前修改当前的的源源文文件件错错误误解决各文件解决各文件名名称称唯唯一一性性或遗漏或遗漏排除逻辑错排除逻辑错误或越界、误或越界、内存冲突等内存冲突等图图 C/C+程序的开发过程程序的开发过程 Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.13 一般地,一般地,C/C+程序是通过变量和函数来组织的。变程序是通过变量和函数来组织的。变量用于识别内存的数据,函数则对这些数据进行操作和转换量用于识别内存的数据,函数则对这些数据进行操作和转换处理。函数根据返回类型是否有值分两类,其定义格式分两处理。函数根据返回类型是否有值分两类,其定义格式分两种:种: 1. 不返回值的函数,称为不返回值的函数,称为void型的函数型的函数 void vf (类型类型1 形参形参1,类型类型2 形参形参2,.,类型类型n 形参形参n) 语句序列;语句序列; return; /函数体函数体 例:例: void vf (int x, int y, int s) printf (%d, %dn, x+y, s); Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.14 2. 返回确定类型值的函数返回确定类型值的函数 type f (T1 v1, T2 v2 ,., Tn vn) /*返回类型返回类型 函数名函数名(形参列表形参列表)*/ 语句序列;语句序列; return expre; 例:例: int Add (int l, int m) int z=l + m; return z; type表函数的返回类型表函数的返回类型,T1,T2,Tn表示形参的类型名,表示形参的类型名,它们可以是它们可以是int,double 以及结构名等以及结构名等; f, vf, Add是函数名。是函数名。Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.15 返回类型返回类型 函数名函数名(形参列表形参列表) 称为函数定义的标题称为函数定义的标题头,标题头圆括号中形参类型后的参数头,标题头圆括号中形参类型后的参数 v1,v2,.,vn为形式为形式参数,简称形参。参数,简称形参。 类型名、函数名和形参名遵循标识符的命名约定。将标类型名、函数名和形参名遵循标识符的命名约定。将标题头拷贝过来,末尾添一个分号得到函数原型,其中的形参题头拷贝过来,末尾添一个分号得到函数原型,其中的形参v1,v2,.,vn可省略,格式为可省略,格式为(左边为抽象的原型描述,右边左边为抽象的原型描述,右边为具体的举例为具体的举例): type f (T1 v1,T2 v2 ,.,Tn vn); int Add (int , int); 函数的标题头和函数体构成函数定义,紧接着右圆括函数的标题头和函数体构成函数定义,紧接着右圆括号号”)”的最外层花括号的最外层花括号包含的部分为函数体。包含的部分为函数体。 函数体由若干语句构成,也可以根本没有语句,此时函数体由若干语句构成,也可以根本没有语句,此时称为空函数。称为空函数。Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.16 函数定义时标题头的形参可以省略而仅有类型,此时表函数定义时标题头的形参可以省略而仅有类型,此时表示函数简单的提供一个接口准备。示函数简单的提供一个接口准备。 也可以根本没有入口参数。也可以根本没有入口参数。例如:例如: void Show () printf ( 输入两个整数输入两个整数t); 。 expre是可以转换为是可以转换为 type类型的表达式。类型的表达式。type如果是如果是int,则函数运算的结果返回,则函数运算的结果返回int型整数。型整数。 形参是入口,可以是各种类型的变量,也可以是指向这形参是入口,可以是各种类型的变量,也可以是指向这些变量的指针。些变量的指针。 函数返回的数据为出口,函数可以返回变量,也可以返函数返回的数据为出口,函数可以返回变量,也可以返回指针,指针是特殊的变量。回指针,指针是特殊的变量。Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.17 如果如果return之后跟随表达式语句,表示将表达式的值转之后跟随表达式语句,表示将表达式的值转送给上层函数,此时函数返回确定类型的数据。送给上层函数,此时函数返回确定类型的数据。 如果如果return 语句之后紧贴一个分号或函数体中无语句之后紧贴一个分号或函数体中无return语句,这样的函数的返回类型则写为语句,这样的函数的返回类型则写为void,表示函数不返回,表示函数不返回值而仅执行特定的运算或动作。值而仅执行特定的运算或动作。 函数调用点实际代替形参的变量或表达式称为实际参函数调用点实际代替形参的变量或表达式称为实际参数,简称实参。实参是调用段可以求值的表达式。数,简称实参。实参是调用段可以求值的表达式。 函数调用由函数名、圆括号对和逗号依次分隔开的若干函数调用由函数名、圆括号对和逗号依次分隔开的若干实参构成。函数名与圆括号对是必不可少的,在无参调用时实参构成。函数名与圆括号对是必不可少的,在无参调用时没有实参。没有实参。例如:例如: Show();Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.18 函数调用就是用具体的实参代替形参的过程,实参函数调用就是用具体的实参代替形参的过程,实参x1, x2,xn应与形参列表的形参应与形参列表的形参v1,v2,.,vn在位置、类型和个在位置、类型和个数上一一匹配。数上一一匹配。 实参是形参的数据来源,是形参的初值。实参是形参的数据来源,是形参的初值。 在函数调用点相当于执行了在函数调用点相当于执行了v1=x1,v2=x2,.,vn=xn的的初始化赋值运算。初始化赋值运算。 不返回值的函数不返回值的函数vf单独调用单独调用 : vf (x1, x2, ., xn); 例:例: vf (i, j, sum); vf (i, j, Add ( i, j ); void类型的函数一般仅独立调用,由此构成函数调用类型的函数一般仅独立调用,由此构成函数调用语句。语句。Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.19 返回值的函数调用是表达式,简称函数调用是表达式。返回值的函数调用是表达式,简称函数调用是表达式。返回值的函数调用归属于表达式,可以说返回值的函数调用归属于表达式,可以说C/C+语言是一种语言是一种构筑于表达式之上的语言。构筑于表达式之上的语言。 表达式是求值的基本单位,变量和常数是最简单的表达表达式是求值的基本单位,变量和常数是最简单的表达式。变量和常数与运算符的组合可构成复杂的表达式。式。变量和常数与运算符的组合可构成复杂的表达式。例如:例如: l+m, sum=Add (i, j), 7+m/2*3 是表达式。是表达式。表达式之后加一个分号形成表达式语句,表达式之后加一个分号形成表达式语句,例如:例如: sum=Add (i , j); 是表达式语句。可多次在赋值运算符是表达式语句。可多次在赋值运算符 = 左边出现的表达式左边出现的表达式是左值表达式,否则是右值表达式。变量是左值,常数是右是左值表达式,否则是右值表达式。变量是左值,常数是右值。值。Add (i, j) 是右值。是右值。Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.20 返回值的函数调用返回值的函数调用f (x1, x2 ,., xn) 携带携带return expre;返回的值。表达式返回的值。表达式expre能够出现的地方,能够出现的地方,f (x1, x2, ., xn)几乎可以等价的出现。几乎可以等价的出现。 但但C语言返回算术表达式或返回指针表达式的函数调用语言返回算术表达式或返回指针表达式的函数调用构成右值。构成右值。C+增添了返回左值的函数调用,这才是全部等增添了返回左值的函数调用,这才是全部等价的映射。价的映射。 出现在函数体中函数调用里的函数名视为被调函数,函出现在函数体中函数调用里的函数名视为被调函数,函数体所隶属的函数名则称为主控函数。如函数名数体所隶属的函数名则称为主控函数。如函数名Add出现在出现在main函数体中,因此函数体中,因此Add函数是函数是main函数的被调函数,函数的被调函数,main函数是函数是Add函数的主控函数。函数的主控函数。 如果如果Add函数体中调用其它的函数如函数体中调用其它的函数如add1,则,则Add函函数是数是add1函数的主控函数。函数的主控函数。Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.21 C+中函数调用可以出现在中函数调用可以出现在main函数体之外的初始化函数体之外的初始化语句,此时函数被系统直接调用。主控函数也称为主调函语句,此时函数被系统直接调用。主控函数也称为主调函数。数。 函数定义或函数原型引入或说明函数名称。函数定义提函数定义或函数原型引入或说明函数名称。函数定义提供函数体中的执行代码。供函数体中的执行代码。C/C+中函数名具有全局作用范中函数名具有全局作用范围。围。 函数体中不能定义函数,仅在函数体外定义函数。每一函数体中不能定义函数,仅在函数体外定义函数。每一个函数定义是独立的,函数的定义次序不影响函数调用。个函数定义是独立的,函数的定义次序不影响函数调用。函数可以调用任何函数包括自身。函数调用索引函数名称。函数可以调用任何函数包括自身。函数调用索引函数名称。 名称先说明后索引。名称先说明后索引。C+中每个函数调用都必须有一个中每个函数调用都必须有一个函数原型,除非函数定义直接放置于主控函数前。函数原型,除非函数定义直接放置于主控函数前。Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.22八、八、C/C+程序上机步骤简介程序上机步骤简介 本节简单介绍用本节简单介绍用Microsoft Visual C+提供的开发工具提供的开发工具生成生成console即字符方式的应用程序,如果使用其它厂商的即字符方式的应用程序,如果使用其它厂商的编译器,细节会略有不同,但编辑、编译、连接和运行的四编译器,细节会略有不同,但编辑、编译、连接和运行的四个步骤是必不可少的。个步骤是必不可少的。 可以一气呵成地执行整套动作,也可以选择性地实施其可以一气呵成地执行整套动作,也可以选择性地实施其中一个环节下面简要地说明程序产生的步骤中一个环节下面简要地说明程序产生的步骤(以微软的以微软的Developer Studio集成应用程序为例集成应用程序为例): 1. 启动启动Microsoft Visual C+编译系统编译系统 2. 从菜单上选择从菜单上选择File-New,或按,或按Ctrl+N打开打开New对话框对话框Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.23 3. 选取或激活选取或激活New对话框的对话框的Projects工程项目,以便工程项目,以便.生成生成. dsw(Developer Studio workspace)文件。)文件。 4. 进一步鼠标点击程序类型进一步鼠标点击程序类型Win32 Console Application,在在Project name下键入工程下键入工程名如:名如:dosApp1,将该工程文件置于一合适的磁盘路径,将该工程文件置于一合适的磁盘路径Location下下,如:如: c:mydocdosApp,最后单击最后单击New对话框的对话框的OK按钮。此时弹出一个对话框。按钮。此时弹出一个对话框。 5. 在四个选项中单选在四个选项中单选 An empty project ,然后点取,然后点取Finish按钮,在弹出的信息对话框中,鼠标点击按钮,在弹出的信息对话框中,鼠标点击OK按钮。按钮。 到此系统生成并打开一个新项目工作区。到此系统生成并打开一个新项目工作区。Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.24 6. 从菜单上选择从菜单上选择File-New,或按,或按Ctrl+N打开打开New对话对话框。框。 7.激活激活New对话框的对话框的Files标签,选择标签,选择C+ Source File,在在File name下的空白处键入源文件名如下的空白处键入源文件名如:example1,鼠标点击,鼠标点击OK按钮。此时进入全屏幕编辑环境,按钮。此时进入全屏幕编辑环境,用户可输入源程序。用户可输入源程序。 8.从菜单上选择从菜单上选择Build-compile 即可编译源程序,或即可编译源程序,或Build-Build直接生成执行程序。直接生成执行程序。 9. 调试程序直到没有编译或连接错误。调试程序直到没有编译或连接错误。 10. 直接在集成环境按直接在集成环境按Ctrl+F5执行该程序且按任意键通执行该程序且按任意键通常方便的是空格键结束程序。常方便的是空格键结束程序。Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.25Evaluation only.Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0.Copyright 2004-2011 Aspose Pty Ltd.26
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号