前言 這學期才開始接觸Java,之前只學了C語言,所以一開始寫題目的代碼的時候對Java的眾多函數和語法不是太熟悉,一開始就上手寫代碼有點不適應。 關於類: 1、類似C中的struct,構造函數、內置方法(函數 )都比較相似 2、儘量避免代碼的重覆,把private和public的方法搞清晰。 ...
前言
這學期才開始接觸Java,之前只學了C語言,所以一開始寫題目的代碼的時候對Java的眾多函數和語法不是太熟悉,一開始就上手寫代碼有點不適應。
關於類:
1、類似C中的struct,構造函數、內置方法(函數 )都比較相似
2、儘量避免代碼的重覆,把private和public的方法搞清晰。
3、把我們需要解決的問題進行拆分,拆得好就寫得快
三次題目集的知識點、題量、難度等情況
(對於重難點題目將會給出完整題目)
第一次作業:1、 身體質量指數(BMI)測算 2、NCHU_奇數求和 3、NCHU_房產稅費計算 4、游戲角色選擇 5、NCHU_學號識別 6、NCHU_巴比倫法求平方根近似值 7、二進位數值提取 8、判斷三角形類型 9、長度質量計量單位換算
第一次作業較為簡單,熟悉了java的一些基本操作,和一些簡單函數的運用。
第二次作業:1、成績計算-1-類、數組的基本運用
2、成績計算-2-關聯類
創建成績類,包含:
屬性:平時成績(int)、期末成績(int)
方法:計算總成績(計算規則:平時成績*0.4+期末成績*0.6,保留整數部分,小數部分直接丟棄)
創建學生類,包含:
屬性:學號(String)、姓名(String)、語文成績(成績類)、數學成績(成績類)、物理成績(成績類)
方法:計算總分、計算平均分
輸入3個學生的信息,將每個學生的信息封裝在一個學生對象中。
按輸入順序依次輸出3個學生的總分、平均分(精確到小數點後兩位,捨去部分按四捨五入規則計入最後一位)。
浮點數保留小數的相關知識可參考:https://blog.csdn.net/huaishuming/article/details/17752365
註意:未用學生類對象封裝數據的,本題計0分
輸入格式:
依次輸入3個學生的每門課成績,每個學生成績信息格式:
學號+英文空格+姓名+英文空格+課程名+英文空格+平時成績+英文空格+期末成績
註:3個學生的課程順序可能會不一致
例如:
22201311 張琳 語文 70 80
22201311 張琳 數學 85 89
22201311 張琳 物理 75 83
22201312 黃昊 語文 66 78
22201312 黃昊 數學 76 82
22201312 黃昊 物理 83 82
22201313 李少辰 語文 86 76
22201313 李少辰 數學 78 76
22201313 李少辰 物理 87 76
輸出格式:
3個學生信息,每個學生信息格式:
學號+英文空格+姓名+英文空格+總成績+英文空格+平均分
例如:
22201311 張琳 242 80.67
22201312 黃昊 234 78.00
22201313 李少辰 236 78.67
輸入樣例:
在這裡給出一組輸入。例如:
22201311 張琳 語文 70 80
22201311 張琳 數學 85 89
22201311 張琳 物理 75 83
22201312 黃昊 語文 66 78
22201312 黃昊 數學 76 82
22201312 黃昊 物理 83 82
22201313 李少辰 語文 86 76
22201313 李少辰 數學 78 76
22201313 李少辰 物理 87 76
輸出樣例:
在這裡給出相應的輸出。例如:
22201311 張琳 242 76.67 84.00 80.67
22201312 黃昊 234 75.00 80.67 78.00
22201313 李少辰 236 83.67 76.00 78.67
代碼長度限制16 KB
時間限制400 ms
記憶體限制64 MB
3、有重覆的數據 4、去掉重覆的數據 5、面向對象編程(封裝性) 6、GPS測繪中度分秒轉換
7、菜單計價程式-1
某飯店提供4種菜,每種菜品的基礎價格如下:
西紅柿炒蛋 15
清炒土豆絲 12
麻婆豆腐 12
油淋生菜 9
設計點菜計價程式,根據輸入的訂單,計算並輸出總價格。
訂單由一條或多條點菜記錄組成,每條記錄一行,最後以"end"結束
每條點菜記錄包含:菜名、份額兩個信息。
份額可選項包括:1、2、3,分別代表小、中、大份)
不同份額菜價的計算方法:
小份菜的價格=菜品的基礎價格。
中份菜的價格=菜品的基礎價格1.5。
小份菜的價格=菜品的基礎價格2。
如果計算出現小數,按四捨五入的規則進行處理。
參考以下類的模板進行設計:
菜品類:對應菜譜上一道菜的信息。
Dish {
String name;//菜品名稱
int unit_price; //單價
int getPrice(int portion)//計算菜品價格的方法,輸入參數是點菜的份額(輸入數據只能是1/2/3,代表小/中/大份)
}
菜譜類:對應菜譜,包含飯店提供的所有菜的信息。
Menu {
Dish[] dishs ;//菜品數組,保存所有菜品信息
Dish searthDish(String dishName)//根據菜名在菜譜中查找菜品信息,返回Dish對象。
}
點菜記錄類:保存訂單上的一道菜品記錄
Record {
Dish d;//菜品
int portion;//份額(1/2/3代表小/中/大份)
int getPrice()//計價,計算本條記錄的價格
}
訂單類:保存用戶點的所有菜的信息。
Order {
Record[] records;//保存訂單上每一道的記錄
int getTotalPrice()//計算訂單的總價
Record addARecord(String dishName,int portion)
//添加一條菜品信息到訂單中。
}
輸入格式:
每條點菜記錄的格式:
菜名+空格(英文)+份額
註:份額可輸入(1/2/3), 1代表小份,2代表中份,3代表大份。
最後一條記錄以“end”結束。
輸出格式:
訂單上所有菜品的總價(整數數值),每份菜
如果訂單中包含不能識別的菜名,則在總價之前輸出“** does not exist”,**是不能識別的菜名
輸入樣例:
在這裡給出一組輸入。例如:
麻婆豆腐 2
西紅柿炒蛋 3
End
輸出樣例:
在這裡給出相應的輸出。例如:
48
輸入樣例1:
訂單中包含不存在的菜品記錄。例如:
麻婆豆腐 2
炒脆肚 2
西紅柿炒蛋 3
End
輸出樣例1:
在這裡給出相應的輸出。例如:
炒脆肚 does not exist
48
代碼長度限制 16 KB
時間限制 400 ms
記憶體限制 64 MB
8、jmu-java-日期類的基本使用
第二次作業的第一、二題學生成績計算,七題菜單計價較為複雜,涉及到的類比較多。這三題的難度較大,一些結構的設計較為繁複。我個人認為第8題的日期計算的代碼調試比較困難,因為你必須去猜老師給的測試用例到底是怎麼算出來的(ps:老師給的測試用例的輸出其實是錯的,但是要過測試點的話,錯也要和老師提供的一樣QAQ
第三次作業:1、jmu-java-日期類的基本使用
2、課程成績統計程式-1
某高校課程從性質上分為:必修課、選修課,從考核方式上分為:考試、考察。
考試的總成績由平時成績、期末成績分別乘以權重值得出,比如平時成績權重0.3,期末成績權重0.7,總成績=平時成績*0.3+期末成績*0.7。
考察的總成績直接等於期末成績
必修課的考核方式必須為考試,選修課可以選擇考試、考察任一考核方式。
1、輸入:
包括課程、課程成績兩類信息。
課程信息包括:課程名稱、課程性質、考核方式(可選,如果性質是必修課,考核方式可以沒有)三個數據項。
課程信息格式:課程名稱+英文空格+課程性質+英文空格+考核方式
課程性質輸入項:必修、選修
考核方式輸入選項:考試、考察
課程成績信息包括:學號、姓名、課程名稱、平時成績(可選)、期末成績
課程信息格式:學號+英文空格+姓名+英文空格+課程名稱+英文空格+平時成績+英文空格+期末成績
以上信息的相關約束:
1)平時成績和期末成績的權重預設為0.3、0.7
2)成績是整數,不包含小數部分,成績的取值範圍是【0,100】
3)學號由8位數字組成
4)姓名不超過10個字元
5)課程名稱不超過10個字元
6)不特別輸入班級信息,班級號是學號的前6位。
2、輸出:
輸出包含三個部分,包括學生所有課程總成績的平均分、單門課程成績平均分、單門課程總成績平均分、班級所有課程總成績平均分。為避免誤差,平均分的計算方法為累加所有符合條件的單個成績,最後除以總數。
1)學生課程總成績平均分按學號由低到高排序輸出,格式:學號+英文空格+姓名+英文空格+總成績平均分
如果某個學生沒有任何成績信息,輸出:學號+英文空格+姓名+英文空格+"did not take any exams"
2)單門課程成績平均分分為三個分值:平時成績平均分(可選)、期末考試平均分、總成績平均分,按課程名稱的字元順序輸出,格式:課程名稱+英文空格+平時成績平均分+英文空格+期末考試平均分+英文空格+總成績平均分
如果某門課程沒有任何成績信息,輸出:課程名稱+英文空格+"has no grades yet"
3)班級所有課程總成績平均分按班級由低到高排序輸出,格式:班級號+英文空格+總成績平均分
如果某個班級沒有任何成績信息,輸出:班級名稱+英文空格+ "has no grades yet"
異常情況:
1)如果解析某個成績信息時,課程名稱不在已輸入的課程列表中,輸出:學號+英文空格+姓名+英文空格+":"+課程名稱+英文空格+"does not exist"
2)如果解析某個成績信息時,輸入的成績數量和課程的考核方式不匹配,輸出:學號+英文空格+姓名+英文空格+": access mode mismatch"
以上兩種情況如果同時出現,按第一種情況輸出結果。
3)如果解析某個課程信息時,輸入的課程性質和課程的考核方式不匹配,輸出:課程名稱+" : course type & access mode mismatch"
4)格式錯誤以及其他信息異常如成績超出範圍等,均按格式錯誤處理,輸出"wrong format"
5)若出現重覆的課程/成績信息,只保留第一個課程信息,忽略後面輸入的。
信息約束:
1) 成績平均分只取整數部分,小數部分丟棄
3、面向對象編程(封裝性) 4、判斷兩個日期的先後,計算間隔天數、周數
第三次作業第二題的難度較大,需要建立很多的類,各個類之間的關係也比較複雜,真的很難TAT,測試點還有很多沒過。
設計與分析與主要問題和其解決方法
(這裡只會提供重點題目的重點代碼)
第二次作業:題目一(成績計算-1-類、數組的基本運用):
1 public class Main { 2 public static void main(String[] args) { 3 Scanner sc = new Scanner(System.in); 4 Student stu[] = new Student[5]; 5 6 int i ; 7 //依次輸入5個學生的信息 8 for(i = 0; i < 5; i++){ 9 stu[i] = new Student(sc.next(), sc.next(),sc.nextFloat(),sc.nextFloat(),sc.nextFloat()); 10 float[] totoal = new float[5]; //總成績 11 float[] average = new float[5]; //平均成績 12 totoal[i] = stu[i].getChinese() + stu[i].getMath() + stu[i].getPhysic(); 13 average[i] = totoal[i]/3; 14 System.out.println(stu[i].getIdnum() + " " + stu[i].getName()+ " " + (int)totoal[i] + " " + String.format("%.2f",average[i])); 15 stu[i] = null; 16 } 17 } 18 }
這題主要要註意成績和平均成績不能存為int類型,不然會導致最後結果的四捨五入的結果不太精確,所以這裡我們直接選擇在最後輸出的時候才將總成績和平均成績轉化成int類型。
第二次作業:題目二(成績計算-2-關聯類):
1 class Student1 { 2 String idnum; 3 String name; 4 double chinese; 5 double math; 6 double physic; 7 double total; 8 double usual_average; 9 double final_average; 10 public Student1(String idnum, String name, double chinese, double math, double physic,double total,double usual_average,double final_average){ 11 this.idnum = idnum;//獲取學號 12 this.name = name;//獲取姓名 13 this.chinese = chinese;//獲取中文成績 14 this.math = math; //獲取數學成績 15 this.physic = physic; //獲取物理成績 16 this.total = total; //獲取平時成績的總分 17 this.usual_average = usual_average; 18 this.final_average = final_average; 19 } 20 } 21 22 class Student2{//學生成績 23 float usual; 24 float Final; 25 public Student2( float usual, float Final) { 26 this.usual = usual; 27 this.Final = Final; 28 } 29 } 30 31 public class Main { 32 public static void main(String[] args) { 33 Scanner sc = new Scanner(System.in); 34 Student1 stu[] = new Student1[3]; 35 36 //依次輸入3個學生的信息 37 for(int i = 0; i < 3; i++) {//學生 38 String student_idnum = ""; 39 String student_name = ""; 40 double chinese_grades = 0;//初始化語文成績 41 float chinese_usual = 0; 42 float chinese_final = 0; 43 double math_grades = 0;//初始化數學成績 44 float math_usual = 0; 45 float math_final = 0; 46 double physic_grades = 0;//初始化物理成績 47 float physic_usual = 0; 48 float physic_final = 0; 49 double total_grades ; 50 double usual_grades; //平時成績的平均分 51 double final_grades; //期末成績的平均分 52 53 for(int j = 0; j < 3; j ++) { 54 String str1 = sc.nextLine();//直接讀取一整行信息 55 //將讀取到的信息按一個英文空格進行分割成多個字元串,存在strs數組中,方便後續課程的匹配 56 String[] strs = str1.split(" "); 57 student_idnum = strs[0]; 58 student_name = strs[1]; 59 //判斷課程 60 if ("語文".equals(strs[2])) { 61 chinese_usual = Float.parseFloat(strs[3]); 62 chinese_final = Float.parseFloat(strs[4]); 63 Student2 Chinese = new Student2(chinese_usual, chinese_final); 64 chinese_grades = chinese_usual * 0.4 + chinese_final * 0.6; 65 } else if ("數學".equals(strs[2])) { 66 math_usual = Float.parseFloat(strs[3]); 67 math_final = Float.parseFloat(strs[4]); 68 Student2 Math = new Student2(math_usual, math_final); 69 math_grades = math_usual * 0.4 + math_final * 0.6; 70 } else if ("物理".equals(strs[2])) { 71 physic_usual = Float.parseFloat(strs[3]); 72 physic_final = Float.parseFloat(strs[4]); 73 Student2 Physic = new Student2(physic_usual, physic_final); 74 physic_grades = physic_usual * 0.4 + physic_final * 0.6; 75 } 76 } 77 total_grades = (int)chinese_grades + (int)math_grades + (int) physic_grades ; 78 usual_grades = (chinese_usual + math_usual + physic_usual)/3; 79 final_grades = (chinese_final + math_final + physic_final)/3; 80 stu[i] = new Student1(student_idnum,student_name,chinese_grades,math_grades,physic_grades,total_grades,usual_grades,final_grades); 81 } 82 for(Student1 student : stu){ 83 System.out.println(student.idnum + " " + student.name + " " + String.format("%.0f",student.total) + " " + String.format("%.2f",student.usual_average) + " " + String.format("%.2f",student.final_average) + " " + String.format("%.2f",student.total/3)); 84 } 85 } 86 }
這個題目需要註意:
- 使用合適的輸入方法:根據題目要求,在Java中可以使用
Scanner
類來讀取輸入。通過創建Scanner
對象,可以使用其提供的方法(如nextInt()
、nextLine()
等)逐行讀取輸入數據。這題的輸入格式我們讀取的話,最好選用讀取一整行,然後利用分割函數按照空格來分割,將對應的姓名、課程、學號分別進行判斷和處理會更加容易。
- 使用合適的輸入方法:根據題目要求,在Java中可以使用
-
確定輸入數據的格式:在讀取輸入之前,需要確定輸入數據的格式,以便正確地使用適當的方法讀取和處理數據。根據題目中給出的輸入格式,可以通過調用
Scanner
對象的相應方法來按格式逐行讀取輸入。 -
錯誤處理和異常情況:在讀取輸入數據時,可以考慮加入適當的錯誤處理和異常情況處理機制。例如,可以使用
try-catch
語句塊來捕獲輸入格式錯誤、類型轉換錯誤等可能發生的異常,並根據具體情況進行相應的處理和輸出錯誤提示。 -
迴圈讀取輸入數據:根據題目要求,需要依次輸入多個學生的成績信息。可以使用迴圈結構(如
for
迴圈或while
迴圈)來重覆讀取輸入,直到滿足停止輸入的條件(如輸入end
後停止)。 -
數據存儲和處理:將讀取的數據存儲在合適的數據結構中,如學生對象、成績對象等,以便後續的計算和處理。根據題目要求,可以設計學生類和成績類,並將讀取的數據封裝在對應的對象中。
第二次作業:題目七(菜單計價):
1 public class Main { 2 public static void main(String[] args) { 3 // 初始化菜譜 4 Dish dish1 = new Dish("西紅柿炒蛋", 15); 5 Dish dish2 = new Dish("清炒土豆絲", 12); 6 Dish dish3 = new Dish("麻婆豆腐", 12); 7 Dish dish4 = new Dish("油淋生菜", 9); 8 9 Menu menu = new Menu(); 10 menu.addDish(dish1); 11 menu.addDish(dish2); 12 menu.addDish(dish3); 13 menu.addDish(dish4); 14 15 // 輸入訂單信息 16 Scanner scanner = new Scanner(System.in); 17 Order order = new Order(); 18 19 String input = scanner.nextLine(); 20 while (!input.equals("end")) { 21 String[] parts = input.split(" "); 22 String dishName = parts[0]; 23 int portion = Integer.parseInt(parts[1]); 24 Dish dish = menu.searchDish(dishName); 25 if (dish == null) { 26 System.out.println(dishName + " does not exist"); 27 } else { 28 Record record = new Record(dish, portion); 29 order.addRecord(record); 30 } 31 input = scanner.nextLine(); 32 } 33 34 // 計算訂單總價並輸出 35 int totalPrice = order.getTotalPrice(); 36 System.out.println( totalPrice); 37 } 38 }
這個題目需要註意的點:
-
輸入數據的合法性驗證:確保輸入的菜名和份額符合要求,菜名必須在菜譜中存在,份額必須是1、2、3中的一個。如果輸入的菜名無法識別或者份額不合法,需要進行相應的錯誤處理。
-
價格計算的精確性和規則:根據輸入的菜名和份額,使用菜譜中對應菜品的基礎價格以及份額規則計算菜品的價格。小份菜的價格等於基礎價格,中份菜的價格為基礎價格乘以1.5,大份菜的價格為基礎價格乘以2。對於計算結果可能存在的小數部分,需要按照四捨五入的規則進行處理,最後輸出整數結果。
-
訂單的數據存儲和計算:使用訂單類來保存用戶點的所有菜的信息,每一條記錄包括菜品和份額。訂單類需要提供方法來添加一條菜品記錄和計算訂單的總價。在添加記錄時,需要根據菜名查找對應的菜品信息,如果菜名無法識別,需要進行相應的錯誤處理。
-
輸出結果的格式:輸出訂單的總價,以及每份菜的價格。總價為整數結果,每份菜的價格也為整數。如果訂單中包含不能識別的菜名,需要在輸出總價之前輸出對應的錯誤提示。
-
異常情況的處理:在處理輸入數據和計算過程中,可能會遇到異常情況,比如輸入錯誤、菜名無法識別等。需要進行適當的錯誤處理,包括錯誤提示和相關輸出。
第三次作業:題目二(課程成績統計程式-1):
這個題的測試點——單門考試課程 單個學生、考核數據與考核方式不匹配、多門課程,單個學生,含錯誤信息、單個班級,多個學生,多門課程、多個班級,多門課程,多個學生 均未通過,我在題目截至之後又調試了下代碼,發現多對多、多對單、單對多方面均有一些問題
1 //選課 2 class choose{ 3 scores score; 4 Stu student; 5 lessons lesson; 6 } 7 //課程 8 class lessons{ 9 String lesson_name; 10 String course;//必修或選修 11 String option;//考察方式 12 public void setLesson_name(String lesson_name){ 13 this.lesson_name = lesson_name; 14 } 15 public String getLesson_name(){ 16 return lesson_name; 17 } 18 public void setCourse(String course){ 19 this.course = course; 20 } 21 public String getCourse(){ 22 return course; 23 } 24 public void setOption(String option){ 25 this.option = option; 26 } 27 public String getOption(){ 28 return option; 29 } 30 lessons(String lesson_name , String course , String option){ 31 setLesson_name(lesson_name); 32 setCourse(course); 33 setOption(option); 34 } 35 } 36 //學生 37 class Stu{ 38 String idnum; 39 String name; 40 public void setIdnum(String idnum){ 41 this.idnum = idnum; 42 } 43 public String getIdnum(){ 44 return idnum; 45 } 46 public void setName(String name){ 47 this.name = name; 48 } 49 public String getName(){ 50 return name; 51 } 52 Stu(String idnum,String name){ 53 setIdnum(idnum); 54 setName(name); 55 } 56 } 57 //班級 58 class Classes{ 59 Stu student; 60 String class_num; 61 HashMap<String,Stu> Stus; 62 Classes(String class_num){ 63 setClassNum(class_num); 64 } 65 public void setClassNum(String class_num) { 66 this.class_num = class_num; 67 } 68 public String getClassNum() { 69 return class_num; 70 } 71 public void addStudent(Stu student) { 72 Stus.put(student.getIdnum() , student); 73 } 74 } 75 //成績 76 abstract class scores{ 77 int All_score; 78 abstract void getAll_score(); 79 } 80 //考試成績 81 class exam_score extends scores{ 82 int usual_score; 83 int final_score; 84 exam_score(int usual_score , int final_score){ 85 setUsual_score(usual_score); 86 setFinal_score(final_score); 87 } 88 public void setUsual_score(int usual_score) { 89 this.usual_score = usual_score; 90 } 91 public int getUsual_score() { 92 return usual_score; 93 } 94 public void setFinal_score(int final_score) { 95 this.final_score = final_score; 96 } 97 public int getFinal_score() { 98 return final_score; 99 } 100 @Override 101 void getAll_score() { 102 All_score = (int) (usual_score*0.3+final_score*0.7); 103 } 104 } 105 //考察成績 106 class inspect_score extends scores{ 107 int finalGrade; 108 inspect_score(int finalGrade) { 109 setFinalGrade(finalGrade); 110 } 111 public void setFinalGrade(int finalGrade) { 112 this.finalGrade = finalGrade; 113 } 114 public int getFinalGrade() { 115 return finalGrade; 116 } 117 @Override 118 void getAll_score() { 119 All_score = finalGrade; 120 } 121 } 122 /**********此處省略輸入、輸出類**********/308 309 public class Main { 310 //throws IOException表示該方法可能會拋出IOException異常,需要通過異常處理機制進行處理 311 public static void main(String[] args) throws IOException{ 312 //InputStreamReader(System.in)用於將位元組流轉換為字元流,這樣我們可以按字元的方式來讀取用戶輸入。 313 //BufferedReader則是一個字元緩衝流,它提供了更高效的讀取文本的方法,其中readLine()方法可以讀取一行用戶輸入。 314 BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 315 input inputs = new input(); 316 inputs.outputs = new output(); 317 String strs; 318 319 while ((strs = in.readLine()) != null){ 320 if(strs.equals("end")) break;