面向對象java前三次pta作業

来源:https://www.cnblogs.com/zw-1/archive/2023/10/07/17747003.html
-Advertisement-
Play Games

基於java校園課程作業管理系統設計與實現,可適用於班級管理、學生管理、教師管理、課程管理、課程信息管理、學生選課管理、作業佈置管理、作業提交管理、作業評分管理、課程評價管理、課程資源管理,作業管理系統,大學提交作業,佈置作業管理系統,學校作業管理系統等等 ...


目錄:

1、前言

2、設計與分析

3、踩坑心得

4、主要困難及改進建議

5、總結

 

1、前言

面向對象程式設計(Object-Oriented Programming,簡稱OOP)是一種編程範式,它以對象作為程式的基本單元,將數據和操作封裝在一起。面向對象程式設計的基本概念包括類、對象、繼承、多態等。

  • 類(Class)是面向對象程式設計的基本構建塊,它是一種抽象的數據類型,用於描述具有相同屬性和行為的對象的集合。類定義了對象的屬性(成員變數)和行為(方法)。

  • 對象(Object)是類的實例化結果,它是具體的、有狀態的實體。對象可以根據類的定義,擁有自己的屬性值,並能執行類中定義的方法。

  • 繼承(Inheritance)是一種機制,允許在已有類的基礎上創建新類,新類可以繼承和擴展已有類的屬性和方法。繼承能夠提供代碼的重用性和層次化的組織結構。

  • 多態(Polymorphism)是指同一類型的對象在不同的情況下可以表現出不同的行為。多態性可以通過繼承和介面實現,使得程式可以根據上下文選擇合適的方法。

面向對象程式設計的優點包括代碼的可重用性、可擴展性、易維護性和模塊化等。它提供了一種更加靈活和抽象的編程方式,使得程式的設計和實現更加清晰和可管理。在前三次的作業中我主要使用了創建類和對象的知識,並未涉及到繼承和多態的有關知識的運用。

第一次作業主要是一些java基礎語法的應用,較為簡單的輸入輸出應用,if-else、switch、while語句等迴圈、選擇語句的應用,第一次作業體量大,但是難度低,比較重視我們的基礎訓練;

第二次作業開始接觸封裝的思想,題目主要針對於類以及對象的創建和應用、java自帶的API的熟悉、各種類的運用,題目量大,難度也提高了許多;

第三次作業題量減少許多,相對難度是三次作業中最大的,其中關於類的創建和運用對於現在的我來說略感複雜。

2、設計與分析

第一次作業:

總體分析:這次作業主要設計到java語言的簡單輸入輸出、字元串匹配、迴圈、選擇語句的運用,其中對類的應用並不複雜。

類圖如下:

 

7-1 身體質量指數(BMI)測算---------使用了簡單的scanner類輸入,經過簡單的選擇語句,即可得出正確答案

7-2 長度質量計量單位換算-----------主要是精度之間的轉換,針對基本語法的考察,也不難

7-3 NCHU_奇數求和---------掌握演算法,經過簡單if-else語句,即可累加得出答案

7-4 NCHU_房產稅費計算---------這道題只需要註意單位轉換,輸入和輸出一一對應,與上面的難度相當

7-5 游戲角色選擇----------這道題需要用到switch選擇語句,可以減少複雜度。

7-6 NCHU_學號識別-----------這道題需要用到string類的有關方法,如substring、equals等來匹配學號的對應位數字

7-8 NCHU_巴比倫法求平方根近似值------運用math類的abs方法求絕對值,即可求出

7-9 二進位數值提取-------這道題主要用到了string類的charAt來獲取字元串的某一位字元,來匹配二進位的0、1,進而判斷

7-7 判斷三角形類型-----------題目如下:

輸入三角形三條邊,判斷該三角形為什麼類型的三角形。

輸入格式:

在一行中輸入三角形的三條邊的值(實型數),可以用一個或多個空格或回車分隔,其中三條邊的取值範圍均為[1,200]。

輸出格式:

