大家好,我是棧長。 Nacos 2.3.0 前幾天正式發佈了,新增了不少實用性的新功能,真是史上最強版本。 Nacos 2.3.0 還真是一個比較重要的大版本,因為它涉及了太多重大更新,今天棧長給大家來解讀下。 Nacos 先掃個盲: Nacos 一個用於構建雲原生應用的動態服務發現、配置管理和服務 ...
前言
本次博客針對面向對象程式設計的課程所發的PTA作業7,8以及期末考試中的面向對象編程題的分析和總結,重點介紹課程成績統計程式系列題目以及期末考試的編程題。
PTA第七次作業
在這次作業中7-1、7-2內容和考點相同,在此我分析一下7-2Hashmap的排序這個問題。
7-2 容器-HashMap-排序 分數 10 作者 蔡軻 單位 南昌航空大學輸入多個學生的成績信息,包括:學號、姓名、成績。
學號是每個學生的唯一識別號,互不相同。
姓名可能會存在重覆。
要求:使用HashMap存儲學生信息。
輸入格式:
輸入多個學生的成績信息,每個學生的成績信息格式:學號+英文空格+姓名+英文空格+成績
以“end”為輸入結束標誌
輸出格式:
按學號從大到小的順序輸出所有學生信息,每個學生信息的輸出格式:學號+英文空格+姓名+英文空格+成績
輸入樣例:
在這裡給出一組輸入。例如:
20201124 張少軍 83
20201136 李四 78
20201118 鄭覺先 80
end
輸出樣例:
在這裡給出相應的輸出。例如:
20201136 李四 78
20201124 張少軍 83
20201118 鄭覺先 80
這道題目的考點在於Hashmap容器的使用以及排序函數的使用,我的源代碼如下:
import java.util.*; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); HashMap<String,String> hashMap = new HashMap<String,String>(); while(true) { String str = input.nextLine(); if(str.equals("end")) { break; } String str1[] = str.split(" "); String no = str1[0]; String name = str1[1]; String grade = str1[2]; hashMap.put(no,name+" "+grade); } List<String> studentIds = new ArrayList<>(hashMap.keySet()); // 按學號從大到小排序 Collections.sort(studentIds, (s1, s2) -> Integer.parseInt(s2) - Integer.parseInt(s1)); // 輸出學生信息 for (String studentId : studentIds) { String studentInfo = hashMap.get(studentId); System.out.println(studentId + " " + studentInfo); } } }排序
本次的代碼較短且複雜度很低,在此不贅述其類圖以及圈複雜度分析。
這次作業中難度較大的是課程成績統計程式-2,下麵是這道題目的介紹和分析。
7-3 課程成績統計程式-2 分數 60 作者 蔡軻 單位 南昌航空大學課程成績統計程式-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)成績平均分只取整數部分,小數部分丟棄
參考類圖(與第一次相同,其餘內容自行補充):
輸入樣例1:
在這裡給出一組輸入。例如:
java 實驗 實驗
20201103 張三 java 4 70 80 90
end
輸出樣例1:
在這裡給出相應的輸出。例如:
20201103 張三 : access mode mismatch
20201103 張三 did not take any exams
java has no grades yet
202011 has no grades yet
輸入樣例2:
在這裡給出一組輸入。例如:
java 實驗 實驗
20201103 張三 java 3 70 80 90
end
輸出樣例2:
在這裡給出相應的輸出。例如:
wrong format
java has no grades yet
輸入樣例3:
在這裡給出一組輸入。例如:
java 必修 實驗
20201103 張三 java 3 70 80 90 100
end
輸出樣例3:
在這裡給出相應的輸出。例如:
java : course type & access mode mismatch
wrong format
輸入樣例4:
在這裡給出一組輸入。例如:
java 必修 實驗
20201103 張三 java 4 70 80 90 105
end
輸出樣例4:
在這裡給出相應的輸出。例如:
java : course type & access mode mismatch
wrong format
輸入樣例5:
在這裡給出一組輸入。例如:
java 選修 考察
C語言 選修 考察
java實驗 實驗 實驗
編譯原理 必修 考試
20201101 王五 C語言 76
20201216 李四 C語言 78
20201307 張少軍 編譯原理 82 84
20201103 張三 java實驗 4 70 80 90 100
20201118 鄭覺先 java 80
20201328 劉和宇 java 77
20201220 朱重九 java實驗 4 60 60 80 80
20201132 王萍 C語言 40
20201302 李夢涵 C語言 68
20201325 崔瑾 編譯原理 80 84
20201213 黃紅 java 82
20201209 趙仙芝 java 76
end
輸出樣例5:
在這裡給出相應的輸出。例如:
20201101 王五 76
20201103 張三 85
20201118 鄭覺先 80
20201132 王萍 40
20201209 趙仙芝 76
20201213 黃紅 82
20201216 李四 78
20201220 朱重九 70
20201302 李夢涵 68
20201307 張少軍 83
20201325 崔瑾 82
20201328 劉和宇 77
C語言 65 65
java 78 78
java實驗 77
編譯原理 81 84 82
202011 70
202012 76
202013 77
這個題目是課程成績統計程式-1的升級,添加了實驗課的部分,修改了一部分輸入輸出以及錯誤的輸出,總體來說相比較第一次改動不大,以下是我的代碼:
1 import java.util.*; 2 import java.text.Collator; 3 class Crouse{ 4 String name; 5 String nature; 6 String fangshi; 7 ArrayList<Integer> pgrade = new ArrayList<>(); 8 ArrayList<Integer> qgrade = new ArrayList<>(); 9 ArrayList<Integer> grade = new ArrayList<>(); 10 public Crouse(String name, String nature, String fangshi) { 11 this.name = name; // 將參數賦值給成員變數 12 this.nature = nature; // 將參數賦值給成員變數 13 this.fangshi = fangshi; // 將參數賦值給成員變數 14 } 15 public int average() 16 { 17 int total=0; 18 for (int i:grade) 19 { 20 total+=i; 21 } 22 return total/grade.size(); 23 } 24 public int average1() 25 { 26 int total=0; 27 for (int i:pgrade) 28 { 29 total+=i; 30 } 31 return total/pgrade.size(); 32 } 33 public int average2() 34 { 35 int total=0; 36 for (int i:qgrade) 37 { 38 total+=i; 39 } 40 return total/qgrade.size(); 41 } 42 43 } 44 class Student { 45 String id; 46 String name; 47 HashMap<String,Integer> crouse; 48 public Student(String id, String name) { 49 this.id = id; // 將參數賦值給成員變數 50 this.name = name; // 將參數賦值給成員變數 51 this.crouse = new HashMap<>(); 52 } 53 public int averagegrade() 54 { 55 int total=0; 56 for (Integer grade:crouse.values()) { 57 total += grade; 58 } 59 return total/ crouse.size(); 60 } 61 } 62 class Class{ 63 String cid; 64 ArrayList<Student> students = new ArrayList<>(); 65 public Class(String cid) 66 { 67 this.cid=cid; 68 } 69 public int average() 70 { 71 int total=0; 72 for (Student s:students) 73 { 74 total+=s.averagegrade(); 75 } 76 return total/students.size(); 77 } 78 } 79 class Holder{ 80 ArrayList<Crouse> clist = new ArrayList<>(); 81 ArrayList<Student> slist = new ArrayList<>(); 82 ArrayList<Class> Clist = new ArrayList<>(); 83 84 public Crouse searth(String name) 85 { 86 int falg =0; 87 int i; 88 for ( i = 0; i < clist.size(); i++) { 89 if(clist.get(i).name.equals(name)) 90 { 91 falg++; 92 break; 93 } 94 } 95 if(falg!=0) 96 { 97 return clist.get(i); 98 } 99 else return null; 100 } 101 } 102 public class Main { 103 public static void main(String[] args) { 104 Scanner input = new Scanner(System.in); 105 Holder holder = new Holder(); 106 while (true) { 107 try { 108 String str = input.nextLine(); 109 if (str.equals("end")) { 110 break; 111 } 112 String[] str1 = str.split(" "); 113 if (str1.length == 3) { 114 if (str1[1].equals("必修")) { 115 if (str1[2].equals("考試")) { 116 String name = str1[0]; 117 String nature = str1[1]; 118 String fangshi = str1[2]; 119 Crouse crouse = null; 120 for (Crouse c:holder.clist) 121 { 122 if(c.name.equals(name)) { 123 crouse = c; 124 break; 125 } 126 } 127 if(crouse==null) { 128 crouse = new Crouse(name, nature, fangshi); 129 holder.clist.add(crouse); 130 } 131 } else { 132 System.out.println(str1[0] + " : course type & access mode mismatch"); 133 } 134 } else if (str1[1].equals("選修")) { 135 if (str1[2].equals("考試")) { 136 String name = str1[0]; 137 String nature = str1[1]; 138 String fangshi = str1[2]; 139 Crouse crouse = null; 140 for (Crouse c:holder.clist) 141 { 142 if(c.name.equals(name)) { 143 crouse = c; 144 break; 145 } 146 } 147 if(crouse==null) { 148 crouse = new Crouse(name, nature, fangshi); 149 holder.clist.add(crouse); 150 } 151 } else if (str1[2].equals("考察")) { 152 String name = str1[0]; 153 String nature = str1[1]; 154 String fangshi = str1[2]; 155 Crouse crouse = null; 156 for (Crouse c:holder.clist) 157 { 158 if(c.name.equals(name)) { 159 crouse = c; 160 break; 161 } 162 } 163 if(crouse==null) { 164 crouse = new Crouse(name, nature, fangshi); 165 holder.clist.add(crouse); 166 } 167 } else { 168 System.out.println(str1[0] + " : course type & access mode mismatch"); 169 } 170 } else if (str1[1].equals("實驗")) { 171 if (str1[2].equals("實驗")) { 172 String name = str1[0]; 173 String nature = str1[1]; 174 String fangshi = str1[2]; 175 Crouse crouse = null; 176 for (Crouse c:holder.clist) 177 { 178 if(c.name.equals(name)) { 179 crouse = c; 180 break; 181 } 182 } 183 if(crouse==null) { 184 crouse = new Crouse(name, nature, fangshi); 185 holder.clist.add(crouse); 186 } 187 } else { 188 System.out.println(str1[0] + " : course type & access mode mismatch"); 189 } 190 } 191 } else if (str1.length == 4)//選修,考察 192 { 193 if (Integer.parseInt(str1[3]) > 0 && Integer.parseInt(str1[3]) < 100) { 194 if (holder.searth(str1[2]) != null) { 195 String stuid = str1[0]; 196 String sname = str1[1]; 197 if (holder.searth(str1[2]).nature.equals("選修")) { 198 Student student = null; 199 for (Student s:holder.slist) 200 { 201 if(s.name.equals(sname)) 202 { 203 student = s; 204 break; 205 } 206 } 207 String cid = stuid.substring(0, 6); 208 Class cla = null; 209 for (Class c : holder.Clist) { 210 if (c.cid.equals(cid)) { 211 cla = c; 212 break; 213 } 214 } 215 if (cla == null) { 216 cla = new Class(cid); 217 holder.Clist.add(cla); 218 } 219 if(student==null) { 220 student = new Student(stuid,sname); 221 student.crouse.put(str1[2], Integer.parseInt(str1[3])); 222 cla.students.add(student); 223 holder.slist.add(student); 224 holder.searth(str1[2]).grade.add(Integer.parseInt(str1[3])); 225 } 226 else { 227 student.crouse.put(str1[2], Integer.parseInt(str1[3])); 228 holder.searth(str1[2]).grade.add(Integer.parseInt(str1[3])); 229 } 230 } else 231 System.out.println(stuid + " " + sname + " " + ": access mode mismatch"); 232 } else 233 System.out.println(str1[0] + " " + str1[1] + " " + ":" + str1[2] + " " + "does not exist"); 234 } else System.out.println("wrong format"); 235 } else if (str1.length == 5)//必修或選修考試 236 { 237 if (holder.searth(str1[2]) != null) { 238 String stuid = str1[0]; 239 String sname = str1[1]; 240 int grade = (int) (Integer.parseInt(str1[3]) * 0.3 + Integer.parseInt(str1[4]) * 0.7); 241 Student student = null; 242 for (Student s:holder.slist) 243 { 244 if(s.name.equals(sname)) 245 { 246 student = s; 247 break; 248 } 249 } 250 251 String cid = stuid.substring(0, 6); 252 Class cla = null; 253 for (Class c : holder.Clist) { 254 if (c.cid.equals(cid)) { 255 cla = c; 256 break; 257 } 258 } 259 if (cla == null) { 260 cla = new Class(cid); 261 holder.Clist.add(cla); 262 } 263 if(student==null) { 264 student = new Student(stuid,sname); 265 student.crouse.put(str1[2], grade); 266 cla.students.add(student); 267 holder.slist.add(student); 268 holder.searth(str1[2]).grade.add(grade); 269 holder.searth(str1[2]).pgrade.add(Integer.parseInt(str1[3])); 270 holder.searth(str1[2]).qgrade.add(Integer.parseInt(str1[4])); 271 } 272 else { 273 student.crouse.put(str1[2], grade); 274 holder.searth(str1[2]).grade.add(grade); 275 holder.searth(str1[2]).pgrade.add(Integer.parseInt(str1[3])); 276 holder.searth(str1[2]).qgrade.add(Integer.parseInt(str1[4])); 277 } 278 } else 279 System.out.println(str1[0] + " " + str1[1] + " " + ":" + str1[2] + " " + "does not exist"); 280 } else if (Integer.parseInt(str1[3]) > 3 && Integer.parseInt(str1[3]) < 10)//實驗 281 { 282 int num = Integer.parseInt(str1[3]); 283 int falg = 0; 284 for (int i = 4; i < str1.length; i++) { 285 if (Integer.parseInt(str1[i]) < 0 || Integer.parseInt(str1[i]) > 100) 286 falg++; 287 } 288 if (falg == 0) { 289 if (holder.searth(str1[2]) != null) { 290 String stuid = str1[0]; 291 String sname = str1[1]; 292 int grade = 0; 293 if (str1.length == 4 + num) { 294 for (int i = 4; i < 4 + num; i++) { 295 grade += Integer.parseInt(str1[i]); 296 } 297 grade = grade / 4; 298 Student student = null; 299 for (Student s:holder.slist) 300 { 301 if(s.name.equals(sname)) 302 { 303 student = s;