前言:
本文是java基礎(chǔ)語(yǔ)法完結(jié)項(xiàng)目篇-學(xué)生管理系統(tǒng)
本節(jié)內(nèi)容:
1:學(xué)生系統(tǒng)需求及分析
2:重點(diǎn)代碼分析
3:完整代碼
4:本節(jié)總結(jié)&下節(jié)預(yù)告
本文出處:《凱哥陪你學(xué)系列之java基礎(chǔ)篇.Java基本語(yǔ)法篇》中第37篇基礎(chǔ)語(yǔ)法完結(jié)小項(xiàng)目練習(xí)-學(xué)生管理系統(tǒng) 基礎(chǔ)版
歡迎訪問(wèn)凱哥個(gè)人博客:www.kaigejava.com
歡迎關(guān)注凱哥公眾號(hào):凱哥Java
一:學(xué)生系統(tǒng)需求及分析
需求:
假設(shè)有三個(gè)班級(jí),每個(gè)班級(jí)中有三個(gè)學(xué)生,每個(gè)學(xué)生學(xué)科分別為語(yǔ)文、數(shù)學(xué)、英語(yǔ)且有對(duì)應(yīng)的分?jǐn)?shù)
現(xiàn)根據(jù)用戶(hù)輸入的班級(jí)以及選擇的學(xué)生姓名查詢(xún)對(duì)應(yīng)的學(xué)生各科成績(jī)、三科成績(jī)總分以及平均分?jǐn)?shù)。
思考:
根據(jù)需求我們可以分出如下
1.1:用什么存儲(chǔ)數(shù)據(jù)呢?
1.2:每個(gè)班級(jí)中有三個(gè)學(xué)生,每個(gè)學(xué)生有三個(gè)學(xué)科且有對(duì)應(yīng)的分?jǐn)?shù),這個(gè)又怎么存儲(chǔ)怎么表示呢?
1.3:怎么根據(jù)用戶(hù)輸入的進(jìn)行相應(yīng)的查詢(xún)呢?
1.4:怎么處理總分和平均分?jǐn)?shù)呢?
分析:
1.1:我們已經(jīng)學(xué)習(xí)掌握的知識(shí)中的能夠用于存放東西的是數(shù)組。所以這里需要考慮到使用數(shù)組來(lái)存儲(chǔ)
1.2:每個(gè)班級(jí)有三個(gè)學(xué)生,每個(gè)學(xué)生又有三個(gè)學(xué)科且三個(gè)學(xué)科都有對(duì)應(yīng)的分?jǐn)?shù)。這個(gè)怎么表示呢? 同樣使用數(shù)組來(lái)表示,那么數(shù)組我們已經(jīng)學(xué)過(guò)一維數(shù)組、二維數(shù)組。應(yīng)該選擇那個(gè)數(shù)組呢?
接著分析:
三個(gè)學(xué)生,三個(gè)學(xué)科而且學(xué)科有分?jǐn)?shù)(假設(shè)都是整數(shù)的)。我們可以把每個(gè)學(xué)生的成績(jī)(三個(gè)學(xué)科的得分)看作一個(gè)一維數(shù)組,成績(jī)是整數(shù)類(lèi)型的 所以可以得到一個(gè)學(xué)生的三科成績(jī)數(shù)組 int [] arrscore = new int[3];
一個(gè)班級(jí)有三個(gè)學(xué)生,所以同樣,學(xué)生可以用一維數(shù)組存放。因?yàn)閷W(xué)生姓名是String類(lèi)型的。所以,我們可以得到學(xué)生數(shù)組 String[] studentArr = new String[3];
那么問(wèn)題又來(lái)看,怎么把學(xué)生信息和各學(xué)科成績(jī)關(guān)聯(lián)在一起呢?
我們可以,用一個(gè)二位數(shù)組來(lái)進(jìn)行管理,二維數(shù)組中[m]對(duì)應(yīng)學(xué)生數(shù)組中每個(gè)學(xué)生對(duì)應(yīng)的index,而二維數(shù)組中的[n]用來(lái)存放每個(gè)學(xué)科對(duì)應(yīng)的分?jǐn)?shù)。所以我們可以得到學(xué)生,成績(jī)關(guān)聯(lián)的數(shù)組
因?yàn)?學(xué)生index是int類(lèi)型的。成績(jī)也是int類(lèi)型的。所以二維數(shù)組就是int類(lèi)型的。
int [] [] ?studentScore = new int [3][3];
1.3:怎么獲取到用戶(hù)輸入呢?可以使用scanner 函數(shù)。怎么根據(jù)用戶(hù)輸入的進(jìn)行相應(yīng)的查詢(xún)呢?這里就使用到if判斷語(yǔ)句了。
1.4:總分就是獲取到每個(gè)學(xué)科的成績(jī)進(jìn)行累加,平均分?jǐn)?shù),就是總分/學(xué)科數(shù)就是平均分呢。
二:重點(diǎn)代碼分析
1:用于存放每個(gè)班級(jí)的學(xué)生信息的:

