简单的信息管理应用(宾馆订房系统项目)
一、需求分析
? ?????軟件的功能要求:用戶可以根據自己的需求選擇訂房、退房、瀏覽所有信息、根據身份證號查詢個人信息、根據姓名查詢個人信息的功能,并且能夠根據用戶的需求顯示出操作提示,十分便利,已于用戶使用。用戶根據操作提示進行操作就可以得到相應的結果。
????? 軟件的性能要求:系統操作方便,簡單。用戶可以根據系統的提示進行操作,比較人性化。在經過多次測試之后,系統穩定性大為提高,只要用戶按照提示進行操作都會得到正確的回應,不會出現毫無理由的系統錯誤或者系統崩潰,因此系統的穩定性較高,用戶可以放心使用。
二、總體設計
1.設計方案的論證:
A.運用單鏈表:運用單鏈表將文件中的內容依次存放進其結點數據域,形成一一對應的關系,在刪除以及添加操作時不涉及到其他元素的移動,同時其元素的存儲單元是任意的,可連續也可不連續,不需要限定長度。但是,另一方面來說此方案也存在一定的缺點,要訪問或者查找問特定元素,只能從鏈表頭開始,遍歷到該元素,其查找時間復雜度為 O(n)。
B.運用順序表:運用順序表用一組地址連續的存儲單元依次存儲數據元素,其優點在于其存儲結構為隨機存取結構,邏輯關系可直接用數組元素下標表示。但是線性表的長度不確定,難以事先確定數組長度。同時線性表要求存儲空間必須是連續的,易造成存儲空間的“碎片”現象。而其在插入和刪除操作需要移動大量元素。
C.運用循環鏈表:運用循環鏈表將文件中的內容依次存放進其結點數據域,形成一一對應的關系。其優點在于無須增加存儲量,僅對表的鏈接方式稍作改變,即可使得表處理更加方便靈活。同時,在循環鏈表中,從任一結點出發都可訪問到表中所有結點,這樣使得在某些運算中更加容易實現(如查詢操作)。
對于我們的選題來說,利用單鏈表更容易去實現,我們最終根據自己操作的熟練程度以及在添加、刪除以及修改操作時的簡便性選擇了方案 A。
2. 數據結構的設計:
為了實現對相應的添加、刪除、查詢操作,定義了結構體數組以及單鏈表,并用單鏈表來存放相應的客人的信息。在后續操作中對相應結點中的相關數據進行直接調用。
typedef struct customer {char name[20];char sex[10];char age[3];char id[20];int room; }cus; typedef struct node {cus data;struct node* next;}Node;Node* createList()//創建表頭 {Node* listHeadNode=(Node*)malloc(sizeof(Node));listHeadNode->next=NULL;return listHeadNode; } Node* createNode(cus data)//創建鏈表 {Node* newNode=(Node*)malloc(sizeof(Node));newNode->data=data;newNode->next=NULL;return newNode; }3.各模塊的描述:
Node* createList():創建表頭Node* createNode(cus data):創建結點void insertNodeByHead(Node* listHeadNode,cus data):頭插法建立單鏈表void printList(Node* listHeadNode):打印所有節點數據Node* searchNodeByid(Node* listHeadNode,char *num):通過身份證尋找節點Node* searchNodeByname(Node* listHeadNode,char *name):通過名字尋找節點void printNode(Node* curNode): 打印當前節點void deleteNodeByAppoin(Node* listHeadNode,char *name):刪除節點void readInfoFromFile(const char *fileName,Node* listHeadNode): 讀取客戶文本創建鏈表void saveInfoToFile(const char *fileName,Node* listHeadNode): 將當前鏈表存進文本覆蓋原來的文本int Reservation():此函數實現訂房功能 void Check_out(Node* p): 此函數實現退房功能int IsFull():通過此函數查看此賓館房間是否已滿4.軟件結構圖:
?三、項目源代碼
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct customer {char name[20];char sex[10];char age[3];char id[20];int room; }cus; typedef struct node {cus data;struct node* next;}Node; Node* createList()//創建表頭 {Node* listHeadNode=(Node*)malloc(sizeof(Node));listHeadNode->next=NULL;return listHeadNode; } Node* createNode(cus data)//創建鏈表 {Node* newNode=(Node*)malloc(sizeof(Node));newNode->data=data;newNode->next=NULL;return newNode; } void printList(Node* listHeadNode)//打印所有節點數據 {Node* pMove=listHeadNode->next;printf("姓名\t性別\t年齡\t身份證號\t房間號\n");while(pMove){printf("%s\t%s\t%s\t%s\t%9d\n",pMove->data.name,pMove->data.sex,pMove->data.age,pMove->data.id,pMove->data.room);pMove=pMove->next;}printf("\n"); } void insertNodeByHead(Node* listHeadNode,cus data)//插入鏈表 {Node* newNode=createNode(data);newNode->next=listHeadNode->next;listHeadNode->next=newNode; } Node* searchNodeByid(Node* listHeadNode,char *num)//通過身份證尋找節點 {Node* pMove=listHeadNode->next;if(pMove==NULL) return pMove;else{while(strcmp(pMove->data.id,num)){pMove=pMove->next;if(pMove==NULL) break;}return pMove;} } Node* searchNodeByname(Node* listHeadNode,char *name)//通過名字尋找節點 {Node* pMove=listHeadNode->next;if(pMove==NULL) return pMove;else{while(strcmp(pMove->data.name,name)){pMove=pMove->next;if(pMove==NULL) break;}return pMove;} } void printNode(Node* curNode)//打印當前節點 {printf("姓名\t性別\t年齡\t身份證號\t 房間號\n");printf("%s\t%s\t%s\t%s\t%9d\n",curNode->data.name,curNode->data.sex,curNode->data.age,curNode->data.id,curNode->data.room); } void deleteNodeByAppoin(Node* listHeadNode,char *name)//刪除節點 {Node* posFrontNode=listHeadNode;Node* posNode=listHeadNode->next;if(posNode==NULL){printf("無");return;}else{while(strcmp(posNode->data.name,name)){posFrontNode=posNode;posNode=posFrontNode->next; if(posNode==NULL){printf("無");return;}}posFrontNode->next=posNode->next;free(posNode);} } void readInfoFromFile(const char *fileName,Node* listHeadNode)//讀取客戶文本創建鏈表 {FILE *fp=fopen(fileName,"r");if(fp==NULL){fp=fopen(fileName,"w");}cus tempData;while(fscanf(fp,"%s\t%s\t%s\t%s\t%d\n",tempData.name,tempData.sex,tempData.age,tempData.id,&tempData.room)!=EOF){insertNodeByHead(listHeadNode,tempData);memset(&tempData,0,sizeof(tempData));}fclose(fp); } void saveInfoToFile(const char *fileName,Node* listHeadNode)//將當前鏈表存進文本覆蓋原來的文本 {FILE *fp=fopen(fileName,"w");Node* pMove=listHeadNode->next;while(pMove){fprintf(fp,"%s\t%s\t%s\t%s\t%d\n",pMove->data.name,pMove->data.sex,pMove->data.age,pMove->data.id,pMove->data.room);pMove=pMove->next;}fclose(fp); } int Reservation()//訂房系統 {FILE *fp1,*fp2;int i,m=0;char ch,c[20];fp1=fopen("roomInfo.txt","r");for(i=0;(ch=fgetc(fp1))!=EOF;i++){c[i]=ch;}c[i]='\0';fclose(fp1);for(i=0;i<10;i++){if(c[i]=='0'){m=i+1;*(c+i)='1';break;}} fp2=fopen("roomInfo.txt","w");fprintf(fp2,"%s",c);fclose(fp2);return m;} void Check_out(Node* p)//退房系統 {FILE *fp1,*fp2;char c[15],ch;int i,m;fp1=fopen("roomInfo.txt","r");for(i=0;(ch=fgetc(fp1))!=EOF;i++){c[i]=ch;}c[i]='\0';fclose(fp1);for(i=0;i<10;i++){if((i==p->data.room-1)||(c[i]=='1')){*(c+i)='0';break;}}fp2=fopen("roomInfo.txt","w");fprintf(fp2,"%s",c);fclose(fp2);} int IsFull()//客房是否已滿 {FILE *fp;int i,m,leap=0;char c[15],ch;fp=fopen("roomInfo.txt","r");for(i=0;(ch=fgetc(fp))!=EOF;i++){c[i]=ch;}c[i]='\0';fclose(fp);for(m=0;m<i;m++){if(c[m]=='0'){leap=1;break;}}return leap; } int main() {Node* list=createList();readInfoFromFile("customer.txt",list);while(1){cus tempData;Node* p=NULL;int num;printf(" 歡迎使用酒店管理系統 \n");printf("-----------------------------\n");printf(" 【訂房服務】輸入1 \n");printf(" 【退房服務】輸入2 \n");printf(" 【瀏覽信息】輸入3 \n");printf(" 【根據身份證號查找信息】輸入4\n"); printf(" 【根據姓名查找信息】輸入5 \n");printf("請輸入(1~5):");scanf("%d",&num);switch(num){case 1:printf("\t\t【插入信息】\n");if(IsFull()) //還有剩余客房 {printf("請輸入姓名,性別,年齡,身份證號:");scanf("%s%s%s%s",tempData.name,tempData.sex,tempData.age,tempData.id);tempData.room=Reservation(); printf("房間號為%d\n",tempData.room);insertNodeByHead(list,tempData);saveInfoToFile("customer.txt",list);break;}else //沒有剩余客房 {printf("客房已滿\n");break;}case 2:printf("\t\t【刪除信息】\n");printf("請輸入要刪除的客人姓名:");scanf("%s",tempData.name);p=searchNodeByname(list,tempData.name);Check_out(p);deleteNodeByAppoin(list,tempData.name);saveInfoToFile("customer.txt",list);break;case 3:printf("\t\t【瀏覽信息】\n");printList(list);break;case 4:printf("\t\t【根據身份號查找信息】\n");printf("請輸入身份證號:");scanf("%s",tempData.id);if(searchNodeByid(list,tempData.id)==NULL){printf("未找到\n");}else{printNode(searchNodeByid(list,tempData.id));} break;case 5:printf("\t\t【根據姓名查詢信息】\n");printf("請輸入姓名:");scanf("%s",tempData.name); if(searchNodeByname(list,tempData.name)==NULL){printf("未找到\n");}else{printNode(searchNodeByname(list,tempData.name));} break; } }return 0; }總結
以上是生活随笔為你收集整理的简单的信息管理应用(宾馆订房系统项目)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Apache系列—Windows不能在本
- 下一篇: 集丰照明|灯光照明设计必须了解的那些软件