(1)如果輸入數據非法,則輸出“Wrong Format”;
(2)如果輸入數據合法,但三條邊不能構成三角形,則輸出“Not a triangle”;
(3)如果輸入數據合法且能夠成等邊三角形,則輸出“Equilateral triangle”;
(3)如果輸入數據合法且能夠成等腰直角三角形,則輸出“Isosceles right-angled triangle”;
(5)如果輸入數據合法且能夠成等腰三角形,則輸出“Isosceles triangle”;
(6)如果輸入數據合法且能夠成直角三角形,則輸出“Right-angled triangle”;
(7)如果輸入數據合法且能夠成一般三角形,則輸出“General triangle”。

 

在這道題的解題過程中,我遇到一個始終過不去的測試點,就是那個等腰直角三角形的判斷,我的演算法是既符合等腰三角形的兩邊相等,又符合a的平方+b的平方=c的平方,但是始終無法通過這個測試點,後來經過網路查詢,我想到或許是因為電腦對於無理數的輸出不夠準確,於是我把其判斷條件改成了a*a+b*b-c*c<0.0001,這樣縮小了精度,但是可能更符合電腦的對於無理數的處理,再次嘗試就通過了測試點。

第二次作業:

第二次針對類的創建和應用開始接觸的更加深入,面向對象的封裝思想也在逐漸被使用,主要是數組和類的應用。

7-1 成績計算-1-類、數組的基本運用-------題目如下:

創建學生類,包含

屬性:學號(String)、姓名(String)、語文成績(int)、數學成績(int)、物理成績(int)

方法:計算總分、計算平均分

輸入5個學生的信息,將每個學生的信息封裝在一個學生對象中。

按輸入順序依次輸出5個學生的總分、平均分(精確到小數點後兩位,捨去部分按四捨五入規則計入最後一位)。

分析:這道題目開始接觸數據封裝思想,需要用學生類來封裝學生的對應信息。

7-2 成績計算-2-關聯類--------題目如下:

創建成績類,包含:

屬性:平時成績(int)、期末成績(int)

方法:計算總成績(計算規則:平時成績*0.4+期末成績*0.6,保留整數部分,小數部分直接丟棄)

創建學生類,包含:

屬性:學號(String)、姓名(String)、語文成績(成績類)、數學成績(成績類)、物理成績(成績類)

方法:計算總分、計算平均分

輸入3個學生的信息,將每個學生的信息封裝在一個學生對象中。

按輸入順序依次輸出3個學生的總分、平均分(精確到小數點後兩位,捨去部分按四捨五入規則計入最後一位)。

分析:這道題涉及兩個類的創建和數據的封裝,創建一個學生類、一個成績類關聯解題

這兩道題目類圖相同:

這兩道題目對我而言難度不是很大,我寫的代碼行數也較短,在此不贅述其代碼複雜度。

在第二次作業中值得一提的是題目是7-7 菜單計價程式-1------題目如下:

某飯店提供4種菜,每種菜品的基礎價格如下:
西紅柿炒蛋 15
清炒土豆絲 12
麻婆豆腐 12
油淋生菜 9

設計點菜計價程式,根據輸入的訂單,計算並輸出總價格。
訂單由一條或多條點菜記錄組成,每條記錄一行,最後以"end"結束
每條點菜記錄包含:菜名、份額兩個信息。
份額可選項包括:1、2、3,分別代表小、中、大份)

不同份額菜價的計算方法:
小份菜的價格=菜品的基礎價格。
中份菜的價格=菜品的基礎價格1.5。
小份菜的價格=菜品的基礎價格
2。
如果計算出現小數,按四捨五入的規則進行處理。

參考以下類的模板進行設計:
菜品類:對應菜譜上一道菜的信息。
Dish {
String name;//菜品名稱
int unit_price; //單價
int getPrice(int portion)//計算菜品價格的方法,輸入參數是點菜的份額(輸入數據只能是1/2/3,代表小/中/大份)
}

菜譜類:對應菜譜,包含飯店提供的所有菜的信息。
Menu {
Dish[] dishs ;//菜品數組,保存所有菜品信息
Dish searthDish(String dishName)//根據菜名在菜譜中查找菜品信息,返回Dish對象。
}

點菜記錄類:保存訂單上的一道菜品記錄
Record {
Dish d;//菜品
int portion;//份額(1/2/3代表小/中/大份)
int getPrice()//計價,計算本條記錄的價格
}

訂單類:保存用戶點的所有菜的信息。
Order {
Record[] records;//保存訂單上每一道的記錄
int getTotalPrice()//計算訂單的總價
Record addARecord(String dishName,int portion)
//添加一條菜品信息到訂單中。
}

