找回密码
 立即注册

微信扫码登录

使用验证码登录

搜索
查看: 82|回复: 0

21.第21节课第九章用户自己建立数据类型

[复制链接]

6476

主题

3

回帖

1万

积分

管理员

积分
19556
发表于 2024-4-15 08:52:23 | 显示全部楼层 |阅读模式
好同学们,大家好,今天呢,我们为大家讲解一下用户自定义数据类型,就是使用结构体类型的。处理组合数据。好吧,我们首先来看一下。我们。这C语言呢,提供了一些由系统已建立的。基本数据类型,比如说整型实型。字符型,指针等类型。

用户呢,可以用他们处理一般的问题。但是呢,人们要处理的问题呢,往往比较复杂,只有这几类数据类型呢,还不能满足应用的需求。C语言呢,允许用户根据自己的需求呢,来建立数据类型,用它来定义变量。那么,我们在之前的这些程程序当中呢?那么可以看到所用的变量呢?大多是相互独立的,

无内在联系的。比如说我们定义整形变量ABC,它们都是单独存在的变量,在内存中的地址呢,也互不相干。但在实际生活和工作中呢?有些数据呢?是有内在联系的成组出现的,比如说一个学生的姓名,性别,年龄,学号,工作。成绩,家庭地址是属于同一个学生的,

那么我们可以看到。那么这些呢?变量如果把它们定义为相互独立的简单变量,难以反映它们之间的内在联系。而且这些数据的类型呢,是不相同的,人们要求把这些类型不同或者说相同的数据呢,组成一个组合数据。定列如定,义为一个。单独的这样一个变量,在这个变量中呢,包括了我们这个对象的学号,姓名,年龄,

性别,地址,家庭地址等等方等方面。这样呢,使用起来呢,就就比较方便。那么我们讲我们讲到这里,大家可能可以想可以可可能想到能不能用一个数组来存放这些数据了,那么显然是不行的。因为一个数组中呢,只能存放同一类型的数据,例如整型数组可以存放学号和成绩,但是不能存放姓名,性别,地址等字符型的数据。

C语言呢,允许用户建立不同类型数据组成的组合型的数据结构。那么,他们称之为结构体。在一些高级语言中呢,把这种形式的数据呢称为记录。那么,我们来看一下这个自己建立结构体的这样一个部分C语言,用允许用户。自己建立由不同类型数据组成的结构体的这样一个数据结构,它们称之为结构体。结构体的类型呢?名字是由一个关键字struct和结构体名组合成的结构体名呢,由用户指定,又称为结构体标记。

花括号内呢,是该结构体所包含的子项称为结构体的成员,对各成员呢,都应该进行声明,那么就是我们的类型名。成员名进行申明。成员列表呢,又称为域表,每一个成员呢,是结构体中的一个域成员,命名命名规则与变量名相同,比如说我们看一下这个部分。我们要建立那么这样一个。学生的结构体的这样一个类型,那么呢,

我们有这样一些变量,比如说链。number.them.six.age.school address.好吧,有这样一些书书。变量这样一些数据类型,那么我们就要定义一个结构体,那么在这个结构体当中呢?那么就能够包含。这些不同数据,不同类型数据组成的这样一个部分。

不同类型数据的这些部分。比如说struct student。int number.学号为整型char name 20字,姓名为字符型char sex,性别为字符型inter age,年龄为整型float score成,成绩为实型。charges字符地址为字符串。那么,大家要注意的是。我们。在最后面呢?大括号最后面。大括号最后面呢?

我们还有一个分号,大家要注意,就是我们大括号后面呢?还有一个分号,大家注意要写这个分号。而上面呢,由程序设计者呢,指定了一个新的结构体类型student structural student。是生命结构体类型时所必须使用的关键字,对吧?不能省略。那么,我们struct了是生命结构体类型时所必须使用的关键字,不能省略。它向编译系统声明,