2:用于存放學(xué)生和各科成績(jī)的二維數(shù)組:

3:提示用戶(hù)輸入的:

4:獲取指定學(xué)生的每個(gè)學(xué)科分?jǐn)?shù)并求總分和平均分?jǐn)?shù)

5:根據(jù)用戶(hù)輸入的進(jìn)行查詢(xún)

6:本代碼對(duì)于的java類(lèi)名為:

三:完整代碼
public class StudentSystem {
public static void main(String[] args) {
/**
* 數(shù)據(jù)準(zhǔn)備:
* 1:定義班級(jí) 每個(gè)班有三個(gè)學(xué)生,每個(gè)學(xué)生的學(xué)科順序:語(yǔ)文、數(shù)學(xué)、英語(yǔ)
* 提示:可以考慮二維數(shù)組
* 2:定義每個(gè)班的學(xué)生。
* 提示:可以考慮一位數(shù)組
*
*
*/
//定義三個(gè)班級(jí),三個(gè)學(xué)生中每個(gè)學(xué)生的每個(gè)學(xué)科成績(jī)
//定義一班學(xué)生和各科成績(jī)的二維數(shù)組
int [][] oneClass = new int [3][3];
oneClass[0]= new int[] {90,80,66};
oneClass[1]= new int[] {88,100,99};
oneClass[2]= new int[] {98,100,52};
//定義二班學(xué)生和各科成績(jī)的二維數(shù)組
int [][] twoClass = new int [3][3];
twoClass[0]= new int[] {60,60,66};
twoClass[1]= new int[] {88,80,99};
twoClass[2]= new int[] {55,100,68};
//定義三一班學(xué)生和各科成績(jī)的二維數(shù)組
int [][] threeClass = new int [3][3];
threeClass[0]= new int[] {90,78,88};
threeClass[1]= new int[] {88,63,59};
threeClass[2]= new int[] {98,100,95};
//定義每個(gè)班中的三個(gè)學(xué)生
//定義一班每個(gè)學(xué)生姓名
String[] oneClassStudents = new String [] {"張三","李四","王五"};
//定義二班每個(gè)學(xué)生姓名
String[] twoClassStudents = new String [] {"周杰倫","中紅衣","四小龍"};
//定義三班每個(gè)學(xué)生姓名
String[] threeClassStudents = new String [] {"張三豐","張無(wú)忌","周芷若"};
System.out.println("請(qǐng)選擇班級(jí) 1:一班 2:二班 3:三班 ");
Scanner sc = new Scanner(System.in);//獲取鍵盤(pán)錄入的數(shù)據(jù)。獲取用戶(hù)選擇的班級(jí)
int classIndex = sc.nextInt();
if(1==classIndex){//選擇了一班
System.out.println("您好,您已經(jīng)選擇了一班");
//提示信息。注意不是println而是print這樣就不換號(hào)了
System.err.print("請(qǐng)輸入學(xué)生姓名序號(hào):");
//循環(huán)對(duì)應(yīng)班級(jí)的學(xué)生姓名
for (int i = 0; i < oneClassStudents.length; i++) {
int no = i+1;//因?yàn)閿?shù)組中下標(biāo)是從0開(kāi)始的,而現(xiàn)實(shí)中我們一般是從1開(kāi)始的。所以要+1
if(i==oneClassStudents.length-1){//進(jìn)行判斷。如果是班級(jí)中最后一個(gè)學(xué)生的時(shí)候進(jìn)行換行。這里使用的是println
System.err.println(no+":"+oneClassStudents[i]);
}else{//當(dāng)不是最后一個(gè)時(shí)候,就不用換行了。
System.err.print(no+":"+oneClassStudents[i] +" ");
}
}
//以上for循環(huán)完成之后,輸出的:請(qǐng)輸入學(xué)生姓名序號(hào):1:張三豐 2:張無(wú)忌 3:周芷若
Scanner scanner = new Scanner(System.in);//獲取鍵盤(pán)錄入的數(shù)據(jù)。獲取用戶(hù)選擇的學(xué)生
int studentIndex = scanner.nextInt();
studentIndex-=1;//因?yàn)楝F(xiàn)實(shí)是從1開(kāi)始的,而數(shù)組是從0開(kāi)始的。所以需要-1
//獲取學(xué)生姓名
String StudentName=oneClassStudents[studentIndex];
//獲取學(xué)生對(duì)應(yīng)的各科成績(jī)
int [] studentScore =oneClass[studentIndex];
//通過(guò)自定義方法獲取學(xué)生每個(gè)學(xué)科的信息以及總分、平均分
String detailMsg = getStudentDetail(studentScore);
System.out.println("學(xué)生姓名:"+StudentName +"。您本次考試信息詳情如下:"+detailMsg);
}else if(2==classIndex){//選擇了二班
//選擇了二班
System.out.println("您好,您已經(jīng)選擇了二班");
System.err.print("請(qǐng)輸入學(xué)生姓名序號(hào):");
for (int i = 0; i < twoClassStudents.length; i++) {
int no = i+1;
if(i==twoClassStudents.length-1){
System.err.println(no+":"+twoClassStudents[i]);
}else{
System.err.print(no+":"+twoClassStudents[i] +" ");
}
}
Scanner scanner = new Scanner(System.in);//獲取鍵盤(pán)錄入的數(shù)據(jù)
int studentIndex = scanner.nextInt();
studentIndex-=1;//
String StudentName=twoClassStudents[studentIndex];
int [] studentScore =twoClass[studentIndex];
//通過(guò)自定義方法獲取學(xué)生每個(gè)學(xué)科的信息以及總分、平均分
String detailMsg = getStudentDetail(studentScore);
System.out.println("學(xué)生姓名:"+StudentName +"。您本次考試信息詳情如下:"+detailMsg);
}else{//選擇了三班
//選擇了三班
System.out.println("您好,您已經(jīng)選擇了三班");
System.err.print("請(qǐng)輸入學(xué)生姓名序號(hào):");
for (int i = 0; i < threeClassStudents.length; i++) {
int no = i+1;
if(i==threeClassStudents.length-1){
System.err.println(no+":"+threeClassStudents[i]);
}else{
System.err.print(no+":"+threeClassStudents[i] +" ");
}
}
Scanner scanner = new Scanner(System.in);//獲取鍵盤(pán)錄入的數(shù)據(jù)
int studentIndex = scanner.nextInt();
studentIndex-=1;//
String StudentName=threeClassStudents[studentIndex];
int [] studentScore =threeClass[studentIndex];
//通過(guò)自定義方法獲取學(xué)生每個(gè)學(xué)科的信息以及總分、平均分
String detailMsg = getStudentDetail(studentScore);
System.out.println("學(xué)生姓名:"+StudentName +"。您本次考試信息詳情如下:"+detailMsg);
}
}
/**
* 通過(guò)自定義方法獲取學(xué)生每個(gè)學(xué)科的信息以及總分、平均分
* @param studentScore如參:學(xué)生信息
* @return str學(xué)生每個(gè)學(xué)科的信息以及總分、平均分
*/
public static String getStudentDetail(int[] studentScore) {
int ChineseScore =0;//定義用于存放語(yǔ)文分?jǐn)?shù)的
int MethScore=0;//數(shù)學(xué)分?jǐn)?shù)
int EnglishScore=0;//英語(yǔ)分?jǐn)?shù)
int totalScore = 0;//總分
double avgScore = 0.0;//平均分?jǐn)?shù)
for (int i = 0; i < studentScore.length; i++) {
if(0==i){//語(yǔ)文分?jǐn)?shù)
ChineseScore = studentScore[i];
}else if(1==i){//數(shù)學(xué)分?jǐn)?shù)
MethScore = studentScore[i];
}else{//英語(yǔ)分?jǐn)?shù)
EnglishScore = studentScore[i];
}
}
totalScore = ChineseScore+MethScore+EnglishScore;
avgScore = totalScore/studentScore.length;
return "語(yǔ)文得分:"+ChineseScore+" 數(shù)學(xué)得分:"+MethScore+" 英語(yǔ)得分:"+EnglishScore +" 總分為:"+totalScore +" 平均分為:" +avgScore;
}
}
代碼運(yùn)行結(jié)果:


四:本節(jié)總結(jié)&下節(jié)預(yù)告
通過(guò)本項(xiàng)目我們需要掌握的:
1:根據(jù)需求,分析出我們需要的信息(這個(gè)需要慢慢培養(yǎng))
2:根據(jù)需求分析出信息后,需要知道該使用什么技術(shù)來(lái)實(shí)現(xiàn)(這個(gè)需要慢慢培養(yǎng))
以上兩點(diǎn)都扯淡。因?yàn)橄入A段咱們剛開(kāi)始學(xué),所以不著急。慢慢來(lái)
以下才是重點(diǎn)呢。
3:一維數(shù)組、二維數(shù)組的使用及獲取數(shù)組中數(shù)據(jù)
4:for循環(huán)使用使用
5:if...else if...else的使用
6:自定義方法的使用
7:用戶(hù)用戶(hù)鍵盤(pán)錄入int類(lèi)型的數(shù)據(jù)。
下節(jié)預(yù)告:
1:思考,上面的這些代碼,還可不可以在簡(jiǎn)單一些??
2:上面的代碼運(yùn)行一次就完了。怎么根據(jù)用戶(hù)輸入的,進(jìn)行結(jié)束。
歡迎學(xué)習(xí)下一篇《從零學(xué)java筆錄-第38篇基礎(chǔ)語(yǔ)法完結(jié)小項(xiàng)目練習(xí)-學(xué)生管理系統(tǒng)升級(jí)版》