輸入格式:

每條點菜記錄的格式:
菜名+空格(英文)+份額
註:份額可輸入(1/2/3), 1代表小份,2代表中份,3代表大份。
最後一條記錄以“end”結束。

輸出格式:

訂單上所有菜品的總價(整數數值),每份菜
如果訂單中包含不能識別的菜名,則在總價之前輸出“** does not exist”,**是不能識別的菜名

在這裡附上我的代碼:

class Dish {
String name;
int unit_price;

public Dish(String name, int unit_price) {
this.name = name;
this.unit_price = unit_price;
}

public int getPrice(int portion) {
double price;

if (portion == 1) {
price = unit_price;
} else if (portion == 2) {
price = unit_price * 1.5;
} else if (portion == 3) {
price = unit_price * 2;
} else {
throw new IllegalArgumentException("Invalid portion: " + portion);
}

return (int) Math.round(price);
}
}

class Menu {
Dish[] dishes;

public Menu(Dish[] dishes) {
this.dishes = dishes;
}

public Dish searchDish(String dishName) {
for (Dish dish : dishes) {
if (dish.name.equals(dishName)) {
return dish;
}
}
return null;
}
}

class Record {
Dish dish;
int portion;

public Record(Dish dish, int portion) {
this.dish = dish;
this.portion = portion;
}

public int getPrice() {
return dish.getPrice(portion);
}
}

class Order {
Record[] records;
int size;

public Order(int capacity) {
records = new Record[capacity];
size = 0;
}

public void addARecord(String dishName, int portion) {
Dish dish = MenuHolder.menu.searchDish(dishName);
if (dish != null) {
Record record = new Record(dish, portion);
records[size] = record;
size++;
} else {
System.out.println(dishName + " does not exist");
}
}

public int getTotalPrice() {
int totalPrice = 0;
for (int i = 0; i < size; i++) {
totalPrice += records[i].getPrice();
}
return totalPrice;
}
}

class MenuHolder {
static Menu menu;
static {
Dish[] dishes = new Dish[4];
dishes[0] = new Dish("西紅柿炒蛋", 15);
dishes[1] = new Dish("清炒土豆絲", 12);
dishes[2] = new Dish("麻婆豆腐", 12);
dishes[3] = new Dish("油淋生菜", 9);
menu = new Menu(dishes);
}
}
public class Main {
public static void main(String[] args) {
Order order = new Order(10);
java.util.Scanner scanner = new java.util.Scanner(System.in);
while (true) {
String input = scanner.nextLine().trim();

if (input.equalsIgnoreCase("end")) {
break;
}
String[] parts = input.split(" ");
if (parts.length == 2) {
String dishName = parts[0];
int portion = Integer.parseInt(parts[1]);

order.addARecord(dishName, portion);
} else {
System.out.println(input);
}
}

System.out.println( order.getTotalPrice());

scanner.close();
}
}

用power designer生成類圖如下:

 

用source monitor 分析代碼結果如下:

 

分析:

1、在dish類中記錄菜名、菜品的基礎價格,以及通過用戶輸入份額來計算菜品價格的方法。

2、在menu類裡面定義了dish類的一個菜品數組來記錄該餐廳有的菜品。

3、在record類裡面記錄客人的記錄情況,每輸入一道菜品的名字和價格視為一次記錄。

4、在order類裡面,用來記錄訂單情況,定義了一個record類的數組,定義了添加記錄的方法。

5、在MenuHolder類裡面保存了現有的菜品及其基礎價格。

這道題主要難在類的關聯以及調用方法實現題目所需的功能,我在做的時候遇到了很多問題,例如對record類和order類的定義和使用方法不太清楚,故而在跟蹤調試的時候產生了很多問題,有幾個測試點的輸出跟需求不符,在經過網路查詢後,對order類的對象進行了改變,從而得出正確答案。

第三次作業:

這次作業主要著重於時間類、面向對象編程封裝數據、string類、arraylist類的應用。

7-2 課程成績統計程式-1------題目如下:

某高校課程從性質上分為:必修課、選修課,從考核方式上分為:考試、考察。

