一、学生成绩查询系统(Java实现)
项目要求(我们可以做的更面向对象一点,灵活处理):
具体思路如下:
1、引入程序需要调用的包
2、创建总程序包 "stuScoreInquirySystem"
3、在main类以及其他方法类外面定义好学生名字及课程名称并存入,给予静态赋值
4、分类创建方法
1、main()方法、
2、初始化方法 initScore()
3、输入成绩方法 scanfScore()
4、显示成绩方法 show()
5、运行程序方法(实现功能)run()
平均分方法 arg()
查询学生单科成绩方法 get()
单科成绩排名方法 subjectRank()
import java.lang.ArrayIndexOutOfBoundsException;
import java.util.Scanner; //引入Scanner包
public class stuScoreInquirySystem { //程序包名“学生成绩查询系统”
Scanner src=new Scanner(System.in);
final static int STUDENT_NUM=6; //学生数量
final static int COURSE_NUM=5; //课程总数
static String[] students={"zhang","wang","li","zhao","liu","song"}; //一维数组存入学生名字
static String[] courses={"C","Java","mySQL","Linux","HTML"}; //一维数组存入课程名字
static int[][] score=new int[STUDENT_NUM][COURSE_NUM]; //学生成绩存在二维数组中
//main()入口
public static void main(String[] args){
initScore();
scanfScore(score);
show();
run(students,courses,score);
}
//初始化“学生成绩二维数组” 随机数
public static void initScore(){
for(int i=0;i< score.length;i++){
for(int j=0;j<score[0].length;j++){
score[i][j]=(int)(Math.random()*1); //java.lang.Math包里 随机数,返回大于等于0.0小于1.0的随机double数
}
}
}
//输入成绩
public static void scanfScore(int[][] score){
Scanner src =new Scanner(System.in);
System.out.println("请分别输入6位学生的成绩");
for(int i=0;i< score.length;i++){
System.out.println("请输入第"+(i+1)+"位名叫"+students[i]+"同学的各科成绩");
System.out.println("请按照“C Java mySQL Linux HTML的顺序输入”");
for(int j=0;j<score[0].length;j++){
score[i][j]=src.nextInt();
}
}
}
//显示成绩方法
public static void show(){
System.out.print("\t");//第一行第一列的空格,让其空出来
for(int i=0;i< courses.length;i++){ //一一打印课程名字(第一行)
System.out.print(courses[i]+"\t"); //\t表示空格符,它使显示的成绩排列整齐
}
System.out.println(); //换行
for(int i=0;i< score.length;i++){ //循环打印成绩
System.out.print(students[i]+"\t"); //显示学生名字
for(int j=0;j<score[i].length;j++){ //显示学生成绩
System.out.print(score[i][j]+"\t");
}
System.out.println();
}
}
//run运行程序
public static void run(String[] students,String[] courses,int[][] score){
Scanner sca=new Scanner(System.in);
while(true){
System.out.print("请输入命令:");
String command1=sca.next();
if(command1.equalsIgnoreCase("avg")){
String command2=sca.next();
arg(students, courses, score, command2);
}
else if(command1.equalsIgnoreCase("get")){
String command2=sca.next();
String command3=sca.next();
get(students,courses,score,command2,command3);
}
else if(command1.equalsIgnoreCase("sort")){
String comand2=sca.next();
subjectRank(students,courses,score,comand2);
}
else if(command1.equalsIgnoreCase("exit")){
System.out.println("退出查询系统!byebye!");
return;
}
}
}
//arg各科目平均分 学生平均分
public static void arg(String[] students,String[] courses,int[][] score,String str){
int i_index=-1;
int j_index=-1;
int sum=0;
int pj=0;
for(int i=0;i< students.length;i++){
if(str.equalsIgnoreCase(students[i])){
i_index=i;
}
}
for(int j=0;j< courses.length;j++){
if(str.equalsIgnoreCase(courses[j]))
j_index=j;
}
if(i_index==-1&j_index==-1)
System.out.println("您输入的既不是学生,也不是课程");
if(i_index!=-1){
for(int i=i_index;i<=i_index;i++)
for(int j=0;j< courses.length;j++){
sum+=score[i][j];
}
pj=sum/ courses.length;
System.out.println(students[i_index]+"的平均分是:"+pj);
}
else if(j_index!=-1){
for(int i=0;i< students.length;i++)
for(int j=j_index;j<=j_index;j++ ){
sum+=score[i][j];
}
pj=sum/ students.length;
System.out.println(courses[j_index]+"的平均分是:"+pj);
}
}
//get 查询学生单科成绩
public static void get(String[] students,String[] courses,int[][] score,String str1,String str2){
int i_index=-1; //初始化分数行坐标
for(int i=0;i< students.length;i++){ //判断是否有这位同学,有,记下其坐标(行)
if(students[i].equalsIgnoreCase(str1))
i_index=i;
}
if(i_index==-1){
System.out.println("没有"+str1+"这个人");
return; //如果没有找到该学生名字,则str1仍然等于-1,就退出(不执行下列代码)
}
int j_index=-1; //初始化分数列坐标
for(int j=0;j< courses.length;j++){ //判断这位同学是否有这门课程,有,记下其坐标(列)
if(courses[j].equalsIgnoreCase(str2))
j_index=j;
}
if(j_index==-1){
System.out.println(str1+"没有"+str2+"这门课程");
return; //如果没有找到课程名称,str2仍然等于-1,就退出(不执行下列代码)
}
System.out.println(str1+"的"+str2+"的成绩是:"+score[i_index][j_index]); //根据行列坐标输出这个值
}
//单科成绩排名
public static void subjectRank(String[] students,String[] courses,int[][] score,String str){
int j_index=-1; //初始化课程坐标值(列)j
for(int j=0;j< courses.length;j++){ //查询是否存在该门课程
if(str.equalsIgnoreCase(courses[j]))
j_index=j; //记下课程坐标
}
if(j_index==-1){ //判断查询的该门成绩是否存在,不存在退出
System.out.println("没有"+str+"这门课程");
return;
}
int sum=0; //排序,先初始化工具量sum
//String sumStu=new String(""); //建立一个字符串数组,并赋初始值,作为字符串工具转移变量 不知道行不行
String sumStu=null;
for(int i=0;i< students.length-1;i++)
for(int j=0;j< students.length-1-i;j++){
if(score[j][j_index]>score[j+1][j_index]){
sum=score[j][j_index];
sumStu=students[j];
score[j][j_index]=score[j+1][j_index];
students[j]=students[j+1];
score[j+1][j_index]=sum;
students[j+1]=sumStu;
}
}
System.out.println("名次"+"\t"+"姓名"+"\t"+courses[j_index]+"\t"); //输出排名情况
int i=0;
for(int minCi=1;minCi<= students.length&i<students.length;minCi++){
System.out.println(minCi+"\t"+ students[i]+"\t"+score[i][j_index]+"\t");
i++;
}
}
}
二、代码运行验证:
三、技巧及知识总结:
1、equalsIgnoreCase()与equals()方法不同的是,前者不区分大小写,因而使得用户输入命令的时候不用考虑大小写的情况
2、random()方法
Java中存在着两种Random函数,他们所在jdk包如下:
java.lang.Math.Random;(我用的是这一种,它可以随机给对象返回大于等于0.0小于1.0的double初始值,来初始化对象属性)
2、java.util.Random(我还不是很熟,大家可以复制百度一下,或者自己查一下API)
3、ArryIndexOfBoundsException:数组越界
合理:[0,arr.length-1]
越界:arr[-1],arr[arr.length]
在写这行代码的时候笔者也是初学者,报了好几个错误,这个最常见,大家一定要熟悉
4、next()和nextLine()的使用
next()它遇到空格或者enter键就停止读取,nextLine()遇到enter键才结束读取
next()从第一个非空字符开始读取,nextLine()不管字符空或非空,都读取(我举个例子你就明白了,我测试了)
//我输入一下命令(带有空格)
hello ni hao ya //hello前我输入了几个空格(注)
//若next()读取,会打印"hello",没有一点空格,而且不会打印“ni”、"hao"等等,因为遇到空格就停止了
//若nextLine[]读取,会打印" hello ni hao ya",你输入的那一行有啥它就打印出啥,包括空格,直到按下enter键后,按enter键之前的都会打印出来
........................................................
//输入一行字符,以空格分开,怎么样分别存入它的值
//例如:输入“wo shi chao ji wu di da shuai ge” 我是超级无敌大帅哥9段字符,我可以用9个next()读取
//但是实际操作中不想写这么多行next()重复代码,我们可以用递归的思想,慢慢琢磨哈
//所以我这次想表达的是,next()方法可以一段一段读取字符串
...........................................................
5、编写代码是,要时刻考虑是否要立一个flag,如j_index、i_index就是我立的一个flag
6、"\t"的使用:为了实现让程序输出时如同表格一样整齐有序,我们可以巧妙学会使用"\t",它会自动识别字符长度,为字符分配空间。
"\t"是补全当前字符串长度到8的整数倍,补多少要看你\t前字符串长度,比如当前字符串长度10,那么\t后长度是16,也就是补6个空格,如果当前字符串长度13,此时\t后长度是16,补3个空格
7、有时候我们无法判断数组长度为多少时,可以使用"数组名.length"来解决,调用数组时我们通常用它的数组名,其实也就是它的首地址。
在这里要注意的是:一维、二维和多维;拿最常见的二维数组来举例:arr[不知道] [也不知道],arr.length表示一维行的长度,arr[0].length表示二维列的长度。都是首地址的形式,想一想哈哈。
8、数组的复制和赋值
赋值,相当于给它一个快捷方式,不开辟这么多空间 ,你就想想电脑桌面的快捷方式就可以了,他们两都指向堆中同一个地址,电脑桌面的快捷方式是指向硬盘中的一个储存地址
复制数组,就要new一个数组,给它开辟一个空间,这个是实实在在分配了与原数组一样的存储空间的
9、for(A;B;C)这个循环我最近也去大胆的乱测了一下,我尝试在A区多谢几条代码,用逗号分开,好像不行,我之后再去多多试一下,可能我说的是错哈B、C区我同样也试了一下,最终结果有待论证,我知道后会更新博客
10、这个成绩管理demo的”学生名字“放在了列,“课程名称”放在了行,它们虽然是以为数组,但是它们的角标可以注入我们的score[] []二维里,这个笔者刚开始想了好久都没想到,后面阴差阳错看了段源码恍然大悟
11、A&&B 与 A&B 的区别(在之后的博客里我会细讲),这次简单点提:前者若A区false,B区就不执行了,后者若A区false,B区仍然执行。
12、注重代码的可读性,如驼峰命名法等
结束语:
不瞒你说,这是笔者学习java写的第一个像样的demo,最终就打算把它以一篇博客的形式呈现给大家,我会不断学习,创造更优质的内容,谢谢大家!
若有不足之处,请多指正!