尚未崩坏 发表于 2024-2-7 13:14:00

面向对象程序设计第三次bolg

前言<br><br>本次博客针对面向对象程序设计的课程所发的PTA作业7,8以及期末考试中的面向对象编程题的分析和总结,重点介绍课程成绩统计程序系列题目以及期末考试的编程题。<br>PTA第七次作业<br><br>在这次作业中7-1、7-2内容和考点相同,在此我分析一下7-2Hashmap的排序这个问题。<br>7-2 容器-HashMap-排序分数 10全屏浏览题目切换布局作者 蔡轲单位 南昌航空大学输入多个学生的成绩信息,包括:学号、姓名、成绩。<br>学号是每个学生的唯一识别号,互不相同。<br>姓名可能会存在重复。<br>要求:使用HashMap存储学生信息。<br>输入格式:<br><br>输入多个学生的成绩信息,每个学生的成绩信息格式:学号+英文空格+姓名+英文空格+成绩<br>以“end”为输入结束标志<br>输出格式:<br><br>按学号从大到小的顺序输出所有学生信息,每个学生信息的输出格式:学号+英文空格+姓名+英文空格+成绩<br>输入样例:<br><br>在这里给出一组输入。例如:<br>20201124 张少军 83<br>20201136 李四 78<br>20201118 郑觉先 80<br>end<br>输出样例:<br><br>在这里给出相应的输出。例如:<br>20201136 李四 78<br>20201124 张少军 83<br>20201118 郑觉先 80<br>这道题目的考点在于Hashmap容器的使用以及排序函数的使用,我的源代码如下:<br>https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gifhttps://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gifimport java.util.*;<br><br>public class Main {<br>    public static void main(String[] args) {<br>      Scanner input = new Scanner(System.in);<br>      HashMap<String,String> hashMap = new HashMap<String,String>();<br>      while(true)<br>      {<br>            String str=input.nextLine();<br>            if(str.equals("end"))<br>            {<br>                break;<br>            }<br>            String str1[] = str.split(" ");<br>            String no = str1;<br>            String name = str1;<br>            String grade = str1;<br>            hashMap.put(no,name+" "+grade);<br>      }<br>      List<String> studentIds = new ArrayList<>(hashMap.keySet());<br><br>      // 按学号从大到小排序<br>      Collections.sort(studentIds, (s1, s2) -> Integer.parseInt(s2) - Integer.parseInt(s1));<br><br>      // 输出学生信息<br>      for (String studentId : studentIds) {<br>            String studentInfo = hashMap.get(studentId);<br>            System.out.println(studentId + " " + studentInfo);<br>      }<br>    }<br>}排序   本次的代码较短且复杂度很低,在此不赘述其类图以及圈复杂度分析。<br>这次作业中难度较大的是课程成绩统计程序-2,下面是这道题目的介绍和分析。<br>7-3 课程成绩统计程序-2分数 60全屏浏览题目切换布局作者 蔡轲单位 南昌航空大学课程成绩统计程序-2在第一次的基础上增加了实验课,以下加粗字体显示为本次新增的内容。<br>某高校课程从性质上分为:必修课、选修课、实验课,从考核方式上分为:考试、考察、实验。<br>考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重0.3,期末成绩权重0.7,总成绩=平时成绩*0.3+期末成绩*0.7。<br>考察的总成绩直接等于期末成绩<br>实验的总成绩等于课程每次实验成绩的平均分<br>必修课的考核方式必须为考试,选修课可以选择考试、考察任一考核方式。实验课的成绩必须为实验。<br>1、输入:<br>包括课程、课程成绩两类信息。<br>课程信息包括:课程名称、课程性质、考核方式(可选,如果性质是必修课,考核方式可以没有)三个数据项。<br>课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式<br>课程性质输入项:必修、选修、实验<br>考核方式输入选项:考试、考察、实验<br>考试/考查课程成绩信息包括:学号、姓名、课程名称、平时成绩(可选)、期末成绩<br>考试/考查课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+平时成绩+英文空格+期末成绩<br>实验课程成绩信息包括:学号、姓名、课程名称、实验次数、每次成绩<br>实验次数至少4次,不超过9次<br>实验课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+实验次数+英文空格+第一次实验成绩+...+英文空格+最后一次实验成绩<br>以上信息的相关约束:<br>1)平时成绩和期末成绩的权重默认为0.3、0.7<br>2)成绩是整数,不包含小数部分,成绩的取值范围是【0,100】<br>3)学号由8位数字组成<br>4)姓名不超过10个字符<br>5)课程名称不超过10个字符<br>6)不特别输入班级信息,班级号是学号的前6位。<br>2、输出:<br>输出包含三个部分,包括学生所有课程总成绩的平均分、单门课程成绩平均分、单门课程总成绩平均分、班级所有课程总成绩平均分。<br>为避免误差,平均分的计算方法为累加所有符合条件的单个成绩,最后除以总数。<br>1)学生课程总成绩平均分按学号由低到高排序输出<br>格式:学号+英文空格+姓名+英文空格+总成绩平均分<br>如果某个学生没有任何成绩信息,输出:学号+英文空格+姓名+英文空格+"did not take any exams"<br>2)单门课程成绩平均分分为三个分值:平时成绩平均分(可选)、期末考试平均分、总成绩平均分,按课程名称的字符顺序输出<br>考试/考察课程成绩格式:课程名称+英文空格+平时成绩平均分+英文空格+期末考试平均分+英文空格+总成绩平均分<br>实验课成绩格式:课程名称+英文空格+总成绩平均分<br>如果某门课程没有任何成绩信息,输出:课程名称+英文空格+"has no grades yet"<br>3)班级所有课程总成绩平均分按班级由低到高排序输出<br>格式:班级号+英文空格+总成绩平均分<br>如果某个班级没有任何成绩信息,输出:班级名称+英文空格+ "has no grades yet"<br>异常情况:<br>1)如果解析某个成绩信息时,课程名称不在已输入的课程列表中,输出:学号+英文空格+姓名+英文空格+":"+课程名称+英文空格+"does not exist"<br>2)如果解析某个成绩信息时,输入的成绩数量和课程的考核方式不匹配,输出:学号+英文空格+姓名+英文空格+": access mode mismatch"<br>以上两种情况如果同时出现,按第一种情况输出结果。<br>3)如果解析某个课程信息时,输入的课程性质和课程的考核方式不匹配,输出:课程名称+" : course type & access mode mismatch"<br>4)格式错误以及其他信息异常如成绩超出范围等,均按格式错误处理,输出"wrong format"<br>5)若出现重复的课程/成绩信息,只保留第一个课程信息,忽略后面输入的。<br>信息约束:<br>1)成绩平均分只取整数部分,小数部分丢弃<br>参考类图(与第一次相同,其余内容自行补充):<br><br>https://images.ptausercontent.com/9dbcf4e8-1627-4cf6-8764-cccf44947e2a.png<br> <br><br>输入样例1:<br><br>在这里给出一组输入。例如:<br>java 实验 实验<br>20201103 张三 java 4 70 80 90<br>end<br>输出样例1:<br><br>在这里给出相应的输出。例如:<br>20201103 张三 : access mode mismatch<br>20201103 张三 did not take any exams<br>java has no grades yet<br>202011 has no grades yet<br>输入样例2:<br><br>在这里给出一组输入。例如:<br>java 实验 实验<br>20201103 张三 java 3 70 80 90<br>end<br>输出样例2:<br><br>在这里给出相应的输出。例如:<br>wrong format<br>java has no grades yet<br>输入样例3:<br><br>在这里给出一组输入。例如:<br>java 必修 实验<br>20201103 张三 java 3 70 80 90 100<br>end<br>输出样例3:<br><br>在这里给出相应的输出。例如:<br>java : course type & access mode mismatch<br>wrong format<br>输入样例4:<br><br>在这里给出一组输入。例如:<br>java 必修 实验<br>20201103 张三 java 4 70 80 90 105<br>end<br>输出样例4:<br><br>在这里给出相应的输出。例如:<br>java : course type & access mode mismatch<br>wrong format<br> <br><br>输入样例5:<br><br>在这里给出一组输入。例如:<br>java 选修 考察<br>C语言 选修 考察<br>java实验 实验 实验<br>编译原理 必修 考试<br>20201101 王五 C语言 76<br>20201216 李四 C语言 78<br>20201307 张少军 编译原理 82 84<br>20201103 张三 java实验 4 70 80 90 100<br>20201118 郑觉先 java 80<br>20201328 刘和宇 java 77<br>20201220 朱重九 java实验 4 60 60 80 80<br>20201132 王萍 C语言 40<br>20201302 李梦涵 C语言 68<br>20201325 崔瑾 编译原理 80 84<br>20201213 黄红 java 82<br>20201209 赵仙芝 java 76<br>end<br>输出样例5:<br><br>在这里给出相应的输出。例如:<br>20201101 王五 76<br>20201103 张三 85<br>20201118 郑觉先 80<br>20201132 王萍 40<br>20201209 赵仙芝 76<br>20201213 黄红 82<br>20201216 李四 78<br>20201220 朱重九 70<br>20201302 李梦涵 68<br>20201307 张少军 83<br>20201325 崔瑾 82<br>20201328 刘和宇 77<br>C语言 65 65<br>java 78 78<br>java实验 77<br>编译原理 81 84 82<br>202011 70<br>202012 76<br>202013 77<br><br>这个题目是课程成绩统计程序-1的升级,添加了实验课的部分,修改了一部分输入输出以及错误的输出,总体来说相比较第一次改动不大,以下是我的代码:<br>1 import java.util.*;<br>2 import java.text.Collator;<br>3 class Crouse{<br>4   String name;<br>5   String nature;<br>6   String fangshi;<br>7   ArrayList<Integer> pgrade = new ArrayList<>();<br>8   ArrayList<Integer> qgrade = new ArrayList<>();<br>9   ArrayList<Integer> grade = new ArrayList<>();<br> 10   public Crouse(String name, String nature, String fangshi) {<br> 11         this.name = name; // 将参数赋值给成员变量<br> 12         this.nature = nature; // 将参数赋值给成员变量<br> 13         this.fangshi = fangshi; // 将参数赋值给成员变量<br> 14   }<br> 15   public int average()<br> 16   {<br> 17         int total=0;<br> 18         for (int i:grade)<br> 19         {<br> 20             total+=i;<br> 21         }<br> 22         return total/grade.size();<br> 23   }<br> 24   public int average1()<br> 25   {<br> 26         int total=0;<br> 27         for (int i:pgrade)<br> 28         {<br> 29             total+=i;<br> 30         }<br> 31         return total/pgrade.size();<br> 32   }<br> 33   public int average2()<br> 34   {<br> 35         int total=0;<br> 36         for (int i:qgrade)<br> 37         {<br> 38             total+=i;<br> 39         }<br> 40         return total/qgrade.size();<br> 41   }<br> 42 <br> 43 }<br> 44 class Student {<br> 45   String id;<br> 46   String name;<br> 47   HashMap<String,Integer> crouse;<br> 48   public Student(String id, String name) {<br> 49         this.id = id; // 将参数赋值给成员变量<br> 50         this.name = name; // 将参数赋值给成员变量<br> 51         this.crouse = new HashMap<>();<br> 52   }<br> 53   public int averagegrade()<br> 54   {<br> 55         int total=0;<br> 56         for (Integer grade:crouse.values()) {<br> 57             total += grade;<br> 58         }<br> 59         return total/ crouse.size();<br> 60   }<br> 61 }<br> 62 class Class{<br> 63   String cid;<br> 64   ArrayList<Student> students = new ArrayList<>();<br> 65   public Class(String cid)<br> 66   {<br> 67         this.cid=cid;<br> 68   }<br> 69   public int average()<br> 70   {<br> 71         int total=0;<br> 72         for (Student s:students)<br> 73         {<br> 74             total+=s.averagegrade();<br> 75         }<br> 76         return total/students.size();<br> 77   }<br> 78 }<br> 79 class Holder{<br> 80   ArrayList<Crouse> clist = new ArrayList<>();<br> 81   ArrayList<Student> slist = new ArrayList<>();<br> 82   ArrayList<Class> Clist = new ArrayList<>();<br> 83 <br> 84   public Crouse searth(String name)<br> 85   {<br> 86         int falg =0;<br> 87         int i;<br> 88         for ( i = 0; i < clist.size(); i++) {<br> 89             if(clist.get(i).name.equals(name))<br> 90             {<br> 91               falg++;<br> 92               break;<br> 93             }<br> 94         }<br> 95         if(falg!=0)<br> 96         {<br> 97             return clist.get(i);<br> 98         }<br> 99         else return null;<br>100   }<br>101 }<br>102 public class Main {<br>103   public static void main(String[] args) {<br>104         Scanner input = new Scanner(System.in);<br>105         Holder holder = new Holder();<br>106         while (true) {<br>107             try {<br>108               String str = input.nextLine();<br>109               if (str.equals("end")) {<br>110                     break;<br>111               }<br>112               String[] str1 = str.split(" ");<br>113               if (str1.length == 3) {<br>114                     if (str1.equals("必修")) {<br>115                         if (str1.equals("考试")) {<br>116                           String name = str1;<br>117                           String nature = str1;<br>118                           String fangshi = str1;<br>119                           Crouse crouse = null;<br>120                           for (Crouse c:holder.clist)<br>121                           {<br>122                                 if(c.name.equals(name)) {<br>123                                     crouse = c;<br>124                                     break;<br>125                                 }<br>126                           }<br>127                           if(crouse==null) {<br>128                                 crouse = new Crouse(name, nature, fangshi);<br>129                                 holder.clist.add(crouse);<br>130                           }<br>131                         } else {<br>132                           System.out.println(str1 + " : course type & access mode mismatch");<br>133                         }<br>134                     } else if (str1.equals("选修")) {<br>135                         if (str1.equals("考试")) {<br>136                           String name = str1;<br>137                           String nature = str1;<br>138                           String fangshi = str1;<br>139                           Crouse crouse = null;<br>140                           for (Crouse c:holder.clist)<br>141                           {<br>142                                 if(c.name.equals(name)) {<br>143                                     crouse = c;<br>144                                     break;<br>145                                 }<br>146                           }<br>147                           if(crouse==null) {<br>148                                 crouse = new Crouse(name, nature, fangshi);<br>149                                 holder.clist.add(crouse);<br>150                           }<br>151                         } else if (str1.equals("考察")) {<br>152                           String name = str1;<br>153                           String nature = str1;<br>154                           String fangshi = str1;<br>155                           Crouse crouse = null;<br>156                           for (Crouse c:holder.clist)<br>157                           {<br>158                                 if(c.name.equals(name)) {<br>159                                     crouse = c;<br>160                                     break;<br>161                                 }<br>162                           }<br>163                           if(crouse==null) {<br>164                                 crouse = new Crouse(name, nature, fangshi);<br>165                                 holder.clist.add(crouse);<br>166                           }<br>167                         } else {<br>168                           System.out.println(str1 + " : course type & access mode mismatch");<br>169                         }<br>170                     } else if (str1.equals("实验")) {<br>171                         if (str1.equals("实验")) {<br>172                           String name = str1;<br>173                           String nature = str1;<br>174                           String fangshi = str1;<br>175                           Crouse crouse = null;<br>176                           for (Crouse c:holder.clist)<br>177                           {<br>178                                 if(c.name.equals(name)) {<br>179                                     crouse = c;<br>180                                     break;<br>181                                 }<br>182                           }<br>183                           if(crouse==null) {<br>184                                 crouse = new Crouse(name, nature, fangshi);<br>185                                 holder.clist.add(crouse);<br>186                           }<br>187                         } else {<br>188                           System.out.println(str1 + " : course type & access mode mismatch");<br>189                         }<br>190                     }<br>191               } else if (str1.length == 4)//选修,考察<br>192               {<br>193                     if (Integer.parseInt(str1) > 0 && Integer.parseInt(str1) < 100) {<br>194                         if (holder.searth(str1) != null) {<br>195                           String stuid = str1;<br>196                           String sname = str1;<br>197                           if (holder.searth(str1).nature.equals("选修")) {<br>198                                 Student student = null;<br>199                                 for (Student s:holder.slist)<br>200                                 {<br>201                                     if(s.name.equals(sname))<br>202                                     {<br>203                                       student = s;<br>204                                       break;<br>205                                     }<br>206                                 }<br>207                                 String cid = stuid.substring(0, 6);<br>208                                 Class cla = null;<br>209                                 for (Class c : holder.Clist) {<br>210                                     if (c.cid.equals(cid)) {<br>211                                       cla = c;<br>212                                       break;<br>213                                     }<br>214                                 }<br>215                                 if (cla == null) {<br>216                                     cla = new Class(cid);<br>217                                     holder.Clist.add(cla);<br>218                                 }<br>219                                 if(student==null) {<br>220                                     student = new Student(stuid,sname);<br>221                                     student.crouse.put(str1, Integer.parseInt(str1));<br>222                                     cla.students.add(student);<br>223                                     holder.slist.add(student);<br>224                                     holder.searth(str1).grade.add(Integer.parseInt(str1));<br>225                                 }<br>226                                 else {<br>227                                     student.crouse.put(str1, Integer.parseInt(str1));<br>228                                     holder.searth(str1).grade.add(Integer.parseInt(str1));<br>229                                 }<br>230                           } else<br>231                                 System.out.println(stuid + " " + sname + " " + ": access mode mismatch");<br>232                         } else<br>233                           System.out.println(str1 + " " + str1 + " " + ":" + str1 + " " + "does not exist");<br>234                     } else System.out.println("wrong format");<br>235               } else if (str1.length == 5)//必修或选修考试<br>236               {<br>237                     if (holder.searth(str1) != null) {<br>238                         String stuid = str1;<br>239                         String sname = str1;<br>240                         int grade = (int) (Integer.parseInt(str1) * 0.3 + Integer.parseInt(str1) * 0.7);<br>241                         Student student = null;<br>242                         for (Student s:holder.slist)<br>243                         {<br>244                           if(s.name.equals(sname))<br>245                           {<br>246                                 student = s;<br>247                                 break;<br>248                           }<br>249                         }<br>250 <br>251                         String cid = stuid.substring(0, 6);<br>252                         Class cla = null;<br>253                         for (Class c : holder.Clist) {<br>254                           if (c.cid.equals(cid)) {<br>255                                 cla = c;<br>256                                 break;<br>257                           }<br>258                         }<br>259                         if (cla == null) {<br>260                           cla = new Class(cid);<br>261                           holder.Clist.add(cla);<br>262                         }<br>263                         if(student==null) {<br>264                           student = new Student(stuid,sname);<br>265                           student.crouse.put(str1, grade);<br>266                           cla.students.add(student);<br>267                           holder.slist.add(student);<br>268                           holder.searth(str1).grade.add(grade);<br>269                           holder.searth(str1).pgrade.add(Integer.parseInt(str1));<br>270                           holder.searth(str1).qgrade.add(Integer.parseInt(str1));<br>271                         }<br>272                         else {<br>273                           student.crouse.put(str1, grade);<br>274                           holder.searth(str1).grade.add(grade);<br>275                           holder.searth(str1).pgrade.add(Integer.parseInt(str1));<br>276                           holder.searth(str1).qgrade.add(Integer.parseInt(str1));<br>277                         }<br>278                     } else<br>279                         System.out.println(str1 + " " + str1 + " " + ":" + str1 + " " + "does not exist");<br>280               } else if (Integer.parseInt(str1) > 3 && Integer.parseInt(str1) < 10)//实验<br>281               {<br>282                     int num = Integer.parseInt(str1);<br>283                     int falg = 0;<br>284                     for (int i = 4; i < str1.length; i++) {<br>285                         if (Integer.parseInt(str1) < 0 || Integer.parseInt(str1) > 100)<br>286                           falg++;<br>287                     }<br>288                     if (falg == 0) {<br>289                         if (holder.searth(str1) != null) {<br>290                           String stuid = str1;<br>291                           String sname = str1;<br>292                           int grade = 0;<br>293                           if (str1.length == 4 + num) {<br>294                                 for (int i = 4; i < 4 + num; i++) {<br>295                                     grade += Integer.parseInt(str1);<br>296                                 }<br>297                                 grade = grade / 4;<br>298                                 Student student = null;<br>299                                 for (Student s:holder.slist)<br>300                                 {<br>301                                     if(s.name.equals(sname))<br>302                                     {<br>303                                       student = s;<br>304                                       break;<br>305                                     }<br>306                                 }<br>307                                 String cid = stuid.substring(0, 6);<br>308                                 Class cla = null;<br>309                                 for (Class c : holder.Clist) {<br>310                                     if (c.cid.equals(cid)) {<br>311                                       cla = c;<br>312                                       break;<br>313                                     }<br>314                                 }<br>315                                 if (cla == null) {<br>316                                     cla = new Class(cid);<br>317                                     holder.Clist.add(cla);<br>318                                 }<br>319                                 if(student==null) {<br>320                                     student = new Student(stuid,sname);<br>321                                     student.crouse.put(str1, grade);<br>322                                     cla.students.add(student);<br>323                                     holder.slist.add(student);<br>324                                     holder.searth(str1).grade.add(grade);<br>325                                 }<br>326                                 else {<br>327                                     student.crouse.put(str1, grade);<br>328                                     holder.searth(str1).grade.add(grade);<br>329                                 }<br>330                           } else {<br>331                                 Student student = new Student(stuid, sname);<br>332                                 String cid = stuid.substring(0, 6);<br>333                                 Class cla = null;<br>334                                 for (Class c : holder.Clist) {<br>335                                     if (c.cid.equals(cid)) {<br>336                                       cla = c;<br>337                                       break;<br>338                                     }<br>339                                 }<br>340                                 if (cla == null) {<br>341                                     cla = new Class(cid);<br>342                                     holder.Clist.add(cla);<br>343                                 }<br>344                                 holder.slist.add(student);<br>345                                 System.out.println(stuid + " " + sname + " " + ": access mode mismatch");<br>346                           }<br>347                         } else<br>348                           System.out.println(str1 + " " + str1 + " " + ":" + str1 + " " + "does not exist");<br>349                     } else System.out.println("wrong format");<br>350               } else<br>351                     System.out.println("wrong format");<br>352             }<br>353             catch (NumberFormatException e)<br>354             {<br>355               System.out.println("wrong format");<br>356             }<br>357         }<br>358 <br>359         holder.slist.sort(Comparator.comparing(s -> s.id));<br>360         for(Student student:holder.slist)<br>361         {<br>362             if(student.crouse.isEmpty())<br>363             {<br>364               System.out.println(student.id+" "+student.name+" "+"did not take any exams");<br>365             }<br>366             elseSystem.out.println(student.id+" "+student.name+" "+student.averagegrade());<br>367         }<br>368 <br>369         Collator collator = Collator.getInstance();<br>370         holder.clist.sort(Comparator.comparing(c -> c.name, collator));<br>371         for(Crouse crouse:holder.clist)<br>372         {<br>373             if(crouse.grade.isEmpty())<br>374             {<br>375               System.out.println(crouse.name+" "+"has no grades yet");<br>376             }<br>377             else if(crouse.nature.equals("选修")&&crouse.fangshi.equals("考察"))<br>378               System.out.println(crouse.name+" "+crouse.average()+" "+crouse.average());<br>379             else if(crouse.nature.equals("选修")&&crouse.fangshi.equals("考试"))<br>380               System.out.println(crouse.name+" "+crouse.average1()+" "+crouse.average2()+" "+crouse.average());<br>381             else if(crouse.nature.equals("必修"))<br>382               System.out.println(crouse.name+" "+crouse.average1()+" "+crouse.average2()+" "+crouse.average());<br>383             else if(crouse.nature.equals("实验"))<br>384               System.out.println(crouse.name+" "+crouse.average());<br>385         }<br>386         holder.Clist.sort(Comparator.comparing(c -> c.cid));<br>387         for(Class c:holder.Clist)<br>388         {<br>389             int falg=0;<br>390             for (Student s: c.students)<br>391             {<br>392               if(s.averagegrade()==0)<br>393               {<br>394                     falg++;<br>395               }<br>396             }<br>397             if(falg==c.students.size())<br>398             {<br>399               System.out.println(c.cid+" "+ "has no grades yet");<br>400             }<br>401             else<br>402               System.out.println(c.cid+" "+c.average());<br>403         }<br>404   }<br>405 }  Crouse类表示课程,包含课程名称、课程性质、考核方式以及成绩列表。Student类表示学生,包含学号、姓名和课程成绩的映射关系。Class类表示班级,包含班级号和学生列表。我用了一个holder类储存课程链表、成绩链表、以及班级链表,进而在Main类中通过循环输出课程的平均成绩、学生的平均成绩、班级的平均成绩以及对无成绩的情况输出。<br>该代码的类图如下:<br>https://img2023.cnblogs.com/blog/3294162/202312/3294162-20231207101741608-717636633.png<br> <br>用source moniter分析圈复杂度情况如下:<br>https://img2023.cnblogs.com/blog/3294162/202312/3294162-20231207102258321-110632842.png<br>从圈复杂度以及代码深度分析图可以看出,我的代码最大复杂性为91,平均复杂度为10.90,根据基维亚特图可以看出我的代码复杂度较高,平均运行时间长。<br> <br>PTA第八次作业<br><br> <br>7-2 课程成绩统计程序-3分数 64全屏浏览题目切换布局作者 蔡轲单位 南昌航空大学课程成绩统计程序-3在第二次的基础上修改了计算总成绩的方式,<br>要求:修改类结构,将成绩类的继承关系改为组合关系,成绩信息由课程成绩类和分项成绩类组成,课程成绩类组合分项成绩类,分项成绩类由成绩分值和权重两个属性构成。<br>完成课程成绩统计程序-2、3两次程序后,比较继承和组合关系的区别。思考一下哪一种关系运用上更灵活,更能够适应变更。<br>题目最后的参考类图未做修改,大家根据要求自行调整,以下内容加粗字体显示的内容为本次新增的内容。<br>某高校课程从性质上分为:必修课、选修课、实验课,从考核方式上分为:考试、考察、实验。<br>考试的总成绩由平时成绩、期末成绩分别乘以权重值得出,比如平时成绩权重0.3,期末成绩权重0.7,总成绩=平时成绩*0.3+期末成绩*0.7。<br>考察的总成绩直接等于期末成绩<br>实验的总成绩等于课程每次实验成绩乘以权重后累加而得。<br>课程权重值在录入课程信息时输入。(注意:所有分项成绩的权重之和应当等于1)<br>必修课的考核方式必须为考试,选修课可以选择考试、考察任一考核方式。实验课的成绩必须为实验。<br>1、输入:<br>包括课程、课程成绩两类信息。<br>课程信息包括:课程名称、课程性质、考核方式、分项成绩数量、每个分项成绩的权重。<br>考试课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+平时成绩的权重+英文空格+期末成绩的权重<br>考察课信息格式:课程名称+英文空格+课程性质+英文空格+考核方式<br>实验课程信息格式:课程名称+英文空格+课程性质+英文空格+考核方式+英文空格+分项成绩数量n+英文空格+分项成绩1的权重+英文空格+。。。+英文空格+分项成绩n的权重<br>实验次数至少4次,不超过9次<br>课程性质输入项:必修、选修、实验<br>考核方式输入选项:考试、考察、实验<br>考试/考查课程成绩信息包括:学号、姓名、课程名称、平时成绩(可选)、期末成绩<br>考试/考查课程成绩信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+平时成绩+英文空格+期末成绩<br>实验课程成绩信息包括:学号、姓名、课程名称、每次成绩{在系列-2的基础上去掉了(实验次数),实验次数要和实验课程信息中输入的分项成绩数量保持一致}<br>实验课程信息格式:学号+英文空格+姓名+英文空格+课程名称+英文空格+第一次实验成绩+...+英文空格+最后一次实验成绩<br>以上信息的相关约束:<br>1)成绩是整数,不包含小数部分,成绩的取值范围是【0,100】<br>2)学号由8位数字组成<br>3)姓名不超过10个字符<br>4)课程名称不超过10个字符<br>5)不特别输入班级信息,班级号是学号的前6位。<br>2、输出:<br>输出包含三个部分,包括学生所有课程总成绩的平均分、单门课程总成绩平均分、班级所有课程总成绩平均分。<br>为避免四舍五入误差,<br>计算单个成绩时,分项成绩乘以权重后要保留小数位,计算总成绩时,累加所有分项成绩的权重分以后,再去掉小数位。<br>学生总成绩/整个班/课程平均分的计算方法为累加所有符合条件的单个成绩,最后除以总数。<br>1)学生课程总成绩平均分按学号由低到高排序输出<br>格式:学号+英文空格+姓名+英文空格+总成绩平均分<br>如果某个学生没有任何成绩信息,输出:学号+英文空格+姓名+英文空格+"did not take any exams"<br>2)单门课程成绩按课程名称的字符顺序输出<br>课程成绩输出格式:课程名称+英文空格+总成绩平均分<br>如果某门课程没有任何成绩信息,输出:课程名称+英文空格+"has no grades yet"<br>3)班级所有课程总成绩平均分按班级由低到高排序输出<br>格式:班级号+英文空格+总成绩平均分<br>如果某个班级没有任何成绩信息,输出:班级名称+英文空格+ "has no grades yet"<br>异常情况:<br>1)如果解析某个成绩信息时,课程名称不在已输入的课程列表中,输出:学号+英文空格+姓名+英文空格+":"+课程名称+英文空格+"does not exist"<br>2)如果解析某个成绩信息时,输入的成绩数量和课程的考核方式不匹配,输出:学号+英文空格+姓名+英文空格+": access mode mismatch"<br>以上两种情况如果同时出现,按第一种情况输出结果。<br>3)如果解析某个课程信息时,输入的课程性质和课程的考核方式不匹配,输出:课程名称+" : course type & access mode mismatch"<br>4)格式错误以及其他信息异常如成绩超出范围等,均按格式错误处理,输出"wrong format"<br>5)若出现重复的课程/成绩信息,只保留第一个课程信息,忽略后面输入的。<br>6)如果解析实验课程信息时,输入的分项成绩数量值和分项成绩权重的个数不匹配,输出:课程名称+" : number of scores does not match"<br>7)如果解析考试课、实验课时,分项成绩权重值的总和不等于1,输出:课程名称+" : weight value error"<br>信息约束:<br>1)成绩平均分只取整数部分,小数部分丢弃<br>参考类图(与第一次相同,其余内容自行补充):<br>https://images.ptausercontent.com/18cbcefd-ca7d-4d8e-a0ac-f99f761ded15.png<br>输入样例1:<br><br>在这里给出一组输入。例如:<br>java 实验 实验 4 0.2 0.3 0.2 0.3<br>end<br>输出样例1:<br><br>在这里给出相应的输出。例如:<br>java has no grades yet<br>输入样例2:<br><br>在这里给出一组输入。例如:<br>java 实验 实验 4 0.2 0.3 0.2<br>end<br>输出样例2:<br><br>在这里给出相应的输出。例如:<br>java : number of scores does not match<br>输入样例3:<br><br>在这里给出一组输入。例如:<br>java 实验 实验 4 0.2 0.3 0.2 0.1<br>end<br>输出样例3:<br><br>在这里给出相应的输出。例如:<br>java : weight value error<br>输入样例4:<br><br>在这里给出一组输入。例如:<br>java 实验 实验 4 0.2 0.3 0.2 0.3<br>20201116 张三 java 70 80 90 100<br>end<br>输出样例4:<br><br>在这里给出相应的输出。例如:<br>20201116 张三 86<br>java 86<br>202011 86<br>输入样例5:<br><br>在这里给出一组输入。例如:<br>java 实验 实验 4 0.2 0.3 0.2 0.3<br>20201116 张三 java 70 80 90 100 80<br>end<br>输出样例5:<br><br>在这里给出相应的输出。例如:<br>20201116 张三 : access mode mismatch<br>20201116 张三 did not take any exams<br>java has no grades yet<br>202011 has no grades yet<br><br>这道题目是对课程成绩统计程序-2的升级,主要添加了实验课的成绩权重部分,将原来的平均模式改为了加权平均算法,并且改成了在课程信息中输入实验次数及权重,修改<br>了一部分输入输出以及错误的输出。<br>我的代码如下:<br>https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gifhttps://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif1 import java.util.*;<br>2 import java.text.*;<br>3 public class Main {<br>4   public static void main(String[] args) {<br>5         Scanner scanner = new Scanner(System.in);<br>6         Input_Format inputFormat = new Input_Format();//输入<br>7         Output_Format outputFormat = new Output_Format();//输出<br>8         Data_storage data_storage = new Data_storage();<br>9         while (inputFormat.isEnd){<br> 10             String inputLine = scanner.nextLine();<br> 11             if(inputLine.equals("end")){<br> 12               inputFormat.isEnd = false;<br> 13               break;<br> 14             }<br> 15             inputFormat.inputProcessing(inputLine,data_storage);<br> 16         }<br> 17         PersonOverride student1 = new PersonOverride();<br> 18         outputFormat.outputProcessing(data_storage);<br> 19         outputFormat.output_all(data_storage);<br> 20   }<br> 21 }<br> 22 class Calculate_grades {<br> 23   int stu_all_grades(Data_storage data_storage,String num){//单个学生总课程平均分计算返回一个分数 1)<br> 24         int count =0;//这个学生有几门课<br> 25         int sum = 0;<br> 26         for (Map.Entry<String, Score> entry : data_storage.stu__st_cour.get(num).gradeMap.entrySet()) {<br> 27             Score value = entry.getValue();<br> 28             if(Integer.parseInt(value.total_scores)>=0) {<br> 29               count++;<br> 30               sum += Integer.parseInt(value.total_scores);<br> 31             }<br> 32         }<br> 33         if(count!=0)<br> 34             return sum/count;<br> 35         else<br> 36             return -100;//没有参加任何考试<br> 37   }<br> 38   int[] single_course_grades(Data_storage data_storage,String name){ //2) 课程名<br> 39         int count = 0;<br> 40         int[] aver_grade = new int;//0:平时成绩 1:期末考试 2:总分平均<br> 41         for (Map.Entry<String, StudentsAll_mes> e : data_storage.stu__st_cour.entrySet()) {//遍历选课类:num-选课类<br> 42             StudentsAll_mes value = e.getValue();<br> 43             for (Map.Entry<String, Score> entry : value.gradeMap.entrySet()) {//遍历选课类:course.name-Score<br> 44               String key1 = entry.getKey();<br> 45               Score value1 = entry.getValue();<br> 46               if (key1.equals(name)) {<br> 47                     if(Integer.parseInt(value1.total_scores)>=0) {//总分为- 说明算成绩无效<br> 48                         count++;<br> 49                         aver_grade += Integer.parseInt(value1.total_scores);<br> 50                         if (value1 instanceof Test_Score) {<br> 51                           if (Integer.parseInt(value1.total_scores) >= 0) {<br> 52                                 aver_grade += Integer.parseInt(((Test_Score) value1).normal_score);<br> 53                                 aver_grade += Integer.parseInt(((Test_Score) value1).end_score);<br> 54                           }<br> 55                         } else if (value1 instanceof Inspect_Score){<br> 56                           if (Integer.parseInt(value1.total_scores) >= 0) {<br> 57                                 aver_grade = -100;//不需要平时成绩<br> 58                                 aver_grade += Integer.parseInt(((Inspect_Score) value1).end_score);<br> 59                           }<br> 60                         }else if(value1 instanceof Lab_Score){<br> 61                           if(Integer.parseInt(value1.total_scores)>=0){<br> 62                                 aver_grade = -100;<br> 63                                 aver_grade += aver_grade += Integer.parseInt(value1.total_scores);<br> 64                           }<br> 65                         }<br> 66                     }<br> 67               }<br> 68             }<br> 69         }<br> 70         if(count!=0) {<br> 71             for (int i = 0; i < 3; i++) {<br> 72               aver_grade = aver_grade / count;<br> 73             }<br> 74         }else {<br> 75             for (int i = 0; i < 3; i++) {<br> 76               aver_grade = -100;<br> 77             }<br> 78         }<br> 79         return aver_grade;<br> 80   }<br> 81   int Class_grades(Data_storage data_storage,String num){//3)<br> 82         int sum = 0;<br> 83         int count = 0;<br> 84         for (Map.Entry<String, Student> mapEntry : data_storage.classes.get(num).students.entrySet()) {//班级号-Student类<br> 85             Student value = mapEntry.getValue();//遍历这个班级的所有学生<br> 86             for (Map.Entry<String, StudentsAll_mes> e : data_storage.stu__st_cour.entrySet()) {//stu_num-选课类<br> 87               String key1 = e.getKey();//遍历学生的选课类 学号<br> 88               StudentsAll_mes value1 = e.getValue();<br> 89               if (key1.equals(value.num)) {//选课类中 跟输入的学号一样<br> 90                     for (Map.Entry<String, Score> entry : value1.gradeMap.entrySet()) {//该num所有成绩遍历<br> 91                         Score gra = entry.getValue();<br> 92                         if(Integer.parseInt(gra.total_scores)>=0) {//有效才算<br> 93                           sum += Integer.parseInt(gra.total_scores);<br> 94                           count++;<br> 95                         }<br> 96                     }<br> 97               }<br> 98             }<br> 99         }<br>100         if(count!=0)<br>101             return sum/count;<br>102         else<br>103             return -100;<br>104   }<br>105   void final_score(Data_storage data_storage,String num){//计算没门课的成绩 学号<br>106         data_storage.stu__st_cour.get(num).gradeMap.forEach((key,value)->{//学号成绩<br>107             if(value instanceof Test_Score&&((Test_Score) value).normal_score.matches("\\d+")&&((Test_Score) value).end_score.matches("\\d+")) {<br>108               double tem = ((Test_Course) data_storage.courses.get(key)).normal_weight*Integer.parseInt(((Test_Score) value).normal_score);<br>109               double tem1 = ((Test_Course) data_storage.courses.get(key)).end_weight*Integer.parseInt(((Test_Score) value).end_score);<br>110               value.total_scores = String.valueOf((int)(tem+tem1));<br>111             }else if(value instanceof Inspect_Score&&((Inspect_Score) value).end_score.matches("\\d+")){<br>112               value.total_scores = ((Inspect_Score) value).end_score;<br>113             }else if(value instanceof Lab_Score&&((Lab_Score) value).lab_num.matches("\\d+")){<br>114               float sum = 0;<br>115               int i=0;<br>116               for (Integer score : ((Lab_Score) value).scores) {<br>117                     sum+= score* ((Lab_Course) data_storage.courses.get(key)).weights.get(i);<br>118                     i++;<br>119               }<br>120               value.total_scores = String.valueOf((int)sum);<br>121             }<br>122         });<br>123   }<br>124 }<br>125 class PersonOverride {<br>126   private String name;<br>127   private int age;<br>128   private boolean gender;<br>129 <br>130   public PersonOverride() {<br>131         this("default", 1, true);<br>132   }<br>133 <br>134   public PersonOverride(String name, int age, boolean gender) {<br>135         this.name = name;<br>136         this.age = age;<br>137         this.gender = gender;<br>138   }<br>139 <br>140   @Override<br>141   public String toString() {<br>142         return name + "-" + age + "-" + gender;<br>143   }<br>144 }<br>145 class Class {<br>146   String num;<br>147   TreeMap<String, Student> students = new TreeMap<>(); //班级里的学生 学号 学生<br>148   Class(String num){<br>149         this.num = num;<br>150   }<br>151 }<br>152 class Course {<br>153   String type;<br>154   String test_way;<br>155   String name;<br>156   Course(String name,String type, String test_way){<br>157         this.type = type;<br>158         this.name = name;<br>159         this.test_way = test_way;<br>160   }<br>161 }<br>162 class Inspect_Course extends Course{<br>163   Inspect_Course(String name, String type, String test_way) {<br>164         super(name, type, test_way);<br>165   }<br>166 }<br>167 <br>168 class Test_Course extends Course{<br>169   double normal_weight;<br>170   double end_weight;<br>171 <br>172   Test_Course(String name, String type, String test_way,String normal_weight,String end_weight) {<br>173         super(name, type, test_way);<br>174         this.normal_weight = Float.parseFloat(normal_weight);<br>175         this.end_weight = Float.parseFloat(end_weight);<br>176   }<br>177 }<br>178 class Lab_Course extends Course{<br>179   int sub_scores_num;<br>180   ArrayList<Float> weights = new ArrayList<>();<br>181   Lab_Course(String name, String type, String test_way,String line) {<br>182         super(name, type, test_way);<br>183         String[] lines = line.split(" ");<br>184         sub_scores_num = Integer.parseInt(lines);<br>185         for(int i=4;i<lines.length; i++){<br>186             weights.add(Float.parseFloat(lines));<br>187         }<br>188   }<br>189 }<br>190 class Data_storage {<br>191   TreeMap<String , Course> courses;//课程k:课程名 v:课程<br>192   TreeMap<String, Class> classes = new TreeMap<>();//班级 k:班级号V:班级<br>193   TreeMap<String, StudentsAll_mes> stu__st_cour;//选课类学生类结合 k:学号 v:选课类<br>194   InAndOut_put output = new InAndOut_put();<br>195   Data_storage(){<br>196         //学生和选课类结合<br>197         stu__st_cour = new TreeMap<>(Data_storage::compare);//重写排序<br>198         courses = new TreeMap<>(Data_storage::compare);<br>199   }<br>200 <br>201   private static int compare(String o1, String o2) {<br>202 <br>203         try {<br>204             Comparator<Object> comparator = Collator.getInstance(Locale.CHINA);<br>205             if (comparator.compare(o1, o2) < 0) {<br>206               return -1;<br>207             } else if (comparator.compare(o1, o2) > 0) {<br>208               return 1;<br>209             }<br>210         } catch (Exception ignored) {<br>211         }<br>212         return 0;<br>213   }<br>214 <br>215   void setInspectCourses(String name, String type, String test_way){<br>216         if(!courses.containsKey(name)) {<br>217             courses.put(name, new Inspect_Course(name, type, test_way));<br>218         }<br>219   }<br>220   void setTestCourses(String name, String type, String test_way,String normal_weight, String end_weight){<br>221         if(!courses.containsKey(name)) {<br>222             courses.put(name, new Test_Course(name, type, test_way,normal_weight, end_weight));<br>223         }<br>224   }<br>225   void setLabCourses(String name, String type, String test_way,String line){<br>226         if(!courses.containsKey(name)) {<br>227             courses.put(name, new Lab_Course(name, type, test_way,line));<br>228         }<br>229   }<br>230   void setClasses(String num){<br>231         if(!classes.containsKey(num)) {<br>232             classes.put(num, new Class(num));<br>233         }<br>234   }<br>235   void setStudents(String clas_num, String name, String num){//班级号 姓名 学号<br>236         if(classes.containsKey(clas_num)){<br>237             if(!classes.get(clas_num).students.containsKey(num))<br>238               classes.get(clas_num).students.put(num,new Student(name,num));<br>239         }<br>240   }<br>241   void setStu__st_courAndMap(String num,String course,String normal_score,String end_score){//添加选课类学生姓名 课程名称 分数<br>242         if(!stu__st_cour.containsKey(num)){<br>243             stu__st_cour.put(num,new StudentsAll_mes(num,course,normal_score,end_score));<br>244         }<br>245         else{<br>246             stu__st_cour.get(num).setGradeMap(course,normal_score,end_score);<br>247         }<br>248   }<br>249   void setStu__st_courAndMap(String num,String course,String end_score){<br>250         if(!stu__st_cour.containsKey(num)){<br>251             stu__st_cour.put(num,new StudentsAll_mes(num,course,end_score));<br>252         }<br>253         else{<br>254             stu__st_cour.get(num).setGradeMap(course,end_score);<br>255         }<br>256   }<br>257   void set_lab_grades(String stu_num,String course,String lab_num,String grades){<br>258         ArrayList<Integer> scores = new ArrayList<>();<br>259         String[] tem = grades.split(" ");<br>260         for(int i=3;i<tem.length;i++){<br>261             if(tem.matches("\\d+"))<br>262               scores.add(Integer.parseInt(tem));<br>263         }<br>264         if(!stu__st_cour.containsKey(stu_num)){<br>265             StudentsAll_mes tem_stu_mes = new StudentsAll_mes();<br>266             tem_stu_mes.set_lab_stu_mes(stu_num,course,lab_num,scores);<br>267             stu__st_cour.put(stu_num,tem_stu_mes);<br>268         }else{<br>269             stu__st_cour.get(stu_num).set_lab_gradeMap(course,lab_num,scores);<br>270         }<br>271   }<br>272 }<br>273 class Input_Format {<br>274   String regex_c_test = "^[\\u4e00-\\u9fa5a-zA-Z0-9]{1,10}\\s(必修|选修)\\s考试\\s((0.\\d{1,2})|(1-9?))\\s((0.\\d{1,2})|(1-9?))$";<br>275   String regex_c_inspect = "[\\u4e00-\\u9fa5a-zA-Z0-9]{1,10}\\s选修\\s考察$";<br>276   String regex_c_lab = "^[\\u4e00-\\u9fa5a-zA-Z0-9 ]{1,10}\\s实验\\s实验\\s\\s((0.\\d{1,2})|(1-9?))(\\s((0.\\d{1,2})|(1-9?))){3,9}$";<br>277   String regex_CS = "^\\d{8}\\s+[\\u4e00-\\u9fa5a-zA-Z0-9]{1,10}\\s+[\\u4E00-\\u9FA5A-Za-z0-9]{1,10}\\s*((100)|(\\d{1,2})|(0))?\\s+((100)|(\\d{1,2})|(0))$";<br>278   String regex_lab = "^\\d{8}\\s[\\u4e00-\\u9fa5a-zA-Z0-9]{1,10}\\s[\\u4e00-\\u9fa5a-zA-Z0-9 ]{1,10}\\s((100)|(\\d)|\\d)(\\s((100)|(\\d)|\\d)){2,9}$";<br>279   boolean isEnd = true;//结束标志<br>280   String[] strings;<br>281   void inputProcessing(String line,Data_storage data_storage) {<br>282         lineProcessing(line);//分割<br>283         data_storage.output.add_input(line);//存储<br>284         if(line.matches(regex_c_inspect)){<br>285             data_storage.setInspectCourses(strings,strings,strings);<br>286         }else if(line.matches(regex_c_lab)){<br>287             data_storage.setLabCourses(strings,strings,strings,line);<br>288         }else if(line.matches(regex_c_test)){<br>289             data_storage.setTestCourses(strings,strings,strings,strings,strings);//成绩信息<br>290         } else if(line.matches(regex_CS)||line.matches(regex_lab)){<br>291             data_storage.setClasses(strings.substring(0,6));<br>292             data_storage.setStudents(strings.substring(0, 6), strings, strings);//学生的添加<br>293             if (data_storage.courses.containsKey(strings)) {//课程里有这个课<br>294               if (data_storage.courses.get(strings).type.equals("选修")) {//<br>295                     if (data_storage.courses.get(strings).test_way.equals("考试")&&strings.length == 5) {<br>296                         data_storage.setStu__st_courAndMap(strings, strings, strings, strings);<br>297                     }else if(data_storage.courses.get(strings).test_way.equals("考察")&&strings.length==4){<br>298                         data_storage.setStu__st_courAndMap(strings, strings, strings);<br>299                     } else {<br>300                         data_storage.setStu__st_courAndMap(strings, strings, "no access", "no access");<br>301                     }<br>302               } else if (data_storage.courses.get(strings).type.equals("必修")) {//<br>303                     if (strings.length == 5) {<br>304                         data_storage.setStu__st_courAndMap(strings, strings, strings,strings);<br>305                     } else {//无效<br>306                         data_storage.setStu__st_courAndMap(strings, strings, "no access", "no access");<br>307                     }<br>308               } else if(data_storage.courses.get(strings).type.equals("实验")){<br>309                     if(strings.length == 3+((Lab_Course) data_storage.courses.get(strings)).sub_scores_num){<br>310                         data_storage.set_lab_grades(strings,strings, String.valueOf(((Lab_Course) data_storage.courses.get(strings)).sub_scores_num),line);<br>311                     }else{<br>312                         data_storage.set_lab_grades(strings,strings,"num error","no access");<br>313                     }<br>314               }<br>315             }else{<br>316               data_storage.setStu__st_courAndMap(strings, strings, "not exist");<br>317             }<br>318         }<br>319   }<br>320   void lineProcessing(String line){<br>321         strings = line.split(" ");<br>322   }<br>323 }<br>324 class Inspect_Score extends Score{<br>325   String end_score;<br>326   Inspect_Score(String end_score) {<br>327         this.end_score = end_score;<br>328   }<br>329 }<br>330 classOutput_Format {<br>331   Calculate_grades calculate = new Calculate_grades();<br>332   String regex_c_test = "^[\\u4e00-\\u9fa5a-zA-Z0-9]{1,10}\\s(必修|选修|实验)\\s(考试|考察|实验)\\s((\\d{1,2})|(1-9?))\\s((\\d{1,2})|(1-9?))$";<br>333   String regex_c_test_e = "^[\\u4e00-\\u9fa5a-zA-Z0-9]{1,10}\\s(必修|选修|实验)\\s(考试|考察|实验)\\s((0.\\d{1,2})|(1-9?))\\s((0.\\d{1,2})|(1-9?))$";<br>334   String regex_c_inspect = "[\\u4e00-\\u9fa5a-zA-Z0-9]{1,10}\\s(必修|选修|实验)\\s(考试|考察|实验)$";<br>335   String regex_c_lab = "^[\\u4e00-\\u9fa5a-zA-Z0-9]{1,10}\\s(必修|选修|实验)\\s(考试|考察|实验)\\s\\s((0.\\d{1,2})|(1-9?))(\\s((0.\\d{1,2})|(1-9?))){1,10}$";<br>336   String regex_CS = "^\\d{8}\\s+[\\u4e00-\\u9fa5a-zA-Z0-9]{1,10}\\s+[\\u4e00-\\u9fa5a-zA-Z0-9]{1,10}\\s*((100)|(\\d{1,2})|(0))?\\s+((100)|(\\d{1,2})|(0))$";<br>337   String regex_lab = "^\\d{8}\\s[\\u4e00-\\u9fa5a-zA-Z0-9]{1,10}\\s[\\u4e00-\\u9fa5a-zA-Z0-9]{1,10}\\s((100)|(\\d)|\\d)(\\s((100)|(\\d)|\\d)){1,20}$";<br>338   void outputProcessing(Data_storage data) {<br>339         data.classes.forEach((num,Class)-> Class.students.forEach((name, student)-> calculate.final_score(data,student.num)));<br>340         for(String i:data.output.input){<br>341             String[] tem = i.split(" ");<br>342             if(i.matches(regex_c_test_e)||i.matches(regex_c_test)||i.matches(regex_c_inspect)||i.matches(regex_c_lab)){<br>343               if(tem.equals("必修")&&(tem.equals("考察")||tem.equals("实验"))){<br>344                     data.output.add_output(tem + " : course type & access mode mismatch");<br>345               }else if(tem.equals("实验")&&!tem.equals("实验")) {<br>346                     data.output.add_output(tem + " : course type & access mode mismatch");<br>347               }else if(tem.equals("选修")&&tem.equals("实验")) {<br>348                     data.output.add_output(tem + " : course type & access mode mismatch");<br>349               }<br>350               if(tem.equals("实验")&&tem.equals("实验")) {<br>351                     if(tem.length-4>=4&&tem.length - 4<=9) {<br>352                         if (Integer.parseInt(tem) != tem.length - 4) {<br>353                           data.output.add_output(tem + " : number of scores does not match");<br>354                           data.courses.remove(tem);<br>355                           continue;<br>356                         }<br>357                         float tem_weight = 0;<br>358                         for (int j = 4; j < tem.length; j++) {<br>359                           tem_weight += Float.parseFloat(tem);<br>360                         }<br>361                         if (Math.abs(tem_weight - 1) > 0.0001) {<br>362                           data.output.add_output(tem + " : weight value error");<br>363                           data.courses.remove(tem);<br>364                           continue;<br>365                         }<br>366                     }else{<br>367                         try {<br>368                           if (Integer.parseInt(tem) != tem.length - 4) {<br>369                                 data.output.add_output(tem + " : number of scores does not match");<br>370                                 data.courses.remove(tem);<br>371                                 continue;<br>372                           }<br>373                         } catch (Exception ignored) {<br>374 <br>375                         }<br>376                     }<br>377               }if((tem.equals("必修")||tem.equals("选修"))&&tem.equals("考试")){<br>378                     if(tem.length-3==2) {<br>379                         float tem_weight = Float.parseFloat(tem) + Float.parseFloat(tem);<br>380                         if (Math.abs(tem_weight - 1) > 0.0001) {<br>381                           data.output.add_output(tem + " : weight value error");<br>382                           data.courses.remove(tem);<br>383                         }<br>384                     }<br>385               }<br>386             }else if(i.matches(regex_CS)||i.matches(regex_lab)) {<br>387               if(!data.courses.containsKey(tem)){//不存在<br>388                     data.output.add_output(tem+" does not exist");<br>389                     data.stu__st_cour.get(tem).gradeMap.remove(tem);<br>390               }else{<br>391                     if(data.courses.get(tem).type.equals("必修") && tem.length!=5) {//必修 但是只有期末成绩<br>392                         data.output.add_output(tem+" "+tem+" : access mode mismatch");<br>393                     }else if(data.courses.get(tem).type.equals("选修")) {<br>394                         if ((data.courses.get(tem).test_way.equals("考试") && tem.length != 5) ||<br>395                                 (data.courses.get(tem).test_way.equals("考察") && tem.length != 4))<br>396                           data.output.add_output(tem + " " + tem + " : access mode mismatch");<br>397                     }else if(data.courses.get(tem).type.equals("实验")){<br>398                         if(data.courses.get(tem).test_way.equals("实验")&&(tem.length-3<4||tem.length-3>9||tem.length-3!=((Lab_Course) data.courses.get(tem)).sub_scores_num))<br>399                           data.output.add_output(tem + " " + tem + " : access mode mismatch");<br>400                     }<br>401               }<br>402             }else if(!i.equals("end")){<br>403               data.output.add_output("wrong format");<br>404             }<br>405         }<br>406         data.classes.forEach((cla_num,Class1)->{//遍历所有班级<br>407             Class1.students.forEach((stu_num,student)->{<br>408               int tem=calculate.stu_all_grades(data,stu_num);<br>409               if(tem>=0)<br>410                     data.output.add_output(stu_num+" "+Class1.students.get(stu_num).name+" "+tem);<br>411               else<br>412                     data.output.add_output(stu_num+" "+Class1.students.get(stu_num).name+" "+"did not take any exams");<br>413             });<br>414         });<br>415         data.courses.forEach((key,value)-> {<br>416             int[] tem = calculate.single_course_grades(data, key);<br>417             if (tem < 0 && tem < 0 && tem < 0) {//三个为- 则没成绩<br>418               data.output.add_output(key + " has no grades yet");<br>419             }else {<br>420               if (value.type.equals("选修") || value.type.equals("必修") || value.type.equals("实验")) {<br>421                     data.output.add_output(key + " " + tem);<br>422               }<br>423             }<br>424         });<br>425         data.classes.forEach((num,Class)->{<br>426             int tem = calculate.Class_grades(data,num);<br>427             if(tem>=0) {<br>428               data.output.add_output(num + " " + tem);<br>429             }else<br>430               data.output.add_output(num+" has no grades yet");<br>431         });<br>432   }<br>433   void output_all(Data_storage data){<br>434         data.output.output.forEach(System.out::println);<br>435   }<br>436 }<br>437 abstract class Score {<br>438   String total_scores = "-100";<br>439 }<br>440 class Student {<br>441   String name;<br>442   String num;<br>443   Student(String name, String num) {<br>444         this.name = name;<br>445         this.num = num;<br>446   }<br>447 }<br>448 class StudentsAll_mes {<br>449   String num;//学生<br>450   TreeMap<String,Score> gradeMap =new TreeMap<>();<br>451   StudentsAll_mes(String stu_name, String course, String normal_score,String test_score){<br>452         this.num = stu_name;<br>453         gradeMap.put(course,new Test_Score(normal_score,test_score));<br>454   }<br>455   StudentsAll_mes(String stu_name, String course, String test_score){<br>456         this.num = stu_name;<br>457         gradeMap.put(course,new Inspect_Score(test_score));<br>458   }<br>459 <br>460   public StudentsAll_mes() {<br>461 <br>462   }<br>463   void set_lab_stu_mes(String stu_num,String course,String lab_num,ArrayList<Integer> scores){<br>464         this.num = stu_num;<br>465         gradeMap.put(course,new Lab_Score(lab_num,scores));<br>466   }<br>467   void set_lab_gradeMap(String course,String lab_num,ArrayList<Integer> scores){<br>468         if(!gradeMap.containsKey(course))<br>469             gradeMap.put(course,new Lab_Score(lab_num,scores));<br>470   }<br>471   void setGradeMap(String course, String normal_score,String test_score){<br>472         if(!gradeMap.containsKey(course))<br>473             gradeMap.put(course, new Test_Score(normal_score,test_score));<br>474   }<br>475   void setGradeMap(String course,String test_score){<br>476         if(!gradeMap.containsKey(course))<br>477             gradeMap.put(course,new Inspect_Score(test_score));<br>478   }<br>479 }<br>480 class Test_Score extends Score{<br>481   String normal_score;<br>482   String end_score;<br>483   Test_Score(String normal_score,String end_score) {<br>484         this.normal_score = normal_score;<br>485         this.end_score = end_score;<br>486   }<br>487 }<br>488 class Lab_Score extends Score {<br>489   String lab_num;//试验次数<br>490   ArrayList<Integer> scores;<br>491   Lab_Score(String lab_num,ArrayList<Integer> scores){<br>492         this.lab_num = lab_num;<br>493         this.scores = scores;<br>494   }<br>495 }<br>496 class InAndOut_put {<br>497   List<String> output = new ArrayList<>();<br>498   List<String> input = new ArrayList<>();<br>499   void add_output(String out){<br>500         output.add(out);<br>501   }<br>502   void add_input(String out){<br>503         input.add(out);<br>504   }<br>505 }课程成绩统计程序-3  <br>我的代码中的主要类和功能如下:<br><br>[*]Main类:包含程序的入口方法main,用于接收用户输入、处理数据和输出结果。<br>[*]Data_storage类:用于存储数据,包括课程、班级和学生的信息,以及学生的成绩。<br>[*]Input_Format类:用于处理用户输入的数据,并根据输入的格式解析和存储相关信息。<br>[*]Output_Format类:用于对数据进行计算和格式化输出,包括计算学生平均成绩、课程平均成绩和班级平均成绩等。<br>[*]Calculate_grades类:用于计算学生、课程和班级的平均成绩。<br>[*]Class类:表示一个班级,包含班级号和学生信息。<br>[*]Course类及其子类:表示一个课程,包含课程名称、类型和考试方式等信息。<br>[*]Score类及其子类:表示学生的成绩,包括平时成绩、期末考试成绩和总分成绩等。<br>代码通过读取用户输入的数据,解析并存储到相应的数据结构中。然后根据存储的数据进行成绩计算和格式化输出。其中,成绩计算部分涉及单个学生总课程平均分计算、单门课程成绩计算和班级平均成绩计算。<br>主要类图如下:<br><img src="https://img2023.cnblogs.com/blog/3294162/202312/3294162-20231207105356150-2034783289.png" alt="">  从类图可以看出本次代码非常复杂,我彻底改变了课程程序统计程序-2的逻辑结构,改变了原来的输入输出读取方式以及字符匹配模式。<br>本次代码的圈复杂度如下:<br>https://img2023.cnblogs.com/blog/3294162/202312/3294162-20231207110032448-1722047403.png<br>   从这个图可以看出,本次代码虽然类很多,但是结构比第二次作业要清晰,代码深度较高,平均的复杂度以及选择分支减少,减少了内存开销。<br>期末考试<br><br>7-1 立体图形问题分数 10全屏浏览题目切换布局作者 段喜龙单位 南昌航空大学编程求得正方体和正三棱锥的表面积和体积,要求必须体现扩展性(继承)和多态性。<br>类结构如下图所示(参考):<br>https://images.ptausercontent.com/7f398454-1b66-4a50-933c-b4e902e9080e.png<br>试编程完成如上类设计,主方法源码如下(可直接拷贝使用):<br> public static void main(String[] args) {<br>    // TODO Auto-generated method stub<br>    Scanner input = new Scanner(System.in);<br>    double side = input.nextDouble();<br>      <br>    display(new Cube(side));<br>    display(new RegularPyramid(side));<br>}<br>其中,display(Solid solid)方法为定义在Main类中的静态方法,作用为体现程序的多态性。<br>注:正三棱锥的体积计算公式为底面积*高/3。<br>输入格式:<br><br>输入一个实型数,分别作为正方体的边长和正三棱锥的边长。<br>输出格式:<br><br>分别输出正方体的表面积、体积以及正棱锥的表面积和体积。保留两位小数,建议使用String.format(“%.2f”,value)<br>进行小数位数控制。<br><br>输入样例:<br><br>在这里给出一组输入。例如:<br>2.5<br>输出样例:<br><br>在这里给出相应的输出。例如:<br>37.50<br>15.63<br>10.83<br>1.84<br>这个题目难度不大,主要在于三棱锥的体积与表面积的计算方法以及截断整数那里让我修改了一次。<br>我的代码如下:<br>import java.util.Scanner;<br><br>abstract class Solid {<br>    protected double side;<br><br>    public Solid(double side) {<br>      this.side = side;<br>    }<br><br>    public abstract double getSurfaceArea();<br><br>    public abstract double getVolume();<br>}<br><br>class Cube extends Solid {<br>    public Cube(double side) {<br>      super(side);<br>    }<br><br>    public double getSurfaceArea() {<br>      return 6 * Math.pow(side, 2);<br>    }<br><br>    public double getVolume() {<br>      return Math.pow(side, 3);<br>    }<br>}<br><br>class RegularPyramid extends Solid {<br>    public RegularPyramid(double side) {<br>      super(side);<br>    }<br><br>    public double getSurfaceArea() {<br>      return Math.pow(side, 2) *Math.sqrt(3);<br>    }<br><br>    public double getVolume() {<br>      return Math.pow(side, 3) / (6 * Math.sqrt(2));<br>    }<br>}<br><br>public class Main {<br>    public static void main(String[] args) {<br>      Scanner input = new Scanner(System.in);<br>      double side = input.nextDouble();<br><br>      display(new Cube(side));<br>      display(new RegularPyramid(side));<br>    }<br><br>    public static void display(Solid solid) {<br>      System.out.println(String.format("%.2f", solid.getSurfaceArea()));<br>      System.out.println(String.format("%.2f", solid.getVolume()));<br>    }<br>}  <br><br>[*]Solid是一个抽象类,表示几何体,包含一个受保护的成员变量side表示边长,以及两个抽象方法getSurfaceArea()和getVolume()用于计算几何体的表面积和体积。<br>[*]Cube是Solid的子类,表示立方体,通过继承Solid类并实现抽象方法来计算立方体的表面积和体积。<br>[*]RegularPyramid也是Solid的子类,表示正四面体,同样通过继承Solid类并实现抽象方法来计算正四面体的表面积和体积。<br>[*]Main类包含了程序的入口方法main,在该方法中使用Scanner类获取用户输入的边长,然后创建一个立方体和一个正四面体对象,并调用display方法显示它们的表面积和体积。<br>[*]display方法接受一个Solid类型的参数,根据传入的具体几何体对象调用相应的方法来显示它们的表面积和体积。<br>本次代码的行数以及结构很清晰明了,在此不贴出其类图及复杂度分析。<br>问题描述:本问题中的魔方有两种,一种是正方体魔方,一种是正三棱锥魔方,其中,正方体或正三棱锥魔方是由单元正方体或正三棱锥组成,单元正方体或正三棱锥的个数由阶数(即层数)决定,即魔方边长=阶数*单元边长。魔方如下图所示:<br>https://images.ptausercontent.com/3657a4e0-5b66-4567-ac6c-62731d7c3748.png<br> 利用“立体图形”问题源码,实现如下功能:<br>魔方有三个属性:颜色,阶数,类型(正方体魔方、正三棱锥魔方),程序要求输出魔方的颜色、表面积和体积。参考设计类图如下所示:<br>https://images.ptausercontent.com/d72c0e02-0001-4e75-bab2-ee639180525f.png<br>主方法部分可参考如下源码(可拷贝直接使用):<br><br> public class Main {    public static void main(String[] args) {      // TODO Auto-generated method stub      Scanner input = new Scanner(System.in);                String color = input.next();      int layer = input.nextInt();      double side = input.nextDouble();                        RubikCube cube1 = new SquareCube(color, layer,new Cube(side));                         color = input.next();      layer = input.nextInt();      side = input.nextDouble();                RubikCube cube2 = new RegularPyramidCube(color, layer,new RegularPyramid(side));      display(cube1);      display(cube2);    }}<br>其中,display(RubikCube cube)方法为Main类中定义的静态方法,用户输出魔方的信息,用于体现多态性。<br>输入格式:<br><br>第一部分:正方体魔方颜色、阶数、单元正方体边长,以空格或回车分隔;<br>第二部分:正三棱锥魔方颜色、阶数、单元正三棱锥边长,以空格或回车分隔。<br>输出格式:<br><br>正方体魔方颜色<br>正方体魔方表面积<br>正方体魔方体积<br>正三棱锥魔方颜色<br>正三棱锥魔方表面积<br>正三棱锥魔方体积<br>注:小数点保留两位<br>输入样例:<br><br>在这里给出一组输入。例如:<br>red 3 4.5black 4 2.1<br>输出样例:<br><br>在这里给出相应的输出。例如:<br>red
1093.50
2460.38
black
122.21
69.85这道题目只需要在第一道的基础上略微修改计算方式以及添加抽象魔方类即可解决。<br>代码如下:<br>https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gifhttps://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gifimport java.util.Scanner;

