OOP题目集6-8作业总结
一、前言
作为一个第一次写博客的萌新,有什么不足请各位佬指正,经过了几周的上课学习,我掌握了Java语言的基本语法,能够开始写一些简单的题目,随着不断的学习,经过这几次题目集的训练,我算是入门了java这门oop。
这三次的题目集的题目集难度逐次提升,题量适中,适合新手来进行训练,在第一次作业里,前面几题简单考察了一下变量定义、赋值、运算、选择分支语句和基本的输入输出等基础知识点,熟悉了一下Java的编程环境之后,就开始考察字符串运算的相关知识点,整体难度不大,但是过程一开始有点折磨,毕竟刚上手写java,ac的道路艰苦。第二次作业一上来感觉难度上了几个层次,前面两道题目直接写一个菜单程序,接着是一个日期的基本使用,最后一道也是一个比较难的动态规划,整体难度对于刚接触oopd的萌新我来说,不可谓不是一个巨大的挑战。第三次作业第一个依旧是爆炸的菜单程序设计,接着两道题目去重要用到set数据结构,接下来的单词统计也是用到了arrays.sort以及set去重,好在有一道简单的分秒转换题目来聊以自慰,最后依旧是日期转换结尾。
二、设计与分析
题目7-2:
某饭店提供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”,**是不能识别的菜名
输入样例:
在这里给出一组输入。例如:
麻婆豆腐 2
西红柿炒蛋 3
end
输出样例:
在这里给出相应的输出。例如:
48
输入样例1:
订单中包含不存在的菜品记录。例如:
麻婆豆腐 2
炒脆肚 2
西红柿炒蛋 3
end
输出样例1:
在这里给出相应的输出。例如:
炒脆肚 does not exist
48
这是我的代码:
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
String[] s=new String[5];
s[1]="西红柿炒蛋";
s[2]="清炒土豆丝";
s[3]="麻婆豆腐";
s[4]="油淋生菜";
String a=input.next();
int size1;
int count=0;
String k="end";
while(a.compareTo(k)!=0){
size1=input.nextInt();
int pd=0;
for(int i=1;i<5;i++){
if(s[i].equals(a))
pd=1;
}
if(pd==0)
System.out.println(a+" does not exist");
else {
if(s[1].equals(a))
{
if(size1==1)
count+=15;
if(size1==2)
count+=Math.ceil(15*1.5);
if(size1==3)
count+=15*2;
}
if(s[2].equals(a))
{
if(size1==1)
count+=12;
if(size1==2)
count+=12*1.5;
if(size1==3)
count+=12*2;
}
if(s[3].equals(a))
{
if(size1==1)
count+=12;
if(size1==2)
count+=12*1.5;
if(size1==3)
count+=12*2;
}
if(s[4].equals(a))
{
if(size1==1)
count+=9;
if(size1==2)
count+=Math.ceil(9*1.5);
if(size1==3)
count+=9*2;
}
}
a=input.next();
}
System.out.println(count);
}
}
这个题目因为是我第一次接触菜单设计,我就按照我自己的想法来写,也因为不熟悉java的类等,这题目我就按照自己写C题目的思路想法,直接暴力来写,幸好这道题目并不是很难,具体写法就如同代码用equal来判断,套几个循环,在写几个判断变量,开一些数组来记录,总之并不复杂。
因为题目7-2题目和7-1差不多,我就不重复剖析了。
接下来继续说第三次题目集的7-1,以下是它的题目:
设计点菜计价程序,根据输入的信息,计算并输出总价格。
输入内容按先后顺序包括两部分:菜单、订单,最后以"end"结束。
菜单由一条或多条菜品记录组成,每条记录一行
每条菜品记录包含:菜名、基础价格 两个信息。
订单分:桌号标识、点菜记录和删除信息、代点菜信息。每一类信息都可包含一条或多条记录,每条记录一行或多行。
桌号标识独占一行,包含两个信息:桌号、时间。
桌号以下的所有记录都是本桌的记录,直至下一个桌号标识。
点菜记录包含:序号、菜名、份额、份数。份额可选项包括:1、2、3,分别代表小、中、大份。
不同份额菜价的计算方法:小份菜的价格=菜品的基础价格。中份菜的价格=菜品的基础价格1.5。小份菜的价格=菜品的基础价格2。如果计算出现小数,按四舍五入的规则进行处理。
删除记录格式:序号 delete
标识删除对应序号的那条点菜记录。
如果序号不对,输出"delete error"
代点菜信息包含:桌号 序号 菜品名称 份额 分数
代点菜是当前桌为另外一桌点菜,信息中的桌号是另一桌的桌号,带点菜的价格计算在当前这一桌。
程序最后按输入的先后顺序依次输出每一桌的总价(注意:由于有代点菜的功能,总价不一定等于当前桌上的菜的价格之和)。
每桌的总价等于那一桌所有菜的价格之和乘以折扣。如存在小数,按四舍五入规则计算,保留整数。
折扣的计算方法(注:以下时间段均按闭区间计算):
周一至周五营业时间与折扣:晚上(17:00-20:30)8折,周一至周五中午(10:30--14:30)6折,其余时间不营业。
周末全价,营业时间:9:30-21:30
如果下单时间不在营业范围内,输出"table " + t.tableNum + " out of opening hours"
参考以下类的模板进行设计:菜品类:对应菜谱上一道菜的信息。
Dish {
String name;//菜品名称
int unit_price; //单价
int getPrice(int portion)//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份) }
菜谱类:对应菜谱,包含饭店提供的所有菜的信息。
Menu {
Dish\[\] dishs ;//菜品数组,保存所有菜品信息
Dish searthDish(String dishName)//根据菜名在菜谱中查找菜品信息,返回Dish对象。
Dish addDish(String dishName,int unit_price)//添加一道菜品信息
}
点菜记录类:保存订单上的一道菜品记录
Record {
int orderNum;//序号\\
Dish d;//菜品\\
int portion;//份额(1/2/3代表小/中/大份)\\
int getPrice()//计价,计算本条记录的价格\\
}
订单类:保存用户点的所有菜的信息。
Order {
Record\[\] records;//保存订单上每一道的记录
int getTotalPrice()//计算订单的总价
Record addARecord(int orderNum,String dishName,int portion,int num)//添加一条菜品信息到订单中。
delARecordByOrderNum(int orderNum)//根据序号删除一条记录
findRecordByNum(int orderNum)//根据序号查找一条记录
}
### 输入格式:
桌号标识格式:table + 序号 +英文空格+ 日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)
菜品记录格式:
菜名+英文空格+基础价格
如果有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。
点菜记录格式:序号+英文空格+菜名+英文空格+份额+英文空格+份数注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。
删除记录格式:序号 +英文空格+delete
代点菜信息包含:桌号+英文空格+序号+英文空格+菜品名称+英文空格+份额+英文空格+分数
最后一条记录以“end”结束。
### 输出格式:
按输入顺序输出每一桌的订单记录处理信息,包括:
1、桌号,格式:table+英文空格+桌号+”:”
2、按顺序输出当前这一桌每条订单记录的处理信息,
每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品\*份数,序号是之前输入的订单记录的序号。如果订单中包含不能识别的菜名,则输出“\*\* does not exist”,\*\*是不能识别的菜名
如果删除记录的序号不存在,则输出“delete error”
最后按输入顺序一次输出每一桌所有菜品的总价(整数数值)格式:table+英文空格+桌号+“:”+英文空格+当前桌的总价
本次题目不考虑其他错误情况,如:桌号、菜单订单顺序颠倒、不符合格式的输入、序号重复等,在本系列的后续作业中会做要求。
输入格式:
桌号标识格式:table + 序号 +英文空格+ 日期(格式:YYYY/MM/DD)+英文空格+ 时间(24小时制格式: HH/MM/SS)
菜品记录格式:
菜名+英文空格+基础价格
如果有多条相同的菜名的记录,菜品的基础价格以最后一条记录为准。
点菜记录格式:序号+英文空格+菜名+英文空格+份额+英文空格+份数注:份额可输入(1/2/3), 1代表小份,2代表中份,3代表大份。
删除记录格式:序号 +英文空格+delete
代点菜信息包含:桌号+英文空格+序号+英文空格+菜品名称+英文空格+份额+英文空格+分数
最后一条记录以“end”结束。
输出格式:
按输入顺序输出每一桌的订单记录处理信息,包括:
1、桌号,格式:table+英文空格+桌号+“:”+英文空格
2、按顺序输出当前这一桌每条订单记录的处理信息,
每条点菜记录输出:序号+英文空格+菜名+英文空格+价格。其中的价格等于对应记录的菜品\*份数,序号是之前输入的订单记录的序号。如果订单中包含不能识别的菜名,则输出“\*\* does not exist”,\*\*是不能识别的菜名
如果删除记录的序号不存在,则输出“delete error”
最后按输入顺序一次输出每一桌所有菜品的总价(整数数值)格式:table+英文空格+桌号+“:”+英文空格+当前桌的总价
本次题目不考虑其他错误情况,如:桌号、菜单订单顺序颠倒、不符合格式的输入、序号重复等,在本系列的后续作业中会做要求。
输入样例:
在这里给出一组输入。例如:
麻婆豆腐 12
油淋生菜 9
table 1 2023/3/22 12/2/3
1 麻婆豆腐 2 2
2 油淋生菜 1 3
end
输出样例:
在这里给出相应的输出。例如:
table 1:
1 麻婆豆腐 36
2 油淋生菜 27
table 1: 38
输入样例1:
在这里给出一组输入。例如:
麻婆豆腐 12
油淋生菜 9
table 1 2023/3/22 17/0/0
1 麻婆豆腐 2 2
2 油淋生菜 1 3
1 delete
end
输出样例1:
在这里给出相应的输出。例如:
table 1:
1 麻婆豆腐 36
2 油淋生菜 27
table 1: 22
输入样例2:
在这里给出一组输入。例如:
麻婆豆腐 12
油淋生菜 9
table 1 2023/3/22 16/59/59
1 麻婆豆腐 2 2
2 油淋生菜 1 3
1 delete
end
输出样例2:
在这里给出相应的输出。例如:
table 1:
1 麻婆豆腐 36
2 油淋生菜 27
table 1 out of opening hours
输入样例3:
在这里给出一组输入。例如:
麻婆豆腐 12
油淋生菜 9
table 1 2022/12/5 15/03/02
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
5 delete
7 delete
table 2 2022/12/3 15/03/02
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
7 delete
end
输出样例3:
在这里给出相应的输出。例如:
table 1:
1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
delete error;
delete error;
table 2:
1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
delete error;
table 1 out of opening hours
table 2: 63
输入样例4:
在这里给出一组输入。例如:
麻婆豆腐 12
油淋生菜 9
table 1 2022/12/3 19/5/12
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
table 2 2022/12/3 15/03/02
1 麻婆豆腐 2 2
2 油淋生菜 1 3
3 麻辣鸡丝 1 2
1 4 麻婆豆腐 1 1
7 delete
end
输出样例4:
在这里给出相应的输出。例如:
table 1:
1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
table 2:
1 麻婆豆腐 36
2 油淋生菜 27
麻辣鸡丝 does not exist
4 table 2 pay for table 1 12
delete error;
table 1: 63
table 2: 75
我的代码如图:
import java.text.ParseException;
import java.util.*;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
List<Table> tables = new ArrayList<>();
Menu menu = new Menu();
String line = in.nextLine();
Table curTable = null;
while (!line.equals("end")) {
String[] parts = line.split(" ");
if (parts.length > 2) {
if ("table".equals(parts[0])) {
Table table = new Table();
tables.add(table);
table.setTime(parts[2]);
table.setIndex(parts[1]);
table.setDayTime(parts[3]);
table.setOrder(new Order(menu, table));
curTable = table;
} else if (parts.length == 4) {
int orderNum = Integer.parseInt(parts[0]);
String dishName = parts[1];
int portion = Integer.parseInt(parts[2]);
int num = Integer.parseInt(parts[3]);
assert curTable != null;
curTable.getOrder().addARecord(orderNum, dishName, portion, num, curTable.getIndex(), curTable.getIndex());
} else if (parts.length == 5) {
for (Table table : tables) {
if (table.getIndex().equals(parts[0])) {
// 代點菜
int orderNum = Integer.parseInt(parts[1]);
String dishName = parts[2];
int portion = Integer.parseInt(parts[3]);
int num = Integer.parseInt(parts[4]);
table.getOrder().addARecord(orderNum, dishName, portion, num, curTable.getIndex(), parts[0]);
curTable.getOrder().addARecord(orderNum, dishName, portion, num, curTable.getIndex(), parts[0]);
break;
}
}
}
} else if ("delete".equals(parts[1])) {
assert curTable != null;
curTable.getOrder().delARecordByOrderNum(Integer.parseInt(parts[0]));
} else {
menu.addDish(parts[0], Integer.parseInt(parts[1]));
}
line = in.nextLine();
}
for (Table table : tables) {
System.out.println("table " + table.getIndex() + ": ");
Order order = table.getOrder();
for (Record record : order.getRecords()) {
String from = record.getFrom();
String to = record.getTo();
if (record.isAddError()) {
System.out.println(record.getD().getName() + " does not exist");
} else if (record.isDelError()) {
System.out.println("delete error;");
} else if (from.equals(table.getIndex())) {
if (to.equals(table.getIndex())) {
System.out.println(record.getOrderNum() + " " + record.getD().getName() + " " + record.getPrice());
} else {
System.out.println(record.getOrderNum() + " table " + from + " pay for table " + to + " " + record.getPrice());
}
}
}
}
for (Table table : tables) {
Order order = table.getOrder();
int sale = table.getSale();
if (sale > 0) {
System.out.println("table " + table.getIndex() + ": " + Math.round(order.getTotalPrice() * sale / 10f));
} else {
System.out.println("table " + table.getIndex() + " out of opening hours");
}
}
}
}
class Table {
private String index;
private String dayTime;
private String time;
private Order order;
public String getIndex() {
return index;
}
public void setIndex(String index) {
this.index = index;
}
public void setDayTime(String dayTime) {
this.dayTime = dayTime;
}
public void setTime(String time) {
this.time = time;
}
public Order getOrder() {
return order;
}
public void setOrder(Order order) {
this.order = order;
}
private Calendar getTimeCalendar(String time) {
String[] arr = time.split("/");
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(arr[0]));
cal.set(Calendar.MINUTE, Integer.parseInt(arr[1]));
cal.set(Calendar.SECOND, Integer.parseInt(arr[2]));
return cal;
}
public int getSale() {
String[] dayArray = time.split("/");
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_MONTH, 32);
//
// calendar.set(Calendar.YEAR,Integer.parseInt(dayArray[0]));
// calendar.set(Calendar.MONTH, Integer.parseInt(dayArray[1]) - 1);
// calendar.set(Calendar.DATE,Integer.parseInt(dayArray[2]));
calendar.set(Integer.parseInt(dayArray[0]), Integer.parseInt(dayArray[1])-1, Integer.parseInt(dayArray[2]));
Calendar now = getTimeCalendar(dayTime);
int weekDay = calendar.get(Calendar.DAY_OF_WEEK) - 1;
if (weekDay == 0 || weekDay == 6) {
if (!now.before(getTimeCalendar("9/30/0")) && !now.after(getTimeCalendar("21/00/00"))) {
return 10;
}
} else {
if (!now.before(getTimeCalendar("17/00/00")) && !now.after(getTimeCalendar("20/30/00"))) {
return 8;
}
if (!now.before(getTimeCalendar("10/30/00")) && !now.after(getTimeCalendar("14/30/00"))) {
return 6;
}
}
// 表示不营业
return 0;
}
}
class Menu {
private final Map<String, Dish> dishs = new HashMap<>();//菜品数组,保存所有菜品信息
Menu() {
}
Dish searchDish(String dishName) {
return dishs.get(dishName);
}
//添加一道菜品信息
void addDish(String dishName, int unit_price) {
Dish dish = new Dish(dishName, unit_price);
dishs.put(dishName, dish);
}
}
class Dish {
String name;//菜品名称
int unit_price; //单价
public Dish(String dishName) {
this.name = dishName;
}
public String getName() {
return name;
}
public Dish(String name, int unit_price) {
this.name = name;
this.unit_price = unit_price;
}
//计算菜品价格的方法,输入参数是点菜的份额(输入数据只能是1/2/3,代表小/中/大份)
int getPrice(int portion) {
float b[] = {1, 1.5f, 2};
return Math.round((unit_price * b[portion - 1]));
}
}
class Record {
private int orderNum;//序号\
private Dish d;//菜品\
private int portion;//份额(1/2/3代表小/中/大份)\
private int num;
private String from;
private String to;
private boolean isDelete = false;
private boolean isAddError = false;
private boolean isDelError = false;
public Record() {
}
public Record(int orderNum, Dish d, int portion, int num, String from, String to) {
this.orderNum = orderNum;
this.d = d;
this.portion = portion;
this.num = num;
this.from = from;
this.to = to;
}
//计价,计算本条记录的价格
int getPrice() {
return d.getPrice(portion) * this.num;
}
public int getOrderNum() {
return orderNum;
}
public Dish getD() {
return d;
}
public void setD(Dish d) {
this.d = d;
}
public boolean isDelete() {
return isDelete;
}
public void setDelete(boolean delete) {
isDelete = delete;
}
public boolean isAddError() {
return isAddError;
}
public void setAddError(boolean addError) {
isAddError = addError;
}
public boolean isDelError() {
return isDelError;
}
public void setDelError(boolean delError) {
isDelError = delError;
}
public String getFrom() {
return from;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
}
class Order {
private Menu menu;
private Table table;
public List<Record> getRecords() {
return records;
}
private final List<Record> records = new ArrayList<>();//保存订单上每一道的记录
public Order(Menu menu, Table table) {
this.menu = menu;
this.table = table;
}
//计算订单的总价
int getTotalPrice() {
int sum = 0;
for (Record record : records) {
if (!record.isDelete() && !record.isDelError() && !record.isAddError() && table.getIndex().equals(record.getFrom())) {
int price = record.getPrice();
sum = sum + price;
}
}
return sum;
}
//添加一条菜品信息到订单中。
void addARecord(int orderNum, String dishName, int portion, int num, String from, String to) {
Dish dish = menu.searchDish(dishName);
if (dish == null && table.getIndex().equals(from)) {
Record record = new Record();
record.setD(new Dish(dishName));
record.setAddError(true);
records.add(record);
return;
}
Record record = new Record(orderNum, dish, portion, num, from, to);
records.add(record);
}
public void delARecordByOrderNum(int orderNum) {
for (Record record : records) {
if (record.getOrderNum() == orderNum) {
record.setDelete(true);
return;
}
}
Record record = new Record();
record.setDelError(true);
records.add(record);
}
}
这道题目我开始尝试用类来进行写题目,因为运用的不太熟练,这道题目折磨了我好几天,写这道题目我的思路就是对订单进行分块处理,然后用类来进行处理。写这个题目我是先按照给的输入输出来进行构思主方法,然后再慢慢校对。耗费的时间比较久。
三、踩坑心得:

再写第一次作业的时候,我因为强制转换问题踩了坑,如图代码的float问题。
还有一个情况就是

在这个题目我一开始直接开了10000的空间用双重循环来写,但是会爆掉,想了好久才发现TLE了,要用数据结构set来去重,算是踩了坑。
接下来就是一个动态规划的题目

这个题目是一个经典的dp题目,但是这个题目时间卡的很紧,总是有三分过不了,身边的同学都有这种困惑,最后查找加资料才发现有一个输入输出同步流可以更快的运行编译,不过一般的题目不会这么卡时间。
四:主要困难以及改进建议
在解题过程中,我遇到的一个主要问题是理解题目中所描述的问题,特别是对于一些复杂或者抽象的概念,可能需要更多的时间来思考和理解题意。针对这种情况,我认为可以通过以下几个方面来改进:首先,在做题之前要仔细阅读题目,尤其是关键句子和需要注意的细节,确保对问题有一个清晰的认识。如果有疑惑,可以多看题目几遍或者向其他人请教,例如询问老师、同学或者网上论坛等。其次,在解题过程中应该善于利用一些调试技巧,例如打印输出语句、单步执行等方法,以便更好地理解代码的运行结构和逻辑。这样有助于我们发现代码中存在的错误,并更加快速地定位解决问题的法。通过不断实践,掌握编程的基本技能,逐渐积累经验。
五:总结
在完成本阶段的三次题目集的过程中,我深刻地认识到了编程能力对于计算机科学专业的重要性。通过不断的练习和思考,我对Java语言的基础知识有了更加深入的理解,并对编写高质量代码有了更清晰的认识。通过本阶段的学习,我意识到自己还需要进一步学习和研究的方面。首先,我希望能够掌握更多的数据结构和算法知识,以便应对更加复杂的问题和挑战;其次,我还需要提高自己的实践能力,在实际项目中应用所学知识、积累经验;最后,我也希望加强自己的代码风格和规范性,提高编码的效率和质量。针对教师、课程、作业、实验、课上及课下组织方式等方面,我对其中的一些方面提出改进建议:
-
教师应该更多地注重培养学生的动手能力和实践能力,鼓励学生积极参加相关的实践项目和比赛活动;
-
作业的难度可以逐步增加,同时给出合理的批改反馈,以刺激学生不断地提升自身的编程能力;
-
在实验环节中,可以增加更多真实场景下的案例分析情境,帮助学生更好地掌握所学知识点的运用和实践;
-
课上的教学内容和形式可以有所丰富,如融入问题解决、编程练习和小组讨论等环节,以更好地激发学生的学习兴趣和积极性。
总之,本阶段的学习对我的专业技能和职业素养的提升有着积极的影响。
