C語言實現電話訂餐管理系統
本文實例為大傢分享瞭C語言實現電話訂餐管理系統的具體代碼,供大傢參考,具體內容如下
這是我C語言課程設計的題目。非常奇怪啊,下面的代碼能在C-Free中跑起來,卻沒辦法在vc++6.0中跑起來。可能是編譯器支持的標準不一樣。不管他,反正老師不會把我的代碼打一遍,然後放到vc中去運行。
實現瞭4個功能:添加、查找、修改、刪除,同時會把信息寫入到同一目錄下的customer.dat文件中。(這個文件需要手動建立,沒有建立的話程序會不運行。)。
能力有限,錯誤在所難免,歡迎指出。
代碼:
/* * 電話訂餐處理系統 * 第八組C語言課程設計 * 佛祖保佑,永無 BUG */ #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<time.h> void PrintMenu(); // 聲明主界面函數 void AddCustomerInfo(); // 聲明添加顧客訂餐信息的函數 void ModifyCustmoerInfo(); // 聲明修改顧客訂餐信息的函數,記得加參數 void DeleteCustomerInfo(); // 聲明刪除顧客訂餐信息的函數,記得加參數 int searchdata();// 查找顧客訂餐信息並返回值 void SearchCustomerInfo();// 聲明查詢顧客訂餐信息的函數,記得加參數 void ViewAllInfo(); // 聲明預覽全部訂餐信息的函數,記得加參數 void ColorChange(int); // 聲明修改背景&字體顏色的函數 void Cutline(); // 聲明分界線函數 int Unix2Time();// 聲明時間戳轉換為普通時間的函數 void Time2Unix(time_t,char,char []);// 聲明普通時間轉換為時間戳的函數 void GetAllInfo();//獲取所有顧客的全部信息 void SetConsolSize(int x,int y);//定義修改緩沖區大小的函數 static int n=0;// 定義一個全局變量n用來獲取總共有多少顧客信息 // 聲明一個顧客的結構體變量 struct Customer { char no[15]; char name[20]; char phoneNumber[20]; char booktime[40]; int num; char other[200]; char ordertime[40]; }customer[100],custmp; int main() { int choice; SetConsoleTitle("電話訂餐系統"); GetAllInfo(); system("mode con cols=150 lines=40");// 調用cmd命令修改窗口大小 SetConsolSize(150,999);//修改緩沖區的大小 printf("歡迎使用電話訂餐系統!\n"); printf("請輸入菜單前標號以執行操作\n"); PrintMenu: PrintMenu(); //ColorChange(5); GetChoice: fflush(stdin); choice=-1;//重置choice的值 printf("\n請輸入你的選項 >"); scanf("%d",&choice); fflush(stdin); // 清空緩沖區,防止scanf接受多餘的回車導致死循環 switch(choice) { case 1:AddCustomerInfo();break; case 2:ModifyCustmoerInfo();break; case 3:DeleteCustomerInfo();break; case 4:SearchCustomerInfo();break; case 5:ViewAllInfo();break; case 6:goto PrintMenu;break; case 0:exit(0); default:{ Cutline(); ColorChange(4); printf("輸入錯誤!請重新輸入!\n"); ColorChange(-1); Cutline(); } } goto GetChoice; } void PrintMenu()//打印菜單函數 { printf("┏━━━━━━━━━━━━━━━━┓\n"); printf("┃ 0. 退出本系統 ┃\n"); printf("┃ 1. 錄入訂餐信息┃\n"); printf("┃ 2. 修改訂餐信息┃\n"); printf("┃ 3. 刪除訂餐信息┃\n"); printf("┃ 4. 查詢訂餐信息┃\n"); printf("┃ 5. 預覽訂餐信息┃\n"); printf("┃ 6. 顯示菜單 ┃\n"); printf("┗━━━━━━━━━━━━━━━━┛\n"); } void ColorChange(int color)//改變字體顏色函數 { HANDLE SELF = GetStdHandle(STD_OUTPUT_HANDLE); if(color==-1) SetConsoleTextAttribute(SELF,7); SetConsoleTextAttribute(SELF,color); } void Cutline()//顯示一條分割線 { printf("————————————\n"); } void AddCustomerInfo()//追加一條顧客的信息 { FILE *fp; Cutline(); //嘗試打開顧客數據文件 customer.dat if((fp=fopen(".\\customer.dat","rb"))==NULL) { ColorChange(4); printf("打開顧客數據文件失敗!\n"); //printf("寫入顧客信息失敗!"); ColorChange(7); Cutline(); return; } //輸入顧客的訂餐信息 printf("請輸入顧客姓名 >"); scanf("%[^\n]s",custmp.name); fflush(stdin); //清空緩沖區 printf("請輸入顧客電話 >"); scanf("%s",custmp.phoneNumber); fflush(stdin); printf("請輸入顧客的預定時間 >"); scanf("%[^\n]s",custmp.booktime); fflush(stdin); printf("請輸入用餐的人數 >"); scanf("%d",&custmp.num); fflush(stdin); printf("請輸入顧客的備註 >"); scanf("%[^\n]s",custmp.other); fflush(stdin); // 生成以時間為編號的顧客編號 time_t rawtime; time(&rawtime); Time2Unix(rawtime,'t',custmp.ordertime); Time2Unix(rawtime,'n',custmp.no); fclose(fp); //將顧客的數據文件寫入到 customer.dat中去 fp=fopen(".\\customer.dat","ab"); fwrite(&custmp,sizeof(struct Customer),1,fp); fclose(fp); Cutline(); } void ModifyCustmoerInfo()//修改顧客訂餐信息 { char target[40]; int no,choice; long int movesize; no=searchdata(); printmenu: printf("\n查詢到下列顧客信息:\n"); printf("\n編號\t\t姓名\t\t電話\t\t用餐人數 預定日期\t\t\t下單日期\t\t\t備註\n"); ColorChange(240); printf("%-16s",customer[no].no); printf("%-16s",customer[no].name); printf("%-16s",customer[no].phoneNumber); printf("%-11d",customer[no].num); printf("%-30s",customer[no].booktime); printf("%-31s",customer[no].ordertime); printf("%-39s\n",customer[no].other); ColorChange(-1); printf("┏━━━━━━━━━━━━━━┓\n"); printf("┃0.結束修改 ┃\n"); printf("┃1.姓名 ┃\n"); printf("┃2.電話 ┃\n"); printf("┃3.用餐人數 ┃\n"); printf("┃4.預定日期 ┃\n"); printf("┃5.備註 ┃\n"); printf("┃6.重新選擇顧客┃\n"); printf("┗━━━━━━━━━━━━━━┛\n"); GetModifiedInfo: Cutline(); printf("\n請選擇你要修改的項目 >"); scanf("%d",&choice); //菜單分支 switch(choice) { case 1:{ printf("請輸入更正後的內容 >"); scanf("%s",customer[no].name); goto WriteCustData; }break; case 2:{ printf("請輸入更正後的內容 >"); scanf("%s",customer[no].phoneNumber); goto WriteCustData; }break; case 3:{ printf("請輸入更正後的內容 >"); scanf("%d",&customer[no].num); goto WriteCustData; }break; case 4:{ printf("請輸入更正後的內容 >"); scanf("%s",customer[no].booktime); goto WriteCustData; }break; case 5:{ printf("請輸入更正後的內容 >"); scanf("%s",customer[no].other); goto WriteCustData; }break; case 6:{ no=searchdata(); goto printmenu; } case 0:return; default:{ ColorChange(4); printf("輸入錯誤!"); ColorChange(-1); goto GetModifiedInfo; }break; } //將要修改的顧客信息定點在customer.dat文件中覆蓋修改 WriteCustData: movesize=no*sizeof(struct Customer); printf("movesize is %d\n",movesize); FILE *fp; fp=fopen(".\\customer.dat","r+"); rewind(fp); fseek(fp,1L*(movesize),0); fwrite(&customer[no],sizeof(struct Customer),1,fp); fclose(fp); goto GetModifiedInfo; } void DeleteCustomerInfo() { int i,no; no=searchdata(); char choice; FILE *fp; printf("\n查詢到下列顧客信息:\n"); printf("\n編號\t\t姓名\t\t電話\t\t用餐人數 預定日期\t\t\t下單日期\t\t\t備註\n"); ColorChange(240); printf("%-16s",customer[no].no); printf("%-16s",customer[no].name); printf("%-16s",customer[no].phoneNumber); printf("%-11d",customer[no].num); printf("%-30s",customer[no].booktime); printf("%-31s",customer[no].ordertime); printf("%-39s\n",customer[no].other); ColorChange(-1); ColorChange(4); printf("\n是否刪除這個用戶的數據?(y/n) >"); fflush(stdin); scanf("%c",&choice); ColorChange(7); if(choice=='n'||choice=='N') { printf("\n返回主菜單...\n"); return; } if(choice=='y'||choice=='Y') { GetAllInfo(); fp=fopen(".\\customer.dat","wb"); fclose(fp); fp=fopen(".\\customer.dat","ab"); printf("%d,%d",n,no); for(i=0;i<=(n-1);i++) { if(i==no) continue; fwrite(&customer[i],sizeof(struct Customer),1,fp); } fclose(fp); } } int searchdata()//根據所給的條件尋找對應的顧客i { GetAllInfo(); char target[100]; printf("\n請輸入用戶任意單項信息 >"); scanf("%s",target); int i,res1,res2,res3; for(i=0;i<=(n-1);i++) { res1=memcmp(target,customer[i].no,strlen(customer[i].no)); res2=memcmp(target,customer[i].name,strlen(customer[i].name)); res3=memcmp(target,customer[i].phoneNumber,strlen(customer[i].phoneNumber)); if(!(res1&&res2&&res3)) return i; } return -1; } void SearchCustomerInfo() { int no=searchdata(); printf("\n查詢到下列顧客信息:\n"); printf("\n編號\t\t姓名\t\t電話\t\t用餐人數 預定日期\t\t\t下單日期\t\t\t備註\n"); ColorChange(240); printf("%-16s",customer[no].no); printf("%-16s",customer[no].name); printf("%-16s",customer[no].phoneNumber); printf("%-11d",customer[no].num); printf("%-30s",customer[no].booktime); printf("%-31s",customer[no].ordertime); printf("%-100s\n",customer[no].other); ColorChange(-1); } void GetAllInfo()//獲取所有顧客的全部信息函數 { n=0; FILE *fp; fp=fopen(".\\customer.dat","rb"); do { fread(&customer[n],sizeof(struct Customer),1,fp); //if(customer[n].no[0]=='\0') // break; n++; }while(feof(fp)==0); n=n-1; fclose(fp); } void ViewAllInfo() { GetAllInfo(); printf("n is %d",n); int i=0,flag=1; printf("\n編號\t\t姓名\t\t電話\t\t用餐人數 預定日期\t\t\t下單日期\t\t\t備註\n"); while(i<=(n-1)) { if(flag) { ColorChange(240); flag=0; }else{ ColorChange(7); flag=1; } printf("%-16s",customer[i].no); printf("%-16s",customer[i].name); printf("%-16s",customer[i].phoneNumber); printf("%-11d",customer[i].num); printf("%-30s",customer[i].booktime); printf("%-31s",customer[i].ordertime); printf("%-100s\n",customer[i].other); ++i; } ColorChange(-1); putchar('\n'); } /* 將時間戳轉換為原時間的函數 */ void Time2Unix(time_t Timestamp,char transfer_type,char Transfer_Time[]) { char Time1[40];//聲明原時間 struct tm* timeinfo; if(transfer_type=='t')//如果 transfer_type 為 x,則返回的時間格式為易閱讀的 { timeinfo=localtime(&Timestamp); strftime(Time1,sizeof(Time1),"%Y年%m月%d日%H時%M分%S秒",timeinfo); } if(transfer_type=='n')// //如果 transfer_type 為 n,則返回的時間格式為純數字 { timeinfo=localtime(&Timestamp); strftime(Time1,sizeof(Time1),"%Y%m%d%H%M%S",timeinfo); } strcpy(Transfer_Time,Time1);//將轉換後的時間格式復制到傳遞過來的數組當中去 } void SetConsolSize(int x,int y)// 設置緩沖區的大小 { SMALL_RECT winPon={0,0,25,10}; HANDLE con=GetStdHandle(STD_OUTPUT_HANDLE); COORD buf={x,y};// 緩沖區長10000,高25 SetConsoleScreenBufferSize(con,buf); }
每個功能的測試:
1、錄入選項
2、刪除選項
3、查詢選項
4、修改選項
5、 預覽全部信息
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。