考試的總成績由平時成績、期末成績分別乘以權重值得出,比如平時成績權重0.3,期末成績權重0.7,總成績=平時成績*0.3+期末成績*0.7。

考察的總成績直接等於期末成績

必修課的考核方式必須為考試,選修課可以選擇考試、考察任一考核方式。

1、輸入:

包括課程、課程成績兩類信息。

課程信息包括:課程名稱、課程性質、考核方式(可選,如果性質是必修課,考核方式可以沒有)三個數據項。

課程信息格式:課程名稱+英文空格+課程性質+英文空格+考核方式

課程性質輸入項:必修、選修

考核方式輸入選項:考試、考察

課程成績信息包括:學號、姓名、課程名稱、平時成績(可選)、期末成績

課程信息格式:學號+英文空格+姓名+英文空格+課程名稱+英文空格+平時成績+英文空格+期末成績

以上信息的相關約束:

1)平時成績和期末成績的權重預設為0.3、0.7

2)成績是整數,不包含小數部分,成績的取值範圍是【0,100】

3)學號由8位數字組成

4)姓名不超過10個字元

5)課程名稱不超過10個字元

6)不特別輸入班級信息,班級號是學號的前6位。

2、輸出:

輸出包含三個部分,包括學生所有課程總成績的平均分、單門課程成績平均分、單門課程總成績平均分、班級所有課程總成績平均分。

為避免誤差,平均分的計算方法為累加所有符合條件的單個成績,最後除以總數。

1)學生課程總成績平均分按學號由低到高排序輸出

格式:學號+英文空格+姓名+英文空格+總成績平均分

如果某個學生沒有任何成績信息,輸出:學號+英文空格+姓名+英文空格+"did not take any exams"

2)單門課程成績平均分分為三個分值:平時成績平均分(可選)、期末考試平均分、總成績平均分,按課程名稱的字元順序輸出

格式:課程名稱+英文空格+平時成績平均分+英文空格+期末考試平均分+英文空格+總成績平均分

如果某門課程沒有任何成績信息,輸出:課程名稱+英文空格+"has no grades yet"

3)班級所有課程總成績平均分按班級由低到高排序輸出

格式:班級號+英文空格+總成績平均分

如果某個班級沒有任何成績信息,輸出:班級名稱+英文空格+ "has no grades yet"

異常情況:

1)如果解析某個成績信息時,課程名稱不在已輸入的課程列表中,輸出:學號+英文空格+姓名+英文空格+":"+課程名稱+英文空格+"does not exist"

2)如果解析某個成績信息時,輸入的成績數量和課程的考核方式不匹配,輸出:學號+英文空格+姓名+英文空格+": access mode mismatch"

以上兩種情況如果同時出現,按第一種情況輸出結果。

3)如果解析某個課程信息時,輸入的課程性質和課程的考核方式不匹配,輸出:課程名稱+" : course type & access mode mismatch"

4)格式錯誤以及其他信息異常如成績超出範圍等,均按格式錯誤處理,輸出"wrong format"

5)若出現重覆的課程/成績信息,只保留第一個課程信息,忽略後面輸入的。

信息約束:

1)成績平均分只取整數部分,小數部分丟棄

題目類圖如下:

 

 我的代碼如下:

import java.text.Collator;
import java.util.*;

