《C自定义数据类型》PPT课件.ppt

上传人:za****8 文档编号:2988917 上传时间:2019-12-05 格式:PPT 页数:39 大小:943.01KB
返回 下载 相关 举报
《C自定义数据类型》PPT课件.ppt_第1页
第1页 / 共39页
《C自定义数据类型》PPT课件.ppt_第2页
第2页 / 共39页
《C自定义数据类型》PPT课件.ppt_第3页
第3页 / 共39页
点击查看更多>>
资源描述
,自定义数据类型,思考:请大家定义一个学生变量,能够描述你的姓名、学号、宿舍地址、联系电话、出生 年月。,在前面章节里所使用的数据(整型、字符、浮点型)是C+预先定义的基本数据类型,但是在有些时候,仅用这些基本数据很难描述清楚客观世界。 在程序开发过程中,经常遇到要处理的对象用C+预先定义的基本数据类型不能全面描述的情况。 C+允许我们自己定义数据类型,通过自定义数据类型来更好的描述客观世界 。,结构,C+允许程序员使用结构这种自定义的数据类型来解决这个矛盾。 通过结构,可以将C+的基本数据类型组合起来形成一个有机的整体来描述具体的对象。不论要描述的对象有多么复杂,只需要把它的属性抽象出来,然后用C+的基本数据类型来描述,就可以把这个对象很好地描述清楚。,结构的定义,结构定义的一般形式是: struct 结构名 数据类型 成员名1; 数据类型 成员名2; 数据类型 成员名n; ;,前面提到的可以用于描述学生信息的结构定义如下: struct Student int nID; char szName20; char szAddr100; char szBirthday10; char szPhone15; float fScore; ; /注意,“;”表示结构定义结束。,在定义结构的成员时,成员的数据类型可以是任何一个C+的基本数据类型,或者是自定义的数据类型。 也就是说结构的成员可以是另外一个结构或者其他复杂的自定义的数据类型。通过这样的组合关系,C+可以用结构描述非常复杂的数据对象。 在定义结构的成员时,成员的命名规则和普通变量的命名规则是一样的。,值得注意的是,C+把struct关键字描述的内容当作了一种数据类型,当用struct关键字定义一个结构时,C+不会为这个结构分配内存。 只有当用这种数据类型定义了变量时,C+才会为这个变量分配内存。,结构的成员也可以是另外一个结构变量。如在前面关于学生基本信息的定义,可以用一个结构来定义学生的出生日期,如: struct Date /定义表示日期的结构 int nYear; int nMon; int nDay; ;,struct Student1 int nID; /整型成员 char szName20; /字符型成员 /用结构Date定义的结构变量来表示出生日期 Date dtBirthday; char szAddr100; /字符型成员 char szPhone15; /字符型成员 float fScore; /浮点型成员 ;,使用结构,定义了结构之后,就可以用该结构定义相应的结构变量,C+会为这个结构变量分配内存。例如,前面已经定义了Student结构,现在可以用如下的方式定义结构变量: Stucent s; 现在,C+已经为结构变量s分配了空间,但由于没有初始化s,s的各成员的值是随机的。初始化结构变量s可以有两种方法:,结构变量初始化,一种方法是在定义结构变量的同时进行初始化,如: Student s=1,“李明“,“1989-10-15“,“解放路号“,“83647526“,93.5; 另一种方法是在定义了结构变量之后,通过访问结构成员的方法给结构成员赋初值。C+提供了点操作符“.”来访问结构成员,可以通过“结构变量名.成员名”的方式来读取结构成员的值或者为结构成员赋值。,/*例17-1 定义和使用结构*/ struct Student int nID; char szName20; char szAddr100; char szPhone15; float fScore; ; void main() Student s; s.nID = 1; strcpy(s.szName,“李明“); strcpy(s.szAddr,“解放路号“); strcpy(s.szPhone,“83647526“); s.fScore = 93.5; cout“学生的学号是:“s.nIDendl; cout“学生的姓名是:“s.szNameendl; cout“学生的住址是:“s.szAddrendl; cout“学生的联系电话是:“s.szPhoneendl; cout“学生的入学成绩是:“s.fScoreendl; ,对于Student1这样的复杂结构,也可以采用上面的两种方法初始化结构变量。如: Student1 s1=1,“李明“,1984,10,15, “解放路号“,“83647526“,93.5; 或者: Student1 s1; s1.nID = 1; strcpy(s1.szName,“李明“); s1.dtBirthday.nYear = 1984; s1.dtBirthday.nMon = 10; s1.dtBirthday.nDay = 15; strcpy(s.szAddr,“解放路号“); strcpy(s.szPhone,“83647526“); s.fScore = 93.5;,同一个结构定义的结构变量之间是可以相互赋值的。如: student s=1,“李明“,“1984-10-15“,“解放路号“,“83647526“,93.5; student s2 = s; 结构变量s2的各个成员和结构变量s的各个成员的值一样。输出s2成员的值: cout“学生的学号是:”s2.nIDendl; cout“姓名是:“s2.szNameendl; cout“出生日期是:”s2.szBirthdayendl; cout“住址是:“s2.szAddrendl; cout“联系电话是:“s2.szPhoneendl; cout“入学成绩是:“s2.fScoreendl;,结构与指针,当用结构定义结构变量后,C+会为该结构变量分配内存。既然结构变量有地址,自然可以将这个结构变量的地址赋给结构指针,然后通过指针来访问结构成员。 在C+中,用结构指针访问结构成员,需要用到箭头操作符“-”。即采用指针变量-成员名 的方式访问结构成员。下面的例子展示了使用结构指针访问结构成员。,/*例17-2 使用指针访问结构成员*/ struct Student int nID; char szName20; char szBirthday15; char szAddr100; char szPhone15; float fScore; ; void main() Student s; Student *ps; ps = ,strcpy(ps-szAddr,“解放路号“); strcpy(ps-szPhone,“83647526“); ps-fScore = 93.5; coutnIDszNameszBirthdayszAddrszPhonefScoreendl; ,注意:使用指针ps访问结构成员时,必须使用需要使用箭头操作符 “-”。 如果要动态创建一个结构变量,也需要使用结构指针,如: Student *ps = new Student; 在这条语句里,使用了new关键字在堆里动态创建了一个结构变量,并通过指针指向这个结构变量,然后可以使用指针变量-成员名的方式访问这个在堆空间里的结构变量的成员,如:,ps-nID = 1; strcpy(ps-szName,“李明“); 对于动态分配的空间,在使用完后,需要用delete手动释放所分配的空间: delete ps;,结构与数组,前面已经定义了student结构,可以描述一个学生的信息。现在描述一个班的学生档案用于学习管理系统开发。 这时,可以用结构数组来描述这个群体。 和C+的基本数据类型一样,结构作为一种数据类型也可以用来定义数组。结构数组的每一个元素都是一个结构类型的数据。,结构数组定义,定义结构数组的一般形式是: 结构名 数组名数组长度 如:Student s5; /定义一个包含5个元素的数组,每个数组元素都是Student型的结构变量。 定义好结构数组后,可以用“.”操作符访问数组每个元素的成员的方法给结构数组赋初值,如: s0.nID = 1; 也可在定义结构数组的同时,给结构数组的每一个元素赋初值,如:,Student s5 = 1,“李明“,“1984-10-15“, “解放路号“,“83647526“,93.5, 2,“张强“,“1984-07-12“,“凯旋路号“, “83568971“,82.0, 3,“王雨“,“1984-09-25“,“德胜路号“, “83836541“,96.5, 4,“赵新“,“1984-02-27“,“和平路号“, “83742349“,87.5, 5,“孙刚“,“1984-12-16“,“东大街号“, “83536382“,89.0;,用结构数组来描述一类数据后,可以用循环等方法方便的对这些数据进行处理。 /*例17-3 结构数组使用举例*/ struct Student int nID; char szName20; char szBirthday15; char szAddr100; char szPhone15; float fScore; ;,void main() float fAverage ; float fSum = 0.0; /下面再定义结构数组的同时给每个数组元数赋初值 Student s5 = 1,“李明“,“1984-10-15“, “解放路号“,“83647526“,93.5, 2,“张强“,“1984-07-12“, “凯旋路号“,“83568971“,82.0, 3,“王雨“,“1984-09-25“, “德胜路号“,“83836541“,96.5, 4,“赵新“,“1984-02-27“, “和平路号“,“83742349“,87.5, 5,“孙刚“,“1984-12-16“, “东大街号“,“83536382“,89.0 ;,for(int i=0;i5;i+) cout“学生的学号是:”si.nIDendl; cout“学生的姓名是:“si.szNameendl; cout“出生日期是:” si.szBirthdayendl; cout“学生的住址是:“si.szAddrendl; cout“联系电话是:” si.szPhoneendl; cout“学生的入学成绩是:” si.fScoreendl; coutendl; fSum += si.fScore; fAverage = fSum / 5; cout“所有学生的总成绩是:“fSumendl; cout“所有学生的平均成绩是:“fAverageendl; ,结构与函数,定义一个函数,然后将要打印的结构变量作为参数传递给函数,由函数处理打印事务。将前面的班级学生的基本信息打印显示到屏幕上。 结构可以作为函数的参数,也可以让函数返回一个结构变量。 结构作为函数的参数时,也可以按照值传递、指针传递和引用传递的方式进行参数传递。,/*例17-4 结构作为函数的参数*/ #include #include using namespace std; struct Student int nID; char szName20; char szBirthday15; char szAddr100; char szPhone15; float fScore; ; void PrintInfoByValue(Student s); void PrintInfoByPointer(Student *ps); void PrintInfoByRef(Student ,void main() int i; Student s5 = /给s0赋值 1,“李明”,“1984-10-15”,“解放路10号“,“83647526“,93.5, /给s1赋值 2,“张强“,“1984-07-12“,“凯旋路11号“,“83568971“,82.0, /给s2赋值 3,“王雨“,“1984-09-25“,“德胜路12号“,“83836541“,96.5, /给s3赋值 4,“赵新“,“1984-02-27“,“和平路15号“,“83742349“,87.5, /给s4赋值 5,“孙刚“,“1984-12-16“,“东大街16号“,“83536382“,89.0 ;,cout“结构变量传值调用“endl; for(i=0;i5;i+) PrintInfoByValue (si); cout“结构变量指针传递调用“endl; for(i=0;i5;i+) PrintInfoByPointer( ,void PrintInfoByValue(Student s) cout“学生的学号是:“s.nIDendl; cout“学生的姓名是:“s.szNameendl; cout“学生的出生日期是:” s.szBirthdayendl; cout“学生的住址是:“s.szAddrendl; cout“学生的联系电话是:“s.szPhoneendl; cout“学生的入学成绩是:“s.fScoreendl; coutendl; ,void PrintInfoByPointer(Student *ps) /指针传递参数 coutnIDszNameszBirthdayszAddrszPhonefScoreendl; coutendl; ,void PrintInfoByRef(Student ,思考:修改以上程序,求出成绩最高分。,/*例17-5 函数返回结构,求最大值*/ #include #include using namespace std; struct Student int nID; char szName20; char szBirthday15; char szAddr100; char szPhone15; float fScore; ;,void PrintInfoByPointer(Student *ps); Student GetHighestScore(Student *ps,int nLen); void main() Student sHighest; Student s5 = 1,“李明“,“1984-10-15“, “解放路10号“,“83647526“,93.5,/给s0赋值 2,“张强“,“1984-07-12“, “凯旋路11号“,“83568971“,82.0,/给s1赋值 3,“王雨“,“1984-09-25“, “德胜路12号“,“83836541“,96.5,/给s2赋值 4,“赵新“,“1984-02-27“, “和平路13号“,“83742349“,87.5,/给s3赋值 5,“孙刚“,“1984-12-16“, “东大街14号“,“83536382“,89.0;/给s4赋值 sHighest = GetHighestScore(s,5); PrintInfoByPointer( ,void PrintInfoByPointer(Student *ps) coutnID”访问结构成员 coutszNameszBirthdayszAddrszPhonefScoreendl; coutendl; ,Student GetHighestScore(Student *ps,int nLen) Student s; int nHighest = 0; for(int i=1;ipsnHighest.fScore) nHighest = i; s = psnHighest; return s; ,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!