一.系统概述
编写一个订餐的系统,具体需要实现这6个功能:分别是,我要订餐、查看餐袋、签收订单、删除订单、我要点赞、退出系统。
编写设计一个良好的系统,需要符合界面交互设计的原则,具体包括
①统一性原则:界面风格统一(用相同方式完成相同类型的操作 如:录入序号)、交互风格统一(用相同方式展现相同类型的数据 如:数值类型)。
②美观性原则:界面简洁、大方。
③易用性原则:操作方式自然、易理解。
二.重难点具体分析。
1.如何保存订单的信息?
2.如何访问订单的信息?
3.如何删除订单信息?
4.如何计算订单的总金额?
5.如何新增一条订单?
6.如何签收一条订单?
7.如何收集保存每个菜品的点赞数?
分析解决:
1.使用数组来保存和访问订单中的信息,每条订单信息分别包括,订餐人姓名、选择菜品及份数、送餐时间、送餐地址、订单状态、总金额(最多包含有4条订单信息!)
String[] names = new String[4]; // 保存订餐人名称
String[] dishMegs = new String[4]; // 保存菜品名及份数
int[] times = new int[4]; // 保存送餐时间
String[] addresses = new String[4]; // 保存送餐地址
int[] states = new int[4]; // 保存订单状态: 0:已预订 1:已完成
double[] sumPrices = new double[4]; // 保存订单的总金额
!!!:数组长度必须一致,统一为4或者其他。
2.访问订单信息
访问第i+1条订单信息
订餐人名称:names[i]
所选菜品信息:dishMegs[i]
送餐时间:times[i]
送餐地址:addresses[i]
订单状态:states[i]
订单的总金额:sumPrices[i]
3.删除数组中指定位置的元素
·从删除位置后一个元素开始每个元素依次前移一位
·将最后一个元素置为空
具体实现:
for(int j=delId-1;j<names.length-1;j++){
names[j] = names[j+1];
dishMegs[j] = dishMegs[j+1];
times[j] = times[j+1];
addresses[j] = addresses[j+1];
states[j] = states[j+1];
sumPrices[j] = sumPrices[j+1];
names[names.length-1] = null;
dishMegs[names.length-1] = null;
times[names.length-1] = 0;
addresses[names.length-1] = null;
states[names.length-1] = 0
}
4.如何计算订单的总金额?
订单总金额 = 菜品单价 * 预订的份数 + 送餐费
如果订单总金额不满50元,加收5元送餐费
三元运算符;
代码实现:
System.out.print("请选择您要点的菜品编号:");
Int chooseDish = input.nextInt();
System.out.print("请选择您需要的份数:");
int number = input.nextInt();
String dishMeg = dishNames[chooseDish - 1] +" "+ number + "份";
double sumPrice = prices[chooseDish - 1] * number; //计算订单金额
double deliCharge = (sumPrice >= 50) ? 0 : 5; // 计算送餐费
System.out.println("餐费:“ + sumPrice + "元,送餐费" + deliCharge + "元,总计:“ + (sumPrice + deliCharge) + "元。");
三.具体代码实现加详解。
1.创建Scanner对象
import java.util.Scanner;
Scanner sc=new Scanner(System.in);
2.首先,声明数组,并且初始化值。
String names[]=new String[4];
String dishMegs[]=new String[4];
int []times=new int[4];
String []addresses=new String[4];
int states[]=new int[4];//1:完成2:预定
double []sumPrices=new double[4];
放入两组初始值
names[0]="小明";
dishMegs[0] ="松仁玉米";
times[0]=12;
addresses[0]="万达广场";
states[0]=1;
sumPrices[0]=100;
names[1]="小红";
dishMegs[1] ="雪盖火焰山" ;
times[1]=13;
addresses[1]="家" ;
states[1]=0;
sumPrices[1]=300;
3.基础界面排版设计加自定义菜单。
System.out.println("欢迎使用吃货联盟订餐系统!");
System.out.println("**********************");
String dishMeg[]={"红烧狮子头","炭烧狮子头","火烧狮子头"};
double prices[]={28,38,48};
int zan[]=new int[4];
int nums=-1; //随意赋值!(制作返回主菜单系统!)
boolean isExit=false;
4.使用do-while循环作为系统主体,当用户输入某个具体值的时候,即可以退出系统!
do{
(主界面)
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("请输入您的操作");
int choose=sc.nextInt();
(声明几个布尔变量,用于判断条件!)
boolean isFind=false;
boolean isPdd=false;
boolean isded=false;
switch(choose){
case 1:
System.out.println("****我要订餐****");
for(int i=0;i<names.length;i++){
if(names[i]==null){
isPdd=true;
System.out.println("请输入用餐人的姓名:");
String name=sc.next();
System.out.println("序号 菜名 单价 点赞数");
for(int j=0;j<dishMeg.length;j++){
String yuan=prices[j]+"元";
System.out.println((j+1)+" "+dishMeg[j]+" "+yuan+" "+zan[j]);
}
System.out.println("输入点菜的菜品编号:");
int bianhao=sc.nextInt();
String dishName=dishMeg[bianhao-1];(提取菜单中的菜品名称)
System.out.println("输入需要点几份:");
int fen=sc.nextInt();
double p=prices[bianhao-1];(单价)
double sumPrice=fen*p;(总价)
double waiSong=sumPrice>50? 0:5;(三元运算符,判断是否需要交5元的配送费。)
System.out.println("输入送餐时间:(10-20)");
int time=sc.nextInt();
while(time<10 || time>20){
System.out.println("请输入正确的送餐时间(10——20)");
time=sc.nextInt();
}(利用一个while循环来判断用户是否输入正确的送餐时间!)
System.out.println("请输入送餐地址:");
String address=sc.next();
System.out.println("您订餐成功!");
System.out.println("您订的是:"+dishName+fen+"份");
System.out.println("餐费总金额为:"+sumPrice+"送餐费:"+waiSong+"合计:"+(sumPrice+waiSong));
names[i]=name;
times[i]=time;
sumPrices[i]=(sumPrice+waiSong);
dishMegs[i]=dishName;
addresses[i]=address;
(将订单信息全部输入到创建的数组之中。)
break;
}
}if (!isPdd){
System.out.println("对不起,餐袋已满!");
}
(最多只能装4个订单,当然,具体数字可以随意设定,但要注意,这些种类的数组的长度必须统一。)
break;
case 2:
System.out.println("****查看餐袋****");
System.out.println("序号 订餐人 菜品信息"+" 送餐日期 送餐地址 总金额 订单状态");
(循环遍历餐袋之中已经存在的订单信息。)
for(int i=0;i<names.length;i++){
if(names[i]!=null){
String time=times[i]+"时";
String price=sumPrices[i]+"元";
String state=states[i]==1?"已完成":"已预订";
System.out.println((i+1)+" "+names[i]+" "+dishMegs[i]+
" "+time+" "+addresses[i]+" "+price+
" "+state);
}
}
break;
case 3:
System.out.println("**********签收订单**********");
System.out.println("请输入需要签收的订单编号:");
int orderId=sc.nextInt();
(满足条件的订单全部将订单状态改为1,然后输出订单签收成功!)
for(int i=0;i<names.length;i++){
if(names[i]!=null && states[i]==0 && orderId==i+1){
states[i]=1;
System.out.println("订单签收成功!");
isFind=true;
break;
(用条件判断语句来解决,订单在不同状态之下分别执行不同的操作!)
}else if(names[i]!=null && states[i]==1 && orderId==i+1){
System.out.println("订单不可被重复签收");
isFind=true;
}
}
if(!isFind){
System.out.println("您输入的订单编号不存在");
}
break;
case 4:
//判断状态是否可删除 完成状态可删除 预定状态不可删除
System.out.println("*****删除订单*****");
System.out.println("请输入所需删除的订单编号:");
int deadId=sc.nextInt();
for(int i=0;i<names.length;i++){
if(names[i]!=null && states[i]==1&&deadId==i+1){
isded=true;
//当我们删除其中某一个数的时候,需要将后一个数向前挪位置
//如果删除的数的下标是i 后一个数的下标就是i+1 表达式:names[i]=names[i+1];
//最后一个数的时候,还用i+1 则会数组越界异常!所以挪位置的时候从倒数第二个位置开始挪,最后由于挪位置是一个复制过程
//所以 数组最后一个位置要置空!
for(int j=deadId-1;j<names.length-1;j++){
names[j]=names[j+1];
addresses[j]=addresses[j+1];
states[j]=states[j+1];
times[j]=times[j+1];
sumPrices[j]=sumPrices[j+1];
dishMegs[j]=dishMegs[j+1];
}
//最后置空
names[names.length-1]=null;
addresses[names.length-1]=null;
states[names.length-1]=0;
times[names.length-1]=0;
sumPrices[names.length-1]=0;
dishMegs[names.length-1]=null;
System.out.println("订单已经删除!");
break;
}else if(names[i]!=null && states[i]==0&&deadId==i+1){
isded=true;
System.out.println("订单未完成 不可删除");
}
}
if(!isded){
System.out.println("您要删除的订单不存在!");
}
break;
case 5:
System.out.println("**********我要点赞**********");
System.out.println("序号 菜名 单价 点赞数");
for(int j=0;j<dishMeg.length;j++){
String yuan=prices[j]+"元";
System.out.println((j+1)+" "+dishMeg[j]+" "+yuan+" "+zan[j]);
}
System.out.println("请选择您需要点赞的菜品序号:");
int num=sc.nextInt();
//用户输入的编号减去1 是数组中数据的位置, ++表示+1赞
zan[num-1]++;
System.out.println("点赞成功!");
break;
case 6:
isExit=true;
break;
default:
isExit=true;
break;
}
if(!isExit){
System.out.print("输入0返回:");
nums=sc.nextInt();
}else{
break;
}
//输入0的时候返回
}while(nums==0);
System.out.println("您已退出系统!");
四.总结
吃货联盟订餐系统是我作为一个初学者而言第一个所接触的较为复杂的系统项目,该课题,系统的考察了我对于之前所学的一些基础知识的掌握程度,也考察了我对于所学过的知识的是否能够熟练得进行运用,是一个综合性较强的项目,具体考察了以下几方面的主要技能点:顺序、选择、循环、数组、类和对象和方法。开发的流程:需求 设计 开发 测试。还要明白设计系统应满足哪些原则。总之,这一次的项目实训,使我受益匪浅,同时也明白了自己在很多地方还有不足,需要补强。今后要更加努力学习并且及时巩固学过的知识点,老师上新课,也要及时预习,避免跟不上老师节奏这种问题。