一个自己编写的小型管理系统,运用非常基础的思想和方法,可以实现学生人数,及其相关成绩,学号,姓名等等信息的调用与存储。理解起来非常简单,是期末救急的好程序(doge)。
先展示下运行过程,代码在下面。
输入学生基本信息
请输入学生人数
3
当前学生人数为3人
请输入科目数量
2
当前科目数量为2科
请输入学生姓名
q
请输入学生学号
1
学生姓名和学号为q1
请输入第1科成绩
123
请输入第2科成绩
124
q学生成绩为
123
124
请输入学生姓名
w
请输入学生学号
2
学生姓名和学号为w2
请输入第1科成绩
125
请输入第2科成绩
126
w学生成绩为
125
126
请输入学生姓名
e
请输入学生学号
3
学生姓名和学号为e3
请输入第1科成绩
127
请输入第2科成绩
128
e学生成绩为
127
128
请在以下功能中选择,并将功能名称输入
求得平均分,并列出90以上学生的信息
获得按照某一课成绩排序的学生名单
获得总成绩名单
结束使用
求得平均分,并列出90以上学生的信息
q学生的平均分为123.5
w学生的平均分为125.5
e学生的平均分为127.5
90分以上的。。。出列!!!
姓名q学号1得分123.5
姓名w学号2得分125.5
姓名e学号3得分127.5
请在以下功能中选择,并将功能名称输入
求得平均分,并列出90以上学生的信息
获得按照某一课成绩排序的学生名单
获得总成绩名单
结束使用
获得按照某一课成绩排序的学生名单
你想要以第几项成绩作为排名的依据?
2
e学生的第2成绩为128学号为3
w学生的第2成绩为126学号为2
q学生的第2成绩为124学号为1
请在以下功能中选择,并将功能名称输入
求得平均分,并列出90以上学生的信息
获得按照某一课成绩排序的学生名单
获得总成绩名单
结束使用
获得总成绩名单
e学生的总成绩为255.0学号为3
w学生的总成绩为251.0学号为2
q学生的总成绩为247.0学号为1
请在以下功能中选择,并将功能名称输入
求得平均分,并列出90以上学生的信息
获得按照某一课成绩排序的学生名单
获得总成绩名单
结束使用
结束使用
拜拜
首先直接上整段代码吧,如有需要后面有较为详细的讲解和分步。
import java.util.Scanner;
import java.util.Arrays;
class Student{
int xuehao; //学号
String name2; //名称
int chengjishuzu[]; //各科成绩储存在一个成绩数组里
float pingjunfen; //平均分
float fenshuhe; //分数之和
int a; //a这里是用于控制循环次数的变量
int x; //用于记录人数
int y; //用于记录科目数
}
public class xueshengchengji {
public static void main(String [] args){
System.out.println("输入学生基本信息");
Scanner sc = new Scanner(System.in);
Student s = new Student();
Student ren[] = new Student[shuruxinxi1(s)];
shuruxinxi2(s,ren);
//在java语言中是没有指针这个东西的,但是如果不使用指针的话,我们难以在各个函数内部修改一个变量的值,其实Java也有所谓的指针
//那就是类以及其成员,在一个类中的成员属性可以被随时调用,只要传输成员作为参数即可,我们这里便使用Student类 s,作为我们的"指针"
//首先输入学生基本信息,两个输入函数分开使用,第一个函数的的返回值作为学生人数的数量对Student的成员数组进行长度修饰
//获得基本信息
while(true){
//利用while循环反复显示用户可能的需求,直至用户完全完成工作,输入结束使用程序停止
System.out.println("请在以下功能中选择,并将功能名称输入");
System.out.println("求得平均分,并列出90以上学生的信息");
System.out.println("获得按照某一课成绩排序的学生名单");
System.out.println("获得总成绩名单");
System.out.println("结束使用");
String yonghu = sc.nextLine();
if(yonghu.equals("求得平均分,并列出90以上学生的信息")){
qiupingjunfen(s,ren);
//调用equals方法,判断用户需求,调用不同的函数,其中反复出现的ren,即为存储所有学生成员的Student数组
}
if(yonghu.equals("获得按照某一课成绩排序的学生名单")){
chengjipaixu(s,ren);
}
if(yonghu.equals("获得总成绩名单")){
zonghcengjipaiming(s, ren);
}
if(yonghu.equals("结束使用")){
System.out.println("拜拜");
break;
}
}
}
public static int shuruxinxi1(Student s){
Scanner sc = new Scanner(System.in);
System.out.println("请输入学生人数");
s.x = sc.nextInt();
System.out.println("当前学生人数为"+s.x+"人");
System.out.println("请输入科目数量");
s.y = sc.nextInt();
System.out.println("当前科目数量为"+s.y+"科");
return s.x;
}
public static void shuruxinxi2(Student s,Student ren[]){
Scanner sc = new Scanner(System.in);
s.a = 0; //利用a控制循环次数
while(s.a<s.x){
ren[s.a] = new Student();
System.out.println("请输入学生姓名");
ren[s.a].name2 = sc.next();
System.out.println("请输入学生学号");
ren[s.a].xuehao = sc.nextInt();
System.out.println("学生姓名和学号为"+ren[s.a].name2+ren[s.a].xuehao); //ren[x]代表的是一个具体的Student类的成员
ren[s.a].chengjishuzu = new int[s.y];
for(int aa = 0;aa < s.y;aa++){
System.out.println("请输入第"+(aa+1)+"科成绩");
ren[s.a].chengjishuzu[aa] = sc.nextInt();
ren[s.a].fenshuhe += (float)ren[s.a].chengjishuzu[aa]; //这里使用强制类型转换计算出总成绩
}
System.out.println(" ");
System.out.println(ren[s.a].name2+"学生成绩为");
System.out.println(" ");
for(int ba:ren[s.a].chengjishuzu){ //使用foreach循环遍历学生成绩结果
System.out.println(ba);
}
s.a++;
}
}
public static void qiupingjunfen(Student s,Student ren[]){
s.a = 0;
while(s.a<s.x){
ren[s.a].pingjunfen = (ren[s.a].fenshuhe/s.y);
System.out.println(ren[s.a].name2+"学生的平均分为"+ren[s.a].pingjunfen);
s.a++;
}
System.out.println(" ");
System.out.println(" ");
System.out.println("90分以上的。。。出列!!!");//流浪地球2的梗(doge)
System.out.println(" ");
System.out.println(" ");
for(Student s1:ren){
if(s1.pingjunfen>90){
System.out.println("姓名"+s1.name2+"学号"+s1.xuehao+"得分"+s1.pingjunfen);
}
}
}
public static void chengjipaixu(Student s,Student ren[]){
Scanner sc = new Scanner(System.in);
System.out.println("你想要以第几项成绩作为排名的依据?");
int xuanze = sc.nextInt();
int chengji[] = new int[s.x];
for(int d = 0;d<s.x;d++){
chengji[d] = ren[d].chengjishuzu[xuanze-1]; //这里成绩顺序与学生成员在ren数组里的顺序保持一致
}
for(int ax = 0;ax<chengji.length-1;ax++){
for(int bx = ax+1;bx<chengji.length;bx++){ //经典的冒泡排序,这里是对成绩进行排序,但是在交换位置是我们交换的是ren
if(chengji[bx]>chengji[ax]){ //数组中的成员位置,后续输出成绩时就可以利用ren[]数组中的成员来调用相关的属性
Student t = ren[ax]; //最重要的好处还是我们不仅仅局限于输出成绩,更可以利用排序后的成员调用其他属性
ren[ax] = ren[bx]; //在输出成绩的同时输出其他的相关信息,比如姓名学号
ren[bx] = t;
}
}
}
for(Student s1:ren){
System.out.println(s1.name2+"学生的"+"第"+xuanze+"成绩为"+s1.chengjishuzu[xuanze-1]+"学号为"+s1.xuehao);
}
}
public static void zonghcengjipaiming(Student s,Student ren[]){
float chengji[] = new float[s.x];
for(int a = 0;a<s.x;a++){
chengji[a] = ren[a].fenshuhe;
}
for(int ax = 0;ax<chengji.length-1;ax++){
for(int bx = ax+1;bx<chengji.length;bx++){ //大同小异对总成绩进行排名
if(chengji[bx]>chengji[ax]){
Student t = ren[ax];
ren[ax] = ren[bx];
ren[bx] = t;
}
}
}
for(Student s1:ren){
System.out.println(s1.name2+"学生的"+"总成绩为"+s1.fenshuhe+"学号为"+s1.xuehao);
}
}
}
好,那么我们首先来看唯一的类Student,与相应的主函数的调用,Student类的属性声明十分简单,最重要的其实也就是对于Student ren[]这个数组的使用,通过这个我们便可以让用户来确定学生的人数,也可以通过调用数组的第x号元素来调用相应的人员属性,这在后面的依据成绩进行排序,并且调用出相应的姓名,学号等等有重要意义。
我们不应该拘泥于课本上教授的一些方法,更应该自己去更贴近用户的在使用时的真实感受,就拿我自己举例,我们老师对这个程序的要求是仅仅是假设有四个学生,然后对其进行操作,这样显然是降低了难度,直接定义Student1,2,3,4,就完事了,但实际上不可能真的每个用户都刚好对四个学生的信息进行操作,如果有五个学生难道这个程序就用不了了吗?即使是刚刚接触程序也应该努力向提高复用率,多用途场景去做考虑。
import java.util.Scanner;
import java.util.Arrays;
class Student{
int xuehao; //学号
String name2; //名称
int chengjishuzu[]; //各科成绩储存在一个成绩数组里
float pingjunfen; //平均分
float fenshuhe; //分数之和
int a; //a这里是用于控制循环次数的变量
int x; //用于记录人数
int y; //用于记录科目数
}
public class xueshengchengji {
public static void main(String [] args){
System.out.println("输入学生基本信息");
Scanner sc = new Scanner(System.in);
Student s = new Student();
Student ren[] = new Student[shuruxinxi1(s)];
shuruxinxi2(s,ren);
//在java语言中是没有指针这个东西的,但是如果不使用指针的话,我们难以在各个函数内部修改一个变量的值,其实Java也有所谓的指针
//那就是类以及其成员,在一个类中的成员属性可以被随时调用,只要传输成员作为参数即可,我们这里便使用Student类 s,作为我们的"指针"
//首先输入学生基本信息,两个输入函数分开使用,第一个函数的的返回值作为学生人数的数量对Student的成员数组进行长度修饰
//获得基本信息
while(true){
//利用while循环反复显示用户可能的需求,直至用户完全完成工作,输入结束使用程序停止
System.out.println("请在以下功能中选择,并将功能名称输入");
System.out.println("求得平均分,并列出90以上学生的信息");
System.out.println("获得按照某一课成绩排序的学生名单");
System.out.println("获得总成绩名单");
System.out.println("结束使用");
String yonghu = sc.nextLine();
if(yonghu.equals("求得平均分,并列出90以上学生的信息")){
qiupingjunfen(s,ren);
//调用equals方法,判断用户需求,调用不同的函数,其中反复出现的ren,即为存储所有学生成员的Student数组
}
if(yonghu.equals("获得按照某一课成绩排序的学生名单")){
chengjipaixu(s,ren);
}
if(yonghu.equals("获得总成绩名单")){
zonghcengjipaiming(s, ren);
}
if(yonghu.equals("结束使用")){
System.out.println("拜拜");
break;
}
}
}
接下来就是各个子函数,包括了多种方法
这是第一个,先输入各个学生的基础信息比较有价值的其实就是一个foreach循环,非常好用foreach格式就是(Object obj:你想遍历的东东)。
public static int shuruxinxi1(Student s){
Scanner sc = new Scanner(System.in);
System.out.println("请输入学生人数");
s.x = sc.nextInt();
System.out.println("当前学生人数为"+s.x+"人");
System.out.println("请输入科目数量");
s.y = sc.nextInt();
System.out.println("当前科目数量为"+s.y+"科");
return s.x;
}
public static void shuruxinxi2(Student s,Student ren[]){
Scanner sc = new Scanner(System.in);
s.a = 0; //利用a控制循环次数
while(s.a<s.x){
ren[s.a] = new Student();
System.out.println("请输入学生姓名");
ren[s.a].name2 = sc.next();
System.out.println("请输入学生学号");
ren[s.a].xuehao = sc.nextInt();
System.out.println("学生姓名和学号为"+ren[s.a].name2+ren[s.a].xuehao); //ren[x]代表的是一个具体的Student类的成员
ren[s.a].chengjishuzu = new int[s.y];
for(int aa = 0;aa < s.y;aa++){
System.out.println("请输入第"+(aa+1)+"科成绩");
ren[s.a].chengjishuzu[aa] = sc.nextInt();
ren[s.a].fenshuhe += (float)ren[s.a].chengjishuzu[aa]; //这里使用强制类型转换计算出总成绩
}
System.out.println(" ");
System.out.println(ren[s.a].name2+"学生成绩为");
System.out.println(" ");
for(int ba:ren[s.a].chengjishuzu){ //使用foreach循环遍历学生成绩结果
System.out.println(ba);
}
s.a++;
}
}
我稍微动了点脑子的地方就是这个排序,如果真的只能对一个成绩数组输出成绩,却不知道相应的人员信息,是不是也太离谱了点,所以使用了比较对成绩,排序对人员的方法,由于人员数组与成绩数组顺序一致,那么便可以实现相应的功能
public static void chengjipaixu(Student s,Student ren[]){
Scanner sc = new Scanner(System.in);
System.out.println("你想要以第几项成绩作为排名的依据?");
int xuanze = sc.nextInt();
int chengji[] = new int[s.x];
for(int d = 0;d<s.x;d++){
chengji[d] = ren[d].chengjishuzu[xuanze-1]; //这里成绩顺序与学生成员在ren数组里的顺序保持一致
}
for(int ax = 0;ax<chengji.length-1;ax++){
for(int bx = ax+1;bx<chengji.length;bx++){ //经典的冒泡排序,这里是对成绩进行排序,但是在交换位置是我们交换的是ren
if(chengji[bx]>chengji[ax]){ //数组中的成员位置,后续输出成绩时就可以利用ren[]数组中的成员来调用相关的属性
Student t = ren[ax]; //最重要的好处还是我们不仅仅局限于输出成绩,更可以利用排序后的成员调用其他属性
ren[ax] = ren[bx]; //在输出成绩的同时输出其他的相关信息,比如姓名学号
ren[bx] = t;
}
}
}
for(Student s1:ren){
System.out.println(s1.name2+"学生的"+"第"+xuanze+"成绩为"+s1.chengjishuzu[xuanze-1]+"学号为"+s1.xuehao);
}
}
整体就是这么一个程序,没有什么特别突破性的想法,大家随便看一看就好。