abstract class Solid {
    protected double side;

    public Solid(double side) {
      this.side = side;
    }

    public abstract double getSurfaceArea();

    public abstract double getVolume();
}

class Cube extends Solid {
    public Cube(double side) {
      super(side);
    }

    public double getSurfaceArea() {
      return 6 * Math.pow(side, 2);
    }

    public double getVolume() {
      return Math.pow(side, 3);
    }
}

class RegularPyramid extends Solid {
    public RegularPyramid(double side) {
      super(side);
    }

    public double getSurfaceArea() {
      return Math.pow(side, 2) *Math.sqrt(3);
    }

    public double getVolume() {
      return Math.pow(side, 3) / (6 * Math.sqrt(2));
    }
}

abstract class RubikCube {
    protected String color;
    protected int layer;
    protected Solid solid;

    public RubikCube(String color, int layer, Solid solid) {
      this.color = color;
      this.layer = layer;
      this.solid = solid;
    }

    public String getColor() {
      return color;
    }

    public abstract double getSurfaceArea();

    public abstract double getVolume();
}

class SquareCube extends RubikCube {
    public SquareCube(String color, int layer, Solid solid) {
      super(color, layer, solid);
    }

    public double getSurfaceArea() {
      return 6 * Math.pow(layer * solid.side, 2);
    }