public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String information = input.nextLine();
ParseInput handle = new ParseInput();
while (!information.equals("end"))
{
handle.parseInput(information);
information = input.nextLine();
}
handle.showStudents();
handle.showCourses();
handle.showClasses();}
private static double calculateDuplication1(String input1, String input2) {
Set<Character> set1 = new HashSet<>();
Set<Character> set2 = new HashSet<>();

for (char c : input1.toCharArray()) {
if (Character.isLetterOrDigit(c)) {
set1.add(c);
}
}

for (char c : input2.toCharArray()) {
if (Character.isLetterOrDigit(c)) {
set2.add(c);
}
}
Set<Character> intersection = new HashSet<>(set1);
intersection.retainAll(set2);
double duplication = (double) intersection.size() / set1.size() * 100;

return duplication;
}
private static double calculateDuplication2(String input1, String input2) {
Set<Character> set1 = new HashSet<>();
Set<Character> set2 = new HashSet<>();

for (char c : input1.toCharArray()) {
if (Character.isLetterOrDigit(c)) {
set1.add(c);
}
}

for (char c : input2.toCharArray()) {
if (Character.isLetterOrDigit(c)) {
set2.add(c);
}
}
Set<Character> intersection = new HashSet<>(set1);
intersection.retainAll(set2);
double duplication = (double) intersection.size() / set1.size() * 100;

return duplication;
}
}
class ParseInput {
ArrayList<Student> listStudent = new ArrayList<>();
ArrayList<Course> listCourse = new ArrayList<>();
ArrayList<Class> listClass = new ArrayList<>();
ArrayList<ChooseCourse> listChooseCourse = new ArrayList<>();

public void parseInput(String str){
InputMatching mat=new InputMatching();
int flag=mat.matchingInput(str);
switch (flag){
case 0:System.out.println("wrong format");
break;
//課程信息
case 1:courseMessage(str);
break;
//成績信息
case 2:gradeMessage(str);
break;
}
}
private static String readInput(Scanner scanner) {
StringBuilder sb = new StringBuilder();
String line;

while (!(line = scanner.nextLine()).equals("end")) {
sb.append(line);
sb.append(System.lineSeparator());
}

return sb.toString();
}

private static double calculateDuplication(String input1, String input2) {
Set<Character> set1 = new HashSet<>();
Set<Character> set2 = new HashSet<>();

for (char c : input1.toCharArray()) {
if (Character.isLetterOrDigit(c)) {
set1.add(c);
}
}

for (char c : input2.toCharArray()) {
if (Character.isLetterOrDigit(c)) {
set2.add(c);
}
}
Set<Character> intersection = new HashSet<>(set1);
intersection.retainAll(set2);
double duplication = (double) intersection.size() / set1.size() * 100;

return duplication;
}

public void courseMessage(String str) {

String letters[] = str.split(" ");

String courseName = letters[0];
String type = letters[1];
String testType = letters[2];

Course course = new Course(courseName, type, testType);

if (checkCourse(course)) {
if (searchCourse(courseName) == null)
listCourse.add(course);
}

}

public void gradeMessage(String str) {
String letters[] = str.split(" ");

String stuId = letters[0];
String classID = letters[0].substring(0, 6);
String name = letters[1];
String courseName = letters[2];


if (searchClass(classID) == null) {
Class cla = new Class(classID);
listClass.add(cla);
}

Student stu = new Student(classID, stuId, name);
if (!searchStudent(stuId))
listStudent.add(stu);//將學生加入列表中
//課程是否存在
if (searchCourse(courseName) == null) {
System.out.println(courseName + " " + "does not exist");
}
//當課程存在時
else if (searchCourse(courseName) != null) {
Course course = searchCourse(courseName);
//考察
if (letters.length == 4 && course.testType.equals("考察")) {
int finalGrade = Integer.parseInt(letters[3]);
AssessGrade assessGrade = new AssessGrade(finalGrade);
ChooseCourse chooseCourse = new ChooseCourse(course, stu, assessGrade);
if (!searchChooseCourse(name, courseName))
listChooseCourse.add(chooseCourse);
}
//考試
else if (letters.length == 5 && course.testType.equals("考試")) {
int usualGrade = Integer.parseInt(letters[3]);
int finalGrade = Integer.parseInt(letters[4]);
ExamGrade examGrade = new ExamGrade(usualGrade, finalGrade);
ChooseCourse chooseCourse = new ChooseCourse(course, stu, examGrade);
listChooseCourse.add(chooseCourse);
} else {
System.out.println(stuId + " " + name + " " + ": access mode mismatch");
}
}
}
public boolean checkCourse(Course course) {
int flag1, flag2;
switch (course.getType()) {
case "必修":
flag1 = 0;
break;
case "選修":
flag1 = 1;
break;
default:
flag1 = -1;
break;
}
switch (course.getTestType()) {
case "考試":
flag2 = 0;
break;
case "考察":
flag2 = 1;
break;
default:
flag2 = -1;
break;
}
if (flag1 == 0 && flag2 == 0)
return true;
if (flag1 == 1 && (flag2 == 0 || flag2 == 1))
return true;
System.out.println(course.getCourseName() + " : course type & access mode mismatch");
return false;
}

public Class searchClass(String classId) {
for (Class cls : listClass) {
if (cls.getClassId().equals(classId))
return cls;
}
return null;
}

public Course searchCourse(String name) {
for (Course course : listCourse) {
if (course.getCourseName().equals(name))
return course;
}
return null;
}

public boolean searchStudent(String id) {
for (Student stu : listStudent) {
if (stu.getId().equals(id))
return true;
}
return false;
}

//查找是否有重覆選課成績
public boolean searchChooseCourse(String stuName, String courseName) {
for (ChooseCourse cs : listChooseCourse) {
if (cs.student.getStuName().equals(stuName) && cs.course.getCourseName().equals(courseName))
return true;
}
return false;
}

public void showStudents() {
Collections.sort(listStudent);
for (int i = 0; i < listStudent.size(); i++) {
Student stu = listStudent.get(i);
//從總選課表listChooseCourse中獲取該生的選課記錄
ArrayList<ChooseCourse> stuCourseSelects = getStudentSelects(stu.getId());
if (stuCourseSelects.size() != 0) {
System.out.println(stu.getId() + " " + stu.getStuName() + " " + getAvgTotalScore(stuCourseSelects));
} else if (stuCourseSelects.size() == 0) {
System.out.println(stu.getId() + " " + stu.getStuName() + " " + "did not take any exams");
}
}
}

public void showCourses() {
Collections.sort(listCourse);
for (int i = 0; i < listCourse.size(); i++) {
Course course = listCourse.get(i);
ArrayList<ChooseCourse> stuCourseSelects = getCourseSelects(course.getCourseName());
if (stuCourseSelects.size() != 0) {
if (course.testType.equals("考試"))
System.out.println(course.getCourseName() + " " + getAvgUsualScore(stuCourseSelects) + " " + getAvgFinalScore(stuCourseSelects) + " " + getAvgTotalScore(stuCourseSelects));
if (course.testType.equals("考察"))
System.out.println(course.getCourseName() + " " + getAvgFinalScore(stuCourseSelects) + " " + getAvgTotalScore(stuCourseSelects));
} else if (stuCourseSelects.size() == 0) {
System.out.println(course.courseName + " " + "has no grades yet");
}
}
}

public void showClasses() {
Collections.sort(listClass);
for (int i = 0; i < listClass.size(); i++) {
Class cls = listClass.get(i);
ArrayList<ChooseCourse> stuCourseSelects = getClassSelects(cls.getClassId());
if (stuCourseSelects.size() != 0) {
System.out.println(cls.getClassId() + " " + getAvgTotalScore(stuCourseSelects));
} else if (stuCourseSelects.size() == 0) {
System.out.println(cls.getClassId() + " " + "has no grades yet");
}
}
}
public ArrayList<ChooseCourse> getStudentSelects(String id) {
ArrayList<ChooseCourse> choose = new ArrayList<>();
for (ChooseCourse cos : listChooseCourse) {
if (cos.student.getId().equals(id))
choose.add(cos);
}
return choose;
}
public ArrayList<ChooseCourse> getCourseSelects(String courseName) {
ArrayList<ChooseCourse> choose = new ArrayList<>();
for (ChooseCourse cos : listChooseCourse) {
if (cos.course.getCourseName().equals(courseName))
choose.add(cos);
}
return choose;
}
public ArrayList<ChooseCourse> getClassSelects(String clsId) {
ArrayList<ChooseCourse> choose = new ArrayList<>();
for (ChooseCourse cos : listChooseCourse) {
if (cos.student.getClsId().equals(clsId))
choose.add(cos);
}
return choose;
}
public int getAvgFinalScore(ArrayList<ChooseCourse> cs) {
int average = 0;
int sum = 0;
for (ChooseCourse c : cs) {
sum += c.grade.finalGrade;
}
average = sum / cs.size();
return average;
}
}
class ChooseCourse {
Course course;
Student student;
Grade grade;
public ChooseCourse(Course course, Student student, Grade grade) {
this.course = course;
this.student = student;
this.grade = grade;
}
}
class Student implements Comparable<Student> {
String stuName;
String id;
String clsId;
public String getId() {
return id;
}
public String getStuName() {
return stuName;
}
public String getClsId() {
return clsId;
}
public Student(String clsId, String id, String stuName) {
this.clsId = clsId;
this.id = id;
this.stuName = stuName;
}
public int compareTo(Student stu) {
return getId().compareTo(stu.getId());
}
}
class Course implements Comparable<Course> {
String courseName;
String type;
String testType;
public Course() {

}
public Course(String courseName, String type, String testType) {
this.courseName = courseName;
this.type = type;
this.testType = testType;
}
public String getCourseName() {
return courseName;
}
public String getType() {
return type;
}
public String getTestType() {
return testType;
}
}
}

