(1)前言:總結三次題目集的知識點、題量、難度等情況 第一次的作業基本就是熟悉一下java基本的語法,這部分Java就算需要自學也並不算難,並且本身就有了一些c語言的基礎,作業的問題主要是我們對於輸入輸出和判斷迴圈語句的使用,總體的難度很低。第二次的作業就是類的使用以及私有化和相關封裝。第三次是是除 ...
(1)前言:總結三次題目集的知識點、題量、難度等情況
第一次的作業基本就是熟悉一下java基本的語法,這部分Java就算需要自學也並不算難,並且本身就有了一些c語言的基礎,作業的問題主要是我們對於輸入輸出和判斷迴圈語句的使用,總體的難度很低。第二次的作業就是類的使用以及私有化和相關封裝。第三次是是除了第二題都還算簡單,瞭解LocalDate類中of()、isAfter()或者isBefore()等方法的使用規則基本就能寫,第二題是目前所有題目中最難的,邏輯相對複雜,包含許多知識點,
(2)設計與分析:
2.1第一次作業 判斷三角形類型 輸入三角形三條邊,判斷該三角形為什麼類型的三角形。輸入格式:
在一行中輸入三角形的三條邊的值(實型數),可以用一個或多個空格或回車分隔,其中三條邊的取值範圍均為[1,200]。
輸出格式:
(1)如果輸入數據非法,則輸出“Wrong Format”;
(2)如果輸入數據合法,但三條邊不能構成三角形,則輸出“Not a triangle”;
(3)如果輸入數據合法且能夠成等邊三角形,則輸出“Equilateral triangle”;
(3)如果輸入數據合法且能夠成等腰直角三角形,則輸出“Isosceles right-angled triangle”;
(5)如果輸入數據合法且能夠成等腰三角形,則輸出“Isosceles triangle”;
(6)如果輸入數據合法且能夠成直角三角形,則輸出“Right-angled triangle”;
(7)如果輸入數據合法且能夠成一般三角形,則輸出“General triangle”。
踩坑心得
本題還是比較簡單的,遇到問題主要是無法判斷直角三角形,因為未考慮到精度問題,這裡由於double類型的數在平方後精度丟失,輸入的數據不一定為整數,程式是先四捨五入再進行勾股定理的,導致結果會有誤差判斷不相等無法判斷三角形是否為直角。
把代碼從直接用 == 判斷改為用減法和誤差進行判斷,允許部分誤差。
這題圈複雜度直接拉滿達到驚人的28,就算代碼很短現在的我去看一下也要梳理一下才能看懂,直接使用 if 堆起來還是不建議(雖然寫起來好理解),算是理解了為什麼要求圈複雜度要低了qwq。
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner data = new Scanner(System.in); Float side1, side2, side3; side1 = data.nextFloat(); side2 = data.nextFloat(); side3 = data.nextFloat(); if(1 <= side1 && side1 <= 200 && 1 <= side2 && side2 <= 200 && 1 <= side3 && side3 <= 200){ if(side1 + side2 > side3 && side1 + side3 > side2 && side3 + side2 > side1 && side1 - side2 < side3 && side1 - side3 < side2 && side3 - side2 < side1){ if(side1.equals(side2) || side3.equals(side2) || side1.equals(side3)) { if(side1.equals(side2) && side1.equals(side3)) System.out.println("Equilateral triangle"); else if(side1 * side1 + side2 * side2 - side3 * side3 <= 0.000001) System.out.println("Isosceles right-angled triangle"); else if(side1 * side1 + side3 * side3 - side2 * side2<= 0.000001) System.out.println("Isosceles right-angled triangle"); else if(side2 * side2 + side3 * side3 - side1 * side1<= 0.000001) System.out.println("Isosceles right-angled triangle"); else System.out.println("Isosceles triangle"); } else if(side1 * side1 + side2 * side2 == side3 * side3 ) System.out.println("Right-angled triangle"); else if(side1 * side1 + side3 * side3 == side2 * side2) System.out.println("Right-angled triangle"); else if(side2 * side2 + side3 * side3 == side1 * side1) System.out.println("Right-angled triangle"); else System.out.println("General triangle"); } else System.out.println("Not a triangle"); } else System.out.println("Wrong Format"); } }
2.2.第二次作業1
成績計算-1-類、數組的基本運用
創建學生類,包含屬性:學號(String)、姓名(String)、語文成績(int)、數學成績(int)、物理成績(int)
方法:計算總分、計算平均分
輸入5個學生的信息,將每個學生的信息封裝在一個學生對象中。
按輸入順序依次輸出5個學生的總分、平均分(精確到小數點後兩位,捨去部分按四捨五入規則計入最後一位)。
建一個類直接用就可以了,當時剛好學了一些私有,就用上了。
源碼
import java.util.Scanner; class Student{ private String ID; private String Name; private int MathScore; private int ChineseScore; private int PhysicsScore; public Student(String ID,String Name,int MathScore,int ChineseScore,int PhysicsScore){ this.Name = Name; this.ID = ID; this.MathScore = MathScore; this.ChineseScore = ChineseScore; this.PhysicsScore = PhysicsScore; } public String getName() { return Name; } public void setName(String name) { this.Name = name; } public String getID() { return ID; } public void setID(String ID) { this.ID = ID; } public int getMathScore() { return MathScore; } public void setMathScore(int mathScore) { this.MathScore = mathScore; } public int getChineseScore() { return ChineseScore; } public void setChineseScore(int chineseScore) { this.ChineseScore = chineseScore; } public int getPhysicsScore() { return PhysicsScore; } public void setPhysicsScore(int physicsScore) { this.PhysicsScore = physicsScore; } public static double AVerage(int MathScore,int ChineseScore, int PhysicsScore){ double AVerage = (MathScore + ChineseScore + PhysicsScore)*1.00 / 3; return AVerage; } public static int ALL(int MathScore,int ChineseScore, int PhysicsScore){ return MathScore + ChineseScore + PhysicsScore; } } public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); Student[] STU = new Student[5]; for (int i = 0; i < 5; i++) { String ID = in.next(); String name = in.next(); int MScore = in.nextInt(); int CScore = in.nextInt(); int PSsore = in.nextInt(); STU[i] = new Student(ID,name,MScore,CScore,PSsore); } for (int j = 0; j < 5; j++) { int all = STU[j].ALL(STU[j].getMathScore(),STU[j].getChineseScore(),STU[j].getPhysicsScore()); double average = STU[j].AVerage(STU[j].getMathScore(),STU[j].getChineseScore(),STU[j].getPhysicsScore()); if(j < 4) System.out.println(STU[j].getID() + " "+STU[j].getName() + " " + all + " " + String.format("%.2f",average )); else System.out.print(STU[j].getID() + " "+STU[j].getName() + " " + all + " " + String.format("%.2f", average)); } } }
2.3第二次作業2 成績計算-2-關聯類 創建成績類,包含:
屬性:平時成績(int)、期末成績(int)
方法:計算總成績(計算規則:平時成績*0.4+期末成績*0.6,保留整數部分,小數部分直接丟棄)
創建學生類,包含:
屬性:學號(String)、姓名(String)、語文成績(成績類)、數學成績(成績類)、物理成績(成績類)
方法:計算總分、計算平均分
輸入3個學生的信息,將每個學生的信息封裝在一個學生對象中。
按輸入順序依次輸出3個學生的總分、平均分(精確到小數點後兩位,捨去部分按四捨五入規則計入最後一位)。
這題是做為上一題的升級版,增加了成績類,題目之中只要求輸出總成績和平均成績,但測試用例和最後的提交都表明瞭還需要輸出平時成績和考試成績才是正確答案。
(偷了個懶直接未判斷成績是哪一個科目的,直接給我滿分過了 ?o? 要寫加個字元判斷應該也不難)
import java.util.Scanner; class Scores{ private int UsualGrades; private int FinalGrades; public Scores(int UsualGrades,int FinalGrades){ this.UsualGrades = UsualGrades; this.FinalGrades = FinalGrades; } public int getUsualGrades() { return UsualGrades; } public void setUsualGrades(int usualGrades) { UsualGrades = usualGrades; } public int getFinalGrades() { return FinalGrades; } public void setFinalGrades(int finalGrades) { FinalGrades = finalGrades; } public int AllGrades(int UsualGrades,int FinalGrades){ double Allgrades = UsualGrades * 0.4 + FinalGrades * 0.6; return (int)Allgrades; } } class Student{ private String ID; private String Name; private Scores MathScore; private Scores ChineseScore; private Scores PhysicsScore; public Student(String ID,String Name,Scores MathScore,Scores ChineseScore,Scores PhysicsScore){ this.Name = Name; this.ID = ID; this.MathScore = MathScore; this.ChineseScore = ChineseScore; this.PhysicsScore = PhysicsScore; } public void setMathScore(Scores mathScore) { MathScore = mathScore; } public void setChineseScore(Scores chineseScore) { ChineseScore = chineseScore; } public void setPhysicsScore(Scores physicsScore) { PhysicsScore = physicsScore; } public String getName() { return Name; } public void setName(String name) { this.Name = name; } public String getID() { return ID; } public void setID(String ID) { this.ID = ID; } public Scores getMathScore() { return MathScore; } public Scores getChineseScore() { return ChineseScore; } public Scores getPhysicsScore() { return PhysicsScore; } public static double AVerageAll(Scores MathScore, Scores ChineseScore, Scores PhysicsScore){ double AVerage = (ChineseScore.AllGrades(ChineseScore.getUsualGrades(), ChineseScore.getFinalGrades()) + MathScore.AllGrades(MathScore.getUsualGrades(), MathScore.getFinalGrades()) + PhysicsScore.AllGrades(PhysicsScore.getUsualGrades(), PhysicsScore.getFinalGrades()))*1.00 / 3; return AVerage; } public static double AVerageusual(Scores MathScore, Scores ChineseScore, Scores PhysicsScore){ double AVerage = (ChineseScore.getUsualGrades() + MathScore.getUsualGrades() + PhysicsScore.getUsualGrades())*1.00 / 3; return AVerage; } public static double AVeragefinal(Scores MathScore, Scores ChineseScore, Scores PhysicsScore){ double AVerage = (ChineseScore.getFinalGrades() + MathScore.getFinalGrades() + PhysicsScore.getFinalGrades())*1.00 / 3; return AVerage; } public static int ALL(Scores MathScore,Scores ChineseScore, Scores PhysicsScore){ return (ChineseScore.AllGrades(ChineseScore.getUsualGrades(), ChineseScore.getFinalGrades()) + MathScore.AllGrades(MathScore.getUsualGrades(), MathScore.getFinalGrades()) + PhysicsScore.AllGrades(PhysicsScore.getUsualGrades(), PhysicsScore.getFinalGrades())); } } public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); Student[] STU = new Student[3]; for (int i = 0; i < 3; i++) { String ID = in.next(); String name = in.next(); String subject = in.next(); Scores MScore = new Scores(in.nextInt(),in.nextInt()); String ID1 = in.next(); String name1 = in.next(); String subject1 = in.next(); Scores CScore = new Scores(in.nextInt(),in.nextInt()); String ID2 = in.next(); String name2 = in.next(); String subject2 = in.next(); Scores PSsore = new Scores(in.nextInt(),in.nextInt()); STU[i] = new Student(ID,name,MScore,CScore,PSsore); } for (int j = 0; j < 3; j++) { int all = STU[j].ALL(STU[j].getMathScore(),STU[j].getChineseScore(),STU[j].getPhysicsScore()); double averageall = STU[j].AVerageAll(STU[j].getMathScore(),STU[j].getChineseScore(),STU[j].getPhysicsScore()); double averageusual = STU[j].AVerageusual(STU[j].getMathScore(),STU[j].getChineseScore(),STU[j].getPhysicsScore()); double averagefinal = STU[j].AVeragefinal(STU[j].getMathScore(),STU[j].getChineseScore(),STU[j].getPhysicsScore()); if(j < 2) System.out.println(STU[j].getID() + " "+STU[j].getName() + " " + all + " "+ String.format("%.2f",averageusual ) + " " +String.format("%.2f",averagefinal ) + " " +String.format("%.2f",averageall )); else System.out.print(STU[j].getID() + " "+STU[j].getName() + " " + all + " " + String.format("%.2f",averageusual )+ " " +String.format("%.2f",averagefinal )+ " " +String.format("%.2f", averageall)); } } }
2.4第二次作業3 菜單計價程式-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”,**是不能識別的菜名
菜單計價程式題目的先鋒,把各個類已經告訴了要什麼內容,主要是理清楚各個類之間的關係,主函數用while持續接收,檢測到end就停止,字元串判斷本來用if條件寫了一大堆,結果效果並不好,直接是結果有誤,之後去找了一些資料寫的,像Scanner類中nextLine()等方法、String類中split()等方法、Integer類中parseInt()等其他類中的一些方法的使用經常在字元判斷中使用,調用之後也是簡潔了不少。
import java.util.*; class Dish { String name; int unit_price; Dish(StrA class Menu { Dish[] dishes = new Dish[4]; Menu() { dishes[0] = new Dish("西紅柿炒蛋", 15); dishes[1] = new Dish("清炒土豆絲", 12); dishes[2] = new Dish("麻婆豆腐", 12); dishes[3] = new Dish("油淋生菜", 9); } Dish searchDish(String dishName) { for (Dish dish : dishes) { if (dish.name.equals(dishName)) { return dish; } } return null; } } class Record { Dish d; int portion; Record(Dish d, int portion) { this.d = d; this.portion = portion; } int getPrice() { return d.getPrice(portion); } } class Order { Record[] records = new Record[20]; Menu menu; int count = 0; Order(Menu menu) { this.menu = menu; } void addARecord(String dishName, int portion) { Dish dish = menu.searchDish(dishName); if (dish != null) { records[count++] = new Record(dish, portion); } else { System.out.println(dishName + " does not exist"); } } int getTotalPrice() { int total = 0; for (int i = 0; i < count; i++) { total += records[i].getPrice(); } return total; } } public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); Order order = new Order(new Menu()); while (true) { String line = in.nextLine(); if (line.equals("end")) break; String[] parts = line.split(" "); String dishName = parts[0]; int portion = Integer.parseInt(parts[1]); order.addARecord(dishName, portion); } System.out.println(order.getTotalPrice()); } }
2.5第三次作業1 課程成績統計程式-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)成績平均分只取整數部分,小數部分丟棄
本題由於一些未知原因只能實現部分功能,這題比較複雜,需要理清清楚各個類之間的邏輯關係,
通過各個類實現對訂單總價得計算,將點菜記錄類和菜譜類設計為數組集合類型,更方便對裡面的數據進行處理。
import java.util.Scanner; import java.util.HashMap; import java.util.ArrayList; import java.util.Collections; class Course { String name; String type; String mode; double weight; public Course(String name, String type, String mode) { this.name = name; this.type = type; this.mode = mode; if (mode.equals("考試")) { this.weight = 0.3; } else { this.weight = 0; } } } class Student { // 定義學生的屬性 String id; // 學號 String name; // 姓名 HashMap<String, Integer> grades; // 成績表 public Student(String id, String name) { this.id = id; this.name = name; this.grades = new HashMap<String, Integer>(); } public int getAverage(HashMap<String, Course> courses) { int sum = 0; // 總成績和 int count = 0; // 總課程數 for (String courseName : grades.keySet()) { if (courses.containsKey(courseName)) { Course course = courses.get(courseName); int grade = grades.get(courseName); sum += grade * (1 - course.weight); // 加上期末成績部分 if (course.mode.equals("考試")) { sum += grade * course.weight; // 加上平時成績部分 } count++; } } if (count == 0) { // 如果沒有任何課程,返回-1表示無效值 return -1; } else { // 否則,返回總成績平均分(只取整數部分) return sum / count; } } } class Class { // 定義班級的屬性 String id; // 班級號 ArrayList<Student> students; // 學生列表 public Class(String id) { this.id = id; this.students = new ArrayList<Student>(); } public void addStudent(Student student) { boolean exist = false; // 標記學生是否已存在 for (Student s : students) { if (s.id.equals(student.id)) { exist = true; break; } } if (!exist) { // 如果不存在,添加到學生列表中 students.add(student); } } public int getAverage(HashMap<String, Course> courses) { int sum = 0; // 總成績和 int count = 0; // 總學生數(有成績的) for (Student student : students) { int average = student.getAverage(courses); // 計算每個學生的總成績平均分 if (average != -1) { sum += average; count++; } } if (count == 0) { return -1; } else { return sum / count; } } } public class Main { public static boolean isInteger(String s) { try { Integer.parseInt(s); // 嘗試轉換為整數 return true; // 如果成功,返回true } catch (NumberFormatException e) { // 如果失敗,捕獲異常 return false; // 返回false } } public static boolean isGrade(String s) { if (isInteger(s)) { int n = Integer.parseInt(s); return n >= 0 && n <= 100; // 如果在0-100之間,返回true } else { // 否則,返回false return false; } } public static boolean isStudentId(String s) { if (s.length() == 8 && isInteger(s)) { // 如果長度為8且是整數,返回true return true; } else { // 否則,返回false return false; } } public static boolean isName(String s) { if (s.length() <= 10) { // 如果長度不超過10,返回true return true; } else { // 否則,返回false return false; } } public static boolean isCourseName(String s) { if (s.length() <= 10) { return true; } else { return false; } } public static boolean isCourseType(String s) { if (s.equals("必修") || s.equals("選修")) { return true; } else { // 否則,返回false return false; } } public static boolean isAccessMode(String s) { if (s.equals("考試") || s.equals("考察")) { return true; } else { return false; } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); HashMap<String, Course> courses = new HashMap<String, Course>(); HashMap<String, Student> students = new HashMap<String, Student>