職工資訊管理系統(c語言實現)
阿新 • • 發佈:2019-01-02
功能實現:
- (1)系統以選單方式工作
- (2)職工資訊錄入功能(職工資訊用檔案儲存)--輸入
- (3)職工資訊瀏覽功能--輸出
- (4)職工資訊查詢功能--演算法
- 查詢方式:按姓名查詢/按職工號查詢
- (5)職工資訊刪除、修改功能
程式碼:
#include<stdio.h> #include<stdlib.h> #include<string.h> struct workers { char jobNo[15]; //職工號 char name[15]; //姓名 char sex[15]; //性別 char birthday[15]; //出生年月 char degree[15]; //學歷 char position[15]; //職務 char salary[15]; //工資 char addr[15]; //住址 char tel[15]; //電話 }; //型別定義語句 typedef struct node { struct workers data; struct node *next; }Node; //新增資訊函式 "尾插法建表" void Add(Node *worker) { Node *p, *q; char n[10]; q = worker; while (q->next != NULL) { q = q->next; } while (1) { printf("提示:輸入0返回主選單!\n"); printf("請輸入職工號:"); scanf("%s", n); if (strcmp(n, "0") == 0) { break; } p = (Node *)malloc(sizeof(Node)); strcpy(p->data.jobNo, n); printf("請輸入姓名:"); scanf("%s", p->data.name); printf("請輸入性別:"); scanf("%s", p->data.sex); printf("請輸入出生年月:"); scanf("%s", p->data.birthday); printf("請輸入學歷:"); scanf("%s", p->data.degree); printf("請輸入職務:"); scanf("%s", p->data.position); printf("請輸入工資:"); scanf("%s", p->data.salary); printf("請輸入住址:"); scanf("%s", p->data.addr); printf("請輸入電話:"); scanf("%s", p->data.tel); printf("提示:已經完成一條記錄的新增!"); p->next = NULL; q->next = p; q = p; } } //修改職工資訊函式 int change(Node *worker) { Node *p; char find[20]; p = worker->next; if (p == NULL) { printf("\n提示:沒有資料可以修改!\n"); return 0; } printf("請輸入要修改的職工號"); scanf("%s", find); while (p != NULL) { if (strcmp(p->data.jobNo, find) == 0) { break; } p = p->next; } if (p!=NULL) { int x; while (1) { printf("完成修改請輸入0,否則輸入非0數字進行修改!"); scanf("%d", &x); if (x == 0) { break; } printf(" 請輸入新職工號: "); scanf("%s", p->data.jobNo); printf(" 請輸入新職工姓名: "); scanf("%s", p->data.name); printf(" 請輸入新職工性別: "); scanf("%s", p->data.sex); printf(" 請輸入新職工出生年月: "); scanf("%s", p->data.birthday); printf(" 請輸入新職工學歷: "); scanf("%s", p->data.degree); printf(" 請輸入新職工職務: "); scanf("%s", p->data.position); printf(" 請輸入新職工工資: "); scanf("%s", p->data.salary); printf(" 請輸入新職工住址: "); scanf("%s", p->data.addr); printf(" 請輸入新職工電話: "); scanf("%s", p->data.tel); printf(" \n提示:該職工資料已經修改!\n "); } } else printf("\n提示:沒有你要修改的資料!\n "); } //輸出職工資訊函式 int Disp(Node *worker) { Node *p; p = worker->next; if (p == NULL) { printf(" \n提示:沒有資訊可以顯示!\n "); return 0; } printf("\t\t\t\t顯示結果\n"); printf(" \n職工號 姓名 性別 出生年月 學歷 職務 工資 住址 電話 \n "); while (p!=NULL) { printf("\n %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t\n ", p->data.jobNo, p->data.name, p->data.sex, p->data.birthday, p->data.degree, p->data.position, p->data.salary, p->data.addr, p->data.tel); p = p->next; } } //查詢職工資訊函式: 按職工號查詢 按職工姓名查詢 int Cha_xun(Node *worker) { Node *p; int sel; char find[20]; p = worker->next; if (p==NULL) { printf(" \n提示:沒有資料可以查詢!\n "); return 0; } printf("\n提示:\n 輸入 0---- 退出\t 輸入 1----按職工號查詢\t 輸入 2-----按職工姓名查詢\n"); printf("請選擇:"); scanf("%d", &sel); if (sel == 1) { printf("\n請輸入你要查詢分類的職工號:"); scanf("%s", find); while (p!=NULL) { if (strcmp(p->data.jobNo, find) == 0) { printf(" 職工號 姓名 性別 出生年月 學歷 職務 工資 住址 電話 \n "); printf(" \n %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t\n ", p->data.jobNo, p->data.name, p->data.sex, p->data.birthday, p->data.degree, p->data.position, p->data.salary, p->data.addr, p->data.tel); } p = p->next; } } else if (sel == 2) { printf(" \n輸入你要查詢分類的職工姓名:"); scanf("%s", find); while (p!=NULL) { if (strcmp(p->data.name, find) == 0) { printf(" 職工號 姓名 性別 出生年月 學歷 職務 工資 住址 電話 \n "); printf(" \n %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t \n ", p->data.jobNo, p->data.name, p->data.sex, p->data.birthday, p->data.degree, p->data.position, p->data.salary, p->data.addr, p->data.tel); } p = p->next; } } else if (sel == 0) return 0; } //刪除職工資訊函式 int Delete(Node *worker) { Node *p, *r; char find[10]; p = worker->next; if (p == NULL) { printf("提示:沒有職工資訊可以刪除!\n "); return 0; } printf(" \n提示:請輸入你要刪除的職工號!\n "); scanf("%s", find); while (p != NULL) { if (strcmp(p->data.jobNo, find) == 0) { break; } p = p->next; } if (p!=NULL) { r = worker; while (r->next != p) { r = r->next; } r->next = r->next->next; } } //將職工資訊儲存到檔案中 void save(Node *worker) { int n; Node *p = NULL; FILE *fp; printf("是否儲存到檔案?( 1-----儲存!,0-----不儲存! )"); scanf("%d", &n); if (n == 1) { if (worker->next == NULL) { printf(" 沒有記錄!"); } else { p = worker->next; } if ((fp = fopen(" 職工資訊管理系統.txt ", " wb ")) == NULL) { printf(" 檔案不能開啟!\n"); } while (p != NULL) { fprintf(fp, " %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t ", p->data.jobNo, p->data.name, p->data.sex, p->data.birthday, p->data.degree, p->data.position, p->data.salary, p->data.addr, p->data.tel); p = p->next; } fclose(fp); } } //讀取職工資訊 void Du_qu(Node *worker) { Node *p; FILE *fp; if ((fp = fopen("職工資訊管理系統.txt", "rb")) == NULL) { printf("檔案不能開啟!\n "); } p = worker->next; while (p!=NULL) { fscanf(fp, " %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t %s\t ", p->data.jobNo, p->data.name, p->data.sex, p->data.birthday, p->data.degree, p->data.position, p->data.salary, p->data.addr, p->data.tel); p=p->next; } fclose(fp); } //主函式實現 int main() { Node *worker; int flag; worker = (Node*)malloc(sizeof(Node)); worker->next = NULL; while(1) { printf("\t職 工 信 息 管 理 系 統\n"); printf("==================菜 單==================\n "); printf("1.輸入職工資訊\n "); printf("2.修改職工資訊\n "); printf("3.瀏覽職工資訊\n "); printf("4.查詢職工資訊\n "); printf("5.刪除職工資訊\n "); printf("6.讀取職工資訊\n "); printf("0.退出\n "); printf("輸入你選擇的序號:"); scanf("%d", &flag); switch (flag) { case 0: printf(" \n提示:退出系統!\n "); break; case 1: Add(worker); save(worker); break; //新增職工資訊,儲存到檔案中 case 2: change(worker); break; //修改職工資訊 case 3: Disp(worker); break; //顯示職工資訊 case 4: Cha_xun(worker); break; //查詢職工資訊 case 5: Delete(worker); break; //刪除職工資訊 case 6: Du_qu(worker); break; //讀取職工資訊 default: printf("提示:輸入錯誤!\n "); } } }
程式碼模組解釋:
- 新增資訊模組: void Add( Node *worker )
採用尾插法,先建立連結串列和頭結點,新增加一個節點,輸入職工的所有資訊,將新增的節點連線在連結串列的尾端。
修改資訊模組:void change( Node *worker )
找到要修改的職工資訊,刪除這一個節點,然後新建一個節點,輸入要修改的資訊,並儲存到新的節點中,將新增的節點放在原來刪除節點的位置。
- 顯示輸出模組:void Disp( Node *worker )
先新建一個指標指向頭結點,判斷指標域是否為空,若為空,輸出“沒有資訊可以顯示”;若不為空,則輸出他的指標域所指向的節點儲存的資訊,並將指標向後移一個節點,直到P指向空,這樣就輸出了所有的職工資訊。
- 查詢資訊模組:void Cha_xun( Node *worker )
分為兩種查詢方法,按職工號查詢和按姓名查詢。
按職工號查詢: 輸入職工號,先新建一個指標指向頭結點,判斷指標域是否為空,若為空,輸出“沒有資料可以查詢”;若不為空,則判斷他的指標域所指向的節點儲存的職工號是否與輸入的職工號相同,若相同,則輸出該職工所有的資訊,並將指標向後移一個節點,再次進行判斷,直到P指向空,這樣就查詢輸出了所有匹配的職工資訊。
按姓名查詢:輸入姓名,先新建一個指標指向頭結點,判斷指標域是否為空,若為空,輸出“沒有資料可以查詢”;若不為空,則判斷他的指標域所指向的節點儲存的職工姓名是否與輸入的職工姓名相同,若相同,則輸出該職工所有的資訊,並將指標向後移一個節點,再次進行判斷,直到P指向空,這樣就查詢輸出了所有匹配的職工資訊。
- 刪除資訊模組:void Delete( Node *worker )
查詢到要刪除的職工資訊節點,刪除這一個節點,並將它的前驅節點的指標域指向後繼節點。
- 儲存職工資訊模組: void save(Node *worker)
新建一個指標指向頭結點,判斷指標域是否為空,若為空,輸出“沒有記錄!”,若不為空, fprintf()格式寫函式 ,將職工資訊以%s的格式寫入指標指向的檔案中。
- 讀取資訊模組:void Du_qu( Node *worker )
開啟檔案,fscanf()格式讀函式,以%s 的格式從檔案中讀取資料存入節點中。