class Class implements Comparable<Class> {
String classId;
public Class() {
}
public String getClassId() {
return classId;
}
public Class(String classId) {
this.classId = classId;
}
@Override
public int compareTo(Class o) {
return getClassId().compareTo(o.getClassId());
}
}
abstract class Grade {
int finalGrade;
public Grade() {
}
public abstract int getUsualGrade();
public abstract int getTotalGrade();
}
class ExamGrade extends Grade {
int usualGrade;
public ExamGrade(int usualGrade, int finalGrade) {
this.usualGrade = usualGrade;
this.finalGrade = finalGrade;
}
public int getUsualGrade() {
return usualGrade;
}
public int getFinalGrade() {
return 0;
}
public int getTotalGrade() {
return (int) (usualGrade * 0.3 + finalGrade * 0.7);
}
}
class InputMatching {
static String stuNumMatching = "[0-9]{8}";
static String stuNameMatching = "\\S{1,10}";
static String scoreMatching = "([1-9]?[0-9]|100)";
static String courseNameMatching = "\\S{1,10}";
static String courseTypeMatching = "(選修|必修)";
static String checkCourseTypeMatching = "(考試|考察)";
static String courseInput = courseNameMatching + " " + courseTypeMatching + " " + checkCourseTypeMatching;
static String scoreInput1 = stuNumMatching + " " + stuNameMatching + " " + courseNameMatching + " " +
scoreMatching;
static String scoreInput2 = stuNumMatching + " " + stuNameMatching + " " + courseNameMatching + " " +
scoreMatching + " " + scoreMatching;
public InputMatching() {
}

public int matchingInput(String s) {

if (matchingCourse(s))
return 1;
if (matchingScore(s))
return 2;
return 0;

}

private static boolean matchingCourse(String s) {
return s.matches(courseInput);
}

private static boolean matchingScore(String s) {
if (s.matches(scoreInput1) || s.matches(scoreInput2))
return true;
return false;
}
}

