前言 這是第三次博客作業,總結了近三次PTA大作業的完成情況,作業7、8次的大作業的小題目圍繞著HashMap、ArrayList和自定義介面來展開,大題目則是課程成績程式的第二次第三次迭代,因為第一次課程成績的程式寫的結構不太好,於是重新寫的,第三次迭代並沒有拿到滿分,後面也沒有時間改了。期末考試 ...
前言
這是第三次博客作業,總結了近三次PTA大作業的完成情況,作業7、8次的大作業的小題目圍繞著HashMap、ArrayList和自定義介面來展開,大題目則是課程成績程式的第二次第三次迭代,因為第一次課程成績的程式寫的結構不太好,於是重新寫的,第三次迭代並沒有拿到滿分,後面也沒有時間改了。期末考試則是由29個選擇題和四個編程題組成。
關於類和整個程式的設計:
類是面向對象編程中的核心概念,通過類可以定義一組數據和與之相關的操作。在設計程式時,通常需要先考慮需要哪些對象和它們的屬性和行為,然後將這些信息組織成類的結構。在類的設計中,需要考慮類的名稱、屬性、方法、訪問許可權等方面。
除了類的設計,程式的整體設計也非常重要。程式的整體設計涉及到程式的架構、模塊劃分、代碼組織方式、代碼風格等方面。程式的整體設計需要遵循一些基本原則,如低耦合、高內聚、模塊化等,以確保程式的可維護性、擴展性和可重用性。
在設計程式時,還需要考慮程式的性能、安全性、可靠性等方面。這些方面的考慮需要在程式開發的不同階段進行,例如在編碼階段需要考慮程式的性能優化,而在測試階段需要考慮程式的安全性和可靠性。
三次題目集的知識點、題量、難度等情況:
(對於重難點題目將會給出完整題目)
第七次大作業:
容器-HashMap:
HashMap是Java中常用的容器類之一,它實現了Map介面,用於存儲鍵值對。下麵是HashMap的用法:
-
創建HashMap對象:
HashMap<Key類型, Value類型> hashMap = new HashMap<>();
-
添加元素:
hashMap.put(key, value);
-
獲取元素:
Value value = hashMap.get(key);
-
刪除元素:
hashMap.remove(key);
-
判斷鍵是否存在:
boolean containsKey = hashMap.containsKey(key);
-
判斷值是否存在:
boolean containsValue = hashMap.containsValue(value);
-
獲取HashMap的大小:
int size = hashMap.size();
-
遍歷HashMap:
// 遍歷鍵 for (Key key : hashMap.keySet()) { // 根據鍵獲取值 Value value = hashMap.get(key); // 處理值 } // 遍歷值 for (Value value : hashMap.values()) { // 處理值 } // 遍歷鍵值對 for (Map.Entry<Key, Value> entry : hashMap.entrySet()) { Key key = entry.getKey(); Value value = entry.getValue(); // 處理鍵值對 }
需要註意的是,HashMap中的鍵是唯一的,如果重覆添加相同的鍵,後面的值會替代前面的值;值可以重覆。此外,HashMap是無序的,元素的順序不保證一致。
除了基本的用法,還可以使用其他方法和構造函數來滿足不同的需求,例如通過構造函數指定初始容量和負載因數,使用putAll()方法將另一個Map中的元素添加到當前HashMap中,使用isEmpty()方法判斷HashMap是否為空等。
7-3 課程成績統計程式-2
課程成績統計程式-2在第一次的基礎上增加了實驗課,以下加粗字體顯示為本次新增的內容。
某高校課程從性質上分為:必修課、選修課、實驗課,從考核方式上分為:考試、考察、實驗。
考試的總成績由平時成績、期末成績分別乘以權重值得出,比如平時成績權重0.3,期末成績權重0.7,總成績=平時成績*0.3+期末成績*0.7。
考察的總成績直接等於期末成績
實驗的總成績等於課程每次實驗成績的平均分
必修課的考核方式必須為考試,選修課可以選擇考試、考察任一考核方式。實驗課的成績必須為實驗。
1、輸入:
包括課程、課程成績兩類信息。
課程信息包括:課程名稱、課程性質、考核方式(可選,如果性質是必修課,考核方式可以沒有)三個數據項。
課程信息格式:課程名稱+英文空格+課程性質+英文空格+考核方式
課程性質輸入項:必修、選修、實驗
考核方式輸入選項:考試、考察、實驗
考試/考查課程成績信息包括:學號、姓名、課程名稱、平時成績(可選)、期末成績
考試/考查課程信息格式:學號+英文空格+姓名+英文空格+課程名稱+英文空格+平時成績+英文空格+期末成績
實驗課程成績信息包括:學號、姓名、課程名稱、實驗次數、每次成績
實驗次數至少4次,不超過9次
實驗課程信息格式:學號+英文空格+姓名+英文空格+課程名稱+英文空格+實驗次數+英文空格+第一次實驗成績+...+英文空格+最後一次實驗成績
以上信息的相關約束:
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)成績平均分只取整數部分,小數部分丟棄
參考類圖(與第一次相同,其餘內容自行補充):
第八次大作業:
容器-ArrayList:
ArrayList是Java中常用的動態數組類,它實現了List介面,用於存儲一組有序的元素。下麵是ArrayList的用法:
-
創建ArrayList對象:
ArrayList<ElementType> arrayList = new ArrayList<>();
-
添加元素:
arrayList.add(element);
元素將會被添加到ArrayList的尾部。
-
獲取元素:
ElementType element = arrayList.get(index);
使用索引位置來獲取ArrayList中指定位置的元素,索引從0開始。
-
修改元素:
arrayList.set(index, newElement);
使用索引位置來替換ArrayList中指定位置的元素。
-
刪除元素:
arrayList.remove(index);
使用索引位置來刪除ArrayList中指定位置的元素。
-
判斷元素是否存在:
boolean containsElement = arrayList.contains(element);
使用contains()方法來判斷ArrayList中是否包含指定元素。
-
獲取ArrayList的大小:
int size = arrayList.size();
使用size()方法來獲取ArrayList的大小。
-
遍歷ArrayList:
for (ElementType element : arrayList) { // 處理元素 }
需要註意的是,ArrayList可以存儲任意類型的元素,包括基本類型的包裝類和自定義類型。ArrayList的容量會根據需要進行自動擴容,以適應元素的添加。
除了上述基本用法,ArrayList還提供了許多其他方法,如addAll()方法可以將另一個集合中的元素添加到當前ArrayList中,使用isEmpty()方法判斷ArrayList是否為空,使用clear()方法清空ArrayList中的所有元素等。
7-2 課程成績統計程式-3
課程成績統計程式-3在第二次的基礎上修改了計算總成績的方式,
要求:修改類結構,將成績類的繼承關係改為組合關係,成績信息由課程成績類和分項成績類組成,課程成績類組合分項成績類,分項成績類由成績分值和權重兩個屬性構成。
完成課程成績統計程式-2、3兩次程式後,比較繼承和組合關係的區別。思考一下哪一種關係運用上更靈活,更能夠適應變更。
題目最後的參考類圖未做修改,大家根據要求自行調整,以下內容加粗字體顯示的內容為本次新增的內容。
某高校課程從性質上分為:必修課、選修課、實驗課,從考核方式上分為:考試、考察、實驗。
考試的總成績由平時成績、期末成績分別乘以權重值得出,比如平時成績權重0.3,期末成績權重0.7,總成績=平時成績*0.3+期末成績*0.7。
考察的總成績直接等於期末成績
實驗的總成績等於課程每次實驗成績乘以權重後累加而得。
課程權重值在錄入課程信息時輸入。(註意:所有分項成績的權重之和應當等於1)
必修課的考核方式必須為考試,選修課可以選擇考試、考察任一考核方式。實驗課的成績必須為實驗。
1、輸入:
包括課程、課程成績兩類信息。
課程信息包括:課程名稱、課程性質、考核方式、分項成績數量、每個分項成績的權重。
考試課信息格式:課程名稱+英文空格+課程性質+英文空格+考核方式+英文空格+平時成績的權重+英文空格+期末成績的權重
考察課信息格式:課程名稱+英文空格+課程性質+英文空格+考核方式
實驗課程信息格式:課程名稱+英文空格+課程性質+英文空格+考核方式+英文空格+分項成績數量n+英文空格+分項成績1的權重+英文空格+。。。+英文空格+分項成績n的權重
實驗次數至少4次,不超過9次
課程性質輸入項:必修、選修、實驗
考核方式輸入選項:考試、考察、實驗
考試/考查課程成績信息包括:學號、姓名、課程名稱、平時成績(可選)、期末成績
考試/考查課程成績信息格式:學號+英文空格+姓名+英文空格+課程名稱+英文空格+平時成績+英文空格+期末成績
實驗課程成績信息包括:學號、姓名、課程名稱、每次成績{在系列-2的基礎上去掉了(實驗次數),實驗次數要和實驗課程信息中輸入的分項成績數量保持一致}
實驗課程信息格式:學號+英文空格+姓名+英文空格+課程名稱+英文空格+第一次實驗成績+...+英文空格+最後一次實驗成績
以上信息的相關約束:
1)成績是整數,不包含小數部分,成績的取值範圍是【0,100】
2)學號由8位數字組成
3)姓名不超過10個字元
4)課程名稱不超過10個字元
5)不特別輸入班級信息,班級號是學號的前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)若出現重覆的課程/成績信息,只保留第一個課程信息,忽略後面輸入的。
6)如果解析實驗課程信息時,輸入的分項成績數量值和分項成績權重的個數不匹配,輸出:課程名稱+" : number of scores does not match"
7)如果解析考試課、實驗課時,分項成績權重值的總和不等於1,輸出:課程名稱+" : weight value error"
信息約束:
1)成績平均分只取整數部分,小數部分丟棄
期末考試:
(這裡只分析編程題)
前三題均為關於正方形、正三棱錐及其魔方的迭代問題:
在魔方問題的基礎上,
重構類設計,實現列表內魔方的排序功能(按照魔方的體積進行排序)。
提示:題目中RubikCube類要實現Comparable介面。
其中,Main類源碼如下(可直接拷貝使用):
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
String color;
int layer;
double side;
RubikCube cube;
ArrayList<RubikCube> list = new ArrayList<>();
int choice = input.nextInt();
while(choice != 0) {
switch(choice) {
case 1://SquareCube
color = input.next();
layer = input.nextInt();
side = input.nextDouble();
cube = new SquareCube(color, layer,new Cube(side));
list.add(cube);
break;
case 2://RegularPyramidCube
color = input.next();
layer = input.nextInt();
side = input.nextDouble();
cube = new RegularPyramidCube(color, layer,new RegularPyramid(side));
list.add(cube);
break;
}
choice = input.nextInt();
}
list.sort(Comparator.naturalOrder());//正向排序
for(int i = 0; i < list.size(); i++) {
System.out.print(list.get(i).getColor() + " " +
String.format("%.2f", list.get(i).getArea()) + " " +
String.format("%.2f", list.get(i).getVolume()) );
System.out.println("");
}
}
}
輸入格式:
輸入魔方類型(1:正方體魔方;2:正三棱錐魔方;0:結束輸入)
魔方顏色、魔方階數、魔方單元正方體、正三棱錐邊長
..迴圈..
輸出格式:
按魔方體積升序輸出列表中各魔方的信息(實型數均保留兩位小數),輸出樣式參見輸出樣例。
輸入樣例:
在這裡給出一組輸入。例如:
1 blue 3 4.5
2 red 4 2.1
1 yellow 5 2.3
2 black 4 9.42
1 white 4 5.4423
0
輸出樣例:
在這裡給出相應的輸出。例如:
red 122.21 69.85
yellow 793.50 1520.88
blue 1093.50 2460.38
black 2459.14 6304.73
white 2843.39 10316.38
7-4 銷售步槍問題(附加題)
前亞利桑那州境內的一位步槍銷售商銷售密蘇里州製造的步槍機(lock)、槍托(stock)和槍管(barrel)。槍機賣45美元,槍托賣30美元,槍管賣25美元。銷售商每月至少要售出一支完整的步槍,且生產限額是銷售商在一個月內可銷售70個槍機、80個槍托和90個槍管。
根據每個月的銷售情況,計算銷售商的佣金(提成)演算法如下:
-
不到(含)1000美元的部分為10%;
-
1000(含)~1800美元的部分為15%;
-
超過1800美元的部分為20%。
佣金程式生成月份銷售報告,彙總銷售商的銷售總額和佣金。
編程要求:必須符合面向對象編程,且保證類設計的單一職責模式,使用面向過程編程判定0分。
提示:可以設置一個銷售訂單類。參考類圖如下:
輸入格式:輸入銷售商每個月售出槍機、槍托、槍管的數量,可以用空格或者回車分隔。
輸出格式:分別輸出銷售商在該月的銷售額和佣金,中間用空格分開。
輸入樣例1:
在這裡給出一組輸入。例如:30 40 50
輸出樣例1:
在這裡給出相應的輸出。例如:3800.00 620.00
輸入樣例2:
在這裡給出一組輸入。例如:88 56 98
輸出樣例2:
在這裡給出相應的輸出。例如:Wrong Format
設計與分析與主要問題和其解決方法
(這裡只會提供重點題目的代碼)
第七次大作業:
課程成績2:
1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStreamReader; 4 import java.text.Collator; 5 import java.util.*; 6 import java.util.Comparator; 7 import java.util.Locale; 8 import java.util.regex.PatternSyntaxException; 9 import java.util.stream.Collectors; 10 import java.util.stream.IntStream; 11 import java.util.List; 12 import java.util.ArrayList; 13 14 15 public class Main { 16 public static void main(String[] args) { 17 try (BufferedReader in = new BufferedReader(new InputStreamReader(System.in))) { 18 MessageGetAndPrint messageGetAndPrint = new MessageGetAndPrint(); 19 messageGetAndPrint.print = new Print(); 20 21 in.lines().takeWhile(line -> !line.equals("end")).forEach(messageGetAndPrint::getMessage); 22 23 messageGetAndPrint.print.personPrint(messageGetAndPrint.students, messageGetAndPrint.courseSelections); 24 messageGetAndPrint.print.coursePrint(messageGetAndPrint.courses, messageGetAndPrint.courseSelections); 25 messageGetAndPrint.print.classPrint(messageGetAndPrint.classes, messageGetAndPrint.courseSelections); 26 } catch (IOException e) { 27 e.printStackTrace(); 28 } 29 } 30 } 31 class Class { 32 private String classNum; 33 HashMap<String , Student> students; 34 Class(String classNum) { 35 setClassNum(classNum); 36 } 37 public void setClassNum(String classNum) { 38 this.classNum = classNum; 39 } 40 public String getClassNum() { 41 return classNum; 42 } 43 public void addStudent(Student student) { 44 students.put(student.getStudentNum() , student); 45 } 46 } 47 class Student { 48 private String name; 49 private String studentNum; 50 Student(String name , String studentNum) { 51 setName(name); 52 setStudentNum(studentNum); 53 } 54 public String getName() { 55 return name; 56 } 57 public void setName(String name) { 58 this.name = name; 59 } 60 public String getStudentNum() { 61 return studentNum; 62 } 63 public void setStudentNum(String studentNum) { 64 this.studentNum = studentNum; 65 } 66 } 67 class Course { 68 private String className; 69 private int classQuality; 70 private int assessmentMethodology; 71 Course(String className , int classQuality , int assessmentMethodology) { 72 setClassName(className); 73 setClassQuality(classQuality); 74 setAssessmentMethodology(assessmentMethodology); 75 } 76 public String getClassName() { 77 return className; 78 } 79 public void setClassName(String className) { 80 this.className = className; 81 } 82 public int getClassQuality() { 83 return classQuality; 84 } 85 public void setClassQuality(int classQuality) { 86 this.classQuality = classQuality; 87 } 88 public int getAssessmentMethodology() { 89 return assessmentMethodology; 90 } 91 public void setAssessmentMethodology(int assessmentMethodology) { 92 this.assessmentMethodology = assessmentMethodology; 93 } 94 } 95 class CourseSelection { 96 Student student; 97 Course course; 98 Grade grade; 99 } 100 abstract class Grade { 101 int allGrade; 102 abstract void getAllGrade(); 103 } 104 class GradeA extends Grade {//考試 105 private int finalGrade; 106 private int usualGrade; 107 GradeA(int finalGrade , int usualGrade) { 108 setFinalGrade(finalGrade); 109 setUsualGrade(usualGrade); 110 } 111 public void setFinalGrade(int finalGrade) { 112 this.finalGrade = finalGrade; 113 } 114 public int getFinalGrade() { 115 return finalGrade; 116 } 117 public void setUsualGrade(int usualGrade) { 118 this.usualGrade = usualGrade; 119 } 120 public int getUsualGrade() { 121 return usualGrade; 122 } 123 @Override 124 void getAllGrade() { 125 allGrade = (int) (finalGrade*0.7+usualGrade*0.3); 126 } 127 } 128 class GradeB extends Grade {//考察 129 private int finalGrade; 130 GradeB(int finalGrade) { 131 setFinalGrade(finalGrade); 132 } 133 public void setFinalGrade(int finalGrade) { 134 this.finalGrade = finalGrade; 135 } 136 public int getFinalGrade() { 137 return finalGrade; 138 } 139 @Override 140 void getAllGrade() { 141 allGrade = finalGrade; 142 } 143 } 144 class GradeC extends Grade {//實驗 145 ArrayList<Integer> usualGrades; 146 GradeC(ArrayList<Integer> usualGrades) { 147 this.usualGrades = usualGrades; 148 } 149 @Override 150 void getAllGrade() { 151 allGrade = 0; 152 for(int x:usualGrades){ 153 allGrade+=x; 154 } 155 allGrade = allGrade/usualGrades.size(); 156 } 157 } 158 class Print { 159 public void personPrint(HashMap<String , Student> students, ArrayList<CourseSelection> courseSelections) { 160 students.keySet().stream() 161 .sorted() 162 .forEach(key -> { 163 Student student = students.get(key); // 獲取當前學生信息 164 int[] gradeData = courseSelections.stream() 165 .filter(cs -> cs.student.getStudentNum().equals(student.getStudentNum())) 166 .mapToInt(cs -> { 167 cs.grade.getAllGrade(); // 更新成績狀態 168 return cs.grade.allGrade; // 提取當前的總成績 169 }) 170 .toArray(); 171 if (gradeData.length == 0) { // 沒有成績數據 172 System.out.println(student.getStudentNum() + " " + student.getName() + " did not take any exams"); 173 } else { 174 // 計算平均分並列印 175 int averageGrade = Arrays.stream(gradeData).sum() / gradeData.length; 176 System.out.println(student.getStudentNum() + " " + student.getName() + " " + averageGrade); 177 } 178 }); 179 } 180 public void coursePrint(HashMap<String, Course> courses, ArrayList<CourseSelection> courseSelections) { 181 courses.keySet().stream() 182 .sorted(new SoftName()) 183 .forEach(key -> { 184 Course course = courses.get(key); 185 // 根據課程篩選相關的選課記錄 186 List<CourseSelection> selected = new ArrayList<>(); 187 for (CourseSelection cs : courseSelections) { 188 if (cs.course.getClassName().equals(course.getClassName())) { 189 selected.add(cs); 190 } 191 } 192 193 if (selected.isEmpty()) { 194 System.out.println(course.getClassName() + " has no grades yet"<