这是一个结构体类型,它包括number name,six age score address等不同类型的子项。经过上面的指定struct student就是在一个程序中可以使用的合法类型名义,它和系统提供的标准类型int char float double等呢,有类似的作用。可以用来定义变量和类变量的类型。只不过int等基本类型呢,是系统必定义的,而结构体类型呢,是根据用户。需要由程序设计者来在程序中指定的。那么大家注意,我们结构体类型的名字呢?是有一个关键字struct和结构体名二二者组合而成的,

比如说我们的struct student。结构体名呢,是由用户名,用户指定的,又称结构体标记,用于区别了和其他的结构体类型。比如说在这样一个例子当中,我们的student就是结构体名,就是我们的结构体标记。那么,结构体的类型呢?并非只有一种,而是呢,可以设计出多种结构体类型。除了可以建立上面的这样一个struct student结构体类型之外,

还可以根据需要建立名为struct teacher。structure worker struct data等结构体类型各自包含不同的成员。成员呢,也可以是一另一个结构体类型,那么我们来看一下。比如说我们这里。先声明一个structure date类型,它代表日期包括三个成员month。day year.然后在声明struct student类型时呢,将成员birthday定义为struct data类型,struct student的这样一个定义呢,那么就是我们这样一个定义的部分。以生命的类型呢structure data与其他类型呢,一样可以用来定义结构体成员的类型。

比如说我们这里的先定义struct date,然后呢,再定义struct student的时候呢,将我们的birthday定义为struct date,这样一个类型,那么成员的birthday,那么就属于我们的struct。data类型。我们呢,是先定义。结构体类型先声明,结构体类型。再定义该变例类型的变量,比如说。我们先。

生命结构体的类型struct student第一页,我们申请我们的结构体这样一个类型,然后呢?我们可以呢?再来。定义。我们的。类型的变量,比如说声明了这样一个结构体类型的时候呢,然然后呢,再来后面呢,定义我们的struct student student 1 student 2这样一个结构类型的变量。那么我们也可以呢,在声明类型的同时,定义变量,

比如说students。drug student这样一个声明之后呢?在后面括号,后面写上student 1,student 2,然后呢分号。那么这样呢,是第二种。定义结构体变量的方式。那么,第三种定义结构体变量的方式是不指定类型名,而直接定义结构体类型变量。比如说struct成员列表。那么后面呢?直接跟上我们的结构体变量名的名称,

这样一个部分,那么再打再写一个分号。那么,这是我们三种定义结构体类型变量的方式。那么,我们再来讲一下第一种呢,是先声明结构体类型。再在后面呢,用这样一个struct student,这样一个部分呢,定义该类型的变量,第二种呢,是在声明类型的同时呢,定义变量也就说再写在我们声明的后面。写在这个大括号后面,

然后再写写到我们的变量名,最后写上一个分号,那么这样定义的方式,那么最后一种呢,是不指定类型名而直接定义结构体类型变量?那么我们就直接呢写在我们的这样一个定义,这我们的这样一个定义后面,然后再再定义我们的变量,这变量的这样一个部分。结构体类型和结构体变量呢,是不同的概念,我们只能对变量赋值存取或运算,而不能对一个类型赋值存取或运算。在编译时,对类型是不分配空间的,

而对变量分配,空间结构体类型中的成员名呢?可以与程序中的变量名相同,但二者并不代表。同一对象对结构体变量中的成员呢,可以单独使用它的作用呢,地位呢,相当于普通变量。那么,我们来看一下结构体的初始化和引用,把一个学生的信息,包括姓名,学号,性别,地址放在一个结构体变量中,

然后输出这个学生的信息。我们来看,这个程序仅号includes tdl点hint MA instruct student。就是说我们定义我们的结构体类,结构体结构声明我们的结构体类型structural drug student long int。char name 20 char six char address 20这些部分呢,就是我们结构体的成员,包括我们的number name。six address就是我们结构体的成员,另外呢,我们这里说是在。声明变量的同时呢?声明类型的同时呢?定义变量将我们的变量呢写在。我们的这样一个。