    public double getVolume() {
      return Math.pow(layer * solid.side, 3);
    }
}

class RegularPyramidCube extends RubikCube {
    public RegularPyramidCube(String color, int layer, Solid solid) {
      super(color, layer, solid);
    }

    public double getSurfaceArea() {
      return layer * layer * solid.getSurfaceArea();
    }

    public double getVolume() {
      return layer * layer * layer * solid.getVolume();
    }
}

public class Main {
    public static void main(String[] args) {
      Scanner input = new Scanner(System.in);

      String color = input.next();
      int layer = input.nextInt();
      double side = input.nextDouble();

      RubikCube cube1 = new SquareCube(color, layer, new Cube(side));

      color = input.next();
      layer = input.nextInt();
      side = input.nextDouble();

      RubikCube cube2 = new RegularPyramidCube(color, layer, new RegularPyramid(side));
      display(cube1);
      display(cube2);
    }

    public static void display(RubikCube cube) {
      System.out.println(cube.getColor());
      System.out.println(String.format("%.2f", cube.getSurfaceArea()));
      System.out.println(String.format("%.2f", cube.getVolume()));
    }
}View Code<br><br>[*]RubikCube是一个抽象类,表示魔方,包含颜色、层数和几何体对象的信息。它继承自Solid类,并实现了抽象方法getSurfaceArea()和getVolume()来计算魔方的表面积和体积。<br>[*]SquareCube是RubikCube的子类,表示正方体魔方。通过继承RubikCube类并实现抽象方法来计算正方体魔方的表面积和体积。<br>[*]RegularPyramidCube也是RubikCube的子类,表示正四面体魔方。同样通过继承RubikCube类并实现抽象方法来计算正四面体魔方的表面积和体积。<br>在Main类中,除了之前的功能外,添加了用户输入魔方的颜色、层数和边长。根据用户输入创建一个正方体魔方对象和一个正四面体魔方对象,并调用display方法显示它们的颜色、表面积和体积。<br>display方法接受一个RubikCube类型的参数,根据传入的魔方对象调用相应的方法来显示它们的颜色、表面积和体积。<br>7-3 魔方排序问题分数 20全屏浏览题目切换布局作者 段喜龙单位 南昌航空大学在魔方问题的基础上,重构类设计,实现列表内魔方的排序功能(按照魔方的体积进行排序)。<br>提示:题目中RubikCube类要实现Comparable接口。<br>其中,Main类源码如下(可直接拷贝使用):<br> 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 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("");      }                }    }<br>输入格式:<br><br>输入魔方类型(1:正方体魔方;2:正三棱锥魔方;0:结束输入)<br>魔方颜色、魔方阶数、魔方单元正方体、正三棱锥边长<br>..循环..<br>输出格式:<br><br>按魔方体积升序输出列表中各魔方的信息(实型数均保留两位小数),输出样式参见输出样例。<br>输入样例:<br><br>在这里给出一组输入。例如:<br>1 blue 3 4.52 red 4 2.11 yellow 5 2.32 black 4 9.421 white 4 5.44230<br>输出样例:<br><br>在这里给出相应的输出。例如:<br>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这道题目是在魔方问题的基础上,对用户输入的魔方数据的表面和体积进行排序。<br>我的代码如下:<br>https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gifhttps://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gifimport java.util.Scanner;
import java.util.ArrayList;
import java.util.Comparator;
abstract class Solid {
    protected double side;

