【项目源码分享】基于C++实现的网店购物管理系统(VS2019控制台)
文章目錄
前言
一、程序運行展示
二、數據結構分析
三、代碼開源
1.主函數
2.頭文件
3.函數文件
后記
前言
? ? ? ?程序設計基礎實驗課項目二:模擬一個網店購物過程(可以說是和雙十一緊密結合了),經過一周的不懈努力(摸魚),終于實現了第一個千行代碼的項目🤯🤯🤯
一、程序運行展示
? ? ? ? 廢話不多說,直接上程序運行截圖:
主要功能有兩大部分,第一部分是用戶界面,每個用戶都有屬于自己的購物車,可以查詢和搜索店鋪中現有的商品,并且增刪改查自己的購物車,當然最主要的功能當然是付款結賬(剁手黨狂喜🥰);第二部分是管理員界面,可以增刪改查店鋪的商品信息和商品數量,同時維護了一個售貨清單,用來記錄所有用戶的購買記錄,并且自動合并同類商品的售貨信息。
除此之外功能(bug)還有很多,歡迎大家自己嘗試~
二、數據結構分析
本項目中采用面向對象式設計,所有變量和函數封裝在一個類shopping中,將問題看作可以嵌套的對象,再一個一個解決。主函數、頭文件、函數實現分別放在三個任務中。這樣做的好處是便于解決購物系統中遇到的繁多而瑣碎的問題,也方便函數之間的調用,讓整體框架更清晰,函數之間的關系更加清晰,主函數簡短。接下來具體展示代碼實現(其中函數主要有四部分:界面實現、管理員功能函數、用戶功能函數和文件操作相關函數)。
三、代碼開源
1.主函數
//main.cpp#include<iostream> #include<fstream> #include<cstring> #include"Shopping.h" using namespace std;int main() //短小精悍的main函數(bushi {Shopping sp;sp.show();system("pause");return 0; }2.頭文件
//Shopping.h#pragma once #include<cstring> using namespace std; const int Max_num = 105;//單個商品結構體,包括兩段ID、名稱、品牌、價格、數量 struct item {char ID_1;int ID_2;string name;string brand;float price;int amount; };//用戶結構體,包括用戶名稱,用戶密碼,收貨地址,用戶購物車 struct user {string name;string password;string address="none";item shopping_car[Max_num];//購物車由商品結構體數組實現int shopping_car_num = 0; //購物車中商品數量 };//已售商品結構體,包括兩段ID、名稱、品牌、價格、已售數量、購買用戶 struct sale_item {char ID_1;int ID_2;string name;string brand;float price;int amount;string my_user; };//新建一個購物系統的類 class Shopping { private:const string admin_ID ="nju_shopping"; //管理員IDconst string admin_passwd = "201830210"; //管理員密碼const char all_items_address[20] = "D:\\庫存.txt"; //庫存文件地址const char sales_list_address[20] = "D:\\已售清單.txt" ; //售貨清單文件地址const char all_users_address[20] = "D:\\用戶.txt"; //用戶列表文件地址const char users_shopping_address[20] = "D:\\收貨地址.txt"; //用戶收貨地址文件地址public:item all_items[Max_num]; //店鋪庫存,由商品結構體數組實現user all_users[Max_num]; //用戶列表,由用戶結構體數組實現sale_item all_sales[Max_num]; //售貨清單,由已售商品結構體數組實現int item_num = 0; //當前庫存商品種類數int user_num = 0; //用戶列表數量int sale_item_num = 0; //售貨清單數量//友好的UI界面void show(); //顯示主界面void users_enter(); //用戶登錄界面void users_register(); //用戶注冊界面void administrator_enter(); //管理員登錄界面void admin_operate(); //管理員操作界面void user_operate(int index,user* this_user); //用戶操作界面,需要的參數為:該用戶在用戶列表中的下標以及該結構體//文件相關操作void read_all_the_items(); //讀取庫存文件void write_all_the_items(); //寫入庫存文件void read_the_sales_list(); //讀取售貨清單void write_the_sales_list(); //寫入售貨清單void read_all_the_users(); //讀取用戶列表void write_all_the_users(); //寫入用戶列表void read_shopping_address(); //讀取收貨地址void write_shopping_address(); //寫入收貨地址void read_shopping_car(user* this_user); //讀取用戶購物車文件void write_shopping_car(user* this_user); //寫入用戶購物車文件//管理員相關操作void show_items(); //查詢商品void add_item(); //增加商品void delete_item(); //刪除商品void change_item(); //修改商品數量void show_sales_list(); //售貨清單//用戶相關操作void visit_items(); //查看商品void search_item(); //商品搜索void add_shopping_car(int index, user* this_user); //添加商品至購物車void delete_shopping_car(int index, user* this_user); //刪除購物車商品void visit_shopping_car(int index, user* this_user); //查看購物車void check_out(int index, user* this_user); //結賬void change_password(int index, user* this_user); //拓展功能:用戶修改密碼void change_address(int index, user* this_user); //拓展功能:管理收貨地址};3.函數文件
#include<iostream> #include<cstring> #include<fstream> #include"Shopping.h" using namespace std;//顯示主界面 void Shopping::show() {cout <<"====================================================================================================" << endl;cout << " ";cout<<"\033[34;1m歡迎使用\033[0m"<<"\033[35;1mNJU_SHOPPING\033[0m"<<"\033[36;1m購物系統,\033[0m"<<"\033[33;1m請輸入對應操作\033[0m" << endl;cout << "====================================================================================================" << endl;cout << "\033[33;1m1.用戶登錄 2.用戶注冊 3.管理員登錄 4.退出系統\033[0m" << endl;int n;cout << "輸入操作:" << endl;cin >> n;while (n != 4){switch (n){case 1:users_enter();break;case 2:users_register();break;case 3:administrator_enter();break;case 8:admin_operate(); //直接登入管理員界面便于debugbreak;case 9:user_operate(0, &all_users[0]);break;default:cout << "\033[31;1m錯誤的操作指令!\033[0m" << endl;break;}cout << "===========================================================" << endl;cout << "\033[33;1m1.用戶登錄 2.用戶注冊 3.管理員登錄 4.退出系統\033[0m" << endl;cout << "輸入操作:" << endl;cin >> n;}cout << "\033[33;1m歡迎下次使用!\033[0m" << endl; }//用戶登錄界面 附加功能:密碼錯誤提示及次數上限 void Shopping::users_enter() {read_all_the_users(); //讀取用戶列表int cnt = 0;while (cnt < 3){string name, passwd;cout << "輸入用戶名:";cin >> name;cout << "輸入密碼:";cin >> passwd;int i;for (i = 0; i < user_num; i++){if (name == all_users[i].name && passwd == all_users[i].password){cout << "*******" << endl;cout << "登錄成功!" << endl;cout << "*******" << endl;user_operate(i,&all_users[i]); //傳入用戶在用戶列表中的下標和結構體指針break;}}if (i < user_num)break;else if(i==user_num){cnt++;cout << "用戶名或密碼錯誤,請再次輸入用戶名與密碼,";cout << "你還有" << 3 - cnt << "次機會" << endl;}}if (cnt == 3)cout << "錯誤次數已達上限,系統關閉!" << endl; }//用戶注冊界面 附加功能:已存在的用戶名或過短的密碼都不符合要求,需要重新輸入 void Shopping::users_register() {read_all_the_users(); //讀取用戶列表string name, passwd;cout << "輸入用戶名:";cin >> name;while (true){int i;for (i = 0; i < user_num; i++){if (all_users[i].name == name){cout << "用戶名已存在,請重新輸入!" << endl;break;}}if (i == user_num) //合法的用戶名break;else if (i < user_num){cout << "輸入用戶名:";cin >> name;}}cout << "輸入密碼:";cin >> passwd;while (passwd.size() <= 3){cout << "密碼長度太短,請重新輸入!" << endl;cout << "輸入密碼:";cin >> passwd;}//新建一個用戶user_num++;all_users[user_num-1].name = name;all_users[user_num-1].password = passwd;all_users[user_num-1].shopping_car_num = 0;write_shopping_car(&all_users[user_num - 1]); //創建購物車文件write_all_the_users(); //寫入用戶列表//注冊成功并登錄cout << "***************" << endl;cout << "注冊成功!登錄成功!" << endl;cout << "***************" << endl;user_operate(user_num-1, &all_users[user_num-1]);//傳入用戶在用戶列表中的下標和結構體指針}//管理員登錄界面 附加功能:密碼錯誤提示及次數上限 void Shopping::administrator_enter() {int cnt = 0;while (cnt < 3){cout << "輸入管理員ID:";string id, passwd;cin >> id;cout << "輸入管理員密碼:";cin >> passwd;if (id == admin_ID && passwd == admin_passwd){cout << "*******" << endl;cout << "登錄成功!" << endl;cout << "*******" << endl;admin_operate();break;}else{cnt++;cout << "ID或密碼錯誤,請再次輸入管理員ID與密碼,";cout << "你還有" << 3 - cnt << "次機會" << endl;}}if (cnt == 3)cout << "錯誤次數已達上限,系統關閉!" << endl; }//文件相關操作 //讀取庫存文件 void Shopping::read_all_the_items() {item_num = 0;//先將庫存貨物種類置為0ifstream in_file(all_items_address, ios::in);if (in_file.is_open() == 0)cout << "打開文件錯誤!" << endl;string a, b, c, d, e;in_file >> a >> b >> c >> d >> e;//讀入文件表頭while (in_file.peek()!=EOF)//讀入庫存數據{in_file >> all_items[item_num].ID_1;in_file >> all_items[item_num].ID_2;in_file >> all_items[item_num].name; in_file >> all_items[item_num].brand;in_file >> all_items[item_num].price; in_file >> all_items[item_num].amount;if(all_items[item_num].ID_1=='F') //用于規避文件結尾的空白行item_num++;} }//寫入庫存文件 void Shopping::write_all_the_items() {//更新的商品信息寫入庫存文件ofstream out_file(all_items_address, ios::out);out_file << "ID" << " " << "名稱" << " " << "品牌" << " " << "價格" << " " << "數量" << endl;for (int i = 0; i < item_num; i++){out_file << all_items[i].ID_1 << "00";if (all_items[i].ID_2 < 10)out_file << "0";out_file << all_items[i].ID_2 << "\t";out_file.width(10);out_file.setf(ios::left);out_file << all_items[i].name << "\t";out_file.width(10);out_file.setf(ios::left);out_file << all_items[i].brand << "\t";out_file.width(10);out_file.setf(ios::left);out_file << all_items[i].price << "\t";out_file.width(10);out_file.setf(ios::left);out_file << all_items[i].amount << "\t";out_file << endl;} }//讀取售貨清單 void Shopping::read_the_sales_list() {sale_item_num = 0;//先將售貨清單數量置為0ifstream in_file(sales_list_address, ios::in);if (in_file.is_open() == 0)cout << "打開文件錯誤!" << endl;string a, b, c, d, e,f;in_file >> a >> b >> c >> d >> e>>f; //讀入文件表頭while (in_file.peek() != EOF) {in_file >> all_sales[sale_item_num].ID_1; in_file >> all_sales[sale_item_num].ID_2;in_file >> all_sales[sale_item_num].name;in_file >> all_sales[sale_item_num].brand;in_file >> all_sales[sale_item_num].price;in_file >> all_sales[sale_item_num].amount;in_file >> all_sales[sale_item_num].my_user;if (all_sales[sale_item_num].ID_1 == 'F') //用于規避文件結尾的空白行sale_item_num++;} }//寫入售貨清單 void Shopping::write_the_sales_list() {//更新的售貨清單寫入文件ofstream out_file(sales_list_address, ios::out);out_file << "ID" << " " << "名稱" << " " << "品牌" << " " << "價格" << " " << "數量" <<" "<<"用戶名"<< endl;for (int i = 0; i < sale_item_num; i++){out_file << all_sales[i].ID_1 << "00";if (all_sales[i].ID_2 < 10)out_file << "0";out_file << all_sales[i].ID_2 << "\t";out_file.width(10);out_file.setf(ios::left);out_file << all_sales[i].name << "\t";out_file.width(10);out_file.setf(ios::left);out_file << all_sales[i].brand << "\t";out_file.width(10);out_file.setf(ios::left);out_file << all_sales[i].price << "\t";out_file.width(10);out_file.setf(ios::left);out_file << all_sales[i].amount << "\t";out_file.width(10);out_file.setf(ios::left);out_file << all_sales[i].my_user << "\t";out_file << endl;} }//讀取用戶列表 void Shopping::read_all_the_users() {user_num = 0;//先將用戶數量置為0ifstream in_file(all_users_address, ios::in);if (in_file.is_open() == 0)cout << "打開文件錯誤!" << endl;string a, b;in_file >> a >> b ; //讀入文件表頭while (in_file.peek() != EOF) {in_file >> all_users[user_num].name;in_file >> all_users[user_num].password;if (all_users[user_num].name[0]>='a'&& all_users[user_num].name[0]<='z') //用于規避文件結尾的空白行user_num++;} }//寫入用戶列表 void Shopping::write_all_the_users() {//更新的用戶列表寫入庫存文件ofstream out_file(all_users_address, ios::out);out_file << "用戶名\t"<< "密碼\t\t" <<endl;for (int i = 0; i < user_num; i++){out_file.width(10);out_file.setf(ios::left);out_file << all_users[i].name << "\t";out_file.width(10);out_file.setf(ios::left);out_file << all_users[i].password << "\t";out_file << endl;} }//讀取收貨地址 void Shopping::read_shopping_address() {read_all_the_users(); //先讀取用戶列表ifstream in_file(users_shopping_address, ios::in);if (in_file.is_open() == 0)cout << "打開文件錯誤!" << endl;string a, b;in_file >> a >> b; //讀入文件表頭while (in_file.peek() != EOF) {string name,address;in_file >> name >> address;for (int i = 0; i < user_num; i++)if (name == all_users[i].name) //找到該用戶all_users[i].address = address; //修改該用戶地址} }//寫入收貨地址 void Shopping::write_shopping_address() {read_all_the_users(); //先讀取用戶列表//更新的收貨地址寫入文件ofstream out_file(users_shopping_address, ios::out);out_file << "用戶名\t" << "收貨地址\t\t" << endl;for (int i = 0; i < user_num; i++){out_file.width(10);out_file.setf(ios::left);out_file << all_users[i].name << "\t";out_file.width(10);out_file.setf(ios::left);out_file << all_users[i].address << "\t";out_file << endl;} }//讀取用戶購物車 void Shopping::read_shopping_car(user* this_user) {this_user->shopping_car_num = 0;//先將購物車商品種類置為0string shopping_car_address = "D:\\" + this_user->name + ".txt";//設置購物車文件地址ifstream in_file(shopping_car_address, ios::in);if (in_file.is_open() == 0)cout << "打開文件錯誤!" << endl;string a, b, c, d, e;in_file >> a >> b >> c >> d >> e; //讀入文件表頭while (!in_file.eof()) //讀入庫存數據{in_file >> this_user->shopping_car[this_user->shopping_car_num].ID_1;in_file >> this_user->shopping_car[this_user->shopping_car_num].ID_2;in_file >> this_user->shopping_car[this_user->shopping_car_num].name;in_file >> this_user->shopping_car[this_user->shopping_car_num].brand;in_file >> this_user->shopping_car[this_user->shopping_car_num].price;in_file >> this_user->shopping_car[this_user->shopping_car_num].amount;if (this_user->shopping_car[this_user->shopping_car_num].ID_1 == 'F') //用于規避文件結尾的空白行this_user->shopping_car_num++;} }//寫入用戶購物車 void Shopping::write_shopping_car(user* this_user) {//更新的用戶購物車寫入庫存文件string shopping_car_address = "D:\\" + this_user->name + ".txt";//設置購物車文件地址ofstream out_file(shopping_car_address, ios::out);if (this_user->shopping_car_num != 0){out_file << "ID" << " " << "名稱" << " " << "品牌" << " " << "價格" << " " << "數量" << endl;for (int i = 0; i < this_user->shopping_car_num; i++){out_file << this_user->shopping_car[i].ID_1 << "00";if (this_user->shopping_car[i].ID_2 < 10)out_file << "0";out_file << this_user->shopping_car[i].ID_2 << "\t";out_file.width(10);out_file.setf(ios::left);out_file << this_user->shopping_car[i].name << "\t";out_file.width(10);out_file.setf(ios::left);out_file << this_user->shopping_car[i].brand << "\t";out_file.width(10);out_file.setf(ios::left);out_file << this_user->shopping_car[i].price << "\t";out_file.width(10);out_file.setf(ios::left);out_file << this_user->shopping_car[i].amount << "\t";out_file << endl;}} }//管理員相關操作 //管理員操作界面 void Shopping::admin_operate() {cout << "=========================================================================================" << endl;cout << "\033[33;1m0.注銷登錄 1.查詢商品 2.增加商品 3.刪除商品 4.修改產品數量 5.查詢售貨清單\033[0m" << endl;cout << "輸入操作:";int n;cin >> n;while (n != 0){switch (n){case 1:show_items();break;case 2:add_item();break;case 3:delete_item();break;case 4:change_item();break;case 5:show_sales_list();break;default:cout << "\033[31;1m錯誤的操作指令!\033[0m" << endl;break;}cout << "=========================================================================================" << endl;cout << "\033[33;1m0.注銷登錄 1.查詢商品 2.增加商品 3.刪除商品 4.修改產品數量 5.售貨清單\033[0m" << endl;cout << "輸入操作:" << endl;cin >> n;}cout << "退出登錄!" << endl; }//管理員查詢商品,先讀入庫存文件,再進行輸出 void Shopping::show_items() {read_all_the_items(); //讀入庫存文件//輸出庫存商品數據,數量為0的商品也要輸出if (item_num == 0)cout << "當前庫存為空!" << endl;else {cout << "********************************************************************************" << endl;cout << "ID" << " " << "名稱" << " " << "品牌" << " " << "價格" << " " << "數量" << endl;for (int i = 0; i < item_num; i++){//輸出庫存商品信息,通過控制位寬和制表符實現整齊的順序if (all_items[i].amount >= 0||all_items[i].amount==-1){cout << all_items[i].ID_1 << "00";if (all_items[i].ID_2 < 10)cout << "0";cout<< all_items[i].ID_2 << "\t\t";cout.width(10);cout.setf(ios::left);cout << all_items[i].name<<"\t";cout.width(10);cout.setf(ios::left);cout << all_items[i].brand << "\t";cout.width(10);cout.setf(ios::left);cout << all_items[i].price << "\t";cout.width(10);cout.setf(ios::left);cout << all_items[i].amount << "\t";cout << endl;}}cout << "********************************************************************************" << endl;} }//管理員添加商品,先讀入庫存文件,再添加商品,最后寫入庫存文件 void Shopping::add_item() {read_all_the_items();cout << "請輸入要進貨的商品ID:";string s;cin >> s;//獲取新增商品的ID,存入number變量int number;if (s[3] == '0')number = s[4] - '0';elsenumber = (s[4] - '0') + (s[3] - '0') * 10;int i = 0;for(i=0;i<item_num;i++){if (all_items[i].ID_2 == number){int n;cout << "新增該商品的數量為:";cin >> n;all_items[i].amount += n;cout << "新增成功!該商品現在的數量為" << all_items[i].amount << endl;break;}}if (i == item_num&&item_num<Max_num) //沒有找到對應的ID,新建一種商品{item_num++; //商品種類數+1all_items[item_num-1].ID_1 = all_items[item_num - 2].ID_1; //開頭序號相同all_items[item_num-1].ID_2 = all_items[item_num - 2].ID_2+1; //序號編碼+1cout << "庫存中沒有找到對應ID,將自動新建一種商品,請輸入該商品的名稱:";cin >> all_items[item_num-1].name;cout << "請輸入該商品的品牌:";cin >> all_items[item_num-1].brand;cout << "請輸入該商品的價格:";cin >> all_items[item_num-1].price;cout << "請輸入該商品的數量:";cin >> all_items[item_num-1].amount;cout << "添加成功!" << endl;}//更新的商品信息寫入庫存文件write_all_the_items(); }//管理員刪除商品,先讀入庫存文件,再刪除商品,最后寫入庫存文件 void Shopping::delete_item() {read_all_the_items();cout << "請輸入要刪除的商品ID:";string s;cin >> s;//獲取刪除商品的ID,存入number變量int number;if (s[3] == '0')number = s[4] - '0';elsenumber = (s[4] - '0') + (s[3] - '0') * 10;int i = 0;for (i = 0; i < item_num; i++){if (all_items[i].ID_2 == number){all_items[i].amount = -1;cout << "刪除成功!" << endl;break;}}if (i == item_num) //沒有找到對應的IDcout << "沒有找到對應的商品!" << endl;//更新的商品信息寫入庫存文件write_all_the_items(); }//管理員修改商品,先讀入庫存文件,再修改商品信息,最后寫入庫存文件 void Shopping::change_item() {read_all_the_items();cout << "請輸入要修改的商品ID:";string s;cin >> s;//獲取修改商品的ID,存入number變量int number;if (s[3] == '0')number = s[4] - '0';elsenumber = (s[4] - '0') + (s[3] - '0') * 10;int i = 0;for (i = 0; i < item_num; i++){if (all_items[i].ID_2 == number){cout << "請輸入要修改的商品信息:1.名稱 2.品牌 3.價格 4.數量" << endl;cout << "請輸入操作:";int n;cin >> n;string str;switch (n){case 1:cout << "請輸入修改后的名稱:";cin >> str;all_items[i].name = str;cout << "修改成功!" << endl;break;case 2:cout << "請輸入修改后的品牌:";cin >> str;all_items[i].brand = str;cout << "修改成功!" << endl;break;case 3:cout << "請輸入修改后的價格:";float x;cin >> x;all_items[i].price = x;if (x < 0)cout << "修改失敗!價格不能為負!" << endl;elsecout << "修改成功!" << endl;break;case 4:cout << "請輸入修改后的數量:";int amt;cin >> amt;all_items[i].amount = amt;cout << "修改成功!" << endl;break;default:cout << "錯誤的操作數!" << endl;break;}break;}}if (i == item_num) //沒有找到對應的IDcout << "沒有找到對應的商品!" << endl;//更新的商品信息寫入庫存文件write_all_the_items(); }//管理員查詢售出清單,先讀文件,再合并同類項,最后按照ID升序輸出 void Shopping::show_sales_list() {read_the_sales_list(); //讀取售貨清單//根據ID冒泡排序for(int i=0; i<sale_item_num-1; i++)for (int j = 0; j < sale_item_num - i - 1; j++){//若前者ID大于后者,結構體內容交換if (all_sales[j].ID_2 > all_sales[j + 1].ID_2){int temp1 = all_sales[j].ID_2;all_sales[j].ID_2 = all_sales[j + 1].ID_2;all_sales[j + 1].ID_2 = temp1;char temp2 = all_sales[j].ID_1;all_sales[j].ID_1 = all_sales[j + 1].ID_1;all_sales[j + 1].ID_1 = temp2;string temp3 = all_sales[j].name;all_sales[j].name = all_sales[j + 1].name;all_sales[j + 1].name = temp3;string temp4 = all_sales[j].brand;all_sales[j].brand = all_sales[j + 1].brand;all_sales[j + 1].brand = temp4;float temp5 = all_sales[j].price;all_sales[j].price = all_sales[j + 1].price;all_sales[j + 1].price = temp5;int temp6 = all_sales[j].amount;all_sales[j].amount = all_sales[j + 1].amount;all_sales[j + 1].amount = temp6;string temp7 = all_sales[j].my_user;all_sales[j].my_user = all_sales[j + 1].my_user;all_sales[j + 1].my_user = temp7;}}//合并同類項,對于相同的商品將已售數量累加到第一條記錄中,其余置為-1for (int i = 0; i < sale_item_num - 1; i++){if (all_sales[i].amount == -1)continue;for (int j = i + 1; j < sale_item_num ; j++){if (all_sales[j].amount == -1)continue;if (all_sales[i].ID_2 == all_sales[j].ID_2 && all_sales[i].name == all_sales[j].name && all_sales[i].brand == all_sales[j].brand && all_sales[i].price == all_sales[j].price){all_sales[i].amount += all_sales[j].amount;all_sales[j].amount = -1;}}}if (sale_item_num == 0)cout << "當前售貨清單為空!" << endl;else{cout << "********************************************************************************" << endl;cout << "ID" << " " << "名稱" << " " << "品牌" << " " << "價格" << " " << "已售數量" << endl;for (int i = 0; i < sale_item_num; i++){//輸出庫存商品信息,通過控制位寬和制表符實現整齊的順序if (all_sales[i].amount > 0){cout << all_sales[i].ID_1 << "00";if (all_sales[i].ID_2 < 10)cout << "0";cout << all_sales[i].ID_2 << "\t\t";cout.width(10);cout.setf(ios::left);cout << all_sales[i].name << "\t";cout.width(10);cout.setf(ios::left);cout << all_sales[i].brand << "\t";cout.width(10);cout.setf(ios::left);cout << all_sales[i].price << "\t";cout.width(10);cout.setf(ios::left);cout << all_sales[i].amount << "\t";cout << endl;}}cout << "********************************************************************************" << endl;} }//用戶相關操作 //用戶操作界面 void Shopping::user_operate(int index, user* this_user) {cout << "=========================================================================================" << endl;cout << "\033[33;1m1.注銷登錄 2.查看商品 3.商品搜索 4.添加商品至購物車\033[0m" << endl;cout << "\033[33;1m5.刪除購物車商品 6.查看購物車 7.結賬 8.修改密碼 9.管理收貨地址\033[0m" << endl;cout << "輸入操作:";int n;cin >> n;write_shopping_address();while (n != 1){switch (n){case 2:visit_items();break;case 3:search_item();break;case 4:add_shopping_car(index, this_user);break;case 5:delete_shopping_car(index, this_user);break;case 6:visit_shopping_car(index, this_user);break;case 7:check_out(index, this_user);break;case 8:change_password(index, this_user);break;case 9:change_address(index, this_user);break;default:cout << "\033[31;1m錯誤的操作指令!\033[0m" << endl;break;}cout << "=========================================================================================" << endl;cout << "\033[33;1m1.注銷登錄 2.查看商品 3.商品搜索 4.添加商品至購物車\033[0m" << endl;cout << "\033[33;1m5.刪除購物車商品 6.查看購物車 7.結賬 8.修改密碼 9.管理收貨地址\033[0m" << endl;cout << "輸入操作:" << endl;cin >> n;}cout << "退出登錄!" << endl; }//用戶查看商品,讀入庫存文件,再按要求輸出 void Shopping::visit_items() {read_all_the_items(); //讀入庫存文件//輸出庫存商品數據,數量為0的商品不需要輸出if (item_num == 0)cout << "當前庫存為空!" << endl;else{cout << "********************************************************************************" << endl;cout << "ID" << " " << "名稱" << " " << "品牌" << " " << "價格" << " " << "數量" << endl;for (int i = 0; i < item_num; i++){//輸出庫存商品信息,通過控制位寬和制表符實現整齊的順序if (all_items[i].amount > 0){cout << all_items[i].ID_1 << "00";if (all_items[i].ID_2 < 10)cout << "0";cout << all_items[i].ID_2 << "\t\t";cout.width(10);cout.setf(ios::left);cout << all_items[i].name << "\t";cout.width(10);cout.setf(ios::left);cout << all_items[i].brand << "\t";cout.width(10);cout.setf(ios::left);cout << all_items[i].price << "\t";cout.width(10);cout.setf(ios::left);cout << all_items[i].amount << "\t";cout << endl;}}cout << "********************************************************************************" << endl;} }//用戶搜索商品 擴展功能:可選擇名稱+品牌的搜索方式 void Shopping::search_item() {read_all_the_items(); //讀取庫存string choice; //選擇搜索方式cout << "請選擇商品搜索方式:1.名稱搜索 2.名稱+品牌搜索" << endl;cout << "請輸入商品搜索方式:";cin >> choice;//第一種搜索方式if (choice == "1"){int flag = 0; //表示搜索是否成功cout << "請輸入商品名稱:";string name;cin >> name;for (int i = 0; i < item_num; i++){if (all_items[i].amount > 0&&all_items[i].name == name) //搜索成功{if (flag == 0) //如果是搜索到的第一個商品,輸出表頭{cout << "********************************************************************************" << endl;cout << "ID" << " " << "名稱" << " " << "品牌" << " " << "價格" << " " << "數量" << endl;flag = 1;}//輸出搜索結果cout << all_items[i].ID_1 << "00";if (all_items[i].ID_2 < 10)cout << "0";cout << all_items[i].ID_2 << "\t\t";cout.width(10);cout.setf(ios::left);cout << all_items[i].name << "\t";cout.width(10);cout.setf(ios::left);cout << all_items[i].brand << "\t";cout.width(10);cout.setf(ios::left);cout << all_items[i].price << "\t";cout.width(10);cout.setf(ios::left);cout << all_items[i].amount << "\t";cout << endl;}}if (flag == 1) //搜索成功,輸出表尾cout << "********************************************************************************" << endl;else //搜索失敗,輸出提示語cout << "未找到該商品,試試換一個詞搜索吧!" << endl;}//第二種搜索方式else if(choice=="2"){int flag = 0; //表示搜索是否成功cout << "請輸入商品名稱:";string name;cin >> name;cout << "請輸入商品品牌:";string brand;cin >> brand;for (int i = 0; i < item_num; i++){if (all_items[i].amount > 0&&all_items[i].name == name&& all_items[i].brand == brand) //搜索成功{if (flag == 0) //如果是搜索到的第一個商品,輸出表頭{cout << "********************************************************************************" << endl;cout << "ID" << " " << "名稱" << " " << "品牌" << " " << "價格" << " " << "數量" << endl;flag = 1;}//輸出搜索結果cout << all_items[i].ID_1 << "00";if (all_items[i].ID_2 < 10)cout << "0";cout << all_items[i].ID_2 << "\t\t";cout.width(10);cout.setf(ios::left);cout << all_items[i].name << "\t";cout.width(10);cout.setf(ios::left);cout << all_items[i].brand << "\t";cout.width(10);cout.setf(ios::left);cout << all_items[i].price << "\t";cout.width(10);cout.setf(ios::left);cout << all_items[i].amount << "\t";cout << endl;}}if (flag == 1) //搜索成功,輸出表尾cout << "********************************************************************************" << endl;else //搜索不成功,輸出提示語cout << "未找到該商品,試試換一個詞搜索吧!" << endl;}elsecout << "\033[31;1m錯誤的操作指令!\033[0m" << endl; }//用戶添加商品至購物車 void Shopping::add_shopping_car(int index, user* this_user) {read_all_the_items(); //讀取庫存read_shopping_car(this_user); //讀取該用戶購物車cout << "輸入添加至購物車的商品ID:";string id;cin >> id;//獲取新增商品的ID編號,存入number變量int number;if (id[3] == '0')number = id[4] - '0';elsenumber = (id[4] - '0') + (id[3] - '0') * 10;cout << "輸入添加至購物車的商品數量:";int amount;cin >> amount;int i;for (i = 0; i < this_user->shopping_car_num; i++){if (this_user->shopping_car[i].ID_2 == number){int index = 0; //用來記錄該商品在購物車中的下標for(int j=0;j<item_num;j++)if (all_items[j].ID_2 = number)index = j;if (amount > all_items[index].amount)//添加數量超過庫存,添加失敗{cout << "添加失敗!添加數量超過商品庫存,請修改!" << endl;break;}else //添加成功 {this_user->shopping_car[i].amount += amount;cout << "***************" << endl;cout << "加入購物車成功!" << endl;cout << "***************" << endl;write_shopping_car(this_user);break;} }}if (i == this_user->shopping_car_num) //購物車中未找到對應ID{int j;for(j=0;j<item_num;j++)if (all_items[j].ID_2 == number) //在庫存中找到了對應ID{if (number > all_items[i].amount) //添加數量超過庫存,添加失敗{cout << "添加失敗!添加數量超過商品庫存,請修改!" << endl;break;}else //添加成功,購物車種類加一{this_user->shopping_car_num++;this_user->shopping_car[this_user->shopping_car_num - 1].ID_1 = all_items[j].ID_1;this_user->shopping_car[this_user->shopping_car_num - 1].ID_2 = number;this_user->shopping_car[this_user->shopping_car_num - 1].name = all_items[j].name;this_user->shopping_car[this_user->shopping_car_num - 1].brand = all_items[j].brand;this_user->shopping_car[this_user->shopping_car_num - 1].price = all_items[j].price;this_user->shopping_car[this_user->shopping_car_num - 1].amount = amount;write_shopping_car(this_user);cout << "***************" << endl;cout << "加入購物車成功!" << endl;cout << "***************" << endl;break;}}if(j==item_num){cout << "店鋪中沒找到該ID對應的商品,請檢查是否輸入正確!" << endl;}}//展示購物車cout << "購物車中現在有:" << endl;visit_shopping_car(index, this_user); }//用戶刪除購物車商品 void Shopping::delete_shopping_car(int index, user* this_user) {read_shopping_car(this_user); //讀取該用戶購物車cout << "輸入待刪除的商品ID:";string id;cin >> id;//獲取待刪除商品的ID編號,存入number變量int number;if (id[3] == '0')number = id[4] - '0';elsenumber = (id[4] - '0') + (id[3] - '0') * 10;cout << "輸入待刪除商品的數量:";int amount;cin >> amount;int i;for (i = 0; i < this_user->shopping_car_num; i++){if (this_user->shopping_car[i].ID_2 == number){this_user->shopping_car[i].amount -=amount;write_shopping_car(this_user);cout << "**********" << endl;cout << "刪除成功!" << endl;cout << "**********" << endl;break;}}if(i== this_user->shopping_car_num)cout<<"購物車中沒有該ID對應的商品,請檢查是否輸入錯誤!"<<endl;//展示購物車cout << "購物車中現在有:" << endl;visit_shopping_car(index, this_user);}//用戶查看購物車,先讀取對應的購物車文件再輸出 void Shopping::visit_shopping_car(int index, user* this_user) {read_shopping_car(this_user); //讀入庫存文件//輸出庫存商品數據,數量為0的商品也要輸出if (this_user->shopping_car_num == 0)cout << "當前購物車為空!去別處逛逛吧!" << endl;else{cout << "********************************************************************************" << endl;cout << "ID" << " " << "名稱" << " " << "品牌" << " " << "價格" << " " << "數量" << endl;for (int i = 0; i < this_user->shopping_car_num; i++){//輸出庫存商品信息,通過控制位寬和制表符實現整齊的順序if (this_user->shopping_car[i].amount > 0){cout << this_user->shopping_car[i].ID_1 << "00";if (this_user->shopping_car[i].ID_2 < 10)cout << "0";cout << this_user->shopping_car[i].ID_2 << "\t\t";cout.width(10);cout.setf(ios::left);cout << this_user->shopping_car[i].name << "\t";cout.width(10);cout.setf(ios::left);cout << this_user->shopping_car[i].brand << "\t";cout.width(10);cout.setf(ios::left);cout << this_user->shopping_car[i].price << "\t";cout.width(10);cout.setf(ios::left);cout << this_user->shopping_car[i].amount << "\t";cout << endl;}}cout << "********************************************************************************" << endl;} }//用戶結賬,需要修改用戶購物車、庫存和售貨清單 void Shopping::check_out(int index, user* this_user) {//讀取庫存,購物車,收貨地址和售貨清單read_all_the_items();read_shopping_car(this_user);read_the_sales_list();read_shopping_address();visit_shopping_car(index, this_user);if (this_user->shopping_car_num > 0){if (this_user->address == "none"){string address;cout << "當前收貨地址為空,請設置一個收貨地址:";cin >> address;this_user->address = address;write_shopping_address();cout << "設置成功!" << endl;}cout << "當前收貨地址為:" << this_user->address << endl;float money = 0; //待付金額=sum(單價*數量)for (int i = 0; i < this_user->shopping_car_num; i++)money += this_user->shopping_car[i].price * this_user->shopping_car[i].amount;cout << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" << endl;cout << "\033[31;1m一共需要付款\033[0m" << money << "\033[31;1m元!\033[0m";cout << "\033[31;1m確認付款請按1,取消付款請按0,請輸入操作:\033[0m";int choice;cin >> choice;cout << ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" << endl;if (choice == 0)cout << "已取消付款!" << endl;else if (choice == 1){//修改庫存for (int i = 0; i < this_user->shopping_car_num; i++){int num = this_user->shopping_car[i].ID_2;for (int j = 0; j < item_num; j++)if (all_items[j].ID_2 == num)all_items[j].amount -= this_user->shopping_car[i].amount;}write_all_the_items();//修改售貨清單for (int i = 0; i < this_user->shopping_car_num; i++){sale_item_num++;all_sales[sale_item_num - 1].ID_1 = this_user->shopping_car[i].ID_1;all_sales[sale_item_num - 1].ID_2 = this_user->shopping_car[i].ID_2;all_sales[sale_item_num - 1].name = this_user->shopping_car[i].name;all_sales[sale_item_num - 1].brand = this_user->shopping_car[i].brand;all_sales[sale_item_num - 1].price = this_user->shopping_car[i].price;all_sales[sale_item_num - 1].amount = this_user->shopping_car[i].amount;all_sales[sale_item_num - 1].my_user = this_user->name;}write_the_sales_list();//清空用戶購物車for (int i = 0; i < this_user->shopping_car_num; i++)this_user->shopping_car[i].amount = 0;write_shopping_car(this_user);//輸出提示語cout << "**********" << endl;cout << "付款成功!" << endl;cout << "**********" << endl;}}}//拓展功能:用戶修改密碼 void Shopping::change_password(int index, user* this_user) {cout << "請輸入原密碼:";string old_pass;cin >> old_pass;if (old_pass == this_user->password){string new_pass;cout << "請輸入新密碼:";cin >> new_pass;//設置新密碼長度大于三位while (new_pass.size() <= 3){cout << "密碼長度太短,請重新輸入!" << endl;cout << "輸入密碼:";cin >> new_pass;}this_user->password = new_pass;write_all_the_users();cout << "**********" << endl;cout << "修改成功!" << endl;cout << "**********" << endl;}elsecout << "密碼輸入錯誤,修改失敗!" << endl; }//拓展功能:管理收貨地址 void Shopping::change_address(int index, user* this_user) {read_shopping_address(); //讀取收貨地址if (this_user->address != "none") //當前地址不為空{string address;cout << "當前的收貨地址為:" << this_user->address << endl;cout << "修改后的收貨地址為:";cin >> address;this_user->address = address;cout << "**********" << endl;cout << "修改成功!" << endl;cout << "**********" << endl;}else{cout << "當前地址為空,請輸入你的收貨地址:";string address;cin >> address;this_user->address = address;cout << "**********" << endl;cout << "修改成功!" << endl;cout << "**********" << endl;}write_shopping_address(); //寫入文件中 }//完結撒花?
后記
該項目是基于VS2019控制臺和文件實現的,所以想要自己嘗試的同學可以下載我分享在個人空間里的項目文件。另外課程PPT以及用戶手冊PPT我也會上傳在個人空間里,能力有限,程序代碼難免有許多不足,歡迎聯系我交流討論:201830210@smail.nju.edu.cn
本項目所有代碼均為純手打,版權所有,嚴禁抄襲,轉載請注明出處。
總結
以上是生活随笔為你收集整理的【项目源码分享】基于C++实现的网店购物管理系统(VS2019控制台)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数据结构】C++单链表实现多项式加法(
- 下一篇: 【项目源码分享】基于C++实现的小型数据