class AssessGrade extends Grade {
public AssessGrade(int finalGrade) {
this.finalGrade = finalGrade;
}
public int getFinalGrade() {
return finalGrade;
}
@Override
public int getUsualGrade() {
return 0;
}
public int getTotalGrade() {
return finalGrade;
}
}
用SourceMonito分析代碼所得結果如下:

 

分析:在這道題目中用了Arraylist容器來儲存學生類對象和成績類對象,併在其他的類中調用該容器中的對象數據,student類中儲存學生的有關信息,score類中儲存課程信息。

三、踩坑心得:

在這三次作業的解答過程中我遇到了很多問題,現總結如下:

1、在處理判斷等腰直角三角形時,一直沒有那種近似的轉換思想,導致在這個問題上卡了很久,我現在知道該在對應的情況採取最合適的演算法來獲取正確答案。

2、在對字元輸入以及字元多餘空格的處理,我不夠熟練,有兩道題目就是因為字元串後的空格多餘而導致測試點始終過不了,我現在學會了用trim()來消除輸入時的多餘空格,熟練掌握了string類的應用,掌握了string類的很多方法來使字元串符合需求。

3、在創建類時,對於有參構造和無參構造的把握不夠熟練,在面向對象數據封裝那個題目就遇到了卡殼,最後通過查閱資料。才對他們的應用和區別得以區分。

3、在類的關聯以及類之間的相互調用不夠清晰,在處理菜單計價問題以及學生成績問題時,在哪一個類的屬性和對象的調用不夠清楚,經常存在數據類型和數據定義不批撇而導致報錯的情況,例如在order類封裝的是record類的對象,但是上面總是用string類的方法來調用他,得益於idea這款軟體的調試功能才得以解決報錯問題,但是最後還是沒有能完成這道題目,很多測試點沒有能夠通過,關於這道題目代碼我還會繼續修改。

 四、困難及改進建議:

在完成第三次作業時,我明顯感到有些力不從心,對於如何處理輸入的一大段字元串,將其轉化為我所需的內容,這一點需要很多其他類的知識,我還不夠熟練,在7-2 課程成績統計程式-1這道題目裡面體現的尤為明顯,我採用的方法只能通過幾個例子,可能只是幾個普通的例子,但在異常情況以及邊緣情況時考慮不夠完善,並且我寫的代碼很複雜,ifelse語句太多、太冗餘了,導致代碼的圈複雜度很高,代碼利用率低,在解題時只想著能夠通過測試點,卻並未考慮到代碼的複雜度和復用性。

改進建議:我認為可以適當降低難題和複雜的題目的分數,如在第三次作業中占65分的第二道題,如果對這道題目束手無策,就算其他的題目都滿分通過,這次作業也難以及格,所以我認為可以把難題作為優秀學生的挑戰性嘗試,適當提高平均分。

五、總結:

通過完成這三次pta的作業,我對面向對象的基本過程和知識有了一定的瞭解,我掌握了類的構建,如何查詢java自帶的API的應用,常用API的使用,正則表達式的的使用。在一道一道解決題目的過程中,我感受到了面向對象和麵向過程的編程的區別,感受到了面向對象編程在優化代碼結構,排除冗餘代碼塊的方面所具有的巨大作用,並對其產生了更加濃厚的i興趣和更加深入的瞭解。作為沒有接觸過面向對象的新人,在一開始的解題過程中,我還是偏向於C語言式的面向過程,慢慢轉變到面向對象,這個過程不快,導致我有一道題目並未完美解決,在未來我依然會努力加深java的代碼量,對面向對象編程的熟悉。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、數據模型架構規範 1.數據層次的劃分 ODS:Operational Data Store,操作數據層,在結構上其與源系統的增量或者全量數據基本保持一致。它相當於DW數據的一個數據準備區,同時又承擔著基礎數據的記錄以及歷史變化。其主要作用是把基礎數據引入到DMP。 CDM:Common Data ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 下圖這個情景,你是否也遇到過? 當你右鍵點擊網頁上的某個元素時,彈出的菜單被屏幕邊緣遮擋了,導致你無法看清或選擇菜單項? 上圖中右鍵菜單的選項並不是固定不變的,它會根據不同的元素或場景來顯示不同的選項。 也就是說,菜單的內容和大小都是動態 ...
  • eval函數的作用 'eval'函數是javascript中的一個內置函數,它的主要作用是將傳入的字元串作為代碼來執行。換句話說,'eval'可以將動態生成的字元串當作javascript代碼來執行,並返回執行結果。 我的理解就是它可以執行傳入的代碼,並返回執行結果。 為什麼不推薦使用eval 1、 ...
  • 前言 這學期才開始接觸Java,之前只學了C語言,所以一開始寫題目的代碼的時候對Java的眾多函數和語法不是太熟悉,一開始就上手寫代碼有點不適應。 ​ 關於類: 1、類似C中的struct,構造函數、內置方法(函數 )都比較相似 2、儘量避免代碼的重覆,把private和public的方法搞清晰。 ...
  • 環境分類,可以分為 本地環境、測試環境、生產環境等,通過對不同環境配置內容,來實現對不同環境做不同的事情。 AntDesign 項目,通過 config.xxx.ts 添加不同的尾碼來區分配置文件,啟動時候通過尾碼啟動即可。 config.ts : 公共配置 config.xxx.ts:不同環境的差 ...
  • 更新元組 更改元組的值 元組是不可更改的,但有一種變通方法。您可以將元組轉換為列表,更改列表,然後將列表轉換回元組。 示例: x = ("apple", "banana", "cherry") y = list(x) y[1] = "kiwi" x = tuple(y) print(x) 添加項 由 ...
  • #include <graphics.h> #include <iostream> #include <Windows.h> #include <string> #include <conio.h> using namespace std; #define LINE 9 //行數 #define C ...
  • 一、介紹 01.Go 語言的前生今世 二、開發環境搭建 01.Go 語言開發環境搭建 三、初識GO語言 01.Go 多版本管理工具 02.第一個 Go 程式“hello,world“ 與 main 函數 03.Go 常用命令介紹 04.Go 項目代碼佈局 05.探索 GO 項目依賴包管理與Go Mo ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...