    public Solid(double side) {
      this.side = side;
    }

    public abstract double getSurfaceArea();

    public abstract double getVolume();
}

class Cube extends Solid {
    public Cube(double side) {
      super(side);
    }

    public double getSurfaceArea() {
      return 6 * Math.pow(side, 2);
    }

    public double getVolume() {
      return Math.pow(side, 3);
    }
}

class RegularPyramid extends Solid {
    public RegularPyramid(double side) {
      super(side);
    }

    public double getSurfaceArea() {
      return Math.pow(side, 2) *Math.sqrt(3);
    }

    public double getVolume() {
      return Math.pow(side, 3) / (6 * Math.sqrt(2));
    }
}

abstract class RubikCube implements Comparable<RubikCube> {
    protected String color;
    protected int layer;
    protected Solid solid;

    public RubikCube(String color, int layer, Solid solid) {
      this.color = color;
      this.layer = layer;
      this.solid = solid;
    }

    public String getColor() {
      return color;
    }

    public abstract double getSurfaceArea();

    public abstract double getVolume();

    @Override
    public int compareTo(RubikCube other) {
      return Double.compare(this.getVolume(), other.getVolume());
    }
}
class SquareCube extends RubikCube {
    public SquareCube(String color, int layer, Solid solid) {
      super(color, layer, solid);
    }

