00:01
同学们,我们来看几个关于结构体的应用案例,那首先我们看一下就是结构体的应用案例呢,我们在进行这个。呃,完成的时候有这么几个步骤,第一步呢,我们首先要定义结构体,确定结构体的名称对吧,就说你要分析出来这个结构体里面包含哪些成员,第二个呢,编写结构体的成员,就是刚才我说的第三步编写处理结构体的函数就三部曲,那现在我们看第一个题。一个关于小狗的案例,用结构体来完成编写一个dog结构体,它已经告诉我们这个结构体的名称是dog,里面包含了这么几个属性,或者叫成员name age,还有一个体重,就是狗的名字,狗的年龄和狗的体重。然后呢,要求我们编写一个函数叫C,返回一个字符串。返回一个支付,返回这个信息里面包含所有成员的值。在命。
01:02
这个方法中或叫函数中创建一个道结构体变量,调用C方法C函数将这个结果打印出来,好,这个其实挺简单,我们按照这个思,其实他这个题啊,几乎已经把思路都给我们分析完了。我们要做的事情呢,就是把它的这这个描述用代码实现一下,那同学们我们来写一下就可以了。好,同学们,现在呢,我们来开始写这个代码,首先呢,我们先取一个名字叫做结构题练习structure。练习exer c01第一个练习。好,在这里,然后我们开始完成。Include。Std。对,STDIO。然后呢,我们写一个主函数,呃,主函数。
02:01
对。那根据我们前面这个分析呢,它的要求实际上是这样子的,对吧,它的要求是这样子的,所以说我们就按照这个顺序来呗,首先先整一个结构体。那开始写了,先定义。得到的是定义。定义一个dog结构体没问题吧,那就是dog。那在这里面呢,我们有哪些成员呢?刚才已经说了有这么三个,那我就直接写哈,第一个名字,那这个名字呢,我们这直接用指针也可以,因为它就是字符串嘛,所以说我直接用指针比较简单一点,Char name好吧,名字年龄。狗的年龄,还有狗的体重,我们用W对不对,W。就写好了,写好过,不要忘了这后面有个分号,好这写好写好过呢,下边呢,我们来写。
03:01
来写处理。要按照这个步骤来来做呢,我们要写这个C方法了,这个CC函数它返回的字符串,然后呢,返回字符串,这个字符串中返回的信息这样写。就是信息中包含所有成员的值,那这个太简单,我们来写这个C方法。叫C函数哈,C函数。把这个写到这里,我们一起来写,那怎么写呢?咱们这样写,因为它返回的是一个,它返回的是一个字符串,对不对,那用叉新这个能理解不,那就开始写了C,那么我们写我们要接收的是一个dog。大家看这里能看懂吧,就是现在我们这个行参呢,是接收一个dog。这样的。行参或者是这样的一个变量。ST,不要省略了,写上去,然后这里面我们来开始。
04:00
将。将这个信息信息干什么呢?做成一个字符串。啊,将这个信息放入到一个字符。串中,那字符串呢,其实就是我们的字符数组,还有印象吧字符数组。好,那这样子的我就开始写了,那现在呢,我们先把这个字符数组。整理起来,我们稍微给它大一点,比如说50个空间。而而且我们也知道,我们知道就是如果我们返回的这个信息呢,是从一个函数返回的。是不是要求这个变量,这这其实是个局部变量。大家还记得吧,既然是个局部变量,前面呢,我们需要用static来修饰,这个能理解吗?这是个局部的静态变量。为什么呢?因为我们将来返回的就是它。如果你仅仅是个局部变量的话呢,那这个这个空间将来可能会被销毁,或者说被别的语句占用,因此就会出问题。因此我们在前面讲过,如果是在一个函数内部返回一个局部变量,要求这个局部局部变量是什么样静态性质的。
05:16
前面我们已经讲过很多遍了,对不对,那现在呢,我们来格式化F。SPNTF,这个spring f是不是前面我们已经讲过了,把我们的信息组合到这边来,我就开始写了,Name等于百分号,S没问题吧,H等于百分D没问题吧,然后which。Wait等于百分号点2F,因为它是一个double嘛,那就开写了dog的名字放在里面来,Dog点什么呢?它的age年龄dog点它的什么呢?Wait。就OK了,那这个做完以后,我们return c要in for,因为我们这个字符串的名称本身就是代表的地址,因此就返回去代就写完了,好,我们来测试。
06:03
它的测试方案是在这里创建一个do结构体变量,调用C方法,然后把这个结果输出,非常的简单,那行了,首先我们先定义一个结构体变量。定义结构体变量。结构体变量我们怎么写呢?Structure dog dog,没问题吧,同学们,那就刷新,待会呢,我要接收info,我拿到。初始化的时候,因为没有纸,可以写个no,是不是用空子针来处理啊,然后我们开始初始化多少个点他的名字,比如说它的名字呢,我们叫做小黑。OK,我要小黄也行。下滑。然后呢,这个dog的年龄呢,我们给它假设这是一个小狗一岁dog点什么呢?好他一个体重,他的体重有多少斤呢?比如说有3.4斤没问题吧,然后现在就做好了,然后我把这我调用这个C方法,把谁传进去呢?把多传进去。
07:01
各位同学请注意回忆一下,我们前面讲过结构体默认是什么传递?回答一下,结构体变量默认是值传递。还是还是地址传递啊。还记得吗?如果同学们忘了,可以把这个打开,我们回忆一下,其实我们在讲这个前面的时候,我们讲过值传递和地址传递,其中我们整理了一下默认值传传递值的其实就是结构体。也就是说,如果你这样传递,传一个道进去呢,其实它是复制了一份道的空间给到这个道。对,所以说这个地方是什么传递啊,默认是值传递,理解哈,那当然,嗯,如果为了提高效率,其实我是可以用地址传递的。那后面我们再去说这个事情。各位同学接着往下走,现在信息就拿到了,我们输出一下。来左个我斜杠。
08:02
小狗信息为等于反方S,那返回的信息其实就是in four,因为我这个是恰新嘛,所以说这样输出也是没问题的,前面不要再加地子符了哈,不要再加地址符了,好,这个结果呢,咱们就写完了,Get。各位同学,我们看看代码是否能够跑起来。先把这些不要的先处理一下来,我们申请一下方案。看看代码有没有毛病。重新生成哈。重新生成呢,现在。稍等片刻。生成已经全部成功运行,那运行起来我们可以看到这个结果,我们想的一样,小狗信息是明知小黄年龄是一岁,体重3.4,那这里我再多问同学们一个问题,我再多问同学们一个问题,如果说。就是说如果我在这个C里边,我把这个到我我把他的名字修改了,对外面这个小黄有没有影响。
09:01
能告诉老师吗?也也就是说,假如我在这写了这句话啊,Do name,我把它改成了。小黑。呃,小小小花吧,我问同学们一个问题,假如我在这写了一个dog.name小花,请问对这个main函数里面这个dog有没有影响?有没有影响,有没有影响主要是看你是直传递还是地址传递,我可以负责任的告诉大家,这个地方修改是小花,对外面这个小黄没有任何影响,可以试一下。Pretty。OK啊,命。小狗。小狗名字等于我们输一下啊,那就dog直接输出name。可以可以负责任的告诉大家,这边输出的仍然是小黄,而不是小花,但是如果你是地址传递,那就不一样了哈,后面我们再讲另外一种形式来,各位朋友我们先生成一下。
10:00
首先我们看语法有没有问题。我们看语法有没有问题。正在生成。那发现语法没有问题,现在呢运行一下。运一过,我们发现没有任何影响,主函数里面的小狗仍然是小王而不是小花,为什么?因为它是直传递,所谓直传递是什么意思?还记得吗?还记得吗?其实就是他会在传这个道的时候,他会把这个道的这个内容重新给你复制一份,放到这里面去。那相当于说这是两个不同的变量,两个都在不同的函数站里面嘛,这个我就不再讲了,同学们好吧。好,各位同学,那关于这一点呢,我们就聊到这里,这是第一个小狗的案例,第二个案例来了,第二个案例呢,是一个盒子案例。也是用结构体来完成,这个呢,我要求你们自己来完成,什么意思?先来看一下这个需求。编程编写一个box个体已经告诉你了结构定义的名字是box,在其中定义三个成员,表示立方体的长宽高,长宽高可以通过控制来输入。
11:07
第一个函数获取立方体的体积volume,就是把体积算出来,创建一个结构体变量,然后呢,打印给定尺寸的立方体的体积,这个其实挺挺简单的,这个呢要求你们去做,我给大家一点思路。给大家一点思路,思路就这样子的,就是说你定义一个结构体structure box。对吧,那么这个box里面呢,应该有三个成员,呃,长宽高,那可以用什么呢?用double来做就行了,Double长咱们用less。这个地方你可以先定在这没问题吧,然后呢,这个做完了过后是不是还有长宽嘛,宽就是我们的。是吧,然后呢,还有什么,还有个高had。EIGHT,那么这就是长宽高,如果说好一点的话呢,你还可以在这边把它的体积也写到里面去。
12:07
体积就是volume。那么你计算完了过后呢,你通过这个长宽高相乘,把这个值再保存到它的体积里面,这个是表示它的体积。那这样子的话呢,我们长宽高体积都能够被封装到一个。结构体变量中,这样更方便,好,那下面的就是自己去写了,我就不去完成了好不好,我们再看第三个题,第三个题呢比较有代表性,我给大家来讲一讲这一次。完成景区门票这个案例呢,我决定用什么呢?我决定使用地址传递的方式,也是也就是说传递我们结构体地址的方式来完成,认真听,首先呢,我们先看一下这个题的要求,说有一个景区根据游人的年龄来收取不同的价格的门票。那么这时呢?他第一个要求编写一个游人的结构体,叫visitor。
13:02
结构体的名称告诉我们根据年龄段来决定能够购买门票价格,并输出规则是年龄大于十,呃,年龄大于18岁,门票为20,其他情况免费,就说你的年龄如果大于18呢,就20块钱,其他情况下我就不要钱了。这是我的一个要求啊,我的一个要求,那么可以循环的从控制台输入名字和年龄,就名字和年龄呢,要从控制台输入打印门票收费情况,如果我们把这个名字输的是N,就退出程序,理解了吗?那我不多说了啊,因为现在到现在如果大家还这个节奏跟不上就说不过去了,我稍微的放快一点来,现在呢,我们完成这个案例。新建。新建一个。对,我们这个名字就叫visitor就算了。VZ。游客的票价。没问题吧?
14:02
好,现在呢,我们把这个后缀CPD改一下。改成C。各位同学,我们紧接着继续往下玩,Include ST dl。Void主函数。Y1的主函数。咱继续往下来。做号。嗯,要求是不是前面咱已经把这个要求写好了呀。放这就可以了,那具体要求应该已经写的很清楚了,诶,价格。结构体名称规则,还有怎么去输数据就可以了,那现在老师就开始玩了啊,首先我们第一个先定义这个结构体,没问题吧,那开写了visitor。Visit,那这里面有哪些信息,大家想一想,你觉得有哪些信息?首先是不是有这个人的名字啊,那肯定就有人名了,那这次呢,我们有char name,好,这次呢,我把这次我换一个,我用数组啊,每个都看一下,这次我用数组,直接用数组来存放,不是用一个指针的,OK,然后呢,这边有年龄对不对,然后呢,还有他应该付的价格,Double。
15:14
配啊配,就应该付的价格,这是名字,这是年龄,这是应付票价。应付。颠覆票价能理解?这个就OK,那这边有个分号。把这个写完了以后,是不是我们可以开始写一个函数来处理,就是斜函数根据年龄不同来返回它的价格,这个能理解吗?好,现在我们开始这上面这个是定义。现在是定义一个结构体。下面呢,我们来写一个函数处理结构体,是不是在前面讲过,先定义结构体,再写函数,再写一个函数去处理这个结构体,是不是这样写的,大家不要忘了我们的顺序啊,是不是我在最最前面就把这个这个流程说好了,先定义结构体,在嗯,结构体的层面小,再编写处理结构体的函数,是不是现在应该写这一步了。
16:13
回到这边继续继续玩。那现在我们开始来做这个事情吧,那就是编写函数干什么呀,处理。处理业务逻辑。处理业务。各位,那这个函数呢,我就开始先写了VO。因为我后面呢,会直接把应付价格放在这个配里面,我就不需要再返回了,各位take it。票价是不是他应该负责ticket票价或者这个money都行啊,我就写,那这里面我要接受一个什么呢?是。肯定是要接收一个visitor。对,然后我接收的时候呢,我用visitor这个这个人的名字来叫visitor。这次我要换一换了,同学们,因为我们知道前面讲过,结构体呢,默认是按照这个值传递,直传递其实很不划算,因为他会重新拷贝一份,而这里其实我们处理的就是这个人本身没有必要再用直传递,所以说我要这就说明一下,说明。
17:17
因为因为结构体默认是值传递。直串题,会拷贝,拷贝一份一份完整的数据,效率较低,效率较低。对不对,因此呢,我们从效率角度来看呢,我们直接接收这个地址就可以了,因此因此为了。为了提高效率。提高效率,我们。我们直接我们直接接收什么呢?接收一个地址就可以了,或者叫指针,因为指针的本质就是地址,那这样子我们这加一个加个星号就行了。
18:00
这个能理解不就相当于哈,相当于我接受这个类型呢,是这种类型的。而不是这种类型,这个是结构体类型,而这个是结构体指针类型,加了个星号,看懂了吗?好,接下来开始写了判断,他说年龄如果大于20的,年龄大于18,票价为20,其他情况免费,那太简单了,来玩一把。判断跟着老师思路啊,跟着老师思路判断如果如果什么呢?这个人的年龄,那就是VZ啊,这写错了VZ。他的年龄age。但是这样写会错,知道为什么,因为这是一个指针。这是个指针,它指向一个visit,所以说你其实呢,前面应该有个星号先包起来。大家理解这句话什么意思吗?这句话?就是这个小括号里面其实是。获取到我们这个结构体的。
19:02
本身的那那个那个空间了,因为你你这样写这个visitor,其实它是什么样,这个visit它是一个指针,所以它其实这个visitor呢,它是这样写的。Visitor它指向它其实本身是个指针,这里面存的这个地址,比如说1122,这个地址才真正指向了我们结构体的数据。对这个能力也矛盾,我就不用讲那么多了哈,就这反复讲,我就有点觉得有点有有点郁闷了,就是你这个你这个visit呢,它是个指针,它指它这个里面存的这个地址,才真正指向了这个。这个结,这个结构体的数据,而不是这样直接指过来的,因此你要先用这个取值符,通过这个取值符先访问到它,再取里面的H,能理解了吧?好,这个我就不用再多说了吧,大于18。因为到现在大家已经是有一定基础的同学了,这个大于18,大于18我怎么办呢?好,我给他这个配写成20,因为它的不是大于18门票20吗?好,就一句话就可以了,还是一样的道理,先访问到我们这个结构体本身的数据。
20:15
啊,因为你现在这个visitor实际上是指针,并不是结构体了,那这个就返回到结构体本身的数据,再点一下,看到没有,这个才能点出来。看这个才能点出来吧,你如果直接visit是点不出来这个这个后面这这玩意的等于多少呢?20写完了。对吧,喜欢,那A20呢,就说如果如果不是这样的,不是大于18的,OK,那么直接给他付一个零,就他不要钱免费。免费就完了,好这个代码就写完了,那写完过后呢,我们开始来测试。好测试,在测试的过程中,我们仍然按照以前的这个流程来玩就可以了。首先第一步先创建。结构体变量。也就是说,创建一个。
21:03
创建一个游客。这样才能测试嘛,那就写了,那就什么呢?V。Z,对不对,VZ。拿到了。但是这里面没有没有信息,我们现在呢,名字还有大家知道名字和年龄呢,是输进去的,大家看是不是循环的,输入他的名字和年龄,那就可以玩了,那先开开始我们怎么怎么做呢?Y循环来写一个死循环。Y循环就是我这边是循环的,循环的输入名字和年龄。是这样子吧,同学们,那就首先给他一个提示一句话吧,Print f,来,走起来写杠恩,请输入游客名字,能理解。名字。拿到了,拿到过后我们怎么输呢,K。没问题,走一个百分号S,那怎么输进去呢?V点内就可以了,各位同学看这里为什么不要再加信号了。
22:07
喂,为什么说老师你这不加信号呢?注意啊,这个地方可就是实实在在的一个结构体变量了,它的类型是这个类型。你在这里面这个类型是一个指针类型,这是完全不一样的,明白吧,所以这地方不需要再加星号就可以。把名字拿到了,拿到过后是不是应该再提示一下啊,有判断。N,呃,我们再接收他的年龄,Prettyf,走起来,写个N,请输入游客年龄。能理解吧,那游客的年龄呢,仍然是KF。百分号D。摆放D,把这个游客的游客的这个年龄给它输进去,这个地方要取地址了,因为他不再是一个数组,所以说应该这么取V z.H但是整体呢,我们要取一个地址,这个能理解不?
23:06
就是这样子取,因为这个点的优先级高,所以它其实是先执行这个,再去取地址,然后把这个呃,只放在H所指向的地址这个空间好写完了,写完过后呢,我们是不是就可以统计ticket了?啊,调用调用我们这个方法来获取该游客应该付的价格,对调用方法,啊调用函数,哪个函数呢?哎,就是刚才同学们写的taking这个函数。获取,获取应付。应付的票价。能理解吧,应付的票价。OK票。票价。问题,那么这个应付的票价我们怎么传呢?此时此刻大家看他传的是指针,因此这个地方要这么去传。你这样传是不好吃的,这样传它会给你报错,因为你这个是visit结构体,那边是指针,所以说要取一个地址,能理解了吧。
24:05
哎,这样就理解了,也就是说你这样子才会把结构体的地址给他放过去。好,这样就拿到了,拿到以后呢,其实这里边就会,呃,因为你现在传的是地址嘛,所以说你在这个take it,你take it里面操作的这个visitor,其实操作的就是我们main函数里边的这个visitor,是不是这个道理,也就是说相当于这种感觉,你这个命在里边,我就简单画一下啊,Mean里面有个visitor。Visitor它指向了一个结构体,里面有有三个啊三个,那么等到它开辟了一个站以后,这边也有个visitor。这个V是个指针,它这面有一个有一个空间放了一个地址,这个地址呢,也指向这个地方,那也就说在这个函数里边,通过这个visit指针操作的,其实就是我们命。
25:01
命函数里面的visit,所以说是会被修改的,所以说在这边我们就可以打出他的这个票价了,我们输出一下好不好。PF。说一句话,说什么呢?票价,该人该游客,该游客。是啊。该游客应付。啊,应应付票价。等于多少呢?来输出2F走起来是不是就是visit?Visitor。点什么呀呸,是不是你把这个传把这个放进去,他在这边就给你计算出来,然后给你返回了啊不是返回啊,就直接给你修改了,那这边修改了就直接影响到我们这个visit能理解吗。没问题吧,但是这边有一个漏洞,这个代码有个漏洞,就他永远出不来,是不是人家这有一个要求啊,他说如果输的名字是N,则退出程序应该怎么控制这句话呢。如果名字等于N退出,那应该怎么写呢?是不是在这判断一下?
26:01
判断判断什么呢?如果名字是等于N,我们就退出了。对,把它写进去,那这样是不是一个依附语句就可以了,怎么怎么判断啊,是不是字符串的判断,我们已经讲了很多遍了,如果如果怎么呢?String。CP比较。怎么怎么进行这个比较呢?如果它就是等于N。对,就是我们这个visitor visitor点内它就是等于N,这个是成立的,等于N。等于,哎,如果相等,是不是它返回一个零呢?还记得吗?如果相等,也就是说如果这个等于零。等于零这个条件成立的话,那么我们就可以break。就退出去了。退出这个是退出这个while循环,这里为什么会错呢?是因为我们没有引入这一个string头文件。这些其实我们以前都讲过的。
27:00
使俊头文件没有引入,引进去就OK了。看这么就写完了。诶为什么还没写啊,好的,那这样写呢,有点啰嗦,怎么等于零,因为因为零这个零本身是代表一个假吗?非零为真说的这样这样写呢,有些程序员不喜欢他,他不这样写,他怎么写呢,他这样写。他去反。因为你零取反是不是就是非零非零,这就非零的话,就为真就进去了,所以说刚才这种写法。等于等于零呢,也可以直接写成一个取反的方式,大家也要看得懂,好代码我们就写完了,写完过后呢,我们来玩一把,看看是否可以玩起来好不好,是否可以玩起来不知道我们试试,那这边呢,我们再提示几句话。写句话叫做退出程序了。退出程序,然后这边来一个get char。有个提示嘛,这样我们能够看到它的一个效果,各位朋友来首先生成我们解决方案,看看代码是否OK。
28:03
看看代码是否OK。运行。代码有问题,有问题我们看一下哪里写错了。哪里,哦,不好意思。再生成。再生成一下。好,这时呢,我们等待一下,我们发现。好,成功了,成功过后呢,各位朋友我们来运行一下,看效果哈,跑起来。他说请输入这个游客的名字,比如说我们叫Jackie吧,Jack这个人他的年龄我们输一下,比如说这个人的年龄呢,就是16岁,16岁是不是免费啊。诶,该游客应付0.0就不要钱,再说一个汤姆这个人,汤姆这个人呢,我们给他一个年龄80 80岁得得得付20块钱了,再说一个人,比如说叫做hsp。那么我们给他一个年龄,11岁也不要钱,正确吧?诶,我们再说一个人,比较史密斯king。
29:04
进这个人呢,他的年龄是90,呃,比如说是23岁,现在应该付20块钱,完全正确,最后我们不想玩了,我们想退出了,输一个N。退出。是不是因为我输一个N,知道为什么马上就退出了,因为你输一个N,这个盖下被拿到了,所以说你要你想让他暂暂停在这可以写输入两个get。好,代码就说到这里,同学们,那经过这个小案例呢?经过这个小案例,我们就给大家讲了一下结构体应用实例,以及结构体程序怎么去开发的一个流程梳理一下。往这拉。跑起来,那刚才我们讲的内容做一个简单的梳理。这边讲的是结构体应用实例。结构体应用词,首先呢,我们先说了一下结构体。相关程序的开发的步骤。步骤应该是有这么一个套路的,什么套路呢?首先我们要去定义结构体,然后编写它的成员。
30:08
对,然后写它的函数,然后呢,我们就写了一个小狗案例,对不对,小狗案例特别简单,就让大家入门。代码写出,这里代码演示,代码演示。具体来说代码在哪里呢?在这里。是不是第一个练练习。复制一下。然后我们把它放在这块。小狗案例小狗案例完了过后,是不是我们又讲了盒子案例盒子案例呢?我是要求同学们自己去做的好吗?同学们自己去做,我还放到这好吧。放到笔记里面去,作为一个课后练习,自己去完成好吗?这个做完了是不是老师又给大家讲了一个关于景区门票收费情况,对吧?如果是年龄为20怎么样呢?如果是年龄五五岁,免免免费哈,免费这样子。那我们这写到这里了吧。
31:02
在这边再来粘一个。景区门票的案例。那么景区门票的案例呢?我们仍然是代码给大家写到这里来。但。代码演示。代码演示在哪里呢?在这。Visitor ticket。好,各位同学,那关于我们这一个结构体的应用实例就给同学们分享到这儿,那晚上或者是听完这节课呢,你们现在就马上把这个盒子案例自己写一下,因为只有自己写,动手写过几遍,你的感受才会更深刻。不然的话,你光听了,实际上是没有太多的这种体会的。这讲我们就给大家讲解到这里。
我来说两句