声明的后面那么就是a等于后面的这样一些数值定义结构体变量的a,并且初始化,然后呢,进行输出printf百分号d百分号。number百分号ld。那么,反学分那么后面这样一些部分,那么我们进行引用的时候,我们进行引用的时候呢,是写的a点number a点name a点six a点r爵士。那么,这是我们实。使用它的结构体的成员的这样一个方式。我们来看一下结构体变量初始化和引用在定义结构体变量时呢,可以对它的成员初始化,

初始化列表呢,是用花括号括起来的一些常量。这些常量呢,依次赋给结构体变量中的各成员,我们是对结构体变量进行初始化,不能对结构体类型进行初始化。我们可以引用结构体变量中成员的值引用方式啊,为结构体变量名点成员名,比如说。我们的student呢,一是我们student类型的结构体变量student一点number呢,表示student 1中变量number成员。也就是说,student 1的number学员成员,那么我们可以用了student一点number等于这样一个数值,

那么进行一个引用。我们点呢是成员运算符,它在所有的运算符中的均线级最高,因此呢,可以把student点number呢作为一个整体来看待,相对于一个变量。那么,我们可以用printer。那么我们看一下,就我们看一下这个print百分号s百+2n student 1,那么这里呢?是用我们想要用我们的结构体变量名输出所有成员的值,那么是不行的。那么,不能够这样使这样这样这样输出,

这样这样这样表示,这样使用,我们不能企图呢,通过输出变量结构体变量名来达到输出结构体变量,所有成员的值的这样一个目,这样一个。方式只能呢,对变量结构体变量中的各个成员呢,分别进行输入和输出。如果成员本身又是一个结构体类型呢,需要用若干个成员运算符一级一级的,找到最低一级的成员。只能对最低级的成员呢,进行赋值和存取及运算,比如说我们这里的结构体变量s student 1中的成员number number,

那么我们可以用呢?student一点number那么等于后面这样一个数值,那么我们再看一下我们student 1 student结构体变量student 1中的成员burster中的成员month。我们就要用两个成员运算符,把它写成student一点birthday点month等于后面的这样一个数值,那么这样是我们引用的,如果成员本身又是一个结构体类型的,那么我们要用若干个成员运算符来进行进行。进行找到这样一个部分,那么对结构体变量的成员呢,可以像普通变量一样进行各种运算,比如说student二点score等于。student一点school赋值运算上等于student一点school+student二点school加法运算student一点age加加。四加运算,我们可以进行这些运算,

那么同类的结构体变量呢?可以相互赋值,比如说student 1=student二,那么假设student 1和student 2呢?以为同类型的结构体变量。那么,这样一个同类型的结构体变量呢?那么,就有相互的赋值,那么我们可以引用结构体变量成员的地址。可也可以引用结构体变量的地址,那那么我们看一下。我们这里呢,有一个sky f百分号d。属于student。

一点number的地址,那么这是我们输入student 1 number的值,那么还有printf百分号o。取这样一个student 1的这样一个地址,那么这是输出结构体变量student 1的值,那么但是不能呢,直接用这样一个语句来整体读成结构体变量,比如说。百分号d百分号s百分号c百分号d百分号f百分号s返正n是student 1的地址,我们不能用这样一个语句来整体读入结构体变量的值,那么不能写成这样的部分。好吧,我们再来看一下结构体变量的初始化和引用,我们输入两个学生的学号,姓名和成绩,

输出成绩较高学生的学号,姓名和成绩。好吧,我们看一下这个程序井号SSD includes di点hinter May strived student。int number int char name 20 float score,那么这是生命结构体类型struck student。后边呢,在我们声明之后呢,马上定义了两个变量,两一个student,1 student,二两个结构体变量。加f百分号d百分号s百分号f是。student e点number的地址。student一点name。

