我们要完成一个学生成绩管理系统,昨天写了主函数、增加函数和打印全部学生信息的函数,还有查找、删除、修改的功能没有实现。
今天讲查找功能的实现,在我的程序中由函数f4完成这个功能。
我们再看一下题目要求,主菜单如图1,输入数字进行相应的操作。按1键实现“增加”功能,按2键实现“查找”功能,按3键实现“修改”功能,按4键实现“删除”功能,按5键实现“显示所有信息”功能,按0键实现“退出”功能。
昨天实现了程序的框架和函数f1和函数f5,今天来解释一下这些功能。
1 程序总框架
我们先看主函数代码,程序1如图1:
在这个程序里,注意看第2行,定义了一个变量number,这个变量不在函数main里面定义,而是在函数外面定义的,这个变量叫全局变量。
不在函数里面定义的变量叫全局变量,在函数里面定义的变量叫局部变量。
全局变量可以让所有在它后面定义的函数使用;
局部变量只能在定义它的这个函数里使用。
比如在main函数里定义了三个变量:xz、flag、数组a,都是局部变量,这三个变量只能在main函数里面使用,出了main函数,别的函数是不能用这三个变量的。
但是要注意,在main函数里调用其他函数如f1、f2、f3、f4、f5时,都有实参a,那么这个a可以传到这个函数中,这些函数就与a有了联系。
2 增加功能:函数f1的实现
昨天实现了函数f1增加功能和和函数f5打印功能。
我们先看函数f1,代码如图2:
在f1这个函数里,定义了两个局部变量n和i。
首先输入n,然后我们来看那个for循环:
for( i = number ; i < number+n ; i++ )
number是全局变量,存放学生总人数,初值为0,每增加一个学生,学生总数number就加1。所以我们看到这个for循环结束时,有一句:
number=number+n;
学生总人数加了n。
n 是一开始要输入的,你需要增加的学生人数,所以要循环n次,输入n个学生的学号、姓名和成绩。
比如我先输入3,表示增加3个学生信息,然后依次输入三个学生的学号、姓名和成绩。运行结果如图2:
3 打印功能:函数f5的实现
再看函数f5。
函数f5的功能是打印所有学生信息,就是循环输出每个学生的学号、姓名、成绩。
因为有number个学生,所以循环语句是:
for( i = 0 ; i < number ; i++ )
注意这里i循环从0开始,因为数组下标是从0开始的,从0开始,循环number次,就是循环到i < number,或者写成:i <= number-1 也行。
函数f5的实现比较简单,就是循环number次,输出学生的学号、姓名和成绩。
代码如图4:
4 查找功能:函数f4的实现
现在我们来完成查找函数f4。
在主菜单选择4时,调用函数f4,执行查询操作。
这里我们按学号查询(其实实际中可能更多的是按姓名查询,因为学号记不住,但是姓名可以记得住,按姓名查询先不讲)。
有没有人注意到函数f4的类型和其他函数不一样,其他函数的类型是void,而函数f4的类型是int,也就是说函数f4是一个有返回值的函数,要返回一个整数(int),就是说函数f4中必须有一句return 整数。
为什么这么设置?是有深意的,这个后面说。
在函数f4里定义了5个变量:
其中flag是一个存在查找是否成功的变量,如果找到,falg等于i(记下找到的位置),找不到,让flag等于-1。
输入要查询的学号x,根据这个x,从头开始查找有没有学号等于x的学生,这个需要循环:
for( i = 0 ; i < number ; i++ )
然后在循环体里,判断有没有学号(a[i].xh)等于x的学生,如果有就显示这个学生信息,判断语句为:
if ( a[i].xh == x )
找到了就显示学生信息,并记下该生下标i,中断循环,代码为:
怎么知道找不到学生呢?那肯定就是要一直循环到最后,都没有中断循环。
再说一次,如果能正常循环到最后(中途没有中断),那么就是没有找到学生。
正常循环到最后,i大于等于number,因为循环条件就是i < number,当不满足这个条件后,循环就是结束了。
所以循环结束后,要有一句:if ( i >= number )
这个i >= number是循环条件i < number反条件,表示循环正常结束,也就是没找到学生。此时显示“查无此人”,并让标记flag的值等于-1。
代码为:
好了,我们现在来看函数f4怎么实现,如图5:
根据输入的学号,查询这个学生的信息,查到则显示该生信息,查不到显示“查无此人”。
假设我们查找学号为1的学生,找到了显示该生信息。如图6。
如果输入学号是9,查找学号为9的学生,没有学号为9的学生,则显示查无此人。如图7。
5 为什么函数f4要返回一个整数?
现在还有一个问题:为什么函数的类型是int而不是void?为什么f4要返回一个函数?
这是为了在实现修改(函数f3)和删除(函数f2)时,我们是不是需要先查找再修改或删除?
比如我要删除学号为2的学生信息,我必须先找到这个学号为2的学生,才能删除。
如果根本就没有学号为2的学生,那就没法删除。
也就是说,删除前总要先查找,所以我可以调用查询函数(f4函数),找到就继续往下做,找不到就不做了。
那么我怎么知道找到找不到?在删除函数里先调用函数f4,如果调用的函数f4返回值为某某个整数,表示找到,这个整数也就是数组的下标,可以继续往下。
如果函数f4的返回值为-1,则表示没有这个学生,就不用删除了。
修改也是一样的道理,先查找,找到才能修改,找不到就无需修改。
这就是为什么查找函数f4的类型不是void而是int,因为它需要一个返回值来判断是否找得到。
今天就先讲到这里,昨天没看明白的,今天好好看一看,可以帮助理解。