客戶快遞信息管理系統背景:
目前不少公司都提供網購服務,為了將商品快遞給客戶,就必須保存和管理客戶的姓名、電話號碼、郵寄地址等信息。為此,本項目要求完成一個小型客戶快遞信息管理系統,完成對客戶快遞信息的建立、顯示、查找、插入、刪除、修改等功能。作為一個完整的系統,應該具有良好的界面和較強的容錯能力。
實驗目的:
1.針對客戶快遞信息管理系統這一實際問題,學會依據軟件開發流程,進行需求分析,概要設計、模塊設計、詳細設計,完成代碼編寫與調式,進行測試分析,撰寫用戶手冊,從而得到軟件開發的綜合訓練。
2.學會依據實際問題選擇合適的數據結構存儲通訊信息,設計相應的算法實現客戶信息的建立、顯示、查找、插入、刪除、修改等操作。
關鍵
實現了導入文件到程序中,程序直接識別并存入系統當中。
/*0. 退出系統,釋放客戶信息的存儲空間; 第一周
1. 可輸入若干條客戶信息,并創建相應的存儲結構存放這些信息; 第一周
2. 可顯示全部客戶信息; 第一周
3. 可在存儲結構中插入一條客戶信息; 第一周
4. 可按姓名查詢并顯示該客戶信息;
5. 可按姓名刪除該客戶信息;
6. 可按姓名修改該客戶信息;
以上為基本要求,更高要求如下:
7. 將老師提供的“客戶信息.txt”復制到你的項目文件夾中,將該文件中的客戶信息.導入到你系統相應存儲結構中。*/ #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN sizeof(LNode) int seat; //全局變量,用于存放客戶信息成員的序號
typedef struct LNode { //客戶信息結點char name[20]; //姓名double telenum; //電話char address[200]; //郵寄地址struct LNode *next;
} LNode, *LinkList;//功能0:退出系統,釋放客戶信息的存儲空間
void dropLink(LinkList L) {LinkList cur = L->next; //cur意味著當前節點,初始化指向鏈表頭節點,需要考慮是不是虛擬頭節點 LinkList temp; //temp做臨時節點while(cur !=NULL) { //cur為空意味著刪除結束 temp = cur->next; //且temp指向cur的下一個節點 free(cur); //釋放當前節點 cur = temp; //將cur賦值為cur的下一個節點,實現遍歷效果 } L = NULL; //將鏈表頭指針置為NULL
}//功能1:可輸入若干條客戶信息,并創建相應的存儲結構存放這些信息
LinkList creatIncreLink(LinkList L) {//前插法(逆位序)創建一個存放客戶信息成員的單鏈表,返回頭結點地址double telenum;char name[20], address[200], temp;LinkList p;if (L == NULL) {L = (LinkList)malloc(LEN); //頭結點L->next = NULL;}printf("請輸入姓名、電話號碼、郵寄地址,建立客戶信息\n若要結束,只需將姓名輸入'0'\n");printf("請輸入姓名: ");temp = getchar();gets(name);if (!strcmp(name, "0")) {//若要結束,只需將姓名輸入'0'free(L); //釋放頭結點L = NULL;return (L);}printf("請輸入電話號碼:");scanf("%lf", &telenum);printf("請輸入郵寄地址: ");temp = getchar();gets(address);while (true) {p = (LinkList)malloc(LEN); //新結點strcpy(p->name, name);strcpy(p->address, address);p->telenum = telenum;//在L的頭部插入新結點p->next = L->next;L->next = p;printf("請輸入姓名: ");//temp = getchar(); //實驗表明這條語句不能要gets(name);if (!strcmp(name, "0")) return (L);//若要結束,只需將姓名輸入'0'printf("請輸入電話號碼:");scanf("%lf", &telenum);printf("請輸入郵寄地址: ");temp = getchar(); //實驗表明這條語句一定要gets(address);}
}//功能2:可顯示全部客戶信息
void printLink(LinkList L) {// 打印頭結點地址為L的客戶信息LinkList p = L;seat = 1;printf("\n -------------------------------------------\n");printf(" 姓名 電話號碼 郵寄地址\n");printf(" --------------------------------------------\n");if (L == NULL || L->next == NULL)printf("該客戶信息中沒有元素\n");elsewhile (p->next != NULL) {printf(" %2d %-8s", seat, p->next->name);printf(" %.0f %-19s\n", p->next->telenum, p->next->address);p = p->next;seat++;}printf(" --------------------------------------------\n");return ;
}//功能3:可在存儲結構中插入一條客戶信息
void insertLink(LinkList L) {double telenum; //存儲客戶的電話號碼 char name[20], address[200], temp; //存儲客戶的姓名和寄件地址,temp來做緩存 LinkList p = (LinkList)malloc(LEN); //創建節點來存儲客戶信息 printf("現在開始插入客戶的信息,\n請輸入姓名:"); temp = getchar();gets(name);printf("請輸入電話號碼:");scanf("%lf", &telenum);printf("請輸入郵寄地址:");temp = getchar();gets(address);strcpy(p->name, name); //將輸入的name存入節點的name域 p->telenum = telenum; //將輸入的telenum存入節點的telenum域 strcpy(p->address, address); //將輸入的address存入節點的address域 p->next = L->next; //將p節點的指針域指向頭節點L的下一節點 L->next = p; //將頭節點L的指針與指向p節點 printLink(L);
} //功能4:可按姓名查詢并顯示該客戶信息
void inquireLink(LinkList L) {LinkList cur = (LinkList)malloc(LEN);cur = L->next;LinkList temp = (LinkList)malloc(LEN);/*使用一個變量來記錄是否查詢到客戶,否是0,第一次查詢是1,后邊是2、3、...;也可以充當在表中全局變量seat的效果,記錄客戶次序*/int isExists = 0; char name[20];printf("請輸入你要查詢信息的客戶姓名:");char tem = getchar();gets(name);while(cur != NULL) { //為空意味查詢不到 temp = cur->next;if(!strcmp(cur->name, name)){isExists++;if(isExists == 1) { //第一次查詢到需要打印出表頭 printf("查詢到客戶信息如下:\n"); printf("\n -------------------------------------------\n");printf(" 姓名 電話號碼 郵寄地址\n");printf(" --------------------------------------------\n");}printf(" %2d %-8s", isExists, cur->name);printf(" %.0f %-19s\n", cur->telenum, cur->address);}cur = temp; }printf(" --------------------------------------------\n"); //打印表尾
} //功能5:可按姓名刪除該客戶信息
void deleteLink(LinkList L) {LinkList cur = (LinkList)malloc(LEN);LinkList pre = (LinkList)malloc(LEN);pre = L;char name[20];int deleteClient = 0; //刪除用戶數目printf("請輸入你要刪除的客戶姓名:"); char tem = getchar();gets(name);while(pre->next != NULL) { //為空意味查詢不到要刪除的客戶 cur = pre->next;if(!strcmp(cur->name, name)){ //判定到刪除姓名與客戶姓名是否相同 deleteClient++; //若相同則積累刪除用戶+1 pre->next = cur->next; free(cur);}else pre = cur;} if(deleteClient) printf("刪除成功\n"); //刪除用戶數目不為零時證明有刪除,刪除成功 return;
}//功能6:可按姓名修改該客戶信息
void modifyLink(LinkList L) {char name[20];printf("輸入你要修改的客戶姓名:");char tem = getchar();gets(name);printf("%s",name);LinkList cur = (LinkList)malloc(LEN);cur = L->next;bool isName, isTelenum, isAddress; //定義三個信息變量來記錄是否要改變各自信息 while(cur != NULL) {if(!strcmp(cur->name, name)) {printf("是否要修改此用戶的姓名(是1|否0):"); scanf("%d", &isName);if(isName){printf("輸入修改后的姓名:"); tem = getchar(); gets(cur->name);printf("修改姓名成功\n");}printf("是否要修改此用戶的電話號碼(是1|否0):");scanf("%d", &isTelenum);if(isTelenum){printf("輸入修改后的電話號碼:"); scanf("%lf", &cur->telenum);printf("修改電話號碼成功\n"); }printf("是否要修改此用戶的郵寄地址:(是1|否0):");scanf("%d", &isAddress);if(isAddress) {printf("輸入修改后的郵寄地址:");tem = getchar();gets(cur->address);printf("修改郵寄地址成功\n");}}cur = cur->next;}
} //功能7: 將老師提供的“客戶信息.txt”復制到你的項目文件夾中,將該文件中的客戶信息.導入到你系統相應存儲結構中。
LinkList inputLink(LinkList& L) {if(L == NULL){L = (LinkList)malloc(LEN);}//初始化,導入文件 FILE *file = fopen("客戶信息.txt", "r+");if (file == NULL) {perror("Error opening file");return NULL;}char buffer[256];char name[20], itelenum[20], address[200];double telenum;//將信息存入一個個的客戶信息節點 while(fgets(buffer, sizeof(buffer), file) != NULL) {//通過lable指針來指向buffer的初始地址,使用strtok函數來切割得到信息 char* lable; lable = buffer;seat++;//創建鏈表節點LinkList cur = (LinkList)malloc(LEN);//將信息中的姓名、電話號碼、寄件地址整理好存入創建的鏈表節點//提取姓名 //從butter初始地址開始,截到第一個>符號 char *token = strtok(lable, ">");strcpy(name, token);lable += strlen(token)+1; //strlen(token)得到姓名的長度,加一跳過>符號 //提取電話號碼//從姓名>后開始,截到第二個>符號 token = strtok(lable, ">");strcpy(itelenum,token);//itelenum[i] = '\0';telenum = atof(itelenum); // 轉換為 double//提取寄件地址//strlen(token)得到電話的長度,加一跳過>符號lable += strlen(token)+1;//將剩下的字符賦給地址 strcpy(address, lable);//將信息中的姓名、電話號碼、寄件地址整理好存入創建的鏈表節點strcpy(cur->name, name); //將輸入的name存入節點的name域 cur->telenum = telenum; //將輸入的telenum存入節點的telenum域 strcpy(cur->address, address); //將輸入的address存入節點的address域 //將節點插入到鏈表中cur->next = L->next; //將p節點的指針域指向頭節點L的下一節點 L->next = cur; //將頭節點L的指針與指向p節點 }printf("導入成功");fclose(file);return L;
}int main() {LinkList L = NULL, p;int menu, count = 0; //count專門用于控制菜單顯示,不要做其他用途char temp;bool succeed = 0; //succeed標志操作是否成功,1成功,0失敗char name[20]; //姓名double telenum; //電話char address[200]; //郵寄地址//system("color 1f");while (true) {if (count % 5 == 0) {printf("\n ********* ^@^歡迎使用客戶快遞信息管理系統*********\n");printf(" * 1 創建客戶信息 *\n");printf(" * 2 插入客戶信息 *\n");printf(" * 3 查詢客戶信息 *\n");printf(" * 4 刪除客戶信息 *\n");printf(" * 5 顯示客戶信息 *\n");printf(" * 6 修改客戶信息 *\n");printf(" * 7 修改客戶信息 *\n");printf(" * 0 退出管理系統 *\n");printf(" ********* ^@^歡迎使用客戶快遞信息管理系統*********\n");printf("請選擇0-6:");}count++;scanf("%d", &menu);switch (menu) {case 1: {L = creatIncreLink(L);printf("建立客戶信息:");printLink(L);if (seat > 9) count = 0; //顯示菜單break;}case 2: {insertLink(L);break;}//endcase2case 3: {inquireLink(L);break;}//endcase3case 4: {deleteLink(L);break;}//endcase4case 5: {if (L != NULL) { //客戶信息表L已創建printf("當前客戶信息內容如下:\n");printLink(L);if (seat > 9) count = 0; //顯示菜單}//endifelse printf("ERROR: 客戶信息還沒有建立,請先建立客戶信息\n");break;}//endcase5case 6: {modifyLink(L);break;}//endcase6case 7: {inputLink(L);break;}case 0: {if(seat == 0) return 0; //當用戶為零時直接退出系統 else dropLink(L); //用戶不為零清除內存再退出系統 printf("退出系統");return 0;} default:printf("沒有此功能,重新輸入\n");}//endswitchprintf("請選擇0-6:");}//endwhilereturn 1;
}//endmain1