刚刚学完java基础入门,主要学习Java基本环境搭建,定义变量、选择结构,循环结构、数组等。本阶段结束尝试接触此次吃货联盟订餐系统,第一次敲这么长的代码,后面多见识见识应该就好了,多加努力啊!
吃货联盟订餐系统包含的功能:我要订餐、查看餐袋、签收订单、删除订单、我要点赞、退出系统
“只要动动手指,就能送餐上门”,网上定餐深受现代人青睐,现开发一个网上订餐系统,功能如下
我要订餐
查看餐袋
签收订单
删除订单
我要点赞
退出系统
第一阶段:分析数据主体(重难点)
第二阶段:分析并完成整体框架(重难点)
第三阶段:分析并完成退出功能
第四阶段:分析并完成订餐功能
第五阶段:分析并完成查看餐袋功能
第六阶段:分析并完成签收订单功能
第七阶段:分析并完成删除功能(重难点)
第八阶段:分析总完成我要点赞功能
// 系统输入对象
Scanner input = new Scanner(System.in);
int num = -1;
// 定义是否退出订餐系统变量
boolean isExit = false;
// 循环展示吃货订餐系统主菜单,可以选择菜单,并循环切换
// 系统输入对象
Scanner input = new Scanner(System.in);
int num = -1;
// 定义是否退出订餐系统变量
boolean isExit = false;
// 循环展示吃货订餐系统主菜单,可以选择菜单,并循环切换
do {
System.out.println("欢迎使用“吃货联盟订餐系统”");
System.out.println("****************************");
System.out.println("1、我要订餐");
System.out.println("2、查看餐袋");
System.out.println("3、签收订单");
System.out.println("4、删除订单");
System.out.println("5、我要点赞");
System.out.println("6、退出系统");
System.out.println("****************************");
// 提示输入菜单序号
System.out.print("请选择:");
int choose = input.nextInt();
switch (choose) {
case 1:
System.out.println("***我要订餐***");
break;
case 2:
System.out.println("***查看餐袋***");
break;
case 3:
System.out.println("***签收订单***");
break;
case 4:
System.out.println("***删除订单***");
break;
case 5:
System.out.println("***我要点赞***");
break;
case 6:
isExit = true;
break;
default:
System.out.println("输入非法!");
isExit = true;
break;
}
if (!isExit) {
System.out.print("输入0返回:");
num = input.nextInt();
}else {
break;
}
} while (num == 0);
System.out.println("谢谢使用,欢迎下次光临!");
实现:
// 初始化订餐系统的菜品数据
// 由于菜品数据类型不统一,但是数组存储的相同数据类型的一组数据,可以将菜品数据拆分成三个数组,借助数组相同下标,是同一个菜品数据
// 菜品名称数组
String[] dishNames = {"红烧带鱼","鱼香肉丝","时令鲜蔬"};
// 菜品价格数组
double[] dishPrices = {38.0,20.0,10.0};
// 菜品点赞数数组
int[] dishPraises = {0,0,0};
// 初始化吃货订餐系统的订餐订单数据
// 订餐人
String[] orderNames = new String[5];
// 订餐详情
String[] orderDetails = new String[5];
//配送时间
int[] orderTimes = new int[5];
//配送地址
String[] orderAddrs = new String[5];
// 订单状态
int[] orderStates = new int[5];
//订单总价
double[] orderPrices = new double[5];
// 初始化订餐订单数据,方便查看餐袋
orderNames[0] = "张晴";
orderDetails[0] = "红烧带鱼 2份";
orderTimes[0] = 12;
orderAddrs[0] = "天成路207号";
orderStates[0] = 1;
orderPrices[0] = 76.0;
orderNames[1] = "张晴";
orderDetails[1] = "鱼香肉丝 2份";
orderTimes[1] = 18;
orderAddrs[1] = "天成路207号";
orderStates[1] = 0;
orderPrices[1] = 45.0;
实现:
case 2:
System.out.println("***查看餐袋***");
// 输出订单标题头
System.out.println("序号\t订餐人\t餐品信息\t\t送餐时间\t送餐地址\t\t总金额\t订单状态");
// 循环遍历订单数组,查询已定餐的订单数据
// 由于订餐订单被拆分为6个长度统一的数据,只需要选择使用其中一个数组作为循环条件即可
for (int i = 0; i < orderNames.length; i++) {
// 订餐订单都是按照下标顺序存储的,只要订单人姓名为null,说明后续都是空的(没有订单信息),结束循环
if (null == orderNames[i]) {
break;
}
// 输出餐袋中已存的订单数据
System.out.println(i + 1 + "\t"
+ orderNames[i] + "\t"
+ orderDetails[i] + "\t"
+ orderTimes[i] + "\t"
+ orderAddrs[i] + "\t"
+ orderPrices[i] + "\t"
+ (orderStates[i] == 0? "已预定" : "已完成"));
}
break;
完成功能要求:
确定新增位置:第一个name为null的位置
case 1:
System.out.println("***我要订餐***");
// 定义餐袋中的订单是否已经订满的标识变量,如果餐袋满了,不允许继续订餐
// 默认餐袋中订单已满,如果订餐可以找到订单位置,标识变量改为false,没满为true
boolean isFullFlag = false;
// 循环遍历订餐订单数组,找可以存放订餐订单的位置,就是第一个为null的位置
for (int i = 0; i < orderNames.length; i++) {
if (null == orderNames[i]) {
// 餐袋没有订满,可以继续订餐,修改标识为false
isFullFlag = false;
// 提示输入订餐人的姓名
System.out.print("请输入订餐人姓名:");
String orderName = input.next();
// 展示订餐菜品数据
System.out.println("序号\t菜名\t单价\t点赞数");
for (int j = 0; j < dishNames.length; j++) {
System.out.println(j + 1 + "\t"
+ dishNames[j] + "\t"
+ dishPrices[j] + "\t"
+ dishPraises[j]);
}
// 提示输入订餐菜品序号
System.out.print("请选择您要点的菜品编号:");
int dishIndex = input.nextInt();
// 确保输入的菜品序号有效,如果输入序号非法,要重新输入,防止下标越界
while (dishIndex < 0 || dishIndex > dishNames.length) {
System.out.println("输入菜品序号非法,请重新输入:");
dishIndex = input.nextInt();
}
// 提示输入订餐菜品份数
System.out.print("请选择您需要的份数:");
int dishCount = input.nextInt();
// 提示输入送餐时间
System.out.print("请输入送餐时间(送餐时间:10点至20点间整点送餐):");
int orderTime = input.nextInt();
// 确保输入的送餐时间有效,如果输入时间非法,要重新输入,防止下标越界
while (orderTime < 10 || orderTime >20) {
System.out.println("超出系统送餐时间范围,请重新输入:");
orderTime = input.nextInt();
}
// 提示输入送餐地址
System.out.print("请输入送餐地址:");
String orderAddr = input.next();
// 计算订餐总价:选择菜品单价 * 订单份数 + 配送费(满60,免配送费,如果不足60,加5元)
// 计算订餐菜品的总价
double dishAllPrice = dishPrices[dishIndex - 1] * dishCount;
// 计算配送费
double exPrice = dishAllPrice > 60 ? 0.0 : 5.0;
// 拼接订餐详情
String orderDetail = dishNames[dishIndex - 1] + " " + dishCount + "份";
// 保存订餐订单完整信息
orderNames[i] = orderName;
orderDetails[i] = orderDetail;
orderTimes[i] = orderTime;
orderAddrs[i] = orderAddr;
orderPrices[i] = dishAllPrice + exPrice;
orderStates[i] = 0; // 可以不设置,默认为0
// 提示订餐成功
System.out.println("-----------------------");
System.out.println("订餐成功!");
System.out.println("您订的是:" + orderDetail);
System.out.println("送餐时间:" + orderTime + "点");
System.out.println("餐费:" + dishAllPrice + "元,送餐费:" + exPrice + ",总计:" + orderPrices[i] + "元");
System.out.println("-----------------------");
// 订餐成功后,立刻结束循环,否则继续订餐,直到订满订餐订单数组
break;
}
}
// 如果循环结束,餐袋订单是否已满标识变量值仍然为true,代表订餐失败,餐袋已满,无法继续
if (isFullFlag) {
System.out.println("系统餐袋已满,无法继续订餐,请联系系统管理员!!!");
}
break;
送餐后,将用户签收订单状态修改为“已完成"
判断条件
case 3:
System.out.println("***签收订单***");
// 定义已有订单的数量
int signOrderCount = 0;
// 签收订单,展示当前餐袋中所有的订餐订单的概要信息
System.out.println("序号\t订餐人\t餐品信息\t订单状态");
for (int i = 0; i < orderNames.length; i++) {
if (null == orderNames[i]) {
// 结束循环
break;
}
// 输出餐袋中已存的订单数据
System.out.println(i + 1 + "\t"
+ orderNames[i] + "\t"
+ orderDetails[i] + "\t"
+ (orderStates[i] == 0? "已预定" : "已完成"));
// 已有订餐订单数量+1
signOrderCount ++;
}
// 补充:当餐袋订餐数据为空,无法执行签收操作,需要直接结束
if (signOrderCount == 0) {
// 提示暂无订餐订单数据,直接结束删除操作
System.out.println("\t暂无订餐数据,无需签收!\n");
break;
}
// 提示输入签收订单序号
System.out.print("请选择要签收的订单序号:");
int signOrderIndex = input.nextInt();
// 如果输入的签收订单序号不存在,重新输入
while (signOrderIndex < 1 || signOrderIndex > signOrderCount) {
System.out.println("签收订单序号不存在,请重新输入:");
signOrderIndex = input.nextInt();
}
// 执行签收订单,只有是已预定的订单才可以执行签收,已完成订单,不能重复签收
if (orderStates[signOrderIndex - 1] == 0) {
// 将已预定的订单状态改为:已完成状态
orderStates[signOrderIndex - 1] = 1;
// 提示签收成功
System.out.println("订单签收成功!");
}else {
System.out.println("订单已完成,无法重复签收!");
}
break;
case 4:
System.out.println("***删除订单***");
// 定义已有订单的数量
int delOrderCount = 0;
// 删除订单,展示当前餐袋中所有的订餐订单的概要信息
System.out.println("序号\t订餐人\t餐品信息\t订单状态");
for (int i = 0; i < orderNames.length; i++) {
if (null == orderNames[i]) {
// 结束循环
break;
}
// 输出餐袋中已存的订单数据
System.out.println(i + 1 + "\t"
+ orderNames[i] + "\t"
+ orderDetails[i] + "\t"
+ (orderStates[i] == 0? "已预定" : "已完成"));
// 已有订餐订单数量+1
delOrderCount ++;
}
// 补充:当餐袋订餐数据为空,无法执行删除操作,需要直接结束
if (delOrderCount == 0) {
// 提示暂无订餐订单数据,直接结束删除操作
System.out.println("\t暂无订餐数据,无需删除!\n");
break;
}
// 提示输入删除订单序号
System.out.print("请输入要删除得到订单序号:");
int delOrderIndex = input.nextInt();
// 如果输入的删除订单序号不存在,重新输入
while (delOrderIndex < 1 || delOrderIndex > delOrderCount) {
System.out.println("删除订单序号不存在,请重新输入:");
signOrderIndex = input.nextInt();
}
// 执行删除订单,只有已完成订单才能删除,如果订单状态是已预定,不能删除
if (orderStates[delOrderIndex - 1] == 1) {
// 订单是已完成,可以执行删除操作,直接将后面的订单数据依次覆盖前面的订单
for (int i = delOrderIndex - 1; i < delOrderCount - 1; i++) {
orderNames[i] = orderNames[i+1];
orderDetails[i] = orderDetails[i+1];
orderTimes[i] = orderTimes[i+1];
orderAddrs[i] = orderAddrs[i+1];
orderPrices[i] = orderPrices[i+1];
orderStates[i] = orderStates[i+1];
}
// 将最后一个重复的已存在订单置空
orderNames[delOrderCount - 1] = null;
orderDetails[delOrderCount - 1] = null;
orderTimes[delOrderCount - 1] = 0;
orderAddrs[delOrderCount - 1] = null;
orderPrices[delOrderCount - 1] = 0.0;
orderStates[delOrderCount - 1] = 0;
// 提示订单删除成功
System.out.println("订单删除成功!");
}else {
System.out.println("您选择的订单未签收,不能删除!");
}
break;
case 5:
System.out.println("***我要点赞***");
// 展示点赞菜品列表数据
System.out.println("序号\t菜名\t单价\t点赞数");
for (int i = 0; i < dishNames.length; i++) {
System.out.println(i + 1 + "\t"
+ dishNames[i] + "\t"
+ dishNames[i] + "\t"
+ dishPraises[i]);
}
// 提示输入点赞菜品序号
System.out.print("请选择你要点赞的菜品序号:");
int praiseDishIndex = input.nextInt();
// 如果输入点赞序号不存在,重新输入
while (praiseDishIndex < 1 || praiseDishIndex > dishNames.length) {
System.out.println("需要点赞菜品序号不存在,请重新输入:");
praiseDishIndex = input.nextInt();
}
// 执行点赞,直接根据选择的菜品序号,给保存菜品点赞数数组中对应值+1
dishPraises[praiseDishIndex - 1] ++;
System.out.println("点赞成功!");
break;
import java.util.Scanner;
public class FoodieMgr {
public static void main(String[] args) {
// 吃货联盟
// 系统输入对象
Scanner input = new Scanner(System.in);
int num = -1;
// 定义是否退出订餐系统变量
boolean isExit = false;
// 初始化订餐系统的菜品数据
// 由于菜品数据类型不统一,但是数组存储的相同数据类型的一组数据,可以将菜品数据拆分成三个数组,借助数组相同下标,是同一个菜品数据
// 菜品名称数组
String[] dishNames = {"红烧带鱼","鱼香肉丝","时令鲜蔬"};
// 菜品价格数组
double[] dishPrices = {38.0,20.0,10.0};
// 菜品点赞数数组
int[] dishPraises = {0,0,0};
// 初始化吃货订餐系统的订餐订单数据
// 订餐人
String[] orderNames = new String[5];
// 订餐详情
String[] orderDetails = new String[5];
//配送时间
int[] orderTimes = new int[5];
//配送地址
String[] orderAddrs = new String[5];
// 订单状态
int[] orderStates = new int[5];
//订单总价
double[] orderPrices = new double[5];
// 初始化订餐订单数据,方便查看餐袋
orderNames[0] = "张晴";
orderDetails[0] = "红烧带鱼 2份";
orderTimes[0] = 12;
orderAddrs[0] = "天成路207号";
orderStates[0] = 1;
orderPrices[0] = 76.0;
orderNames[1] = "张晴";
orderDetails[1] = "鱼香肉丝 2份";
orderTimes[1] = 18;
orderAddrs[1] = "天成路207号";
orderStates[1] = 0;
orderPrices[1] = 45.0;
// 循环展示吃货订餐系统主菜单,可以选择菜单,并循环切换
do {
System.out.println("欢迎使用“吃货联盟订餐系统”");
System.out.println("****************************");
System.out.println("1、我要订餐");
System.out.println("2、查看餐袋");
System.out.println("3、签收订单");
System.out.println("4、删除订单");
System.out.println("5、我要点赞");
System.out.println("6、退出系统");
System.out.println("****************************");
// 提示输入菜单序号
System.out.print("请选择:");
int choose = input.nextInt();
switch (choose) {
case 1:
System.out.println("***我要订餐***");
// 定义餐袋中的订单是否已经订满的标识变量,如果餐袋满了,不允许继续订餐
// 默认餐袋中订单已满,如果订餐可以找到订单位置,标识变量改为false,没满为true
boolean isFullFlag = false;
// 循环遍历订餐订单数组,找可以存放订餐订单的位置,就是第一个为null的位置
for (int i = 0; i < orderNames.length; i++) {
if (null == orderNames[i]) {
// 餐袋没有订满,可以继续订餐,修改标识为false
isFullFlag = false;
// 提示输入订餐人的姓名
System.out.print("请输入订餐人姓名:");
String orderName = input.next();
// 展示订餐菜品数据
System.out.println("序号\t菜名\t单价\t点赞数");
for (int j = 0; j < dishNames.length; j++) {
System.out.println(j + 1 + "\t"
+ dishNames[j] + "\t"
+ dishPrices[j] + "\t"
+ dishPraises[j]);
}
// 提示输入订餐菜品序号
System.out.print("请选择您要点的菜品编号:");
int dishIndex = input.nextInt();
// 确保输入的菜品序号有效,如果输入序号非法,要重新输入,防止下标越界
while (dishIndex < 0 || dishIndex > dishNames.length) {
System.out.println("输入菜品序号非法,请重新输入:");
dishIndex = input.nextInt();
}
// 提示输入订餐菜品份数
System.out.print("请选择您需要的份数:");
int dishCount = input.nextInt();
// 提示输入送餐时间
System.out.print("请输入送餐时间(送餐时间:10点至20点间整点送餐):");
int orderTime = input.nextInt();
// 确保输入的送餐时间有效,如果输入时间非法,要重新输入,防止下标越界
while (orderTime < 10 || orderTime >20) {
System.out.println("超出系统送餐时间范围,请重新输入:");
orderTime = input.nextInt();
}
// 提示输入送餐地址
System.out.print("请输入送餐地址:");
String orderAddr = input.next();
// 计算订餐总价:选择菜品单价 * 订单份数 + 配送费(满60,免配送费,如果不足60,加5元)
// 计算订餐菜品的总价
double dishAllPrice = dishPrices[dishIndex - 1] * dishCount;
// 计算配送费
double exPrice = dishAllPrice > 60 ? 0.0 : 5.0;
// 拼接订餐详情
String orderDetail = dishNames[dishIndex - 1] + " " + dishCount + "份";
// 保存订餐订单完整信息
orderNames[i] = orderName;
orderDetails[i] = orderDetail;
orderTimes[i] = orderTime;
orderAddrs[i] = orderAddr;
orderPrices[i] = dishAllPrice + exPrice;
orderStates[i] = 0; // 可以不设置,默认为0
// 提示订餐成功
System.out.println("-----------------------");
System.out.println("订餐成功!");
System.out.println("您订的是:" + orderDetail);
System.out.println("送餐时间:" + orderTime + "点");
System.out.println("餐费:" + dishAllPrice + "元,送餐费:" + exPrice + ",总计:" + orderPrices[i] + "元");
System.out.println("-----------------------");
// 订餐成功后,立刻结束循环,否则继续订餐,直到订满订餐订单数组
break;
}
}
// 如果循环结束,餐袋订单是否已满标识变量值仍然为true,代表订餐失败,餐袋已满,无法继续
if (isFullFlag) {
System.out.println("系统餐袋已满,无法继续订餐,请联系系统管理员!");
}
break;
case 2:
System.out.println("***查看餐袋***");
// 输出订单标题头
System.out.println("序号\t订餐人\t餐品信息\t\t送餐时间\t送餐地址\t\t总金额\t订单状态");
// 循环遍历订单数组,查询已定餐的订单数据
// 由于订餐订单被拆分为6个长度统一的数据,只需要选择使用其中一个数组作为循环条件即可
for (int i = 0; i < orderNames.length; i++) {
// 订餐订单都是按照下标顺序存储的,只要订单人姓名为null,说明后续都是空的(没有订单信息),结束循环
if (null == orderNames[i]) {
break;
}
// 输出餐袋中已存的订单数据
System.out.println(i + 1 + "\t"
+ orderNames[i] + "\t"
+ orderDetails[i] + "\t"
+ orderTimes[i] + "\t"
+ orderAddrs[i] + "\t"
+ orderPrices[i] + "\t"
+ (orderStates[i] == 0? "已预定" : "已完成"));
}
break;
case 3:
System.out.println("***签收订单***");
// 定义已有订单的数量
int signOrderCount = 0;
// 签收订单,展示当前餐袋中所有的订餐订单的概要信息
System.out.println("序号\t订餐人\t餐品信息\t订单状态");
for (int i = 0; i < orderNames.length; i++) {
if (null == orderNames[i]) {
// 结束循环
break;
}
// 输出餐袋中已存的订单数据
System.out.println(i + 1 + "\t"
+ orderNames[i] + "\t"
+ orderDetails[i] + "\t"
+ (orderStates[i] == 0? "已预定" : "已完成"));
// 已有订餐订单数量+1
signOrderCount ++;
}
// 补充:当餐袋订餐数据为空,无法执行签收操作,需要直接结束
if (signOrderCount == 0) {
// 提示暂无订餐订单数据,直接结束删除操作
System.out.println("\t暂无订餐数据,无需签收!\n");
break;
}
// 提示输入签收订单序号
System.out.print("请选择要签收的订单序号:");
int signOrderIndex = input.nextInt();
// 如果输入的签收订单序号不存在,重新输入
while (signOrderIndex < 1 || signOrderIndex > signOrderCount) {
System.out.println("签收订单序号不存在,请重新输入:");
signOrderIndex = input.nextInt();
}
// 执行签收订单,只有是已预定的订单才可以执行签收,已完成订单,不能重复签收
if (orderStates[signOrderIndex - 1] == 0) {
// 将已预定的订单状态改为:已完成状态
orderStates[signOrderIndex - 1] = 1;
// 提示签收成功
System.out.println("订单签收成功!");
}else {
System.out.println("订单已完成,无法重复签收!");
}
break;
case 4:
System.out.println("***删除订单***");
// 定义已有订单的数量
int delOrderCount = 0;
// 删除订单,展示当前餐袋中所有的订餐订单的概要信息
System.out.println("序号\t订餐人\t餐品信息\t订单状态");
for (int i = 0; i < orderNames.length; i++) {
if (null == orderNames[i]) {
// 结束循环
break;
}
// 输出餐袋中已存的订单数据
System.out.println(i + 1 + "\t"
+ orderNames[i] + "\t"
+ orderDetails[i] + "\t"
+ (orderStates[i] == 0? "已预定" : "已完成"));
// 已有订餐订单数量+1
delOrderCount ++;
}
// 补充:当餐袋订餐数据为空,无法执行删除操作,需要直接结束
if (delOrderCount == 0) {
// 提示暂无订餐订单数据,直接结束删除操作
System.out.println("\t暂无订餐数据,无需删除!\n");
break;
}
// 提示输入删除订单序号
System.out.print("请输入要删除得到订单序号:");
int delOrderIndex = input.nextInt();
// 如果输入的删除订单序号不存在,重新输入
while (delOrderIndex < 1 || delOrderIndex > delOrderCount) {
System.out.println("删除订单序号不存在,请重新输入:");
signOrderIndex = input.nextInt();
}
// 执行删除订单,只有已完成订单才能删除,如果订单状态是已预定,不能删除
if (orderStates[delOrderIndex - 1] == 1) {
// 订单是已完成,可以执行删除操作,直接将后面的订单数据依次覆盖前面的订单
for (int i = delOrderIndex - 1; i < delOrderCount - 1; i++) {
orderNames[i] = orderNames[i+1];
orderDetails[i] = orderDetails[i+1];
orderTimes[i] = orderTimes[i+1];
orderAddrs[i] = orderAddrs[i+1];
orderPrices[i] = orderPrices[i+1];
orderStates[i] = orderStates[i+1];
}
// 将最后一个重复的已存在订单置空
orderNames[delOrderCount - 1] = null;
orderDetails[delOrderCount - 1] = null;
orderTimes[delOrderCount - 1] = 0;
orderAddrs[delOrderCount - 1] = null;
orderPrices[delOrderCount - 1] = 0.0;
orderStates[delOrderCount - 1] = 0;
// 提示订单删除成功
System.out.println("订单删除成功!");
}else {
System.out.println("您选择的订单未签收,不能删除!");
}
break;
case 5:
System.out.println("***我要点赞***");
// 展示点赞菜品列表数据
System.out.println("序号\t菜名\t单价\t点赞数");
for (int i = 0; i < dishNames.length; i++) {
System.out.println(i + 1 + "\t"
+ dishNames[i] + "\t"
+ dishNames[i] + "\t"
+ dishPraises[i]);
}
// 提示输入点赞菜品序号
System.out.print("请选择你要点赞的菜品序号:");
int praiseDishIndex = input.nextInt();
// 如果输入点赞序号不存在,重新输入
while (praiseDishIndex < 1 || praiseDishIndex > dishNames.length) {
System.out.println("需要点赞菜品序号不存在,请重新输入:");
praiseDishIndex = input.nextInt();
}
// 执行点赞,直接根据选择的菜品序号,给保存菜品点赞数数组中对应值+1
dishPraises[praiseDishIndex - 1] ++;
System.out.println("点赞成功!");
break;
case 6:
isExit = true;
break;
default:
System.out.println("输入非法!");
isExit = true;
break;
}
if (!isExit) {
System.out.print("输入0返回:");
num = input.nextInt();
}else {
break;
}
} while (num == 0);
System.out.println("谢谢使用,欢迎下次光临!");
}
}
对于刚总体学习完Java基础的同学们是个很好巩固知识点的练习,通过此次练习总结以下