    public double getSurfaceArea() {
      return 6 * Math.pow(layer * solid.side, 2);
    }

    public double getVolume() {
      return Math.pow(layer * solid.side, 3);
    }
}

class RegularPyramidCube extends RubikCube {
    public RegularPyramidCube(String color, int layer, Solid solid) {
      super(color, layer, solid);
    }

    public double getSurfaceArea() {
      return layer * layer * solid.getSurfaceArea();
    }

    public double getVolume() {
      return layer * layer * layer * solid.getVolume();
    }
}

public class Main {
    public static void main(String[] args) {
      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).getSurfaceArea()) + " " +
      String.format("%.2f", list.get(i).getVolume()) );
            System.out.println("");
      }            
    }   
}View Code这段代码中的类包括:<br><br>[*]Solid:抽象基类,表示一个立体,包含边长属性和计算表面积和体积的抽象方法。<br>[*]Cube:继承自Solid,表示一个立方体,实现了计算表面积和体积的方法。<br>[*]RegularPyramid:继承自Solid,表示一个正四面体,实现了计算表面积和体积的方法。<br>[*]RubikCube:抽象基类,表示一个魔方,包含颜色、层数和实际立体对象的属性,以及计算表面积和体积的抽象方法和比较方法。<br>[*]SquareCube:继承自RubikCube,表示一个立方体魔方,实现了计算表面积和体积的方法。<br>[*]RegularPyramidCube:继承自RubikCube,表示一个金字塔魔方,实现了计算表面积和体积的方法。<br>[*]Main:主类,包含main方法,用于接收用户输入、创建魔方对象、进行排序和打印结果。<br>用户可以通过输入数字选择魔方类型(1表示立方体魔方,2表示金字塔魔方),然后依次输入颜色、层数和边长。输入0表示结束输入。<br>最后,程序将根据魔方的体积对魔方列表进行排序,并打印每个魔方的颜色、表面积和体积。<br>我的代码的类图如下:<br>https://img2023.cnblogs.com/blog/3294162/202312/3294162-20231207111741545-1573540301.png<br> <br>在原来的魔方问题代码上,我添加了用户选择立体类型以及排序输出部分。<br><br>7-4 销售步枪问题(附加题)分数 10全屏浏览题目切换布局作者 段喜龙单位 南昌航空大学前亚利桑那州境内的一位步枪销售商销售密苏里州制造的步枪机(lock)、枪托(stock)和枪管(barrel)。枪机卖45美元,枪托卖30美元,枪管卖25美元。销售商每月至少要售出一支完整的步枪,且生产限额是销售商在一个月内可销售70个枪机、80个枪托和90个枪管。<br>根据每个月的销售情况,计算销售商的佣金(提成)算法如下:<br><br>[*]不到(含)1000美元的部分为10%;<br>[*]1000(含)~1800美元的部分为15%;<br>[*]超过1800美元的部分为20%。<br>佣金程序生成月份销售报告,汇总销售商的销售总额和佣金。<br>编程要求:必须符合面向对象编程,且保证类设计的单一职责模式,使用面向过程编程判定0分。<br>提示:可以设置一个销售订单类。参考类图如下:<br>https://images.ptausercontent.com/99407ef9-a430-480a-9970-a1a6919639de.png<br>输入格式:<br><br>输入销售商每个月售出枪机、枪托、枪管的数量,可以用空格或者回车分隔。<br>输出格式:<br><br>分别输出销售商在该月的销售额和佣金,中间用空格分开。<br>输入样例1:<br><br>在这里给出一组输入。例如:<br>30 40 50<br>输出样例1:<br><br>在这里给出相应的输出。例如:<br>3800.00 620.00<br>输入样例2:<br>在这里给出一组输入。例如:<br>88 56 98<br>输出样例2:<br>在这里给出相应的输出。例如:<br>Wrong Format<br><br>这是一道简单的题目,我的代码如下:import java.util.Scanner;class SalesOrder {    private int lockCount;    private int stockCount;    private int barrelCount;    private static final int LOCK_PRICE = 45;    private static final int STOCK_PRICE = 30;    private static final int BARREL_PRICE = 25;    public SalesOrder(int lockCount, int stockCount, int barrelCount) {      if ((lockCount > 70 || stockCount > 80 || barrelCount > 90)||(lockCount
页: [1]
查看完整版本: 面向对象程序设计第三次bolg