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