00:00
同学们。我们来看。本套课程的最后一套试题就是我们的第18套试题,第18套试题呢,仍然是一套上机题,我们来看一下这套试题他讲的内容是哪些,看一下打开我们的。这个试题哈,我们来看看他的内容,还是老规矩,放在我们的桌面,打开它。我们先看第18道题的第一道题,填空题。这道填空题呢,一看哈。我们先把它放过来,他是,哎哟,这个内容还挺多的,看起来对不对,看起来挺吓人的。还是老规矩,我们建一个文件夹吧。我们建一个文件夹,Exam。叫幺八吗?然后呢,建我们的第一个文件,就是我们的填空题对不对。放在这里。EXAM18杠零一。然后我们讲后缀做一个修改。把我们的代码放过来,这道题呢,你看一下挺吓人的,为什么呢?因为代码很长了,一般人看到代码很长就很紧张了,对不对,那每个人会,你看从第五行到下面一堆。
01:12
啊,看起来很吓人,但是你认真去看,你会发现呢,并没有那么复杂,因为它是一个填空题,我们先来看看这个题大致的一个要求是什么,看一下。程序通过定义学生结构体变量,存储了学生的学号、名字,还有三门功课的成绩,三门功课它是用一个数组来存储的,看到没有?所有的学生呢,数据均以二进制的方式输入到文件中,注意这里面它强调是以二进制的方式,那也就是说我们在打开或者读取该文件的时候呢,要以二进制的方式打开或者是读取明白。然后函数放的功能是从行参发name所指向的文件中读入学生数据,大家看这里又一个信息,也就是说放函数的功能呢,它是接收一个文件名,明白这个意思吧,所指向的文件呃,读取所以并按学号从小到大进行排序,注意它的学号是从小到大,然后再用二进制方式把排序后的文学生数据输入到我们的。
02:19
这个BI name所指向的文件中覆盖原来的文件。那我们就大致明白他的意思了,我们看一下它的大致的含义是什么哈。呃,我们简单的断一下句。这里呢,同学们看,这里有有一个学生。啊,就是结构体,这是个结构体,同同学们,你们在做题的时候,不要轻易的像这样打空格,就打开文件,是什么就是什么,然后你在这填东西就行了,明白我的意思吧,但是老师讲课的时候呢,有时候为了让大家听得明白一点,我会做些注释。这里定义了一个结构体。结构体类型是什么呢?就structure student看懂了没有?那这里面有他的三个成员,我就不说了。
03:09
然后后边呢,它有一个S,那也就是说相当于这个sto,也是代表我们这个结构体能理解吧,取了个别名。ST。就是。就是结构体。类型的一个什么呢,别名。没问题,别名好,紧接着往下往下看。呃,我们现在这个函数呢,具体这个功能,刚才呃在这边叙述已经说清楚了,那现在我们看这这个幂函数干干了什么事情,大家看。这句话能看懂吗?这句话啊,同学们可以看到,它实际上是先前呢定义了一个结构体的数组,里面存放了五个学生,看懂了没有,就是现在老师高亮这一部分。也就是说,TT是什么呢?是。结构体数组。
04:00
那存放了多少呢?存放了五个,五个学生的信息能理解,包括他的学号名字,还有他的什么呀。三门学科的成绩能看懂吗?下面呢,紧接着他有个SSN,也就是说还有又定义了一个SSN,这个SSSS它也是一个结构体数组,能看懂吗?SS也是结构体数组。没有问题,接着往下看I j file信号,这是什么呀?没问题,这是IJ是它的变量file信号FP,这是一个文件指针,现在呢,他先打开一个文件指针,呃,先打开一个文件student data。16年的data 16年data呢,它是以RB打开的,大家可以看到这是以二进制的形式打开的二进制。打形式打开讲过吧,打开。打开,打开后呢,同学们注意看到,如果这个文件不存在,它会创建,还记得不,这个文件若不存在,如果不存在干什么呢?就创建。
05:07
没问题的同学们,下面有没有看到f right,能看到这什么意思吗?这是不是他要?写这个size of student,就是说我统计一下这个结构体类型的大小,五是不是把五个学生,也就是说把T大家看到没有,把T这个结构体数组的信息来写入到FP中,以二进制的形式写进去的,能看懂哈,就是将。将T结构体。结构体数组信息写入,对,写入到哪里去呢?写入到FP中,FP是哪里啊?FP就是指向这个文件的以二进制的形式写进去的关闭文件,关闭文件以后大家看这这两句话能看懂在在干什么吗?就是从这里到这里,其实它是输出了,输出了原始的这个T数组的信息,能看懂不。
06:05
为什么有个嵌套循环呢?因为他的成绩有三门,因此在这里面呢,在输出一个学生神经的时候,他需要循环三次,所以说这一段代码,这段代码做循环是干什么呢?输出输出T结构体数组信息。好,紧接着来看这里。大家看,这是关键的,这里他把student data这个文件名传给了放。那传给这个方呢,我们就来看他,他到底做什么事情,现在可以看了,这里其实就是调用,调用放函数,而且他是把这个文件名传过来的,所以说这个地方呢,它是以什么呢?它是以这个指针的形式来接收的。没有问题,也当然是,就是相相当于fair name,就是指向我们这个文件名字的一个,呃,一个指针,然后像前面我就不说了,看到没有看清楚了啊,那大家看,就是打开文件,我们同学们请大家思考,是不是此时此刻我们已经分析出来第一个问题了。
07:05
我在这写一下分析。我问大家,空格一应该填什么?空格,空格应应该怎么样填,大家还记不记得我们这个BI name这个文件,它是以二进制的形式创建和写入的,那你在打开的时候也应该以二进制的形式来读取,能理解吗?啊,所以说我们说因为。因为这个file文件啊,文件是以二进制。二进制的形式啊形式,呃,打开啊就是打开哦,或者叫创建吧,创建并写入。写入数据的。因此我们读取时。读取时也。也需要以相应的形式。也需要也需要以。
08:00
对应的或者相应的形式打开。打开读取,因为以前是读取了嘛,那显然稍微明白一点的同学就应该知道怎么填了,因为我在讲高校大学高校大学生C语言课程的时候,对文件的打开形式我是做了详细介绍的,这里我就不会再多说了,那应该填写什么呢?应该填写的就是R。R就是读,而RBB是boundary,就是以二进制的形式来读取,那不用多说,这里我们应该填写是RB。搞定,下面呢,大家看就开始读取了,它这句话是什么意思啊?F read的读我们是不是讲过f free的这个函数,这个函数是嗯,干什么呢?它是这样说的,嗯,从这个FP,从这个FP读取这么多个字节,就是size of student乘以NN是五吗?也就是读取五个学生信息到S这个地方要看懂。是从FP文件中,或者叫指向的文件中,哈,呃,读取,读取多少个字节呢?这么多个字节,Size of它乘以N。
09:13
关于这里的知识点,我其实已经讲过很多遍了,我就不再多说。读取到哪里呢?到S中。S是不是就是我们的一个零,呃,局部变量,它是一个结构体,结构体数组是不是,然后关闭文件,然后这里面大家有没有发现他在干什么事情。这里。同学们看这里啊,从这个地方这段代码老师现在高亮的部分,其实就是在进行排序。其实他用的是一个排序,其实其实用的就是我们的有点有点类似于一个冒泡排序的感觉啊,那现在因为他是要从小到大啊,大家看定案序号从小到大排序,那我问大家此时此刻应该怎么办呢?为什么呀,你想想也就是说他的小从小到大,那从小到大的话呢。
10:05
显然你这地方就是如果你你比我的大,我就往后面移动呗,是不是就是大的往后面沉嘛,那同学们能理解应该填什么了吗?好,我分析到这里了,第二个空格。也就是我们的空格二,空格二呢,是因为我们要按照学号从小到大排序,因此填写什么东西啊,是不是应该填写一个这样的符号大于S。姐。点s no就可以了,也就是说你这个I比我的大,我就怎么样呢,我就我就交换。就把大的往后沉,大于看清楚了。S解。点so。能能看懂吗?同学们就说,如果你这个I呢,比我这个大,我就交换,相当于说把大的往后面放,那小的呢往前面去。
11:00
没有任何问题。那这里的交换工作就做完了,下面这个地方应该怎么填呢?他是不是又把呃,他这交换完处理,处理过后的就是从小到大排序的这一个S结构体数组要重新写回到我们这个文件中,好,他看他再次打开。再次打开文件。再次打开文件,然后将什么呢?将排序好的排序好的结构体数组。排序好的结构体数组S是不是S重新重新写回写入到哪里呢?重写入。从写入到文件中。文件中。是不是这个道理,那我想问大家写的时候是不是用f right,你看原先这写的试试f right,那你现在再去调用,肯定这边也得写f right了。
12:05
用这个函数来完成,是不是也是写入这么多size of student乘以N个字节到FP里面去完毕,好,这个填完了,也就是说我们空格三应该填什么呢?空格山。啊,空格三就是应该是将排序好的结构题组重写到文件中。所以填写。各位同学,我们填写的函数名,函数名就是f right代码行为。现在呢,第123个空格就写完了下面的代码,其实诶这个这个不是说啊,这个另外是因为它的字符的问题,那下面呢,它有关调用完这个地方过后呢,他又打开这个文件,再重新读了一把,读完了过后呢,再显示了一下,就是看看你是不是写进去的,是是否是一个呃,从小到大排序的下面的代码哈,下面代码它又重新打开这一个文件,然后再读取,读取到这个SS中过后呢,再把它重新输出一下,看看是不是已经从小到大了。
13:12
就这意思,那同学们我们来试一下呗,好不好,为了测试呢,是不是我们这需要加一个get char呀,能理解我的意思,不get char来运行。运行一下,那运行过后呢,我们看这个效果呗。我们看看这个效果可不可以。运行起来我们可以看到,原先是105353241是没有顺序的,现在整理完了都是一二,你看对不对,很形象嘛,12345这些数据已经写入到文件里面去了。已经在文件里面了,所以他整个这个过程其实是这样子的,原先有一些数据写,呃,写入到这个一个文件中,写入到一个文件中,然后我们把再把这个文件里面的数据读,读入到这边进行一个排序。
14:04
能理解吧,排序,排序完了再重新复写这个文件,复写完了后再读取回来再显示,看看你排序的是不对的,其实它是这样一个流程。所以说他对文件的操作呢,其实有一次两次三次四次对读一次是往里面写了一次。读一次,再写一次,再读一次,这样同学们关于这道题的评讲老师就讲到这里。能理解吗?我将其放到我们的。试卷里边去好吧,然后是分析和解答。放好了。这是我们的第一道题,填空题就讲完了,有难度吗?大家觉得有没有难度,其实这道题本身是没有什么难度的,但是呢,要求我们对结构体,还有对文件的操作呢,有一定的了解,所以他还是比较综合的,我们再来看第二题,各位朋友。
我来说两句