配色: 字号:
任务4 批量学生成绩处理
2022-12-20 | 阅:  转:  |  分享 
  
J 程 序 设 计任务4:批量学生成绩处理 目录1、任务描述本任务主要完成学生信息管理系统中成绩管理子模块的各项功能,统计课程的最高分、最
低分、平均分和不及格人数。本任务需要对所有学生的成绩进行处理,涉及批量数据的操作。要完成本任务需要了解和掌握Java中数组和方法的
使用。 技术准备2.1 数组的定义与初始化1. 数组的定义数组的定义格式如下所示。数组类型[] 数组名 = new 数组类型[
数组长度];功能:声明一个数组,并为其分配相应的存储空间。说明:(1)数组类型即数组中要存放的数据的类型,既可以是基本数据类型,也
可以是引用数据类型。(2)数组类型后面跟的[]表示要声明的是一个一维数组。(3)数组长度表示数组中可存放的数据元素的个数,要求必须
是常量,不允许是变量。(4)数组名为自定义,只要符合标识符命名规则即可。2.1 数组的定义与初始化例:定义一个长度为3的整型数组
score。int[] score = new int[3];上述代码在声明数组的同时就为其分配了相应的存储空间,使用方式简洁。数
组的声明与存储空间的分配也可分开进行,上述数组的定义也可采用如下形式。int[] score; //声明一
个用于存放整型数据的数组scorescore = new int[3]; //为score数组分配存储空间(也称创建数组)
2.1 数组的定义与初始化数组是一种引用数据类型。数组元素和数组名在内存里是分开存放的。Java把内存分成两种,一种叫做栈内存,
一种叫做堆内存。栈内存用于存放一些基本类型的变量和引用类型的变量(如数组名或对象名)。堆内存用于存放由new创建的数组或对象。2.
1 数组的定义与初始化2. 数组的初始化数组的初始化分为动态初始化和静态初始化。动态初始化是指定义数组时没有为数组元素赋初始值,
这时系统会自动为数组中的元素赋初始值。Java中不同数据类型元素的默认初始值如下表所示。2.1 数组的定义与初始化静态初始化是指
在定义数组的同时就为数组元素指定相应的初始值。格式:数组类型[] 数组名 = new 数组类型[]{初值0, 初值1, ... ,
初值n};功能:定义数组的同时为数组指定初始值。提示:数组静态初始化时数组长度必须省略,系统会自动根据给出的初值个数决定数组的长度
。如果给出数组长度,编译时反而会出错。2.1 数组的定义与初始化例:定义一个长度为4的整型数组,并给出相应的初始值。int[]
score = new int[]{50,60,90,80};数组静态初始化也可将数组声明和数组的创建分开写,即上述代码也可采用如
下形式表示。int[] score ;score = new int[]{50,60,90,80};数组的静态初始化还可以采用如下
更简洁的方式。int[] score = {50,60,90,80};采用此种方式时,数组的声明和创建不能分开写,即写成如下形式是
错误的。int[] score;score = {50,60,90,80};2.2 数组的常用操作1. 数组元素的访问对数组中元
素可通过数组名[下标]的方式来访问,数组元素下标从0开始。例:score[0],score[2]2. 数组长度属性 每个数
组都有一个length属性,通过该属性可获取到数组的长度。 例:score.length3. 数组的遍历 操作数组
时,经常需要依次访问数组中的每个元素,这种操作称为数组的遍历。2.2 数组的常用操作【例 4?1】定义一个包含5个学生成绩的数组
,然后分别顺序、逆序输出数组中所有元素。2.2 数组的常用操作foreach循环格式:for(类型名 变量 : 数组名){
循环体}功能:对数组中的每个元素依次执行一遍循环体。说明:类型名为数组元素的类型,循环时系统自动依次将每个数组元素赋值给变量,然
后执行一遍循环体。2.2 数组的常用操作【例 4?2】利用foreach循环遍历数组2.2 数组的常用操作4. 数组最值找一组
数中的最大值或最小值也是数组的常用操作之一。找最值通常采用“打擂台法”来实现。以找最大值为例:首先假设第一个元素为当前的最大值(即
擂主),用一个变量记录其下标然后数组中第二个元素到最后一个元素依次与当前最大值进行比较(打擂),谁大就记录下谁的下标(即当前新擂主
)当所有元素都比较完,变量中记录的下标就是最大值所在的下标(最终擂主)。2.2 数组的常用操作【例 4?3】已知一组学生成绩,求
其最高分。2.2 数组的常用操作5. 排序排序也是数组的常见操作,排序方法也有很多,如选择排序、冒泡排序等。假设数组score中
存放了n个学生成绩,要求按成绩从高到低进行排序。采用选择排序法进行降序排序的过程如下:(1)从n个成绩中找出最高者与score[0
]交换。(2)从剩余的n-1个成绩中找出最高者与score[1]交换。......(n-1)从剩余的2个成绩中找出最高者与scor
e[n-2]交换。选择排序实际上就是每次从当前的一组数中找最值与指定位置上的元素进行交换。n个元素共需要找n-1次最值。2.2
数组的常用操作【例 4?4】已知一组学生的成绩,将其从高到低进行排序。2.3 二维数组二维数组可以看作是一个特殊的一维数组,即数
组中的每个元素本身又是一个数组。可以把二维数组的逻辑结构比作成二维表格。表格由若干行、若干列构成,每一行中包含的列数可以相同,也可
以不相同。2.3 二维数组1. 二维数组定义方式1:同时指定二维数组的长度和每个数组的元素个数,例:int[][] score
= new int[3][4];说明:上面代码实际上是定义了3个int[]类型的一维数组,每个一维数组中的元素又是一个长度为4的一
维数组。相当于一个行数为3、列数为4的二维表格,其逻辑结构如下所示。2.3 二维数组方式2:只指定二维数组的长度,不指定每个数组
的元素个数,例:int[][] score = new int[3][];说明:上述代码只指定了二维数组的长度,相当于只指定了二维
表格的行数,没指定每行的列数,可通过下面代码指定每行中包含的列数(实际上就是为每个一维数组分配相应的存储空间)。score[0]
= new int[1];score[1] = new int[2];score[2] = new int[3];其逻辑结构如图所
示。2.3 二维数组2. 二维数组的静态初始化二维数组的初始化同样也分为动态初始化和静态初始化。定义时没有指定初始值的系统会自动
为其赋默认初始值。二维数组静态初始化方法与一维数组静态初始化类似,将要初始化的数据放在大括号内,每行数据单独用一个大括号包裹,每个
大括号中的数据个数可以相同,也可以不相同(即每行中包含的列数可以相同,也可以不同),例:int[][] score = new i
nt[][]{{1,2},{3,4,5,6},{7,8,9}}同样,上述代码也可简写成如下形式:int[][] score = {
{1,2},{3,4,5,6},{7,8,9}}2.3 二维数组3. 二维数组元素的访问二维数组元素的访问通过数组名[下标1][
下标2]的方式实现,每个下标都是从0开始的。下标1相当于行下标,下标2相当于列下标。例:score[0][1]4. 二维数组的遍历
二维数组元素的遍历需要借助于双重循环,外循环用于控制行数,内循环用于控制列数。二维数组也有length属性,用于获取数组长度。2.
3 二维数组【例 4?5】二维数组的遍历2.3 二维数组二维数组的遍历也可采用foreach形式遍历:2.3 二维数组5.
二维数组应用示例【例 4?6】已知学生选修课程数学、英语、语文的成绩(每门课程选修人数不同),求各门课程平均分。2.4 命令行参
数数组main()方法中的参数String[] args,称为命令行参数数组,此数组用于接收以命令方式运行程序时在命令行传递的参数
。【例 4?7】命令行参数数组应用示例2.5 方法的定义与调用在编写程序时,可能会碰到一段相同代码需要重复使用多次的情况,如在数
组排序时数组的遍历输出就用了两次,这时就可以把这些需要重复使用的代码定义成一个方法,以后需要用到此段代码的时候只需要调用该方法就可
以。使用方法可提高代码的重用性,从而也可提高代码的可维护性。Java中的方法就类似于C语言中的函数。通常情况下,在结构化编程里面将
单独定义的一段可重复调用的代码称为函数,在面向对象编程里面则称之为方法。2.5 方法的定义与调用1. 方法的定义 public
static 返回值类型 方法名([形参表]){ 方法体; }说明:(1)方法可以有返回值,也可以没有返回值。如
果有返回值,则在方法体中用“return 表达式”语句返回相应的结果。表达式值的类型即返回值的类型。如果没有返回值,则返回值类型应
设为void。(2)形参可以有0个或多个。每个形参都需要用类似“类型 参数名”的形式进行声明,即使多个形参的类型相同,也不能共用一
个类型,如(int a,b)这样的参数声明是不合法的,正确的声明方式应是:(int a, int b)。 (3)形参需要用括号包裹
,即使没有形参,方法名后的括号也不能省略。(4)public 表示这个方法的访问权限是公共的, static表示这个方法是静态方法
。(5)方法名命名规则 :第一个单词首字母小写,后面单词首字母大写,如printMenu。2.5 方法的定义与调用2. 方法的调
用方法定义好后,就可以在其它方法中使用这一方法,称为方法的调用。格式:方法名([实参表])说明:如果方法定义时没有形参,则调用时也
不必给出实参。2.5 方法的定义与调用【例 4?8】定义一个求阶乘的方法,然后利用该方法求5的阶乘。2.5 方法的定义与调用【
例 4?9】定义一个输出社会主义核心价值观内容的方法,然后在main()方法中调用。2.6 方法的重载引例:设有如下应用场景,要
在程序中实现一个对数字求和的方法,数字可能是整数,也可能是小数,参与运算的数可能是2个,也可能是3个。此时我们可能需要定义4个不同
方法来实现,定义一个对2个整数求和的方法,定义一个对3个整数求和的方法,定义一个对2个小数求和的方法,定义一个对3个小数求和的方法
。2.6 方法的重载上述代码缺点:程序中用到的方法名比较多,不便于使用。解决办法:方法重载。Java允许在一个类中定义多个名称相
同,但是参数个数或类型不同的方法,这就是方法的重载(方法重载实际上就是指一个类中有多个同名方法)。在调用时系统会自动根据传递的参数
个数或参数类型来决定调用哪个同名方法。方法的重载必须要满足两个条件:一是方法名相同,二是参数个数或参数类型不同。与返回值类型无关。
2.7 不定长参数在求几个数相加时,可能是两个数,也可能是三个数,或者是四个、五个,即参数个数不确定。如果按照前述方法得需要分别
定义不同参数个数的add()方法,尽管名称都相同,可是add()方法还是需要定义多个,仍然不够灵活,这时可采用可变长度参数(也叫不
定长参数)。在定义方法时,在形参类型后(或者在形参名前)增加三个点(...),表示该形参可以接收多个参数值,接收进来的多个参数值被
当成数组传入。不定长参数只能处于形参列表的最后,而且一个方法中最多只能包含一个不定长参数。调用一个包含不定长形参的方法时,这个不定
长形参既可以接收多个参数,也可以接收一个数组。2.7 不定长参数【例 4?12】求任意多个整数和任意多个小数的和。2.8 参数
传递方法调用时参数传递方向是单向传递,即由实参传递给形参。需注意的是形参如果是基本数据类型,则在方法体中对形参的修改不会影响到实参
。如果形参是引用数据类型,则在方法体中对形参的修改可能会影响到实参。2.8 参数传递【例 4?13】基本数据类型做形参。2.8
参数传递【例 4?14】引用数据类型做形参。2.9 变量作用域程序中用到的变量并不是在任何位置都可以访问的,访问权限取决于这个
变量是在哪里定义的。变量起作用的代码范围称为变量的作用域。变量的作用域决定了在哪一部分代码中可以访问哪些变量。在方法中,变量的作用
域分为块级和方法级,对应的变量分别称为块级变量和局部变量。块级变量是在代码块(代码块是指用大括号包裹的一组语句)中定义的变量,其作
用域为从定义处到所在的代码块结束。局部变量是在方法内部定义的变量,其作用域为从定义处到方法结束。在同一作用域内不允许有同名变量出现
,但在不同作用域内可以有同名变量,两者互不影响。2.9 变量作用域【例 4?15】块级和方法级变量作用域应用示例。 任务实施3
.1 统计课程最高分每门课程成绩可以用一个一维数组来存放,3门课程都需要统计课程最高分,可以定义一个求课程最高分的方法,然后通过调
用该方法得到每门课程的最高分。3.2 统计课程最低分每门课程成绩用一个一维数组来存放,3门课程都需要统计课程最低分,将求课程最低分
定义成一个方法,然后通过调用该方法得到每门课程的最低分。3.3 统计课程平均分每门课程成绩用一个一维数组来存放,3门课程都需要统计
课程平均分,可以定义一个求平均分的方法,然后通过分别调用该方法得到每门课程的平均分。3.4 统计课程不及格人数每门课程成绩可以用一
个一维数组来存放,3门课程都需要统计课程不及格人数,可以定义一个求统计不及格人数的方法,然后通过分别调用该方法得到每门课程相应的不
及格人数。3.5 成绩管理子模块实现上述各功能是分开实现的,实际项目中需要将各功能整合在一起,为用户提供相应的功能菜单,用户通过选择相应的菜单来实现课程数据的相关统计。【任务要求】进入成绩管理子模块后,首先显示相应的功能菜单及相应的命令提示符“score>”。用户可在命令提示符后面输入相应的命令来执行相应的功能。能够接收的命令是“avg”、“max”、“min”、“fails”和“return”,其他输入无效。系统启动后,循环等待用户输入命令,直到用户输入“return”结束。3.5 成绩管理子模块实现参考代码:3.5 成绩管理子模块实现参考代码:3.5 成绩管理子模块实现参考代码:3.5 成绩管理子模块实现参考代码:3.5 成绩管理子模块实现参考代码:3.5 成绩管理子模块实现参考代码:3.5 成绩管理子模块实现运行结果:J 程 序 设 计谢 谢
献花(0)
+1
(本文系籽油荃面原创)