一.系統概述
編寫一個訂餐的系統,具體需要實現這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("序號\t\t菜名\t\t單價\t\t點贊數");
for(int j=0;j<dishMeg.length;j++){
String yuan=prices[j]+"元";
System.out.println((j+1)+"\t\t"+dishMeg[j]+"\t\t"+yuan+"\t\t"+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("序號\t\t訂餐人\t\t菜品信息"+"\t\t送餐日期\t\t送餐地址\t\t總金額\t\t訂單狀態");
(循環遍歷餐袋之中已經存在的訂單信息。)
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)+"\t\t"+names[i]+"\t\t"+dishMegs[i]+
"\t\t"+time+"\t\t"+addresses[i]+"\t\t"+price+
"\t\t"+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("序號\t\t菜名\t\t單價\t\t點贊數");
for(int j=0;j<dishMeg.length;j++){
String yuan=prices[j]+"元";
System.out.println((j+1)+"\t\t"+dishMeg[j]+"\t\t"+yuan+"\t\t"+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("您已退出系統!");
四.總結
吃貨聯盟訂餐系統是我作為一個初學者而言第一個所接觸的較為復雜的系統項目,該課題,系統的考察了我對於之前所學的一些基礎知識的掌握程度,也考察了我對於所學過的知識的是否能夠熟練得進行運用,是一個綜合性較強的項目,具體考察了以下幾方面的主要技能點:順序、選擇、循環、數組、類和對象和方法。開發的流程:需求 設計 開發 測試。還要明白設計系統應滿足哪些原則。總之,這一次的項目實訓,使我受益匪淺,同時也明白了自己在很多地方還有不足,需要補強。今后要更加努力學習並且及時鞏固學過的知識點,老師上新課,也要及時預習,避免跟不上老師節奏這種問題。