取student一点score的地址,那么输入学生一的数据,那么接下来呢?是先输入学生二的这样一个数据,然后呢?printf the high school is。那么if student一点score呢?大于student二点s core printf,那么这样一个百分号d百分号s百分号六点二点f返正n。那么student e点number student e点name student e点scope那么输出我们这样一个学生的这样一个。学学生16人的一的这样一个信息,那么else if那么就输出我们。学生student 2的信息那么else呢?那么输出这两个学生的这样一个信息的部分,那么就是输出的这样一个使用方式,

使用使使用方式使用的这样一个类型。那么,这是我们结构体变量的初始化和引用。那么,我们再看一下使用结构体数组。那么有三个候选人。每个选民呢,只能投票一人,要求编一个统计选票的程序,先后被输入选票,先后输入选被选人的名字,最后输出个人得票结果。那么,我们来看一下这个程序。井号include a string点h。

井号int ludes d dio点h struct struct person,这是声明结构体类型struct person。那么,它当中的成员呢?有恰name 20就是候选人姓名inter count,就是候选人得票数,然后呢?我们。定义了一个整形数组,一个一个一个字整一个结构体数组leader。三等于。后面的这样一个数值定义结构体数数组,并初始化,那么我们再看一下成这个另另外的部分inter May inter ig。恰leader name 20,

定义字符数组。flow for I=1,I小于等于十,I加加。for这里的。那么有这样一个3f百分号s leader name输入所选的候选人姓名for。g=0 g小于3g加加ifs。compare leader name,leader j name=0,那么leader j count加加。printf.反斜杠n result,反斜杠n for I=0 I小于3I加加f百分号5s。百分号d反向a leader I点name leader I点count returning,那么我们看一下这个程序。

首先呢,我们是定义一个。是否数组,然后呢for循环?那么,从1 I=1开始,那么首先呢,输入我们这样一个名名字的,这样一个字符串,然后呢,进行比较,如果这个。如果这这这个字符串呢?与我们的这样一个。原有的这样一个字,

符串呢?相等的话,那么这样一个姓名的,这样一个对应的,这样一个。这样一个计数的,这样那数量的部分呢?那么就自增一那么这样一个自增一的,这样一个部分,然后就这样一个呢?与我们。字符串相等的那么这样一个数量呢?就加一那票数呢?就加一那么最后呢?输出我们。

显示出我们这样一个得票的,这样一个情况,那么就是我们这样一个结构体数组的这样一个使用方式。那么,定义结构体数组的一般形式呢?是我们的这样一个struct。结构起名,然后成员列表后面呢,写上数组名和数组长度,那么打一个冒号,比如说我们这里的struct person char name 21的count。后面写一个三。冒号分号,那么这是我们定义结构体数组的这样一个一种形式,那么还有一种方式啊,

是先声明一个结构体类型。然后呢,再用此类型呢,定义结构体数组,比如说先定义明我们结构体类型数组名。然后呢?数组的长度。比如说我们这样一个部分struct person char name 20 int count,然后呢,struct person leader 3。那么就是结构体类型,然后数组名,然后数组长度,那么这样一个定义的方式,那么在对结构体数组初始化的形式呢?

是在数组定义数组的后面呢?加上我们初始列表,比如说我们struct person leader 3,那么后面的这样一个初始列表就是对它进行初始化的这样一个方式。那么我们再看一下,结合体数组的应用。那么我们看一下这个程序井号interludes ddi点hs dd I点h那么struct student生命结构体类型struct student。inter sight char name 20 Florence go就是生命结构体的类型,struct student,然后呢,inter main。s students TU 5那么这是我们的定义结构体数组stu然后呢?并对它进行初始化struct student的temp,再定义一个结构体变量temp,用作临时交换的这样一个临时变量。

CON constant in tn=5定义常变量n。inti JK printf,the order is for I=0 I小于n- 1I加加。k=if org=g+1 g小于NG加加。if students tug点score大于ST UK点score。那么,进行我们这样一个层级的比较,那么k=g temp。ST UK=s tuks tuk=stu is tui=temp。那么ST UK和stu I元素要进行互换。那么,这是我们的这样一个交换的,这样一个元素的,这样一个部分JAVA结构体的数组当中元素的,这样一个部分,

那么也就是说,当我们的for循环呢?开for循环开始的时候,从零开始I从零开始。那么k呢?首先等于I那么那么ki g,从I+1开始那么比较了。j和k的这样一个乘积,那么如果它比它大,如果j的比k的大,如果进行比较之后呢,然后进行这样一个。复制这样一个交换的部分。那么交换呢?我们g和kg和。

k和I的这样一个部分。另外呢for。I=0,I小于ni,要加printf那么输出,后面的这样一个部分printf返程nn那么return程序结束,那么这是我们按照成绩的由高到低的顺序呢输出各学生的信息。好,大家看一下这个部分。好,接下来我们再看一下结构体指针。所谓的结构体指针呢?就是指向结构体变量的指针。一个结构体变量的起始地址呢?就是这个结构体变量的指针。

如果把一个结构体变量的起始地址呢,存放在一个指针变量中,那么这个指针变量呢,就指向该结构体变量。那么我们再来看一下,通过指向结构体指针的变量呢?结构体变量的指针呢?指针变量输出我们结构体变量中成员的信息,那么我们看一下这个程序。井号includes g点h井号include string点hinter my struct student,那么后面这样一些人员。生命结构体类型呢,为struct student struct student。stu杠一那么定义s struct的类型的变量呢?stu杠1 struct student星p那么定义指向struct?

student类型的数据的尺寸变量p。p等于。取地址stu 1那么p呢?指向stu杠1 stu杠n杠一点number呢?等于这样一个数值,那么对结构体变量的成员赋值?抓copy stu杠一点name=0,你用字符串赋值函数来求stu杠1 name赋值stu点six点m stu杠一点score等于这样一个数值。那么printf百分号d那么后面的这样一些部分,那么它输出了这样一个列表呢?它这样一个列表呢?就是我们的。stu杠一点numbers TU杠一点name,stu杠一点six,stu杠一点score,

那么输出我们的结果,那么我们还可以呢,表示为了。printf反斜杠n百分号d后面的这样一个输入,结果呢,是我们的括号星p点number。星p点name星p。点CS新p点spool,那么我们的新p点number呢?可以表示为p指向number,那么这样一些部分也可以这样一个表示的方式,那么是用我们的结构指向结构体变量的指针呢?那么来输出我们结构体变量中成员的这样一个信息,那么最后呢?returning。

程序函函数返回一个零值程序结束。然后我们再看一下,如果p呢指向一个结构体变量stu,那么这样一个我们可以用几种方法呢来表示我们的这样一个。信息的这样一个成员的这样一个信息的这样一个方式,这样情绪信息的这样一个内容,比如说第一种我们的。结构体变量名加我们的点,那么再加我们的成员名,比如说s to点成number也可以呢,用我们的括号星p。点我们的成员名,那么表示我们的这样一个。成员的这样一个内容啊,比如说括号星p点number也可以呢,

用我们的p指向成员名表示我们成员的这样一个信息部分,比如说。t指向number,那么我们都可以来用这些方法来进行表示。那么我们再来看一下指向结构体数组的指针,有三个学生的信息放在结构体数组中,要求输出全部学生的信息,那么请我们看一下这个程序。井号一刻录的SD点h struct student生命结构体类型struct student,后面是它的这样一个成员部分。struct students pu 3那么进行定义结构体数组了,并进行一个初始化为它赋值。进行初始化。main inter MA instruct student星p那么指向定义指向。student结构体变量的指指针变量。

那么再接下来呢?再是我们的这样一个printf后面的这样一个输出部分for p=stup小于。SQ+3 p加加。front f.后面的p指向number p指向name p指向six p指向age,那么这是我们用箭头指向的方式呢,来找到我们成员的这样一个内容,最后呢,输出我们的结果,那么return 0。函数返回一个零值程序结束。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|5432考试网 ( 蜀ICP备2022024372号|川公网安备51152402000101号 )|网站地图

GMT+8, 2024-5-19 17:56 , Processed in 0.091090 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表